gpt4 book ai didi

通过 C 从 IDL 调用 fortran

转载 作者:太空宇宙 更新时间:2023-11-04 04:45:19 24 4
gpt4 key购买 nike

经过大量搜索,我决定发布我的问题。

我必须将一些数组(一维和二维)传递给 IDL 到我的 Fortran 例程(我是“现代 Fortran”程序员)。 IDL 是专栏主要语言,在调用 fortran 子例程之前我已经分配了所有数组。

问题是 IDL 可以将任何东西传递给 C 函数,尽管一些将数组传递给 fortran 的非标准方法是可行的(例如 http://132.248.1.102/~morisset/idl_cours/IDL/fortran. htm)。所有数组和结构参数都通过 IDL 函数 CALL_EXTERNAL ( http://www.exelisvis.com/docs/CALL_EXTERNAL.html ) 引用传递

我正在寻找一个使用 ISO_C_BINDINGS 来处理一维和二维数组的 Fortran 包装器。我的 Fortran 子例程具有与以下子例程相同的接口(interface)(数学有点复杂)

MODULE test
IMPLICIT NONE
CONTAINS
PURE SUBROUTINE fortran_sub_array(x1a,x2a,ya,x1,x2,y_out)
IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: x1a,x2a, x1,x2
REAL, DIMENSION(:,:), INTENT(IN) :: ya
REAL, DIMENSION(:,:), INTENT(INOUT) :: y_out
INTEGER :: dim1, dim2, ii, jj

dim1 = size(y_out,1)
dim2 = size(y_out,2)

do jj=1, dim2
do ii=1, dim1
y_out(ii,jj)= 0. !actually some functions...
enddo
enddo

END SUBROUTINE
ENDMODULE

我找到了很多好的答案,但我正在寻找一种传递二维数组的标准方法。我不必分配或取消分配 y_out 数组,只需用值填充它即可。在调用 fortran_sub_array 之前,已经在 IDL 中完成了对数组维度的所有检查。

最佳答案

您的问题是假定的形状数组。您将不得不更改您的 Fortran 子例程,或编写一个包装器:

  subroutine wrapper(dim1, dim2, x1a,x2a, ya, x1, x2, y_out) bind(C, name="...")
integer(c_int), value :: dim1, dim2
REAL(c_float), DIMENSION(dim1), INTENT(IN) :: x1a x1
REAL(c_float), DIMENSION(dim2), INTENT(IN) :: x2a, x2
REAL(c_float), DIMENSION(dim1,dim2), INTENT(IN) :: ya
REAL(c_float), DIMENSION(dim1,dim2), INTENT(INOUT) :: y_out

call fortran_sub_array(x1a,x2a,ya,x1,x2,y_out)
end subroutine

适当调整边界,我不得不猜测。 C 端非常简单,只有两个边界和指针。

关于通过 C 从 IDL 调用 fortran,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21703666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com