在Julia中集成Fortran代码

时间:2014-12-16 06:26:53

标签: fortran julia

我在我自己的模块上使用GNU gfortran编译器(在Cygwin上)。一个很好的例子将有希望从编译阶段开始,解决受损的名称并通过ccall从Julia调用子例程。我见过的大多数例子都跳过了前两个阶段。

想象一下,我在Fortran 90文件中有以下模块名为' f90tojl.f90':

module m
contains
    integer function five()
      five = 5
    end function five
end module m

此示例来自here。我用gfortran编译它如下创建一个共享库:

gfortran -shared -O2 f90tojl.f90 -o -fPIC f90tojl.so

而且,通过阅读朱莉娅文档,我的理解是不稳定的理解,这表明我应该能够像这样调用函数五:

ccall( (:__m_MOD_five, "f90tojl"), Int, () )

它对我不起作用。我得到'error compiling anonymous: could not load module f90tojl...。有人关心开导我吗?我有一种狡猾的感觉,我做了些傻事......

在官方doc中,重点是C.我也知道C ++的this。在R和Python中,动力 - 我想到了Cython和Rcpp--似乎是C / C ++。与此question类似,我想了解使用C / C ++将Julia与Fortran与Julia联系起来是多么容易。

2 个答案:

答案 0 :(得分:8)

文档说,调用Fortran和C基本相同。我想,只有很少的例子,因为人们想要包装的代码要少得多。在Julia,包裹C非常容易,非常愉快。它通常不是为了加速Julia,就像使用R或Python一样,但更多的是利用已经编写的高质量代码。

Julia的标准库本身就是与Fortran代码集成的一个很好的例子,例如:这是Julia wrapperARPARK。在Base之外,glmnet是用Fortran编写的,有一个Julia wrapper for it (GLMNet.jl)

我不知道现代Fortran的区别如何。

答案 1 :(得分:1)

对于那些像我一样希望通过复制粘贴食谱来解决此问题的人,这里有一个有效的代码(经http://julia-programming-language.2336112.n4.nabble.com/example-for-ccall-use-and-fortran-tp7737p7740.html改正了笔录)。

Fortran文件:simplemodule.f95

module simpleModule

contains
function foo(x)
  integer :: foo, x
  foo = x * 2
end function foo


end module simplemodule

必须与哪个编译 gfortran simplemodule.f95 -o simplemodule.so -shared -fPIC,生成simplemodule.so共享库文件。

然后用朱莉娅

a = Int32[3]
ccall((:__simplemodule_MOD_foo, "./simplemodule.so"), Int32, (Ptr{Int32},), a)

返回6

thread也包含其他示例。