将代码从FORTRAN转换为C.

时间:2010-03-23 20:06:57

标签: c++ c fortran

我有以下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

非常感谢您的帮助或提示。

3 个答案:

答案 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);
        }
    }
}

您需要在某处声明olonuvnx_pny_pnzp_p并为其指定值在运行此代码之前。没有足够的背景信息让我知道它们究竟是什么。

答案 2 :(得分:0)

这是代码片段,这可能就是f2c无效的原因。另外,正如已经指出的那样,“结束如果”最有可能是“结束”。

如果你有经过测试的Fortran子程序并进行你需要的计算,可以从C调用它们。使用Fortran的ISO C绑定声明Fortran子程序的参数,然后Fortran编译器将使用C API使得例程可以从C调用。这个短代码块很容易翻译;长期和复杂的事情可能更好地重用。