@@ -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
191194def 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
10781090def _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 ))
0 commit comments