簡體   English   中英

將代碼從FORTRAN轉換為C

[英]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聲明olonuvnx_pny_pnzp_p並為其分配一個值。 沒有足夠的上下文信息讓我知道它們到底是什么。

這是一段代碼,這可能就是f2c無法正常工作的原因。 另外,正如已經指出的,“ end if”應該是“ end do”。

如果您具有經過測試的Fortran子例程並執行所需的計算,則可以從C調用它們。使用Fortran的ISO C綁定聲明Fortran子例程的參數,然后Fortran編譯器將使用C API,以便該短代碼塊易於翻譯;該例程可從C調用。 長而復雜的東西可能會更好地重用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM