首页 > 解决方案 > 在单独的目录中为每次运行编写一个配置文件,然后启动 mpirun

问题描述

我需要通过每次更改一个参数来进行一组计算。计算目录包含一个名为“test.ctrl”的控制文件、一个名为“job-test”的作业提交文件和一堆数据文件。每个计算都应该使用相同的控制文件名(写在作业测试中)提交,并且在这些数据文件中给出输出而不更改它们的名称,这会产生覆盖问题。出于这个原因,我想用 bash 脚本自动化作业提交过程,这样我就不需要手动提交每个计算。

例如,我在目录 b1-k1-a1 中进行了第一次计算(我选择这种格式的 dir 名称来表示计算参数)。此 test.ctrl 文件具有以下参数:

    Beta=1
    Kappa=1
    Alpha=0 1

我使用'sbatch job-test'命令提交了这份工作。对于下面的计算,我的代码应该复制这个名为 bX-kY-aZ 的整个目录,在控制文件中进行更改,最后提交作业。我天真地尝试在作业测试文件中编写整个内容,如下面的 MWE 所示:

    #!/bin/sh
    #SBATCH -N 1
    #SBATCH -n 1
    #SBATCH --time=0:15:00  ##hh:mm:ss


    for n in $(seq 0 5)
    do
    for m in $(seq 0 5)
    do
    for v in $(seq 0 5)
    do


    mkdir b$n-k$m-a$v
    cd b$n-k$m-a$v
    cp ~/home/b01-k1-a01/* .
    sed "s/Beta=1/Beta=$n/" test.ctrl
    sed "s/Kappa=1/Kappa=$m/" test.ctrl
    sed "s/Alpha=0 1/Alpha=0 $v/" test.ctrl
    cd ..<<EOF

    EOF

    mpirun soft.x test.ctrl
    
    sleep 5
    
    done
    done
    done
   

如果您能建议我如何使其以这种方式工作,我将不胜感激。

标签: bashsedsbatch

解决方案


正如评论中所建议的,在我移到cd ..循环的最后并删除了 sed 之后,它起作用了。因此,这现在有效:

#!/bin/sh
#SBATCH -N 1
#SBATCH -n 1
#SBATCH --time=0:15:00  ##hh:mm:ss

for n in $(seq 0 5)
do
  for m in $(seq 0 5)
  do
    for v in $(seq 0 5)
    do
        mkdir b$n-k$m-a$v
        cd b$n-k$m-a$v
        cp ~/home/b01-k1-a01/* .
        cat >test.ctrl <<EOF
Beta=$n
Kappa=$m
Alpha=0 $v
EOF
        mpirun soft.x test.ctrl
        sleep 5
        cd ..
    done
  done
done

推荐阅读