1010from .context import detect_multiplicity
1111from .context import parse_cur_job
1212from .context import param_file
13+ from .context import param_file_merge_traj
1314from .context import param_old_file
1415from .context import param_pwscf_file
1516from .context import param_pwscf_old_file
@@ -219,7 +220,7 @@ def _write_lammps_dump(sys, dump_file, f_idx = 0) :
219220 bd , tilt = _box2dumpbox (np .zeros (3 ), cell )
220221 atype = sys ['atom_types' ]
221222 natoms = len (sys ['atom_types' ])
222- with open (dump_file , 'w ' ) as fp :
223+ with open (dump_file , 'a ' ) as fp :
223224 fp .write ('ITEM: TIMESTEP\n ' )
224225 fp .write ('0\n ' )
225226 fp .write ('ITEM: NUMBER OF ATOMS\n ' )
@@ -271,6 +272,52 @@ def _make_fake_md(idx, md_descript, atom_types, type_map, ele_temp = None) :
271272 with open (os .path .join (task_dir , 'job.json' ), 'w' ) as fp :
272273 json .dump ({"ele_temp" : ele_temp [sidx ][midx ]}, fp )
273274
275+ def _make_fake_md_merge_traj (idx , md_descript , atom_types , type_map , ele_temp = None ) :
276+ """
277+ md_descript: list of dimension
278+ [n_sys][n_MD][n_frame]
279+ ele_temp: list of dimension
280+ [n_sys][n_MD]
281+ """
282+ natoms = len (atom_types )
283+ ntypes = len (type_map )
284+ atom_types = np .array (atom_types , dtype = int )
285+ atom_numbs = [np .sum (atom_types == ii ) for ii in range (ntypes )]
286+ sys = dpdata .System ()
287+ sys .data ['atom_names' ] = type_map
288+ sys .data ['atom_numbs' ] = atom_numbs
289+ sys .data ['atom_types' ] = atom_types
290+ for sidx ,ss in enumerate (md_descript ) :
291+ for midx ,mm in enumerate (ss ) :
292+ nframes = len (mm )
293+ cells = np .random .random ([nframes ,3 ,3 ])
294+ coords = np .random .random ([nframes ,natoms ,3 ])
295+ sys .data ['coords' ] = coords
296+ sys .data ['cells' ] = cells
297+ task_dir = os .path .join ('iter.%06d' % idx ,
298+ '01.model_devi' ,
299+ 'task.%03d.%06d' % (sidx , midx ))
300+ cwd = os .getcwd ()
301+ os .makedirs (task_dir ,exist_ok = True )
302+ for ii in range (nframes ):
303+ _write_lammps_dump (sys ,os .path .join (task_dir ,'all.lammpstrj' ),ii )
304+ file_content = """\
305+ 0.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
306+ 1.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.899999999999999800e-02 0.000000000000000000e+00 0.000000000000000000e+00
307+ 2.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.799999999999999600e-02 0.000000000000000000e+00 0.000000000000000000e+00
308+ 3.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 8.699999999999999400e-02 0.000000000000000000e+00 0.000000000000000000e+00
309+ 4.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.159999999999999920e-01 0.000000000000000000e+00 0.000000000000000000e+00
310+ 5.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.449999999999999900e-01 0.000000000000000000e+00 0.000000000000000000e+00
311+ 6.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.739999999999999880e-01 0.000000000000000000e+00 0.000000000000000000e+00
312+ 7.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.029999999999999860e-01 0.000000000000000000e+00 0.000000000000000000e+00
313+ 8.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.319999999999999840e-01 0.000000000000000000e+00 0.000000000000000000e+00
314+ 9.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.610000000000000098e-01 0.000000000000000000e+00 0.000000000000000000e+00
315+ """
316+ with open (os .path .join (task_dir , 'model_devi.out' ) , 'w' ) as fp :
317+ fp .write (file_content )
318+ if ele_temp is not None :
319+ with open (os .path .join (task_dir , 'job.json' ), 'w' ) as fp :
320+ json .dump ({"ele_temp" : ele_temp [sidx ][midx ]}, fp )
274321
275322def _check_poscars (testCase , idx , fp_task_max , type_map ) :
276323 fp_path = os .path .join ('iter.%06d' % idx , '02.fp' )
@@ -297,6 +344,40 @@ def _check_poscars(testCase, idx, fp_task_max, type_map) :
297344 sys1 = dpdata .System (poscar_file , fmt = 'vasp/poscar' )
298345 test_atom_names (testCase , sys0 , sys1 )
299346
347+ def _check_poscars_merge_traj (testCase , idx , fp_task_max , type_map ) :
348+ fp_path = os .path .join ('iter.%06d' % idx , '02.fp' )
349+ candi_files = glob .glob (os .path .join (fp_path , 'candidate.shuffled.*.out' ))
350+ candi_files .sort ()
351+ sys_idx = [str (os .path .basename (ii ).split ('.' )[2 ]) for ii in candi_files ]
352+ for sidx ,ii in zip (sys_idx , candi_files ) :
353+ md_task = []
354+ f_idx = []
355+ with open (ii ) as fp :
356+ for ii in fp :
357+ md_task .append (ii .split ()[0 ])
358+ f_idx .append (ii .split ()[1 ])
359+ md_task = md_task [:fp_task_max ]
360+ f_idx = f_idx [:fp_task_max ]
361+ cc = 0
362+ label_0 = 0
363+ label_1 = 0
364+
365+ for tt ,ff in zip (md_task , f_idx ) :
366+ traj_file = os .path .join (tt , 'all.lammpstrj' )
367+ poscar_file = os .path .join (fp_path ,
368+ 'task.%03d.%06d' % (int (sidx ), cc ),
369+ 'POSCAR' )
370+ cc += 1
371+ sys0 = dpdata .System (traj_file , fmt = 'lammps/dump' , type_map = type_map )
372+ sys1 = dpdata .System (poscar_file , fmt = 'vasp/poscar' )
373+ new_coords_0 = float (sys1 ["coords" ][0 ][0 ][0 ])
374+ new_coords_1 = float (sys1 ["coords" ][0 ][1 ][0 ])
375+ if (label_0 == new_coords_0 and label_1 == new_coords_1 ):
376+ raise RuntimeError ("The exact same POSCAR is generated under different first-principles calculation catalogs" )
377+ label_0 = new_coords_0
378+ label_1 = new_coords_1
379+ test_atom_names (testCase , sys0 [int (int (ff )/ 10 )], sys1 )
380+
300381def _check_kpoints_exists (testCase , idx ) :
301382 fp_path = os .path .join ('iter.%06d' % idx , '02.fp' )
302383 tasks = glob .glob (os .path .join (fp_path , 'task.*' ))
@@ -710,6 +791,37 @@ def test_make_fp_vasp(self):
710791 # checked elsewhere
711792 # _check_potcar(self, 0, jdata['fp_pp_path'], jdata['fp_pp_files'])
712793 shutil .rmtree ('iter.000000' )
794+
795+ def test_make_fp_vasp_merge_traj (self ):
796+ setUpModule ()
797+ if os .path .isdir ('iter.000000' ) :
798+ shutil .rmtree ('iter.000000' )
799+ with open (param_file_merge_traj , 'r' ) as fp :
800+ jdata = json .load (fp )
801+ with open (machine_file , 'r' ) as fp :
802+ mdata = json .load (fp )
803+ md_descript = []
804+ nsys = 2
805+ nmd = 3
806+ n_frame = 10
807+ for ii in range (nsys ) :
808+ tmp = []
809+ for jj in range (nmd ) :
810+ tmp .append (np .arange (0 , 0.29 , 0.29 / 10 ))
811+ md_descript .append (tmp )
812+ atom_types = [0 , 1 , 0 , 1 ]
813+ type_map = jdata ['type_map' ]
814+
815+ _make_fake_md_merge_traj (0 , md_descript , atom_types , type_map )
816+ make_fp (0 , jdata , {"fp_user_forward_files" : ["vdw_kernel.bindat" ] })
817+ _check_poscars_merge_traj (self , 0 , jdata ['fp_task_max' ], jdata ['type_map' ])
818+ #_check_incar_exists(self, 0)
819+ _check_incar (self , 0 )
820+ _check_kpoints_exists (self , 0 )
821+ _check_kpoints (self ,0 )
822+ # checked elsewhere
823+ # _check_potcar(self, 0, jdata['fp_pp_path'], jdata['fp_pp_files'])
824+ shutil .rmtree ('iter.000000' )
713825
714826 def test_make_fp_vasp_old (self ):
715827 setUpModule ()
0 commit comments