From 2d94e73744855ebef8ef8dd0c1ec2ca83d2fb3a2 Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Sat, 27 Sep 2025 19:42:03 -0500 Subject: [PATCH 01/18] -Add the reference for latest rVV10 parameters used for r2SCAN+rVV10 -Add the code to update rVV10 parameters ("BPARAM"=11.95) for r2SCAN+rVV10 if vdw is set to "rvv10" and METAGGA is "R2SCAN" --- src/pymatgen/io/vasp/sets.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/pymatgen/io/vasp/sets.py b/src/pymatgen/io/vasp/sets.py index 0db990490d0..79f57d7e3e7 100644 --- a/src/pymatgen/io/vasp/sets.py +++ b/src/pymatgen/io/vasp/sets.py @@ -1360,6 +1360,12 @@ class MPScanRelaxSet(VaspInputSet): James W. Furness, Aaron D. Kaplan, Jinliang Ning, John P. Perdew, and Jianwei Sun. Accurate and Numerically Efficient r2SCAN Meta-Generalized Gradient Approximation. The Journal of Physical Chemistry Letters 11, 8208-8215 (2022) DOI: 10.1021/acs.jpclett.0c02405 + + Jinliang Ning, Manish Kothakonda, James W. Furness, Aaron D. Kaplan, Sebastian Ehlert, + Jan Gerit Brandenburg, John P. Perdew, and Jianwei Sun. + Workhorse minimally empirical dispersion-corrected density functional with tests for + weakly bound systems: r2SCAN+rVV10. + Phys. Rev. B 106, 075422 (2022) DOI: 10.1103/PhysRevB.106.075422 """ bandgap: float | None = None @@ -1381,6 +1387,11 @@ def __post_init__(self) -> None: for k in vdw_par[self.vdw]: self._config_dict["INCAR"].pop(k, None) + elif self.vdw == "rvv10": + if self._config_dict["INCAR"]["METAGGA"] == "R2SCAN" and self.user_incar_settings.get("METAGGA") is None: + rVV10_r2scan = {"BPARAM": 11.95} + self._config_dict["INCAR"].update(rVV10_r2scan) + @dataclass class MP24RelaxSet(VaspInputSet): From c5841e4e5ea7b096d1c0c0be6c050a164a83eb02 Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Tue, 7 Oct 2025 20:43:25 -0500 Subject: [PATCH 02/18] Add function to update INCAR settings in MPScanRelaxSet and MP24RelaxSet for the given XC functional and dispersion correction --- src/pymatgen/io/vasp/sets.py | 72 ++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/src/pymatgen/io/vasp/sets.py b/src/pymatgen/io/vasp/sets.py index 79f57d7e3e7..1e1fa612ada 100644 --- a/src/pymatgen/io/vasp/sets.py +++ b/src/pymatgen/io/vasp/sets.py @@ -1299,6 +1299,78 @@ class MPRelaxSet(VaspInputSet): CONFIG = _load_yaml_config("MPRelaxSet") +def _config_updates( + vasp_input_set: VaspInputSet, + xc_functional: str, + dispersion: str | None = None, +) -> None: + """Update the INCAR settings for a given XC functional and dispersion correction. + + Args: + vasp_input_set (VaspInputSet): The VaspInputSet instance to update. + Supported types are MPScanRelaxSet and MP24RelaxSet. + xc_functional (str): The exchange-correlation functional to use. + Supported values are "SCAN", "r2SCAN", "PBE", and "PBEsol". + dispersion (str | None): The dispersion correction to use. + Supported values are "rVV10" and "D4". If None, no dispersion correction is applied. + + Returns: + None: The function updates the INCAR settings of the VaspInputSet in place. + """ + + xc = xc_functional.lower() + vdw = dispersion.lower() if dispersion is not None else None + + to_func_metagga = {"scan": "SCAN", "r2scan": "R2SCAN"} + to_func_gga = {"pbe": "PE", "pbesol": "PS"} + + config_updates: dict[str, Any] = {} + + # Update the XC functional flags + if xc in to_func_metagga: + config_updates |= {"METAGGA": to_func_metagga[xc]} + vasp_input_set._config_dict["INCAR"].pop("GGA", None) + elif xc in to_func_gga: + config_updates |= {"GGA": to_func_gga[xc]} + vasp_input_set._config_dict["INCAR"].pop("METAGGA", None) + else: + raise ValueError(f"Unknown XC functional {xc_functional}!") + + # Update the van der Waals parameters + if vdw == "rvv10": + rvv10_params_by_xc = { + "scan": {"BPARAM": 15.7, "CPARAM": 0.0093, "LUSE_VDW": True}, + "r2scan": {"BPARAM": 11.95, "CPARAM": 0.0093, "LUSE_VDW": True}, + } + try: + config_updates |= rvv10_params_by_xc[xc] + except KeyError: + raise ValueError( + "Use of rVV10 with functionals other than r2SCAN / SCAN is not currently supported in VASP." + ) + + elif vdw == "d4": + d4_pars = { + "r2scan": {"S6": 1.0, "S8": 0.60187490, "A1": 0.51559235, "A2": 5.77342911}, + "pbe": {"S6": 1.0, "S8": 0.95948085, "A1": 0.38574991, "A2": 4.80688534}, + "pbesol": {"S6": 1.0, "S8": 1.71885698, "A1": 0.47901421, "A2": 5.96771589}, + } + if xc not in d4_pars: + raise ValueError(f"D4 parameters for XC functional '{xc_functional}' are not defined yet.") + pars = d4_pars[xc] + config_updates |= {"IVDW": 13, **{f"VDW_{k}": v for k, v in pars.items()}} + + elif vdw and vdw != "rvv10": + if xc == "scan": + warnings.warn( + "Use of van der Waals functionals other than rVV10 with SCAN is not supported at this time.", + stacklevel=2, + ) + + if len(config_updates) > 0: + vasp_input_set._config_dict["INCAR"].update(config_updates) + + @due.dcite( Doi("10.1021/acs.jpclett.0c02405"), description="Accurate and Numerically Efficient r2SCAN Meta-Generalized Gradient Approximation", From 83fcf447da22e28a8e9a249166644c4fea7a907b Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Tue, 7 Oct 2025 20:49:34 -0500 Subject: [PATCH 03/18] Refactor MPScanRelaxSet to include xc_functional and dispersion parameters; streamline vdw handling with _config_updates function. --- src/pymatgen/io/vasp/sets.py | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/pymatgen/io/vasp/sets.py b/src/pymatgen/io/vasp/sets.py index 1e1fa612ada..0f7be89fa80 100644 --- a/src/pymatgen/io/vasp/sets.py +++ b/src/pymatgen/io/vasp/sets.py @@ -1440,6 +1440,8 @@ class MPScanRelaxSet(VaspInputSet): Phys. Rev. B 106, 075422 (2022) DOI: 10.1103/PhysRevB.106.075422 """ + xc_functional: Literal["r2SCAN", "SCAN"] = "r2SCAN" + dispersion: str | None = None bandgap: float | None = None auto_kspacing: bool = True user_potcar_functional: UserPotcarFunctional = "PBE_54" @@ -1449,20 +1451,7 @@ class MPScanRelaxSet(VaspInputSet): def __post_init__(self) -> None: super().__post_init__() - if self.vdw and self.vdw != "rvv10": - warnings.warn( - "Use of van der waals functionals other than rVV10 with SCAN is not supported at this time. ", - stacklevel=2, - ) - # Delete any vdw parameters that may have been added to the INCAR - vdw_par = loadfn(f"{MODULE_DIR}/vdW_parameters.yaml") - for k in vdw_par[self.vdw]: - self._config_dict["INCAR"].pop(k, None) - - elif self.vdw == "rvv10": - if self._config_dict["INCAR"]["METAGGA"] == "R2SCAN" and self.user_incar_settings.get("METAGGA") is None: - rVV10_r2scan = {"BPARAM": 11.95} - self._config_dict["INCAR"].update(rVV10_r2scan) + _config_updates(self, self.xc_functional, self.dispersion) @dataclass From eb71a2362b7acc89456f187366af72d64f53fabf Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Tue, 7 Oct 2025 21:05:27 -0500 Subject: [PATCH 04/18] Update MPScanRelaxSet to clarify xc_functional and dispersion parameters in docstring --- src/pymatgen/io/vasp/sets.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/pymatgen/io/vasp/sets.py b/src/pymatgen/io/vasp/sets.py index 0f7be89fa80..db6a838e831 100644 --- a/src/pymatgen/io/vasp/sets.py +++ b/src/pymatgen/io/vasp/sets.py @@ -1387,13 +1387,13 @@ def _config_updates( class MPScanRelaxSet(VaspInputSet): """Write a relaxation input set using the accurate and numerically efficient r2SCAN variant of the Strongly Constrained and Appropriately Normed - (SCAN) metaGGA density functional. + (SCAN) meta-GGA density functional. Notes: 1. This functional is officially supported in VASP 6.0.0 and above. On older version, source code may be obtained by contacting the authors of the referenced manuscript. The original SCAN functional, available from VASP 5.4.3 onwards, maybe used instead - by passing `user_incar_settings={"METAGGA": "SCAN"}` when instantiating this InputSet. + by passing `xc_functional="SCAN"` when instantiating this InputSet. r2SCAN and SCAN are expected to yield very similar results. 2. Meta-GGA calculations require POTCAR files that include @@ -1418,10 +1418,12 @@ class MPScanRelaxSet(VaspInputSet): and Mueller [1] (see References). Note that if 'user_incar_settings' or 'user_kpoints_settings' override KSPACING, the calculation from bandgap is not performed. - vdw (str): set "rVV10" to enable SCAN+rVV10, which is a versatile - van der Waals density functional by combing the SCAN functional - with the rVV10 non-local correlation functional. rvv10 is the only - dispersion correction available for SCAN at this time. + xc_functional (str): set "r2SCAN" (default) or "SCAN" to choose the meta-GGA + exchange-correlation functional. + dispersion (str | None): set "rVV10" (default None) to enable r2SCAN+rVV10 or + SCAN+rVV10, which is a versatile van der Waals density functional by combing + the r2SCAN/SCAN functional with the rVV10 non-local correlation functional. + rVV10 is the only dispersion correction available for SCAN at this time. **kwargs: Keywords supported by VaspInputSet. References: From d41b5012773e1fe3a248b7d1879b71259289f16a Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Tue, 7 Oct 2025 21:21:44 -0500 Subject: [PATCH 05/18] Refactor MP24RelaxSet to streamline XC functional and dispersion handling with _config_updates function --- src/pymatgen/io/vasp/sets.py | 51 +----------------------------------- 1 file changed, 1 insertion(+), 50 deletions(-) diff --git a/src/pymatgen/io/vasp/sets.py b/src/pymatgen/io/vasp/sets.py index db6a838e831..43468e52670 100644 --- a/src/pymatgen/io/vasp/sets.py +++ b/src/pymatgen/io/vasp/sets.py @@ -1505,56 +1505,7 @@ class MP24RelaxSet(VaspInputSet): def __post_init__(self) -> None: super().__post_init__() - - to_func = { - "r2SCAN": "R2SCAN", - "PBE": "PE", - "PBEsol": "PS", - } - - config_updates: dict[str, Any] = {} - if self.xc_functional == "r2SCAN": - config_updates |= {"METAGGA": to_func[self.xc_functional]} - self._config_dict["INCAR"].pop("GGA", None) - elif self.xc_functional in ["PBE", "PBEsol"]: - config_updates |= {"GGA": to_func[self.xc_functional]} - self._config_dict["INCAR"].pop("METAGGA", None) - else: - raise ValueError(f"Unknown XC functional {self.xc_functional}!") - - if self.dispersion == "rVV10": - if self.xc_functional == "r2SCAN": - config_updates |= {"BPARAM": 11.95, "CPARAM": 0.0093, "LUSE_VDW": True} - else: - raise ValueError( - "Use of rVV10 with functionals other than r2 / SCAN is not currently supported in VASP." - ) - - elif self.dispersion == "D4": - d4_pars = { - "r2SCAN": { - "S6": 1.0, - "S8": 0.60187490, - "A1": 0.51559235, - "A2": 5.77342911, - }, - "PBE": { - "S6": 1.0, - "S8": 0.95948085, - "A1": 0.38574991, - "A2": 4.80688534, - }, - "PBEsol": { - "S6": 1.0, - "S8": 1.71885698, - "A1": 0.47901421, - "A2": 5.96771589, - }, - } - config_updates |= {"IVDW": 13, **{f"VDW_{k}": v for k, v in d4_pars[self.xc_functional].items()}} - - if len(config_updates) > 0: - self._config_dict["INCAR"].update(config_updates) + _config_updates(self, self.xc_functional, self.dispersion) @staticmethod def _sigmoid_interp( From 251f2b9586723181b6d183a1d58b8caf0bbac056 Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Tue, 7 Oct 2025 22:24:09 -0500 Subject: [PATCH 06/18] Update MPScanRelaxSet docstring and enforce rVV10 (or no) dispersion correction validation --- src/pymatgen/io/vasp/sets.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/pymatgen/io/vasp/sets.py b/src/pymatgen/io/vasp/sets.py index 43468e52670..da54c503b39 100644 --- a/src/pymatgen/io/vasp/sets.py +++ b/src/pymatgen/io/vasp/sets.py @@ -1423,7 +1423,7 @@ class MPScanRelaxSet(VaspInputSet): dispersion (str | None): set "rVV10" (default None) to enable r2SCAN+rVV10 or SCAN+rVV10, which is a versatile van der Waals density functional by combing the r2SCAN/SCAN functional with the rVV10 non-local correlation functional. - rVV10 is the only dispersion correction available for SCAN at this time. + rVV10 is the only dispersion correction available for r2SCAN and SCAN in MPScanRelaxSet class. **kwargs: Keywords supported by VaspInputSet. References: @@ -1443,7 +1443,7 @@ class MPScanRelaxSet(VaspInputSet): """ xc_functional: Literal["r2SCAN", "SCAN"] = "r2SCAN" - dispersion: str | None = None + dispersion: Literal["rVV10"] | None = None bandgap: float | None = None auto_kspacing: bool = True user_potcar_functional: UserPotcarFunctional = "PBE_54" @@ -1453,6 +1453,8 @@ class MPScanRelaxSet(VaspInputSet): def __post_init__(self) -> None: super().__post_init__() + if isinstance(self.dispersion, str) and self.dispersion.lower() != "rvv10": + raise ValueError("Only rVV10 (or None) is supported for dispersion in MPScanRelaxSet.") _config_updates(self, self.xc_functional, self.dispersion) From 384283348eb22db91f634f3e463d66e2dd8ecee1 Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Tue, 7 Oct 2025 22:32:36 -0500 Subject: [PATCH 07/18] Update warning for unsupported dispersion corrections in _config_updates function --- src/pymatgen/io/vasp/sets.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/pymatgen/io/vasp/sets.py b/src/pymatgen/io/vasp/sets.py index da54c503b39..58f7ecd96f9 100644 --- a/src/pymatgen/io/vasp/sets.py +++ b/src/pymatgen/io/vasp/sets.py @@ -1360,12 +1360,11 @@ def _config_updates( pars = d4_pars[xc] config_updates |= {"IVDW": 13, **{f"VDW_{k}": v for k, v in pars.items()}} - elif vdw and vdw != "rvv10": - if xc == "scan": - warnings.warn( - "Use of van der Waals functionals other than rVV10 with SCAN is not supported at this time.", - stacklevel=2, - ) + elif isinstance(vdw, str): + warnings.warn( + f"Dispersion correction '{dispersion}' with {xc} is not supported in this class and will be ignored.", + stacklevel=2, + ) if len(config_updates) > 0: vasp_input_set._config_dict["INCAR"].update(config_updates) From 0660d76b1345d5711b75b7b6a434f6fc4092fec1 Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Tue, 7 Oct 2025 22:48:42 -0500 Subject: [PATCH 08/18] Add validation for xc_functional in MP24RelaxSet to enforce allowed XC functionals --- src/pymatgen/io/vasp/sets.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pymatgen/io/vasp/sets.py b/src/pymatgen/io/vasp/sets.py index 58f7ecd96f9..3e1bc09d091 100644 --- a/src/pymatgen/io/vasp/sets.py +++ b/src/pymatgen/io/vasp/sets.py @@ -1506,6 +1506,8 @@ class MP24RelaxSet(VaspInputSet): def __post_init__(self) -> None: super().__post_init__() + if self.xc_functional.lower() not in {"r2scan", "pbe", "pbesol"}: + raise ValueError("xc_functional must be one of 'r2SCAN', 'PBE', or 'PBEsol'.") _config_updates(self, self.xc_functional, self.dispersion) @staticmethod From d23d9eaaaab80ecc4f0ac5d6d96c38eb440c573e Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Tue, 7 Oct 2025 22:53:12 -0500 Subject: [PATCH 09/18] Add tests for disallowed xc_functional in MP24Sets to ensure proper validation --- tests/io/vasp/test_sets.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/io/vasp/test_sets.py b/tests/io/vasp/test_sets.py index f10a5394b01..be20322ddb3 100644 --- a/tests/io/vasp/test_sets.py +++ b/tests/io/vasp/test_sets.py @@ -2396,3 +2396,9 @@ def test_non_default_xc_func(self): "VDW_S8", ) ) + + def test_not_allowed_xc_func(self): + with pytest.raises(ValueError, match="xc_functional must be one of"): + self.relax_set(structure=self.structure, xc_functional="SCAN") + with pytest.raises(ValueError, match="xc_functional must be one of"): + self.static_set(structure=self.structure, xc_functional="SCAN", dispersion="rVV10") From dabe7fe8df5714601e6ac31fda16b147ed894c7c Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Tue, 7 Oct 2025 23:12:51 -0500 Subject: [PATCH 10/18] Update uv.lock to add version markers for dependencies based on Python version compatibility --- uv.lock | 240 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 120 insertions(+), 120 deletions(-) diff --git a/uv.lock b/uv.lock index 3bb9fd32bf7..e1f50609689 100644 --- a/uv.lock +++ b/uv.lock @@ -34,14 +34,14 @@ name = "aiohttp" version = "3.12.15" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aiohappyeyeballs" }, - { name = "aiosignal" }, + { name = "aiohappyeyeballs", marker = "python_full_version < '3.14'" }, + { name = "aiosignal", marker = "python_full_version < '3.14'" }, { name = "async-timeout", marker = "python_full_version < '3.11'" }, - { name = "attrs" }, - { name = "frozenlist" }, - { name = "multidict" }, - { name = "propcache" }, - { name = "yarl" }, + { name = "attrs", marker = "python_full_version < '3.14'" }, + { name = "frozenlist", marker = "python_full_version < '3.14'" }, + { name = "multidict", marker = "python_full_version < '3.14'" }, + { name = "propcache", marker = "python_full_version < '3.14'" }, + { name = "yarl", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9b/e7/d92a237d8802ca88483906c388f7c201bbe96cd80a165ffd0ac2f6a8d59f/aiohttp-3.12.15.tar.gz", hash = "sha256:4fc61385e9c98d72fcdf47e6dd81833f47b2f77c114c29cd64a361be57a763a2", size = 7823716, upload-time = "2025-07-29T05:52:32.215Z" } wheels = [ @@ -120,7 +120,7 @@ name = "aiosignal" version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "frozenlist" }, + { name = "frozenlist", marker = "python_full_version < '3.14'" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } @@ -380,9 +380,9 @@ name = "boto3" version = "1.40.17" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "botocore" }, - { name = "jmespath" }, - { name = "s3transfer" }, + { name = "botocore", marker = "python_full_version < '3.14'" }, + { name = "jmespath", marker = "python_full_version < '3.14'" }, + { name = "s3transfer", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/71/b1/0f91a07dc87485a791f2d31df1c2dc75dc5d302fbf002e5446ffa04e8e32/boto3-1.40.17.tar.gz", hash = "sha256:e115dc87d5975d32dfa0ebaf19c39e360665317a350004fa94b03200fe853f2e", size = 112054, upload-time = "2025-08-25T19:37:21.291Z" } wheels = [ @@ -394,9 +394,9 @@ name = "botocore" version = "1.40.17" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "jmespath" }, - { name = "python-dateutil" }, - { name = "urllib3" }, + { name = "jmespath", marker = "python_full_version < '3.14'" }, + { name = "python-dateutil", marker = "python_full_version < '3.14'" }, + { name = "urllib3", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/55/87/92b520e7f4ac2a64c6e68bedc1dc3c1335a5aa1efb89a4247b45e34e40ac/botocore-1.40.17.tar.gz", hash = "sha256:769cd04a6a612f2d48b5f456c676fd81733fab682870952f7e2887260ea6a2bc", size = 14375996, upload-time = "2025-08-25T19:37:11.692Z" } wheels = [ @@ -927,14 +927,14 @@ version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform == 'win32')" }, - { name = "networkx", version = "3.5", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, - { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "psutil", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "networkx", version = "3.5", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform == 'linux') or (python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform == 'win32')" }, + { name = "numpy", marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux') or (python_full_version < '3.14' and sys_platform == 'win32')" }, + { name = "psutil", marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux') or (python_full_version < '3.14' and sys_platform == 'win32')" }, + { name = "requests", marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux') or (python_full_version < '3.14' and sys_platform == 'win32')" }, { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform == 'win32')" }, - { name = "scipy", version = "1.16.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, - { name = "torchdata", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "scipy", version = "1.16.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform == 'linux') or (python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform == 'win32')" }, + { name = "torchdata", marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux') or (python_full_version < '3.14' and sys_platform == 'win32')" }, + { name = "tqdm", marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux') or (python_full_version < '3.14' and sys_platform == 'win32')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/09/2d/c0a40c0d78a8e9c0c43e7f6e4aebebb39c8bf0f80380db2c1f1ba9f3bdfa/dgl-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ff74c7119cb1e87c1b06293eba8c22725594517062e74659b1a8636134b16974", size = 6889468, upload-time = "2024-03-05T07:16:21.004Z" }, @@ -1194,7 +1194,7 @@ wheels = [ [package.optional-dependencies] http = [ - { name = "aiohttp" }, + { name = "aiohttp", marker = "python_full_version < '3.14'" }, ] [[package]] @@ -1933,15 +1933,15 @@ name = "lightning" version = "2.5.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "fsspec", extra = ["http"] }, - { name = "lightning-utilities" }, - { name = "packaging" }, - { name = "pytorch-lightning" }, - { name = "pyyaml" }, - { name = "torch" }, - { name = "torchmetrics" }, - { name = "tqdm" }, - { name = "typing-extensions" }, + { name = "fsspec", extra = ["http"], marker = "python_full_version < '3.14'" }, + { name = "lightning-utilities", marker = "python_full_version < '3.14'" }, + { name = "packaging", marker = "python_full_version < '3.14'" }, + { name = "pytorch-lightning", marker = "python_full_version < '3.14'" }, + { name = "pyyaml", marker = "python_full_version < '3.14'" }, + { name = "torch", marker = "python_full_version < '3.14'" }, + { name = "torchmetrics", marker = "python_full_version < '3.14'" }, + { name = "tqdm", marker = "python_full_version < '3.14'" }, + { name = "typing-extensions", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/01/80/dddb5a382aa0ff18045aee6491f81e40371102cb05da2ad5a8436a51c475/lightning-2.5.3.tar.gz", hash = "sha256:4ed3e12369a1e0f928beecf5c9f5efdabda60a9216057954851e2d89f1abecde", size = 636577, upload-time = "2025-08-13T20:29:32.361Z" } wheels = [ @@ -1953,9 +1953,9 @@ name = "lightning-utilities" version = "0.15.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "packaging" }, - { name = "setuptools" }, - { name = "typing-extensions" }, + { name = "packaging", marker = "python_full_version < '3.14'" }, + { name = "setuptools", marker = "python_full_version < '3.14'" }, + { name = "typing-extensions", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b8/39/6fc58ca81492db047149b4b8fd385aa1bfb8c28cd7cacb0c7eb0c44d842f/lightning_utilities-0.15.2.tar.gz", hash = "sha256:cdf12f530214a63dacefd713f180d1ecf5d165338101617b4742e8f22c032e24", size = 31090, upload-time = "2025-08-06T13:57:39.242Z" } wheels = [ @@ -2155,14 +2155,14 @@ name = "matcalc" version = "0.4.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ase" }, - { name = "fsspec" }, - { name = "joblib" }, - { name = "numpy" }, - { name = "phono3py" }, - { name = "phonopy" }, - { name = "pymatgen" }, - { name = "scikit-learn" }, + { name = "ase", marker = "python_full_version < '3.14'" }, + { name = "fsspec", marker = "python_full_version < '3.14'" }, + { name = "joblib", marker = "python_full_version < '3.14'" }, + { name = "numpy", marker = "python_full_version < '3.14'" }, + { name = "phono3py", marker = "python_full_version < '3.14'" }, + { name = "phonopy", marker = "python_full_version < '3.14'" }, + { name = "pymatgen", marker = "python_full_version < '3.14'" }, + { name = "scikit-learn", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/62/6d/3d850fd270c2772113ef250361ba10c8d49b3b686a21bd7e10729c695486/matcalc-0.4.3.tar.gz", hash = "sha256:976eca0b463bdbda142a4b937b84b1f09897589af51cc376375b3a05c6b104cc", size = 553801, upload-time = "2025-08-22T16:06:07.29Z" } @@ -2171,16 +2171,16 @@ name = "matgl" version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ase" }, - { name = "boto3" }, - { name = "dgl", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "lightning" }, - { name = "numpy" }, - { name = "pydantic" }, - { name = "pymatgen" }, - { name = "torch" }, - { name = "torch-geometric" }, - { name = "torchdata" }, + { name = "ase", marker = "python_full_version < '3.14'" }, + { name = "boto3", marker = "python_full_version < '3.14'" }, + { name = "dgl", marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux') or (python_full_version < '3.14' and sys_platform == 'win32')" }, + { name = "lightning", marker = "python_full_version < '3.14'" }, + { name = "numpy", marker = "python_full_version < '3.14'" }, + { name = "pydantic", marker = "python_full_version < '3.14'" }, + { name = "pymatgen", marker = "python_full_version < '3.14'" }, + { name = "torch", marker = "python_full_version < '3.14'" }, + { name = "torch-geometric", marker = "python_full_version < '3.14'" }, + { name = "torchdata", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a7/62/26d8ab06efb44b7a0b9a890fe37b33a984e5ecb4c1dbc0fa2a33a8427c51/matgl-1.3.0.tar.gz", hash = "sha256:33c68675d2bd9b9ee7deb2d0b92189cb5221775eb296af6425e04d04d4cf5ddc", size = 230463, upload-time = "2025-08-12T16:19:47.287Z" } wheels = [ @@ -2768,7 +2768,7 @@ name = "nvidia-cudnn-cu12" version = "8.9.2.26" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cublas-cu12", marker = "python_full_version < '3.14' and sys_platform == 'linux'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/ff/74/a2e2be7fb83aaedec84f391f082cf765dfb635e7caa9b49065f73e4835d8/nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9", size = 731725872, upload-time = "2023-06-01T19:24:57.328Z" }, @@ -2795,9 +2795,9 @@ name = "nvidia-cusolver-cu12" version = "11.4.5.107" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", marker = "sys_platform == 'linux'" }, - { name = "nvidia-cusparse-cu12", marker = "sys_platform == 'linux'" }, - { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cublas-cu12", marker = "python_full_version < '3.14' and sys_platform == 'linux'" }, + { name = "nvidia-cusparse-cu12", marker = "python_full_version < '3.14' and sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "python_full_version < '3.14' and sys_platform == 'linux'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/bc/1d/8de1e5c67099015c834315e333911273a8c6aaba78923dd1d1e25fc5f217/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd", size = 124161928, upload-time = "2023-04-19T15:51:25.781Z" }, @@ -2808,7 +2808,7 @@ name = "nvidia-cusparse-cu12" version = "12.1.0.106" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "python_full_version < '3.14' and sys_platform == 'linux'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c", size = 195958278, upload-time = "2023-04-19T15:51:49.939Z" }, @@ -3034,14 +3034,14 @@ name = "phono3py" version = "3.19.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "h5py" }, - { name = "matplotlib" }, - { name = "numpy" }, - { name = "phonopy" }, - { name = "pyyaml" }, + { name = "h5py", marker = "python_full_version < '3.14'" }, + { name = "matplotlib", marker = "python_full_version < '3.14'" }, + { name = "numpy", marker = "python_full_version < '3.14'" }, + { name = "phonopy", marker = "python_full_version < '3.14'" }, + { name = "pyyaml", marker = "python_full_version < '3.14'" }, { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.16.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "spglib" }, + { name = "scipy", version = "1.16.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "spglib", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/78/b7/01e6fbc2c8047e0b81605b6d9ad2e7147182923a050a4aa2fa02a8db9591/phono3py-3.19.2.tar.gz", hash = "sha256:ad038857ad7f3cd10991088fdf0faff4c9f86b28c5596d8bd06ccef227904bd1", size = 10485907, upload-time = "2025-08-10T02:12:05.652Z" } wheels = [ @@ -3409,10 +3409,10 @@ name = "pydantic" version = "2.11.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "annotated-types" }, - { name = "pydantic-core" }, - { name = "typing-extensions" }, - { name = "typing-inspection" }, + { name = "annotated-types", marker = "python_full_version < '3.14'" }, + { name = "pydantic-core", marker = "python_full_version < '3.14'" }, + { name = "typing-extensions", marker = "python_full_version < '3.14'" }, + { name = "typing-inspection", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload-time = "2025-06-14T08:33:17.137Z" } wheels = [ @@ -3424,7 +3424,7 @@ name = "pydantic-core" version = "2.33.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions" }, + { name = "typing-extensions", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } wheels = [ @@ -3517,7 +3517,7 @@ wheels = [ [[package]] name = "pymatgen" -version = "2025.6.14" +version = "2025.10.7" source = { editable = "." } dependencies = [ { name = "bibtexparser" }, @@ -3815,14 +3815,14 @@ name = "pytorch-lightning" version = "2.5.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "fsspec", extra = ["http"] }, - { name = "lightning-utilities" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "torch" }, - { name = "torchmetrics" }, - { name = "tqdm" }, - { name = "typing-extensions" }, + { name = "fsspec", extra = ["http"], marker = "python_full_version < '3.14'" }, + { name = "lightning-utilities", marker = "python_full_version < '3.14'" }, + { name = "packaging", marker = "python_full_version < '3.14'" }, + { name = "pyyaml", marker = "python_full_version < '3.14'" }, + { name = "torch", marker = "python_full_version < '3.14'" }, + { name = "torchmetrics", marker = "python_full_version < '3.14'" }, + { name = "tqdm", marker = "python_full_version < '3.14'" }, + { name = "typing-extensions", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/32/a8/31fe79bf96dab33cee5537ed6f08230ed6f032834bb4ff529cc487fb40e8/pytorch_lightning-2.5.3.tar.gz", hash = "sha256:65f4eee774ee1adba181aacacffb9f677fe5c5f9fd3d01a95f603403f940be6a", size = 639897, upload-time = "2025-08-13T20:29:39.161Z" } wheels = [ @@ -4335,7 +4335,7 @@ name = "s3transfer" version = "0.13.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "botocore" }, + { name = "botocore", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6d/05/d52bf1e65044b4e5e27d4e63e8d1579dbdec54fce685908ae09bc3720030/s3transfer-0.13.1.tar.gz", hash = "sha256:c3fdba22ba1bd367922f27ec8032d6a1cf5f10c934fb5d68cf60fd5a23d936cf", size = 150589, upload-time = "2025-07-18T19:22:42.31Z" } wheels = [ @@ -4901,8 +4901,8 @@ name = "tblite" version = "0.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi", marker = "sys_platform != 'win32'" }, - { name = "numpy", marker = "sys_platform != 'win32'" }, + { name = "cffi", marker = "python_full_version < '3.12' and sys_platform == 'linux'" }, + { name = "numpy", marker = "python_full_version < '3.12' and sys_platform == 'linux'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/18/b4/887888d2aae253196c18ca10a75dd40330fc6b6c3567b70d57b7776d3eac/tblite-0.5.0.tar.gz", hash = "sha256:5dae9e7f559a2602c361acf3817c987501f5b13eaf2072b5f81bb8ae071fc7cb", size = 861998, upload-time = "2025-07-30T11:57:11.619Z" } wheels = [ @@ -4916,7 +4916,7 @@ wheels = [ [package.optional-dependencies] ase = [ - { name = "ase", marker = "sys_platform != 'win32'" }, + { name = "ase", marker = "python_full_version < '3.12' and sys_platform == 'linux'" }, ] [[package]] @@ -5016,25 +5016,25 @@ name = "torch" version = "2.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock" }, - { name = "fsspec" }, - { name = "jinja2" }, + { name = "filelock", marker = "python_full_version < '3.14'" }, + { name = "fsspec", marker = "python_full_version < '3.14'" }, + { name = "jinja2", marker = "python_full_version < '3.14'" }, { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "networkx", version = "3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "sympy" }, - { name = "triton", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "typing-extensions" }, + { name = "networkx", version = "3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and python_full_version < '3.14'" }, + { name = "nvidia-cublas-cu12", marker = "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-cupti-cu12", marker = "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-runtime-cu12", marker = "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cudnn-cu12", marker = "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cufft-cu12", marker = "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-curand-cu12", marker = "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusolver-cu12", marker = "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusparse-cu12", marker = "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nccl-cu12", marker = "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nvtx-cu12", marker = "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "sympy", marker = "python_full_version < '3.14'" }, + { name = "triton", marker = "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "python_full_version < '3.14'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/8c/67/fcc9b9e2369a9bae4da492aedc0c2dfa95d563ef0eaa9228b70c98395ec2/torch-2.2.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:d366158d6503a3447e67f8c0ad1328d54e6c181d88572d688a625fac61b13a97", size = 755505538, upload-time = "2024-01-30T17:30:06.596Z" }, @@ -5059,14 +5059,14 @@ name = "torch-geometric" version = "2.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aiohttp" }, - { name = "fsspec" }, - { name = "jinja2" }, - { name = "numpy" }, - { name = "psutil" }, - { name = "pyparsing" }, - { name = "requests" }, - { name = "tqdm" }, + { name = "aiohttp", marker = "python_full_version < '3.14'" }, + { name = "fsspec", marker = "python_full_version < '3.14'" }, + { name = "jinja2", marker = "python_full_version < '3.14'" }, + { name = "numpy", marker = "python_full_version < '3.14'" }, + { name = "psutil", marker = "python_full_version < '3.14'" }, + { name = "pyparsing", marker = "python_full_version < '3.14'" }, + { name = "requests", marker = "python_full_version < '3.14'" }, + { name = "tqdm", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e8/81/e1b015494cb9e0bf4c47cc8426e49736120248733be0e22072a5628ae9ed/torch_geometric-2.6.1.tar.gz", hash = "sha256:1f18f9d0fc4d2239d526221e4f22606a4a3895b5d965a9856d27610a3df662c6", size = 771490, upload-time = "2024-09-26T08:11:30.25Z" } wheels = [ @@ -5078,9 +5078,9 @@ name = "torchdata" version = "0.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "requests" }, - { name = "torch" }, - { name = "urllib3" }, + { name = "requests", marker = "python_full_version < '3.14'" }, + { name = "torch", marker = "python_full_version < '3.14'" }, + { name = "urllib3", marker = "python_full_version < '3.14'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/d0/97/6f8f2384d9efb2d1bb6966b5300852d704f4943656360e9352e3cc3358b8/torchdata-0.7.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:042db39edbc961c50a36c45b89aea4b099858140c13746c7cc7a87b1cc219d0c", size = 1801802, upload-time = "2023-11-15T17:09:19.271Z" }, @@ -5099,10 +5099,10 @@ name = "torchmetrics" version = "1.8.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "lightning-utilities" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "torch" }, + { name = "lightning-utilities", marker = "python_full_version < '3.14'" }, + { name = "numpy", marker = "python_full_version < '3.14'" }, + { name = "packaging", marker = "python_full_version < '3.14'" }, + { name = "torch", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/78/1f/2cd9eb8f3390c3ec4693ac0871913d4b468964b3833638e4091a70817e0a/torchmetrics-1.8.1.tar.gz", hash = "sha256:04ca021105871637c5d34d0a286b3ab665a1e3d2b395e561f14188a96e862fdb", size = 580373, upload-time = "2025-08-07T20:44:44.631Z" } wheels = [ @@ -5169,7 +5169,7 @@ name = "triton" version = "2.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock", marker = "sys_platform == 'linux'" }, + { name = "filelock", marker = "python_full_version < '3.14' and sys_platform == 'linux'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/95/05/ed974ce87fe8c8843855daa2136b3409ee1c126707ab54a8b72815c08b49/triton-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2294514340cfe4e8f4f9e5c66c702744c4a117d25e618bd08469d0bfed1e2e5", size = 167900779, upload-time = "2024-01-10T03:11:56.576Z" }, @@ -5200,7 +5200,7 @@ name = "typing-inspection" version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions" }, + { name = "typing-extensions", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" } wheels = [ @@ -5374,9 +5374,9 @@ name = "yarl" version = "1.20.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "idna" }, - { name = "multidict" }, - { name = "propcache" }, + { name = "idna", marker = "python_full_version < '3.14'" }, + { name = "multidict", marker = "python_full_version < '3.14'" }, + { name = "propcache", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3c/fb/efaa23fa4e45537b827620f04cf8f3cd658b76642205162e072703a5b963/yarl-1.20.1.tar.gz", hash = "sha256:d017a4997ee50c91fd5466cef416231bb82177b93b029906cefc542ce14c35ac", size = 186428, upload-time = "2025-06-10T00:46:09.923Z" } wheels = [ From 035eab579df27ac42950b9d191ca3192627bc9bb Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Tue, 7 Oct 2025 23:17:35 -0500 Subject: [PATCH 11/18] Refactor MPScanRelaxSet tests to use xc_functional parameter and improve dispersion handling --- tests/io/vasp/test_sets.py | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/tests/io/vasp/test_sets.py b/tests/io/vasp/test_sets.py index be20322ddb3..8567677c5be 100644 --- a/tests/io/vasp/test_sets.py +++ b/tests/io/vasp/test_sets.py @@ -1830,7 +1830,7 @@ def test_scan_substitute(self): mp_scan_sub = MPScanRelaxSet( self.struct, user_potcar_functional="PBE_52", - user_incar_settings={"METAGGA": "SCAN"}, + xc_functional="SCAN", ) incar = mp_scan_sub.incar assert incar["METAGGA"] == "Scan" @@ -1873,18 +1873,31 @@ def test_incar_overrides(self): assert incar["SIGMA"] == approx(0.05) # Test SCAN+rVV10 - def test_rvv10(self): - scan_rvv10_set = MPScanRelaxSet(self.struct, vdw="rVV10") + def test_scan_rvv10(self): + scan_rvv10_set = MPScanRelaxSet(self.struct, xc_functional="SCAN", dispersion="rVV10") + assert scan_rvv10_set.xc_functional == "SCAN" + assert scan_rvv10_set.dispersion == "rVV10" assert "LUSE_VDW" in scan_rvv10_set.incar assert scan_rvv10_set.incar["BPARAM"] == approx(15.7) + assert scan_rvv10_set.incar["CPARAM"] == approx(0.0093) + + # Test r2SCAN+rVV10 + def test_r2scan_rvv10(self): + r2scan_rvv10_set = MPScanRelaxSet(self.struct, dispersion="rVV10") + assert r2scan_rvv10_set.xc_functional == "r2SCAN" + assert r2scan_rvv10_set.dispersion == "rVV10" + assert "LUSE_VDW" in r2scan_rvv10_set.incar + assert r2scan_rvv10_set.incar["BPARAM"] == approx(11.95) + assert r2scan_rvv10_set.incar["CPARAM"] == approx(0.0093) def test_other_vdw(self): - # should raise a warning. + # should raise a error. # IVDW key should not be present in the incar - with pytest.warns(UserWarning, match=r"not supported at this time"): - scan_vdw_set = MPScanRelaxSet(self.struct, vdw="DFTD3") - assert "LUSE_VDW" not in scan_vdw_set.incar - assert "IVDW" not in scan_vdw_set.incar + with pytest.raises( + ValueError, + match=r"Only rVV10 \(or None\) is supported", + ): + MPScanRelaxSet(self.struct, dispersion="DFTD3") @skip_if_no_psp_dir def test_potcar(self): From 3b0d193f8ffd3483822923410fbde8b33355a978 Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Thu, 13 Nov 2025 15:59:54 -0600 Subject: [PATCH 12/18] Enhance van der Waals parameter configuration for SCAN and r2SCAN methods by adding IVDW_NL and LASPH settings. --- src/pymatgen/io/vasp/sets.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pymatgen/io/vasp/sets.py b/src/pymatgen/io/vasp/sets.py index a088cfdcf73..22bb56184d5 100644 --- a/src/pymatgen/io/vasp/sets.py +++ b/src/pymatgen/io/vasp/sets.py @@ -1339,8 +1339,8 @@ def _config_updates( # Update the van der Waals parameters if vdw == "rvv10": rvv10_params_by_xc = { - "scan": {"BPARAM": 15.7, "CPARAM": 0.0093, "LUSE_VDW": True}, - "r2scan": {"BPARAM": 11.95, "CPARAM": 0.0093, "LUSE_VDW": True}, + "scan": {"BPARAM": 15.7, "CPARAM": 0.0093, "LUSE_VDW": True, "IVDW_NL": 2, "LASPH": True}, + "r2scan": {"BPARAM": 11.95, "CPARAM": 0.0093, "LUSE_VDW": True, "IVDW_NL": 2, "LASPH": True}, } try: config_updates |= rvv10_params_by_xc[xc] From e7447124cff3f37e777f852514cf8f9f46fadb86 Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Thu, 13 Nov 2025 17:03:32 -0600 Subject: [PATCH 13/18] Add rVV10 parameters for PBE functional and update corresponding warnings. --- src/pymatgen/io/vasp/sets.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/pymatgen/io/vasp/sets.py b/src/pymatgen/io/vasp/sets.py index 22bb56184d5..1b1cc4e36dc 100644 --- a/src/pymatgen/io/vasp/sets.py +++ b/src/pymatgen/io/vasp/sets.py @@ -1341,13 +1341,16 @@ def _config_updates( rvv10_params_by_xc = { "scan": {"BPARAM": 15.7, "CPARAM": 0.0093, "LUSE_VDW": True, "IVDW_NL": 2, "LASPH": True}, "r2scan": {"BPARAM": 11.95, "CPARAM": 0.0093, "LUSE_VDW": True, "IVDW_NL": 2, "LASPH": True}, + "pbe": {"BPARAM": 10, "CPARAM": 0.0093, "LUSE_VDW": True, "IVDW_NL": 2, "LASPH": True}, } - try: - config_updates |= rvv10_params_by_xc[xc] - except KeyError: - raise ValueError( - "Use of rVV10 with functionals other than r2SCAN / SCAN is not currently supported in VASP." + config_updates |= rvv10_params_by_xc[xc] + + if xc == "pbe": + warnings.warn( + "Use of rVV10L with PBE is recommended for layered materials using VASP 6.4.0 and above.", stacklevel=2 ) + elif xc not in rvv10_params_by_xc: + raise ValueError(f"rVV10 parameters for XC functional '{xc_functional}' are not defined yet.") elif vdw == "d4": d4_pars = { From 5443e49174d9fc1b32f3f898a9c7cde22ac6a359 Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Thu, 13 Nov 2025 18:21:34 -0600 Subject: [PATCH 14/18] Clean up existing van der Waals parameters in INCAR to prevent conflicts with XC functional and dispersion settings --- src/pymatgen/io/vasp/sets.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/pymatgen/io/vasp/sets.py b/src/pymatgen/io/vasp/sets.py index 1b1cc4e36dc..87dd7d69e7b 100644 --- a/src/pymatgen/io/vasp/sets.py +++ b/src/pymatgen/io/vasp/sets.py @@ -1326,6 +1326,17 @@ def _config_updates( config_updates: dict[str, Any] = {} + # Clean up potentially existing vdW parameters + vdw_tags = ["LUSE_VDW", "IVDW", "IVDW_NL", "LASPH", "BPARAM", "CPARAM", "VDW_S6", "VDW_S8", "VDW_A1", "VDW_A2"] + for tag in vdw_tags: + if tag in vasp_input_set._config_dict["INCAR"]: + warnings.warn( + f"Removing existing INCAR tag '{tag}' to avoid conflicts when setting XC functional " + f"'{xc_functional}' with dispersion correction '{dispersion}'.", + stacklevel=2, + ) + vasp_input_set._config_dict["INCAR"].pop(tag, None) + # Update the XC functional flags if xc in to_func_metagga: config_updates |= {"METAGGA": to_func_metagga[xc]} From 667ee6e09b3ff3e62d1080f680d5f23cab09e130 Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Thu, 13 Nov 2025 18:27:17 -0600 Subject: [PATCH 15/18] Rename _config_updates to _set_dispersion_correction for clarity and update references in MPScanRelaxSet and MP24RelaxSet. --- src/pymatgen/io/vasp/sets.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pymatgen/io/vasp/sets.py b/src/pymatgen/io/vasp/sets.py index 87dd7d69e7b..a3a2fc4a10b 100644 --- a/src/pymatgen/io/vasp/sets.py +++ b/src/pymatgen/io/vasp/sets.py @@ -1299,7 +1299,7 @@ class MPRelaxSet(VaspInputSet): CONFIG = _load_yaml_config("MPRelaxSet") -def _config_updates( +def _set_dispersion_correction( vasp_input_set: VaspInputSet, xc_functional: str, dispersion: str | None = None, @@ -1468,7 +1468,7 @@ def __post_init__(self) -> None: super().__post_init__() if isinstance(self.dispersion, str) and self.dispersion.lower() != "rvv10": raise ValueError("Only rVV10 (or None) is supported for dispersion in MPScanRelaxSet.") - _config_updates(self, self.xc_functional, self.dispersion) + _set_dispersion_correction(self, self.xc_functional, self.dispersion) @dataclass @@ -1522,7 +1522,7 @@ def __post_init__(self) -> None: super().__post_init__() if self.xc_functional.lower() not in {"r2scan", "pbe", "pbesol"}: raise ValueError("xc_functional must be one of 'r2SCAN', 'PBE', or 'PBEsol'.") - _config_updates(self, self.xc_functional, self.dispersion) + _set_dispersion_correction(self, self.xc_functional, self.dispersion) @staticmethod def _sigmoid_interp( From 26a962665ba4b5b9a7fccd8aed8fb020250db770 Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Thu, 13 Nov 2025 19:24:49 -0600 Subject: [PATCH 16/18] Add D4 dispersion parameters for SCAN and HSE06 functional --- src/pymatgen/io/vasp/sets.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pymatgen/io/vasp/sets.py b/src/pymatgen/io/vasp/sets.py index a3a2fc4a10b..c3ec5d270bf 100644 --- a/src/pymatgen/io/vasp/sets.py +++ b/src/pymatgen/io/vasp/sets.py @@ -1365,9 +1365,11 @@ def _set_dispersion_correction( elif vdw == "d4": d4_pars = { + "scan": {"S6": 1.0, "S8": 1.46126056, "A1": 0.62930855, "A2": 6.31284039}, "r2scan": {"S6": 1.0, "S8": 0.60187490, "A1": 0.51559235, "A2": 5.77342911}, "pbe": {"S6": 1.0, "S8": 0.95948085, "A1": 0.38574991, "A2": 4.80688534}, "pbesol": {"S6": 1.0, "S8": 1.71885698, "A1": 0.47901421, "A2": 5.96771589}, + "hse06": {"S6": 1.0, "S8": 1.19528249, "A1": 0.38663183, "A2": 5.19133469}, } if xc not in d4_pars: raise ValueError(f"D4 parameters for XC functional '{xc_functional}' are not defined yet.") From 5dd34eae3cddd1b31d5098d320ee00259c428861 Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Thu, 13 Nov 2025 19:41:54 -0600 Subject: [PATCH 17/18] Remove LASPH from vdW parameters cleanup in _set_dispersion_correction function --- src/pymatgen/io/vasp/sets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pymatgen/io/vasp/sets.py b/src/pymatgen/io/vasp/sets.py index c3ec5d270bf..37bc05ebe45 100644 --- a/src/pymatgen/io/vasp/sets.py +++ b/src/pymatgen/io/vasp/sets.py @@ -1327,7 +1327,7 @@ def _set_dispersion_correction( config_updates: dict[str, Any] = {} # Clean up potentially existing vdW parameters - vdw_tags = ["LUSE_VDW", "IVDW", "IVDW_NL", "LASPH", "BPARAM", "CPARAM", "VDW_S6", "VDW_S8", "VDW_A1", "VDW_A2"] + vdw_tags = ["LUSE_VDW", "IVDW", "IVDW_NL", "BPARAM", "CPARAM", "VDW_S6", "VDW_S8", "VDW_A1", "VDW_A2"] for tag in vdw_tags: if tag in vasp_input_set._config_dict["INCAR"]: warnings.warn( From 21b9e03ebdcbdc85ca482448e33940edcf9a2c30 Mon Sep 17 00:00:00 2001 From: junchichen21 Date: Thu, 13 Nov 2025 19:43:30 -0600 Subject: [PATCH 18/18] Update tests for MPScanRelaxSet to assert presence of LASPH and IVDW_NL in INCAR --- tests/io/vasp/test_sets.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/io/vasp/test_sets.py b/tests/io/vasp/test_sets.py index 8567677c5be..855be0c127b 100644 --- a/tests/io/vasp/test_sets.py +++ b/tests/io/vasp/test_sets.py @@ -1877,18 +1877,22 @@ def test_scan_rvv10(self): scan_rvv10_set = MPScanRelaxSet(self.struct, xc_functional="SCAN", dispersion="rVV10") assert scan_rvv10_set.xc_functional == "SCAN" assert scan_rvv10_set.dispersion == "rVV10" - assert "LUSE_VDW" in scan_rvv10_set.incar + assert scan_rvv10_set.incar["LUSE_VDW"] + assert scan_rvv10_set.incar["LASPH"] assert scan_rvv10_set.incar["BPARAM"] == approx(15.7) assert scan_rvv10_set.incar["CPARAM"] == approx(0.0093) + assert scan_rvv10_set.incar["IVDW_NL"] == 2 # Test r2SCAN+rVV10 def test_r2scan_rvv10(self): r2scan_rvv10_set = MPScanRelaxSet(self.struct, dispersion="rVV10") assert r2scan_rvv10_set.xc_functional == "r2SCAN" assert r2scan_rvv10_set.dispersion == "rVV10" - assert "LUSE_VDW" in r2scan_rvv10_set.incar + assert r2scan_rvv10_set.incar["LUSE_VDW"] + assert r2scan_rvv10_set.incar["LASPH"] assert r2scan_rvv10_set.incar["BPARAM"] == approx(11.95) assert r2scan_rvv10_set.incar["CPARAM"] == approx(0.0093) + assert r2scan_rvv10_set.incar["IVDW_NL"] == 2 def test_other_vdw(self): # should raise a error.