Skip to content

Commit

Permalink
Merge pull request #161 from deepmodeling/devel
Browse files Browse the repository at this point in the history
merge devel in to master
  • Loading branch information
amcadmus authored Nov 4, 2019
2 parents 1af5f40 + 5289b98 commit 73c3c35
Show file tree
Hide file tree
Showing 172 changed files with 4,531 additions and 1,930 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,5 @@ dpgen.egg-info
*/__pycache__
*.swp
.eggs
.coverage
dbconfig.json
46 changes: 33 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,29 +75,42 @@ and if everything works, it gives
```
DeepModeling
------------
Version: 0.5.1.dev53+gddbeee7.d20191020
Date: Oct-07-2019
Path: /home/me/miniconda3/envs/py363/lib/python3.6/site-packages/dpgen-0.5.1.dev53+gddbeee7.d20191020-py3.6.egg/dpgen
Version: 0.2.0
Path: /home/wanghan/.local/lib/python3.6/site-packages/dpgen-0.1.0-py3.6.egg/dpgen
Date: Aug 13, 2019
usage: dpgen [-h] {init_surf,init_bulk,run,test,db} ...
Dependency
------------
numpy 1.17.2 /home/me/miniconda3/envs/py363/lib/python3.6/site-packages/numpy
dpdata 0.1.10 /home/me/miniconda3/envs/py363/lib/python3.6/site-packages/dpdata-0.1.10-py3.6.egg/dpdata
pymatgen 2019.7.2 /home/me/miniconda3/envs/py363/lib/python3.6/site-packages/pymatgen
monty 2.0.4 /home/me/miniconda3/envs/py363/lib/python3.6/site-packages/monty
ase 3.17.0 /home/me/miniconda3/envs/py363/lib/python3.6/site-packages/ase-3.17.0-py3.6.egg/ase
paramiko 2.6.0 /home/me/miniconda3/envs/py363/lib/python3.6/site-packages/paramiko
custodian 2019.2.10 /home/me/miniconda3/envs/py363/lib/python3.6/site-packages/custodian
Description
------------
usage: dpgen [-h] {init_surf,init_bulk,run,run/report,test,db} ...
dpgen is a convenient script that uses DeepGenerator to prepare initial data,
drive DeepMDkit and analyze results. This script works based on several sub-
commands with their own options. To see the options for the sub-commands, type
"dpgen sub-command -h".
positional arguments:
{init_surf,init_bulk,run,test,db}
{init_surf,init_bulk,run,run/report,test,db}
init_surf Generating initial data for surface systems.
init_bulk Generating initial data for bulk systems.
run Main process of Deep Generator.
run Main process of Deep Potential Generator.
run/report Report the systems and the thermodynamic conditions of
the labeled frames.
test Auto-test for Deep Potential.
db Collecting data from DP-GEN.
db Collecting data from Deep Generator.
optional arguments:
-h, --help show this help message and exit
```


Expand All @@ -108,8 +121,10 @@ optional arguments:
You may prepare initial data for bulk systems with VASP by:

```bash
dpgen init_bulk PARAM MACHINE
dpgen init_bulk PARAM [MACHINE]
```
The MACHINE configure file is optional. If this parameter exists, then the optimization
tasks or MD tasks will be submitted automatically according to MACHINE.json.

Basically `init_bulk` can be devided into four parts , denoted as `stages` in `PARAM`:
1. Relax in folder `00.place_ele`
Expand All @@ -119,6 +134,8 @@ Basically `init_bulk` can be devided into four parts , denoted as `stages` in `P

All stages must be **in order**. One doesn't need to run all stages. For example, you may run stage 1 and 2, generating supercells as starting point of exploration in `dpgen run`.

If MACHINE is None, there should be only one stage in stages. Corresponding tasks will be generated, but user's intervention should be involved in, to manunally run the scripts.

Following is an example for `PARAM`, which generates data from a typical structure hcp.
```json
{
Expand Down Expand Up @@ -176,8 +193,10 @@ The bold notation of key (such as **Elements**) means that it's a necessary key.
You may prepare initial data for surface systems with VASP by:

```bash
dpgen init_surf PARAM MACHINE
dpgen init_surf PARAM [MACHINE]
```
The MACHINE configure file is optional. If this parameter exists, then the optimization
tasks or MD tasks will be submitted automatically according to MACHINE.json.

Basically `init_surf` can be devided into two parts , denoted as `stages` in `PARAM`:
1. Build specific surface in folder `00.place_ele`
Expand All @@ -199,7 +218,7 @@ Following is an example for `PARAM`, which generates data from a typical structu
2,
2
],
"z_min": 9,
"layer_numb": 3,
"vacuum_max": 9,
"vacuum_resol": [
0.5,
Expand Down Expand Up @@ -251,7 +270,7 @@ The bold notation of key (such as **Elements**) means that it's a necessary key.
| **Elements** | List of String | ["Mg"] | Atom types
| **cell_type** | String | "hcp" | Specifying which typical structure to be generated. **Options** include fcc, hcp, bcc, sc, diamond.
| **latt** | Float | 4.479 | Lattice constant for single cell.
| **z_min** | Float | 9 | Thickness of slab (Angstrom).
| **layer_numb** | Integer | 3 | Number of equavilent layers of slab.
| **vacuum_max** | Float | 9 | Maximal thickness of vacuum (Angstrom).
| **vacuum_resol** | List of float | [0.5, 1 ] | Interval of thichness of vacuum. If size of `vacuum_resol` is 1, the interval is fixed to its value. If size of `vacuum_resol` is 2, the interval is `vacuum_resol[0]` before `mid_point`, otherwise `vacuum_resol[1]` after `mid_point`.
| **millers** | List of list of Integer | [[1,0,0]] | Miller indices.
Expand Down Expand Up @@ -431,6 +450,7 @@ The bold notation of key (such aas **type_map**) means that it's a necessary key
| *#Basics*
| **type_map** | List of string | ["H", "C"] | Atom types
| **mass_map** | List of float | [1, 12] | Standard atom weights.
| **use_ele_temp** | int | 0 | Currently only support fp_style vasp. 0(default): no electron temperature. 1: eletron temperature as frame parameter. 2: electron temperature as atom parameter.
| *#Data*
| init_data_prefix | String | "/sharedext4/.../data/" | Prefix of initial data directories
| ***init_data_sys*** | List of string|["CH4.POSCAR.01x01x01/.../deepmd"] |Directories of initial data. You may use either absolute or relative path here.
Expand Down
2 changes: 2 additions & 0 deletions dpgen/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
_date.py
_version.py
File renamed without changes.
3 changes: 2 additions & 1 deletion dpgen/auto_test/cmpt_00_equi.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def comput_lmp_nev(conf_dir, task_name, write_stable = False) :
return None, None, None

def comput_vasp_nev(jdata, conf_dir, write_stable = False) :
kspacing = jdata['vasp_params']['kspacing']

conf_path = re.sub('confs', global_equi_name, conf_dir)
conf_path = os.path.abspath(conf_path)
poscar = os.path.join(conf_path, 'POSCAR')
Expand All @@ -59,6 +59,7 @@ def comput_vasp_nev(jdata, conf_dir, write_stable = False) :
if 'relax_incar' in jdata.keys():
vasp_str='vasp-relax_incar'
else:
kspacing = jdata['vasp_params']['kspacing']
vasp_str='vasp-k%.2f' % kspacing

ener_shift = comput_e_shift(poscar, vasp_str)
Expand Down
44 changes: 30 additions & 14 deletions dpgen/auto_test/cmpt_01_eos.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,31 @@
#!/usr/bin/env python3

import os, glob, argparse, json, re
import dpgen.auto_test.lib.util as util
import dpgen.auto_test.lib.lammps as lammps
import dpgen.auto_test.lib.vasp as vasp

global_task_name = '01.eos'

def comput_lmp_eos(conf_dir, task_name) :
def comput_lmp_eos(jdata,conf_dir, task_name) :
conf_path = re.sub('confs', global_task_name, conf_dir)
conf_path = os.path.abspath(conf_path)
conf_path = os.path.join(conf_path, task_name)
vol_paths = glob.glob(os.path.join(conf_path, 'vol-*'))
vol_paths.sort()
result = os.path.join(conf_path,'result')
print('Vpa(A^3)\tEpA(eV)')
for ii in vol_paths :
log_lammps = os.path.join(ii, 'log.lammps')
natoms, epa, vpa = lammps.get_nev(log_lammps)
print(vpa, epa)
with open(result,'w') as fp:
fp.write('conf_dir:%s\n VpA(A^3) EpA(eV)\n'% (conf_dir))
for ii in vol_paths :
log_lammps = os.path.join(ii, 'log.lammps')
natoms, epa, vpa = lammps.get_nev(log_lammps)
print(vpa, epa)
fp.write('%7.3f %8.4f \n' % (vpa,epa))
fp.close()
if 'upload_username' in jdata.keys() and task_name =='deepmd':
upload_username=jdata['upload_username']
util.insert_data('eos','deepmd',upload_username,result)

def comput_vasp_eos(jdata, conf_dir) :
conf_path = re.sub('confs', global_task_name, conf_dir)
Expand All @@ -30,17 +39,25 @@ def comput_vasp_eos(jdata, conf_dir) :
task_path = os.path.join(conf_path, vasp_str)
vol_paths = glob.glob(os.path.join(task_path, 'vol-*'))
vol_paths.sort()
result = os.path.join(task_path,'result')
print('Vpa(A^3)\tEpA(eV)')
for ii in vol_paths :
outcar = os.path.join(ii, 'OUTCAR')
natoms, epa, vpa = vasp.get_nev(outcar)
print(vpa, epa)
with open(result,'w') as fp:
fp.write('conf_dir:%s\n VpA(A^3) EpA(eV)\n'% (conf_dir))
for ii in vol_paths :
outcar = os.path.join(ii, 'OUTCAR')
natoms, epa, vpa = vasp.get_nev(outcar)
print(vpa, epa)
fp.write('%7.3f %8.4f \n' % (vpa,epa))
fp.close()
if 'upload_username' in jdata.keys():
upload_username=jdata['upload_username']
util.insert_data('eos','vasp',upload_username,result)

def _main():
parser = argparse.ArgumentParser(
description="cmpt 01.eos")
parser.add_argument('TASK', type=str,
choices = ['vasp', 'deepmd', 'meam'],
choices = ['vasp', 'deepmd', 'meam'],
help='the task of generation, vasp or lammps')
parser.add_argument('PARAM', type=str,
help='json parameter file')
Expand All @@ -52,14 +69,13 @@ def _main():
jdata = json.load (fp)

if args.TASK == 'vasp':
comput_vasp_eos(jdata, args.CONF)
comput_vasp_eos(jdata, args.CONF)
elif args.TASK == 'deepmd' :
comput_lmp_eos(args.CONF, args.TASK)
comput_lmp_eos(jdata,args.CONF, args.TASK)
elif args.TASK == 'meam' :
comput_lmp_eos(args.CONF, args.TASK)
comput_lmp_eos(jdata,args.CONF, args.TASK)
else :
raise RuntimeError("unknow task ", args.TASK)

if __name__ == '__main__' :
_main()

56 changes: 40 additions & 16 deletions dpgen/auto_test/cmpt_02_elastic.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,33 @@
import numpy as np
import dpgen.auto_test.lib.vasp as vasp
import dpgen.auto_test.lib.lammps as lammps
import dpgen.auto_test.lib.util as util
from pymatgen.analysis.elasticity.elastic import ElasticTensor
from pymatgen.analysis.elasticity.strain import Strain
from pymatgen.analysis.elasticity.stress import Stress

global_equi_name = '00.equi'
global_task_name = '02.elastic'

def print_et (et):
def result_et(et,conf_dir,result):
with open(result,'w') as fp:
fp.write('conf_dir:%s\n'% (conf_dir))
for ii in range(6) :
for jj in range(6) :
fp.write ("%7.2f " % (et.voigt[ii][jj] / 1e4))
fp.write('\n')
BV = et.k_voigt / 1e4
GV = et.g_voigt / 1e4
EV = 9*BV*GV/(3*BV+GV)
uV = 0.5*(3*BV-2*GV)/(3*BV+GV)
fp.write("# Bulk Modulus BV = %.2f GPa\n" % (BV))
fp.write("# Shear Modulus GV = %.2f GPa\n" % (GV))
fp.write("# Youngs Modulus EV = %.2f GPa\n" % (EV))
fp.write("# Poission Ratio uV = %.2f \n" % (uV))
fp.close()


def print_et (et):
for ii in range(6) :
for jj in range(6) :
sys.stdout.write ("%7.2f " % (et.voigt[ii][jj] / 1e4))
Expand All @@ -27,17 +46,15 @@ def print_et (et):
print("# Poission Ratio uV = %.2f " % (uV))

def cmpt_vasp(jdata, conf_dir) :
fp_params = jdata['vasp_params']
kspacing = fp_params['kspacing']
kgamma = fp_params['kgamma']

conf_path = os.path.abspath(conf_dir)
conf_poscar = os.path.join(conf_path, 'POSCAR')
task_path = re.sub('confs', global_task_name, conf_path)
if 'relax_incar' in jdata.keys():
vasp_str='vasp-relax_incar'
else:
vasp_str='vasp-k%.2f' % kspacing
fp_params = jdata['vasp_params']
kspacing = fp_params['kspacing']
vasp_str='vasp-k%.2f' % kspacing
task_path = os.path.join(task_path, vasp_str)

equi_stress = Stress(np.loadtxt(os.path.join(task_path, 'equi.stress.out')))
Expand All @@ -55,14 +72,16 @@ def cmpt_vasp(jdata, conf_dir) :
et = ElasticTensor.from_independent_strains(lst_strain, lst_stress, eq_stress = equi_stress, vasp = False)
# et = ElasticTensor.from_independent_strains(lst_strain, lst_stress, eq_stress = None)
# bar to GPa
# et = -et / 1e4
# et = -et / 1e4
print_et(et)
result = os.path.join(task_path,'result')
result_et(et,conf_dir,result)
if 'upload_username' in jdata.keys():
upload_username=jdata['upload_username']
util.insert_data('elastic','vasp',upload_username,result)

def cmpt_deepmd_lammps(jdata, conf_dir, task_name) :
deepmd_model_dir = jdata['deepmd_model_dir']
deepmd_type_map = jdata['deepmd_type_map']
ntypes = len(deepmd_type_map)

def cmpt_deepmd_lammps(jdata, conf_dir, task_name) :
conf_path = os.path.abspath(conf_dir)
conf_poscar = os.path.join(conf_path, 'POSCAR')
task_path = re.sub('confs', global_task_name, conf_path)
Expand All @@ -82,8 +101,15 @@ def cmpt_deepmd_lammps(jdata, conf_dir, task_name) :
et = ElasticTensor.from_independent_strains(lst_strain, lst_stress, eq_stress = equi_stress, vasp = False)
# et = ElasticTensor.from_independent_strains(lst_strain, lst_stress, eq_stress = None)
# bar to GPa
# et = -et / 1e4
# et = -et / 1e4
print_et(et)
result = os.path.join(task_path,'result')
result_et(et,conf_dir,task_path)
if 'upload_username' in jdata.keys() and task_name=='deepmd':
upload_username=jdata['upload_username']
util.insert_data('elastic','deepmd',upload_username,result)



def _main() :
parser = argparse.ArgumentParser(
Expand All @@ -101,15 +127,13 @@ def _main() :

print('# generate %s task with conf %s' % (args.TASK, args.CONF))
if args.TASK == 'vasp':
cmpt_vasp(jdata, args.CONF)
cmpt_vasp(jdata, args.CONF)
elif args.TASK == 'deepmd' :
cmpt_deepmd_lammps(jdata, args.CONF, args.TASK)
elif args.TASK == 'meam' :
cmpt_deepmd_lammps(jdata, args.CONF, args.TASK)
else :
raise RuntimeError("unknow task ", args.TASK)

if __name__ == '__main__' :
_main()


2 changes: 0 additions & 2 deletions dpgen/auto_test/cmpt_03_vacancy.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ def comput_e_shift(poscar, task_name) :
return ener_shift

def cmpt_vasp(jdata, conf_dir, supercell) :
fp_params = jdata['vasp_params']
kspacing = fp_params['kspacing']

if 'relax_incar' in jdata.keys():
vasp_str='vasp-relax_incar'
Expand Down
6 changes: 1 addition & 5 deletions dpgen/auto_test/cmpt_04_interstitial.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ def cmpt_vasp(jdata, conf_dir, supercell, insert_ele) :
_cmpt_vasp(jdata, conf_dir, supercell, ii)

def _cmpt_vasp(jdata, conf_dir, supercell, insert_ele) :
fp_params = jdata['vasp_params']
kspacing = fp_params['kspacing']

if 'relax_incar' in jdata.keys():
vasp_str='vasp-relax_incar'
Expand Down Expand Up @@ -56,12 +54,10 @@ def cmpt_deepmd_reprod_traj(jdata, conf_dir, supercell, insert_ele, task_name) :
_cmpt_deepmd_reprod_traj(jdata, conf_dir, supercell, ii, task_name)

def _cmpt_deepmd_reprod_traj(jdata, conf_dir, supercell, insert_ele, task_name) :
fp_params = jdata['vasp_params']
kspacing = fp_params['kspacing']

if 'relax_incar' in jdata.keys():
vasp_str='vasp-relax_incar'
else:
kspacing = jdata['vasp_params']['kspacing']
vasp_str='vasp-k%.2f' % kspacing

conf_path = os.path.abspath(conf_dir)
Expand Down
Loading

0 comments on commit 73c3c35

Please sign in to comment.