Конвертировать код из FORTRAN в C - PullRequest
0 голосов
/ 23 марта 2010

У меня есть следующий код FORTRAN, который мне нужно преобразовать в C или C ++. Я уже пытался использовать f2c, но это не сработало. Это как-то связано с преобразованием вектора конформного ветра Ламберта в вектор, ориентированный на истинный север. Есть кто-нибудь опытный в Фортране, кто мог бы помочь?

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 ]

2 голосов
/ 23 марта 2010

Это поможет вам начать - я не пытался его скомпилировать, но он близок к тому, что вам нужно. Я предположил, что массивы 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 голос
/ 23 марта 2010

Я говорю на Фортране так же, как Тарзан говорит по-английски, но это должно быть суть в 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 и присвоить им значение перед запуском этого кода. Мне не хватает контекстной информации, чтобы точно знать, что это такое.

0 голосов
/ 24 марта 2010

Это фрагмент кода, из-за которого может не работать f2c. Плюс, как уже указывалось, скорее всего, «end if» должен быть «end do».

Если у вас есть подпрограммы Fortran, которые протестированы и выполняют необходимые вычисления, вы можете вызывать их из C. Вы объявляете аргументы подпрограммы Fortran, используя привязку ISO C привязки Fortran, тогда компилятор Fortran будет использовать C API, так что подпрограмма вызывается из C. Этот короткий кодовый блок легко перевести; что-то длинное и сложное может быть лучше использовать повторно.

...