2010-03-23 3 views
0

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

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 

Большое спасибо за любую помощь или подсказку.

+4

Вы точно скопировали код? У вас есть 'end if', но нет' if', чтобы он соответствовал (и 'do' без соответствия' end do'). Есть ли вероятность, что 'end if' действительно' end do'? –

+2

Вы хотите c или C++? Вы пишете c в заголовке, но пометили вопрос тем и другим. – dmckee

+1

Определите, что «не получилось». Вы получили ошибки компиляции? Ошибки компоновщика? Ошибки времени выполнения? Выпустил ли f2c сообщение об ошибке? Как Джерри спрашивает, вы уверены, что скопировали код правильно? Перевод должен быть достаточно простым; единственные зацепы будут следить за тем, чтобы переменные были правильного типа и объявлены в правильной области. –

ответ

1

Я говорю Fortran, а также Тарзан говорит по-английски, но это должно быть суть его в 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

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

Но у меня нет достаточного контекста для вашей проблемы, чтобы сказать вам, которые вы должны сделать.

+0

Стоит также отметить, что его массивы используют 1 и n для начального и конечного индексов соответственно вместо 0 и n-1. Это, конечно, необычно для FORTRAN. –

+0

Да, поэтому я изменил циклы for так, чтобы ссылки на данные были одинаковыми. – miked

0

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

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

Смежные вопросы