fortran77到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

我已经下载了以下fortran程序dragon.f

我需要对程序做一个小的修改,这需要将程序翻译成fortran90(请参见下文以确认是否确实需要)

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

  • 替换注释行指示器(c表示!)和行延续 指示器(*第6列中最后一行末尾的和)
  • 使用convert.f90(请参阅https://wwwasdoc.web.cern.ch/wwwasdoc/WWW/f90/convert.f90)
  • 使用f2f.pl(请参阅https://bitbucket.org/lemonlab/f2f/downloads)
  • 1)和3)都起作用(即设法编译程序),而2)不能立即起作用

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

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

    你能给我一些建议,如何正确翻译这个程序,让我得到完全相同的结果吗

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

    例如,我将阅读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值未知时声明此数组(它们取决于用户将使用的数据大小)

    正如上面的注释所指出的,参数不能从文件中读取,因为它们是在编译时设置的。将它们作为整数读入,将数组声明为可分配的,然后分配。
    
    整数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)...