【问题标题】:calling fortran from IDL by means of C通过 C 从 IDL 调用 fortran
【发布时间】:2014-02-11 13:47:51
【问题描述】:

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

我必须将一些数组(一维和二维)传递给 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 子例程具有与以下相同的接口(数学有点复杂)

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 中完成。

【问题讨论】:

    标签: c fortran idl-programming-language fortran-iso-c-binding


    【解决方案1】:

    您的问题是假定的形状数组。你将不得不改变你的 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端很简单,就是两个边界和指针。

    【讨论】:

      猜你喜欢
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 2010-11-16
      • 1970-01-01
      • 2014-01-14
      • 2016-03-25
      相关资源
      最近更新 更多