fortran77到fortran90输出差异
我已经下载了以下fortran程序dragon.f 我需要对程序做一个小的修改,这需要将程序翻译成fortran90(请参见下文以确认是否确实需要) 我通过三种不同的方法做到了这一点(仅翻译):fortran77到fortran90输出差异,fortran,fortran90,translate,fortran77,Fortran,Fortran90,Translate,Fortran77,我已经下载了以下fortran程序dragon.f 我需要对程序做一个小的修改,这需要将程序翻译成fortran90(请参见下文以确认是否确实需要) 我通过三种不同的方法做到了这一点(仅翻译): 替换注释行指示器(c表示!)和行延续 指示器(*第6列中最后一行末尾的和) 使用convert.f90(请参阅https://wwwasdoc.web.cern.ch/wwwasdoc/WWW/f90/convert.f90) 使用f2f.pl(请参阅https://bitbucket.org/lemo
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值未知时声明此数组(它们取决于用户将使用的数据大小) 正如上面的注释所指出的,参数不能从文件中读取,因为它们是在编译时设置的。将它们作为整数读入,将数组声明为可分配的,然后分配。
整数imax,jmax
实数(8),可分配::f(:,:),coe(:,:,:,:)
读(10,*)imax,jmax
分配(f(0:imax,0:jmax),coe(imax,jmax,4))
我发现结果的差异是由于使用了不同的编译器
PS我最终添加了比我一开始打算的多得多的代码,以允许从netcdf文件读取数据。这个程序特别有助于球谐展开。[标签:球面谐波]您知道没有令人信服的理由“转换”代码。您完全可以不使用它,随意与现代代码混合/匹配。您只需要将您的固定格式源代码保存在一个与任何新的自由格式文件不同的文件中。(或者以固定的形式做任何事情,如果它确实是一个小的修改)您也可以只添加现代功能到程序中,因为它是,没有理由转换源形式。对于Fortran 2008,固定源代码格式仍然是完全合法的。我需要通过文本文件输入参数,而不是修改程序,但如果不修改代码,就无法从文本文件中读取
参数
的值,例如imax
。几乎是参数的定义,它在编译时被赋予一个值,并且在程序执行期间不能修改。你的问题把我弄糊涂了。@HighPerformanceMark我的意思是它不需要是一个特定的“参数”,在这个意义上,我只需要它在程序运行期间是一个常量。但是,这些“参数”取决于输入数据的大小,因此,如果我正在处理另一个数据集,我需要相应地更改它们,并且我不希望每次都重新编译程序。您对如何实现这一点有什么建议吗?请使用allocate注意,维度变量也需要声明为整数,而不是参数。请不要引入real(8)
,因为这是不可移植的,双精度
,正如问题中所述。
dimension f(0:imax,0:jmax)...