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: