Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Calypso #663

Merged
merged 41 commits into from
Apr 20, 2022
Merged
Show file tree
Hide file tree
Changes from 36 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
e9d5952
Merge pull request #523 from deepmodeling/devel
amcadmus Aug 27, 2021
fb30edf
fix typo in github actions release to conda
Aug 27, 2021
9dbac8d
Merge pull request #524 from felix5572/master
amcadmus Aug 28, 2021
02037ad
Get from_poscar_path only when from_poscar is true (#537)
shazj99 Sep 8, 2021
eb6449c
Merge branch 'master' into devel
Dec 10, 2021
93b833a
Merge pull request #613 from amcadmus/master
amcadmus Dec 10, 2021
12971b9
feature: merge run.py
wangzyphysics Feb 21, 2022
3b26eb9
fix:fix syntax bug
wangzyphysics Feb 22, 2022
729d8bd
fix summary ratio bug
wangzyphysics Feb 22, 2022
e08b479
fix: fix bug of var(calypso_run_opt_path) not defined
wangzyphysics Feb 24, 2022
3d227a9
Merge branch 'deepmodeling:master' into calypso
wangzyphysics Mar 1, 2022
7d30fc1
reorganize code v1
wangzyphysics Mar 3, 2022
7c68fe9
add: add unittest
wangzyphysics Mar 3, 2022
86b9cf2
Merge branch 'calypso' of github.com:wangzyphysics/dpgen into calypso
wangzyphysics Mar 4, 2022
420df0d
add: add some explainations of dp+calypso in README.md
wangzyphysics Mar 4, 2022
3277c26
change a little bit in readme.md
wangzyphysics Mar 4, 2022
09be223
change position of function
wangzyphysics Mar 4, 2022
224b62d
add deepmd-kit>=2.0.1 install_require in setup.py
wangzyphysics Mar 4, 2022
8af2b2a
test failed cause no tensorflow module so add tensorflow in setup.py
wangzyphysics Mar 4, 2022
239765a
calc model devi in command line
wangzyphysics Mar 9, 2022
0bf1473
fix some small bugs of modd and PBS script of cpu
wangzyphysics Mar 9, 2022
7b0db3f
fix unittest
wangzyphysics Mar 9, 2022
15d130a
delete parse_input.dat
wangzyphysics Mar 9, 2022
d1e73c9
fix unittest
wangzyphysics Mar 10, 2022
361546e
first reorganization
wangzyphysics Mar 13, 2022
a8ca7f8
secord reorganization
wangzyphysics Mar 13, 2022
2ac1efe
fix bugs
wangzyphysics Mar 15, 2022
f1ae450
fix: fix bugs in modd_calypso.py write_modd.py and run.py
wangzyphysics Mar 19, 2022
a6048fb
change functions name and fix bugs
wangzyphysics Mar 22, 2022
d651e36
remove modd_calypso.py
wangzyphysics Mar 22, 2022
1c1b670
remove: remove modd_calypso.py
wangzyphysics Mar 22, 2022
68cd1c9
remove some useless outputs
wangzyphysics Mar 22, 2022
ff23f23
restore dispatcher/PBS.py
wangzyphysics Mar 22, 2022
3796cd4
refactor: make some changes in calypso related code
wangzyphysics Mar 23, 2022
496fa07
refactor: move calypso main code(run.py) into run_calypso.py and modi…
wangzyphysics Mar 23, 2022
36dd23a
docs: modify README.md related to CALYPSO
wangzyphysics Mar 23, 2022
0e9669e
delete some useless comments in run.py
wangzyphysics Mar 24, 2022
961f63f
add write_model_devi_out function into make_calypso.py for passing un…
wangzyphysics Mar 24, 2022
df2bf1c
fix a spelling mistake in calypso_run_opt.py (famx -> fmax)
wangzyphysics Mar 26, 2022
43ef866
change runopt script's name from run_opt.py to calypso_run_opt.py and…
wangzyphysics Mar 26, 2022
33271e9
fix unittest
wangzyphysics Mar 31, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,4 @@ dbconfig.json
.vscode/*
.idea/*
_build
tests/generator/calypso_test_path
33 changes: 31 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ In each iteration, there are three stages of work, namely, `00.train 01.model_d

+ 00.train: DP-GEN will train several (default 4) models based on initial and generated data. The only difference between these models is the random seed for neural network initialization.

+ 01.model_devi : represent for model-deviation. DP-GEN will use models obtained from 00.train to run Molecular Dynamics(default LAMMPS). Larger deviation for structure properties (default is force of atoms) means less accuracy of the models. Using this criterion, a few fructures will be selected and put into next stage `02.fp` for more accurate calculation based on First Principles.
+ 01.model_devi : represent for model-deviation. Model-deviation engine in `01.model_devi` can be chosen between Molecular Dynamics(LAMMPS and GROMACS) or Structures Prediction(CALYPSO). DP-GEN will use models obtained from 00.train to run Molecular Dynamics or to run structure optimization with ASE in CALYPSO. Larger deviation for structure properties (default is force of atoms) means less accuracy of the models. Using this criterion, a few structures will be selected and put into next stage `02.fp` for more accurate calculation based on First Principles.

+ 02.fp : Selected structures will be calculated by first principles methods(default VASP). DP-GEN will obtain some new data and put them together with initial data and data generated in previous iterations. After that a new training will be set up and DP-GEN will enter next iteration!

Expand Down Expand Up @@ -615,6 +615,35 @@ The bold notation of key (such aas **type_map**) means that it's a necessary key
| **user_fp_params** | Dict | |Parameters for cp2k calculation. find detail in manual.cp2k.org. only the kind section must be set before use. we assume that you have basic knowledge for cp2k input.
| **external_input_path** | String | | Conflict with key:user_fp_params, use the template input provided by user, some rules should be followed, read the following text in detail.

One can choose the model-deviation engine by specifying the key `model_devi_engine`. If `model_devi_engine` is not specified, the default model-deviation engine will be LAMMPS.

There are some new keys needed to be added into `param` and `machine` if CALYPSO as model-deviation engine.

The bold notation of key (such as **calypso_path**) means that it's a necessary key.

Key | Type | Example | Discription |
| :---------------- | :--------------------- | :-------------------------------------- | :-------------------------------------------------------------|
| *in param file*
| **model_devi_engine** | string | "calypso" | CALYPSO as model-deviation engine.|
| **calypso_input_path** | string | "/home/zhenyu/workplace/debug" | The absolute path of CALYPSO input file named input.dat(PSTRESS and fmax should be included), when this keys exists, all the iters will use the same CALYPSO input file until reach the number of max iter specified by **model_devi_max_iter** and **model_devi_jobs** key will not work.|
| **model_devi_max_iter** | int | 10 | The max iter number code can run, it works when **calypso_input_path** exists.|
| **model_devi_jobs** | List of Dict | [{ "times":[3],"NameOfAtoms":["Al","Cu"],"NumberOfAtoms":[1,10],"NumberOfFormula":[1,2],"Volume":[300],"DistanceOfIon":[[ 1.48,1.44],[ 1.44,1.41]],"PsoRatio":[0.6],"PopSize":[5],"MaxStep":[3],"ICode":[1],"Split":"T"},...] | Settings for exploration in `01.model_devi`. Different number in `times` List means different iteration index and iterations mentioned in List wil use same CALYPSO parameters.|
| **model_devi_jobs["times"]** | List of int | [0,1,2] | Different number in `times` List means different iteration index and iterations mentioned in List wil use same CALYPSO parameters.|
| **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["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["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*. |
| *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.|

#### Rules for cp2k input at dictionary form
Converting cp2k input is very simple as dictionary used to dpgen input. You just need follow some simple rule:
Expand Down Expand Up @@ -1352,7 +1381,7 @@ mem_limit | Interger | 16 | Maximal memory permitted to apply for the job.
| group_size | Integer | 5 | DP-GEN will put these jobs together in one submitting script.
| user_forward_files | List of str | ["/path_to/vdw_kernel.bindat"] | These files will be uploaded in each calculation task. You should make sure provide the path exists.
| user_backward_files | List of str | ["HILLS"] | Besides DP-GEN's normal output, these files will be downloaded after each calculation. You should make sure these files can be generated.

## Troubleshooting
1. The most common problem is whether two settings correspond with each other, including:
- The order of elements in `type_map` and `mass_map` and **`fp_pp_files`**.
Expand Down
107 changes: 107 additions & 0 deletions dpgen/generator/lib/calypso_check_outcar.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
#!/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

'''
check if structure optimization worked well
if not, this script will generate a fake outcar
'''

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')
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('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)
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()
Loading