在上adv. metal課的時(shí)候就曾經(jīng)遇到過(guò)這個(gè)問(wèn)題,當(dāng)然那個(gè)時(shí)候還是全靠手動(dòng)去做nuclei move的鍋来累,不過(guò)現(xiàn)在也會(huì)遇到這樣的情況速缆,就是我要提交一系列的任務(wù),而這一系列的任務(wù)是有一定的規(guī)律的爆侣,目前從我遇到過(guò)的case來(lái)看萍程,主要有兩種
Case 1.
這種情況每個(gè)任務(wù)里面不一樣的地方只有其中一個(gè)參數(shù),參數(shù)是單一的或者多個(gè)參數(shù)之間有某種數(shù)學(xué)關(guān)系
e.g. 要做一個(gè)convergence test兔仰,提交相同cut off energy不同k-point的一系列任務(wù)茫负,或者POSCAR里面成比例地修改鍵長(zhǎng)
用改POSCAR這個(gè)case來(lái)說(shuō),需要完成兩個(gè)script:
生成POSCAR的script
首先理清思路乎赴,在我們的一系列的任務(wù)中忍法,POSCAR是一直在變的潮尝,所以在最開(kāi)始的輸入文件中,我們不事先提供POSCAR這個(gè)文件饿序,而是用每個(gè)文件夾中的script去生成跟任務(wù)文件夾對(duì)應(yīng)的POSCAR文件勉失,然后運(yùn)行vasp程序->得到結(jié)果->收集結(jié)果寫一個(gè)生成POSCAR的script pos.py,這里用python寫了一個(gè)原探,用c也可以乱凿,完全看習(xí)慣
import sys
import math
a = float(sys.argv[1]) # lattice constant
fout = open('POSCAR', 'w') # make a file named as POSCAR
fout.write(
'''G_monolayer
1.0
%.10f 0.0000000000 0.0000000000
%.10f %.10f 0.0000000000
0.0000000000 0.0000000000 3.0000000000
C
2
Cartesian
0.000000000 0.000000000 2.171259403
1.233863017 0.712369702 2.171259403
'''%(a, -a/2, math.sqrt(3)*a/2))
# construct a primitive cell with constant c direction but variable a b directions
fout.close()
這里我們是為了改變一個(gè)graphene的primitive cell的lattice parameter,由于是一個(gè)固定的Triclinic的結(jié)構(gòu)咽弦,所以a和b的關(guān)系是固定的徒蟆,也就是說(shuō)只相當(dāng)于一個(gè)變量,每給出一個(gè)a值离唬,我們就可以用這個(gè)script得到一個(gè)對(duì)應(yīng)的POSCAR
- 提交job的script
在完成了POSCAR的generator之后后专,寫另外一個(gè)script job用來(lái)調(diào)用前面的script去生成一系列的POSCAR并運(yùn)行vasp程序
#!/bin/bash
#PBS -N GRAPHENE
#PBS -q USERNAME
#PBS -l nodes=2:ppn=24
#PBS -l walltime=48:00:00
#PBS -V
#PBS -S /bin/bash
cd $PBS_O_WORKDIR
#source /public/software/profile.d/openmpi-intel-env.sh
#source /public/software/profile.d/intel-env.sh
source /opt/intel/composer_xe_2015/bin/compilervars.sh intel64
source /opt/intel/mkl/bin/intel64/mklvars_intel64.sh
source /opt/intel/impi/5.0.2.044/bin64/mpivars.sh
EXEC=/opt/software/vasp/vasp-5.3.5-base
#EXEC=/opt/software/vasp/vasp-5.3.5-noZ
NP=`cat $PBS_NODEFILE | wc -l`
NN=`cat $PBS_NODEFILE | sort | uniq | wc -l`
#partition line, from here start to call previous script and run vasp program
rm WAVECAR SUMMARY
for i in $(seq 2.4590 0.0005 2.4690)
do
python pos.py $i
# relaxation
mpirun -genv I_MPI_DEVICE rdma -machinefile $PBS_NODEFILE -n $NP $EXEC > vasp.log
E=`awk '/F=/ {print $0}' OSZICAR` ; echo $i $E >>SUMMARY
mkdir $i
mv CHG CONTCAR EIGENVAL OSZICAR PCDAT vasprun.xml WAVECAR CHGCAR DOSCAR IBZKPT OUTCAR POSCAR XDATCAR vasp.log $i
done
這個(gè)script的工作流程就是,對(duì)于一個(gè)特定的i值->調(diào)用之前的pos.py生成POSCAR->用生成的POSCAR搭配之前提供的INCAR等文件進(jìn)行vasp計(jì)算输莺,并且將計(jì)算結(jié)果(一個(gè)單步的計(jì)算戚哎,所以只有一個(gè)離子步的結(jié)果)放入名為SUMMARY的文件中,然后把計(jì)算過(guò)程中輸出的文件和當(dāng)前的POSCAR一起放入命名為值的文件夾中
運(yùn)行之前要提交的文件:
qsub job 運(yùn)行之后應(yīng)該會(huì)得到這樣的結(jié)果:
然而實(shí)際上我們只需要最后下載SUMMARY這個(gè)文件就夠啦
2.4590 1 F= -.16200431E+02 E0= -.16200431E+02 d E =-.377889E-09
2.4595 1 F= -.16200510E+02 E0= -.16200510E+02 d E =-.160482E-08
2.4600 1 F= -.16200576E+02 E0= -.16200576E+02 d E =-.623061E-08
2.4605 1 F= -.16200619E+02 E0= -.16200619E+02 d E =-.221167E-07
2.4610 1 F= -.16200653E+02 E0= -.16200653E+02 d E =-.717880E-07
2.4615 1 F= -.16200667E+02 E0= -.16200667E+02 d E =-.213098E-06
2.4620 1 F= -.16200671E+02 E0= -.16200671E+02 d E =-.578529E-06
2.4625 1 F= -.16200661E+02 E0= -.16200661E+02 d E =-.143590E-05
2.4630 1 F= -.16200629E+02 E0= -.16200627E+02 d E =-.325742E-05
2.4635 1 F= -.16200580E+02 E0= -.16200576E+02 d E =-.674955E-05
2.4640 1 F= -.16200515E+02 E0= -.16200509E+02 d E =-.127662E-04
2.4645 1 F= -.16200445E+02 E0= -.16200434E+02 d E =-.220353E-04
2.4650 1 F= -.16200355E+02 E0= -.16200338E+02 d E =-.347476E-04
2.4655 1 F= -.16200252E+02 E0= -.16200227E+02 d E =-.501850E-04
2.4660 1 F= -.16200157E+02 E0= -.16200124E+02 d E =-.666691E-04
2.4665 1 F= -.16200046E+02 E0= -.16200005E+02 d E =-.818921E-04
2.4670 1 F= -.16199922E+02 E0= -.16199875E+02 d E =-.934967E-04
2.4675 1 F= -.16199788E+02 E0= -.16199739E+02 d E =-.996283E-04
2.4680 1 F= -.16199656E+02 E0= -.16199606E+02 d E =-.992796E-04
2.4685 1 F= -.16199505E+02 E0= -.16199459E+02 d E =-.925687E-04
2.4690 1 F= -.16199381E+02 E0= -.16199341E+02 d E =-.805424E-04
然后復(fù)制到excel里面進(jìn)行處理就好了嫂用,當(dāng)然這里之所以可以這樣的原因主要還是因?yàn)檫@個(gè)計(jì)算只有一個(gè)離子步型凳,所以每一次運(yùn)算只有一個(gè)E0=...的輸出,如果有多個(gè)離子步的計(jì)算就需要作相應(yīng)的調(diào)整從而只抓取最后一個(gè)E0的值了
這種情況感覺(jué)只適用于那些變量比較單一嘱函,而且有一定的數(shù)學(xué)規(guī)律的情況甘畅,遇到那種結(jié)構(gòu)優(yōu)化過(guò)之后的復(fù)雜結(jié)構(gòu),輸入的POSCAR都無(wú)規(guī)律的不一樣的情況就比較無(wú)力了
Case 2.
對(duì)于比較復(fù)雜的結(jié)構(gòu)往弓,可以先在本地計(jì)算機(jī)上建立好文件夾疏唾,然后用script單純地批量提交任務(wù)而不去改變文件里面內(nèi)容,當(dāng)然用這種方式得到的結(jié)果也只是一個(gè)個(gè)的獨(dú)立的文件夾函似,獲取結(jié)果的時(shí)候需要另外的script或者直接手動(dòng)-_-||
用優(yōu)化過(guò)的結(jié)構(gòu)的bader電荷分析為例:
復(fù)制之前的含有結(jié)果的文件夾槐脏,mv CONTCAR POSCAR,然后修改INCAR的參數(shù)到適合bader電荷分析的計(jì)算撇寞,上傳到服務(wù)器上顿天,這里的文件是12-20的一組數(shù)字命名的文件夾
登陸服務(wù)器,在包含一批任務(wù)的父文件夾中touch jobsub蔑担,然后vi jobsub編寫這個(gè)script
#!/bin/bash
for i in $(seq 12 1 20)
do
cd $i/
qsub job-gamma
cd ../
done
然后進(jìn)入包含一系列任務(wù)的父文件夾中
運(yùn)行這個(gè)script牌废,這里簡(jiǎn)單說(shuō)一下bash的應(yīng)用,這樣寫出來(lái)的一個(gè)script應(yīng)該是".sh"的一個(gè)文件啤握,也就是說(shuō)第一行寫的東西為這個(gè)文件標(biāo)明了身份(用什么語(yǔ)言去compile并執(zhí)行)鸟缕,第一行寫的是bash,于是就是用bash來(lái)運(yùn)行恨统,如果單獨(dú)運(yùn)行這個(gè)文件的話叁扫,就像這樣
[xxx@xxx double]$ ls
12 13 14 15 16 17 18 19 20 jobsub
[xxx@xxx double]$ bash jobsub
271306.mu01
271307.mu01
271308.mu01
271309.mu01
271310.mu01
271311.mu01
271312.mu01
271313.mu01
271314.mu01
就好了
這個(gè)script原理十分簡(jiǎn)單三妈,里面的代碼就是一個(gè)loop,其實(shí)就是用這個(gè)操作代替了我們手工的操作莫绣,節(jié)約了大量的時(shí)間畴蒲,尤其是這種用手工作容易出錯(cuò)且浪費(fèi)時(shí)間的工作