gpt4 book ai didi

c - 将 Expokit 翻译成 C

转载 作者:行者123 更新时间:2023-11-30 19:17:05 25 4
gpt4 key购买 nike

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

如何将参数传递给 C 语言中的函数 zhpadm()?我的问题是二维数组。我不知道如何传递这些,也不知道如何传递复数。对于真正的一维数组,它有效。

我正在使用 gfortran 和 gcc。

最佳答案

为了将数据从 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),你必须引用ap[(i- 1)+n*(j-1)] 在 C 端。当然,在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 是 double 复数的一种旧的非标准形式。

围绕 zhpadm.f 编写一个包装函数是有意义的。使该函数绑定(bind)(C)并让它为zhpadm保留所需的工作空间。

有关更多提示,请阅读 https://stackoverflow.com/tags/fortran-iso-c-binding/info .

关于c - 将 Expokit 翻译成 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28694996/

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