我有以下FORTRAN代码,我需要转换为C或C ++。我已经尝试过使用f2c,但它没有用完。它与从Lambert Conformal风向量到True-North向量向量的转换有关。 有没有经验丰富的FORTRAN谁可以提供帮助?
PARAMETER ( ROTCON_P = 0.422618 )
PARAMETER ( LON_XX_P = -95.0 )
PARAMETER ( LAT_TAN_P = 25.0 )
do j=1,ny_p
do i=1,nx_p
angle2 = rotcon_p*(olon(i,j)-lon_xx_p)*0.017453
sinx2 = sin(angle2)
cosx2 = cos(angle2)
do k=1,nzp_p
ut = u(i,j,k)
vt = v(i,j,k)
un(i,j,k) = cosx2*ut+sinx2*vt
vn(i,j,k) =-sinx2*ut+cosx2*vt
end if
end do
end do
非常感谢您的帮助或提示。
答案 0 :(得分:2)
这将让你开始 - 我没有尝试编译它,但它接近你将需要的。我假设数组olon,u,v,un和vn作为指针传递给你的函数。
const double rotcon_p = 0.422618;
const double lon_xx_p = -95.0;
const double lat_tan_p = 25.0;
for (j=0;j<ny_p;++j)
{
for (i=0,i<nx_p;++i)
{
double angle2 = rotcon_p*(olon[i][j]-lon_xx_p)*0.017453;
double sinx2 = sin(angle2);
double cosx2 = cos(angle2);
for (k=0;k<nsp_p;++k)
{
double ut = u[i][j][k]
double vt = v[i][j][k]
un[i][j][k] = cosx2*ut+sinx2*vt
vn[i][j][k] =-sinx2*ut+cosx2*vt
}
}
}
如果你完全使用c / c ++,这很好,如果你正在混合FORTRAN和c / c ++,你需要知道FORTRAN和c / c ++向后索引他们的数组,所以你可能不得不交换你的指数让它发挥作用
const double rotcon_p = 0.422618;
const double lon_xx_p = -95.0;
const double lat_tan_p = 25.0;
for (j=0;j<ny_p;++j)
{
for (i=0,i<nx_p;++i)
{
double angle2 = rotcon_p*(olon[j][i]-lon_xx_p)*0.017453;
double sinx2 = sin(angle2);
double cosx2 = cos(angle2);
for (k=0;k<nsp_p;++k)
{
double ut = u[k][j][i]
double vt = v[k][j][i]
un[k][j][i] = cosx2*ut+sinx2*vt
vn[k][j][i] =-sinx2*ut+cosx2*vt
}
}
}
但是我没有足够的背景知道你的问题,告诉你你需要做什么。
答案 1 :(得分:1)
我说Fortran以及Tarzan说英语,但这应该是C中的要点:
#include <math.h>
const double ROTCON_P = 0.422618;
const double LON_XX_P = -95.0;
const double LAT_TAN_P = 25.0;
int i, j, k;
double angle2, sinx2, cosx2, ut, vt;
double un[nzp_p][ny_p][nx_p];
double vn[nzp_p][ny_p][nx_p];
for (j=0; j<ny_p; ++j) {
for (i=0; i<nx_p; ++i) {
angle2 = ROTCON_P * (olon[j][i] - LON_XX_P) * 0.017453;
sinx2 = sin(angle2);
cosx2 = cos(angle2);
for (k=0; k<nzp_p; ++k) {
ut = u[k][j][i];
vt = v[k][j][i];
un[k][j][i] = (cosx2 * ut) + (sinx2 * vt);
vn[k][j][i] = (-1 * sinx2 * ut) + (cosx2 * vt);
}
}
}
您需要在某处声明olon
,u
,v
,nx_p
,ny_p
和nzp_p
并为其指定值在运行此代码之前。没有足够的背景信息让我知道它们究竟是什么。
答案 2 :(得分:0)
这是代码片段,这可能就是f2c无效的原因。另外,正如已经指出的那样,“结束如果”最有可能是“结束”。
如果你有经过测试的Fortran子程序并进行你需要的计算,可以从C调用它们。使用Fortran的ISO C绑定声明Fortran子程序的参数,然后Fortran编译器将使用C API使得例程可以从C调用。这个短代码块很容易翻译;长期和复杂的事情可能更好地重用。