Skip to content

Commit a1cb9ad

Browse files
committed
Merge branch 'devel' of ssh://115.27.161.2:/data1/anguse/yingze/dpgen into devel
2 parents ddf39f1 + f1a815c commit a1cb9ad

File tree

3 files changed

+131
-71
lines changed

3 files changed

+131
-71
lines changed

dpgen/generator/lib/gaussian.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,13 @@ def make_gaussian_input(sys_data, fp_params):
114114
keywords = [keywords]
115115
else:
116116
keywords = keywords.copy()
117+
117118
# assume default charge is zero and default spin multiplicity is 1
118-
charge = fp_params.get('charge', 0)
119+
if 'charge' in sys_data.keys():
120+
charge = sys_data['charge']
121+
else:
122+
charge = fp_params.get('charge', 0)
123+
119124
use_fragment_guesses = False
120125
multiplicity = fp_params.get('multiplicity', 'auto')
121126
if type(multiplicity) == int:

dpgen/generator/run.py

Lines changed: 123 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,12 @@ def dump_to_poscar(dump, poscar, type_map, fmt = "lammps/dump") :
183183
sys = dpdata.System(dump, fmt = fmt, type_map = type_map)
184184
sys.to_vasp_poscar(poscar)
185185

186-
def dump_to_deepmd_raw(dump, deepmd_raw, type_map, fmt='gromacs/gro'):
186+
def dump_to_deepmd_raw(dump, deepmd_raw, type_map, fmt='gromacs/gro', charge=None):
187187
system = dpdata.System(dump, fmt = fmt, type_map = type_map)
188188
system.to_deepmd_raw(deepmd_raw)
189+
if charge is not None:
190+
with open(os.path.join(deepmd_raw, "charge"), 'w+') as f:
191+
f.write(str(charge))
189192

190193

191194
def make_train (iter_index,
@@ -205,7 +208,14 @@ def make_train (iter_index,
205208
training_init_model = jdata.get('training_init_model', False)
206209
training_reuse_iter = jdata.get('training_reuse_iter')
207210
training_reuse_old_ratio = jdata.get('training_reuse_old_ratio', None)
208-
training_reuse_stop_batch = jdata.get('training_reuse_stop_batch', 400000)
211+
212+
if 'training_reuse_stop_batch' in jdata.keys():
213+
training_reuse_stop_batch = jdata['training_reuse_stop_batch']
214+
elif 'training_reuse_numb_steps' in jdata.keys():
215+
training_reuse_stop_batch = jdata['training_reuse_numb_steps']
216+
else:
217+
training_reuse_stop_batch = 40000
218+
209219
training_reuse_start_lr = jdata.get('training_reuse_start_lr', 1e-4)
210220
training_reuse_start_pref_e = jdata.get('training_reuse_start_pref_e', 0.1)
211221
training_reuse_start_pref_f = jdata.get('training_reuse_start_pref_f', 100)
@@ -346,10 +356,12 @@ def make_train (iter_index,
346356
# set training reuse model
347357
if training_reuse_iter is not None and iter_index >= training_reuse_iter:
348358
if LooseVersion('1') <= LooseVersion(mdata["deepmd_version"]) < LooseVersion('2'):
359+
jinput['training']['stop_batch'] = training_reuse_stop_batch
349360
jinput['training']['auto_prob_style'] \
350361
="prob_sys_size; 0:%d:%f; %d:%d:%f" \
351362
%(old_range, training_reuse_old_ratio, old_range, len(init_data_sys), 1.-training_reuse_old_ratio)
352363
elif LooseVersion('2') <= LooseVersion(mdata["deepmd_version"]) < LooseVersion('3'):
364+
jinput['training']['numb_steps'] = training_reuse_stop_batch
353365
jinput['training']['training_data']['auto_prob'] \
354366
="prob_sys_size; 0:%d:%f; %d:%d:%f" \
355367
%(old_range, training_reuse_old_ratio, old_range, len(init_data_sys), 1.-training_reuse_old_ratio)
@@ -360,7 +372,7 @@ def make_train (iter_index,
360372
if jinput['loss'].get('start_pref_f') is not None:
361373
jinput['loss']['start_pref_f'] = training_reuse_start_pref_f
362374
jinput['learning_rate']['start_lr'] = training_reuse_start_lr
363-
jinput['training']['stop_batch'] = training_reuse_stop_batch
375+
364376

365377
for ii in range(numb_models) :
366378
task_path = os.path.join(work_path, train_task_fmt % ii)
@@ -1076,6 +1088,9 @@ def _make_model_devi_native(iter_index, jdata, mdata, conf_systems):
10761088
sys_counter += 1
10771089

10781090
def _make_model_devi_native_gromacs(iter_index, jdata, mdata, conf_systems):
1091+
# only support for deepmd v2.0
1092+
if LooseVersion(mdata['deepmd_version']) < LooseVersion('2.0'):
1093+
raise RuntimeError("Only support deepmd-kit 2.x for model_devi_engine='gromacs'")
10791094
model_devi_jobs = jdata['model_devi_jobs']
10801095
if (iter_index >= len(model_devi_jobs)) :
10811096
return False
@@ -1086,6 +1101,16 @@ def _make_model_devi_native_gromacs(iter_index, jdata, mdata, conf_systems):
10861101
else:
10871102
model_devi_dt = jdata['model_devi_dt']
10881103
nsteps = cur_job.get("nsteps", None)
1104+
lambdas = cur_job.get("lambdas", [])
1105+
temps = cur_job.get("temps", [])
1106+
if not lambdas:
1107+
lambdas = [1.0]
1108+
else:
1109+
for ll in lambdas:
1110+
if ll > 1:
1111+
raise RuntimeError("lambda is larger than 1.0")
1112+
if not temps:
1113+
temps = [298.0]
10891114
if nsteps is None:
10901115
raise RuntimeError("nsteps is None, you should set nsteps in model_devi_jobs!")
10911116
# Currently Gromacs engine is not supported for different temperatures!
@@ -1111,48 +1136,50 @@ def _make_model_devi_native_gromacs(iter_index, jdata, mdata, conf_systems):
11111136
conf_counter = 0
11121137
task_counter = 0
11131138
for cc in ss :
1114-
task_name = make_model_devi_task_name(sys_idx[sys_counter], task_counter)
1115-
#conf_name = make_model_devi_conf_name(sys_idx[sys_counter], conf_counter) + '.lmp'
1116-
task_path = os.path.join(work_path, task_name)
1117-
# dlog.info(task_path)
1118-
create_path(task_path)
1119-
#create_path(os.path.join(task_path, 'traj'))
1120-
#loc_conf_name = 'conf.lmp'
1121-
gromacs_settings = jdata.get("gromacs_settings" , "")
1122-
for key,file in gromacs_settings.items():
1123-
if key != "traj_filename" and key != "mdp_filename":
1124-
os.symlink(os.path.join(cc,file), os.path.join(task_path, file))
1125-
1126-
# input.json for DP-Gromacs
1127-
with open(os.path.join(cc, "input.json")) as f:
1128-
input_json = json.load(f)
1129-
input_json["graph_file"] = models[0]
1130-
with open(os.path.join(task_path,'input.json'), 'w') as _outfile:
1131-
json.dump(input_json, _outfile, indent = 4)
1132-
1133-
# trj_freq
1134-
trj_freq = cur_job.get("trj_freq", 10)
1135-
mdp = MDP()
1136-
mdp.read(os.path.join(cc, gromacs_settings['mdp_filename']))
1137-
mdp['nstcomm'] = trj_freq
1138-
mdp['nstxout'] = trj_freq
1139-
mdp['nstlog'] = trj_freq
1140-
mdp['nstenergy'] = trj_freq
1141-
# dt
1142-
mdp['dt'] = dt
1143-
mdp.write(os.path.join(task_path, gromacs_settings['mdp_filename']))
1144-
1145-
cwd_ = os.getcwd()
1146-
os.chdir(task_path)
1147-
job = {}
1148-
1149-
job["model_devi_dt"] = model_devi_dt
1150-
job["nsteps"] = nsteps
1151-
with open('job.json', 'w') as _outfile:
1152-
json.dump(job, _outfile, indent = 4)
1153-
os.chdir(cwd_)
1154-
1155-
task_counter += 1
1139+
for ll in lambdas:
1140+
for tt in temps:
1141+
task_name = make_model_devi_task_name(sys_idx[sys_counter], task_counter)
1142+
task_path = os.path.join(work_path, task_name)
1143+
create_path(task_path)
1144+
gromacs_settings = jdata.get("gromacs_settings" , "")
1145+
for key,file in gromacs_settings.items():
1146+
if key != "traj_filename" and key != "mdp_filename" and key != "group_name":
1147+
os.symlink(os.path.join(cc,file), os.path.join(task_path, file))
1148+
# input.json for DP-Gromacs
1149+
with open(os.path.join(cc, "input.json")) as f:
1150+
input_json = json.load(f)
1151+
input_json["graph_file"] = models[0]
1152+
input_json["lambda"] = ll
1153+
with open(os.path.join(task_path,'input.json'), 'w') as _outfile:
1154+
json.dump(input_json, _outfile, indent = 4)
1155+
1156+
# trj_freq
1157+
trj_freq = cur_job.get("trj_freq", 10)
1158+
mdp = MDP()
1159+
mdp.read(os.path.join(cc, gromacs_settings['mdp_filename']))
1160+
mdp['nstcomm'] = trj_freq
1161+
mdp['nstxout'] = trj_freq
1162+
mdp['nstlog'] = trj_freq
1163+
mdp['nstenergy'] = trj_freq
1164+
# dt
1165+
mdp['dt'] = model_devi_dt
1166+
# temps
1167+
if "ref_t" in list(mdp.keys()):
1168+
mdp["ref_t"] = tt
1169+
else:
1170+
mdp["ref-t"] = tt
1171+
mdp.write(os.path.join(task_path, gromacs_settings['mdp_filename']))
1172+
1173+
cwd_ = os.getcwd()
1174+
os.chdir(task_path)
1175+
job = {}
1176+
job["trj_freq"] = cur_job["trj_freq"]
1177+
job["model_devi_dt"] = model_devi_dt
1178+
job["nsteps"] = nsteps
1179+
with open('job.json', 'w') as _outfile:
1180+
json.dump(job, _outfile, indent = 4)
1181+
os.chdir(cwd_)
1182+
task_counter += 1
11561183
conf_counter += 1
11571184
sys_counter += 1
11581185

@@ -1208,21 +1235,32 @@ def run_model_devi (iter_index,
12081235
if use_plm_path:
12091236
forward_files += ['plmpath.pdb']
12101237
elif model_devi_engine == "gromacs":
1238+
12111239
gromacs_settings = jdata.get("gromacs_settings", {})
12121240
mdp_filename = gromacs_settings.get("mdp_filename", "md.mdp")
12131241
topol_filename = gromacs_settings.get("topol_filename", "processed.top")
12141242
conf_filename = gromacs_settings.get("conf_filename", "conf.gro")
12151243
index_filename = gromacs_settings.get("index_filename", "index.raw")
1244+
# Initial reference to process pbc condition.
1245+
# Default is em.tpr
1246+
ref_filename = gromacs_settings.get("ref_filename", "em.tpr")
12161247
deffnm = gromacs_settings.get("deffnm", "deepmd")
12171248
maxwarn = gromacs_settings.get("maxwarn", 1)
1249+
traj_filename = gromacs_settings.get("traj_filename", "deepmd_traj.gro")
1250+
grp_name = gromacs_settings.get("group_name", "Other")
12181251
nsteps = cur_job["nsteps"]
1252+
trj_freq = cur_job.get("trj_freq", 10)
12191253

12201254
command = "%s grompp -f %s -p %s -c %s -o %s -maxwarn %d" % (model_devi_exec, mdp_filename, topol_filename, conf_filename, deffnm, maxwarn)
1221-
command += "&& %s mdrun -deffnm %s -nsteps %d" %(model_devi_exec, deffnm, nsteps)
1255+
command += "&& %s mdrun -deffnm %s -nsteps %d" %(model_devi_exec, deffnm, nsteps)
1256+
command += "&& echo -e \"%s\n%s\n\" | %s trjconv -s %s -f %s.trr -o %s -pbc mol -ur compact -center" % (grp_name, grp_name, model_devi_exec, ref_filename, deffnm, traj_filename)
1257+
command += "&& if [ ! -d traj ]; then \n mkdir traj; fi\n"
1258+
command += f"python -c \"import dpdata;system = dpdata.System('{traj_filename}', fmt='gromacs/gro'); [system.to_gromacs_gro('traj/%d.gromacstrj' % (i * {trj_freq}), frame_idx=i) for i in range(system.get_nframes())]; system.to_deepmd_npy('traj_deepmd')\""
1259+
command += "&& dp model-devi -m ../graph.000.pb ../graph.001.pb ../graph.002.pb ../graph.003.pb -s traj_deepmd -o model_devi.out"
12221260
commands = [command]
1223-
1224-
forward_files = [mdp_filename, topol_filename, conf_filename, index_filename, "input.json" ]
1225-
backward_files = ["%s.tpr" % deffnm, "%s.log" %deffnm , 'model_devi.out', 'model_devi.log']
1261+
1262+
forward_files = [mdp_filename, topol_filename, conf_filename, index_filename, ref_filename, "input.json", "job.json" ]
1263+
backward_files = ["%s.tpr" % deffnm, "%s.log" %deffnm , traj_filename, 'model_devi.out', "traj", "traj_deepmd" ]
12261264

12271265

12281266
cwd = os.getcwd()
@@ -1351,6 +1389,10 @@ def _make_fp_vasp_inner (modd_path,
13511389
system_index.sort()
13521390

13531391
fp_tasks = []
1392+
1393+
charges_recorder = [] # record charges for each fp_task
1394+
charges_map = jdata.get("sys_charges", [])
1395+
13541396
cluster_cutoff = jdata['cluster_cutoff'] if jdata.get('use_clusters', False) else None
13551397
# skip save *.out if detailed_report_make_fp is False, default is True
13561398
detailed_report_make_fp = jdata.get("detailed_report_make_fp", True)
@@ -1464,11 +1506,11 @@ def _make_fp_vasp_inner (modd_path,
14641506
continue
14651507

14661508
if fp_cluster_vacuum is not None:
1467-
assert fp_cluster_vacuum >0
1468-
skip_cluster = check_cluster(conf_name, fp_cluster_vacuum)
1469-
if skip_cluster:
1470-
count_bad_cluster +=1
1471-
continue
1509+
assert fp_cluster_vacuum >0
1510+
skip_cluster = check_cluster(conf_name, fp_cluster_vacuum)
1511+
if skip_cluster:
1512+
count_bad_cluster +=1
1513+
continue
14721514

14731515
# link job.json
14741516
job_name = os.path.join(tt, "job.json")
@@ -1484,6 +1526,8 @@ def _make_fp_vasp_inner (modd_path,
14841526
fp_task_path = os.path.join(work_path, fp_task_name)
14851527
create_path(fp_task_path)
14861528
fp_tasks.append(fp_task_path)
1529+
if charges_map:
1530+
charges_recorder.append(charges_map[int(ss)])
14871531
cwd = os.getcwd()
14881532
os.chdir(fp_task_path)
14891533
if cluster_cutoff is None:
@@ -1501,13 +1545,18 @@ def _make_fp_vasp_inner (modd_path,
15011545
dlog.info("system {0:s} skipped {1:6d} confs with bad cluster, {2:6d} remains".format(ss, count_bad_cluster, numb_task - count_bad_cluster))
15021546
if cluster_cutoff is None:
15031547
cwd = os.getcwd()
1504-
for ii in fp_tasks:
1505-
os.chdir(ii)
1548+
for idx, task in enumerate(fp_tasks):
1549+
os.chdir(task)
15061550
if model_devi_engine == "lammps":
15071551
dump_to_poscar('conf.dump', 'POSCAR', type_map, fmt = "lammps/dump")
1552+
if charges_map:
1553+
warnings.warn('"sys_charges" keyword only support for gromacs engine now.')
15081554
elif model_devi_engine == "gromacs":
15091555
# dump_to_poscar('conf.dump', 'POSCAR', type_map, fmt = "gromacs/gro")
1510-
dump_to_deepmd_raw('conf.dump', 'deepmd.raw', type_map, fmt = 'gromacs/gro')
1556+
if charges_map:
1557+
dump_to_deepmd_raw('conf.dump', 'deepmd.raw', type_map, fmt='gromacs/gro', charge=charges_recorder[idx])
1558+
else:
1559+
dump_to_deepmd_raw('conf.dump', 'deepmd.raw', type_map, fmt='gromacs/gro', charge=None)
15111560
else:
15121561
raise RuntimeError("unknown model_devi engine", model_devi_engine)
15131562
os.chdir(cwd)
@@ -1933,6 +1982,8 @@ def make_fp_gaussian(iter_index,
19331982
sys_data = dpdata.System('POSCAR').data
19341983
elif model_devi_engine == "gromacs":
19351984
sys_data = dpdata.System("deepmd.raw", fmt='deepmd/raw').data
1985+
if os.path.isfile('deepmd.raw/charge'):
1986+
sys_data['charge'] = int(np.loadtxt('deepmd.raw/charge', dtype=int))
19361987
ret = make_gaussian_input(sys_data, fp_params)
19371988
with open('input', 'w') as fp:
19381989
fp.write(ret)
@@ -2483,18 +2534,22 @@ def post_fp_gaussian (iter_index,
24832534
sys_output = glob.glob(os.path.join(work_path, "task.%s.*/output"%ss))
24842535
sys_output.sort()
24852536
for idx,oo in enumerate(sys_output) :
2486-
sys = dpdata.LabeledSystem(oo, fmt = 'gaussian/log')
2487-
if len(sys) > 0:
2488-
sys.check_type_map(type_map = jdata['type_map'])
2489-
if jdata.get('use_atom_pref', False):
2490-
sys.data['atom_pref'] = np.load(os.path.join(os.path.dirname(oo), "atom_pref.npy"))
2491-
if idx == 0:
2492-
if jdata.get('use_clusters', False):
2493-
all_sys = dpdata.MultiSystems(sys, type_map = jdata['type_map'])
2537+
# TODO : UnboundLocalError sometimes occurs and I cannot figure it out.
2538+
try:
2539+
sys = dpdata.LabeledSystem(oo, fmt = 'gaussian/log')
2540+
if len(sys) > 0:
2541+
sys.check_type_map(type_map = jdata['type_map'])
2542+
if jdata.get('use_atom_pref', False):
2543+
sys.data['atom_pref'] = np.load(os.path.join(os.path.dirname(oo), "atom_pref.npy"))
2544+
if idx == 0:
2545+
if jdata.get('use_clusters', False):
2546+
all_sys = dpdata.MultiSystems(sys, type_map = jdata['type_map'])
2547+
else:
2548+
all_sys = sys
24942549
else:
2495-
all_sys = sys
2496-
else:
2497-
all_sys.append(sys)
2550+
all_sys.append(sys)
2551+
except UnboundLocalError as e:
2552+
pass
24982553
sys_data_path = os.path.join(work_path, 'data.%s'%ss)
24992554
all_sys.to_deepmd_raw(sys_data_path)
25002555
all_sys.to_deepmd_npy(sys_data_path, set_size = len(sys_output))

tests/generator/test_gromacs_engine.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def _copy_outputs(self, path_1, path_2):
9191
def test_make_model_devi_gromacs(self):
9292
flag = make_model_devi(iter_index=0,
9393
jdata=self.jdata,
94-
mdata={})
94+
mdata={"deepmd_version": "2.0"})
9595
self.assertTrue(flag)
9696
self.assertTrue(os.path.exists(self.model_devi_path))
9797
self.assertTrue(os.path.exists(self.model_devi_task_path))
@@ -108,7 +108,7 @@ def test_make_fp_gaussian(self):
108108

109109

110110
def tearDown(self):
111-
#pass
111+
# pass
112112
shutil.rmtree(self.iter_path)
113113
if __name__ == '__main__':
114114
unittest.main()

0 commit comments

Comments
 (0)