繁体   English   中英

fortran77到fortran90的输出差异

[英]fortran77 to fortran90 differences in output

我已经在http://www.iamg.org/documents/oldftp/VOL32/v32-10-11.zip下载了以下fortran程序dragon.f

我需要对该程序进行较小的修改,这需要将该程序转换为fortran90(请参阅下面的内容以确认是否确实需要这样做)。

我设法通过三种不同的方法来做到这一点(仅翻译):

  1. 替换注释行指示器(c表示!)和行继续指示器(第6列中*表示最后一行的&)
  2. 使用convert.f90(请参阅https://wwwasdoc.web.cern.ch/wwwasdoc/WWW/f90/convert.f90)
  3. 使用f2f.pl(请参阅https://bitbucket.org/lemonlab/f2f/downloads)

1)和3)都可以工作(即设法编译程序),而2)不能立即工作。

但是,在测试程序后,我发现结果是不同的。 使用fortran77程序,可以得到该程序附带的示例的“预期”结果(该程序附带示例数据“ grdata.txt”,示例输出为“ flm.txt”和“ check.txt”)。 但是,运行翻译后的(fortran90)程序后,得到的结果是不同的。

我怀疑某些变量的声明方式存在一些问题。

您能给我一些有关如何正确翻译此程序的建议,以便我得到完全相同的结果吗?

我需要在fortran90中执行此操作的原因是因为我需要通过文本文件输入参数,而不是修改程序。 除了所声明的最后一个参数的大小是根据程序不知道先验的参数确定的(请参阅下文)之外,对于大多数涉及的参数这都不是问题:

implicit double precision(a-h,o-z)
parameter(lmax=90,imax=45,jmax=30)
parameter(dcta=4.0d0,dfai=4.0d0)
parameter(thetaa=0.d0,thetab=180.d0,phaia=0.d0,phaib=120.d0)
dimension f(0:imax,0:jmax),coe(imax,jmax,4),coew(4),fw(4)

因此,例如,我将读取lmax,imax,jmax,dcta,dfai,thetaa,thetab,phaia和phaib,并且程序需要声明f和coe,但是据我在谷歌搜索此问题后所读的内容,无法将它们声明为fortran77中大小未知。

编辑:这是我尝试进行此修改:

character fname1*100
call getarg(1,fname1)
open(10,file=fname1)
read(10,*)lmax,imax,jmax,dcta,dfai,thetaa,thetab,phaia,phaib
close(10)

因此,程序将从文件(例如params.txt)中读取这些常量,在调用程序时,文件名将作为参数提供。 执行此操作时出现的问题是我不知道如何修改该行

dimension f(0:imax,0:jmax)...

为了在编译程序时不知道imax和jmax值时声明此数组(它们取决于用户将使用的数据大小)。

正如上面的注释中指出的那样,由于参数是在编译时设置的,因此无法从文件读取参数。 以整数形式读取它们,将数组声明为可分配,然后分配。 integer imax,jmax real(8), allocatable :: f(:,:),coe(:,:,:) read(10,*) imax,jmax allocate(f(0:imax,0:jmax),coe(imax,jmax,4))

我发现结果的差异归因于使用不同的编译器。

PS我最终添加了比开始时想要的更多的代码,以允许从netcdf文件读取数据。 该程序对于球形谐波的扩展特别有用。 标签:球形谐波

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM