#!/bin/bash
rm WAVECAR k_conv k_plot
#k convergence
for i in 2 4 6 8 9 10 11 12 13 14 15 16 ;
do
cat >KPOINTS <<!
pymatgen 4.7.6+ generated KPOINTS with grid density = 875 / atom
0
Monkhorst
$i $i $i
!
echo "k = $i" ;
b=$(llsubmit multiple.cmd) ;
c=$(echo $b | awk '{
ret=match($0,".in.")
rwt=match($0,"\" has")
rqt=rwt-(ret+4)
subs=substr($0,(ret+4),rqt)
print subs
}') ;
#c stores the job id
d=1 ;
until [ $d -eq 0 ]
do
b=$(llq $c) ; #llq is the command to query job information
d=$(echo $b | awk '{
if ($0 ~ /mm17s003/)
{print 1}
else
{print 0}
}')
done
E=$(tail -1 OSZICAR) ;
echo $i $E >> k_conv
done
awk '{print $1 "\t" $(NF-5)}' k_conv >> k_plot ; #Used to just write two specific columns from the file k_conv to k_plot.
这是我用来提交作业的脚本文件,它在每次提交作业之前更改文件KPOINTS
中一个输入参数的值。 for loop
是为此目的。 multiple.cmd
是实际的作业提交脚本,而llsubmit
是负载均衡器的作业提交命令。
nested until loop
用于查询特定已提交作业的作业状态。除非工作结束,否则此循环将不断重复。作业完成并且until loop
结束后,将生成输出文件OSZICAR
。 Awk用于提取特定的行,然后将其存储在E中。最后,for循环变量i
(即用于脚本更改的计算的输入参数)和E
存储在文件{ {1}}。 k_conv
的结尾。
本质上,由于for loop
一次只能提交一份作业。完成后,下一个until loop
迭代开始,并提交新作业。运行脚本时,对于for loop
作业的任何两个或三个随机值会同时提交。我假设i
有问题。
最初存储在b中的until loop
的输出:llsubmit multiple.cmd
c将作业ID(上例中的llsubmit: The job "c1hn1.virgo.iitm.ac.in.2077655" has been submitted.
)作为其值。
稍后存储在b中的2077655
的输出:llq $c
非常感谢您的帮助。