Skip to content

Commit

Permalink
Support several CALYPSO run in different pressure in one iteration (#814
Browse files Browse the repository at this point in the history
)
  • Loading branch information
wangzyphysics authored Aug 6, 2022
1 parent 40f66fd commit 5c5718c
Show file tree
Hide file tree
Showing 12 changed files with 644 additions and 351 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,4 @@ dbconfig.json
_build
tests/generator/calypso_test_path
doc/api/

14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -593,15 +593,15 @@ The bold notation of key (such as **calypso_path**) means that it's a necessary
| **model_devi_jobs["NameOfAtoms"]** | List of string |["Al","Cu"] | Parameter of CALYPSO input file, means the element species of structures to be generated. |
| **model_devi_jobs["NumberOfAtoms"]** | List of int |[1,10] | Parameter of CALYPSO input file, means the number of atoms for each chemical species in one formula unit. |
| **model_devi_jobs["NumberOfFormula"]** | List of int |[1,2] | Parameter of CALYPSO input file, means the range of formula unit per cell. |
| **model_devi_jobs["Volume"]** | List of int |[300] | Parameter of CALYPSO input file, means the colume per formula unit(angstrom^3). |
| **model_devi_jobs["Volume"]** | int | 300 | Parameter of CALYPSO input file, means the colume per formula unit(angstrom^3). |
| **model_devi_jobs["DistanceOfIon"]** | List of float |[[ 1.48,1.44],[ 1.44,1.41]] | Parameter of CALYPSO input file, means minimal distance between atoms of each chemical species. Unit is in angstrom. |
| **model_devi_jobs["PsoRatio"]** | List of float |[0.6] | Parameter of CALYPSO input file, means the proportion of the structures generated by PSO. |
| **model_devi_jobs["PopSize"]** | List of int |[5] | Parameter of CALYPSO input file, means the number of structures to be generated in one step in CALYPSO. |
| **model_devi_jobs["MaxStep"]** | List of int |[3] | Parameter of CALYPSO input file, means the number of max step in CALYPSO.|
| **model_devi_jobs["ICode"]** | List of int |[13] | Parameter of CALYPSO input file, means the chosen of local optimization, 1 is vasp and 13 is ASE with dp. |
| **model_devi_jobs["PsoRatio"]** | float or int | 0.6 | Parameter of CALYPSO input file, means the proportion of the structures generated by PSO. |
| **model_devi_jobs["PopSize"]** | int | 5 | Parameter of CALYPSO input file, means the number of structures to be generated in one step in CALYPSO. |
| **model_devi_jobs["MaxStep"]** | int | 3 | Parameter of CALYPSO input file, means the number of max step in CALYPSO.|
| **model_devi_jobs["ICode"]** | int | 13 | Parameter of CALYPSO input file, means the chosen of local optimization, 1 is vasp and 13 is ASE with dp. |
| **model_devi_jobs["Split"]** | String |"T" | Parameter of CALYPSO input file, means that generating structures and optimizing structures are split into two parts, in dpgen workflow, Split must be T. |
| **model_devi_jobs["PSTRESS"]** | List of float |[0.001] | Same as PSTRESS in INCAR. |
| **model_devi_jobs["fmax"]** | List of float |[0.01] | The convergence criterion is that the force on all individual atoms should be less than *fmax*. |
| **model_devi_jobs["PSTRESS"]** | List of float or int |[0.001] | Same as PSTRESS in INCAR. |
| **model_devi_jobs["fmax"]** | float | 0.01 | The convergence criterion is that the force on all individual atoms should be less than *fmax*. |
| *in machine file*
| **model_devi["deepmdkit_python"]** | String | "/home/zhenyu/soft/deepmd-kit/bin/python" | A python path with deepmd package. |
| **model_devi["calypso_path"]** | string | "/home/zhenyu/workplace/debug" | The absolute path of calypso.x.|
Expand Down
185 changes: 91 additions & 94 deletions dpgen/generator/lib/calypso_check_outcar.py
Original file line number Diff line number Diff line change
@@ -1,107 +1,104 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import numpy as np
import os,sys,glob,time
from deepmd.calculator import DP
from ase.io import read
import numpy as np
import os,sys,glob,time
from deepmd.calculator import DP
from ase.io import read

'''
check if structure optimization worked well
if not, this script will generate a fake outcar
'''
def Get_Element_Num(elements):

def Get_Element_Num(elements):
'''Using the Atoms.symples to Know Element&Num'''
element = []
ele = {}
element.append(elements[0])
for x in elements:
if x not in element :
element.append(x)
for x in element:
ele[x] = elements.count(x)
return element, ele

def Write_Contcar(element, ele, lat, pos):
'''Write CONTCAR'''
f = open('CONTCAR','w')
f.write('ASE-DPKit-FAILED-nan\n')
f.write('1.0\n')
for i in range(3):
f.write('%15.10f %15.10f %15.10f\n' % tuple(lat[i]))
for x in element:
f.write(x + ' ')
f.write('\n')
for x in element:
f.write(str(ele[x]) + ' ')
f.write('\n')
f.write('Direct\n')
na = sum(ele.values())
dpos = np.dot(pos,np.linalg.inv(lat))
for i in range(na):
f.write('%15.10f %15.10f %15.10f\n' % tuple(dpos[i]))

def Write_Outcar(element, ele, volume, lat, pos, ene, force, stress,pstress):
'''Write OUTCAR'''
f = open('OUTCAR','w')
for x in element:
f.write('VRHFIN =' + str(x) + '\n')
f.write('ions per type =')
for x in element:
f.write('%5d' % ele[x])
#f.write('\nvolume of cell :\n')
element = []
ele = {}
element.append(elements[0])
for x in elements:
if x not in element :
element.append(x)
for x in element:
ele[x] = elements.count(x)
return element, ele

def Write_Contcar(element, ele, lat, pos):
'''Write CONTCAR'''
f = open('CONTCAR','w')
f.write('ASE-DPKit-FAILED-nan\n')
f.write('1.0\n')
for i in range(3):
f.write('%15.10f %15.10f %15.10f\n' % tuple(lat[i]))
for x in element:
f.write(x + ' ')
f.write('\n')
for x in element:
f.write(str(ele[x]) + ' ')
f.write('\n')
f.write('Direct\n')
na = sum(ele.values())
dpos = np.dot(pos,np.linalg.inv(lat))
for i in range(na):
f.write('%15.10f %15.10f %15.10f\n' % tuple(dpos[i]))

def Write_Outcar(element, ele, volume, lat, pos, ene, force, stress,pstress):
'''Write OUTCAR'''
f = open('OUTCAR','w')
for x in element:
f.write('VRHFIN =' + str(x) + '\n')
f.write('ions per type =')
for x in element:
f.write('%5d' % ele[x])
f.write('\nDirection XX YY ZZ XY YZ ZX\n')
f.write('in kB')
f.write('%15.6f' % stress[0])
f.write('%15.6f' % stress[1])
f.write('%15.6f' % stress[2])
f.write('%15.6f' % stress[3])
f.write('%15.6f' % stress[4])
f.write('%15.6f' % stress[5])
f.write('\n')
ext_pressure = np.sum(stress[0] + stress[1] + stress[2])/3.0 - pstress
f.write('in kB')
f.write('%15.6f' % stress[0])
f.write('%15.6f' % stress[1])
f.write('%15.6f' % stress[2])
f.write('%15.6f' % stress[3])
f.write('%15.6f' % stress[4])
f.write('%15.6f' % stress[5])
f.write('\n')
ext_pressure = np.sum(stress[0] + stress[1] + stress[2])/3.0 - pstress
f.write('external pressure = %20.6f kB Pullay stress = %20.6f kB\n'% (ext_pressure, pstress))
f.write('volume of cell : %20.6f\n' % volume)
f.write('direct lattice vectors\n')
for i in range(3):
f.write('%10.6f %10.6f %10.6f\n' % tuple(lat[i]))
f.write('POSITION TOTAL-FORCE(eV/Angst)\n')
f.write('-------------------------------------------------------------------\n')
na = sum(ele.values())
for i in range(na):
f.write('%15.6f %15.6f %15.6f' % tuple(pos[i]))
f.write('%15.6f %15.6f %15.6f\n' % tuple(force[i]))
f.write('-------------------------------------------------------------------\n')
f.write('energy without entropy= %20.6f %20.6f\n' % (ene, ene))
enthalpy = ene + pstress * volume / 1602.17733
f.write('enthalpy is TOTEN = %20.6f %20.6f\n' % (enthalpy, enthalpy))

def check():

from deepmd.calculator import DP
from ase.io import read
model_path = sys.argv[1]
Model_List = glob.glob('%s/graph*pb'%model_path)
calc = DP(model='%s'%(Model_List[0])) # init the model before iteration

to_be_opti = read('POSCAR')
to_be_opti.calc = calc
# ---------------------------------
# for failed outcar
atoms_symbols_f = to_be_opti.get_chemical_symbols()
element_f, ele_f = Get_Element_Num(atoms_symbols_f)
atoms_vol_f = to_be_opti.get_volume()
atoms_stress_f = to_be_opti.get_stress()
atoms_stress_f = atoms_stress_f/(0.01*0.6242)
atoms_lat_f = to_be_opti.cell
atoms_pos_f = to_be_opti.positions
atoms_force_f = to_be_opti.get_forces()
atoms_ene_f = 610612509
# ---------------------------------
Write_Contcar(element_f, ele_f, atoms_lat_f, atoms_pos_f)
f.write('volume of cell : %20.6f\n' % volume)
f.write('direct lattice vectors\n')
for i in range(3):
f.write('%10.6f %10.6f %10.6f\n' % tuple(lat[i]))
f.write('POSITION TOTAL-FORCE(eV/Angst)\n')
f.write('-------------------------------------------------------------------\n')
na = sum(ele.values())
for i in range(na):
f.write('%15.6f %15.6f %15.6f' % tuple(pos[i]))
f.write('%15.6f %15.6f %15.6f\n' % tuple(force[i]))
f.write('-------------------------------------------------------------------\n')
f.write('energy without entropy= %20.6f %20.6f\n' % (ene, ene))
enthalpy = ene + pstress * volume / 1602.17733
f.write('enthalpy is TOTEN = %20.6f %20.6f\n' % (enthalpy, enthalpy))

def check():

from deepmd.calculator import DP
from ase.io import read
calc = DP(model='../graph.000.pb') # init the model before iteration

to_be_opti = read('POSCAR')
to_be_opti.calc = calc
# ---------------------------------
# for failed outcar
atoms_symbols_f = to_be_opti.get_chemical_symbols()
element_f, ele_f = Get_Element_Num(atoms_symbols_f)
atoms_vol_f = to_be_opti.get_volume()
atoms_stress_f = to_be_opti.get_stress()
atoms_stress_f = atoms_stress_f/(0.01*0.6242)
atoms_lat_f = to_be_opti.cell
atoms_pos_f = to_be_opti.positions
atoms_force_f = to_be_opti.get_forces()
atoms_ene_f = 610612509
# ---------------------------------
Write_Contcar(element_f, ele_f, atoms_lat_f, atoms_pos_f)
Write_Outcar(element_f, ele_f, atoms_vol_f, atoms_lat_f, atoms_pos_f,atoms_ene_f, atoms_force_f, atoms_stress_f * -10.0, 0)

cwd = os.getcwd()
if not os.path.exists(os.path.join(cwd,'OUTCAR')):
check()
cwd = os.getcwd()
if not os.path.exists(os.path.join(cwd,'OUTCAR')):
check()
7 changes: 5 additions & 2 deletions dpgen/generator/lib/calypso_run_model_devi.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,12 @@ def Modd(all_models,type_map):
pdata.to_vasp_poscar(os.path.join(put_poscar,'%s.poscar'%str(index)))
nopbc = pdata.nopbc
coord = pdata.data['coords']
cell = pdata.data['cells']
cell = pdata.data['cells'] if not nopbc else None
atom_types = pdata.data['atom_types']
devi = calc_model_devi(coord,cell,atom_types,graphs,nopbc=nopbc)
try:
devi = calc_model_devi(coord,cell,atom_types,graphs,nopbc=nopbc)
except TypeError:
devi = calc_model_devi(coord,cell,atom_types,graphs)
# ------------------------------------------------------------------------------------
# append min-distance in devi list
dis = pdata.to_ase_structure()[0].get_all_distances(mic=True)
Expand Down
Loading

0 comments on commit 5c5718c

Please sign in to comment.