gpt4 book ai didi

c++ - 需要将以下 FORTRAN 代码转换为 C++

转载 作者:太空宇宙 更新时间:2023-11-04 14:51:18 26 4
gpt4 key购买 nike

我是一个非常糟糕的程序员,我得到了一个程序,据说可以帮助我改进我的空气动力学硬件。但它是 fortran 语言,我正在尝试使用 MATLAB 来运行这个程序。将其转换为 matlab 可以理解的语言有什么帮助吗? (最好是c++)

      program joukow
c

c computes joukowski airfoil and finds pressure coefficient

c currently set up for symmetric airfoil with sharp trailing edge

c and chord length equal to one.

c profile is written onto prof.dat and cp onto cp.dat

c implicit real*8(a-h,o-z)

complex z,zeta,cw
dimension uz(100),vz(100),xi(100),eta(100),cp(100)
dimension xout(100),yout(100)
open(unit=8,file='prof.dat',status='unknown')
open(unit=9,file='cp.dat',status='unknown')
b=1.d0
write(6,98)
format(2x,'input the radius of the a-circle in z plane')
read(5,99)a
format(f10.0)
xl=2.*a-1.+1./(2.*a-1.)

c xl=a+1./a

c chord=2.*xl

chord=2.+xl
del=a-b

c del =0.1d0
do 50 i=1,100
ri=i
theta=6.2832d0*ri/101.d0
x=-del+a*cos(theta)
y=a*sin(theta)
z=cmplx(x,y)
zeta=z+b**2/z

c

c xi and eta are coordinates of points on airfoil

c

xi(i)=real(zeta)

eta(i)=aimag(zeta)

cw=(1.-a**2/(z+del)**2)/(1.-b**2/z**2)
c

c uz and vz are velocity components on the airfoil assuming the free-stream

c speed is one.
c
uz(i)=real(cw)
vz(i)=-aimag(cw)

c

c xout and yout are airfoil coordinates where the leading edge is at (0,0)

c and the chordlength is one.

c

xout(i)=(xl+xi(i))/chord
yout(i)=eta(i)/chord
write(8,100)xout(i),yout(i)
format(2x,2f10.4)
continue

c

c now calculate the pressure coefficient cp

c

write(6,200)
format(2x,'pressure coefficients')
do 70 i=1,50
cp(i)=1.-(uz(i)**2+vz(i)**2)
write(9,100)xout(i),cp(i)
continue
stop
end

最佳答案

Matlab 可以很好地理解 Fortran——查看文档。如果这不能满足您的要求,程序中进行任何计算的大部分行都可以输入到 Matlab 控制台中,只需稍作修改。如果你是一个糟糕的程序员,我建议你花时间将程序修改为 Matlab 而不是 C++。如果你没有得到比我现在有时间更好的帮助,我会在稍后写更多。

编辑:首先,关于 using Fortran source files 的一些信息来自Matlab。如果您真的不想(或者不能或出于性能原因不这样做)将 Fortran 重写为 Matlab,然后将其转换为 MEX 文件。使用 f2c(或其他任何东西,包括您自己的时间和精力)首先将 Fortran 翻译成 C 或 C++ 对我来说似乎毫无意义。

如果您不喜欢这个想法,这里有一些将 Fortran 转换为 Matlab 的想法。

首先,所有以 C 或 c 开头的行都是注释,因此您无需翻译它们。从您的代码开始:

  complex z,zeta,cw
dimension uz(100),vz(100),xi(100),eta(100),cp(100)
dimension xout(100),yout(100)

这些行声明了一些变量。在 Matlab 中使用变量之前不必声明变量,但有时这样做是有充分理由的。您也不必在 Fortran 中这样做,尽管如今这被普遍认为是一个坏主意。您可以在 Matlab 中使用以下语句“声明”这些变量:

uz = zeros(100,1); 
vz = zeros(100,1);

通过在您的 Matlab 中提前声明这些,您可以为它们分配一次内存,并避免一些降低性能的问题。

接下来的两行:

     open(unit=8,file='prof.dat',status='unknown')
open(unit=9,file='cp.dat',status='unknown')

打开几个文件进行输出。它们稍后会在 write 语句中使用 - 忘记它们,改为编写 Matlab 语句,例如 save xout

下一行是 Fortran 但在 Matlab 中是相同的:

  b=1.d0

下一行从控制台获取半径值:

  write(6,98)
format(2x,'input the radius of the a-circle in z plane')
read(5,99)a
format(f10.0)

再次,我建议你忘记这些,只使用Matlab控制台设置a的值。更多不需要翻译的 Fortran(尽管我建议您去掉小数点后不跟 0 或在它们之间放置一个空格,随后的 * -- .* 是 Matlab 中的特定运算符):

  xl=2.*a-1.+1./(2.*a-1.)

chord=2.+xl
del=a-b

Fortran do 循环与 Matlab for 循环相同。重写:

  do 50 i=1,100

作为

for i = 1:100

正如其他受访者之一指出的那样,匹配的结束语句的去向并不明确,您必须弄清楚这一点。请注意,我只是将 Fortran 逐行翻译成 Matlab。它不是写得很好的 Fortran,我也不会提供写得很好的 Matlab,我会把它留给你。

这批不需要翻译:

  ri=i
theta=6.2832d0*ri/101.d0
x=-del+a*cos(theta)
y=a*sin(theta)

cmplx 是一个 Fortran 函数,它返回一个具有实部 x 和虚部 y 的复数:

  z=cmplx(x,y)

在 Matlab 中,这将是 z = x + y * i。 Fortran用**求幂,Matlab用^

  zeta=z+b**2/z

等等等等。

希望对您有所帮助。

关于c++ - 需要将以下 FORTRAN 代码转换为 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4099157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com