[docs]defrun_aims(aims_cmd:str=None,)->None:""" Run FHI-aims. Parameters ---------- aims_cmd : str The command used to run FHI-aims (defaults to SETTINGS.AIMS_CMD). """ifaims_cmdisNone:aims_cmd=SETTINGS.AIMS_CMDaims_cmd=expandvars(aims_cmd)logger.info(f"Running command: {aims_cmd}")return_code=subprocess.call(["/bin/bash","-c",aims_cmd],env=os.environ)logger.info(f"{aims_cmd} finished running with return code: {return_code}")
[docs]defshould_stop_children(task_document:AimsTaskDoc,handle_unsuccessful:bool|str=True,)->bool:""" Decide whether child jobs should continue. Parameters ---------- task_document : .TaskDoc An FHI-aims task document. handle_unsuccessful : bool or str This is a three-way toggle on what to do if your job looks OK, but is actually not converged (either electronic or ionic): - `True`: Mark job as completed, but stop children. - `False`: Do nothing, continue with workflow as normal. - `"error"`: Throw an error. Returns ------- bool Whether to stop child jobs. """iftask_document.state=="successful":returnFalseifisinstance(handle_unsuccessful,bool):returnhandle_unsuccessfulifhandle_unsuccessful=="error":raiseRuntimeError("Job was not successful (not converged)!")raiseRuntimeError(f"Unknown option for handle_unsuccessful: {handle_unsuccessful}")
[docs]defrun_aims_socket(structures_to_calculate:list[Structure|Molecule],aims_cmd:str=None)->None:"""Use the ASE interface to run FHI-aims from the socket. Parameters ---------- structures_to_calculate: list[Structure or Molecule] The list of structures to run scf calculations on aims_cmd: str The aims command to use (defaults to SETTINGS.AIMS_CMD). """ifaims_cmdisNone:aims_cmd=SETTINGS.AIMS_CMDase_adaptor=AseAtomsAdaptor()atoms_to_calculate=[ase_adaptor.get_atoms(structure)forstructureinstructures_to_calculate]withopen("parameters.json")asparam_file:parameters=json.load(param_file,cls=MontyDecoder)del_keys=[]forkey,valinparameters.items():ifvalisNone:del_keys.append(key)forkeyindel_keys:parameters.pop(key)ifaims_cmd:parameters["command"]=aims_cmdelif"command"notinparameters:parameters["command"]=SETTINGS.AIMS_CMDcalculator=Aims(**parameters)port=parameters["use_pimd_wrapper"][1]atoms=atoms_to_calculate[0].copy()withSocketIOCalculator(calc=calculator,port=port)ascalc:foratoms_calcinatoms_to_calculate:# Delete prior calculation resultscalc.results.clear()# Reset atoms information to the new cellatoms.info=atoms_calc.infoatoms.cell=atoms_calc.cellatoms.positions=atoms_calc.positionscalc.calculate(atoms,system_changes=["positions","cell"])calc.close()