From ecbffc0690f798c0e9d75b430ced162ddb84e482 Mon Sep 17 00:00:00 2001 From: Thomas Warford Date: Fri, 21 Aug 2026 12:07:21 -0700 Subject: [PATCH 1/4] do not redefine structure, inherit from pymatgen's VaspInputSet --- src/atomate2/vasp/sets/base.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/atomate2/vasp/sets/base.py b/src/atomate2/vasp/sets/base.py index e310fa74b7..5050d1b287 100644 --- a/src/atomate2/vasp/sets/base.py +++ b/src/atomate2/vasp/sets/base.py @@ -174,7 +174,8 @@ class VaspInputGenerator(VaspInputSet): from_prev_calc. """ - structure: Structure | None = None + # Do not redeclare `structure` here: VaspInputSet so setting structure + # uses pymatgen.io.vasp.sets setter which sorts the structure config_dict: dict = field(default_factory=lambda: _BASE_VASP_SET) files_to_transfer: dict = field(default_factory=dict) user_incar_settings: dict = field(default_factory=dict) From 9754c4e58810663da36fb8ac1e6ebc7ab6232f59 Mon Sep 17 00:00:00 2001 From: Thomas Warford Date: Fri, 21 Aug 2026 12:08:00 -0700 Subject: [PATCH 2/4] test sorting and pymatgen inheritence --- tests/vasp/test_sets.py | 47 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/tests/vasp/test_sets.py b/tests/vasp/test_sets.py index 8b71a44a15..483ee027c6 100644 --- a/tests/vasp/test_sets.py +++ b/tests/vasp/test_sets.py @@ -1,7 +1,8 @@ import pytest from pymatgen.core import Lattice, Species, Structure -from pymatgen.io.vasp.sets import MPScanRelaxSet +from pymatgen.io.vasp.sets import MPScanRelaxSet, VaspInputSet +from atomate2.vasp.sets.base import VaspInputGenerator from atomate2.vasp.sets.core import ( ElectronPhononSetGenerator, HSEBSSetGenerator, @@ -292,3 +293,47 @@ def test_core(struct_no_magmoms): assert incar["EDIFF"] == 1e-7 assert incar["ISYM"] == 0 assert incar["LWAVE"] is True + + +def test_structure_field_not_shadowed(): + """VaspInputGenerator must not redeclare `structure` as a plain field: + pymatgen's VaspInputSet already defines it as a property (with a setter + that applies sort_structure/reduce_structure/validate_magmom), and + redeclaring it here would shadow that property in the MRO, silently + disabling the setter for every generator derived from this class. + """ + # The property should be the one pymatgen's VaspInputSet defines, not + # redeclared (and thereby shadowed) on atomate2's VaspInputGenerator. + assert "structure" not in vars(VaspInputGenerator) + assert isinstance(vars(VaspInputSet)["structure"], property) + + # Setting `.structure` on a generator must still work end-to-end. + input_gen = MDSetGenerator() + structure = Structure( + lattice=Lattice.cubic(3), + species=("Fe", "O"), + coords=((0, 0, 0), (0.5, 0.5, 0.5)), + ) + input_gen.structure = structure + assert input_gen.structure.composition == structure.composition + + +def test_md_set_generator_sorts_structure(): + """MDSetGenerator's npt ensemble sizes LANGEVIN_GAMMA to the number of + distinct elements, but VASP counts POSCAR "types" as contiguous + same-element runs. If the structure passed in isn't already grouped by + element and sort_structure doesn't run, the two counts diverge and VASP + aborts with "Error reading item LANGEVIN_GAMMA from file INCAR". + """ + structure = Structure( + lattice=Lattice.cubic(10), + species=["Al", "Cl", "Al", "Cl", "O", "Cl", "Li", "Li"], + coords=[[0.1 * i, 0.1 * i, 0.1 * i] for i in range(8)], + ) + + input_gen = MDSetGenerator(ensemble="npt") + vasp_input = input_gen.get_input_set(structure, potcar_spec=True) + + n_types_in_poscar = len(vasp_input["POSCAR"].natoms) + n_langevin_gamma = len(vasp_input["INCAR"]["LANGEVIN_GAMMA"]) + assert n_types_in_poscar == n_langevin_gamma From 498e61deac7e7e050ff9c77e814c3bd93be1fc52 Mon Sep 17 00:00:00 2001 From: Thomas Warford Date: Fri, 21 Aug 2026 12:18:47 -0700 Subject: [PATCH 3/4] remove unnecessary import --- src/atomate2/vasp/sets/base.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/atomate2/vasp/sets/base.py b/src/atomate2/vasp/sets/base.py index 5050d1b287..a5a07179ff 100644 --- a/src/atomate2/vasp/sets/base.py +++ b/src/atomate2/vasp/sets/base.py @@ -10,7 +10,6 @@ from atomate2 import SETTINGS if TYPE_CHECKING: - from pymatgen.core import Structure from pymatgen.io.vasp import Kpoints from pymatgen.io.vasp.sets import UserPotcarFunctional From 8532f564ac5054b870df1bc248b032c219f743c1 Mon Sep 17 00:00:00 2001 From: Thomas Warford Date: Mon, 24 Aug 2026 12:14:55 -0700 Subject: [PATCH 4/4] remove comment --- src/atomate2/vasp/sets/base.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/atomate2/vasp/sets/base.py b/src/atomate2/vasp/sets/base.py index a5a07179ff..ec047a1c5e 100644 --- a/src/atomate2/vasp/sets/base.py +++ b/src/atomate2/vasp/sets/base.py @@ -173,8 +173,6 @@ class VaspInputGenerator(VaspInputSet): from_prev_calc. """ - # Do not redeclare `structure` here: VaspInputSet so setting structure - # uses pymatgen.io.vasp.sets setter which sorts the structure config_dict: dict = field(default_factory=lambda: _BASE_VASP_SET) files_to_transfer: dict = field(default_factory=dict) user_incar_settings: dict = field(default_factory=dict)