|
|
本帖最后由 卡开发发 于 2022-9-29 22:26 编辑
固定的信息可能需要通过CONCAR或者通过vasprun.xml获得,但是vasprun.xml只能在计算结束时才会写入。固定的原子在固定的分量置零就行了。
做法也有两种:
1、完全使用原生python,我就用了math和re两个模块。- import re
- import math
- class Data:
- def __init__(self):
- self.natms=0
- self.constr=[]
- self.forces=[]
- def get_poscar_info(self):
- """
- vasp5 POSCAR format
- """
- with open('POSCAR') as f:
- data=f.read().lower()
- data=data.replace('t','1')
- data=data.replace('f','0')
- data=data.split('\n')
- self.natms=sum(int(d) for d in data[6].split())
- if data[7].strip()=='s':
- self.constr=[[int(d) for d in line.split()[3:6]]
- for line in data[9:9+self.natms]]
- else:
- self.constr=[[1 for i in range(3)] for j in range(self.natms)]
- def get_outcar_info(self):
- with open('OUTCAR') as f:
- data=f.read()
- parttern='TOTAL-FORCE \(eV/Angst\)\n'
- parttern+='\s+--+\n(.*?)\n'
- parttern+='\s+--+\n'
- data=re.findall(parttern,data,re.S)
- self.forces=[[[float(d) for d in line.split()[3:6]]
- for line in lines.split('\n')] for lines in data]
- def get_forces(self):
- self.get_poscar_info()
- self.get_outcar_info()
- norm=lambda x:math.sqrt(x[0]**2+x[1]**2+x[2]**2)
- for s,force in enumerate(self.forces):
- max_force=max([norm([force[i][j]*self.constr[i][j] for j in range(3)])
- for i in range(self.natms)])
- print('% 4d %12.6f'%(s+1,max_force))
复制代码
2、完全使用生态,如ase和numpy
- from ase import io
- import numpy as np
- poscar=io.read('POSCAR')
- outcar=list(io.iread('OUTCAR'))
- for s,image in enumerate(outcar):
- image.set_constraint(poscar.constraints)
- forces=image.get_forces()
- max_force=np.max(np.linalg.norm(forces,axis=1))
- print('% 4d %12.6f'%(s+1,max_force))
复制代码
|
|