Skip to content

Commit

Permalink
Calypso (#663)
Browse files Browse the repository at this point in the history
* fix typo in github actions release to conda

* Get from_poscar_path only when from_poscar is true (#537)

Change-Id: I17774bee345634e4e72bd783e8112eefaaf9f0d3

Co-authored-by: Zhengju Sha <jenny@bytedance.com>

* feature: merge run.py

* fix:fix syntax bug

* fix summary ratio bug

* fix: fix bug of var(calypso_run_opt_path) not defined

* reorganize code v1

* add: add unittest

* add: add some explainations of dp+calypso in README.md

* change a little bit in readme.md

* change position of function

* add deepmd-kit>=2.0.1 install_require in setup.py

* test failed cause no tensorflow module so add tensorflow in setup.py

* calc model devi in command line

* fix some small bugs of modd and PBS script of cpu

* fix unittest

* delete parse_input.dat

* fix unittest

* first reorganization

* secord reorganization

* fix bugs

* fix: fix bugs in modd_calypso.py write_modd.py and run.py

* change functions name and fix bugs

* remove modd_calypso.py

* remove: remove modd_calypso.py

* remove some useless outputs

* restore dispatcher/PBS.py

* refactor: make some changes in calypso related code

- rename model_devi_calypso.py run_calypso.py
- rename calypso.py make_calypso.py
- add new file calypso_check_outcar.py calypso_run_opt.py
- add new file calypso_run_model_devi.py
- delete write_modd.py
- modify README.md and run.py

* refactor: move calypso main code(run.py) into run_calypso.py and modify test_calypso.py

* docs: modify README.md related to CALYPSO

* delete some useless comments in run.py

* add write_model_devi_out function into make_calypso.py for passing unittest

* fix a spelling mistake in calypso_run_opt.py (famx -> fmax)

* change runopt script's name from run_opt.py to calypso_run_opt.py and fix bug in runopt script

* fix unittest

Co-authored-by: Han Wang <amcadmus@gmail.com>
Co-authored-by: felix5572 <felix5572@github.com>
Co-authored-by: shazj99 <shazj99@gmail.com>
Co-authored-by: Zhengju Sha <jenny@bytedance.com>
Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
  • Loading branch information
6 people authored Apr 20, 2022
1 parent ff77dc6 commit 37df129
Show file tree
Hide file tree
Showing 12 changed files with 1,336 additions and 23 deletions.
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

0 comments on commit 37df129

Please sign in to comment.