使用带有更改变量的输入文件运行Fortran可执行文件

时间:2017-11-05 15:31:49

标签: bash shell unix fortran

我有一个Fortran代码,使用" namelist"来读取输入文件。特征。现在,有两个名称列表中的变量说xy。所以最终我想要的是

    do x=1,10
       do y = 2,5
        run fortran code with the new x and y.
       end 
     end

现在,我的输入文件中有许多其他变量,由Fortran中的名称列表读取。所以,我正在寻找一些可以改变输入文件中特定xy的shell脚本。

我的名单文件" input.inp"看起来像是:

    &BASICS
     x = 1
     y = 2
     H0_CONST = .F.
     T0 = 293
     Ma_in = 1.2 
    &END

我基本上想要运行我的程序go.exe来获取x和y的多个值。名单中定义的那些只是初始值加上一些应该保持不变的其他变量。 我的Fortran代码负责文件" input.inp"并将名单列为:

    read(2,nml=basics, iostat=io_stat)

2 个答案:

答案 0 :(得分:2)

您希望在配置文件中重复替换值,程序将在每次运行时读取输入。

您可以在嵌套for循环中使用sed替换替换。

例如,对于给定的文件

$ cat file
&basics x=1 y=1 &end

bash约定保持一致,=标志周围没有任何空白区域。

$ for x in {1..4}; do for y in {1..2}; 
  do sed -i -r "s/x=\w+/x=$x/;s/y=\w+/y=$y/" file; 
  cat file;  # <-- here run your program instead
  done; done

&basics x=1 y=1 &end
&basics x=1 y=2 &end
&basics x=2 y=1 &end
&basics x=2 y=2 &end
&basics x=3 y=1 &end
&basics x=3 y=2 &end
&basics x=4 y=1 &end
&basics x=4 y=2 &end

而不是打印文件,您可以改为运行程序。

如果您的变量不是整数,则需要将sed匹配从word更改为非空格。此外,对于循环,您必须这次枚举值。请查看下面的更新脚本......

$ for x in 1.1 2.2; do for y in 1.2 3.2; 
  do sed -i -r "s/x=\S+/x=$x/;s/y=\S+/y=$y/" file; 
  cat file; 
  done; done

答案 1 :(得分:2)

这是一个可以运行程序的简单脚本。将其保存为go,然后只需键入以下内容即可运行包含所有NAMELIST文件的程序:

./go

bash代码为:

#!/bin/bash
for x in {1..10}; do
   for y in {2..5}; do

      # Generate the NAMELIST file
      { echo "&BASICS"
        echo " x=$x"
        echo " y=$y"
        echo " H0_CONST=.F."
        echo " T0=293"
        echo " Ma_in=1.2"
        echo "&END"
      } > input.inp

      # Now run your program
      YourProgram input.inp

   done
done

在第一次运行它之前,您必须只使用一次,使脚本可执行:

chmod +x go