2121from pymatgen .phonon .bandstructure import PhononBandStructureSymmLine
2222from pymatgen .phonon .dos import PhononDos
2323
24+ from atomate2 .ase .jobs import AseRelaxMaker
2425from atomate2 .common .schemas .phonons import ForceConstants , PhononBSDOSDoc , get_factor
2526from atomate2 .common .utils import get_supercell_matrix
27+ from atomate2 .forcefields .jobs import ForceFieldRelaxMaker
28+ from atomate2 .vasp .jobs .base import BaseVaspMaker
2629
2730if TYPE_CHECKING :
2831 from pathlib import Path
2932
3033 from emmet .core .math import Matrix3D
3134
3235 from atomate2 .aims .jobs .base import BaseAimsMaker
33- from atomate2 .forcefields .jobs import ForceFieldStaticMaker
34- from atomate2 .vasp .jobs .base import BaseVaspMaker
35-
3636
3737logger = logging .getLogger (__name__ )
3838
@@ -253,7 +253,10 @@ def run_phonon_displacements(
253253 displacements : list [Structure ],
254254 structure : Structure ,
255255 supercell_matrix : Matrix3D ,
256- phonon_maker : BaseVaspMaker | ForceFieldStaticMaker | BaseAimsMaker = None ,
256+ phonon_maker : BaseVaspMaker
257+ | AseRelaxMaker
258+ | ForceFieldRelaxMaker
259+ | BaseAimsMaker = None ,
257260 prev_dir : str | Path = None ,
258261 prev_dir_argname : str = None ,
259262 socket : bool = False ,
@@ -272,14 +275,16 @@ def run_phonon_displacements(
272275 Fully optimized structure used for phonon computations.
273276 supercell_matrix: Matrix3D
274277 supercell matrix for meta data
275- phonon_maker : .BaseVaspMaker or .ForceFieldStaticMaker or .BaseAimsMaker
276- A maker to use to generate dispacement calculations
278+ phonon_maker : .BaseVaspMaker, .AseRelaxMaker,
279+ .ForceFieldRelaxMaker, or .BaseAimsMaker
280+ A maker to use to generate dispacement calculations.
281+ NB: this should be a static maker.
277282 prev_dir: str or Path
278283 The previous working directory
279284 prev_dir_argname: str
280285 argument name for the prev_dir variable
281286 socket: bool
282- If True use the socket-io interface to increase performance
287+ If True use the socket-io (batch-mode) interface to increase performance
283288 """
284289 phonon_jobs = []
285290 outputs : dict [str , list ] = {
@@ -292,28 +297,39 @@ def run_phonon_displacements(
292297 if prev_dir is not None and prev_dir_argname is not None :
293298 phonon_job_kwargs [prev_dir_argname ] = prev_dir
294299
300+ num_disp = len (displacements )
295301 if socket :
302+ if isinstance (phonon_maker , BaseVaspMaker ):
303+ raise ValueError ("VASP makers do not currently support socket/batch mode." )
304+
296305 phonon_job = phonon_maker .make (displacements , ** phonon_job_kwargs )
297306 info = {
298307 "original_structure" : structure ,
299308 "supercell_matrix" : supercell_matrix ,
300309 "displaced_structures" : displacements ,
301310 }
302- phonon_job .update_maker_kwargs (
303- {"_set" : {"write_additional_data->phonon_info:json" : info }}, dict_mod = True
304- )
311+ if not isinstance (phonon_maker , AseRelaxMaker | ForceFieldRelaxMaker ):
312+ phonon_job .update_maker_kwargs (
313+ {"_set" : {"write_additional_data->phonon_info:json" : info }},
314+ dict_mod = True ,
315+ )
316+
305317 phonon_jobs .append (phonon_job )
306- outputs ["displacement_number" ] = list (range (len (displacements )))
307- outputs ["uuids" ] = [phonon_job .output .uuid ] * len (displacements )
308- outputs ["dirs" ] = [phonon_job .output .dir_name ] * len (displacements )
309- outputs ["forces" ] = phonon_job .output .output .all_forces
318+ outputs ["displacement_number" ] = list (range (num_disp ))
319+ if isinstance (phonon_maker , AseRelaxMaker | ForceFieldRelaxMaker ):
320+ outputs ["uuids" ] = [phonon_job .output [0 ].uuid ] * num_disp
321+ outputs ["dirs" ] = [phonon_job .output [0 ].dir_name ] * num_disp
322+ outputs ["forces" ] = [
323+ phonon_job .output [idx ].output .forces for idx in range (num_disp )
324+ ]
325+ else :
326+ outputs ["uuids" ] = [phonon_job .output .uuid ] * num_disp
327+ outputs ["dirs" ] = [phonon_job .output .dir_name ] * num_disp
328+ outputs ["forces" ] = phonon_job .output .output .all_forces
310329 else :
311330 for idx , displacement in enumerate (displacements ):
312- if prev_dir is not None :
313- phonon_job = phonon_maker .make (displacement , prev_dir = prev_dir )
314- else :
315- phonon_job = phonon_maker .make (displacement )
316- phonon_job .append_name (f" { idx + 1 } /{ len (displacements )} " )
331+ phonon_job = phonon_maker .make (displacement , prev_dir = prev_dir )
332+ phonon_job .append_name (f" { idx + 1 } /{ num_disp } " )
317333
318334 # we will add some meta data
319335 info = {
@@ -323,10 +339,11 @@ def run_phonon_displacements(
323339 "displaced_structure" : displacement ,
324340 }
325341 with contextlib .suppress (Exception ):
326- phonon_job .update_maker_kwargs (
327- {"_set" : {"write_additional_data->phonon_info:json" : info }},
328- dict_mod = True ,
329- )
342+ if not isinstance (phonon_maker , AseRelaxMaker | ForceFieldRelaxMaker ):
343+ phonon_job .update_maker_kwargs (
344+ {"_set" : {"write_additional_data->phonon_info:json" : info }},
345+ dict_mod = True ,
346+ )
330347 phonon_jobs .append (phonon_job )
331348 outputs ["displacement_number" ].append (idx )
332349 outputs ["uuids" ].append (phonon_job .output .uuid )
0 commit comments