将Expokit翻译成C语言

时间:2015-02-24 11:47:27

标签: c fortran fortran77 fortran-iso-c-binding

我想使用用C语言编写的fortran77中的'expokit'包。我确实在我的linux系统上安装了f2c,并将zhpadm.f文件翻译成了zhpadm.c。接下来我应该做什么来对C中的矩阵求幂。我应该在主C程序中包含哪些文件?

如何将参数传递给C中的函数zhpadm()?我的问题是2d数组。我不知道如何通过这些,我不知道如何传递复数。对于真正的1d阵列,它可以工作。

我正在使用gfortran和gcc。

1 个答案:

答案 0 :(得分:1)

为了将数据传递到从C到Fortran的多维数组,您必须了解Fortran数组的布局。

Fortran阵列由一系列存储位置组成。假设您有一个Fortran子例程

   subroutine foo(a,n,m)
   real, intent(inout) :: a(n,m)

这会给你一个N * M数组。默认情况下,Fortran数组索引从1开始,因此A(1,1)引用第一个存储位置的第一个数组元素。那么元素依次是A(1,1),A(2,1),A(3,1),......,A(N-1,1),A(N,1),A (1,2),A(2,2),......直到A(N,M)。

假设在C侧,您有一个指向第一个元素的指针。我们假设这个指针是ap

然后,ap[0]会引用A(1,1)ap[1]A(2,1)等。一般来说,如果你想引用Fortran一侧的A(I,J) ,你必须在C方面引用ap[(i-1)+n*(j-1)]。当然,在C方面,在C中使用基于零的访问会更具思想性。

所以,如果你想构建一个看起来像

的Fortran数组
A = | 1 4 |
    | 2 5 |
    | 3 6 |

您可以使用以下C代码:

   int n=3, m=2;
   int count = 1,
   for (i=0; i<n; i++)
     {
        for (j=0; j<m; j++)
         {
           ap[i+n*j] = count;
           count ++;
         }
     }

Fortran中的复数很容易 - 实部​​和虚部都存在于两个连续的存储位置。您可以在程序中使用它。 COMPLEX * 16是用于双精度复合体的旧的非标准形式。

在zhpadm.f周围编写包装函数是有意义的。使该函数绑定(C)并使其为zhpadm保留所需的工作空间。

如需进一步提示,请阅读https://stackoverflow.com/tags/fortran-iso-c-binding/info