[英]Convert a code from FORTRAN to C
我有以下需要轉換為C或C ++的FORTRAN代碼。 我已經嘗試過使用f2c,但是沒有成功。 它與從Lambert隨風矢量向真實北向矢量的轉換有關。 有在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
非常感謝您的幫助或提示。
這將使您入門-我沒有嘗試對其進行編譯,但是它接近您的需要。 我假設數組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
}
}
}
但是對於您的問題,我沒有足夠的背景信息來告訴您您需要做什么。
我會說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
聲明olon
, u
, v
, nx_p
, ny_p
和nzp_p
並為其分配一個值。 沒有足夠的上下文信息讓我知道它們到底是什么。
這是一段代碼,這可能就是f2c無法正常工作的原因。 另外,正如已經指出的,“ end if”應該是“ end do”。
如果您具有經過測試的Fortran子例程並執行所需的計算,則可以從C調用它們。使用Fortran的ISO C綁定聲明Fortran子例程的參數,然后Fortran編譯器將使用C API,以便該短代碼塊易於翻譯;該例程可從C調用。 長而復雜的東西可能會更好地重用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.