diff --git a/src/aiidalab_qe/plugins/pdos/setting.py b/src/aiidalab_qe/plugins/pdos/setting.py index 91a2a7621..60159d1b0 100644 --- a/src/aiidalab_qe/plugins/pdos/setting.py +++ b/src/aiidalab_qe/plugins/pdos/setting.py @@ -10,6 +10,8 @@ from aiida_quantumespresso.workflows.pdos import PdosWorkChain from aiidalab_qe.common.panel import Panel +RYDBERG_TO_EV = 13.605703976 + class Setting(Panel): title = "PDOS" @@ -22,6 +24,11 @@ def __init__(self, **kwargs): """

Settings

""" ) + self.description = ipw.HTML( + """
+ By default, the tetrahedron method is used for PDOS calculation. If required you can apply Gaussian broadening with a custom degauss value. +
""" + ) # nscf kpoints setting widget self.nscf_kpoints_distance = ipw.BoundedFloatText( min=0.001, @@ -31,15 +38,45 @@ def __init__(self, **kwargs): disabled=False, style={"description_width": "initial"}, ) + self.use_pdos_degauss = ipw.Checkbox( + value=False, + description="Use custom PDOS degauss", + style={"description_width": "initial"}, + ) + self.pdos_degauss = ipw.BoundedFloatText( + min=0.00001, + step=0.001, + value=0.005, + description="PDOS degauss (Ry):", + disabled=True, + style={"description_width": "initial"}, + ) + self.pdos_degauss_eV = ipw.HTML( + value=f"({self.pdos_degauss.value * RYDBERG_TO_EV:.4f} eV)", + ) + + self.use_pdos_degauss.observe(self._disable_pdos_degauss, "value") + self.pdos_degauss.observe(self._update_pdos_degauss_ev, "value") self.mesh_grid = ipw.HTML() self.nscf_kpoints_distance.observe(self._display_mesh, "value") self.nscf_kpoints_distance.observe(self._procotol_changed, "change") self.children = [ self.settings_title, + self.description, ipw.HBox([self.nscf_kpoints_distance, self.mesh_grid]), + self.use_pdos_degauss, + ipw.HBox([self.pdos_degauss, self.pdos_degauss_eV]), ] super().__init__(**kwargs) + def _disable_pdos_degauss(self, change): + self.pdos_degauss.disabled = not change["new"] + + def _update_pdos_degauss_ev(self, change): + new_value = change["new"] * RYDBERG_TO_EV + if self.pdos_degauss_eV.value != f"({new_value} eV)": + self.pdos_degauss_eV.value = f"({new_value:.4f} eV)" + @tl.observe("protocol") def _procotol_changed(self, change): self.nscf_kpoints_distance.value = PdosWorkChain.get_protocol_inputs( @@ -65,12 +102,18 @@ def get_panel_value(self): """Return a dictionary with the input parameters for the plugin.""" return { "nscf_kpoints_distance": self.nscf_kpoints_distance.value, + "pdos_degauss": self.pdos_degauss.value, + "use_pdos_degauss": self.use_pdos_degauss.value, } def set_panel_value(self, input_dict): """Load a dictionary with the input parameters for the plugin.""" self.nscf_kpoints_distance.value = input_dict.get("nscf_kpoints_distance", 0.1) + self.pdos_degauss.value = input_dict.get("pdos_degauss", 0.005) + self.use_pdos_degauss.value = input_dict.get("use_pdos_degauss", False) def reset(self): """Reset the panel to its default values.""" self.nscf_kpoints_distance.value = 0.1 + self.pdos_degauss.value = 0.005 + self.use_pdos_degauss.value = False diff --git a/src/aiidalab_qe/plugins/pdos/workchain.py b/src/aiidalab_qe/plugins/pdos/workchain.py index b3c5bfbc6..6fe19ce2f 100644 --- a/src/aiidalab_qe/plugins/pdos/workchain.py +++ b/src/aiidalab_qe/plugins/pdos/workchain.py @@ -52,12 +52,26 @@ def get_builder(codes, structure, parameters, **kwargs): scf_overrides = deepcopy(parameters["advanced"]) nscf_overrides = deepcopy(parameters["advanced"]) + # Dos Projwfc overrides + dos_overrides = {"parameters": {"DOS": {}}} + projwfc_overrides = {"parameters": {"PROJWFC": {}}} + + if parameters["pdos"]["use_pdos_degauss"]: + dos_overrides["parameters"]["DOS"] = { + "degauss": parameters["pdos"]["pdos_degauss"] + } + projwfc_overrides["parameters"]["PROJWFC"] = { + "degauss": parameters["pdos"]["pdos_degauss"] + } + # Update the nscf kpoints distance from the setting panel nscf_overrides["kpoints_distance"] = parameters["pdos"]["nscf_kpoints_distance"] overrides = { "scf": scf_overrides, "nscf": nscf_overrides, + "dos": dos_overrides, + "projwfc": projwfc_overrides, } if dos_code is not None and projwfc_code is not None: pdos = PdosWorkChain.get_builder_from_protocol( diff --git a/tests/test_submit_qe_workchain/test_create_builder_default.yml b/tests/test_submit_qe_workchain/test_create_builder_default.yml index ca33c43c9..4b9f604cc 100644 --- a/tests/test_submit_qe_workchain/test_create_builder_default.yml +++ b/tests/test_submit_qe_workchain/test_create_builder_default.yml @@ -43,6 +43,8 @@ codes: parallelization: {} pdos: nscf_kpoints_distance: 0.1 + pdos_degauss: 0.005 + use_pdos_degauss: false workchain: electronic_type: metal properties: