Skip to content

Commit c1f0f66

Browse files
AnguseZhangamcadmusnjzjzpkudock
authored
Add gromacs in model deviation (#427)
* Add Cu's init_surf examples. * Delete personal information * Update examples/init/cu.surf.hcp.111.json Co-authored-by: Jinzhe Zeng <jinzhe.zeng@rutgers.edu> * Add gromacs as model_devi engine * Add gromacs in model_devi * Add gromacs in model_devi * Add gromacs in model_devi * Add gromacs in model_devi * Add gromacs in model_devi * Add gromacs in model_devi * Add gromacs in model_devi * Add gromacs in model_devi * Add gromacs in model_devi * Add gromacs in model_devi * Add gromacs in model_devi * wyz: fix sort of atoms in gaussian input for gromacs model_devi_engine * wyz: add modifying trj_freq for model_devi_gromacs enegine * Add gromacs in model_devi * wyz: add model_devi_dt in gmx enengine * add unittest for gmx engine * wyz: delete extra vacant lines * Delete copy files * Add GromacsWrapper Dependency * Fix unittest in Gromacs model_devi * Fix unittest of DP-GEN + gromacs * Fix unittest in gromacs model_devi * Fix unittest in gromacs model_devi * Add dpgen-gromacs-gaussian example * Add model_devi script * Delete model_devi scripts. This hass been in tests * Fix unittest in model_devi * Fix unittest in Gromacs model_devi Co-authored-by: Han Wang <amcadmus@gmail.com> Co-authored-by: Jinzhe Zeng <jinzhe.zeng@rutgers.edu> Co-authored-by: zjgemi <zjgemi@gmail.com>
1 parent 85a5f35 commit c1f0f66

File tree

19 files changed

+4417
-42
lines changed

19 files changed

+4417
-42
lines changed

dpgen/generator/run.py

Lines changed: 179 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
init: data
55
iter:
66
00.train
7-
01.mode_devi
7+
01.model_devi
88
02.vasp
99
03.data
1010
"""
@@ -62,6 +62,11 @@
6262
from dpgen import ROOT_PATH
6363
from pymatgen.io.vasp import Incar,Kpoints,Potcar
6464
from dpgen.auto_test.lib.vasp import make_kspacing_kpoints
65+
try:
66+
from gromacs.fileformats.mdp import MDP
67+
except ImportError:
68+
dlog.info("GromacsWrapper>=0.8.0 is needed for DP-GEN + Gromacs.")
69+
pass
6570

6671
template_name = 'template'
6772
train_name = '00.train'
@@ -176,10 +181,14 @@ def poscar_to_conf(poscar, conf):
176181
sys.to_lammps_lmp(conf)
177182

178183

179-
def dump_to_poscar(dump, poscar, type_map) :
180-
sys = dpdata.System(dump, fmt = 'lammps/dump', type_map = type_map)
184+
def dump_to_poscar(dump, poscar, type_map, fmt = "lammps/dump") :
185+
sys = dpdata.System(dump, fmt = fmt, type_map = type_map)
181186
sys.to_vasp_poscar(poscar)
182187

188+
def dump_to_deepmd_raw(dump, deepmd_raw, type_map, fmt='gromacs/gro'):
189+
system = dpdata.System(dump, fmt = fmt, type_map = type_map)
190+
system.to_deepmd_raw(deepmd_raw)
191+
183192

184193
def make_train (iter_index,
185194
jdata,
@@ -684,6 +693,9 @@ def revise_by_keys(lmp_lines, keys, values):
684693
def make_model_devi (iter_index,
685694
jdata,
686695
mdata) :
696+
# The MD engine to perform model deviation
697+
# Default is lammps
698+
model_devi_engine = jdata.get('model_devi_engine', "lammps")
687699
model_devi_jobs = jdata['model_devi_jobs']
688700
if (iter_index >= len(model_devi_jobs)) :
689701
return False
@@ -729,24 +741,27 @@ def make_model_devi (iter_index,
729741
for ss in conf_systems:
730742
conf_counter = 0
731743
for cc in ss :
732-
conf_name = make_model_devi_conf_name(sys_idx[sys_counter], conf_counter)
733-
orig_poscar_name = conf_name + '.orig.poscar'
734-
poscar_name = conf_name + '.poscar'
735-
lmp_name = conf_name + '.lmp'
736-
if shuffle_poscar :
737-
os.symlink(cc, os.path.join(conf_path, orig_poscar_name))
738-
poscar_shuffle(os.path.join(conf_path, orig_poscar_name),
739-
os.path.join(conf_path, poscar_name))
740-
else :
741-
os.symlink(cc, os.path.join(conf_path, poscar_name))
742-
if 'sys_format' in jdata:
743-
fmt = jdata['sys_format']
744-
else:
745-
fmt = 'vasp/poscar'
746-
system = dpdata.System(os.path.join(conf_path, poscar_name), fmt = fmt, type_map = jdata['type_map'])
747-
if jdata.get('model_devi_nopbc', False):
748-
system.remove_pbc()
749-
system.to_lammps_lmp(os.path.join(conf_path, lmp_name))
744+
if model_devi_engine == "lammps":
745+
conf_name = make_model_devi_conf_name(sys_idx[sys_counter], conf_counter)
746+
orig_poscar_name = conf_name + '.orig.poscar'
747+
poscar_name = conf_name + '.poscar'
748+
lmp_name = conf_name + '.lmp'
749+
if shuffle_poscar :
750+
os.symlink(cc, os.path.join(conf_path, orig_poscar_name))
751+
poscar_shuffle(os.path.join(conf_path, orig_poscar_name),
752+
os.path.join(conf_path, poscar_name))
753+
else :
754+
os.symlink(cc, os.path.join(conf_path, poscar_name))
755+
if 'sys_format' in jdata:
756+
fmt = jdata['sys_format']
757+
else:
758+
fmt = 'vasp/poscar'
759+
system = dpdata.System(os.path.join(conf_path, poscar_name), fmt = fmt, type_map = jdata['type_map'])
760+
if jdata.get('model_devi_nopbc', False):
761+
system.remove_pbc()
762+
system.to_lammps_lmp(os.path.join(conf_path, lmp_name))
763+
elif model_devi_engine == "gromacs":
764+
pass
750765
conf_counter += 1
751766
sys_counter += 1
752767

@@ -756,7 +771,12 @@ def make_model_devi (iter_index,
756771
use_plm = jdata.get('model_devi_plumed', False)
757772
use_plm_path = jdata.get('model_devi_plumed_path', False)
758773
if input_mode == "native":
759-
_make_model_devi_native(iter_index, jdata, mdata, conf_systems)
774+
if model_devi_engine == "lammps":
775+
_make_model_devi_native(iter_index, jdata, mdata, conf_systems)
776+
elif model_devi_engine == "gromacs":
777+
_make_model_devi_native_gromacs(iter_index, jdata, mdata, conf_systems)
778+
else:
779+
raise RuntimeError("unknown model_devi engine", model_devi_engine)
760780
elif input_mode == "revise_template":
761781
_make_model_devi_revmat(iter_index, jdata, mdata, conf_systems)
762782
else:
@@ -997,12 +1017,98 @@ def _make_model_devi_native(iter_index, jdata, mdata, conf_systems):
9971017
conf_counter += 1
9981018
sys_counter += 1
9991019

1020+
def _make_model_devi_native_gromacs(iter_index, jdata, mdata, conf_systems):
1021+
model_devi_jobs = jdata['model_devi_jobs']
1022+
if (iter_index >= len(model_devi_jobs)) :
1023+
return False
1024+
cur_job = model_devi_jobs[iter_index]
1025+
dt = cur_job.get("dt", None)
1026+
if dt is not None:
1027+
model_devi_dt = dt
1028+
else:
1029+
model_devi_dt = jdata['model_devi_dt']
1030+
nsteps = cur_job.get("nsteps", None)
1031+
if nsteps is None:
1032+
raise RuntimeError("nsteps is None, you should set nsteps in model_devi_jobs!")
1033+
# Currently Gromacs engine is not supported for different temperatures!
1034+
# If you want to change temperatures, you should change it in mdp files.
1035+
1036+
sys_idx = expand_idx(cur_job['sys_idx'])
1037+
if (len(sys_idx) != len(list(set(sys_idx)))) :
1038+
raise RuntimeError("system index should be uniq")
1039+
1040+
mass_map = jdata['mass_map']
1041+
1042+
iter_name = make_iter_name(iter_index)
1043+
train_path = os.path.join(iter_name, train_name)
1044+
train_path = os.path.abspath(train_path)
1045+
models = glob.glob(os.path.join(train_path, "graph*pb"))
1046+
task_model_list = []
1047+
for ii in models:
1048+
task_model_list.append(os.path.join('..', os.path.basename(ii)))
1049+
work_path = os.path.join(iter_name, model_devi_name)
1050+
1051+
sys_counter = 0
1052+
for ss in conf_systems:
1053+
conf_counter = 0
1054+
task_counter = 0
1055+
for cc in ss :
1056+
task_name = make_model_devi_task_name(sys_idx[sys_counter], task_counter)
1057+
#conf_name = make_model_devi_conf_name(sys_idx[sys_counter], conf_counter) + '.lmp'
1058+
task_path = os.path.join(work_path, task_name)
1059+
# dlog.info(task_path)
1060+
create_path(task_path)
1061+
#create_path(os.path.join(task_path, 'traj'))
1062+
#loc_conf_name = 'conf.lmp'
1063+
gromacs_settings = jdata.get("gromacs_settings" , "")
1064+
for key,file in gromacs_settings.items():
1065+
if key != "traj_filename" and key != "mdp_filename":
1066+
os.symlink(os.path.join(cc,file), os.path.join(task_path, file))
1067+
1068+
# input.json for DP-Gromacs
1069+
with open(os.path.join(cc, "input.json")) as f:
1070+
input_json = json.load(f)
1071+
input_json["graph_file"] = models[0]
1072+
with open(os.path.join(task_path,'input.json'), 'w') as _outfile:
1073+
json.dump(input_json, _outfile, indent = 4)
1074+
1075+
# trj_freq
1076+
trj_freq = cur_job.get("trj_freq", 10)
1077+
mdp = MDP()
1078+
mdp.read(os.path.join(cc, gromacs_settings['mdp_filename']))
1079+
mdp['nstcomm'] = trj_freq
1080+
mdp['nstxout'] = trj_freq
1081+
mdp['nstlog'] = trj_freq
1082+
mdp['nstenergy'] = trj_freq
1083+
# dt
1084+
mdp['dt'] = dt
1085+
mdp.write(os.path.join(task_path, gromacs_settings['mdp_filename']))
1086+
1087+
cwd_ = os.getcwd()
1088+
os.chdir(task_path)
1089+
job = {}
1090+
1091+
job["model_devi_dt"] = model_devi_dt
1092+
job["nsteps"] = nsteps
1093+
with open('job.json', 'w') as _outfile:
1094+
json.dump(job, _outfile, indent = 4)
1095+
os.chdir(cwd_)
1096+
1097+
task_counter += 1
1098+
conf_counter += 1
1099+
sys_counter += 1
1100+
1101+
10001102

10011103
def run_model_devi (iter_index,
10021104
jdata,
10031105
mdata) :
10041106
#rmdlog.info("This module has been run !")
10051107
lmp_exec = mdata['lmp_command']
1108+
# Angus: lmp_exec name should be changed to model_devi_exec.
1109+
# We should also change make_dispatcher
1110+
# For now, I will use this name for gromacs command
1111+
10061112
model_devi_group_size = mdata['model_devi_group_size']
10071113
model_devi_resources = mdata['model_devi_resources']
10081114
use_plm = jdata.get('model_devi_plumed', False)
@@ -1014,10 +1120,6 @@ def run_model_devi (iter_index,
10141120

10151121
all_task = glob.glob(os.path.join(work_path, "task.*"))
10161122
all_task.sort()
1017-
command = "{ if [ ! -f dpgen.restart.10000 ]; then %s -i input.lammps -v restart 0; else %s -i input.lammps -v restart 1; fi }" % (lmp_exec, lmp_exec)
1018-
command = "/bin/sh -c '%s'" % command
1019-
commands = [command]
1020-
10211123
fp = open (os.path.join(work_path, 'cur_job.json'), 'r')
10221124
cur_job = json.load (fp)
10231125

@@ -1036,14 +1138,37 @@ def run_model_devi (iter_index,
10361138
#dlog.info("run_tasks in run_model_deviation",run_tasks_)
10371139
all_models = glob.glob(os.path.join(work_path, 'graph*pb'))
10381140
model_names = [os.path.basename(ii) for ii in all_models]
1039-
forward_files = ['conf.lmp', 'input.lammps', 'traj']
1040-
backward_files = ['model_devi.out', 'model_devi.log', 'traj']
1041-
if use_plm:
1042-
forward_files += ['input.plumed']
1043-
# backward_files += ['output.plumed']
1044-
backward_files += ['output.plumed','COLVAR','dump.0.xyz']
1045-
if use_plm_path:
1046-
forward_files += ['plmpath.pdb']
1141+
1142+
model_devi_engine = jdata.get("model_devi_engine", "lammps")
1143+
if model_devi_engine == "lammps":
1144+
command = "{ if [ ! -f dpgen.restart.10000 ]; then %s -i input.lammps -v restart 0; else %s -i input.lammps -v restart 1; fi }" % (lmp_exec, lmp_exec)
1145+
command = "/bin/sh -c '%s'" % command
1146+
commands = [command]
1147+
forward_files = ['conf.lmp', 'input.lammps', 'traj']
1148+
backward_files = ['model_devi.out', 'model_devi.log', 'traj']
1149+
if use_plm:
1150+
forward_files += ['input.plumed']
1151+
# backward_files += ['output.plumed']
1152+
backward_files += ['output.plumed','COLVAR','dump.0.xyz']
1153+
if use_plm_path:
1154+
forward_files += ['plmpath.pdb']
1155+
elif model_devi_engine == "gromacs":
1156+
gromacs_settings = jdata.get("gromacs_settings", {})
1157+
mdp_filename = gromacs_settings.get("mdp_filename", "md.mdp")
1158+
topol_filename = gromacs_settings.get("topol_filename", "processed.top")
1159+
conf_filename = gromacs_settings.get("conf_filename", "conf.gro")
1160+
index_filename = gromacs_settings.get("index_filename", "index.raw")
1161+
deffnm = gromacs_settings.get("deffnm", "deepmd")
1162+
maxwarn = gromacs_settings.get("maxwarn", 1)
1163+
nsteps = cur_job["nsteps"]
1164+
1165+
command = "%s grompp -f %s -p %s -c %s -o %s -maxwarn %d" % (lmp_exec, mdp_filename, topol_filename, conf_filename, deffnm, maxwarn)
1166+
command += "&& %s mdrun -deffnm %s -nsteps %d" %(lmp_exec, deffnm, nsteps)
1167+
commands = [command]
1168+
1169+
forward_files = [mdp_filename, topol_filename, conf_filename, index_filename, "input.json" ]
1170+
backward_files = ["%s.tpr" % deffnm, "%s.log" %deffnm , 'model_devi.out', 'model_devi.log']
1171+
10471172

10481173
cwd = os.getcwd()
10491174
dispatcher = make_dispatcher(mdata['model_devi_machine'], mdata['model_devi_resources'], work_path, run_tasks, model_devi_group_size)
@@ -1240,14 +1365,20 @@ def _make_fp_vasp_inner (modd_path,
12401365
numb_task = 0
12411366
dlog.info("system {0:s} accurate_ratio: {1:8.4f} thresholds: {2:6.4f} and {3:6.4f} eff. task min and max {4:4d} {5:4d} number of fp tasks: {6:6d}".format(ss, accurate_ratio, fp_accurate_soft_threshold, fp_accurate_threshold, fp_task_min, this_fp_task_max, numb_task))
12421367
# make fp tasks
1368+
model_devi_engine = jdata.get("model_devi_engine", "lammps")
12431369
count_bad_box = 0
12441370
count_bad_cluster = 0
12451371
for cc in range(numb_task) :
12461372
tt = fp_candidate[cc][0]
12471373
ii = fp_candidate[cc][1]
12481374
ss = os.path.basename(tt).split('.')[1]
12491375
conf_name = os.path.join(tt, "traj")
1250-
conf_name = os.path.join(conf_name, str(ii) + '.lammpstrj')
1376+
if model_devi_engine == "lammps":
1377+
conf_name = os.path.join(conf_name, str(ii) + '.lammpstrj')
1378+
elif model_devi_engine == "gromacs":
1379+
conf_name = os.path.join(conf_name, str(ii) + '.gromacstrj')
1380+
else:
1381+
raise RuntimeError("unknown model_devi engine", model_devi_engine)
12511382
conf_name = os.path.abspath(conf_name)
12521383
if skip_bad_box is not None:
12531384
skip = check_bad_box(conf_name, skip_bad_box)
@@ -1295,7 +1426,13 @@ def _make_fp_vasp_inner (modd_path,
12951426
cwd = os.getcwd()
12961427
for ii in fp_tasks:
12971428
os.chdir(ii)
1298-
dump_to_poscar('conf.dump', 'POSCAR', type_map)
1429+
if model_devi_engine == "lammps":
1430+
dump_to_poscar('conf.dump', 'POSCAR', type_map, fmt = "lammps/dump")
1431+
elif model_devi_engine == "gromacs":
1432+
# dump_to_poscar('conf.dump', 'POSCAR', type_map, fmt = "gromacs/gro")
1433+
dump_to_deepmd_raw('conf.dump', 'deepmd.raw', type_map, fmt = 'gromacs/gro')
1434+
else:
1435+
raise RuntimeError("unknown model_devi engine", model_devi_engine)
12991436
os.chdir(cwd)
13001437
return fp_tasks
13011438

@@ -1676,9 +1813,14 @@ def make_fp_gaussian(iter_index,
16761813
else:
16771814
fp_params = jdata['fp_params']
16781815
cwd = os.getcwd()
1816+
1817+
model_devi_engine = jdata.get('model_devi_engine', 'lammps')
16791818
for ii in fp_tasks:
16801819
os.chdir(ii)
1681-
sys_data = dpdata.System('POSCAR').data
1820+
if model_devi_engine == "lammps":
1821+
sys_data = dpdata.System('POSCAR').data
1822+
elif model_devi_engine == "gromacs":
1823+
sys_data = dpdata.System("deepmd.raw", fmt='deepmd/raw').data
16821824
ret = make_gaussian_input(sys_data, fp_params)
16831825
with open('input', 'w') as fp:
16841826
fp.write(ret)
@@ -2285,10 +2427,6 @@ def set_version(mdata):
22852427
mdata['deepmd_version'] = deepmd_version
22862428
return mdata
22872429

2288-
2289-
2290-
2291-
22922430
def run_iter (param_file, machine_file) :
22932431
try:
22942432
import ruamel

0 commit comments

Comments
 (0)