【问题标题】:How to pass a dynamically allocated array to fortran from julia如何将动态分配的数组从 julia 传递给 fortran
【发布时间】:2019-11-06 18:16:44
【问题描述】:

我正在尝试从 julia 调用一些 fortran (f90) 代码,但我似乎无法让 fortran 理解从 julia 传递的动态分配的数组。这个fortran代码:

MODULE myModule
    implicit none
    public Func
CONTAINS

subroutine Func(A,B)
    integer*8, intent(inout) :: A(3)
    integer*8, intent(inout) :: B(:)
    integer :: i

    write(*,*) "size of A"
    write(*,*) size(A)

    write(*,*) "A"
    do i=1,3
        write(*,*) A(i)
    enddo

    write(*,*) "size of B"
    write(*,*) size(B)

    write(*,*) "B"
    do i=1,size(B)
        write(*,*) B(i)
    enddo

end subroutine Func
end module

由这个 julia 代码调用

A = [1,2,3]
B = [4,5,6]

ccall((:__mymodule_MOD_func,"./test.so"), Nothing ,(Ref{Int64},Ref{Int64}), A,B)

产生这个结果

 size of A
           3
 A
                    1
                    2
                    3
 size of B
           0
 B

我希望 size(B) 为 3。

有什么方法可以在不更改 fortran 代码的情况下完成这项工作?我知道我可以重写 fortran 代码以在函数调用中包含数组的维度,但我希望能够调用已经以与我提供的示例类似的方式编写的 fortran 代码。

【问题讨论】:

  • 你不能用来自 Julia 的普通 ccall 神奇地做到这一点。对于假定的形状数组,应该以某种方式传递此类信息。 This might be a good read。您也许可以创建一些中间层,但是您需要以一种或另一种方式从 Julia 端传递该信息。
  • @mlt,gfortran 的数组描述符已更改。您发布的网址适用于 9.1 之前的版本。
  • @Steve 谢谢!我已经有一段时间没有使用 Fortran 了。我的观点是这样做会很混乱且不便携。我想你证实了我的观点。
  • @mlt,最近的描述符更改实际上是出于可移植性的动机。技术规范 ISO/IEC TS 29113:2012 定义了涂料矢量。

标签: fortran julia


【解决方案1】:

我决定创建一个 fortran 包装函数,它接收传入的动态数组的大小。

subroutine wrapFunc(A,B,Bdim)
    integer*8, intent(inout) :: A(3)
    integer*8, intent(inout) :: Bdim
    integer*8, intent(inout) :: B(Bdim)
    call Func(A,B)    

end subroutine wrapFunc

这让我不必更改现有的 fortran 代码。

【讨论】:

    猜你喜欢
    • 2012-10-15
    • 2016-12-26
    • 2011-03-25
    • 1970-01-01
    • 2020-03-17
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多