diff --git a/pyiron_atomistics/vasp/base.py b/pyiron_atomistics/vasp/base.py index 6f6ec8c4b..33830452d 100644 --- a/pyiron_atomistics/vasp/base.py +++ b/pyiron_atomistics/vasp/base.py @@ -1280,21 +1280,32 @@ def set_electric_field(self, e_field=0.1, direction=2, dipole_center=None): if dipole_center is not None: self.input.incar["DIPOL"] = " ".join(str(val) for val in dipole_center) - def set_occupancy_smearing(self, smearing="fermi", width=0.2, ismear=None): + @deprecate(ismear="Preferably use parameters `smearing` and `order` " + "to set the type of smearing you want") + def set_occupancy_smearing(self, smearing: str = None, width: float = None, + order: int = 1, ismear: int = None) -> None: """ Set how the finite temperature smearing is applied in determining partial occupancies Args: - smearing (str): Type of smearing (fermi/gaussian etc.) + smearing (str): Type of smearing (Fermi, Gaussian, or Methfessel-Paxton) width (float): Smearing width (eV) - ismear (int): Directly sets the ISMEAR tag. Overwrites the smearing tag + order (int): order (int): Smearing order (only for Methfessel-Paxton) + ismear (int): (Deprecated) Directly sets the ISMEAR tag. Overwrites the smearing tag """ - ismear_dict = {"fermi": -1, "gaussian": 0, "MP": 1} if ismear is not None: self.input.incar["ISMEAR"] = int(ismear) + elif smearing.lower().startswith("meth") or smearing.lower().startswith("mp"): + self.input.incar["ISMEAR"] = int(order) + elif smearing.lower().startswith("fermi"): + self.input.incar["ISMEAR"] = -1 + elif smearing.lower().startswith("gauss"): + self.input.incar["ISMEAR"] = 0 else: - self.input.incar["ISMEAR"] = ismear_dict[smearing] - self.input.incar["SIGMA"] = width + raise ValueError(f"Smearing scheme {smearing} is not available. Only types 'Fermi', 'Gaussian', " + f"and 'Methfessel-Paxton'") + if width is not None: + self.input.incar["SIGMA"] = width def set_fft_mesh(self, nx=None, ny=None, nz=None): """ diff --git a/tests/vasp/test_vasp.py b/tests/vasp/test_vasp.py index a9b9b727e..db165f963 100644 --- a/tests/vasp/test_vasp.py +++ b/tests/vasp/test_vasp.py @@ -13,6 +13,7 @@ from pyiron_atomistics.vasp.metadyn import VaspMetadyn from pyiron_atomistics.vasp.structure import read_atoms import numpy as np +import warnings __author__ = "Sudarsan Surendralal" @@ -255,6 +256,26 @@ def test_set_empty_states(self): self.job.set_empty_states(n_empty_states=10) self.assertEqual(self.job.input.incar["NBANDS"], 25) + def test_set_occpuancy_smearing(self): + job_smear = self.project.create_job("Vasp", "smearing") + self.assertIsNone(job_smear.input.incar["ISMEAR"]) + self.assertIsNone(job_smear.input.incar["SIGMA"]) + job_smear.set_occupancy_smearing(smearing="methfessel_paxton") + self.assertEqual(job_smear.input.incar["ISMEAR"], 1) + job_smear.set_occupancy_smearing(smearing="methfessel_paxton", order=2) + self.assertEqual(job_smear.input.incar["ISMEAR"], 2) + job_smear.set_occupancy_smearing(smearing="Fermi", width=0.1) + self.assertEqual(job_smear.input.incar["ISMEAR"], -1) + self.assertEqual(job_smear.input.incar["SIGMA"], 0.1) + job_smear.set_occupancy_smearing(smearing="Gaussian", width=0.1) + self.assertEqual(job_smear.input.incar["ISMEAR"], 0) + self.assertEqual(job_smear.input.incar["SIGMA"], 0.1) + with warnings.catch_warnings(record=True) as w: + job_smear.set_occupancy_smearing(smearing="Gaussian", ismear=10) + self.assertEqual(job_smear.input.incar["ISMEAR"], 10) + self.assertEqual(len(w), 1) + self.assertRaises(ValueError, job_smear.set_occupancy_smearing, smearing="gibberish") + def test_calc_static(self): self.job.calc_static( electronic_steps=90,