首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Fortran - Cython工作流

Fortran - Cython工作流
EN

Stack Overflow用户
提问于 2014-03-14 19:44:09
回答 1查看 4.7K关注 0票数 20

我想要设置一个工作流,以便在Windows计算机上使用Cython从Python访问fortran例程

经过一番搜索,我找到了:http://www.fortran90.org/src/best-practices.html#interfacing-with-chttps://stackoverflow.com/tags/fortran-iso-c-binding/info

和一些代码片段:

Fortran端:

pygfunc.h:

代码语言:javascript
复制
void c_gfunc(double x, int n, int m, double *a, double *b, double *c);

pygfunc.f90

代码语言:javascript
复制
module gfunc1_interface
    use iso_c_binding
    use gfunc_module

    implicit none

contains
    subroutine c_gfunc(x, n, m, a, b, c) bind(c)
        real(C_FLOAT), intent(in), value :: x
        integer(C_INT), intent(in), value ::  n, m
        type(C_PTR),    intent(in), value :: a, b
        type(C_PTR),                value :: c

        real(C_FLOAT), dimension(:), pointer :: fa, fb
        real(C_FLOAT), dimension(:,:), pointer :: fc

        call c_f_pointer(a, fa, (/ n /))
        call c_f_pointer(b, fb, (/ m /))
        call c_f_pointer(c, fc, (/ n, m /))
        call gfunc(x, fa, fb, fc)
     end subroutine

end module

gfunc.f90

代码语言:javascript
复制
module gfunc_module

use iso_c_binding

    implicit none
    contains
        subroutine gfunc(x, a, b, c)
            real,                 intent(in) :: x
            real, dimension(:),   intent(in) :: a, b
            real, dimension(:,:), intent(out) :: c

            integer :: i, j, n, m
            n = size(a)
            m = size(b)
            do j=1,m
                do i=1,n
                     c(i,j) = exp(-x * (a(i)**2 + b(j)**2))
                end do
            end do
        end subroutine
end module

Cython端:

pygfunc.pyx

代码语言:javascript
复制
cimport numpy as cnp
import numpy as np

cdef extern from "./pygfunc.h":
    void c_gfunc(double, int, int, double *, double *, double *)

cdef extern from "./pygfunc.h":
    pass

def f(float x, a=-10.0, b=10.0, n=100):
    cdef cnp.ndarray ax, c
    ax = np.arange(a, b, (b-a)/float(n))
    n = ax.shape[0]
    c = np.ndarray((n,n), dtype=np.float64, order='F')
    c_gfunc(x, n, n, <double *> ax.data, <double *> ax.data, <double *> c.data)
    return c

和设置文件:

代码语言:javascript
复制
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy as np

ext_modules = [Extension('pygfunc', ['pygfunc.pyx'])]

setup(
    name = 'pygfunc',
    include_dirs = [np.get_include()],
    cmdclass = {'build_ext': build_ext},
    ext_modules = ext_modules )

所有文件都在一个目录中

fortran文件编译(使用NAG Fortran Builder ) pygfunc编译

但将它们联系起来会抛出一个问题:

错误LNK2019:函数___pyx_pf_7pygfunc_f中引用的未解析外部符号_c_gfunc

当然还有:

致命错误LNK1120: 1未解析的外部变量

我错过了什么?或者,这种在Python和Fortran之间设置工作流的方式从一开始就遭到了谴责?

THX Martin

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22404060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档