在单独的目录中为每个 运行 编写一个配置文件,然后启动 mpi运行

Write a configuration file for each run in a separate directory, then launch mpirun

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

举个例子,我在目录b1-k1-a1中做了第一次计算(我选择这种格式的目录名来表示计算参数)。此 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
   

如果你能建议我如何让它以这种方式工作,我将不胜感激。

在我将 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

直接的问题是sed没有任何选项根本不修改文件;它只是将结果打印到标准输出。

非常不清楚您希望此处的文档完成什么。 cd 不读取其标准输入,因此它根本没有完成任何事情。

#!/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 -e "s/Beta=1/Beta=$n/" \
          -e "s/Kappa=1/Kappa=$m/" \
          -e "s/Alpha=0 1/Alpha=0 $v/" ~/home/b01-k1-a01/test.ctrl >/test.ctrl
      mpirun soft.x test.ctrl
      cd ..
      sleep 5
    done
  done
done

还要注意将多个 sed 命令合并到一个脚本中(尽管如其他地方所述,如果这是配置文件中的所有内容,也许 printf 会更好)。