44init: data
55iter:
66 00.train
7- 01.mode_devi
7+ 01.model_devi
88 02.vasp
99 03.data
1010"""
6262from dpgen import ROOT_PATH
6363from pymatgen .io .vasp import Incar ,Kpoints ,Potcar
6464from 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
6671template_name = 'template'
6772train_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
184193def make_train (iter_index ,
185194 jdata ,
@@ -684,6 +693,9 @@ def revise_by_keys(lmp_lines, keys, values):
684693def 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
10011103def 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-
22922430def run_iter (param_file , machine_file ) :
22932431 try :
22942432 import ruamel
0 commit comments