def VaspNEBCheckRMS(): print('CheckNEBRMS is running...') if '00' in os.listdir() and 'INCAR' in os.listdir(): data_INCAR = zzd.File.openFile('./INCAR') data_log = zzd.File.openFile('./log') image = zzd.File.getLine(data_INCAR, 'IMAGES')[0].split('=')[-1].strip('\n') #print(zzd.File.getAllline(data_log,'F=')) ionstep = zzd.File.getAllline(data_log, 'F=')[-1].split()[0] if int(image) <= 9: #print('aa') #data00 = zzd.getshellResult('grep RMS 00/OUTCAR') data01 = zzd.getshellResult('grep RMS 01/OUTCAR') data02 = zzd.getshellResult('grep RMS 02/OUTCAR') data03 = zzd.getshellResult('grep RMS 03/OUTCAR') #data04 = zzd.getshellResult('grep RMS 04/OUTCAR') #print(data00) print('{:^3}{:^10}{:^10}{:^10}{:^10}'.format( 'Step', '01-RMS', '02-RMS', '03-RMS', '01+02+03')) for i in range(int(ionstep)): print('{:>3}{:>10}{:>10}{:>10}{:>10.6f}'.format( i + 1, data01[i].split()[4], data02[i].split()[4], data03[i].split()[4], float(data01[i].split()[4]) + float(data02[i].split()[4]) + float(data03[i].split()[4]))) else: print('不在NEB目录,退出程序') exit()
def VaspNEBCheckDist(POSorCONT): if '00' in os.listdir() and 'INCAR' in os.listdir(): data_log = zzd.File.openFile('./INCAR') image = zzd.File.getLine(data_log, 'IMAGES')[0].split('=')[-1].strip('\n') if int(image) <= 9: #os.system('cp ini/CONTCAR 00/CONTCAR') #os.system('cp fin/CONTCAR 0'+str(int(image)+1)+'/CONTCAR') for i in range(0, int(image) + 1): if i == 0: dist = zzd.getshellResult('dist.pl ./0' + str(i) + '/POSCAR ./0' + str(i + 1) + '/' + POSorCONT) elif i == int(image): dist = zzd.getshellResult('dist.pl ./0' + str(i) + '/' + POSorCONT + ' ./0' + str(i + 1) + '/POSCAR') else: dist = zzd.getshellResult('dist.pl ./0' + str(i) + '/' + POSorCONT + ' ./0' + str(i + 1) + '/' + POSorCONT) print('{} 0{}-0{} {}'.format(POSorCONT, i, i + 1, dist[0].strip('\n'))) else: print('image too large') else: print('当前不在NEB目录,退出程序') exit()
def run2(ele): atoms = [53, 16, 12, 25, 14, 17, 23, 26, 39, 40, 37, 42, 31, 48, 27, 36, 30, 28, 13, 11, 5] fre1 = np.array([]) for i in range(len(atoms)): atom = str(atoms[i]) code = f'grep THz {ele}-Energies/{ele}-V/52Fe1{ele}1V/vib_analysis/atom{atom}/OUTCAR' result = zzdlib.getshellResult(code) fre = decode_vib_frequency(result) fre1 = np.concatenate((fre1, fre), axis=0) print(fre1.shape) vac_1nn = np.array([6.6160, 6.6107, 5.5804]) vac_2nn = np.array([7.0517, 7.0461, 6.6759]) item1 = np.power(np.prod(vac_1nn), 8) * np.power(np.prod(vac_2nn), 6) pure = np.array([7.0748, 7.0727, 7.0708]) item2 = np.power(np.prod(pure), 8) sol = np.array([6.4545, 6.4515, 6.4482]) sol_1nn = np.array([7.0020, 6.9931, 6.8190]) sol_2nn = np.array([7.1250, 7.0793, 7.0716]) item3 = np.prod(sol) * np.power(np.prod(sol_1nn), 8) * np.power(np.prod(sol_2nn), 6) item4 = np.prod(fre1) inner = item1 * item3 / item2 / item4 Sb = np.log(inner) print(f'item1: {item1}\nitem2: {item2} \nitem3: {item3} \nitem4: {item4}\n inner: {inner} Sb: {Sb}')
def get_Hm_and_v_from_raw(): cases = 'w0_3nn,w1,w2,w3_2nn,w3_3nn,w3_4nn'.split(',') Hm_list = [] v_list = [] for i in range(len(cases)): case = cases[i] os.chdir(case) # 获取Hm # print(pys_path, os.getcwd()) res = zzdlib.getshellResult(f'python3 {pys_path}/NEBCheck.py --func=2') # print(res) line, index = zzdlib.File.getLine(res, 'IMAGE') IMAGE = [] Barrier = [] # print(res) for j in range(index + 1, len(res)): if res[j] == '\n': break img = int(res[j].split()[0]) barrier = float(res[j].split()[-1]) IMAGE.append(img) Barrier.append(barrier) Hm_foreward = np.max(Barrier) Hm_backward = np.max(Barrier) - Barrier[-1] Hm_list.append(Hm_foreward) Hm_list.append(Hm_backward) # 获取v code = f'python3 {pys_path}/VaspVibAna_Result.py --isprint=True' res = zzdlib.getshellResult(code) v_foreward = zzdlib.File.getLine(res, keywords='foreward')[0].split()[-1] v_backward = zzdlib.File.getLine(res, keywords='backward')[0].split()[-1] if v_backward == 'Match': v_backward = '0' v_list.append(float(v_foreward)) v_list.append(float(v_backward)) os.chdir('..')
def run(ele, correct=False): code1 = f'grep THz {ele}-Energies/{ele}-V/52Fe1{ele}1V/vib_analysis/*/OUTCAR' result1 = zzdlib.getshellResult(code1) fre1 = decode_vib_frequency(result1) code2 = f'grep THz {ele}-Energies/{ele}-V/53Fe1{ele}/vib_analysis/*/OUTCAR' result2 = zzdlib.getshellResult(code2) fre2 = decode_vib_frequency(result2) print(fre1.shape, fre2.shape) # 主要是因为bcc_withCr 中 52Fe1Cr1V的atom46原子振动计算没有完成,fre1缺少一个原子的振动数据,用其他的原子的振动的平均值补充上去 if correct: number = fre1.shape[0] row = int(number/3) print(f'总{number} 行{row}') fre1 = fre1.reshape(row, 3) fre1_mean = np.mean(fre1, axis=0) fre1_mean = fre1_mean.reshape(1, 3) fre1 = np.concatenate((fre1, fre1_mean), axis=0) fre1 = fre1.reshape(number+3) vac_1nn = np.array([6.6160, 6.6107, 5.5804]) vac_2nn = np.array([7.0517, 7.0461, 6.6759]) item1 = np.power(np.prod(vac_1nn), 8) * np.power(np.prod(vac_2nn), 6) pure = np.array([7.0748, 7.0727, 7.0708]) item2 = np.power(np.prod(pure), 15) item4 = np.prod(fre1) item3 = np.prod(fre2) inner = item1 * item3 / item2 / item4 Sb = np.log(inner) print(f'item1: {item1}\nitem2: {item2} \nitem3: {item3} \nitem4: {item4}\n inner: {inner} Sb: {Sb}')
def grep_fre(path): code = f'grep THz {path}/OUTCAR' result = zzdlib.getshellResult(code) fre = decode_vib_frequency(result) return fre
def getBarrier(IS='-1'): #IS代表输入的Ionstep,根据IS获取该步时候的扩散势垒 Path = [] Barrier = [] Step = [] Image = [] runpath = os.getcwd() for dirpath, dirnames, filenames in os.walk('./'): if 'INCAR' in filenames and 'POTCAR' in filenames and 'KPOINTS' in filenames: data_INCAR = zzd.File.openFile(dirpath + '/INCAR', 'r') #print('dir',data_INCAR[0].split('=')[-1]) if 'NEB' in data_INCAR[0].split('=')[-1]: #print('NEB') data_Sh = zzd.File.openFile(dirpath + '/Vasp.sh', 'r') jobname = zzd.File.getLine( data_Sh, '#PBS -N')[0].split()[-1][:10] #获取任务名,且只取前10个字符 stat = zzd.Vasp.checkJobstatus(jobname) if stat == 'R' or stat == 'Q': print('路径{} NEB计算正在{}'.format(dirpath, stat)) elif 'log' in os.listdir(dirpath): #未提交或者已经算完: data_log = zzd.File.openFile(dirpath + '/log', 'r') isRA = zzd.File.getLine(data_log, 'reached required accuracy')[0] images = zzd.File.getLine(data_INCAR, 'IMAGES')[0].split('=')[-1] Fstep = zzd.File.getLine(data_INCAR, 'NSW')[0].split('=')[-1] ionstep = zzd.File.getAllline(data_log, 'F=')[-1].split()[0] if 'reached required accuracy' in isRA or Fstep == ionstep: #print('RA') barriers = [] os.chdir(dirpath) if IS == '-1': #默认用nebef.pl获取势垒 nebef = zzd.getshellResult('nebef.pl') for inn in nebef: barriers.append(float(inn.split()[3])) else: #获取输出的步数IS,计算该步数下的势垒。 try: data_OUTini = zzd.File.openFile( './00/OUTCAR', 'r') Eini = zzd.File.getAllline( data_OUTini, 'energy without entropy')[-1].split()[-1] data_OUTfin = zzd.File.openFile( './0' + str(int(images) + 1) + '/OUTCAR', 'r') Efin = zzd.File.getAllline( data_OUTini, 'energy without entropy')[-1].split()[-1] barriers.append(float(Eini) - float(Eini)) for ii in range(1, int(images) + 1): data = zzd.File.openFile( './0' + str(ii) + '/stdout', 'r') Ener = zzd.File.getLine( data, IS + ' F=')[0].split()[4] barriers.append(float(Ener) - float(Eini)) except Exception as e: print('获取第{}步势垒出现问题,提示为:{}'.format(IS, e)) Barrier.append(max(barriers)) Step.append(ionstep) Path.append(dirpath[:18]) Image.append(images) os.chdir(runpath) else: print('{} 未达到收敛标准或者计算步数未满,退出'.format(dirpath)) else: print('出现了奇怪的问题') print('{:<20}{:<10}{:<5}{:<3}'.format('path', 'barrier', 'step', 'images')) for i in range(len(Barrier)): print('{:<20}{:<10.7f}{:<5}{:<3}'.format(Path[i], Barrier[i], Step[i], Image[i]))
def CheckWARNING(usript): #usrinput为1时,只打印是否完成,为2时候,只打印能量信息,为3时,打印全部 Path = [] Energy = [] Step = [] mag = [] dist = [] RMS = [] warnflag = 0 jstat = ['Running...', 'Done', 'SC Running...', 'SC done', 'Stoped'] for dirpath, dirnames, filenames in os.walk('./'): if 'INCAR' in filenames and 'POSCAR' in filenames and 'Vasp.sh' in filenames: data_Sh = zzd.File.openFile(dirpath + '/Vasp.sh', 'r') data_INCAR = zzd.File.openFile(dirpath + '/INCAR', 'r') SYSTEM = zzd.File.getLine(data_INCAR, 'SYSTEM')[0].split('=')[-1] jobname = zzd.File.getLine(data_Sh, '#PBS -N')[0].strip('\n').split()[-1] jobstatus = zzd.Vasp.checkJobstatus(jobname) #print('Path:{} {} {}'.format(dirpath,jobstatus,jobname)) if jobstatus == 'Q': print('Path:{:<60}任务正在排队... '.format(dirpath)) elif jobstatus == 'R' or 'log' in filenames: #正在计算和算完了用相同的检测方法 if usript == '1' or usript == '3': data_log = zzd.File.openFile(dirpath + '/log', 'r') reachRA = zzd.File.getLine(data_log, 'reached required accuracy')[0] try: RMM = zzd.File.getAllline(data_log, 'RMM:')[-1].split()[1] RMM = RMM + ' RMM' except: RMM = '0 RMM' try: DAV = zzd.File.getAllline(data_log, 'DAV:')[-1].split()[1] DAV = DAV + ' DAV' except: DAV = '0 DAV' termination = zzd.File.getLine( data_log, 'Ctrl-C caught... cleaning up processes')[0] try: ionstep = zzd.File.getAllline(data_log, 'F=')[-1].split()[0] except: ionstep = '0' #print('Path:{} {} {}'.format(dirpath,reachRA,v1F)) if 'reached required accuracy' in reachRA: print('Path:{:<60}{:<15}{:>3}F{:>9}'.format( dirpath, jstat[1], ionstep, RMM)) elif SYSTEM == 'Self' or SYSTEM == 'Static' or SYSTEM == 'self' or SYSTEM == 'static': vRMM = zzd.File.getLine(data_log, 'RMM:')[0] vDAV = zzd.File.getLine(data_log, 'DAV:')[0] if ('DAV:' in vDAV or 'RMM:' in vRMM) and ionstep == '0': print('Path:{:<60}{:<15}{:>3}F{:>9}{:>7}{:>5}'. format(dirpath, jstat[2], ionstep, RMM, DAV, '*')) elif ionstep == '1': #没有完成,但有1F了 print('Path:{:<60}{:<15}{:>3}F{:>9}'.format( dirpath, jstat[3], ionstep, RMM)) elif 'cleaning up processes' in termination: print('Path:{:<60}{:<15}{:>3}F{:>9}{:>7}'.format( dirpath, jstat[4], ionstep, RMM, DAV)) else: print('Path:{:<60}{:<15}{:>3}F{:>9}{:>7}{:>5}'.format( dirpath, jstat[0], ionstep, RMM, DAV, '*')) # 检查警告 try: data_OUTCAR = zzd.File.openFile( dirpath + '/OUTCAR', 'r') WARNING_log = zzd.File.getAllline(data_log, 'WARNING') WARNING_OUT = zzd.File.getAllline( data_OUTCAR, 'WARNING') ERROR_log = zzd.File.getAllline(data_log, 'ERROR') if WARNING_log != [] or WARNING_OUT != []: print('Path:{:<60} 出现警告'.format( dirpath, ionstep)) zzd.File.printData(WARNING_log) zzd.File.printData(WARNING_OUT) warnflag = 1 if ERROR_log != []: zzd.File.printData(ERROR_log) warnflag = 1 except Exception as e: print('path:{} {}'.format(dirpath, e)) if usript == '2' or usript == '3': #打印能量信息 data_log = zzd.File.openFile(dirpath + '/log', 'r') try: log_lastF = zzd.File.getAllline(data_log, 'F=')[-1] except: log_lastF = '0 F= 0 E0= 0 d E 0 mag= 0' #在存在log,Log中连1步都没算完的时候 if len(dirpath) > 15: path = '...' + dirpath[-15:] else: path = dirpath Path.append(path) Energy.append(log_lastF.split()[4]) Step.append(log_lastF.split()[0]) try: mag.append(log_lastF.split()[9]) except: mag.append('0') dist.append( zzd.getshellResult('dist.pl ' + dirpath + '/POSCAR ' + dirpath + '/CONTCAR')[-1].strip('\n')) try: RMS.append( zzd.getshellResult('grep RMS ' + dirpath + '/OUTCAR')[-1].split()[4]) except: #如果出现没算完,grep返回一个空的列表的时候 RMS.append('0') if (usript == '1' or usript == '3') and warnflag == 0: print('无警告或错误') if (usript == '2' or usript == '3'): print('{:<18}{:<11}{:<5}{:^10}{:^10}{:^10}'.format( '路径', '能量', '步数', 'mag', 'dist', 'RMS')) for i in range(len(Path)): print('{:<20}{:<13.4f}{:<7}{:<12.4f}{:<10.4f}{:<10.4f}'.format( Path[i], eval(Energy[i]), Step[i], eval(mag[i]), eval(dist[i]), eval(RMS[i])))