讓搬磚變得輕松——vasp提交系列任務(wù)用的腳本

在上adv. metal課的時候就曾經(jīng)遇到過這個問題,當(dāng)然那個時候還是全靠手動去做nuclei move的鍋,不過現(xiàn)在也會遇到這樣的情況,就是我要提交一系列的任務(wù),而這一系列的任務(wù)是有一定的規(guī)律的,目前從我遇到過的case來看,主要有兩種

Case 1.

這種情況每個任務(wù)里面不一樣的地方只有其中一個參數(shù),參數(shù)是單一的或者多個參數(shù)之間有某種數(shù)學(xué)關(guān)系
e.g. 要做一個convergence test,提交相同cut off energy不同k-point的一系列任務(wù),或者POSCAR里面成比例地修改鍵長

用改POSCAR這個case來說,需要完成兩個script:

  1. 生成POSCAR的script
    首先理清思路,在我們的一系列的任務(wù)中,POSCAR是一直在變的,所以在最開始的輸入文件中,我們不事先提供POSCAR這個文件,而是用每個文件夾中的script去生成跟任務(wù)文件夾對應(yīng)的POSCAR文件,然后運行vasp程序->得到結(jié)果->收集結(jié)果

  2. 寫一個生成POSCAR的script pos.py,這里用python寫了一個,用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()

這里我們是為了改變一個graphene的primitive cell的lattice parameter,由于是一個固定的Triclinic的結(jié)構(gòu),所以a和b的關(guān)系是固定的,也就是說只相當(dāng)于一個變量,每給出一個a值,我們就可以用這個script得到一個對應(yīng)的POSCAR

  1. 提交job的script
    在完成了POSCAR的generator之后,寫另外一個script job用來調(diào)用前面的script去生成一系列的POSCAR并運行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

這個script的工作流程就是,對于一個特定的i值->調(diào)用之前的pos.py生成POSCAR->用生成的POSCAR搭配之前提供的INCAR等文件進(jìn)行vasp計算,并且將計算結(jié)果(一個單步的計算,所以只有一個離子步的結(jié)果)放入名為SUMMARY的文件中,然后把計算過程中輸出的文件和當(dāng)前的POSCAR一起放入命名為值的文件夾中

運行之前要提交的文件:


輸入的文件

qsub job 運行之后應(yīng)該會得到這樣的結(jié)果:


輸出的文件

然而實際上我們只需要最后下載SUMMARY這個文件就夠啦
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)然這里之所以可以這樣的原因主要還是因為這個計算只有一個離子步,所以每一次運算只有一個E0=...的輸出,如果有多個離子步的計算就需要作相應(yīng)的調(diào)整從而只抓取最后一個E0的值了

這種情況感覺只適用于那些變量比較單一,而且有一定的數(shù)學(xué)規(guī)律的情況,遇到那種結(jié)構(gòu)優(yōu)化過之后的復(fù)雜結(jié)構(gòu),輸入的POSCAR都無規(guī)律的不一樣的情況就比較無力了

Case 2.

對于比較復(fù)雜的結(jié)構(gòu),可以先在本地計算機(jī)上建立好文件夾,然后用script單純地批量提交任務(wù)而不去改變文件里面內(nèi)容,當(dāng)然用這種方式得到的結(jié)果也只是一個個的獨立的文件夾,獲取結(jié)果的時候需要另外的script或者直接手動-_-||
用優(yōu)化過的結(jié)構(gòu)的bader電荷分析為例:

  1. 復(fù)制之前的含有結(jié)果的文件夾,mv CONTCAR POSCAR,然后修改INCAR的參數(shù)到適合bader電荷分析的計算,上傳到服務(wù)器上,這里的文件是12-20的一組數(shù)字命名的文件夾

  2. 登陸服務(wù)器,在包含一批任務(wù)的父文件夾中touch jobsub,然后vi jobsub編寫這個script

#!/bin/bash
for i in $(seq 12 1 20)
do
cd $i/
qsub job-gamma
cd ../
done

然后進(jìn)入包含一系列任務(wù)的父文件夾中


包含一系列任務(wù)文件夾的父文件夾

運行這個script,這里簡單說一下bash的應(yīng)用,這樣寫出來的一個script應(yīng)該是".sh"的一個文件,也就是說第一行寫的東西為這個文件標(biāo)明了身份(用什么語言去compile并執(zhí)行),第一行寫的是bash,于是就是用bash來運行,如果單獨運行這個文件的話,就像這樣

[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

就好了
這個script原理十分簡單,里面的代碼就是一個loop,其實就是用這個操作代替了我們手工的操作,節(jié)約了大量的時間,尤其是這種用手工作容易出錯且浪費時間的工作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,993評論 0 2
  • 本文轉(zhuǎn)載自博主一個人就是一個疊加態(tài),有部分刪減修改,文中對相關(guān)概念方法做了詳細(xì)的總結(jié),留坑待填... 1. 第一原...
    chempeng閱讀 44,518評論 1 33
  • 概要 64學(xué)時 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,789評論 0 3
  • 走過熟悉的街道 一如十年以前 陽光普照大地 我忘了你的樣子 我錯過了美好 錯過了豪情萬丈 錯過了夏日蟬鳴 如果月光...
    春風(fēng)明月閱讀 96評論 0 1
  • 《天龍八部》是唯一一部我從頭到尾看完的金庸先生的武俠。 說也奇怪,原來有個同事開了個古文店,我常借武俠看。卻沒有認(rèn)...
    孤獨一刀閱讀 888評論 18 27

友情鏈接更多精彩內(nèi)容