我想使用不同的输入参数集多次运行 Fortran 77 程序;我已经确保输出文件名会根据我使用的不同输入参数而更改,但我不确定如何运行具有不同输入参数集的程序,而不必每次都转到代码来更改参数。
为了说明我的问题,这里有一个简单的代码。
PROGRAM CODE
IMPLICIT DOUBLE PRECISION (A-H, J-Z)
COMMON / param / radius
radius = 2
write(*,*) 'radius = ', radius
write(*,*) 'the area is = ', 3.14*radius*radius
END
假设我想以不同的半径运行此代码,而不是必须进入代码并手动更改值,我想要一个具有不同参数选择的文件并让它运行多次。
当然,可以通过创建不同参数选择的数组并循环来解决此问题。但是,我不想这样做,因为我实际上有多个参数想要为每次运行更改。
为了回应下面的评论之一,如果我有一个文件,每次运行都有不同的输入选择,我如何让程序为每次运行的不同参数选择抓取不同的行?
有一种“行人”式的方法我已经用过很多次了。
为了避免重新编译,解决方案是对参数文件的名称进行硬编码并从该文件中读取数据。代码的每次运行都必须有自己的参数副本以及自己的目录。
我在下面给出了单个参数的示例,但如果需要,您可以对其进行概括。它依赖于 bash 中的驱动程序脚本。
Fortran程序:
PROGRAM CODE
IMPLICIT DOUBLE PRECISION (A-H, J-Z)
COMMON / param / radius
open(11, file='parameters.txt')
read(11,*) radius
close(11)
write(*,*) 'radius = ', radius
write(*,*) 'the area is = ', 3.14*radius*radius
END
bash程序:
for radius in 01 02 05 10
do
RUNDIR=run_${radius}
mkdir ${RUNDIR}
echo "${radius}" > ${RUNDIR}/parameters.txt
(cd ${RUNDIR} ; ../code)
done
编译 Fortran 代码:
gfortran -std=legacy -o code code.f
并执行参数运行:
bash parametricrun.sh
Fortran 代码的作用:打开名为parameters.txt
并读取半径值的第一个条目。
bash 脚本的作用:对于参数的多个值,创建一个新目录,创建一个名为parameters.txt
在该目录中然后执行 Fortran 程序code
in那个目录。
评论:
这可以扩展到多个变量,可以是每行一个变量,也可以是每行多个变量parameters.txt
,在 bash 程序中使用第二个循环。
如果您可以使用更现代的 Fortran 版本,请提及。那里还有更多选择。
其他语言(Python,如 arclight 建议的那样,或其他语言)可用于脚本编写。许多计算集群使用 bash 来运行作业,因此可以用于参数运行(半径的值可以通过作业排队系统传递)。
我任意使用11作为文件单元号。您的实际情况确实需要为您的程序使用可用的单元号。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)