def run_pdos(self): """Run the `PdosWorkChain`.""" inputs = AttributeDict( self.exposed_inputs(PdosWorkChain, namespace="pdos")) inputs.metadata.call_link_label = "pdos" inputs.structure = self.ctx.current_structure inputs.nscf.pw.parameters = inputs.nscf.pw.parameters.get_dict() if self.ctx.current_number_of_bands: inputs.nscf.pw.parameters.setdefault("SYSTEM", {}).setdefault( "nbnd", self.ctx.current_number_of_bands) if self.ctx.scf_parent_folder: inputs.pop("scf") inputs.nscf.pw.parent_folder = self.ctx.scf_parent_folder else: if "kpoints_distance_override" in self.inputs: inputs.scf.kpoints_distance = self.inputs.kpoints_distance_override if "degauss_override" in self.inputs: inputs.scf.pw.parameters = inputs.scf.pw.parameters.get_dict() inputs.scf.pw.parameters.setdefault( "SYSTEM", {})["degauss"] = self.inputs.degauss_override.value inputs = prepare_process_inputs(PdosWorkChain, inputs) running = self.submit(PdosWorkChain, **inputs) self.report(f"launching PdosWorkChain<{running.pk}>") return ToContext(workchain_pdos=running)
def run_nscf_crop(self): """Run the PwBaseWorkChain in nscf mode along the path of high-symmetry determined by seekpath.""" inputs = AttributeDict(self.exposed_inputs(PwBaseWorkChain, namespace='nscf_crop')) inputs.metadata.call_link_label = 'nscf_crop' # inputs.pw.metadata.options.max_wallclock_seconds *= 4 # inputs.kpoints_distance = self.inputs.kpoints_distance inputs.pw.structure = self.ctx.current_structure inputs.pw.parent_folder = self.ctx.current_folder inputs.pw.parameters = inputs.pw.parameters.get_dict() inputs.pw.parameters.setdefault('CONTROL', {}) inputs.pw.parameters.setdefault('SYSTEM', {}) inputs.pw.parameters.setdefault('ELECTRONS', {}) # The following flags always have to be set in the parameters, regardless of what caller specified in the inputs inputs.pw.parameters['CONTROL']['calculation'] = 'nscf' inputs.pop('kpoints_distance', None) inputs.kpoints = self.ctx.kpoint_crop # Only set the following parameters if not directly explicitly defined in the inputs # inputs.pw.parameters['ELECTRONS'].setdefault('diagonalization', 'cg') # inputs.pw.parameters['ELECTRONS'].setdefault('diago_full_acc', True) # If `nbands_factor` is defined in the inputs we set the `nbnd` parameter if 'nbands_factor_crop' in self.inputs: factor = self.inputs.nbands_factor_crop.value parameters = self.ctx.workchain_scf.outputs.output_parameters.get_dict() if int(parameters['number_of_spin_components']) > 1: nspin_factor = 2 else: nspin_factor = 1 nbands = int(parameters['number_of_bands']) nelectron = int(parameters['number_of_electrons']) nbnd = max( int(0.5 * nelectron * nspin_factor * factor), int(0.5 * nelectron * nspin_factor) + 4 * nspin_factor, nbands) inputs.pw.parameters['SYSTEM']['nbnd'] = nbnd # Otherwise set the current number of bands, unless explicitly set in the inputs else: inputs.pw.parameters['SYSTEM'].setdefault('nbnd', self.ctx.current_number_of_bands) inputs = prepare_process_inputs(PwBaseWorkChain, inputs) running = self.submit(PwBaseWorkChain, **inputs) self.report('launching PwBaseWorkChain<{}> in {} mode for CROP grid'.format(running.pk, 'nscf')) return ToContext(workchain_nscf_crop=running)