首页 > 解决方案 > 如何从输入文件中设置 Fortran 变量?

问题描述

我有一个这样的输入文件:

x = 1.5
y = 2.8
z = 9.4
x = 4.2

我想设置变量的值。所以,我这样做:

read(1,'(A)', IOSTAT=io) str        
if (io > 0) then !error
    write(*,*) 'Check input.  Something was wrong'
    exit
else if (io < 0) then !EOF
    exit
else !read new value
    do i=1,len_trim(str)
        if (str(i:i) == "=") str(i:i) = " " !replase "=" with spaces
    end do            

    read(str, *) curvar, curval

    SELECT CASE (curvar)
    CASE ("x")
        x = curval            
    CASE ("y")
        y = curval
    CASE ("z")
        z = curval
    END SELECT

是否可以将名称存储在“curvar”中的变量设置为与“curval”相同的值而不使用“CASE SELECT”?我想存在一些更简单的方法。我需要它,因为我的程序将有比三个多得多的变量。

标签: stringfortran

解决方案


如果您可以在开头和结尾稍微更改文件,则可以使用namelist。参见,例如:http: //jules-lsm.github.io/vn4.2/namelists/intro.html

&namelist_name
x = 1.5
y = 2.8
z = 9.4
/

用一个简单的 Fortran 代码

namelist /namelist_name/ x, y, z

read(unit, nml = namelist_name)

否则答案是否定的,不可能只从配置文件中为具有特定名称的变量赋值,而不解析名称并使用一些条件或选择案例或指针数组或类似的东西。Fortran namelist I/O 这样做是为了您的方便。

或者有一些库可以做类似的工作并允许各种形式的配置文件。这个答案在命令行参数的上下文中讨论了这些选项。各种形式的配置文件有各种库,但例如天气预报和气候预测模型,通常只使用名称列表。对于我的模型,我编写了自己的解析器,它为结构化数据提供了更多选项,但它没有记录在案,并且更难用于其他人。


推荐阅读