diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 6f04cb035a..03325a1a22 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -27,10 +27,9 @@ Before a pull request can be merged, the following items must be checked: * [ ] Code is in the [standard Python style](https://www.python.org/dev/peps/pep-0008/). The easiest way to handle this is to run the following in the **correct sequence** on - your local machine. Start with running [black](https://black.readthedocs.io/en/stable/index.html) on your new code. This will - automatically reformat your code to PEP8 conventions and removes most issues. Then run - [ruff](https://ruff.rs). -* [ ] Docstrings have been added in the [Numpy docstring format](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_numpy.html). + your local machine. Start with running [`ruff`](https://docs.astral.sh/ruff) and `ruff format` on your new code. This will + automatically reformat your code to PEP8 conventions and fix many linting issues. +* [ ] Doc strings have been added in the [Numpy docstring format](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_numpy.html). Run [ruff](https://beta.ruff.rs/docs/rules/#pydocstyle-d) on your code. * [ ] Type annotations are **highly** encouraged. Run [mypy](http://mypy-lang.org) to type check your code. diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 37fbf3b594..d3d7488836 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -6,30 +6,30 @@ on: types: [completed] jobs: - deploy-docs: - # only run if commit is a push to master and the testing finished if: ${{ github.repository_owner == 'materialsproject' && github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'push' && startsWith(github.event.workflow_run.head_branch, 'v0.') }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: ${{ github.event.workflow_run.head_branch }} - name: Install pandoc run: sudo apt-get install pandoc - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: - python-version: '3.10' + python-version: "3.10" cache: pip cache-dependency-path: pyproject.toml - name: Install dependencies run: | python -m pip install --upgrade pip + # ase needed to get FrechetCellFilter used by ML force fields + pip install git+https://gitlab.com/ase/ase pip install .[strict,docs] - name: Build @@ -42,19 +42,18 @@ jobs: publish_dir: ./docs_build/ deploy-pypi: - # only run if commit is a push to master, the testing finished, and tagged as version if: github.repository_owner == 'materialsproject' && github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'push' && startsWith(github.event.workflow_run.head_branch, 'v0.') runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: ${{ github.event.workflow_run.head_branch }} - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: - python-version: '3.10' + python-version: "3.10" - name: Build run: | @@ -68,19 +67,18 @@ jobs: password: ${{ secrets.PYPI_PASSWORD }} deploy-github: - runs-on: ubuntu-latest needs: - deploy-pypi steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: ${{ github.event.workflow_run.head_branch }} - name: Write release info run: | - awk 'BEGIN {p = 0} {a = 0 }; /^v\d*.\d*.\d*./ { p += 1; a = 1}; p + a == 1 { print } ' CHANGELOG.md | sed -e '1,1d' | sed -e '/./,$!d' -e :a -e '/^\n*$/{$d;N;ba' -e '}' > release_info.txt + awk 'BEGIN {p = 0} {a = 0 }; /^\#\#\ v\d*.\d*.\d*./ { p += 1; a = 1}; p + a == 1 { print } ' CHANGELOG.md | sed -e '1,1d' | sed -e '/./,$!d' -e :a -e '/^\n*$/{$d;N;ba' -e '}' > release_info.txt echo "" >> release_info.txt awk '/CONTRIBUTOR SECTION/{f=1; c=0} f' CHANGELOG.md >> release_info.txt diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index d66dfb87d3..6847853711 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -17,14 +17,14 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: ${{ github.event.workflow_run.head_branch }} - name: Install pandoc run: sudo apt-get install pandoc - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: "3.10" cache: pip @@ -33,6 +33,8 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip + # ase needed to get FrechetCellFilter used by ML force fields + pip install git+https://gitlab.com/ase/ase pip install .[strict,docs] - name: Build diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 04545793ac..b91ace2195 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -11,9 +11,9 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: "3.9" cache: pip @@ -34,9 +34,9 @@ jobs: python-version: ["3.9", "3.10", "3.11"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} cache: pip @@ -52,6 +52,8 @@ jobs: # emmet-core 0.70.0 depends on pymatgen>=2023.10.11 run: | python -m pip install --upgrade pip + # ase needed to get FrechetCellFilter used by ML force fields + pip install git+https://gitlab.com/ase/ase pip install .[strict,tests] - name: Test @@ -69,9 +71,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: "3.10" cache: pip @@ -80,6 +82,8 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip + # ase needed to get FrechetCellFilter used by ML force fields + pip install git+https://gitlab.com/ase/ase pip install .[strict,docs] - name: Build diff --git a/.github/workflows/update-precommit.yml b/.github/workflows/update-precommit.yml index 0d6a43f422..273be7171f 100644 --- a/.github/workflows/update-precommit.yml +++ b/.github/workflows/update-precommit.yml @@ -2,7 +2,7 @@ name: pre-commit-auto-update on: schedule: - - cron: '0 0 1,14,28 * *' + - cron: "0 0 1,14,28 * *" workflow_dispatch: jobs: @@ -10,10 +10,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: 3.9 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 19ff60e958..1adda02ef2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,10 +2,11 @@ default_language_version: python: python3 repos: - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: v0.1.1 + rev: v0.2.2 hooks: - id: ruff args: [--fix] + - id: ruff-format - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.5.0 hooks: @@ -14,29 +15,12 @@ repos: args: [--remove] - id: end-of-file-fixer - id: trailing-whitespace -- repo: https://github.com/psf/black - rev: 23.10.0 - hooks: - - id: black - repo: https://github.com/asottile/blacken-docs rev: 1.16.0 hooks: - id: blacken-docs additional_dependencies: [black] exclude: README.md -- repo: https://github.com/pycqa/flake8 - rev: 6.1.0 - hooks: - - id: flake8 - entry: pflake8 - files: ^src/ - additional_dependencies: - - pyproject-flake8==6.0.0a1 - - flake8-bugbear==22.12.6 - - flake8-typing-imports==1.14.0 - - flake8-docstrings==1.6.0 - - flake8-rst-docstrings==0.3.0 - - flake8-rst==0.8.0 - repo: https://github.com/pre-commit/pygrep-hooks rev: v1.10.0 hooks: @@ -45,13 +29,12 @@ repos: - id: rst-directive-colons - id: rst-inline-touching-normal - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.6.1 + rev: v1.8.0 hooks: - id: mypy files: ^src/ additional_dependencies: - tokenize-rt==4.1.0 - - types-pkg_resources==0.1.2 - types-paramiko - repo: https://github.com/codespell-project/codespell rev: v2.2.6 diff --git a/CHANGELOG.md b/CHANGELOG.md index 12c23befc0..6265ffb66a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,156 @@ # Change log +## v0.0.14 + +### New Features ๐ŸŽ‰ +* Add lobster mp workflow by @JaGeo in https://github.com/materialsproject/atomate2/pull/634 +* Add FHI-aims DFT calculator by @tpurcell90 in https://github.com/materialsproject/atomate2/pull/562 +* Electrode Workflow by @jmmshn in https://github.com/materialsproject/atomate2/pull/655 +* Equation of state (EOS) workflows by @esoteric-ephemera in https://github.com/materialsproject/atomate2/pull/623 +### Bug Fixes ๐Ÿ› +* Skip final LDAU/J/L/MAGMOM updates and fix setting MAGMOM via `user_incar_settings` by @JonathanSchmidt1 in https://github.com/materialsproject/atomate2/pull/648 +* Prep for next `pymatgen` release by @janosh in https://github.com/materialsproject/atomate2/pull/690 +* [bug fix] SC Matrix Checking Logic by @jmmshn in https://github.com/materialsproject/atomate2/pull/704 +* Fix elastic conventional structure by @mjwen in https://github.com/materialsproject/atomate2/pull/706 +* Add `KspacingMetalHandler` to VASP `_DEFAULT_HANDLERS` by @janosh in https://github.com/materialsproject/atomate2/pull/600 +* Fix import error [ijson] by @naik-aakash in https://github.com/materialsproject/atomate2/pull/708 +* Print invalid value and list valid ones in `PhononMaker` error messages by @janosh in https://github.com/materialsproject/atomate2/pull/728 +* Update minimum `monty` version, allow newer `pydantic` by @mkhorton in https://github.com/materialsproject/atomate2/pull/720 +* Fix phonon + Lobster flow by removing magmoms before passing to `phonopy` by @naik-aakash in https://github.com/materialsproject/atomate2/pull/751 +* Fix MP query by @utf in https://github.com/materialsproject/atomate2/pull/755 +### Enhancements ๐Ÿ›  +* add directory of task doc generation to phonon schema by @JaGeo in https://github.com/materialsproject/atomate2/pull/674 +* Ensure MP VASP sets don't use auto_ismear, few other fixes by @esoteric-ephemera in https://github.com/materialsproject/atomate2/pull/673 +* Schema update > Update plot example LOBSTER workflow by @naik-aakash in https://github.com/materialsproject/atomate2/pull/682 +* Modify `BadInputSetWarning` logic for relaxations of a likely metal by @Andrew-S-Rosen in https://github.com/materialsproject/atomate2/pull/727 +* Define `MLFF` `Enum` to ensure consistent force field names by @janosh in https://github.com/materialsproject/atomate2/pull/729 +### Documentation ๐Ÿ“– +* Update doc: adding metadata to flow by @naik-aakash in https://github.com/materialsproject/atomate2/pull/638 +* Fix hyperlink in Docs by @naik-aakash in https://github.com/materialsproject/atomate2/pull/686 +* Correct typo in doc by @JiQi535 in https://github.com/materialsproject/atomate2/pull/716 +* Fix docstring on `MatPesMetaGGAStaticSetGenerator` by @Andrew-S-Rosen in https://github.com/materialsproject/atomate2/pull/725 +* Add `citation.cff` file, Zenodo record and readme "How to cite" section by @janosh in https://github.com/materialsproject/atomate2/pull/731 +### House-Keeping ๐Ÿงน +* Address TODO re missing asserts in `test_elastic_wf_with_mace()` by @janosh in https://github.com/materialsproject/atomate2/pull/679 +* Update lobsterpy version by @naik-aakash in https://github.com/materialsproject/atomate2/pull/683 +* Fix all ruff PT011 (not checking error message when testing exceptions) by @janosh in https://github.com/materialsproject/atomate2/pull/698 + +## New Contributors +* @JonathanSchmidt1 made their first contribution in https://github.com/materialsproject/atomate2/pull/648 +* @rdguha1995 made their first contribution in https://github.com/materialsproject/atomate2/pull/161 +* @JiQi535 made their first contribution in https://github.com/materialsproject/atomate2/pull/716 + +**Full Changelog**: https://github.com/materialsproject/atomate2/compare/v0.0.13...v0.0.14 + +## v0.0.13 + +### BREAKING CHANGE + +The API of `Maker.maker` for all workflows (VASP, CP2K, force fields) have been modified. Previously, this function had custom arguments for previous calculation directories (e.g., `prev_vasp_dir`, `prev_cp2k_dir`). These arguments have been standardised to `prev_dir`. Accordingly, the approach used to chain workflows has now changed. + +### New Features ๐ŸŽ‰ + +* Add setting `VASP_RUN_DDEC6: bool = False` by @janosh in https://github.com/materialsproject/atomate2/pull/587 + +### Bug Fixes ๐Ÿ› + +* Resolve bandstructure datastore bug by @JaGeo in https://github.com/materialsproject/atomate2/pull/605 +* Fix `TypeError`: `PhononBSPlotter.save_plot()` got an unexpected keyword argument `img_format` by @janosh in https://github.com/materialsproject/atomate2/pull/625 +* `ForceFieldRelaxMaker` default `relax_cell` to `True` by @janosh in https://github.com/materialsproject/atomate2/pull/635 +* Replace ase `ExpCellFilter` with `FrechetCellFilter` in `Relaxer` by @janosh in https://github.com/materialsproject/atomate2/pull/636 +* update lobsterpy version and schemas to match new version changes by @naik-aakash in https://github.com/materialsproject/atomate2/pull/637 +* Default `create_thermal_displacements` to `False` in VASP and forcefield `PhononMaker` by @janosh in https://github.com/materialsproject/atomate2/pull/647 +* Fix import of ASE filters when user has installed from PyPI and not gitlab by @esoteric-ephemera in https://github.com/materialsproject/atomate2/pull/650 +* Mark schema fields with `None` default as `Optional` to pass pydantic v2 validation by @danielzuegner in https://github.com/materialsproject/atomate2/pull/651 + +### Enhancements ๐Ÿ›  + +* Breaking: Unify previous directory `Maker` API by @janosh in https://github.com/materialsproject/atomate2/pull/593 +* Add keyword `incar_exclude: Sequence[str] = None` to `fake_run_vasp()` by @janosh in https://github.com/materialsproject/atomate2/pull/599 +* Allow `prv_dir` to be used more in defect wf by @jmmshn in https://github.com/materialsproject/atomate2/pull/585 +* Add MACE RelaxMaker and StaticMaker by @CompRhys in https://github.com/materialsproject/atomate2/pull/611 +* Update lobster task schema by @naik-aakash in https://github.com/materialsproject/atomate2/pull/529 +* Allow optimizer to be configured for MACE/GAP by @CompRhys in https://github.com/materialsproject/atomate2/pull/615 +* MACE Static/RelaxMakers default to loading `mace_mp` instead of test model by @janosh in https://github.com/materialsproject/atomate2/pull/614 +* Add optional 3rd static for PBE+U to `MatPesStaticFlowMaker` by @janosh in https://github.com/materialsproject/atomate2/pull/606 +* Use PyPI version of MACE by @utf in https://github.com/materialsproject/atomate2/pull/668 +* Multi step MD flow by @gpetretto in https://github.com/materialsproject/atomate2/pull/489 + +### Documentation ๐Ÿ“– + +* Add @CompRhys to `contributors.md` by @CompRhys in https://github.com/materialsproject/atomate2/pull/612 + +### House-Keeping ๐Ÿงน + +* Update GitHub Action versions by @janosh in https://github.com/materialsproject/atomate2/pull/640 +* Drop `flake8` by @janosh in https://github.com/materialsproject/atomate2/pull/658 +* Enable all `ruff` rules by default by @janosh in https://github.com/materialsproject/atomate2/pull/663 + +### New Contributors + +* @CompRhys made their first contribution in https://github.com/materialsproject/atomate2/pull/612 +* @danielzuegner made their first contribution in https://github.com/materialsproject/atomate2/pull/651 + +**Full Changelog**: https://github.com/materialsproject/atomate2/compare/v0.0.12...v0.0.13 + +## v0.0.12 + +* Breaking: default `Atomate2Settings.VASP_INHERIT_INCAR` to `False` by @janosh in https://github.com/materialsproject/atomate2/pull/594 + +### Bug Fixes ๐Ÿ› + +* Enforce magmom precedence in INCAR creation by @mattmcdermott in https://github.com/materialsproject/atomate2/pull/506 +* Warn on empty config by @janosh in https://github.com/materialsproject/atomate2/pull/522 +* CP2K use `calcs_reversed[0]` instead of `calcs_reversed[-1]` to not reverse again by @janosh in https://github.com/materialsproject/atomate2/pull/534 +* Fix wrong INCAR values in MP workflows by @janosh in https://github.com/materialsproject/atomate2/pull/550 +* Fix failing tests from Pydantic v2 migration by @hrushikesh-s in https://github.com/materialsproject/atomate2/pull/558 +* fixing pydantic v2 test errors by @hrushikesh-s in https://github.com/materialsproject/atomate2/pull/565 +* `parse_additional_json()` ignore `FW.json.gz` in output directories by @janosh in https://github.com/materialsproject/atomate2/pull/574 +* Fix `bandgap_tol` and delete `bandgap_override` on `MPMetaGGARelaxSetGenerator` by @janosh in https://github.com/materialsproject/atomate2/pull/553 +* Fix `VaspInputGenerator`'s `_set_kspacing` not respecting `auto_ismear = False` nor `auto_kspacing = False` by @janosh in https://github.com/materialsproject/atomate2/pull/576 +* Clean up VASP powerups, correct params in MP flows, test for `_set_u_params`, test for `_set_kspacing`, fix `_get_incar` method of `VaspInputSet` by @esoteric-ephemera in https://github.com/materialsproject/atomate2/pull/561 +* Fix Lobster workflow by @JaGeo in https://github.com/materialsproject/atomate2/pull/583 +* Change `MatPesGGAPlusMetaGGAStaticMaker.output` to dict containing both statics by @janosh in https://github.com/materialsproject/atomate2/pull/586 +* Test MP + MatPES set generators by @janosh in https://github.com/materialsproject/atomate2/pull/596 + +### Enhancements ๐Ÿ›  + +* Add StructureMetadata as baseclass for output documents by @gpetretto in https://github.com/materialsproject/atomate2/pull/514 +* Materials Project GGA and meta-GGA workflows by @janosh in https://github.com/materialsproject/atomate2/pull/504 +* MP-compatible r2SCAN workflow (and a few general INCAR improvements) by @Andrew-S-Rosen in https://github.com/materialsproject/atomate2/pull/362 +* Update to Pydantic v2 by @hrushikesh-s in https://github.com/materialsproject/atomate2/pull/567 +* Add MatPES GGA and r2SCAN static makers by @janosh in https://github.com/materialsproject/atomate2/pull/532 +* Move elastic workflow to common and build force-field elastic workflow by @JaGeo in https://github.com/materialsproject/atomate2/pull/581 + +### Documentation ๐Ÿ“– + +* Update @arosen93 to @Andrew-S-Rosen by @Andrew-S-Rosen in https://github.com/materialsproject/atomate2/pull/516 +* Add Aaron Kaplan and Matthew McDermott to `contributors.md` by @janosh in https://github.com/materialsproject/atomate2/pull/560 +* Document architectural difference between atomate 1 and 2 by @janosh in https://github.com/materialsproject/atomate2/pull/381 +* Add Thomas Purcell to `contributors.md` by @tpurcell90 in https://github.com/materialsproject/atomate2/pull/568 +* Add Alex Bonkowski to contributors list by @JaGeo in https://github.com/materialsproject/atomate2/pull/573 +* Add @matthewkuner to contributors by @matthewkuner in https://github.com/materialsproject/atomate2/pull/575 +* Update contributors.md by @utf in https://github.com/materialsproject/atomate2/pull/579 + +### House-Keeping ๐Ÿงน + +* Remove `__all__` from all modules by @janosh in https://github.com/materialsproject/atomate2/pull/540 +* removed py38 support, and add py 3.11 support by @naik-aakash in https://github.com/materialsproject/atomate2/pull/537 +* Check full INCAR by default in `mock_vasp` fixture by @janosh in https://github.com/materialsproject/atomate2/pull/551 +* skip validate charge test by @jmmshn in https://github.com/materialsproject/atomate2/pull/563 +* Add some type annotations by @ab5424 in https://github.com/materialsproject/atomate2/pull/578 +* Future type annotations by @janosh in https://github.com/materialsproject/atomate2/pull/580 +* Use `numpy.testing.assert_allclose` over assert `np.(all|is)close` by @janosh in https://github.com/materialsproject/atomate2/pull/582 + +## New Contributors + +* @mattmcdermott made their first contribution in https://github.com/materialsproject/atomate2/pull/506 +* @tpurcell90 made their first contribution in https://github.com/materialsproject/atomate2/pull/568 +* @esoteric-ephemera made their first contribution in https://github.com/materialsproject/atomate2/pull/561 +* @ab5424 made their first contribution in https://github.com/materialsproject/atomate2/pull/578 + +**Full Changelog**: https://github.com/materialsproject/atomate2/compare/v0.0.11...v0.0.12 + ## v0.0.11 ### Task Document Changes @@ -7,17 +158,17 @@ Merge atomate2 VASP task document with the one in emmet. The changes to the atomate2 schemas are: -- `PsuedoPotentialSummary` -> `Potcar` - - `labels` -> `symbols` -- `AnalysisSymmary` -> `AnalysisDoc` - - `delta_volume_as_percent` -> `delta_volume_percent` -- `InputSummary` -> `InputDoc` -- `OutputSummary` -> `OutputDoc` - - `density` added -- `Status` -> `TaskState` -- `TaskDocument` -> `TaskDoc` - - `task_type added` -- `Status` -> `TaskState` +* `PsuedoPotentialSummary` -> `Potcar` + * `labels` -> `symbols` +* `AnalysisSymmary` -> `AnalysisDoc` + * `delta_volume_as_percent` -> `delta_volume_percent` +* `InputSummary` -> `InputDoc` +* `OutputSummary` -> `OutputDoc` + * `density` added +* `Status` -> `TaskState` +* `TaskDocument` -> `TaskDoc` + * `task_type added` +* `Status` -> `TaskState` ### VASP input set updates @@ -32,9 +183,9 @@ to stay the same. Two new options have been added to the `BaseVaspInputSetGenerator`: -- `auto_metal_kpoints`: If true and the system is metallic, try and use ` +* `auto_metal_kpoints`: If true and the system is metallic, try and use ` reciprocal_density_metal` instead of `reciprocal_density` for metallic systems. -- `auto_ismear`: If true, the values for ISMEAR and SIGMA will be set automatically +* `auto_ismear`: If true, the values for ISMEAR and SIGMA will be set automatically depending on the bandgap of the system. If the bandgap is not known (e.g., there is no previous VASP directory) then ISMEAR=0 and SIGMA=0.2; if the bandgap is zero (a metallic system) then ISMEAR=2 and SIGMA=0.2; if the system is an insulator, then @@ -42,78 +193,78 @@ reciprocal_density_metal` instead of `reciprocal_density` for metallic systems. ### New Features ๐ŸŽ‰ -- CP2K Support by @nwinner in https://github.com/materialsproject/atomate2/pull/157 -- Add forcefield schemas/makers to atomate2 by @matthewkuner in https://github.com/materialsproject/atomate2/pull/322 -- Add `m3gnet` support to Atomate2 by @matthewkuner in https://github.com/materialsproject/atomate2/pull/380 -- Phonons for forcefields by @JaGeo in https://github.com/materialsproject/atomate2/pull/398 +* CP2K Support by @nwinner in https://github.com/materialsproject/atomate2/pull/157 +* Add forcefield schemas/makers to atomate2 by @matthewkuner in https://github.com/materialsproject/atomate2/pull/322 +* Add `m3gnet` support to Atomate2 by @matthewkuner in https://github.com/materialsproject/atomate2/pull/380 +* Phonons for forcefields by @JaGeo in https://github.com/materialsproject/atomate2/pull/398 ### Bug Fixes ๐Ÿ› -- Fix Lobster Schema by @JaGeo in https://github.com/materialsproject/atomate2/pull/266 -- fix lso dos of lobster being not saved in schema by @naik-aakash in https://github.com/materialsproject/atomate2/pull/279 -- fix `_get_strong_bonds` function by @naik-aakash in https://github.com/materialsproject/atomate2/pull/289 -- [Bug Fix] For stringing defect calculations together by @jmmshn in https://github.com/materialsproject/atomate2/pull/292 -- BUGFIX `auto_lreal` by @jmmshn in https://github.com/materialsproject/atomate2/pull/297 -- Fix `Yb` PSP: change `Yb_2` to `Yb_3` by @janosh in https://github.com/materialsproject/atomate2/pull/319 -- Fix typo by @janosh in https://github.com/materialsproject/atomate2/pull/321 -- Fix overriding `magmoms` in `update_user_incar_settings(` by @janosh in https://github.com/materialsproject/atomate2/pull/375 -- Fix encoding of input `Molecule` coordinates in cclib `TaskDocument` by @Andrew-S-Rosen in https://github.com/materialsproject/atomate2/pull/411 -- [FIX] fix elastic tensor flow by @mjwen in https://github.com/materialsproject/atomate2/pull/415 -- [BUG FIX] Edge case for Magmoms by @jmmshn in https://github.com/materialsproject/atomate2/pull/460 -- [FIX] Fix major bug that caused `user_incar_settings` to be overwritten in some cases by @matthewkuner in https://github.com/materialsproject/atomate2/pull/412 -- Test for `zip_outputs` by @gpetretto in https://github.com/materialsproject/atomate2/pull/503 +* Fix Lobster Schema by @JaGeo in https://github.com/materialsproject/atomate2/pull/266 +* fix lso dos of lobster being not saved in schema by @naik-aakash in https://github.com/materialsproject/atomate2/pull/279 +* fix `_get_strong_bonds` function by @naik-aakash in https://github.com/materialsproject/atomate2/pull/289 +* [Bug Fix] For stringing defect calculations together by @jmmshn in https://github.com/materialsproject/atomate2/pull/292 +* BUGFIX `auto_lreal` by @jmmshn in https://github.com/materialsproject/atomate2/pull/297 +* Fix `Yb` PSP: change `Yb_2` to `Yb_3` by @janosh in https://github.com/materialsproject/atomate2/pull/319 +* Fix typo by @janosh in https://github.com/materialsproject/atomate2/pull/321 +* Fix overriding `magmoms` in `update_user_incar_settings(` by @janosh in https://github.com/materialsproject/atomate2/pull/375 +* Fix encoding of input `Molecule` coordinates in cclib `TaskDocument` by @Andrew-S-Rosen in https://github.com/materialsproject/atomate2/pull/411 +* [FIX] fix elastic tensor flow by @mjwen in https://github.com/materialsproject/atomate2/pull/415 +* [BUG FIX] Edge case for Magmoms by @jmmshn in https://github.com/materialsproject/atomate2/pull/460 +* [FIX] Fix major bug that caused `user_incar_settings` to be overwritten in some cases by @matthewkuner in https://github.com/materialsproject/atomate2/pull/412 +* Test for `zip_outputs` by @gpetretto in https://github.com/materialsproject/atomate2/pull/503 ### Enhancements ๐Ÿ›  -- Extension of Lobster schema and additional tests by @JaGeo in https://github.com/materialsproject/atomate2/pull/272 -- Use emmet VASP task document by @utf in https://github.com/materialsproject/atomate2/pull/269 -- VASP inputset updates by @utf in https://github.com/materialsproject/atomate2/pull/270 -- Linting by @utf in https://github.com/materialsproject/atomate2/pull/274 -- Improve Lobster workflow preconverge step, kpoints, docs by @JaGeo in https://github.com/materialsproject/atomate2/pull/277 -- add `has_doscar_lso` field to Lobsterout schema model and update lobsterpy version by @naik-aakash in https://github.com/materialsproject/atomate2/pull/286 -- added simple chg check by @jmmshn in https://github.com/materialsproject/atomate2/pull/320 -- Switch to emmet's `MoleculeMetadata` by @Andrew-S-Rosen in https://github.com/materialsproject/atomate2/pull/301 -- Update update-precommit.yml by @utf in https://github.com/materialsproject/atomate2/pull/330 -- Update dependencies by @utf in https://github.com/materialsproject/atomate2/pull/329 -- Add missing molecule field to cclib TaskDocument by @Andrew-S-Rosen in https://github.com/materialsproject/atomate2/pull/353 -- allow elastically unstable structures by @matthewkuner in https://github.com/materialsproject/atomate2/pull/355 -- update lobstertask schema: add bandoverlaps,grosspop and sitepotentials fields by @naik-aakash in https://github.com/materialsproject/atomate2/pull/404 -- Update CondensedBondingAnalysis schema by @naik-aakash in https://github.com/materialsproject/atomate2/pull/469 -- Phonon tweaks by @utf in https://github.com/materialsproject/atomate2/pull/276 -- Update to Defects WF by @jmmshn in https://github.com/materialsproject/atomate2/pull/430 -- Small change to `gunzip` to allow better restarting by @jmmshn in https://github.com/materialsproject/atomate2/pull/476 -- Remove VASP calc types schema by @mjwen in https://github.com/materialsproject/atomate2/pull/407 -- Optionally zip files at the end of jobs by @gpetretto in https://github.com/materialsproject/atomate2/pull/414 +* Extension of Lobster schema and additional tests by @JaGeo in https://github.com/materialsproject/atomate2/pull/272 +* Use emmet VASP task document by @utf in https://github.com/materialsproject/atomate2/pull/269 +* VASP inputset updates by @utf in https://github.com/materialsproject/atomate2/pull/270 +* Linting by @utf in https://github.com/materialsproject/atomate2/pull/274 +* Improve Lobster workflow preconverge step, kpoints, docs by @JaGeo in https://github.com/materialsproject/atomate2/pull/277 +* add `has_doscar_lso` field to Lobsterout schema model and update lobsterpy version by @naik-aakash in https://github.com/materialsproject/atomate2/pull/286 +* added simple chg check by @jmmshn in https://github.com/materialsproject/atomate2/pull/320 +* Switch to emmet's `MoleculeMetadata` by @Andrew-S-Rosen in https://github.com/materialsproject/atomate2/pull/301 +* Update update-precommit.yml by @utf in https://github.com/materialsproject/atomate2/pull/330 +* Update dependencies by @utf in https://github.com/materialsproject/atomate2/pull/329 +* Add missing molecule field to cclib TaskDocument by @Andrew-S-Rosen in https://github.com/materialsproject/atomate2/pull/353 +* allow elastically unstable structures by @matthewkuner in https://github.com/materialsproject/atomate2/pull/355 +* update lobstertask schema: add bandoverlaps,grosspop and sitepotentials fields by @naik-aakash in https://github.com/materialsproject/atomate2/pull/404 +* Update CondensedBondingAnalysis schema by @naik-aakash in https://github.com/materialsproject/atomate2/pull/469 +* Phonon tweaks by @utf in https://github.com/materialsproject/atomate2/pull/276 +* Update to Defects WF by @jmmshn in https://github.com/materialsproject/atomate2/pull/430 +* Small change to `gunzip` to allow better restarting by @jmmshn in https://github.com/materialsproject/atomate2/pull/476 +* Remove VASP calc types schema by @mjwen in https://github.com/materialsproject/atomate2/pull/407 +* Optionally zip files at the end of jobs by @gpetretto in https://github.com/materialsproject/atomate2/pull/414 ### Documentation ๐Ÿ“– -- Add more documentation for Lobster by @JaGeo in https://github.com/materialsproject/atomate2/pull/267 -- Use furo for docs theme by @utf in https://github.com/materialsproject/atomate2/pull/331 -- Update Lobster documentation by @JaGeo in https://github.com/materialsproject/atomate2/pull/376 -- Fix docs typos by @janosh in https://github.com/materialsproject/atomate2/pull/373 -- Update FireWorks section of docs by @Andrew-S-Rosen in https://github.com/materialsproject/atomate2/pull/378 -- Add a copy button to code blocks by @Andrew-S-Rosen in https://github.com/materialsproject/atomate2/pull/382 -- clean up doc, remove left-overs from amset example by @JaGeo in https://github.com/materialsproject/atomate2/pull/394 -- More details for lobster documentation by @JaGeo in https://github.com/materialsproject/atomate2/pull/431 -- Deploy docs on every commit to `main` by @janosh in https://github.com/materialsproject/atomate2/pull/422 -- Add clearer documentation on lobster worker by @JaGeo in https://github.com/materialsproject/atomate2/pull/440 -- Docs: add basic workflow tutorial by @rkingsbury in https://github.com/materialsproject/atomate2/pull/408 -- Use GitHub's `deploy-pages` action to deploy docs by @janosh in https://github.com/materialsproject/atomate2/pull/475 +* Add more documentation for Lobster by @JaGeo in https://github.com/materialsproject/atomate2/pull/267 +* Use furo for docs theme by @utf in https://github.com/materialsproject/atomate2/pull/331 +* Update Lobster documentation by @JaGeo in https://github.com/materialsproject/atomate2/pull/376 +* Fix docs typos by @janosh in https://github.com/materialsproject/atomate2/pull/373 +* Update FireWorks section of docs by @Andrew-S-Rosen in https://github.com/materialsproject/atomate2/pull/378 +* Add a copy button to code blocks by @Andrew-S-Rosen in https://github.com/materialsproject/atomate2/pull/382 +* clean up doc, remove left-overs from amset example by @JaGeo in https://github.com/materialsproject/atomate2/pull/394 +* More details for lobster documentation by @JaGeo in https://github.com/materialsproject/atomate2/pull/431 +* Deploy docs on every commit to `main` by @janosh in https://github.com/materialsproject/atomate2/pull/422 +* Add clearer documentation on lobster worker by @JaGeo in https://github.com/materialsproject/atomate2/pull/440 +* Docs: add basic workflow tutorial by @rkingsbury in https://github.com/materialsproject/atomate2/pull/408 +* Use GitHub's `deploy-pages` action to deploy docs by @janosh in https://github.com/materialsproject/atomate2/pull/475 ### House-Keeping ๐Ÿงน -- More `ruff` by @janosh in https://github.com/materialsproject/atomate2/pull/344 -- Move all type-hint only imports behind `if TYPE_CHECKING` by @janosh in https://github.com/materialsproject/atomate2/pull/354 -- `ruff` select `perflint` `flake8-slots` by @janosh in https://github.com/materialsproject/atomate2/pull/395 -- Bump `ruff` and fix `PERF401`: Use a list comprehension to create transformed list by @janosh in https://github.com/materialsproject/atomate2/pull/421 -- Simplify: `dict.get(key, None)` -> `dict.get(key)` by @janosh in https://github.com/materialsproject/atomate2/pull/429 -- `dict.setdefault` instead of `if key not in dict: dict[key] = ...` by @janosh in https://github.com/materialsproject/atomate2/pull/452 +* More `ruff` by @janosh in https://github.com/materialsproject/atomate2/pull/344 +* Move all type-hint only imports behind `if TYPE_CHECKING` by @janosh in https://github.com/materialsproject/atomate2/pull/354 +* `ruff` select `perflint` `flake8-slots` by @janosh in https://github.com/materialsproject/atomate2/pull/395 +* Bump `ruff` and fix `PERF401`: Use a list comprehension to create transformed list by @janosh in https://github.com/materialsproject/atomate2/pull/421 +* Simplify: `dict.get(key, None)` -> `dict.get(key)` by @janosh in https://github.com/materialsproject/atomate2/pull/429 +* `dict.setdefault` instead of `if key not in dict: dict[key] = ...` by @janosh in https://github.com/materialsproject/atomate2/pull/452 ## New Contributors -- @naik-aakash made their first contribution in https://github.com/materialsproject/atomate2/pull/279 -- @matthewkuner made their first contribution in https://github.com/materialsproject/atomate2/pull/322 -- @gpetretto made their first contribution in https://github.com/materialsproject/atomate2/pull/414 +* @naik-aakash made their first contribution in https://github.com/materialsproject/atomate2/pull/279 +* @matthewkuner made their first contribution in https://github.com/materialsproject/atomate2/pull/322 +* @gpetretto made their first contribution in https://github.com/materialsproject/atomate2/pull/414 **Full Changelog**: https://github.com/materialsproject/atomate2/compare/v0.0.10...v0.0.11) @@ -125,83 +276,83 @@ Lobster workflow with VASP implementation ([@JaGeo][jageo], [@naik-aakash][naik- New features: -- Defect formation energy workflow with VASP implementation ([@jmmshn][jmmshn], [#215](https://github.com/materialsproject/atomate2/pull/215)) -- Job to retrieve a structure from the MP API at run-time ([@mkhorton][mkhorton], [#176](https://github.com/materialsproject/atomate2/pull/176])) +* Defect formation energy workflow with VASP implementation ([@jmmshn][jmmshn], [#215](https://github.com/materialsproject/atomate2/pull/215)) +* Job to retrieve a structure from the MP API at run-time ([@mkhorton][mkhorton], [#176](https://github.com/materialsproject/atomate2/pull/176])) Enhancements: -- Documentation of phonon workflow ([@QuantumChemist][quantumchemist], [#232](https://github.com/materialsproject/atomate2/pull/232)) -- Refactor defect code ([@jmmshn][jmmshn], [#214](https://github.com/materialsproject/atomate2/pull/214)) -- Use `ruff` for linting ([@janosh][janosh], [#250](https://github.com/materialsproject/atomate2/pull/250)) +* Documentation of phonon workflow ([@QuantumChemist][quantumchemist], [#232](https://github.com/materialsproject/atomate2/pull/232)) +* Refactor defect code ([@jmmshn][jmmshn], [#214](https://github.com/materialsproject/atomate2/pull/214)) +* Use `ruff` for linting ([@janosh][janosh], [#250](https://github.com/materialsproject/atomate2/pull/250)) Bug fixes: -- Use correct k-point density in phonon workflow ([@JaGeo][jageo], [#177](https://github.com/materialsproject/atomate2/pull/177)) -- Fix use of `expanduser` path ([@nwinner][nwinner], [#180](https://github.com/materialsproject/atomate2/pull/180)) -- Correct `calcs_reversed` to be in the proper order ([@Zhuoying][zhuoying], [#182](https://github.com/materialsproject/atomate2/pull/182)) -- Bugfix for `store_volumetric_data` ([@jmmshn][jmmshn], [#212](https://github.com/materialsproject/atomate2/pull/212)) +* Use correct k-point density in phonon workflow ([@JaGeo][jageo], [#177](https://github.com/materialsproject/atomate2/pull/177)) +* Fix use of `expanduser` path ([@nwinner][nwinner], [#180](https://github.com/materialsproject/atomate2/pull/180)) +* Correct `calcs_reversed` to be in the proper order ([@Zhuoying][zhuoying], [#182](https://github.com/materialsproject/atomate2/pull/182)) +* Bugfix for `store_volumetric_data` ([@jmmshn][jmmshn], [#212](https://github.com/materialsproject/atomate2/pull/212)) ## v0.0.8 New features: -- VASP Phonopy workflow ([@JaGeo][jageo], [#137](https://github.com/materialsproject/atomate2/pull/137)) -- Molecular dynamics VASP job ([@mjwen][mjwen], [#134](https://github.com/materialsproject/atomate2/pull/134)) +* VASP Phonopy workflow ([@JaGeo][jageo], [#137](https://github.com/materialsproject/atomate2/pull/137)) +* Molecular dynamics VASP job ([@mjwen][mjwen], [#134](https://github.com/materialsproject/atomate2/pull/134)) Enhancements: -- Update IO classes to use pymatgen base classes ([@rkingsbury][rkingsbury], [#141](https://github.com/materialsproject/atomate2/pull/141)) -- Read and write VASP structures with higher precision ([@JaGeo][jageo], [#167](https://github.com/materialsproject/atomate2/pull/167)) +* Update IO classes to use pymatgen base classes ([@rkingsbury][rkingsbury], [#141](https://github.com/materialsproject/atomate2/pull/141)) +* Read and write VASP structures with higher precision ([@JaGeo][jageo], [#167](https://github.com/materialsproject/atomate2/pull/167)) Bug fixes: -- Fix code examples in docs ([@JaGeo][jageo], [#169](https://github.com/materialsproject/atomate2/pull/169)) -- Fix f-orbital DOS properties ([@Andrew-S-Rosen][arosen], [#138](https://github.com/materialsproject/atomate2/pull/138)) -- Fix `mock_run_vasp` testing to accept args ([@mjwen][mjwen], [#151](https://github.com/materialsproject/atomate2/pull/151)) -- Regenerate calc_types enum ([@mjwen][mjwen], [#153](https://github.com/materialsproject/atomate2/pull/153)) +* Fix code examples in docs ([@JaGeo][jageo], [#169](https://github.com/materialsproject/atomate2/pull/169)) +* Fix f-orbital DOS properties ([@Andrew-S-Rosen][arosen], [#138](https://github.com/materialsproject/atomate2/pull/138)) +* Fix `mock_run_vasp` testing to accept args ([@mjwen][mjwen], [#151](https://github.com/materialsproject/atomate2/pull/151)) +* Regenerate calc_types enum ([@mjwen][mjwen], [#153](https://github.com/materialsproject/atomate2/pull/153)) ## v0.0.7 New features: -- Include band-related features (e.g. band center, bandwidth, skewness, kurtosis) in +* Include band-related features (e.g. band center, bandwidth, skewness, kurtosis) in VASP schema ([@Andrew-S-Rosen][arosen], [#92](https://github.com/materialsproject/atomate2/pull/92)) -- Add `use_auto_ispin` and `update_user_potcar_functional` powerups +* Add `use_auto_ispin` and `update_user_potcar_functional` powerups Enhancements: -- Add `is_hubbard` and `hubbards` to VASP task doc. -- Migrate build system to pyproject.toml. -- Migrate docs to jupyter-book. -- Docs improvements ([@janosh][janosh], [@mjwen][mjwen]) +* Add `is_hubbard` and `hubbards` to VASP task doc. +* Migrate build system to pyproject.toml. +* Migrate docs to jupyter-book. +* Docs improvements ([@janosh][janosh], [@mjwen][mjwen]) Bug fixes: -- Fix HSE tags. -- Fix running bader. -- Make potcar_spec argument usable ([@jmmshn][jmmshn], [#83](https://github.com/materialsproject/atomate2/pull/83)) -- Replace monty which with shutil which ([@Andrew-S-Rosen][arosen], [#92](https://github.com/materialsproject/atomate2/pull/92)) -- Fix `calculate_deformation_potentials()` ([@janosh][janosh], [#94](https://github.com/materialsproject/atomate2/pull/94)) -- Fix gzipping of files with numerical suffixes ([@jmmshn][jmmshn], [#116](https://github.com/materialsproject/atomate2/pull/116)) +* Fix HSE tags. +* Fix running bader. +* Make potcar_spec argument usable ([@jmmshn][jmmshn], [#83](https://github.com/materialsproject/atomate2/pull/83)) +* Replace monty which with shutil which ([@Andrew-S-Rosen][arosen], [#92](https://github.com/materialsproject/atomate2/pull/92)) +* Fix `calculate_deformation_potentials()` ([@janosh][janosh], [#94](https://github.com/materialsproject/atomate2/pull/94)) +* Fix gzipping of files with numerical suffixes ([@jmmshn][jmmshn], [#116](https://github.com/materialsproject/atomate2/pull/116)) ## v0.0.6 New features: -- cclib task document supporting virtually all popular molecular DFT codes out-of-the-box +* cclib task document supporting virtually all popular molecular DFT codes out-of-the-box ([@Andrew-S-Rosen][arosen], [#64](https://github.com/materialsproject/atomate2/pull/64)) Enhancements: -- Add mag_density to VASP output doc ([@Andrew-S-Rosen][arosen], [#65](https://github.com/materialsproject/atomate2/pull/66)) -- Double relax maker now supports two different Makers ([@Andrew-S-Rosen][arosen], [#32](https://github.com/materialsproject/atomate2/pull/32)) +* Add mag_density to VASP output doc ([@Andrew-S-Rosen][arosen], [#65](https://github.com/materialsproject/atomate2/pull/66)) +* Double relax maker now supports two different Makers ([@Andrew-S-Rosen][arosen], [#32](https://github.com/materialsproject/atomate2/pull/32)) Bug fixes: -- Store band structure efermi in CalculationOutput ([@Andrew-S-Rosen][arosen], [#66](https://github.com/materialsproject/atomate2/pull/66)) -- Support for VASP6 and latest pymatgen ([@Andrew-S-Rosen][arosen], [#75](https://github.com/materialsproject/atomate2/pull/75)) -- Fixed atomate2 version string. -- Disabled orbital projections in the electron-phonon workflow. +* Store band structure efermi in CalculationOutput ([@Andrew-S-Rosen][arosen], [#66](https://github.com/materialsproject/atomate2/pull/66)) +* Support for VASP6 and latest pymatgen ([@Andrew-S-Rosen][arosen], [#75](https://github.com/materialsproject/atomate2/pull/75)) +* Fixed atomate2 version string. +* Disabled orbital projections in the electron-phonon workflow. ## v0.0.5 @@ -209,17 +360,17 @@ This version removed Python 3.7 support following numpy and pymatgen. New features: -- Base schema for molecule task documents ([@Andrew-S-Rosen][arosen], [#54](https://github.com/materialsproject/atomate2/pull/54)) +* Base schema for molecule task documents ([@Andrew-S-Rosen][arosen], [#54](https://github.com/materialsproject/atomate2/pull/54)) Bug fixes: -- Fix VASP relaxation using custodian "FULL_OPT" ([@Andrew-S-Rosen][arosen], [#42](https://github.com/materialsproject/atomate2/pull/42)) -- Fix supercell generation and input sets in electron-phonon workflow. -- Fix `HSEBSSetGenerator` INCAR settings. -- Fix issue with magnetism in SOC structures. -- Fix bug with Fermi level and IBRION=1 -- Better handling of URI generation. -- Tweak k-spacing formula to stop large band gaps giving negative values +* Fix VASP relaxation using custodian "FULL_OPT" ([@Andrew-S-Rosen][arosen], [#42](https://github.com/materialsproject/atomate2/pull/42)) +* Fix supercell generation and input sets in electron-phonon workflow. +* Fix `HSEBSSetGenerator` INCAR settings. +* Fix issue with magnetism in SOC structures. +* Fix bug with Fermi level and IBRION=1 +* Better handling of URI generation. +* Tweak k-spacing formula to stop large band gaps giving negative values ## v0.0.4 @@ -227,34 +378,34 @@ Lots of improvements and bug fixes this release. New features: -- AMSET workflow. -- Electron phonon band gap renormalisation workflow. -- Specific uniform and line mode band structure makers. -- Optics maker. -- Transmuter maker. +* AMSET workflow. +* Electron phonon band gap renormalisation workflow. +* Specific uniform and line mode band structure makers. +* Optics maker. +* Transmuter maker. Enhancements: -- Support for automatic handling of ISPIN. -- Add MP base sets ([@Andrew-S-Rosen][arosen], [#27](https://github.com/materialsproject/atomate2/pull/27)) -- Docs updates ([@Andrew-S-Rosen][arosen], [#13](https://github.com/materialsproject/atomate2/pull/13) [#17](https://github.com/materialsproject/atomate2/pull/17)) -- Options to strip band structure and DOS projects to reduce object sizes. -- Input sets now use generators to avoid serialization issues. -- Use smart efermi finding to remove errors with tetrahedron integration in VASP 6. -- Powerups can now work on `Maker` objects directly. +* Support for automatic handling of ISPIN. +* Add MP base sets ([@Andrew-S-Rosen][arosen], [#27](https://github.com/materialsproject/atomate2/pull/27)) +* Docs updates ([@Andrew-S-Rosen][arosen], [#13](https://github.com/materialsproject/atomate2/pull/13) [#17](https://github.com/materialsproject/atomate2/pull/17)) +* Options to strip band structure and DOS projects to reduce object sizes. +* Input sets now use generators to avoid serialization issues. +* Use smart efermi finding to remove errors with tetrahedron integration in VASP 6. +* Powerups can now work on `Maker` objects directly. Bug fixes: -- Use PBEsol by default. -- Increase number of significant figures when writing POSCAR files. -- Remove unused INCAR settings ([@Andrew-S-Rosen][arosen]) -- Add missing LASPH flags on vdW functionals ([@Andrew-S-Rosen][arosen], [#31](https://github.com/materialsproject/atomate2/pull/31)) -- Use `NSW=0` in static calculations ([@Andrew-S-Rosen][arosen], [#10](https://github.com/materialsproject/atomate2/pull/10)) -- `LREAL = False` in static jobs by default ([@Andrew-S-Rosen][arosen], [#23](https://github.com/materialsproject/atomate2/pull/23)) -- Add missing functionals in output schema ([@Andrew-S-Rosen][arosen], [#12](https://github.com/materialsproject/atomate2/pull/12)) -- Many output schema fixes. -- Better support for FireWorks. -- Support writing additional files in VASP jobs. +* Use PBEsol by default. +* Increase number of significant figures when writing POSCAR files. +* Remove unused INCAR settings ([@Andrew-S-Rosen][arosen]) +* Add missing LASPH flags on vdW functionals ([@Andrew-S-Rosen][arosen], [#31](https://github.com/materialsproject/atomate2/pull/31)) +* Use `NSW=0` in static calculations ([@Andrew-S-Rosen][arosen], [#10](https://github.com/materialsproject/atomate2/pull/10)) +* `LREAL = False` in static jobs by default ([@Andrew-S-Rosen][arosen], [#23](https://github.com/materialsproject/atomate2/pull/23)) +* Add missing functionals in output schema ([@Andrew-S-Rosen][arosen], [#12](https://github.com/materialsproject/atomate2/pull/12)) +* Many output schema fixes. +* Better support for FireWorks. +* Support writing additional files in VASP jobs. ## v0.0.3 diff --git a/README.md b/README.md index b2dc2e7b48..d7ac33791c 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ [![code coverage](https://img.shields.io/codecov/c/gh/materialsproject/atomate2)](https://codecov.io/gh/materialsproject/atomate2) [![pypi version](https://img.shields.io/pypi/v/atomate2?color=blue)](https://pypi.org/project/atomate2) ![supported python versions](https://img.shields.io/pypi/pyversions/atomate2) +[![Zenodo](https://img.shields.io/badge/DOI-10.5281/zenodo.10677081-blue?logo=Zenodo&logoColor=white)](https://zenodo.org/records/10677081) [Documentation][docs] | [PyPI][pypi] | [GitHub][github] @@ -53,7 +54,7 @@ calculations will be performed: 4. A non-self-consistent calculation on a high symmetry k-point path (for the line mode band structure). -```python +```py from atomate2.vasp.flows.core import RelaxBandStructureMaker from jobflow import run_locally from pymatgen.core import Structure @@ -123,6 +124,23 @@ Atomate2 is released under a modified BSD license; the full text can be found [h The development of atomate2 has benefited from many people across several research groups. A full list of contributors can be found [here][contributors]. +## Citing atomate2 + +A journal submission for `atomate2` is planned. In the meantime, please use [`citation.cff`](citation.cff) and the [Zenodo record](https://zenodo.org/badge/latestdoi/306414371) to cite `atomate2`. + +```bib +@software{ganose_atomate2_2024, + author = {Ganose, Alex and Riebesell, Janosh and George, J. and Shen, Jimmy and S. Rosen, Andrew and Ashok Naik, Aakash and nwinner and Wen, Mingjian and rdguha1995 and Kuner, Matthew and Petretto, Guido and Zhu, Zhuoying and Horton, Matthew and Sahasrabuddhe, Hrushikesh and Kaplan, Aaron and Schmidt, Jonathan and Ertural, Christina and Kingsbury, Ryan and McDermott, Matt and Goodall, Rhys and Bonkowski, Alexander and Purcell, Thomas and Zรผgner, Daniel and Qi, Ji}, + doi = {10.5281/zenodo.10677081}, + license = {cc-by-4.0}, + month = jan, + title = {atomate2}, + url = {https://github.com/materialsproject/atomate2}, + version = {0.0.13}, + year = {2024} +} +``` + [pymatgen]: https://pymatgen.org [fireworks]: https://materialsproject.github.io/fireworks/ [jobflow]: https://materialsproject.github.io/jobflow/ diff --git a/citation.cff b/citation.cff new file mode 100644 index 0000000000..aff21df9aa --- /dev/null +++ b/citation.cff @@ -0,0 +1,116 @@ +cff-version: 1.2.0 +message: If you use this software, please cite it using these metadata. +title: atomate2 +doi: 10.5281/zenodo.10677081 +authors: + - given-names: Alex + family-names: Ganose + github: https://github.com/utf + affiliation: Imperial College London + orcid: 0000-0002-4486-3321 + - given-names: Janosh + family-names: Riebesell + github: https://github.com/janosh + affiliation: Cambridge University, Lawrence Berkeley National Laboratory + orcid: 0000-0001-5233-3462 + - given-names: Janine + family-names: George + github: https://github.com/JaGeo + affiliation: Federal Institute for Materials Research and Testing (BAM) + orcid: 0000-0001-8907-0336 + - given-names: Jimmy-Xuan + family-names: Shen + github: https://github.com/jmmshn + affiliation: Lawrence Livermore National Laboratory + orcid: 0000-0002-2743-7531 + - given-names: Andrew + family-names: Rosen + github: https://github.com/Andrew-S-Rosen + name-particle: S. + affiliation: Princeton University + orcid: 0000-0002-0141-7006 + - given-names: Aakash + family-names: Naik + github: https://github.com/naik-aakash + name-particle: Ashok + affiliation: Federal Institute for Materials Research and Testing (BAM) + - given-names: Nick + family-names: Winner + email: nwinner@berkeley.edu + github: https://github.com/nwinner + affiliation: University of California, Berkeley + - given-names: Mingjian + family-names: Wen + github: https://github.com/mjwen + affiliation: University of Houston + - given-names: Rishabh + family-names: Guha + github: https://github.com/rdguha1995 + affiliation: Lawrence Berkeley National Laboratory + - given-names: Matthew + family-names: Kuner + github: https://github.com/matthewkuner + affiliation: University of California, Berkeley + - given-names: Guido + family-names: Petretto + github: https://github.com/gpetretto + affiliation: Universitรฉ catholique de Louvain + - given-names: Zhuoying + family-names: Zhu + github: https://github.com/Zhuoying + affiliation: Lawrence Berkeley National Laboratory + - given-names: Matthew + family-names: Horton + github: https://github.com/mkhorton + affiliation: Microsoft Research + orcid: 0000-0001-7777-8871 + - given-names: Hrushikesh + family-names: Sahasrabuddhe + github: https://github.com/hrushikesh-s + affiliation: University of California, Berkeley + - given-names: Aaron + family-names: Kaplan + github: https://github.com/esoteric-ephemera + affiliation: Lawrence Berkeley National Laboratory + - given-names: Jonathan + family-names: Schmidt + github: https://github.com/JonathanSchmidt1 + affiliation: ETH Zurich + - given-names: Christina + family-names: Ertural + github: https://github.com/QuantumChemist + affiliation: Federal Institute for Materials Research and Testing (BAM) + - given-names: Ryan + family-names: Kingsbury + github: https://github.com/rkingsbury + affiliation: Princeton University + - given-names: Matt + family-names: McDermott + github: https://github.com/mattmcdermott + affiliation: Lawrence Berkeley National Laboratory + - given-names: Rhys + family-names: Goodall + github: https://github.com/CompRhys + affiliation: Chemix.ai + - given-names: Alexander + family-names: Bonkowski + github: https://github.com/ab5424 + affiliation: RWTH Aachen University + - given-names: Thomas + family-names: Purcell + github: https://github.com/tpurcell90 + affiliation: Fritz Haber Institute + - given-names: Daniel + family-names: Zรผgner + github: https://github.com/danielzuegner + affiliation: Microsoft Research + - given-names: Ji + family-names: Qi + github: https://github.com/JiQi535 + affiliation: University of California, San Diego +version: 0.0.13 +date-released: 2024-01-08 +repository-code: https://github.com/materialsproject/atomate2 +license: cc-by-4.0 +license-url: https://github.com/materialsproject/atomate2/blob/main/LICENSE +type: software diff --git a/docs/_static/fonts/lato-bold-italic.woff b/docs/_static/fonts/lato-bold-italic.woff new file mode 100644 index 0000000000..88ad05b9ff Binary files /dev/null and b/docs/_static/fonts/lato-bold-italic.woff differ diff --git a/docs/_static/fonts/lato-bold-italic.woff2 b/docs/_static/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000..c4e3d804b5 Binary files /dev/null and b/docs/_static/fonts/lato-bold-italic.woff2 differ diff --git a/docs/_static/fonts/lato-bold.woff b/docs/_static/fonts/lato-bold.woff new file mode 100644 index 0000000000..c6dff51f06 Binary files /dev/null and b/docs/_static/fonts/lato-bold.woff differ diff --git a/docs/_static/fonts/lato-bold.woff2 b/docs/_static/fonts/lato-bold.woff2 new file mode 100644 index 0000000000..bb195043cf Binary files /dev/null and b/docs/_static/fonts/lato-bold.woff2 differ diff --git a/docs/_static/fonts/lato-normal-italic.woff b/docs/_static/fonts/lato-normal-italic.woff new file mode 100644 index 0000000000..76114bc033 Binary files /dev/null and b/docs/_static/fonts/lato-normal-italic.woff differ diff --git a/docs/_static/fonts/lato-normal-italic.woff2 b/docs/_static/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000000..3404f37e2e Binary files /dev/null and b/docs/_static/fonts/lato-normal-italic.woff2 differ diff --git a/docs/_static/fonts/lato-normal.woff b/docs/_static/fonts/lato-normal.woff new file mode 100644 index 0000000000..ae1307ff5f Binary files /dev/null and b/docs/_static/fonts/lato-normal.woff differ diff --git a/docs/_static/fonts/lato-normal.woff2 b/docs/_static/fonts/lato-normal.woff2 new file mode 100644 index 0000000000..3bf9843328 Binary files /dev/null and b/docs/_static/fonts/lato-normal.woff2 differ diff --git a/docs/about/contributors.md b/docs/about/contributors.md index 987bb88d8e..94a414c9b9 100644 --- a/docs/about/contributors.md +++ b/docs/about/contributors.md @@ -103,6 +103,13 @@ University of Arizona [tpurcell90]: https://github.com/tpurcell90 [0000-0003-4564-7206]: https://orcid.org/0000-0003-4564-7206 +**Andrei Sobolev** [![gh]][ansobolev] [![orc]][0000-0001-5086-6601] \ +Software Scientist \ +MS1P e.V. + +[ansobolev]: https://github.com/ansobolev +[0000-0001-5086-6601]: https://orcid.org/0000-0001-5086-6601 + **Alexander Bonkowski** [![gh]][ab5424] [![orc]][0000-0002-0525-4742] \ PhD student in Chemistry \ RWTH Aachen University @@ -116,3 +123,9 @@ University of California, Berkeley [matthewkuner]: https://github.com/matthewkuner [0000-0002-8218-8558]: https://orcid.org/0000-0002-8218-8558 + +**Rhys Goodall** [![gh]][comprhys] [![orc]][0000-0002-6589-1700] \ +Hobbyist Contributor + +[comprhys]: https://github.com/comprhys +[0000-0002-6589-1700]: https://orcid.org/0000-0002-6589-1700 diff --git a/docs/conf.py b/docs/conf.py index b94d57786a..815264ebd5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,7 +18,7 @@ # -- Project information ----------------------------------------------------- project = "atomate2" -copyright = "2023, materialsproject" +copyright = "2023, materialsproject" # noqa: A001 author = "Alex Ganose" # The short X.Y version diff --git a/docs/dev/vasp_tests.md b/docs/dev/vasp_tests.md index 60ec45e7ef..dcee0e69e9 100644 --- a/docs/dev/vasp_tests.md +++ b/docs/dev/vasp_tests.md @@ -59,7 +59,7 @@ The script should also contain some additional code that will allow `atm dev vasp-test-data` to process the reference data. Below we give an example used to generate the elastic constant workflow test data. -```python +```py from atomate2.vasp.flows.elastic import ElasticMaker from atomate2.vasp.powerups import update_user_kpoints_settings from pymatgen.core import Structure @@ -114,18 +114,17 @@ atm dev vasp-test-data WF_NAME ``` You should change WF_NAME to be a name for the workflow. Note, WF_NAME should not -contain spaces or punctuation. For example, the elastic constant workflow test data was -genenerated using `atm dev vasp-test-data Si_elastic`. +contain spaces or punctuation. For example, the elastic constant workflow test data was generated using `atm dev vasp-test-data Si_elastic`. This will generate a folder in the current directory called "WF_NAME" that contains the folders in the correct format. ````{note} By default, the script will only copy POTCAR, POSCAR, CONTCAR, KPOINTS, INCAR, -vasprun.xml, OUTCAR and json files to the WF_NAME folder. If additional files are +vasprun.xml, OUTCAR and JSON files to the WF_NAME folder. If additional files are needed for specific steps of the workflow you need to copy them in manually. A mapping from jobflow calculation folder to job folder in WF_NAME is given at the -to of the `atm dev vasp-test-data` script output. E.g., it will look something +top of the `atm dev vasp-test-data` script output. E.g., it will look something like ``` @@ -162,7 +161,7 @@ The most important part is the section that mocks VASP and configures which chec to perform on the input files. For the elastic constant workflow, it looks something like this: -```python +```py # mapping from job name to directory containing test files ref_paths = { "elastic relax 1/6": "Si_elastic/elastic_relax_1_6", @@ -215,7 +214,7 @@ the k-point density during the test. Finally, you should add `assert` statements to validate the workflow outputs. As an example, the full elastic workflow test is reproduced below. -```python +```py def test_elastic(mock_vasp, clean_dir): import numpy as np from jobflow import run_locally diff --git a/docs/dev/workflow_tutorial.md b/docs/dev/workflow_tutorial.md index cb7d9c2365..8c7adb266f 100644 --- a/docs/dev/workflow_tutorial.md +++ b/docs/dev/workflow_tutorial.md @@ -1,4 +1,4 @@ -# How to Develop a new workflow for `atomate2` +# How to develop a new `atomate2` workflow ## Anatomy of an `atomate2` computational workflow (i.e., what do I need to write?) @@ -6,7 +6,7 @@ Every `atomate2` workflow is an instance of jobflow's `Flow ` class, which is a In the context of computational materials science, `Flow ` objects are most easily created by a `Maker`, which contains a factory method make() that produces a `Flow `, given certain inputs. Typically, the input to `Maker`.make() includes atomic coordinate information in the form of a `pymatgen` `Structure` or `Molecule` object. So the basic signature looks like this: -```python +```py class ExampleMaker(Maker): def make(self, coordinates: Structure) -> Flow: # take the input coordinates and return a `Flow ` @@ -18,7 +18,7 @@ The `Maker` class usually contains most of the calculation parameters and other One common task encountered in almost any materials science calculation is writing calculation input files to disk so they can be executed by the underlying software (e.g., VASP, Q-Chem, CP2K, etc.). This is preferably done via a `pymatgen` `InputSet` class. `InputSet` is essentially a dict-like container that specifies the files that need to be written, and their contents. Similarly to the way that `Maker` classes generate `Flow`s, `InputSet`s are most easily created by `InputGenerator` classes. `InputGenerator` have a method `get_input_set()` that typically takes atomic coordinates (e.g., a `Structure` or `Molecule` object) and produce an `InputSet`, e.g., -```python +```py class ExampleInputGenerator(InputGenerator): def get_input_set(self, coordinates: Structure) -> InputSet: # take the input coordinates, determine appropriate @@ -30,7 +30,7 @@ class ExampleInputGenerator(InputGenerator): **TODO - the code block below needs refinement. Not exactly sure how write_inputs() fits into a`Job`** -```python +```py class ExampleMaker(Maker): input_set_generator: ExampleInputGenerator = field( default_factory=ExampleInputGenerator diff --git a/docs/index.md b/docs/index.md index dbe5b9bec7..646fad8693 100644 --- a/docs/index.md +++ b/docs/index.md @@ -18,6 +18,7 @@ reference/index :caption: Developer Guide :hidden: dev/dev_install +dev/workflow_tutorial dev/vasp_tests ``` diff --git a/docs/user/atomate-1-vs-2.md b/docs/user/atomate-1-vs-2.md index 3aa317dfe9..8a54a1103f 100644 --- a/docs/user/atomate-1-vs-2.md +++ b/docs/user/atomate-1-vs-2.md @@ -2,6 +2,7 @@ This document contains introductory context for people coming from atomate 1. One of atomate2's core ideas is to allow scaling from a single material, to 100 materials, or 100,000 materials. Therefore, both local submission options and a connection to workflow managers such as FireWorks exist. We plan to support more workflow managers in the future to further ease job submission. + ## Relation between managers running the actual jobs and the workflow as written in `atomate2` There is no leakage between job manager and the workflow definition in `atomate2`. For example, Fireworks is not a required dependency of `atomate2` or `jobflow`. Any `atomate2` workflow can be run using the local manager or an extensible set of external providers, Fireworks just one among them. E.g. all tests are run with mocked calls to the executables using the local manager. diff --git a/docs/user/codes/vasp.md b/docs/user/codes/vasp.md index f3a2134d9a..274cc0567c 100644 --- a/docs/user/codes/vasp.md +++ b/docs/user/codes/vasp.md @@ -232,6 +232,12 @@ converted into a dynamical matrix. To correct for polarization effects, a correc dynamical matrix based on BORN charges can be performed. Finally, phonon densities of states, phonon band structures and thermodynamic properties are computed. +```{warning} +The current implementation of the workflow does not consider the initial magnetic moments +for the determination of the symmetry of the structure; therefore, they are removed from the structure. +``` + + ```{note} It is heavily recommended to symmetrize the structure before passing it to this flow. Otherwise, a different space group might be detected and too @@ -258,9 +264,16 @@ VASP_CMD: <> LOBSTER_CMD: <> ``` +```{note} +A LOBSTER workflow with settings compatible to LOBSTER database (Naik, A.A., et al. Sci Data 10, 610 (2023). https://doi.org/10.1038/s41597-023-02477-5 , currently being integrated into Materials Project) is also available now, +which could be used by simply importing from atomate2.vasp.flows.mp > MPVaspLobsterMaker +instead of VaspLobsterMaker. Rest of the things to execute the workflow stays same as +shown below. +``` + The corresponding flow could, for example, be started with the following code: -```Python +```py from jobflow import SETTINGS from jobflow import run_locally from pymatgen.core.structure import Structure @@ -287,7 +300,7 @@ It is, however, computationally very beneficial to define two different types o Specifically, you might want to change the `_fworker` for the LOBSTER runs and define a separate `lobster` worker within FireWorks: -```python +```py from fireworks import LaunchPad from jobflow.managers.fireworks import flow_to_workflow from pymatgen.core.structure import Structure @@ -321,7 +334,7 @@ lpad.add_wf(wf) Outputs from the automatic analysis with LobsterPy can easily be extracted from the database and also plotted: -```python +```py from jobflow import SETTINGS from pymatgen.electronic_structure.cohp import Cohp from pymatgen.electronic_structure.plotter import CohpPlotter @@ -339,7 +352,7 @@ result = store.query_one( ) for number, (key, cohp) in enumerate( - result["output"]["lobsterpy_data"]["cohp_plot_data"].items() + result["output"]["lobsterpy_data"]["cohp_plot_data"]["data"].items() ): plotter = CohpPlotter() cohp = Cohp.from_dict(cohp) @@ -347,7 +360,7 @@ for number, (key, cohp) in enumerate( plotter.save_plot(f"plots_all_bonds{number}.pdf") for number, (key, cohp) in enumerate( - result["output"]["lobsterpy_data_cation_anion"]["cohp_plot_data"].items() + result["output"]["lobsterpy_data_cation_anion"]["cohp_plot_data"]["data"].items() ): plotter = CohpPlotter() cohp = Cohp.from_dict(cohp) @@ -363,7 +376,7 @@ The inputs for a calculation can be modified in several ways. Every VASP job takes a {obj}`.VaspInputGenerator` as an argument (`input_set_generator`). One option is to specify an alternative input set generator: -```python +```py from atomate2.vasp.sets.core import StaticSetGenerator from atomate2.vasp.jobs.core import StaticMaker @@ -382,7 +395,7 @@ The second approach is to edit the job after it has been made. All VASP jobs hav the `input_set_generator` attribute maker will update the input set that gets written: -```python +```py static_job.maker.input_set_generator.user_incar_settings["LOPTICS"] = True ``` @@ -392,7 +405,7 @@ functions called "powerups" that can apply settings updates to all VASP jobs in These powerups also contain filters for the name of the job and the maker used to generate them. -```python +```py from atomate2.vasp.powerups import update_user_incar_settings from atomate2.vasp.flows.elastic import ElasticMaker from atomate2.vasp.flows.core import DoubleRelaxMaker @@ -469,7 +482,7 @@ All VASP workflows are constructed using the `Maker.make()` function. The argume for this function always include: - `structure`: A pymatgen structure. -- `prev_vasp_dir`: A previous VASP directory to copy output files from. +- `prev_dir`: A previous VASP directory to copy output files from. There are two options when chaining workflows: @@ -480,12 +493,12 @@ There are two options when chaining workflows: set KSPACING), and the magnetic moments. Some workflows will also use other outputs. For example, the Band Structure workflow will copy the CHGCAR file (charge density) from the previous calculation. This can be achieved by setting both the - `structure` and `prev_vasp_dir` arguments. + `structure` and `prev_dir` arguments. These two examples are illustrated in the code below, where we chain a relaxation calculation and a static calculation. -```python +```py from jobflow import Flow from atomate2.vasp.jobs.core import RelaxMaker, StaticMaker from pymatgen.core.structure import Structure @@ -500,7 +513,7 @@ static_job = StaticMaker().make(structure=relax_job.output.structure) # create a static job that will use additional outputs from the relaxation static_job = StaticMaker().make( - structure=relax_job.output.structure, prev_vasp_dir=relax_job.output.dir_name + structure=relax_job.output.structure, prev_dir=relax_job.output.dir_name ) # create a flow including the two jobs and set the output to be that of the static diff --git a/docs/user/fireworks.md b/docs/user/fireworks.md index defad2ca5a..abbdf440ae 100644 --- a/docs/user/fireworks.md +++ b/docs/user/fireworks.md @@ -13,9 +13,10 @@ FireWorks workflow using the {obj}`~jobflow.managers.fireworks.flow_to_workflow` The workflow can then be submitted to the launchpad in the usual way. For example, to submit an MgO band structure workflow using FireWorks: -```python +```py from fireworks import LaunchPad from atomate2.vasp.flows.core import RelaxBandStructureMaker +from atomate2.vasp.powerups import add_metadata_to_flow from jobflow.managers.fireworks import flow_to_workflow from pymatgen.core import Structure @@ -29,6 +30,14 @@ mgo_structure = Structure( # make a band structure flow to optimise the structure and obtain the band structure bandstructure_flow = RelaxBandStructureMaker().make(mgo_structure) +# (Optional) add metadata to the flow task document. +# Could be useful to filter specific results from the database. +# For e.g., adding material project ID for the compound, use following lines +bandstructure_flow = add_metadata_to_flow( + flow=bandstructure_flow, + additional_fields={"mp_id": "mp-190"}, +) + # convert the flow to a fireworks WorkFlow object wf = flow_to_workflow(bandstructure_flow) @@ -37,7 +46,7 @@ lpad = LaunchPad.auto_load() lpad.add_wf(wf) ``` -Additional details about interfacing Jobflow-based packages with FireWorks can be found in the [Running Jobflow with FireWorks](fw_guide) guide. +Additional details about interfacing Jobflow-based packages with FireWorks can be found in the [Running Jobflow with FireWorks][fw_guide] guide. [fireworks]: https://materialsproject.github.io/fireworks/ [fireworks_instructions]: https://materialsproject.github.io/jobflow/install_fireworks.html diff --git a/docs/user/install.md b/docs/user/install.md index d1ec9ecc39..60dd7d5e36 100644 --- a/docs/user/install.md +++ b/docs/user/install.md @@ -5,14 +5,14 @@ ## Introduction This guide will get you up and running in an environment for running high-throughput -workflows with atomate2. atomate2 is built on the pymatgen, custodian, jobflow, and -FireWorks libraries. Briefly: +workflows with atomate2. atomate2 is built on the `pymatgen`, `custodian`, `jobflow`, and +`FireWorks` libraries. Briefly: -- [pymatgen] is used to create input files and analyze the output of materials science codes. -- [custodian] runs your simulation code (e.g., VASP) and performs error checking/handling +- [`pymatgen`] is used to create input files and analyze the output of materials science codes. +- [`custodian`] runs your simulation code (e.g., VASP) and performs error checking/handling and checkpointing. -- [jobflow] is used to design computational workflows. -- [FireWorks] (optional) is used to manage and execute workflows on HPC machines. +- [`jobflow`] is used to design computational workflows. +- [`FireWorks`] (optional) is used to manage and execute workflows on HPC machines. Running and writing your own workflows are covered in later tutorials. For now, these topics will be covered in enough depth to get you set up and to help you know where to @@ -21,10 +21,10 @@ troubleshoot if you're having problems. Note that this installation tutorial is VASP-centric since almost all functionality currently in atomate2 pertains to VASP. -[pymatgen]: http://pymatgen.org -[custodian]: https://materialsproject.github.io/custodian -[fireworks]: https://materialsproject.github.io/fireworks -[jobflow]: https://materialsproject.github.io/jobflow +[`pymatgen`]: http://pymatgen.org +[`custodian`]: https://materialsproject.github.io/custodian +[`fireworks`]: https://materialsproject.github.io/fireworks +[`jobflow`]: https://materialsproject.github.io/jobflow ### Objectives @@ -76,16 +76,16 @@ MongoDB must be running and available to accept connections whenever you're runn workflows. Thus, it is strongly recommended that you have a server to run MongoDB or (simpler) use a hosting service. Your options are: -- Use a commercial service to host your MongoDB instance. These are typically the +1. Use a commercial service to host your MongoDB instance. These are typically the easiest to use and offer high-quality service but require payment for larger databases. [MongoDB Atlas](https://www.mongodb.com/cloud/atlas) offers a free 500 MB - server which is certainly enough to get started for small to medium size projects, and + server which is certainly enough to get started for small to medium-sized projects, and it is easy to upgrade or migrate your database if you exceed the free allocation. -- Contact your supercomputing center to see if they offer MongoDB hosting (e.g., NERSC +1. Contact your supercomputing center to see if they offer MongoDB hosting (e.g., NERSC has this, Google "request NERSC MongoDB database"). -- Self-host a MongoDB server. +1. Self-host a MongoDB server. -If you're just starting, we suggest the first (with a free plan) or second option +If you're just starting, we suggest option 1 (with a free plan) or 2 (if available to you). The third option will require you to open up network settings to accept outside connections properly which can sometimes be tricky. @@ -113,7 +113,7 @@ issues later in this tutorial, some options are: ## Create a directory scaffold for atomate2 -Installing atomate2 includes installation of codes, configuration files, and various +Installing atomate2 includes the installation of codes, configuration files, and various binaries and libraries. Thus, it is useful to create a directory structure that organizes all these items. @@ -140,7 +140,7 @@ Make sure to create a Python 3.8+ environment as recent versions of atomate2 onl support Python 3.8 and higher. ``` -We highly recommended that you organize your installation of the atomate2 and the other +We highly recommend that you organize your installation of the atomate2 and the other Python codes using a conda virtual environment. Some of the main benefits are: - Different Python projects that have conflicting packages can coexist on the same @@ -194,7 +194,7 @@ that are unique only to these databases. Create the following files in `<>/config`. -### jobflow.yaml +### `jobflow.yaml` The `jobflow.yaml` file contains the credentials of the MongoDB server that will store calculation outputs. The `jobflow.yaml` file requires you to enter the basic database @@ -351,14 +351,13 @@ workflows. ### Define the workflow Workflows are written using the `jobflow` software. Essentially, individual stages of -a workflow are simple Python functions. Jobflow provides a way to connect jobs together -in a natural way. For more details on connecting jobs together see: -[](connecting_vasp_jobs). +a workflow are simple Python functions. Jobflow provides a way to connect jobs in a natural way. +For more details on connecting jobs see: [](connecting_vasp_jobs). Go to the directory where you would like your calculations to run (i.e., your scratch or work directory) and create a file called `relax.py` containing: -```python +```py from atomate2.vasp.jobs.core import RelaxMaker from jobflow import run_locally from pymatgen.core import Structure @@ -416,7 +415,7 @@ on the Grid Engine scheduler, this would be using `qsub job.sh`. Once the job is finished, you can connect to the output database and check the job output. -```python +```py from jobflow import SETTINGS store = SETTINGS.JOB_STORE diff --git a/docs/user/running-workflows.md b/docs/user/running-workflows.md index b6d0ef69f7..28322571af 100644 --- a/docs/user/running-workflows.md +++ b/docs/user/running-workflows.md @@ -7,7 +7,7 @@ Once you have a working installation of atomate2, you'll want to jump in and start running workflows. Atomate2 includes many workflows with reasonable settings that can get you started. This tutorial will quickly guide you through customizing and running a -workflow to calculate the bandstructure of MgO. +workflow to calculate the band structure of MgO. ### Objectives @@ -16,7 +16,7 @@ workflow to calculate the bandstructure of MgO. ### Prerequisites -In order for you to complete this tutorial you need +For you to complete this tutorial you need * A working installation of atomate2. @@ -60,7 +60,7 @@ workflow. Create a Python script named `mgo_bandstructure.py` with the following contents: -```python +```py from atomate2.vasp.flows.core import RelaxBandStructureMaker from jobflow import run_locally from pymatgen.core import Structure @@ -116,7 +116,7 @@ results will be in your database. Finally, we'll plot the results that we calculated. Simply run the following Python code, either as a script or on the Python prompt. -```python +```py from jobflow import SETTINGS from pymatgen.electronic_structure.plotter import DosPlotter, BSPlotter from pymatgen.electronic_structure.dos import CompleteDos @@ -136,7 +136,7 @@ dos = CompleteDos.from_dict(result["output"]["vasp_objects"]["dos"]) # plot the DOS dos_plotter = DosPlotter() dos_plotter.add_dos_dict(dos.get_element_dos()) -dos_plotter.save_plot("MgO-dos.pdf", xlim=(-10, 10), img_format="pdf") +dos_plotter.save_plot("MgO-dos.pdf", xlim=(-10, 10)) # get the line mode bandstructure from the database result = store.query_one( @@ -150,7 +150,7 @@ bandstructure = BandStructureSymmLine.from_dict( # plot the line mode band structure bs_plotter = BSPlotter(bandstructure) -bs_plotter.save_plot("MgO-bandstructure.pdf", img_format="pdf") +bs_plotter.save_plot("MgO-bandstructure.pdf") ``` If you open the saved figures, you should see a plot of your DOS and bandstructure! diff --git a/pyproject.toml b/pyproject.toml index 6dfcd39722..e7aa3ad07f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,14 +27,14 @@ requires-python = ">=3.9" dependencies = [ "PyYAML", "click", - "custodian>=2023.3.10", - "emmet-core>=0.70.5", + "custodian>=2024.2.15", + "emmet-core>=0.78.0rc4", "jobflow>=0.1.11", - "monty>=2023.9.25", + "monty>=2024.2.2", "numpy", "pydantic-settings>=2.0.3", "pydantic>=2.0.1", - "pymatgen>=2023.10.11", + "pymatgen>=2023.12.18", ] [project.optional-dependencies] @@ -42,14 +42,20 @@ amset = ["amset>=0.4.15", "pydash"] cclib = ["cclib"] mp = ["mp-api>=0.37.5"] phonons = ["phonopy>=1.10.8", "seekpath"] -lobster = ["lobsterpy>=0.3.2"] -defects = ["dscribe>=1.2.0", "pymatgen-analysis-defects>=2022.11.30"] -forcefields = ["chgnet>=0.2.2", "matgl>=0.8.3", "quippy-ase>=0.9.14"] +lobster = ["ijson>=3.2.2", "lobsterpy>=0.3.7"] +defects = ["dscribe>=1.2.0", "pymatgen-analysis-defects>=2022.11.30", "python-ulid"] +forcefields = [ + "ase>=3.22.1", + "chgnet>=0.2.2", + "mace-torch>=0.3.3", + "matgl>=0.9.0", + "quippy-ase>=0.9.14", +] docs = [ "FireWorks==2.0.3", "autodoc_pydantic==2.0.1", - "furo==2023.9.10", - "ipython==8.16.1", + "furo==2024.1.29", + "ipython==8.22.1", "jsonschema[format]", "myst_parser==2.0.0", "numpydoc==1.6.0", @@ -58,29 +64,35 @@ docs = [ "sphinx_design==0.5.0", ] dev = ["pre-commit>=2.12.1"] -tests = ["FireWorks==2.0.3", "pytest-cov==4.1.0", "pytest==7.4.2"] +tests = ["FireWorks==2.0.3", "pytest-cov==4.1.0", "pytest==8.0.2"] strict = [ "PyYAML==6.0.1", + # must use >= for ase to not uninstall main branch install in CI + # last known working commit: https://gitlab.com/ase/ase@2bab58f4e + "ase>=3.22.1", "cclib==1.8", - "chgnet==0.2.2", + "chgnet==0.3.4", "click==8.1.7", - "custodian==2023.10.9", + "custodian==2024.2.15", "dscribe==2.1.0", - "emmet-core==0.70.5", - "jobflow==0.1.14", - "lobsterpy==0.3.2", - "matgl==0.8.3", - "monty==2023.9.25", - "mp-api==0.37.5", + "emmet-core==0.78.0rc4", + "ijson==3.2.3", + "jobflow==0.1.17", + "lobsterpy==0.3.8", + "mace-torch>=0.3.3", + "matgl==1.0.0", + "monty==2024.2.2", + "mp-api==0.40.2", "numpy", - "phonopy==2.20.0", - "pydantic-settings==2.0.3", - "pydantic==2.4.2", - "pymatgen-analysis-defects==2023.8.22", - "pymatgen==2023.10.11", + "phonopy==2.21.2", + "pydantic-settings==2.2.1", + "pydantic==2.6.2", + "pymatgen-analysis-defects==2024.2.24", + "pymatgen==2024.2.23", "quippy-ase==0.9.14", "seekpath==2.1.0", - "typing-extensions==4.8.0", + "typing-extensions==4.10.0", + "python-ulid==2.2.0" "phono3py==2.5.1" ] @@ -103,15 +115,6 @@ atomate2 = ["py.typed"] method = "git" default-tag = "0.0.1" -[tool.flake8] -max-line-length = 88 -max-doc-length = 88 -select = "C, E, F, W, B" -extend-ignore = "E203, W503, E501, F401, RST21" -min-python-version = "3.8.0" -docstring-convention = "numpy" -rst-roles = "class, func, ref, obj" - [tool.mypy] ignore_missing_imports = true no_strict_optional = true @@ -145,57 +148,50 @@ exclude_lines = [ [tool.ruff] target-version = "py39" -select = [ - "B", # flake8-bugbear - "C4", # flake8-comprehensions - "D", # pydocstyle - "E", # pycodestyle error - "EXE", # flake8-executable - "F", # pyflakes - "FA", # flake8-future-annotations - "FBT003", # boolean-positional-value-in-call - "FLY", # flynt - "I", # isort - "ICN", # flake8-import-conventions - "ISC", # flake8-implicit-str-concat - "PD", # pandas-vet - "PERF", # perflint - "PIE", # flake8-pie - "PL", # pylint - "PT", # flake8-pytest-style - "PYI", # flakes8-pyi - "Q", # flake8-quotes - "RET", # flake8-return - "RSE", # flake8-raise - "RUF", # Ruff-specific rules - "SIM", # flake8-simplify - "SLOT", # flake8-slots - "TCH", # flake8-type-checking - "TID", # flake8-tidy-imports - "UP", # pyupgrade - "W", # pycodestyle warning - "YTT", # flake8-2020 -] -ignore = [ +lint.select = ["ALL"] +lint.ignore = [ + "ANN002", + "ANN003", + "ANN101", # missing self type annotation + "ANN102", + "ANN401", + "ARG002", # unused method argument + "BLE001", + "C408", # Unnecessary (dict/list/tuple) call - remove call + "C901", # function too complex + "COM812", # trailing comma missing + "DTZ", # datetime-tz-now + "EM", # exception message must not use f-string literal + "ERA001", # found commented out code + "FBT001", + "FBT002", + "FIX002", + "G004", # logging uses fstring "PD011", # pandas-use-of-dot-values "PERF203", # try-except-in-loop "PLR", # pylint-refactor "PT004", # pytest-missing-fixture-name-underscore "PT006", # pytest-parametrize-names-wrong-type + "PT013", # pytest-incorrect-pytest-import + "PTH", # prefer Pathlib to os.path "RUF013", # implicit-optional - # TODO remove PT011, pytest.raises() should always check err msg - "PT011", # pytest-raises-too-broad - "PT013", # pytest-incorrect-pytest-import + "S324", # use of insecure hash function + "SLF", # private member accessed outside class + "TD", # TODOs + "TRY003", # long message outside exception class + "S507", # paramiko auto trust ] -pydocstyle.convention = "numpy" -isort.known-first-party = ["atomate2"] +lint.pydocstyle.convention = "numpy" +lint.isort.known-first-party = ["atomate2"] +lint.isort.split-on-trailing-comma = false -[tool.ruff.per-file-ignores] +[tool.ruff.lint.per-file-ignores] "__init__.py" = ["F401"] -"**/tests/*" = ["D"] +"**/tests/*" = ["ANN", "ARG001", "D", "INP001", "S101"] # flake8-type-checking (TCH): things inside TYPE_CHECKING aren't available # at runtime and so can't be used by pydantic models # flake8-future-annotations (FA): pipe operator for type unions only work in pydantic models in python 3.10+ "**/schemas/*" = ["FA", "TCH", "UP007"] "**/schemas.py" = ["FA", "TCH", "UP007"] "**/settings.py" = ["FA", "TCH", "UP007"] +"docs/*" = ["INP001"] diff --git a/src/atomate2/aims/__init__.py b/src/atomate2/aims/__init__.py new file mode 100644 index 0000000000..f81a7f8131 --- /dev/null +++ b/src/atomate2/aims/__init__.py @@ -0,0 +1 @@ +"""FHI-aims interface for atomate2.""" diff --git a/src/atomate2/aims/files.py b/src/atomate2/aims/files.py new file mode 100644 index 0000000000..5e1a9d149f --- /dev/null +++ b/src/atomate2/aims/files.py @@ -0,0 +1,151 @@ +"""Functions dealing with FHI-aims files.""" +from __future__ import annotations + +import logging +from glob import glob +from pathlib import Path +from typing import TYPE_CHECKING + +from atomate2.common.files import copy_files, get_zfile, gunzip_files +from atomate2.utils.file_client import FileClient, auto_fileclient +from atomate2.utils.path import strip_hostname + +if TYPE_CHECKING: + from collections.abc import Sequence + + from pymatgen.core import Molecule, Structure + from pymatgen.io.aims.sets.base import AimsInputGenerator + +logger = logging.getLogger(__name__) + +__all__ = ["copy_aims_outputs", "write_aims_input_set", "cleanup_aims_outputs"] + + +@auto_fileclient +def copy_aims_outputs( + src_dir: Path | str, + src_host: str | None = None, + additional_aims_files: list[str] | None = None, + restart_to_input: bool = False, + file_client: FileClient | None = None, +) -> None: + """ + Copy FHI-aims output files to the current directory (inspired by CP2K plugin). + + Parameters + ---------- + src_dir : str or Path + The source directory. + src_host : str or None + The source hostname used to specify a remote filesystem. Can be given as + either "username@remote_host" or just "remote_host" in which case the username + will be inferred from the current user. If ``None``, the local filesystem will + be used as the source. + additional_aims_files : list[str] + Additional files to copy + restart_to_input : bool + Move the aims restart files to by the aims input in the new directory + file_client : .FileClient + A file client to use for performing file operations. + """ + src_dir = strip_hostname(src_dir) + logger.info(f"Copying FHI-aims inputs from {src_dir}") + directory_listing = file_client.listdir(src_dir, host=src_host) + # additional files like bands, DOS, *.cube, whatever + additional_files = additional_aims_files if additional_aims_files else [] + + # copy files + # (no need to copy aims.out by default; it can be added to additional_aims_files + # explicitly if needed) + files: list[str] = ( + ["hessian.aims", "geometry.in.next_step", "*.csc"] if restart_to_input else [] + ) + + files += [ + Path(f).name + for pattern in set(files + additional_files) + for f in glob((Path(src_dir) / pattern).as_posix()) + ] + + all_files = [ + get_zfile(directory_listing, str(r), allow_missing=True) for r in files + ] + all_files = [f for f in all_files if f] + + copy_files( + src_dir, + src_host=src_host, + include_files=all_files, + file_client=file_client, + ) + + zipped_files = [f for f in all_files if f.name.endswith("gz")] + + gunzip_files( + include_files=zipped_files, + allow_missing=True, + file_client=file_client, + ) + + logger.info("Finished copying inputs") + + +def write_aims_input_set( + structure: Structure | Molecule, + input_set_generator: AimsInputGenerator, + directory: str | Path = ".", + prev_dir: str | Path | None = None, + **kwargs, +) -> None: + """ + Write FHI-aims input set. + + Parameters + ---------- + structure : Structure or Molecule + A to write the input set for. + input_set_generator : .AimsInputGenerator + An GHI-aims input set generator. + directory : str or Path + The directory to write the input files to. + prev_dir : str or Path or None + If the input set is to be initialized from a previous calculation, + the previous calc directory + **kwargs + Keyword arguments to pass to :obj:`.AimsInputSet.write_input`. + """ + properties = kwargs.get("properties", []) + aims_is = input_set_generator.get_input_set( + structure, prev_dir=prev_dir, properties=properties + ) + + logger.info("Writing FHI-aims input set.") + aims_is.write_input(directory, **kwargs) + + +@auto_fileclient +def cleanup_aims_outputs( + directory: Path | str, + host: str | None = None, + file_patterns: Sequence[str] = (), + file_client: FileClient | None = None, +) -> None: + """Remove unnecessary files. + + Parameters + ---------- + directory: Path or str + Directory containing files + host: str or None + File client host + file_patterns: Sequence[str] + Glob patterns to find files for deletion. + file_client: .FileClient + A file client to use for performing file operations. + """ + files_to_delete = [] + for pattern in file_patterns: + files_to_delete.extend(file_client.glob(Path(directory) / pattern, host=host)) + + for file in files_to_delete: + file_client.remove(file) diff --git a/src/atomate2/aims/flows/__init__.py b/src/atomate2/aims/flows/__init__.py new file mode 100644 index 0000000000..ef12453673 --- /dev/null +++ b/src/atomate2/aims/flows/__init__.py @@ -0,0 +1 @@ +"""Workflows for FHI-aims.""" diff --git a/src/atomate2/aims/flows/core.py b/src/atomate2/aims/flows/core.py new file mode 100644 index 0000000000..a47c0124a7 --- /dev/null +++ b/src/atomate2/aims/flows/core.py @@ -0,0 +1,105 @@ +"""(Work)flows for FHI-aims.""" +from __future__ import annotations + +from copy import deepcopy +from dataclasses import dataclass, field +from pathlib import Path +from typing import TYPE_CHECKING, Any + +from jobflow import Flow, Maker +from pymatgen.io.aims.sets.core import RelaxSetGenerator + +from atomate2.aims.jobs.core import RelaxMaker + +if TYPE_CHECKING: + from pymatgen.core import Molecule, Structure + + from atomate2.aims.jobs.base import BaseAimsMaker + + +@dataclass +class DoubleRelaxMaker(Maker): + """Double relaxation maker for FHI-aims. + + A maker to perform a double relaxation in FHI-aims (first with light, + and then with tight species_defaults). + + Parameters + ---------- + name : str + A name for the flow + relax_maker1: .BaseAimsMaker + A maker that generates the first relaxation + relax_maker2: .BaseAimsMaker + A maker that generates the second relaxation + """ + + name: str = "Double relaxation" + relax_maker1: BaseAimsMaker = field(default_factory=RelaxMaker) + relax_maker2: BaseAimsMaker = field(default_factory=RelaxMaker) + + def make( + self, + structure: Structure | Molecule, + prev_dir: str | Path | None = None, + ) -> Flow: + """Create a flow with two chained relaxations. + + Parameters + ---------- + structure : Structure or Molecule + The structure to relax. + prev_dir : str or Path or None + A previous FHI-aims calculation directory to copy output files from. + """ + relax1 = self.relax_maker1.make(structure, prev_dir=prev_dir) + relax1.name += " 1" + + relax2 = self.relax_maker2.make( + relax1.output.structure, prev_dir=relax1.output.dir_name + ) + relax2.name += " 2" + + return Flow([relax1, relax2], relax2.output, name=self.name) + + @classmethod + def from_parameters( + cls, + parameters: dict[str, Any], + species_defaults: list[str] | tuple[str, str] = ("light", "tight"), + ) -> DoubleRelaxMaker: + """Create the maker from an ASE parameter set. + + Creates a DoubleRelaxFlow for the same parameters with two different + species defaults. + + Parameters + ---------- + parameters : dict + a dictionary with calculation parameters + species_defaults: list | tuple + paths for species defaults to use relative to the given `species_dir` + in parameters + """ + # various checks + if len(species_defaults) != 2: + raise ValueError( + "Two species defaults directories must be provided for DoubleRelaxFlow" + ) + if "species_dir" not in parameters: + raise KeyError("Provided parameters do not include species_dir") + species_dir = Path(parameters["species_dir"]) + for basis_set in species_defaults: + if not (species_dir / basis_set).exists(): + basis_set_dir = (species_dir / basis_set).as_posix() + raise OSError( + f"The species defaults directory {basis_set_dir} does not exist" + ) + + # now the actual work begins + makers = [] + for basis_set in species_defaults: + parameters["species_dir"] = (species_dir / basis_set).as_posix() + input_set = RelaxSetGenerator(user_params=deepcopy(parameters)) + makers.append(RelaxMaker(input_set_generator=input_set)) + return cls(relax_maker1=makers[0], relax_maker2=makers[1]) diff --git a/src/atomate2/aims/flows/gw.py b/src/atomate2/aims/flows/gw.py new file mode 100644 index 0000000000..75c26f3c48 --- /dev/null +++ b/src/atomate2/aims/flows/gw.py @@ -0,0 +1,38 @@ +"""GW workflows for FHI-aims with automatic convergence.""" +from dataclasses import dataclass, field + +from atomate2.aims.jobs.convergence import ConvergenceMaker +from atomate2.aims.jobs.core import GWMaker + + +@dataclass +class GWConvergenceMaker(ConvergenceMaker): + """A maker to perform a GW workflow with automatic convergence in FHI-aims. + + Basically a .ConvergenceMaker with adjusted defaults. Employs the fact that + GW calculations in FHI-aims scale as O(N^4) with a large prefactor, which makes + running a DFT part for any structure negligible with respect to the GW + postprocessing. + + Parameters + ---------- + name : str + A name for the job + maker: .GWMaker + A maker for the run + criterion_name: str + A name for the convergence criterion. Must be in the run results + epsilon: float + A difference in criterion value for subsequent runs + convergence_field: str + An input parameter that changes to achieve convergence + convergence_steps: Iterable + An iterable of the possible values for the convergence field. + If the iterable is depleted and the convergence is not reached, + then the job is failed + """ + + name: str = "GW convergence" + maker: GWMaker = field(default_factory=GWMaker) + criterion_name: str = "bandgap" + epsilon: float = 0.1 diff --git a/src/atomate2/aims/flows/phonons.py b/src/atomate2/aims/flows/phonons.py new file mode 100644 index 0000000000..817ee9a842 --- /dev/null +++ b/src/atomate2/aims/flows/phonons.py @@ -0,0 +1,154 @@ +"""Defines the phonon workflows for FHI-aims.""" +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import TYPE_CHECKING + +from atomate2.aims.jobs.core import RelaxMaker, StaticMaker +from atomate2.aims.jobs.phonons import ( + PhononDisplacementMaker, + PhononDisplacementMakerSocket, +) +from atomate2.common.flows.phonons import BasePhononMaker + +if TYPE_CHECKING: + from atomate2.aims.jobs.base import BaseAimsMaker + + +@dataclass +class PhononMaker(BasePhononMaker): + """Maker to calculate harmonic phonons with FHI-aims and Phonopy. + + Calculate the harmonic phonons of a material. Initially, a tight structural + relaxation is performed to obtain a structure without forces on the atoms. + Subsequently, supercells with one displaced atom are generated and accurate + forces are computed for these structures. With the help of phonopy, these + forces are then converted into a dynamical matrix. To correct for polarization + effects, a correction of the dynamical matrix based on BORN charges can + be performed. Finally, phonon densities of states, phonon band structures + and thermodynamic properties are computed. + + .. Note:: + It is heavily recommended to symmetrize the structure before passing it to + this flow. Otherwise, a different space group might be detected and too + many displacement calculations will be generated. + It is recommended to check the convergence parameters here and + adjust them if necessary. The default might not be strict enough + for your specific case. + + Parameters + ---------- + name : str + Name of the flows produced by this maker. + sym_reduce : bool + Whether to reduce the number of deformations using symmetry. + symprec : float + Symmetry precision to use in the + reduction of symmetry to find the primitive/conventional cell + (use_primitive_standard_structure, use_conventional_standard_structure) + and to handle all symmetry-related tasks in phonopy + displacement: float + displacement distance for phonons + min_length: float + min length of the supercell that will be built + prefer_90_degrees: bool + if set to True, supercell algorithm will first try to find a supercell + with 3 90 degree angles + get_supercell_size_kwargs: dict + kwargs that will be passed to get_supercell_size to determine supercell size + use_symmetrized_structure: str + allowed strings: "primitive", "conventional", None + + - "primitive" will enforce to start the phonon computation + from the primitive standard structure + according to Setyawan, W., & Curtarolo, S. (2010). + High-throughput electronic band structure calculations: + Challenges and tools. Computational Materials Science, + 49(2), 299-312. doi:10.1016/j.commatsci.2010.05.010. + This makes it possible to use certain k-path definitions + with this workflow. Otherwise, we must rely on seekpath + - "conventional" will enforce to start the phonon computation + from the conventional standard structure + according to Setyawan, W., & Curtarolo, S. (2010). + High-throughput electronic band structure calculations: + Challenges and tools. Computational Materials Science, + 49(2), 299-312. doi:10.1016/j.commatsci.2010.05.010. + We will however use seekpath and primitive structures + as determined by from phonopy to compute the phonon band structure + bulk_relax_maker : .BaseAimsMaker or None + A maker to perform a tight relaxation on the bulk. + Set to ``None`` to skip the + bulk relaxation + static_energy_maker : .BaseAimsMaker or None + A maker to perform the computation of the DFT energy on the bulk. + Set to ``None`` to skip the + static energy computation + born_maker: .BaseAimsMaker or None + Maker to compute the BORN charges. + phonon_displacement_maker : .BaseAimsMaker or None + Maker used to compute the forces for a supercell. + generate_frequencies_eigenvectors_kwargs : dict + Keyword arguments passed to :obj:`generate_frequencies_eigenvectors`. + create_thermal_displacements: bool + Bool that determines if thermal_displacement_matrices are computed + kpath_scheme: str + scheme to generate kpoints. Please be aware that + you can only use seekpath with any kind of cell + Otherwise, please use the standard primitive structure + Available schemes are: + "seekpath", "hinuma", "setyawan_curtarolo", "latimer_munro". + "seekpath" and "hinuma" are the same definition but + seekpath can be used with any kind of unit cell as + it relies on phonopy to handle the relationship + to the primitive cell and not pymatgen + code: str + determines the dft or forcefield code. + store_force_constants: bool + if True, force constants will be stored + socket: bool + If True, use the socket for the calculation + """ + + name: str = "phonon" + sym_reduce: bool = True + symprec: float = 1e-4 + displacement: float = 0.01 + min_length: float | None = 20.0 + prefer_90_degrees: bool = True + get_supercell_size_kwargs: dict = field(default_factory=dict) + use_symmetrized_structure: str | None = None + create_thermal_displacements: bool = True + generate_frequencies_eigenvectors_kwargs: dict = field(default_factory=dict) + kpath_scheme: str = "seekpath" + store_force_constants: bool = True + socket: bool = False + code: str = "aims" + bulk_relax_maker: BaseAimsMaker | None = field( + default_factory=lambda: RelaxMaker.full_relaxation() + ) + static_energy_maker: BaseAimsMaker | None = field(default_factory=StaticMaker) + born_maker: BaseAimsMaker | None = None + phonon_displacement_maker: BaseAimsMaker | None = None + + def __post_init__(self) -> None: + """Set the default phonon_displacement_maker. + + Set the displacement maker based on whether the socket communicator is used + """ + if self.phonon_displacement_maker is None: + if self.socket: + self.phonon_displacement_maker = PhononDisplacementMakerSocket() + else: + self.phonon_displacement_maker = PhononDisplacementMaker() + + @property + def prev_calc_dir_argname(self) -> str: + """Name of argument informing static maker of previous calculation directory. + + As this differs between different DFT codes (e.g., VASP, CP2K), it + has been left as a property to be implemented by the inheriting class. + + Note: this is only applicable if a relax_maker is specified; i.e., two + calculations are performed for each ordering (relax -> static) + """ + return "prev_dir" diff --git a/src/atomate2/aims/jobs/__init__.py b/src/atomate2/aims/jobs/__init__.py new file mode 100644 index 0000000000..f6d79b2728 --- /dev/null +++ b/src/atomate2/aims/jobs/__init__.py @@ -0,0 +1 @@ +"""Define all FHI-aims jobs.""" diff --git a/src/atomate2/aims/jobs/base.py b/src/atomate2/aims/jobs/base.py new file mode 100644 index 0000000000..b9c4617de4 --- /dev/null +++ b/src/atomate2/aims/jobs/base.py @@ -0,0 +1,138 @@ +"""Defines the base FHI-aims Maker.""" + +from __future__ import annotations + +import logging +from dataclasses import dataclass, field +from pathlib import Path +from typing import TYPE_CHECKING, Any + +from jobflow import Maker, Response, job +from monty.serialization import dumpfn +from pymatgen.io.aims.sets.base import AimsInputGenerator + +from atomate2 import SETTINGS +from atomate2.aims.files import ( + cleanup_aims_outputs, + copy_aims_outputs, + write_aims_input_set, +) +from atomate2.aims.run import run_aims, should_stop_children +from atomate2.aims.schemas.task import AimsTaskDoc +from atomate2.common.files import gzip_output_folder + +if TYPE_CHECKING: + from pymatgen.core import Molecule, Structure + +logger = logging.getLogger(__name__) + +# Input files. +# Exclude those that are also outputs +_INPUT_FILES = [ + "geometry.in", + "control.in", +] + +# Output files. +_OUTPUT_FILES = ["aims.out", "geometry.in.next_step", "hessian.aims", "*.cube", "*.csc"] + +# Files to zip: inputs, outputs and additionally generated files +_FILES_TO_ZIP = _INPUT_FILES + _OUTPUT_FILES + + +@dataclass +class BaseAimsMaker(Maker): + """ + Base FHI-aims job maker. + + Parameters + ---------- + name : str + The job name. + input_set_generator : .AimsInputGenerator + A generator used to make the input set. + write_input_set_kwargs : dict[str, Any] + Keyword arguments that will get passed to :obj:`.write_aims_input_set`. + copy_aims_kwargs : dict[str, Any] + Keyword arguments that will get passed to :obj:`.copy_aims_outputs`. + run_aims_kwargs : dict[str, Any] + Keyword arguments that will get passed to :obj:`.run_aims`. + task_document_kwargs : dict[str, Any] + Keyword arguments that will get passed to :obj:`.TaskDoc.from_directory`. + stop_children_kwargs : dict[str, Any] + Keyword arguments that will get passed to :obj:`.should_stop_children`. + write_additional_data : dict[str, Any] + Additional data to write to the current directory. Given as a dict of + {filename: data}. Note that if using FireWorks, dictionary keys cannot contain + the "." character which is typically used to denote file extensions. To avoid + this, use the ":" character, which will automatically be converted to ".". E.g. + ``{"my_file:txt": "contents of the file"}``. + store_output_data: bool + Whether the job output (TaskDoc) should be stored in the JobStore through + the response. + """ + + name: str = "base" + input_set_generator: AimsInputGenerator = field(default_factory=AimsInputGenerator) + write_input_set_kwargs: dict[str, Any] = field(default_factory=dict) + copy_aims_kwargs: dict[str, Any] = field(default_factory=dict) + run_aims_kwargs: dict[str, Any] = field(default_factory=dict) + task_document_kwargs: dict[str, Any] = field(default_factory=dict) + stop_children_kwargs: dict[str, Any] = field(default_factory=dict) + write_additional_data: dict[str, Any] = field(default_factory=dict) + store_output_data: bool = True + + @job + def make( + self, + structure: Structure | Molecule, + prev_dir: str | Path | None = None, + ) -> Response: + """ + Run an FHI-aims calculation. + + Parameters + ---------- + structure : Structure or Molecule + A pymatgen Structure object to create the calculation for. + prev_dir : str or Path or None + A previous FHI-aims calculation directory to copy output files from. + """ + # copy previous inputs if needed (governed by self.copy_aims_kwargs) + if prev_dir is not None: + copy_aims_outputs(prev_dir, **self.copy_aims_kwargs) + + # write aims input files + self.write_input_set_kwargs["prev_dir"] = prev_dir + write_aims_input_set( + structure, self.input_set_generator, **self.write_input_set_kwargs + ) + + # write any additional data + for filename, data in self.write_additional_data.items(): + dumpfn(data, filename.replace(":", ".")) + + # run FHI-aims + run_aims(**self.run_aims_kwargs) + + # parse FHI-aims outputs + task_doc = AimsTaskDoc.from_directory(Path.cwd(), **self.task_document_kwargs) + task_doc.task_label = self.name + + # decide whether child jobs should proceed + stop_children = should_stop_children(task_doc, **self.stop_children_kwargs) + + # cleanup files to save disk space + cleanup_aims_outputs(directory=Path.cwd()) + + # gzip folder + gzip_output_folder( + directory=Path.cwd(), + setting=SETTINGS.VASP_ZIP_FILES, + files_list=_FILES_TO_ZIP, + ) + + return Response( + stop_children=stop_children, + output=task_doc if self.store_output_data else None, + ) diff --git a/src/atomate2/aims/jobs/convergence.py b/src/atomate2/aims/jobs/convergence.py new file mode 100644 index 0000000000..87a9741b88 --- /dev/null +++ b/src/atomate2/aims/jobs/convergence.py @@ -0,0 +1,134 @@ +"""Defines the base FHI-aims convergence jobs.""" + +from __future__ import annotations + +import json +from dataclasses import dataclass, field +from pathlib import Path +from typing import TYPE_CHECKING + +from jobflow import Flow, Maker, Response, job + +from atomate2.aims.jobs.base import BaseAimsMaker +from atomate2.aims.schemas.task import ConvergenceSummary + +if TYPE_CHECKING: + from pymatgen.core import Molecule, Structure + +CONVERGENCE_FILE_NAME = "convergence.json" # make it a constant? + + +@dataclass +class ConvergenceMaker(Maker): + """Defines a convergence workflow with a maximum number of steps. + + A job that performs convergence run for a given number of steps. Stops either + when all steps are done, or when the convergence criterion is reached, that is when + the absolute difference between the subsequent values of the convergence field is + less than a given epsilon. + + Parameters + ---------- + convergence_field: str + An input parameter that changes to achieve convergence + convergence_steps: Iterable + An iterable of the possible values for the convergence field. + If the iterable is depleted and the convergence is not reached, + then the job is failed + name : str + A name for the job + maker: .BaseAimsMaker + A maker for the run + criterion_name: str + A name for the convergence criterion. Must be in the run results + epsilon: float + A difference in criterion value for subsequent runs + """ + + convergence_field: str + convergence_steps: list | tuple + name: str = "convergence" + maker: BaseAimsMaker = field(default_factory=BaseAimsMaker) + criterion_name: str = "energy_per_atom" + epsilon: float = 0.001 + + @job + def make( + self, + structure: Structure | Molecule, + prev_dir: str | Path | None = None, + convergence_data: dict | None = None, + prev_output_value: float | None = None, + ) -> ConvergenceSummary: + """Create a top-level flow controlling convergence iteration. + + Parameters + ---------- + structure : Structure or Molecule + a structure to run a job + prev_dir : str or Path or None + An FHI-aims calculation directory in which previous run contents are stored + convergence_data : dict or None + The convergence information to date. + prev_output_value : float or None + The output value being converged from the previous aims calculation. + """ + # getting the calculation index + idx = 0 + converged = False + if convergence_data is not None: + idx = convergence_data["idx"] + convergence_data["convergence_field_values"].append( + self.convergence_steps[idx] + ) + convergence_data["criterion_values"].append(prev_output_value) + if len(convergence_data["criterion_values"]) > 1: + # checking for convergence + converged = ( + abs(prev_output_value - convergence_data["criterion_values"][-2]) + < self.epsilon + ) + idx += 1 + else: + convergence_data = { + "criterion_name": self.criterion_name, + "criterion_values": [], + "convergence_field_name": self.convergence_field, + "convergence_field_values": [], + "epsilon": self.epsilon, + } + convergence_data.update({"idx": idx, "converged": converged}) + + if prev_dir is not None: + split_prev_dir = str(prev_dir).split(":")[-1] + convergence_file = Path(split_prev_dir) / CONVERGENCE_FILE_NAME + with open(convergence_file, "w") as f: + json.dump(convergence_data, f) + + if idx < len(self.convergence_steps) and not converged: + # finding next jobs + next_base_job = self.maker.make(structure, prev_dir=prev_dir) + next_base_job.update_maker_kwargs( + { + "_set": { + f"input_set_generator->user_params->" + f"{self.convergence_field}": self.convergence_steps[idx] + } + }, + dict_mod=True, + ) + next_base_job.append_name(append_str=f" {idx}") + + next_job = self.make( + structure, + prev_dir=next_base_job.output.dir_name, + convergence_data=convergence_data, + prev_output_value=getattr( + next_base_job.output.output, self.criterion_name + ), + ) + + replace_flow = Flow([next_base_job, next_job], output=next_base_job.output) + return Response(replace=replace_flow) + + return ConvergenceSummary.from_data(structure, convergence_data) diff --git a/src/atomate2/aims/jobs/core.py b/src/atomate2/aims/jobs/core.py new file mode 100644 index 0000000000..a4f403b1d0 --- /dev/null +++ b/src/atomate2/aims/jobs/core.py @@ -0,0 +1,226 @@ +"""Define all Core FHI-aims jobs.""" +from __future__ import annotations + +import logging +from collections.abc import Sequence +from dataclasses import dataclass, field +from pathlib import Path +from typing import TYPE_CHECKING + +from jobflow import Response, job +from monty.serialization import dumpfn +from pymatgen.io.aims.parsers import read_aims_output +from pymatgen.io.aims.sets.bs import BandStructureSetGenerator, GWSetGenerator +from pymatgen.io.aims.sets.core import ( + RelaxSetGenerator, + SocketIOSetGenerator, + StaticSetGenerator, +) + +from atomate2 import SETTINGS +from atomate2.aims.files import cleanup_aims_outputs, write_aims_input_set +from atomate2.aims.jobs.base import _FILES_TO_ZIP, BaseAimsMaker +from atomate2.aims.run import run_aims_socket, should_stop_children +from atomate2.aims.schemas.task import AimsTaskDoc +from atomate2.common.files import gzip_output_folder + +if TYPE_CHECKING: + from pymatgen.core import Molecule, Structure + from pymatgen.io.aims.sets.base import AimsInputGenerator + +logger = logging.getLogger(__name__) + + +@dataclass +class StaticMaker(BaseAimsMaker): + """Maker to create FHI-aims SCF jobs. + + Parameters + ---------- + calc_type: str + The type key for the calculation + name: str + The job name + input_set_generator: .AimsInputGenerator + The InputGenerator for the calculation + """ + + calc_type: str = "scf" + name: str = "SCF Calculation" + input_set_generator: AimsInputGenerator = field(default_factory=StaticSetGenerator) + + +@dataclass +class RelaxMaker(BaseAimsMaker): + """Maker to create relaxation calculations. + + Parameters + ---------- + calc_type: str + The type key for the calculation + name: str + The job name + input_set_generator: .AimsInputGenerator + The InputGenerator for the calculation + """ + + calc_type: str = "relax" + name: str = "Relaxation calculation" + input_set_generator: AimsInputGenerator = field(default_factory=RelaxSetGenerator) + + @classmethod + def fixed_cell_relaxation(cls, *args, **kwargs) -> RelaxMaker: + """Create a fixed cell relaxation maker.""" + return cls( + input_set_generator=RelaxSetGenerator(*args, relax_cell=False, **kwargs), + name=cls.name + " (fixed cell)", + ) + + @classmethod + def full_relaxation(cls, *args, **kwargs) -> RelaxMaker: + """Create a full relaxation maker.""" + return cls( + input_set_generator=RelaxSetGenerator(*args, relax_cell=True, **kwargs) + ) + + +@dataclass +class SocketIOStaticMaker(BaseAimsMaker): + """Maker for the SocketIO calculator in FHI-aims. + + Parameters + ---------- + calc_type: str + The type key for the calculation + name: str + The job name + host: str + The name of the host to maintain the socket server on + port: int + The port number the socket server will listen on + input_set_generator: .AimsInputGenerator + The InputGenerator for the calculation + """ + + calc_type: str = "multi_scf" + name: str = "SCF Calculations Socket" + host: str = "localhost" + port: int = 12345 + input_set_generator: AimsInputGenerator = field( + default_factory=SocketIOSetGenerator + ) + + @job + def make( + self, + structure: list[Structure | Molecule], + prev_dir: str | Path | None = None, + ) -> Response: + """Run multiple FHI-aims calculation with the socket. + + Calculate the properties for multiple structures using the same parameters + using socket communication to speed up the calculations. + + Parameters + ---------- + structure : list[Molecule | Structure] + The list of structure objects to run FHI-aims on + prev_dir : str or Path or None + A previous FHI-aims calculation directory to copy output files from. + + Returns + ------- + The output response for the calculations + """ + # copy previous inputs + if not isinstance(structure, list): + structure = [structure] + + from_prev = prev_dir is not None + if from_prev: + hostless_prev_dir = str(prev_dir).split(":")[1] + images = read_aims_output(f"{hostless_prev_dir}/aims.out") + if not isinstance(images, Sequence): + images = [images] + + for img in images: + img.calc = None + + for ii in range(-1 * len(structure), 0, -1): + if structure[ii] in images: + del structure[ii] + + # write aims input files + self.write_input_set_kwargs["prev_dir"] = prev_dir + write_aims_input_set( + structure[0], self.input_set_generator, **self.write_input_set_kwargs + ) + + # write any additional data + for filename, data in self.write_additional_data.items(): + dumpfn(data, filename.replace(":", ".")) + + # run FHI-aims + run_aims_socket(structure, **self.run_aims_kwargs) + + # parse FHI-aims outputs + task_doc = AimsTaskDoc.from_directory(Path.cwd(), **self.task_document_kwargs) + task_doc.task_label = self.name + + # decide whether child jobs should proceed + stop_children = should_stop_children(task_doc, **self.stop_children_kwargs) + + # cleanup files to save disk space + cleanup_aims_outputs(directory=Path.cwd()) + + # gzip folder + gzip_output_folder( + directory=Path.cwd(), + setting=SETTINGS.VASP_ZIP_FILES, + files_list=_FILES_TO_ZIP, + ) + + return Response( + stop_children=stop_children, + output=task_doc if self.store_output_data else None, + ) + + +@dataclass +class BandStructureMaker(BaseAimsMaker): + """A job Maker for a band structure calculation. + + Parameters + ---------- + calc_type: str + The type key for the calculation + name: str + The job name + input_set_generator: .BandStructureSetGenerator + The InputGenerator for the calculation + """ + + calc_type = "band_structure" + name: str = "bands" + input_set_generator: BandStructureSetGenerator = field( + default_factory=BandStructureSetGenerator + ) + + +@dataclass +class GWMaker(BaseAimsMaker): + """A job Maker for a GW band structure calculation. + + Parameters + ---------- + calc_type: str + The type key for the calculation + name: str + The job name + input_set_generator: .GWSetGenerator + The InputGenerator for the calculation + """ + + calc_type = "gw" + name: str = "GW" + input_set_generator: GWSetGenerator = field(default_factory=GWSetGenerator) diff --git a/src/atomate2/aims/jobs/phonons.py b/src/atomate2/aims/jobs/phonons.py new file mode 100644 index 0000000000..13b11dac81 --- /dev/null +++ b/src/atomate2/aims/jobs/phonons.py @@ -0,0 +1,62 @@ +"""Define the PhononDisplacementMakers for FHI-aims.""" +from dataclasses import dataclass, field + +from pymatgen.io.aims.sets.base import AimsInputGenerator +from pymatgen.io.aims.sets.core import SocketIOSetGenerator, StaticSetGenerator + +from atomate2.aims.jobs.base import BaseAimsMaker +from atomate2.aims.jobs.core import SocketIOStaticMaker + + +@dataclass +class PhononDisplacementMaker(BaseAimsMaker): + """ + Maker to perform a static calculation as a part of the finite displacement method. + + The input set is for a static run with tighter convergence parameters. + Both the k-point mesh density and convergence parameters + are stricter than a normal relaxation. + + Parameters + ---------- + name: str + The job name. + input_set_generator: .AimsInputGenerator + A generator used to make the input set. + """ + + name: str = "phonon static aims" + + input_set_generator: AimsInputGenerator = field( + default_factory=lambda: StaticSetGenerator( + user_params={"compute_forces": True}, + user_kpoints_settings={"density": 5.0, "even": True}, + ) + ) + + +@dataclass +class PhononDisplacementMakerSocket(SocketIOStaticMaker): + """ + Maker to perform a static calculation as a part of the finite displacement method. + + The input set is for a static run with tighter convergence parameters. + Both the k-point mesh density and convergence parameters + are stricter than a normal relaxation. + + Parameters + ---------- + name: str + The job name. + input_set_generator: .AimsInputGenerator + A generator used to make the input set. + """ + + name: str = "phonon static aims socket" + + input_set_generator: AimsInputGenerator = field( + default_factory=lambda: SocketIOSetGenerator( + user_params={"compute_forces": True}, + user_kpoints_settings={"density": 5.0, "even": True}, + ) + ) diff --git a/src/atomate2/aims/run.py b/src/atomate2/aims/run.py new file mode 100644 index 0000000000..93b3218644 --- /dev/null +++ b/src/atomate2/aims/run.py @@ -0,0 +1,122 @@ +"""An FHI-aims jobflow runner.""" +from __future__ import annotations + +import json +import logging +import os +import subprocess +from os.path import expandvars +from typing import TYPE_CHECKING + +from ase.calculators.aims import Aims +from ase.calculators.socketio import SocketIOCalculator +from monty.json import MontyDecoder +from pymatgen.io.ase import AseAtomsAdaptor + +from atomate2 import SETTINGS + +if TYPE_CHECKING: + from pymatgen.core import Molecule, Structure + + from atomate2.aims.schemas.task import AimsTaskDoc +logger = logging.getLogger(__name__) + + +def run_aims( + aims_cmd: str = None, +) -> None: + """ + Run FHI-aims. + + Parameters + ---------- + aims_cmd : str + The command used to run FHI-aims (defaults to SETTINGS.AIMS_CMD). + """ + if aims_cmd is None: + aims_cmd = SETTINGS.AIMS_CMD + + aims_cmd = expandvars(aims_cmd) + + logger.info(f"Running command: {aims_cmd}") + return_code = subprocess.call(["/bin/bash", "-c", aims_cmd], env=os.environ) # noqa: S603 + logger.info(f"{aims_cmd} finished running with return code: {return_code}") + + +def should_stop_children( + task_document: AimsTaskDoc, + handle_unsuccessful: bool | str = True, +) -> bool: + """ + Decide whether child jobs should continue. + + Parameters + ---------- + task_document : .TaskDoc + An FHI-aims task document. + handle_unsuccessful : bool or str + This is a three-way toggle on what to do if your job looks OK, but is actually + not converged (either electronic or ionic): + + - `True`: Mark job as completed, but stop children. + - `False`: Do nothing, continue with workflow as normal. + - `"error"`: Throw an error. + + Returns + ------- + bool + Whether to stop child jobs. + """ + if task_document.state == "successful": + return False + + if isinstance(handle_unsuccessful, bool): + return handle_unsuccessful + + if handle_unsuccessful == "error": + raise RuntimeError("Job was not successful (not converged)!") + + raise RuntimeError(f"Unknown option for handle_unsuccessful: {handle_unsuccessful}") + + +def run_aims_socket( + structures_to_calculate: list[Structure | Molecule], aims_cmd: str = None +) -> None: + """Use the ASE interface to run FHI-aims from the socket. + + Parameters + ---------- + structures_to_calculate: list[Structure or Molecule] + The list of structures to run scf calculations on + aims_cmd: str + The aims command to use (defaults to SETTINGS.AIMS_CMD). + """ + ase_adaptor = AseAtomsAdaptor() + atoms_to_calculate = [ + ase_adaptor.get_atoms(structure) for structure in structures_to_calculate + ] + + with open("parameters.json") as param_file: + parameters = json.load(param_file, cls=MontyDecoder) + if aims_cmd: + parameters["aims_command"] = aims_cmd + elif "aims_command" not in parameters: + parameters["aims_command"] = SETTINGS.AIMS_CMD + + calculator = Aims(**parameters) + port = parameters["use_pimd_wrapper"][1] + atoms = atoms_to_calculate[0].copy() + + with SocketIOCalculator(calc=calculator, port=port) as calc: + for atoms_calc in atoms_to_calculate: + # Delete prior calculation results + calc.results.clear() + + # Reset atoms information to the new cell + atoms.info = atoms_calc.info + atoms.cell = atoms_calc.cell + atoms.positions = atoms_calc.positions + + calc.calculate(atoms, system_changes=["positions", "cell"]) + + calc.close() diff --git a/src/atomate2/aims/schemas/__init__.py b/src/atomate2/aims/schemas/__init__.py new file mode 100644 index 0000000000..ea67ae1600 --- /dev/null +++ b/src/atomate2/aims/schemas/__init__.py @@ -0,0 +1 @@ +"""Define the schemas for FHI-aims.""" diff --git a/src/atomate2/aims/schemas/calculation.py b/src/atomate2/aims/schemas/calculation.py new file mode 100644 index 0000000000..6636314d58 --- /dev/null +++ b/src/atomate2/aims/schemas/calculation.py @@ -0,0 +1,458 @@ +"""Schemas for FHI-aims calculation objects.""" +from __future__ import annotations + +import os +from collections.abc import Sequence +from datetime import datetime +from pathlib import Path +from typing import TYPE_CHECKING, Any, Optional, Union + +import numpy as np +from ase.spectrum.band_structure import BandStructure +from jobflow.utils import ValueEnum +from pydantic import BaseModel, Field +from pymatgen.core import Molecule, Structure +from pymatgen.core.trajectory import Trajectory +from pymatgen.electronic_structure.dos import Dos +from pymatgen.io.aims.outputs import AimsOutput +from pymatgen.io.common import VolumetricData + +if TYPE_CHECKING: + from emmet.core.math import Matrix3D, Vector3D + +STORE_VOLUMETRIC_DATA = ("total_density",) + + +def ensure_stress_full(input_stress: Sequence[float] | Matrix3D) -> Matrix3D: + """Test if the stress if a voigt vector and if so convert it to a 3x3 matrix.""" + if np.array(input_stress).shape == (3, 3): + return np.array(input_stress) + + xx, yy, zz, yz, xz, xy = np.array(input_stress).flatten() + return np.array([[xx, xy, xz], [xy, yy, yz], [xz, yz, zz]]) + + +class TaskState(ValueEnum): + """FHI-aims calculation state.""" + + SUCCESS = "successful" + FAILED = "failed" + + +class AimsObject(ValueEnum): + """Types of FHI-aims data objects.""" + + DOS = "dos" + BAND_STRUCTURE = "band_structure" + ELECTRON_DENSITY = "electron_density" # e_density + WFN = "wfn" # Wavefunction file + TRAJECTORY = "trajectory" + + +class CalculationOutput(BaseModel): + """Document defining FHI-aims calculation outputs. + + Parameters + ---------- + energy: float + The final total DFT energy for the calculation + energy_per_atom: float + The final DFT energy per atom for the calculation + structure: Structure or Molecule + The final pymatgen Structure or Molecule of the system + efermi: float + The Fermi level from the calculation in eV + forces: List[Vector3D] + Forces acting on each atom + all_forces: List[List[Vector3D]] + Forces acting on each atom for each structure in the output file + stress: Matrix3D + The stress on the cell + stresses: List[Matrix3D] + The atomic virial stresses + is_metal: bool + Whether the system is metallic + bandgap: float + The band gap from the calculation in eV + cbm: float + The conduction band minimum in eV (if system is not metallic + vbm: float + The valence band maximum in eV (if system is not metallic) + atomic_steps: list[Structure or Molecule] + Structures for each ionic step" + """ + + energy: float = Field( + None, description="The final total DFT energy for the calculation" + ) + energy_per_atom: float = Field( + None, description="The final DFT energy per atom for the calculation" + ) + + structure: Union[Structure, Molecule] = Field( + None, description="The final structure from the calculation" + ) + + efermi: float = Field( + None, description="The Fermi level from the calculation in eV" + ) + + forces: Optional[list[Vector3D]] = Field( + None, description="Forces acting on each atom" + ) + all_forces: Optional[list[list[Vector3D]]] = Field( + None, + description="Forces acting on each atom for each structure in the output file", + ) + stress: Optional[Matrix3D] = Field(None, description="The stress on the cell") + stresses: Optional[list[Matrix3D]] = Field( + None, description="The atomic virial stresses" + ) + + is_metal: Optional[bool] = Field(None, description="Whether the system is metallic") + bandgap: Optional[float] = Field( + None, description="The band gap from the calculation in eV" + ) + cbm: float = Field( + None, + description="The conduction band minimum, or LUMO for molecules, in eV " + "(if system is not metallic)", + ) + vbm: Optional[float] = Field( + None, + description="The valence band maximum, or HOMO for molecules, in eV " + "(if system is not metallic)", + ) + atomic_steps: list[Union[Structure, Molecule]] = Field( + None, description="Structures for each ionic step" + ) + + @classmethod + def from_aims_output( + cls, + output: AimsOutput, # Must use auto_load kwarg when passed + # store_trajectory: bool = False, + ) -> CalculationOutput: + """ + Create an FHI-aims output document from FHI-aims outputs. + + Parameters + ---------- + output: .AimsOutput + An AimsOutput object. + store_trajectory: bool + A flag setting to store output trajectory + + Returns + ------- + The FHI-aims calculation output document. + """ + structure = output.final_structure + + electronic_output = { + "efermi": output.fermi_energy, + "vbm": output.vbm, + "cbm": output.cbm, + "bandgap": output.band_gap, + "direct_bandgap": output.direct_band_gap, + } + + forces = None + if output.forces is not None: + forces = output.forces + + stress = None + if output.stress is not None: + stress = ensure_stress_full(output.stress).tolist() + + stresses = None + if output.stresses is not None: + stresses = [ensure_stress_full(st).tolist() for st in output.stresses] + + all_forces = None + if not any(ff is None for ff in output.all_forces): + all_forces = [f if (f is not None) else None for f in output.all_forces] + + return cls( + structure=structure, + energy=output.final_energy, + energy_per_atom=output.final_energy / len(structure.species), + **electronic_output, + atomic_steps=output.structures, + forces=forces, + stress=stress, + stresses=stresses, + all_forces=all_forces, + ) + + +class Calculation(BaseModel): + """Full FHI-aims calculation inputs and outputs. + + Parameters + ---------- + dir_name: str + The directory for this FHI-aims calculation + aims_version: str + FHI-aims version used to perform the calculation + has_aims_completed: .TaskState + Whether FHI-aims completed the calculation successfully + output: .CalculationOutput + The FHI-aims calculation output + completed_at: str + Timestamp for when the calculation was completed + output_file_paths: Dict[str, str] + Paths (relative to dir_name) of the FHI-aims output files + associated with this calculation + """ + + dir_name: str = Field( + None, description="The directory for this FHI-aims calculation" + ) + aims_version: str = Field( + None, description="FHI-aims version used to perform the calculation" + ) + has_aims_completed: TaskState = Field( + None, description="Whether FHI-aims completed the calculation successfully" + ) + output: CalculationOutput = Field( + None, description="The FHI-aims calculation output" + ) + completed_at: str = Field( + None, description="Timestamp for when the calculation was completed" + ) + output_file_paths: dict[str, str] = Field( + None, + description="Paths (relative to dir_name) of the FHI-aims output files " + "associated with this calculation", + ) + + @classmethod + def from_aims_files( + cls, + dir_name: Path | str, + task_name: str, + aims_output_file: Path | str = "aims.out", + volumetric_files: list[str] = None, + parse_dos: str | bool = False, + parse_bandstructure: str | bool = False, + store_trajectory: bool = False, + # store_scf: bool = False, + store_volumetric_data: Optional[Sequence[str]] = STORE_VOLUMETRIC_DATA, + ) -> tuple[Calculation, dict[AimsObject, dict]]: + """ + Create an FHI-aims calculation document from a directory and file paths. + + Parameters + ---------- + dir_name: Path or str + The directory containing the calculation outputs. + task_name: str + The task name. + aims_output_file: Path or str + Path to the main output of aims job, relative to dir_name. + volumetric_files: List[str] + Path to volumetric (Cube) files, relative to dir_name. + parse_dos: str or bool + Whether to parse the DOS. Can be: + + - "auto": Only parse DOS if there are no ionic steps. + - True: Always parse DOS. + - False: Never parse DOS. + + parse_bandstructure: str or bool + How to parse the bandstructure. Can be: + + - "auto": Parse the bandstructure with projections for NSCF calculations + and decide automatically if it's line or uniform mode. + - "line": Parse the bandstructure as a line mode calculation with + projections + - True: Parse the bandstructure as a uniform calculation with + projections . + - False: Parse the band structure without projects and just store + vbm, cbm, band_gap, is_metal and efermi rather than the full + band structure object. + + store_trajectory: bool + Whether to store the ionic steps as a pmg trajectory object, which can be + pushed, to a bson data store, instead of as a list od dicts. Useful for + large trajectories. + store_scf: bool + Whether to store the SCF convergence data. + store_volumetric_data: Sequence[str] or None + Which volumetric files to store. + + Returns + ------- + .Calculation + An FHI-aims calculation document. + """ + dir_name = Path(dir_name) + aims_output_file = dir_name / aims_output_file + + volumetric_files = [] if volumetric_files is None else volumetric_files + aims_output = AimsOutput.from_outfile(aims_output_file) + + completed_at = str(datetime.fromtimestamp(os.stat(aims_output_file).st_mtime)) + + output_file_paths = _get_output_file_paths(volumetric_files) + aims_objects: dict[AimsObject, Any] = _get_volumetric_data( + dir_name, output_file_paths, store_volumetric_data + ) + + dos = _parse_dos(parse_dos, aims_output) + if dos is not None: + aims_objects[AimsObject.DOS] = dos # type: ignore # noqa: PGH003 + + bandstructure = _parse_bandstructure(parse_bandstructure, aims_output) + if bandstructure is not None: + aims_objects[AimsObject.BANDSTRUCTURE] = bandstructure # type: ignore # noqa: PGH003 + + output_doc = CalculationOutput.from_aims_output(aims_output) + + has_aims_completed = ( + TaskState.SUCCESS if aims_output.completed else TaskState.FAILED + ) + + if store_trajectory: + traj = _parse_trajectory(aims_output=aims_output) + aims_objects[AimsObject.TRAJECTORY] = traj # type: ignore # noqa: PGH003 + + return ( + cls( + dir_name=str(dir_name), + task_name=task_name, + aims_version=aims_output.aims_version, + has_aims_completed=has_aims_completed, + completed_at=completed_at, + output=output_doc, + output_file_paths={ + k.name.lower(): v for k, v in output_file_paths.items() + }, + ), + aims_objects, + ) + + +def _get_output_file_paths(volumetric_files: list[str]) -> dict[AimsObject, str]: + """Get the output file paths for FHI-aims output files. + + Parameters + ---------- + volumetric_files: List[str] + A list of volumetric files associated with the calculation. + + Returns + ------- + Dict[AimsObject, str] + A mapping between the Aims object type and the file path. + """ + output_file_paths = {} + for aims_object in AimsObject: # type: ignore # noqa: PGH003 + for volumetric_file in volumetric_files: + if aims_object.name in str(volumetric_file): + output_file_paths[aims_object] = str(volumetric_file) + return output_file_paths + + +def _get_volumetric_data( + dir_name: Path, + output_file_paths: dict[AimsObject, str], + store_volumetric_data: Optional[Sequence[str]], +) -> dict[AimsObject, VolumetricData]: + """ + Load volumetric data files from a directory. + + Parameters + ---------- + dir_name: Path + The directory containing the files. + output_file_paths: Dict[.AimsObject, str] + A dictionary mapping the data type to file path relative to dir_name. + store_volumetric_data: Sequence[str] or None + The volumetric data files to load. + + Returns + ------- + Dict[AimsObject, VolumetricData] + A dictionary mapping the FHI-aims object data type (`AimsObject.total_density`, + `AimsObject.electron_density`, etc) to the volumetric data object. + """ + if store_volumetric_data is None or len(store_volumetric_data) == 0: + return {} + + volumetric_data = {} + for file_type, file in output_file_paths.items(): + if file_type.name not in store_volumetric_data: + continue + try: + volumetric_data[file_type] = VolumetricData.from_cube( + (dir_name / file).as_posix() + ) + except Exception as err: + raise ValueError(f"Failed to parse {file_type} at {file}.") from err + + return volumetric_data + + +def _parse_dos(parse_dos: str | bool, aims_output: AimsOutput) -> Optional[Dos]: + """Parse DOS outputs from FHI-aims calculation. + + Parameters + ---------- + parse_dos: str or bool + Whether to parse the DOS. Can be: + - "auto": Only parse DOS if there are no ionic steps. + - True: Always parse DOS. + - False: Never parse DOS. + aims_output: .AimsOutput + The output object for the calculation being parsed. + + Returns + ------- + A Dos object if parse_dos is set accordingly. + """ + if parse_dos == "auto": + if len(aims_output.ionic_steps) == 0: + return aims_output.complete_dos + return None + if parse_dos: + return aims_output.complete_dos + return None + + +def _parse_bandstructure( + parse_bandstructure: str | bool, aims_output: AimsOutput +) -> Optional[BandStructure]: + """ + Get the band structure. + + Parameters + ---------- + parse_bandstructure: str or bool + Whether to parse. Does not support the auto/line distinction currently. + aims_ouput: .AimsOutput + The output object to parse + + Returns + ------- + The bandstructure + """ + if parse_bandstructure: + return aims_output.band_structure + return None + + +def _parse_trajectory(aims_output: AimsOutput) -> Optional[Trajectory]: + """Grab a Trajectory object given an FHI-aims output object. + + Parameters + ---------- + aims_ouput: .AimsOutput + The output object to parse + + Returns + ------- + The trajectory for the calculation + """ + return aims_output.structures diff --git a/src/atomate2/aims/schemas/task.py b/src/atomate2/aims/schemas/task.py new file mode 100644 index 0000000000..6628737453 --- /dev/null +++ b/src/atomate2/aims/schemas/task.py @@ -0,0 +1,716 @@ +"""A definition of a MSON document representing an FHI-aims task.""" +from __future__ import annotations + +import json +import logging +from collections.abc import Sequence +from pathlib import Path +from typing import Any, Optional, TypeVar, Union + +import numpy as np +from emmet.core.math import Matrix3D, Vector3D +from emmet.core.structure import MoleculeMetadata, StructureMetadata +from emmet.core.tasks import get_uri +from pydantic import BaseModel, Field +from pymatgen.core import Molecule, Structure +from pymatgen.entries.computed_entries import ComputedEntry + +from atomate2.aims.schemas.calculation import AimsObject, Calculation, TaskState +from atomate2.aims.utils import datetime_str + +_T = TypeVar("_T", bound="AimsTaskDoc") +_VOLUMETRIC_FILES = ("total_density", "spin_density", "eigenstate_density") +logger = logging.getLogger(__name__) + + +class AnalysisDoc(BaseModel): + """Calculation relaxation summary. + + Parameters + ---------- + delta_volume: float + Absolute change in volume + delta_volume_as_percent: float + Percentage change in volume + max_force: float + Maximum force on the atoms + errors: List[str] + Errors from the FHI-aims output + """ + + delta_volume: Optional[float] = Field(None, description="Absolute change in volume") + delta_volume_as_percent: Optional[float] = Field( + None, description="Percentage change in volume" + ) + max_force: Optional[float] = Field(None, description="Maximum force on the atoms") + errors: Optional[list[str]] = Field( + None, description="Errors from the FHI-aims output" + ) + + @classmethod + def from_aims_calc_docs(cls, calc_docs: list[Calculation]) -> AnalysisDoc: + """Create analysis summary from FHI-aims calculation documents. + + Parameters + ---------- + calc_docs: List[.Calculation] + FHI-aims calculation documents. + + Returns + ------- + .AnalysisDoc + Summary object + """ + delta_vol = None + percent_delta_vol = None + + final_calc = calc_docs[-1] + max_force = None + if final_calc.has_aims_completed == TaskState.SUCCESS: + max_force = _get_max_force(final_calc) + + return cls( + delta_volume=delta_vol, + delta_volume_as_percent=percent_delta_vol, + max_force=max_force, + errors=[], + ) + + +class Species(BaseModel): + """A representation of the most important information about each type of species. + + Parameters + ---------- + element: str + Element assigned to this atom kind + species_defaults: str + Basis set for this atom kind + """ + + element: str = Field(None, description="Element assigned to this atom kind") + species_defaults: str = Field(None, description="Basis set for this atom kind") + + +class SpeciesSummary(BaseModel): + """A summary of species defaults. + + Parameters + ---------- + species_defaults: Dict[str, .Species] + Dictionary mapping atomic kind labels to their info + """ + + species_defaults: dict[str, Species] = Field( + None, description="Dictionary mapping atomic kind labels to their info" + ) + + @classmethod + def from_species_info( + cls, species_info: dict[str, dict[str, Any]] + ) -> SpeciesSummary: + """Initialize from the atomic_kind_info dictionary. + + Parameters + ---------- + species_info: Dict[str, Dict[str, Any]] + The information for the basis set for the calculation + + Returns + ------- + The SpeciesSummary + """ + dct: dict[str, dict[str, Any]] = {"species_defaults": {}} + for kind, info in species_info.items(): + dct["species_defaults"][kind] = { + "element": info["element"], + "species_defaults": info["species_defaults"], + } + return cls(**dct) + + +class InputDoc(BaseModel): + """Summary of inputs for an FHI-aims calculation. + + Parameters + ---------- + structure: Structure or Molecule + The input pymatgen Structure or Molecule of the system + species_info: .SpeciesSummary + Summary of the species defaults used for each atom kind + xc: str + Exchange-correlation functional used if not the default + """ + + structure: Union[Structure, Molecule] = Field( + None, description="The input structure object" + ) + species_info: SpeciesSummary = Field( + None, description="Summary of the species defaults used for each atom kind" + ) + xc: str = Field( + None, description="Exchange-correlation functional used if not the default" + ) + + @classmethod + def from_aims_calc_doc(cls, calc_doc: Calculation) -> InputDoc: + """Create calculation input summary from a calculation document. + + Parameters + ---------- + calc_doc: .Calculation + An FHI-aims calculation document. + + Returns + ------- + .InputDoc + A summary of the input structure and parameters. + """ + summary = SpeciesSummary.from_species_info(calc_doc.input.species_info) + + return cls( + structure=calc_doc.input.structure, + atomic_kind_info=summary, + xc=str(calc_doc.run_type), + ) + + +class OutputDoc(BaseModel): + """Summary of the outputs for an FHI-aims calculation. + + Parameters + ---------- + structure: Structure or Molecule + The final pymatgen Structure or Molecule of the final system + trajectory: List[Structure or Molecule] + The trajectory of output structures + energy: float + The final total DFT energy for the last calculation + energy_per_atom: float + The final DFT energy per atom for the last calculation + bandgap: float + The DFT bandgap for the last calculation + cbm: float + CBM for this calculation + vbm: float + VBM for this calculation + forces: List[Vector3D] + Forces on atoms from the last calculation + stress: Matrix3D + Stress on the unit cell from the last calculation + all_forces: List[List[Vector3D]] + Forces on atoms from all calculations. + """ + + structure: Union[Structure, Molecule] = Field( + None, description="The output structure object" + ) + trajectory: Sequence[Union[Structure, Molecule]] = Field( + None, description="The trajectory of output structures" + ) + energy: float = Field( + None, description="The final total DFT energy for the last calculation" + ) + energy_per_atom: float = Field( + None, description="The final DFT energy per atom for the last calculation" + ) + bandgap: Optional[float] = Field( + None, description="The DFT bandgap for the last calculation" + ) + cbm: Optional[float] = Field(None, description="CBM for this calculation") + vbm: Optional[float] = Field(None, description="VBM for this calculation") + forces: Optional[list[Vector3D]] = Field( + None, description="Forces on atoms from the last calculation" + ) + stress: Optional[Matrix3D] = Field( + None, description="Stress on the unit cell from the last calculation" + ) + all_forces: Optional[list[list[Vector3D]]] = Field( + None, description="Forces on atoms from all calculations." + ) + + @classmethod + def from_aims_calc_doc(cls, calc_doc: Calculation) -> OutputDoc: + """Create a summary from an aims CalculationDocument. + + Parameters + ---------- + calc_doc: .Calculation + An FHI-aims calculation document. + + Returns + ------- + .OutputDoc + The calculation output summary. + """ + return cls( + structure=calc_doc.output.structure, + energy=calc_doc.output.energy, + energy_per_atom=calc_doc.output.energy_per_atom, + bandgap=calc_doc.output.bandgap, + cbm=calc_doc.output.cbm, + vbm=calc_doc.output.vbm, + forces=calc_doc.output.forces, + stress=calc_doc.output.stress, + all_forces=calc_doc.output.all_forces, + trajectory=calc_doc.output.atomic_steps, + ) + + +class ConvergenceSummary(BaseModel): + """Summary of the outputs for an FHI-aims convergence calculation. + + Parameters + ---------- + structure: Structure or Molecule + The output structure object + converged: bool + Is convergence achieved? + convergence_criterion_name: str + The output name of the convergence criterion + convergence_field_name: str + The name of the input setting to study convergence against + convergence_criterion_value: float + The output value of the convergence criterion + convergence_field_value: Any + The last value of the input setting to study convergence against + asked_epsilon: float + The difference in the values for the convergence criteria that was asked for + actual_epsilon: float + The actual difference in the convergence criteria values + """ + + structure: Union[Structure, Molecule] = Field( + None, description="The pymatgen object of the output structure" + ) + converged: bool = Field(None, description="Is convergence achieved?") + + convergence_criterion_name: str = Field( + None, description="The output name of the convergence criterion" + ) + convergence_field_name: str = Field( + None, description="The name of the input setting to study convergence against" + ) + convergence_criterion_value: float = Field( + None, description="The output value of the convergence criterion" + ) + convergence_field_value: Any = Field( + None, + description="The last value of the input setting to study convergence against", + ) + asked_epsilon: Optional[float] = Field( + None, + description="The difference in the values for the convergence criteria that was" + " asked for", + ) + actual_epsilon: float = Field( + None, + description="The actual difference in the convergence criteria values", + ) + + @classmethod + def from_aims_calc_doc(cls, calc_doc: Calculation) -> ConvergenceSummary: + """Create a summary from an FHI-aims calculation document. + + Parameters + ---------- + calc_doc: .Calculation + An FHI-aims calculation document. + + Returns + ------- + .ConvergenceSummary + The summary for convergence runs. + """ + from atomate2.aims.jobs.convergence import CONVERGENCE_FILE_NAME + + job_dir = calc_doc.dir_name.split(":")[-1] + + convergence_file = Path(job_dir) / CONVERGENCE_FILE_NAME + if not convergence_file.exists(): + raise ValueError( + f"Did not find the convergence json file {CONVERGENCE_FILE_NAME}" + " in {calc_doc.dir_name}" + ) + + with open(convergence_file) as f: + convergence_data = json.load(f) + + return cls( + structure=calc_doc.output.structure, + converged=convergence_data["converged"], + convergence_criterion_name=convergence_data["criterion_name"], + convergence_field_name=convergence_data["convergence_field_name"], + convergence_criterion_value=convergence_data["criterion_values"][-1], + convergence_field_value=convergence_data["convergence_field_values"][-1], + asked_epsilon=None, + actual_epsilon=abs( + convergence_data["criterion_values"][-2] + - convergence_data["criterion_values"][-1] + ), + ) + + @classmethod + def from_data( + cls, structure: Structure | Molecule, convergence_data: dict[str, Any] + ) -> ConvergenceSummary: + """Create a summary from the convergence data dictionary. + + Parameters + ---------- + structure : Structure | Molecule + a Pymatgen structure object + + convergence_data: dict[str, Any] + A dictionary containing convergence data for the run. + + Returns + ------- + .ConvergenceSummary + The summary for convergence runs. + """ + return cls( + structure=structure, + converged=convergence_data["converged"], + convergence_criterion_name=convergence_data["criterion_name"], + convergence_field_name=convergence_data["convergence_field_name"], + convergence_criterion_value=convergence_data["criterion_values"][-1], + convergence_field_value=convergence_data["convergence_field_values"][-1], + asked_epsilon=convergence_data["epsilon"], + actual_epsilon=abs( + convergence_data["criterion_values"][-2] + - convergence_data["criterion_values"][-1] + ), + ) + + +class AimsTaskDoc(StructureMetadata, MoleculeMetadata): + """Definition of FHI-aims task document. + + Parameters + ---------- + dir_name: str + The directory for this FHI-aims task + last_updated: str + Timestamp for this task document was last updated + completed_at: str + Timestamp for when this task was completed + input: .InputDoc + The input to the first calculation + output: .OutputDoc + The output of the final calculation + structure: Structure or Molecule + Final output structure from the task + state: .TaskState + State of this task + included_objects: List[.AimsObject] + List of FHI-aims objects included with this task document + aims_objects: Dict[.AimsObject, Any] + FHI-aims objects associated with this task + entry: ComputedEntry + The ComputedEntry from the task doc + analysis: .AnalysisDoc + Summary of structural relaxation and forces + task_label: str + A description of the task + tags: List[str] + Metadata tags for this task document + author: str + Author extracted from transformations + icsd_id: str + International crystal structure database id of the structure + calcs_reversed: List[.Calculation] + The inputs and outputs for all FHI-aims runs in this task. + transformations: Dict[str, Any] + Information on the structural transformations, parsed from a + transformations.json file + custodian: Any + Information on the custodian settings used to run this + calculation, parsed from a custodian.json file + additional_json: Dict[str, Any] + Additional json loaded from the calculation directory + """ + + dir_name: str = Field(None, description="The directory for this FHI-aims task") + last_updated: str = Field( + default_factory=datetime_str, + description="Timestamp for this task document was last updated", + ) + completed_at: str = Field( + None, description="Timestamp for when this task was completed" + ) + input: Optional[InputDoc] = Field( + None, description="The input to the first calculation" + ) + output: OutputDoc = Field(None, description="The output of the final calculation") + structure: Union[Structure, Molecule] = Field( + None, description="Final output atoms from the task" + ) + state: TaskState = Field(None, description="State of this task") + included_objects: Optional[list[AimsObject]] = Field( + None, description="List of FHI-aims objects included with this task document" + ) + aims_objects: Optional[dict[AimsObject, Any]] = Field( + None, description="FHI-aims objects associated with this task" + ) + entry: Optional[ComputedEntry] = Field( + None, description="The ComputedEntry from the task doc" + ) + analysis: AnalysisDoc = Field( + None, description="Summary of structural relaxation and forces" + ) + task_label: str = Field(None, description="A description of the task") + tags: Optional[list[str]] = Field( + None, description="Metadata tags for this task document" + ) + author: Optional[str] = Field( + None, description="Author extracted from transformations" + ) + icsd_id: Optional[str] = Field( + None, description="International crystal structure database id of the structure" + ) + calcs_reversed: Optional[list[Calculation]] = Field( + None, description="The inputs and outputs for all FHI-aims runs in this task." + ) + transformations: Optional[dict[str, Any]] = Field( + None, + description="Information on the structural transformations, parsed from a " + "transformations.json file", + ) + custodian: Any = Field( + None, + description="Information on the custodian settings used to run this " + "calculation, parsed from a custodian.json file", + ) + additional_json: Optional[dict[str, Any]] = Field( + None, description="Additional json loaded from the calculation directory" + ) + + @classmethod + def from_directory( + cls: type[_T], + dir_name: Path | str, + volumetric_files: Sequence[str] = _VOLUMETRIC_FILES, + additional_fields: dict[str, Any] = None, + **aims_calculation_kwargs, + ) -> AimsTaskDoc: + """Create a task document from a directory containing FHi-aims files. + + Parameters + ---------- + dir_name: Path or str + The path to the folder containing the calculation outputs. + volumetric_files: Sequence[str] + A volumetric files to search for. + additional_fields: Dict[str, Any] + Dictionary of additional fields to add to output document. + **aims_calculation_kwargs + Additional parsing options that will be passed to the + :obj:`.Calculation.from_aims_files` function. + + Returns + ------- + .AimsTaskDoc + A task document for the calculation. + """ + logger.info(f"Getting task doc in: {dir_name}") + + if additional_fields is None: + additional_fields = {} + + dir_name = Path(dir_name) + task_files = _find_aims_files(dir_name, volumetric_files=volumetric_files) + + if len(task_files) == 0: + raise FileNotFoundError("No FHI-aims files found!") + + calcs_reversed = [] + all_aims_objects = [] + for task_name, files in task_files.items(): + calc_doc, aims_objects = Calculation.from_aims_files( + dir_name, task_name, **files, **aims_calculation_kwargs + ) + calcs_reversed.append(calc_doc) + all_aims_objects.append(aims_objects) + + analysis = AnalysisDoc.from_aims_calc_docs(calcs_reversed) + tags = additional_fields.get("tags") + + dir_name = get_uri(dir_name) # convert to full uri path + + # only store objects from last calculation + # TODO: make this an option + aims_objects = all_aims_objects[-1] + included_objects = None + if aims_objects: + included_objects = list(aims_objects.keys()) + + # rewrite the original structure save! + + data = { + "structure": calcs_reversed[-1].output.structure, + "meta_structure": calcs_reversed[-1].output.structure, + "dir_name": dir_name, + "calcs_reversed": calcs_reversed, + "analysis": analysis, + "tags": tags, + "completed_at": calcs_reversed[-1].completed_at, + "output": OutputDoc.from_aims_calc_doc(calcs_reversed[-1]), + "state": _get_state(calcs_reversed, analysis), + "entry": cls.get_entry(calcs_reversed), + "aims_objects": aims_objects, + "included_objects": included_objects, + } + doc = cls(**data) + return doc.model_copy(update=additional_fields, deep=True) + + @staticmethod + def get_entry( + calc_docs: list[Calculation], job_id: Optional[str] = None + ) -> ComputedEntry: + """Get a computed entry from a list of FHI-aims calculation documents. + + Parameters + ---------- + calc_docs: List[.Calculation] + A list of FHI-aims calculation documents. + job_id: Optional[str] + The job identifier. + + Returns + ------- + ComputedEntry + A computed entry. + """ + entry_dict = { + "correction": 0.0, + "entry_id": job_id, + "composition": calc_docs[-1].output.structure.formula, + "energy": calc_docs[-1].output.energy, + "parameters": { + # Required to be compatible with MontyEncoder for the ComputedEntry + # "run_type": str(calc_docs[-1].run_type), + "run_type": "AIMS run" + }, + "data": { + "last_updated": datetime_str(), + }, + } + return ComputedEntry.from_dict(entry_dict) + + +def _find_aims_files( + path: Path | str, + volumetric_files: Sequence[str] = _VOLUMETRIC_FILES, +) -> dict[str, Any]: + """Find FHI-aims files in a directory. + + Only files in folders with names matching a task name (or alternatively files + with the task name as an extension, e.g., aims.out) will be returned. + + FHI-aims files in the current directory will be given the task name "standard". + + Parameters + ---------- + path: str or Path + Path to a directory to search. + volumetric_files: Sequence[str] + Volumetric files to search for. + + Returns + ------- + dict[str, Any] + The filenames of the calculation outputs for each FHI-aims task, + given as a ordered dictionary of:: + + { + task_name: { + "aims_output_file": aims_output_filename, + "volumetric_files": [v_hartree file, e_density file, etc], + """ + task_names = ["precondition"] + [f"relax{i}" for i in range(9)] + path = Path(path) + task_files = {} + + def _get_task_files( + files: list[Path], suffix: str = "" + ) -> dict[str, list[str | Path] | Path | str]: + aims_files: dict[str, list[str | Path] | Path | str] = {} + vol_files: list[str | Path] = [] + for file in files: + # Here we make assumptions about the output file naming + if file.match(f"*aims.out{suffix}*"): + aims_files["aims_output_file"] = Path(file).name + for vol in volumetric_files: + _files = [f.name for f in files if f.match(f"*{vol}*cube{suffix}*")] + if _files: + vol_files.append(_files[0]) + + if len(vol_files) > 0: + # add volumetric files if some were found or other cp2k files were found + aims_files["volumetric_files"] = vol_files + + return aims_files + + for task_name in task_names: + subfolder_match = list(path.glob(f"{task_name}/*")) + suffix_match = list(path.glob(f"*.{task_name}*")) + if len(subfolder_match) > 0: + # subfolder match + task_files[task_name] = _get_task_files(subfolder_match) + elif len(suffix_match) > 0: + # try extension schema + task_files[task_name] = _get_task_files( + suffix_match, suffix=f".{task_name}" + ) + + if len(task_files) == 0: + # get any matching file from the root folder + standard_files = _get_task_files(list(path.glob("*"))) + if len(standard_files) > 0: + task_files["standard"] = standard_files + + return task_files + + +def _get_max_force(calc_doc: Calculation) -> Optional[float]: + """Get max force acting on atoms from a calculation document. + + Parameters + ---------- + calc_doc: .Calculation + The calculation doc to get the max force + + Returns + ------- + float + The maximum force + """ + forces = calc_doc.output.forces + if forces is not None: + forces = np.array(forces) + return max(np.linalg.norm(forces, axis=1)) + return None + + +def _get_state(calc_docs: list[Calculation], analysis: AnalysisDoc) -> TaskState: + """Get state from calculation documents and relaxation analysis. + + Parameters + ---------- + calc_docs: List[.Calculations] + The calculation to get the state from + analysis: .AnalysisDoc + The summary of the analysis + + Returns + ------- + .TaskState + The status of the calculation + """ + all_calcs_completed = all( + c.has_aims_completed == TaskState.SUCCESS for c in calc_docs + ) + if len(analysis.errors) == 0 and all_calcs_completed: + return TaskState.SUCCESS # type: ignore # noqa: PGH003 + return TaskState.FAILED # type: ignore # noqa: PGH003 diff --git a/src/atomate2/aims/utils/__init__.py b/src/atomate2/aims/utils/__init__.py new file mode 100644 index 0000000000..fd0d7dc2a3 --- /dev/null +++ b/src/atomate2/aims/utils/__init__.py @@ -0,0 +1,16 @@ +"""A collection of helper utils found in atomate2 package.""" + + +from datetime import datetime + + +def datetime_str() -> str: + """ + Get a string representation of the current time. + + Returns + ------- + str + The current time. + """ + return str(datetime.utcnow()) diff --git a/src/atomate2/aims/utils/bands.py b/src/atomate2/aims/utils/bands.py new file mode 100644 index 0000000000..20b690d249 --- /dev/null +++ b/src/atomate2/aims/utils/bands.py @@ -0,0 +1,61 @@ +"""Some utilities of dealing with bands. + +Copied from GIMS as of now; should be in its own dedicated FHI-aims python package. +""" +from __future__ import annotations + +from typing import TYPE_CHECKING, TypedDict + +from pymatgen.symmetry.bandstructure import HighSymmKpath + +if TYPE_CHECKING: + from pymatgen.core.structure import Structure + + +class _SegmentDict(TypedDict): + coords: list[list[float]] + labels: list[str] + length: int + + +def prepare_band_input(structure: Structure, density: float = 20) -> list: + """Prepare the band information needed for the FHI-aims control.in file. + + Parameters + ---------- + structure: Structure + The structure for which the band path is calculated + density: float + Number of kpoints per Angstrom. + """ + bp = HighSymmKpath(structure) + points, labels = bp.get_kpoints(line_density=density, coords_are_cartesian=False) + lines_and_labels: list[_SegmentDict] = [] + current_segment: _SegmentDict | None = None + for label_, coords in zip(labels, points): + # rename the Gamma point label + label = "G" if label_ in ("GAMMA", "\\Gamma", "ฮ“") else label_ + if label: + if current_segment is None: + current_segment = _SegmentDict( + coords=[coords], labels=[label], length=1 + ) + else: + current_segment["coords"].append(coords) + current_segment["labels"].append(label) + current_segment["length"] += 1 + lines_and_labels.append(current_segment) + current_segment = None + else: + current_segment["length"] += 1 + + bands = [] + for segment in lines_and_labels: + start, end = segment["coords"] + lstart, lend = segment["labels"] + bands.append( + f"band {start[0]:9.5f}{start[1]:9.5f}{start[2]:9.5f} " + f"{end[0]:9.5f}{end[1]:9.5f}{end[2]:9.5f} {segment['length']:4d} " + f"{lstart:3}{lend:3}" + ) + return bands diff --git a/src/atomate2/aims/utils/common.py b/src/atomate2/aims/utils/common.py new file mode 100644 index 0000000000..00a96c64db --- /dev/null +++ b/src/atomate2/aims/utils/common.py @@ -0,0 +1,44 @@ +"""Module with common file names and classes used for FHI-aims flows.""" + +import contextlib +import os +import shutil +from collections.abc import Generator + +TMPDIR_NAME = "tmpdir" +OUTPUT_FILE_NAME: str = "aims.out" +CONTROL_FILE_NAME: str = "control.in" +PARAMS_JSON_FILE_NAME: str = "parameters.json" +GEOMETRY_FILE_NAME: str = "geometry.in" + + +@contextlib.contextmanager +def cwd(path: str, mkdir: bool = False, rmdir: bool = False) -> Generator: + """Change cwd intermediately. + + Example + ------- + >>> with cwd(some_path): + >>> do so some stuff in some_path + >>> do so some other stuff in old cwd + + Parameters + ---------- + path: str or Path + Path to change working directory to + mkdir: bool + If True make path if it does not exist + rmdir: bool + If True remove the working directory upon exiting + """ + cwd = os.getcwd() + + if os.path.exists(path) is False and mkdir: + os.makedirs(path) + + os.chdir(path) + yield + + os.chdir(cwd) + if rmdir: + shutil.rmtree(path) diff --git a/src/atomate2/aims/utils/units.py b/src/atomate2/aims/utils/units.py new file mode 100644 index 0000000000..72a8d81e8c --- /dev/null +++ b/src/atomate2/aims/utils/units.py @@ -0,0 +1,11 @@ +"""Define the Units for FHI-aims calculations.""" +from numpy import pi + +PI = pi +EV = 1.602176634e-19 # [J] CODATA 2002 +THZ = 1e12 +AMU = 1.66053906660e-27 # [kg] CODATA 2002 +AA = 1e-10 + +omegaToTHz = (EV / AA**2 / AMU) ** 0.5 / THZ / 2 / PI # noqa: N816 +ev_per_A3_to_kbar = EV / AA**3 / 1e8 # noqa: N816 diff --git a/src/atomate2/amset/jobs.py b/src/atomate2/amset/jobs.py index ef098d3a56..42e005e192 100644 --- a/src/atomate2/amset/jobs.py +++ b/src/atomate2/amset/jobs.py @@ -42,7 +42,7 @@ class AmsetMaker(Maker): def make( self, settings: dict, - prev_amset_dir: str | Path = None, + prev_dir: str | Path = None, wavefunction_dir: str | Path = None, deformation_dir: str | Path = None, bandstructure_dir: str | Path = None, @@ -54,7 +54,7 @@ def make( ---------- settings : dict Amset settings. - prev_amset_dir : str or Path + prev_dir : str or Path A previous AMSET calculation directory to copy output files from. The previous directory is also used to check for transport convergence. wavefunction_dir : str or Path @@ -66,14 +66,12 @@ def make( band_structure_data.json). """ # copy previous inputs - from_prev = prev_amset_dir is not None - if prev_amset_dir is not None: - copy_amset_files(prev_amset_dir) + from_prev = prev_dir is not None + if prev_dir is not None: + copy_amset_files(prev_dir) else: if bandstructure_dir is None: - raise ValueError( - "Either prev_amset_dir or bandstructure_dir must be set" - ) + raise ValueError("Either prev_dir or bandstructure_dir must be set") copy_amset_files(bandstructure_dir) @@ -116,7 +114,7 @@ def make( if self.resubmit and not converged: replace = self.make( {"interpolation_factor": settings.get("interpolation_factor", 10) + 5}, - prev_amset_dir=task_doc.dir_name, + prev_dir=task_doc.dir_name, ) return Response(output=task_doc, replace=replace) diff --git a/src/atomate2/amset/run.py b/src/atomate2/amset/run.py index 19bc8e5e40..7cf0e3a8af 100644 --- a/src/atomate2/amset/run.py +++ b/src/atomate2/amset/run.py @@ -17,7 +17,7 @@ def run_amset() -> None: # Run AMSET using the command line as calling from python can cause issues # with multiprocessing with open("std_out.log", "w") as f_std, open("std_err.log", "w") as f_err: - subprocess.call(["amset", "run"], stdout=f_std, stderr=f_err) + subprocess.call(["amset", "run"], stdout=f_std, stderr=f_err) # noqa: S603, S607 def check_converged( diff --git a/src/atomate2/cli/dev.py b/src/atomate2/cli/dev.py index ffa5b0130f..2314ec8d56 100644 --- a/src/atomate2/cli/dev.py +++ b/src/atomate2/cli/dev.py @@ -1,7 +1,15 @@ """Module containing command line scripts for developers.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + import click +if TYPE_CHECKING: + from pathlib import Path + @click.group(context_settings={"help_option_names": ["-h", "--help"]}) def dev() -> None: @@ -9,15 +17,32 @@ def dev() -> None: @dev.command(context_settings={"help_option_names": ["-h", "--help"]}) -@click.argument("test_dir") -def vasp_test_data(test_dir) -> None: +@click.argument( + "test_dir", +) +@click.option( + "--additional_file", + "-a", + multiple=True, + help="list of additional files to copy from each completed VASP directory. " + "Example: `--additional_file CHGCAR --additional_file LOCPOT`", +) +def vasp_test_data(test_dir: str | Path, additional_file: list[str]) -> None: """Generate test data for VASP unit tests. This script expects there is an outputs.json file and job folders in the current directory. Please refer to the atomate2 documentation on writing unit tests for more information. + + Parameters + ---------- + test_dir + The directory to write the test data to. + Should not contain spaces or punctuation. + additional_files + list of additional files to copy from each completed VASP directory. + Example: `--additional_file CHGCAR --additional_file LOCPOT`, """ - import sys import warnings from pathlib import Path from pprint import pformat @@ -34,7 +59,7 @@ def vasp_test_data(test_dir) -> None: if test_dir.exists(): click.echo("test_data folder already exists, refusing to overwrite it") - sys.exit() + raise SystemExit(1) test_dir.mkdir() @@ -103,6 +128,7 @@ def vasp_test_data(test_dir) -> None: "vasprun*", "OUTCAR*", "*.json*", + *additional_file, ], allow_missing=True, ) @@ -154,10 +180,10 @@ def test_my_flow(mock_vasp, clean_dir, si_structure): assert output1.output.energy == pytest.approx(-10.85037078) """ - print(test_function_str) + print(test_function_str) # noqa: T201 -def _potcar_to_potcar_spec(potcar_filename, output_filename) -> None: +def _potcar_to_potcar_spec(potcar_filename: str | Path, output_filename: Path) -> None: """Convert a POTCAR file to a POTCAR.spec file.""" from pymatgen.io.vasp import Potcar diff --git a/src/atomate2/common/files.py b/src/atomate2/common/files.py index d9ed4a3b35..0fe41bc0b6 100644 --- a/src/atomate2/common/files.py +++ b/src/atomate2/common/files.py @@ -326,7 +326,9 @@ def find_and_filter_files( def get_zfile( - directory_listing: list[Path], base_name: str, allow_missing: bool = False + directory_listing: list[Path], + base_name: str, + allow_missing: bool = False, ) -> Path | None: """ Find gzipped or non-gzipped versions of a file in a directory listing. @@ -347,7 +349,7 @@ def get_zfile( found, then ``None`` will be returned. """ for file in directory_listing: - if file.name in [base_name, f"{base_name}.gz", f"{base_name}.GZ"]: + if file.name in (base_name, f"{base_name}.gz", f"{base_name}.GZ"): return file if allow_missing: diff --git a/src/atomate2/common/flows/defect.py b/src/atomate2/common/flows/defect.py index 9dca7ca9fd..871d18d9cf 100644 --- a/src/atomate2/common/flows/defect.py +++ b/src/atomate2/common/flows/defect.py @@ -5,7 +5,6 @@ import logging from abc import ABC, abstractmethod from dataclasses import dataclass -from pathlib import Path from typing import TYPE_CHECKING from jobflow import Flow, Job, Maker, OutputReference @@ -21,9 +20,13 @@ ) if TYPE_CHECKING: + from pathlib import Path + import numpy.typing as npt + from emmet.core.tasks import TaskDoc from pymatgen.analysis.defects.core import Defect from pymatgen.core.structure import Structure + from pymatgen.entries.computed_entries import ComputedStructureEntry logger = logging.getLogger(__name__) @@ -110,7 +113,7 @@ def make( struct2, distortions=self.distortions, static_maker=self.static_maker, - prev_vasp_dir=dir1, + prev_dir=dir1, add_name="q1", add_info={"relaxed_uuid": relax1.uuid, "distorted_uuid": relax2.uuid}, ) @@ -120,7 +123,7 @@ def make( struct1, distortions=self.distortions, static_maker=self.static_maker, - prev_vasp_dir=dir2, + prev_dir=dir2, add_name="q2", add_info={"relaxed_uuid": relax2.uuid, "distorted_uuid": relax1.uuid}, ) @@ -295,6 +298,7 @@ def make( uc_structure=defect.structure, relax_maker=self.bulk_relax_maker, sc_mat=supercell_matrix, + get_planar_locpot=self.get_planar_locpot, ) sc_mat = get_sc_job.output["sc_mat"] lattice = get_sc_job.output["sc_struct"].lattice @@ -305,8 +309,8 @@ def make( get_sc_job = get_supercell_from_prv_calc( uc_structure=defect.structure, prv_calc_dir=bulk_supercell_dir, + sc_entry_and_locpot_from_prv=self.sc_entry_and_locpot_from_prv, sc_mat_ref=supercell_matrix, - structure_from_prv=self.structure_from_prv, ) sc_mat = get_sc_job.output["sc_mat"] lattice = get_sc_job.output["lattice"] @@ -329,12 +333,6 @@ def make( jobs.extend([get_sc_job, spawn_output]) if self.collect_defect_entry_data: - if isinstance(bulk_supercell_dir, (str, Path)): - raise NotImplementedError( - "DefectEntery creation only works when you are explicitly " - "calculating the bulk supercell. This is because the bulk " - "SC energy parsing from previous calculations is not implemented." - ) collection_job = get_defect_entry( charge_state_summary=spawn_output.output, bulk_summary=get_sc_job.output, @@ -348,8 +346,10 @@ def make( ) @abstractmethod - def structure_from_prv(self, previous_dir: str) -> Structure: - """Copy the output structure from previous directory. + def sc_entry_and_locpot_from_prv( + self, previous_dir: str + ) -> tuple[ComputedStructureEntry, dict]: + """Copy the output ComputedStructureEntry and Locpot from previous directory. Parameters ---------- @@ -358,7 +358,25 @@ def structure_from_prv(self, previous_dir: str) -> Structure: Returns ------- - structure: Structure + entry: ComputedStructureEntry + """ + + @abstractmethod + def get_planar_locpot(self, task_doc: TaskDoc) -> dict: + """Get the Planar Locpot from the TaskDoc. + + This is needed just in case the planar average locpot is stored in different + part of the TaskDoc for different codes. + + Parameters + ---------- + task_doc: TaskDoc + The task document. + + Returns + ------- + planar_locpot: dict + The planar average locpot. """ @abstractmethod diff --git a/src/atomate2/common/flows/elastic.py b/src/atomate2/common/flows/elastic.py index eaaf4d7d81..795a092659 100644 --- a/src/atomate2/common/flows/elastic.py +++ b/src/atomate2/common/flows/elastic.py @@ -7,7 +7,6 @@ from typing import TYPE_CHECKING from jobflow import Flow, Maker, OnMissing -from pymatgen.symmetry.analyzer import SpacegroupAnalyzer from atomate2 import SETTINGS from atomate2.common.jobs.elastic import ( @@ -15,6 +14,7 @@ generate_elastic_deformations, run_elastic_deformations, ) +from atomate2.common.jobs.utils import structure_to_conventional if TYPE_CHECKING: from pathlib import Path @@ -94,7 +94,7 @@ def make( ---------- structure : .Structure A pymatgen structure. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous vasp calculation directory to use for copying outputs. equilibrium_stress : tuple of tuple of float The equilibrium stress of the (relaxed) structure, if known. @@ -116,8 +116,9 @@ def make( equilibrium_stress = bulk.output.output.stress if conventional: - sga = SpacegroupAnalyzer(structure, symprec=self.symprec) - structure = sga.get_conventional_standard_structure() + stc = structure_to_conventional(structure, self.symprec) + jobs.append(stc) + structure = stc.output deformations = generate_elastic_deformations( structure, @@ -156,7 +157,7 @@ def make( @property @abstractmethod - def prev_calc_dir_argname(self): + def prev_calc_dir_argname(self) -> str: """Name of argument informing static maker of previous calculation directory. As this differs between different DFT codes (e.g., VASP, CP2K), it diff --git a/src/atomate2/common/flows/electrode.py b/src/atomate2/common/flows/electrode.py new file mode 100644 index 0000000000..cb6a17ee4a --- /dev/null +++ b/src/atomate2/common/flows/electrode.py @@ -0,0 +1,183 @@ +"""Flow for electrode analysis.""" + +from __future__ import annotations + +import logging +from abc import ABC, abstractmethod +from dataclasses import dataclass, field +from typing import TYPE_CHECKING + +from jobflow import Flow, Maker +from pymatgen.analysis.structure_matcher import ElementComparator, StructureMatcher + +from atomate2.common.jobs.electrode import ( + RelaxJobSummary, + get_computed_entries, + get_insertion_electrode_doc, + get_stable_inserted_results, + get_structure_group_doc, +) + +if TYPE_CHECKING: + from pathlib import Path + + from pymatgen.alchemy import ElementLike + from pymatgen.core.structure import Structure + from pymatgen.entries.computed_entries import ComputedEntry + from pymatgen.io.vasp.outputs import VolumetricData + +logger = logging.getLogger(__name__) + +__author__ = "Jimmy Shen" +__email__ = "jmmshn@gmail.com" + + +@dataclass +class ElectrodeInsertionMaker(Maker, ABC): + """Attempt ion insertion into a structure. + + The basic unit for cation insertion is: + [get_stable_inserted_structure]: + (static) -> (chgcar analysis) -> + N x (relax) -> (return best structure) + + The workflow is: + [relax structure] + [get_stable_inserted_structure] + [get_stable_inserted_structure] + [get_stable_inserted_structure] + ... until the insertion is no longer topotactic. + + This workflow requires the users to provide the following functions: + self.get_charge_density(task_doc: TaskDoc): + Get the charge density of a TaskDoc output from a calculation. + self.update_static_maker(): + Ensure that the static maker will store the desired data. + + If you use this workflow please cite the following paper: + Shen, J.-X., Horton, M., & Persson, K. A. (2020). + A charge-density-based general cation insertion algorithm for + generating new Li-ion cathode materials. + npj Computational Materials, 6(161), 1โ€”7. + doi: 10.1038/s41524-020-00422-3 + + Attributes + ---------- + name: str + The name of the flow created by this maker. + relax_maker: RelaxMaker + A maker to perform relaxation calculations. + bulk_relax_maker: Maker + A separate maker to perform the first bulk relaxation calculation. + If None, the relax_maker will be used. + static_maker: Maker + A maker to perform static calculations. + structure_matcher: StructureMatcher + The structure matcher to use to determine if additional insertion is needed. + """ + + relax_maker: Maker + static_maker: Maker + bulk_relax_maker: Maker | None = None + name: str = "ion insertion" + structure_matcher: StructureMatcher = field( + default_factory=lambda: StructureMatcher( + comparator=ElementComparator(), + ) + ) + + def __post_init__(self) -> None: + """Ensure that the static maker will store the desired data.""" + self.update_static_maker() + + def make( + self, + structure: Structure, + inserted_element: ElementLike, + n_steps: int | None, + insertions_per_step: int = 4, + working_ion_entry: ComputedEntry | None = None, + ) -> Flow: + """Make the flow. + + Parameters + ---------- + structure: + Structure to insert ion into. + inserted_species: + Species to insert. + n_steps: int + The maximum number of sequential insertion steps to attempt. + insertions_per_step: int + The maximum number of ion insertion sites to attempt. + + Returns + ------- + Flow for ion insertion. + """ + # First relax the structure + if self.bulk_relax_maker: + relax = self.bulk_relax_maker.make(structure) + else: + relax = self.relax_maker.make(structure) + # add ignored_species to the structure matcher + sm = _add_ignored_species(self.structure_matcher, inserted_element) + # Get the inserted structure + new_entries_job = get_stable_inserted_results( + structure=relax.output.structure, + inserted_element=inserted_element, + structure_matcher=sm, + static_maker=self.static_maker, + relax_maker=self.relax_maker, + get_charge_density=self.get_charge_density, + n_steps=n_steps, + insertions_per_step=insertions_per_step, + ) + relaxed_summary = RelaxJobSummary( + structure=relax.output.structure, + entry=relax.output.entry, + dir_name=relax.output.dir_name, + uuid=relax.output.uuid, + ) + get_entries_job = get_computed_entries(new_entries_job.output, relaxed_summary) + structure_group_job = get_structure_group_doc( + get_entries_job.output, ignored_species=str(inserted_element) + ) + jobs = [relax, new_entries_job, get_entries_job, structure_group_job] + output = structure_group_job.output + if working_ion_entry: + insertion_electrode_job = get_insertion_electrode_doc( + get_entries_job.output, working_ion_entry + ) + jobs.append(insertion_electrode_job) + output = insertion_electrode_job.output + return Flow(jobs=jobs, output=output) + + @abstractmethod + def get_charge_density(self, prev_dir: Path | str) -> VolumetricData: + """Get the charge density of a structure. + + Parameters + ---------- + prev_dir: + The previous directory where the static calculation was performed. + + Returns + ------- + The charge density. + """ + + @abstractmethod + def update_static_maker(self) -> None: + """Ensure that the static maker will store the desired data.""" + + +def _add_ignored_species( + structure_matcher: StructureMatcher, species: ElementLike +) -> StructureMatcher: + """Add an ignored species to a structure matcher.""" + sm_dict = structure_matcher.as_dict() + ignored_species = set(sm_dict.get("ignored_species", set())) + ignored_species.add(str(species)) + sm_dict["ignored_species"] = list(ignored_species) + return StructureMatcher.from_dict(sm_dict) diff --git a/src/atomate2/common/flows/eos.py b/src/atomate2/common/flows/eos.py new file mode 100644 index 0000000000..b919f5b78a --- /dev/null +++ b/src/atomate2/common/flows/eos.py @@ -0,0 +1,186 @@ +"""Define common EOS flow agnostic to electronic-structure code.""" +from __future__ import annotations + +import contextlib +from dataclasses import dataclass, field +from typing import TYPE_CHECKING + +import numpy as np +from jobflow import Flow, Maker + +from atomate2.common.jobs.eos import PostProcessEosEnergy, apply_strain_to_structure + +if TYPE_CHECKING: + from pathlib import Path + + from jobflow import Job + from pymatgen.core import Structure + + from atomate2.common.jobs.eos import EOSPostProcessor + + +@dataclass +class CommonEosMaker(Maker): + """ + Generate equation of state data. + + First relax a structure using relax_maker. + Then perform a series of deformations on the relaxed structure, and + evaluate single-point energies with static_maker. + + Parameters + ---------- + name : str + Name of the flows produced by this maker. + initial_relax_maker : .Maker | None + Maker to relax the input structure, defaults to None (no initial relaxation). + eos_relax_maker : .Maker + Maker to relax deformationed structures for the EOS fit. + static_maker : .Maker | None + Maker to generate statics after each relaxation, defaults to None. + strain : tuple[float] + Percentage linear strain to apply as a deformation, default = -5% to 5%. + number_of_frames : int + Number of strain calculations to do for EOS fit, default = 6. + postprocessor : .atomate2.common.jobs.EOSPostProcessor + Optional postprocessing step, defaults to + `atomate2.common.jobs.PostProcessEosEnergy`. + _store_transformation_information : .bool = False + Whether to store the information about transformations. Unfortunately + needed at present to handle issues with emmet and pydantic validation + TODO: remove this when clash is fixed + """ + + name: str = "EOS Maker" + initial_relax_maker: Maker = None + eos_relax_maker: Maker = None + static_maker: Maker = None + linear_strain: tuple[float, float] = (-0.05, 0.05) + number_of_frames: int = 6 + postprocessor: EOSPostProcessor = field(default_factory=PostProcessEosEnergy) + _store_transformation_information: bool = False + + def make(self, structure: Structure, prev_dir: str | Path = None) -> Flow: + """ + Run an EOS flow. + + Parameters + ---------- + structure : Structure + A pymatgen structure object. + prev_dir : str or Path or None + A previous calculation directory to copy output files from. + + Returns + ------- + .Flow, an EOS flow + """ + jobs: dict[str, list[Job]] = {key: [] for key in ("relax", "static", "utility")} + + job_types: tuple[str, ...] = ( + ("relax", "static") if self.static_maker else ("relax",) + ) + flow_output: dict[str, dict] = { + key: {quantity: [] for quantity in ("energy", "volume", "stress")} + for key in job_types + } + + # First step: optional relaxation of structure + if self.initial_relax_maker: + relax_flow = self.initial_relax_maker.make( + structure=structure, prev_dir=prev_dir + ) + relax_flow.name = "EOS equilibrium relaxation" + + flow_output["initial_relax"] = { + "E0": relax_flow.output.output.energy, + "V0": relax_flow.output.structure.volume, + } + structure = relax_flow.output.structure + prev_dir = relax_flow.output.dir_name + jobs["relax"].append(relax_flow) + + if self.static_maker: + equil_static = self.static_maker.make( + structure=structure, prev_dir=prev_dir + ) + equil_static.name = "EOS equilibrium static" + flow_output["initial_static"] = { + "E0": equil_static.output.output.energy, + "V0": equil_static.output.structure.volume, + } + jobs["static"].append(equil_static) + + strain_l, strain_delta = np.linspace( + self.linear_strain[0], + self.linear_strain[1], + self.number_of_frames, + retstep=True, + ) + + if self.initial_relax_maker: + # Cell without applied strain already included from relax/equilibrium steps. + # Perturb this point (or these points) if included + zero_strain_mask = np.abs(strain_l) < 1.0e-15 + if np.any(zero_strain_mask): + nzs = len(strain_l[zero_strain_mask]) + shift = strain_delta / (nzs + 1.0) * np.linspace(-1.0, 1.0, nzs) + strain_l[np.abs(strain_l) < 1.0e-15] += shift + + deformation_l = [(np.identity(3) * (1.0 + eps)).tolist() for eps in strain_l] + + # apply strain to structures, return list of transformations + transformations = apply_strain_to_structure(structure, deformation_l) + jobs["utility"] += [transformations] + + for idef in range(self.number_of_frames): + if self._store_transformation_information: + with contextlib.suppress(Exception): + # write details of the transformation to the + # transformations.json file. This file will automatically get + # added to the task document and allow the elastic builder + # to reconstruct the elastic document. Note the ":" + # is automatically converted to a "." in the filename. + self.eos_relax_maker.write_additional_data[ + "transformations:json" + ] = transformations.output[idef] + + relax_job = self.eos_relax_maker.make( + structure=transformations.output[idef].final_structure, + prev_dir=prev_dir, + ) + relax_job.name += f" deformation {idef}" + jobs["relax"].append(relax_job) + + if self.static_maker: + static_job = self.static_maker.make( + structure=relax_job.output.structure, + prev_dir=relax_job.output.dir_name, + ) + static_job.name += f" {idef}" + jobs["static"].append(static_job) + + for key in job_types: + for i in range(len(jobs[key])): + flow_output[key]["energy"].append(jobs[key][i].output.output.energy) + flow_output[key]["volume"].append(jobs[key][i].output.structure.volume) + flow_output[key]["stress"].append(jobs[key][i].output.output.stress) + + if self.postprocessor is not None: + if len(jobs["relax"]) < self.postprocessor.min_data_points: + raise ValueError( + "To perform least squares EOS fit with " + f"{self.postprocessor.__class__}, you must specify " + f"self.number_of_frames >= {self.postprocessor.min_data_points}." + ) + + postprocess = self.postprocessor.make(flow_output) + postprocess.name = self.name + " postprocessing" + flow_output = postprocess.output + jobs["utility"] += [postprocess] + + joblist = [] + for key in jobs: + joblist += jobs[key] + + return Flow(jobs=joblist, output=flow_output, name=self.name) diff --git a/src/atomate2/common/flows/phonons.py b/src/atomate2/common/flows/phonons.py new file mode 100644 index 0000000000..46da4837ad --- /dev/null +++ b/src/atomate2/common/flows/phonons.py @@ -0,0 +1,371 @@ +"""Flows for calculating phonons.""" + +from __future__ import annotations + +from abc import ABC, abstractmethod +from dataclasses import dataclass, field +from typing import TYPE_CHECKING + +from jobflow import Flow, Maker + +from atomate2.common.jobs.phonons import ( + generate_frequencies_eigenvectors, + generate_phonon_displacements, + get_supercell_size, + get_total_energy_per_cell, + run_phonon_displacements, +) +from atomate2.common.jobs.utils import structure_to_conventional, structure_to_primitive + +if TYPE_CHECKING: + from pathlib import Path + + from emmet.core.math import Matrix3D + from pymatgen.core.structure import Structure + + from atomate2.aims.jobs.base import BaseAimsMaker + from atomate2.forcefields.jobs import ForceFieldRelaxMaker, ForceFieldStaticMaker + from atomate2.vasp.jobs.base import BaseVaspMaker + +SUPPORTED_CODES = ["vasp", "aims", "forcefields"] + + +@dataclass +class BasePhononMaker(Maker, ABC): + """ + Maker to calculate harmonic phonons with a DFT/force field code and Phonopy. + + Calculate the harmonic phonons of a material. Initially, a tight structural + relaxation is performed to obtain a structure without forces on the atoms. + Subsequently, supercells with one displaced atom are generated and accurate + forces are computed for these structures. With the help of phonopy, these + forces are then converted into a dynamical matrix. To correct for polarization + effects, a correction of the dynamical matrix based on BORN charges can + be performed. Finally, phonon densities of states, phonon band structures + and thermodynamic properties are computed. + + .. Note:: + It is heavily recommended to symmetrize the structure before passing it to + this flow. Otherwise, a different space group might be detected and too + many displacement calculations will be generated. + It is recommended to check the convergence parameters here and + adjust them if necessary. The default might not be strict enough + for your specific case. + + Parameters + ---------- + name : str + Name of the flows produced by this maker. + sym_reduce : bool + Whether to reduce the number of deformations using symmetry. + symprec : float + Symmetry precision to use in the + reduction of symmetry to find the primitive/conventional cell + (use_primitive_standard_structure, use_conventional_standard_structure) + and to handle all symmetry-related tasks in phonopy + displacement: float + displacement distance for phonons + min_length: float + min length of the supercell that will be built + prefer_90_degrees: bool + if set to True, supercell algorithm will first try to find a supercell + with 3 90 degree angles + get_supercell_size_kwargs: dict + kwargs that will be passed to get_supercell_size to determine supercell size + use_symmetrized_structure: str + allowed strings: "primitive", "conventional", None + + - "primitive" will enforce to start the phonon computation + from the primitive standard structure + according to Setyawan, W., & Curtarolo, S. (2010). + High-throughput electronic band structure calculations: + Challenges and tools. Computational Materials Science, + 49(2), 299-312. doi:10.1016/j.commatsci.2010.05.010. + This makes it possible to use certain k-path definitions + with this workflow. Otherwise, we must rely on seekpath + - "conventional" will enforce to start the phonon computation + from the conventional standard structure + according to Setyawan, W., & Curtarolo, S. (2010). + High-throughput electronic band structure calculations: + Challenges and tools. Computational Materials Science, + 49(2), 299-312. doi:10.1016/j.commatsci.2010.05.010. + We will however use seekpath and primitive structures + as determined by from phonopy to compute the phonon band structure + bulk_relax_maker: .ForceFieldRelaxMaker, .BaseAimsMaker, .BaseVaspMaker, or None + A maker to perform a tight relaxation on the bulk. + Set to ``None`` to skip the + bulk relaxation + static_energy_maker: .ForceFieldRelaxMaker, .BaseAimsMaker, .BaseVaspMaker, or None + A maker to perform the computation of the DFT energy on the bulk. + Set to ``None`` to skip the + static energy computation + born_maker: .ForceFieldStaticMaker, .BaseAsimsMaker, .BaseVaspMaker, or None + Maker to compute the BORN charges. + phonon_displacement_maker: .ForceFieldStaticMaker, .BaseAimsMaker, .BaseVaspMaker + Maker used to compute the forces for a supercell. + generate_frequencies_eigenvectors_kwargs : dict + Keyword arguments passed to :obj:`generate_frequencies_eigenvectors`. + create_thermal_displacements: bool + Bool that determines if thermal_displacement_matrices are computed + kpath_scheme: str + scheme to generate kpoints. Please be aware that + you can only use seekpath with any kind of cell + Otherwise, please use the standard primitive structure + Available schemes are: + "seekpath", "hinuma", "setyawan_curtarolo", "latimer_munro". + "seekpath" and "hinuma" are the same definition but + seekpath can be used with any kind of unit cell as + it relies on phonopy to handle the relationship + to the primitive cell and not pymatgen + code: str + determines the dft or force field code. + store_force_constants: bool + if True, force constants will be stored + socket: bool + If True, use the socket for the calculation + """ + + name: str = "phonon" + sym_reduce: bool = True + symprec: float = 1e-4 + displacement: float = 0.01 + min_length: float | None = 20.0 + prefer_90_degrees: bool = True + get_supercell_size_kwargs: dict = field(default_factory=dict) + use_symmetrized_structure: str | None = None + bulk_relax_maker: ForceFieldRelaxMaker | BaseVaspMaker | BaseAimsMaker | None = None + static_energy_maker: ForceFieldRelaxMaker | BaseVaspMaker | BaseAimsMaker | None = ( + None + ) + born_maker: ForceFieldStaticMaker | BaseVaspMaker | None = None + phonon_displacement_maker: ForceFieldStaticMaker | BaseVaspMaker | BaseAimsMaker = ( + None + ) + create_thermal_displacements: bool = True + generate_frequencies_eigenvectors_kwargs: dict = field(default_factory=dict) + kpath_scheme: str = "seekpath" + code: str = None + store_force_constants: bool = True + socket: bool = False + + def make( + self, + structure: Structure, + prev_dir: str | Path | None = None, + born: list[Matrix3D] | None = None, + epsilon_static: Matrix3D | None = None, + total_dft_energy_per_formula_unit: float | None = None, + supercell_matrix: Matrix3D | None = None, + ) -> Flow: + """ + Make flow to calculate the phonon properties. + + Parameters + ---------- + structure : Structure + A pymatgen structure object. Please start with a structure + that is nearly fully optimized as the internal optimizers + have very strict settings! + prev_dir : str or Path or None + A previous calculation directory to use for copying outputs. + born: Matrix3D + Instead of recomputing born charges and epsilon, these values can also be + provided manually. If born and epsilon_static are provided, the born run + will be skipped it can be provided in the VASP convention with information + for every atom in unit cell. Please be careful when converting structures + within in this workflow as this could lead to errors + epsilon_static: Matrix3D + The high-frequency dielectric constant to use instead of recomputing born + charges and epsilon. If born, epsilon_static are provided, the born run + will be skipped + total_dft_energy_per_formula_unit: float + It has to be given per formula unit (as a result in corresponding Doc). + Instead of recomputing the energy of the bulk structure every time, this + value can also be provided in eV. If it is provided, the static run will be + skipped. This energy is the typical output dft energy of the dft workflow. + No conversion needed. + supercell_matrix: list + Instead of min_length, also a supercell_matrix can be given, e.g. + [[1.0,0.0,0.0],[0.0,1.0,0.0],[0.0,0.0,1.0] + """ + use_symmetrized_structure = self.use_symmetrized_structure + kpath_scheme = self.kpath_scheme + valid_structs = (None, "primitive", "conventional") + if use_symmetrized_structure not in valid_structs: + raise ValueError( + f"Invalid {use_symmetrized_structure=}, use one of {valid_structs}" + ) + + if use_symmetrized_structure != "primitive" and kpath_scheme != "seekpath": + raise ValueError( + f"You can't use {kpath_scheme=} with the primitive standard " + "structure, please use seekpath" + ) + + valid_schemes = ("seekpath", "hinuma", "setyawan_curtarolo", "latimer_munro") + if kpath_scheme not in valid_schemes: + raise ValueError( + f"{kpath_scheme=} is not implemented, use one of {valid_schemes}" + ) + + if self.code is None or self.code not in SUPPORTED_CODES: + raise ValueError( + "The code variable must be passed and it must be a supported code." + f" Supported codes are: {SUPPORTED_CODES}" + ) + + jobs = [] + + # TODO: should this be after or before structural optimization as the + # optimization could change the symmetry we could add a tutorial and point out + # that the structure should be nearly optimized before the phonon workflow + if self.use_symmetrized_structure == "primitive": + # These structures are compatible with many + # of the kpath algorithms that are used for Materials Project + prim_job = structure_to_primitive(structure, self.symprec) + jobs.append(prim_job) + structure = prim_job.output + elif self.use_symmetrized_structure == "conventional": + # it could be beneficial to use conventional standard structures to arrive + # faster at supercells with right angles + conv_job = structure_to_conventional(structure, self.symprec) + jobs.append(conv_job) + structure = conv_job.output + + optimization_run_job_dir = None + optimization_run_uuid = None + + if self.bulk_relax_maker is not None: + # optionally relax the structure + bulk_kwargs = {} + if self.prev_calc_dir_argname is not None: + bulk_kwargs[self.prev_calc_dir_argname] = prev_dir + bulk = self.bulk_relax_maker.make(structure, **bulk_kwargs) + jobs.append(bulk) + structure = bulk.output.structure + prev_dir = bulk.output.dir_name + optimization_run_job_dir = bulk.output.dir_name + optimization_run_uuid = bulk.output.uuid + + # if supercell_matrix is None, supercell size will be determined after relax + # maker to ensure that cell lengths are really larger than threshold + if supercell_matrix is None: + supercell_job = get_supercell_size( + structure, + self.min_length, + self.prefer_90_degrees, + **self.get_supercell_size_kwargs, + ) + jobs.append(supercell_job) + supercell_matrix = supercell_job.output + + # Computation of static energy + total_dft_energy = None + static_run_job_dir = None + static_run_uuid = None + if (self.static_energy_maker is not None) and ( + total_dft_energy_per_formula_unit is None + ): + static_job_kwargs = {} + if self.prev_calc_dir_argname is not None: + static_job_kwargs[self.prev_calc_dir_argname] = prev_dir + static_job = self.static_energy_maker.make( + structure=structure, **static_job_kwargs + ) + jobs.append(static_job) + total_dft_energy = static_job.output.output.energy + static_run_job_dir = static_job.output.dir_name + static_run_uuid = static_job.output.uuid + prev_dir = static_job.output.dir_name + elif total_dft_energy_per_formula_unit is not None: + # to make sure that one can reuse results from Doc + compute_total_energy_job = get_total_energy_per_cell( + total_dft_energy_per_formula_unit, structure + ) + jobs.append(compute_total_energy_job) + total_dft_energy = compute_total_energy_job.output + + # get a phonon object from phonopy + displacements = generate_phonon_displacements( + structure=structure, + supercell_matrix=supercell_matrix, + displacement=self.displacement, + sym_reduce=self.sym_reduce, + symprec=self.symprec, + use_symmetrized_structure=self.use_symmetrized_structure, + kpath_scheme=self.kpath_scheme, + code=self.code, + ) + jobs.append(displacements) + + # perform the phonon displacement calculations + displacement_calcs = run_phonon_displacements( + displacements=displacements.output, + structure=structure, + supercell_matrix=supercell_matrix, + phonon_maker=self.phonon_displacement_maker, + socket=self.socket, + prev_dir_argname=self.prev_calc_dir_argname, + prev_dir=prev_dir, + ) + jobs.append(displacement_calcs) + + # Computation of BORN charges + born_run_job_dir = None + born_run_uuid = None + if self.born_maker is not None and (born is None or epsilon_static is None): + born_kwargs = {} + if self.prev_calc_dir_argname is not None: + born_kwargs[self.prev_calc_dir_argname] = prev_dir + born_job = self.born_maker.make(structure, **born_kwargs) + jobs.append(born_job) + + # I am not happy how we currently access "born" charges + # This is very vasp specific code aims and forcefields + # do not support this at the moment, if this changes we have + # to update this section + epsilon_static = born_job.output.calcs_reversed[0].output.epsilon_static + born = born_job.output.calcs_reversed[0].output.outcar["born"] + born_run_job_dir = born_job.output.dir_name + born_run_uuid = born_job.output.uuid + + phonon_collect = generate_frequencies_eigenvectors( + supercell_matrix=supercell_matrix, + displacement=self.displacement, + sym_reduce=self.sym_reduce, + symprec=self.symprec, + use_symmetrized_structure=self.use_symmetrized_structure, + kpath_scheme=self.kpath_scheme, + code=self.code, + structure=structure, + displacement_data=displacement_calcs.output, + epsilon_static=epsilon_static, + born=born, + total_dft_energy=total_dft_energy, + static_run_job_dir=static_run_job_dir, + static_run_uuid=static_run_uuid, + born_run_job_dir=born_run_job_dir, + born_run_uuid=born_run_uuid, + optimization_run_job_dir=optimization_run_job_dir, + optimization_run_uuid=optimization_run_uuid, + create_thermal_displacements=self.create_thermal_displacements, + store_force_constants=self.store_force_constants, + **self.generate_frequencies_eigenvectors_kwargs, + ) + + jobs.append(phonon_collect) + + # create a flow including all jobs for a phonon computation + return Flow(jobs, phonon_collect.output) + + @property + @abstractmethod + def prev_calc_dir_argname(self) -> str | None: + """Name of argument informing static maker of previous calculation directory. + + As this differs between different DFT codes (e.g., VASP, CP2K), it + has been left as a property to be implemented by the inheriting class. + + Note: this is only applicable if a relax_maker is specified; i.e., two + calculations are performed for each ordering (relax -> static) + """ diff --git a/src/atomate2/common/jobs/__init__.py b/src/atomate2/common/jobs/__init__.py index 77701f2bf8..cb42134aa8 100644 --- a/src/atomate2/common/jobs/__init__.py +++ b/src/atomate2/common/jobs/__init__.py @@ -1,2 +1,3 @@ """DFT code agnostic jobs.""" + from .utils import structure_to_conventional, structure_to_primitive diff --git a/src/atomate2/common/jobs/defect.py b/src/atomate2/common/jobs/defect.py index 769f553b9e..ff1cc86bcb 100644 --- a/src/atomate2/common/jobs/defect.py +++ b/src/atomate2/common/jobs/defect.py @@ -17,6 +17,7 @@ from pymatgen.entries.computed_entries import ComputedStructureEntry from atomate2.common.schemas.defects import CCDDocument +from atomate2.utils.path import strip_hostname if TYPE_CHECKING: from collections.abc import Iterable @@ -59,8 +60,8 @@ def get_charged_structures(structure: Structure, charges: Iterable) -> list[Stru A dictionary with the two structures with the charge states added. """ structs_out = [structure.copy() for _ in charges] - for i, q in enumerate(charges): - structs_out[i].set_charge(q) + for idx, q in enumerate(charges): + structs_out[idx].set_charge(q) return structs_out @@ -70,7 +71,7 @@ def spawn_energy_curve_calcs( distorted_structure: Structure, distortions: Iterable[float], static_maker: StaticMaker, - prev_vasp_dir: str | Path | None = None, + prev_dir: str | Path | None = None, add_name: str = "", add_info: dict | None = None, ) -> Response: @@ -107,15 +108,15 @@ def spawn_energy_curve_calcs( distorted_structure, nimages=s_distortions ) # add all the distorted structures - for i, d_struct in enumerate(distorted_structures): - static_job = static_maker.make(d_struct, prev_vasp_dir=prev_vasp_dir) - suffix = f" {i}" if add_name == "" else f" {add_name} {i}" + for idx, d_struct in enumerate(distorted_structures): + static_job = static_maker.make(d_struct, prev_dir=prev_dir) + suffix = f" {idx}" if add_name == "" else f" {add_name} {idx}" # write some provenances data in info.json file info = { "relaxed_structure": relaxed_structure, "distorted_structure": distorted_structure, - "distortion": s_distortions[i], + "distortion": s_distortions[idx], } if add_info is not None: info.update(add_info) @@ -185,9 +186,9 @@ def get_ccd_documents( @job def get_supercell_from_prv_calc( uc_structure: Structure, - prv_calc_dir: str | Path | None = None, + prv_calc_dir: str | Path, + sc_entry_and_locpot_from_prv: Callable, sc_mat_ref: NDArray | None = None, - structure_from_prv: Callable | None = None, ) -> dict: """Get the supercell from the previous calculation. @@ -201,22 +202,25 @@ def get_supercell_from_prv_calc( The directory of the previous calculation. sc_mat : NDArray The supercell matrix. If not None, use this to validate the extracted supercell. - structure_from_prv : Callable - Function to get the supercell structure from the previous calculation. + sc_entry_and_locpot_from_prv : Callable + Function to get the supercell ComputedStructureEntry and Locpot from the + previous calculation. Returns ------- Response: Output containing the supercell transformation and the dir_name """ - sc_structure = structure_from_prv(prv_calc_dir) + prv_calc_dir = strip_hostname(prv_calc_dir) + sc_entry, plnr_locpot = sc_entry_and_locpot_from_prv(prv_calc_dir) + sc_structure = sc_entry.structure sc_mat_prv, _ = get_matched_structure_mapping( uc_struct=uc_structure, sc_struct=sc_structure ) if sc_mat_ref is not None: - latt_ref = Lattice(sc_mat_ref) - latt_prv = Lattice(sc_mat_prv) + latt_ref = (uc_structure * sc_mat_ref).lattice + latt_prv = (uc_structure * sc_mat_prv).lattice if not ( np.allclose(sorted(latt_ref.abc), sorted(latt_prv.abc)) and np.allclose(sorted(latt_ref.angles), sorted(latt_prv.angles)) @@ -225,7 +229,15 @@ def get_supercell_from_prv_calc( "The supercell matrix extracted from the previous calculation " "does not match the the desired supercell shape." ) - return {"sc_mat": sc_mat_prv, "lattice": Lattice(sc_structure.lattice.matrix)} + return { + "sc_entry": sc_entry, + "sc_struct": sc_structure, + "sc_mat": sc_mat_prv, + "dir_name": prv_calc_dir, + "lattice": Lattice(sc_structure.lattice.matrix), + "uuid": None, + "locpot_plnr": plnr_locpot, + } @job(name="bulk supercell") @@ -233,6 +245,7 @@ def bulk_supercell_calculation( uc_structure: Structure, relax_maker: RelaxMaker, sc_mat: NDArray | None = None, + get_planar_locpot: Callable | None = None, ) -> Response: """Bulk Supercell calculation. @@ -246,12 +259,19 @@ def bulk_supercell_calculation( The relax maker to use. sc_mat : NDArray | None The supercell matrix used to construct the simulation cell. + get_plnr_locpot : Callable | None + A function to get the Locpot from the output of the task document. Returns ------- Response: Output a dictionary containing the bulk supercell calculation summary. """ + if get_planar_locpot is None: + + def get_planar_locpot(task_doc: TaskDoc) -> NDArray: + return task_doc.calcs_reversed[0].output.locpot + logger.info("Running bulk supercell calculation. Running...") sc_mat = get_sc_fromstruct(uc_structure) if sc_mat is None else sc_mat sc_mat = np.array(sc_mat) @@ -270,7 +290,7 @@ def bulk_supercell_calculation( "sc_mat": sc_mat.tolist(), "dir_name": relax_output.dir_name, "uuid": relax_job.uuid, - "locpot_plnr": relax_output.calcs_reversed[0].output.locpot, + "locpot_plnr": get_planar_locpot(relax_output), } flow = Flow([relax_job], output=summary_d) return Response(replace=flow) @@ -409,11 +429,11 @@ def check_charge_state(charge_state: int, task_structure: Structure) -> Response @job def get_defect_entry(charge_state_summary: dict, bulk_summary: dict) -> list[dict]: """Get a defect entry from a defect calculation and a bulk calculation.""" - bulk_sc_entry = bulk_summary["sc_entry"] - bulk_struct_entry = ComputedStructureEntry( - structure=bulk_summary["sc_struct"], - energy=bulk_sc_entry.energy, - ) + bulk_struct_entry = bulk_summary["sc_entry"] + # bulk_struct_entry = ComputedStructureEntry( + # structure=bulk_summary["sc_struct"], + # energy=bulk_sc_entry.energy, + # ) bulk_dir_name = bulk_summary["dir_name"] bulk_locpot = bulk_summary["locpot_plnr"] defect_ent_res = [] @@ -438,7 +458,7 @@ def get_defect_entry(charge_state_summary: dict, bulk_summary: dict) -> list[dic "defect_locpot": defect_locpot, "bulk_dir_name": bulk_dir_name, "bulk_locpot": bulk_locpot, - "bulk_uuid": bulk_summary.get("uuid", None), + "bulk_uuid": bulk_summary.get("uuid"), "defect_uuid": qq_summary.get("uuid", None), } ) diff --git a/src/atomate2/common/jobs/elastic.py b/src/atomate2/common/jobs/elastic.py index 171968b344..f4606e78e7 100644 --- a/src/atomate2/common/jobs/elastic.py +++ b/src/atomate2/common/jobs/elastic.py @@ -128,7 +128,7 @@ def run_elastic_deformations( """ relaxations = [] outputs = [] - for i, deformation in enumerate(deformations): + for idx, deformation in enumerate(deformations): # deform the structure dst = DeformStructureTransformation(deformation=deformation) ts = TransformedStructure(structure, transformations=[dst]) @@ -146,7 +146,7 @@ def run_elastic_deformations( elastic_job_kwargs[prev_dir_argname] = prev_dir # create the job relax_job = elastic_relax_maker.make(deformed_structure, **elastic_job_kwargs) - relax_job.append_name(f" {i + 1}/{len(deformations)}") + relax_job.append_name(f" {idx + 1}/{len(deformations)}") relaxations.append(relax_job) # extract the outputs we want diff --git a/src/atomate2/common/jobs/electrode.py b/src/atomate2/common/jobs/electrode.py new file mode 100644 index 0000000000..1d3786c077 --- /dev/null +++ b/src/atomate2/common/jobs/electrode.py @@ -0,0 +1,305 @@ +"""Jobs for electrode analysis.""" + +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING, Callable, NamedTuple + +from emmet.core.electrode import InsertionElectrodeDoc +from emmet.core.structure_group import StructureGroupDoc +from jobflow import Flow, Maker, Response, job +from pymatgen.analysis.defects.generators import ChargeInterstitialGenerator +from pymatgen.entries.computed_entries import ComputedStructureEntry + +if TYPE_CHECKING: + from pathlib import Path + + from pymatgen.alchemy import ElementLike + from pymatgen.analysis.structure_matcher import StructureMatcher + from pymatgen.core import Structure + from pymatgen.entries.computed_entries import ComputedEntry + from pymatgen.io.vasp.outputs import VolumetricData + + +logger = logging.getLogger(__name__) + +__author__ = "Jimmy Shen" +__email__ = "jmmshn@gmail.com" + + +class RelaxJobSummary(NamedTuple): + """A summary of a relaxation job.""" + + structure: Structure + entry: ComputedEntry + dir_name: str + uuid: str + + +@job +def get_stable_inserted_results( + structure: Structure, + inserted_element: ElementLike, + structure_matcher: StructureMatcher, + static_maker: Maker, + relax_maker: Maker, + get_charge_density: Callable, + insertions_per_step: int = 4, + n_steps: int | None = None, + n_inserted: int = 0, +) -> Response: + """Attempt ion insertion. + + The basic unit for cation insertion is: + [get_stable_inserted_structure]: + (static) -> N x (chgcar analysis -> relax) -> (return best structure) + + Parameters + ---------- + structure: + The structure to insert into. + inserted_species: + The species to insert. + structure_matcher: + The structure matcher to use to determine if additional + insertion is needed. + static_maker: + A maker to perform static calculations. + relax_maker: + A maker to perform relaxation calculations. + get_charge_density: + A function to get the charge density from a previous calculation. + Whether to use the AECCAR0 and AECCAR2 files for the charge density. + This is often necessary since the CHGCAR file has spurious effects near the + core which often breaks the min-filter algorithms used to identify the local + minima. + insertions_per_step: + The maximum number of ion insertion sites to attempt. + n_steps: + The maximum number of steps to perform. + n_inserted: + The number of ions inserted so far, used to help assign a unique name to the + different jobs. + """ + if structure is None: + return [] + if n_steps is not None and n_steps <= 0: + return [] + # append job name + add_name = f"{n_inserted}" + + static_job = static_maker.make(structure=structure) + chg_job = get_charge_density_job(static_job.output.dir_name, get_charge_density) + insertion_job = get_inserted_structures( + chg_job.output, + inserted_species=inserted_element, + insertions_per_step=insertions_per_step, + ) + relax_jobs = get_relaxed_job_summaries( + structures=insertion_job.output, relax_maker=relax_maker, append_name=add_name + ) + + min_en_job = get_min_energy_summary( + relaxed_summaries=relax_jobs.output, + ref_structure=structure, + structure_matcher=structure_matcher, + ) + nn_step = n_steps - 1 if n_steps is not None else None + next_step = get_stable_inserted_results( + structure=min_en_job.output[0], + inserted_element=inserted_element, + structure_matcher=structure_matcher, + static_maker=static_maker, + relax_maker=relax_maker, + get_charge_density=get_charge_density, + insertions_per_step=insertions_per_step, + n_steps=nn_step, + n_inserted=n_inserted + 1, + ) + + for job_ in [static_job, chg_job, insertion_job, min_en_job, relax_jobs, next_step]: + job_.append_name(f" {add_name}") + combine_job = get_computed_entries(next_step.output, min_en_job.output) + replace_flow = Flow( + jobs=[ + static_job, + chg_job, + insertion_job, + relax_jobs, + min_en_job, + next_step, + combine_job, + ], + output=combine_job.output, + ) + return Response(replace=replace_flow) + + +@job +def get_computed_entries( + multi: list[ComputedEntry], single: RelaxJobSummary | None +) -> list[ComputedEntry]: + """Add a single new entry to a list of entries. + + Parameters + ---------- + multi: The list of entries. + single: Possible tuple containing the new entry + + Returns + ------- + The list of entries with the new entry added. + """ + if single is None: + return multi + # keep the [1] for now, if jobflow supports NamedTuple, we can do this much cleaner + s_ = RelaxJobSummary._make(single) + s_.entry.entry_id = s_.uuid + ent = ComputedStructureEntry( + structure=s_.structure, + energy=s_.entry.energy, + parameters=s_.entry.parameters, + data=s_.entry.data, + entry_id=s_.uuid, + ) + return [*multi, ent] + + +@job(output_schema=StructureGroupDoc) +def get_structure_group_doc( + computed_entries: list[ComputedEntry], ignored_species: str +) -> Response: + """Take in `ComputedEntry` and return a `StructureGroupDoc`.""" + for ient in computed_entries: + ient.data["material_id"] = ient.entry_id + return StructureGroupDoc.from_grouped_entries( + computed_entries, ignored_specie=ignored_species + ) + + +@job(output_schema=InsertionElectrodeDoc) +def get_insertion_electrode_doc( + computed_entries: ComputedEntry, working_ion_entry: ComputedEntry +) -> Response: + """Return a `InsertionElectrodeDoc`.""" + for ient in computed_entries: + ient.data["material_id"] = ient.entry_id + return InsertionElectrodeDoc.from_entries( + computed_entries, working_ion_entry, battery_id=None + ) + + +@job +def get_inserted_structures( + chg: VolumetricData, + inserted_species: ElementLike, + insertions_per_step: int = 4, + charge_insertion_generator: ChargeInterstitialGenerator | None = None, +) -> list[Structure]: + """Get the inserted structures. + + Parameters + ---------- + chg: The charge density. + inserted_species: The species to insert. + insertions_per_step: The maximum number of ion insertion sites to attempt. + charge_insertion_generator: The charge insertion generator to use, + tolerances should be set here. + + + Returns + ------- + The inserted structures. + """ + if charge_insertion_generator is None: + charge_insertion_generator = ChargeInterstitialGenerator() + gen = charge_insertion_generator.generate(chg, insert_species=[inserted_species]) + inserted_structures = [defect.defect_structure for defect in gen] + return inserted_structures[:insertions_per_step] + + +@job +def get_relaxed_job_summaries( + structures: list[Structure], + relax_maker: Maker, + append_name: str = "", +) -> Response: + """Spawn relaxation jobs. + + Parameters + ---------- + structures: The structures to relax. + relax_maker: The maker to use to spawn relaxation jobs. + + Returns + ------- + The relaxation jobs. + """ + relax_jobs = [] + outputs = [] + for ii, structure in enumerate(structures): + job_ = relax_maker.make(structure=structure) + relax_jobs.append(job_) + job_.append_name(f" {append_name} ({ii})") + d_ = { + "structure": job_.output.structure, + "entry": job_.output.entry, + "dir_name": job_.output.dir_name, + "uuid": job_.output.uuid, + } + outputs.append(RelaxJobSummary(**d_)) + + replace_flow = Flow(relax_jobs, output=outputs) + return Response(replace=replace_flow, output=outputs) + + +@job +def get_min_energy_summary( + relaxed_summaries: list[RelaxJobSummary], + ref_structure: Structure, + structure_matcher: StructureMatcher, +) -> Response: + """Get the structure with the lowest energy. + + Parameters + ---------- + structures: The structures to compare. + ref_structure: The reference structure to compare to. + structure_matcher: The structure matcher to use to compare structures. + + Returns + ------- + The structure with the lowest energy. + """ + # Since the outputs parser will see a NamedTuple and immediately convert it to + # a list We have to convert the list of lists to a list of NamedTuples + relaxed_summaries = list(map(RelaxJobSummary._make, relaxed_summaries)) + topotactic_summaries = [ + summary + for summary in relaxed_summaries + if structure_matcher.fit(ref_structure, summary.structure) + ] + + if len(topotactic_summaries) == 0: + return None + + return min(topotactic_summaries, key=lambda x: x.entry.energy_per_atom) + + +@job +def get_charge_density_job( + prev_dir: Path | str, + get_charge_density: Callable, +) -> VolumetricData: + """Get the charge density from a task document. + + Parameters + ---------- + prev_dir: The previous directory where the static calculation was performed. + get_charge_density: A function to get the charge density from a task document. + + Returns + ------- + The charge density. + """ + return get_charge_density(prev_dir) diff --git a/src/atomate2/common/jobs/eos.py b/src/atomate2/common/jobs/eos.py new file mode 100644 index 0000000000..b5c0b5cbad --- /dev/null +++ b/src/atomate2/common/jobs/eos.py @@ -0,0 +1,362 @@ +"""Define common jobs used in EOS workflows, electronic-structure code agnostic.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import numpy as np +from jobflow import job +from monty.json import MSONable +from pymatgen.alchemy.materials import TransformedStructure +from pymatgen.analysis.eos import EOS, EOSError +from pymatgen.transformations.standard_transformations import ( + DeformStructureTransformation, +) +from scipy.optimize import leastsq + +if TYPE_CHECKING: + from collections.abc import Sequence + from typing import Any + + from jobflow import Job + from pymatgen.core import Structure + + +class EOSPostProcessor(MSONable): + """ + Fit data to an EOS. + + name : str + Name of the class + eos_attrs : tuple[str,...] + Physical quantities that can enter the EOS fit + job_types : tuple[str,...] + Types of jobs included in the EOS data + min_data_points : int or None + Minimum number of data points needed to perform a fit. + """ + + name: str = "EOS postprocessor" + eos_attrs: tuple[str, ...] = ("energy", "volume", "stress", "pressure") + job_types: tuple[str, ...] = ("relax", "static") + min_data_points: int | None = None + + def __init__(self) -> None: + self.results: dict[str, dict] = {} + + def sort_by_quantity(self, quantity: str = "volume") -> None: + """ + Sort input data by given kwarg. + + Parameters + ---------- + quantity : str = "volume" + kwarg to sort by + """ + for job_type in self._use_job_types: + sort_by_vol = np.argsort(self.results[job_type][quantity]) + for key in self.eos_attrs: + if self.results[job_type].get(key): + self.results[job_type][key] = [ + self.results[job_type][key][index] for index in sort_by_vol + ] + + def eval(self) -> None: + """Fit the EOS according to a user-implemented function.""" + raise NotImplementedError + + def fit(self, eos_flow_output: dict[str, Any]) -> None: + """ + Fit the EOS. + + Parameters + ---------- + eos_flow_output : dict + Volume, energy, and (optionally) stress and pressure data in dict form, + { + "relax" and "static" : { + "energy": list, + "volume": list, + "stress": list + }, + "initial_": {"E0": float, "V0": float} , + for in ("relax", "static") + } + """ + self.results.update(eos_flow_output) + self._use_job_types = [key for key in self.job_types if self.results.get(key)] + if self.min_data_points and any( + len(self.results[job_type].get("volume", [])) < self.min_data_points + for job_type in self._use_job_types + ): + raise ValueError( + f"{self.__class__} requires {self.min_data_points} " + "frames to fit an EOS." + ) + + self.sort_by_quantity() + self.eval() + + @job + def make(self, eos_flow_output: dict[str, Any]) -> Job: + """ + Run the fit as a jobflow job. + + Parameters + ---------- + eos_flow_output : dict + Volume, energy, and (optionally) stress and pressure data in dict form, + { + "relax" and "static" : { + "energy": list, + "volume": list, + "stress": list + }, + "initial_": {"E0": float, "V0": float} , + for in ("relax", "static") + } + """ + self.fit(eos_flow_output) + return self.results + + +class PostProcessEosEnergy(EOSPostProcessor): + """ + Fit energy vs. volume data to an EOS. + + Parameters + ---------- + eos_flow_output : dict + Volume, energy, and (optionally) stress and pressure data in dict form, + { + "relax" and "static" : { + "energy": list, + "volume": list, + "stress": list + }, + "initial_": {"E0": float, "V0": float} , + for in ("relax", "static") + } + name : str + Name of the class + eos_attrs : tuple[str,...] + Physical quantities that can enter the EOS fit + job_types : tuple[str,...] + Types of jobs included in the EOS data + min_data_points : int or None + Minimum number of data points needed to perform a fit. + eos_models : tuple[str,...] + List of names of EOSes to fit to. + """ + + name: str = "EOS energy vs volume fit" + min_data_points: int | None = 4 + eos_models: tuple[str, ...] = ( + "murnaghan", + "birch", + "birch_murnaghan", + "pourier_tarantola", + "vinet", + ) + + def eval(self) -> None: + """Fit the input data to each EOS in `self.eos_models.""" + for jobtype in self._use_job_types: + self.results[jobtype]["EOS"] = {} + for eos_name in self.eos_models: + try: + eos = EOS(eos_name=eos_name).fit( + self.results[jobtype]["volume"], self.results[jobtype]["energy"] + ) + self.results[jobtype]["EOS"][eos_name] = { + **eos.results, + "b0 GPa": float(eos.b0_GPa), + } + except EOSError as exc: + self.results[jobtype]["EOS"][eos_name] = {"exception": str(exc)} + + +class PostProcessEosPressure(EOSPostProcessor): + """ + Fit pressure vs. volume data to an EOS. + + Parameters + ---------- + eos_flow_output : dict + Volume, energy, and (optionally) stress and pressure data in dict form, + { + "relax" and "static" : { + "energy": list, + "volume": list, + "stress": list + }, + "initial_": {"E0": float, "V0": float} , + for in ("relax", "static") + } + name : str + Name of the class + eos_attrs : tuple[str,...] + Physical quantities that can enter the EOS fit + job_types : tuple[str,...] + Types of jobs included in the EOS data + min_data_points : int or None + Minimum number of data points needed to perform a fit. + + If only stresses are specified, it is assumed that the elements of "stress" + are 3 x 3 tensors, and the pressure is computed as + pressure = Trace(stress tensor)/3 + The overall sign is irrelevant for a successful fit, as the overall sign + of the pressure indicates internal/external stress. + """ + + name: str = "EOS pressure vs volume fit" + min_data_points: int | None = 3 + + @staticmethod + def _birch_murnaghan_pressure( + volume: float, b0: float, b1: float, v0: float + ) -> float: + """ + Compute pressure from Birch-Murnaghan equation of state. + + Parameters + ---------- + volume : float + A single volume or list of them to evaluate the pressure. + b0 : float + The Birch-Murnaghan (BM) bulk modulus at the equilibrium volume V = v0 + b1 : float + The derivative of the bulk modulus wrt pressure at v0 + v0 : float + The equilibrium volume + + Returns + ------- + float : the BM pressure + + BM EOS for E(V) has the form + E(V) = E0 + 9 B0 V0 / 16 * ( + (B1 - 4)*eta**6 + (14 - 3*B1)*eta**4 + (3*B1 - 16)*eta**2 + 6 - B1 + ) + eta = (V0/V)**(1/3). + This function computes p = - dE / dV via the chain rule, + p = d E / d eta * (- d eta / dV) + = eta**4/(3*V0) * d E / d eta + """ + eta = (v0 / volume) ** (1.0 / 3.0) + return ( + 3 + * b0 + * eta**5 + / 8.0 + * (3 * (b1 - 4) * eta**4 + 2 * (14.0 - 3 * b1) * eta**2 + 3 * b1 - 16.0) + ) + + def _initial_fit(self) -> dict: + """ + Generate initial polynomial fit for p(V) curve. + + p(V) / V = a + b V + c V**2 + """ + init_pars = {} + for jobtype in self._use_job_types: + if self.results[jobtype].get("stress") and ( + not self.results[jobtype].get("pressure") + ): + self.results[jobtype]["pressure"] = [ + 1.0 / 3.0 * np.trace(np.array(stress_tensor)) + for stress_tensor in self.results[jobtype]["stress"] + ] + poly_pars = np.polyfit( + self.results[jobtype]["volume"], + np.array(self.results[jobtype]["pressure"]) + / np.array(self.results[jobtype]["volume"]), + deg=2, + ) + + radicand = poly_pars[1] ** 2 - 4.0 * poly_pars[0] * poly_pars[2] + if radicand < 0.0: + v0 = self.results[jobtype]["volume"][ + np.argmin(self.results[jobtype]["energy"]) + ] + else: + min_abs_pressure = 1e20 + for i in range(2): + _v0 = (-poly_pars[1] + (-1) ** i * radicand ** (0.5)) / ( + 2.0 * poly_pars[0] + ) + pressure = _v0 * np.polyval(poly_pars, _v0) + if _v0 > 0.0 and abs(pressure) < min_abs_pressure: + min_abs_pressure = abs(pressure) + v0 = _v0 + + b0 = -( + 3 * poly_pars[0] * v0**3 + 2 * poly_pars[1] * v0**2 + poly_pars[0] * v0 + ) + b1 = ( + v0 + * (9 * poly_pars[0] * v0**2 + 4 * poly_pars[1] * v0 + poly_pars[0]) + / b0 + ) + + init_pars[jobtype] = [b0, b1, v0] + + return init_pars + + def _objective(self, pars: Sequence, jobtype: str) -> float: + return np.array( + self.results[jobtype]["pressure"] + ) - self._birch_murnaghan_pressure( + np.array(self.results[jobtype]["volume"]), *pars + ) + + def eval(self) -> None: + """Fit the input data to the Birch-Murnaghan pressure EOS.""" + initial_pars = self._initial_fit() + for jobtype in self._use_job_types: + eos_params, ierr = leastsq( + self._objective, initial_pars[jobtype], args=(jobtype,) + ) + + self.results[jobtype]["EOS"] = {} + if ierr not in (1, 2, 3, 4): + self.results[jobtype]["EOS"][ + "exception" + ] = "Optimal EOS parameters not found." + else: + for i, key in enumerate(["b0", "b1", "v0"]): + self.results[jobtype]["EOS"][key] = eos_params[i] + + +@job +def apply_strain_to_structure(structure: Structure, deformations: list) -> list: + """ + Apply strain(s) to input structure and return transformation(s) as list. + + Parameters + ---------- + structure: .Structure + Input structure to apply strain to + deformations: list[.Deformation] + A list of deformations to apply **independently** to the input + structure, in anticipation of performing an EOS fit. + Deformations should be of the form of a 3x3 matrix, e.g., + [[1.2, 0., 0.], [0., 1.2, 0.], [0., 0., 1.2]] + or + ((1.2, 0., 0.), (0., 1.2, 0.), (0., 0., 1.2)) + + Returns + ------- + list + A list of .TransformedStructure objects corresponding to the + list of input deformations. + """ + transformations = [] + for deformation in deformations: + # deform the structure + ts = TransformedStructure( + structure, + transformations=[DeformStructureTransformation(deformation=deformation)], + ) + transformations += [ts] + return transformations diff --git a/src/atomate2/common/jobs/phonons.py b/src/atomate2/common/jobs/phonons.py index d03f89273f..8ea01811f4 100644 --- a/src/atomate2/common/jobs/phonons.py +++ b/src/atomate2/common/jobs/phonons.py @@ -4,12 +4,12 @@ import contextlib import logging -from dataclasses import dataclass, field +import warnings from typing import TYPE_CHECKING +import numpy as np from jobflow import Flow, Response, job from phonopy import Phonopy -from phonopy.units import VaspToTHz from pymatgen.core import Structure from pymatgen.io.phonopy import get_phonopy_structure, get_pmg_structure from pymatgen.phonon.bandstructure import PhononBandStructureSymmLine @@ -18,18 +18,17 @@ CubicSupercellTransformation, ) -from atomate2.common.schemas.phonons import ForceConstants, PhononBSDOSDoc -from atomate2.vasp.jobs.base import BaseVaspMaker -from atomate2.vasp.sets.core import StaticSetGenerator +from atomate2.common.schemas.phonons import ForceConstants, PhononBSDOSDoc, get_factor if TYPE_CHECKING: from pathlib import Path - import numpy as np from emmet.core.math import Matrix3D + from atomate2.aims.jobs.base import BaseAimsMaker from atomate2.forcefields.jobs import ForceFieldStaticMaker - from atomate2.vasp.sets.base import VaspInputGenerator + from atomate2.vasp.jobs.base import BaseVaspMaker + logger = logging.getLogger(__name__) @@ -39,7 +38,7 @@ def get_total_energy_per_cell( total_dft_energy_per_formula_unit: float, structure: Structure ) -> float: """ - Job that computes total dft energy of the cell. + Job that computes total DFT energy of the cell. Parameters ---------- @@ -87,7 +86,6 @@ def get_supercell_size( force_90_degrees=False, ) transformation.apply_transformation(structure=structure) - else: max_atoms = kwargs.get("max_atoms", 1000) kwargs.setdefault("angle_tolerance", 1e-2) @@ -150,19 +148,34 @@ def generate_phonon_displacements( code: code to perform the computations """ - cell = get_phonopy_structure(structure) - if code == "vasp": - factor = VaspToTHz + warnings.warn( + "Initial magnetic moments will not be considered for the determination " + "of the symmetry of the structure and thus will be removed now.", + stacklevel=1, + ) + cell = get_phonopy_structure( + structure.remove_site_property(property_name="magmom") + if "magmom" in structure.site_properties + else structure + ) + factor = get_factor(code) + # a bit of code repetition here as I currently # do not see how to pass the phonopy object? if use_symmetrized_structure == "primitive" and kpath_scheme != "seekpath": - primitive_matrix: list[list[float]] | str = [ - [1.0, 0.0, 0.0], - [0.0, 1.0, 0.0], - [0.0, 0.0, 1.0], - ] + primitive_matrix: np.ndarray | str = np.eye(3) else: primitive_matrix = "auto" + + # TARP: THIS IS BAD! Including for discussions sake + if cell.magnetic_moments is not None and primitive_matrix == "auto": + if np.any(cell.magnetic_moments != 0.0): + raise ValueError( + "For materials with magnetic moments specified " + "use_symmetrized_structure must be 'primitive'" + ) + cell.magnetic_moments = None + phonon = Phonopy( cell, supercell_matrix, @@ -221,7 +234,7 @@ def generate_frequencies_eigenvectors( displacement_data: dict outputs from displacements total_dft_energy: float - total dft energy in eV per cell + total DFT energy in eV per cell epsilon_static: Matrix3D The high-frequency dielectric constant born: Matrix3D @@ -230,7 +243,9 @@ def generate_frequencies_eigenvectors( Additional parameters that are passed to PhononBSDOSDoc.from_forces_born """ return PhononBSDOSDoc.from_forces_born( - structure=structure, + structure=structure.remove_site_property(property_name="magmom") + if "magmom" in structure.site_properties + else structure, supercell_matrix=supercell_matrix, displacement=displacement, sym_reduce=sym_reduce, @@ -248,31 +263,37 @@ def generate_frequencies_eigenvectors( @job(data=["forces", "displaced_structures"]) def run_phonon_displacements( - displacements, + displacements: list[Structure], structure: Structure, - supercell_matrix, - phonon_maker: BaseVaspMaker | ForceFieldStaticMaker = None, - prev_vasp_dir: str | Path = None, + supercell_matrix: Matrix3D, + phonon_maker: BaseVaspMaker | ForceFieldStaticMaker | BaseAimsMaker = None, + prev_dir: str | Path = None, + prev_dir_argname: str = None, + socket: bool = False, ) -> Flow: """ Run phonon displacements. - Note, this job will replace itself with N displacement calculations. + Note, this job will replace itself with N displacement calculations, + or a single socket calculation for all displacements. Parameters ---------- - displacements + displacements: Sequence + All displacements to calculate structure: Structure object Fully optimized structure used for phonon computations. supercell_matrix: Matrix3D supercell matrix for meta data - phonon_maker : .BaseVaspMaker - A VaspMaker to use to generate the elastic relaxation jobs. - prev_vasp_dir : str or Path or None - A previous vasp calculation directory to use for copying outputs. + phonon_maker : .BaseVaspMaker or .ForceFieldStaticMaker or .BaseAimsMaker + A maker to use to generate dispacement calculations + prev_dir: str or Path + The previous working directory + prev_dir_argname: str + argument name for the prev_dir variable + socket: bool + If True use the socket-io interface to increase performance """ - if phonon_maker is None: - phonon_maker = PhononDisplacementMaker() phonon_jobs = [] outputs: dict[str, list] = { "displacement_number": [], @@ -281,88 +302,51 @@ def run_phonon_displacements( "dirs": [], "structure": [] } + phonon_job_kwargs = {} + if prev_dir is not None and prev_dir_argname is not None: + phonon_job_kwargs[prev_dir_argname] = prev_dir - for i, displacement in enumerate(displacements): - if prev_vasp_dir is not None: - phonon_job = phonon_maker.make(displacement, prev_vasp_dir=prev_vasp_dir) - else: - phonon_job = phonon_maker.make(displacement) - phonon_job.append_name(f" {i + 1}/{len(displacements)}") - - # we will add some meta data + if socket: + phonon_job = phonon_maker.make(displacements, **phonon_job_kwargs) info = { - "displacement_number": i, "original_structure": structure, "supercell_matrix": supercell_matrix, - "displaced_structure": displacement, + "displaced_structures": displacements, } - with contextlib.suppress(Exception): - phonon_job.update_maker_kwargs( - {"_set": {"write_additional_data->phonon_info:json": info}}, - dict_mod=True, - ) - + phonon_job.update_maker_kwargs( + {"_set": {"write_additional_data->phonon_info:json": info}}, dict_mod=True + ) phonon_jobs.append(phonon_job) - outputs["displacement_number"].append(i) - outputs["uuids"].append(phonon_job.output.uuid) - outputs["dirs"].append(phonon_job.output.dir_name) - outputs["forces"].append(phonon_job.output.output.forces) + outputs["displacement_number"] = list(range(len(displacements))) + outputs["uuids"] = [phonon_job.output.uuid] * len(displacements) + outputs["dirs"] = [phonon_job.output.dir_name] * len(displacements) + outputs["forces"] = phonon_job.output.output.all_forces outputs["structure"].append(phonon_job.output.output.structure) - # outputs["forces"].append(phonon_job.output.output.output.forces) - # outputs["structure"].append(phonon_job.output.output.output.structure) + else: + for idx, displacement in enumerate(displacements): + if prev_dir is not None: + phonon_job = phonon_maker.make(displacement, prev_dir=prev_dir) + else: + phonon_job = phonon_maker.make(displacement) + phonon_job.append_name(f" {idx + 1}/{len(displacements)}") + + # we will add some meta data + info = { + "displacement_number": idx, + "original_structure": structure, + "supercell_matrix": supercell_matrix, + "displaced_structure": displacement, + } + with contextlib.suppress(Exception): + phonon_job.update_maker_kwargs( + {"_set": {"write_additional_data->phonon_info:json": info}}, + dict_mod=True, + ) + phonon_jobs.append(phonon_job) + outputs["displacement_number"].append(idx) + outputs["uuids"].append(phonon_job.output.uuid) + outputs["dirs"].append(phonon_job.output.dir_name) + outputs["forces"].append(phonon_job.output.output.forces) displacement_flow = Flow(phonon_jobs, outputs) return Response(replace=displacement_flow) - - -@dataclass -class PhononDisplacementMaker(BaseVaspMaker): - """ - Maker to perform a static calculation as a part of the finite displacement method. - - The input set is for a static run with tighter convergence parameters. - Both the k-point mesh density and convergence parameters - are stricter than a normal relaxation. - - Parameters - ---------- - name : str - The job name. - input_set_generator : .VaspInputGenerator - A generator used to make the input set. - write_input_set_kwargs : dict - Keyword arguments that will get passed to :obj:`.write_vasp_input_set`. - copy_vasp_kwargs : dict - Keyword arguments that will get passed to :obj:`.copy_vasp_outputs`. - run_vasp_kwargs : dict - Keyword arguments that will get passed to :obj:`.run_vasp`. - task_document_kwargs : dict - Keyword arguments that will get passed to :obj:`.TaskDoc.from_directory`. - stop_children_kwargs : dict - Keyword arguments that will get passed to :obj:`.should_stop_children`. - write_additional_data : dict - Additional data to write to the current directory. Given as a dict of - {filename: data}. Note that if using FireWorks, dictionary keys cannot contain - the "." character which is typically used to denote file extensions. To avoid - this, use the ":" character, which will automatically be converted to ".". E.g. - ``{"my_file:txt": "contents of the file"}``. - """ - - name: str = "phonon static" - input_set_generator: VaspInputGenerator = field( - default_factory=lambda: StaticSetGenerator( - user_kpoints_settings={"reciprocal_density": 100}, - user_incar_settings={ - "IBRION": 2, - "ISIF": 3, - "ENCUT": 700, - "EDIFF": 1e-7, - "LAECHG": False, - "LREAL": False, - "ALGO": "Normal", - "NSW": 0, - "LCHARG": False, - }, - auto_ispin=True, - ) - ) diff --git a/src/atomate2/common/jobs/utils.py b/src/atomate2/common/jobs/utils.py index dffcec0d4e..100db6e40f 100644 --- a/src/atomate2/common/jobs/utils.py +++ b/src/atomate2/common/jobs/utils.py @@ -112,12 +112,12 @@ def retrieve_structure_from_materials_project( with MPRester() as mpr: if use_task_id: - doc = mpr.tasks.get_data_by_id(material_id_or_task_id, fields=["structure"]) + doc = mpr.tasks.search(material_id_or_task_id, fields=["structure"])[0] task_id = material_id_or_task_id else: - doc = mpr.materials.get_data_by_id( + doc = mpr.materials.search( material_id_or_task_id, fields=["structure", "origins"] - ) + )[0] origins = {prop.name: prop for prop in doc.origins} task_id = str(origins["structure"].task_id) diff --git a/src/atomate2/common/powerups.py b/src/atomate2/common/powerups.py new file mode 100644 index 0000000000..b4f8bddb2d --- /dev/null +++ b/src/atomate2/common/powerups.py @@ -0,0 +1,76 @@ +"""Utilities for modifying workflow.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from jobflow import Flow, Maker + + +def add_metadata_to_flow( + flow: Flow, additional_fields: dict, class_filter: Maker +) -> Flow: + """ + Return the flow with additional field(metadata) to the task doc. + + This allows adding metadata to the task-docs, could be useful + to query results from DB. + + Parameters + ---------- + flow: + additional_fields : dict + A dict with metadata. + class_filter: .Maker + The Maker to which additional metadata needs to be added + + Returns + ------- + Flow + Flow with added metadata to the task-doc. + """ + flow.update_maker_kwargs( + { + "_set": { + f"task_document_kwargs->additional_fields->{field}": value + for field, value in additional_fields.items() + } + }, + dict_mod=True, + class_filter=class_filter, + ) + + return flow + + +def update_custodian_handlers( + flow: Flow, custom_handlers: tuple, class_filter: Maker +) -> Flow: + """ + Return the flow with custom custodian handlers for VASP jobs. + + This allows user to selectively set error correcting handlers for VASP jobs + or completely unset error handlers. + + Parameters + ---------- + flow: + custom_handlers : tuple + A tuple with custodian handlers. + class_filter: .Maker + The Maker to which custom custodian handler needs to be added + + Returns + ------- + Flow + Flow with modified custodian handlers. + """ + code = class_filter.name.split(" ")[1] + flow.update_maker_kwargs( + {"_set": {f"run_{code}_kwargs->handlers": custom_handlers}}, + dict_mod=True, + class_filter=class_filter, + ) + + return flow diff --git a/src/atomate2/common/schemas/cclib.py b/src/atomate2/common/schemas/cclib.py index 0a473736c5..09578295a9 100644 --- a/src/atomate2/common/schemas/cclib.py +++ b/src/atomate2/common/schemas/cclib.py @@ -34,22 +34,28 @@ class TaskDocument(MoleculeMetadata, extra="allow"): # type: ignore[call-arg] For the list of supported packages, see https://cclib.github.io """ - molecule: Molecule = Field(None, description="Final output molecule from the task") - energy: float = Field(None, description="Final total energy") - dir_name: str = Field(None, description="Directory where the output is parsed") - logfile: str = Field( + molecule: Optional[Molecule] = Field( + None, description="Final output molecule from the task" + ) + energy: Optional[float] = Field(None, description="Final total energy") + dir_name: Optional[str] = Field( + None, description="Directory where the output is parsed" + ) + logfile: Optional[str] = Field( None, description="Path to the log file used in the post-processing analysis" ) - attributes: dict = Field( + attributes: Optional[dict] = Field( None, description="Computed properties and calculation outputs" ) - metadata: dict = Field( + metadata: Optional[dict] = Field( None, description="Calculation metadata, including input parameters and runtime " "statistics", ) - task_label: str = Field(None, description="A description of the task") - tags: list[str] = Field(None, description="Optional tags for this task document") + task_label: Optional[str] = Field(None, description="A description of the task") + tags: Optional[list[str]] = Field( + None, description="Optional tags for this task document" + ) last_updated: str = Field( default_factory=datetime_str, description="Timestamp for this task document was last updated", @@ -250,7 +256,7 @@ def from_logfile( @requires(cclib, "cclib_calculate requires cclib to be installed.") def cclib_calculate( - cclib_obj, + cclib_obj: Any, method: str, cube_file: Union[Path, str], proatom_dir: Union[Path, str], @@ -285,47 +291,43 @@ def cclib_calculate( ) method = method.lower() - cube_methods = ["bader", "ddec6", "hirshfeld"] + cube_methods = ("bader", "ddec6", "hirshfeld") if method in cube_methods and not cube_file: - raise FileNotFoundError( - f"A cube file must be provided for {method}. Returning None." - ) - if method in ["ddec6", "hirshfeld"] and not proatom_dir: + raise FileNotFoundError(f"A cube file must be provided for {method}.") + if method in ("ddec6", "hirshfeld") and not proatom_dir: if os.getenv("PROATOM_DIR") is None: - raise OSError("PROATOM_DIR environment variable not set. Returning None.") + raise OSError("PROATOM_DIR environment variable not set.") proatom_dir = os.path.expandvars(os.environ["PROATOM_DIR"]) - if proatom_dir and not os.path.exists(proatom_dir): - raise FileNotFoundError( - f"Protatom directory {proatom_dir} does not exist. Returning None." - ) + if proatom_dir and not os.path.isdir(proatom_dir): + raise FileNotFoundError(f"{proatom_dir=} does not exist.") if cube_file and method in cube_methods: vol = volume.read_from_cube(str(cube_file)) if method == "bader": - m = Bader(cclib_obj, vol) + _method = Bader(cclib_obj, vol) elif method == "bickelhaupt": - m = Bickelhaupt(cclib_obj) + _method = Bickelhaupt(cclib_obj) elif method == "cpsa": - m = CSPA(cclib_obj) + _method = CSPA(cclib_obj) elif method == "ddec6": - m = DDEC6(cclib_obj, vol, str(proatom_dir)) + _method = DDEC6(cclib_obj, vol, str(proatom_dir)) elif method == "density": - m = Density(cclib_obj) + _method = Density(cclib_obj) elif method == "hirshfeld": - m = Hirshfeld(cclib_obj, vol, str(proatom_dir)) + _method = Hirshfeld(cclib_obj, vol, str(proatom_dir)) elif method == "lpa": - m = LPA(cclib_obj) + _method = LPA(cclib_obj) elif method == "mbo": - m = MBO(cclib_obj) + _method = MBO(cclib_obj) elif method == "mpa": - m = MPA(cclib_obj) + _method = MPA(cclib_obj) else: - raise ValueError(f"{method} is not supported.") + raise ValueError(f"{method=} is not supported.") try: - m.calculate() + _method.calculate() except AttributeError: return None @@ -345,20 +347,20 @@ def cclib_calculate( ] calc_attributes = {} for attribute in avail_attributes: - if hasattr(m, attribute): - calc_attributes[attribute] = getattr(m, attribute) + if hasattr(_method, attribute): + calc_attributes[attribute] = getattr(_method, attribute) return calc_attributes def _get_homos_lumos( - moenergies: list[list[float]], homo_indices: list[int] + mo_energies: list[list[float]], homo_indices: list[int] ) -> tuple[list[float], Optional[list[float]], Optional[list[float]]]: """ Calculate the HOMO, LUMO, and HOMO-LUMO gap energies in eV. Parameters ---------- - moenergies + mo_energies List of MO energies. For restricted calculations, List[List[float]] is length one. For unrestricted, it is length two. homo_indices @@ -374,13 +376,15 @@ def _get_homos_lumos( The HOMO-LUMO gaps (eV), calculated as LUMO_alpha-HOMO_alpha and LUMO_beta-HOMO_beta """ - homo_energies = [moenergies[i][h] for i, h in enumerate(homo_indices)] - # Make sure that the HOMO+1 (i.e. LUMO) is in moenergies (sometimes virtual + homo_energies = [mo_energies[idx][homo] for idx, homo in enumerate(homo_indices)] + # Make sure that the HOMO+1 (i.e. LUMO) is in MO energies (sometimes virtual # orbitals aren't printed in the output) - for i, h in enumerate(homo_indices): - if len(moenergies[i]) < h + 2: + for idx, homo in enumerate(homo_indices): + if len(mo_energies[idx]) < homo + 2: return homo_energies, None, None - lumo_energies = [moenergies[i][h + 1] for i, h in enumerate(homo_indices)] + lumo_energies = [ + mo_energies[idx][homo + 1] for idx, homo in enumerate(homo_indices) + ] homo_lumo_gaps = [ lumo_energies[i] - homo_energies[i] for i in range(len(homo_energies)) ] diff --git a/src/atomate2/common/schemas/defects.py b/src/atomate2/common/schemas/defects.py index 2853172a4a..fd517591de 100644 --- a/src/atomate2/common/schemas/defects.py +++ b/src/atomate2/common/schemas/defects.py @@ -1,6 +1,8 @@ """General schemas for defect workflow outputs.""" import logging +from collections.abc import Sequence +from itertools import starmap from typing import Any, Callable, Optional, Union import numpy as np @@ -22,43 +24,52 @@ class FormationEnergyDiagramDocument(BaseModel): will not necessarily have all the entries in the phase diagram computed. """ - bulk_entry: ComputedStructureEntry = Field( - None, description="The ComputedEntry representing the bulk structure." + bulk_entry: Optional[ComputedStructureEntry] = Field( + None, + description="The ComputedEntry representing the bulk structure.", ) - defect_entries: list[DefectEntry] = Field( - None, description="The defect entries for the formation energy diagram." + defect_entries: Optional[list[DefectEntry]] = Field( + None, + description="The defect entries for the formation energy diagram.", ) - pd_entries: list[ComputedEntry] = Field( - None, description="The entries used to construct the phase diagram." + pd_entries: Optional[list[ComputedEntry]] = Field( + None, + description="The entries used to construct the phase diagram.", ) - vbm: float = Field( - None, description="The VBM of the pristine supercell calculation." + vbm: Optional[float] = Field( + None, + description="The VBM of the pristine supercell calculation.", ) - band_gap: float = Field( - None, description="The band gap of the pristine supercell calculation." + band_gap: Optional[float] = Field( + None, + description="The band gap of the pristine supercell calculation.", ) - inc_inf_values: bool = Field( - None, description="Whether or not to include infinite values in the diagram." + inc_inf_values: Optional[bool] = Field( + None, + description="Whether or not to include infinite values in the diagram.", ) - defect: Defect = Field( - None, description="The defect for which the diagram is being calculated." + defect: Optional[Defect] = Field( + None, + description="The defect for which the diagram is being calculated.", ) - bulk_sc_dir: str = Field( - None, description="The directory name of the pristine supercell calculation." + bulk_sc_dir: Optional[str] = Field( + None, + description="The directory name of the pristine supercell calculation.", ) - defect_sc_dirs: dict[int, str] = Field( - None, description="The directory names of the charged defect calculations." + defect_sc_dirs: Optional[dict[int, str]] = Field( + None, + description="The directory names of the charged defect calculations.", ) - dielectric: Union[float, list[list[float]]] = Field( + dielectric: Optional[Union[float, list[list[float]]]] = Field( None, description="The dielectric constant or tensor, can be used to compute " "finite-size corrections.", @@ -66,7 +77,9 @@ class FormationEnergyDiagramDocument(BaseModel): @classmethod def from_formation_energy_diagram( - cls, fed: FormationEnergyDiagram, **kwargs + cls, + fed: FormationEnergyDiagram, + **kwargs, ) -> "FormationEnergyDiagramDocument": """Create a document from a `FormationEnergyDiagram` object. @@ -87,7 +100,8 @@ def from_formation_energy_diagram( ) def as_formation_energy_diagram( - self, pd_entries: Optional[list[ComputedEntry]] = None + self, + pd_entries: Optional[list[ComputedEntry]] = None, ) -> FormationEnergyDiagram: """Create a `FormationEnergyDiagram` object from the document. @@ -113,38 +127,41 @@ def as_formation_energy_diagram( class CCDDocument(BaseModel): """Configuration-coordinate definition of configuration-coordinate diagram.""" - q1: int = Field(None, description="Charge state 1.") - q2: int = Field(None, description="Charge state 2.") - structure1: Structure = Field( - None, description="The structure of defect (supercell) in charge state (q2)." + q1: Optional[int] = Field(None, description="Charge state 1.") + q2: Optional[int] = Field(None, description="Charge state 2.") + structure1: Optional[Structure] = Field( + None, + description="The structure of defect (supercell) in charge state (q2).", ) - structure2: Structure = Field( - None, description="The structure of defect (supercell) in charge state (q2)." + structure2: Optional[Structure] = Field( + None, + description="The structure of defect (supercell) in charge state (q2).", ) - distortions1: list[float] = Field( + distortions1: Optional[list[float]] = Field( None, description="The distortions of the defect (supercell) in charge state (q1).", ) - distortions2: list[float] = Field( + distortions2: Optional[list[float]] = Field( None, description="The distortions of the defect (supercell) in charge state (q2).", ) - - energies1: list[float] = Field( - None, description="The energies of the defect (supercell) in charge state (q1)." + energies1: Optional[list[float]] = Field( + None, + description="The energies of the defect (supercell) in charge state (q1).", ) - energies2: list[float] = Field( - None, description="The energies of the defect (supercell) in charge state (q2)." + energies2: Optional[list[float]] = Field( + None, + description="The energies of the defect (supercell) in charge state (q2).", ) - static_dirs1: list[str] = Field( + static_dirs1: Optional[list[str]] = Field( None, description="Directories of distorted calculations for the defect (supercell) " "in charge state (q1).", ) - static_dirs2: list[str] = Field( + static_dirs2: Optional[list[str]] = Field( None, description="Directories of distorted calculations for the defect (supercell) " "in charge state (q2).", @@ -162,13 +179,13 @@ class CCDDocument(BaseModel): "charge state (q2).", ) - relaxed_index1: int = Field( + relaxed_index1: Optional[int] = Field( None, description="The index of the static calculation in that corresponds to the " "relaxed charge state (q1).", ) - relaxed_index2: int = Field( + relaxed_index2: Optional[int] = Field( None, description="The index of the static calculation in that corresponds to the " "relaxed charge state (q2).", @@ -221,8 +238,11 @@ def from_task_outputs( UUID of relaxed calculation in charge state (q2). """ - def get_ent( - struct: Structure, energy: float, dir_name, uuid + def get_cs_entry( + struct: Structure, + energy: float, + dir_name: str, + uuid: str, ) -> ComputedStructureEntry: return ComputedStructureEntry( structure=struct, @@ -230,14 +250,16 @@ def get_ent( data={"dir_name": dir_name, "uuid": uuid}, ) - entries1 = [ - get_ent(s, e, d, u) - for s, e, d, u in zip(structures1, energies1, static_dirs1, static_uuids1) - ] - entries2 = [ - get_ent(s, e, d, u) - for s, e, d, u in zip(structures2, energies2, static_dirs2, static_uuids2) - ] + entries1 = list( + starmap( + get_cs_entry, zip(structures1, energies1, static_dirs1, static_uuids1) + ) + ) + entries2 = list( + starmap( + get_cs_entry, zip(structures2, energies2, static_dirs2, static_uuids2) + ) + ) return cls.from_entries(entries1, entries2, relaxed_uuid1, relaxed_uuid2) @@ -265,14 +287,16 @@ def from_entries( """ - def find_entry(entries, uuid) -> tuple[int, ComputedStructureEntry]: + def find_entry( + entries: Sequence[ComputedStructureEntry], uuid: str + ) -> tuple[int, ComputedStructureEntry]: """Find the entry with the given UUID.""" - for itr, entry in enumerate(entries): + for idx, entry in enumerate(entries): if entry.data["uuid"] == uuid: - return itr, entry + return idx, entry raise ValueError(f"Could not find entry with UUID: {uuid}") - def dQ_entries(e1, e2) -> float: + def dQ_entries(e1: ComputedStructureEntry, e2: ComputedStructureEntry) -> float: # noqa: N802 """Get the displacement between two entries.""" return get_dQ(e1.structure, e2.structure) @@ -287,10 +311,16 @@ def dQ_entries(e1, e2) -> float: idx2, ent_r2 = find_entry(entries2, relaxed_uuid2) s_entries1, distortions1 = sort_pos_dist( - entries1, ent_r1, ent_r2, dist=dQ_entries + entries1, + ent_r1, + ent_r2, + dist=dQ_entries, ) s_entries2, distortions2 = sort_pos_dist( - entries2, ent_r1, ent_r2, dist=dQ_entries + entries2, + ent_r1, + ent_r2, + dist=dQ_entries, ) energies1 = [entry.energy for entry in s_entries1] @@ -314,26 +344,29 @@ def dQ_entries(e1, e2) -> float: relaxed_index2=idx2, ) - def get_taskdocs(self) -> list[list[TaskDoc]]: + def get_taskdocs(self) -> tuple[list[TaskDoc], list[TaskDoc]]: """Get the distorted task documents.""" - def remove_host_name(dir_name) -> str: + def remove_host_name(dir_name: str) -> str: return dir_name.split(":")[-1] - return [ - [ - TaskDoc.from_directory(remove_host_name(dir_name)) - for dir_name in self.static_dirs1 - ], - [ - TaskDoc.from_directory(remove_host_name(dir_name)) - for dir_name in self.static_dirs2 - ], + static1_task_docs = [ + TaskDoc.from_directory(remove_host_name(dir_name)) + for dir_name in self.static_dirs1 + ] + static2_task_docs = [ + TaskDoc.from_directory(remove_host_name(dir_name)) + for dir_name in self.static_dirs2 ] + return static1_task_docs, static2_task_docs + def sort_pos_dist( - list_in: list[Any], s1: Any, s2: Any, dist: Callable + list_in: list[Any], + s1: Any, + s2: Any, + dist: Callable, ) -> tuple[list[Any], list[float]]: """ Sort a list defined when we can only compute a positive-definite distance. @@ -364,19 +397,19 @@ def sort_pos_dist( """ d1 = [dist(s, s1) for s in list_in] d2 = [dist(s, s2) for s in list_in] - D0 = dist(s1, s2) + d0 = dist(s1, s2) d_vs_s = [] for q1, q2, s in zip(d1, d2, list_in): sign = +1 - if q1 < q2 and q2 > D0: + if q1 < q2 and q2 > d0: sign = -1 d_vs_s.append((sign * q1, s)) d_vs_s.sort() return [s for _, s in d_vs_s], [d for d, _ in d_vs_s] -def get_dQ(ref: Structure, distorted: Structure) -> float: +def get_dQ(ref: Structure, distorted: Structure) -> float: # noqa: N802 """ Calculate dQ from the initial and final structures. @@ -397,6 +430,6 @@ def get_dQ(ref: Structure, distorted: Structure) -> float: [ x[0].distance(x[1]) ** 2 * x[0].specie.atomic_mass for x in zip(ref, distorted) - ] - ) + ], + ), ) diff --git a/src/atomate2/common/schemas/elastic.py b/src/atomate2/common/schemas/elastic.py index a596e1ae6d..1a276cf74b 100644 --- a/src/atomate2/common/schemas/elastic.py +++ b/src/atomate2/common/schemas/elastic.py @@ -23,51 +23,61 @@ class DerivedProperties(BaseModel): """Properties derived from an elastic tensor.""" - k_voigt: float = Field(None, description="Voigt average of the bulk modulus.") - k_reuss: float = Field(None, description="Reuss average of the bulk modulus.") - k_vrh: float = Field( + k_voigt: Optional[float] = Field( + None, description="Voigt average of the bulk modulus." + ) + k_reuss: Optional[float] = Field( + None, description="Reuss average of the bulk modulus." + ) + k_vrh: Optional[float] = Field( None, description="Voigt-Reuss-Hill average of the bulk modulus." ) - g_voigt: float = Field(None, description="Voigt average of the shear modulus.") - g_reuss: float = Field(None, description="Reuss average of the shear modulus.") - g_vrh: float = Field( + g_voigt: Optional[float] = Field( + None, description="Voigt average of the shear modulus." + ) + g_reuss: Optional[float] = Field( + None, description="Reuss average of the shear modulus." + ) + g_vrh: Optional[float] = Field( None, description="Voigt-Reuss-Hill average of the shear modulus." ) - universal_anisotropy: float = Field( + universal_anisotropy: Optional[float] = Field( None, description="Universal elastic anisotropy." ) - homogeneous_poisson: float = Field(None, description="Homogeneous poisson ratio.") - y_mod: float = Field( + homogeneous_poisson: Optional[float] = Field( + None, description="Homogeneous poisson ratio." + ) + y_mod: Optional[float] = Field( None, description="Young's modulus (SI units) from the Voight-Reuss-Hill averages of " "the bulk and shear moduli.", ) - trans_v: float = Field( + trans_v: Optional[float] = Field( None, description="Transverse sound velocity (SI units) obtained from the " "Voigt-Reuss-Hill average bulk modulus.", ) - long_v: float = Field( + long_v: Optional[float] = Field( None, description="Longitudinal sound velocity (SI units) obtained from the " "Voigt-Reuss-Hill average bulk modulus.", ) - snyder_ac: float = Field( + snyder_ac: Optional[float] = Field( None, description="Synder's acoustic sound velocity (SI units)." ) - snyder_opt: float = Field( + snyder_opt: Optional[float] = Field( None, description="Synder's optical sound velocity (SI units)." ) - snyder_total: float = Field( + snyder_total: Optional[float] = Field( None, description="Synder's total sound velocity (SI units)." ) clark_thermalcond: Optional[float] = Field( None, description="Clarke's thermal conductivity (SI units)." ) - cahill_thermalcond: float = Field( + cahill_thermalcond: Optional[float] = Field( None, description="Cahill's thermal conductivity (SI units)." ) - debye_temperature: float = Field( + debye_temperature: Optional[float] = Field( None, description="Debye temperature from longitudinal and transverse sound " "velocities (SI units).", @@ -77,20 +87,22 @@ class DerivedProperties(BaseModel): class FittingData(BaseModel): """Data used to fit elastic tensors.""" - cauchy_stresses: list[Matrix3D] = Field( + cauchy_stresses: Optional[list[Matrix3D]] = Field( None, description="The Cauchy stresses used to fit the elastic tensor." ) - strains: list[Matrix3D] = Field( + strains: Optional[list[Matrix3D]] = Field( None, description="The strains used to fit the elastic tensor." ) - pk_stresses: list[Matrix3D] = Field( + pk_stresses: Optional[list[Matrix3D]] = Field( None, description="The Piola-Kirchoff stresses used to fit the elastic tensor." ) - deformations: list[Matrix3D] = Field( + deformations: Optional[list[Matrix3D]] = Field( None, description="The deformations corresponding to each strain state." ) - uuids: list[str] = Field(None, description="The uuids of the deformation jobs.") - job_dirs: list[Optional[str]] = Field( + uuids: Optional[list[str]] = Field( + None, description="The uuids of the deformation jobs." + ) + job_dirs: Optional[list[Optional[str]]] = Field( None, description="The directories where the deformation jobs were run." ) @@ -98,32 +110,34 @@ class FittingData(BaseModel): class ElasticTensorDocument(BaseModel): """Raw and standardized elastic tensors.""" - raw: MatrixVoigt = Field(None, description="Raw elastic tensor.") - ieee_format: MatrixVoigt = Field(None, description="Elastic tensor in IEEE format.") + raw: Optional[MatrixVoigt] = Field(None, description="Raw elastic tensor.") + ieee_format: Optional[MatrixVoigt] = Field( + None, description="Elastic tensor in IEEE format." + ) class ElasticDocument(StructureMetadata): """Document containing elastic tensor information and related properties.""" - structure: Structure = Field( + structure: Optional[Structure] = Field( None, description="The structure for which the elastic data is calculated." ) - elastic_tensor: ElasticTensorDocument = Field( + elastic_tensor: Optional[ElasticTensorDocument] = Field( None, description="Fitted elastic tensor." ) eq_stress: Optional[Matrix3D] = Field( None, description="The equilibrium stress of the structure." ) - derived_properties: DerivedProperties = Field( + derived_properties: Optional[DerivedProperties] = Field( None, description="Properties derived from the elastic tensor." ) - fitting_data: FittingData = Field( + fitting_data: Optional[FittingData] = Field( None, description="Data used to fit the elastic tensor." ) - fitting_method: str = Field( + fitting_method: Optional[str] = Field( None, description="Method used to fit the elastic tensor." ) - order: int = Field( + order: Optional[int] = Field( None, description="Order of the expansion of the elastic tensor." ) @@ -265,7 +279,7 @@ def _expand_strains( `generate_elastic_deformations()`. """ sga = SpacegroupAnalyzer(structure, symprec=symprec) - symmops = sga.get_symmetry_operations(cartesian=True) + symm_ops = sga.get_symmetry_operations(cartesian=True) full_strains = deepcopy(strains) full_stresses = deepcopy(stresses) @@ -273,9 +287,9 @@ def _expand_strains( full_job_dirs = deepcopy(job_dirs) mapping = TensorMapping(full_strains, [True for _ in full_strains]) - for i, strain in enumerate(strains): - for symmop in symmops: - rotated_strain = strain.transform(symmop) + for idx, strain in enumerate(strains): + for symm_op in symm_ops: + rotated_strain = strain.transform(symm_op) # check if we have more than one perturbed strain component if sum(np.abs(rotated_strain.voigt) > tol) > 1: @@ -290,8 +304,8 @@ def _expand_strains( # expand the other properties full_strains.append(rotated_strain) - full_stresses.append(stresses[i].transform(symmop)) - full_uuids.append(uuids[i]) - full_job_dirs.append(job_dirs[i]) + full_stresses.append(stresses[idx].transform(symm_op)) + full_uuids.append(uuids[idx]) + full_job_dirs.append(job_dirs[idx]) return full_strains, full_stresses, full_uuids, full_job_dirs diff --git a/src/atomate2/common/schemas/phonons.py b/src/atomate2/common/schemas/phonons.py index 73aed8e11d..8d6ccfd757 100644 --- a/src/atomate2/common/schemas/phonons.py +++ b/src/atomate2/common/schemas/phonons.py @@ -2,6 +2,7 @@ import copy import logging +from pathlib import Path from typing import Optional, Union import numpy as np @@ -27,9 +28,37 @@ from pymatgen.symmetry.bandstructure import HighSymmKpath from pymatgen.symmetry.kpath import KPathSeek +from atomate2.aims.utils.units import omegaToTHz + logger = logging.getLogger(__name__) +def get_factor(code: str) -> float: + """ + Get the frequency conversion factor to THz for each code. + + Parameters + ---------- + code: str + The code to get the conversion factor for + + Returns + ------- + float + The correct conversion factor + + Raises + ------ + ValueError + If code is not defined + """ + if code in ["forcefields", "vasp"]: + return VaspToTHz + if code == "aims": + return omegaToTHz # Based on CODATA 2002 + raise ValueError(f"Frequency conversion factor for code ({code}) not defined.") + + class PhononComputationalSettings(BaseModel): """Collection to store computational settings for the phonon computation.""" @@ -48,15 +77,15 @@ class ThermalDisplacementData(BaseModel): "cutoff frequency in THz to avoid numerical issues in the " "computation of the thermal displacement parameters" ) - thermal_displacement_matrix_cif: list[list[Matrix3D]] = Field( + thermal_displacement_matrix_cif: Optional[list[list[Matrix3D]]] = Field( None, description="field including thermal displacement matrices in CIF format" ) - thermal_displacement_matrix: list[list[Matrix3D]] = Field( + thermal_displacement_matrix: Optional[list[list[Matrix3D]]] = Field( None, description="field including thermal displacement matrices in Cartesian " "coordinate system", ) - temperatures_thermal_displacements: list[int] = Field( + temperatures_thermal_displacements: Optional[list[int]] = Field( None, description="temperatures at which the thermal displacement matrices" "have been computed", @@ -86,10 +115,10 @@ def __init__(self, force_constants: list[list[Matrix3D]]) -> None: class PhononJobDirs(BaseModel): """Collection to save all job directories relevant for the phonon run.""" - displacements_job_dirs: list[Optional[str]] = Field( + displacements_job_dirs: Optional[list[Optional[str]]] = Field( None, description="The directories where the displacement jobs were run." ) - static_run_job_dir: Optional[str] = Field( + static_run_job_dir: Optional[Optional[str]] = Field( None, description="Directory where static run was performed." ) born_run_job_dir: Optional[str] = Field( @@ -98,50 +127,52 @@ class PhononJobDirs(BaseModel): optimization_run_job_dir: Optional[str] = Field( None, description="Directory where optimization run was performed." ) + taskdoc_run_job_dir: Optional[str] = Field( + None, description="Directory where taskdoc was generated." + ) -class PhononBSDOSDoc(StructureMetadata): +class PhononBSDOSDoc(StructureMetadata, extra="allow"): # type: ignore[call-arg] """Collection of all data produced by the phonon workflow.""" - structure: Structure = Field( - None, - description="Structure of Materials Project.", + structure: Optional[Structure] = Field( + None, description="Structure of Materials Project." ) - phonon_bandstructure: PhononBandStructureSymmLine = Field( + phonon_bandstructure: Optional[PhononBandStructureSymmLine] = Field( None, description="Phonon band structure object.", ) - phonon_dos: PhononDos = Field( + phonon_dos: Optional[PhononDos] = Field( None, description="Phonon density of states object.", ) - free_energies: list[float] = Field( + free_energies: Optional[list[float]] = Field( None, description="vibrational part of the free energies in J/mol per " "formula unit for temperatures in temperature_list", ) - heat_capacities: list[float] = Field( + heat_capacities: Optional[list[float]] = Field( None, description="heat capacities in J/K/mol per " "formula unit for temperatures in temperature_list", ) - internal_energies: list[float] = Field( + internal_energies: Optional[list[float]] = Field( None, description="internal energies in J/mol per " "formula unit for temperatures in temperature_list", ) - entropies: list[float] = Field( + entropies: Optional[list[float]] = Field( None, description="entropies in J/(K*mol) per formula unit" "for temperatures in temperature_list ", ) - temperatures: list[int] = Field( + temperatures: Optional[list[int]] = Field( None, description="temperatures at which the vibrational" " part of the free energies" @@ -150,7 +181,7 @@ class PhononBSDOSDoc(StructureMetadata): total_dft_energy: Optional[float] = Field("total DFT energy per formula unit in eV") - has_imaginary_modes: bool = Field( + has_imaginary_modes: Optional[bool] = Field( None, description="if true, structure has imaginary modes" ) @@ -228,7 +259,7 @@ def from_forces_born( code: str which code was used for computation displacement_data: - output of the VASP displacement runs + output of the displacement data total_dft_energy: float total energy in eV per cell epsilon_static: Matrix3D @@ -238,21 +269,26 @@ def from_forces_born( **kwargs: additional arguments """ - if code == "vasp": - factor = VaspToTHz + factor = get_factor(code) # This opens the opportunity to add support for other codes # that are supported by phonopy cell = get_phonopy_structure(structure) - if use_symmetrized_structure == "primitive" and kpath_scheme != "seekpath": - primitive_matrix: Union[list[list[float]], str] = [ - [1.0, 0.0, 0.0], - [0.0, 1.0, 0.0], - [0.0, 0.0, 1.0], - ] + if use_symmetrized_structure == "primitive": + primitive_matrix: Union[np.ndarray, str] = np.eye(3) else: primitive_matrix = "auto" + + # TARP: THIS IS BAD! Including for discussions sake + if cell.magnetic_moments is not None and primitive_matrix == "auto": + if np.any(cell.magnetic_moments != 0.0): + raise ValueError( + "For materials with magnetic moments specified " + "use_symmetrized_structure must be 'primitive'" + ) + cell.magnetic_moments = None + phonon = Phonopy( cell, supercell_matrix, @@ -263,6 +299,7 @@ def from_forces_born( ) phonon.generate_displacements(distance=displacement) set_of_forces = [np.array(forces) for forces in displacement_data["forces"]] + if born is not None and epsilon_static is not None: if len(structure) == len(born): borns, epsilon = symmetrize_borns_and_epsilon( @@ -296,7 +333,7 @@ def from_forces_born( phonon.save("phonopy.yaml") # get phonon band structure - kpath_dict, kpath_concrete = cls.get_kpath( + kpath_dict, kpath_concrete = PhononBSDOSDoc.get_kpath( structure=get_pmg_structure(phonon.primitive), kpath_scheme=kpath_scheme, symprec=symprec, @@ -307,7 +344,7 @@ def from_forces_born( kpath_concrete, npoints=kwargs.get("npoints_band", 101) ) - # phonon band structures will always be cmouted + # phonon band structures will always be computed filename_band_yaml = "phonon_band_structure.yaml" # TODO: potentially add kwargs to avoid computation of eigenvectors @@ -324,9 +361,7 @@ def from_forces_born( new_plotter = PhononBSPlotter(bs=bs_symm_line) new_plotter.save_plot( - "phonon_band_structure.eps", - img_format=kwargs.get("img_format", "eps"), - units=kwargs.get("units", "THz"), + "phonon_band_structure.eps", units=kwargs.get("units", "THz") ) # will determine if imaginary modes are present in the structure @@ -335,13 +370,13 @@ def from_forces_born( ) # gets data for visualization on website - yaml is also enough - if kwargs.get("band_structure_eigenvectors", False): + if kwargs.get("band_structure_eigenvectors"): bs_symm_line.write_phononwebsite("phonon_website.json") # get phonon density of states filename_dos_yaml = "phonon_dos.yaml" - kpoint_density_dos = kwargs.get("kpoint_density_dos", 7000) + kpoint_density_dos = kwargs.get("kpoint_density_dos", 7_000) kpoint = Kpoints.automatic_density( structure=get_pmg_structure(phonon.primitive), kppa=kpoint_density_dos, @@ -354,9 +389,7 @@ def from_forces_born( new_plotter_dos = PhononDosPlotter() new_plotter_dos.add_dos(label="total", dos=dos) new_plotter_dos.save_plot( - filename="phonon_dos.eps", - img_format=kwargs.get("img_format", "eps"), - units=kwargs.get("units", "THz"), + filename="phonon_dos.eps", units=kwargs.get("units", "THz") ) # compute vibrational part of free energies per formula unit @@ -366,32 +399,32 @@ def from_forces_born( free_energies = [ dos.helmholtz_free_energy( - structure=get_pmg_structure(phonon.primitive), t=temperature + temp=temp, structure=get_pmg_structure(phonon.primitive) ) - for temperature in temperature_range + for temp in temperature_range ] entropies = [ - dos.entropy(structure=get_pmg_structure(phonon.primitive), t=temperature) - for temperature in temperature_range + dos.entropy(temp=temp, structure=get_pmg_structure(phonon.primitive)) + for temp in temperature_range ] internal_energies = [ dos.internal_energy( - structure=get_pmg_structure(phonon.primitive), t=temperature + temp=temp, structure=get_pmg_structure(phonon.primitive) ) - for temperature in temperature_range + for temp in temperature_range ] heat_capacities = [ - dos.cv(structure=get_pmg_structure(phonon.primitive), t=temperature) - for temperature in temperature_range + dos.cv(temp=temp, structure=get_pmg_structure(phonon.primitive)) + for temp in temperature_range ] # will compute thermal displacement matrices # for the primitive cell (phonon.primitive!) # only this is available in phonopy - if kwargs.get("create_thermal_displacements", False): + if kwargs.get("create_thermal_displacements"): phonon.run_mesh( kpoint.kpts[0], with_eigenvectors=True, is_mesh_symmetry=False ) @@ -410,19 +443,14 @@ def from_forces_born( kwargs.get("tmax_thermal_displacements", 500), kwargs.get("tstep_thermal_displacements", 100), ) - for i, temp in enumerate(temperature_range_thermal_displacements): + for idx, temp in enumerate(temperature_range_thermal_displacements): phonon.thermal_displacement_matrices.write_cif( - phonon.primitive, - i, - filename="tdispmat_" + str(temp) + "K.cif", + phonon.primitive, idx, filename=f"tdispmat_{temp}K.cif" ) - tdisp_mat = ( - phonon._thermal_displacement_matrices.thermal_displacement_matrices.tolist() - ) + _disp_mat = phonon._thermal_displacement_matrices + tdisp_mat = _disp_mat.thermal_displacement_matrices.tolist() - tdisp_mat_cif = ( - phonon._thermal_displacement_matrices.thermal_displacement_matrices_cif.tolist() - ) + tdisp_mat_cif = _disp_mat.thermal_displacement_matrices_cif.tolist() else: tdisp_mat = None @@ -456,20 +484,21 @@ def from_forces_born( epsilon_static=epsilon.tolist() if epsilon is not None else None, supercell_matrix=phonon.supercell_matrix.tolist(), primitive_matrix=phonon.primitive_matrix.tolist(), - code="vasp", + code=code, thermal_displacement_data={ "temperatures_thermal_displacements": temperature_range_thermal_displacements.tolist(), # noqa: E501 "thermal_displacement_matrix_cif": tdisp_mat_cif, "thermal_displacement_matrix": tdisp_mat, "freq_min_thermal_displacements": freq_min_thermal_displacements, } - if kwargs.get("create_thermal_displacements", False) + if kwargs.get("create_thermal_displacements") else None, jobdirs={ "displacements_job_dirs": displacement_data["dirs"], "static_run_job_dir": kwargs["static_run_job_dir"], "born_run_job_dir": kwargs["born_run_job_dir"], "optimization_run_job_dir": kwargs["optimization_run_job_dir"], + "taskdoc_run_job_dir": str(Path.cwd()), }, uuids={ "displacements_uuids": displacement_data["uuids"], @@ -501,22 +530,18 @@ def get_kpath( **kpath_kwargs: additional parameters that can be passed to this method as a dict """ - if kpath_scheme in [ - "setyawan_curtarolo", - "latimer_munro", - "hinuma", - ]: - highsymmkpath = HighSymmKpath( + if kpath_scheme in ("setyawan_curtarolo", "latimer_munro", "hinuma"): + high_symm_kpath = HighSymmKpath( structure, path_type=kpath_scheme, symprec=symprec, **kpath_kwargs ) - kpath = highsymmkpath.kpath + kpath = high_symm_kpath.kpath elif kpath_scheme == "seekpath": - highsymmkpath = KPathSeek(structure, symprec=symprec, **kpath_kwargs) - kpath = highsymmkpath._kpath + high_symm_kpath = KPathSeek(structure, symprec=symprec, **kpath_kwargs) + kpath = high_symm_kpath._kpath path = copy.deepcopy(kpath["path"]) - for ilabelset, labelset in enumerate(kpath["path"]): - for ilabel, label in enumerate(labelset): - path[ilabelset][ilabel] = kpath["kpoints"][label] + for set_idx, label_set in enumerate(kpath["path"]): + for lbl_idx, label in enumerate(label_set): + path[set_idx][lbl_idx] = kpath["kpoints"][label] return kpath["kpoints"], path diff --git a/src/atomate2/common/utils.py b/src/atomate2/common/utils.py index 5fd1c29167..4829e0b98c 100644 --- a/src/atomate2/common/utils.py +++ b/src/atomate2/common/utils.py @@ -112,11 +112,11 @@ def parse_transformations( def parse_additional_json(dir_name: Path) -> dict[str, Any]: - """Parse additional json files in the directory.""" + """Parse additional JSON files in the directory.""" additional_json = {} for filename in dir_name.glob("*.json*"): key = filename.name.split(".")[0] - # ignore FW.json(.gz) so jobflow doesn't try to parse prev_vasp_dir + # ignore FW.json(.gz) so jobflow doesn't try to parse prev_dir # OutputReferences was causing atomate2 MP workflows to fail with ValueError: # Could not resolve reference 7f5a7f14-464c-4a5b-85f9-8d11b595be3b not in store # or cache contact @janosh in case of questions diff --git a/src/atomate2/cp2k/drones.py b/src/atomate2/cp2k/drones.py index c17f350a43..abb192988e 100644 --- a/src/atomate2/cp2k/drones.py +++ b/src/atomate2/cp2k/drones.py @@ -48,7 +48,9 @@ def assimilate(self, path: str | Path | None = None) -> TaskDocument: except Exception: import traceback - logger.error(f"Error in {Path(path).absolute()}\n{traceback.format_exc()}") + logger.exception( + f"Error in {Path(path).absolute()}\n{traceback.format_exc()}" + ) raise return doc diff --git a/src/atomate2/cp2k/files.py b/src/atomate2/cp2k/files.py index 6091219fa2..0076205e91 100644 --- a/src/atomate2/cp2k/files.py +++ b/src/atomate2/cp2k/files.py @@ -149,7 +149,7 @@ def get_largest_relax_extension( return "" numbers = [re.search(r".relax(\d+)", file.name).group(1) for file in relax_files] - max_relax = max(numbers, key=lambda x: int(x)) + max_relax = max(numbers, key=int) return f".relax{max_relax}" diff --git a/src/atomate2/cp2k/flows/core.py b/src/atomate2/cp2k/flows/core.py index 209545ed47..eba1d0bd87 100644 --- a/src/atomate2/cp2k/flows/core.py +++ b/src/atomate2/cp2k/flows/core.py @@ -46,9 +46,7 @@ class DoubleRelaxMaker(Maker): relax_maker1: Maker = field(default_factory=RelaxMaker) relax_maker2: Maker = field(default_factory=RelaxMaker) - def make( - self, structure: Structure, prev_cp2k_dir: str | Path | None = None - ) -> Flow: + def make(self, structure: Structure, prev_dir: str | Path | None = None) -> Flow: """ Create a flow with two chained relaxations. @@ -56,7 +54,7 @@ def make( ---------- structure : .Structure A pymatgen structure object. - prev_cp2k_dir : str or Path or None + prev_dir : str or Path or None A previous Cp2k calculation directory to copy output files from. Returns @@ -64,11 +62,11 @@ def make( Flow A flow containing two relaxations. """ - relax1 = self.relax_maker1.make(structure, prev_cp2k_dir=prev_cp2k_dir) + relax1 = self.relax_maker1.make(structure, prev_dir=prev_dir) relax1.name += " 1" relax2 = self.relax_maker2.make( - relax1.output.structure, prev_cp2k_dir=relax1.output.dir_name + relax1.output.structure, prev_dir=relax1.output.dir_name ) relax2.name += " 2" @@ -114,9 +112,7 @@ class BandStructureMaker(Maker): static_maker: Maker = field(default_factory=StaticMaker) bs_maker: Maker = field(default_factory=NonSCFMaker) - def make( - self, structure: Structure, prev_cp2k_dir: str | Path | None = None - ) -> Flow: + def make(self, structure: Structure, prev_dir: str | Path | None = None) -> Flow: """ Create a band structure flow. @@ -124,7 +120,7 @@ def make( ---------- structure : Structure A pymatgen structure object. - prev_cp2k_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. Returns @@ -132,7 +128,7 @@ def make( Flow A band structure flow. """ - static_job = self.static_maker.make(structure, prev_cp2k_dir=prev_cp2k_dir) + static_job = self.static_maker.make(structure, prev_dir=prev_dir) jobs = [static_job] outputs = {} @@ -140,7 +136,7 @@ def make( if bandstructure_type in ("both", "uniform"): uniform_job = self.bs_maker.make( static_job.output.structure, - prev_cp2k_dir=static_job.output.dir_name, + prev_dir=static_job.output.dir_name, mode="uniform", ) uniform_job.name += " uniform" @@ -154,7 +150,7 @@ def make( if bandstructure_type in ("both", "line"): line_job = self.bs_maker.make( static_job.output.structure, - prev_cp2k_dir=static_job.output.dir_name, + prev_dir=static_job.output.dir_name, mode="line", ) line_job.name += " line" @@ -192,9 +188,7 @@ class RelaxBandStructureMaker(Maker): relax_maker: Maker = field(default_factory=DoubleRelaxMaker) band_structure_maker: Maker = field(default_factory=BandStructureMaker) - def make( - self, structure: Structure, prev_cp2k_dir: str | Path | None = None - ) -> Flow: + def make(self, structure: Structure, prev_dir: str | Path | None = None) -> Flow: """ Run a relaxation and then calculate the uniform and line mode band structures. @@ -202,7 +196,7 @@ def make( ---------- structure: .Structure A pymatgen structure object. - prev_cp2k_dir : str or Path or None + prev_dir : str or Path or None A previous CP2K calculation directory to copy output files from. Returns @@ -210,9 +204,9 @@ def make( Flow A relax and band structure flow. """ - relax_job = self.relax_maker.make(structure, prev_cp2k_dir=prev_cp2k_dir) + relax_job = self.relax_maker.make(structure, prev_dir=prev_dir) bs_flow = self.band_structure_maker.make( - relax_job.output.structure, prev_cp2k_dir=relax_job.output.dir_name + relax_job.output.structure, prev_dir=relax_job.output.dir_name ) return Flow([relax_job, bs_flow], bs_flow.output, name=self.name) @@ -265,9 +259,7 @@ def __post_init__(self) -> None: updates, self.hybrid_maker.input_set_generator.user_input_settings ) - def make( - self, structure: Structure, prev_cp2k_dir: str | Path | None = None - ) -> Job: + def make(self, structure: Structure, prev_dir: str | Path | None = None) -> Job: """ Make a hybrid flow. @@ -275,7 +267,7 @@ def make( ---------- structure: .Structure A pymatgen structure object. - prev_cp2k_dir : str or Path or None + prev_dir : str or Path or None A previous CP2K calculation directory to copy output files from. Returns @@ -285,13 +277,13 @@ def make( """ jobs = [] if self.initialize_with_pbe: - initialization = self.pbe_maker.make(structure, prev_cp2k_dir) + initialization = self.pbe_maker.make(structure, prev_dir) jobs.append(initialization) hyb = self.hybrid_maker.make( initialization.output.structure if self.initialize_with_pbe else structure, - prev_cp2k_dir=initialization.output.dir_name + prev_dir=initialization.output.dir_name if self.initialize_with_pbe - else prev_cp2k_dir, + else prev_dir, ) jobs.append(hyb) return Flow(jobs, output=hyb.output, name=self.name) diff --git a/src/atomate2/cp2k/jobs/base.py b/src/atomate2/cp2k/jobs/base.py index eb28e89c96..fda19e1480 100644 --- a/src/atomate2/cp2k/jobs/base.py +++ b/src/atomate2/cp2k/jobs/base.py @@ -129,7 +129,7 @@ class BaseCp2kMaker(Maker): @cp2k_job def make( - self, structure: Structure, prev_cp2k_dir: str | Path | None = None + self, structure: Structure, prev_dir: str | Path | None = None ) -> Response: """ Run a CP2K calculation. @@ -138,7 +138,7 @@ def make( ---------- structure : Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous CP2K calculation directory to copy output files from. """ # Apply transformations if they are present @@ -155,9 +155,9 @@ def make( self.write_additional_data.setdefault("transformations:json", t_json) # copy previous inputs - from_prev = prev_cp2k_dir is not None - if prev_cp2k_dir is not None: - copy_cp2k_outputs(prev_cp2k_dir, **self.copy_cp2k_kwargs) + from_prev = prev_dir is not None + if prev_dir is not None: + copy_cp2k_outputs(prev_dir, **self.copy_cp2k_kwargs) # write cp2k input files self.write_input_set_kwargs["from_prev"] = from_prev diff --git a/src/atomate2/cp2k/jobs/core.py b/src/atomate2/cp2k/jobs/core.py index 568a97d5cb..27f0f832e9 100644 --- a/src/atomate2/cp2k/jobs/core.py +++ b/src/atomate2/cp2k/jobs/core.py @@ -300,7 +300,7 @@ class NonSCFMaker(BaseCp2kMaker): def make( self, structure: Structure, - prev_cp2k_dir: str | Path | None, + prev_dir: str | Path | None, mode: str = "uniform", ) -> None: """ @@ -310,7 +310,7 @@ def make( ---------- structure : .Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous CP2K calculation directory to copy output files from. mode : str Type of band structure calculation. Options are: @@ -325,7 +325,7 @@ def make( # copy previous inputs self.copy_cp2k_kwargs.setdefault("additional_cp2k_files", ("wfn",)) - return super().make.original(self, structure, prev_cp2k_dir) + return super().make.original(self, structure, prev_dir) @dataclass @@ -376,7 +376,7 @@ class TransmuterMaker(BaseCp2kMaker): def make( self, structure: Structure, - prev_cp2k_dir: str | Path | None = None, + prev_dir: str | Path | None = None, ) -> None: """ Run a transmuter Cp2k job. @@ -385,7 +385,7 @@ def make( ---------- structure : Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous Cp2k calculation directory to copy output files from. """ transformations = get_transformations( @@ -399,7 +399,7 @@ def make( tjson = transmuter.transformed_structures[-1] self.write_additional_data.setdefault("transformations:json", tjson) - return super().make.original(self, structure, prev_cp2k_dir) + return super().make.original(self, structure, prev_dir) @dataclass diff --git a/src/atomate2/cp2k/powerups.py b/src/atomate2/cp2k/powerups.py index 35e696d781..205b30c39f 100644 --- a/src/atomate2/cp2k/powerups.py +++ b/src/atomate2/cp2k/powerups.py @@ -8,6 +8,8 @@ from jobflow import Flow, Job, Maker from pymatgen.io.vasp import Kpoints +from atomate2.common.powerups import add_metadata_to_flow as base_add_metadata_to_flow +from atomate2.common.powerups import update_custodian_handlers as base_custodian_handler from atomate2.cp2k.jobs.base import BaseCp2kMaker @@ -45,12 +47,14 @@ def update_user_input_settings( A copy of the input flow/job/maker modified to use the updated input settings. """ - # Convert nested dictionary updates for cp2k inpt settings + # Convert nested dictionary updates for cp2k input settings # into dict_mod update format - def nested_to_dictmod(d, kk="input_set_generator->user_input_settings") -> dict: + def nested_to_dictmod( + dct: dict, kk: str = "input_set_generator->user_input_settings" + ) -> dict: d2 = {} - for k, v in d.items(): - k2 = kk + f"->{k}" + for k, v in dct.items(): + k2 = f"{kk}->{k}" if isinstance(v, dict): d2.update(nested_to_dictmod(v, kk=k2)) else: @@ -138,3 +142,57 @@ def update_user_kpoints_settings( dict_mod=True, ) return updated_flow + + +def add_metadata_to_flow( + flow: Flow, additional_fields: dict, class_filter: Maker = BaseCp2kMaker +) -> Flow: + """ + Return the Cp2k flow with additional field(metadata) to the task doc. + + This allows adding metadata to the task-docs, could be useful + to query results from DB. + + Parameters + ---------- + flow: + additional_fields : dict + A dict with metadata. + class_filter: .BaseCp2kMaker + The Maker to which additional metadata needs to be added + + Returns + ------- + Flow + Flow with added metadata to the task-doc. + """ + return base_add_metadata_to_flow( + flow=flow, class_filter=class_filter, additional_fields=additional_fields + ) + + +def update_cp2k_custodian_handlers( + flow: Flow, custom_handlers: tuple, class_filter: Maker = BaseCp2kMaker +) -> Flow: + """ + Return the flow with custom custodian handlers for Cp2k jobs. + + This allows user to selectively set error correcting handlers for Cp2k jobs + or completely unset error handlers. + + Parameters + ---------- + flow: + custom_handlers : tuple + A tuple with custodian handlers. + class_filter: .BaseCp2kMaker + The Maker to which custom custodian handler needs to be added + + Returns + ------- + Flow + Flow with modified custodian handlers. + """ + return base_custodian_handler( + flow=flow, custom_handlers=custom_handlers, class_filter=class_filter + ) diff --git a/src/atomate2/cp2k/run.py b/src/atomate2/cp2k/run.py index 1693fdb34e..3e5334cce4 100644 --- a/src/atomate2/cp2k/run.py +++ b/src/atomate2/cp2k/run.py @@ -104,7 +104,7 @@ def run_cp2k( if job_type == JobType.DIRECT: logger.info(f"Running command: {cp2k_cmd}") - return_code = subprocess.call(cp2k_cmd, shell=True) + return_code = subprocess.call(cp2k_cmd, shell=True) # noqa: S602 logger.info(f"{cp2k_cmd} finished running with returncode: {return_code}") return if job_type == JobType.NORMAL: diff --git a/src/atomate2/cp2k/schemas/calc_types/_generate.py b/src/atomate2/cp2k/schemas/calc_types/_generate.py index 51a013a280..8881a144c3 100644 --- a/src/atomate2/cp2k/schemas/calc_types/_generate.py +++ b/src/atomate2/cp2k/schemas/calc_types/_generate.py @@ -1,6 +1,8 @@ """Module to define various calculation types as Enums for CP2K.""" + from itertools import product from pathlib import Path +from typing import Any from monty.serialization import loadfn @@ -18,19 +20,18 @@ _RUN_TYPES = [] for functional_class in _RUN_TYPE_DATA: for rt in _RUN_TYPE_DATA[functional_class]: - for vdw in ["", "-RVV10", "-LMKLL", "-DRSLL", "-D3", "-D2", "-D3(BJ)"]: - for u in ["", "+U"]: + for vdw in ("", "-RVV10", "-LMKLL", "-DRSLL", "-D3", "-D2", "-D3(BJ)"): + for u in ("", "+U"): _RUN_TYPES.append(f"{rt}{vdw}{u}") # noqa: PERF401 -def get_enum_source(enum_name, doc, items) -> str: +def get_enum_source(enum_name: str, doc: str, items: dict[str, Any]) -> str: header = f""" class {enum_name}(ValueEnum): \"\"\" {doc} \"\"\"\n """ - items = [f' {const} = "{val}"' for const, val in items.items()] - return header + "\n".join(items) + return header + "\n".join(f' {key} = "{val}"' for key, val in items.items()) run_type_enum = get_enum_source( @@ -52,11 +53,11 @@ class {enum_name}(ValueEnum): ) -def get_calc_type_key(rt) -> str: - """Conveniece function for readability.""" - s = "_".join(rt.split()) - s = s.replace("+", "_").replace("-", "_").replace("(", "_").replace(")", "") - return f"{s}" +def get_calc_type_key(rt: str) -> str: + """Get the calc_type key from the run_type. Convenience function for readability.""" + out = "_".join(rt.split()) + out = out.replace("+", "_").replace("-", "_").replace("(", "_").replace(")", "") + return f"{out}" calc_type_enum = get_enum_source( @@ -69,8 +70,8 @@ def get_calc_type_key(rt) -> str: ) -with open(Path(__file__).parent / "enums.py", "w") as f: - f.write( +with open(Path(__file__).parent / "enums.py", "w") as file: + file.write( """\"\"\" Autogenerated Enums for CP2K RunType, TaskType, and CalcType Do not edit this by hand. Edit generate.py or run_types.yaml instead @@ -79,9 +80,9 @@ def get_calc_type_key(rt) -> str: """ ) - f.write(run_type_enum) - f.write("\n\n") - f.write(task_type_enum) - f.write("\n\n") - f.write(calc_type_enum) - f.write("\n") + file.write(run_type_enum) + file.write("\n\n") + file.write(task_type_enum) + file.write("\n\n") + file.write(calc_type_enum) + file.write("\n") diff --git a/src/atomate2/cp2k/schemas/calc_types/utils.py b/src/atomate2/cp2k/schemas/calc_types/utils.py index a22971088c..f564131144 100644 --- a/src/atomate2/cp2k/schemas/calc_types/utils.py +++ b/src/atomate2/cp2k/schemas/calc_types/utils.py @@ -1,5 +1,6 @@ """Module to define various calculation types as Enums for CP2K.""" -from collections.abc import Iterable + +from collections.abc import Iterable, Sequence from pathlib import Path from monty.serialization import loadfn @@ -17,11 +18,11 @@ def run_type(inputs: dict) -> RunType: This is adapted from pymatgen to be far less unstable. Args: - dft: dictionary of dft parameters (standard from task doc) + dft: dictionary of DFT parameters (standard from task doc) """ dft = inputs.get("dft") - def _variant_equal(v1, v2) -> bool: + def _variant_equal(v1: Sequence, v2: Sequence) -> bool: """Determine if two run_types are equal.""" if isinstance(v1, str) and isinstance(v2, str): return v1.strip().upper() == v2.strip().upper() @@ -72,12 +73,12 @@ def task_type(inputs: dict) -> TaskType: cp2k_run_type = inputs.get("cp2k_global", {}).get("Run_type", "") ci = Cp2kInput.from_dict(inputs["cp2k_input"]) - if cp2k_run_type.upper() in [ + if cp2k_run_type.upper() in ( "ENERGY", "ENERGY_FORCE", "WAVEFUNCTION_OPTIMIZATION", "WFN_OPT", - ]: + ): if ci.check("FORCE_EVAL/DFT/SCF"): tmp = ci["force_eval"]["dft"]["scf"].get("MAX_SCF", Keyword("", 50)) if tmp.values[0] == 1: @@ -100,34 +101,34 @@ def task_type(inputs: dict) -> TaskType: else: calc_type.append("Static") - elif cp2k_run_type.upper() in ["GEO_OPT", "GEOMETRY_OPTIMIZATION", "CELL_OPT"]: + elif cp2k_run_type.upper() in ("GEO_OPT", "GEOMETRY_OPTIMIZATION", "CELL_OPT"): calc_type.append("Structure Optimization") elif cp2k_run_type.upper() == "BAND": calc_type.append("Band") - elif cp2k_run_type.upper() in ["MOLECULAR_DYNAMICS", "MD"]: + elif cp2k_run_type.upper() in ("MOLECULAR_DYNAMICS", "MD"): calc_type.append("Molecular Dynamics") - elif cp2k_run_type.upper() in ["MONTE_CARLO", "MC", "TMC", "TAMC"]: + elif cp2k_run_type.upper() in ("MONTE_CARLO", "MC", "TMC", "TAMC"): calc_type.append("Monte Carlo") - elif cp2k_run_type.upper() in ["LINEAR_RESPONSE", "LR"]: + elif cp2k_run_type.upper() in ("LINEAR_RESPONSE", "LR"): calc_type.append("Linear Response") - elif cp2k_run_type.upper() in ["VIBRATIONAL_ANALYSIS", "NORMAL_MODES"]: + elif cp2k_run_type.upper() in ("VIBRATIONAL_ANALYSIS", "NORMAL_MODES"): calc_type.append("Vibrational Analysis") - elif cp2k_run_type.upper() in ["ELECTRONIC_SPECTRA", "SPECTRA"]: + elif cp2k_run_type.upper() in ("ELECTRONIC_SPECTRA", "SPECTRA"): calc_type.append("Electronic Spectra") elif cp2k_run_type.upper() == "NEGF": calc_type.append("Non-equilibrium Green's Function") - elif cp2k_run_type.upper() in ["PINT", "DRIVER"]: + elif cp2k_run_type.upper() in ("PINT", "DRIVER"): calc_type.append("Path Integral") - elif cp2k_run_type.upper() in ["RT_PROPAGATION", "EHRENFEST_DYN"]: + elif cp2k_run_type.upper() in ("RT_PROPAGATION", "EHRENFEST_DYN"): calc_type.append("Real-time propagation") elif cp2k_run_type.upper() == "BSSE": diff --git a/src/atomate2/cp2k/schemas/calculation.py b/src/atomate2/cp2k/schemas/calculation.py index 4a70dab8c9..f5541fd5f6 100644 --- a/src/atomate2/cp2k/schemas/calculation.py +++ b/src/atomate2/cp2k/schemas/calculation.py @@ -84,7 +84,7 @@ class CalculationInput(BaseModel): @field_validator("atomic_kind_info", mode="before") @classmethod - def remove_unnecessary(cls, atomic_kind_info) -> dict: + def remove_unnecessary(cls, atomic_kind_info: dict) -> dict: """Remove unnecessary entry from atomic_kind_info.""" for k in atomic_kind_info: if "total_pseudopotential_energy" in atomic_kind_info[k]: @@ -93,7 +93,7 @@ def remove_unnecessary(cls, atomic_kind_info) -> dict: @field_validator("dft", mode="before") @classmethod - def cleanup_dft(cls, dft) -> dict: + def cleanup_dft(cls, dft: dict) -> dict: """Convert UKS strings to UKS=True.""" if any(v.upper() == "UKS" for v in dft.values()): dft["UKS"] = True @@ -336,9 +336,9 @@ def from_cp2k_files( vbm, cbm, band_gap, is_metal and efermi rather than the full band structure object. - average_v_hartree + average_v_hartree : bool = True Whether to store the average of the V_HARTREE along the crystal axes. - run_bader + run_bader : bool = False Whether to run bader on the charge density. strip_dos_projections : bool Whether to strip the element and site projections from the density of @@ -347,13 +347,13 @@ def from_cp2k_files( strip_bandstructure_projections : bool Whether to strip the element and site projections from the band structure. This can help reduce the size of DOS objects in systems with many atoms. - store_trajectory: + store_trajectory : bool = False Whether to store the ionic steps as a pmg trajectory object, which can be pushed, to a bson data store, instead of as a list od dicts. Useful for large trajectories. - store_scf: + store_scf : bool = False Whether to store the SCF convergence data. - store_volumetric_data + store_volumetric_data : tuple[str] | None = SETTINGS.CP2K_STORE_VOLUMETRIC_DATA Which volumetric files to store. Returns @@ -394,9 +394,9 @@ def from_cp2k_files( # TODO vasp version calls bader_analysis_from_path but cp2k # cube files don't support that yet, do it manually bader = { - "min_dist": [d["min_dist"] for d in ba.data], - "charge": [d["charge"] for d in ba.data], - "atomic_volume": [d["atomic_vol"] for d in ba.data], + "min_dist": [dct["min_dist"] for dct in ba.data], + "charge": [dct["charge"] for dct in ba.data], + "atomic_volume": [dct["atomic_vol"] for dct in ba.data], "vacuum_charge": ba.vacuum_charge, "vacuum_volume": ba.vacuum_volume, "reference_used": bool(ba.chgref_filename), @@ -479,9 +479,7 @@ def _get_basis_and_potential_files(dir_name: Path) -> dict[Cp2kObject, DataFile] """ data: dict[Cp2kObject, DataFile] = {} if Path.exists(dir_name / "BASIS"): - data[Cp2kObject.BASIS] = BasisFile.from_file( # type: ignore[index] - str(dir_name / "BASIS") - ) + data[Cp2kObject.BASIS] = BasisFile.from_file(str(dir_name / "BASIS")) # type: ignore[index] if Path.exists(dir_name / "POTENTIAL"): data[Cp2kObject.POTENTIAL] = PotentialFile.from_file( # type: ignore[index] str(dir_name / "POTENTIAL") diff --git a/src/atomate2/cp2k/schemas/task.py b/src/atomate2/cp2k/schemas/task.py index 8f8c0384b5..5998fbc014 100644 --- a/src/atomate2/cp2k/schemas/task.py +++ b/src/atomate2/cp2k/schemas/task.py @@ -320,7 +320,7 @@ def from_directory( dir_name The path to the folder containing the calculation outputs. store_additional_json - Whether to store additional json files found in the calculation directory. + Whether to store additional JSON files found in the calculation directory. volumetric_files Volumetric files to search for. additional_fields @@ -486,7 +486,7 @@ def _find_cp2k_files( path = Path(path) task_files = OrderedDict() - def _get_task_files(files, suffix="") -> dict[str, Any]: + def _get_task_files(files: list[Path], suffix: str = "") -> dict[str, Any]: cp2k_files: dict[str, Any] = {} vol_files = [] for file in files: diff --git a/src/atomate2/cp2k/sets/base.py b/src/atomate2/cp2k/sets/base.py index 7aa3fdb0c5..3fdeda7fb7 100644 --- a/src/atomate2/cp2k/sets/base.py +++ b/src/atomate2/cp2k/sets/base.py @@ -5,13 +5,13 @@ import os from copy import deepcopy from dataclasses import dataclass, field +from importlib.resources import files as get_mod_path from pathlib import Path from typing import Any import numpy as np from monty.io import zopen from monty.serialization import loadfn -from pkg_resources import resource_filename from pymatgen.core.structure import Molecule, Structure from pymatgen.io.core import InputGenerator, InputSet from pymatgen.io.cp2k.inputs import ( @@ -29,8 +29,8 @@ from atomate2 import SETTINGS -_BASE_CP2K_SET = loadfn(resource_filename("atomate2.cp2k.sets", "BaseCp2kSet.yaml")) -_BASE_GAPW_SET = loadfn(resource_filename("atomate2.cp2k.sets", "BaseAllSet.yaml")) +_BASE_CP2K_SET = loadfn(get_mod_path("atomate2.cp2k.sets") / "BaseCp2kSet.yaml") +_BASE_GAPW_SET = loadfn(get_mod_path("atomate2.cp2k.sets") / "BaseAllSet.yaml") class Cp2kInputSet(InputSet): @@ -106,14 +106,14 @@ def write_input( } inputs.update(self.optional_files) - for k, v in inputs.items(): - fn = v.get("filename") - obj = v.get("object") - if v is not None and (overwrite or not (directory / k).exists()): - with zopen(directory / fn, "wt") as f: - f.write(str(obj)) - elif not overwrite and (directory / fn).exists(): - raise FileExistsError(f"{directory / fn} already exists.") + for key, val in inputs.items(): + filename = val.get("filename") + obj = val.get("object") + if val is not None and (overwrite or not (directory / key).exists()): + with zopen(directory / filename, "wt") as file: + file.write(str(obj)) + elif not overwrite and (directory / filename).exists(): + raise FileExistsError(f"{directory / filename} already exists.") @staticmethod def from_directory( @@ -216,7 +216,7 @@ def get_input_set( Cp2kInput A Cp2k input set. """ - structure, prev_input, cp2k_output = self._get_previous(structure, prev_dir) + structure, prev_input, _cp2k_output = self._get_previous(structure, prev_dir) input_updates = self.get_input_updates( structure, @@ -317,7 +317,7 @@ def _get_previous( return structure, prev_input, cp2k_output - def _get_structure(self, structure) -> Structure: + def _get_structure(self, structure: Structure) -> Structure: """Get the standardized structure.""" if self.sort_structure and hasattr(structure, "get_sorted_structure"): structure = structure.get_sorted_structure() @@ -415,7 +415,7 @@ def _get_kpoints( return kconfig explicit = ( - kconfig.get("explicit", False) + kconfig.get("explicit") or len(kconfig.get("added_kpoints", [])) > 0 or "zero_weighted_reciprocal_density" in kconfig or "zero_weighted_line_density" in kconfig @@ -542,7 +542,7 @@ def _combine_kpoints(*kpoints_objects: Kpoints) -> Kpoints: weights = [] for kpoints_object in filter(None, kpoints_objects): - if not kpoints_object.style == Kpoints.supported_modes.Reciprocal: + if kpoints_object.style != Kpoints.supported_modes.Reciprocal: raise ValueError( "Can only combine kpoints with style=Kpoints.supported_modes.Reciprocal" ) diff --git a/src/atomate2/forcefields/__init__.py b/src/atomate2/forcefields/__init__.py index 8ffc66eacd..1a192060cc 100644 --- a/src/atomate2/forcefields/__init__.py +++ b/src/atomate2/forcefields/__init__.py @@ -1 +1,11 @@ """Tools and functions common to all forcefields.""" +from enum import Enum + + +class MLFF(Enum): # TODO inherit from StrEnum when 3.11+ + """Names of ML force fields.""" + + MACE = "MACE" + GAP = "GAP" + M3GNet = "M3GNet" + CHGNet = "CHGNet" diff --git a/src/atomate2/forcefields/flows/__init__.py b/src/atomate2/forcefields/flows/__init__.py index 1b434193d9..2090e63c6f 100644 --- a/src/atomate2/forcefields/flows/__init__.py +++ b/src/atomate2/forcefields/flows/__init__.py @@ -1,2 +1,3 @@ """Flows for forcefields.""" + from .relax import CHGNetVaspRelaxMaker, M3GNetVaspRelaxMaker diff --git a/src/atomate2/forcefields/flows/elastic.py b/src/atomate2/forcefields/flows/elastic.py index b3d6533ef5..6ff8270c50 100644 --- a/src/atomate2/forcefields/flows/elastic.py +++ b/src/atomate2/forcefields/flows/elastic.py @@ -74,7 +74,7 @@ class ElasticMaker(BaseElasticMaker): task_document_kwargs: dict = field(default_factory=dict) @property - def prev_calc_dir_argname(self): + def prev_calc_dir_argname(self) -> str | None: """Name of argument informing static maker of previous calculation directory. As this differs between different DFT codes (e.g., VASP, CP2K), it @@ -83,4 +83,3 @@ def prev_calc_dir_argname(self): Note: this is only applicable if a relax_maker is specified; i.e., two calculations are performed for each ordering (relax -> static) """ - return diff --git a/src/atomate2/forcefields/flows/eos.py b/src/atomate2/forcefields/flows/eos.py new file mode 100644 index 0000000000..9dc8756fc4 --- /dev/null +++ b/src/atomate2/forcefields/flows/eos.py @@ -0,0 +1,137 @@ +"""Flows to generate EOS fits using CHGNet, M3GNet, or MACE.""" +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import TYPE_CHECKING + +from atomate2.common.flows.eos import CommonEosMaker +from atomate2.forcefields.jobs import CHGNetRelaxMaker, M3GNetRelaxMaker, MACERelaxMaker + +if TYPE_CHECKING: + from jobflow import Maker + + +@dataclass +class CHGNetEosMaker(CommonEosMaker): + """ + Generate equation of state data using the CHGNet ML forcefield. + + First relax a structure using relax_maker. + Then perform a series of deformations on the relaxed structure, and + relax atomic positions within the cell. For ML forcefields, there + is no distinction between relax and static energies, unlike in a VASP + calculation. Therefore these EosMakers default to static_maker = None. + + Parameters + ---------- + name : str + Name of the flows produced by this maker. + initial_relax_maker : .Maker | None + Maker to relax the input structure, defaults to None (no initial relaxation). + eos_relax_maker : .Maker + Maker to relax deformationed structures for the EOS fit. + static_maker : .Maker | None + Maker to generate statics after each relaxation, defaults to None. + strain : tuple[float] + Percentage linear strain to apply as a deformation, default = -5% to 5%. + number_of_frames : int + Number of strain calculations to do for EOS fit, default = 6. + postprocessor : .job + Optional postprocessing step, defaults to + `atomate2.common.jobs.PostProcessEosEnergy`. + _store_transformation_information : .bool = False + Whether to store the information about transformations. Unfortunately + needed at present to handle issues with emmet and pydantic validation + TODO: remove this when clash is fixed + """ + + name: str = "CHGNet EOS Maker" + initial_relax_maker: Maker = field(default_factory=CHGNetRelaxMaker) + eos_relax_maker: Maker = field( + default_factory=lambda: CHGNetRelaxMaker(relax_cell=False) + ) + static_maker: Maker = None + + +@dataclass +class M3GNetEosMaker(CommonEosMaker): + """ + Generate equation of state data using the M3GNet ML forcefield. + + First relax a structure using relax_maker. + Then perform a series of deformations on the relaxed structure, and + relax atomic positions within the cell. For ML forcefields, there + is no distinction between relax and static energies, unlike in a VASP + calculation. Therefore these EosMakers default to static_maker = None. + + Parameters + ---------- + name : str + Name of the flows produced by this maker. + initial_relax_maker : .Maker | None + Maker to relax the input structure, defaults to None (no initial relaxation). + eos_relax_maker : .Maker + Maker to relax deformationed structures for the EOS fit. + static_maker : .Maker | None + Maker to generate statics after each relaxation, defaults to None. + strain : tuple[float] + Percentage linear strain to apply as a deformation, default = -5% to 5%. + number_of_frames : int + Number of strain calculations to do for EOS fit, default = 6. + postprocessor : .job + Optional postprocessing step, defaults to + `atomate2.common.jobs.PostProcessEosEnergy`. + _store_transformation_information : .bool = False + Whether to store the information about transformations. Unfortunately + needed at present to handle issues with emmet and pydantic validation + TODO: remove this when clash is fixed + """ + + name: str = "M3GNet EOS Maker" + initial_relax_maker: Maker = field(default_factory=M3GNetRelaxMaker) + eos_relax_maker: Maker = field( + default_factory=lambda: M3GNetRelaxMaker(relax_cell=False) + ) + static_maker: Maker = None + + +@dataclass +class MACEEosMaker(CommonEosMaker): + """ + Generate equation of state data using the MACE ML forcefield. + + First relax a structure using relax_maker. + Then perform a series of deformations on the relaxed structure, and + relax atomic positions within the cell. For ML forcefields, there + is no distinction between relax and static energies, unlike in a VASP + calculation. Therefore these EosMakers default to static_maker = None. + + Parameters + ---------- + name : str + Name of the flows produced by this maker. + initial_relax_maker : .Maker | None + Maker to relax the input structure, defaults to None (no initial relaxation). + eos_relax_maker : .Maker + Maker to relax deformationed structures for the EOS fit. + static_maker : .Maker | None + Maker to generate statics after each relaxation, defaults to None. + strain : tuple[float] + Percentage linear strain to apply as a deformation, default = -5% to 5%. + number_of_frames : int + Number of strain calculations to do for EOS fit, default = 6. + postprocessor : .job + Optional postprocessing step, defaults to + `atomate2.common.jobs.PostProcessEosEnergy`. + _store_transformation_information : .bool = False + Whether to store the information about transformations. Unfortunately + needed at present to handle issues with emmet and pydantic validation + TODO: remove this when clash is fixed + """ + + name: str = "MACE EOS Maker" + initial_relax_maker: Maker = field(default_factory=MACERelaxMaker) + eos_relax_maker: Maker = field( + default_factory=lambda: MACERelaxMaker(relax_cell=False) + ) + static_maker: Maker = None diff --git a/src/atomate2/forcefields/flows/phonons.py b/src/atomate2/forcefields/flows/phonons.py index ad76c76eee..61b9740c63 100644 --- a/src/atomate2/forcefields/flows/phonons.py +++ b/src/atomate2/forcefields/flows/phonons.py @@ -3,18 +3,9 @@ from __future__ import annotations from dataclasses import dataclass, field -from typing import TYPE_CHECKING +from typing import Literal -from jobflow import Flow, Maker - -from atomate2.common.jobs.phonons import ( - generate_frequencies_eigenvectors, - generate_phonon_displacements, - get_supercell_size, - get_total_energy_per_cell, - run_phonon_displacements, -) -from atomate2.common.jobs.utils import structure_to_conventional, structure_to_primitive +from atomate2.common.flows.phonons import BasePhononMaker from atomate2.forcefields.jobs import ( CHGNetRelaxMaker, CHGNetStaticMaker, @@ -22,15 +13,9 @@ ForceFieldStaticMaker, ) -if TYPE_CHECKING: - from emmet.core.math import Matrix3D - from pymatgen.core.structure import Structure - - from atomate2.vasp.jobs.base import BaseVaspMaker - @dataclass -class PhononMaker(Maker): +class PhononMaker(BasePhononMaker): """ Maker to calculate harmonic phonons with a force field. @@ -91,15 +76,17 @@ class PhononMaker(Maker): 49(2), 299-312. doi:10.1016/j.commatsci.2010.05.010. We will however use seekpath and primitive structures as determined by from phonopy to compute the phonon band structure - bulk_relax_maker : .BaseVaspMaker or None + bulk_relax_maker : .ForceFieldRelaxMaker or None A maker to perform a tight relaxation on the bulk. Set to ``None`` to skip the bulk relaxation - static_energy_maker : .BaseVaspMaker or None + static_energy_maker : .ForceFieldRelaxMaker or None A maker to perform the computation of the DFT energy on the bulk. Set to ``None`` to skip the static energy computation - phonon_displacement_maker : .BaseVaspMaker or None + born_maker: .ForceFieldStaticMaker or None + Maker to compute the BORN charges. + phonon_displacement_maker : .ForceFieldStaticMaker or None Maker used to compute the forces for a supercell. generate_frequencies_eigenvectors_kwargs : dict Keyword arguments passed to :obj:`generate_frequencies_eigenvectors`. @@ -116,11 +103,11 @@ class PhononMaker(Maker): it relies on phonopy to handle the relationship to the primitive cell and not pymatgen code: str - determines the dft code. currently only vasp is implemented. - This keyword might enable the implementation of other codes - in the future + determines the dft or force field code. store_force_constants: bool if True, force constants will be stored + socket: bool + If True, use the socket for the calculation """ name: str = "phonon" @@ -130,192 +117,31 @@ class PhononMaker(Maker): min_length: float | None = 20.0 prefer_90_degrees: bool = True get_supercell_size_kwargs: dict = field(default_factory=dict) - use_symmetrized_structure: str | None = None - bulk_relax_maker: BaseVaspMaker | ForceFieldRelaxMaker | None = field( + use_symmetrized_structure: Literal["primitive", "conventional"] | None = None + bulk_relax_maker: ForceFieldRelaxMaker | None = field( default_factory=lambda: CHGNetRelaxMaker(relax_kwargs={"fmax": 0.00001}) ) - static_energy_maker: BaseVaspMaker | ForceFieldStaticMaker | None = field( + static_energy_maker: ForceFieldStaticMaker | None = field( default_factory=CHGNetStaticMaker ) - phonon_displacement_maker: BaseVaspMaker | ForceFieldStaticMaker = field( + phonon_displacement_maker: ForceFieldStaticMaker = field( default_factory=CHGNetStaticMaker ) - create_thermal_displacements: bool = True + create_thermal_displacements: bool = False generate_frequencies_eigenvectors_kwargs: dict = field(default_factory=dict) kpath_scheme: str = "seekpath" - code: str = "vasp" store_force_constants: bool = True + code: str = "forcefields" + born_maker: ForceFieldStaticMaker | None = None - def make( - self, - structure: Structure, - born: list[Matrix3D] | None = None, - epsilon_static: Matrix3D | None = None, - total_dft_energy_per_formula_unit: float | None = None, - supercell_matrix: Matrix3D | None = None, - ) -> Flow: - """ - Make flow to calculate the phonon properties. - - Parameters - ---------- - structure : .Structure - A pymatgen structure. Please start with a structure - that is nearly fully optimized as the internal optimizers - have very strict settings! - born: Matrix3D - The born charges and epsilon can be provided manually. - It can be provided in the VASP convention with information for - every atom in unit cell. Please be careful when converting - structures within in this workflow as this could lead to errors - epsilon_static: Matrix3D - The high-frequency dielectric constant. - total_dft_energy_per_formula_unit: float - It has to be given per formula unit (as a result in corresponding Doc) - Instead of recomputing the energy of the bulk structure every time, - this value can also be provided in eV. If it is provided, - the static run will be skipped. This energy is the typical - output dft energy of the dft workflow. No conversion needed. - supercell_matrix: list - instead of min_length, also a supercell_matrix can - be given, e.g. [[1.0,0.0,0.0],[0.0,1.0,0.0],[0.0,0.0,1.0] - """ - if self.use_symmetrized_structure not in [None, "primitive", "conventional"]: - raise ValueError( - "use_symmetrized_structure can only be primitive, conventional, None" - ) - - if ( - not self.use_symmetrized_structure == "primitive" - and self.kpath_scheme != "seekpath" - ): - raise ValueError( - "You can only use other kpath schemes with the primitive standard " - "structure" - ) - - if self.kpath_scheme not in [ - "seekpath", - "hinuma", - "setyawan_curtarolo", - "latimer_munro", - ]: - raise ValueError("kpath scheme is not implemented") + @property + def prev_calc_dir_argname(self) -> None: + """Name of argument informing static maker of previous calculation directory. - jobs = [] + As this differs between different DFT codes (e.g., VASP, CP2K), it + has been left as a property to be implemented by the inheriting class. - # TODO: should this be after or before structural - # optimization as the optimization could change - # the symmetry - # we could add a tutorial and point out that the structure - # should be nearly optimized before the phonon workflow - if self.use_symmetrized_structure == "primitive": - # These structures are compatible with many - # of the kpath algorithms that are used for Materials Project - prim_job = structure_to_primitive(structure, self.symprec) - jobs.append(prim_job) - structure = prim_job.output - elif self.use_symmetrized_structure == "conventional": - # it could be beneficial to use conventional - # standard structures to arrive faster at supercells with right - # angles - conv_job = structure_to_conventional(structure, self.symprec) - jobs.append(conv_job) - structure = conv_job.output - - if self.bulk_relax_maker is not None: - # optionally relax the structure - bulk = self.bulk_relax_maker.make(structure) - jobs.append(bulk) - structure = bulk.output.structure - optimization_run_job_dir = bulk.output.dir_name - # bulk.output.dir_name - optimization_run_uuid = bulk.output.uuid - else: - optimization_run_job_dir = None - optimization_run_uuid = None - - # if supercell_matrix is None, supercell size will be determined - # after relax maker to ensure that cell lengths are really larger - # than threshold - if supercell_matrix is None: - supercell_job = get_supercell_size( - structure, - self.min_length, - self.prefer_90_degrees, - **self.get_supercell_size_kwargs, - ) - jobs.append(supercell_job) - supercell_matrix = supercell_job.output - - # get a phonon object from phonopy - displacements = generate_phonon_displacements( - structure=structure, - supercell_matrix=supercell_matrix, - displacement=self.displacement, - sym_reduce=self.sym_reduce, - symprec=self.symprec, - use_symmetrized_structure=self.use_symmetrized_structure, - kpath_scheme=self.kpath_scheme, - code=self.code, - ) - jobs.append(displacements) - - # perform the phonon displacement calculations - vasp_displacement_calcs = run_phonon_displacements( - displacements=displacements.output, - structure=structure, - supercell_matrix=supercell_matrix, - phonon_maker=self.phonon_displacement_maker, - ) - jobs.append(vasp_displacement_calcs) - - # Computation of static energy - if (self.static_energy_maker is not None) and ( - total_dft_energy_per_formula_unit is None - ): - static_job = self.static_energy_maker.make(structure=structure) - jobs.append(static_job) - total_dft_energy = static_job.output.output.energy - static_run_job_dir = static_job.output.dir_name - static_run_uuid = static_job.output.uuid - else: - if total_dft_energy_per_formula_unit is not None: - # to make sure that one can reuse results from Doc - compute_total_energy_job = get_total_energy_per_cell( - total_dft_energy_per_formula_unit, structure - ) - jobs.append(compute_total_energy_job) - total_dft_energy = compute_total_energy_job.output - else: - total_dft_energy = None - static_run_job_dir = None - static_run_uuid = None - - phonon_collect = generate_frequencies_eigenvectors( - supercell_matrix=supercell_matrix, - displacement=self.displacement, - sym_reduce=self.sym_reduce, - symprec=self.symprec, - use_symmetrized_structure=self.use_symmetrized_structure, - kpath_scheme=self.kpath_scheme, - code=self.code, - structure=structure, - displacement_data=vasp_displacement_calcs.output, - epsilon_static=epsilon_static, - born=born, - total_dft_energy=total_dft_energy, - static_run_job_dir=static_run_job_dir, - static_run_uuid=static_run_uuid, - born_run_job_dir=None, - born_run_uuid=None, - optimization_run_job_dir=optimization_run_job_dir, - optimization_run_uuid=optimization_run_uuid, - create_thermal_displacements=self.create_thermal_displacements, - store_force_constants=self.store_force_constants, - **self.generate_frequencies_eigenvectors_kwargs, - ) - - jobs.append(phonon_collect) - # create a flow including all jobs for a phonon computation - return Flow(jobs, phonon_collect.output) + Note: this is only applicable if a relax_maker is specified; i.e., two + calculations are performed for each ordering (relax -> static) + """ + return diff --git a/src/atomate2/forcefields/flows/relax.py b/src/atomate2/forcefields/flows/relax.py index 27ca123927..fd98c07ca8 100644 --- a/src/atomate2/forcefields/flows/relax.py +++ b/src/atomate2/forcefields/flows/relax.py @@ -7,6 +7,7 @@ from jobflow import Flow, Maker +from atomate2.forcefields import MLFF from atomate2.forcefields.jobs import CHGNetRelaxMaker, M3GNetRelaxMaker from atomate2.vasp.jobs.core import RelaxMaker @@ -31,7 +32,7 @@ class CHGNetVaspRelaxMaker(Maker): Maker to generate a VASP relaxation job. """ - name: str = "CHGNet relax followed by a VASP relax" + name: str = f"{MLFF.CHGNet} relax followed by a VASP relax" chgnet_maker: CHGNetRelaxMaker = field(default_factory=CHGNetRelaxMaker) vasp_maker: BaseVaspMaker = field(default_factory=RelaxMaker) @@ -50,7 +51,7 @@ def make(self, structure: Structure) -> Flow: A flow containing a CHGNet relaxation followed by a VASP relaxation """ chgnet_relax_job = self.chgnet_maker.make(structure) - chgnet_relax_job.name = "CHGNet pre-relax" + chgnet_relax_job.name = f"{MLFF.CHGNet} pre-relax" vasp_job = self.vasp_maker.make(chgnet_relax_job.output.structure) @@ -72,7 +73,7 @@ class M3GNetVaspRelaxMaker(Maker): Maker to generate a VASP relaxation job. """ - name: str = "M3GNet relax followed by a VASP relax" + name: str = f"{MLFF.M3GNet} relax followed by a VASP relax" m3gnet_maker: M3GNetRelaxMaker = field(default_factory=M3GNetRelaxMaker) vasp_maker: BaseVaspMaker = field(default_factory=RelaxMaker) @@ -91,7 +92,7 @@ def make(self, structure: Structure) -> Flow: A flow containing a M3GNet relaxation followed by a VASP relaxation """ m3gnet_relax_job = self.m3gnet_maker.make(structure) - m3gnet_relax_job.name = "M3GNet pre-relax" + m3gnet_relax_job.name = f"{MLFF.M3GNet} pre-relax" vasp_job = self.vasp_maker.make(m3gnet_relax_job.output.structure) diff --git a/src/atomate2/forcefields/jobs.py b/src/atomate2/forcefields/jobs.py index 8680c25e59..e372c1d2eb 100644 --- a/src/atomate2/forcefields/jobs.py +++ b/src/atomate2/forcefields/jobs.py @@ -8,10 +8,12 @@ from jobflow import Maker, job +from atomate2.forcefields import MLFF from atomate2.forcefields.schemas import ForceFieldTaskDocument from atomate2.forcefields.utils import Relaxer if TYPE_CHECKING: + from collections.abc import Sequence from pathlib import Path from pymatgen.core.structure import Structure @@ -24,13 +26,15 @@ class ForceFieldRelaxMaker(Maker): """ Base Maker to calculate forces and stresses using any force field. + Should be subclassed to use a specific force field. + Parameters ---------- name : str The job name. force_field_name : str The name of the force field. - relax_cell : bool + relax_cell : bool = True Whether to allow the cell shape/volume to change during relaxation. steps : int Maximum number of ionic steps allowed during relaxation. @@ -42,23 +46,28 @@ class ForceFieldRelaxMaker(Maker): Additional keyword args passed to :obj:`.ForceFieldTaskDocument()`. """ - name: str = "Forcefield relax" - force_field_name: str = "Forcefield" - relax_cell: bool = False + name: str = "Force field relax" + force_field_name: str = "Force field" + relax_cell: bool = True steps: int = 500 relax_kwargs: dict = field(default_factory=dict) optimizer_kwargs: dict = field(default_factory=dict) task_document_kwargs: dict = field(default_factory=dict) @job(output_schema=ForceFieldTaskDocument) - def make(self, structure: Structure) -> ForceFieldTaskDocument: + def make( + self, structure: Structure, prev_dir: str | Path | None = None + ) -> ForceFieldTaskDocument: """ Perform a relaxation of a structure using a force field. Parameters ---------- structure: .Structure - pymatgen structure. + pymatgen structure. + prev_dir : str or Path or None + A previous calculation directory to copy output files from. Unused, just + added to match the method signature of other makers. """ if self.steps < 0: logger.warning( @@ -97,12 +106,14 @@ class ForceFieldStaticMaker(ForceFieldRelaxMaker): Additional keyword args passed to :obj:`.ForceFieldTaskDocument()`. """ - name: str = "ForceField static" - force_field_name: str = "Forcefield" + name: str = "Force field static" + force_field_name: str = "Force field" task_document_kwargs: dict = field(default_factory=dict) @job(output_schema=ForceFieldTaskDocument) - def make(self, structure: Structure) -> ForceFieldTaskDocument: + def make( + self, structure: Structure, prev_dir: str | Path | None = None + ) -> ForceFieldTaskDocument: """ Perform a static evaluation using a force field. @@ -110,6 +121,9 @@ def make(self, structure: Structure) -> ForceFieldTaskDocument: ---------- structure: .Structure pymatgen structure. + prev_dir : str or Path or None + A previous calculation directory to copy output files from. Unused, just + added to match the method signature of other makers. """ if self.steps < 0: logger.warning( @@ -142,7 +156,7 @@ class CHGNetRelaxMaker(ForceFieldRelaxMaker): ---------- force_field_name : str The name of the force field. - relax_cell : bool + relax_cell : bool = True Whether to allow the cell shape/volume to change during relaxation. steps : int Maximum number of ionic steps allowed during relaxation. @@ -154,9 +168,9 @@ class CHGNetRelaxMaker(ForceFieldRelaxMaker): Additional keyword args passed to :obj:`.ForceFieldTaskDocument()`. """ - name: str = "CHGNet relax" - force_field_name = "CHGNet" - relax_cell: bool = False + name: str = f"{MLFF.CHGNet} relax" + force_field_name = f"{MLFF.CHGNet}" + relax_cell: bool = True steps: int = 500 relax_kwargs: dict = field(default_factory=dict) optimizer_kwargs: dict = field(default_factory=dict) @@ -184,8 +198,8 @@ class CHGNetStaticMaker(ForceFieldStaticMaker): Additional keyword args passed to :obj:`.ForceFieldTaskDocument()`. """ - name: str = "CHGNet static" - force_field_name = "CHGNet" + name: str = f"{MLFF.CHGNet} static" + force_field_name = f"{MLFF.CHGNet}" task_document_kwargs: dict = field(default_factory=dict) def _evaluate_static(self, structure: Structure) -> dict: @@ -206,7 +220,7 @@ class M3GNetRelaxMaker(ForceFieldRelaxMaker): The job name. force_field_name : str The name of the force field. - relax_cell : bool + relax_cell : bool = True Whether to allow the cell shape/volume to change during relaxation. steps : int Maximum number of ionic steps allowed during relaxation. @@ -218,9 +232,9 @@ class M3GNetRelaxMaker(ForceFieldRelaxMaker): Additional keyword args passed to :obj:`.ForceFieldTaskDocument()`. """ - name: str = "M3GNet relax" - force_field_name: str = "M3GNet" - relax_cell: bool = False + name: str = f"{MLFF.M3GNet} relax" + force_field_name: str = f"{MLFF.M3GNet}" + relax_cell: bool = True steps: int = 500 relax_kwargs: dict = field(default_factory=dict) optimizer_kwargs: dict = field(default_factory=dict) @@ -232,19 +246,13 @@ def _relax(self, structure: Structure) -> dict: # Note: the below code was taken from the matgl repo examples. # Load pre-trained M3GNet model (currently uses the MP-2021.2.8 database) - pot = matgl.load_model("M3GNet-MP-2021.2.8-PES") + potential = matgl.load_model("M3GNet-MP-2021.2.8-PES") relaxer = Relaxer( - potential=pot, - relax_cell=self.relax_cell, - **self.optimizer_kwargs, + potential=potential, relax_cell=self.relax_cell, **self.optimizer_kwargs ) - return relaxer.relax( - structure, - steps=self.steps, - **self.relax_kwargs, - ) + return relaxer.relax(structure, steps=self.steps, **self.relax_kwargs) @dataclass @@ -262,8 +270,8 @@ class M3GNetStaticMaker(ForceFieldStaticMaker): Additional keyword args passed to :obj:`.ForceFieldTaskDocument()`. """ - name: str = "M3GNet static" - force_field_name: str = "M3GNet" + name: str = f"{MLFF.M3GNet} static" + force_field_name: str = f"{MLFF.M3GNet}" task_document_kwargs: dict = field(default_factory=dict) def _evaluate_static(self, structure: Structure) -> dict: @@ -272,17 +280,99 @@ def _evaluate_static(self, structure: Structure) -> dict: # Note: the below code was taken from the matgl repo examples. # Load pre-trained M3GNet model (currently uses the MP-2021.2.8 database) - pot = matgl.load_model("M3GNet-MP-2021.2.8-PES") + potential = matgl.load_model("M3GNet-MP-2021.2.8-PES") + + relaxer = Relaxer(potential=potential, relax_cell=False) + + return relaxer.relax(structure, steps=1) + + +@dataclass +class MACERelaxMaker(ForceFieldRelaxMaker): + """ + Base Maker to calculate forces and stresses using a MACE potential. + + Parameters + ---------- + name : str + The job name. + force_field_name : str + The name of the force field. + relax_cell : bool = True + Whether to allow the cell shape/volume to change during relaxation. + steps : int + Maximum number of ionic steps allowed during relaxation. + relax_kwargs : dict + Keyword arguments that will get passed to :obj:`Relaxer.relax`. + optimizer_kwargs : dict + Keyword arguments that will get passed to :obj:`Relaxer()`. + task_document_kwargs : dict + Additional keyword args passed to :obj:`.ForceFieldTaskDocument()`. + model: str | Path | None + Checkpoint to load with :obj:`mace.calculators.MACECalculator()'`. Can be a URL + starting with https://. If None, loads the universal MACE trained for Matbench + Discovery on the MPtrj dataset available at + https://figshare.com/articles/dataset/22715158. + model_kwargs: dict[str, Any] + Further keywords (e.g. device, default_dtype, model) for + :obj:`mace.calculators.MACECalculator()'`. + """ + + name: str = f"{MLFF.MACE} relax" + force_field_name: str = f"{MLFF.MACE}" + relax_cell: bool = True + steps: int = 500 + relax_kwargs: dict = field(default_factory=dict) + optimizer_kwargs: dict = field(default_factory=dict) + task_document_kwargs: dict = field(default_factory=dict) + model: str | Path | Sequence[str | Path] | None = None + model_kwargs: dict = field(default_factory=dict) + + def _relax(self, structure: Structure) -> dict: + from mace.calculators import mace_mp + calculator = mace_mp(model=self.model, **self.model_kwargs) relaxer = Relaxer( - potential=pot, - relax_cell=False, + calculator, relax_cell=self.relax_cell, **self.optimizer_kwargs ) + return relaxer.relax(structure, steps=self.steps, **self.relax_kwargs) - return relaxer.relax( - structure, - steps=1, - ) + +@dataclass +class MACEStaticMaker(ForceFieldStaticMaker): + """ + Base Maker to calculate forces and stresses using a MACE potential. + + Parameters + ---------- + name : str + The job name. + force_field_name : str + The name of the force field. + task_document_kwargs : dict + Additional keyword args passed to :obj:`.ForceFieldTaskDocument()`. + model: str | Path | None + Checkpoint to load with :obj:`mace.calculators.MACECalculator()'`. Can be a URL + starting with https://. If None, loads the universal MACE trained for Matbench + Discovery on the MPtrj dataset available at + https://figshare.com/articles/dataset/22715158. + model_kwargs: dict[str, Any] + Further keywords (e.g. device, default_dtype, model) for + :obj:`mace.calculators.MACECalculator()'`. + """ + + name: str = f"{MLFF.MACE} static" + force_field_name: str = f"{MLFF.MACE}" + task_document_kwargs: dict = field(default_factory=dict) + model: str | Path | Sequence[str | Path] | None = None + model_kwargs: dict = field(default_factory=dict) + + def _evaluate_static(self, structure: Structure) -> dict: + from mace.calculators import mace_mp + + calculator = mace_mp(model=self.model, **self.model_kwargs) + relaxer = Relaxer(calculator, relax_cell=False) + return relaxer.relax(structure, steps=1) @dataclass @@ -296,7 +386,7 @@ class GAPRelaxMaker(ForceFieldRelaxMaker): The job name. force_field_name : str The name of the force field. - relax_cell : bool + relax_cell : bool = True Whether to allow the cell shape/volume to change during relaxation. steps : int Maximum number of ionic steps allowed during relaxation. @@ -307,16 +397,16 @@ class GAPRelaxMaker(ForceFieldRelaxMaker): task_document_kwargs : dict Additional keyword args passed to :obj:`.ForceFieldTaskDocument()`. potential_args_str: str - args_str for :obj: quippy.potential.Potential()'. - potential_param_filename: str|Path - param_file_name for :obj: quippy.potential.Potential()'. + args_str for :obj:`quippy.potential.Potential()'`. + potential_param_file_name: str | Path + param_file_name for :obj:`quippy.potential.Potential()'`. potential_kwargs: dict - Further kwargs for :obj: quippy.potential.Potential()'. + Further keywords for :obj:`quippy.potential.Potential()'`. """ - name: str = "GAP relax" - force_field_name: str = "GAP" - relax_cell: bool = False + name: str = f"{MLFF.GAP} relax" + force_field_name: str = f"{MLFF.GAP}" + relax_cell: bool = True steps: int = 500 relax_kwargs: dict = field(default_factory=dict) optimizer_kwargs: dict = field(default_factory=dict) @@ -333,7 +423,9 @@ def _relax(self, structure: Structure) -> dict: param_filename=str(self.potential_param_file_name), **self.potential_kwargs, ) - relaxer = Relaxer(calculator, relax_cell=self.relax_cell) + relaxer = Relaxer( + calculator, **self.optimizer_kwargs, relax_cell=self.relax_cell + ) return relaxer.relax(structure, steps=self.steps, **self.relax_kwargs) @@ -351,15 +443,16 @@ class GAPStaticMaker(ForceFieldStaticMaker): task_document_kwargs : dict Additional keyword args passed to :obj:`.ForceFieldTaskDocument()`. potential_args_str: str - args_str for :obj: quippy.potential.Potential()'. - potential_param_filename: str | Path - param_file_name for :obj: quippy.potential.Potential()'. + args_str for :obj:`quippy.potential.Potential()'`. + potential_param_file_name: str | Path + param_file_name for :obj:`quippy.potential.Potential()'`. potential_kwargs: dict - Further kwargs for :obj: quippy.potential.Potential()'. + Further keywords for :obj:`quippy.potential.Potential()'`. """ - name: str = "GAP static" - force_field_name: str = "GAP" + name: str = f"{MLFF.GAP} static" + force_field_name: str = f"{MLFF.GAP}" + task_document_kwargs: dict = field(default_factory=dict) potential_args_str: str = "IP GAP" potential_param_file_name: str | Path = "gap.xml" potential_kwargs: dict = field(default_factory=dict) diff --git a/src/atomate2/forcefields/schemas.py b/src/atomate2/forcefields/schemas.py index 4efb7f032b..98f3450995 100644 --- a/src/atomate2/forcefields/schemas.py +++ b/src/atomate2/forcefields/schemas.py @@ -1,4 +1,4 @@ -"""Job to prerelax a structure using an MD Potential.""" +"""Schema definitions for force field tasks.""" from typing import Optional @@ -6,12 +6,14 @@ from ase.units import GPa from emmet.core.math import Matrix3D, Vector3D from emmet.core.structure import StructureMetadata -from pydantic import BaseModel, Extra, Field +from pydantic import BaseModel, Field from pymatgen.core.structure import Structure from pymatgen.io.ase import AseAtomsAdaptor +from atomate2.forcefields import MLFF -class IonicStep(BaseModel, extra=Extra.allow): # type: ignore[call-arg] + +class IonicStep(BaseModel, extra="allow"): # type: ignore[call-arg] """Document defining the information at each ionic step.""" energy: float = Field(None, description="The free energy.") @@ -135,12 +137,11 @@ def from_ase_compatible_result( """ trajectory = result["trajectory"].__dict__ - # NOTE: units for stresses were converted from ev/Angstromยณ to kbar - # (* -1 from standard output) + # NOTE: convert stress units from eV/Aยณ to kBar (* -1 from standard output) # and to 3x3 matrix to comply with MP convention - for i in range(len(trajectory["stresses"])): - trajectory["stresses"][i] = voigt_6_to_full_3x3_stress( - trajectory["stresses"][i] * -10 / GPa + for idx in range(len(trajectory["stresses"])): + trajectory["stresses"][idx] = voigt_6_to_full_3x3_stress( + trajectory["stresses"][idx] * -10 / GPa ) species = AseAtomsAdaptor.get_structure(trajectory["atoms"]).species @@ -178,55 +179,55 @@ def from_ase_compatible_result( n_steps = len(trajectory["energies"]) ionic_steps = [] - for i in range(n_steps): - cur_energy = ( - trajectory["energies"][i] if "energy" in ionic_step_data else None + for idx in range(n_steps): + energy = ( + trajectory["energies"][idx] if "energy" in ionic_step_data else None ) - cur_forces = ( - trajectory["forces"][i].tolist() + forces = ( + trajectory["forces"][idx].tolist() if "forces" in ionic_step_data else None ) - cur_stress = ( - trajectory["stresses"][i].tolist() + stress = ( + trajectory["stresses"][idx].tolist() if "stress" in ionic_step_data else None ) if "structure" in ionic_step_data: cur_structure = Structure( - lattice=trajectory["cells"][i], - coords=trajectory["atom_positions"][i], + lattice=trajectory["cells"][idx], + coords=trajectory["atom_positions"][idx], species=species, coords_are_cartesian=True, ) else: cur_structure = None - # include "magmoms" in :obj:`cur_ionic_step` if the trajectory has "magmoms" + # include "magmoms" in :obj:`ionic_step` if the trajectory has "magmoms" if "magmoms" in trajectory: - cur_ionic_step = IonicStep( - energy=cur_energy, - forces=cur_forces, + ionic_step = IonicStep( + energy=energy, + forces=forces, magmoms=( - trajectory["magmoms"][i].tolist() + trajectory["magmoms"][idx].tolist() if "magmoms" in ionic_step_data else None ), - stress=cur_stress, + stress=stress, structure=cur_structure, ) - # otherwise do not include "magmoms" in :obj:`cur_ionic_step` + # otherwise do not include "magmoms" in :obj:`ionic_step` elif "magmoms" not in trajectory: - cur_ionic_step = IonicStep( - energy=cur_energy, - forces=cur_forces, - stress=cur_stress, + ionic_step = IonicStep( + energy=energy, + forces=forces, + stress=stress, structure=cur_structure, ) - ionic_steps.append(cur_ionic_step) + ionic_steps.append(ionic_step) output_doc = OutputDoc( structure=output_structure, @@ -238,14 +239,16 @@ def from_ase_compatible_result( n_steps=n_steps, ) - if forcefield_name == "M3GNet": - import matgl - - version = matgl.__version__ - elif forcefield_name == "CHGNet": - import chgnet + # map force field name to its package name + pkg_name = { + MLFF.M3GNet: "matgl", + MLFF.CHGNet: "chgnet", + MLFF.MACE: "mace-torch", + }.get(forcefield_name) # type: ignore[call-overload] + if pkg_name: + import importlib.metadata - version = chgnet.__version__ + version = importlib.metadata.version(pkg_name) else: version = "Unknown" return cls.from_structure( diff --git a/src/atomate2/forcefields/utils.py b/src/atomate2/forcefields/utils.py index 0e99b606bd..e0875e0d80 100644 --- a/src/atomate2/forcefields/utils.py +++ b/src/atomate2/forcefields/utils.py @@ -6,24 +6,35 @@ and the following copyright applies: Copyright (c) 2022, Materials Virtual Lab. """ + from __future__ import annotations import contextlib import io import pickle import sys +import warnings from typing import TYPE_CHECKING -from ase.constraints import ExpCellFilter -from ase.optimize.bfgs import BFGS -from ase.optimize.bfgslinesearch import BFGSLineSearch -from ase.optimize.fire import FIRE -from ase.optimize.lbfgs import LBFGS, LBFGSLineSearch -from ase.optimize.mdmin import MDMin +from ase.optimize import BFGS, FIRE, LBFGS, BFGSLineSearch, LBFGSLineSearch, MDMin from ase.optimize.sciopt import SciPyFminBFGS, SciPyFminCG from pymatgen.core.structure import Molecule, Structure from pymatgen.io.ase import AseAtomsAdaptor +try: + from ase.filters import FrechetCellFilter +except ImportError: + FrechetCellFilter = None + warnings.warn( + "Due to errors in the implementation of gradients in the ASE" + " ExpCellFilter, we recommend installing ASE from gitlab\n" + " pip install git+https://gitlab.com/ase/ase.git\n" + "rather than PyPi to access FrechetCellFilter. See\n" + " https://wiki.fysik.dtu.dk/ase/ase/filters.html#the-frechetcellfilter-class\n" + "for more details. Otherwise, you must specify an alternate ASE Filter.", + stacklevel=2, + ) + if TYPE_CHECKING: from os import PathLike from typing import Any @@ -31,6 +42,7 @@ import numpy as np from ase import Atoms from ase.calculators.calculator import Calculator + from ase.filters import Filter from ase.optimize.optimize import Optimizer @@ -102,18 +114,16 @@ def save(self, filename: str | PathLike) -> None: ------- None """ - with open(filename, "wb") as f: - pickle.dump( - { - "energy": self.energies, - "forces": self.forces, - "stresses": self.stresses, - "atom_positions": self.atom_positions, - "cell": self.cells, - "atomic_number": self.atoms.get_atomic_numbers(), - }, - f, - ) + traj_dict = { + "energy": self.energies, + "forces": self.forces, + "stresses": self.stresses, + "atom_positions": self.atom_positions, + "cell": self.cells, + "atomic_number": self.atoms.get_atomic_numbers(), + } + with open(filename, "wb") as file: + pickle.dump(traj_dict, file) class Relaxer: @@ -137,7 +147,7 @@ def __init__( self.calculator = calculator if isinstance(optimizer, str): - optimizer_obj = OPTIMIZERS.get(optimizer, None) + optimizer_obj = OPTIMIZERS.get(optimizer) elif optimizer is None: raise ValueError("Optimizer cannot be None") else: @@ -155,6 +165,7 @@ def relax( traj_file: str = None, interval: int = 1, verbose: bool = False, + cell_filter: Filter = FrechetCellFilter, **kwargs, ) -> dict[str, Any]: """ @@ -162,13 +173,20 @@ def relax( Parameters ---------- - atoms (Atoms): the atoms for relaxation - fmax (float): total force tolerance for relaxation convergence. - steps (int): max number of steps for relaxation - traj_file (str): the trajectory file for saving - interval (int): the step interval for saving the trajectories - verbose (bool): if True, screenoutput will be shown. - kwargs: further kwargs. + atoms : Atoms + The atoms for relaxation. + fmax : float + Total force tolerance for relaxation convergence. + steps : int + Max number of steps for relaxation. + traj_file : str + The trajectory file for saving. + interval : int + The step interval for saving the trajectories. + verbose : bool + If True, screen output will be shown. + **kwargs + Further kwargs. Returns ------- @@ -181,17 +199,15 @@ def relax( with contextlib.redirect_stdout(stream): obs = TrajectoryObserver(atoms) if self.relax_cell: - atoms = ExpCellFilter(atoms) + atoms = cell_filter(atoms) optimizer = self.opt_class(atoms, **kwargs) optimizer.attach(obs, interval=interval) optimizer.run(fmax=fmax, steps=steps) obs() if traj_file is not None: obs.save(traj_file) - if isinstance(atoms, ExpCellFilter): + if isinstance(atoms, cell_filter): atoms = atoms.atoms - return { - "final_structure": self.ase_adaptor.get_structure(atoms), - "trajectory": obs, - } + struct = self.ase_adaptor.get_structure(atoms) + return {"final_structure": struct, "trajectory": obs} diff --git a/src/atomate2/lobster/files.py b/src/atomate2/lobster/files.py index 2121ce3255..8cfbb5c640 100644 --- a/src/atomate2/lobster/files.py +++ b/src/atomate2/lobster/files.py @@ -18,6 +18,7 @@ "COHPCAR.lobster", "COOPCAR.lobster", "DOSCAR.lobster", + "DOSCAR.LSO.lobster", "GROSSPOP.lobster", "ICOHPLIST.lobster", "ICOOPLIST.lobster", diff --git a/src/atomate2/lobster/run.py b/src/atomate2/lobster/run.py index f3d4c19d9d..a2fd9af480 100644 --- a/src/atomate2/lobster/run.py +++ b/src/atomate2/lobster/run.py @@ -78,7 +78,7 @@ def run_lobster( if job_type == JobType.DIRECT: logger.info(f"Running command: {lobster_cmd}") - return_code = subprocess.call(lobster_cmd, shell=True) + return_code = subprocess.call(lobster_cmd, shell=True) # noqa: S602 logger.info(f"{lobster_cmd} finished running with returncode: {return_code}") return diff --git a/src/atomate2/lobster/schemas.py b/src/atomate2/lobster/schemas.py index 876809baa2..67087ac028 100644 --- a/src/atomate2/lobster/schemas.py +++ b/src/atomate2/lobster/schemas.py @@ -1,5 +1,7 @@ """Module defining lobster document schemas.""" +import gzip +import json import logging import time from pathlib import Path @@ -8,9 +10,11 @@ import numpy as np from emmet.core.structure import StructureMetadata from monty.dev import requires +from monty.json import MontyDecoder, jsanitize +from monty.os.path import zpath from pydantic import BaseModel, Field from pymatgen.core import Structure -from pymatgen.electronic_structure.cohp import CompleteCohp +from pymatgen.electronic_structure.cohp import Cohp, CompleteCohp from pymatgen.electronic_structure.dos import LobsterCompleteDos from pymatgen.io.lobster import ( Bandoverlaps, @@ -28,9 +32,11 @@ from atomate2.utils.datetime import datetime_str try: + import ijson from lobsterpy.cohp.analyze import Analysis from lobsterpy.cohp.describe import Description except ImportError: + ijson = None Analysis = None Description = None @@ -40,57 +46,65 @@ class LobsteroutModel(BaseModel): """Definition of computational settings from the LOBSTER computation.""" - restart_from_projection: bool = Field( + restart_from_projection: Optional[bool] = Field( None, description="Bool indicating if the run has been restarted from a projection", ) - lobster_version: str = Field(None, description="Lobster version") - threads: int = Field(None, description="Number of threads that Lobster ran on") - dft_program: str = Field(None, description="DFT program was used for this run") - charge_spilling: list = Field(None, description="Absolute charge spilling") - total_spilling: list = Field(None, description="Total spilling") - elements: list = Field(None, description="Elements in structure") - basis_type: list = Field(None, description="Basis set used in Lobster") - basis_functions: list = Field(None, description="basis_functions") - timing: Any = Field(None, description="Dict with infos on timing") - warning_lines: list = Field(None, description="Warnings") - info_orthonormalization: list = Field( + lobster_version: Optional[str] = Field(None, description="Lobster version") + threads: Optional[int] = Field( + None, description="Number of threads that Lobster ran on" + ) + dft_program: Optional[str] = Field( + None, description="DFT program was used for this run" + ) + charge_spilling: list[float] = Field(description="Absolute charge spilling") + total_spilling: list[float] = Field(description="Total spilling") + elements: list[str] = Field(description="Elements in structure") + basis_type: list[str] = Field(description="Basis set used in Lobster") + basis_functions: list[list[str]] = Field(description="basis_functions") + timing: dict[str, dict[str, str]] = Field(description="Dict with infos on timing") + warning_lines: Optional[list] = Field(None, description="Warnings") + info_orthonormalization: Optional[list] = Field( None, description="additional information on orthonormalization" ) - info_lines: list = Field( + info_lines: Optional[list] = Field( None, description="list of strings with additional info lines" ) - has_doscar: bool = Field(None, description="Bool indicating if DOSCAR is present.") - has_doscar_lso: bool = Field( + has_doscar: Optional[bool] = Field( + None, description="Bool indicating if DOSCAR is present." + ) + has_doscar_lso: Optional[bool] = Field( None, description="Bool indicating if DOSCAR.LSO is present." ) - has_cohpcar: bool = Field( + has_cohpcar: Optional[bool] = Field( None, description="Bool indicating if COHPCAR is present." ) - has_coopcar: bool = Field( + has_coopcar: Optional[bool] = Field( None, description="Bool indicating if COOPCAR is present." ) - has_cobicar: bool = Field( + has_cobicar: Optional[bool] = Field( None, description="Bool indicating if COBICAR is present." ) - has_charge: bool = Field(None, description="Bool indicating if CHARGE is present.") - has_madelung: bool = Field( + has_charge: Optional[bool] = Field( + None, description="Bool indicating if CHARGE is present." + ) + has_madelung: Optional[bool] = Field( None, description="Bool indicating if Site Potentials and Madelung file is present.", ) - has_projection: bool = Field( + has_projection: Optional[bool] = Field( None, description="Bool indicating if projection file is present." ) - has_bandoverlaps: bool = Field( + has_bandoverlaps: Optional[bool] = Field( None, description="Bool indicating if BANDOVERLAPS file is present" ) - has_fatbands: bool = Field( + has_fatbands: Optional[bool] = Field( None, description="Bool indicating if Fatbands are present." ) - has_grosspopulation: bool = Field( + has_grosspopulation: Optional[bool] = Field( None, description="Bool indicating if GROSSPOP file is present." ) - has_density_of_energies: bool = Field( + has_density_of_energies: Optional[bool] = Field( None, description="Bool indicating if DensityofEnergies is present" ) @@ -98,10 +112,8 @@ class LobsteroutModel(BaseModel): class LobsterinModel(BaseModel): """Definition of input settings for the LOBSTER computation.""" - cohpstartenergy: float = Field( - None, description="Start energy for COHP computation" - ) - cohpendenergy: float = Field(None, description="End energy for COHP computation") + cohpstartenergy: float = Field(description="Start energy for COHP computation") + cohpendenergy: float = Field(description="End energy for COHP computation") gaussiansmearingwidth: Optional[float] = Field( None, description="Set the smearing width in eV,default is 0.2 (eV)" @@ -113,51 +125,146 @@ class LobsterinModel(BaseModel): cohpsteps: Optional[float] = Field( None, description="Number steps in COHPCAR; similar to NEDOS of VASP" ) - basisset: str = Field(None, description="basis set of computation") + basisset: str = Field(description="basis set of computation") cohpgenerator: str = Field( - None, - description="Build the list of atom pairs to be analyzed using given distance", + description="Build the list of atom pairs to be analyzed using given distance" ) - saveprojectiontofile: bool = Field( + saveprojectiontofile: Optional[bool] = Field( None, description="Save the results of projections" ) lsodos: Optional[bool] = Field( None, description="Writes DOS output from the orthonormalized LCAO basis" ) - basisfunctions: list = Field( - None, description="Specify the basis functions for element" + basisfunctions: list[str] = Field( + description="Specify the basis functions for element" + ) + + +class Bonding(BaseModel): + """Model describing bonding field of BondsInfo.""" + + integral: Optional[float] = Field( + None, description="Integral considering only bonding contributions from COHPs" + ) + perc: Optional[float] = Field( + None, description="Percentage of bonding contribution" + ) + + +class Antibonding(BaseModel): + """Model describing antibonding field of BondsInfo.""" + + integral: Optional[float] = Field( + None, + description="Integral considering only anti-bonding contributions from COHPs", + ) + perc: Optional[float] = Field( + None, description="Percentage of anti-bonding contribution" + ) + + +class BondsInfo(BaseModel): + """Model describing bonds field of SiteInfo.""" + + ICOHP_mean: str = Field(..., description="Mean of ICOHPs of relevant bonds") + ICOHP_sum: str = Field(..., description="Sum of ICOHPs of relevant bonds") + has_antibdg_states_below_Efermi: bool = Field( # noqa: N815 + ..., + description="Indicates if antibonding interactions below efermi are detected", + ) + number_of_bonds: int = Field( + ..., description="Number of bonds considered in the analysis" + ) + bonding: Bonding = Field(description="Model describing bonding contributions") + antibonding: Antibonding = Field( + description="Model describing anti-bonding contributions" + ) + + +class SiteInfo(BaseModel): + """Outer model describing sites field of Sites model.""" + + env: str = Field( + ..., + description="The coordination environment identified from " + "the LobsterPy analysis", + ) + bonds: dict[str, BondsInfo] = Field( + ..., + description="A dictionary with keys as atomic-specie as key " + "and BondsInfo model as values", + ) + ion: str = Field(..., description="Ion to which the atom is bonded") + charge: float = Field(..., description="Mulliken charge of the atom") + relevant_bonds: list[str] = Field( + ..., + description="List of bond labels from the LOBSTER files i.e. for e.g. " + " from ICOHPLIST.lobster/ COHPCAR.lobster", + ) + + +class Sites(BaseModel): + """Model describing, sites field of CondensedBondingAnalysis.""" + + sites: dict[int, SiteInfo] = Field( + ..., + description="A dictionary with site index as keys and SiteInfo model as values", + ) + + +class CohpPlotData(BaseModel): + """Model describing the cohp_plot_data field of CondensedBondingAnalysis.""" + + data: dict[str, Cohp] = Field( + ..., + description="A dictionary with plot labels from LobsterPy " + "automatic analysis as keys and Cohp objects as values", + ) + + +class DictIons(BaseModel): + """Model describing final_dict_ions field of CondensedBondingAnalysis.""" + + data: dict[str, dict[str, int]] = Field( + ..., + description="Dict consisting information on environments of cations " + "and counts for them", + ) + + +class DictBonds(BaseModel): + """Model describing final_dict_bonds field of CondensedBondingAnalysis.""" + + data: dict[str, dict[str, Union[float, bool]]] = Field( + ..., description="Dict consisting information on ICOHPs per bond type" ) class CondensedBondingAnalysis(BaseModel): """Definition of condensed bonding analysis data from LobsterPy ICOHP.""" - formula: str = Field(None, description="Pretty formula of the structure") - max_considered_bond_length: Any = Field( - None, description="Maximum bond length considered in bonding analysis" + formula: str = Field(description="Pretty formula of the structure") + max_considered_bond_length: float = Field( + description="Maximum bond length considered in bonding analysis" ) - limit_icohp: list = Field( - None, description="ICOHP range considered in co-ordination environment analysis" + limit_icohp: list[Union[str, float]] = Field( + description="ICOHP range considered in co-ordination environment analysis" ) number_of_considered_ions: int = Field( - None, description="number of ions detected based on Mulliken/L๏ฟฝwdin Charges" + ..., description="number of ions detected based on Mulliken/Lรถwdin Charges" ) - sites: dict = Field( - None, - description="Dict object that describes bond summary stats, " - "bonding/antibonding percentage and its coordination environment", + sites: Sites = Field( + ..., + description="Bonding information at inequivalent sites in the structure", ) type_charges: str = Field( - None, - description="Charge type considered for assigning valences in bonding analysis", + description="Charge type considered for assigning valences in bonding analysis" ) cutoff_icohp: float = Field( - None, description="Percent limiting the ICOHP values to be considered" " relative to strongest ICOHP", ) summed_spins: bool = Field( - None, description="Bool that states if the spin channels in the " "cohp_plot_data are summed.", ) @@ -167,25 +274,23 @@ class CondensedBondingAnalysis(BaseModel): " bonding/anti-bonding percentages in the bond" " if set to None, all energies up-to the Fermi is considered", ) - cohp_plot_data: dict = Field( - None, - description="Stores the COHP plot data based on relevant bond labels " - "for site as keys", + cohp_plot_data: CohpPlotData = Field( + ..., + description="Plotting data for the relevant bonds from LobsterPy analysis", ) which_bonds: str = Field( - None, description="Specifies types of bond considered in LobsterPy analysis", ) - final_dict_bonds: dict = Field( - None, + final_dict_bonds: DictBonds = Field( + ..., description="Dict consisting information on ICOHPs per bond type", ) - final_dict_ions: dict = Field( - None, - description="Dict consisting information on environments of cations", + final_dict_ions: DictIons = Field( + ..., + description="Model that describes final_dict_ions field", ) run_time: float = Field( - None, description="Time needed to run Lobsterpy condensed bonding analysis" + ..., description="Time needed to run Lobsterpy condensed bonding analysis" ) @classmethod @@ -203,22 +308,22 @@ def from_directory( ---------- dir_name : path or str The path to the folder containing the calculation outputs. - save_cohp_plots : bool + save_cohp_plots : bool. Bool to indicate whether automatic cohp plots and jsons from lobsterpy will be generated. - plot_kwargs : dict + plot_kwargs : dict. kwargs to change plotting options in lobsterpy. - which_bonds: str + which_bonds: str. mode for condensed bonding analysis: "cation-anion" and "all". """ plot_kwargs = plot_kwargs or {} dir_name = Path(dir_name) - cohpcar_path = dir_name / "COHPCAR.lobster.gz" - charge_path = dir_name / "CHARGE.lobster.gz" - structure_path = dir_name / "POSCAR.gz" - icohplist_path = dir_name / "ICOHPLIST.lobster.gz" - icobilist_path = dir_name / "ICOBILIST.lobster.gz" - icooplist_path = dir_name / "ICOOPLIST.lobster.gz" + cohpcar_path = Path(zpath(dir_name / "COHPCAR.lobster")) + charge_path = Path(zpath(dir_name / "CHARGE.lobster")) + structure_path = Path(zpath(dir_name / "POSCAR")) + icohplist_path = Path(zpath(dir_name / "ICOHPLIST.lobster")) + icobilist_path = Path(zpath(dir_name / "ICOBILIST.lobster")) + icooplist_path = Path(zpath(dir_name / "ICOOPLIST.lobster")) try: start = time.time() @@ -251,20 +356,22 @@ def from_directory( cba_cohp_plot_data[label_str + label] = cohp describe = Description(analysis_object=analyse) + limit_icohp_val = list(cba["limit_icohp"]) + _replace_inf_values(limit_icohp_val) condensed_bonding_analysis = CondensedBondingAnalysis( formula=cba["formula"], max_considered_bond_length=cba["max_considered_bond_length"], - limit_icohp=cba["limit_icohp"], + limit_icohp=limit_icohp_val, number_of_considered_ions=cba["number_of_considered_ions"], - sites=cba["sites"], + sites=Sites(**cba), type_charges=analyse.type_charge, - cohp_plot_data=cba_cohp_plot_data, + cohp_plot_data=CohpPlotData(data=cba_cohp_plot_data), cutoff_icohp=analyse.cutoff_icohp, summed_spins=False, which_bonds=analyse.which_bonds, - final_dict_bonds=analyse.final_dict_bonds, - final_dict_ions=analyse.final_dict_ions, + final_dict_bonds=DictBonds(data=analyse.final_dict_bonds), + final_dict_ions=DictIons(data=analyse.final_dict_ions), run_time=cba_run_time, ) if save_cohp_plots: @@ -276,13 +383,10 @@ def from_directory( ) import json - with open( - dir_name / f"condensed_bonding_analysis_{which_bonds}.json", "w" - ) as fp: + filename = dir_name / f"condensed_bonding_analysis_{which_bonds}" + with open(f"{filename}.json", "w") as fp: json.dump(analyse.condensed_bonding_analysis, fp) - with open( - dir_name / f"condensed_bonding_analysis_{which_bonds}.txt", "w" - ) as fp: + with open(f"{filename}.txt", "w") as fp: for line in describe.text: fp.write(f"{line}\n") @@ -293,15 +397,185 @@ def from_directory( icohplist_path=icohplist_path, icooplist_path=icooplist_path, ) - return ( - condensed_bonding_analysis, - describe, - sb_icobi, - sb_icohp, - sb_icoop, - ) except ValueError: - return (None, None, None, None, None) + return None, None, None, None, None + else: + return condensed_bonding_analysis, describe, sb_icobi, sb_icohp, sb_icoop + + +class DosComparisons(BaseModel): + """Model describing the DOS comparisons field in the CalcQualitySummary model.""" + + tanimoto_orb_s: Optional[float] = Field( + None, + description="Tanimoto similarity index between s orbital of " + "VASP and LOBSTER DOS", + ) + tanimoto_orb_p: Optional[float] = Field( + None, + description="Tanimoto similarity index between p orbital of " + "VASP and LOBSTER DOS", + ) + tanimoto_orb_d: Optional[float] = Field( + None, + description="Tanimoto similarity index between d orbital of " + "VASP and LOBSTER DOS", + ) + tanimoto_orb_f: Optional[float] = Field( + None, + description="Tanimoto similarity index between f orbital of " + "VASP and LOBSTER DOS", + ) + tanimoto_summed: Optional[float] = Field( + None, + description="Tanimoto similarity index for summed PDOS between " + "VASP and LOBSTER", + ) + e_range: list[Union[float, None]] = Field( + description="Energy range used for evaluating the Tanimoto similarity index" + ) + n_bins: Optional[int] = Field( + None, + description="Number of bins used for discretizing the VASP and LOBSTER PDOS" + "(Affects the Tanimoto similarity index)", + ) + + +class ChargeComparisons(BaseModel): + """Model describing the charges field in the CalcQualitySummary model.""" + + bva_mulliken_agree: Optional[bool] = Field( + None, + description="Bool indicating whether atoms classification as cation " + "or anion based on Mulliken charge signs of LOBSTER " + "agree with BVA analysis", + ) + bva_loewdin_agree: Optional[bool] = Field( + None, + description="Bool indicating whether atoms classification as cations " + "or anions based on Loewdin charge signs of LOBSTER " + "agree with BVA analysis", + ) + + +class BandOverlapsComparisons(BaseModel): + """Model describing the Band overlaps field in the CalcQualitySummary model.""" + + file_exists: bool = Field( + description="Boolean indicating whether the bandOverlaps.lobster " + "file is generated during the LOBSTER run", + ) + limit_maxDeviation: Optional[float] = Field( # noqa: N815 + None, + description="Limit set for maximal deviation in pymatgen parser", + ) + has_good_quality_maxDeviation: Optional[bool] = Field( # noqa: N815 + None, + description="Boolean indicating whether the deviation at each k-point " + "is within the threshold set using limit_maxDeviation " + "for analyzing the bandOverlaps.lobster file data", + ) + max_deviation: Optional[float] = Field( + None, + description="Maximum deviation from ideal identity matrix from the observed in " + "the bandOverlaps.lobster file", + ) + percent_kpoints_abv_limit: Optional[float] = Field( + None, + description="Percent of k-points that show deviations above " + "the limit_maxDeviation threshold set in pymatgen parser.", + ) + + +class ChargeSpilling(BaseModel): + """Model describing the Charge spilling field in the CalcQualitySummary model.""" + + abs_charge_spilling: float = Field( + description="Absolute charge spilling value from the LOBSTER calculation.", + ) + abs_total_spilling: float = Field( + description="Total charge spilling percent from the LOBSTER calculation.", + ) + + +class CalcQualitySummary(BaseModel): + """Model describing the calculation quality of lobster run.""" + + minimal_basis: bool = Field( + description="Denotes whether the calculation used the minimal basis for the " + "LOBSTER computation", + ) + charge_spilling: ChargeSpilling = Field( + description="Model describing the charge spilling from the LOBSTER runs", + ) + charge_comparisons: Optional[ChargeComparisons] = Field( + None, + description="Model describing the charge sign comparison results", + ) + band_overlaps_analysis: Optional[BandOverlapsComparisons] = Field( + None, + description="Model describing the band overlap file analysis results", + ) + dos_comparisons: Optional[DosComparisons] = Field( + None, + description="Model describing the VASP and LOBSTER PDOS comparisons results", + ) + + @classmethod + @requires(Analysis, "lobsterpy must be installed to create an CalcQualitySummary.") + def from_directory( + cls, + dir_name: Union[Path, str], + calc_quality_kwargs: dict = None, + ) -> "CalcQualitySummary": + """ + Create a LOBSTER calculation quality summary from directory with LOBSTER files. + + Parameters + ---------- + dir_name : path or str + The path to the folder containing the calculation outputs. + calc_quality_kwargs : dict + kwargs to change calc quality analysis options in lobsterpy. + + Returns + ------- + CalcQualitySummary + A task document summarizing quality of the lobster calculation. + """ + dir_name = Path(dir_name) + band_overlaps_path = Path(zpath(dir_name / "bandOverlaps.lobster")) + charge_path = Path(zpath(dir_name / "CHARGE.lobster")) + doscar_path = Path( + zpath( + dir_name / "DOSCAR.LSO.lobster" + if Path(zpath(dir_name / "DOSCAR.LSO.lobster")).exists() + else Path(zpath(dir_name / "DOSCAR.lobster")) + ) + ) + lobsterin_path = Path(zpath(dir_name / "lobsterin")) + lobsterout_path = Path(zpath(dir_name / "lobsterout")) + potcar_path = ( + Path(zpath(dir_name / "POTCAR")) + if Path(zpath(dir_name / "POTCAR")).exists() + else None + ) + structure_path = Path(zpath(dir_name / "POSCAR")) + vasprun_path = Path(zpath(dir_name / "vasprun.xml")) + + calc_quality_kwargs = {} if calc_quality_kwargs is None else calc_quality_kwargs + cal_quality_dict = Analysis.get_lobster_calc_quality_summary( + path_to_poscar=structure_path, + path_to_vasprun=vasprun_path, + path_to_charge=charge_path, + path_to_potcar=potcar_path, + path_to_doscar=doscar_path, + path_to_lobsterin=lobsterin_path, + path_to_lobsterout=lobsterout_path, + path_to_bandoverlaps=band_overlaps_path, + **calc_quality_kwargs, + ) + return CalcQualitySummary(**cal_quality_dict) class StrongestBonds(BaseModel): @@ -310,117 +584,123 @@ class StrongestBonds(BaseModel): LobsterPy is used for the extraction. """ - which_bonds: str = Field( + which_bonds: Optional[str] = Field( None, description="Denotes whether the information " "is for cation-anion pairs or all bonds", ) - are_coops: bool = Field( - None, description="Denotes whether the file consists of ICOOPs" - ) - are_cobis: bool = Field( - None, description="Denotes whether the file consists of ICOBIs" - ) - strongest_bonds: dict = Field( + are_coops: bool = Field(description="Denotes whether the file consists of ICOOPs") + are_cobis: bool = Field(escription="Denotes whether the file consists of ICOBIs") + strongest_bonds: Optional[dict] = Field( None, description="Dict with infos on bond strength and bond length,.", ) -class LobsterTaskDocument(StructureMetadata): +class LobsterTaskDocument(StructureMetadata, extra="allow"): # type: ignore[call-arg] """Definition of LOBSTER task document.""" - structure: Structure = Field(None, description="The structure used in this task") - dir_name: Any = Field(None, description="The directory for this Lobster task") + structure: Structure = Field(description="The structure used in this task") + dir_name: Union[str, Path] = Field( + description="The directory for this Lobster task" + ) last_updated: str = Field( default_factory=datetime_str, description="Timestamp for this task document was last updated", ) - charges: dict = Field( + charges: Optional[dict] = Field( None, description="Atomic charges dict from LOBSTER" " based on Mulliken and Loewdin charge analysis", ) - lobsterout: LobsteroutModel = Field(None, description="Lobster out data") - lobsterin: LobsterinModel = Field(None, description="Lobster calculation inputs") + lobsterout: LobsteroutModel = Field(description="Lobster out data") + lobsterin: LobsterinModel = Field(description="Lobster calculation inputs") lobsterpy_data: CondensedBondingAnalysis = Field( - None, description="Model describing the LobsterPy data" + description="Model describing the LobsterPy data" ) lobsterpy_text: str = Field( - None, - description="Stores LobsterPy automatic analysis summary text", + description="Stores LobsterPy automatic analysis summary text" + ) + calc_quality_summary: CalcQualitySummary = Field( + description="Model summarizing results of lobster runs like charge spillings, " + "band overlaps, DOS comparisons with VASP runs and quantum chemical LOBSTER " + "charge sign comparisons with BVA method" ) - strongest_bonds_icohp: StrongestBonds = Field( + calc_quality_text: str = Field( + description="Stores calculation quality analysis summary text" + ) + strongest_bonds_icohp: Optional[StrongestBonds] = Field( None, description="Describes the strongest cation-anion ICOHP bonds" ) - strongest_bonds_icoop: StrongestBonds = Field( + strongest_bonds_icoop: Optional[StrongestBonds] = Field( None, description="Describes the strongest cation-anion ICOOP bonds" ) - strongest_bonds_icobi: StrongestBonds = Field( + strongest_bonds_icobi: Optional[StrongestBonds] = Field( None, description="Describes the strongest cation-anion ICOBI bonds" ) - lobsterpy_data_cation_anion: CondensedBondingAnalysis = Field( + lobsterpy_data_cation_anion: Optional[CondensedBondingAnalysis] = Field( None, description="Model describing the LobsterPy data" ) - lobsterpy_text_cation_anion: str = Field( + lobsterpy_text_cation_anion: Optional[str] = Field( None, description="Stores LobsterPy automatic analysis summary text", ) - strongest_bonds_icohp_cation_anion: StrongestBonds = Field( + strongest_bonds_icohp_cation_anion: Optional[StrongestBonds] = Field( None, description="Describes the strongest cation-anion ICOHP bonds" ) - strongest_bonds_icoop_cation_anion: StrongestBonds = Field( + strongest_bonds_icoop_cation_anion: Optional[StrongestBonds] = Field( None, description="Describes the strongest cation-anion ICOOP bonds" ) - strongest_bonds_icobi_cation_anion: StrongestBonds = Field( + strongest_bonds_icobi_cation_anion: Optional[StrongestBonds] = Field( None, description="Describes the strongest cation-anion ICOBI bonds" ) - - cohp_data: CompleteCohp = Field( - None, description="pymatgen CompleteCohp object with COHP data" - ) - coop_data: CompleteCohp = Field( - None, description="pymatgen CompleteCohp object with COOP data" - ) - cobi_data: CompleteCohp = Field( - None, description="pymatgen CompleteCohp object with COBI data" - ) - dos: LobsterCompleteDos = Field( + dos: Optional[LobsterCompleteDos] = Field( None, description="pymatgen pymatgen.io.lobster.Doscar.completedos data" ) lso_dos: Optional[LobsterCompleteDos] = Field( None, description="pymatgen pymatgen.io.lobster.Doscar.completedos data" ) - madelung_energies: dict = Field( + madelung_energies: Optional[dict] = Field( None, description="Madelung energies dict from" " LOBSTER based on Mulliken and Loewdin charges", ) - site_potentials: dict = Field( + site_potentials: Optional[dict] = Field( None, description="Site potentials dict from" " LOBSTER based on Mulliken and Loewdin charges", ) - - gross_populations: dict = Field( + gross_populations: Optional[dict] = Field( None, description="Gross populations dict from" " LOBSTER based on Mulliken and Loewdin charges with" "each site as a key and the gross population as a value.", ) - band_overlaps: Optional[dict] = Field( None, description="Band overlaps data for each k-point from" " bandOverlaps.lobster file if it exists", ) + cohp_data: Optional[CompleteCohp] = Field( + None, description="pymatgen CompleteCohp object with COHP data" + ) + coop_data: Optional[CompleteCohp] = Field( + None, description="pymatgen CompleteCohp object with COOP data" + ) + cobi_data: Optional[CompleteCohp] = Field( + None, description="pymatgen CompleteCohp object with COBI data" + ) schema: str = Field( __version__, description="Version of atomate2 used to create the document" ) @classmethod - @requires(Analysis, "lobsterpy must be installed to create an LobsterTaskDocument.") + @requires( + Analysis, + "LobsterTaskDocument requires `lobsterpy` and `ijson` to function properly. " + "Please reinstall atomate2 using atomate2[lobster]", + ) def from_directory( cls, dir_name: Union[Path, str], @@ -428,56 +708,70 @@ def from_directory( store_lso_dos: bool = False, save_cohp_plots: bool = True, plot_kwargs: dict = None, + calc_quality_kwargs: dict = None, + save_cba_jsons: bool = True, + add_coxxcar_to_task_document: bool = True, + save_computational_data_jsons: bool = True, ) -> "LobsterTaskDocument": """ Create a task document from a directory containing LOBSTER files. Parameters ---------- - dir_name : path or str + dir_name : path or str. The path to the folder containing the calculation outputs. - additional_fields : dict + additional_fields : dict. Dictionary of additional fields to add to output document. - store_lso_dos : bool + store_lso_dos : bool. Whether to store the LSO DOS. - save_cohp_plots : bool + save_cohp_plots : bool. Bool to indicate whether automatic cohp plots and jsons from lobsterpy will be generated. - plot_kwargs : dict + plot_kwargs : dict. kwargs to change plotting options in lobsterpy. + calc_quality_kwargs : dict. + kwargs to change calc quality summary options in lobsterpy. + save_cba_jsons : bool. + Bool to indicate whether condensed bonding analysis jsons + should be saved, consists of outputs from lobsterpy analysis, + calculation quality summary, lobster dos, charges and madelung energies + add_coxxcar_to_task_document : bool. + Bool to indicate whether to add COHPCAR, COOPCAR, COBICAR data objects + to the task document + save_computational_data_jsons : bool. + Bool to indicate whether computational data jsons + should be saved Returns ------- LobsterTaskDocument A task document for the lobster calculation. """ - additional_fields = additional_fields or {} + additional_fields = {} if additional_fields is None else additional_fields dir_name = Path(dir_name) # Read in lobsterout and lobsterin - lobsterout_doc = Lobsterout(dir_name / "lobsterout.gz").get_doc() + lobsterout_doc = Lobsterout(Path(zpath(dir_name / "lobsterout"))).get_doc() lobster_out = LobsteroutModel(**lobsterout_doc) - lobster_in = LobsterinModel(**Lobsterin.from_file(dir_name / "lobsterin.gz")) - - icohplist_path = dir_name / "ICOHPLIST.lobster.gz" - cohpcar_path = dir_name / "COHPCAR.lobster.gz" - charge_path = dir_name / "CHARGE.lobster.gz" - cobicar_path = dir_name / "COBICAR.lobster.gz" - coopcar_path = dir_name / "COOPCAR.lobster.gz" - doscar_path = dir_name / "DOSCAR.lobster.gz" - structure_path = dir_name / "POSCAR.gz" - madelung_energies_path = dir_name / "MadelungEnergies.lobster.gz" - site_potentials_path = dir_name / "SitePotentials.lobster.gz" - gross_populations_path = dir_name / "GROSSPOP.lobster.gz" - band_overlaps_path = dir_name / "bandOverlaps.lobster.gz" + lobster_in = LobsterinModel( + **Lobsterin.from_file(Path(zpath(dir_name / "lobsterin"))) + ) + + icohplist_path = Path(zpath(dir_name / "ICOHPLIST.lobster")) + cohpcar_path = Path(zpath(dir_name / "COHPCAR.lobster")) + charge_path = Path(zpath(dir_name / "CHARGE.lobster")) + cobicar_path = Path(zpath(dir_name / "COBICAR.lobster")) + coopcar_path = Path(zpath(dir_name / "COOPCAR.lobster")) + doscar_path = Path(zpath(dir_name / "DOSCAR.lobster")) + structure_path = Path(zpath(dir_name / "POSCAR")) + madelung_energies_path = Path(zpath(dir_name / "MadelungEnergies.lobster")) + site_potentials_path = Path(zpath(dir_name / "SitePotentials.lobster")) + gross_populations_path = Path(zpath(dir_name / "GROSSPOP.lobster")) + band_overlaps_path = Path(zpath(dir_name / "bandOverlaps.lobster")) # Do automatic bonding analysis with LobsterPy condensed_bonding_analysis = None - sb_icobi = None - sb_icohp = None - sb_icoop = None - struct = None - describe = None + sb_icobi = sb_icohp = sb_icoop = describe = None struct = Structure.from_file(structure_path) # will perform two condensed bonding analysis computations @@ -506,43 +800,30 @@ def from_directory( plot_kwargs=plot_kwargs, which_bonds="cation-anion", ) + # Get lobster calculation quality summary data + calc_quality_kwargs_default = { + "e_range": [-20, 0], + "dos_comparison": True, + "n_bins": 256, + "bva_comp": True, + **(calc_quality_kwargs or {}), + } + + calc_quality_summary = CalcQualitySummary.from_directory( + dir_name, + calc_quality_kwargs=calc_quality_kwargs_default, + ) + + calc_quality_text = Description.get_calc_quality_description( + calc_quality_summary.model_dump() + ) + # Read in charges charges = None if charge_path.exists(): charge = Charge(charge_path) charges = {"Mulliken": charge.Mulliken, "Loewdin": charge.Loewdin} - # Read in COHP, COBI, COOP plots - cohp_obj = None - if cohpcar_path.exists(): - cohp_obj = CompleteCohp.from_file( - fmt="LOBSTER", - structure_file=structure_path, - filename=cohpcar_path, - are_coops=False, - are_cobis=False, - ) - - coop_obj = None - if coopcar_path.exists(): - coop_obj = CompleteCohp.from_file( - fmt="LOBSTER", - structure_file=structure_path, - filename=coopcar_path, - are_coops=True, - are_cobis=False, - ) - - cobi_obj = None - if cobicar_path.exists(): - cobi_obj = CompleteCohp.from_file( - fmt="LOBSTER", - structure_file=structure_path, - filename=cobicar_path, - are_coops=False, - are_cobis=True, - ) - # Read in DOS dos = None if doscar_path.exists(): @@ -551,7 +832,7 @@ def from_directory( # Read in LSO DOS lso_dos = None - doscar_lso_path = dir_name / "DOSCAR.LSO.lobster.gz" + doscar_lso_path = Path(zpath(dir_name / "DOSCAR.LSO.lobster")) if store_lso_dos and doscar_lso_path.exists(): doscar_lso_lobster = Doscar( doscar=doscar_lso_path, structure_file=structure_path @@ -600,6 +881,39 @@ def from_directory( for spin, value in band_overlaps_obj.bandoverlapsdict.items(): band_overlaps[str(spin.value)] = value + # Read in COHPCAR, COBICAR, COOPCAR + cohp_obj = None + coop_obj = None + cobi_obj = None + + if add_coxxcar_to_task_document: + if cohpcar_path.exists(): + cohp_obj = CompleteCohp.from_file( + fmt="LOBSTER", + structure_file=structure_path, + filename=cohpcar_path, + are_coops=False, + are_cobis=False, + ) + + if coopcar_path.exists(): + coop_obj = CompleteCohp.from_file( + fmt="LOBSTER", + structure_file=structure_path, + filename=coopcar_path, + are_coops=True, + are_cobis=False, + ) + + if cobicar_path.exists(): + cobi_obj = CompleteCohp.from_file( + fmt="LOBSTER", + structure_file=structure_path, + filename=cobicar_path, + are_coops=False, + are_cobis=True, + ) + doc = cls.from_structure( structure=struct, meta_structure=struct, @@ -619,10 +933,8 @@ def from_directory( strongest_bonds_icohp_cation_anion=sb_icohp_ionic, strongest_bonds_icoop_cation_anion=sb_icoop_ionic, strongest_bonds_icobi_cation_anion=sb_icobi_ionic, - # include additional fields for all bonds - cohp_data=cohp_obj, - coop_data=coop_obj, - cobi_data=cobi_obj, + calc_quality_summary=calc_quality_summary, + calc_quality_text=" ".join(calc_quality_text), dos=dos, lso_dos=lso_dos, charges=charges, @@ -630,8 +942,215 @@ def from_directory( site_potentials=site_potentials, gross_populations=gross_populations, band_overlaps=band_overlaps, + # include additional fields for all bonds + cohp_data=cohp_obj, + coop_data=coop_obj, + cobi_data=cobi_obj, ) - return doc.copy(update=additional_fields) + + if save_cba_jsons: + cba_json_save_dir = dir_name / "cba.json.gz" + with gzip.open(cba_json_save_dir, "wt", encoding="UTF-8") as file: + # Write the json in iterable format + # (Necessary to load large JSON files via ijson) + file.write("[") + if ( + doc.lobsterpy_data_cation_anion is not None + ): # check if cation-anion analysis failed + lobsterpy_analysis_type = ( + doc.lobsterpy_data_cation_anion.which_bonds.replace("-", "_") + ) + data = { + f"{lobsterpy_analysis_type}_bonds": { + "lobsterpy_data": doc.lobsterpy_data_cation_anion, + "lobsterpy_text": [ + "".join(doc.lobsterpy_text_cation_anion) + ], + "sb_icobi": doc.strongest_bonds_icobi_cation_anion, + "sb_icohp": doc.strongest_bonds_icohp_cation_anion, + "sb_icoop": doc.strongest_bonds_icoop_cation_anion, + } + } + else: + data = {"cation_anion_bonds": {}} + monty_encoded_json_doc = jsanitize( + data, allow_bson=True, strict=True, enum_values=True + ) + json.dump(monty_encoded_json_doc, file) + file.write(",") + # add all-bonds data + lobsterpy_analysis_type = doc.lobsterpy_data.which_bonds + data = { + f"{lobsterpy_analysis_type}_bonds": { + "lobsterpy_data": doc.lobsterpy_data, + "lobsterpy_text": ["".join(doc.lobsterpy_text)], + "sb_icobi": doc.strongest_bonds_icobi, + "sb_icohp": doc.strongest_bonds_icohp, + "sb_icoop": doc.strongest_bonds_icoop, + } + } + monty_encoded_json_doc = jsanitize( + data, allow_bson=True, strict=True, enum_values=True + ) + json.dump(monty_encoded_json_doc, file) + file.write(",") + data = { + "madelung_energies": doc.madelung_energies + } # add madelung energies + monty_encoded_json_doc = jsanitize( + data, allow_bson=True, strict=True, enum_values=True + ) + json.dump(monty_encoded_json_doc, file) + file.write(",") + data = {"charges": doc.charges} # add charges + monty_encoded_json_doc = jsanitize( + data, allow_bson=True, strict=True, enum_values=True + ) + json.dump(monty_encoded_json_doc, file) + file.write(",") + data = { + "calc_quality_summary": doc.calc_quality_summary + } # add calc quality summary dict + monty_encoded_json_doc = jsanitize( + data, allow_bson=True, strict=True, enum_values=True + ) + json.dump(monty_encoded_json_doc, file) + file.write(",") + data = { + "calc_quality_text": ["".join(doc.calc_quality_text)] # type: ignore[dict-item] + } # add calc quality summary dict + monty_encoded_json_doc = jsanitize( + data, allow_bson=True, strict=True, enum_values=True + ) + json.dump(monty_encoded_json_doc, file) + file.write(",") + data = {"dos": doc.dos} # add NON LSO of lobster + monty_encoded_json_doc = jsanitize( + data, allow_bson=True, strict=True, enum_values=True + ) + json.dump(monty_encoded_json_doc, file) + file.write(",") + data = {"lso_dos": doc.lso_dos} # add LSO DOS of lobster + monty_encoded_json_doc = jsanitize( + data, allow_bson=True, strict=True, enum_values=True + ) + json.dump(monty_encoded_json_doc, file) + file.write(",") + data = {"builder_meta": doc.builder_meta} # add builder metadata + monty_encoded_json_doc = jsanitize( + data, allow_bson=False, strict=True, enum_values=True + ) + json.dump(monty_encoded_json_doc, file) + del data, monty_encoded_json_doc + file.write("]") + + if save_computational_data_jsons: + computational_data_json_save_dir = dir_name / "computational_data.json.gz" + fields_to_exclude = [ + "nsites", + "elements", + "nelements", + "formula_anonymous", + "chemsys", + "volume", + "density", + "density_atomic", + "symmetry", + ] + # Always add cohp, cobi and coop data to the jsons if files exists + if cohpcar_path.exists() and doc.cohp_data is None: + cohp_obj = CompleteCohp.from_file( + fmt="LOBSTER", + structure_file=structure_path, + filename=cohpcar_path, + are_coops=False, + are_cobis=False, + ) + doc.cohp_data = cohp_obj + + if coopcar_path.exists() and doc.coop_data is None: + coop_obj = CompleteCohp.from_file( + fmt="LOBSTER", + structure_file=structure_path, + filename=coopcar_path, + are_coops=True, + are_cobis=False, + ) + doc.coop_data = coop_obj + + if cobicar_path.exists() and doc.cobi_data is None: + cobi_obj = CompleteCohp.from_file( + fmt="LOBSTER", + structure_file=structure_path, + filename=cobicar_path, + are_coops=False, + are_cobis=True, + ) + doc.cobi_data = cobi_obj + with gzip.open( + computational_data_json_save_dir, "wt", encoding="UTF-8" + ) as file: + # Write the json in iterable format + # (Necessary to load large JSON files via ijson) + file.write("[") + for attribute in doc.model_fields: + if attribute not in fields_to_exclude: + # Use monty encoder to automatically convert pymatgen + # objects and other data json compatible dict format + data = { + attribute: jsanitize( + getattr(doc, attribute), + allow_bson=False, + strict=True, + enum_values=True, + ) + } + json.dump(data, file) + if attribute != list(doc.model_fields.keys())[-1]: + file.write(",") # add comma separator between two dicts + del data + file.write("]") + + # Again unset the cohp, cobi and coop data fields if not desired in the DB + if not add_coxxcar_to_task_document: + doc.cohp_data = None + doc.coop_data = None + doc.cobi_data = None + + return doc.model_copy(update=additional_fields) + + +def _replace_inf_values(data: Union[dict[Any, Any], list[Any]]) -> None: + """ + Replace the -inf value in dictionary and with the string representation '-Infinity'. + + Parameters + ---------- + data : dict + dictionary to recursively iterate over + + Returns + ------- + data + Dictionary with replaced -inf values. + + """ + if isinstance(data, dict): + for key, value in data.items(): + if isinstance(value, (dict, list)): + _replace_inf_values( + value + ) # Recursively process nested dictionaries and lists + elif value == float("-inf"): + data[key] = "-Infinity" # Replace -inf with a string representation + elif isinstance(data, list): + for index, item in enumerate(data): + if isinstance(item, (dict, list)): + _replace_inf_values( + item + ) # Recursively process nested dictionaries and lists + elif item == float("-inf"): + data[index] = "-Infinity" # Replace -inf with a string representation def _identify_strongest_bonds( @@ -700,19 +1219,19 @@ def _get_strong_bonds( Parameters ---------- - bondlist : dict + bondlist : dict. dict including bonding information - are_cobis : bool + are_cobis : bool. True if these are cobis - are_coops : bool + are_coops : bool. True if these are coops - relevant_bonds : dict + relevant_bonds : dict. Dict include all bonds that are considered. Returns ------- dict - Dictionary including strongest bonds. + Dictionary including the strongest bonds. """ bonds = [] icohp_all = [] @@ -731,11 +1250,11 @@ def _get_strong_bonds( sep_icohp: list[list[float]] = [[] for _ in range(len(bond_labels_unique))] sep_lengths: list[list[float]] = [[] for _ in range(len(bond_labels_unique))] - for i, val in enumerate(bond_labels_unique): + for idx, val in enumerate(bond_labels_unique): for j, val2 in enumerate(bonds): if val == val2: - sep_icohp[i].append(icohp_all[j]) - sep_lengths[i].append(lengths[j]) + sep_icohp[idx].append(icohp_all[j]) + sep_lengths[idx].append(lengths[j]) if are_cobis and not are_coops: prop = "ICOBI" @@ -745,7 +1264,7 @@ def _get_strong_bonds( prop = "ICOHP" bond_dict = {} - for i, lab in enumerate(bond_labels_unique): + for idx, lab in enumerate(bond_labels_unique): label = lab.split("-") label.sort() for rel_bnd in relevant_bonds: @@ -753,23 +1272,72 @@ def _get_strong_bonds( rel_bnd_list.sort() if label == rel_bnd_list: if prop == "ICOHP": - index = np.argmin(sep_icohp[i]) + index = np.argmin(sep_icohp[idx]) bond_dict.update( { rel_bnd: { - prop: min(sep_icohp[i]), - "length": sep_lengths[i][index], + prop: min(sep_icohp[idx]), + "length": sep_lengths[idx][index], } } ) else: - index = np.argmax(sep_icohp[i]) + index = np.argmax(sep_icohp[idx]) bond_dict.update( { rel_bnd: { - prop: max(sep_icohp[i]), - "length": sep_lengths[i][index], + prop: max(sep_icohp[idx]), + "length": sep_lengths[idx][index], } } ) return bond_dict + + +def read_saved_json( + filename: str, pymatgen_objs: bool = True, query: str = "structure" +) -> dict[str, Any]: + """ + Read the data from *.json.gz file corresponding to query. + + Uses ijson to parse specific keys(memory efficient) + + Parameters + ---------- + filename: str. + name of the json file to read + pymatgen_objs: bool. + if True will convert structure,coop, cobi, cohp and dos to pymatgen objects + query: str or None. + field name to query from the json file. If None, all data will be returned. + + Returns + ------- + dict + Returns a dictionary with lobster task json data corresponding to query. + """ + with gzip.open(filename, "rb") as file: + lobster_data = { + field: data + for obj in ijson.items(file, "item", use_float=True) + for field, data in obj.items() + if query is None or query in obj + } + if not lobster_data: + raise ValueError( + "Please recheck the query argument. " + f"No data associated to the requested 'query={query}' " + f"found in the JSON file" + ) + if pymatgen_objs: + for query_key, value in lobster_data.items(): + if isinstance(value, dict): + lobster_data[query_key] = MontyDecoder().process_decoded(value) + elif "lobsterpy_data" in query_key: + for field in lobster_data[query_key].__fields__: + val = MontyDecoder().process_decoded( + getattr(lobster_data[query_key], field) + ) + setattr(lobster_data[query_key], field, val) + + return lobster_data diff --git a/src/atomate2/settings.py b/src/atomate2/settings.py index 8d21c8931f..c8699218ee 100644 --- a/src/atomate2/settings.py +++ b/src/atomate2/settings.py @@ -1,9 +1,10 @@ """Settings for atomate2.""" + from __future__ import annotations import warnings from pathlib import Path -from typing import Literal, Optional, Union +from typing import Any, Literal, Optional, Union from pydantic import Field, model_validator from pydantic_settings import BaseSettings, SettingsConfigDict @@ -84,6 +85,18 @@ class Atomate2Settings(BaseSettings): description="Whether to run the Bader program when parsing VASP calculations." "Requires the bader executable to be on the path.", ) + VASP_RUN_DDEC6: bool = Field( + default=False, + description="Whether to run the DDEC6 program when parsing VASP calculations." + "Requires the chargemol executable to be on the path.", + ) + DDEC6_ATOMIC_DENSITIES_DIR: Optional[str] = Field( + default=None, + description="Directory where the atomic densities are stored.", + # TODO uncomment below once that functionality is actually implemented + # If not set, pymatgen tries to auto-download the densities and extract them + # into ~/.cache/pymatgen/ddec + ) VASP_ZIP_FILES: Union[bool, Literal["atomate"]] = Field( "atomate", @@ -92,7 +105,7 @@ class Atomate2Settings(BaseSettings): "to the simulation will be compressed. If False no file is compressed.", ) VASP_INHERIT_INCAR: bool = Field( - default=True, + default=False, description="Whether to inherit INCAR settings from previous calculation. " "This might be useful to port Custodian fixes to child jobs but can also be " "dangerous e.g. when switching from GGA to meta-GGA or relax to static jobs." @@ -162,6 +175,11 @@ class Atomate2Settings(BaseSettings): "to the simulation will be compressed. If False no file is compressed.", ) + # FHI-aims settings + AIMS_CMD: str = Field( + "aims.x > aims.out", description="The default command used run FHI-aims" + ) + # Elastic constant settings ELASTIC_FITTING_METHOD: str = Field( "finite_difference", description="Elastic constant fitting method" @@ -176,7 +194,7 @@ class Atomate2Settings(BaseSettings): @model_validator(mode="before") @classmethod - def load_default_settings(cls, values) -> dict: + def load_default_settings(cls, values: dict[str, Any]) -> dict[str, Any]: """ Load settings from file or environment variables. diff --git a/src/atomate2/utils/file_client.py b/src/atomate2/utils/file_client.py index 7529feb408..06a1726418 100644 --- a/src/atomate2/utils/file_client.py +++ b/src/atomate2/utils/file_client.py @@ -10,12 +10,15 @@ from glob import glob from gzip import GzipFile from pathlib import Path -from typing import Any, Callable +from typing import TYPE_CHECKING, Any, Callable import paramiko from monty.io import zopen from paramiko import SFTPClient, SSHClient +if TYPE_CHECKING: + from types import TracebackType + class FileClient: """ @@ -136,9 +139,9 @@ def exists(self, path: str | Path, host: str | None = None) -> bool: path = str(self.abspath(path, host=host)) try: self.get_sftp(host).stat(path) - return True except FileNotFoundError: return False + return True def is_file(self, path: str | Path, host: str | None = None) -> bool: """ @@ -408,7 +411,7 @@ def gzip( path.unlink() else: ssh = self.get_ssh(host) - _, stdout, _ = ssh.exec_command(f"gzip -f {path!s}") + _, _stdout, _ = ssh.exec_command(f"gzip -f {path!s}") def gunzip( self, @@ -462,7 +465,7 @@ def gunzip( path.unlink() else: ssh = self.get_ssh(host) - _, stdout, _ = ssh.exec_command(f"gunzip -f {path!s}") + _stdin, _stdout, _stderr = ssh.exec_command(f"gunzip -f {path!s}") def close(self) -> None: """Close all connections.""" @@ -471,11 +474,16 @@ def close(self) -> None: connection["sftp"].close() self.connections = {} - def __enter__(self): + def __enter__(self) -> FileClient: # noqa: PYI034 """Support for "with" context.""" return self - def __exit__(self, exc_type, exc_val, exc_tb) -> None: + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: """Support for "with" context.""" self.close() @@ -531,7 +539,7 @@ def get_ssh_connection( return client -def auto_fileclient(method: Callable | None = None): +def auto_fileclient(method: Callable | None = None) -> Callable: """ Automatically pass a FileClient to the function if not already present in kwargs. @@ -547,9 +555,9 @@ def auto_fileclient(method: Callable | None = None): by the decorator. """ - def decorator(func): + def decorator(func: Callable) -> Callable: @wraps(func) - def gen_fileclient(*args, **kwargs): + def gen_fileclient(*args, **kwargs) -> Any: file_client = kwargs.get("file_client") if file_client is None: with FileClient() as file_client: diff --git a/src/atomate2/vasp/drones.py b/src/atomate2/vasp/drones.py index 27bcd649bf..dfe92f4b7e 100644 --- a/src/atomate2/vasp/drones.py +++ b/src/atomate2/vasp/drones.py @@ -47,7 +47,9 @@ def assimilate(self, path: str | Path | None = None) -> TaskDoc: except Exception: import traceback - logger.error(f"Error in {Path(path).absolute()}\n{traceback.format_exc()}") + logger.exception( + f"Error in {Path(path).absolute()}\n{traceback.format_exc()}" + ) raise return doc diff --git a/src/atomate2/vasp/files.py b/src/atomate2/vasp/files.py index 0c5be5a104..016a71dee0 100644 --- a/src/atomate2/vasp/files.py +++ b/src/atomate2/vasp/files.py @@ -79,7 +79,7 @@ def copy_vasp_outputs( # find optional files; do not fail if KPOINTS is missing, this might be KSPACING # note: POTCAR files never have the relax extension, whereas KPOINTS files should optional_files = [] - for file in ["POTCAR", "POTCAR.spec", "KPOINTS" + relax_ext]: + for file in ("POTCAR", "POTCAR.spec", "KPOINTS" + relax_ext): found_file = get_zfile(directory_listing, file, allow_missing=True) if found_file is not None: optional_files.append(found_file) @@ -150,7 +150,7 @@ def get_largest_relax_extension( return "" numbers = [re.search(r".relax(\d+)", file.name).group(1) for file in relax_files] - max_relax = max(numbers, key=lambda x: int(x)) + max_relax = max(numbers, key=int) return f".relax{max_relax}" diff --git a/src/atomate2/vasp/flows/amset.py b/src/atomate2/vasp/flows/amset.py index 30a21864cb..cfc4ef1966 100644 --- a/src/atomate2/vasp/flows/amset.py +++ b/src/atomate2/vasp/flows/amset.py @@ -86,7 +86,7 @@ class DeformationPotentialMaker(Maker): def make( self, structure: Structure, - prev_vasp_dir: str | Path | None = None, + prev_dir: str | Path | None = None, ibands: tuple[list[int], list[int]] = None, ) -> Flow: """ @@ -96,16 +96,14 @@ def make( ---------- structure : .Structure A pymatgen structure. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous vasp calculation directory to use for copying outputs. ibands : tuple of list of int Which bands to include in the deformation.h5 file. Given as a tuple of one or two lists (one for each spin channel). The bands indices are zero indexed. """ - bulk = self.static_deformation_maker.make( - structure, prev_vasp_dir=prev_vasp_dir - ) + bulk = self.static_deformation_maker.make(structure, prev_dir=prev_dir) bulk.append_name("bulk ", prepend=True) # all deformation calculations need to be on the same k-point mesh, to achieve @@ -118,7 +116,7 @@ def make( vasp_deformation_calcs = run_amset_deformations( bulk.output.structure, symprec=self.symprec, - prev_vasp_dir=bulk.output.dir_name, + prev_dir=bulk.output.dir_name, static_deformation_maker=self.static_deformation_maker, ) @@ -205,7 +203,7 @@ class VaspAmsetMaker(Maker): def make( self, structure: Structure, - prev_vasp_dir: str | Path | None = None, + prev_dir: str | Path | None = None, ) -> Flow: """ Make flow to calculate electronic transport properties using AMSET and VASP. @@ -214,23 +212,23 @@ def make( ---------- structure : .Structure A pymatgen structure. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous vasp calculation directory to use for copying outputs. """ jobs = [] if self.relax_maker is not None: # optionally relax the structure - bulk = self.relax_maker.make(structure, prev_vasp_dir=prev_vasp_dir) + bulk = self.relax_maker.make(structure, prev_dir=prev_dir) jobs.append(bulk) structure = bulk.output.structure - prev_vasp_dir = bulk.output.dir_name + prev_dir = bulk.output.dir_name - static = self.static_maker.make(structure, prev_vasp_dir=prev_vasp_dir) + static = self.static_maker.make(structure, prev_dir=prev_dir) # dense band structure for eigenvalues and wave functions dense_bs = self.dense_uniform_maker.make( - static.output.structure, prev_vasp_dir=static.output.dir_name + static.output.structure, prev_dir=static.output.dir_name ) # elastic constant @@ -242,7 +240,7 @@ def make( # dielectric constant dielectric = self.dielectric_maker.make( - static.output.structure, prev_vasp_dir=static.output.dir_name + static.output.structure, prev_dir=static.output.dir_name ) # polar phonon frequency @@ -259,7 +257,7 @@ def make( # deformation potentials deformation = self.deformation_potential_maker.make( static.output.structure, - prev_vasp_dir=static.output.dir_name, + prev_dir=static.output.dir_name, ibands=wavefunction.output["ibands"], ) @@ -303,7 +301,7 @@ def make( if self.use_hse_gap and "bandgap" not in self.amset_settings: gap = self.hse_gap_maker.make( dense_bs.output.structure, - prev_vasp_dir=dense_bs.output.dir_name, + prev_dir=dense_bs.output.dir_name, mode="gap", ) settings["bandgap"] = gap.output.output.bandgap @@ -387,7 +385,7 @@ class HSEVaspAmsetMaker(Maker): def make( self, structure: Structure, - prev_vasp_dir: str | Path | None = None, + prev_dir: str | Path | None = None, ) -> Flow: """ Make flow to calculate electronic transport properties using AMSET and VASP. @@ -396,23 +394,23 @@ def make( ---------- structure : Structure A pymatgen structure. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous vasp calculation directory to use for copying outputs. """ jobs = [] if self.relax_maker is not None: # optionally relax the structure - bulk = self.relax_maker.make(structure, prev_vasp_dir=prev_vasp_dir) + bulk = self.relax_maker.make(structure, prev_dir=prev_dir) jobs.append(bulk) structure = bulk.output.structure - prev_vasp_dir = bulk.output.dir_name + prev_dir = bulk.output.dir_name - static = self.static_maker.make(structure, prev_vasp_dir=prev_vasp_dir) + static = self.static_maker.make(structure, prev_dir=prev_dir) # dense band structure for eigenvalues and wave functions dense_bs = self.dense_uniform_maker.make( - static.output.structure, prev_vasp_dir=static.output.dir_name + static.output.structure, prev_dir=static.output.dir_name ) # elastic constant @@ -424,7 +422,7 @@ def make( # dielectric constant dielectric = self.dielectric_maker.make( - static.output.structure, prev_vasp_dir=static.output.dir_name + static.output.structure, prev_dir=static.output.dir_name ) # polar phonon frequency @@ -441,7 +439,7 @@ def make( # deformation potentials deformation = self.deformation_potential_maker.make( static.output.structure, - prev_vasp_dir=static.output.dir_name, + prev_dir=static.output.dir_name, ibands=wavefunction.output["ibands"], ) diff --git a/src/atomate2/vasp/flows/core.py b/src/atomate2/vasp/flows/core.py index 7c6b02dc1e..d04c58aba6 100644 --- a/src/atomate2/vasp/flows/core.py +++ b/src/atomate2/vasp/flows/core.py @@ -46,9 +46,7 @@ class DoubleRelaxMaker(Maker): relax_maker1: BaseVaspMaker | None = field(default_factory=RelaxMaker) relax_maker2: BaseVaspMaker = field(default_factory=RelaxMaker) - def make( - self, structure: Structure, prev_vasp_dir: str | Path | None = None - ) -> Flow: + def make(self, structure: Structure, prev_dir: str | Path | None = None) -> Flow: """ Create a flow with two chained relaxations. @@ -56,7 +54,7 @@ def make( ---------- structure : .Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. Returns @@ -67,13 +65,13 @@ def make( jobs: list[Job] = [] if self.relax_maker1: # Run a pre-relaxation - relax1 = self.relax_maker1.make(structure, prev_vasp_dir=prev_vasp_dir) + relax1 = self.relax_maker1.make(structure, prev_dir=prev_dir) relax1.name += " 1" jobs += [relax1] structure = relax1.output.structure - prev_vasp_dir = relax1.output.dir_name + prev_dir = relax1.output.dir_name - relax2 = self.relax_maker2.make(structure, prev_vasp_dir=prev_vasp_dir) + relax2 = self.relax_maker2.make(structure, prev_dir=prev_dir) relax2.name += " 2" jobs += [relax2] @@ -119,9 +117,7 @@ class BandStructureMaker(Maker): static_maker: BaseVaspMaker = field(default_factory=StaticMaker) bs_maker: BaseVaspMaker = field(default_factory=NonSCFMaker) - def make( - self, structure: Structure, prev_vasp_dir: str | Path | None = None - ) -> Flow: + def make(self, structure: Structure, prev_dir: str | Path | None = None) -> Flow: """ Create a band structure flow. @@ -129,7 +125,7 @@ def make( ---------- structure : Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. Returns @@ -137,7 +133,7 @@ def make( Flow A band structure flow. """ - static_job = self.static_maker.make(structure, prev_vasp_dir=prev_vasp_dir) + static_job = self.static_maker.make(structure, prev_dir=prev_dir) jobs = [static_job] outputs = {} @@ -145,7 +141,7 @@ def make( if bandstructure_type in ("both", "uniform"): uniform_job = self.bs_maker.make( static_job.output.structure, - prev_vasp_dir=static_job.output.dir_name, + prev_dir=static_job.output.dir_name, mode="uniform", ) uniform_job.name += " uniform" @@ -159,7 +155,7 @@ def make( if bandstructure_type in ("both", "line"): line_job = self.bs_maker.make( static_job.output.structure, - prev_vasp_dir=static_job.output.dir_name, + prev_dir=static_job.output.dir_name, mode="line", ) line_job.name += " line" @@ -198,9 +194,7 @@ class UniformBandStructureMaker(Maker): static_maker: BaseVaspMaker = field(default_factory=StaticMaker) bs_maker: BaseVaspMaker = field(default_factory=NonSCFMaker) - def make( - self, structure: Structure, prev_vasp_dir: str | Path | None = None - ) -> Flow: + def make(self, structure: Structure, prev_dir: str | Path | None = None) -> Flow: """ Create a uniform band structure flow. @@ -208,7 +202,7 @@ def make( ---------- structure : Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. Returns @@ -216,10 +210,10 @@ def make( Flow A uniform band structure flow. """ - static_job = self.static_maker.make(structure, prev_vasp_dir=prev_vasp_dir) + static_job = self.static_maker.make(structure, prev_dir=prev_dir) uniform_job = self.bs_maker.make( static_job.output.structure, - prev_vasp_dir=static_job.output.dir_name, + prev_dir=static_job.output.dir_name, mode="uniform", ) uniform_job.name += " uniform" @@ -249,9 +243,7 @@ class LineModeBandStructureMaker(Maker): static_maker: BaseVaspMaker = field(default_factory=StaticMaker) bs_maker: BaseVaspMaker = field(default_factory=NonSCFMaker) - def make( - self, structure: Structure, prev_vasp_dir: str | Path | None = None - ) -> Flow: + def make(self, structure: Structure, prev_dir: str | Path | None = None) -> Flow: """ Create a line mode band structure flow. @@ -259,7 +251,7 @@ def make( ---------- structure : Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. Returns @@ -267,10 +259,10 @@ def make( Flow A line mode band structure flow. """ - static_job = self.static_maker.make(structure, prev_vasp_dir=prev_vasp_dir) + static_job = self.static_maker.make(structure, prev_dir=prev_dir) line_job = self.bs_maker.make( static_job.output.structure, - prev_vasp_dir=static_job.output.dir_name, + prev_dir=static_job.output.dir_name, mode="line", ) line_job.name += " line" @@ -369,9 +361,7 @@ class RelaxBandStructureMaker(Maker): relax_maker: BaseVaspMaker = field(default_factory=DoubleRelaxMaker) band_structure_maker: BaseVaspMaker = field(default_factory=BandStructureMaker) - def make( - self, structure: Structure, prev_vasp_dir: str | Path | None = None - ) -> Flow: + def make(self, structure: Structure, prev_dir: str | Path | None = None) -> Flow: """ Run a relaxation and then calculate the uniform and line mode band structures. @@ -379,7 +369,7 @@ def make( ---------- structure: .Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. Returns @@ -387,9 +377,9 @@ def make( Flow A relax and band structure flow. """ - relax_job = self.relax_maker.make(structure, prev_vasp_dir=prev_vasp_dir) + relax_job = self.relax_maker.make(structure, prev_dir=prev_dir) bs_flow = self.band_structure_maker.make( - relax_job.output.structure, prev_vasp_dir=relax_job.output.dir_name + relax_job.output.structure, prev_dir=relax_job.output.dir_name ) return Flow([relax_job, bs_flow], bs_flow.output, name=self.name) @@ -429,9 +419,7 @@ class OpticsMaker(Maker): ) ) - def make( - self, structure: Structure, prev_vasp_dir: str | Path | None = None - ) -> Flow: + def make(self, structure: Structure, prev_dir: str | Path | None = None) -> Flow: """ Run a static and then a non-scf optics calculation. @@ -439,7 +427,7 @@ def make( ---------- structure: .Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. Returns @@ -447,9 +435,9 @@ def make( Flow A static and nscf with optics flow. """ - static_job = self.static_maker.make(structure, prev_vasp_dir=prev_vasp_dir) + static_job = self.static_maker.make(structure, prev_dir=prev_dir) nscf_job = self.band_structure_maker.make( - static_job.output.structure, prev_vasp_dir=static_job.output.dir_name + static_job.output.structure, prev_dir=static_job.output.dir_name ) return Flow([static_job, nscf_job], nscf_job.output, name=self.name) @@ -488,9 +476,7 @@ class HSEOpticsMaker(Maker): ) ) - def make( - self, structure: Structure, prev_vasp_dir: str | Path | None = None - ) -> Flow: + def make(self, structure: Structure, prev_dir: str | Path | None = None) -> Flow: """ Run a static and then a non-scf optics calculation. @@ -498,7 +484,7 @@ def make( ---------- structure: .Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. Returns @@ -506,8 +492,8 @@ def make( Flow A static and nscf with optics flow. """ - static_job = self.static_maker.make(structure, prev_vasp_dir=prev_vasp_dir) + static_job = self.static_maker.make(structure, prev_dir=prev_dir) bs_job = self.band_structure_maker.make( - static_job.output.structure, prev_vasp_dir=static_job.output.dir_name + static_job.output.structure, prev_dir=static_job.output.dir_name ) return Flow([static_job, bs_job], bs_job.output, name=self.name) diff --git a/src/atomate2/vasp/flows/defect.py b/src/atomate2/vasp/flows/defect.py index e60918dc2e..6e5577e5c5 100644 --- a/src/atomate2/vasp/flows/defect.py +++ b/src/atomate2/vasp/flows/defect.py @@ -4,16 +4,13 @@ import logging from dataclasses import dataclass, field -from pathlib import Path from typing import TYPE_CHECKING +from emmet.core.tasks import TaskDoc from jobflow import Flow, Maker, OutputReference from jobflow.core.maker import recursive_call -from pymatgen.io.vasp.outputs import Vasprun -from atomate2.common.files import get_zfile from atomate2.common.flows import defect as defect_flows -from atomate2.utils.file_client import FileClient from atomate2.vasp.flows.core import DoubleRelaxMaker from atomate2.vasp.jobs.core import RelaxMaker, StaticMaker from atomate2.vasp.jobs.defect import calculate_finite_diff @@ -26,6 +23,7 @@ if TYPE_CHECKING: from pymatgen.core.structure import Structure + from pymatgen.entries.computed_entries import ComputedStructureEntry from atomate2.common.schemas.defects import CCDDocument from atomate2.vasp.jobs.base import BaseVaspMaker @@ -169,7 +167,9 @@ class FormationEnergyMaker(defect_flows.FormationEnergyMaker): bulk_relax_maker: BaseVaspMaker | None = None name: str = "formation energy" - def structure_from_prv(self, previous_dir: str) -> Structure: + def sc_entry_and_locpot_from_prv( + self, previous_dir: str + ) -> tuple[ComputedStructureEntry, dict]: """Copy the output structure from previous directory. Read the vasprun.xml file from the previous directory @@ -182,15 +182,14 @@ def structure_from_prv(self, previous_dir: str) -> Structure: Returns ------- - structure: Structure + ComputedStructureEntry """ - fc = FileClient() - # strip off the `hostname:` prefix - previous_dir = previous_dir.split(":")[-1] - files = fc.listdir(previous_dir) - vasprun_file = Path(previous_dir) / get_zfile(files, "vasprun.xml") - vasprun = Vasprun(vasprun_file) - return vasprun.final_structure + task_doc = TaskDoc.from_directory(previous_dir) + return task_doc.structure_entry, task_doc.calcs_reversed[0].output.locpot + + def get_planar_locpot(self, task_doc: TaskDoc) -> dict: + """Get the planar-averaged electrostatic potential.""" + return task_doc.calcs_reversed[0].output.locpot def validate_maker(self) -> None: """Check some key settings in the relax maker. diff --git a/src/atomate2/vasp/flows/elastic.py b/src/atomate2/vasp/flows/elastic.py index 800e565eb6..442dcc14c2 100644 --- a/src/atomate2/vasp/flows/elastic.py +++ b/src/atomate2/vasp/flows/elastic.py @@ -70,7 +70,7 @@ class ElasticMaker(BaseElasticMaker): task_document_kwargs: dict = field(default_factory=dict) @property - def prev_calc_dir_argname(self): + def prev_calc_dir_argname(self) -> str: """Name of argument informing static maker of previous calculation directory. As this differs between different DFT codes (e.g., VASP, CP2K), it @@ -79,4 +79,4 @@ def prev_calc_dir_argname(self): Note: this is only applicable if a relax_maker is specified; i.e., two calculations are performed for each ordering (relax -> static) """ - return "prev_vasp_dir" + return "prev_dir" diff --git a/src/atomate2/vasp/flows/electrode.py b/src/atomate2/vasp/flows/electrode.py new file mode 100644 index 0000000000..85a40ef19d --- /dev/null +++ b/src/atomate2/vasp/flows/electrode.py @@ -0,0 +1,83 @@ +"""Flow for electrode analysis with specific VASP implementations.""" + +from __future__ import annotations + +import logging +from pathlib import Path +from typing import TYPE_CHECKING + +from pymatgen.io.vasp.outputs import Chgcar + +from atomate2.common.flows import electrode as electrode_flows +from atomate2.utils.path import strip_hostname + +if TYPE_CHECKING: + from pymatgen.io.vasp.outputs import VolumetricData + +logger = logging.getLogger(__name__) + + +class ElectrodeInsertionMaker(electrode_flows.ElectrodeInsertionMaker): + """Attempt ion insertion into a structure. + + The basic unit for cation insertion is: + [get_stable_inserted_structure]: + (static) -> (chgcar analysis) -> + N x (relax) -> (return best structure) + + The workflow is: + [relax structure] + [get_stable_inserted_structure] + [get_stable_inserted_structure] + [get_stable_inserted_structure] + ... until the insertion is no longer topotactic. + + If you use this workflow please cite the following paper: + Shen, J.-X., Horton, M., & Persson, K. A. (2020). + A charge-density-based general cation insertion algorithm for + generating new Li-ion cathode materials. + npj Computational Materials, 6(161), 1โ€”7. + doi: 10.1038/s41524-020-00422-3 + + + Attributes + ---------- + name: str + The name of the flow created by this maker. + relax_maker: RelaxMaker + A maker to perform relaxation calculations. + bulk_relax_maker: Maker + A separate maker to perform the first bulk relaxation calculation. + If None, the relax_maker will be used. + static_maker: Maker + A maker to perform static calculations. + structure_matcher: StructureMatcher + The structure matcher to use to determine if additional insertion is needed. + """ + + def get_charge_density(self, prev_dir: Path | str) -> VolumetricData: + """Get the charge density of a structure. + + Parameters + ---------- + prev_dir: + The previous directory where the static calculation was performed. + + Returns + ------- + The charge density. + """ + prev_dir = Path(strip_hostname(prev_dir)) + aeccar0 = Chgcar.from_file(prev_dir / "AECCAR0.gz") + aeccar2 = Chgcar.from_file(prev_dir / "AECCAR2.gz") + return aeccar0 + aeccar2 + + def update_static_maker(self) -> None: + """Ensure that the static maker will store the desired data.""" + store_volumetric_data = list( + self.static_maker.task_document_kwargs.get("store_volumetric_data", []) + ) + store_volumetric_data.extend(["aeccar0", "aeccar2"]) + self.static_maker.task_document_kwargs[ + "store_volumetric_data" + ] = store_volumetric_data diff --git a/src/atomate2/vasp/flows/elph.py b/src/atomate2/vasp/flows/elph.py index 977b89184b..0e2000dac3 100644 --- a/src/atomate2/vasp/flows/elph.py +++ b/src/atomate2/vasp/flows/elph.py @@ -123,9 +123,7 @@ class ElectronPhononMaker(Maker): ) ) - def make( - self, structure: Structure, prev_vasp_dir: str | Path | None = None - ) -> Flow: + def make(self, structure: Structure, prev_dir: str | Path | None = None) -> Flow: """ Create a electron-phonon coupling workflow. @@ -133,7 +131,7 @@ def make( ---------- structure: .Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. Returns @@ -145,27 +143,25 @@ def make( if self.relax_maker is not None: # optionally relax the structure - relax = self.relax_maker.make(structure, prev_vasp_dir=prev_vasp_dir) + relax = self.relax_maker.make(structure, prev_dir=prev_dir) jobs.append(relax) structure = relax.output.structure - prev_vasp_dir = relax.output.dir_name + prev_dir = relax.output.dir_name - static = self.static_maker.make(structure, prev_vasp_dir=prev_vasp_dir) + static = self.static_maker.make(structure, prev_dir=prev_dir) # update temperatures and supercell size for elph maker but make sure to not # overwrite original maker elph_maker = deepcopy(self.elph_displacement_maker) elph_maker.temperatures = self.temperatures elph_maker.min_supercell_length = self.min_supercell_length - elph = elph_maker.make( - static.output.structure, prev_vasp_dir=static.output.dir_name - ) + elph = elph_maker.make(static.output.structure, prev_dir=static.output.dir_name) # use static as prev_dir so we don't inherit elph settings; using a prev # directory is useful as we can turn off magnetism if necessary which gives a # reasonable speedup supercell_dos = self.uniform_maker.make( - elph.output.structure, prev_vasp_dir=static.output.dir_name + elph.output.structure, prev_dir=static.output.dir_name ) supercell_dos.append_name(" bulk supercell") @@ -173,7 +169,7 @@ def make( elph.output.calcs_reversed[0].output.elph_displaced_structures.temperatures, elph.output.calcs_reversed[0].output.elph_displaced_structures.structures, self.uniform_maker, - prev_vasp_dir=static.output.dir_name, + prev_dir=static.output.dir_name, original_structure=static.output.structure, supercell_structure=elph.output.structure, ) diff --git a/src/atomate2/vasp/flows/eos.py b/src/atomate2/vasp/flows/eos.py new file mode 100644 index 0000000000..269412b2eb --- /dev/null +++ b/src/atomate2/vasp/flows/eos.py @@ -0,0 +1,323 @@ +""" +Module defining equation of state workflows. + +Modeled on the atomate bulk_modulus workflows. + +Prefixes are also defined in atomate2.sets.eos and atomate2.jobs.eos: +- No prefix (EosDoubleRelaxMaker and EosMaker): atomate2 default parameters +- MPLegacy: legacy MP PBE-GGA-compatible parameters (very high k-point density) +- MPGGA: MP PBE-GGA compatible parameters +- MPMetaGGA: MP r2SCAN-meta-GGA compatible parameters +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import TYPE_CHECKING + +from atomate2.common.flows.eos import CommonEosMaker +from atomate2.vasp.flows.core import DoubleRelaxMaker +from atomate2.vasp.jobs.eos import ( + EosRelaxMaker, + MPGGAEosRelaxMaker, + MPGGAEosStaticMaker, + MPLegacyEosRelaxMaker, + MPLegacyEosStaticMaker, + MPMetaGGAEosPreRelaxMaker, + MPMetaGGAEosRelaxMaker, + MPMetaGGAEosStaticMaker, +) +from atomate2.vasp.sets.eos import ( + EosSetGenerator, + MPGGAEosRelaxSetGenerator, + MPLegacyEosRelaxSetGenerator, + MPMetaGGAEosRelaxSetGenerator, +) + +if TYPE_CHECKING: + from jobflow import Maker + + from atomate2.vasp.jobs.base import BaseVaspMaker + +# No prefix, atomate2 base parameters + + +@dataclass +class EosDoubleRelaxMaker(DoubleRelaxMaker): + """ + Workflow to generate initial double relaxation for EOS fitting. + + Parameters + ---------- + name : str + Name of the flows produced by this maker. + relax_maker1 : .BaseVaspMaker + Maker to use to generate the first relaxation. + relax_maker2 : .BaseVaspMaker + Maker to use to generate the second relaxation. + + NB: WAVECARs are copied over to speed up calculation + """ + + name: str = "EOS double relax" + relax_maker1: BaseVaspMaker | None = field(default_factory=EosRelaxMaker) + relax_maker2: BaseVaspMaker = field(default_factory=EosRelaxMaker) + + +@dataclass +class EosMaker(CommonEosMaker): + """ + Generate equation of state data with default atomate2 parameters. + + First relax a structure using relax_maker. + Then perform a series of deformations on the relaxed structure, and + evaluate single-point energies with static_maker. + + Parameters + ---------- + name : str + Name of the flows produced by this maker. + initial_relax_maker : .Maker | None + Maker to relax the input structure, defaults to None (no initial relaxation). + eos_relax_maker : .Maker + Maker to relax deformationed structures for the EOS fit. + static_maker : .Maker | None + Maker to generate statics after each relaxation, defaults to None. + strain : tuple[float] + Percentage linear strain to apply as a deformation, default = -5% to 5%. + number_of_frames : int + Number of strain calculations to do for EOS fit, default = 6. + postprocessor : .atomate2.common.jobs.EOSPostProcessor + Optional postprocessing step, defaults to + `atomate2.common.jobs.PostProcessEosEnergy`. + _store_transformation_information : .bool = False + Whether to store the information about transformations. Unfortunately + needed at present to handle issues with emmet and pydantic validation + TODO: remove this when clash is fixed + """ + + name: str = "EOS Maker" + initial_relax_maker: Maker = field(default_factory=EosDoubleRelaxMaker) + eos_relax_maker: Maker | None = field( + default_factory=lambda: EosRelaxMaker( + input_set_generator=EosSetGenerator( + user_incar_settings={"ISIF": 2}, + ) + ) + ) + + +# MPLegacy prefix: legacy MP PBE-GGA + + +@dataclass +class MPLegacyEosDoubleRelaxMaker(DoubleRelaxMaker): + """ + Workflow to generate initial MP legacy PBE-GGA double relaxation. + + Parameters + ---------- + name : str + Name of the flows produced by this maker. + relax_maker1 : .BaseVaspMaker + Maker to use to generate the first relaxation. + relax_maker2 : .BaseVaspMaker + Maker to use to generate the second relaxation. + + NB: WAVECARs are copied over to speed up calculation + """ + + name: str = "MP Legacy EOS double relax" + relax_maker1: BaseVaspMaker | None = field(default_factory=MPLegacyEosRelaxMaker) + relax_maker2: BaseVaspMaker = field(default_factory=MPLegacyEosRelaxMaker) + + +@dataclass +class MPLegacyEosMaker(CommonEosMaker): + """ + Generate equation of state data with MP legacy PBE-GGA parameters. + + First relax a structure using relax_maker. + Then perform a series of deformations on the relaxed structure, and + evaluate single-point energies with static_maker. + + Parameters + ---------- + name : str + Name of the flows produced by this maker. + initial_relax_maker : .Maker | None + Maker to relax the input structure, defaults to None (no initial relaxation). + eos_relax_maker : .Maker + Maker to relax deformationed structures for the EOS fit. + static_maker : .Maker | None + Maker to generate statics after each relaxation, defaults to None. + strain : tuple[float] + Percentage linear strain to apply as a deformation, default = -5% to 5%. + number_of_frames : int + Number of strain calculations to do for EOS fit, default = 6. + postprocessor : .atomate2.common.jobs.EOSPostProcessor + Optional postprocessing step, defaults to + `atomate2.common.jobs.PostProcessEosEnergy`. + _store_transformation_information : .bool = False + Whether to store the information about transformations. Unfortunately + needed at present to handle issues with emmet and pydantic validation + TODO: remove this when clash is fixed + """ + + name: str = "MP Legacy GGA EOS Maker" + initial_relax_maker: Maker | None = field( + default_factory=MPLegacyEosDoubleRelaxMaker + ) + eos_relax_maker: Maker | None = field( + default_factory=lambda: MPLegacyEosRelaxMaker( + input_set_generator=MPLegacyEosRelaxSetGenerator( + user_incar_settings={"ISIF": 2}, + ) + ) + ) + static_maker: Maker | None = field(default_factory=MPLegacyEosStaticMaker) + + +# MPGGA prefix: MP PBE-GGA compatible + + +@dataclass +class MPGGAEosDoubleRelaxMaker(DoubleRelaxMaker): + """ + Workflow to generate initial MP PBE-GGA double relaxation for EOS fitting. + + Parameters + ---------- + name : str + Name of the flows produced by this maker. + relax_maker1 : .BaseVaspMaker + Maker to use to generate the first relaxation. + relax_maker2 : .BaseVaspMaker + Maker to use to generate the second relaxation. + + NB: WAVECARs are copied over to speed up calculation + """ + + name: str = "MP GGA EOS double relax" + relax_maker1: BaseVaspMaker | None = field( + default_factory=lambda: MPGGAEosRelaxMaker( + input_set_generator=MPGGAEosRelaxSetGenerator( + user_incar_settings={"EDIFFG": -0.05} + ) + ) + ) + relax_maker2: BaseVaspMaker = field(default_factory=MPGGAEosRelaxMaker) + + +@dataclass +class MPGGAEosMaker(CommonEosMaker): + """ + Generate equation of state data with MP PBE-GGA parameters. + + First relax a structure using relax_maker. + Then perform a series of deformations on the relaxed structure, and + evaluate single-point energies with static_maker. + + Parameters + ---------- + name : str + Name of the flows produced by this maker. + initial_relax_maker : .Maker | None + Maker to relax the input structure, defaults to None (no initial relaxation). + eos_relax_maker : .Maker + Maker to relax deformationed structures for the EOS fit. + static_maker : .Maker | None + Maker to generate statics after each relaxation, defaults to None. + strain : tuple[float] + Percentage linear strain to apply as a deformation, default = -5% to 5%. + number_of_frames : int + Number of strain calculations to do for EOS fit, default = 6. + postprocessor : .atomate2.common.jobs.EOSPostProcessor + Optional postprocessing step, defaults to + `atomate2.common.jobs.PostProcessEosEnergy`. + _store_transformation_information : .bool = False + Whether to store the information about transformations. Unfortunately + needed at present to handle issues with emmet and pydantic validation + TODO: remove this when clash is fixed + """ + + name: str = "MP GGA EOS Maker" + initial_relax_maker: Maker | None = field(default_factory=MPGGAEosDoubleRelaxMaker) + eos_relax_maker: Maker | None = field( + default_factory=lambda: MPGGAEosRelaxMaker( + input_set_generator=MPGGAEosRelaxSetGenerator( + user_incar_settings={"ISIF": 2} + ) + ) + ) + static_maker: Maker | None = field(default_factory=MPGGAEosStaticMaker) + + +@dataclass +class MPMetaGGAEosDoubleRelaxMaker(DoubleRelaxMaker): + """ + Workflow to generate initial MP r2SCAN Meta-GGA double relaxation for EOS fitting. + + Parameters + ---------- + name : str + Name of the flows produced by this maker. + relax_maker1 : .BaseVaspMaker + Maker to use to generate the first relaxation. + relax_maker2 : .BaseVaspMaker + Maker to use to generate the second relaxation. + + NB: WAVECARs are copied over to speed up calculation + """ + + name: str = "MP Meta-GGA EOS double relax" + relax_maker1: BaseVaspMaker | None = field( + default_factory=MPMetaGGAEosPreRelaxMaker + ) + relax_maker2: BaseVaspMaker = field(default_factory=MPMetaGGAEosRelaxMaker) + + +@dataclass +class MPMetaGGAEosMaker(CommonEosMaker): + """ + Generate equation of state data with MP r2SCAN-meta-GGA parameters. + + First relax a structure using relax_maker. + Then perform a series of deformations on the relaxed structure, and + evaluate single-point energies with static_maker. + + Parameters + ---------- + name : str + Name of the flows produced by this maker. + initial_relax_maker : .Maker | None + Maker to relax the input structure, defaults to None (no initial relaxation). + eos_relax_maker : .Maker + Maker to relax deformationed structures for the EOS fit. + static_maker : .Maker | None + Maker to generate statics after each relaxation, defaults to None. + strain : tuple[float] + Percentage linear strain to apply as a deformation, default = -5% to 5%. + number_of_frames : int + Number of strain calculations to do for EOS fit, default = 6. + postprocessor : .atomate2.common.jobs.EOSPostProcessor + Optional postprocessing step, defaults to + `atomate2.common.jobs.PostProcessEosEnergy`. + _store_transformation_information : .bool = False + Whether to store the information about transformations. Unfortunately + needed at present to handle issues with emmet and pydantic validation + TODO: remove this when clash is fixed + """ + + name: str = "MP Meta-GGA EOS Maker" + initial_relax_maker: Maker | None = field( + default_factory=MPMetaGGAEosDoubleRelaxMaker + ) + eos_relax_maker: Maker | None = field( + default_factory=lambda: MPMetaGGAEosRelaxMaker( + input_set_generator=MPMetaGGAEosRelaxSetGenerator( + user_incar_settings={"ISIF": 2} + ) + ) + ) + static_maker: Maker | None = field(default_factory=MPMetaGGAEosStaticMaker) diff --git a/src/atomate2/vasp/flows/lobster.py b/src/atomate2/vasp/flows/lobster.py index 71a16452f9..e20af04076 100644 --- a/src/atomate2/vasp/flows/lobster.py +++ b/src/atomate2/vasp/flows/lobster.py @@ -6,6 +6,7 @@ from typing import TYPE_CHECKING from jobflow import Flow, Maker +from monty.dev import requires from atomate2.lobster.jobs import LobsterMaker from atomate2.vasp.flows.core import DoubleRelaxMaker, UniformBandStructureMaker @@ -18,6 +19,15 @@ ) from atomate2.vasp.sets.core import NonSCFSetGenerator, StaticSetGenerator +try: + import ijson + from lobsterpy.cohp.analyze import Analysis + from lobsterpy.cohp.describe import Description +except ImportError: + ijson = None + Analysis = None + Description = None + if TYPE_CHECKING: from pathlib import Path @@ -96,15 +106,20 @@ class VaspLobsterMaker(Maker): lobster_static_maker: BaseVaspMaker = field( default_factory=lambda: LOBSTER_UNIFORM_MAKER ) - lobster_maker: LobsterMaker | None = field(default_factory=lambda: LobsterMaker()) + lobster_maker: LobsterMaker | None = field(default_factory=LobsterMaker) delete_wavecars: bool = True address_min_basis: str | None = None address_max_basis: str | None = None + @requires( + Analysis, + "This flow requires lobsterpy and ijson to function properly. " + "Please reinstall atomate2 using atomate2[lobster]", + ) def make( self, structure: Structure, - prev_vasp_dir: str | Path | None = None, + prev_dir: str | Path | None = None, ) -> Flow: """ Make flow to calculate bonding properties. @@ -115,7 +130,7 @@ def make( A pymatgen structure. Please start with a structure that is nearly fully optimized as the internal optimizers have very strict settings! - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous vasp calculation directory to use for copying outputs. """ jobs = [] @@ -124,12 +139,12 @@ def make( optimization_dir = None optimization_uuid = None if self.relax_maker is not None: - optimization = self.relax_maker.make(structure, prev_vasp_dir=prev_vasp_dir) + optimization = self.relax_maker.make(structure, prev_dir=prev_dir) jobs.append(optimization) structure = optimization.output.structure optimization_dir = optimization.output.dir_name optimization_uuid = optimization.output.uuid - prev_vasp_dir = optimization_dir + prev_dir = optimization_dir # Information about the basis is collected basis_infos = get_basis_infos( @@ -146,7 +161,7 @@ def make( self.lobster_static_maker, basis_infos.output["nbands"], structure, - prev_vasp_dir, + prev_dir, ) jobs.append(lobster_static) lobster_static_dir = lobster_static.output.dir_name diff --git a/src/atomate2/vasp/flows/matpes.py b/src/atomate2/vasp/flows/matpes.py index fcc747abea..3736618aec 100644 --- a/src/atomate2/vasp/flows/matpes.py +++ b/src/atomate2/vasp/flows/matpes.py @@ -13,6 +13,7 @@ from jobflow import Flow, Maker from atomate2.vasp.jobs.matpes import MatPesGGAStaticMaker, MatPesMetaGGAStaticMaker +from atomate2.vasp.sets.matpes import MatPesGGAStaticSetGenerator if TYPE_CHECKING: from pathlib import Path @@ -21,7 +22,7 @@ @dataclass -class MatPesGGAPlusMetaGGAStaticMaker(Maker): +class MatPesStaticFlowMaker(Maker): """MatPES flow doing a GGA static followed by meta-GGA static. Uses the GGA WAVECAR to speed up electronic convergence on the meta-GGA static. @@ -34,35 +35,78 @@ class MatPesGGAPlusMetaGGAStaticMaker(Maker): Maker to generate the first VASP static. static2 : .BaseVaspMaker Maker to generate the second VASP static. + static3 : .BaseVaspMaker or None + Maker to generate the optional third VASP static. Defaults to GGA static with + +U corrections if structure contains elements with +U corrections, else to None. """ - name: str = "MatPES GGA plus meta-GGA static" - static1: Maker | None = field(default_factory=MatPesGGAStaticMaker) + name: str = "MatPES static flow" + static1: Maker | None = field( + default_factory=lambda: MatPesGGAStaticMaker( + input_set_generator=MatPesGGAStaticSetGenerator( + # write WAVECAR so we can use as pre-conditioned starting point for + # static2/3 + user_incar_settings={"LWAVE": True} + ), + ) + ) static2: Maker = field( default_factory=lambda: MatPesMetaGGAStaticMaker( - # could copy CHGCAR from GGA to meta-GGA directory too but is redundant - # since VASP can reconstruct it from WAVECAR + # start from pre-conditioned WAVECAR from static1 to speed up convergence + # could copy CHGCAR too but is redundant since VASP can reconstruct it from + # WAVECAR copy_vasp_kwargs={"additional_vasp_files": ("WAVECAR",)} ) ) + # optional 3rd PBE+U static in case structure contains elements with +U corrections + static3: Maker | None = field( + default_factory=lambda: MatPesGGAStaticMaker( + name="MatPES GGA+U static", + input_set_generator=MatPesGGAStaticSetGenerator( + user_incar_settings={"LDAU:": True}, # enable +U corrections + ), + copy_vasp_kwargs={"additional_vasp_files": ("WAVECAR",)}, + ) + ) - def make(self, structure: Structure, prev_vasp_dir: str | Path | None = None): + def make(self, structure: Structure, prev_dir: str | Path | None = None) -> Flow: """ - Create a flow with two chained statics. + Create a flow with MatPES statics. + + By default, a PBE static is followed by an r2SCAN static and optionally a PBE+U + static if the structure contains elements with +U corrections. The PBE static is + run with LWAVE=True so its WAVECAR can be passed as a pre-conditioned starting + point to both the r2SCAN static and the PBE+U static. Parameters ---------- structure : .Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. Returns ------- Flow - A flow containing two statics. + A flow containing 2 or 3 statics. """ - static1 = self.static1.make(structure, prev_vasp_dir=prev_vasp_dir) - static2 = self.static2.make(structure, prev_vasp_dir=static1.output.dir_name) + static1 = self.static1.make(structure, prev_dir=prev_dir) + static2 = self.static2.make(structure, prev_dir=static1.output.dir_name) output = {"static1": static1.output, "static2": static2.output} - return Flow([static1, static2], output=output, name=self.name) + jobs = [static1, static2] + + # only run 3rd static if set generator not None and structure contains at least + # one element with Hubbard +U corrections + if self.static3 is not None: + static3_config = self.static3.input_set_generator.config_dict + u_corrections = static3_config.get("INCAR", {}).get("LDAUU", {}) + elems = set(map(str, structure.elements)) + if self.static3 and any( + anion in elems and elems & {*cations} + for anion, cations in u_corrections.items() + ): + static3 = self.static3.make(structure, prev_dir=static1.output.dir_name) + output["static3"] = static3.output + jobs += [static3] + + return Flow(jobs=jobs, output=output, name=self.name) diff --git a/src/atomate2/vasp/flows/md.py b/src/atomate2/vasp/flows/md.py new file mode 100644 index 0000000000..5c481e9cf2 --- /dev/null +++ b/src/atomate2/vasp/flows/md.py @@ -0,0 +1,166 @@ +"""Flows for running molecular dynamics simulations.""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import TYPE_CHECKING + +from jobflow import Flow, Maker, OutputReference + +from atomate2.vasp.jobs.md import MDMaker, md_output +from atomate2.vasp.sets.core import MDSetGenerator + +if TYPE_CHECKING: + from pathlib import Path + + from pymatgen.core import Structure + + from atomate2.vasp.jobs.base import BaseVaspMaker + + +@dataclass +class MultiMDMaker(Maker): + """ + Maker to perform an MD run split in several steps. + + Parameters + ---------- + name : str + Name of the flows produced by this maker. + md_makers : .BaseVaspMaker + Maker to use to generate the first relaxation. + """ + + name: str = "multi md" + md_makers: list[BaseVaspMaker] = field(default_factory=lambda: [MDMaker()]) + + def make( + self, + structure: Structure, + prev_dir: str | Path | None = None, + prev_traj_ids: list[str] | None = None, + ) -> Flow: + """ + Create a flow with several chained MD runs. + + Parameters + ---------- + structure : .Structure + A pymatgen structure object. + prev_dir : str or Path or None + A previous VASP calculation directory to copy output files from. + prev_traj_ids: a list of ids of job identifying previous steps of the + MD trajectory. + + Returns + ------- + Flow + A flow containing n_runs MD calculations. + """ + md_job = None + md_jobs = [] + for idx, maker in enumerate(self.md_makers, 1): + if md_job is None: + md_structure = structure + md_prev_dir = prev_dir + else: + md_structure = md_job.output.structure + md_prev_dir = md_job.output.dir_name + md_job = maker.make(md_structure, prev_dir=md_prev_dir) + md_job.name += f" {idx}" + md_jobs.append(md_job) + + output_job = md_output( + structure=md_jobs[-1].output.structure, + vasp_dir=md_jobs[-1].output.dir_name, + traj_ids=[j.uuid for j in md_jobs], + prev_traj_ids=prev_traj_ids, + ) + output_job.name = "molecular dynamics output" + + md_jobs.append(output_job) + + return Flow(md_jobs, output_job.output, name=self.name) + + def restart_from_uuid(self, md_ref: str | OutputReference) -> Flow: + """ + Create a flow from the output reference of another MultiMDMaker. + + The last output will be used as the starting point and the reference to + all the previous steps will be included in the final document. + + Parameters + ---------- + md_ref: str or OutputReference + The reference to the output of another MultiMDMaker + + Returns + ------- + A flow containing n_runs MD calculations. + """ + if isinstance(md_ref, str): + md_ref = OutputReference(md_ref) + + return self.make( + structure=md_ref.structure, + prev_dir=md_ref.vasp_dir, + prev_traj_ids=md_ref.full_traj_ids, + ) + + @classmethod + def from_parameters( + cls, + nsteps: int, + time_step: float, + n_runs: int, + ensemble: str, + start_temp: float, + end_temp: float | None = None, + **kwargs, + ) -> MultiMDMaker: + """ + Create an instance of the Maker based on the standard parameters. + + Set values in the Flow maker, the Job Maker and the VaspInputGenerator, + using them to create the final instance of the Maker. + + Parameters + ---------- + nsteps: int + Number of time steps for simulations. The VASP `NSW` parameter. + time_step: float + The time step (in femtosecond) for the simulation. The VASP + `POTIM` parameter. + n_runs : int + Number of MD runs in the flow. + ensemble: str + Molecular dynamics ensemble to run. Options include `nvt`, `nve`, and `npt`. + start_temp: float + Starting temperature. The VASP `TEBEG` parameter. + end_temp: float or None + Final temperature. The VASP `TEEND` parameter. If None the same + as start_temp. + kwargs: + Other parameters passed + + Returns + ------- + A MultiMDMaker + """ + if end_temp is None: + end_temp = start_temp + md_makers = [] + start_temp_i = start_temp + increment = (end_temp - start_temp) / n_runs + for _ in range(n_runs): + end_temp_i = start_temp_i + increment + generator = MDSetGenerator( + nsteps=nsteps, + time_step=time_step, + ensemble=ensemble, + start_temp=start_temp_i, + end_temp=end_temp_i, + ) + md_makers.append(MDMaker(input_set_generator=generator)) + start_temp_i = end_temp_i + return cls(md_makers=md_makers, **kwargs) diff --git a/src/atomate2/vasp/flows/mp.py b/src/atomate2/vasp/flows/mp.py index 8d82968718..b7c8c84b0c 100644 --- a/src/atomate2/vasp/flows/mp.py +++ b/src/atomate2/vasp/flows/mp.py @@ -8,12 +8,15 @@ from __future__ import annotations +import logging from dataclasses import dataclass, field from typing import TYPE_CHECKING from jobflow import Flow, Maker +from atomate2.lobster.jobs import LobsterMaker from atomate2.vasp.flows.core import DoubleRelaxMaker +from atomate2.vasp.flows.lobster import VaspLobsterMaker from atomate2.vasp.jobs.mp import ( MPGGARelaxMaker, MPGGAStaticMaker, @@ -21,13 +24,17 @@ MPMetaGGAStaticMaker, MPPreRelaxMaker, ) +from atomate2.vasp.sets.mp import MPGGAStaticSetGenerator + +logger = logging.getLogger(__name__) if TYPE_CHECKING: from pathlib import Path - from jobflow import Job from pymatgen.core.structure import Structure + from atomate2.vasp.jobs.base import BaseVaspMaker + @dataclass class MPGGADoubleRelaxMaker(DoubleRelaxMaker): @@ -100,9 +107,7 @@ class MPGGADoubleRelaxStaticMaker(Maker): ) ) - def make( - self, structure: Structure, prev_vasp_dir: str | Path | None = None - ) -> Flow: + def make(self, structure: Structure, prev_dir: str | Path | None = None) -> Flow: """ 1, 2 or 3-step flow with optional pre-relax and final static jobs. @@ -110,7 +115,7 @@ def make( ---------- structure : .Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. Returns @@ -118,18 +123,14 @@ def make( Flow A flow containing the MP relaxation workflow. """ - jobs: list[Job] = [] - - relax_flow = self.relax_maker.make( - structure=structure, prev_vasp_dir=prev_vasp_dir - ) + relax_flow = self.relax_maker.make(structure=structure, prev_dir=prev_dir) output = relax_flow.output - jobs += [relax_flow] + jobs = [relax_flow] if self.static_maker: # Run a static calculation static_job = self.static_maker.make( - structure=output.structure, prev_vasp_dir=output.dir_name + structure=output.structure, prev_dir=output.dir_name ) output = static_job.output jobs += [static_job] @@ -162,9 +163,7 @@ class MPMetaGGADoubleRelaxStaticMaker(MPGGADoubleRelaxMaker): ) ) - def make( - self, structure: Structure, prev_vasp_dir: str | Path | None = None - ) -> Flow: + def make(self, structure: Structure, prev_dir: str | Path | None = None) -> Flow: """ Create a 2-step flow with a cheap pre-relaxation followed by a high-quality one. @@ -174,7 +173,7 @@ def make( ---------- structure : .Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. Returns @@ -182,19 +181,79 @@ def make( Flow A flow containing the MP relaxation workflow. """ - jobs: list[Job] = [] - - relax_flow = self.relax_maker.make( - structure=structure, prev_vasp_dir=prev_vasp_dir - ) + relax_flow = self.relax_maker.make(structure=structure, prev_dir=prev_dir) output = relax_flow.output - jobs += [relax_flow] + jobs = [relax_flow] if self.static_maker: # Run a static calculation (typically r2SCAN) static_job = self.static_maker.make( - structure=output.structure, prev_vasp_dir=output.dir_name + structure=output.structure, prev_dir=output.dir_name ) output = static_job.output jobs += [static_job] return Flow(jobs=jobs, output=output, name=self.name) + + +# update potcars to 54, use correct W potcar +# use staticmaker for compatibility +@dataclass +class MPVaspLobsterMaker(VaspLobsterMaker): + """ + Maker to perform a Lobster computation. + + The calculations performed are: + + 1. Optional optimization. + 2. Static calculation with ISYM=0. + 3. Several Lobster computations testing several basis sets are performed. + + .. Note:: + + The basis sets can only be changed with yaml files. + + Parameters + ---------- + name : str + Name of the flows produced by this maker. + relax_maker : .BaseVaspMaker or None + A maker to perform a relaxation on the bulk. Set to ``None`` to skip the + bulk relaxation. + lobster_static_maker : .BaseVaspMaker + A maker to perform the computation of the wavefunction before the static + run. Cannot be skipped. It can be LOBSTERUNIFORM or LobsterStaticMaker() + lobster_maker : .LobsterMaker + A maker to perform the Lobster run. + delete_wavecars : bool + If true, all WAVECARs will be deleted after the run. + address_min_basis : str + A path to a yaml file including basis set information. + address_max_basis : str + A path to a yaml file including basis set information. + """ + + name: str = "lobster" + relax_maker: BaseVaspMaker | None = field(default_factory=MPGGADoubleRelaxMaker) + lobster_static_maker: BaseVaspMaker = field( + default_factory=lambda: MPGGAStaticMaker( + input_set_generator=MPGGAStaticSetGenerator( + user_potcar_functional="PBE_54", + user_potcar_settings={"W": "W_sv"}, + user_kpoints_settings={"reciprocal_density": 310}, + user_incar_settings={ + "EDIFF": 1e-6, + "NSW": 0, + "LWAVE": True, + "ISYM": 0, + "IBRION": -1, + "ISMEAR": -5, + "LORBIT": 11, + "ALGO": "Normal", + }, + ) + ) + ) + lobster_maker: LobsterMaker | None = field(default_factory=LobsterMaker) + delete_wavecars: bool = True + address_min_basis: str | None = None + address_max_basis: str | None = None diff --git a/src/atomate2/vasp/flows/phonons.py b/src/atomate2/vasp/flows/phonons.py index b6e50c55e2..33a2a3e4e3 100644 --- a/src/atomate2/vasp/flows/phonons.py +++ b/src/atomate2/vasp/flows/phonons.py @@ -1,36 +1,21 @@ -"""Flows for calculating phonons.""" - +"""Define the VASP PhononMaker.""" from __future__ import annotations from dataclasses import dataclass, field from typing import TYPE_CHECKING -from jobflow import Flow, Maker - -from atomate2.common.jobs.phonons import ( - PhononDisplacementMaker, - generate_frequencies_eigenvectors, - generate_phonon_displacements, - get_supercell_size, - get_total_energy_per_cell, - run_phonon_displacements, -) -from atomate2.common.jobs.utils import structure_to_conventional, structure_to_primitive +from atomate2.common.flows.phonons import BasePhononMaker from atomate2.vasp.flows.core import DoubleRelaxMaker from atomate2.vasp.jobs.core import DielectricMaker, StaticMaker, TightRelaxMaker +from atomate2.vasp.jobs.phonons import PhononDisplacementMaker from atomate2.vasp.sets.core import StaticSetGenerator if TYPE_CHECKING: - from pathlib import Path - - from emmet.core.math import Matrix3D - from pymatgen.core.structure import Structure - from atomate2.vasp.jobs.base import BaseVaspMaker @dataclass -class PhononMaker(Maker): +class PhononMaker(BasePhononMaker): """ Maker to calculate harmonic phonons with VASP and Phonopy. @@ -40,7 +25,7 @@ class PhononMaker(Maker): forces are computed for these structures. With the help of phonopy, these forces are then converted into a dynamical matrix. To correct for polarization effects, a correction of the dynamical matrix based on BORN charges can - be performed. Finally, phonon densities of states, phonon band structures + be performed. Finally, phonon densities of states, phonon band structures and thermodynamic properties are computed. .. Note:: @@ -53,25 +38,25 @@ class PhononMaker(Maker): Parameters ---------- - name : str + name : str = "phonon" Name of the flows produced by this maker. - sym_reduce : bool + sym_reduce : bool = True Whether to reduce the number of deformations using symmetry. - symprec : float + symprec : float = 1e-4 Symmetry precision to use in the reduction of symmetry to find the primitive/conventional cell (use_primitive_standard_structure, use_conventional_standard_structure) and to handle all symmetry-related tasks in phonopy - displacement: float + displacement: float = 0.01 displacement distance for phonons - min_length: float + min_length: float = 20.0 min length of the supercell that will be built - prefer_90_degrees: bool + prefer_90_degrees: bool = True if set to True, supercell algorithm will first try to find a supercell with 3 90 degree angles - get_supercell_size_kwargs: dict + get_supercell_size_kwargs: dict = {} kwargs that will be passed to get_supercell_size to determine supercell size - use_symmetrized_structure: str + use_symmetrized_structure: str or None = None allowed strings: "primitive", "conventional", None - "primitive" will enforce to start the phonon computation @@ -106,7 +91,7 @@ class PhononMaker(Maker): Keyword arguments passed to :obj:`generate_frequencies_eigenvectors`. create_thermal_displacements: bool Bool that determines if thermal_displacement_matrices are computed - kpath_scheme: str + kpath_scheme: str = "seekpath" scheme to generate kpoints. Please be aware that you can only use seekpath with any kind of cell Otherwise, please use the standard primitive structure @@ -116,12 +101,14 @@ class PhononMaker(Maker): seekpath can be used with any kind of unit cell as it relies on phonopy to handle the relationship to the primitive cell and not pymatgen - code: str - determines the dft code. currently only vasp is implemented. + code: str = "vasp" + determines the DFT code. currently only vasp is implemented. This keyword might enable the implementation of other codes in the future store_force_constants: bool if True, force constants will be stored + socket: bool + If True, use the socket for the calculation """ name: str = "phonon" @@ -132,6 +119,12 @@ class PhononMaker(Maker): prefer_90_degrees: bool = True get_supercell_size_kwargs: dict = field(default_factory=dict) use_symmetrized_structure: str | None = None + create_thermal_displacements: bool = True + generate_frequencies_eigenvectors_kwargs: dict = field(default_factory=dict) + kpath_scheme: str = "seekpath" + store_force_constants: bool = True + socket: bool = False + code: str = "vasp" bulk_relax_maker: BaseVaspMaker | None = field( default_factory=lambda: DoubleRelaxMaker.from_relax_maker(TightRelaxMaker()) ) @@ -144,198 +137,15 @@ class PhononMaker(Maker): phonon_displacement_maker: BaseVaspMaker = field( default_factory=PhononDisplacementMaker ) - create_thermal_displacements: bool = True - generate_frequencies_eigenvectors_kwargs: dict = field(default_factory=dict) - kpath_scheme: str = "seekpath" - code: str = "vasp" - store_force_constants: bool = True - def make( - self, - structure: Structure, - prev_vasp_dir: str | Path | None = None, - born: list[Matrix3D] | None = None, - epsilon_static: Matrix3D | None = None, - total_dft_energy_per_formula_unit: float | None = None, - supercell_matrix: Matrix3D | None = None, - ) -> Flow: - """ - Make flow to calculate the phonon properties. - - Parameters - ---------- - structure : .Structure - A pymatgen structure. Please start with a structure that is nearly fully - optimized as the internal optimizers have very strict settings! - prev_vasp_dir : str or Path or None - A previous vasp calculation directory to use for copying outputs. - born: Matrix3D - Instead of recomputing born charges and epsilon, these values can also be - provided manually. If born and epsilon_static are provided, the born run - will be skipped it can be provided in the VASP convention with information - for every atom in unit cell. Please be careful when converting structures - within in this workflow as this could lead to errors - epsilon_static: Matrix3D - The high-frequency dielectric constant to use instead of recomputing born - charges and epsilon. If born, epsilon_static are provided, the born run - will be skipped - total_dft_energy_per_formula_unit: float - It has to be given per formula unit (as a result in corresponding Doc). - Instead of recomputing the energy of the bulk structure every time, this - value can also be provided in eV. If it is provided, the static run will be - skipped. This energy is the typical output dft energy of the dft workflow. - No conversion needed. - supercell_matrix: list - Instead of min_length, also a supercell_matrix can be given, e.g. - [[1.0,0.0,0.0],[0.0,1.0,0.0],[0.0,0.0,1.0] - """ - if self.use_symmetrized_structure not in [None, "primitive", "conventional"]: - raise ValueError( - "use_symmetrized_structure can only be primitive, conventional, None" - ) - - if ( - not self.use_symmetrized_structure == "primitive" - and self.kpath_scheme != "seekpath" - ): - raise ValueError( - "You can only use other kpath schemes with the primitive standard " - "structure" - ) - - if self.kpath_scheme not in [ - "seekpath", - "hinuma", - "setyawan_curtarolo", - "latimer_munro", - ]: - raise ValueError("kpath scheme is not implemented") - - jobs = [] - - # TODO: should this be after or before structural optimization as the - # optimization could change the symmetry we could add a tutorial and point out - # that the structure should be nearly optimized before the phonon workflow - if self.use_symmetrized_structure == "primitive": - # These structures are compatible with many - # of the kpath algorithms that are used for Materials Project - prim_job = structure_to_primitive(structure, self.symprec) - jobs.append(prim_job) - structure = prim_job.output - elif self.use_symmetrized_structure == "conventional": - # it could be beneficial to use conventional standard structures to arrive - # faster at supercells with right angles - conv_job = structure_to_conventional(structure, self.symprec) - jobs.append(conv_job) - structure = conv_job.output - - optimization_run_job_dir = None - optimization_run_uuid = None - if self.bulk_relax_maker is not None: - # optionally relax the structure - bulk = self.bulk_relax_maker.make(structure, prev_vasp_dir=prev_vasp_dir) - jobs.append(bulk) - structure = bulk.output.structure - prev_vasp_dir = bulk.output.dir_name - optimization_run_job_dir = bulk.output.dir_name - optimization_run_uuid = bulk.output.uuid - - # if supercell_matrix is None, supercell size will be determined after relax - # maker to ensure that cell lengths are really larger than threshold - if supercell_matrix is None: - supercell_job = get_supercell_size( - structure, - self.min_length, - self.prefer_90_degrees, - **self.get_supercell_size_kwargs, - ) - jobs.append(supercell_job) - supercell_matrix = supercell_job.output + @property + def prev_calc_dir_argname(self) -> str: + """Name of argument informing static maker of previous calculation directory. - # Computation of static energy - total_dft_energy = None - static_run_job_dir = None - static_run_uuid = None - if (self.static_energy_maker is not None) and ( - total_dft_energy_per_formula_unit is None - ): - static_job = self.static_energy_maker.make( - structure=structure, prev_vasp_dir=prev_vasp_dir - ) - jobs.append(static_job) - total_dft_energy = static_job.output.output.energy - static_run_job_dir = static_job.output.dir_name - static_run_uuid = static_job.output.uuid - prev_vasp_dir = static_job.output.dir_name - elif total_dft_energy_per_formula_unit is not None: - # to make sure that one can reuse results from Doc - compute_total_energy_job = get_total_energy_per_cell( - total_dft_energy_per_formula_unit, structure - ) - jobs.append(compute_total_energy_job) - total_dft_energy = compute_total_energy_job.output + As this differs between different DFT codes (e.g., VASP, CP2K), it + has been left as a property to be implemented by the inheriting class. - # get a phonon object from phonopy - displacements = generate_phonon_displacements( - structure=structure, - supercell_matrix=supercell_matrix, - displacement=self.displacement, - sym_reduce=self.sym_reduce, - symprec=self.symprec, - use_symmetrized_structure=self.use_symmetrized_structure, - kpath_scheme=self.kpath_scheme, - code=self.code, - ) - jobs.append(displacements) - - # perform the phonon displacement calculations - vasp_displacement_calcs = run_phonon_displacements( - displacements=displacements.output, - structure=structure, - supercell_matrix=supercell_matrix, - phonon_maker=self.phonon_displacement_maker, - prev_vasp_dir=prev_vasp_dir, - ) - jobs.append(vasp_displacement_calcs) - - # Computation of BORN charges - born_run_job_dir = None - born_run_uuid = None - if self.born_maker is not None and (born is None or epsilon_static is None): - born_job = self.born_maker.make(structure, prev_vasp_dir=prev_vasp_dir) - jobs.append(born_job) - - # I am not happy how we currently access "born" charges - # This is very vasp specific code - epsilon_static = born_job.output.calcs_reversed[0].output.epsilon_static - born = born_job.output.calcs_reversed[0].output.outcar["born"] - born_run_job_dir = born_job.output.dir_name - born_run_uuid = born_job.output.uuid - - phonon_collect = generate_frequencies_eigenvectors( - supercell_matrix=supercell_matrix, - displacement=self.displacement, - sym_reduce=self.sym_reduce, - symprec=self.symprec, - use_symmetrized_structure=self.use_symmetrized_structure, - kpath_scheme=self.kpath_scheme, - code=self.code, - structure=structure, - displacement_data=vasp_displacement_calcs.output, - epsilon_static=epsilon_static, - born=born, - total_dft_energy=total_dft_energy, - static_run_job_dir=static_run_job_dir, - static_run_uuid=static_run_uuid, - born_run_job_dir=born_run_job_dir, - born_run_uuid=born_run_uuid, - optimization_run_job_dir=optimization_run_job_dir, - optimization_run_uuid=optimization_run_uuid, - create_thermal_displacements=self.create_thermal_displacements, - store_force_constants=self.store_force_constants, - **self.generate_frequencies_eigenvectors_kwargs, - ) - jobs.append(phonon_collect) - - # create a flow including all jobs for a phonon computation - return Flow(jobs, phonon_collect.output) + Note: this is only applicable if a relax_maker is specified; i.e., two + calculations are performed for each ordering (relax -> static) + """ + return "prev_dir" diff --git a/src/atomate2/vasp/jobs/amset.py b/src/atomate2/vasp/jobs/amset.py index c9b15bac74..24e0a7217c 100644 --- a/src/atomate2/vasp/jobs/amset.py +++ b/src/atomate2/vasp/jobs/amset.py @@ -200,7 +200,7 @@ class HSEDenseUniformMaker(HSEBSMaker): def run_amset_deformations( structure: Structure, symprec: float = SETTINGS.SYMPREC, - prev_vasp_dir: str | Path | None = None, + prev_dir: str | Path | None = None, static_deformation_maker: BaseVaspMaker | None = None, ) -> Response: """ @@ -216,7 +216,7 @@ def run_amset_deformations( symprec : float Symmetry precision used to reduce the number of deformations. Set to None for no symmetry reduction. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP directory to use for copying VASP outputs. static_deformation_maker : .BaseVaspMaker or None A VaspMaker to use to generate the static deformation jobs. @@ -237,16 +237,16 @@ def run_amset_deformations( statics = [] outputs = [] - for i, deformation in enumerate(deformations): + for idx, deformation in enumerate(deformations): # deform the structure dst = DeformStructureTransformation(deformation=deformation) deformed_structure = dst.apply_transformation(structure) # create the job static_job = static_deformation_maker.make( - deformed_structure, prev_vasp_dir=prev_vasp_dir + deformed_structure, prev_dir=prev_dir ) - static_job.append_name(f" {i + 1}/{len(deformations)}") + static_job.append_name(f" {idx + 1}/{len(deformations)}") statics.append(static_job) # extract the outputs we want (only the dir name) @@ -298,7 +298,7 @@ def calculate_deformation_potentials( # as zero indexed symprec_str = "N" if symprec is None else str(symprec) - # TODO: Handle hostnames properly + # TODO: Handle host names properly bulk_dir = strip_hostname(bulk_dir) deformation_dirs = [strip_hostname(d) for d in deformation_dirs] args = [ @@ -307,7 +307,9 @@ def calculate_deformation_potentials( f"--symprec={symprec_str}", ] if ibands is not None: - bands_str = ".".join(",".join([str(idx + 1) for idx in b]) for b in ibands) + bands_str = ".".join( + ",".join([str(idx + 1) for idx in band_ids]) for band_ids in ibands + ) args.append(f"--bands={bands_str}") runner = CliRunner() diff --git a/src/atomate2/vasp/jobs/base.py b/src/atomate2/vasp/jobs/base.py index 3122803e62..77322504b7 100644 --- a/src/atomate2/vasp/jobs/base.py +++ b/src/atomate2/vasp/jobs/base.py @@ -2,6 +2,7 @@ from __future__ import annotations +import warnings from dataclasses import dataclass, field from pathlib import Path from shutil import which @@ -29,6 +30,12 @@ _BADER_EXE_EXISTS = bool(which("bader") or which("bader.exe")) +_CHARGEMOL_EXE_EXISTS = bool( + which("Chargemol_09_26_2017_linux_parallel") + or which("Chargemol_09_26_2017_linux_serial") + or which("chargemol") +) + _DATA_OBJECTS = [ BandStructure, BandStructureSymmLine, @@ -41,6 +48,7 @@ Trajectory, "force_constants", "normalmode_eigenvecs", + "bandstructure", # FIX: BandStructure is not currently MSONable ] # Input files. Partially from https://www.vasp.at/wiki/index.php/Category:Input_files @@ -182,7 +190,7 @@ class BaseVaspMaker(Maker): @vasp_job def make( - self, structure: Structure, prev_vasp_dir: str | Path | None = None + self, structure: Structure, prev_dir: str | Path | None = None ) -> Response: """ Run a VASP calculation. @@ -191,7 +199,7 @@ def make( ---------- structure : Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. Returns @@ -200,9 +208,9 @@ def make( commands of the VASP run. """ # copy previous inputs - from_prev = prev_vasp_dir is not None - if prev_vasp_dir is not None: - copy_vasp_outputs(prev_vasp_dir, **self.copy_vasp_kwargs) + from_prev = prev_dir is not None + if prev_dir is not None: + copy_vasp_outputs(prev_dir, **self.copy_vasp_kwargs) self.write_input_set_kwargs.setdefault("from_prev", from_prev) @@ -239,10 +247,7 @@ def make( ) -def get_vasp_task_document( - path: Path | str, - **kwargs, -) -> TaskDoc: +def get_vasp_task_document(path: Path | str, **kwargs) -> TaskDoc: """Get VASP Task Document using atomate2 settings.""" kwargs.setdefault("store_additional_json", SETTINGS.VASP_STORE_ADDITIONAL_JSON) @@ -250,7 +255,37 @@ def get_vasp_task_document( "volume_change_warning_tol", SETTINGS.VASP_VOLUME_CHANGE_WARNING_TOL ) - kwargs.setdefault("run_bader", SETTINGS.VASP_RUN_BADER and _BADER_EXE_EXISTS) + if SETTINGS.VASP_RUN_BADER: + kwargs.setdefault("run_bader", _BADER_EXE_EXISTS) + if not _BADER_EXE_EXISTS: + warnings.warn( + f"{SETTINGS.VASP_RUN_BADER=} but bader executable not found on path", + stacklevel=1, + ) + if SETTINGS.VASP_RUN_DDEC6: + # if VASP_RUN_DDEC6 is True but _CHARGEMOL_EXE_EXISTS is False, just silently + # skip running DDEC6 + run_ddec6: bool | str = _CHARGEMOL_EXE_EXISTS + if run_ddec6 and isinstance(SETTINGS.DDEC6_ATOMIC_DENSITIES_DIR, str): + # if DDEC6_ATOMIC_DENSITIES_DIR is a string and directory at that path + # exists, use as path to the atomic densities + if Path(SETTINGS.DDEC6_ATOMIC_DENSITIES_DIR).is_dir(): + run_ddec6 = SETTINGS.DDEC6_ATOMIC_DENSITIES_DIR + else: + # if the directory doesn't exist, warn the user and skip running DDEC6 + warnings.warn( + f"{SETTINGS.DDEC6_ATOMIC_DENSITIES_DIR=} does not exist, skipping " + "DDEC6", + stacklevel=1, + ) + kwargs.setdefault("run_ddec6", run_ddec6) + + if not _CHARGEMOL_EXE_EXISTS: + warnings.warn( + f"{SETTINGS.VASP_RUN_DDEC6=} but chargemol executable not found on " + "path", + stacklevel=1, + ) kwargs.setdefault("store_volumetric_data", SETTINGS.VASP_STORE_VOLUMETRIC_DATA) diff --git a/src/atomate2/vasp/jobs/core.py b/src/atomate2/vasp/jobs/core.py index 027b17e918..d09ef401ca 100644 --- a/src/atomate2/vasp/jobs/core.py +++ b/src/atomate2/vasp/jobs/core.py @@ -4,17 +4,8 @@ import logging from dataclasses import dataclass, field -from typing import TYPE_CHECKING - -from custodian.vasp.handlers import ( - FrozenJobErrorHandler, - IncorrectSmearingHandler, - LargeSigmaHandler, - MeshSymmetryErrorHandler, - PositiveEnergyErrorHandler, - StdErrHandler, - VaspErrorHandler, -) +from typing import TYPE_CHECKING, Literal + from pymatgen.alchemy.materials import TransformedStructure from pymatgen.alchemy.transmuters import StandardTransmuter @@ -25,7 +16,6 @@ HSERelaxSetGenerator, HSEStaticSetGenerator, HSETightRelaxSetGenerator, - MDSetGenerator, NonSCFSetGenerator, RelaxSetGenerator, StaticSetGenerator, @@ -181,7 +171,7 @@ class NonSCFMaker(BaseVaspMaker): def make( self, structure: Structure, - prev_vasp_dir: str | Path | None, + prev_dir: str | Path | None, mode: str = "uniform", ) -> Response: """ @@ -191,7 +181,7 @@ def make( ---------- structure : .Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. mode : str Type of band structure calculation. Options are: @@ -206,7 +196,7 @@ def make( # copy previous inputs self.copy_vasp_kwargs.setdefault("additional_vasp_files", ("CHGCAR",)) - return super().make.original(self, structure, prev_vasp_dir) + return super().make.original(self, structure, prev_dir) @dataclass @@ -355,8 +345,8 @@ class HSEBSMaker(BaseVaspMaker): def make( self, structure: Structure, - prev_vasp_dir: str | Path | None = None, - mode="uniform", + prev_dir: str | Path | None = None, + mode: Literal["line", "uniform", "gap"] = "uniform", ) -> Response: """ Run a HSE06 band structure VASP job. @@ -365,9 +355,9 @@ def make( ---------- structure : .Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. - mode : str + mode : str = "uniform" Type of band structure calculation. Options are: - "line": Full band structure along symmetry lines. - "uniform": Uniform mesh band structure. @@ -375,7 +365,7 @@ def make( """ self.input_set_generator.mode = mode - if mode == "gap" and prev_vasp_dir is None: + if mode == "gap" and prev_dir is None: logger.warning( "HSE band structure in 'gap' mode requires a previous VASP calculation " "directory from which to extract the VBM and CBM k-points. This " @@ -390,10 +380,10 @@ def make( self.task_document_kwargs.setdefault("parse_bandstructure", parse_bandstructure) # copy previous inputs - if prev_vasp_dir is not None: + if prev_dir is not None: self.copy_vasp_kwargs.setdefault("additional_vasp_files", ("CHGCAR",)) - return super().make.original(self, structure, prev_vasp_dir) + return super().make.original(self, structure, prev_dir) @dataclass @@ -487,7 +477,7 @@ class TransmuterMaker(BaseVaspMaker): def make( self, structure: Structure, - prev_vasp_dir: str | Path | None = None, + prev_dir: str | Path | None = None, ) -> Response: """ Run a transmuter VASP job. @@ -496,7 +486,7 @@ def make( ---------- structure : Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. """ transformations = get_transformations( @@ -510,60 +500,4 @@ def make( tjson = transmuter.transformed_structures[-1] self.write_additional_data.setdefault("transformations:json", tjson) - return super().make.original(self, structure, prev_vasp_dir) - - -@dataclass -class MDMaker(BaseVaspMaker): - """ - Maker to create VASP molecular dynamics jobs. - - Parameters - ---------- - name : str - The job name. - input_set_generator : .VaspInputSetGenerator - A generator used to make the input set. - write_input_set_kwargs : dict - Keyword arguments that will get passed to :obj:`.write_vasp_input_set`. - copy_vasp_kwargs : dict - Keyword arguments that will get passed to :obj:`.copy_vasp_outputs`. - run_vasp_kwargs : dict - Keyword arguments that will get passed to :obj:`.run_vasp`. - task_document_kwargs : dict - Keyword arguments that will get passed to :obj:`.TaskDoc.from_directory`. - stop_children_kwargs : dict - Keyword arguments that will get passed to :obj:`.should_stop_children`. - write_additional_data : dict - Additional data to write to the current directory. Given as a dict of - {filename: data}. Note that if using FireWorks, dictionary keys cannot contain - the "." character which is typically used to denote file extensions. To avoid - this, use the ":" character, which will automatically be converted to ".". E.g. - ``{"my_file:txt": "contents of the file"}``. - """ - - name: str = "molecular dynamics" - - input_set_generator: VaspInputGenerator = field(default_factory=MDSetGenerator) - - # Explicitly pass the handlers to not use the default ones. Some default handlers - # such as PotimErrorHandler do not apply to MD runs. - run_vasp_kwargs: dict = field( - default_factory=lambda: { - "handlers": ( - VaspErrorHandler(), - MeshSymmetryErrorHandler(), - PositiveEnergyErrorHandler(), - FrozenJobErrorHandler(), - StdErrHandler(), - LargeSigmaHandler(), - IncorrectSmearingHandler(), - ) - } - ) - - # Store ionic steps info in a pymatgen Trajectory object instead of in the output - # document. - task_document_kwargs: dict = field( - default_factory=lambda: {"store_trajectory": True} - ) + return super().make.original(self, structure, prev_dir) diff --git a/src/atomate2/vasp/jobs/defect.py b/src/atomate2/vasp/jobs/defect.py index 175cedf183..d4e0eb1fe6 100644 --- a/src/atomate2/vasp/jobs/defect.py +++ b/src/atomate2/vasp/jobs/defect.py @@ -62,14 +62,14 @@ def calculate_finite_diff( d_dir_names = [strip_hostname(d) for d in distorted_calc_dirs] - for i, dir_name in enumerate(d_dir_names): + for idx, dir_name in enumerate(d_dir_names): # Copy a distorted WAVECAR to WAVECAR.qqq copy_files(dir_name, include_files=["WAVECAR.gz"], prefix="qqq.") gunzip_files(include_files="qqq.WAVECAR*", allow_missing=True) rename_files({"qqq.WAVECAR": "WAVECAR.qqq"}) run_vasp(**run_vasp_kwargs) - fc.copy("WSWQ", f"WSWQ.{i}") + fc.copy("WSWQ", f"WSWQ.{idx}") fd_doc = FiniteDifferenceDocument.from_directory( ".", ref_dir=ref_calc_dir, distorted_dirs=d_dir_names diff --git a/src/atomate2/vasp/jobs/elastic.py b/src/atomate2/vasp/jobs/elastic.py index a83041d5c4..7888ab305f 100644 --- a/src/atomate2/vasp/jobs/elastic.py +++ b/src/atomate2/vasp/jobs/elastic.py @@ -51,7 +51,7 @@ class ElasticRelaxMaker(BaseVaspMaker): name: str = "elastic relax" input_set_generator: VaspInputGenerator = field( default_factory=lambda: StaticSetGenerator( - user_kpoints_settings={"grid_density": 7000}, + user_kpoints_settings={"grid_density": 7_000}, user_incar_settings={ "IBRION": 2, "ISIF": 2, diff --git a/src/atomate2/vasp/jobs/elph.py b/src/atomate2/vasp/jobs/elph.py index a774f222d3..9c58a9a5f6 100644 --- a/src/atomate2/vasp/jobs/elph.py +++ b/src/atomate2/vasp/jobs/elph.py @@ -89,7 +89,7 @@ class SupercellElectronPhononDisplacedStructureMaker(TransmuterMaker): def make( self, structure: Structure, - prev_vasp_dir: str | Path | None = None, + prev_dir: str | Path | None = None, ) -> Response: """ Run a transmuter VASP job. @@ -98,7 +98,7 @@ def make( ---------- structure : Structure A pymatgen structure object. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP calculation directory to copy output files from. """ dim = self.min_supercell_length / np.array(structure.lattice.abc) @@ -110,7 +110,7 @@ def make( # update temperatures self.input_set_generator.temperatures = self.temperatures - return super().make.original(self, structure, prev_vasp_dir) + return super().make.original(self, structure, prev_dir) @job @@ -118,7 +118,7 @@ def run_elph_displacements( temperatures: list[float], structures: list[Structure], vasp_maker: BaseVaspMaker, - prev_vasp_dir: str | Path | None = None, + prev_dir: str | Path | None = None, original_structure: Structure = None, supercell_structure: Structure = None, ) -> Response: @@ -135,7 +135,7 @@ def run_elph_displacements( Electron phonon displaced structures for each temperature. vasp_maker : BaseVaspMaker A maker to generate VASP calculations on the displaced structures. - prev_vasp_dir : str or Path or None + prev_dir : str or Path or None A previous VASP directory to use for copying VASP outputs. original_structure : Structure The original structure before supercell is made and before electron phonon @@ -157,7 +157,7 @@ def run_elph_displacements( } for temp, structure in zip(temperatures, structures): # create the job - elph_job = vasp_maker.make(structure, prev_vasp_dir=prev_vasp_dir) + elph_job = vasp_maker.make(structure, prev_dir=prev_dir) elph_job.append_name(f" T={temp}") # write details of the electron phonon temperature and structure elph_info.json @@ -241,7 +241,7 @@ def calculate_electron_phonon_renormalisation( ) # filter band structures that are None (i.e., the displacement calculation failed) - keep = [i for i, b in enumerate(displacement_band_structures) if b is not None] + keep = [idx for idx, b in enumerate(displacement_band_structures) if b is not None] temperatures = [temperatures[i] for i in keep] displacement_band_structures = [displacement_band_structures[i] for i in keep] displacement_structures = [displacement_structures[i] for i in keep] diff --git a/src/atomate2/vasp/jobs/eos.py b/src/atomate2/vasp/jobs/eos.py new file mode 100644 index 0000000000..95744041b8 --- /dev/null +++ b/src/atomate2/vasp/jobs/eos.py @@ -0,0 +1,362 @@ +""" +Module to define EOS jobs using the default atomate2 parameters. + +Some jobs have prefixes to indicate their purpose: +- MPLegacy: for consistency with the atomate 1 implementation, or +[LDMWP] K. Latimer, S. Dwaraknath, K. Mathew, D. Winston, and K.A. Persson, +npj Comput. Materials 4, 40 (2018), +DOI: 10.1038/s41524-018-0091-x + +Also see the original atomate workflows + +- atomate.vasp.workflows.base.wf_bulk_modulus: +https://github.com/hackingmaterials/atomate/blob/main/atomate/vasp/workflows/presets/core.py#L564 +- atomate.vasp.workflows.base.bulk_modulus.get_wf_bulk_modulus: +https://github.com/hackingmaterials/atomate/blob/main/atomate/vasp/workflows/base/bulk_modulus.py#L21 + +These WFs are interesting that the k-point density is **extremely** high +despite the convergence tests in the SI of the Latimer et al. paper not +showing strong sensitivity when + "number of k-points per reciprocal atom" >= 3,000 + +- MPGGA: MP-compatible PBE-GGA jobs +- MPMetaGGA: MP-compatible r2SCAN meta-GGA jobs + +MPGGA and MPMetaGGA jobs use the highest k-point density in standard MP jobs, +KSPACING = 0.22, which is comparable to +KPPRA = k-points per reciprocal atom = 3000 + +This is justified by the SI of [LDMWP], which shows in Fig. S12 +that all EOS parameters (E0, V0, B0, B1) do not deviate by more than 1.5%, +and typically less than 0.1%, from a well-converged value when KPPRA = 3,000. +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import TYPE_CHECKING + +from atomate2.vasp.jobs.base import BaseVaspMaker +from atomate2.vasp.sets.eos import ( + EosSetGenerator, + MPGGAEosRelaxSetGenerator, + MPGGAEosStaticSetGenerator, + MPLegacyEosRelaxSetGenerator, + MPLegacyEosStaticSetGenerator, + MPMetaGGAEosPreRelaxSetGenerator, + MPMetaGGAEosRelaxSetGenerator, + MPMetaGGAEosStaticSetGenerator, +) + +if TYPE_CHECKING: + from atomate2.vasp.sets.base import VaspInputGenerator + +# No prefix, base atomate 2 parameters + + +@dataclass +class EosRelaxMaker(BaseVaspMaker): + """ + Maker to create VASP relaxation job using EOS parameters. + + Parameters + ---------- + name : str + The job name. + input_set_generator : .VaspInputGenerator + A generator used to make the input set. + write_input_set_kwargs : dict + Keyword arguments that will get passed to :obj:`.write_vasp_input_set`. + copy_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.copy_vasp_outputs`. + run_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.run_vasp`. + task_document_kwargs : dict + Keyword arguments that will get passed to :obj:`.TaskDoc.from_directory`. + stop_children_kwargs : dict + Keyword arguments that will get passed to :obj:`.should_stop_children`. + write_additional_data : dict + Additional data to write to the current directory. Given as a dict of + {filename: data}. Note that if using FireWorks, dictionary keys cannot contain + the "." character which is typically used to denote file extensions. To avoid + this, use the ":" character, which will automatically be converted to ".". E.g. + ``{"my_file:txt": "contents of the file"}``. + """ + + name: str = "EOS GGA relax" + input_set_generator: VaspInputGenerator = field(default_factory=EosSetGenerator) + copy_vasp_kwargs: dict = field( + default_factory=lambda: {"additional_vasp_files": ("WAVECAR",)} + ) + + +# MPLegacy prefix, legacy MP PBE-GGA + + +@dataclass +class MPLegacyEosRelaxMaker(BaseVaspMaker): + """ + Maker to create MP atomate1-compatible GGA relax job in VASP. + + Parameters + ---------- + name : str + The job name. + input_set_generator : .VaspInputGenerator + A generator used to make the input set. + write_input_set_kwargs : dict + Keyword arguments that will get passed to :obj:`.write_vasp_input_set`. + copy_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.copy_vasp_outputs`. + run_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.run_vasp`. + task_document_kwargs : dict + Keyword arguments that will get passed to :obj:`.TaskDoc.from_directory`. + stop_children_kwargs : dict + Keyword arguments that will get passed to :obj:`.should_stop_children`. + write_additional_data : dict + Additional data to write to the current directory. Given as a dict of + {filename: data}. Note that if using FireWorks, dictionary keys cannot contain + the "." character which is typically used to denote file extensions. To avoid + this, use the ":" character, which will automatically be converted to ".". E.g. + ``{"my_file:txt": "contents of the file"}``. + """ + + name: str = "EOS MP legacy GGA relax" + input_set_generator: VaspInputGenerator = field( + default_factory=MPLegacyEosRelaxSetGenerator + ) + copy_vasp_kwargs: dict = field( + default_factory=lambda: {"additional_vasp_files": ("WAVECAR",)} + ) + + +@dataclass +class MPLegacyEosStaticMaker(BaseVaspMaker): + """ + Maker to create MP atomate1-compatible GGA static job in VASP. + + Parameters + ---------- + name : str + The job name. + input_set_generator : .VaspInputGenerator + A generator used to make the input set. + write_input_set_kwargs : dict + Keyword arguments that will get passed to :obj:`.write_vasp_input_set`. + copy_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.copy_vasp_outputs`. + run_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.run_vasp`. + task_document_kwargs : dict + Keyword arguments that will get passed to :obj:`.TaskDoc.from_directory`. + stop_children_kwargs : dict + Keyword arguments that will get passed to :obj:`.should_stop_children`. + write_additional_data : dict + Additional data to write to the current directory. Given as a dict of + {filename: data}. Note that if using FireWorks, dictionary keys cannot contain + the "." character which is typically used to denote file extensions. To avoid + this, use the ":" character, which will automatically be converted to ".". E.g. + ``{"my_file:txt": "contents of the file"}``. + """ + + name: str = "EOS MP legacy GGA static" + input_set_generator: VaspInputGenerator = field( + default_factory=MPLegacyEosStaticSetGenerator + ) + copy_vasp_kwargs: dict = field( + default_factory=lambda: {"additional_vasp_files": ("WAVECAR",)} + ) + + +# MPGGA prefix, MP PBE-GGA compatible parameters + + +@dataclass +class MPGGAEosRelaxMaker(BaseVaspMaker): + """ + Maker to create MP-compatible GGA relax job in VASP using EOS parameters. + + Parameters + ---------- + name : str + The job name. + input_set_generator : .VaspInputGenerator + A generator used to make the input set. + write_input_set_kwargs : dict + Keyword arguments that will get passed to :obj:`.write_vasp_input_set`. + copy_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.copy_vasp_outputs`. + run_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.run_vasp`. + task_document_kwargs : dict + Keyword arguments that will get passed to :obj:`.TaskDoc.from_directory`. + stop_children_kwargs : dict + Keyword arguments that will get passed to :obj:`.should_stop_children`. + write_additional_data : dict + Additional data to write to the current directory. Given as a dict of + {filename: data}. Note that if using FireWorks, dictionary keys cannot contain + the "." character which is typically used to denote file extensions. To avoid + this, use the ":" character, which will automatically be converted to ".". E.g. + ``{"my_file:txt": "contents of the file"}``. + """ + + name: str = "EOS MP GGA relax" + input_set_generator: VaspInputGenerator = field( + default_factory=MPGGAEosRelaxSetGenerator + ) + copy_vasp_kwargs: dict = field( + default_factory=lambda: {"additional_vasp_files": ("WAVECAR",)} + ) + + +@dataclass +class MPGGAEosStaticMaker(BaseVaspMaker): + """ + Maker to create MP-compatible GGA static job in VASP using EOS parameters. + + Parameters + ---------- + name : str + The job name. + input_set_generator : .VaspInputGenerator + A generator used to make the input set. + write_input_set_kwargs : dict + Keyword arguments that will get passed to :obj:`.write_vasp_input_set`. + copy_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.copy_vasp_outputs`. + run_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.run_vasp`. + task_document_kwargs : dict + Keyword arguments that will get passed to :obj:`.TaskDoc.from_directory`. + stop_children_kwargs : dict + Keyword arguments that will get passed to :obj:`.should_stop_children`. + write_additional_data : dict + Additional data to write to the current directory. Given as a dict of + {filename: data}. Note that if using FireWorks, dictionary keys cannot contain + the "." character which is typically used to denote file extensions. To avoid + this, use the ":" character, which will automatically be converted to ".". E.g. + ``{"my_file:txt": "contents of the file"}``. + """ + + name: str = "EOS MP GGA static" + input_set_generator: VaspInputGenerator = field( + default_factory=MPGGAEosStaticSetGenerator + ) + copy_vasp_kwargs: dict = field( + default_factory=lambda: {"additional_vasp_files": ("WAVECAR",)} + ) + + +# MPMetaGGA prefix, MP r2SCAN-meta-GGA compatible + + +@dataclass +class MPMetaGGAEosPreRelaxMaker(BaseVaspMaker): + """ + Maker to create MP-compatible r2SCAN relax job in VASP using EOS parameters. + + Parameters + ---------- + name : str + The job name. + input_set_generator : .VaspInputGenerator + A generator used to make the input set. + write_input_set_kwargs : dict + Keyword arguments that will get passed to :obj:`.write_vasp_input_set`. + copy_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.copy_vasp_outputs`. + run_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.run_vasp`. + task_document_kwargs : dict + Keyword arguments that will get passed to :obj:`.TaskDoc.from_directory`. + stop_children_kwargs : dict + Keyword arguments that will get passed to :obj:`.should_stop_children`. + write_additional_data : dict + Additional data to write to the current directory. Given as a dict of + {filename: data}. Note that if using FireWorks, dictionary keys cannot contain + the "." character which is typically used to denote file extensions. To avoid + this, use the ":" character, which will automatically be converted to ".". E.g. + ``{"my_file:txt": "contents of the file"}``. + """ + + name: str = "EOS MP meta-GGA pre-relax" + input_set_generator: VaspInputGenerator = field( + default_factory=MPMetaGGAEosPreRelaxSetGenerator + ) + + +@dataclass +class MPMetaGGAEosRelaxMaker(BaseVaspMaker): + """ + Maker to create MP-compatible r2SCAN relax job in VASP using EOS parameters. + + Parameters + ---------- + name : str + The job name. + input_set_generator : .VaspInputGenerator + A generator used to make the input set. + write_input_set_kwargs : dict + Keyword arguments that will get passed to :obj:`.write_vasp_input_set`. + copy_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.copy_vasp_outputs`. + run_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.run_vasp`. + task_document_kwargs : dict + Keyword arguments that will get passed to :obj:`.TaskDoc.from_directory`. + stop_children_kwargs : dict + Keyword arguments that will get passed to :obj:`.should_stop_children`. + write_additional_data : dict + Additional data to write to the current directory. Given as a dict of + {filename: data}. Note that if using FireWorks, dictionary keys cannot contain + the "." character which is typically used to denote file extensions. To avoid + this, use the ":" character, which will automatically be converted to ".". E.g. + ``{"my_file:txt": "contents of the file"}``. + """ + + name: str = "EOS MP meta-GGA relax" + input_set_generator: VaspInputGenerator = field( + default_factory=MPMetaGGAEosRelaxSetGenerator + ) + copy_vasp_kwargs: dict = field( + default_factory=lambda: {"additional_vasp_files": ("WAVECAR",)} + ) + + +@dataclass +class MPMetaGGAEosStaticMaker(BaseVaspMaker): + """ + Maker to create MP-compatible meta-GGA static job in VASP using EOS parameters. + + Parameters + ---------- + name : str + The job name. + input_set_generator : .VaspInputGenerator + A generator used to make the input set. + write_input_set_kwargs : dict + Keyword arguments that will get passed to :obj:`.write_vasp_input_set`. + copy_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.copy_vasp_outputs`. + run_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.run_vasp`. + task_document_kwargs : dict + Keyword arguments that will get passed to :obj:`.TaskDoc.from_directory`. + stop_children_kwargs : dict + Keyword arguments that will get passed to :obj:`.should_stop_children`. + write_additional_data : dict + Additional data to write to the current directory. Given as a dict of + {filename: data}. Note that if using FireWorks, dictionary keys cannot contain + the "." character which is typically used to denote file extensions. To avoid + this, use the ":" character, which will automatically be converted to ".". E.g. + ``{"my_file:txt": "contents of the file"}``. + """ + + name: str = "EOS MP meta-GGA static" + input_set_generator: VaspInputGenerator = field( + default_factory=MPMetaGGAEosStaticSetGenerator + ) + copy_vasp_kwargs: dict = field( + default_factory=lambda: {"additional_vasp_files": ("WAVECAR",)} + ) diff --git a/src/atomate2/vasp/jobs/lobster.py b/src/atomate2/vasp/jobs/lobster.py index 1a730874aa..13ba887642 100644 --- a/src/atomate2/vasp/jobs/lobster.py +++ b/src/atomate2/vasp/jobs/lobster.py @@ -135,7 +135,7 @@ def update_user_incar_settings_maker( vasp_maker: BaseVaspMaker, nbands: int, structure: Structure, - prev_vasp_dir: Path | str, + prev_dir: Path | str, ) -> Response: """ Update the INCAR settings of a maker. @@ -149,7 +149,7 @@ def update_user_incar_settings_maker( integer indicating the correct number of bands structure : .Structure Structure object. - prev_vasp_dir : Path or str + prev_dir : Path or str Path or string to vasp files. Returns @@ -158,13 +158,13 @@ def update_user_incar_settings_maker( LobsterStaticMaker with correct number of bands. """ vasp_maker = update_user_incar_settings(vasp_maker, {"NBANDS": nbands}) - vasp_job = vasp_maker.make(structure=structure, prev_vasp_dir=prev_vasp_dir) + vasp_job = vasp_maker.make(structure=structure, prev_dir=prev_dir) return Response(replace=vasp_job) @job def get_lobster_jobs( - lobster_maker: LobsterMaker, + lobster_maker: LobsterMaker | None, basis_dict: dict, optimization_dir: Path | str, optimization_uuid: str, @@ -176,7 +176,7 @@ def get_lobster_jobs( Parameters ---------- - lobster_maker : .LobsterMaker + lobster_maker : .LobsterMaker or None maker for the Lobster jobs basis_dict : dict dict including basis set information. @@ -205,16 +205,15 @@ def get_lobster_jobs( "lobster_task_documents": [], } - if lobster_maker is None: - lobster_maker = LobsterMaker() + lobster_maker = lobster_maker or LobsterMaker() - for i, basis in enumerate(basis_dict): - lobsterjob = lobster_maker.make(wavefunction_dir=static_dir, basis_dict=basis) - lobsterjob.append_name(f"_run_{i}") - outputs["lobster_uuids"].append(lobsterjob.output.uuid) - outputs["lobster_dirs"].append(lobsterjob.output.dir_name) - outputs["lobster_task_documents"].append(lobsterjob.output) - jobs.append(lobsterjob) + for idx, basis in enumerate(basis_dict): + lobster_job = lobster_maker.make(wavefunction_dir=static_dir, basis_dict=basis) + lobster_job.append_name(f"_run_{idx}") + outputs["lobster_uuids"].append(lobster_job.output.uuid) + outputs["lobster_dirs"].append(lobster_job.output.dir_name) + outputs["lobster_task_documents"].append(lobster_job.output) + jobs.append(lobster_job) flow = Flow(jobs, output=outputs) return Response(replace=flow) diff --git a/src/atomate2/vasp/jobs/matpes.py b/src/atomate2/vasp/jobs/matpes.py index 0031c675ac..d22d7f7f44 100644 --- a/src/atomate2/vasp/jobs/matpes.py +++ b/src/atomate2/vasp/jobs/matpes.py @@ -22,7 +22,7 @@ @dataclass class MatPesGGAStaticMaker(BaseVaspMaker): """ - Maker to create VASP static job using r2SCAN by default. + Maker to create VASP static job using PBE by default. Parameters ---------- @@ -52,7 +52,6 @@ class MatPesGGAStaticMaker(BaseVaspMaker): input_set_generator: VaspInputGenerator = field( default_factory=MatPesGGAStaticSetGenerator ) - inherit_incar: bool = False @dataclass @@ -88,4 +87,3 @@ class MatPesMetaGGAStaticMaker(BaseVaspMaker): input_set_generator: VaspInputGenerator = field( default_factory=MatPesMetaGGAStaticSetGenerator ) - inherit_incar: bool = False diff --git a/src/atomate2/vasp/jobs/md.py b/src/atomate2/vasp/jobs/md.py new file mode 100644 index 0000000000..aa3aae99e6 --- /dev/null +++ b/src/atomate2/vasp/jobs/md.py @@ -0,0 +1,128 @@ +"""Module defining molecular dynamics jobs.""" + +from __future__ import annotations + +import logging +from dataclasses import dataclass, field +from typing import TYPE_CHECKING + +from custodian.vasp.handlers import ( + FrozenJobErrorHandler, + IncorrectSmearingHandler, + LargeSigmaHandler, + MeshSymmetryErrorHandler, + PositiveEnergyErrorHandler, + StdErrHandler, + VaspErrorHandler, +) +from emmet.core.vasp.calculation import StoreTrajectoryOption +from jobflow import Response, job + +from atomate2.vasp.jobs.base import BaseVaspMaker +from atomate2.vasp.schemas.md import MultiMDOutput +from atomate2.vasp.sets.core import MDSetGenerator + +if TYPE_CHECKING: + from pathlib import Path + + from pymatgen.core import Structure + + from atomate2.vasp.sets.base import VaspInputGenerator + + +logger = logging.getLogger(__name__) + + +@dataclass +class MDMaker(BaseVaspMaker): + """ + Maker to create VASP molecular dynamics jobs. + + Parameters + ---------- + name : str + The job name. + input_set_generator : .VaspInputSetGenerator + A generator used to make the input set. + write_input_set_kwargs : dict + Keyword arguments that will get passed to :obj:`.write_vasp_input_set`. + copy_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.copy_vasp_outputs`. + run_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.run_vasp`. + task_document_kwargs : dict + Keyword arguments that will get passed to :obj:`.TaskDoc.from_directory`. + stop_children_kwargs : dict + Keyword arguments that will get passed to :obj:`.should_stop_children`. + write_additional_data : dict + Additional data to write to the current directory. Given as a dict of + {filename: data}. Note that if using FireWorks, dictionary keys cannot contain + the "." character which is typically used to denote file extensions. To avoid + this, use the ":" character, which will automatically be converted to ".". E.g. + ``{"my_file:txt": "contents of the file"}``. + """ + + name: str = "molecular dynamics" + + input_set_generator: VaspInputGenerator = field(default_factory=MDSetGenerator) + + # Explicitly pass the handlers to not use the default ones. Some default handlers + # such as PotimErrorHandler do not apply to MD runs. + run_vasp_kwargs: dict = field( + default_factory=lambda: { + "handlers": ( + VaspErrorHandler(), + MeshSymmetryErrorHandler(), + PositiveEnergyErrorHandler(), + FrozenJobErrorHandler(), + StdErrHandler(), + LargeSigmaHandler(), + IncorrectSmearingHandler(), + ) + } + ) + + # Store ionic steps info in a pymatgen Trajectory object instead of in the output + # document. + task_document_kwargs: dict = field( + default_factory=lambda: {"store_trajectory": StoreTrajectoryOption.PARTIAL} + ) + + +@job(output_schema=MultiMDOutput) +def md_output( + structure: Structure, + vasp_dir: str | Path, + traj_ids: list[str], + prev_traj_ids: list[str] | None, +) -> Response: + """ + Collect output references of a multistep MD flow. + + Parameters + ---------- + structure: .Structure + The final structure to be stored. + vasp_dir: str or Path + The path to the folder containing the last calculation of a MultiMDMaker. + traj_ids: list of str + List of the uuids of the jobs that will compose the trajectory. + prev_traj_ids: list of str + List of the uuids of the jobs coming from previous flow that will be + added to the trajectory. + + Returns + ------- + The output dictionary. + """ + full_traj_ids = list(traj_ids) + if prev_traj_ids: + full_traj_ids = prev_traj_ids + full_traj_ids + output = MultiMDOutput.from_structure( + structure=structure, + meta_structure=structure, + vasp_dir=str(vasp_dir), + traj_ids=traj_ids, + full_traj_ids=full_traj_ids, + ) + return Response(output=output) diff --git a/src/atomate2/vasp/jobs/phonons.py b/src/atomate2/vasp/jobs/phonons.py new file mode 100644 index 0000000000..b4f8938966 --- /dev/null +++ b/src/atomate2/vasp/jobs/phonons.py @@ -0,0 +1,59 @@ +"""Define the PhononDisplacementMaker for VASP.""" +from dataclasses import dataclass, field + +from atomate2.vasp.jobs.base import BaseVaspMaker +from atomate2.vasp.sets.base import VaspInputGenerator +from atomate2.vasp.sets.core import StaticSetGenerator + + +@dataclass +class PhononDisplacementMaker(BaseVaspMaker): + """ + Maker to perform a static calculation as a part of the finite displacement method. + + The input set is for a static run with tighter convergence parameters. + Both the k-point mesh density and convergence parameters + are stricter than a normal relaxation. + + Parameters + ---------- + name : str + The job name. + input_set_generator : .VaspInputGenerator + A generator used to make the input set. + write_input_set_kwargs : dict + Keyword arguments that will get passed to :obj:`.write_vasp_input_set`. + copy_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.copy_vasp_outputs`. + run_vasp_kwargs : dict + Keyword arguments that will get passed to :obj:`.run_vasp`. + task_document_kwargs : dict + Keyword arguments that will get passed to :obj:`.TaskDoc.from_directory`. + stop_children_kwargs : dict + Keyword arguments that will get passed to :obj:`.should_stop_children`. + write_additional_data : dict + Additional data to write to the current directory. Given as a dict of + {filename: data}. Note that if using FireWorks, dictionary keys cannot contain + the "." character which is typically used to denote file extensions. To avoid + this, use the ":" character, which will automatically be converted to ".". E.g. + ``{"my_file:txt": "contents of the file"}``. + """ + + name: str = "phonon static" + input_set_generator: VaspInputGenerator = field( + default_factory=lambda: StaticSetGenerator( + user_kpoints_settings={"reciprocal_density": 100}, + user_incar_settings={ + "IBRION": 2, + "ISIF": 3, + "ENCUT": 700, + "EDIFF": 1e-7, + "LAECHG": False, + "LREAL": False, + "ALGO": "Normal", + "NSW": 0, + "LCHARG": False, + }, + auto_ispin=True, + ) + ) diff --git a/src/atomate2/vasp/powerups.py b/src/atomate2/vasp/powerups.py index a050654628..c73813bbbb 100644 --- a/src/atomate2/vasp/powerups.py +++ b/src/atomate2/vasp/powerups.py @@ -8,6 +8,8 @@ from jobflow import Flow, Job, Maker from pymatgen.io.vasp import Kpoints +from atomate2.common.powerups import add_metadata_to_flow as base_add_metadata_to_flow +from atomate2.common.powerups import update_custodian_handlers as base_custodian_handler from atomate2.vasp.jobs.base import BaseVaspMaker @@ -277,3 +279,58 @@ def use_auto_ispin( name_filter=name_filter, class_filter=class_filter, ) + + +def add_metadata_to_flow( + flow: Flow, additional_fields: dict, class_filter: Maker = BaseVaspMaker +) -> Flow: + """ + Return the VASP flow with additional field(metadata) to the task doc. + + This allows adding metadata to the task-docs, could be useful + to query results from DB. + + Parameters + ---------- + flow : Flow + The flow to which to add metadata. + additional_fields : dict + A dict with metadata. + class_filter: .BaseVaspMaker + The Maker to which additional metadata needs to be added + + Returns + ------- + Flow + Flow with added metadata to the task-doc. + """ + return base_add_metadata_to_flow( + flow=flow, class_filter=class_filter, additional_fields=additional_fields + ) + + +def update_vasp_custodian_handlers( + flow: Flow, custom_handlers: tuple, class_filter: Maker = BaseVaspMaker +) -> Flow: + """ + Return the flow with custom custodian handlers for VASP jobs. + + This allows user to selectively set error correcting handlers for VASP jobs + or completely unset error handlers. + + Parameters + ---------- + flow: + custom_handlers : tuple + A tuple with custodian handlers. + class_filter: .Maker + The Maker to which custom custodian handler needs to be added + + Returns + ------- + Flow + Flow with modified custodian handlers. + """ + return base_custodian_handler( + flow=flow, custom_handlers=custom_handlers, class_filter=class_filter + ) diff --git a/src/atomate2/vasp/run.py b/src/atomate2/vasp/run.py index 0553980700..2ebf814cb6 100644 --- a/src/atomate2/vasp/run.py +++ b/src/atomate2/vasp/run.py @@ -18,6 +18,7 @@ from custodian.vasp.handlers import ( FrozenJobErrorHandler, IncorrectSmearingHandler, + KspacingMetalHandler, LargeSigmaHandler, MeshSymmetryErrorHandler, NonConvergingErrorHandler, @@ -52,6 +53,7 @@ StdErrHandler(), LargeSigmaHandler(), IncorrectSmearingHandler(), + KspacingMetalHandler(), ) _DEFAULT_VALIDATORS = (VasprunXMLValidator(), VaspFilesValidator()) @@ -134,7 +136,7 @@ def run_vasp( if job_type == JobType.DIRECT: logger.info(f"Running command: {vasp_cmd}") - return_code = subprocess.call(vasp_cmd, shell=True) + return_code = subprocess.call(vasp_cmd, shell=True) # noqa: S602 logger.info(f"{vasp_cmd} finished running with returncode: {return_code}") return diff --git a/src/atomate2/vasp/schemas/elph.py b/src/atomate2/vasp/schemas/elph.py index 3b3751bc6d..22ba0132ba 100644 --- a/src/atomate2/vasp/schemas/elph.py +++ b/src/atomate2/vasp/schemas/elph.py @@ -162,7 +162,7 @@ def from_band_structures( "renormalisation" ) - if len({b.is_spin_polarized for b in displacement_band_structures}) != 1: + if len({band.is_spin_polarized for band in displacement_band_structures}) != 1: raise ValueError( "Some displacement bands structures are spin polarized and some are " "spin paired. Cannot continue." @@ -180,17 +180,20 @@ def from_band_structures( # discard metallic displacement calculations and log the issue keep = [] - for i, band_structure in enumerate(displacement_band_structures): + for idx, band_structure in enumerate(displacement_band_structures): if band_structure.is_metal(): - logger.warning("T = {} K band structure is metallic... skipping") + temp = temperatures[idx] + logger.warning(f"T = {temp} K band structure is metallic... skipping") else: - keep.append(i) + keep.append(idx) - temperatures = [temperatures[i] for i in keep] - displacement_band_structures = [displacement_band_structures[i] for i in keep] - displacement_structures = [displacement_structures[i] for i in keep] - displacement_dirs = [displacement_dirs[i] for i in keep] - displacement_uuids = [displacement_uuids[i] for i in keep] + temperatures = [temperatures[idx] for idx in keep] + displacement_band_structures = [ + displacement_band_structures[idx] for idx in keep + ] + displacement_structures = [displacement_structures[idx] for idx in keep] + displacement_dirs = [displacement_dirs[idx] for idx in keep] + displacement_uuids = [displacement_uuids[idx] for idx in keep] vbm_band_indices, cbm_band_indices = _get_band_edge_indices(bulk_band_structure) bulk_vbm = bulk_band_structure.get_vbm()["energy"] diff --git a/src/atomate2/vasp/schemas/md.py b/src/atomate2/vasp/schemas/md.py new file mode 100644 index 0000000000..c3b6364fb9 --- /dev/null +++ b/src/atomate2/vasp/schemas/md.py @@ -0,0 +1,16 @@ +"""Schemas for MD documents.""" + +from emmet.core.structure import StructureMetadata +from pydantic import Field +from pymatgen.core import Structure + + +class MultiMDOutput(StructureMetadata): + """Output of a MultiMD Flow.""" + + structure: Structure = Field("Final structure of the last step of the flow") + vasp_dir: str = Field("Path to the last vasp folder of the flow") + traj_ids: list[str] = Field("List of uuids of the MD calculations in the flow") + full_traj_ids: list[str] = Field( + "List of uuids of the MD calculations in the flow and in previous linked flows" + ) diff --git a/src/atomate2/vasp/sets/base.py b/src/atomate2/vasp/sets/base.py index 692367fe04..c80572fab9 100644 --- a/src/atomate2/vasp/sets/base.py +++ b/src/atomate2/vasp/sets/base.py @@ -7,6 +7,7 @@ import warnings from copy import deepcopy from dataclasses import dataclass, field +from importlib.resources import files as get_mod_path from itertools import groupby from pathlib import Path from typing import TYPE_CHECKING, Any @@ -14,7 +15,6 @@ import numpy as np from monty.io import zopen from monty.serialization import loadfn -from pkg_resources import resource_filename from pymatgen.electronic_structure.core import Magmom from pymatgen.io.core import InputGenerator, InputSet from pymatgen.io.vasp import Incar, Kpoints, Outcar, Poscar, Potcar, Vasprun @@ -34,7 +34,7 @@ from pymatgen.core import Structure -_BASE_VASP_SET = loadfn(resource_filename("atomate2.vasp.sets", "BaseVaspSet.yaml")) +_BASE_VASP_SET = loadfn(get_mod_path("atomate2.vasp.sets") / "BaseVaspSet.yaml") class VaspInputSet(InputSet): @@ -94,11 +94,7 @@ def write_input( if make_dir: os.makedirs(directory, exist_ok=True) - inputs = { - "INCAR": self.incar, - "KPOINTS": self.kpoints, - "POSCAR": self.poscar, - } + inputs = {"INCAR": self.incar, "KPOINTS": self.kpoints, "POSCAR": self.poscar} inputs.update(self.optional_files) if isinstance(self.potcar, Potcar): @@ -106,16 +102,16 @@ def write_input( else: inputs["POTCAR.spec"] = "\n".join(self.potcar) - for k, v in inputs.items(): - if v is not None and (overwrite or not (directory / k).exists()): - with zopen(directory / k, "wt") as f: - if isinstance(v, Poscar): + for key, val in inputs.items(): + if val is not None and (overwrite or not (directory / key).exists()): + with zopen(directory / key, mode="wt") as file: + if isinstance(val, Poscar): # write POSCAR with more significant figures - f.write(v.get_string(significant_figures=16)) + file.write(val.get_str(significant_figures=16)) else: - f.write(v.__str__()) - elif not overwrite and (directory / k).exists(): - raise FileExistsError(f"{directory / k} already exists.") + file.write(str(val)) + elif not overwrite and (directory / key).exists(): + raise FileExistsError(f"{directory / key} already exists.") @staticmethod def from_directory( @@ -171,32 +167,41 @@ def is_valid(self) -> bool: stacklevel=1, ) + ismear = self.incar.get("ISMEAR", 1) + sigma = self.incar.get("SIGMA", 0.2) if ( - all(k.is_metal for k in self.poscar.structure.composition) + all(elem.is_metal for elem in self.poscar.structure.composition) and self.incar.get("NSW", 0) > 0 - and self.incar.get("ISMEAR", 1) < 1 + and (ismear < 0 or (ismear == 0 and sigma > 0.05)) ): + ismear_docs = "https://www.vasp.at/wiki/index.php/ISMEAR" + msg = "" + if ismear < 0: + msg = f"Relaxation of likely metal with ISMEAR < 0 ({ismear})." + elif ismear == 0 and sigma > 0.05: + msg = f"ISMEAR = 0 with a small SIGMA ({sigma}) detected." warnings.warn( - "Relaxation of likely metal with ISMEAR < 1 detected. Please see VASP " - "recommendations on ISMEAR for metals.", + f"{msg} See VASP recommendations on ISMEAR for metals ({ismear_docs}).", BadInputSetWarning, stacklevel=1, ) - if self.incar.get("LHFCALC", False) is True and self.incar.get( - "ALGO", "Normal" - ) not in ["Normal", "All", "Damped"]: + if self.incar.get("LHFCALC") and self.incar.get("ALGO", "Normal") not in ( + "Normal", + "All", + "Damped", + ): warnings.warn( "Hybrid functionals only support Algo = All, Damped, or Normal.", BadInputSetWarning, stacklevel=1, ) - if not self.incar.get("LASPH", False) and ( + if not self.incar.get("LASPH") and ( self.incar.get("METAGGA") - or self.incar.get("LHFCALC", False) - or self.incar.get("LDAU", False) - or self.incar.get("LUSE_VDW", False) + or self.incar.get("LHFCALC") + or self.incar.get("LDAU") + or self.incar.get("LUSE_VDW") ): warnings.warn( "LASPH = True should be set for +U, meta-GGAs, hybrids, and vdW-DFT", @@ -234,8 +239,9 @@ class VaspInputGenerator(InputGenerator): so these keys can be defined in one of two ways, e.g. either {"LDAUU":{"O":{"Fe":5}}} to set LDAUU for Fe to 5 in an oxide, or {"LDAUU":{"Fe":5}} to set LDAUU to 5 regardless of the input structure. - To set magmoms, pass a dict mapping element symbols to magnetic moments, e.g. - {"MAGMOM": {"Co": 1}}. + To set magmoms, pass a dict mapping the strings of species to magnetic + moments, e.g. {"MAGMOM": {"Co": 1}} or {"MAGMOM": {"Fe2+,spin=4": 3.7}} in the + case of a site with Species("Fe2+", spin=4). If None is given, that key is unset. For example, {"ENCUT": None} will remove ENCUT from the incar settings. user_kpoints_settings @@ -245,8 +251,8 @@ class VaspInputGenerator(InputGenerator): Allow user to override POTCARs. E.g., {"Gd": "Gd_3"}. user_potcar_functional Functional to use. Default is to use the functional in the config dictionary. - Valid values: "PBE", "PBE_52", "PBE_54", "LDA", "LDA_52", "LDA_54", "PW91", - "LDA_US", "PW91_US". + Valid values: "PBE", "PBE_52", "PBE_54", "PBE_64", "LDA", "LDA_52", "LDA_54", + "LDA_64", "PW91", "LDA_US", "PW91_US". auto_ismear If true, the values for ISMEAR and SIGMA will be set automatically depending on the bandgap of the system. If the bandgap is not known (e.g., there is no @@ -267,7 +273,7 @@ class VaspInputGenerator(InputGenerator): auto_kspacing If true, automatically use the VASP recommended KSPACING based on bandgap, i.e. higher kpoint spacing for insulators than metals. Can be boolean or float. - If float, then the value will interpreted as the bandgap in eV to use for the + If a float, the value will be interpreted as the bandgap in eV to use for the KSPACING calculation. constrain_total_magmom Whether to constrain the total magmom (NUPDOWN in INCAR) to be the sum of the @@ -436,10 +442,20 @@ def get_input_set( bandgap=bandgap, ispin=ispin, ) + site_properties = structure.site_properties + poscar = Poscar( + structure, + velocities=site_properties.get("velocities"), + predictor_corrector=site_properties.get("predictor_corrector"), + predictor_corrector_preamble=structure.properties.get( + "predictor_corrector_preamble" + ), + lattice_velocities=structure.properties.get("lattice_velocities"), + ) return VaspInputSet( incar=incar, kpoints=kpoints, - poscar=Poscar(structure), + poscar=poscar, potcar=self._get_potcar(structure, potcar_spec=potcar_spec), ) @@ -643,7 +659,7 @@ def _get_incar( if k == "MAGMOM": incar[k] = _get_magmoms( structure, - magmoms=self.user_incar_settings.get("MAGMOMS", {}), + magmoms=self.user_incar_settings.get("MAGMOM", {}), config_magmoms=config_magmoms, ) elif k in ("LDAUU", "LDAUJ", "LDAUL") and incar_settings.get("LDAU", False): @@ -714,7 +730,9 @@ def _get_incar( # Finally, re-apply `self.user_incar_settings` to make sure any accidentally # overwritten settings are changed back to the intended values. - _apply_incar_updates(incar, self.user_incar_settings) + # skip dictionary parameters to avoid dictionaries appearing in the INCAR + skip = ["LDAUU", "LDAUJ", "LDAUL", "MAGMOM"] + _apply_incar_updates(incar, self.user_incar_settings, skip=skip) return incar @@ -877,15 +895,12 @@ def _get_kpoints( return _combine_kpoints(base_kpoints, zero_weighted_kpoints, added_kpoints) - def _kspacing(self, incar_updates) -> float | None: + def _kspacing(self, incar_updates: dict[str, Any]) -> float | None: """Get KSPACING value based on the config dict, updates and user settings.""" - if "KSPACING" in self.user_incar_settings: - return self.user_incar_settings["KSPACING"] - if "KSPACING" in incar_updates: - return incar_updates["KSPACING"] - if "KSPACING" in self.config_dict["INCAR"]: - return self.config_dict["INCAR"]["KSPACING"] - return None + key = "KSPACING" + return self.user_incar_settings.get( + key, incar_updates.get(key, self.config_dict["INCAR"].get(key)) + ) def _get_magmoms( @@ -928,7 +943,9 @@ def _get_magmoms( return mag -def _get_u_param(lda_param, lda_config, structure: Structure) -> list[float]: +def _get_u_param( + lda_param: str, lda_config: dict[str, Any], structure: Structure +) -> list[float]: """Get U parameters.""" comp = structure.composition elements = sorted((el for el in comp.elements if comp[el] > 0), key=lambda e: e.X) @@ -949,14 +966,18 @@ def _get_u_param(lda_param, lda_config, structure: Structure) -> list[float]: ] -def _get_ediff(param, value, structure: Structure, incar_settings) -> float: +def _get_ediff( + param: str, value: str | float, structure: Structure, incar_settings: dict[str, Any] +) -> float: """Get EDIFF.""" if incar_settings.get("EDIFF") is None and param == "EDIFF_PER_ATOM": return float(value) * structure.num_sites return float(incar_settings["EDIFF"]) -def _set_u_params(incar: Incar, incar_settings, structure: Structure) -> None: +def _set_u_params( + incar: Incar, incar_settings: dict[str, Any], structure: Structure +) -> None: """Modify INCAR for use with U parameters.""" has_u = incar_settings.get("LDAU") and sum(incar["LDAUU"]) > 0 @@ -978,7 +999,9 @@ def _set_u_params(incar: Incar, incar_settings, structure: Structure) -> None: incar.setdefault("LMAXMIX", 4) -def _apply_incar_updates(incar, updates, skip: Sequence[str] = ()) -> None: +def _apply_incar_updates( + incar: dict[str, Any], updates: dict[str, Any], skip: Sequence[str] = () +) -> None: """ Apply updates to an INCAR file. @@ -991,17 +1014,19 @@ def _apply_incar_updates(incar, updates, skip: Sequence[str] = ()) -> None: skip Keys to skip. """ - for k, v in updates.items(): - if k in skip: + for key, val in updates.items(): + if key in skip: continue - if v is None: - incar.pop(k, None) + if val is None: + incar.pop(key, None) else: - incar[k] = v + incar[key] = val -def _remove_unused_incar_params(incar, skip: Sequence[str] = ()) -> None: +def _remove_unused_incar_params( + incar: dict[str, Any], skip: Sequence[str] = () +) -> None: """ Remove INCAR parameters that are not actively used by VASP. @@ -1024,8 +1049,8 @@ def _remove_unused_incar_params(incar, skip: Sequence[str] = ()) -> None: incar.pop("MAGMOM", None) # Turn off +U flags if +U is not even used - ldau_flags = ["LDAUU", "LDAUJ", "LDAUL", "LDAUTYPE"] - if incar.get("LDAU", False) is False: + ldau_flags = ("LDAUU", "LDAUJ", "LDAUL", "LDAUTYPE") + if not incar.get("LDAU"): for ldau_flag in ldau_flags: if ldau_flag not in skip: incar.pop(ldau_flag, None) @@ -1033,19 +1058,16 @@ def _remove_unused_incar_params(incar, skip: Sequence[str] = ()) -> None: def _combine_kpoints(*kpoints_objects: Kpoints) -> Kpoints: """Combine k-points files together.""" - labels = [] - kpoints = [] - weights = [] + labels, kpoints, weights = [], [], [] + recip_mode = Kpoints.supported_modes.Reciprocal for kpoints_object in filter(None, kpoints_objects): - if kpoints_object.style != Kpoints.supported_modes.Reciprocal: + if kpoints_object.style != recip_mode: raise ValueError( - "Can only combine kpoints with style=Kpoints.supported_modes.Reciprocal" + f"Can only combine kpoints with style {recip_mode}, " + f"got {kpoints_object.style}" ) - if kpoints_object.labels is None: - labels.append([""] * len(kpoints_object.kpts)) - else: - labels.append(kpoints_object.labels) + labels.append(kpoints_object.labels or [""] * len(kpoints_object.kpts)) weights.append(kpoints_object.kpts_weights) kpoints.append(kpoints_object.kpts) @@ -1055,7 +1077,7 @@ def _combine_kpoints(*kpoints_objects: Kpoints) -> Kpoints: kpoints = np.concatenate(kpoints) return Kpoints( comment="Combined k-points", - style=Kpoints.supported_modes.Reciprocal, + style=recip_mode, num_kpts=len(kpoints), kpts=kpoints, labels=labels, diff --git a/src/atomate2/vasp/sets/core.py b/src/atomate2/vasp/sets/core.py index a405eb9fd0..bf8996edcf 100644 --- a/src/atomate2/vasp/sets/core.py +++ b/src/atomate2/vasp/sets/core.py @@ -823,7 +823,7 @@ class MDSetGenerator(VaspInputGenerator): start_temp: float = 300 end_temp: float = 300 nsteps: int = 1000 - time_step: int = 2 + time_step: float = 2 auto_ispin: bool = True def get_incar_updates( diff --git a/src/atomate2/vasp/sets/eos.py b/src/atomate2/vasp/sets/eos.py new file mode 100644 index 0000000000..44564928fa --- /dev/null +++ b/src/atomate2/vasp/sets/eos.py @@ -0,0 +1,520 @@ +""" +Module defining equation of state (EOS) parameter sets. + +Three families of sets: default atomate2 params, +MP GGA compatible, and MP meta-GGA compatible +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from importlib.resources import files as import_files +from typing import TYPE_CHECKING + +from monty.serialization import loadfn + +from atomate2.vasp.sets.base import VaspInputGenerator + +if TYPE_CHECKING: + from pymatgen.core import Structure + from pymatgen.io.vasp import Outcar, Vasprun + + +_BASE_MP_GGA_RELAX_SET = loadfn( + import_files("atomate2.vasp.sets") / "BaseMPGGASet.yaml" +) +_BASE_MP_R2SCAN_RELAX_SET = loadfn( + import_files("atomate2.vasp.sets") / "BaseMPR2SCANRelaxSet.yaml" +) + + +@dataclass +class EosSetGenerator(VaspInputGenerator): + """Class to generate VASP EOS deformation + relax input sets.""" + + force_gamma: bool = True + auto_ismear: bool = False + auto_kspacing: bool = False + inherit_incar: bool = False + + def get_incar_updates( + self, + structure: Structure, + prev_incar: dict = None, + bandgap: float = None, + vasprun: Vasprun = None, + outcar: Outcar = None, + ) -> dict: + """ + Get updates to the INCAR for a relaxation job. + + Parameters + ---------- + structure + A structure. + prev_incar + An incar from a previous calculation. + bandgap + The band gap. + vasprun + A vasprun from a previous calculation. + outcar + An outcar from a previous calculation. + + Returns + ------- + dict + A dictionary of updates to apply. + """ + return { + "NSW": 99, + "LCHARG": False, + "ISIF": 3, + "IBRION": 2, + "EDIFF": 1.0e-6, + "ENCUT": 680, + "ENAUG": 1360, + "LREAL": False, + "LWAVE": True, + "ISMEAR": 0, + "SIGMA": 0.05, + "KSPACING": 0.22, + } + + +# MPLegacy prefix = MP PBE-GGA compatible with atomate implementation + + +@dataclass +class MPLegacyEosRelaxSetGenerator(VaspInputGenerator): + """Class to generate atomate1-MP-compatible VASP GGA EOS relax input sets.""" + + config_dict: dict = field(default_factory=lambda: _BASE_MP_GGA_RELAX_SET) + auto_ismear: bool = False + auto_kspacing: bool = False + inherit_incar: bool = False + + def get_incar_updates( + self, + structure: Structure, + prev_incar: dict = None, + bandgap: float = None, + vasprun: Vasprun = None, + outcar: Outcar = None, + ) -> dict: + """ + Get updates to the INCAR for a relaxation job. + + Parameters + ---------- + structure + A structure. + prev_incar + An incar from a previous calculation. + bandgap + The band gap. + vasprun + A vasprun from a previous calculation. + outcar + An outcar from a previous calculation. + + Returns + ------- + dict + A dictionary of updates to apply. + """ + return { + "NSW": 99, + "LCHARG": False, + "ISIF": 3, + "IBRION": 2, + "EDIFF": 1.0e-6, + "ENCUT": 600, + "LREAL": False, + "LWAVE": True, + } + + def get_kpoints_updates( + self, + structure: Structure, + prev_incar: dict = None, + bandgap: float = 0.0, + vasprun: Vasprun = None, + outcar: Outcar = None, + ) -> dict: + """ + Get updates to the kpoints configuration for a non-self consistent VASP job. + + Note, these updates will be ignored if the user has set user_kpoint_settings. + + Parameters + ---------- + structure + A structure. + prev_incar + An incar from a previous calculation. + bandgap + The band gap. + vasprun + A vasprun from a previous calculation. + outcar + An outcar from a previous calculation. + + Returns + ------- + dict + A dictionary of updates to apply to the KPOINTS config. + """ + return {"grid_density": 7000} + + +@dataclass +class MPLegacyEosStaticSetGenerator(EosSetGenerator): + """Class to generate atomate1-MP-compatible VASP GGA EOS relax input sets.""" + + config_dict: dict = field(default_factory=lambda: _BASE_MP_GGA_RELAX_SET) + auto_ismear: bool = False + auto_kspacing: bool = False + inherit_incar: bool = False + + def get_incar_updates( + self, + structure: Structure, + prev_incar: dict = None, + bandgap: float = None, + vasprun: Vasprun = None, + outcar: Outcar = None, + ) -> dict: + """ + Get updates to the INCAR for a relaxation job. + + Parameters + ---------- + structure + A structure. + prev_incar + An incar from a previous calculation. + bandgap + The band gap. + vasprun + A vasprun from a previous calculation. + outcar + An outcar from a previous calculation. + + Returns + ------- + dict + A dictionary of updates to apply. + """ + # Original atomate wf_bulk_modulus had 600 eV cutoff + # and k-point grid_density = 7,000 + return { + "NSW": 0, + "LCHARG": False, + "EDIFF": 1.0e-6, + "ENCUT": 600, + "LREAL": False, + "LWAVE": False, + "IBRION": -1, + "ISMEAR": -5, + "LORBIT": 11, + "ALGO": "Normal", + } + + +# MPGGA prefix = MP GGA compatible + + +@dataclass +class MPGGAEosRelaxSetGenerator(VaspInputGenerator): + """Class to generate MP-compatible VASP GGA EOS relax input sets.""" + + config_dict: dict = field(default_factory=lambda: _BASE_MP_R2SCAN_RELAX_SET) + auto_ismear: bool = False + auto_kspacing: bool = False + inherit_incar: bool = False + + def get_incar_updates( + self, + structure: Structure, + prev_incar: dict = None, + bandgap: float = None, + vasprun: Vasprun = None, + outcar: Outcar = None, + ) -> dict: + """ + Get updates to the INCAR for a relaxation job. + + Parameters + ---------- + structure + A structure. + prev_incar + An incar from a previous calculation. + bandgap + The band gap. + vasprun + A vasprun from a previous calculation. + outcar + An outcar from a previous calculation. + + Returns + ------- + dict + A dictionary of updates to apply. + """ + return { + "NSW": 99, + "LCHARG": False, + "ISIF": 3, + "IBRION": 2, + "EDIFF": 1.0e-6, + "ALGO": "FAST", + "LREAL": False, + "LWAVE": True, + "ISMEAR": 0, + "SIGMA": 0.05, + "LMAXMIX": 6, + "KSPACING": 0.22, + "METAGGA": None, + } + + +@dataclass +class MPGGAEosStaticSetGenerator(EosSetGenerator): + """Class to generate MP-compatible VASP GGA EOS relax input sets.""" + + config_dict: dict = field(default_factory=lambda: _BASE_MP_R2SCAN_RELAX_SET) + auto_ismear: bool = False + auto_kspacing: bool = False + inherit_incar: bool = False + + def get_incar_updates( + self, + structure: Structure, + prev_incar: dict = None, + bandgap: float = None, + vasprun: Vasprun = None, + outcar: Outcar = None, + ) -> dict: + """ + Get updates to the INCAR for a relaxation job. + + Parameters + ---------- + structure + A structure. + prev_incar + An incar from a previous calculation. + bandgap + The band gap. + vasprun + A vasprun from a previous calculation. + outcar + An outcar from a previous calculation. + + Returns + ------- + dict + A dictionary of updates to apply. + """ + return { + "NSW": 0, + "LCHARG": False, + "IBRION": -1, + "EDIFF": 1.0e-6, + "ALGO": "NORMAL", + "LREAL": False, + "LWAVE": False, + "ISMEAR": -5, + "LMAXMIX": 6, + "KSPACING": 0.22, + "METAGGA": None, + } + + +# MPMetaGGA prefix = MP r2SCAN meta-GGA compatible + + +@dataclass +class MPMetaGGAEosStaticSetGenerator(VaspInputGenerator): + """Class to generate MP-compatible VASP Meta-GGA static input sets.""" + + config_dict: dict = field(default_factory=lambda: _BASE_MP_R2SCAN_RELAX_SET) + auto_ismear: bool = False + auto_kspacing: bool = False + inherit_incar: bool = False + + def get_incar_updates( + self, + structure: Structure, + prev_incar: dict = None, + bandgap: float = None, + vasprun: Vasprun = None, + outcar: Outcar = None, + ) -> dict: + """ + Get updates to the INCAR for this calculation type. + + Parameters + ---------- + structure + A structure. + prev_incar + An incar from a previous calculation. + bandgap + The band gap. + vasprun + A vasprun from a previous calculation. + outcar + An outcar from a previous calculation. + + Returns + ------- + dict + A dictionary of updates to apply. + """ + return { + "EDIFF": 1.0e-6, + "ALGO": "NORMAL", + "GGA": None, # unset GGA, shouldn't be set anyway but best be sure + "NSW": 0, + "LCHARG": True, + "LWAVE": False, + "LREAL": False, + "ISMEAR": -5, + "IBRION": -1, + "LMAXMIX": 6, + "KSPACING": 0.22, + } + + +@dataclass +class MPMetaGGAEosRelaxSetGenerator(VaspInputGenerator): + """Class to generate MP-compatible VASP meta-GGA relaxation input sets. + + Parameters + ---------- + config_dict: dict + The config dict. + bandgap_tol: float + Tolerance for metallic bandgap. If bandgap < bandgap_tol, KSPACING will be 0.22, + otherwise it will increase with bandgap up to a max of 0.44. + """ + + config_dict: dict = field(default_factory=lambda: _BASE_MP_R2SCAN_RELAX_SET) + bandgap_tol: float = 1e-4 + auto_ismear: bool = False + auto_kspacing: bool = False + inherit_incar: bool = False + + def get_incar_updates( + self, + structure: Structure, + prev_incar: dict = None, + bandgap: float = None, + vasprun: Vasprun = None, + outcar: Outcar = None, + ) -> dict: + """ + Get updates to the INCAR for this calculation type. + + Parameters + ---------- + structure + A structure. + prev_incar + An incar from a previous calculation. + bandgap + The band gap. + vasprun + A vasprun from a previous calculation. + outcar + An outcar from a previous calculation. + + Returns + ------- + dict + A dictionary of updates to apply. + """ + # unset GGA, shouldn't be set anyway but doesn't hurt to be sure + return { + "LCHARG": True, + "LWAVE": True, + "GGA": None, + "LMAXMIX": 6, + "KSPACING": 0.22, + "NSW": 99, + "ISIF": 3, + "IBRION": 2, + "EDIFF": 1.0e-6, + "LREAL": False, + "ISMEAR": 0, + "SIGMA": 0.05, + } + + +@dataclass +class MPMetaGGAEosPreRelaxSetGenerator(VaspInputGenerator): + """Class to generate MP-compatible VASP meta-GGA pre-relaxation input sets. + + Parameters + ---------- + config_dict: dict + The config dict. + bandgap_tol: float + Tolerance for metallic bandgap. If bandgap < bandgap_tol, KSPACING will be 0.22, + otherwise it will increase with bandgap up to a max of 0.44. + """ + + config_dict: dict = field(default_factory=lambda: _BASE_MP_R2SCAN_RELAX_SET) + bandgap_tol: float = 1e-4 + auto_ismear: bool = False + auto_kspacing: bool = False + inherit_incar: bool = False + + def get_incar_updates( + self, + structure: Structure, + prev_incar: dict = None, + bandgap: float = None, + vasprun: Vasprun = None, + outcar: Outcar = None, + ) -> dict: + """ + Get updates to the INCAR for this calculation type. + + Parameters + ---------- + structure + A structure. + prev_incar + An incar from a previous calculation. + bandgap + The band gap. + vasprun + A vasprun from a previous calculation. + outcar + An outcar from a previous calculation. + + Returns + ------- + dict + A dictionary of updates to apply. + """ + # unset METAGGA, shouldn't be set anyway but doesn't hurt to be sure + return { + "LCHARG": True, + "LWAVE": True, + "GGA": "PS", + "METAGGA": None, + "NSW": 99, + "ISIF": 3, + "IBRION": 2, + "EDIFF": 1.0e-6, + "EDIFFG": -0.05, + "LREAL": False, + "ISMEAR": 0, + "SIGMA": 0.05, + "KSPACING": 0.22, + } diff --git a/src/atomate2/vasp/sets/matpes.py b/src/atomate2/vasp/sets/matpes.py index 19bfdc5ee3..adeaaa1a2b 100644 --- a/src/atomate2/vasp/sets/matpes.py +++ b/src/atomate2/vasp/sets/matpes.py @@ -7,10 +7,10 @@ from __future__ import annotations from dataclasses import dataclass, field +from importlib.resources import files as get_mod_path from typing import TYPE_CHECKING from monty.serialization import loadfn -from pkg_resources import resource_filename from atomate2.vasp.sets.base import VaspInputGenerator @@ -21,13 +21,11 @@ # POTCAR section comes from PARENT but atomate2 does not support inheritance yet _BASE_MATPES_PBE_STATIC_SET_NO_POTCAR = loadfn( - resource_filename("pymatgen.io.vasp", "MatPESStaticSet.yaml") + get_mod_path("pymatgen.io.vasp") / "MatPESStaticSet.yaml" ) -_BASE_PBE54_SET = loadfn(resource_filename("pymatgen.io.vasp", "PBE54Base.yaml")) -_BASE_MATPES_PBE_STATIC_SET = { - **_BASE_PBE54_SET, - **_BASE_MATPES_PBE_STATIC_SET_NO_POTCAR, -} +_POTCAR_BASE_FILE = f"{_BASE_MATPES_PBE_STATIC_SET_NO_POTCAR['PARENT']}.yaml" +_POTCAR_SET = loadfn(get_mod_path("pymatgen.io.vasp") / _POTCAR_BASE_FILE) +_BASE_MATPES_PBE_STATIC_SET = {**_POTCAR_SET, **_BASE_MATPES_PBE_STATIC_SET_NO_POTCAR} @dataclass @@ -72,7 +70,7 @@ def get_incar_updates( @dataclass class MatPesMetaGGAStaticSetGenerator(MatPesGGAStaticSetGenerator): - """Class to generate MP-compatible VASP GGA static input sets.""" + """Class to generate MP-compatible VASP meta-GGA static input sets.""" def get_incar_updates( self, diff --git a/src/atomate2/vasp/sets/mp.py b/src/atomate2/vasp/sets/mp.py index 63ecbe9186..8ff1029c6d 100644 --- a/src/atomate2/vasp/sets/mp.py +++ b/src/atomate2/vasp/sets/mp.py @@ -9,10 +9,10 @@ from __future__ import annotations from dataclasses import dataclass, field +from importlib.resources import files as get_mod_path from typing import TYPE_CHECKING from monty.serialization import loadfn -from pkg_resources import resource_filename from atomate2.vasp.sets.core import RelaxSetGenerator, StaticSetGenerator @@ -21,10 +21,10 @@ from pymatgen.io.vasp import Outcar, Vasprun _BASE_MP_GGA_RELAX_SET = loadfn( - resource_filename("atomate2.vasp.sets", "BaseMPGGASet.yaml") + get_mod_path("atomate2.vasp.sets") / "BaseMPGGASet.yaml" ) _BASE_MP_R2SCAN_RELAX_SET = loadfn( - resource_filename("atomate2.vasp.sets", "BaseMPR2SCANRelaxSet.yaml") + get_mod_path("atomate2.vasp.sets") / "BaseMPR2SCANRelaxSet.yaml" ) @@ -33,8 +33,9 @@ class MPGGARelaxSetGenerator(RelaxSetGenerator): """Class to generate MP-compatible VASP GGA relaxation input sets.""" config_dict: dict = field(default_factory=lambda: _BASE_MP_GGA_RELAX_SET) + auto_ismear: bool = False auto_kspacing: bool = True - inherit_incar: bool = False + inherit_incar: bool | None = False @dataclass @@ -42,8 +43,9 @@ class MPGGAStaticSetGenerator(StaticSetGenerator): """Class to generate MP-compatible VASP GGA static input sets.""" config_dict: dict = field(default_factory=lambda: _BASE_MP_GGA_RELAX_SET) + auto_ismear: bool = False auto_kspacing: bool = True - inherit_incar: bool = False + inherit_incar: bool | None = False def get_incar_updates( self, @@ -89,8 +91,10 @@ class MPMetaGGAStaticSetGenerator(StaticSetGenerator): """Class to generate MP-compatible VASP GGA static input sets.""" config_dict: dict = field(default_factory=lambda: _BASE_MP_R2SCAN_RELAX_SET) + auto_ismear: bool = False auto_kspacing: bool = True - inherit_incar: bool = False + bandgap_tol: float = 1e-4 + inherit_incar: bool | None = False def get_incar_updates( self, @@ -147,8 +151,9 @@ class MPMetaGGARelaxSetGenerator(RelaxSetGenerator): config_dict: dict = field(default_factory=lambda: _BASE_MP_R2SCAN_RELAX_SET) bandgap_tol: float = 1e-4 + auto_ismear: bool = False auto_kspacing: bool = True - inherit_incar: bool = False + inherit_incar: bool | None = False def get_incar_updates( self, diff --git a/tests/aims/__init__.py b/tests/aims/__init__.py new file mode 100644 index 0000000000..332c3ccf52 --- /dev/null +++ b/tests/aims/__init__.py @@ -0,0 +1,35 @@ +"""Utils or testing""" + +import gzip +import json +from glob import glob +from pathlib import Path + + +def compare_files(test_name, work_dir, ref_dir): + for file in glob(f"{work_dir / test_name}/*in"): + with open(file) as test_file: + test_lines = [ + line.strip() + for line in test_file.readlines()[4:] + if len(line.strip()) > 0 + ] + + with gzip.open(f"{ref_dir / test_name / Path(file).name}.gz", "rt") as ref_file: + ref_lines = [ + line.strip() + for line in ref_file.readlines()[4:] + if len(line.strip()) > 0 + ] + + assert test_lines == ref_lines + + with open(f"{ref_dir / test_name}/parameters.json") as ref_file: + ref = json.load(ref_file) + ref.pop("species_dir", None) + + with open(f"{work_dir / test_name}/parameters.json") as check_file: + check = json.load(check_file) + check.pop("species_dir", None) + + assert ref == check diff --git a/tests/aims/conftest.py b/tests/aims/conftest.py new file mode 100644 index 0000000000..e27c28a7ce --- /dev/null +++ b/tests/aims/conftest.py @@ -0,0 +1,219 @@ +from __future__ import annotations + +import logging +import os +from pathlib import Path +from typing import TYPE_CHECKING, Literal + +import pytest +from pymatgen.core import Lattice, Molecule, Structure +from pymatgen.io.aims.sets.base import AimsInputGenerator + +import atomate2.aims.jobs.base +import atomate2.aims.run +from atomate2.common.files import gunzip_files + +if TYPE_CHECKING: + from collections.abc import Sequence + + +_REF_PATHS = {} +_FAKE_RUN_AIMS_KWARGS = {} +_VFILES = "control.in" + + +logger = logging.getLogger(__name__) + + +def pytest_addoption(parser): + parser.addoption( + "--generate-test-data", + action="store_true", + help="Runs FHI-aims to create test data;" + " runs tests against the created outputs", + ) + + +@pytest.fixture() +def si(): + return Structure( + lattice=Lattice( + [[0.0, 2.715, 2.715], [2.715, 0.0, 2.715], [2.715, 2.715, 0.0]] + ), + species=["Si", "Si"], + coords=[[0, 0, 0], [0.25, 0.25, 0.25]], + ) + + +@pytest.fixture() +def o2(): + return Molecule(species=["O", "O"], coords=[[0, 0, 0.622978], [0, 0, -0.622978]]) + + +@pytest.fixture(scope="session") +def species_dir(): + return Path(__file__).resolve().parent / "species_dir" + + +@pytest.fixture(scope="session") +def ref_path(): + from pathlib import Path + + module_dir = Path(__file__).resolve().parents[1] + test_dir = module_dir / "test_data/aims/" + return test_dir.resolve() + + +@pytest.fixture() +def should_mock_aims(request): + try: + return not request.config.getoption("--generate-test-data") + except ValueError: + return True + + +@pytest.fixture() +def mock_aims(monkeypatch, ref_path, should_mock_aims): + """ + This fixture allows one to mock (fake) running FHI-aims. + + To use the fixture successfully, the following steps must be followed: + 1. "mock_aims" should be included as an argument to any test that would like to use + its functionally. + 2. For each job in your workflow, you should prepare a reference directory + containing two folders "inputs" (containing the reference input files expected + to be produced by write_aims_input_set) and "outputs" (containing the expected + output files to be produced by run_aims). These files should reside in a + subdirectory of "tests/test_data/aims". + 3. Create a dictionary mapping each job name to its reference directory. Note that + you should supply the reference directory relative to the "tests/test_data/aims" + folder. For example, if your calculation has one job named "static" and the + reference files are present in "tests/test_data/aims/Si_static", the dictionary + would look like: ``{"static": "Si_static"}``. + 4. Optional (does not work yet): create a dictionary mapping each job name to + custom keyword arguments that will be supplied to fake_run_aims. + This way you can configure which control.in settings are expected for each job. + For example, if your calculation has one job named "static" and you wish to + validate that "xc" is set correctly in the control.in, your dictionary would + look like + ``{"static": {"input_settings": {"relativistic": "atomic_zora scalar"}}``. + 5. Inside the test function, call `mock_aims(ref_paths, fake_aims_kwargs)`, where + ref_paths is the dictionary created in step 3 and fake_aims_kwargs is the + dictionary created in step 4. + 6. Run your aims job after calling `mock_aims`. + + For examples, see the tests in tests/aims/jobs/core.py. + """ + + def mock_run_aims(*args, **kwargs): + from jobflow import CURRENT_JOB + + name = CURRENT_JOB.job.name + ref_dir = ref_path / _REF_PATHS[name] + fake_run_aims(ref_dir, **_FAKE_RUN_AIMS_KWARGS.get(name, {})) + + get_input_set_orig = AimsInputGenerator.get_input_set + + def generate_test_data(*args, **kwargs): + """A monkey patch for atomate2.aims.run.run_aims + + Runs the actual executable and copies inputs and outputs to the + test data directory + """ + import shutil + + from jobflow import CURRENT_JOB + + input_files = ["control.in", "geometry.in", "parameters.json"] + name = CURRENT_JOB.job.name + ref_dir = ref_path / _REF_PATHS[name] + # running aims + atomate2.aims.run.run_aims() + # copy output files + output_files = [f for f in Path.cwd().glob("*") if f.name not in input_files] + shutil.rmtree(ref_dir, ignore_errors=True) + os.makedirs(ref_dir / "inputs") + os.makedirs(ref_dir / "outputs") + for f in input_files: + shutil.copy(Path.cwd() / f, ref_dir / "inputs") + for f in output_files: + shutil.copy(f, ref_dir / "outputs") + + def mock_get_input_set(self, *args, **kwargs): + return get_input_set_orig(self, *args, **kwargs) + + if should_mock_aims: + monkeypatch.setattr(atomate2.aims.run, "run_aims", mock_run_aims) + monkeypatch.setattr(atomate2.aims.jobs.base, "run_aims", mock_run_aims) + monkeypatch.setattr(AimsInputGenerator, "get_input_set", mock_get_input_set) + else: + monkeypatch.setattr(atomate2.aims.jobs.base, "run_aims", generate_test_data) + + def _run(ref_paths, fake_run_aims_kwargs=None): + if fake_run_aims_kwargs is None: + fake_run_aims_kwargs = {} + + _REF_PATHS.update(ref_paths) + _FAKE_RUN_AIMS_KWARGS.update(fake_run_aims_kwargs) + + yield _run + + monkeypatch.undo() + _REF_PATHS.clear() + _FAKE_RUN_AIMS_KWARGS.clear() + + +def fake_run_aims( + ref_path: str | Path, + input_settings: Sequence[str] = (), + check_inputs: Sequence[Literal["control.in"]] = _VFILES, + clear_inputs: bool = False, +): + """ + Emulate running aims and validate aims input files. + + Parameters + ---------- + ref_path + Path to reference directory with aims input files in the folder named 'inputs' + and output files in the folder named 'outputs'. + input_settings + A list of input settings to check. + check_inputs + A list of aims input files to check. Supported options are "aims.inp" + clear_inputs + Whether to clear input files before copying in the reference aims outputs. + """ + logger.info("Running fake aims.") + + ref_path = Path(ref_path) + + logger.info("Verified inputs successfully") + + if clear_inputs: + clear_aims_inputs() + + copy_aims_outputs(ref_path) + gunzip_files( + include_files=list(Path.cwd().glob("*")), + allow_missing=True, + ) + + # pretend to run aims by copying pre-generated outputs from reference dir + logger.info("Generated fake aims outputs") + + +def clear_aims_inputs(): + for aims_file in ("control.in", "geometry.in", "parameters.json"): + if Path(aims_file).exists(): + Path(aims_file).unlink() + logger.info("Cleared aims inputs") + + +def copy_aims_outputs(ref_path: str | Path): + import shutil + + output_path = ref_path / "outputs" + for output_file in output_path.iterdir(): + if output_file.is_file(): + shutil.copy(output_file, ".") diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/std_err.txt b/tests/aims/species_dir/light/01_H_default similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/std_err.txt rename to tests/aims/species_dir/light/01_H_default diff --git a/tests/aims/species_dir/light/08_O_default b/tests/aims/species_dir/light/08_O_default new file mode 100644 index 0000000000..9232a9aab7 --- /dev/null +++ b/tests/aims/species_dir/light/08_O_default @@ -0,0 +1,80 @@ +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for O atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +################################################################################ + species O +# global species definitions + nucleus 8 + mass 15.9994 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 36 5.0 + radial_multiplier 1 + angular_grids specified + division 0.2659 50 + division 0.4451 110 + division 0.6052 194 + division 0.7543 302 +# division 0.8014 434 +# division 0.8507 590 +# division 0.8762 770 +# division 0.9023 974 +# division 1.2339 1202 +# outer_grid 974 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 2 s 2. + valence 2 p 4. +# ion occupancy + ion_occ 2 s 1. + ion_occ 2 p 3. +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Constructed for dimers: 1.0 A, 1.208 A, 1.5 A, 2.0 A, 3.0 A +# +################################################################################ +# "First tier" - improvements: -699.05 meV to -159.38 meV + hydro 2 p 1.8 + hydro 3 d 7.6 + hydro 3 s 6.4 +# "Second tier" - improvements: -49.91 meV to -5.39 meV +# hydro 4 f 11.6 +# hydro 3 p 6.2 +# hydro 3 d 5.6 +# hydro 5 g 17.6 +# hydro 1 s 0.75 +# "Third tier" - improvements: -2.83 meV to -0.50 meV +# ionic 2 p auto +# hydro 4 f 10.8 +# hydro 4 d 4.7 +# hydro 2 s 6.8 +# "Fourth tier" - improvements: -0.40 meV to -0.12 meV +# hydro 3 p 5 +# hydro 3 s 3.3 +# hydro 5 g 15.6 +# hydro 4 f 17.6 +# hydro 4 d 14 +# Further basis functions - -0.08 meV and below +# hydro 3 s 2.1 +# hydro 4 d 11.6 +# hydro 3 p 16 +# hydro 2 s 17.2 diff --git a/tests/aims/species_dir/light/14_Si_default b/tests/aims/species_dir/light/14_Si_default new file mode 100644 index 0000000000..83008b4edf --- /dev/null +++ b/tests/aims/species_dir/light/14_Si_default @@ -0,0 +1,87 @@ +################################################################################ +# +# FHI-aims code project +# VB, Fritz-Haber Institut, 2009 +# +# Suggested "light" defaults for Si atom (to be pasted into control.in file) +# Be sure to double-check any results obtained with these settings for post-processing, +# e.g., with the "tight" defaults and larger basis sets. +# +# 2020/09/08 Added f function to "light" after reinspection of Delta test outcomes. +# This was done for all of Al-Cl and is a tricky decision since it makes +# "light" calculations measurably more expensive for these elements. +# Nevertheless, outcomes for P, S, Cl (and to some extent, Si) appear +# to justify this choice. +# +################################################################################ + species Si +# global species definitions + nucleus 14 + mass 28.0855 +# + l_hartree 4 +# + cut_pot 3.5 1.5 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 42 5.0 + radial_multiplier 1 + angular_grids specified + division 0.5866 50 + division 0.9616 110 + division 1.2249 194 + division 1.3795 302 +# division 1.4810 434 +# division 1.5529 590 +# division 1.6284 770 +# division 1.7077 974 +# division 2.4068 1202 +# outer_grid 974 + outer_grid 302 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 3 s 2. + valence 3 p 2. +# ion occupancy + ion_occ 3 s 1. + ion_occ 3 p 1. +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Constructed for dimers: 1.75 A, 2.0 A, 2.25 A, 2.75 A, 3.75 A +# +################################################################################ +# "First tier" - improvements: -571.96 meV to -37.03 meV + hydro 3 d 4.2 + hydro 2 p 1.4 + hydro 4 f 6.2 + ionic 3 s auto +# "Second tier" - improvements: -16.76 meV to -3.03 meV +# hydro 3 d 9 +# hydro 5 g 9.4 +# hydro 4 p 4 +# hydro 1 s 0.65 +# "Third tier" - improvements: -3.89 meV to -0.60 meV +# ionic 3 d auto +# hydro 3 s 2.6 +# hydro 4 f 8.4 +# hydro 3 d 3.4 +# hydro 3 p 7.8 +# "Fourth tier" - improvements: -0.33 meV to -0.11 meV +# hydro 2 p 1.6 +# hydro 5 g 10.8 +# hydro 5 f 11.2 +# hydro 3 d 1 +# hydro 4 s 4.5 +# Further basis functions that fell out of the optimization - noise +# level... < -0.08 meV +# hydro 4 d 6.6 +# hydro 5 g 16.4 +# hydro 4 d 9 diff --git a/tests/aims/species_dir/tight/08_O_default b/tests/aims/species_dir/tight/08_O_default new file mode 100644 index 0000000000..b6fd218468 --- /dev/null +++ b/tests/aims/species_dir/tight/08_O_default @@ -0,0 +1,90 @@ +################################################################################ +# +# FHI-aims code project +# Volker Blum, Fritz Haber Institute Berlin, 2009 +# +# Suggested "tight" defaults for O atom (to be pasted into control.in file) +# +################################################################################ + species O +# global species definitions + nucleus 8 + mass 15.9994 +# + l_hartree 6 +# + cut_pot 4.0 2.0 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 36 7.0 + radial_multiplier 2 + angular_grids specified + division 0.1817 50 + division 0.3417 110 + division 0.4949 194 + division 0.6251 302 + division 0.8014 434 +# division 0.8507 590 +# division 0.8762 770 +# division 0.9023 974 +# division 1.2339 1202 +# outer_grid 974 + outer_grid 434 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 2 s 2. + valence 2 p 4. +# ion occupancy + ion_occ 2 s 1. + ion_occ 2 p 3. +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Constructed for dimers: 1.0 A, 1.208 A, 1.5 A, 2.0 A, 3.0 A +# +################################################################################ +# "First tier" - improvements: -699.05 meV to -159.38 meV + hydro 2 p 1.8 + hydro 3 d 7.6 + hydro 3 s 6.4 +# "Second tier" - improvements: -49.91 meV to -5.39 meV + hydro 4 f 11.6 + hydro 3 p 6.2 + hydro 3 d 5.6 + hydro 5 g 17.6 + hydro 1 s 0.75 +# "Third tier" - improvements: -2.83 meV to -0.50 meV +# ionic 2 p auto +# hydro 4 f 10.8 +# hydro 4 d 4.7 +# hydro 2 s 6.8 +# "Fourth tier" - improvements: -0.40 meV to -0.12 meV +# hydro 3 p 5 +# hydro 3 s 3.3 +# hydro 5 g 15.6 +# hydro 4 f 17.6 +# hydro 4 d 14 +# Further basis functions - -0.08 meV and below +# hydro 3 s 2.1 +# hydro 4 d 11.6 +# hydro 3 p 16 +# hydro 2 s 17.2 +################################################################################ +# +# For methods that use the localized form of the "resolution of identity" for +# the two-electron Coulomb operator (RI_method LVL), particularly Hartree-Fock and +# hybrid density functional calculations, the highest accuracy can be obtained by +# uncommenting the line beginning with "for_aux" below, thus adding an extra g radial +# function to the construction of the product basis set for the expansion. +# See Ref. New J. Phys. 17, 093020 (2015) for more information, particularly Figs. 1 and 6. +# +################################################################################ +# +# for_aux hydro 5 g 6.0 diff --git a/tests/aims/species_dir/tight/14_Si_default b/tests/aims/species_dir/tight/14_Si_default new file mode 100644 index 0000000000..7f503709f2 --- /dev/null +++ b/tests/aims/species_dir/tight/14_Si_default @@ -0,0 +1,94 @@ +################################################################################ +# +# FHI-aims code project +# Volker Blum, Fritz Haber Institute Berlin, 2009 +# +# Suggested "tight" defaults for Si atom (to be pasted into control.in file) +# +# Revised Jan 04, 2011, following tests (SiC) done by Lydia Nemec: +# d and g functions of tier 2 now enabled by default. +# +################################################################################ + species Si +# global species definitions + nucleus 14 + mass 28.0855 +# + l_hartree 6 +# + cut_pot 4.0 2.0 1.0 + basis_dep_cutoff 1e-4 +# + radial_base 42 7.0 + radial_multiplier 2 + angular_grids specified + division 0.4121 50 + division 0.7665 110 + division 1.0603 194 + division 1.2846 302 + division 1.4125 434 +# division 1.4810 590 +# division 1.5529 770 +# division 1.6284 974 +# division 2.6016 1202 +# outer_grid 974 + outer_grid 434 +################################################################################ +# +# Definition of "minimal" basis +# +################################################################################ +# valence basis states + valence 3 s 2. + valence 3 p 2. +# ion occupancy + ion_occ 3 s 1. + ion_occ 3 p 1. +################################################################################ +# +# Suggested additional basis functions. For production calculations, +# uncomment them one after another (the most important basis functions are +# listed first). +# +# Constructed for dimers: 1.75 A, 2.0 A, 2.25 A, 2.75 A, 3.75 A +# +################################################################################ +# "First tier" - improvements: -571.96 meV to -37.03 meV + hydro 3 d 4.2 + hydro 2 p 1.4 + hydro 4 f 6.2 + ionic 3 s auto +# "Second tier" - improvements: -16.76 meV to -3.03 meV + hydro 3 d 9 + hydro 5 g 9.4 +# hydro 4 p 4 +# hydro 1 s 0.65 +# "Third tier" - improvements: -3.89 meV to -0.60 meV +# ionic 3 d auto +# hydro 3 s 2.6 +# hydro 4 f 8.4 +# hydro 3 d 3.4 +# hydro 3 p 7.8 +# "Fourth tier" - improvements: -0.33 meV to -0.11 meV +# hydro 2 p 1.6 +# hydro 5 g 10.8 +# hydro 5 f 11.2 +# hydro 3 d 1 +# hydro 4 s 4.5 +# Further basis functions that fell out of the optimization - noise +# level... < -0.08 meV +# hydro 4 d 6.6 +# hydro 5 g 16.4 +# hydro 4 d 9 +################################################################################ +# +# For methods that use the localized form of the "resolution of identity" for +# the two-electron Coulomb operator (RI_method LVL), particularly Hartree-Fock and +# hybrid density functional calculations, the highest accuracy can be obtained by +# uncommenting the line beginning with "for_aux" below, thus adding an extra g radial +# function to the construction of the product basis set for the expansion. +# See Ref. New J. Phys. 17, 093020 (2015) for more information, particularly Figs. 1 and 6. +# +################################################################################ +# +# for_aux hydro 5 g 6.0 diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/std_err.txt b/tests/aims/test_files/__init__.py similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/std_err.txt rename to tests/aims/test_files/__init__.py diff --git a/tests/aims/test_files/outputs/D_spin_01_kpt_000001.csc b/tests/aims/test_files/outputs/D_spin_01_kpt_000001.csc new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/aims/test_files/outputs/D_spin_01_kpt_000002.csc b/tests/aims/test_files/outputs/D_spin_01_kpt_000002.csc new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/aims/test_files/outputs/aims.out b/tests/aims/test_files/outputs/aims.out new file mode 100644 index 0000000000..8939796de0 --- /dev/null +++ b/tests/aims/test_files/outputs/aims.out @@ -0,0 +1,5259 @@ +------------------------------------------------------------ + Invoking FHI-aims ... + + When using FHI-aims, please cite the following reference: + + Volker Blum, Ralf Gehrke, Felix Hanke, Paula Havu, + Ville Havu, Xinguo Ren, Karsten Reuter, and Matthias Scheffler, + 'Ab Initio Molecular Simulations with Numeric Atom-Centered Orbitals', + Computer Physics Communications 180, 2175-2196 (2009) + + In addition, many other developments in FHI-aims are likely important for + your particular application. A partial list of references is given at the end of + this file. Thank you for giving credit to the authors of these developments. + + For any questions about FHI-aims, please visit our slack channel at + + https://fhi-aims.slack.com + + and our main development and support site at + + https://aims-git.rz-berlin.mpg.de . + + The latter site, in particular, has a wiki to collect information, as well + as an issue tracker to log discussions, suggest improvements, and report issues + or bugs. https://aims-git.rz-berlin.mpg.de is also the main development site + of the project and all new and updated code versions can be obtained there. + Please send an email to aims-coordinators@fhi-berlin.mpg.de and we will add + you to these sites. They are for you and everyone is welcome there. + +------------------------------------------------------------ + + + + Date : 20230117, Time : 114544.660 + Time zero on CPU 1 : 0.474143400000000E+01 s. + Internal wall clock time zero : 443187944.660 s. + + FHI-aims created a unique identifier for this run for later identification + aims_uuid : 1842BF69-05B0-47B3-A510-68677842FECA + + Build configuration of the current instance of FHI-aims + ------------------------------------------------------- + FHI-aims version : 221103 + Commit number : cc62f3b89 + CMake host system : Linux-5.15.0-56-generic + CMake version : 3.22.1 + Fortran compiler : /opt/intel/oneapi/mpi/2021.8.0/bin/mpiifort (Intel) version 2021.8.0.20221119 + Fortran compiler flags: -O3 -ip -fp-model precise + C compiler : /opt/intel/oneapi/compiler/2023.0.0/linux/bin/intel64/icc (Intel) version 2021.8.0.20221119 + C compiler flags : -O3 -ip -fp-model precise -std=gnu99 -diag-disable=10441 + HIP compiler : + HIP compiler flags : + HIP GPU arch : + Using MPI + Using ScaLAPACK + Using LibXC + Using i-PI + Using RLSY + Linking against: /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_intel_lp64.so + /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_sequential.so + /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_core.so + /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_blacs_intelmpi_lp64.so + /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_scalapack_lp64.so + + Using 8 parallel tasks. + Task 0 on host andrey-Latitude-5411 reporting. + Task 1 on host andrey-Latitude-5411 reporting. + Task 2 on host andrey-Latitude-5411 reporting. + Task 3 on host andrey-Latitude-5411 reporting. + Task 4 on host andrey-Latitude-5411 reporting. + Task 5 on host andrey-Latitude-5411 reporting. + Task 6 on host andrey-Latitude-5411 reporting. + Task 7 on host andrey-Latitude-5411 reporting. + + Obtaining array dimensions for all initial allocations: + + ----------------------------------------------------------------------- + Parsing control.in (first pass over file, find array dimensions only). + The contents of control.in will be repeated verbatim below + unless switched off by setting 'verbatim_writeout .false.' . + in the first line of control.in . + ----------------------------------------------------------------------- + + ######################################################################################### + # + # Volker Blum, FHI 2010 : Input file for FHI-aims + # + # + ######################################################################################### + # + # Physical model settings + # + xc hse06 0.11 # positive screening parameter omega + hse_unit b + charge 0. + spin none + # default_initial_moment 0.0 + # default_initial_moment 0.0 + # fixed_spin_moment 2.0 + relativistic atomic_zora scalar + include_spin_orbit + vdw_correction_hirshfeld + use_dipole_correction + # to evaluate work function of both surface of slab + evaluate_work_function + + # + # SCF convergence settings + # + occupation_type gaussian 0.01 + mixer pulay + n_max_pulay 6 + charge_mix_param 0.1 + ini_linear_mixing 10 + ini_linear_mix_param 0.05 + # preconditioner kerker 1.5 + # precondition_max_l 0 + # preconditioner turnoff charge 1e-4 + # preconditioner turnoff sum_ev 1e-1 + sc_accuracy_rho 1E-3 + sc_accuracy_eev 1E-2 + sc_accuracy_etot 1E-5 + sc_iter_limit 200 + # + elsi_restart read_and_write 10 + # + # For periodic boundary conditions + # + # here the k-mesh is given + k_grid 25 25 1 + output band 0.0 0.0 0.0 0.0 0.5 0.0 21 G M + output band 0.0 0.5 0.0 0.3333 0.3333 0.0 21 M K + output band 0.3333 0.3333 0.0 0.0 0.0 0.0 21 K G + output band 0.0 0.0 0.0 -0.3333 -0.3333 0.0 21 G Kp + + + output band_mulliken 0.0 0.0 0.0 0.0 0.5 0.0 21 G M + output band_mulliken 0.0 0.5 0.0 0.3333 0.3333 0.0 21 M K + output band_mulliken 0.3333 0.3333 0.0 0.0 0.0 0.0 21 K G + output band_mulliken 0.0 0.0 0.0 -0.3333 -0.3333 0.0 21 G Kp + + # Output options: + # k-path through which the band structure is calculated and plotted using the below setting + # output band kstart1 kstart1 kstart2 kstart3 kend1 kend2 kend3 n_points name_start name_end + exx_band_structure_version 1 + + + + # + # RI_method LVL_fast + # For relaxation: + # + # relax_geometry bfgs 5.e-3 + # relax_unit_cell full + # sc_accuracy_forces 5E-4 + + # + # Output options: + # pdos + output dos -20 20 1000 0.01 + # output species_proj_dos -20 20 1000 0.01 + output atom_proj_dos -20 20 1000 0.01 + + # linear response calculations + # The momentum matrix elements in the energy window [ VBM-(omega_max + 10.0 eV), + # CBM+(omega_max + 10.0 eV)] (in eV) relative to the internal zero will be summed + # compute_dielectric omega_max n_omega + # + compute_dielectric 10.0 1000 + # output dielectric lorentzian 0.05 x x + output dielectric gaussian 0.05 x x + + # output dielectric lorentzian 0.05 y y + output dielectric gaussian 0.05 y y + + # output dielectric lorentzian 0.05 z z + output dielectric gaussian 0.05 z z + + + compute_absorption 0.1 -20 20 0.005 10.0 1000 x .true. + compute_absorption 0.1 -20 20 0.005 10.0 1000 y .true. + compute_absorption 0.1 -20 30 0.005 10.0 1000 z .true. + # + # High-symmetry k-points for fcc band structure output, if requested. + # + # output l_proj_dos -20 30 1000 0.3 + # output band 0.25 0.50 0.75 0.5 0.5 0.5 100 W L + # output band 0.5 0.5 0.5 0.25 0.25 0.25 100 L Lambda + # output band 0.25 0.25 0.25 0 0 0 100 Lambda Gamma + # output band 0 0 0 0.00 0.25 0.25 100 Gamma Delta + # output band 0.00 0.25 0.25 0 0.5 0.5 100 Delta X + # output band 0 0.5 0.5 0.125 0.5 0.625 100 X Z + # output band 0.125 0.5 0.625 0.25 0.50 0.75 100 Z W + # output band 0.25 0.50 0.75 0.375 0.375 0.75 100 W K + ################################################################################ + # + # FHI-aims code project + # Volker Blum, Fritz Haber Institute Berlin, 2009 + # + # Suggested "tight" defaults for Mo atom (to be pasted into control.in file) + # + ################################################################################ + species Mo + # global species definitions + nucleus 42 + mass 95.94 + # + l_hartree 6 + # + cut_pot 4.0 2.0 1.0 + basis_dep_cutoff 1e-4 + # + radial_base 59 7.0 + radial_multiplier 2 + angular_grids specified + division 0.3117 50 + division 0.6750 110 + division 1.0351 194 + division 1.2073 302 + division 1.6402 434 + # division 1.9185 590 + # division 2.0237 770 + # division 2.0980 974 + # division 2.7972 1202 + # outer_grid 974 + outer_grid 434 + ################################################################################ + # + # Definition of "minimal" basis + # + ################################################################################ + # valence basis states + valence 5 s 1. + valence 4 p 6. + valence 4 d 5. + # ion occupancy + ion_occ 5 s 0. + ion_occ 4 p 6. + ion_occ 4 d 4. + ################################################################################ + # + # Suggested additional basis functions. For production calculations, + # uncomment them one after another (the most important basis functions are + # listed first). + # + # Constructed for dimers: 1.675 A, 1.9 A, 2.375 A, 3.00 A, 4.00 A + # + ################################################################################ + # "First tier" - max. impr. -711.23 meV, min. impr. -21.07 meV + hydro 4 f 8.4 + hydro 3 d 2.8 + ionic 5 p auto + hydro 5 g 12 + ionic 5 s auto + # "Second tier" - max. impr. -39.38 meV, min. impr. -2.68 meV + # hydro 4 f 12.4 + # hydro 3 d 3.3 + # hydro 6 h 17.2 + # hydro 4 f 7.6 + # hydro 3 p 3.0 + # hydro 1 s 0.65 + # "Third tier" - max. impr. -5.50 meV, min. impr. -0.47 meV + # hydro 4 f 29.2 + # hydro 5 g 11.2 + # hydro 3 d 6.8 + # hydro 6 h 14.8 + # hydro 2 p 2.3 + # hydro 4 s 3.8 + # "Fourth tier" - max. impr. -0.58 meV, min. impr. -0.19 meV + # hydro 5 f 6.8 + # hydro 5 d 14.8 + # hydro 6 s 7.8 + # hydro 5 g 20.8 + # hydro 5 d 10.4 + # hydro 5 p 9.8 + # Further functions - -0.17 meV and below + # hydro 5 d 3.2 + ################################################################################ + # + # FHI-aims code project + # Volker Blum, Fritz Haber Institute Berlin, 2009 + # + # Suggested "tight" defaults for Se atom (to be pasted into control.in file) + # + ################################################################################ + species Se + # global species definitions + nucleus 34 + mass 78.96 + # + l_hartree 6 + # + cut_pot 4.0 2.0 1.0 + basis_dep_cutoff 1e-4 + # + radial_base 55 7.0 + radial_multiplier 2 + angular_grids specified + division 0.0830 110 + division 0.1357 194 + division 0.7377 302 + division 0.8610 434 + # division 0.9640 590 + # division 1.0773 770 + # division 2.5539 974 + # outer_grid 974 + outer_grid 434 + ################################################################################ + # + # Definition of "minimal" basis + # + ################################################################################ + # valence basis states + valence 4 s 2. + valence 4 p 4. + valence 3 d 10. + # ion occupancy + ion_occ 4 s 1. + ion_occ 4 p 3. + ion_occ 3 d 10. + ################################################################################ + # + # Suggested additional basis functions. For production calculations, + # uncomment them one after another (the most important basis functions are + # listed first). + # + # Constructed for dimers: 1.85 A, 2.15 A, 2.50 A, 3.00 A, 4.00 A + # + ################################################################################ + # "First tier" - improvements: -336.21 meV to -36.85 meV + hydro 3 d 4.3 + hydro 2 p 1.6 + hydro 4 f 7.2 + ionic 4 s auto + # "Second tier" - improvements: -14.39 meV to -1.49 meV + # hydro 5 g 10.4 + # hydro 4 p 4.5 + # hydro 4 d 6.2 + # hydro 4 f 11.2 + # hydro 1 s 0.65 + # hydro 6 h 15.2 + # Third tier - improvements: -0.46 meV and below + # hydro 5 g 14.4 + # ionic 4 d auto + # hydro 4 f 22.4 + # hydro 5 f 7.4 + # hydro 5 p 8 + # hydro 5 s 9.4 + # Fourth tier - improvements: -0.12 meV and below + # hydro 5 d 11.6 + # hydro 6 h 18 + # hydro 4 p 4 + # hydro 5 f 16 + # hydro 4 s 3.9 + ################################################################################ + # + # FHI-aims code project + # Volker Blum, Fritz Haber Institute Berlin, 2009 + # + # Suggested "tight" defaults for S atom (to be pasted into control.in file) + # + # Revised Jan 04, 2011, following tests (SiC) done by Lydia Nemec: + # d and g functions of tier 2 now enabled by default. + # + ################################################################################ + species S + # global species definitions + nucleus 16 + mass 32.065 + # + l_hartree 6 + # + cut_pot 4.0 2.0 1.0 + basis_dep_cutoff 1e-4 + # + radial_base 44 7.0 + radial_multiplier 2 + angular_grids specified + division 0.4665 110 + division 0.5810 194 + division 0.7139 302 + division 0.8274 434 + # division 0.9105 590 + # division 1.0975 770 + # division 1.2028 974 + # outer_grid 974 + outer_grid 434 + ################################################################################ + # + # Definition of "minimal" basis + # + ################################################################################ + # valence basis states + valence 3 s 2. + valence 3 p 4. + # ion occupancy + ion_occ 3 s 1. + ion_occ 3 p 3. + ################################################################################ + # + # Suggested additional basis functions. For production calculations, + # uncomment them one after another (the most important basis functions are + # listed first). + # + # Constructed for dimers: 1.6 A, 1.9 A, 2.5 A, 3.25 A, 4.0 A + # + ################################################################################ + # "First tier" - improvements: -652.81 meV to -45.53 meV + ionic 3 d auto + hydro 2 p 1.8 + hydro 4 f 7 + ionic 3 s auto + # "Second tier" - improvements: -30.20 meV to -1.74 meV + hydro 4 d 6.2 + hydro 5 g 10.8 + # hydro 4 p 4.9 + # hydro 5 f 10 + # hydro 1 s 0.8 + # "Third tier" - improvements: -1.04 meV to -0.20 meV + # hydro 3 d 3.9 + # hydro 3 d 2.7 + # hydro 5 g 12 + # hydro 4 p 10.4 + # hydro 5 f 12.4 + # hydro 2 s 1.9 + # "Fourth tier" - improvements: -0.35 meV to -0.06 meV + # hydro 4 d 10.4 + # hydro 4 p 7.2 + # hydro 4 d 10 + # hydro 5 g 19.2 + # hydro 4 s 12 + + ################################################################################ + # + # For methods that use the localized form of the "resolution of identity" for + # the two-electron Coulomb operator (RI_method LVL), particularly Hartree-Fock and + # hybrid density functional calculations, the highest accuracy can be obtained by + # uncommenting the line beginning with "for_aux" below, thus adding an extra g radial + # function to the construction of the product basis set for the expansion. + # See Ref. New J. Phys. 17, 093020 (2015) for more information, particularly Figs. 1 and 6. + # + ################################################################################ + # + # for_aux hydro 5 g 6.0 + ################################################################################ + # + # FHI-aims code project + # Volker Blum, Fritz Haber Institute Berlin, 2009 + # + # Suggested "tight" defaults for W atom (to be pasted into control.in file) + # + ################################################################################ + species W + # global species definitions + nucleus 74 + mass 183.84 + # + l_hartree 6 + # + cut_pot 4.0 2.0 1.0 + basis_dep_cutoff 1e-4 + # + radial_base 71 7.0 + radial_multiplier 2 + angular_grids specified + division 0.2901 50 + division 0.6986 110 + division 1.0528 194 + division 1.2659 302 + division 1.5223 434 + # division 1.8111 590 + # division 2.0105 770 + # division 2.0413 974 + # division 2.8804 1202 + # outer_grid 974 + outer_grid 434 + ################################################################################ + # + # Definition of "minimal" basis + # + ################################################################################ + # valence basis states + valence 6 s 2. + valence 5 p 6. + valence 5 d 4. + valence 4 f 14. + # ion occupancy + ion_occ 6 s 1. + ion_occ 5 p 6. + ion_occ 5 d 3. + ion_occ 4 f 14. + ################################################################################ + # + # Suggested additional basis functions. For production calculations, + # uncomment them one after another (the most important basis functions are + # listed first). + # + # Constructed for dimers: 1.775, 1.99, 2.50, 3.25, 4.50 AA + # + ################################################################################ + # + # "First tier" - improvements: -603.77 meV to -28.99 meV + hydro 4 f 7.8 + hydro 4 d 5.8 + ionic 6 p auto + hydro 5 g 12.4 + ionic 6 s auto + # "Second tier" - improvements: -28.30 meV to -1.31 meV + # hydro 6 h 16.8 + # ionic 5 d auto + # hydro 4 f 8.6 + # hydro 5 g 16.8 + # hydro 5 d 8.4 + # hydro 3 p 3.3 + # hydro 1 s 0.55 + # "Third tier" - max. impr. -1.79 meV, min. impr. -0.26 meV + # hydro 5 f 10.8 + # hydro 5 g 34.4 + # hydro 6 h 20.8 + # hydro 5 g 12.8 + # hydro 2 p 1.6 + # hydro 4 s 4.7 + # hydro 6 d 18.4 + # "Fourth tier" -0.46 max. impr. - meV, min. impr. -0.09 meV + # hydro 6 h 21.6 + # hydro 5 f 22.4 + # hydro 4 f 4 + # hydro 5 p 9.6 + # hydro 6 d 17.2 + # hydro 3 p 5.2 + # hydro 5 g 4.7 + # hydro 6 s 7.6 + + ################################################################################ + # + # FHI-aims code project + # Volker Blum, Fritz Haber Institute Berlin, 2009 + # + # Suggested "tight" defaults for Te atom (to be pasted into control.in file) + # + # 2020/09/15 Added g function to "tight" settings, since this creates truly "tight" + # but not overly tight defaults. See "intermediate" settings for the past + # "tight" settings, which are still very reliable. Consider "intermediate" + # for hybrid functionals, for example. + # + ################################################################################ + species Te + # global species definitions + nucleus 52 + mass 127.60 + # + l_hartree 6 + # + cut_pot 4.0 2.0 1.0 + basis_dep_cutoff 1e-4 + # + radial_base 64 7.0 + radial_multiplier 2 + angular_grids specified + division 0.1259 110 + division 0.8959 194 + division 0.9864 302 + division 1.1196 434 + # division 1.1922 590 + # division 1.3098 770 + # division 2.9404 974 + # outer_grid 974 + outer_grid 434 + ################################################################################ + # + # Definition of "minimal" basis + # + ################################################################################ + # valence basis states + valence 5 s 2. + valence 5 p 4. + valence 4 d 10. + # ion occupancy + ion_occ 5 s 1. + ion_occ 5 p 3. + ion_occ 4 d 10. + ################################################################################ + # + # Suggested additional basis functions. For production calculations, + # uncomment them one after another (the most important basis functions are + # listed first). + # + # Constructed for dimers: 2.15 A, 2.55 A, 3.10 A, 3.60 A, 4.50 A + # + ################################################################################ + # "First tier" - max. impr. -217.34 meV, min. impr. -22.97 meV + hydro 3 d 3.7 + hydro 4 f 6 + hydro 3 p 2.7 + ionic 5 s auto + # "Second tier" - max. impr. -17.80 meV, min. impr. -0.57 meV + hydro 5 g 9 + # hydro 4 f 16.4 + # hydro 6 h 12 + # hydro 4 p 6.4 + # hydro 5 f 32.4 + # hydro 4 d 5 + # hydro 3 s 2.8 + # "Third tier" - max. impr. -0.51 meV, min. impr. -0.06 meV + # hydro 5 f 8.4 + # hydro 5 g 11.6 + # hydro 6 h 15.6 + # hydro 2 p 1.7 + # hydro 4 d 9.6 + # hydro 1 s 6.4 + # Further functions that fell out of the optimization: -0.17 meV and below + # hydro 4 f 33.6 + # hydro 5 d 6.8 + # hydro 5 f 16 + + + ----------------------------------------------------------------------- + Completed first pass over input file control.in . + ----------------------------------------------------------------------- + + + ----------------------------------------------------------------------- + Parsing geometry.in (first pass over file, find array dimensions only). + The contents of geometry.in will be repeated verbatim below + unless switched off by setting 'verbatim_writeout .false.' . + in the first line of geometry.in . + ----------------------------------------------------------------------- + + # + # This is the geometry file that corresponds to the current relaxation step. + # If you do not want this file to be written, set the "write_restart_geometry" flag to .false. + # aims_uuid : 30F25284-AA5C-43EF-ACEA-2542C5DCBEDB + # + set_vacuum_level 21.961371 + lattice_vector 3.40717493 0.00014206 0.00000000 + lattice_vector -1.70378822 2.95054058 0.00000000 + lattice_vector 0.00013496 0.00027045 30.69261765 + atom 0.02071770 0.02091759 2.79151492 Mo + atom -0.02140986 -0.01576611 10.18168839 W + atom 0.02054554 1.98843192 1.16989135 Se + atom 0.02081213 1.98757349 4.66407853 Te + atom -0.02140973 1.95099156 8.55192704 Se + atom -0.02178102 1.95181653 12.06464594 Te + + + ----------------------------------------------------------------------- + Completed first pass over input file geometry.in . + ----------------------------------------------------------------------- + + + Basic array size parameters: + | Number of species : 5 + | Number of atoms : 6 + | Number of lattice vectors : 3 + | Max. basis fn. angular momentum : 4 + | Max. atomic/ionic basis occupied n: 6 + | Max. number of basis fn. types : 3 + | Max. radial fns per species/type : 14 + | Max. logarithmic grid size : 1483 + | Max. radial integration grid size : 143 + | Max. angular integration grid size: 434 + | Max. angular grid division number : 8 + | Radial grid for Hartree potential : 1483 + | Number of spin channels : 1 + +------------------------------------------------------------ + Reading file control.in. +------------------------------------------------------------ + + XC: Using HSE-functional with OMEGA = 0.110000E+00 . + XC: For the actual units (bohr^-1 or Angstrom^-1), see below. + hse_unit: Unit for the HSE06 hybrid functional screening parameter set to bohr^(-1). + Charge = 0.000000E+00: Neutral system requested explicitly. + Spin treatment: No spin polarisation. + Scalar relativistic treatment of kinetic energy: on-site free-atom approximation to ZORA. + Calculating non-self-consistent second-variational spin-orbit coupling after scf-cycle + Using dipole correction. +Evaluating the work function. + Occupation type: Gaussian broadening, width = 0.100000E-01 eV. + Using pulay charge density mixing. + Pulay mixing - number of memorized iterations: 6 + Charge density mixing - mixing parameter: 0.1000 + Number of initial iterations with linear charge density mixing: 10 + Charge density mixing parameter for initial linear mixing: 0.50000E-01 + Convergence accuracy of self-consistent charge density: 0.1000E-02 + Convergence accuracy of sum of eigenvalues: 0.1000E-01 + Convergence accuracy of total energy: 0.1000E-04 + Maximum number of s.-c. iterations : 200 + Found k-point grid: 25 25 1 + + Plot band 1 + | begin 0.000000 0.000000 0.000000 + | end 0.000000 0.500000 0.000000 + | number of points: 21 + + Plot band 2 + | begin 0.000000 0.500000 0.000000 + | end 0.333300 0.333300 0.000000 + | number of points: 21 + + Plot band 3 + | begin 0.333300 0.333300 0.000000 + | end 0.000000 0.000000 0.000000 + | number of points: 21 + + Plot band 4 + | begin 0.000000 0.000000 0.000000 + | end -0.333300 -0.333300 0.000000 + | number of points: 21 + Mulliken analysis of all k points in band will be performed + + Plot band 5 + | begin 0.000000 0.000000 0.000000 + | end 0.000000 0.500000 0.000000 + | number of points: 21 + Mulliken analysis of all k points in band will be performed + + Plot band 6 + | begin 0.000000 0.500000 0.000000 + | end 0.333300 0.333300 0.000000 + | number of points: 21 + Mulliken analysis of all k points in band will be performed + + Plot band 7 + | begin 0.333300 0.333300 0.000000 + | end 0.000000 0.000000 0.000000 + | number of points: 21 + Mulliken analysis of all k points in band will be performed + + Plot band 8 + | begin 0.000000 0.000000 0.000000 + | end -0.333300 -0.333300 0.000000 + | number of points: 21 + Calculating density of states with + | energy interval :-20.000000 20.000000 + | points & broadening : 1000 0.010000 + Calculating atom-projected density of states with + | energy interval :-20.000000 20.000000 + | points & broadening : 1000 0.010000 + Compute Momentum Matrix. + + Plot dielectric direction 1 + + Plot dielectric direction 2 + + Plot dielectric direction 3 + Compute Absorption. + Compute Absorption. + Compute Absorption. + + Reading configuration options for species Mo . + | Found nuclear charge : 42.0000 + | Found atomic mass : 95.9400000000000 amu + | Found l_max for Hartree potential : 6 + | Found cutoff potl. onset [A], width [A], scale factor : 4.00000 2.00000 1.00000 + | Threshold for basis-dependent cutoff potential is 0.100000E-03 + | Found data for basic radial integration grid : 59 points, outermost radius = 7.000 A + | Found multiplier for basic radial grid : 2 + | Found angular grid specification: user-specified. + | Specified grid contains 6 separate shells. + | Check grid settings after all constraints further below. + | Found free-atom valence shell : 5 s 1.000 + | Found free-atom valence shell : 4 p 6.000 + | Found free-atom valence shell : 4 d 5.000 + | Found free-ion valence shell : 5 s 0.000 + | Found free-ion valence shell : 4 p 6.000 + | Found free-ion valence shell : 4 d 4.000 + | Found hydrogenic basis function : 4 f 8.400 + | Found hydrogenic basis function : 3 d 2.800 + | Found ionic basis function : 5 p , default cutoff radius. + | Found hydrogenic basis function : 5 g 12.000 + | Found ionic basis function : 5 s , default cutoff radius. + Species Mo : Missing cutoff potential type. + Defaulting to exp(1/x)/(1-x)^2 type cutoff potential. + Species Mo: No 'logarithmic' tag. Using default grid for free atom: + | Default logarithmic grid data [bohr] : 0.1000E-03 0.1000E+03 0.1012E+01 + | Will include ionic basis functions of 2.0-fold positive Mo ion. + Species Mo: On-site basis accuracy parameter (for Gram-Schmidt orthonormalisation) not specified. + Using default value basis_acc = 0.1000000E-03. + Species Mo : Using default innermost maximum threshold i_radial= 2 for radial functions. + Species Mo : Default cutoff onset for free atom density etc. : 0.40000000E+01 AA. + Species Mo : Basic radial grid will be enhanced according to radial_multiplier = 2, to contain 119 grid points. + + Reading configuration options for species Se . + | Found nuclear charge : 34.0000 + | Found atomic mass : 78.9600000000000 amu + | Found l_max for Hartree potential : 6 + | Found cutoff potl. onset [A], width [A], scale factor : 4.00000 2.00000 1.00000 + | Threshold for basis-dependent cutoff potential is 0.100000E-03 + | Found data for basic radial integration grid : 55 points, outermost radius = 7.000 A + | Found multiplier for basic radial grid : 2 + | Found angular grid specification: user-specified. + | Specified grid contains 5 separate shells. + | Check grid settings after all constraints further below. + | Found free-atom valence shell : 4 s 2.000 + | Found free-atom valence shell : 4 p 4.000 + | Found free-atom valence shell : 3 d 10.000 + | Found free-ion valence shell : 4 s 1.000 + | Found free-ion valence shell : 4 p 3.000 + | Found free-ion valence shell : 3 d 10.000 + | Found hydrogenic basis function : 3 d 4.300 + | Found hydrogenic basis function : 2 p 1.600 + | Found hydrogenic basis function : 4 f 7.200 + | Found ionic basis function : 4 s , default cutoff radius. + Species Se : Missing cutoff potential type. + Defaulting to exp(1/x)/(1-x)^2 type cutoff potential. + Species Se: No 'logarithmic' tag. Using default grid for free atom: + | Default logarithmic grid data [bohr] : 0.1000E-03 0.1000E+03 0.1012E+01 + | Will include ionic basis functions of 2.0-fold positive Se ion. + Species Se: On-site basis accuracy parameter (for Gram-Schmidt orthonormalisation) not specified. + Using default value basis_acc = 0.1000000E-03. + Species Se : Using default innermost maximum threshold i_radial= 2 for radial functions. + Species Se : Default cutoff onset for free atom density etc. : 0.40000000E+01 AA. + Species Se : Basic radial grid will be enhanced according to radial_multiplier = 2, to contain 111 grid points. + + Reading configuration options for species S . + | Found nuclear charge : 16.0000 + | Found atomic mass : 32.0650000000000 amu + | Found l_max for Hartree potential : 6 + | Found cutoff potl. onset [A], width [A], scale factor : 4.00000 2.00000 1.00000 + | Threshold for basis-dependent cutoff potential is 0.100000E-03 + | Found data for basic radial integration grid : 44 points, outermost radius = 7.000 A + | Found multiplier for basic radial grid : 2 + | Found angular grid specification: user-specified. + | Specified grid contains 5 separate shells. + | Check grid settings after all constraints further below. + | Found free-atom valence shell : 3 s 2.000 + | Found free-atom valence shell : 3 p 4.000 + | Found free-ion valence shell : 3 s 1.000 + | Found free-ion valence shell : 3 p 3.000 + | Found ionic basis function : 3 d , default cutoff radius. + | Found hydrogenic basis function : 2 p 1.800 + | Found hydrogenic basis function : 4 f 7.000 + | Found ionic basis function : 3 s , default cutoff radius. + | Found hydrogenic basis function : 4 d 6.200 + | Found hydrogenic basis function : 5 g 10.800 + Species S : Missing cutoff potential type. + Defaulting to exp(1/x)/(1-x)^2 type cutoff potential. + Species S : No 'logarithmic' tag. Using default grid for free atom: + | Default logarithmic grid data [bohr] : 0.1000E-03 0.1000E+03 0.1012E+01 + | Will include ionic basis functions of 2.0-fold positive S ion. + Species S : On-site basis accuracy parameter (for Gram-Schmidt orthonormalisation) not specified. + Using default value basis_acc = 0.1000000E-03. + Species S : Using default innermost maximum threshold i_radial= 2 for radial functions. + Species S : Default cutoff onset for free atom density etc. : 0.40000000E+01 AA. + Species S : Basic radial grid will be enhanced according to radial_multiplier = 2, to contain 89 grid points. + + Reading configuration options for species W . + | Found nuclear charge : 74.0000 + | Found atomic mass : 183.840000000000 amu + | Found l_max for Hartree potential : 6 + | Found cutoff potl. onset [A], width [A], scale factor : 4.00000 2.00000 1.00000 + | Threshold for basis-dependent cutoff potential is 0.100000E-03 + | Found data for basic radial integration grid : 71 points, outermost radius = 7.000 A + | Found multiplier for basic radial grid : 2 + | Found angular grid specification: user-specified. + | Specified grid contains 6 separate shells. + | Check grid settings after all constraints further below. + | Found free-atom valence shell : 6 s 2.000 + | Found free-atom valence shell : 5 p 6.000 + | Found free-atom valence shell : 5 d 4.000 + | Found free-atom valence shell : 4 f 14.000 + | Found free-ion valence shell : 6 s 1.000 + | Found free-ion valence shell : 5 p 6.000 + | Found free-ion valence shell : 5 d 3.000 + | Found free-ion valence shell : 4 f 14.000 + | Found hydrogenic basis function : 4 f 7.800 + | Found hydrogenic basis function : 4 d 5.800 + | Found ionic basis function : 6 p , default cutoff radius. + | Found hydrogenic basis function : 5 g 12.400 + | Found ionic basis function : 6 s , default cutoff radius. + Species W : Missing cutoff potential type. + Defaulting to exp(1/x)/(1-x)^2 type cutoff potential. + Species W : No 'logarithmic' tag. Using default grid for free atom: + | Default logarithmic grid data [bohr] : 0.1000E-03 0.1000E+03 0.1012E+01 + | Will include ionic basis functions of 2.0-fold positive W ion. + Species W : On-site basis accuracy parameter (for Gram-Schmidt orthonormalisation) not specified. + Using default value basis_acc = 0.1000000E-03. + Species W : Using default innermost maximum threshold i_radial= 2 for radial functions. + Species W : Default cutoff onset for free atom density etc. : 0.40000000E+01 AA. + Species W : Basic radial grid will be enhanced according to radial_multiplier = 2, to contain 143 grid points. + + Reading configuration options for species Te . + | Found nuclear charge : 52.0000 + | Found atomic mass : 127.600000000000 amu + | Found l_max for Hartree potential : 6 + | Found cutoff potl. onset [A], width [A], scale factor : 4.00000 2.00000 1.00000 + | Threshold for basis-dependent cutoff potential is 0.100000E-03 + | Found data for basic radial integration grid : 64 points, outermost radius = 7.000 A + | Found multiplier for basic radial grid : 2 + | Found angular grid specification: user-specified. + | Specified grid contains 5 separate shells. + | Check grid settings after all constraints further below. + | Found free-atom valence shell : 5 s 2.000 + | Found free-atom valence shell : 5 p 4.000 + | Found free-atom valence shell : 4 d 10.000 + | Found free-ion valence shell : 5 s 1.000 + | Found free-ion valence shell : 5 p 3.000 + | Found free-ion valence shell : 4 d 10.000 + | Found hydrogenic basis function : 3 d 3.700 + | Found hydrogenic basis function : 4 f 6.000 + | Found hydrogenic basis function : 3 p 2.700 + | Found ionic basis function : 5 s , default cutoff radius. + | Found hydrogenic basis function : 5 g 9.000 + Species Te : Missing cutoff potential type. + Defaulting to exp(1/x)/(1-x)^2 type cutoff potential. + Species Te: No 'logarithmic' tag. Using default grid for free atom: + | Default logarithmic grid data [bohr] : 0.1000E-03 0.1000E+03 0.1012E+01 + | Will include ionic basis functions of 2.0-fold positive Te ion. + Species Te: On-site basis accuracy parameter (for Gram-Schmidt orthonormalisation) not specified. + Using default value basis_acc = 0.1000000E-03. + Species Te : Using default innermost maximum threshold i_radial= 2 for radial functions. + Species Te : Default cutoff onset for free atom density etc. : 0.40000000E+01 AA. + Species Te : Basic radial grid will be enhanced according to radial_multiplier = 2, to contain 129 grid points. + + Finished reading input file 'control.in'. + +------------------------------------------------------------ + + +------------------------------------------------------------ + Reading geometry description geometry.in. +------------------------------------------------------------ + Vacuum level in z-axis : 0.219614E+02 + | The smallest distance between any two atoms is 2.54917855 AA. + | The first atom of this pair is atom number 1 . + | The second atom of this pair is atom number 3 . + | Wigner-Seitz cell of the first atom image 0 0 0 . + | (The Wigner-Seitz cell of the second atom is 0 0 0 by definition.) + + Symmetry information by spglib: + | Precision set to 0.1E-04 + | Number of Operations : 1 + | Space group : 1 + | International : P1 /op + | Schoenflies : C1^1 + Input structure read successfully. + The structure contains 6 atoms, and a total of 288.000 electrons. + + Input geometry: + | Unit cell: + | 3.40717493 0.00014206 0.00000000 + | -1.70378822 2.95054058 0.00000000 + | 0.00013496 0.00027045 30.69261765 + | Atomic structure: + | Atom x [A] y [A] z [A] + | 1: Species Mo 0.02071770 0.02091759 2.79151492 + | 2: Species W -0.02140986 -0.01576611 10.18168839 + | 3: Species Se 0.02054554 1.98843192 1.16989135 + | 4: Species Te 0.02081213 1.98757349 4.66407853 + | 5: Species Se -0.02140973 1.95099156 8.55192704 + | 6: Species Te -0.02178102 1.95181653 12.06464594 + + Lattice parameters for 3D lattice (in Angstroms) : 3.407175 3.407137 30.692618 + Angle(s) between unit vectors (in degrees) : 89.999689 89.999748 120.001876 + + + Quantities derived from the lattice vectors (in Angstrom^-1): + | Reciprocal lattice vector 1: 1.844060 1.064851 -0.000017 + | Reciprocal lattice vector 2: -0.000089 2.129452 -0.000019 + | Reciprocal lattice vector 3: 0.000000 -0.000000 0.204713 + | Unit cell volume : 0.308561E+03 Angstrom^3 + + Fractional coordinates: + L1 L2 L3 + atom_frac 0.00961773 0.00708061 0.09095070 Mo + atom_frac -0.00898393 -0.00537344 0.33173086 W + atom_frac 0.34301889 0.67390122 0.03811638 Se + atom_frac 0.34294192 0.67359984 0.15196092 Te + atom_frac 0.32433958 0.66119075 0.27863140 Se + atom_frac 0.32436064 0.66145985 0.39307973 Te + + + Finished reading input file 'geometry.in'. + + + + Consistency checks for stacksize environment parameter are next. + + | Maximum stacksize for task 0: unlimited + | Maximum stacksize for task 1: unlimited + | Maximum stacksize for task 2: unlimited + | Maximum stacksize for task 3: unlimited + | Maximum stacksize for task 4: unlimited + | Maximum stacksize for task 5: unlimited + | Maximum stacksize for task 6: unlimited + | Maximum stacksize for task 7: unlimited + | Current stacksize for task 0: unlimited + | Current stacksize for task 1: unlimited + | Current stacksize for task 2: unlimited + | Current stacksize for task 3: unlimited + | Current stacksize for task 4: unlimited + | Current stacksize for task 5: unlimited + | Current stacksize for task 6: unlimited + | Current stacksize for task 7: unlimited + + Consistency checks for the contents of control.in are next. + + HSE06 screening parameters: omega_HF = 0.11000000 bohr^-1, and + omega_PBE = 0.11000000 bohr^-1. + MPI_IN_PLACE appears to work with this MPI implementation. + | Keeping use_mpi_in_place .true. (see manual). + Explicit treatment of the Coulomb operator is needed, but the RI method is not specified. + Coulomb operator: Defaulting to 'LVL fast' resolution of identity - RI_type = LVL_fast + Species Mo: Using default value for prodbas_acc = 1.000000E-04. + Species Mo: Using default value max_l_prodbas = 20. + Species Se: Using default value for prodbas_acc = 1.000000E-04. + Species Se: Using default value max_l_prodbas = 20. + Species S: Using default value for prodbas_acc = 1.000000E-04. + Species S: Using default value max_l_prodbas = 20. + Species W: Using default value for prodbas_acc = 1.000000E-04. + Species W: Using default value max_l_prodbas = 20. + Species Te: Using default value for prodbas_acc = 1.000000E-04. + Species Te: Using default value max_l_prodbas = 20. + Target number of points in a grid batch is not set. Defaulting to 100 + Method for grid partitioning is not set. Defaulting to parallel hash+maxmin partitioning. + Batch size limit is not set. Defaulting to 200 + By default, will store active basis functions for each batch. + If in need of memory, prune_basis_once .false. can be used to disable this option. + communication_type for Hartree potential was not specified. + Defaulting to calc_hartree . + Work space size for distributed Hartree potential not set. + Defaulting to 0.200000E+03 MB. + Algorithm-dependent basis array size parameters: + | n_max_pulay : 6 + Presetting 1001 iterations before the initial mixing cycle + is restarted anyway using the sc_init_iter criterion / keyword. + Presetting a factor 1.000 between actual scf density residual + and density convergence criterion sc_accuracy_rho below which sc_init_iter + takes no effect. + Calculation of forces was not defined in control.in. No forces will be calculated. + Geometry relaxation not requested: no relaxation will be performed. + No accuracy limit for integral partition fn. given. Defaulting to 0.1000E-14. + No threshold value for u(r) in integrations given. Defaulting to 0.1000E-05. + No accuracy for occupation numbers given. Defaulting to 0.1000E-12. + No threshold value for occupation numbers given. Defaulting to 0.0000E+00. + No accuracy for fermi level given. Defaulting to 0.1000E-19. + Maximum # of iterations to find E_F not set. Defaulting to 200. + Preferred method for the eigenvalue solver ('KS_method') not specified in 'control.in'. + Defaulting to serial version, LAPACK (via ELSI), since more k-points than CPUs available. + Will not use alltoall communication since running on < 1024 CPUs. + Threshold for basis singularities not set. + Default threshold for basis singularities: 0.1000E-04 + partition_type (choice of integration weights) for integrals was not specified. + | Using a version of the partition function of Stratmann and coworkers ('stratmann_sparse'). + | At each grid point, the set of atoms used to build the partition table is smoothly restricted to + | only those atoms whose free-atom density would be non-zero at that grid point. + Partitioning for Hartree potential was not defined. Using partition_type for integrals. + | Adjusted default value of keyword multip_moments_threshold to: 0.10000000E-11 + | This value may affect high angular momentum components of the Hartree potential in periodic systems. + Threshold for auxiliary basis singularities not set. + Default threshold for auxiliary basis singularities: 0.1000E-04 + No q(lm)/r^(l+1) cutoff set for long-range Hartree potential. + | Using default value of 0.100000E-09 . + | Verify using the multipole_threshold keyword. + Defaulting to new monopole extrapolation. + Density update method: automatic selection selected. + Using density matrix based charge density update. + Using density matrix based charge density update. + Using packed matrix style: index . + * NOTE: You are attempting to run a periodic structure with an exchange treatment + * which requires a two-electron Coulomb operator (Hartree-Fock or a hybrid functional). + * The present implementation is reliable to our knowledge, but some things + * (like band structure output, or perhaps the auxilary basis set for small + * orbital basis sets - see the "for_aux" keyword) require extra care. + * Please let us know if you encounter any trouble. + Coulomb operator: Defaulting to screening threshold for four-center integrals: 0.100000E-06 + Coulomb operator: Defaulting to screening threshold for Coulomb matrix: 0.100000E-09 + Fock matrix calculation: Setting the screening threshold for overlap matrix to coul_mat_threshold: 0.100000E-09 + Coulomb operator: Defaulting to 'LVL_fast' resolution of identity - RI_type = LVL_fast + No other resolution of identity version is supported for periodic boundary conditions at present. + Coulomb operator: Defaulting to logarithmic spherical Bessel transform integrals (use_logsbt .true.). + HSE with LVL_fast: Also defaulting to logarithmic spherical Bessel transform integrals. + Defaulting to use time-reversal symmetry for k-point grid. + Charge integration errors on the 3D integration grid will be compensated + by explicit normalization and distribution of residual charges. + Use the "compensate_multipole_errors" flag to change this behaviour. + LVL not implemented with density matrix yet + -> switching to transformed overlap + LVL probably works better with logsbt + Default to 1D ("use_logsbt") integrations for auxiliary 2-center integrals. + Default onset of logarithmic r-grid for SBT is -38.000000000000 + Default onset of logarithmic k-grid for SBT is -25.000000000000 + Default range of logarithmic r- and k-grid for SBT is 45.000000000000 + Default number of logarithmic r- and k-grid for SBT is 4096 + * Use logSBT for radial HSE integration, too + * NOTE: Band structure and exact exchange are requested at the same time, + * and exx_band_structure_version is set to 1. + * exx_band_structure_version 1 is evaluated in a real-space formalism. It is fast + * and the preferred version. HOWEVER, it does require a sufficiently + * dense 'k_grid' to be used for the preceding s.c.f. cycle. + * If the 'k_grid used for s.c.f. is NOT dense enough, the real- + * space approach will produce bands that are OBVIOUSLY incorrect. + * You cannot miss this - they won't look 'slightly' correct. In + * that case, please try to increase the 'k_grid' parameters used + * for the s.c.f. cycle. In particular, please avoid k_grid dimensions + * of '1' (one) in any dimension. We apologize for this inconvenience. + * On the bright side, if you use exx_band_structure_version 1 + * correctly, it will give reliable results without much overhead. + * + * If your band structure does not look reasonable, increase the s.c.f. k-point + * grid density. Again, it is especially recommended that you avoid dimensions of 1 when + * specifying k_grid and using this option, even for large unit cells where a + * gamma-point-only k-grid would be sufficient to converge the accuracy of the + * calculation. + * + * Please test (e.g., by comparing results from different k_grid settings) when in any doubt. + Using the following vdw_convergence_threshold for supercell sums + over the Tkatchenko-Scheffler correction: 0.100000E-05 eV. + Set 'collect_eigenvectors' to be '.true.' for all serial calculations. This is mandatory. + Set 'collect_eigenvectors' to be '.true.' for KS_method lapack_fast and serial. + + Consistency checks for the contents of geometry.in are next. + + + Range separation radius for Ewald summation (hartree_convergence_parameter): 5.00000000 bohr. + Number of empty states per atom not set in control.in - providing a guess from actual geometry. + | Total number of empty states used during s.c.f. cycle: 37 + If you use a very high smearing, use empty_states (per atom!) in control.in to increase this value. + * Since a dielectric function calculation was requested, the number of empty states requested was INCREASED. + * Since a DOS, bandstructure or SOC calculation was requested, the number of empty states requested was INCREASED. + | Number of empty states (old): 373.00000 + | Number of empty states (new): 383.00000 + + Structure-dependent array size parameters: + | Maximum number of distinct radial functions : 73 + | Maximum number of basis functions : 286 + | Number of Kohn-Sham states (occupied + empty): 336 +------------------------------------------------------------ + Setting Coulomb cut-width to 1.091868692359 * rcut. + Setting Coulomb cutting radius rcut to 15.346308825744 A. + + Performing system and environment tests: + | Environment variable OMP_NUM_THREADS correctly set to 1. + | Checking for ScaLAPACK... + | Testing pdtran()... + | All pdtran() tests passed. + | Testing pzgemm()... + | All pzgemm() tests passed. + +------------------------------------------------------------ + Preparing all fixed parts of the calculation. +------------------------------------------------------------ + Determining machine precision: + 2.225073858507201E-308 + Setting up grids for atomic and cluster calculations. + + Creating wave function, potential, and density for free atoms. + Runtime choices for atomic solver: + | atomic solver xc : PBE + | compute density gradient: 1 + | compute kinetic density : F + + Species: Mo + + List of occupied orbitals and eigenvalues: + n l occ energy [Ha] energy [eV] + 1 0 2.0000 -745.344654 -20281.8600 + 2 0 2.0000 -103.288246 -2810.6162 + 3 0 2.0000 -17.516687 -476.6533 + 4 0 2.0000 -2.358559 -64.1796 + 5 0 1.0000 -0.145159 -3.9500 + 2 1 6.0000 -92.308627 -2511.8455 + 3 1 6.0000 -13.936005 -379.2180 + 4 1 6.0000 -1.408138 -38.3174 + 3 2 10.0000 -8.119011 -220.9295 + 4 2 5.0000 -0.132984 -3.6187 + + + Species: Se + + List of occupied orbitals and eigenvalues: + n l occ energy [Ha] energy [eV] + 1 0 2.0000 -466.337810 -12689.6975 + 2 0 2.0000 -59.202598 -1610.9847 + 3 0 2.0000 -7.847116 -213.5309 + 4 0 2.0000 -0.634372 -17.2621 + 2 1 6.0000 -52.061107 -1416.6548 + 3 1 6.0000 -5.620941 -152.9536 + 4 1 4.0000 -0.238469 -6.4891 + 3 2 10.0000 -1.951949 -53.1152 + + + Species: S + + List of occupied orbitals and eigenvalues: + n l occ energy [Ha] energy [eV] + 1 0 2.0000 -88.680731 -2413.1255 + 2 0 2.0000 -7.781719 -211.7513 + 3 0 2.0000 -0.633662 -17.2428 + 2 1 6.0000 -5.751976 -156.5192 + 3 1 4.0000 -0.257086 -6.9957 + + + Species: W + + List of occupied orbitals and eigenvalues: + n l occ energy [Ha] energy [eV] + 1 0 2.0000 -2764.899999 -75236.7570 + 2 0 2.0000 -447.822848 -12185.8797 + 3 0 2.0000 -101.923634 -2773.4832 + 4 0 2.0000 -20.945301 -569.9506 + 5 0 2.0000 -2.899582 -78.9016 + 6 0 2.0000 -0.207066 -5.6345 + 2 1 6.0000 -391.021390 -10640.2334 + 3 1 6.0000 -85.417793 -2324.3364 + 4 1 6.0000 -15.562838 -423.4864 + 5 1 6.0000 -1.582233 -43.0547 + 3 2 10.0000 -66.517936 -1810.0451 + 4 2 10.0000 -8.758436 -238.3292 + 5 2 4.0000 -0.161873 -4.4048 + 4 3 14.0000 -1.221948 -33.2509 + + + Species: Te + + List of occupied orbitals and eigenvalues: + n l occ energy [Ha] energy [eV] + 1 0 2.0000 -1205.196269 -32795.0591 + 2 0 2.0000 -179.435283 -4882.6825 + 3 0 2.0000 -35.515934 -966.4377 + 4 0 2.0000 -6.038599 -164.3187 + 5 0 2.0000 -0.553449 -15.0601 + 2 1 6.0000 -160.997293 -4380.9593 + 3 1 6.0000 -29.570439 -804.6526 + 4 1 6.0000 -4.201054 -114.3165 + 5 1 4.0000 -0.217175 -5.9096 + 3 2 10.0000 -20.601415 -560.5930 + 4 2 10.0000 -1.529160 -41.6105 + + + Adding cutoff potential to free-atom effective potential. + Creating fixed part of basis set: Ionic, confined, hydrogenic. + + Mo ion: + + List of free ionic orbitals and eigenvalues: + n l energy [Ha] energy [eV] + 1 0 -746.048685 -20301.0176 + 2 0 -103.980912 -2829.4646 + 3 0 -18.206601 -495.4268 + 4 0 -3.040545 -82.7374 + 2 1 -93.001013 -2530.6863 + 3 1 -14.625827 -397.9890 + 4 1 -2.084855 -56.7318 + 3 2 -8.808854 -239.7011 + 4 2 -0.765435 -20.8285 + + + List of ionic basis orbitals and eigenvalues: + n l energy [Ha] energy [eV] outer radius [A] + 5 1 -0.465587 -12.6693 5.456393 + 5 0 -0.650331 -17.6964 5.390095 + + + Mo hydrogenic: + + List of hydrogenic basis orbitals: + n l effective z eigenvalue [eV] inner max. [A] outer max. [A] outer radius [A] + 4 3 8.400000 -60.0010 1.009788 1.009788 4.487018 + 3 2 2.800000 -11.8048 1.687401 1.687401 5.456393 + 5 4 12.000000 -78.3687 1.100005 1.100005 4.432498 + + + Se ion: + + List of free ionic orbitals and eigenvalues: + n l energy [Ha] energy [eV] + 1 0 -467.261007 -12714.8189 + 2 0 -60.104893 -1635.5374 + 3 0 -8.743714 -237.9286 + 4 0 -1.414053 -38.4783 + 2 1 -52.964156 -1441.2280 + 3 1 -6.516916 -177.3343 + 4 1 -0.961869 -26.1738 + 3 2 -2.844511 -77.4031 + + + List of ionic basis orbitals and eigenvalues: + n l energy [Ha] energy [eV] outer radius [A] + 4 0 -1.414046 -38.4782 4.083166 + + + Se hydrogenic: + + List of hydrogenic basis orbitals: + n l effective z eigenvalue [eV] inner max. [A] outer max. [A] outer radius [A] + 3 2 4.300000 -27.9518 1.103845 1.103845 5.278265 + 2 1 1.600000 -8.6828 1.326010 1.326010 5.475439 + 4 3 7.200000 -44.0822 1.173422 1.173422 4.965294 + + + S ion: + + List of free ionic orbitals and eigenvalues: + n l energy [Ha] energy [eV] + 1 0 -89.703778 -2440.9640 + 2 0 -8.775428 -238.7916 + 3 0 -1.470343 -40.0101 + 2 1 -6.747660 -183.6132 + 3 1 -1.048627 -28.5346 + + + List of ionic basis orbitals and eigenvalues: + n l energy [Ha] energy [eV] outer radius [A] + 3 2 -0.495605 -13.4861 5.386362 + 3 0 -1.470336 -40.0099 3.967934 + + + S hydrogenic: + + List of hydrogenic basis orbitals: + n l effective z eigenvalue [eV] inner max. [A] outer max. [A] outer radius [A] + 2 1 1.800000 -11.0118 1.168531 1.168531 5.452614 + 4 3 7.000000 -41.6672 1.212182 1.212182 5.066981 + 4 2 6.200000 -32.6848 0.582121 1.814567 5.386362 + 5 4 10.800000 -63.4785 1.227092 1.227092 4.766538 + + + W ion: + + List of free ionic orbitals and eigenvalues: + n l energy [Ha] energy [eV] + 1 0 -2765.664016 -75257.5469 + 2 0 -448.543169 -12205.4806 + 3 0 -102.635476 -2792.8534 + 4 0 -21.655379 -589.2728 + 5 0 -3.604872 -98.0936 + 6 0 -0.752243 -20.4696 + 2 1 -391.740682 -10659.8063 + 3 1 -86.129333 -2343.6984 + 4 1 -16.272893 -442.8080 + 5 1 -2.280103 -62.0448 + 3 2 -67.229405 -1829.4052 + 4 2 -9.468448 -257.6496 + 5 2 -0.806537 -21.9470 + 4 3 -1.931058 -52.5468 + + + List of ionic basis orbitals and eigenvalues: + n l energy [Ha] energy [eV] outer radius [A] + 6 1 -0.508246 -13.8301 5.434360 + 6 0 -0.752227 -20.4691 5.368330 + + + W hydrogenic: + + List of hydrogenic basis orbitals: + n l effective z eigenvalue [eV] inner max. [A] outer max. [A] outer radius [A] + 4 3 7.800000 -51.7355 1.082252 1.082252 4.692859 + 4 2 5.800000 -28.5979 0.616741 1.946131 5.434360 + 5 4 12.400000 -83.6803 1.069102 1.069102 4.307971 + + + Te ion: + + List of free ionic orbitals and eigenvalues: + n l energy [Ha] energy [eV] + 1 0 -1206.001395 -32816.9677 + 2 0 -180.213456 -4903.8576 + 3 0 -36.289734 -987.4939 + 4 0 -6.806662 -185.2187 + 5 0 -1.230780 -33.4912 + 2 1 -161.775412 -4402.1329 + 3 1 -30.344117 -825.7054 + 4 1 -4.968097 -135.1888 + 5 1 -0.843350 -22.9487 + 3 2 -21.374869 -581.6398 + 4 2 -2.290936 -62.3395 + + + List of ionic basis orbitals and eigenvalues: + n l energy [Ha] energy [eV] outer radius [A] + 5 0 -1.230774 -33.4911 4.407087 + + + Te hydrogenic: + + List of hydrogenic basis orbitals: + n l effective z eigenvalue [eV] inner max. [A] outer max. [A] outer radius [A] + 3 2 3.700000 -20.6934 1.282089 1.282089 5.425112 + 4 3 6.000000 -30.6116 1.413813 1.413813 5.359194 + 3 1 2.700000 -10.8497 0.586309 2.305482 5.491841 + 5 4 9.000000 -44.0820 1.466627 1.466627 5.359194 + + Creating atomic-like basis functions for current effective potential. + + Species Mo : + + List of atomic basis orbitals and eigenvalues: + n l energy [Ha] energy [eV] outer radius [A] + 1 0 -745.344654 -20281.8600 0.247552 + 2 0 -103.288246 -2810.6162 0.682864 + 3 0 -17.516687 -476.6533 1.626637 + 4 0 -2.358559 -64.1796 4.220963 + 5 0 -0.145159 -3.9500 5.456393 + 2 1 -92.308627 -2511.8455 0.699766 + 3 1 -13.936005 -379.2180 1.793761 + 4 1 -1.408138 -38.3174 4.828511 + 3 2 -8.119011 -220.9295 2.181285 + 4 2 -0.132984 -3.6187 5.390095 + + + Species Se : + + List of atomic basis orbitals and eigenvalues: + n l energy [Ha] energy [eV] outer radius [A] + 1 0 -466.337810 -12689.6975 0.309561 + 2 0 -59.202598 -1610.9847 0.885812 + 3 0 -7.847116 -213.5309 2.355489 + 4 0 -0.634372 -17.2621 5.214131 + 2 1 -52.061107 -1416.6548 0.907737 + 3 1 -5.620941 -152.9536 2.694529 + 4 1 -0.238469 -6.4891 5.408909 + 3 2 -1.951949 -53.1152 4.083166 + + + Species S : + + List of atomic basis orbitals and eigenvalues: + n l energy [Ha] energy [eV] outer radius [A] + 1 0 -88.680731 -2413.1255 0.682391 + 2 0 -7.781719 -211.7513 2.289014 + 3 0 -0.633662 -17.2428 5.256262 + 2 1 -5.751976 -156.5192 2.555240 + 3 1 -0.257086 -6.9957 5.386362 + + + Species W : + + List of atomic basis orbitals and eigenvalues: + n l energy [Ha] energy [eV] outer radius [A] + 1 0 -2764.899999 -75236.7570 0.130566 + 2 0 -447.822848 -12185.8797 0.342973 + 3 0 -101.923634 -2773.4832 0.722975 + 4 0 -20.945301 -569.9506 1.542753 + 5 0 -2.899582 -78.9016 3.859132 + 6 0 -0.207066 -5.6345 5.434360 + 2 1 -391.021390 -10640.2334 0.355785 + 3 1 -85.417793 -2324.3364 0.768545 + 4 1 -15.562838 -423.4864 1.722184 + 5 1 -1.582233 -43.0547 4.750581 + 3 2 -66.517936 -1810.0451 0.827037 + 4 2 -8.758436 -238.3292 2.172477 + 5 2 -0.161873 -4.4048 5.368330 + 4 3 -1.221948 -33.2509 4.579510 + + + Species Te : + + List of atomic basis orbitals and eigenvalues: + n l energy [Ha] energy [eV] outer radius [A] + 1 0 -1205.196269 -32795.0591 0.195117 + 2 0 -179.435283 -4882.6825 0.531683 + 3 0 -35.515934 -966.4377 1.176937 + 4 0 -6.038599 -164.3187 2.735843 + 5 0 -0.553449 -15.0601 5.294077 + 2 1 -160.997293 -4380.9593 0.544843 + 3 1 -29.570439 -804.6526 1.266511 + 4 1 -4.201054 -114.3165 3.168123 + 5 1 -0.217175 -5.9096 5.425112 + 3 2 -20.601415 -560.5930 1.431203 + 4 2 -1.529160 -41.6105 4.627949 + + Assembling full basis from fixed parts. + | Species Mo : atomic orbital 1 s accepted. + | Species Mo : atomic orbital 2 s accepted. + | Species Mo : atomic orbital 3 s accepted. + | Species Mo : atomic orbital 4 s accepted. + | Species Mo : ionic orbital 5 s accepted. + | Species Mo : atomic orbital 5 s accepted. + | Species Mo : atomic orbital 2 p accepted. + | Species Mo : atomic orbital 3 p accepted. + | Species Mo : atomic orbital 4 p accepted. + | Species Mo : ionic orbital 5 p accepted. + | Species Mo : atomic orbital 3 d accepted. + | Species Mo : atomic orbital 4 d accepted. + | Species Mo : hydro orbital 3 d accepted. + | Species Mo : hydro orbital 4 f accepted. + | Species Mo : hydro orbital 5 g accepted. + | Species Se : atomic orbital 1 s accepted. + | Species Se : atomic orbital 2 s accepted. + | Species Se : atomic orbital 3 s accepted. + | Species Se : ionic orbital 4 s accepted. + | Species Se : atomic orbital 4 s accepted. + | Species Se : atomic orbital 2 p accepted. + | Species Se : atomic orbital 3 p accepted. + | Species Se : atomic orbital 4 p accepted. + | Species Se : hydro orbital 2 p accepted. + | Species Se : atomic orbital 3 d accepted. + | Species Se : hydro orbital 3 d accepted. + | Species Se : hydro orbital 4 f accepted. + | Species S : atomic orbital 1 s accepted. + | Species S : atomic orbital 2 s accepted. + | Species S : ionic orbital 3 s accepted. + | Species S : atomic orbital 3 s accepted. + | Species S : atomic orbital 2 p accepted. + | Species S : atomic orbital 3 p accepted. + | Species S : hydro orbital 2 p accepted. + | Species S : ionic orbital 3 d accepted. + | Species S : hydro orbital 4 d accepted. + | Species S : hydro orbital 4 f accepted. + | Species S : hydro orbital 5 g accepted. + | Species W : atomic orbital 1 s accepted. + | Species W : atomic orbital 2 s accepted. + | Species W : atomic orbital 3 s accepted. + | Species W : atomic orbital 4 s accepted. + | Species W : atomic orbital 5 s accepted. + | Species W : ionic orbital 6 s accepted. + | Species W : atomic orbital 6 s accepted. + | Species W : atomic orbital 2 p accepted. + | Species W : atomic orbital 3 p accepted. + | Species W : atomic orbital 4 p accepted. + | Species W : atomic orbital 5 p accepted. + | Species W : ionic orbital 6 p accepted. + | Species W : atomic orbital 3 d accepted. + | Species W : atomic orbital 4 d accepted. + | Species W : atomic orbital 5 d accepted. + | Species W : hydro orbital 4 d accepted. + | Species W : atomic orbital 4 f accepted. + | Species W : hydro orbital 4 f accepted. + | Species W : hydro orbital 5 g accepted. + | Species Te : atomic orbital 1 s accepted. + | Species Te : atomic orbital 2 s accepted. + | Species Te : atomic orbital 3 s accepted. + | Species Te : atomic orbital 4 s accepted. + | Species Te : ionic orbital 5 s accepted. + | Species Te : atomic orbital 5 s accepted. + | Species Te : atomic orbital 2 p accepted. + | Species Te : atomic orbital 3 p accepted. + | Species Te : atomic orbital 4 p accepted. + | Species Te : atomic orbital 5 p accepted. + | Species Te : hydro orbital 3 p accepted. + | Species Te : atomic orbital 3 d accepted. + | Species Te : atomic orbital 4 d accepted. + | Species Te : hydro orbital 3 d accepted. + | Species Te : hydro orbital 4 f accepted. + | Species Te : hydro orbital 5 g accepted. + Reducing total number of Kohn-Sham states to 286. + + Basis size parameters after reduction: + | Total number of radial functions: 73 + | Total number of basis functions : 286 + + Per-task memory consumption for arrays in subroutine allocate_ext: + | 27.726404MB. + Testing on-site integration grid accuracy. + | Species Function (log., in eV) (rad., in eV) + 1 1 -20281.8599610543 -20281.8584300616 + 1 2 -2810.6161812280 -2810.6161551921 + 1 3 -476.6533163555 -476.6533136395 + 1 4 -64.1796433667 -64.1796426456 + 1 5 -3.3691762756 -3.3691802887 + 1 6 4.4704608512 4.4699102345 + 1 7 -2511.8455406047 -2511.8455385741 + 1 8 -379.2179896350 -379.2179882338 + 1 9 -38.3173891619 -38.3173886619 + 1 10 0.2493245095 0.2492931069 + 1 11 -220.9295301098 -220.9295297081 + 1 12 -3.6195697699 -3.6195754704 + 1 13 7.1428000922 7.1426882355 + 1 14 23.3975871087 23.3975871819 + 1 15 50.2449608881 50.2449608586 + 2 16 -12689.6974611609 -12689.6967666984 + 2 17 -1610.9846578580 -1610.9846472470 + 2 18 -213.5308789869 -213.5308777267 + 2 19 -17.0464428502 -17.0464426496 + 2 20 6.7356859379 6.7356842047 + 2 21 -1416.6548010133 -1416.6548002108 + 2 22 -152.9535734377 -152.9535727493 + 2 23 -6.4896265677 -6.4896303794 + 2 24 5.2703037283 5.2701679583 + 2 25 -53.1152220964 -53.1152219035 + 2 26 7.6186674138 7.6186665630 + 2 27 23.1072799052 23.1072803137 + 3 28 -2413.1254568977 -2413.1254096663 + 3 29 -211.7513411281 -211.7513404762 + 3 30 -16.9725280787 -16.9725279206 + 3 31 7.6024436204 7.6024549059 + 3 32 -156.5192206929 -156.5192205451 + 3 33 -6.9959757887 -6.9959777655 + 3 34 6.8896462808 6.8895564741 + 3 35 6.0214250550 6.0214220200 + 3 36 19.6206468977 19.6206494558 + 3 37 24.7008710786 24.7008710738 + 3 38 47.5292252001 47.5292260486 + 4 39 -75236.7569897398 -75236.7398021816 + 4 40 -12185.8796968880 -12185.8793671389 + 4 41 -2773.4831911435 -2773.4831624928 + 4 42 -569.9506420417 -569.9506363235 + 4 43 -78.9016401752 -78.9016385968 + 4 44 -5.1691854984 -5.1691848358 + 4 45 4.5636857939 4.5638143912 + 4 46 -10640.2333851158 -10640.2333803363 + 4 47 -2324.3364165327 -2324.3364072919 + 4 48 -423.4863614587 -423.4863574859 + 4 49 -43.0547390741 -43.0547381500 + 4 50 -0.2794590886 -0.2794514857 + 4 51 -1810.0451240061 -1810.0451202456 + 4 52 -238.3291788477 -238.3291766726 + 4 53 -4.4054312547 -4.4054293963 + 4 54 8.2928303329 8.2928369211 + 4 55 -33.2508975442 -33.2508971531 + 4 56 21.3563540731 21.3563541107 + 4 57 49.8060668072 49.8060668107 + 5 58 -32795.0590846455 -32795.0556605232 + 5 59 -4882.6824813465 -4882.6824159868 + 5 60 -966.4377413866 -966.4377361228 + 5 61 -164.3186507888 -164.3186490966 + 5 62 -14.8855865446 -14.8855862180 + 5 63 5.2437428292 5.2437525172 + 5 64 -4380.9592556630 -4380.9592506320 + 5 65 -804.6525815679 -804.6525796130 + 5 66 -114.3164854912 -114.3164843738 + 5 67 -5.9109395843 -5.9109349312 + 5 68 4.8569390905 4.8570662328 + 5 69 -560.5930245701 -560.5930241259 + 5 70 -41.6105488448 -41.6105483746 + 5 71 5.2198476695 5.2198521163 + 5 72 13.1245618285 13.1245643331 + 5 73 29.0453900150 29.0453912086 + + Preparing densities etc. for the partition functions (integrals / Hartree potential). + + Preparations completed. + max(cpu_time) : 0.991 s. + Wall clock time (cpu1) : 0.996 s. +------------------------------------------------------------ + + Initializing index lists of integration centers etc. from given atomic structure: + Mapping all atomic coordinates to central unit cell. + + Initializing the k-points + Using symmetry for reducing the k-points + | k-points reduced from: 625 to 313 + | Number of k-points : 313 + | Consuming 3056 KiB for k_phase_exx. + The eigenvectors in the calculations are COMPLEX. + | K-points in task 0: 39 + | K-points in task 1: 40 + | K-points in task 2: 39 + | K-points in task 3: 39 + | K-points in task 4: 39 + | K-points in task 5: 39 + | K-points in task 6: 39 + | K-points in task 7: 39 + | Number of basis functions in the Hamiltonian integrals : 4449 + | Number of basis functions in a single unit cell : 286 + | Number of centers in hartree potential : 642 + | Number of centers in hartree multipole : 342 + | Number of centers in electron density summation: 264 + | Number of centers in basis integrals : 288 + | Number of centers in integrals : 153 + | Number of centers in hamiltonian : 264 + | Consuming 322 KiB for k_phase. + | Number of super-cells (origin) [n_cells] : 1125 + | Number of super-cells (after PM_index) [n_cells] : 66 + | Number of super-cells in hamiltonian [n_cells_in_hamiltonian]: 52 + | Size of matrix packed + index [n_hamiltonian_matrix_size] : 631566 + +------------------------------------------------------------ + Begin self-consistency loop: Initialization. + + Date : 20230117, Time : 114552.002 +------------------------------------------------------------ + | Estimated reciprocal-space cutoff momentum G_max: 1.90186217 bohr^-1 . + | Reciprocal lattice points for long-range Hartree potential: 208 + Partitioning the integration grid into batches with parallel hashing+maxmin method. + | Number of batches: 2360 + | Maximal batch size: 160 + | Minimal batch size: 37 + | Average batch size: 81.776 + | Standard deviation of batch sizes: 24.693 + + Integration load balanced across 8 MPI tasks. + Work distribution over tasks is as follows: + Task 0 has 24105 integration points. + Task 1 has 24104 integration points. + Task 2 has 24156 integration points. + Task 3 has 24139 integration points. + Task 4 has 24178 integration points. + Task 5 has 24118 integration points. + Task 6 has 24118 integration points. + Task 7 has 24074 integration points. + Initializing partition tables, free-atom densities, potentials, etc. across the integration grid (initialize_grid_storage). + | initialize_grid_storage: Actual outermost partition radius vs. multipole_radius_free + | (-- VB: in principle, multipole_radius_free should be larger, hence this output) + | Species 1: Confinement radius = 6.000000000000000 AA, multipole_radius_free = 6.016994434057369 AA. + | Species 1: outer_partition_radius set to 6.016994434057369 AA . + | Species 2: Confinement radius = 6.000000000000000 AA, multipole_radius_free = 6.037996416842453 AA. + | Species 2: outer_partition_radius set to 6.037996416842453 AA . + | Species 3: Confinement radius = 6.000000000000000 AA, multipole_radius_free = 6.012827091137924 AA. + | Species 3: outer_partition_radius set to 6.012827091137924 AA . + | Species 4: Confinement radius = 6.000000000000000 AA, multipole_radius_free = 6.066407844853155 AA. + | Species 4: outer_partition_radius set to 6.066407844853155 AA . + | Species 5: Confinement radius = 6.000000000000000 AA, multipole_radius_free = 6.056084577048819 AA. + | Species 5: outer_partition_radius set to 6.056084577048819 AA . + | The sparse table of interatomic distances needs 698.55 kbyte instead of 663.55 kbyte of memory. + | Using the partition_type stratmann_smoother will reduce your memory usage. + | Net number of integration points: 192992 + | of which are non-zero points : 163724 + | Numerical average free-atom electrostatic potential : -9.05439813 eV + Renormalizing the initial density to the exact electron count on the 3D integration grid. + | Initial density: Formal number of electrons (from input files) : 288.0000000000 + | Integrated number of electrons on 3D grid : 287.9998104340 + | Charge integration error : -0.0001895660 + | Normalization factor for density and gradient : 1.0000006582 + Renormalizing the free-atom superposition density to the exact electron count on the 3D integration grid. + | Formal number of electrons (from input files) : 288.0000000000 + | Integrated number of electrons on 3D grid : 287.9998104340 + | Charge integration error : -0.0001895660 + | Normalization factor for density and gradient : 1.0000006582 + Obtaining max. number of non-zero basis functions in each batch (get_n_compute_maxes). + | Maximal number of non-zero basis functions: 1142 in task 0 + | Maximal number of non-zero basis functions: 1197 in task 1 + | Maximal number of non-zero basis functions: 1058 in task 2 + | Maximal number of non-zero basis functions: 1155 in task 3 + | Maximal number of non-zero basis functions: 1103 in task 4 + | Maximal number of non-zero basis functions: 1092 in task 5 + | Maximal number of non-zero basis functions: 1107 in task 6 + | Maximal number of non-zero basis functions: 1088 in task 7 + Allocating 48.676 MB for KS_eigenvector_complex + Integrating Hamiltonian matrix: batch-based integration. + Time summed over all CPUs for integration: real work 47.351 s, elapsed 53.185 s + Integrating overlap matrix. + Time summed over all CPUs for integration: real work 34.212 s, elapsed 38.875 s + Calculating total energy contributions from superposition of free atom densities. + + -------------------------------------------- + Constructing auxiliary basis (full product) ... + + Product basis: + | charge radius: extent of product basis function + | field radius: extent of its Coulomb potential + | Species l charge radius field radius + | Mo 0 1.729167 A 1.729167 A + | Mo 0 1.708156 A 1.708156 A + | Mo 0 2.889515 A 2.889515 A + | Mo 0 4.119012 A 4.119012 A + | Mo 0 4.828511 A 4.828511 A + | Mo 0 5.070493 A 5.070493 A + | Mo 0 5.195995 A 5.195995 A + | Mo 0 5.324602 A 11.931560 A + | Mo 0 5.390095 A 19.695916 A + | Mo 0 5.390095 A 22.530865 A + | Mo 0 5.456393 A 24.245621 A + | Mo 0 5.456393 A 25.151335 A + | Mo 0 5.456393 A 25.773864 A + | Mo 0 5.456393 A 25.460697 A + | Mo 1 1.587348 A 1.587348 A + | Mo 1 2.376168 A 2.376168 A + | Mo 1 3.346077 A 3.346077 A + | Mo 1 4.169676 A 4.169676 A + | Mo 1 4.887902 A 4.887902 A + | Mo 1 5.070493 A 5.070493 A + | Mo 1 5.195995 A 5.195995 A + | Mo 1 5.324602 A 14.868378 A + | Mo 1 5.390095 A 20.937383 A + | Mo 1 5.390095 A 23.088533 A + | Mo 1 5.456393 A 24.543843 A + | Mo 1 5.456393 A 25.460697 A + | Mo 1 5.456393 A 25.460697 A + | Mo 2 2.051947 A 2.051947 A + | Mo 2 3.109428 A 3.109428 A + | Mo 2 4.169676 A 4.169676 A + | Mo 2 4.828511 A 4.828511 A + | Mo 2 5.070493 A 5.070493 A + | Mo 2 5.259905 A 5.259905 A + | Mo 2 5.324602 A 7.406904 A + | Mo 2 5.390095 A 12.997563 A + | Mo 2 5.456393 A 20.682982 A + | Mo 2 5.456393 A 23.088533 A + | Mo 2 5.456393 A 24.543843 A + | Mo 2 5.523507 A 25.460697 A + | Mo 2 5.523507 A 25.773864 A + | Mo 3 2.620300 A 2.620300 A + | Mo 3 3.781189 A 3.781189 A + | Mo 3 4.654634 A 4.654634 A + | Mo 3 4.887902 A 4.887902 A + | Mo 3 5.132860 A 5.132860 A + | Mo 3 5.259905 A 5.259905 A + | Mo 3 5.324602 A 6.883056 A + | Mo 3 5.390095 A 15.805557 A + | Mo 3 5.390095 A 21.986666 A + | Mo 3 5.456393 A 23.951023 A + | Mo 3 5.456393 A 25.151335 A + | Mo 3 5.456393 A 25.773864 A + | Mo 4 3.305420 A 3.305420 A + | Mo 4 4.654634 A 4.654634 A + | Mo 4 4.948023 A 4.948023 A + | Mo 4 5.132860 A 5.132860 A + | Mo 4 5.132860 A 5.132860 A + | Mo 4 5.259905 A 6.967717 A + | Mo 4 5.390095 A 15.805557 A + | Mo 4 5.390095 A 19.938176 A + | Mo 4 5.390095 A 22.530865 A + | Mo 4 5.456393 A 24.543843 A + | Mo 4 5.456393 A 25.460697 A + | Mo 5 4.169676 A 4.169676 A + | Mo 5 4.487018 A 4.487018 A + | Mo 5 4.654634 A 4.654634 A + | Mo 5 4.654634 A 4.654634 A + | Mo 5 4.769842 A 14.332959 A + | Mo 5 4.828511 A 20.682982 A + | Mo 5 4.828511 A 22.807995 A + | Mo 5 4.887902 A 24.245621 A + | Mo 6 4.487018 A 4.487018 A + | Mo 6 4.711886 A 10.819901 A + | Mo 6 4.769842 A 16.597657 A + | Mo 6 4.711886 A 21.194913 A + | Mo 6 4.769842 A 23.372523 A + | Mo 7 4.487018 A 18.302935 A + | Mo 7 4.487018 A 20.937383 A + | Mo 8 4.378641 A 19.938176 A + | Se 0 2.443480 A 2.443480 A + | Se 0 3.841058 A 3.841058 A + | Se 0 4.786491 A 4.786491 A + | Se 0 4.965294 A 4.965294 A + | Se 0 5.150776 A 5.278265 A + | Se 0 5.214131 A 9.262247 A + | Se 0 5.278265 A 10.089765 A + | Se 0 5.343188 A 19.287278 A + | Se 0 5.408909 A 22.609507 A + | Se 0 5.475439 A 24.330249 A + | Se 0 5.475439 A 25.239125 A + | Se 0 5.475439 A 25.549566 A + | Se 0 5.475439 A 25.549566 A + | Se 1 2.110075 A 2.110075 A + | Se 1 3.569401 A 3.569401 A + | Se 1 4.614127 A 4.614127 A + | Se 1 5.026367 A 5.026367 A + | Se 1 5.150776 A 5.150776 A + | Se 1 5.150776 A 7.342446 A + | Se 1 5.278265 A 8.607180 A + | Se 1 5.408909 A 16.453215 A + | Se 1 5.475439 A 22.609507 A + | Se 1 5.475439 A 23.454103 A + | Se 1 5.408909 A 24.629512 A + | Se 1 5.475439 A 25.239125 A + | Se 1 5.475439 A 25.549566 A + | Se 2 2.829566 A 2.829566 A + | Se 2 3.794387 A 3.794387 A + | Se 2 4.965294 A 4.965294 A + | Se 2 5.150776 A 5.150776 A + | Se 2 5.214131 A 5.214131 A + | Se 2 5.150776 A 10.991216 A + | Se 2 5.343188 A 19.287278 A + | Se 2 5.408909 A 22.609507 A + | Se 2 5.475439 A 24.330249 A + | Se 2 5.475439 A 25.239125 A + | Se 2 5.475439 A 25.863826 A + | Se 3 3.794387 A 3.794387 A + | Se 3 4.786491 A 4.786491 A + | Se 3 5.088191 A 5.088191 A + | Se 3 5.150776 A 5.150776 A + | Se 3 5.150776 A 7.342446 A + | Se 3 5.343188 A 12.120477 A + | Se 3 5.343188 A 15.860726 A + | Se 3 5.343188 A 21.268893 A + | Se 3 5.408909 A 23.454103 A + | Se 3 5.408909 A 24.629512 A + | Se 3 5.475439 A 25.549566 A + | Se 4 4.965294 A 4.965294 A + | Se 4 5.150776 A 5.150776 A + | Se 4 5.278265 A 11.973206 A + | Se 4 5.343188 A 18.143653 A + | Se 4 5.343188 A 21.530501 A + | Se 4 5.343188 A 23.454103 A + | Se 4 5.343188 A 24.629512 A + | Se 5 5.088191 A 18.592732 A + | Se 5 5.150776 A 22.334789 A + | Se 5 5.150776 A 23.742589 A + | Se 6 4.965294 A 22.063409 A + | W 0 0.705513 A 4.052533 A + | W 0 1.178944 A 3.542623 A + | W 0 1.680587 A 3.212558 A + | W 0 2.281351 A 2.949078 A + | W 0 3.332566 A 3.332566 A + | W 0 4.203919 A 4.203919 A + | W 0 4.868164 A 4.868164 A + | W 0 5.112134 A 5.368330 A + | W 0 5.238666 A 6.066408 A + | W 0 5.303101 A 11.883380 A + | W 0 5.368330 A 19.378033 A + | W 0 5.434360 A 22.439884 A + | W 0 5.434360 A 24.147717 A + | W 0 5.434360 A 25.049773 A + | W 0 5.501203 A 25.669788 A + | W 0 5.434360 A 25.357886 A + | W 1 0.787568 A 0.787568 A + | W 1 1.122680 A 1.122680 A + | W 1 1.505490 A 1.505490 A + | W 1 1.994300 A 1.994300 A + | W 1 2.546686 A 2.546686 A + | W 1 3.542623 A 3.542623 A + | W 1 4.307971 A 4.307971 A + | W 1 4.868164 A 4.868164 A + | W 1 5.112134 A 5.112134 A + | W 1 5.238666 A 5.238666 A + | W 1 5.303101 A 7.024938 A + | W 1 5.368330 A 15.935357 A + | W 1 5.434360 A 21.631811 A + | W 1 5.434360 A 23.564465 A + | W 1 5.434360 A 24.745404 A + | W 1 5.501203 A 25.669788 A + | W 1 5.501203 A 25.669788 A + | W 2 0.993490 A 0.993490 A + | W 2 1.487198 A 1.487198 A + | W 2 2.337818 A 2.337818 A + | W 2 2.949078 A 2.949078 A + | W 2 3.954650 A 3.954650 A + | W 2 4.692859 A 4.692859 A + | W 2 4.988658 A 4.988658 A + | W 2 5.175013 A 5.175013 A + | W 2 5.303101 A 5.303101 A + | W 2 5.368330 A 12.787788 A + | W 2 5.368330 A 20.349169 A + | W 2 5.434360 A 22.995301 A + | W 2 5.434360 A 24.444734 A + | W 2 5.501203 A 25.357886 A + | W 2 5.501203 A 25.985527 A + | W 3 1.095564 A 1.095564 A + | W 3 1.899125 A 1.899125 A + | W 3 2.018830 A 2.018830 A + | W 3 3.332566 A 3.332566 A + | W 3 4.750581 A 4.750581 A + | W 3 4.988658 A 4.988658 A + | W 3 5.112134 A 5.112134 A + | W 3 5.238666 A 5.238666 A + | W 3 5.368330 A 9.081062 A + | W 3 5.434360 A 18.453244 A + | W 3 5.434360 A 21.631811 A + | W 3 5.368330 A 23.278144 A + | W 3 5.368330 A 24.444734 A + | W 3 5.434360 A 25.357886 A + | W 4 1.451277 A 48.473338 A + | W 4 2.120004 A 52.804098 A + | W 4 3.212558 A 52.804098 A + | W 4 4.360959 A 52.804098 A + | W 4 4.868164 A 52.804098 A + | W 4 5.112134 A 49.069561 A + | W 4 5.238666 A 5.238666 A + | W 4 5.303101 A 7.652568 A + | W 4 5.368330 A 16.329778 A + | W 4 5.434360 A 20.599464 A + | W 4 5.434360 A 22.995301 A + | W 4 5.434360 A 25.049773 A + | W 4 5.501203 A 25.669788 A + | W 5 3.252072 A 3.252072 A + | W 5 4.692859 A 4.692859 A + | W 5 4.868164 A 4.868164 A + | W 5 4.988658 A 4.988658 A + | W 5 5.175013 A 5.175013 A + | W 5 5.303101 A 11.178763 A + | W 5 5.303101 A 14.275082 A + | W 5 5.303101 A 21.109327 A + | W 5 5.368330 A 23.278144 A + | W 5 5.368330 A 24.444734 A + | W 6 4.152839 A 4.152839 A + | W 6 4.635838 A 4.635838 A + | W 6 4.692859 A 4.692859 A + | W 6 4.750581 A 9.536162 A + | W 6 4.809013 A 18.229027 A + | W 6 4.809013 A 21.631811 A + | W 6 4.809013 A 23.278144 A + | W 7 4.414599 A 10.776210 A + | W 7 4.468899 A 19.142579 A + | W 7 4.523866 A 21.897883 A + | W 8 4.307971 A 19.616383 A + | Te 0 1.266511 A 2.040184 A + | Te 0 1.379665 A 1.379665 A + | Te 0 2.511461 A 2.511461 A + | Te 0 3.409239 A 3.409239 A + | Te 0 4.095398 A 4.095398 A + | Te 0 4.742497 A 4.742497 A + | Te 0 5.041425 A 5.696993 A + | Te 0 5.229751 A 7.364442 A + | Te 0 5.359194 A 11.863158 A + | Te 0 5.359194 A 12.156786 A + | Te 0 5.359194 A 20.067707 A + | Te 0 5.425112 A 22.956170 A + | Te 0 5.425112 A 24.403136 A + | Te 0 5.491841 A 25.314734 A + | Te 0 5.491841 A 25.626106 A + | Te 0 5.491841 A 25.626106 A + | Te 1 1.134555 A 1.134555 A + | Te 1 1.783477 A 1.783477 A + | Te 1 2.480945 A 2.480945 A + | Te 1 3.409239 A 3.409239 A + | Te 1 4.407087 A 4.407087 A + | Te 1 4.919657 A 4.919657 A + | Te 1 5.103434 A 5.103434 A + | Te 1 5.229751 A 5.229751 A + | Te 1 5.294077 A 9.755565 A + | Te 1 5.359194 A 15.908240 A + | Te 1 5.425112 A 21.595000 A + | Te 1 5.425112 A 23.524365 A + | Te 1 5.491841 A 24.703295 A + | Te 1 5.491841 A 25.314734 A + | Te 1 5.491841 A 25.626106 A + | Te 2 1.637204 A 1.637204 A + | Te 2 2.421022 A 2.421022 A + | Te 2 3.899951 A 3.899951 A + | Te 2 4.980169 A 4.980169 A + | Te 2 5.041425 A 5.041425 A + | Te 2 5.166207 A 5.166207 A + | Te 2 5.229751 A 6.927772 A + | Te 2 5.359194 A 11.297005 A + | Te 2 5.425112 A 15.714946 A + | Te 2 5.425112 A 20.067707 A + | Te 2 5.425112 A 22.956170 A + | Te 2 5.425112 A 24.403136 A + | Te 2 5.491841 A 25.314734 A + | Te 2 5.491841 A 25.941307 A + | Te 3 1.942819 A 1.942819 A + | Te 3 3.054037 A 3.054037 A + | Te 3 3.899951 A 3.899951 A + | Te 3 4.407087 A 4.407087 A + | Te 3 4.684873 A 4.684873 A + | Te 3 4.980169 A 4.980169 A + | Te 3 5.229751 A 5.229751 A + | Te 3 5.294077 A 8.846642 A + | Te 3 5.425112 A 11.159740 A + | Te 3 5.359194 A 15.714946 A + | Te 3 5.425112 A 21.860619 A + | Te 3 5.425112 A 23.813715 A + | Te 3 5.491841 A 25.007146 A + | Te 3 5.491841 A 25.626106 A + | Te 4 2.391605 A 2.391605 A + | Te 4 3.624130 A 48.986058 A + | Te 4 4.196765 A 4.196765 A + | Te 4 4.919657 A 4.919657 A + | Te 4 5.103434 A 5.103434 A + | Te 4 5.229751 A 5.229751 A + | Te 4 5.294077 A 11.863158 A + | Te 4 5.359194 A 20.067707 A + | Te 4 5.425112 A 22.401698 A + | Te 4 5.425112 A 24.106624 A + | Te 4 5.425112 A 25.007146 A + | Te 5 4.300640 A 4.300640 A + | Te 5 5.041425 A 5.041425 A + | Te 5 5.166207 A 5.166207 A + | Te 5 5.294077 A 5.294077 A + | Te 5 5.359194 A 11.863158 A + | Te 5 5.425112 A 19.583002 A + | Te 5 5.425112 A 22.401698 A + | Te 5 5.491841 A 23.813715 A + | Te 5 5.491841 A 25.007146 A + | Te 6 5.229751 A 5.229751 A + | Te 6 5.294077 A 9.875558 A + | Te 6 5.294077 A 19.583002 A + | Te 6 5.425112 A 22.677239 A + | Te 6 5.425112 A 24.106624 A + | Te 7 5.359194 A 21.595000 A + | Te 7 5.425112 A 22.956170 A + | Te 8 5.359194 A 21.595000 A + + | Shrink_full_auxil_basis : there are 321 radial auxiliary wave functions + accepted and 775 rejected. + | Shrink_full_auxil_basis : there are totally 122540 partial auxiliary wave functions. + prodbas_tasks_distribution_pbc not up to date - distributing tasks. + + | Number of product basis functions per thread : 15318 + Parallel distribution of product basis not up to date - distributing tasks. + + | Number of product basis functions per thread : 349 + | Minimal requirement for computer memory : 0.912 Gbs + Minimal free memory per node on init_fm entry [GB]: 24.74 + ----------------------------------------- + --- Initializing Fock matrix calculations + ----------------------------------------- + screening_threshold (crit_val) = 0.000000100000 + coul_mat_threshold = 0.000000000100 + No atoms are split internally + Number of super-cells in X Y Z: 7 7 2 + Number of atoms pairs total: 1056 + Atom pair distribution: + Cell: -4 -2 0 atom pairs: 4 + Cell: -4 -1 0 atom pairs: 4 + Cell: -3 -3 0 atom pairs: 20 + Cell: -3 -2 0 atom pairs: 22 + Cell: -3 -1 0 atom pairs: 22 + Cell: -3 0 0 atom pairs: 18 + Cell: -3 1 0 atom pairs: 4 + Cell: -2 -4 0 atom pairs: 4 + Cell: -2 -3 0 atom pairs: 23 + Cell: -2 -2 0 atom pairs: 30 + Cell: -2 -1 0 atom pairs: 32 + Cell: -2 0 0 atom pairs: 32 + Cell: -2 1 0 atom pairs: 22 + Cell: -2 2 0 atom pairs: 5 + Cell: -1 -4 0 atom pairs: 4 + Cell: -1 -3 0 atom pairs: 22 + Cell: -1 -2 0 atom pairs: 32 + Cell: -1 -1 0 atom pairs: 34 + Cell: -1 0 0 atom pairs: 34 + Cell: -1 1 0 atom pairs: 32 + Cell: -1 2 0 atom pairs: 22 + Cell: -1 3 0 atom pairs: 4 + Cell: 0 -3 0 atom pairs: 18 + Cell: 0 -2 0 atom pairs: 32 + Cell: 0 -1 0 atom pairs: 34 + Cell: 0 0 0 atom pairs: 36 + Cell: 0 1 0 atom pairs: 34 + Cell: 0 2 0 atom pairs: 32 + Cell: 0 3 0 atom pairs: 18 + Cell: 1 -3 0 atom pairs: 4 + Cell: 1 -2 0 atom pairs: 22 + Cell: 1 -1 0 atom pairs: 32 + Cell: 1 0 0 atom pairs: 34 + Cell: 1 1 0 atom pairs: 34 + Cell: 1 2 0 atom pairs: 32 + Cell: 1 3 0 atom pairs: 22 + Cell: 1 4 0 atom pairs: 4 + Cell: 2 -2 0 atom pairs: 5 + Cell: 2 -1 0 atom pairs: 22 + Cell: 2 0 0 atom pairs: 32 + Cell: 2 1 0 atom pairs: 32 + Cell: 2 2 0 atom pairs: 30 + Cell: 2 3 0 atom pairs: 23 + Cell: 2 4 0 atom pairs: 4 + Cell: 3 -1 0 atom pairs: 4 + Cell: 3 0 0 atom pairs: 18 + Cell: 3 1 0 atom pairs: 22 + Cell: 3 2 0 atom pairs: 22 + Cell: 3 3 0 atom pairs: 20 + Cell: 4 1 0 atom pairs: 4 + Cell: 4 2 0 atom pairs: 4 + sparsity of pfbvk: 1.000000 + Number of atoms pairs in BvK cells: 1056 + Max. memory consumption per node for Pulay mixing [GB]: 3.37 + Minimal total memory per node [GB]: 32.46 + Minimal free memory per node [GB]: 21.44 + --- Initializing LVL triples, type HSE + | Storage requirements for basis-basbas products (processor-local): + | Species Mo: n_prodsfn: 2135; storage: 66.72 MiB. + | Species Se: n_prodsfn: 1151; storage: 35.97 MiB. + | Species S: n_prodsfn: 0; storage: 0.00 MiB. + | Species W: n_prodsfn: 3403; storage: 106.34 MiB. + | Species Te: n_prodsfn: 2494; storage: 77.94 MiB. + + --- Initializing Coulomb matrix calculations, type HSE + Preparing TB like auxiliary 2-center HSE-pot matrix + SBT integration errors (all should be 'small'): + large logFT aliasing -> increase N/lnrange + large SBT aliasing -> decrease lnk0 & increase lnk0+lnrange + large SBT ringing -> decrease lnr0 & increase lnr0+lnrange + | El't L: logFT-al. small-k large-k small-r large-r + | Need to store125748 splines of 288 points taking 284904 KiB. + | Spline reduction from 4096 to 288 points by (cutting and) 1 x coarsening gives error: 0.00E+00 + | Maximum value outside interaction range: 6.41E-13 + Finished with initialize_tb_auxmat/lvl_triples, time: 5.894 + --- Calculating Coulomb matrices + Upper limit for memory consumption per node [GB] for Coulomb matrices if no compression occurs: 0.088 + Upper limit for temporary arrays in Coulomb matrix initalization [GB]: 2.40 + Min./max. time for Coulomb matrix computation [s]: 39.48 98.78 + Max. memory consumption per node for global Coulomb matrix [GB]: 1.67 + Time to calculate Coulomb Matrices : 99.057 + Max. memory consumption per node for uncompressed ovlp3fn matrix [GB]: 9.573 + --- Calculating OVLP3FN + --- Done calculating OVLP3FN, time: 331.805 + Max. memory consumption per node for compressed global ovlp3fn matrix [GB]: 3.167 + Atomic logSBT for 2-center HSE-pot matrix : max(cpu_time) wall_clock(cpu1) + | TB initialization : 4.893 s 4.896 s + | TB usage : 48.219 s 48.350 s + + Atomic logSBT for LVL-triples : max(cpu_time) wall_clock(cpu1) + | Multiplication with kernel : 0.733 s 0.711 s + | Main matrix multiplication : 122.133 s 122.371 s + | Analytic angular integration : 0.671 s 0.675 s + | Kernel construction : 0.651 s 0.567 s + | Overall 2-center overlap time : 135.119 s 135.341 s + | 3-center preparation multiplications : 2.250 s 1.548 s + | 3-center preparation SBTs : 29.164 s 20.337 s + | 3-center combinations : 200.376 s 200.757 s + | Overal 3-center time : 222.455 s 222.848 s + | LVL initialization : 0.983 s 0.991 s + | Whole LVL-triples : 0.983 s 0.991 s + + Assumed free memory per node for Fock matrix prefactors [GB] 18.19 + Memory per instance for Coulomb / ovlp matrix [GB] 1.67 3.17 + Number of nodes, tasks per node 1 8 + Number of instances: 1 + ----------------------------------------------------- + Dividing atoms among tasks for exact exchange energy: + Atom: 1 Weight: 0.20135E+09 + Atom: 2 Weight: 0.35722E+09 + Atom: 3 Weight: 0.66925E+08 + Atom: 4 Weight: 0.26265E+09 + Atom: 5 Weight: 0.97677E+08 + Atom: 6 Weight: 0.21083E+09 + + Average weight per task: 0.14958E+09 + + Number of "big" (above average) atoms : 4 + Number of "small" (below average) atoms: 2 + + There are "big" and "small" atoms + Reserving 4 tasks for "big" atoms + Max. weight for big atoms: 0.35722E+09 small atoms: 0.97677E+08 + Trying 5 tasks for "big" atoms: + Max. weight for big atoms: 0.26265E+09 small atoms: 0.97677E+08 + => Atom 2 gets 2 tasks + Trying 6 tasks for "big" atoms: + Max. weight for big atoms: 0.21083E+09 small atoms: 0.97677E+08 + => Atom 4 gets 2 tasks + Trying 7 tasks for "big" atoms: + Max. weight for big atoms: 0.20135E+09 small atoms: 0.16460E+09 + => Atom 6 gets 2 tasks + Using 1 tasks for "small" atoms, 7 for "big" atoms + + Atom division among tasks: + Atom 1: (initial) task: 0, # of tasks: 1 + Atom 2: (initial) task: 1, # of tasks: 2 + Atom 3: (initial) task: 7, # of tasks: 1 + Atom 4: (initial) task: 3, # of tasks: 2 + Atom 5: (initial) task: 7, # of tasks: 1 + Atom 6: (initial) task: 5, # of tasks: 2 + + ----------------------------------------------------- + Task 0: my_n_atoms2: 1 my_atom_list: 1 + Task 1: my_n_atoms2: 1 my_atom_list: 2 + Task 2: my_n_atoms2: 1 my_atom_list: 2 + Task 3: my_n_atoms2: 1 my_atom_list: 4 + Task 4: my_n_atoms2: 1 my_atom_list: 4 + Task 5: my_n_atoms2: 1 my_atom_list: 6 + Task 6: my_n_atoms2: 1 my_atom_list: 6 + Task 7: my_n_atoms2: 2 my_atom_list: 3 5 + Task 0: my_n_atom_pairs: 179 + Task 1: my_n_atom_pairs: 91 + Task 2: my_n_atom_pairs: 90 + Task 3: my_n_atom_pairs: 101 + Task 4: my_n_atom_pairs: 100 + Task 5: my_n_atom_pairs: 74 + Task 6: my_n_atom_pairs: 74 + Task 7: my_n_atom_pairs: 347 + Transferring Coulomb matrix to final data layout + Coulomb matrix communicaton time [s] 0.39 + Max. memory per node for ovlp3fn matrices: 3.166 GB + Total memory for ovlp3fn matrices: 3.166 GB + --- Done getting norm of OVLP3FN, time: 0.002 + Sparsity of ovlp3fn matrix 888 1056 + --- time for get_ovlp3fn: 0.864 + Max. memory consumption per node for Hartree Fock matrix [GB] 3.37 + Blocksize for Fock matrix computation: 4 + Minimal free memory per node after Fock matrix initialization [GB]: 14.52 + Initialize hartree_potential_storage + Max. number of atoms included in rho_multipole: 6 + + End scf initialization - timings : max(cpu_time) wall_clock(cpu1) + | Time for scf. initialization : 453.633 s 454.344 s + | Boundary condition initialization : 6.282 s 6.282 s + | Integration : 11.529 s 11.535 s + | Grid partitioning : 0.366 s 0.364 s + | Preloading free-atom quantities on grid : 1.118 s 1.120 s + | Free-atom superposition energy : 0.195 s 0.195 s + | Product basis setup: Total time : 440.429 s 441.123 s + + Partial memory accounting: + | Current value for overall tracked memory usage: + | Minimum: 328.025 MB (on task 6) + | Maximum: 572.099 MB (on task 0) + | Average: 440.775 MB + | Peak value for overall tracked memory usage: + | Minimum: 1023.924 MB (on task 7 after allocating ovlp3fn2) + | Maximum: 2253.341 MB (on task 6 after allocating ovlp3fn_nosplit%m) + | Average: 1684.765 MB + | Largest tracked array allocation so far: + | Minimum: 510.595 MB (ovlp3fn_nosplit%dat on task 7) + | Maximum: 1608.479 MB (ovlp3fn_nosplit%dat on task 6) + | Average: 1141.214 MB + Note: These values currently only include a subset of arrays which are explicitly tracked. + The "true" memory usage will be greater. +------------------------------------------------------------ + Evaluating new KS density using the density matrix + Evaluating density matrix + Finished reading density matrices from file + | Time : 0.190 s + + Time summed over all CPUs for getting density from density matrix: real work 101.938 s, elapsed 121.445 s + Integration grid: deviation in total charge ( - N_e) = -9.271162E-11 + + Time for density update prior : max(cpu_time) wall_clock(cpu1) + | self-consistency iterative process : 15.684 s 15.686 s + +------------------------------------------------------------ + Initial SCF-cycle to compute last known + density from restart information. + + Date : 20230117, Time : 115342.034 +------------------------------------------------------------ + Renormalizing the density to the exact electron count on the 3D integration grid. + | Formal number of electrons (from input files) : 288.0000000000 + | Integrated number of electrons on 3D grid : 287.9999999999 + | Charge integration error : -0.0000000001 + | Normalization factor for density and gradient : 1.0000000000 + + Evaluating partitioned Hartree potential by multipole expansion. + | Original multipole sum: apparent total charge = 0.186220E-12 + | Sum of charges compensated after spline to logarithmic grids = 0.612508E-07 + | Analytical far-field extrapolation by fixed multipoles: + | Hartree multipole sum: apparent total charge = 0.186399E-12 + Summing up the Hartree potential. + Calculating dipole correction via potential gradient + | Dipole correction gradient : 0.05025020 eV/Angstrom + | Dipole correction potential jump : -1.54231010 eV + Time summed over all CPUs for potential: real work 27.293 s, elapsed 33.668 s + | RMS charge density error from multipole expansion : 0.600004E-02 + | Average real-space part of the electrostatic potential : -0.01380736 eV + + Integrating Hamiltonian matrix: batch-based integration. + Time summed over all CPUs for integration: real work 52.642 s, elapsed 61.632 s + Max. memory consumption per node for dm_cols [GB]: 0.65 + Max. memory consumption per node for fock_matrix [GB]: 0.40 + Finished reading density matrices from file + | Time : 0.246 s + + Calculating non-local Hartree-Fock exchange by two-center RI (RI-LVL). + screening_threshold (crit_val) = 0.000000100000 + Max. allocated memory per node for ovlp3fn_rcv [GB]: 0.28 + Max. allocated memory per node for fock_matrix_row [GB]: 0.05 + Max. memory consumption per node for m_ovlp_fact11 [GB]: 0.01 + Max. memory consumption per node for d_aux_mem [GB]: 0.01 + Max. memory consumption per node for dm_x_o3fn_aux [GB]: 0.08 + Max. allocated memory per node for tmp1/tmp2 [GB]: 9.09 + final impselect vector 2 3 6 1 + Time for autotuning: 30.1495707824506 + Exact exchange progress report - outermost block loop i_block: 1 .. 72 + | 1 2 3 4 5 6 7 8 9 10 + | 11 12 13 14 15 16 17 18 19 20 + | 21 22 23 24 25 26 27 28 29 30 + | 31 32 33 34 35 36 37 38 39 40 + | 41 42 43 44 45 46 47 48 49 50 + | 51 52 53 54 55 56 57 58 59 60 + | 61 62 63 64 65 66 67 68 69 70 + | 71 72 + Total ovlp3fn data transfer [GB] 5.36701221391559 + Full exact exchange energy: 25852.056449109368 eV. + Detailed communication and barrier times: + | Comm 0: 0.001 0.000 0.000 0.000 0.065 0.001 0.001 0.000 0.000 0.000 + | Comm 1: 0.001 0.000 0.000 5.944 0.065 0.001 0.001 0.000 0.000 6.386 + | Comm 2: 0.001 0.000 0.000 5.943 0.065 0.001 0.001 0.000 0.000 6.385 + | Comm 3: 0.001 0.000 0.000 3.487 0.064 0.001 0.001 0.000 0.000 4.453 + | Comm 4: 0.001 0.000 0.000 3.487 0.065 0.001 0.001 0.000 0.000 4.453 + | Comm 5: 0.001 0.000 0.000 2.748 0.064 0.001 0.001 0.000 0.000 4.799 + | Comm 6: 0.001 0.000 0.000 2.747 0.065 0.001 0.001 0.000 0.000 4.799 + | Comm 7: 0.001 0.000 0.000 0.000 0.064 0.001 0.001 0.000 0.000 0.000 + | Imbalance 0: 0.037 0.000 0.000 0.000 3.147 0.000 0.110 0.000 0.000 0.000 + | Imbalance 1: 0.013 0.000 0.000 0.002 51.284 0.000 0.140 0.000 0.000 15.513 + | Imbalance 2: 0.126 0.000 0.002 6.793 69.483 0.000 0.161 0.000 0.000 0.777 + | Imbalance 3: 0.044 0.000 0.000 0.012 117.552 0.000 0.232 0.000 0.000 0.001 + | Imbalance 4: 0.137 0.000 0.002 28.702 143.929 0.000 0.381 0.000 0.000 66.123 + | Imbalance 5: 0.070 0.000 0.001 0.163 292.944 0.000 0.450 0.000 0.000 14.675 + | Imbalance 6: 0.136 0.000 0.002 3.198 295.215 0.000 0.460 0.000 0.000 2.284 + | Imbalance 7: 0.058 0.000 0.000 0.000 114.433 0.000 0.275 0.000 0.000 0.000 + Times DM_x_o3fn CM_prod_1 CM_prod_2 tmp2_prod Sync Imbalance Other Total calc + | Times 0: 145.095 291.629 55.284 62.023 0.069 3.295 5.922 563.316 + | Times 1: 123.739 218.144 47.895 85.743 12.398 66.951 8.457 563.326 + | Times 2: 116.945 229.543 51.199 67.625 12.397 77.342 8.267 563.318 + | Times 3: 102.119 202.735 37.751 87.533 8.009 117.842 7.331 563.319 + | Times 4: 73.465 146.007 28.535 61.636 8.008 239.274 6.385 563.309 + | Times 5: 49.982 109.843 25.517 55.337 7.615 308.302 6.720 563.315 + | Times 6: 46.948 121.872 25.887 52.974 7.614 301.296 6.720 563.310 + | Times 7: 77.541 237.342 61.160 66.853 0.068 114.766 5.587 563.318 + | Times sum: 735.833 1557.114 333.228 539.724 56.176 1229.067 55.389 4506.532 + + Decomposition of Other based on code block (only on MPI task 0): + Times Block #1 Block #2 Block #3 Block #4 Block #5 Block #6 Block #7 Block #8 + | Times 0: 1.326 0.000 0.068 0.020 0.058 0.011 0.856 0.001 + + Times Block #9 Block #10 Block #11 Block #12 Block #13 Block #14 Block #15 Block #16 + | Times 0: 0.084 0.000 0.996 0.320 0.000 0.735 0.056 0.017 + + Times Block Sum Expected + | Times 0: 4.547 5.922 + Time for Fock matrix mixing 0.666982541664765 + + Updating Kohn-Sham eigenvalues and eigenvectors using ELSI and the (modified) LAPACK eigensolver. + Singularity check in k-point 8, task 0 (analysis for other k-points/tasks may follow below): + Overlap matrix is not singular + | Lowest and highest eigenvalues : 0.6366E-03, 0.6411E+01 + Finished singularity check of overlap matrix + | Time : 0.021 s + Starting LAPACK eigensolver + Finished Cholesky decomposition + | Time : 0.004 s + Finished transformation to standard eigenproblem + | Time : 0.012 s + Finished solving standard eigenproblem + | Time : 0.035 s + Finished back-transformation of eigenvectors + | Time : 0.007 s + + Obtaining occupation numbers and electronic chemical potential using ELSI. + | Note that, for insulating systems, the printed 'chemical potential' value is not uniquely defined. + | It can be anywhere in the energy gap, as long as it correctly separates occupied and unoccupied states. + | In systems with a gap, the physically relevant chemical potential is the VBM or HOMO. + + | Chemical potential (Fermi level): -5.47044126 eV + Writing Kohn-Sham eigenvalues. + K-point: 1 at 0.000000 0.000000 0.000000 (in units of recip. lattice) + + State Occupation Eigenvalue [Ha] Eigenvalue [eV] + 1 2.00000 -2770.799162 -75397.28137 + 2 2.00000 -1208.925945 -32896.54871 + 3 2.00000 -1208.904417 -32895.96291 + 4 2.00000 -748.317796 -20362.76327 + 5 2.00000 -468.574206 -12750.55288 + 6 2.00000 -468.549656 -12749.88485 + 7 2.00000 -450.152254 -12249.26606 + 8 2.00000 -392.953648 -10692.81279 + 9 2.00000 -392.953572 -10692.81073 + 10 2.00000 -392.953571 -10692.81072 + 11 2.00000 -180.899554 -4922.52731 + 12 2.00000 -180.878029 -4921.94160 + 13 2.00000 -162.224116 -4414.34280 + 14 2.00000 -162.224116 -4414.34279 + 15 2.00000 -162.223747 -4414.33277 + 16 2.00000 -162.202604 -4413.75743 + 17 2.00000 -162.202604 -4413.75742 + 18 2.00000 -162.202179 -4413.74586 + 19 2.00000 -104.483003 -2843.12717 + 20 2.00000 -103.056110 -2804.29944 + 21 2.00000 -93.314642 -2539.22061 + 22 2.00000 -93.314273 -2539.21056 + 23 2.00000 -93.314272 -2539.21054 + 24 2.00000 -86.365207 -2350.11687 + 25 2.00000 -86.364768 -2350.10490 + 26 2.00000 -86.364767 -2350.10488 + 27 2.00000 -67.252389 -1830.03060 + 28 2.00000 -67.252344 -1830.02940 + 29 2.00000 -67.252344 -1830.02939 + 30 2.00000 -67.252043 -1830.02121 + 31 2.00000 -67.252043 -1830.02121 + 32 2.00000 -60.013742 -1633.05702 + 33 2.00000 -59.988790 -1632.37803 + 34 2.00000 -52.716749 -1434.49572 + 35 2.00000 -52.716748 -1434.49570 + 36 2.00000 -52.716228 -1434.48154 + 37 2.00000 -52.691895 -1433.81941 + 38 2.00000 -52.691894 -1433.81940 + 39 2.00000 -52.691231 -1433.80135 + 40 2.00000 -36.207786 -985.26399 + 41 2.00000 -36.186282 -984.67883 + 42 2.00000 -30.148240 -820.37534 + 43 2.00000 -30.148238 -820.37531 + 44 2.00000 -30.146909 -820.33914 + 45 2.00000 -30.126756 -819.79074 + 46 2.00000 -30.126755 -819.79070 + 47 2.00000 -30.125324 -819.75176 + 48 2.00000 -21.519105 -585.56463 + 49 2.00000 -21.017734 -571.92163 + 50 2.00000 -21.017734 -571.92163 + 51 2.00000 -21.016820 -571.89677 + 52 2.00000 -21.016819 -571.89675 + 53 2.00000 -21.016503 -571.88816 + 54 2.00000 -20.996270 -571.33757 + 55 2.00000 -20.996270 -571.33757 + 56 2.00000 -20.995267 -571.31028 + 57 2.00000 -20.995266 -571.31026 + 58 2.00000 -20.994922 -571.30088 + 59 2.00000 -18.107436 -492.72842 + 60 2.00000 -16.054225 -436.85770 + 61 2.00000 -16.053885 -436.84845 + 62 2.00000 -16.053884 -436.84841 + 63 2.00000 -14.438786 -392.89936 + 64 2.00000 -14.437462 -392.86334 + 65 2.00000 -14.437461 -392.86330 + 66 2.00000 -9.121623 -248.21200 + 67 2.00000 -9.121622 -248.21196 + 68 2.00000 -9.121474 -248.20793 + 69 2.00000 -9.121317 -248.20366 + 70 2.00000 -9.121316 -248.20364 + 71 2.00000 -8.480759 -230.77318 + 72 2.00000 -8.480492 -230.76592 + 73 2.00000 -8.480491 -230.76589 + 74 2.00000 -8.479620 -230.74219 + 75 2.00000 -8.479619 -230.74219 + 76 2.00000 -8.189863 -222.85750 + 77 2.00000 -8.164336 -222.16288 + 78 2.00000 -6.332017 -172.30296 + 79 2.00000 -6.310220 -171.70982 + 80 2.00000 -5.893688 -160.37540 + 81 2.00000 -5.893686 -160.37537 + 82 2.00000 -5.892006 -160.32964 + 83 2.00000 -5.868295 -159.68444 + 84 2.00000 -5.868294 -159.68440 + 85 2.00000 -5.866120 -159.62526 + 86 2.00000 -4.438079 -120.76626 + 87 2.00000 -4.438077 -120.76623 + 88 2.00000 -4.435088 -120.68488 + 89 2.00000 -4.416313 -120.17399 + 90 2.00000 -4.416311 -120.17393 + 91 2.00000 -4.413018 -120.08434 + 92 2.00000 -3.077538 -83.74408 + 93 2.00000 -2.583476 -70.29995 + 94 2.00000 -2.106838 -57.32998 + 95 2.00000 -2.106837 -57.32996 + 96 2.00000 -2.105552 -57.29499 + 97 2.00000 -2.105551 -57.29497 + 98 2.00000 -2.104969 -57.27912 + 99 2.00000 -2.081500 -56.64049 + 100 2.00000 -2.081500 -56.64049 + 101 2.00000 -2.079802 -56.59430 + 102 2.00000 -2.079802 -56.59428 + 103 2.00000 -2.079095 -56.57504 + 104 2.00000 -1.713071 -46.61502 + 105 2.00000 -1.708467 -46.48976 + 106 2.00000 -1.708463 -46.48963 + 107 2.00000 -1.661305 -45.20642 + 108 2.00000 -1.661305 -45.20641 + 109 2.00000 -1.658219 -45.12244 + 110 2.00000 -1.658218 -45.12241 + 111 2.00000 -1.658110 -45.11947 + 112 2.00000 -1.639913 -44.62430 + 113 2.00000 -1.639911 -44.62426 + 114 2.00000 -1.636620 -44.53468 + 115 2.00000 -1.636618 -44.53464 + 116 2.00000 -1.635884 -44.51467 + 117 2.00000 -1.580956 -43.02000 + 118 2.00000 -1.573484 -42.81667 + 119 2.00000 -1.573479 -42.81655 + 120 2.00000 -1.416102 -38.53410 + 121 2.00000 -1.416100 -38.53403 + 122 2.00000 -1.415925 -38.52929 + 123 2.00000 -1.415760 -38.52479 + 124 2.00000 -1.415759 -38.52476 + 125 2.00000 -1.415595 -38.52031 + 126 2.00000 -1.415507 -38.51791 + 127 2.00000 -0.792882 -21.57542 + 128 2.00000 -0.753752 -20.51064 + 129 2.00000 -0.731594 -19.90767 + 130 2.00000 -0.702802 -19.12422 + 131 2.00000 -0.465496 -12.66680 + 132 2.00000 -0.417163 -11.35159 + 133 2.00000 -0.323163 -8.79371 + 134 2.00000 -0.313523 -8.53141 + 135 2.00000 -0.313513 -8.53113 + 136 2.00000 -0.286934 -7.80788 + 137 2.00000 -0.286905 -7.80708 + 138 2.00000 -0.285815 -7.77743 + 139 2.00000 -0.255097 -6.94154 + 140 2.00000 -0.255069 -6.94078 + 141 2.00000 -0.235879 -6.41859 + 142 2.00000 -0.235859 -6.41806 + 143 2.00000 -0.227812 -6.19908 + 144 2.00000 -0.208954 -5.68592 + 145 0.00000 -0.091704 -2.49540 + 146 0.00000 -0.091661 -2.49422 + 147 0.00000 -0.073756 -2.00701 + 148 0.00000 -0.073724 -2.00612 + 149 0.00000 -0.061601 -1.67624 + 150 0.00000 -0.061587 -1.67586 + 151 0.00000 -0.042227 -1.14904 + 152 0.00000 -0.042184 -1.14788 + 153 0.00000 -0.023194 -0.63113 + 154 0.00000 0.033953 0.92390 + 155 0.00000 0.055918 1.52160 + 156 0.00000 0.098727 2.68650 + 157 0.00000 0.115980 3.15598 + 158 0.00000 0.133702 3.63821 + 159 0.00000 0.166512 4.53102 + 160 0.00000 0.187918 5.11352 + 161 0.00000 0.187939 5.11409 + 162 0.00000 0.216042 5.87880 + 163 0.00000 0.216078 5.87979 + 164 0.00000 0.222786 6.06230 + 165 0.00000 0.257857 7.01665 + 166 0.00000 0.280386 7.62968 + 167 0.00000 0.283652 7.71856 + 168 0.00000 0.283734 7.72080 + 169 0.00000 0.296767 8.07545 + 170 0.00000 0.309888 8.43248 + 171 0.00000 0.309977 8.43491 + 172 0.00000 0.332525 9.04846 + 173 0.00000 0.378639 10.30330 + 174 0.00000 0.409783 11.15076 + 175 0.00000 0.410098 11.15933 + 176 0.00000 0.434510 11.82361 + 177 0.00000 0.434922 11.83482 + 178 0.00000 0.448384 12.20115 + 179 0.00000 0.449030 12.21872 + 180 0.00000 0.455912 12.40600 + 181 0.00000 0.458783 12.48413 + 182 0.00000 0.459232 12.49635 + 183 0.00000 0.491817 13.38302 + 184 0.00000 0.515851 14.03701 + 185 0.00000 0.537855 14.63579 + 186 0.00000 0.538216 14.64559 + 187 0.00000 0.550392 14.97694 + 188 0.00000 0.550797 14.98794 + 189 0.00000 0.553197 15.05325 + 190 0.00000 0.607385 16.52777 + 191 0.00000 0.645174 17.55607 + 192 0.00000 0.654001 17.79627 + 193 0.00000 0.654250 17.80306 + 194 0.00000 0.676597 18.41114 + 195 0.00000 0.677555 18.43720 + 196 0.00000 0.704750 19.17723 + 197 0.00000 0.755949 20.57043 + 198 0.00000 0.756877 20.59568 + 199 0.00000 0.766119 20.84717 + 200 0.00000 0.767013 20.87149 + 201 0.00000 0.789229 21.47602 + 202 0.00000 0.812771 22.11662 + 203 0.00000 0.857620 23.33702 + 204 0.00000 0.858321 23.35609 + 205 0.00000 0.881456 23.98564 + 206 0.00000 0.886545 24.12411 + 207 0.00000 0.888357 24.17341 + 208 0.00000 0.909208 24.74080 + 209 0.00000 1.010399 27.49436 + 210 0.00000 1.023135 27.84092 + 211 0.00000 1.036122 28.19431 + 212 0.00000 1.037229 28.22444 + 213 0.00000 1.042509 28.36810 + 214 0.00000 1.042856 28.37757 + 215 0.00000 1.054057 28.68236 + 216 0.00000 1.067153 29.03871 + 217 0.00000 1.131717 30.79557 + 218 0.00000 1.133661 30.84849 + 219 0.00000 1.140985 31.04779 + 220 0.00000 1.155431 31.44087 + 221 0.00000 1.157712 31.50296 + 222 0.00000 1.163355 31.65650 + 223 0.00000 1.173224 31.92505 + 224 0.00000 1.232420 33.53586 + 225 0.00000 1.260623 34.30329 + 226 0.00000 1.301633 35.41923 + 227 0.00000 1.302365 35.43915 + 228 0.00000 1.328493 36.15015 + 229 0.00000 1.329310 36.17238 + 230 0.00000 1.354679 36.86270 + 231 0.00000 1.377424 37.48161 + 232 0.00000 1.377522 37.48427 + 233 0.00000 1.404312 38.21328 + 234 0.00000 1.408885 38.33770 + 235 0.00000 1.408964 38.33986 + 236 0.00000 1.413167 38.45424 + 237 0.00000 1.420398 38.65099 + 238 0.00000 1.455752 39.61304 + 239 0.00000 1.456628 39.63686 + 240 0.00000 1.464465 39.85011 + 241 0.00000 1.465304 39.87296 + 242 0.00000 1.472399 40.06600 + 243 0.00000 1.513797 41.19250 + 244 0.00000 1.514869 41.22169 + 245 0.00000 1.515499 41.23882 + 246 0.00000 1.531215 41.66648 + 247 0.00000 1.531438 41.67255 + 248 0.00000 1.608326 43.76477 + 249 0.00000 1.608578 43.77162 + 250 0.00000 1.669809 45.43782 + 251 0.00000 1.670986 45.46984 + 252 0.00000 1.730939 47.10124 + 253 0.00000 1.749437 47.60460 + 254 0.00000 1.749786 47.61409 + 255 0.00000 1.766432 48.06705 + 256 0.00000 1.776230 48.33367 + 257 0.00000 1.777104 48.35745 + 258 0.00000 1.784557 48.56026 + 259 0.00000 1.806022 49.14437 + 260 0.00000 1.806822 49.16612 + 261 0.00000 1.807110 49.17398 + 262 0.00000 1.874770 51.01508 + 263 0.00000 1.875379 51.03166 + 264 0.00000 1.910035 51.97469 + 265 0.00000 2.125686 57.84285 + 266 0.00000 2.125798 57.84591 + 267 0.00000 2.142441 58.29878 + 268 0.00000 2.142696 58.30573 + 269 0.00000 2.172804 59.12500 + 270 0.00000 2.220333 60.41834 + 271 0.00000 2.220417 60.42062 + 272 0.00000 2.261528 61.53932 + 273 0.00000 2.265240 61.64031 + 274 0.00000 2.265445 61.64591 + 275 0.00000 2.276948 61.95889 + 276 0.00000 2.277093 61.96285 + 277 0.00000 2.332164 63.46141 + 278 0.00000 2.339426 63.65903 + 279 0.00000 2.339834 63.67012 + 280 0.00000 2.365138 64.35867 + 281 0.00000 2.398546 65.26777 + 282 0.00000 2.440476 66.40872 + 283 0.00000 2.440749 66.41616 + 284 0.00000 2.464848 67.07192 + 285 0.00000 2.465055 67.07757 + 286 0.00000 2.472210 67.27226 + + What follows are estimated values for band gap, HOMO, LUMO, etc. + | They are estimated on a discrete k-point grid and not necessarily exact. + | For converged numbers, create a DOS and/or band structure plot on a denser k-grid. + + Highest occupied state (VBM) at -5.51016545 eV (relative to internal zero) + | Occupation number: 1.99999998 + | K-point: 152 at 0.320000 0.360000 0.000000 (in units of recip. lattice) + + Lowest unoccupied state (CBM) at -4.12786925 eV (relative to internal zero) + | Occupation number: 0.00000000 + | K-point: 82 at 0.160000 0.640000 0.000000 (in units of recip. lattice) + + ESTIMATED overall HOMO-LUMO gap: 1.38229621 eV between HOMO at k-point 152 and LUMO at k-point 82 + | This appears to be an indirect band gap. + | Smallest direct gap : 1.43545018 eV for k_point 152 at 0.320000 0.360000 0.000000 (in units of recip. lattice) + The gap value is above 0.2 eV. Unless you are using a very sparse k-point grid, + this system is most likely an insulator or a semiconductor. + + Writing energy levels: + | Potential vacuum level, "upper" slab surface: -1.12401807 eV + | Potential vacuum level, "lower" slab surface: 0.41829203 eV + | Work function ("upper" slab surface) : 4.34642319 eV + | Work function ("lower" slab surface) : 5.88873329 eV + *** Warning: band gap may exist, check the suitability to define work function using chemical potential. + | VBM (reference: upper vacuum level) : 4.38614739 eV + | CBM (reference: upper vacuum level) : 3.00385118 eV + + Total energy components: + | Sum of eigenvalues : -24401.22749183 Ha -663991.18355223 eV + | XC energy correction : -506.82228793 Ha -13791.33614996 eV + | XC potential correction : 968.45897369 Ha 26353.10950562 eV + | Free-atom electrostatic energy: -15462.20469666 Ha -420747.99721842 eV + | Hartree energy correction : -1.49487525 Ha -40.67762524 eV + | vdW energy correction : 0.00000000 Ha 0.00000000 eV + | Entropy correction : -0.00000000 Ha -0.00000000 eV + | --------------------------- + | Total energy : -39403.29037797 Ha -1072218.08504023 eV + | Total energy, T -> 0 : -39403.29037797 Ha -1072218.08504023 eV <-- do not rely on this value for anything but (periodic) metals + | Electronic free energy : -39403.29037797 Ha -1072218.08504023 eV + + Derived energy quantities: + | Kinetic energy : 42031.89370222 Ha 1143746.02079416 eV + | Electrostatic energy : -80453.33898462 Ha -2189246.74141939 eV + | Energy correction for multipole + | error in Hartree potential : -0.00057050 Ha -0.01552423 eV + | Sum of eigenvalues per atom : -110665.19725871 eV + | Total energy (T->0) per atom : -178703.01417337 eV <-- do not rely on this value for anything but (periodic) metals + | Electronic free energy per atom : -178703.01417337 eV + Evaluating new KS density using the density matrix + Evaluating density matrix + Time summed over all CPUs for getting density from density matrix: real work 97.245 s, elapsed 116.199 s + Integration grid: deviation in total charge ( - N_e) = -1.824674E-10 + + Self-consistency convergence accuracy: + | Change of charge density : 0.1604E+00 + | Change of unmixed KS density : 0.5943E+03 + | Change of sum of eigenvalues : -0.6640E+06 eV + | Change of total energy : -0.1072E+07 eV + + +------------------------------------------------------------ + End self-consistency iteration # 0 : max(cpu_time) wall_clock(cpu1) + | Time for this iteration : 626.752 s 627.121 s + | Charge density update : 15.214 s 15.216 s + | Density mixing : 0.002 s 0.002 s + | Hartree multipole update : 0.007 s 0.007 s + | Hartree multipole summation : 4.234 s 4.235 s + | Integration : 7.718 s 7.719 s + | Fock matrix evaluation : 593.754 s 594.142 s + | Solution of K.-S. eqns. : 5.789 s 5.790 s + | Total energy evaluation : 0.006 s 0.004 s + + Partial memory accounting: + | Current value for overall tracked memory usage: + | Minimum: 328.025 MB (on task 6) + | Maximum: 572.099 MB (on task 0) + | Average: 440.775 MB + | Peak value for overall tracked memory usage: + | Minimum: 1023.924 MB (on task 7 after allocating ovlp3fn2) + | Maximum: 2253.341 MB (on task 6 after allocating ovlp3fn_nosplit%m) + | Average: 1684.765 MB + | Largest tracked array allocation so far: + | Minimum: 510.595 MB (ovlp3fn_nosplit%dat on task 7) + | Maximum: 1608.479 MB (ovlp3fn_nosplit%dat on task 6) + | Average: 1141.214 MB + Note: These values currently only include a subset of arrays which are explicitly tracked. + The "true" memory usage will be greater. +------------------------------------------------------------ + +------------------------------------------------------------ + Begin self-consistency iteration # 1 + + Date : 20230117, Time : 120409.155 +------------------------------------------------------------ + Linear mixing of updated and previous charge densities. + Renormalizing the density to the exact electron count on the 3D integration grid. + | Formal number of electrons (from input files) : 288.0000000000 + | Integrated number of electrons on 3D grid : 288.0000000000 + | Charge integration error : -0.0000000000 + | Normalization factor for density and gradient : 1.0000000000 + + Evaluating partitioned Hartree potential by multipole expansion. + | Original multipole sum: apparent total charge = -0.329431E-12 + | Sum of charges compensated after spline to logarithmic grids = 0.612511E-07 + | Analytical far-field extrapolation by fixed multipoles: + | Hartree multipole sum: apparent total charge = -0.329324E-12 + Summing up the Hartree potential. + Calculating dipole correction via potential gradient + | Dipole correction gradient : 0.05024983 eV/Angstrom + | Dipole correction potential jump : -1.54229885 eV + Time summed over all CPUs for potential: real work 25.718 s, elapsed 33.033 s + | RMS charge density error from multipole expansion : 0.600004E-02 + | Average real-space part of the electrostatic potential : -0.01380728 eV + + Integrating Hamiltonian matrix: batch-based integration. + Time summed over all CPUs for integration: real work 46.900 s, elapsed 53.880 s + Calculating non-local Hartree-Fock exchange by two-center RI (RI-LVL). + screening_threshold (crit_val) = 0.000000100000 + Exact exchange progress report - outermost block loop i_block: 1 .. 72 + | 1 2 3 4 5 6 7 8 9 10 + | 11 12 13 14 15 16 17 18 19 20 + | 21 22 23 24 25 26 27 28 29 30 + | 31 32 33 34 35 36 37 38 39 40 + | 41 42 43 44 45 46 47 48 49 50 + | 51 52 53 54 55 56 57 58 59 60 + | 61 62 63 64 65 66 67 68 69 70 + | 71 72 + Total ovlp3fn data transfer [GB] 5.14889938756824 + Full exact exchange energy: 25852.056611034077 eV. + Times DM_x_o3fn CM_prod_1 CM_prod_2 tmp2_prod Sync Imbalance Other Total calc + | Times 0: 142.791 -9525.904 52.602 60.580 0.084 3.493 5.483 -9260.872 + | Times 1: 120.720 -9594.887 44.160 83.129 11.848 66.098 8.039 -9260.892 + | Times 2: 113.892 -9583.487 47.046 65.372 11.837 76.607 7.845 -9260.887 + | Times 3: 99.723 191.963 -9765.921 84.416 7.702 114.420 6.826 -9260.871 + | Times 4: 73.517 139.920 27.062 59.153 7.708 -9574.267 6.013 -9260.893 + | Times 5: 47.040 105.542 24.560 54.929 7.529 -9506.783 6.287 -9260.897 + | Times 6: 46.080 115.958 24.388 52.501 7.528 -9513.668 6.297 -9260.915 + | Times 7: 76.517 -9572.553 58.088 65.208 0.096 106.567 5.190 -9260.887 + | Times sum: 720.282 -37723.448 -9488.014 525.288 54.331 -28227.533 51.980 -74087.114 + + Decomposition of Other based on code block (only on MPI task 0): + Times Block #1 Block #2 Block #3 Block #4 Block #5 Block #6 Block #7 Block #8 + | Times 0: 1.251 0.000 0.064 0.014 0.045 0.009 0.828 0.001 + + Times Block #9 Block #10 Block #11 Block #12 Block #13 Block #14 Block #15 Block #16 + | Times 0: 0.083 0.000 0.998 0.239 0.000 0.506 0.055 0.017 + + Times Block Sum Expected + | Times 0: 4.111 5.483 + Time for Fock matrix mixing 0.670616115200584 + + Updating Kohn-Sham eigenvalues and eigenvectors using ELSI and the (modified) LAPACK eigensolver. + Starting LAPACK eigensolver + Finished Cholesky decomposition + | Time : 0.005 s + Finished transformation to standard eigenproblem + | Time : 0.012 s + Finished solving standard eigenproblem + | Time : 0.034 s + Finished back-transformation of eigenvectors + | Time : 0.004 s + + Obtaining occupation numbers and electronic chemical potential using ELSI. + | Note that, for insulating systems, the printed 'chemical potential' value is not uniquely defined. + | It can be anywhere in the energy gap, as long as it correctly separates occupied and unoccupied states. + | In systems with a gap, the physically relevant chemical potential is the VBM or HOMO. + + | Chemical potential (Fermi level): -5.47044376 eV + Writing Kohn-Sham eigenvalues. + K-point: 1 at 0.000000 0.000000 0.000000 (in units of recip. lattice) + + State Occupation Eigenvalue [Ha] Eigenvalue [eV] + 1 2.00000 -2770.799161 -75397.28135 + 2 2.00000 -1208.925944 -32896.54870 + 3 2.00000 -1208.904417 -32895.96291 + 4 2.00000 -748.317796 -20362.76327 + 5 2.00000 -468.574206 -12750.55288 + 6 2.00000 -468.549656 -12749.88485 + 7 2.00000 -450.152253 -12249.26603 + 8 2.00000 -392.953647 -10692.81277 + 9 2.00000 -392.953571 -10692.81070 + 10 2.00000 -392.953571 -10692.81070 + 11 2.00000 -180.899553 -4922.52730 + 12 2.00000 -180.878029 -4921.94160 + 13 2.00000 -162.224116 -4414.34279 + 14 2.00000 -162.224115 -4414.34278 + 15 2.00000 -162.223747 -4414.33276 + 16 2.00000 -162.202604 -4413.75743 + 17 2.00000 -162.202604 -4413.75742 + 18 2.00000 -162.202179 -4413.74586 + 19 2.00000 -104.483003 -2843.12716 + 20 2.00000 -103.056109 -2804.29942 + 21 2.00000 -93.314642 -2539.22061 + 22 2.00000 -93.314273 -2539.21055 + 23 2.00000 -93.314272 -2539.21054 + 24 2.00000 -86.365207 -2350.11684 + 25 2.00000 -86.364767 -2350.10488 + 26 2.00000 -86.364766 -2350.10486 + 27 2.00000 -67.252388 -1830.03058 + 28 2.00000 -67.252344 -1830.02938 + 29 2.00000 -67.252343 -1830.02937 + 30 2.00000 -67.252042 -1830.02119 + 31 2.00000 -67.252042 -1830.02118 + 32 2.00000 -60.013742 -1633.05701 + 33 2.00000 -59.988790 -1632.37804 + 34 2.00000 -52.716749 -1434.49572 + 35 2.00000 -52.716748 -1434.49570 + 36 2.00000 -52.716227 -1434.48153 + 37 2.00000 -52.691895 -1433.81942 + 38 2.00000 -52.691895 -1433.81941 + 39 2.00000 -52.691232 -1433.80136 + 40 2.00000 -36.207786 -985.26398 + 41 2.00000 -36.186282 -984.67883 + 42 2.00000 -30.148239 -820.37533 + 43 2.00000 -30.148238 -820.37530 + 44 2.00000 -30.146909 -820.33913 + 45 2.00000 -30.126756 -819.79074 + 46 2.00000 -30.126755 -819.79071 + 47 2.00000 -30.125324 -819.75177 + 48 2.00000 -21.519104 -585.56461 + 49 2.00000 -21.017733 -571.92162 + 50 2.00000 -21.017733 -571.92162 + 51 2.00000 -21.016820 -571.89676 + 52 2.00000 -21.016819 -571.89674 + 53 2.00000 -21.016503 -571.88815 + 54 2.00000 -20.996270 -571.33757 + 55 2.00000 -20.996270 -571.33757 + 56 2.00000 -20.995267 -571.31028 + 57 2.00000 -20.995266 -571.31026 + 58 2.00000 -20.994922 -571.30089 + 59 2.00000 -18.107436 -492.72841 + 60 2.00000 -16.054225 -436.85768 + 61 2.00000 -16.053885 -436.84843 + 62 2.00000 -16.053883 -436.84839 + 63 2.00000 -14.438786 -392.89936 + 64 2.00000 -14.437462 -392.86334 + 65 2.00000 -14.437461 -392.86330 + 66 2.00000 -9.121623 -248.21198 + 67 2.00000 -9.121621 -248.21194 + 68 2.00000 -9.121473 -248.20790 + 69 2.00000 -9.121316 -248.20364 + 70 2.00000 -9.121315 -248.20361 + 71 2.00000 -8.480759 -230.77318 + 72 2.00000 -8.480491 -230.76591 + 73 2.00000 -8.480491 -230.76589 + 74 2.00000 -8.479619 -230.74218 + 75 2.00000 -8.479619 -230.74218 + 76 2.00000 -8.189863 -222.85750 + 77 2.00000 -8.164336 -222.16289 + 78 2.00000 -6.332017 -172.30295 + 79 2.00000 -6.310220 -171.70982 + 80 2.00000 -5.893687 -160.37540 + 81 2.00000 -5.893686 -160.37536 + 82 2.00000 -5.892006 -160.32963 + 83 2.00000 -5.868295 -159.68444 + 84 2.00000 -5.868294 -159.68441 + 85 2.00000 -5.866121 -159.62527 + 86 2.00000 -4.438078 -120.76625 + 87 2.00000 -4.438077 -120.76622 + 88 2.00000 -4.435088 -120.68488 + 89 2.00000 -4.416313 -120.17399 + 90 2.00000 -4.416311 -120.17393 + 91 2.00000 -4.413018 -120.08434 + 92 2.00000 -3.077538 -83.74407 + 93 2.00000 -2.583476 -70.29995 + 94 2.00000 -2.106838 -57.32998 + 95 2.00000 -2.106837 -57.32996 + 96 2.00000 -2.105552 -57.29498 + 97 2.00000 -2.105551 -57.29496 + 98 2.00000 -2.104969 -57.27912 + 99 2.00000 -2.081500 -56.64050 + 100 2.00000 -2.081500 -56.64050 + 101 2.00000 -2.079803 -56.59431 + 102 2.00000 -2.079802 -56.59429 + 103 2.00000 -2.079095 -56.57505 + 104 2.00000 -1.713070 -46.61500 + 105 2.00000 -1.708467 -46.48975 + 106 2.00000 -1.708462 -46.48962 + 107 2.00000 -1.661305 -45.20641 + 108 2.00000 -1.661305 -45.20640 + 109 2.00000 -1.658219 -45.12243 + 110 2.00000 -1.658218 -45.12240 + 111 2.00000 -1.658110 -45.11946 + 112 2.00000 -1.639913 -44.62430 + 113 2.00000 -1.639911 -44.62426 + 114 2.00000 -1.636620 -44.53468 + 115 2.00000 -1.636618 -44.53464 + 116 2.00000 -1.635884 -44.51467 + 117 2.00000 -1.580956 -43.02001 + 118 2.00000 -1.573484 -42.81667 + 119 2.00000 -1.573479 -42.81655 + 120 2.00000 -1.416101 -38.53408 + 121 2.00000 -1.416099 -38.53401 + 122 2.00000 -1.415925 -38.52927 + 123 2.00000 -1.415759 -38.52477 + 124 2.00000 -1.415758 -38.52474 + 125 2.00000 -1.415595 -38.52029 + 126 2.00000 -1.415506 -38.51789 + 127 2.00000 -0.792882 -21.57541 + 128 2.00000 -0.753752 -20.51064 + 129 2.00000 -0.731593 -19.90766 + 130 2.00000 -0.702802 -19.12422 + 131 2.00000 -0.465496 -12.66679 + 132 2.00000 -0.417164 -11.35160 + 133 2.00000 -0.323162 -8.79370 + 134 2.00000 -0.313523 -8.53140 + 135 2.00000 -0.313513 -8.53112 + 136 2.00000 -0.286935 -7.80789 + 137 2.00000 -0.286905 -7.80708 + 138 2.00000 -0.285815 -7.77743 + 139 2.00000 -0.255097 -6.94153 + 140 2.00000 -0.255069 -6.94077 + 141 2.00000 -0.235879 -6.41859 + 142 2.00000 -0.235860 -6.41806 + 143 2.00000 -0.227812 -6.19907 + 144 2.00000 -0.208954 -5.68592 + 145 0.00000 -0.091704 -2.49539 + 146 0.00000 -0.091660 -2.49421 + 147 0.00000 -0.073757 -2.00702 + 148 0.00000 -0.073724 -2.00612 + 149 0.00000 -0.061600 -1.67623 + 150 0.00000 -0.061586 -1.67584 + 151 0.00000 -0.042227 -1.14904 + 152 0.00000 -0.042184 -1.14788 + 153 0.00000 -0.023193 -0.63112 + 154 0.00000 0.033953 0.92390 + 155 0.00000 0.055918 1.52160 + 156 0.00000 0.098727 2.68650 + 157 0.00000 0.115980 3.15597 + 158 0.00000 0.133702 3.63821 + 159 0.00000 0.166512 4.53102 + 160 0.00000 0.187919 5.11353 + 161 0.00000 0.187940 5.11410 + 162 0.00000 0.216042 5.87879 + 163 0.00000 0.216078 5.87979 + 164 0.00000 0.222786 6.06231 + 165 0.00000 0.257857 7.01665 + 166 0.00000 0.280386 7.62968 + 167 0.00000 0.283652 7.71857 + 168 0.00000 0.283734 7.72081 + 169 0.00000 0.296767 8.07545 + 170 0.00000 0.309888 8.43247 + 171 0.00000 0.309977 8.43490 + 172 0.00000 0.332525 9.04847 + 173 0.00000 0.378639 10.30330 + 174 0.00000 0.409783 11.15077 + 175 0.00000 0.410098 11.15934 + 176 0.00000 0.434510 11.82362 + 177 0.00000 0.434922 11.83483 + 178 0.00000 0.448384 12.20115 + 179 0.00000 0.449030 12.21872 + 180 0.00000 0.455913 12.40601 + 181 0.00000 0.458783 12.48413 + 182 0.00000 0.459232 12.49635 + 183 0.00000 0.491817 13.38302 + 184 0.00000 0.515851 14.03701 + 185 0.00000 0.537856 14.63580 + 186 0.00000 0.538216 14.64560 + 187 0.00000 0.550392 14.97694 + 188 0.00000 0.550797 14.98794 + 189 0.00000 0.553197 15.05326 + 190 0.00000 0.607384 16.52777 + 191 0.00000 0.645174 17.55607 + 192 0.00000 0.654001 17.79628 + 193 0.00000 0.654251 17.80307 + 194 0.00000 0.676597 18.41114 + 195 0.00000 0.677555 18.43720 + 196 0.00000 0.704751 19.17724 + 197 0.00000 0.755950 20.57044 + 198 0.00000 0.756878 20.59569 + 199 0.00000 0.766119 20.84717 + 200 0.00000 0.767013 20.87149 + 201 0.00000 0.789229 21.47602 + 202 0.00000 0.812771 22.11663 + 203 0.00000 0.857620 23.33703 + 204 0.00000 0.858321 23.35610 + 205 0.00000 0.881456 23.98564 + 206 0.00000 0.886545 24.12411 + 207 0.00000 0.888357 24.17342 + 208 0.00000 0.909208 24.74080 + 209 0.00000 1.010400 27.49438 + 210 0.00000 1.023135 27.84092 + 211 0.00000 1.036122 28.19431 + 212 0.00000 1.037229 28.22444 + 213 0.00000 1.042509 28.36811 + 214 0.00000 1.042857 28.37757 + 215 0.00000 1.054058 28.68237 + 216 0.00000 1.067153 29.03871 + 217 0.00000 1.131717 30.79558 + 218 0.00000 1.133661 30.84849 + 219 0.00000 1.140985 31.04779 + 220 0.00000 1.155431 31.44087 + 221 0.00000 1.157713 31.50296 + 222 0.00000 1.163355 31.65651 + 223 0.00000 1.173224 31.92505 + 224 0.00000 1.232420 33.53587 + 225 0.00000 1.260623 34.30330 + 226 0.00000 1.301633 35.41924 + 227 0.00000 1.302365 35.43916 + 228 0.00000 1.328493 36.15015 + 229 0.00000 1.329310 36.17238 + 230 0.00000 1.354679 36.86270 + 231 0.00000 1.377424 37.48162 + 232 0.00000 1.377522 37.48428 + 233 0.00000 1.404312 38.21328 + 234 0.00000 1.408885 38.33770 + 235 0.00000 1.408964 38.33986 + 236 0.00000 1.413168 38.45425 + 237 0.00000 1.420398 38.65099 + 238 0.00000 1.455753 39.61305 + 239 0.00000 1.456628 39.63687 + 240 0.00000 1.464465 39.85011 + 241 0.00000 1.465304 39.87296 + 242 0.00000 1.472399 40.06600 + 243 0.00000 1.513797 41.19251 + 244 0.00000 1.514870 41.22170 + 245 0.00000 1.515499 41.23883 + 246 0.00000 1.531215 41.66648 + 247 0.00000 1.531438 41.67254 + 248 0.00000 1.608326 43.76478 + 249 0.00000 1.608578 43.77163 + 250 0.00000 1.669809 45.43782 + 251 0.00000 1.670986 45.46984 + 252 0.00000 1.730939 47.10124 + 253 0.00000 1.749437 47.60460 + 254 0.00000 1.749786 47.61409 + 255 0.00000 1.766432 48.06705 + 256 0.00000 1.776230 48.33368 + 257 0.00000 1.777104 48.35746 + 258 0.00000 1.784557 48.56027 + 259 0.00000 1.806022 49.14437 + 260 0.00000 1.806822 49.16613 + 261 0.00000 1.807111 49.17399 + 262 0.00000 1.874770 51.01508 + 263 0.00000 1.875379 51.03166 + 264 0.00000 1.910035 51.97470 + 265 0.00000 2.125686 57.84286 + 266 0.00000 2.125799 57.84592 + 267 0.00000 2.142441 58.29877 + 268 0.00000 2.142696 58.30573 + 269 0.00000 2.172804 59.12501 + 270 0.00000 2.220334 60.41836 + 271 0.00000 2.220418 60.42064 + 272 0.00000 2.261528 61.53932 + 273 0.00000 2.265240 61.64031 + 274 0.00000 2.265445 61.64591 + 275 0.00000 2.276948 61.95891 + 276 0.00000 2.277093 61.96286 + 277 0.00000 2.332165 63.46143 + 278 0.00000 2.339426 63.65903 + 279 0.00000 2.339834 63.67012 + 280 0.00000 2.365138 64.35867 + 281 0.00000 2.398547 65.26778 + 282 0.00000 2.440476 66.40873 + 283 0.00000 2.440750 66.41618 + 284 0.00000 2.464848 67.07192 + 285 0.00000 2.465055 67.07757 + 286 0.00000 2.472210 67.27226 + + What follows are estimated values for band gap, HOMO, LUMO, etc. + | They are estimated on a discrete k-point grid and not necessarily exact. + | For converged numbers, create a DOS and/or band structure plot on a denser k-grid. + + Highest occupied state (VBM) at -5.51016801 eV (relative to internal zero) + | Occupation number: 1.99999998 + | K-point: 152 at 0.320000 0.360000 0.000000 (in units of recip. lattice) + + Lowest unoccupied state (CBM) at -4.12785860 eV (relative to internal zero) + | Occupation number: 0.00000000 + | K-point: 82 at 0.160000 0.640000 0.000000 (in units of recip. lattice) + + ESTIMATED overall HOMO-LUMO gap: 1.38230941 eV between HOMO at k-point 152 and LUMO at k-point 82 + | This appears to be an indirect band gap. + | Smallest direct gap : 1.43546694 eV for k_point 152 at 0.320000 0.360000 0.000000 (in units of recip. lattice) + The gap value is above 0.2 eV. Unless you are using a very sparse k-point grid, + this system is most likely an insulator or a semiconductor. + + Writing energy levels: + | Potential vacuum level, "upper" slab surface: -1.11020741 eV + | Potential vacuum level, "lower" slab surface: 0.43209145 eV + | Work function ("upper" slab surface) : 4.36023635 eV + | Work function ("lower" slab surface) : 5.90253520 eV + *** Warning: band gap may exist, check the suitability to define work function using chemical potential. + | VBM (reference: upper vacuum level) : 4.39996061 eV + | CBM (reference: upper vacuum level) : 3.01765119 eV + + Total energy components: + | Sum of eigenvalues : -24401.22742107 Ha -663991.18162666 eV + | XC energy correction : -506.82228749 Ha -13791.33613793 eV + | XC potential correction : 968.45897407 Ha 26353.10951581 eV + | Free-atom electrostatic energy: -15462.20469666 Ha -420747.99721842 eV + | Hartree energy correction : -1.49494760 Ha -40.67959384 eV + | vdW energy correction : 0.00000000 Ha 0.00000000 eV + | Entropy correction : -0.00000000 Ha -0.00000000 eV + | --------------------------- + | Total energy : -39403.29037874 Ha -1072218.08506104 eV + | Total energy, T -> 0 : -39403.29037874 Ha -1072218.08506104 eV <-- do not rely on this value for anything but (periodic) metals + | Electronic free energy : -39403.29037874 Ha -1072218.08506104 eV + + Derived energy quantities: + | Kinetic energy : 42031.89370647 Ha 1143746.02090999 eV + | Electrostatic energy : -80453.33898864 Ha -2189246.74152874 eV + | Energy correction for multipole + | error in Hartree potential : -0.00057051 Ha -0.01552423 eV + | Sum of eigenvalues per atom : -110665.19693778 eV + | Total energy (T->0) per atom : -178703.01417684 eV <-- do not rely on this value for anything but (periodic) metals + | Electronic free energy per atom : -178703.01417684 eV + Evaluating new KS density using the density matrix + Evaluating density matrix + Finished writing density matrices to file + | Time : 0.212 s + + Time summed over all CPUs for getting density from density matrix: real work 91.068 s, elapsed 105.098 s + Integration grid: deviation in total charge ( - N_e) = -1.823537E-10 + + Self-consistency convergence accuracy: + | Change of charge density : 0.3414E-05 + | Change of unmixed KS density : 0.3414E-05 + | Change of sum of eigenvalues : 0.1926E-02 eV + | Change of total energy : -0.2081E-04 eV + + +------------------------------------------------------------ + End self-consistency iteration # 1 : max(cpu_time) wall_clock(cpu1) + | Time for this iteration : 568.105 s 3872.120 s + | Charge density update : 14.048 s 14.053 s + | Density mixing : 0.005 s 0.006 s + | Hartree multipole update : 0.007 s 0.006 s + | Hartree multipole summation : 4.154 s 4.155 s + | Integration : 6.749 s 6.749 s + | Fock matrix evaluation : 539.393 s 3843.435 s + | Solution of K.-S. eqns. : 3.708 s 3.709 s + | Total energy evaluation : 0.006 s 0.003 s + + Partial memory accounting: + | Current value for overall tracked memory usage: + | Minimum: 328.025 MB (on task 6) + | Maximum: 572.099 MB (on task 0) + | Average: 440.775 MB + | Peak value for overall tracked memory usage: + | Minimum: 1023.924 MB (on task 7 after allocating ovlp3fn2) + | Maximum: 2253.341 MB (on task 6 after allocating ovlp3fn_nosplit%m) + | Average: 1684.765 MB + | Largest tracked array allocation so far: + | Minimum: 510.595 MB (ovlp3fn_nosplit%dat on task 7) + | Maximum: 1608.479 MB (ovlp3fn_nosplit%dat on task 6) + | Average: 1141.214 MB + Note: These values currently only include a subset of arrays which are explicitly tracked. + The "true" memory usage will be greater. +------------------------------------------------------------ + +------------------------------------------------------------ + Begin self-consistency iteration # 2 + + Date : 20230117, Time : 130841.276 +------------------------------------------------------------ + Linear mixing of updated and previous charge densities. + Renormalizing the density to the exact electron count on the 3D integration grid. + | Formal number of electrons (from input files) : 288.0000000000 + | Integrated number of electrons on 3D grid : 288.0000000000 + | Charge integration error : -0.0000000000 + | Normalization factor for density and gradient : 1.0000000000 + + Evaluating partitioned Hartree potential by multipole expansion. + | Original multipole sum: apparent total charge = 0.394745E-12 + | Sum of charges compensated after spline to logarithmic grids = 0.612514E-07 + | Analytical far-field extrapolation by fixed multipoles: + | Hartree multipole sum: apparent total charge = 0.394532E-12 + Summing up the Hartree potential. + Calculating dipole correction via potential gradient + | Dipole correction gradient : 0.05024959 eV/Angstrom + | Dipole correction potential jump : -1.54229149 eV + Time summed over all CPUs for potential: real work 15.265 s, elapsed 19.691 s + | RMS charge density error from multipole expansion : 0.600004E-02 + | Average real-space part of the electrostatic potential : -0.01380720 eV + + Integrating Hamiltonian matrix: batch-based integration. + Time summed over all CPUs for integration: real work 48.683 s, elapsed 55.764 s + Calculating non-local Hartree-Fock exchange by two-center RI (RI-LVL). + screening_threshold (crit_val) = 0.000000100000 + Exact exchange progress report - outermost block loop i_block: 1 .. 72 + | 1 2 3 4 5 6 7 8 9 10 + | 11 12 13 14 15 16 17 18 19 20 + | 21 22 23 24 25 26 27 28 29 30 + | 31 32 33 34 35 36 37 38 39 40 + | 41 42 43 44 45 46 47 48 49 50 + | 51 52 53 54 55 56 57 58 59 60 + | 61 62 63 64 65 66 67 68 69 70 + | 71 72 + Total ovlp3fn data transfer [GB] 5.14889938756824 + Full exact exchange energy: 25852.056606406633 eV. + Times DM_x_o3fn CM_prod_1 CM_prod_2 tmp2_prod Sync Imbalance Other Total calc + | Times 0: 174.956 343.235 62.722 68.324 0.072 2.405 6.143 657.858 + | Times 1: 140.465 246.681 55.204 102.518 13.964 89.807 9.229 657.868 + | Times 2: 131.487 260.207 58.741 82.689 13.963 101.854 8.918 657.857 + | Times 3: 116.719 229.256 44.365 98.862 9.213 151.647 7.798 657.859 + | Times 4: 90.710 171.384 36.530 73.407 9.210 269.625 6.982 657.848 + | Times 5: 60.721 133.756 32.250 65.344 9.011 349.403 7.371 657.856 + | Times 6: 60.428 147.774 32.064 62.705 9.010 338.538 7.338 657.857 + | Times 7: 96.202 299.494 77.446 77.944 0.072 100.791 5.912 657.860 + | Times sum: 871.688 1831.786 399.322 631.793 64.514 1404.070 59.690 5262.864 + + Decomposition of Other based on code block (only on MPI task 0): + Times Block #1 Block #2 Block #3 Block #4 Block #5 Block #6 Block #7 Block #8 + | Times 0: 1.169 0.000 0.074 0.014 0.036 0.008 0.975 0.001 + + Times Block #9 Block #10 Block #11 Block #12 Block #13 Block #14 Block #15 Block #16 + | Times 0: 0.092 0.000 1.108 0.186 0.000 0.796 0.065 0.019 + + Times Block Sum Expected + | Times 0: 4.543 6.143 + Time for Fock matrix mixing 0.861784353296343 + + Updating Kohn-Sham eigenvalues and eigenvectors using ELSI and the (modified) LAPACK eigensolver. + Starting LAPACK eigensolver + Finished Cholesky decomposition + | Time : 0.007 s + Finished transformation to standard eigenproblem + | Time : 0.014 s + Finished solving standard eigenproblem + | Time : 0.051 s + Finished back-transformation of eigenvectors + | Time : 0.008 s + + Obtaining occupation numbers and electronic chemical potential using ELSI. + | Note that, for insulating systems, the printed 'chemical potential' value is not uniquely defined. + | It can be anywhere in the energy gap, as long as it correctly separates occupied and unoccupied states. + | In systems with a gap, the physically relevant chemical potential is the VBM or HOMO. + + | Chemical potential (Fermi level): -5.47044379 eV + What follows are estimated values for band gap, HOMO, LUMO, etc. + | They are estimated on a discrete k-point grid and not necessarily exact. + | For converged numbers, create a DOS and/or band structure plot on a denser k-grid. + + Highest occupied state (VBM) at -5.51016805 eV (relative to internal zero) + | Occupation number: 1.99999998 + | K-point: 152 at 0.320000 0.360000 0.000000 (in units of recip. lattice) + + Lowest unoccupied state (CBM) at -4.12784864 eV (relative to internal zero) + | Occupation number: 0.00000000 + | K-point: 82 at 0.160000 0.640000 0.000000 (in units of recip. lattice) + + ESTIMATED overall HOMO-LUMO gap: 1.38231941 eV between HOMO at k-point 152 and LUMO at k-point 82 + | This appears to be an indirect band gap. + | Smallest direct gap : 1.43548217 eV for k_point 152 at 0.320000 0.360000 0.000000 (in units of recip. lattice) + The gap value is above 0.2 eV. Unless you are using a very sparse k-point grid, + this system is most likely an insulator or a semiconductor. + + Checking to see if s.c.f. parameters should be adjusted. + + Total energy components: + | Sum of eigenvalues : -24401.22735640 Ha -663991.17986680 eV + | XC energy correction : -506.82228793 Ha -13791.33615015 eV + | XC potential correction : 968.45897442 Ha 26353.10952534 eV + | Free-atom electrostatic energy: -15462.20469666 Ha -420747.99721842 eV + | Hartree energy correction : -1.49501235 Ha -40.68135598 eV + | vdW energy correction : 0.00000000 Ha 0.00000000 eV + | Entropy correction : -0.00000000 Ha -0.00000000 eV + | --------------------------- + | Total energy : -39403.29037892 Ha -1072218.08506601 eV + | Total energy, T -> 0 : -39403.29037892 Ha -1072218.08506601 eV <-- do not rely on this value for anything but (periodic) metals + | Electronic free energy : -39403.29037892 Ha -1072218.08506601 eV + + Derived energy quantities: + | Kinetic energy : 42031.89370992 Ha 1143746.02100380 eV + | Electrostatic energy : -80453.33899219 Ha -2189246.74162545 eV + | Energy correction for multipole + | error in Hartree potential : -0.00057051 Ha -0.01552423 eV + | Sum of eigenvalues per atom : -110665.19664447 eV + | Total energy (T->0) per atom : -178703.01417767 eV <-- do not rely on this value for anything but (periodic) metals + | Electronic free energy per atom : -178703.01417767 eV + + Self-consistency convergence accuracy: + | Change of charge density : 0.3330E-05 + | Change of unmixed KS density : 0.2647E-06 + | Change of sum of eigenvalues : 0.1760E-02 eV + | Change of total energy : -0.4968E-05 eV + + Writing Kohn-Sham eigenvalues. + K-point: 1 at 0.000000 0.000000 0.000000 (in units of recip. lattice) + + State Occupation Eigenvalue [Ha] Eigenvalue [eV] + 1 2.00000 -2770.799161 -75397.28133 + 2 2.00000 -1208.925944 -32896.54870 + 3 2.00000 -1208.904417 -32895.96291 + 4 2.00000 -748.317796 -20362.76327 + 5 2.00000 -468.574206 -12750.55288 + 6 2.00000 -468.549657 -12749.88486 + 7 2.00000 -450.152252 -12249.26601 + 8 2.00000 -392.953646 -10692.81275 + 9 2.00000 -392.953570 -10692.81068 + 10 2.00000 -392.953570 -10692.81068 + 11 2.00000 -180.899553 -4922.52729 + 12 2.00000 -180.878029 -4921.94160 + 13 2.00000 -162.224115 -4414.34278 + 14 2.00000 -162.224115 -4414.34277 + 15 2.00000 -162.223747 -4414.33275 + 16 2.00000 -162.202604 -4413.75743 + 17 2.00000 -162.202604 -4413.75742 + 18 2.00000 -162.202179 -4413.74586 + 19 2.00000 -104.483003 -2843.12716 + 20 2.00000 -103.056109 -2804.29940 + 21 2.00000 -93.314642 -2539.22061 + 22 2.00000 -93.314273 -2539.21055 + 23 2.00000 -93.314272 -2539.21054 + 24 2.00000 -86.365206 -2350.11682 + 25 2.00000 -86.364766 -2350.10486 + 26 2.00000 -86.364765 -2350.10484 + 27 2.00000 -67.252387 -1830.03056 + 28 2.00000 -67.252343 -1830.02936 + 29 2.00000 -67.252342 -1830.02935 + 30 2.00000 -67.252042 -1830.02117 + 31 2.00000 -67.252042 -1830.02116 + 32 2.00000 -60.013742 -1633.05701 + 33 2.00000 -59.988790 -1632.37804 + 34 2.00000 -52.716749 -1434.49571 + 35 2.00000 -52.716748 -1434.49570 + 36 2.00000 -52.716227 -1434.48153 + 37 2.00000 -52.691895 -1433.81943 + 38 2.00000 -52.691895 -1433.81941 + 39 2.00000 -52.691232 -1433.80137 + 40 2.00000 -36.207785 -985.26397 + 41 2.00000 -36.186282 -984.67883 + 42 2.00000 -30.148239 -820.37532 + 43 2.00000 -30.148238 -820.37529 + 44 2.00000 -30.146909 -820.33913 + 45 2.00000 -30.126756 -819.79074 + 46 2.00000 -30.126755 -819.79071 + 47 2.00000 -30.125324 -819.75177 + 48 2.00000 -21.519103 -585.56459 + 49 2.00000 -21.017733 -571.92161 + 50 2.00000 -21.017733 -571.92161 + 51 2.00000 -21.016819 -571.89675 + 52 2.00000 -21.016819 -571.89673 + 53 2.00000 -21.016503 -571.88814 + 54 2.00000 -20.996270 -571.33757 + 55 2.00000 -20.996270 -571.33757 + 56 2.00000 -20.995267 -571.31029 + 57 2.00000 -20.995266 -571.31026 + 58 2.00000 -20.994922 -571.30089 + 59 2.00000 -18.107436 -492.72841 + 60 2.00000 -16.054224 -436.85766 + 61 2.00000 -16.053884 -436.84841 + 62 2.00000 -16.053883 -436.84837 + 63 2.00000 -14.438786 -392.89935 + 64 2.00000 -14.437462 -392.86334 + 65 2.00000 -14.437461 -392.86330 + 66 2.00000 -9.121622 -248.21196 + 67 2.00000 -9.121620 -248.21192 + 68 2.00000 -9.121472 -248.20789 + 69 2.00000 -9.121315 -248.20362 + 70 2.00000 -9.121314 -248.20359 + 71 2.00000 -8.480758 -230.77318 + 72 2.00000 -8.480491 -230.76591 + 73 2.00000 -8.480490 -230.76589 + 74 2.00000 -8.479619 -230.74218 + 75 2.00000 -8.479619 -230.74218 + 76 2.00000 -8.189862 -222.85750 + 77 2.00000 -8.164336 -222.16289 + 78 2.00000 -6.332017 -172.30294 + 79 2.00000 -6.310220 -171.70982 + 80 2.00000 -5.893687 -160.37539 + 81 2.00000 -5.893686 -160.37536 + 82 2.00000 -5.892006 -160.32963 + 83 2.00000 -5.868296 -159.68445 + 84 2.00000 -5.868294 -159.68442 + 85 2.00000 -5.866121 -159.62527 + 86 2.00000 -4.438078 -120.76625 + 87 2.00000 -4.438077 -120.76621 + 88 2.00000 -4.435087 -120.68487 + 89 2.00000 -4.416313 -120.17399 + 90 2.00000 -4.416311 -120.17393 + 91 2.00000 -4.413018 -120.08434 + 92 2.00000 -3.077537 -83.74405 + 93 2.00000 -2.583476 -70.29995 + 94 2.00000 -2.106838 -57.32998 + 95 2.00000 -2.106837 -57.32995 + 96 2.00000 -2.105552 -57.29498 + 97 2.00000 -2.105551 -57.29496 + 98 2.00000 -2.104969 -57.27912 + 99 2.00000 -2.081500 -56.64051 + 100 2.00000 -2.081500 -56.64050 + 101 2.00000 -2.079803 -56.59431 + 102 2.00000 -2.079802 -56.59430 + 103 2.00000 -2.079095 -56.57506 + 104 2.00000 -1.713069 -46.61499 + 105 2.00000 -1.708466 -46.48973 + 106 2.00000 -1.708461 -46.48960 + 107 2.00000 -1.661305 -45.20640 + 108 2.00000 -1.661304 -45.20639 + 109 2.00000 -1.658219 -45.12242 + 110 2.00000 -1.658217 -45.12239 + 111 2.00000 -1.658110 -45.11946 + 112 2.00000 -1.639913 -44.62430 + 113 2.00000 -1.639911 -44.62426 + 114 2.00000 -1.636620 -44.53469 + 115 2.00000 -1.636618 -44.53464 + 116 2.00000 -1.635884 -44.51467 + 117 2.00000 -1.580956 -43.02000 + 118 2.00000 -1.573484 -42.81667 + 119 2.00000 -1.573479 -42.81655 + 120 2.00000 -1.416101 -38.53406 + 121 2.00000 -1.416098 -38.53399 + 122 2.00000 -1.415924 -38.52925 + 123 2.00000 -1.415759 -38.52475 + 124 2.00000 -1.415757 -38.52472 + 125 2.00000 -1.415594 -38.52027 + 126 2.00000 -1.415506 -38.51787 + 127 2.00000 -0.792882 -21.57540 + 128 2.00000 -0.753752 -20.51065 + 129 2.00000 -0.731593 -19.90765 + 130 2.00000 -0.702802 -19.12423 + 131 2.00000 -0.465496 -12.66678 + 132 2.00000 -0.417164 -11.35160 + 133 2.00000 -0.323162 -8.79369 + 134 2.00000 -0.313523 -8.53138 + 135 2.00000 -0.313512 -8.53111 + 136 2.00000 -0.286935 -7.80789 + 137 2.00000 -0.286905 -7.80708 + 138 2.00000 -0.285815 -7.77743 + 139 2.00000 -0.255096 -6.94152 + 140 2.00000 -0.255068 -6.94075 + 141 2.00000 -0.235879 -6.41859 + 142 2.00000 -0.235860 -6.41806 + 143 2.00000 -0.227811 -6.19906 + 144 2.00000 -0.208954 -5.68592 + 145 0.00000 -0.091704 -2.49538 + 146 0.00000 -0.091660 -2.49420 + 147 0.00000 -0.073757 -2.00702 + 148 0.00000 -0.073724 -2.00612 + 149 0.00000 -0.061600 -1.67622 + 150 0.00000 -0.061586 -1.67583 + 151 0.00000 -0.042227 -1.14905 + 152 0.00000 -0.042184 -1.14788 + 153 0.00000 -0.023193 -0.63111 + 154 0.00000 0.033953 0.92390 + 155 0.00000 0.055918 1.52161 + 156 0.00000 0.098727 2.68650 + 157 0.00000 0.115980 3.15597 + 158 0.00000 0.133702 3.63822 + 159 0.00000 0.166512 4.53102 + 160 0.00000 0.187919 5.11354 + 161 0.00000 0.187940 5.11411 + 162 0.00000 0.216042 5.87879 + 163 0.00000 0.216078 5.87979 + 164 0.00000 0.222786 6.06232 + 165 0.00000 0.257857 7.01665 + 166 0.00000 0.280386 7.62969 + 167 0.00000 0.283653 7.71858 + 168 0.00000 0.283735 7.72081 + 169 0.00000 0.296767 8.07545 + 170 0.00000 0.309888 8.43247 + 171 0.00000 0.309977 8.43490 + 172 0.00000 0.332525 9.04848 + 173 0.00000 0.378639 10.30330 + 174 0.00000 0.409783 11.15077 + 175 0.00000 0.410098 11.15934 + 176 0.00000 0.434510 11.82362 + 177 0.00000 0.434922 11.83484 + 178 0.00000 0.448384 12.20115 + 179 0.00000 0.449030 12.21871 + 180 0.00000 0.455913 12.40602 + 181 0.00000 0.458783 12.48413 + 182 0.00000 0.459232 12.49635 + 183 0.00000 0.491817 13.38302 + 184 0.00000 0.515851 14.03701 + 185 0.00000 0.537856 14.63581 + 186 0.00000 0.538216 14.64561 + 187 0.00000 0.550392 14.97694 + 188 0.00000 0.550797 14.98794 + 189 0.00000 0.553197 15.05326 + 190 0.00000 0.607384 16.52777 + 191 0.00000 0.645174 17.55608 + 192 0.00000 0.654002 17.79629 + 193 0.00000 0.654251 17.80308 + 194 0.00000 0.676597 18.41114 + 195 0.00000 0.677555 18.43720 + 196 0.00000 0.704751 19.17724 + 197 0.00000 0.755950 20.57044 + 198 0.00000 0.756878 20.59570 + 199 0.00000 0.766119 20.84717 + 200 0.00000 0.767013 20.87149 + 201 0.00000 0.789229 21.47602 + 202 0.00000 0.812771 22.11663 + 203 0.00000 0.857620 23.33703 + 204 0.00000 0.858321 23.35610 + 205 0.00000 0.881456 23.98565 + 206 0.00000 0.886545 24.12411 + 207 0.00000 0.888357 24.17342 + 208 0.00000 0.909208 24.74080 + 209 0.00000 1.010400 27.49438 + 210 0.00000 1.023135 27.84092 + 211 0.00000 1.036122 28.19432 + 212 0.00000 1.037229 28.22444 + 213 0.00000 1.042509 28.36811 + 214 0.00000 1.042857 28.37758 + 215 0.00000 1.054058 28.68238 + 216 0.00000 1.067153 29.03871 + 217 0.00000 1.131717 30.79559 + 218 0.00000 1.133662 30.84850 + 219 0.00000 1.140985 31.04779 + 220 0.00000 1.155431 31.44088 + 221 0.00000 1.157713 31.50296 + 222 0.00000 1.163356 31.65652 + 223 0.00000 1.173224 31.92506 + 224 0.00000 1.232421 33.53587 + 225 0.00000 1.260623 34.30331 + 226 0.00000 1.301633 35.41924 + 227 0.00000 1.302366 35.43917 + 228 0.00000 1.328494 36.15015 + 229 0.00000 1.329311 36.17238 + 230 0.00000 1.354680 36.86271 + 231 0.00000 1.377425 37.48163 + 232 0.00000 1.377522 37.48429 + 233 0.00000 1.404313 38.21329 + 234 0.00000 1.408885 38.33770 + 235 0.00000 1.408964 38.33986 + 236 0.00000 1.413168 38.45425 + 237 0.00000 1.420398 38.65099 + 238 0.00000 1.455753 39.61305 + 239 0.00000 1.456628 39.63688 + 240 0.00000 1.464465 39.85011 + 241 0.00000 1.465304 39.87296 + 242 0.00000 1.472399 40.06600 + 243 0.00000 1.513797 41.19252 + 244 0.00000 1.514870 41.22170 + 245 0.00000 1.515499 41.23883 + 246 0.00000 1.531215 41.66648 + 247 0.00000 1.531438 41.67254 + 248 0.00000 1.608326 43.76478 + 249 0.00000 1.608578 43.77164 + 250 0.00000 1.669809 45.43782 + 251 0.00000 1.670986 45.46984 + 252 0.00000 1.730939 47.10124 + 253 0.00000 1.749437 47.60460 + 254 0.00000 1.749785 47.61409 + 255 0.00000 1.766432 48.06705 + 256 0.00000 1.776230 48.33369 + 257 0.00000 1.777104 48.35747 + 258 0.00000 1.784558 48.56028 + 259 0.00000 1.806022 49.14437 + 260 0.00000 1.806822 49.16614 + 261 0.00000 1.807111 49.17400 + 262 0.00000 1.874770 51.01508 + 263 0.00000 1.875379 51.03166 + 264 0.00000 1.910035 51.97470 + 265 0.00000 2.125686 57.84287 + 266 0.00000 2.125799 57.84593 + 267 0.00000 2.142441 58.29877 + 268 0.00000 2.142696 58.30573 + 269 0.00000 2.172805 59.12503 + 270 0.00000 2.220334 60.41837 + 271 0.00000 2.220418 60.42065 + 272 0.00000 2.261528 61.53932 + 273 0.00000 2.265240 61.64031 + 274 0.00000 2.265445 61.64591 + 275 0.00000 2.276949 61.95892 + 276 0.00000 2.277094 61.96288 + 277 0.00000 2.332165 63.46144 + 278 0.00000 2.339426 63.65903 + 279 0.00000 2.339834 63.67012 + 280 0.00000 2.365138 64.35867 + 281 0.00000 2.398547 65.26780 + 282 0.00000 2.440476 66.40874 + 283 0.00000 2.440750 66.41619 + 284 0.00000 2.464848 67.07192 + 285 0.00000 2.465055 67.07757 + 286 0.00000 2.472210 67.27226 + + What follows are estimated values for band gap, HOMO, LUMO, etc. + | They are estimated on a discrete k-point grid and not necessarily exact. + | For converged numbers, create a DOS and/or band structure plot on a denser k-grid. + + Highest occupied state (VBM) at -5.51016805 eV (relative to internal zero) + | Occupation number: 1.99999998 + | K-point: 152 at 0.320000 0.360000 0.000000 (in units of recip. lattice) + + Lowest unoccupied state (CBM) at -4.12784864 eV (relative to internal zero) + | Occupation number: 0.00000000 + | K-point: 82 at 0.160000 0.640000 0.000000 (in units of recip. lattice) + + ESTIMATED overall HOMO-LUMO gap: 1.38231941 eV between HOMO at k-point 152 and LUMO at k-point 82 + | This appears to be an indirect band gap. + | Smallest direct gap : 1.43548217 eV for k_point 152 at 0.320000 0.360000 0.000000 (in units of recip. lattice) + The gap value is above 0.2 eV. Unless you are using a very sparse k-point grid, + this system is most likely an insulator or a semiconductor. + + | Chemical Potential : -5.47044379 eV + | Note that, for insulating systems, the printed 'chemical potential' value is not uniquely defined. + | It can be anywhere in the energy gap, as long as it correctly separates occupied and unoccupied states. + | In systems with a gap, the physically relevant chemical potential is the VBM or HOMO. + + Writing energy levels: + | Potential vacuum level, "upper" slab surface: -1.11020586 eV + | Potential vacuum level, "lower" slab surface: 0.43208563 eV + | Work function ("upper" slab surface) : 4.36023793 eV + | Work function ("lower" slab surface) : 5.90252942 eV + *** Warning: band gap may exist, check the suitability to define work function using chemical potential. + | VBM (reference: upper vacuum level) : 4.39996220 eV + | CBM (reference: upper vacuum level) : 3.01764278 eV + + Self-consistency cycle converged. + + Finished writing density matrices to file + | Time : 0.320 s + + +------------------------------------------------------------ + End self-consistency iteration # 2 : max(cpu_time) wall_clock(cpu1) + | Time for this iteration : 673.084 s 674.749 s + | Charge density update : 0.000 s 0.000 s + | Density mixing : 0.008 s 0.008 s + | Hartree multipole update : 0.005 s 0.006 s + | Hartree multipole summation : 2.478 s 2.477 s + | Integration : 6.987 s 6.987 s + | Fock matrix evaluation : 657.232 s 658.729 s + | Solution of K.-S. eqns. : 5.691 s 5.693 s + | Total energy evaluation : 0.007 s 0.006 s + + Partial memory accounting: + | Current value for overall tracked memory usage: + | Minimum: 328.025 MB (on task 6) + | Maximum: 572.099 MB (on task 0) + | Average: 440.775 MB + | Peak value for overall tracked memory usage: + | Minimum: 1023.924 MB (on task 7 after allocating ovlp3fn2) + | Maximum: 2253.341 MB (on task 6 after allocating ovlp3fn_nosplit%m) + | Average: 1684.765 MB + | Largest tracked array allocation so far: + | Minimum: 510.595 MB (ovlp3fn_nosplit%dat on task 7) + | Maximum: 1608.479 MB (ovlp3fn_nosplit%dat on task 6) + | Average: 1141.214 MB + Note: These values currently only include a subset of arrays which are explicitly tracked. + The "true" memory usage will be greater. +------------------------------------------------------------ + Obtaining max. number of non-zero basis functions in each batch . + Evaluating KS electron density on previously omitted grid points, using the density matrix. + Evaluating density matrix + Evaluating non-empirical van der Waals correction (Tkatchenko/Scheffler 2009). + Performing Hirshfeld analysis of fragment charges and moments. + ---------------------------------------------------------------------- + | Atom 1: Mo + | Hirshfeld charge : 0.14334549 + | Free atom volume : 161.44141347 + | Hirshfeld volume : 166.69870797 + | Hirshfeld dipole vector : 0.00001486 0.00000113 -0.02826154 + | Hirshfeld dipole moment : 0.02826154 + | Hirshfeld second moments: -0.14903398 -0.00002236 0.00002431 + | -0.00002236 -0.14933710 -0.00000332 + | 0.00002431 -0.00000332 -0.06503340 + ---------------------------------------------------------------------- + | Atom 2: W + | Hirshfeld charge : 0.03397108 + | Free atom volume : 183.26905631 + | Hirshfeld volume : 186.71300181 + | Hirshfeld dipole vector : -0.00000563 -0.00001985 -0.03408373 + | Hirshfeld dipole moment : 0.03408373 + | Hirshfeld second moments: -0.10212085 0.00000533 -0.00000843 + | 0.00000533 -0.10239772 0.00005836 + | -0.00000843 0.00005836 -0.06443174 + ---------------------------------------------------------------------- + | Atom 3: Se + | Hirshfeld charge : -0.09679955 + | Free atom volume : 103.35483164 + | Hirshfeld volume : 102.99374237 + | Hirshfeld dipole vector : -0.00000182 0.00002059 -0.16365042 + | Hirshfeld dipole moment : 0.16365042 + | Hirshfeld second moments: -0.00127560 0.00000424 -0.00000261 + | 0.00000424 -0.00127931 -0.00001042 + | -0.00000261 -0.00001042 -0.05927415 + ---------------------------------------------------------------------- + | Atom 4: Te + | Hirshfeld charge : -0.04246364 + | Free atom volume : 162.39794762 + | Hirshfeld volume : 162.54253923 + | Hirshfeld dipole vector : 0.00001606 0.00000810 0.17625494 + | Hirshfeld dipole moment : 0.17625495 + | Hirshfeld second moments: 0.00633079 0.00000603 0.00018705 + | 0.00000603 0.00631243 0.00011641 + | 0.00018705 0.00011641 -0.08793520 + ---------------------------------------------------------------------- + | Atom 5: Se + | Hirshfeld charge : -0.04403537 + | Free atom volume : 103.35483164 + | Hirshfeld volume : 101.75906502 + | Hirshfeld dipole vector : -0.00004613 -0.00004125 -0.11935505 + | Hirshfeld dipole moment : 0.11935507 + | Hirshfeld second moments: 0.03870993 -0.00004325 0.00018264 + | -0.00004325 0.03873151 0.00020737 + | 0.00018264 0.00020737 -0.02441430 + ---------------------------------------------------------------------- + | Atom 6: Te + | Hirshfeld charge : 0.00568900 + | Free atom volume : 162.39794762 + | Hirshfeld volume : 160.76768289 + | Hirshfeld dipole vector : -0.00001285 0.00002171 0.12611076 + | Hirshfeld dipole moment : 0.12611076 + | Hirshfeld second moments: 0.04941872 0.00000377 -0.00001726 + | 0.00000377 0.04947758 0.00004006 + | -0.00001726 0.00004006 -0.03562343 + ---------------------------------------------------------------------- + + Converging periodic supercell size for vdw calculation. + Convergence accuracy (and time!) can be adjusted using the vdw_convergence_threshold keyword. + | Shell number: 1 + | VDW energy change: -0.864496E+00 eV. + | Not converged. + | Shell number: 2 + | VDW energy change: -0.455753E+00 eV. + | Not converged. + | Shell number: 3 + | VDW energy change: -0.703525E-01 eV. + | Not converged. + | Shell number: 4 + | VDW energy change: -0.190625E-01 eV. + | Not converged. + | Shell number: 5 + | VDW energy change: -0.696535E-02 eV. + | Not converged. + | Shell number: 6 + | VDW energy change: -0.308094E-02 eV. + | Not converged. + | Shell number: 7 + | VDW energy change: -0.156047E-02 eV. + | Not converged. + | Shell number: 8 + | VDW energy change: -0.874347E-03 eV. + | Not converged. + | Shell number: 9 + | VDW energy change: -0.529219E-03 eV. + | Not converged. + | Shell number: 10 + | VDW energy change: -0.340128E-03 eV. + | Not converged. + | Shell number: 11 + | VDW energy change: -0.229201E-03 eV. + | Not converged. + | Shell number: 12 + | VDW energy change: -0.160432E-03 eV. + | Not converged. + | Shell number: 13 + | VDW energy change: -0.115834E-03 eV. + | Not converged. + | Shell number: 14 + | VDW energy change: -0.858156E-04 eV. + | Not converged. + | Shell number: 15 + | VDW energy change: -0.649739E-04 eV. + | Not converged. + | Shell number: 16 + | VDW energy change: -0.501186E-04 eV. + | Not converged. + | Shell number: 17 + | VDW energy change: -0.392896E-04 eV. + | Not converged. + | Shell number: 18 + | VDW energy change: -0.312402E-04 eV. + | Not converged. + | Shell number: 19 + | VDW energy change: -0.251540E-04 eV. + | Not converged. + | Shell number: 20 + | VDW energy change: -0.204820E-04 eV. + | Not converged. + | Shell number: 21 + | VDW energy change: -0.168470E-04 eV. + | Not converged. + | Shell number: 22 + | VDW energy change: -0.139842E-04 eV. + | Not converged. + | Shell number: 23 + | VDW energy change: -0.117047E-04 eV. + | Not converged. + | Shell number: 24 + | VDW energy change: -0.987147E-05 eV. + | Not converged. + | Shell number: 25 + | VDW energy change: -0.838357E-05 eV. + | Not converged. + | Shell number: 26 + | VDW energy change: -0.716579E-05 eV. + | Not converged. + | Shell number: 27 + | VDW energy change: -0.616133E-05 eV. + | Not converged. + | Shell number: 28 + | VDW energy change: -0.532688E-05 eV. + | Not converged. + | Shell number: 29 + | VDW energy change: -0.462905E-05 eV. + | Not converged. + | Shell number: 30 + | VDW energy change: -0.404184E-05 eV. + | Not converged. + | Shell number: 31 + | VDW energy change: -0.354487E-05 eV. + | Not converged. + | Shell number: 32 + | VDW energy change: -0.312199E-05 eV. + | Not converged. + | Shell number: 33 + | VDW energy change: -0.276033E-05 eV. + | Not converged. + | Shell number: 34 + | VDW energy change: -0.244956E-05 eV. + | Not converged. + | Shell number: 35 + | VDW energy change: -0.218132E-05 eV. + | Not converged. + | Shell number: 36 + | VDW energy change: -0.194882E-05 eV. + | Not converged. + | Shell number: 37 + | VDW energy change: -0.174648E-05 eV. + | Not converged. + | Shell number: 38 + | VDW energy change: -0.156974E-05 eV. + | Not converged. + | Shell number: 39 + | VDW energy change: -0.141480E-05 eV. + | Not converged. + | Shell number: 40 + | VDW energy change: -0.127851E-05 eV. + | Not converged. + | Shell number: 41 + | VDW energy change: -0.115825E-05 eV. + | Not converged. + | Shell number: 42 + | VDW energy change: -0.105180E-05 eV. + | Not converged. + | Shell number: 43 + | VDW energy change: -0.957306E-06 eV. + | Converged. + + Total energy components: + | Sum of eigenvalues : -24401.22735640 Ha -663991.17986680 eV + | XC energy correction : -506.82228793 Ha -13791.33615015 eV + | XC potential correction : 968.45897442 Ha 26353.10952534 eV + | Free-atom electrostatic energy: -15462.20469666 Ha -420747.99721842 eV + | Hartree energy correction : -1.49501235 Ha -40.68135598 eV + | vdW energy correction : -0.05374857 Ha -1.46257291 eV + | Entropy correction : -0.00000000 Ha -0.00000000 eV + | --------------------------- + | Total energy : -39403.34412749 Ha -1072219.54763892 eV + | Total energy, T -> 0 : -39403.34412749 Ha -1072219.54763892 eV <-- do not rely on this value for anything but (periodic) metals + | Electronic free energy : -39403.34412749 Ha -1072219.54763892 eV + + Derived energy quantities: + | Kinetic energy : 42031.89370992 Ha 1143746.02100380 eV + | Electrostatic energy : -80453.33899219 Ha -2189246.74162545 eV + | Energy correction for multipole + | error in Hartree potential : -0.00057051 Ha -0.01552423 eV + | Sum of eigenvalues per atom : -110665.19664447 eV + | Total energy (T->0) per atom : -178703.25793982 eV <-- do not rely on this value for anything but (periodic) metals + | Electronic free energy per atom : -178703.25793982 eV + Timings for VdW correction (Tkatchenko-Scheffler 2009 or later): + | CPU time: 7.527 s, Wall clock time: 7.534 s. + + Energy and forces in a compact form: + | Total energy uncorrected : -0.107221954763892E+07 eV + | Total energy corrected : -0.107221954763892E+07 eV <-- do not rely on this value for anything but (periodic) metals + | Electronic free energy : -0.107221954763892E+07 eV + + Calculating total density of states ... + | Chemical potential is -5.470444 eV. + | writing DOS (shifted by electron chemical potential) to file KS_DOS_total.dat.no_soc + | writing DOS (raw data) to file KS_DOS_total_raw.dat.no_soc + | Note that, for insulating systems, the printed 'chemical potential' value is not uniquely defined. + | It can be anywhere in the energy gap, as long as it correctly separates occupied and unoccupied states. + | In systems with a gap, the physically relevant chemical potential is the VBM or HOMO. + ------------------------------------ + Start decomposition of the XC Energy + ------------------------------------ + X and C from original XC functional choice + Hartree-Fock Energy : -237.511404523 Ha -6463.014151602 eV + X Energy : -966.117942690 Ha -26289.406810876 eV + C Energy : -15.727154125 Ha -427.957637983 eV + XC Energy w/o HF : -744.333692292 Ha -20254.350297257 eV + Total XC Energy : -981.845096814 Ha -26717.364448858 eV + ------------------------------------ + LDA X and C from self-consistent density + X Energy LDA : -922.172898532 Ha -25093.601317430 eV + C Energy LDA : -27.738329925 Ha -754.798360983 eV + ------------------------------------ + End decomposition of the XC Energy + ------------------------------------ + +------------------------------------------------------------ + + | Chemical Potential : -5.47044379 eV + | Note that, for insulating systems, the printed 'chemical potential' value is not uniquely defined. + | It can be anywhere in the energy gap, as long as it correctly separates occupied and unoccupied states. + | In systems with a gap, the physically relevant chemical potential is the VBM or HOMO. + + Writing energy levels: + | Potential vacuum level, "upper" slab surface: -1.11020586 eV + | Potential vacuum level, "lower" slab surface: 0.43208563 eV + | Work function ("upper" slab surface) : 4.36023793 eV + | Work function ("lower" slab surface) : 5.90252942 eV + *** Warning: band gap may exist, check the suitability to define work function using chemical potential. + | VBM (reference: upper vacuum level) : 4.39996220 eV + | CBM (reference: upper vacuum level) : 3.01764278 eV + + ****************************************************************** + ** STARTING SECOND VARIATIONAL SOC CALCULATION ** + ****************************************************************** + + ****************************************************************** + ** Stable functionality: ** + ** Writes eigenvalues to stdout ** + ** Recalculates band gaps ** + ** Regular and interpolated DOSs ** + ** Band structures ** + ** Mulliken analysis ** + ** ELSI Support ** + ****************************************************************** + + ****************************************************************** + ** New/Experimental functionality: ** + ** use_local_index and load balancing support ** + ** Dielectric constant/absorption coefficents ** + ** Specifying restricted energy window ** + ** Cube files ** + ****************************************************************** + + ****************************************************************** + ** Known buggy functionality (in SOC code): ** + ** SOC-perturbed total energies are meaningless (DO NOT USE) ** + ****************************************************************** + + ****************************************************************** + ** Note: ** + ** You may see oscillations or blips in ** + ** high-lying conduction bands or slight sub-banding ** + ** in calculations. This is likely due to ** + ** to not enough empty bands being mixed into the ** + ** eigensolver, and you should increase ** + ** the keyword 'empty_states' until the behavior goes ** + ** away to fix it. ** + ** If you are feeling particularly paranoid, consider ** + ** setting the calculate_all_eigenstates flag in ** + ** control.in to calculate all empty states possible. ** + ** This is rarely needed. ** + ****************************************************************** + + ****************************************************************** + ** Future Developments: ** + ** Self-Consistency ** + ****************************************************************** + + Number of core states to omit from SOC : 0 + Number of high-lying states to omit from SOC : 0 + + Index of first SOC-perturbed state to save : 1 + Index of last SOC-perturbed state to save : 572 + + Allocating memory for main spin-orbit coupling matrices... + Allocating 4.992 MB for soc_ham + Allocating 4.992 MB for eigenvec_soc_wf_basis + Allocating 1.366 MB for KS_eigenvalue_soc_perturbed + Allocating 1.366 MB for occ_numbers_soc + Allocating 6.830 MB for spin_expectation + Allocating 0.004 MB for KS_eigenvalue_soc_perturbed_temp + Allocating 0.002 MB for sr_to_soc_idxmap + Allocating 0.022 MB for spin_expectation_temp + Allocating 194.705 MB for KS_eigenvector_soc_perturbed + Allocating 14.455 MB for soc_matrix + + Integrating SOC matrix: batch-based integration p2 version. + Allocating 0.187 MB for dist_tab + Allocating 0.187 MB for dist_tab_sq + Allocating 0.560 MB for dir_tab + Allocating 0.043 MB for i_basis_fns + Allocating 1.880 MB for i_basis_fns_inv + Allocating 0.043 MB for i_atom_fns + Allocating 4.182 MB for gradient_basis_wave + Allocating 0.008 MB for ylm_tab + Allocating 0.002 MB for radial_wave + Allocating 0.002 MB for radial_wave_deriv + Allocating 0.017 MB for i_basis + Allocating 9.950 MB for soc_shell + Allocating 0.023 MB for cartesians + Allocating 0.023 MB for sum_gradient + Allocating 0.047 MB for sum_hessian + Allocating 0.001 MB for potential_shell + + Largest matrix element of SOC matrix is 19.48826 + Sparsity of soc_matrix based on threshold of 0.19488E-13 is 0.43394 + + Determining occupation numbers for Kohn-Sham eigenstates using ELSI. + | Chemical potential (Fermi level) in eV : -.42420700E+01 + | Note that, for insulating systems, the printed 'chemical potential' value is not uniquely defined. + | It can be anywhere in the energy gap, as long as it correctly separates occupied and unoccupied states. + | In systems with a gap, the physically relevant chemical potential is the VBM or HOMO. + Writing SOC-perturbed Kohn-Sham eigenvalues. + K-point: 1 at 0.000000 0.000000 0.000000 (in units of recip. lattice) + + State Occupation Unperturbed Eigenvalue [eV] Eigenvalue [eV] Level Spacing [eV] + 1 1.00000 -75397.281329 -75397.281329 0.000000 + 2 1.00000 -75397.281329 -75397.281329 0.000000 + 3 1.00000 -32896.548696 -32896.548696 42500.732633 + 4 1.00000 -32896.548696 -32896.548696 0.000000 + 5 1.00000 -32895.962915 -32895.962915 0.585781 + 6 1.00000 -32895.962915 -32895.962915 0.000000 + 7 1.00000 -20362.763266 -20362.763266 12533.199649 + 8 1.00000 -20362.763266 -20362.763266 0.000000 + 9 1.00000 -12750.552877 -12750.552877 7612.210389 + 10 1.00000 -12750.552877 -12750.552877 0.000000 + 11 1.00000 -12749.884862 -12749.884862 0.668015 + 12 1.00000 -12749.884862 -12749.884862 0.000000 + 13 1.00000 -12249.266012 -12249.266012 500.618849 + 14 1.00000 -12249.266012 -12249.266012 0.000000 + 15 1.00000 -10692.812749 -11783.584557 465.681455 + 16 1.00000 -10692.812749 -11783.584557 0.000000 + 17 1.00000 -10692.810683 -10171.279436 1612.305121 + 18 1.00000 -10692.810683 -10171.279436 0.000000 + 19 1.00000 -10692.810677 -10171.275797 0.003639 + 20 1.00000 -10692.810677 -10171.275797 0.000000 + 21 1.00000 -4922.527293 -4922.527293 5248.748504 + 22 1.00000 -4922.527293 -4922.527293 0.000000 + 23 1.00000 -4921.941601 -4921.941601 0.585692 + 24 1.00000 -4921.941601 -4921.941601 0.000000 + 25 1.00000 -4414.342781 -4613.942200 307.999400 + 26 1.00000 -4414.342781 -4613.942200 0.000000 + 27 1.00000 -4414.342770 -4613.363409 0.578791 + 28 1.00000 -4414.342770 -4613.363409 0.000000 + 29 1.00000 -4414.332751 -4316.257024 297.106386 + 30 1.00000 -4414.332751 -4316.257024 0.000000 + 31 1.00000 -4413.757434 -4316.229346 0.027678 + 32 1.00000 -4413.757434 -4316.229346 0.000000 + 33 1.00000 -4413.757424 -4315.671622 0.557724 + 34 1.00000 -4413.757424 -4315.671622 0.000000 + 35 1.00000 -4413.745859 -4315.646548 0.025074 + 36 1.00000 -4413.745859 -4315.646548 0.000000 + 37 1.00000 -2843.127160 -2843.127160 1472.519388 + 38 1.00000 -2843.127160 -2843.127160 0.000000 + 39 1.00000 -2804.299398 -2804.299398 38.827762 + 40 1.00000 -2804.299398 -2804.299398 0.000000 + 41 1.00000 -2539.220606 -2613.920020 190.379379 + 42 1.00000 -2539.220606 -2613.920020 0.000000 + 43 1.00000 -2539.210550 -2561.532099 52.387921 + 44 1.00000 -2539.210550 -2561.532099 0.000000 + 45 1.00000 -2539.210535 -2502.206560 59.325539 + 46 1.00000 -2539.210535 -2502.206560 0.000000 + 47 1.00000 -2350.116824 -2502.200114 0.006446 + 48 1.00000 -2350.116824 -2502.200114 0.000000 + 49 1.00000 -2350.104855 -2229.843276 272.356838 + 50 1.00000 -2350.104855 -2229.843276 0.000000 + 51 1.00000 -2350.104835 -2229.841065 0.002210 + 52 1.00000 -2350.104835 -2229.841065 0.000000 + 53 1.00000 -1830.030560 -1869.605340 360.235726 + 54 1.00000 -1830.030560 -1869.605340 0.000000 + 55 1.00000 -1830.029360 -1869.598490 0.006850 + 56 1.00000 -1830.029360 -1869.598490 0.000000 + 57 1.00000 -1830.029349 -1803.850596 65.747894 + 58 1.00000 -1830.029349 -1803.850596 0.000000 + 59 1.00000 -1830.021166 -1803.848486 0.002110 + 60 1.00000 -1830.021166 -1803.848486 0.000000 + 61 1.00000 -1830.021164 -1803.841761 0.006725 + 62 1.00000 -1830.021164 -1803.841761 0.000000 + 63 1.00000 -1633.057011 -1633.057012 170.784749 + 64 1.00000 -1633.057011 -1633.057012 0.000000 + 65 1.00000 -1632.378043 -1632.378043 0.678968 + 66 1.00000 -1632.378043 -1632.378043 0.000000 + 67 1.00000 -1434.495714 -1463.067432 169.310612 + 68 1.00000 -1434.495714 -1463.067432 0.000000 + 69 1.00000 -1434.495699 -1462.389395 0.678037 + 70 1.00000 -1434.495699 -1462.389395 0.000000 + 71 1.00000 -1434.481531 -1420.279873 42.109522 + 72 1.00000 -1434.481531 -1420.279873 0.000000 + 73 1.00000 -1433.819426 -1420.270016 0.009857 + 74 1.00000 -1433.819426 -1420.270016 0.000000 + 75 1.00000 -1433.819412 -1419.603539 0.666477 + 76 1.00000 -1433.819412 -1419.603539 0.000000 + 77 1.00000 -1433.801368 -1419.590926 0.012613 + 78 1.00000 -1433.801368 -1419.590926 0.000000 + 79 1.00000 -985.263973 -985.263973 434.326953 + 80 1.00000 -985.263973 -985.263973 0.000000 + 81 1.00000 -984.678830 -984.678831 0.585143 + 82 1.00000 -984.678830 -984.678831 0.000000 + 83 1.00000 -820.375322 -855.953981 128.724850 + 84 1.00000 -820.375322 -855.953981 0.000000 + 85 1.00000 -820.375290 -855.375850 0.578130 + 86 1.00000 -820.375290 -855.375850 0.000000 + 87 1.00000 -820.339126 -801.572499 53.803351 + 88 1.00000 -820.339126 -801.572499 0.000000 + 89 1.00000 -819.790741 -801.530841 0.041658 + 90 1.00000 -819.790741 -801.530841 0.000000 + 91 1.00000 -819.790707 -800.987839 0.543002 + 92 1.00000 -819.790707 -800.987839 0.000000 + 93 1.00000 -819.751768 -800.947350 0.040489 + 94 1.00000 -819.751768 -800.947350 0.000000 + 95 1.00000 -585.564589 -585.564589 215.382761 + 96 1.00000 -585.564589 -585.564589 0.000000 + 97 1.00000 -571.921612 -578.361458 7.203131 + 98 1.00000 -571.921612 -578.361458 0.000000 + 99 1.00000 -571.921611 -578.338190 0.023268 + 100 1.00000 -571.921611 -578.338190 0.000000 + 101 1.00000 -571.896752 -577.776720 0.561470 + 102 1.00000 -571.896752 -577.776720 0.000000 + 103 1.00000 -571.896729 -577.751279 0.025441 + 104 1.00000 -571.896729 -577.751279 0.000000 + 105 1.00000 -571.888138 -567.638604 10.112675 + 106 1.00000 -571.888138 -567.638604 0.000000 + 107 1.00000 -571.337574 -567.618691 0.019914 + 108 1.00000 -571.337574 -567.618691 0.000000 + 109 1.00000 -571.337573 -567.608481 0.010210 + 110 1.00000 -571.337573 -567.608481 0.000000 + 111 1.00000 -571.310285 -567.054537 0.553944 + 112 1.00000 -571.310285 -567.054537 0.000000 + 113 1.00000 -571.310263 -567.032681 0.021856 + 114 1.00000 -571.310263 -567.032681 0.000000 + 115 1.00000 -571.300887 -567.021518 0.011162 + 116 1.00000 -571.300887 -567.021518 0.000000 + 117 1.00000 -492.728411 -492.728411 74.293108 + 118 1.00000 -492.728411 -492.728411 0.000000 + 119 1.00000 -436.857658 -481.435862 11.292549 + 120 1.00000 -436.857658 -481.435862 0.000000 + 121 1.00000 -436.848407 -407.602901 73.832961 + 122 1.00000 -436.848407 -407.602901 0.000000 + 123 1.00000 -436.848370 -407.600793 0.002108 + 124 1.00000 -436.848370 -407.600793 0.000000 + 125 1.00000 -392.899352 -404.835562 2.765231 + 126 1.00000 -392.899352 -404.835562 0.000000 + 127 1.00000 -392.863336 -386.674981 18.160581 + 128 1.00000 -392.863336 -386.674981 0.000000 + 129 1.00000 -392.863296 -386.651198 0.023783 + 130 1.00000 -392.863296 -386.651198 0.000000 + 131 1.00000 -248.211959 -255.802350 130.848848 + 132 1.00000 -248.211959 -255.802350 0.000000 + 133 1.00000 -248.211921 -255.797727 0.004623 + 134 1.00000 -248.211921 -255.797727 0.000000 + 135 1.00000 -248.207885 -242.994439 12.803288 + 136 1.00000 -248.207885 -242.994439 0.000000 + 137 1.00000 -248.203622 -242.993494 0.000945 + 138 1.00000 -248.203622 -242.993494 0.000000 + 139 1.00000 -248.203594 -242.987966 0.005528 + 140 1.00000 -248.203594 -242.987966 0.000000 + 141 1.00000 -230.773177 -232.744812 10.243154 + 142 1.00000 -230.773177 -232.744812 0.000000 + 143 1.00000 -230.765909 -232.722919 0.021893 + 144 1.00000 -230.765909 -232.722919 0.000000 + 145 1.00000 -230.765886 -229.455944 3.266975 + 146 1.00000 -230.765886 -229.455944 0.000000 + 147 1.00000 -230.742181 -229.446823 0.009121 + 148 1.00000 -230.742181 -229.446823 0.000000 + 149 1.00000 -230.742180 -229.427842 0.018981 + 150 1.00000 -230.742180 -229.427842 0.000000 + 151 1.00000 -222.857496 -222.857498 6.570344 + 152 1.00000 -222.857496 -222.857498 0.000000 + 153 1.00000 -222.162894 -222.162895 0.694603 + 154 1.00000 -222.162894 -222.162895 0.000000 + 155 1.00000 -172.302938 -172.302939 49.859956 + 156 1.00000 -172.302938 -172.302939 0.000000 + 157 1.00000 -171.709819 -171.709820 0.593119 + 158 1.00000 -171.709819 -171.709820 0.000000 + 159 1.00000 -160.375394 -164.305997 7.403823 + 160 1.00000 -160.375394 -164.305997 0.000000 + 161 1.00000 -160.375358 -163.610040 0.695957 + 162 1.00000 -160.375358 -163.610040 0.000000 + 163 1.00000 -160.329631 -158.352577 5.257463 + 164 1.00000 -160.329631 -158.352577 0.000000 + 165 1.00000 -159.684449 -158.321828 0.030749 + 166 1.00000 -159.684449 -158.321828 0.000000 + 167 1.00000 -159.684418 -157.661586 0.660242 + 168 1.00000 -159.684418 -157.661586 0.000000 + 169 1.00000 -159.625274 -157.621738 0.039849 + 170 1.00000 -159.625274 -157.621738 0.000000 + 171 1.00000 -120.766247 -127.211426 30.410312 + 172 1.00000 -120.766247 -127.211426 0.000000 + 173 1.00000 -120.766211 -126.623016 0.588410 + 174 1.00000 -120.766211 -126.623016 0.000000 + 175 1.00000 -120.684868 -117.181217 9.441799 + 176 1.00000 -120.684868 -117.181217 0.000000 + 177 1.00000 -120.173995 -117.103923 0.077294 + 178 1.00000 -120.173995 -117.103923 0.000000 + 179 1.00000 -120.173934 -116.588764 0.515159 + 180 1.00000 -120.173934 -116.588764 0.000000 + 181 1.00000 -120.084343 -116.510471 0.078293 + 182 1.00000 -120.084343 -116.510471 0.000000 + 183 1.00000 -83.744047 -83.744045 32.766426 + 184 1.00000 -83.744047 -83.744045 0.000000 + 185 1.00000 -70.299949 -70.299947 13.444099 + 186 1.00000 -70.299949 -70.299947 0.000000 + 187 1.00000 -57.329975 -57.848353 12.451594 + 188 1.00000 -57.329975 -57.848353 0.000000 + 189 1.00000 -57.329952 -57.814594 0.033759 + 190 1.00000 -57.329952 -57.814594 0.000000 + 191 1.00000 -57.294980 -57.156959 0.657634 + 192 1.00000 -57.294980 -57.156959 0.000000 + 193 1.00000 -57.294962 -57.112475 0.044484 + 194 1.00000 -57.294962 -57.112475 0.000000 + 195 1.00000 -57.279117 -56.980201 0.132274 + 196 1.00000 -57.279117 -56.980201 0.000000 + 197 1.00000 -56.640507 -56.952218 0.027984 + 198 1.00000 -56.640507 -56.952218 0.000000 + 199 1.00000 -56.640504 -56.935814 0.016403 + 200 1.00000 -56.640504 -56.935814 0.000000 + 201 1.00000 -56.594315 -56.290620 0.645194 + 202 1.00000 -56.594315 -56.290620 0.000000 + 203 1.00000 -56.594298 -56.253547 0.037074 + 204 1.00000 -56.594298 -56.253547 0.000000 + 205 1.00000 -56.575059 -56.232890 0.020657 + 206 1.00000 -56.575059 -56.232890 0.000000 + 207 1.00000 -46.614987 -52.416706 3.816184 + 208 1.00000 -46.614987 -52.416706 0.000000 + 209 1.00000 -46.489728 -46.068349 6.348357 + 210 1.00000 -46.489728 -46.068349 0.000000 + 211 1.00000 -46.489600 -45.996106 0.072242 + 212 1.00000 -46.489600 -45.996106 0.000000 + 213 1.00000 -45.206403 -45.472751 0.523355 + 214 1.00000 -45.206403 -45.472751 0.000000 + 215 1.00000 -45.206391 -45.398826 0.073925 + 216 1.00000 -45.206391 -45.398826 0.000000 + 217 1.00000 -45.122425 -44.627512 0.771314 + 218 1.00000 -45.122425 -44.627512 0.000000 + 219 1.00000 -45.122388 -44.566540 0.060972 + 220 1.00000 -45.122388 -44.566540 0.000000 + 221 1.00000 -45.119455 -44.540164 0.026376 + 222 1.00000 -45.119455 -44.540164 0.000000 + 223 1.00000 -44.624303 -44.538783 0.001381 + 224 1.00000 -44.624303 -44.538783 0.000000 + 225 1.00000 -44.624260 -44.024182 0.514601 + 226 1.00000 -44.624260 -44.024182 0.000000 + 227 1.00000 -44.534686 -43.965557 0.058625 + 228 1.00000 -44.534686 -43.965557 0.000000 + 229 1.00000 -44.534644 -43.930682 0.034874 + 230 1.00000 -44.534644 -43.930682 0.000000 + 231 1.00000 -44.514673 -42.240817 1.689866 + 232 1.00000 -44.514673 -42.240817 0.000000 + 233 1.00000 -43.020003 -42.092375 0.148442 + 234 1.00000 -43.020003 -42.092375 0.000000 + 235 1.00000 -42.816667 -42.074862 0.017513 + 236 1.00000 -42.816667 -42.074862 0.000000 + 237 1.00000 -42.816551 -41.933678 0.141184 + 238 1.00000 -42.816551 -41.933678 0.000000 + 239 1.00000 -38.534056 -39.801475 2.132203 + 240 1.00000 -38.534056 -39.801475 0.000000 + 241 1.00000 -38.533991 -39.796397 0.005077 + 242 1.00000 -38.533991 -39.796397 0.000000 + 243 1.00000 -38.529247 -39.791759 0.004639 + 244 1.00000 -38.529247 -39.791759 0.000000 + 245 1.00000 -38.524749 -37.583216 2.208543 + 246 1.00000 -38.524749 -37.583216 0.000000 + 247 1.00000 -38.524721 -37.577560 0.005656 + 248 1.00000 -38.524721 -37.577560 0.000000 + 249 1.00000 -38.520268 -37.574984 0.002576 + 250 1.00000 -38.520268 -37.574984 0.000000 + 251 1.00000 -38.517870 -37.570636 0.004348 + 252 1.00000 -38.517870 -37.570636 0.000000 + 253 1.00000 -21.575404 -21.570306 16.000330 + 254 1.00000 -21.575404 -21.570306 0.000000 + 255 1.00000 -20.510649 -20.510239 1.060068 + 256 1.00000 -20.510649 -20.510239 0.000000 + 257 1.00000 -19.907655 -19.866999 0.643240 + 258 1.00000 -19.907655 -19.866999 0.000000 + 259 1.00000 -19.124225 -19.121739 0.745260 + 260 1.00000 -19.124225 -19.121739 0.000000 + 261 1.00000 -12.666782 -12.666457 6.455282 + 262 1.00000 -12.666782 -12.666457 0.000000 + 263 1.00000 -11.351599 -11.352710 1.313746 + 264 1.00000 -11.351599 -11.352710 0.000000 + 265 1.00000 -8.793692 -8.842937 2.509773 + 266 1.00000 -8.793692 -8.842937 0.000000 + 267 1.00000 -8.531385 -8.608253 0.234685 + 268 1.00000 -8.531385 -8.608253 0.000000 + 269 1.00000 -8.531106 -8.431629 0.176624 + 270 1.00000 -8.531106 -8.431629 0.000000 + 271 1.00000 -7.807887 -7.932691 0.498938 + 272 1.00000 -7.807887 -7.932691 0.000000 + 273 1.00000 -7.807085 -7.787680 0.145011 + 274 1.00000 -7.807085 -7.787680 0.000000 + 275 1.00000 -7.777429 -7.714623 0.073057 + 276 1.00000 -7.777429 -7.714623 0.000000 + 277 1.00000 -6.941517 -7.096980 0.617644 + 278 1.00000 -6.941517 -7.096980 0.000000 + 279 1.00000 -6.940755 -6.763328 0.333652 + 280 1.00000 -6.940755 -6.763328 0.000000 + 281 1.00000 -6.418589 -6.521498 0.241830 + 282 1.00000 -6.418589 -6.521498 0.000000 + 283 1.00000 -6.418064 -6.311330 0.210168 + 284 1.00000 -6.418064 -6.311330 0.000000 + 285 1.00000 -6.199064 -6.129498 0.181832 + 286 1.00000 -6.199064 -6.129498 0.000000 + 287 1.00000 -5.685919 -5.661785 0.467713 + 288 1.00000 -5.685919 -5.661785 0.000000 + 289 0.00000 -2.495381 -2.605640 3.056145 + 290 0.00000 -2.495381 -2.605640 0.000000 + 291 0.00000 -2.494197 -2.379467 0.226172 + 292 0.00000 -2.494197 -2.379467 0.000000 + 293 0.00000 -2.007020 -2.119105 0.260362 + 294 0.00000 -2.007020 -2.119105 0.000000 + 295 0.00000 -2.006125 -1.932876 0.186228 + 296 0.00000 -2.006125 -1.932876 0.000000 + 297 0.00000 -1.676219 -1.889011 0.043865 + 298 0.00000 -1.676219 -1.889011 0.000000 + 299 0.00000 -1.675835 -1.450244 0.438767 + 300 0.00000 -1.675835 -1.450244 0.000000 + 301 0.00000 -1.149046 -1.300121 0.150123 + 302 0.00000 -1.149046 -1.300121 0.000000 + 303 0.00000 -1.147879 -0.770363 0.529758 + 304 0.00000 -1.147879 -0.770363 0.000000 + 305 0.00000 -0.631113 -0.624051 0.146312 + 306 0.00000 -0.631113 -0.624051 0.000000 + 307 0.00000 0.923897 0.931621 1.555672 + 308 0.00000 0.923897 0.931621 0.000000 + 309 0.00000 1.521610 1.574493 0.642872 + 310 0.00000 1.521610 1.574493 0.000000 + 311 0.00000 2.686503 2.706670 1.132177 + 312 0.00000 2.686503 2.706670 0.000000 + 313 0.00000 3.155966 3.160783 0.454112 + 314 0.00000 3.155966 3.160783 0.000000 + 315 0.00000 3.638222 3.635752 0.474969 + 316 0.00000 3.638222 3.635752 0.000000 + 317 0.00000 4.531021 4.529741 0.893989 + 318 0.00000 4.531021 4.529741 0.000000 + 319 0.00000 5.113540 5.038357 0.508616 + 320 0.00000 5.113540 5.038357 0.000000 + 321 0.00000 5.114111 5.315956 0.277598 + 322 0.00000 5.114111 5.315956 0.000000 + 323 0.00000 5.878793 5.875217 0.559261 + 324 0.00000 5.878793 5.875217 0.000000 + 325 0.00000 5.879791 5.886650 0.011433 + 326 0.00000 5.879791 5.886650 0.000000 + 327 0.00000 6.062320 6.085096 0.198446 + 328 0.00000 6.062320 6.085096 0.000000 + 329 0.00000 7.016652 7.025139 0.940043 + 330 0.00000 7.016652 7.025139 0.000000 + 331 0.00000 7.629690 7.582171 0.557032 + 332 0.00000 7.629690 7.582171 0.000000 + 333 0.00000 7.718581 7.745464 0.163293 + 334 0.00000 7.718581 7.745464 0.000000 + 335 0.00000 7.720812 7.809370 0.063906 + 336 0.00000 7.720812 7.809370 0.000000 + 337 0.00000 8.075448 8.084657 0.275286 + 338 0.00000 8.075448 8.084657 0.000000 + 339 0.00000 8.432471 8.441628 0.356971 + 340 0.00000 8.432471 8.441628 0.000000 + 341 0.00000 8.434901 8.445506 0.003879 + 342 0.00000 8.434901 8.445506 0.000000 + 343 0.00000 9.048476 9.066636 0.621130 + 344 0.00000 9.048476 9.066636 0.000000 + 345 0.00000 10.303304 10.304762 1.238125 + 346 0.00000 10.303304 10.304762 0.000000 + 347 0.00000 11.150775 11.088596 0.783834 + 348 0.00000 11.150775 11.088596 0.000000 + 349 0.00000 11.159343 11.259344 0.170749 + 350 0.00000 11.159343 11.259344 0.000000 + 351 0.00000 11.823622 11.802266 0.542921 + 352 0.00000 11.823622 11.802266 0.000000 + 353 0.00000 11.834838 11.858920 0.056655 + 354 0.00000 11.834838 11.858920 0.000000 + 355 0.00000 12.201152 12.122262 0.263342 + 356 0.00000 12.201152 12.122262 0.000000 + 357 0.00000 12.218715 12.296229 0.173967 + 358 0.00000 12.218715 12.296229 0.000000 + 359 0.00000 12.406017 12.325424 0.029195 + 360 0.00000 12.406017 12.325424 0.000000 + 361 0.00000 12.484132 12.586442 0.261018 + 362 0.00000 12.484132 12.586442 0.000000 + 363 0.00000 12.496346 12.617398 0.030955 + 364 0.00000 12.496346 12.617398 0.000000 + 365 0.00000 13.383022 13.387889 0.770491 + 366 0.00000 13.383022 13.387889 0.000000 + 367 0.00000 14.037009 14.048146 0.660257 + 368 0.00000 14.037009 14.048146 0.000000 + 369 0.00000 14.635805 14.626259 0.578114 + 370 0.00000 14.635805 14.626259 0.000000 + 371 0.00000 14.645605 14.723987 0.097728 + 372 0.00000 14.645605 14.723987 0.000000 + 373 0.00000 14.976937 14.972034 0.248046 + 374 0.00000 14.976937 14.972034 0.000000 + 375 0.00000 14.987938 15.005438 0.033405 + 376 0.00000 14.987938 15.005438 0.000000 + 377 0.00000 15.053263 15.118643 0.113204 + 378 0.00000 15.053263 15.118643 0.000000 + 379 0.00000 16.527771 16.526734 1.408091 + 380 0.00000 16.527771 16.526734 0.000000 + 381 0.00000 17.556078 17.514031 0.987297 + 382 0.00000 17.556078 17.514031 0.000000 + 383 0.00000 17.796292 17.710400 0.196368 + 384 0.00000 17.796292 17.710400 0.000000 + 385 0.00000 17.803078 18.174569 0.464169 + 386 0.00000 17.803078 18.174569 0.000000 + 387 0.00000 18.411143 18.336236 0.161667 + 388 0.00000 18.411143 18.336236 0.000000 + 389 0.00000 18.437200 18.539929 0.203693 + 390 0.00000 18.437200 18.539929 0.000000 + 391 0.00000 19.177243 19.211820 0.671891 + 392 0.00000 19.177243 19.211820 0.000000 + 393 0.00000 20.570444 20.556280 1.344460 + 394 0.00000 20.570444 20.556280 0.000000 + 395 0.00000 20.595701 20.713176 0.156896 + 396 0.00000 20.595701 20.713176 0.000000 + 397 0.00000 20.847171 20.836396 0.123220 + 398 0.00000 20.847171 20.836396 0.000000 + 399 0.00000 20.871491 20.927996 0.091600 + 400 0.00000 20.871491 20.927996 0.000000 + 401 0.00000 21.476021 21.487487 0.559491 + 402 0.00000 21.476021 21.487487 0.000000 + 403 0.00000 22.116634 22.193510 0.706022 + 404 0.00000 22.116634 22.193510 0.000000 + 405 0.00000 23.337031 23.270666 1.077156 + 406 0.00000 23.337031 23.270666 0.000000 + 407 0.00000 23.356104 23.550914 0.280248 + 408 0.00000 23.356104 23.550914 0.000000 + 409 0.00000 23.985645 23.980423 0.429509 + 410 0.00000 23.985645 23.980423 0.000000 + 411 0.00000 24.124113 24.087180 0.106757 + 412 0.00000 24.124113 24.087180 0.000000 + 413 0.00000 24.173416 24.321915 0.234735 + 414 0.00000 24.173416 24.321915 0.000000 + 415 0.00000 24.740799 24.785088 0.463173 + 416 0.00000 24.740799 24.785088 0.000000 + 417 0.00000 27.494385 27.494461 2.709373 + 418 0.00000 27.494385 27.494461 0.000000 + 419 0.00000 27.840918 27.840918 0.346457 + 420 0.00000 27.840918 27.840918 0.000000 + 421 0.00000 28.194315 28.182904 0.341986 + 422 0.00000 28.194315 28.182904 0.000000 + 423 0.00000 28.224438 28.245645 0.062741 + 424 0.00000 28.224438 28.245645 0.000000 + 425 0.00000 28.368115 28.344534 0.098889 + 426 0.00000 28.368115 28.344534 0.000000 + 427 0.00000 28.377577 28.423058 0.078524 + 428 0.00000 28.377577 28.423058 0.000000 + 429 0.00000 28.682379 28.693946 0.270888 + 430 0.00000 28.682379 28.693946 0.000000 + 431 0.00000 29.038709 29.056032 0.362086 + 432 0.00000 29.038709 29.056032 0.000000 + 433 0.00000 30.795587 30.780411 1.724379 + 434 0.00000 30.795587 30.780411 0.000000 + 435 0.00000 30.848500 30.885252 0.104841 + 436 0.00000 30.848500 30.885252 0.000000 + 437 0.00000 31.047790 31.047789 0.162537 + 438 0.00000 31.047790 31.047789 0.000000 + 439 0.00000 31.440875 31.435349 0.387560 + 440 0.00000 31.440875 31.435349 0.000000 + 441 0.00000 31.502964 31.515045 0.079695 + 442 0.00000 31.502964 31.515045 0.000000 + 443 0.00000 31.656522 31.657587 0.142543 + 444 0.00000 31.656522 31.657587 0.000000 + 445 0.00000 31.925055 31.934966 0.277378 + 446 0.00000 31.925055 31.934966 0.000000 + 447 0.00000 33.535871 33.536466 1.601500 + 448 0.00000 33.535871 33.536466 0.000000 + 449 0.00000 34.303308 34.349049 0.812583 + 450 0.00000 34.303308 34.349049 0.000000 + 451 0.00000 35.419245 35.406997 1.057948 + 452 0.00000 35.419245 35.406997 0.000000 + 453 0.00000 35.439172 35.492080 0.085083 + 454 0.00000 35.439172 35.492080 0.000000 + 455 0.00000 36.150148 36.138974 0.646894 + 456 0.00000 36.150148 36.138974 0.000000 + 457 0.00000 36.172380 36.189565 0.050591 + 458 0.00000 36.172380 36.189565 0.000000 + 459 0.00000 36.862705 36.864202 0.674637 + 460 0.00000 36.862705 36.864202 0.000000 + 461 0.00000 37.481630 37.484247 0.620045 + 462 0.00000 37.481630 37.484247 0.000000 + 463 0.00000 37.484288 37.500503 0.016257 + 464 0.00000 37.484288 37.500503 0.000000 + 465 0.00000 38.213291 38.213289 0.712786 + 466 0.00000 38.213291 38.213289 0.000000 + 467 0.00000 38.337699 38.327817 0.114528 + 468 0.00000 38.337699 38.327817 0.000000 + 469 0.00000 38.339863 38.349166 0.021350 + 470 0.00000 38.339863 38.349166 0.000000 + 471 0.00000 38.454255 38.481056 0.131890 + 472 0.00000 38.454255 38.481056 0.000000 + 473 0.00000 38.650985 38.650985 0.169929 + 474 0.00000 38.650985 38.650985 0.000000 + 475 0.00000 39.613052 39.560424 0.909439 + 476 0.00000 39.613052 39.560424 0.000000 + 477 0.00000 39.636877 39.795770 0.235345 + 478 0.00000 39.636877 39.795770 0.000000 + 479 0.00000 39.850111 39.814522 0.018752 + 480 0.00000 39.850111 39.814522 0.000000 + 481 0.00000 39.872959 39.962026 0.147504 + 482 0.00000 39.872959 39.962026 0.000000 + 483 0.00000 40.066002 40.067896 0.105871 + 484 0.00000 40.066002 40.067896 0.000000 + 485 0.00000 41.192521 41.124005 1.056109 + 486 0.00000 41.192521 41.124005 0.000000 + 487 0.00000 41.221705 41.200299 0.076293 + 488 0.00000 41.221705 41.200299 0.000000 + 489 0.00000 41.238833 41.395817 0.195518 + 490 0.00000 41.238833 41.395817 0.000000 + 491 0.00000 41.666477 41.585194 0.189377 + 492 0.00000 41.666477 41.585194 0.000000 + 493 0.00000 41.672539 41.768561 0.183366 + 494 0.00000 41.672539 41.768561 0.000000 + 495 0.00000 43.764784 43.698036 1.929476 + 496 0.00000 43.764784 43.698036 0.000000 + 497 0.00000 43.771641 43.910964 0.212928 + 498 0.00000 43.771641 43.910964 0.000000 + 499 0.00000 45.437818 45.246325 1.335361 + 500 0.00000 45.437818 45.246325 0.000000 + 501 0.00000 45.469840 45.690443 0.444118 + 502 0.00000 45.469840 45.690443 0.000000 + 503 0.00000 47.101243 47.111998 1.421555 + 504 0.00000 47.101243 47.111998 0.000000 + 505 0.00000 47.604597 47.581432 0.469434 + 506 0.00000 47.604597 47.581432 0.000000 + 507 0.00000 47.614086 47.642097 0.060665 + 508 0.00000 47.614086 47.642097 0.000000 + 509 0.00000 48.067049 48.076157 0.434060 + 510 0.00000 48.067049 48.076157 0.000000 + 511 0.00000 48.333687 48.290192 0.214035 + 512 0.00000 48.333687 48.290192 0.000000 + 513 0.00000 48.357469 48.434725 0.144533 + 514 0.00000 48.357469 48.434725 0.000000 + 515 0.00000 48.560280 48.560675 0.125949 + 516 0.00000 48.560280 48.560675 0.000000 + 517 0.00000 49.144367 48.941897 0.381223 + 518 0.00000 49.144367 48.941897 0.000000 + 519 0.00000 49.166140 49.144371 0.202474 + 520 0.00000 49.166140 49.144371 0.000000 + 521 0.00000 49.173999 49.455534 0.311162 + 522 0.00000 49.173999 49.455534 0.000000 + 523 0.00000 51.015082 50.814934 1.359400 + 524 0.00000 51.015082 50.814934 0.000000 + 525 0.00000 51.031661 51.255333 0.440399 + 526 0.00000 51.031661 51.255333 0.000000 + 527 0.00000 51.974703 52.016771 0.761438 + 528 0.00000 51.974703 52.016771 0.000000 + 529 0.00000 57.842871 57.272572 5.255801 + 530 0.00000 57.842871 57.272572 0.000000 + 531 0.00000 57.845932 57.854839 0.582266 + 532 0.00000 57.845932 57.854839 0.000000 + 533 0.00000 58.298774 58.492210 0.637372 + 534 0.00000 58.298774 58.492210 0.000000 + 535 0.00000 58.305726 58.814720 0.322510 + 536 0.00000 58.305726 58.814720 0.000000 + 537 0.00000 59.125027 59.156164 0.341444 + 538 0.00000 59.125027 59.156164 0.000000 + 539 0.00000 60.418372 60.278614 1.122450 + 540 0.00000 60.418372 60.278614 0.000000 + 541 0.00000 60.420652 60.706418 0.427804 + 542 0.00000 60.420652 60.706418 0.000000 + 543 0.00000 61.539316 61.373816 0.667398 + 544 0.00000 61.539316 61.373816 0.000000 + 545 0.00000 61.640310 61.543630 0.169814 + 546 0.00000 61.640310 61.543630 0.000000 + 547 0.00000 61.645907 61.952638 0.409008 + 548 0.00000 61.645907 61.952638 0.000000 + 549 0.00000 61.958923 61.967619 0.014981 + 550 0.00000 61.958923 61.967619 0.000000 + 551 0.00000 61.962875 62.117690 0.150071 + 552 0.00000 61.962875 62.117690 0.000000 + 553 0.00000 63.461437 63.483695 1.366005 + 554 0.00000 63.461437 63.483695 0.000000 + 555 0.00000 63.659025 63.658177 0.174482 + 556 0.00000 63.659025 63.658177 0.000000 + 557 0.00000 63.670115 63.676724 0.018547 + 558 0.00000 63.670115 63.676724 0.000000 + 559 0.00000 64.358671 64.362142 0.685418 + 560 0.00000 64.358671 64.362142 0.000000 + 561 0.00000 65.267798 65.267807 0.905666 + 562 0.00000 65.267798 65.267807 0.000000 + 563 0.00000 66.408740 66.083380 0.815573 + 564 0.00000 66.408740 66.083380 0.000000 + 565 0.00000 66.416187 66.825412 0.742032 + 566 0.00000 66.416187 66.825412 0.000000 + 567 0.00000 67.071917 66.997103 0.171691 + 568 0.00000 67.071917 66.997103 0.000000 + 569 0.00000 67.077572 67.272159 0.275055 + 570 0.00000 67.077572 67.272159 0.000000 + 571 0.00000 67.272261 67.529094 0.256936 + 572 0.00000 67.272261 67.529094 0.000000 + + What follows are estimated values for band gap, HOMO, LUMO, etc. + | They are estimated on a discrete k-point grid and not necessarily exact. + | For converged numbers, create a DOS and/or band structure plot on a denser k-grid. + + Highest occupied state (VBM) at -5.40200629 eV (relative to internal zero) + | Occupation number: 1.00000000 + | K-point: 152 at 0.320000 0.360000 0.000000 (in units of recip. lattice) + + Lowest unoccupied state (CBM) at -4.20383680 eV (relative to internal zero) + | Occupation number: 0.00000003 + | K-point: 99 at 0.200000 0.600000 0.000000 (in units of recip. lattice) + + ESTIMATED overall HOMO-LUMO gap: 1.19816948 eV between HOMO at k-point 152 and LUMO at k-point 99 + | This appears to be an indirect band gap. + | Smallest direct gap : 1.27357279 eV for k_point 151 at 0.320000 0.320000 0.000000 (in units of recip. lattice) + The gap value is above 0.2 eV. Unless you are using a very sparse k-point grid, + this system is most likely an insulator or a semiconductor. + | Potential vacuum level, "upper" slab surface: -1.11020586 eV + | Potential vacuum level, "lower" slab surface: 0.43208563 eV + | Work function ("upper" slab surface) : 3.13186418 eV + | Work function ("lower" slab surface) : 4.67415567 eV + *** Warning: band gap may exist, check the suitability to define work function using chemical potential. + | VBM (reference: upper vacuum level) : 4.29180043 eV + | CBM (reference: upper vacuum level) : 3.09363095 eV + Calculating total density of states ... + | Chemical potential is -4.242070 eV. + | writing DOS (shifted by electron chemical potential) to file KS_DOS_total.dat + | writing DOS (raw data) to file KS_DOS_total_raw.dat + | Note that, for insulating systems, the printed 'chemical potential' value is not uniquely defined. + | It can be anywhere in the energy gap, as long as it correctly separates occupied and unoccupied states. + | In systems with a gap, the physically relevant chemical potential is the VBM or HOMO. + + + Spin-orbit coupling : max(cpu_time) wall_clock(cpu1) + | Computing matrix elements for SOC operator : 69.968 73.172 + | Constructing second-variational Hamiltonian : 4.413 4.567 + | Diagonalizing second-variational Hamiltonian : 50.095 52.073 + | Constructing SOC-perturbed eigenvectors : 1.814 1.884 + | Syncing data and calculating occupations : 10.504 0.090 + | Writing out data, calculating band gaps, etc. : 0.687 0.693 + | Total SOC time : 132.154 132.499 + + Partial memory accounting: + | Current value for overall tracked memory usage: + | Minimum: 258.162 MB (on task 0) + | Maximum: 264.402 MB (on task 1) + | Average: 258.942 MB + | Peak value for overall tracked memory usage: + | Minimum: 1023.924 MB (on task 7 after allocating ovlp3fn2) + | Maximum: 2253.341 MB (on task 6 after allocating ovlp3fn_nosplit%m) + | Average: 1684.765 MB + | Largest tracked array allocation so far: + | Minimum: 510.595 MB (ovlp3fn_nosplit%dat on task 7) + | Maximum: 1608.479 MB (ovlp3fn_nosplit%dat on task 6) + | Average: 1141.214 MB + Note: These values currently only include a subset of arrays which are explicitly tracked. + The "true" memory usage will be greater. + ------------------------------------------------------------ + Work function related results without post-SCF corrections: + ------------------------------------------------------------ + + | Chemical Potential : -5.47044379 eV + | Note that, for insulating systems, the printed 'chemical potential' value is not uniquely defined. + | It can be anywhere in the energy gap, as long as it correctly separates occupied and unoccupied states. + | In systems with a gap, the physically relevant chemical potential is the VBM or HOMO. + Writing energy levels: + | Potential vacuum level, "upper" slab surface: -1.11020586 eV + | Potential vacuum level, "lower" slab surface: 0.43208563 eV + | Work function ("upper" slab surface) : 4.36023793 eV + | Work function ("lower" slab surface) : 5.90252942 eV + *** Warning: band gap may exist, check the suitability to define work function using chemical potential. + | VBM (reference: upper vacuum level) : 4.39996220 eV + | CBM (reference: upper vacuum level) : 3.01764278 eV + ------------------------------------------------------------ + Work function related results including post-SCF second variational SOC corrections: + ------------------------------------------------------------ + + | Chemical Potential : -4.24207004 eV + | Note that, for insulating systems, the printed 'chemical potential' value is not uniquely defined. + | It can be anywhere in the energy gap, as long as it correctly separates occupied and unoccupied states. + | In systems with a gap, the physically relevant chemical potential is the VBM or HOMO. + Writing energy levels: + | Potential vacuum level, "upper" slab surface: -1.11020586 eV + | Potential vacuum level, "lower" slab surface: 0.43208563 eV + | Work function ("upper" slab surface) : 3.13186418 eV + | Work function ("lower" slab surface) : 4.67415567 eV + *** Warning: band gap may exist, check the suitability to define work function using chemical potential. + | VBM (reference: upper vacuum level) : 4.29180043 eV + | CBM (reference: upper vacuum level) : 3.09363095 eV + ------------------------------------------------------------ + + ------------------------------------------------------------ + Starting Mulliken Analysis + ------------------------------------------------------------ + + Performing scalar-relativistic Mulliken charge analysis on all atoms. + Full analysis (per state, per k-point, etc.) will NOT be written to separate file 'Mulliken.out.no_soc'. + This file can be requested by stating 'output mulliken' explicitly. + Summary of the per-atom charge analysis: + | + | atom electrons charge l=0 l=1 l=2 l=3 l=4 + | 1 41.923307 0.076693 8.220548 18.707886 14.918590 0.066796 0.009487 + | 2 73.889834 0.110166 10.400388 24.759551 24.631958 14.088523 0.009413 + | 3 34.028796 -0.028796 7.885998 15.935472 10.167724 0.039602 + | 4 52.046954 -0.046954 9.851300 21.780090 20.272277 0.119951 0.023335 + | 5 34.062137 -0.062137 7.874747 15.961790 10.184714 0.040885 + | 6 52.048972 -0.048972 9.846689 21.773367 20.283131 0.123032 0.022753 + | + | Total 288.000000 0.000000 + + + Calculating atom-projected density of states ... + | Chemical potential is -5.470444 eV. + | Note that, for insulating systems, the printed 'chemical potential' value is not uniquely defined. + | It can be anywhere in the energy gap, as long as it correctly separates occupied and unoccupied states. + | In systems with a gap, the physically relevant chemical potential is the VBM or HOMO. + | writing projected DOS (shifted by the chemical potential) for species Mo to file atom_proj_dos_Mo0001.dat.no_soc. + | writing projected DOS (raw data) for species Mo to file atom_proj_dos_Mo0001_raw.dat.no_soc. + | writing projected DOS (shifted by the chemical potential) for species W to file atom_proj_dos_W0002.dat.no_soc. + | writing projected DOS (raw data) for species W to file atom_proj_dos_W0002_raw.dat.no_soc. + | writing projected DOS (shifted by the chemical potential) for species Se to file atom_proj_dos_Se0003.dat.no_soc. + | writing projected DOS (raw data) for species Se to file atom_proj_dos_Se0003_raw.dat.no_soc. + | writing projected DOS (shifted by the chemical potential) for species Te to file atom_proj_dos_Te0004.dat.no_soc. + | writing projected DOS (raw data) for species Te to file atom_proj_dos_Te0004_raw.dat.no_soc. + | writing projected DOS (shifted by the chemical potential) for species Se to file atom_proj_dos_Se0005.dat.no_soc. + | writing projected DOS (raw data) for species Se to file atom_proj_dos_Se0005_raw.dat.no_soc. + | writing projected DOS (shifted by the chemical potential) for species Te to file atom_proj_dos_Te0006.dat.no_soc. + | writing projected DOS (raw data) for species Te to file atom_proj_dos_Te0006_raw.dat.no_soc. + + Performing spin-orbit-coupled Mulliken charge analysis on all atoms. +*** output_mulliken expected pure occ_numbers +*** sum(occ_numbers) = 4.5214000000032043E+04 instead of 2.8800000000000000E+02 + Full analysis (per state, per k-point, etc.) will NOT be written to separate file 'Mulliken.out.no_soc'. + This file can be requested by stating 'output mulliken' explicitly. + Summary of the per-atom charge analysis: + | + | atom electrons charge l=0 l=1 l=2 l=3 l=4 + | 1 41.934860 0.065140 8.218798 18.708571 14.931359 0.066696 0.009436 + | 2 73.909299 0.090701 10.397036 24.766484 24.648327 14.088232 0.009220 + | 3 34.026777 -0.026777 7.885897 15.933519 10.167754 0.039607 + | 4 52.037552 -0.037552 9.851215 21.770494 20.272792 0.119761 0.023290 + | 5 34.054451 -0.054451 7.872627 15.962431 10.180031 0.039362 + | 6 52.037060 -0.037060 9.845985 21.771713 20.277902 0.119876 0.021585 + | + | Total 288.000000 -0.000000 + + + Calculating atom-projected density of states ... + | Chemical potential is -4.242070 eV. + | Note that, for insulating systems, the printed 'chemical potential' value is not uniquely defined. + | It can be anywhere in the energy gap, as long as it correctly separates occupied and unoccupied states. + | In systems with a gap, the physically relevant chemical potential is the VBM or HOMO. + | writing projected DOS (shifted by the chemical potential) for species Mo to file atom_proj_dos_Mo0001.dat. + | writing projected DOS (raw data) for species Mo to file atom_proj_dos_Mo0001_raw.dat. + | writing projected DOS (shifted by the chemical potential) for species W to file atom_proj_dos_W0002.dat. + | writing projected DOS (raw data) for species W to file atom_proj_dos_W0002_raw.dat. + | writing projected DOS (shifted by the chemical potential) for species Se to file atom_proj_dos_Se0003.dat. + | writing projected DOS (raw data) for species Se to file atom_proj_dos_Se0003_raw.dat. + | writing projected DOS (shifted by the chemical potential) for species Te to file atom_proj_dos_Te0004.dat. + | writing projected DOS (raw data) for species Te to file atom_proj_dos_Te0004_raw.dat. + | writing projected DOS (shifted by the chemical potential) for species Se to file atom_proj_dos_Se0005.dat. + | writing projected DOS (raw data) for species Se to file atom_proj_dos_Se0005_raw.dat. + | writing projected DOS (shifted by the chemical potential) for species Te to file atom_proj_dos_Te0006.dat. + | writing projected DOS (raw data) for species Te to file atom_proj_dos_Te0006_raw.dat. + Mulliken analysis : max(cpu_time) wall_clock(cpu1) + | Time for Mulliken analysis (scalar relativistic) : 67.875 69.860 + | Time for Mulliken analysis (spin-orbit coupled) : 272.921 280.614 + | Total time for Mulliken analysis : 340.796 350.474 +------------------------------------------------------------ + ------------------------------------------------------------ + Starting Dielectric Calculations + ------------------------------------------------------------ + + Recalculating HOMO and LUMO levels to determine eigenstates needed for dielectric calculations... + + What follows are estimated values for band gap, HOMO, LUMO, etc. + | They are estimated on a discrete k-point grid and not necessarily exact. + | For converged numbers, create a DOS and/or band structure plot on a denser k-grid. + + Highest occupied state (VBM) at -5.40200629 eV (relative to internal zero) + | Occupation number: 1.00000000 + | K-point: 152 at 0.320000 0.360000 0.000000 (in units of recip. lattice) + + Lowest unoccupied state (CBM) at -4.20383680 eV (relative to internal zero) + | Occupation number: 0.00000003 + | K-point: 99 at 0.200000 0.600000 0.000000 (in units of recip. lattice) + + ESTIMATED overall HOMO-LUMO gap: 1.19816948 eV between HOMO at k-point 152 and LUMO at k-point 99 + | This appears to be an indirect band gap. + | Smallest direct gap : 1.27357279 eV for k_point 151 at 0.320000 0.320000 0.000000 (in units of recip. lattice) + The gap value is above 0.2 eV. Unless you are using a very sparse k-point grid, + this system is most likely an insulator or a semiconductor. + + Index of first state to include in dielectric calculations : 253 + Index of last state to include in dielectric calculations : 378 + + Allocating memory for main dielectric-related matrices... + Allocating 0.000 MB for omega_plasma_sq + Allocating 0.046 MB for interband_polarizability + Allocating 0.046 MB for intraband_polarizability + Allocating 0.046 MB for dielectric + Allocating 0.023 MB for absorption_coeff + Allocating 4.818 MB for mommat_full_x_up + Allocating 4.818 MB for mommat_full_x_low + Allocating 4.818 MB for mommat_full_y_up + Allocating 4.818 MB for mommat_full_y_low + Allocating 4.818 MB for mommat_full_z_up + Allocating 4.818 MB for mommat_full_z_low + Allocating 0.366 MB for moment_TZ + + Calculating p_x matrix elements... + Integrating real-space momentum matrix: batch-based integration. + Time summed over all CPUs for integration: real work 164.131 s, elapsed 183.458 s + + Calculating p_y matrix elements... + Integrating real-space momentum matrix: batch-based integration. + Time summed over all CPUs for integration: real work 170.118 s, elapsed 189.178 s + + Calculating p_z matrix elements... + Integrating real-space momentum matrix: batch-based integration. + Time summed over all CPUs for integration: real work 160.675 s, elapsed 177.687 s + + Calculating dielectric tensor elements... + Performing Kramers-Kronig transform for interband contribution to dielectric component # 1 + Performing Kramers-Kronig transform for interband contribution to dielectric component # 2 + Performing Kramers-Kronig transform for interband contribution to dielectric component # 3 + + Summary for dielectric component # x_x + | Broadening parameters : 5.00000E-02 eV (Gaussian) + | Plasma frequency : 6.12519E-03 eV + | Minimum omega value : 5.00000E-03 eV + | Epsilon at minimum omega : 5.41864E+00 + + + Summary for dielectric component # y_y + | Broadening parameters : 5.00000E-02 eV (Gaussian) + | Plasma frequency : 6.56166E-03 eV + | Minimum omega value : 5.00000E-03 eV + | Epsilon at minimum omega : 5.41857E+00 + + + Summary for dielectric component # z_z + | Broadening parameters : 5.00000E-02 eV (Gaussian) + | Plasma frequency : 1.75279E-06 eV + | Minimum omega value : 5.00000E-03 eV + | Epsilon at minimum omega : 3.51307E+00 + + Dielectric calculations : max(cpu_time) wall_clock(cpu1) + | Time for real-space momentum matrix integration : 66.085 68.865 + | Time for calculating momentum matrix elements : 2.186 2.254 + | Time for plasma frequency and interband contributions : 95.749 98.262 + | Time for syncing and postprocessing : 0.178 0.182 + | Total time for dielectric calculations : 164.205 169.582 + + Partial memory accounting: + | Current value for overall tracked memory usage: + | Minimum: 258.162 MB (on task 0) + | Maximum: 264.402 MB (on task 1) + | Average: 258.942 MB + | Peak value for overall tracked memory usage: + | Minimum: 1023.924 MB (on task 7 after allocating ovlp3fn2) + | Maximum: 2253.341 MB (on task 6 after allocating ovlp3fn_nosplit%m) + | Average: 1684.765 MB + | Largest tracked array allocation so far: + | Minimum: 510.595 MB (ovlp3fn_nosplit%dat on task 7) + | Maximum: 1608.479 MB (ovlp3fn_nosplit%dat on task 6) + | Average: 1141.214 MB + Note: These values currently only include a subset of arrays which are explicitly tracked. + The "true" memory usage will be greater. +------------------------------------------------------------ + Output mulliken decomposition of band k points for SOC in LAPACK + + ------------------------------------------------------------------- + Writing the requested band structure output (LAPACK version): + ------------------------------------------------------------------- + + Integrating Hamiltonian matrix: batch-based integration. + Time summed over all CPUs for integration: real work 56.119 s, elapsed 65.124 s + Integrating SOC matrix: batch-based integration p2 version. + Allocating 0.187 MB for dist_tab + Allocating 0.187 MB for dist_tab_sq + Allocating 0.560 MB for dir_tab + Allocating 0.043 MB for i_basis_fns + Allocating 1.880 MB for i_basis_fns_inv + Allocating 0.043 MB for i_atom_fns + Allocating 4.182 MB for gradient_basis_wave + Allocating 0.008 MB for ylm_tab + Allocating 0.002 MB for radial_wave + Allocating 0.002 MB for radial_wave_deriv + Allocating 0.017 MB for i_basis + Allocating 9.950 MB for soc_shell + Allocating 0.023 MB for cartesians + Allocating 0.023 MB for sum_gradient + Allocating 0.047 MB for sum_hessian + Allocating 0.001 MB for potential_shell + No atoms are split internally + Number of super-cells in X Y Z: 7 7 2 + Number of atoms pairs total: 1056 + sparsity of pfbvk: 1.000000 + Number of atoms pairs in BvK cells: 1056 + Number of instances: 1 + ----------------------------------------------------- + Dividing atoms among tasks for exact exchange energy: + Atom: 1 Weight: 0.20135E+09 + Atom: 2 Weight: 0.35722E+09 + Atom: 3 Weight: 0.66925E+08 + Atom: 4 Weight: 0.26265E+09 + Atom: 5 Weight: 0.97677E+08 + Atom: 6 Weight: 0.21083E+09 + + Average weight per task: 0.14958E+09 + + Number of "big" (above average) atoms : 4 + Number of "small" (below average) atoms: 2 + + There are "big" and "small" atoms + Reserving 4 tasks for "big" atoms + Max. weight for big atoms: 0.35722E+09 small atoms: 0.97677E+08 + Trying 5 tasks for "big" atoms: + Max. weight for big atoms: 0.26265E+09 small atoms: 0.97677E+08 + => Atom 2 gets 2 tasks + Trying 6 tasks for "big" atoms: + Max. weight for big atoms: 0.21083E+09 small atoms: 0.97677E+08 + => Atom 4 gets 2 tasks + Trying 7 tasks for "big" atoms: + Max. weight for big atoms: 0.20135E+09 small atoms: 0.16460E+09 + => Atom 6 gets 2 tasks + Using 1 tasks for "small" atoms, 7 for "big" atoms + + Atom division among tasks: + Atom 1: (initial) task: 0, # of tasks: 1 + Atom 2: (initial) task: 1, # of tasks: 2 + Atom 3: (initial) task: 7, # of tasks: 1 + Atom 4: (initial) task: 3, # of tasks: 2 + Atom 5: (initial) task: 7, # of tasks: 1 + Atom 6: (initial) task: 5, # of tasks: 2 + + ----------------------------------------------------- + Task 0: my_n_atoms2: 1 my_atom_list: 1 + Task 1: my_n_atoms2: 1 my_atom_list: 2 + Task 2: my_n_atoms2: 1 my_atom_list: 2 + Task 3: my_n_atoms2: 1 my_atom_list: 4 + Task 4: my_n_atoms2: 1 my_atom_list: 4 + Task 5: my_n_atoms2: 1 my_atom_list: 6 + Task 6: my_n_atoms2: 1 my_atom_list: 6 + Task 7: my_n_atoms2: 2 my_atom_list: 3 5 + Task 0: my_n_atom_pairs: 179 + Task 1: my_n_atom_pairs: 91 + Task 2: my_n_atom_pairs: 90 + Task 3: my_n_atom_pairs: 101 + Task 4: my_n_atom_pairs: 100 + Task 5: my_n_atom_pairs: 74 + Task 6: my_n_atom_pairs: 74 + Task 7: my_n_atom_pairs: 347 + + Treating all 21 k-points in band plot segment # 1: + + Overlap matrix is not singular + | Lowest and highest eigenvalues : 0.1236E-02, 0.7973E+01 + Finished singularity check of overlap matrix + | Time : 0.024 s + Starting LAPACK eigensolver + Finished Cholesky decomposition + | Time : 0.006 s + Finished transformation to standard eigenproblem + | Time : 0.017 s + Finished solving standard eigenproblem + | Time : 0.044 s + Finished back-transformation of eigenvectors + | Time : 0.006 s + Scalar-relativistic "band gap" along reciprocal space direction number: 1 + | Lowest unoccupied state: -3.84285642 eV + | Highest occupied state : -5.68591882 eV + | Energy difference : 1.84306240 eV + + Performing spin-orbit-coupled Mulliken charge analysis on all atoms. + Allocating 1.923 MB for mulliken_decomp + Spin-orbit-coupled "band gap" along reciprocal space direction number: 1 + | Lowest unoccupied state: -3.90669843 eV + | Highest occupied state : -5.65142414 eV + | Energy difference : 1.74472571 eV + + + Treating all 21 k-points in band plot segment # 2: + + Scalar-relativistic "band gap" along reciprocal space direction number: 2 + | Lowest unoccupied state: -4.10029833 eV + | Highest occupied state : -5.49673488 eV + | Energy difference : 1.39643655 eV + + Performing spin-orbit-coupled Mulliken charge analysis on all atoms. + Allocating 1.923 MB for mulliken_decomp + Spin-orbit-coupled "band gap" along reciprocal space direction number: 2 + | Lowest unoccupied state: -4.14839893 eV + | Highest occupied state : -5.38762145 eV + | Energy difference : 1.23922252 eV + + + Treating all 21 k-points in band plot segment # 3: + + Scalar-relativistic "band gap" along reciprocal space direction number: 3 + | Lowest unoccupied state: -4.14183662 eV + | Highest occupied state : -5.49673488 eV + | Energy difference : 1.35489826 eV + + Performing spin-orbit-coupled Mulliken charge analysis on all atoms. + Allocating 1.923 MB for mulliken_decomp + Spin-orbit-coupled "band gap" along reciprocal space direction number: 3 + | Lowest unoccupied state: -4.20772232 eV + | Highest occupied state : -5.38762145 eV + | Energy difference : 1.17989913 eV + + + Treating all 21 k-points in band plot segment # 4: + + Scalar-relativistic "band gap" along reciprocal space direction number: 4 + | Lowest unoccupied state: -4.14183662 eV + | Highest occupied state : -5.49673488 eV + | Energy difference : 1.35489826 eV + + Performing spin-orbit-coupled Mulliken charge analysis on all atoms. + Allocating 1.923 MB for mulliken_decomp + Spin-orbit-coupled "band gap" along reciprocal space direction number: 4 + | Lowest unoccupied state: -4.20772232 eV + | Highest occupied state : -5.38762145 eV + | Energy difference : 1.17989913 eV + + + Treating all 21 k-points in band plot segment # 5: + + Scalar-relativistic "band gap" along reciprocal space direction number: 5 + | Lowest unoccupied state: -3.84285642 eV + | Highest occupied state : -5.68591882 eV + | Energy difference : 1.84306240 eV + + Performing spin-orbit-coupled Mulliken charge analysis on all atoms. + Allocating 1.923 MB for mulliken_decomp + Spin-orbit-coupled "band gap" along reciprocal space direction number: 5 + | Lowest unoccupied state: -3.90669843 eV + | Highest occupied state : -5.65142414 eV + | Energy difference : 1.74472571 eV + + + Treating all 21 k-points in band plot segment # 6: + + Scalar-relativistic "band gap" along reciprocal space direction number: 6 + | Lowest unoccupied state: -4.10029833 eV + | Highest occupied state : -5.49673488 eV + | Energy difference : 1.39643655 eV + + Performing spin-orbit-coupled Mulliken charge analysis on all atoms. + Allocating 1.923 MB for mulliken_decomp + Spin-orbit-coupled "band gap" along reciprocal space direction number: 6 + | Lowest unoccupied state: -4.14839893 eV + | Highest occupied state : -5.38762145 eV + | Energy difference : 1.23922252 eV + + + Treating all 21 k-points in band plot segment # 7: + + Scalar-relativistic "band gap" along reciprocal space direction number: 7 + | Lowest unoccupied state: -4.14183662 eV + | Highest occupied state : -5.49673488 eV + | Energy difference : 1.35489826 eV + + Performing spin-orbit-coupled Mulliken charge analysis on all atoms. + Allocating 1.923 MB for mulliken_decomp + Spin-orbit-coupled "band gap" along reciprocal space direction number: 7 + | Lowest unoccupied state: -4.20772232 eV + | Highest occupied state : -5.38762145 eV + | Energy difference : 1.17989913 eV + + + Treating all 21 k-points in band plot segment # 8: + + Scalar-relativistic "band gap" along reciprocal space direction number: 8 + | Lowest unoccupied state: -4.14183662 eV + | Highest occupied state : -5.49673488 eV + | Energy difference : 1.35489826 eV + + Performing spin-orbit-coupled Mulliken charge analysis on all atoms. + Allocating 1.923 MB for mulliken_decomp + Spin-orbit-coupled "band gap" along reciprocal space direction number: 8 + | Lowest unoccupied state: -4.20772232 eV + | Highest occupied state : -5.38762145 eV + | Energy difference : 1.17989913 eV + + Scalar-relativistic "band gap" of total set of bands: + | Lowest unoccupied state: -4.14183662 eV + | Highest occupied state : -5.49673488 eV + | Energy difference : 1.35489826 eV + + + Spin-orbit-coupled "band gap" of total set of bands: + | Lowest unoccupied state: -4.20772232 eV + | Highest occupied state : -5.38762145 eV + | Energy difference : 1.17989913 eV + + + + Band Structure : max(cpu_time) wall_clock(cpu1) + | Total Time : 162.471 168.103 +------------------------------------------------------------ + + ------------------------------------------------------------------- + Writing the requested band structure output (LAPACK version): + ------------------------------------------------------------------- + + Integrating Hamiltonian matrix: batch-based integration. + Time summed over all CPUs for integration: real work 57.116 s, elapsed 66.806 s + Integrating SOC matrix: batch-based integration p2 version. + Allocating 0.187 MB for dist_tab + Allocating 0.187 MB for dist_tab_sq + Allocating 0.560 MB for dir_tab + Allocating 0.043 MB for i_basis_fns + Allocating 1.880 MB for i_basis_fns_inv + Allocating 0.043 MB for i_atom_fns + Allocating 4.182 MB for gradient_basis_wave + Allocating 0.008 MB for ylm_tab + Allocating 0.002 MB for radial_wave + Allocating 0.002 MB for radial_wave_deriv + Allocating 0.017 MB for i_basis + Allocating 9.950 MB for soc_shell + Allocating 0.023 MB for cartesians + Allocating 0.023 MB for sum_gradient + Allocating 0.047 MB for sum_hessian + Allocating 0.001 MB for potential_shell + No atoms are split internally + Number of super-cells in X Y Z: 7 7 2 + Number of atoms pairs total: 1056 + sparsity of pfbvk: 1.000000 + Number of atoms pairs in BvK cells: 1056 + Number of instances: 1 + ----------------------------------------------------- + Dividing atoms among tasks for exact exchange energy: + Atom: 1 Weight: 0.20135E+09 + Atom: 2 Weight: 0.35722E+09 + Atom: 3 Weight: 0.66925E+08 + Atom: 4 Weight: 0.26265E+09 + Atom: 5 Weight: 0.97677E+08 + Atom: 6 Weight: 0.21083E+09 + + Average weight per task: 0.14958E+09 + + Number of "big" (above average) atoms : 4 + Number of "small" (below average) atoms: 2 + + There are "big" and "small" atoms + Reserving 4 tasks for "big" atoms + Max. weight for big atoms: 0.35722E+09 small atoms: 0.97677E+08 + Trying 5 tasks for "big" atoms: + Max. weight for big atoms: 0.26265E+09 small atoms: 0.97677E+08 + => Atom 2 gets 2 tasks + Trying 6 tasks for "big" atoms: + Max. weight for big atoms: 0.21083E+09 small atoms: 0.97677E+08 + => Atom 4 gets 2 tasks + Trying 7 tasks for "big" atoms: + Max. weight for big atoms: 0.20135E+09 small atoms: 0.16460E+09 + => Atom 6 gets 2 tasks + Using 1 tasks for "small" atoms, 7 for "big" atoms + + Atom division among tasks: + Atom 1: (initial) task: 0, # of tasks: 1 + Atom 2: (initial) task: 1, # of tasks: 2 + Atom 3: (initial) task: 7, # of tasks: 1 + Atom 4: (initial) task: 3, # of tasks: 2 + Atom 5: (initial) task: 7, # of tasks: 1 + Atom 6: (initial) task: 5, # of tasks: 2 + + ----------------------------------------------------- + Task 0: my_n_atoms2: 1 my_atom_list: 1 + Task 1: my_n_atoms2: 1 my_atom_list: 2 + Task 2: my_n_atoms2: 1 my_atom_list: 2 + Task 3: my_n_atoms2: 1 my_atom_list: 4 + Task 4: my_n_atoms2: 1 my_atom_list: 4 + Task 5: my_n_atoms2: 1 my_atom_list: 6 + Task 6: my_n_atoms2: 1 my_atom_list: 6 + Task 7: my_n_atoms2: 2 my_atom_list: 3 5 + Task 0: my_n_atom_pairs: 179 + Task 1: my_n_atom_pairs: 91 + Task 2: my_n_atom_pairs: 90 + Task 3: my_n_atom_pairs: 101 + Task 4: my_n_atom_pairs: 100 + Task 5: my_n_atom_pairs: 74 + Task 6: my_n_atom_pairs: 74 + Task 7: my_n_atom_pairs: 347 + +=================================================================================== += BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES += RANK 1 PID 66572 RUNNING AT andrey-Latitude-5411 += KILLED BY SIGNAL: 9 (Killed) +=================================================================================== + +=================================================================================== += BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES += RANK 2 PID 66573 RUNNING AT andrey-Latitude-5411 += KILLED BY SIGNAL: 9 (Killed) +=================================================================================== diff --git a/tests/aims/test_files/outputs/geometry.in.next_step b/tests/aims/test_files/outputs/geometry.in.next_step new file mode 100644 index 0000000000..0bd6c26a61 --- /dev/null +++ b/tests/aims/test_files/outputs/geometry.in.next_step @@ -0,0 +1,17 @@ +# +# This is the geometry file that corresponds to the current relaxation step. +# If you do not want this file to be written, set the "write_restart_geometry" flag to .false. +# aims_uuid : 3538959A-A7AC-49B8-A692-B5D8E1478ABA +# +lattice_vector 2.83178921 0.00000000 0.00000000 +lattice_vector -0.00000000 2.83179074 -0.00000000 +lattice_vector -0.00000000 0.00000000 2.83179072 +atom_frac 0.49999995 0.50000004 0.49999998 Fe +atom_frac 0.00000005 -0.00000004 0.00000002 Fe +# +# What follows is the current estimated Hessian matrix constructed by the BFGS algorithm. +# This is NOT the true Hessian matrix of the system. +# If you do not want this information here, switch it off using the "hessian_to_restart_geometry" keyword. +# +trust_radius 0.2000000030 +hessian_file diff --git a/tests/aims/test_files/outputs/hessian.aims b/tests/aims/test_files/outputs/hessian.aims new file mode 100644 index 0000000000..31438994de Binary files /dev/null and b/tests/aims/test_files/outputs/hessian.aims differ diff --git a/tests/aims/test_files/test_files.py b/tests/aims/test_files/test_files.py new file mode 100644 index 0000000000..2316f635d6 --- /dev/null +++ b/tests/aims/test_files/test_files.py @@ -0,0 +1,35 @@ +"""Tests for file manipulation""" + +from pathlib import Path + +import pytest + +TEST_DIR = Path(__file__).parent + + +@pytest.fixture() +def tmp_dir(): + """Same as clean_dir but is fresh for every test""" + import os + import shutil + import tempfile + + old_cwd = os.getcwd() + newpath = tempfile.mkdtemp() + os.chdir(newpath) + yield + os.chdir(old_cwd) + shutil.rmtree(newpath) + + +def test_copy_aims_outputs(tmp_dir): + from atomate2.aims.files import copy_aims_outputs + + files = ["aims.out"] + restart_files = ["geometry.in.next_step", "D_spin_01_kpt_000001.csc"] + + path = TEST_DIR / "outputs" + copy_aims_outputs(src_dir=path, restart_to_input=True, additional_aims_files=files) + + for f in files + restart_files: + assert Path(f).exists() diff --git a/tests/aims/test_flows/test_core.py b/tests/aims/test_flows/test_core.py new file mode 100644 index 0000000000..6a67d792ed --- /dev/null +++ b/tests/aims/test_flows/test_core.py @@ -0,0 +1,48 @@ +"""Test core FHI-aims workflows""" +import os + +import pytest + +cwd = os.getcwd() + + +def test_double_relax(mock_aims, tmp_path, si, species_dir): + """A test for the double relaxation flow""" + + from jobflow import run_locally + + from atomate2.aims.flows.core import DoubleRelaxMaker + from atomate2.aims.schemas.task import AimsTaskDoc + + # mapping from job name to directory containing test files + ref_paths = { + "Relaxation calculation 1": "double-relax-si/relax-1", + "Relaxation calculation 2": "double-relax-si/relax-2", + } + + parameters = { + "k_grid": [2, 2, 2], + "species_dir": (species_dir).as_posix(), + } + + # settings passed to fake_run_aims + fake_run_kwargs = {} + + # automatically use fake AIMS + mock_aims(ref_paths, fake_run_kwargs) + + # generate flow + flow = DoubleRelaxMaker.from_parameters(parameters).make(si) + + # Run the flow or job and ensure that it finished running successfully + os.chdir(tmp_path) + responses = run_locally(flow, create_folders=True, ensure_success=True) + os.chdir(cwd) + + # validate output + output1 = responses[flow.jobs[0].uuid][1].output + output2 = responses[flow.jobs[1].uuid][1].output + + assert isinstance(output1, AimsTaskDoc) + assert output1.output.energy == pytest.approx(-15800.22554) + assert output2.output.energy == pytest.approx(-15800.25855) diff --git a/tests/aims/test_flows/test_gw_convergence.py b/tests/aims/test_flows/test_gw_convergence.py new file mode 100644 index 0000000000..f5f6fa4a0e --- /dev/null +++ b/tests/aims/test_flows/test_gw_convergence.py @@ -0,0 +1,62 @@ +"""A test for GW workflows for FHI-aims.""" +import pytest + +# from atomate2.aims.utils.msonable_atoms import MSONableAtoms + + +def test_gw_convergence(mock_aims, tmp_dir, o2, species_dir): + """A test for the GW convergence maker for molecule with respect to the basis set + size + """ + + from jobflow import run_locally + from pymatgen.io.aims.sets.bs import GWSetGenerator + + from atomate2.aims.flows.gw import GWConvergenceMaker + from atomate2.aims.jobs.core import GWMaker + from atomate2.aims.schemas.task import ConvergenceSummary + + # mapping from job name to directory containing test files + ref_paths = { + "GW 0": "basis-gw-convergence-o2/static-1", + "GW 1": "basis-gw-convergence-o2/static-2", + } + + input_set_parameters = {} + + parameters = { + "maker": GWMaker( + input_set_generator=GWSetGenerator(user_params=input_set_parameters) + ), + "criterion_name": "vbm", + "epsilon": 0.05, + "convergence_field": "species_dir", + "convergence_steps": [ + (species_dir / "light").as_posix(), + (species_dir / "tight").as_posix(), + ], + } + + # settings passed to fake_run_aims + fake_run_kwargs = {} + + # automatically use fake AIMS + mock_aims(ref_paths, fake_run_kwargs) + + # generate job + job = GWConvergenceMaker(**parameters).make(o2) + + # Run the job and ensure that it finished running successfully + responses = run_locally(job, create_folders=True, ensure_success=True) + + job_uuid = job.uuid + while responses[job_uuid][1].replace: + job_uuid = responses[job_uuid][1].replace.all_uuids[1] + + output = responses[job_uuid][1].output + + # validate output + assert isinstance(output, ConvergenceSummary) + assert output.converged + assert "tight" in output.convergence_field_value + assert output.actual_epsilon == pytest.approx(0.04594407) diff --git a/tests/aims/test_flows/test_phonon_workflow.py b/tests/aims/test_flows/test_phonon_workflow.py new file mode 100644 index 0000000000..9aad38cc22 --- /dev/null +++ b/tests/aims/test_flows/test_phonon_workflow.py @@ -0,0 +1,345 @@ +"""Test various makers""" +import json +import os + +import pytest + +cwd = os.getcwd() + + +def test_phonon_flow(si, tmp_path, mock_aims, species_dir): + import numpy as np + from jobflow import run_locally + from pymatgen.io.aims.sets.core import StaticSetGenerator + + from atomate2.aims.flows.phonons import PhononMaker + from atomate2.aims.jobs.core import RelaxMaker, StaticMaker + from atomate2.aims.jobs.phonons import PhononDisplacementMaker + + # mapping from job name to directory containing test files + ref_paths = { + "Relaxation calculation": "phonon-relax-si", + "phonon static aims 1/1": "phonon-disp-si", + "SCF Calculation": "phonon-energy-si", + } + + # settings passed to fake_run_aims; adjust these to check for certain input settings + fake_run_aims_kwargs = {} + + # automatically use fake FHI-aims + mock_aims(ref_paths, fake_run_aims_kwargs) + + parameters = { + "k_grid": [2, 2, 2], + "species_dir": (species_dir / "light").as_posix(), + } + # generate job + + parameters_phonon_disp = dict(compute_forces=True, **parameters) + maker = PhononMaker( + bulk_relax_maker=RelaxMaker.full_relaxation(user_params=parameters), + static_energy_maker=StaticMaker( + input_set_generator=StaticSetGenerator(user_params=parameters) + ), + use_symmetrized_structure="primitive", + phonon_displacement_maker=PhononDisplacementMaker( + input_set_generator=StaticSetGenerator( + user_params=parameters_phonon_disp, + user_kpoints_settings={"density": 5.0, "even": True}, + ) + ), + ) + maker.name = "phonons" + flow = maker.make( + si, + supercell_matrix=np.array([-1, 1, 1, 1, -1, 1, 1, 1, -1]).reshape((3, 3)), + ) + + # run the flow or job and ensure that it finished running successfully + os.chdir(tmp_path) + responses = run_locally(flow, create_folders=True, ensure_success=True) + os.chdir(cwd) + + # validation the outputs of the job + output = responses[flow.job_uuids[-1]][1].output + + phonopy_settings_schema = { + "description": "Collection to store computational settings for the " + "phonon computation.", + "properties": { + "npoints_band": { + "default": "number of points for band structure computation", + "title": "Npoints Band", + "type": "integer", + }, + "kpath_scheme": { + "default": "indicates the kpath scheme", + "title": "Kpath Scheme", + "type": "string", + }, + "kpoint_density_dos": { + "default": "number of points for computation of free energies and" + " densities of states", + "title": "Kpoint Density Dos", + "type": "integer", + }, + }, + "title": "PhononComputationalSettings", + "type": "object", + } + assert output.code == "aims" + assert output.born is None + assert not output.has_imaginary_modes + + assert output.temperatures == list(range(0, 500, 10)) + assert output.heat_capacities[0] == 0.0 + assert np.round(output.heat_capacities[-1], 2) == 23.06 + assert output.phonopy_settings.schema_json() == json.dumps(phonopy_settings_schema) + assert np.round(output.phonon_bandstructure.bands[-1, 0], 2) == 14.41 + + +@pytest.mark.skip(reason="Currently not mocked and needs FHI-aims binary") +def test_phonon_socket_flow(si, tmp_path, mock_aims, species_dir): + import numpy as np + from jobflow import run_locally + from pymatgen.io.aims.sets.core import StaticSetGenerator + + from atomate2.aims.flows.phonons import PhononMaker + from atomate2.aims.jobs.core import RelaxMaker, StaticMaker + from atomate2.aims.jobs.phonons import PhononDisplacementMakerSocket + + # mapping from job name to directory containing test files + ref_paths = { + "Relaxation calculation": "phonon-relax-si", + "phonon static aims 1/1": "phonon-disp-si", + "SCF Calculation": "phonon-energy-si", + } + + # settings passed to fake_run_aims; + fake_run_aims_kwargs = {} + + # automatically use fake FHI-aims + mock_aims(ref_paths, fake_run_aims_kwargs) + + parameters = { + "k_grid": [2, 2, 2], + "species_dir": (species_dir / "light/").as_posix(), + } + parameters_phonon_disp = dict( + compute_forces=True, use_pimd_wrapper=("localhost", 12345), **parameters + ) + + # generate job + + maker = PhononMaker( + bulk_relax_maker=RelaxMaker.full_relaxation(user_params=parameters), + static_energy_maker=StaticMaker( + input_set_generator=StaticSetGenerator(user_params=parameters) + ), + use_symmetrized_structure="primitive", + socket=True, + phonon_displacement_maker=PhononDisplacementMakerSocket( + input_set_generator=StaticSetGenerator( + user_params=parameters_phonon_disp, + user_kpoints_settings={"density": 5.0, "even": True}, + ) + ), + ) + maker.name = "phonons" + flow = maker.make( + si, + supercell_matrix=np.array([-1, 1, 1, 1, -1, 1, 1, 1, -1]).reshape((3, 3)), + ) + + # run the flow or job and ensure that it finished running successfully + # os.chdir(tmp_path) + responses = run_locally(flow, create_folders=True, ensure_success=True) + # os.chdir(cwd) + + # validation the outputs of the job + output = responses[flow.job_uuids[-1]][1].output + phonopy_settings_schema = { + "description": "Collection to store computational settings for the " + "phonon computation.", + "properties": { + "npoints_band": { + "default": "number of points for band structure computation", + "title": "Npoints Band", + "type": "integer", + }, + "kpath_scheme": { + "default": "indicates the kpath scheme", + "title": "Kpath Scheme", + "type": "string", + }, + "kpoint_density_dos": { + "default": "number of points for computation of free energies and" + " densities of states", + "title": "Kpoint Density Dos", + "type": "integer", + }, + }, + "title": "PhononComputationalSettings", + "type": "object", + } + assert output.code == "aims" + assert output.born is None + assert not output.has_imaginary_modes + + assert output.temperatures == list(range(0, 500, 10)) + assert output.heat_capacities[0] == 0.0 + assert np.round(output.heat_capacities[-1], 2) == 23.06 + assert output.phonopy_settings.schema_json() == json.dumps(phonopy_settings_schema) + assert np.round(output.phonon_bandstructure.bands[-1, 0], 2) == 14.41 + + +def test_phonon_default_flow(si, tmp_path, mock_aims, species_dir): + import numpy as np + from jobflow import run_locally + + from atomate2.aims.flows.phonons import PhononMaker + + # mapping from job name to directory containing test files + ref_paths = { + "Relaxation calculation": "phonon-relax-default-si", + "phonon static aims 1/1": "phonon-disp-default-si", + "SCF Calculation": "phonon-energy-default-si", + } + + # settings passed to fake_run_aims + fake_run_aims_kwargs = {} + + # automatically use fake FHI-aims + mock_aims(ref_paths, fake_run_aims_kwargs) + + aims_sd = os.environ.get("AIMS_SPECIES_DIR", None) + os.environ["AIMS_SPECIES_DIR"] = str(species_dir / "light") + + maker = PhononMaker() + maker.name = "phonons" + flow = maker.make( + si, + supercell_matrix=np.array([-1, 1, 1, 1, -1, 1, 1, 1, -1]).reshape((3, 3)), + ) + + # run the flow or job and ensure that it finished running successfully + os.chdir(tmp_path) + responses = run_locally(flow, create_folders=True, ensure_success=True) + os.chdir(cwd) + + # validation the outputs of the job + output = responses[flow.job_uuids[-1]][1].output + phonopy_settings_schema = { + "description": "Collection to store computational settings for " + "the phonon computation.", + "properties": { + "npoints_band": { + "default": "number of points for band structure computation", + "title": "Npoints Band", + "type": "integer", + }, + "kpath_scheme": { + "default": "indicates the kpath scheme", + "title": "Kpath Scheme", + "type": "string", + }, + "kpoint_density_dos": { + "default": "number of points for computation of free energies " + "and densities of states", + "title": "Kpoint Density Dos", + "type": "integer", + }, + }, + "title": "PhononComputationalSettings", + "type": "object", + } + assert output.code == "aims" + assert output.born is None + assert not output.has_imaginary_modes + + assert output.temperatures == list(range(0, 500, 10)) + assert output.heat_capacities[0] == 0.0 + assert np.round(output.heat_capacities[-1], 2) == 22.85 + assert output.phonopy_settings.schema_json() == json.dumps(phonopy_settings_schema) + assert np.round(output.phonon_bandstructure.bands[-1, 0], 2) == 15.02 + + if aims_sd is not None: + os.environ["AIMS_SPECIES_DIR"] = aims_sd + + +@pytest.mark.skip(reason="Currently not mocked and needs FHI-aims binary") +def test_phonon_default_socket_flow(si, tmp_path, mock_aims, species_dir): + import numpy as np + from jobflow import run_locally + + from atomate2.aims.flows.phonons import PhononMaker + + aims_sd = os.environ.get("AIMS_SPECIES_DIR", None) + os.environ["AIMS_SPECIES_DIR"] = str(species_dir / "light") + + # mapping from job name to directory containing test files + ref_paths = { + "Relaxation calculation": "phonon-relax-default-si", + "phonon static aims 1/1": "phonon-disp-default-si", + "SCF Calculation": "phonon-energy-default-si", + } + + # settings passed to fake_run_aims + fake_run_aims_kwargs = {} + + # automatically use fake FHI-aims + mock_aims(ref_paths, fake_run_aims_kwargs) + + # generate job + + maker = PhononMaker(socket=True) + maker.name = "phonons" + flow = maker.make( + si, + supercell_matrix=np.array([-1, 1, 1, 1, -1, 1, 1, 1, -1]).reshape((3, 3)), + ) + + # run the flow or job and ensure that it finished running successfully + os.chdir(tmp_path) + responses = run_locally(flow, create_folders=True, ensure_success=True) + os.chdir(cwd) + + # validation the outputs of the job + output = responses[flow.job_uuids[-1]][1].output + + phonopy_settings_schema = { + "description": "Collection to store computational settings for " + "the phonon computation.", + "properties": { + "npoints_band": { + "default": "number of points for band structure computation", + "title": "Npoints Band", + "type": "integer", + }, + "kpath_scheme": { + "default": "indicates the kpath scheme", + "title": "Kpath Scheme", + "type": "string", + }, + "kpoint_density_dos": { + "default": "number of points for computation of free energies " + "and densities of states", + "title": "Kpoint Density Dos", + "type": "integer", + }, + }, + "title": "PhononComputationalSettings", + "type": "object", + } + assert output.code == "aims" + assert output.born is None + assert not output.has_imaginary_modes + + assert output.temperatures == list(range(0, 500, 10)) + assert output.heat_capacities[0] == 0.0 + assert np.round(output.heat_capacities[-1], 2) == 22.85 + assert output.phonopy_settings.schema_json() == json.dumps(phonopy_settings_schema) + assert np.round(output.phonon_bandstructure.bands[-1, 0], 2) == 15.02 + + if aims_sd is not None: + os.environ["AIMS_SPECIES_DIR"] = aims_sd diff --git a/tests/aims/test_makers/test_convergence.py b/tests/aims/test_makers/test_convergence.py new file mode 100644 index 0000000000..451ace7d48 --- /dev/null +++ b/tests/aims/test_makers/test_convergence.py @@ -0,0 +1,63 @@ +""" A test for AIMS convergence maker (used for GW, for instance) +""" + +import os + +import pytest + +cwd = os.getcwd() + + +def test_convergence(mock_aims, tmp_path, si, species_dir): + """A test for the convergence maker""" + + from jobflow import run_locally + + from atomate2.aims.jobs.convergence import ConvergenceMaker + from atomate2.aims.jobs.core import StaticMaker, StaticSetGenerator + from atomate2.aims.schemas.task import ConvergenceSummary + + # mapping from job name to directory containing test files + ref_paths = { + "SCF Calculation 0": "k-grid-convergence-si/static-1", + "SCF Calculation 1": "k-grid-convergence-si/static-2", + "SCF Calculation 2": "k-grid-convergence-si/static-3", + } + + input_set_parameters = {"species_dir": (species_dir / "light").as_posix()} + + parameters = { + "maker": StaticMaker( + input_set_generator=StaticSetGenerator(user_params=input_set_parameters) + ), + "criterion_name": "energy_per_atom", + "epsilon": 0.2, + "convergence_field": "k_grid", + "convergence_steps": [[3, 3, 3], [4, 4, 4], [5, 5, 5], [6, 6, 6]], + } + + # settings passed to fake_run_aims + fake_run_kwargs = {} + + # automatically use fake AIMS + mock_aims(ref_paths, fake_run_kwargs) + + # generate job + job = ConvergenceMaker(**parameters).make(si) + + # Run the job and ensure that it finished running successfully + os.chdir(tmp_path) + responses = run_locally(job, create_folders=True, ensure_success=True) + os.chdir(cwd) + + job_uuid = job.uuid + while responses[job_uuid][1].replace: + job_uuid = responses[job_uuid][1].replace.all_uuids[1] + + output = responses[job_uuid][1].output + + # validate output + assert isinstance(output, ConvergenceSummary) + assert output.converged + assert output.convergence_field_value == [5, 5, 5] + assert output.actual_epsilon == pytest.approx(0.0614287) diff --git a/tests/aims/test_makers/test_gw.py b/tests/aims/test_makers/test_gw.py new file mode 100644 index 0000000000..8c2fad4300 --- /dev/null +++ b/tests/aims/test_makers/test_gw.py @@ -0,0 +1,36 @@ +"""A test for GW job maker.""" + +import pytest +from jobflow import run_locally +from pymatgen.io.aims.sets.bs import GWSetGenerator + +from atomate2.aims.jobs.core import GWMaker +from atomate2.aims.schemas.task import AimsTaskDoc + + +def test_gw_maker_molecule(tmp_dir, species_dir, mock_aims, o2): + # mapping from job name to directory containing test files + ref_paths = {"gw_o2": "gw-o2"} + + # settings passed to fake_run_aims; adjust these to check for certain input settings + fake_run_aims_kwargs = {} + + # automatically use fake FHI-aims + mock_aims(ref_paths, fake_run_aims_kwargs) + + parameters = { + "k_grid": [2, 2, 2], + "species_dir": (species_dir / "light").as_posix(), + } + # generate job + maker = GWMaker(input_set_generator=GWSetGenerator(user_params=parameters)) + maker.name = "gw_o2" + job = maker.make(o2) + + # run the flow or job and ensure that it finished running successfully + responses = run_locally(job, create_folders=True, ensure_success=True) + + # validation the outputs of the job (maybe add gw energy levels as well) + output1 = responses[job.uuid][1].output + assert isinstance(output1, AimsTaskDoc) + assert output1.output.energy == pytest.approx(-4092.0702534) diff --git a/tests/aims/test_makers/test_relax.py b/tests/aims/test_makers/test_relax.py new file mode 100644 index 0000000000..9dbc0c247e --- /dev/null +++ b/tests/aims/test_makers/test_relax.py @@ -0,0 +1,71 @@ +import os + +import pytest +from jobflow import run_locally + +from atomate2.aims.jobs.core import RelaxMaker +from atomate2.aims.schemas.task import AimsTaskDoc + +cwd = os.getcwd() + + +def test_base_maker(tmp_path, species_dir, mock_aims, si): + # mapping from job name to directory containing test files + ref_paths = {"relax_si": "relax-si"} + + # settings passed to fake_run_aims; adjust these to check for certain input settings + fake_run_aims_kwargs = {} + + # automatically use fake FHI-aims + mock_aims(ref_paths, fake_run_aims_kwargs) + + parameters = { + "k_grid": [2, 2, 2], + "species_dir": (species_dir / "light").as_posix(), + } + # generate job + maker = RelaxMaker.full_relaxation(user_params=parameters) + maker.name = "relax_si" + job = maker.make(si) + + # run the flow or job and ensure that it finished running successfully + os.chdir(tmp_path) + responses = run_locally(job, create_folders=True, ensure_success=True) + os.chdir(cwd) + + # validation the outputs of the job + output1 = responses[job.uuid][1].output + assert isinstance(output1, AimsTaskDoc) + assert output1.output.energy == pytest.approx(-15800.2255448846) + + +def test_relax_fixed_cell_maker(tmp_path, species_dir, mock_aims, si): + # mapping from job name to directory containing test files + ref_paths = {"relax_fixed_cell_si": "relax-fixed-cell-si"} + + # settings passed to fake_run_aims; adjust these to check for certain input settings + fake_run_aims_kwargs = {} + + # automatically use fake FHI-aims + mock_aims(ref_paths, fake_run_aims_kwargs) + + parameters = { + "k_grid": [2, 2, 2], + "species_dir": (species_dir / "light").as_posix(), + } + # generate job + maker = RelaxMaker.fixed_cell_relaxation(user_params=parameters) + maker.name = "relax_fixed_cell_si" + structure = si.copy() + structure.frac_coords[0, 0] += 0.25 + job = maker.make(structure) + + # run the flow or job and ensure that it finished running successfully + os.chdir(tmp_path) + responses = run_locally(job, create_folders=True, ensure_success=True) + os.chdir(cwd) + + # validation the outputs of the job + output1 = responses[job.uuid][1].output + assert isinstance(output1, AimsTaskDoc) + assert output1.output.energy == pytest.approx(-15800.099741042) diff --git a/tests/aims/test_makers/test_socket_calc.py b/tests/aims/test_makers/test_socket_calc.py new file mode 100644 index 0000000000..90dd6ac9da --- /dev/null +++ b/tests/aims/test_makers/test_socket_calc.py @@ -0,0 +1,59 @@ +import os + +import pytest + +cwd = os.getcwd() + + +@pytest.mark.skip(reason="Currently not mocked and needs FHI-aims binary") +def test_static_socket_maker(si, species_dir, mock_aims, tmp_path): + from jobflow import run_locally + from pymatgen.io.aims.sets.core import SocketIOSetGenerator + + from atomate2.aims.jobs.core import SocketIOStaticMaker + from atomate2.aims.schemas.task import AimsTaskDoc + + atoms = si + atoms_list = [atoms, atoms.copy(), atoms.copy()] + atoms_list[1].positions[0, 0] += 0.02 + atoms_list[2].cell[:, :] *= 1.02 + + # mapping from job name to directory containing test files + ref_paths = {"socket": "socket_tests"} + + # settings passed to fake_run_aims; adjust these to check for certain input settings + fake_run_aims_kwargs = {} + + # automatically use fake FHI-aims + mock_aims(ref_paths, fake_run_aims_kwargs) + + parameters = { + "k_grid": [2, 2, 2], + "species_dir": (species_dir / "light").as_posix(), + } + # generate job + maker = SocketIOStaticMaker( + input_set_generator=SocketIOSetGenerator(user_params=parameters) + ) + maker.name = "socket" + job = maker.make(atoms_list) + + # run the flow or job and ensure that it finished running successfully + os.chdir(tmp_path) + responses = run_locally(job, create_folders=True, ensure_success=True) + os.chdir(cwd) + + # validation the outputs of the job + outputs = responses[job.uuid][1].output + assert isinstance(outputs, AimsTaskDoc) + assert len(outputs.output.trajectory) == 3 + assert outputs.output.trajectory[0].get_potential_energy() == pytest.approx( + -15800.0997410132 + ) + assert outputs.output.trajectory[1].get_potential_energy() == pytest.approx( + -15800.0962356206 + ) + assert outputs.output.trajectory[2].get_potential_energy() == pytest.approx( + -15800.1847237514 + ) + # assert output1.output.energy == pytest.approx(-15800.099740991) diff --git a/tests/aims/test_makers/test_static.py b/tests/aims/test_makers/test_static.py new file mode 100644 index 0000000000..fdaf4ee680 --- /dev/null +++ b/tests/aims/test_makers/test_static.py @@ -0,0 +1,42 @@ +"""Test various makers""" +import os + +import pytest + +cwd = os.getcwd() + + +def test_static_maker(si, tmp_path, mock_aims, species_dir): + from jobflow import run_locally + from pymatgen.io.aims.sets.core import StaticSetGenerator + + from atomate2.aims.jobs.core import StaticMaker + from atomate2.aims.schemas.task import AimsTaskDoc + + # mapping from job name to directory containing test files + ref_paths = {"base": "static-si"} + + # settings passed to fake_run_aims; adjust these to check for certain input settings + fake_run_aims_kwargs = {} + + # automatically use fake FHI-aims + mock_aims(ref_paths, fake_run_aims_kwargs) + + parameters = { + "k_grid": [2, 2, 2], + "species_dir": (species_dir / "light").as_posix(), + } + # generate job + maker = StaticMaker(input_set_generator=StaticSetGenerator(user_params=parameters)) + maker.name = "base" + job = maker.make(si) + + # run the flow or job and ensure that it finished running successfully + os.chdir(tmp_path) + responses = run_locally(job, create_folders=True, ensure_success=True) + os.chdir(cwd) + + # validation the outputs of the job + output1 = responses[job.uuid][1].output + assert isinstance(output1, AimsTaskDoc) + assert output1.output.energy == pytest.approx(-15800.099740991) diff --git a/tests/aims/test_parsers/test_chunks.py b/tests/aims/test_parsers/test_chunks.py new file mode 100644 index 0000000000..6080905473 --- /dev/null +++ b/tests/aims/test_parsers/test_chunks.py @@ -0,0 +1 @@ +"""Deprecating""" diff --git a/tests/common/jobs/test_eos.py b/tests/common/jobs/test_eos.py new file mode 100644 index 0000000000..5cead9608e --- /dev/null +++ b/tests/common/jobs/test_eos.py @@ -0,0 +1,156 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +import numpy as np +from jobflow import run_locally +from pytest import approx + +from atomate2.common.jobs.eos import ( + PostProcessEosEnergy, + PostProcessEosPressure, + apply_strain_to_structure, +) + +if TYPE_CHECKING: + from collections.abc import Sequence + +# random params that are not unreasonable +_eos_test_pars = {"e0": -1.25e2, "b0": 85.0, "b1": 4.46, "v0": 11.15} + + +def taylor_energy( + v: float | Sequence, e0: float, b0: float, b1: float, v0: float +) -> float | Sequence: + """ + Taylor series expansion of an equation of state about the E(V) minimum. + + Parameters + ---------- + v : float | Sequence + A volume or list of volumes to evaluate the EOS at + e0 : float + The EOS minimum energy, i.e., E(V0), where V0 is the + equilibrium volume + b0 : float + The bulk modulus at V0 + b1 : float + The pressure derivative of the bulk modulus at V0 + v0: float + The equilibrium volume + + Rigorously, the EOS allows one to express E(V) as a Taylor series + E(V) = E0 + B0 V0/2 (V/V0 - 1)**2 - (1 + B1) B0 V0/6 (V/V0 - 1)**3 + ... + """ + eta = v / v0 - 1.0 + return e0 + b0 * v0 * eta**2 / 2.0 - (1.0 + b1) * b0 * v0 * eta**3 / 6.0 + + +def taylor_pressure( + v: float | Sequence, b0: float, b1: float, v0: float +) -> float | Sequence: + """ + Taylor series expansion of an equation of state about the p(V) zero. + + Parameters + ---------- + v : float | Sequence + A volume or list of volumes to evaluate the EOS at + e0 : float + The EOS minimum energy, i.e., E(V0), where V0 is the + equilibrium volume + b0 : float + The bulk modulus at V0 + b1 : float + The pressure derivative of the bulk modulus at V0 + v0: float + The equilibrium volume + + Rigorously, the EOS allows one to express p(V) as a Taylor series + p(V) = - d E / dV + = - B0 (V/V0 - 1) + (1 + B1) B0 /2 (V/V0 - 1)**2 + ... + """ + eta = v / v0 - 1.0 + return -b0 * eta + (1.0 + b1) * b0 * eta**2 / 2.0 + + +def test_postprocess_eos(clean_dir): + volumes = _eos_test_pars["v0"] * np.linspace(0.95, 1.05, 11) + energies = taylor_energy( + volumes, *[_eos_test_pars[key] for key in ("e0", "b0", "b1", "v0")] + ) + e_v_dict = { + "relax": { + "E0": _eos_test_pars["e0"], + "V0": _eos_test_pars["v0"], + "energy": list(energies), + "volume": list(volumes), + } + } + + # analysis_job = postprocess_eos(e_v_dict) + analysis_job = PostProcessEosEnergy().make(e_v_dict) + response = run_locally(analysis_job, create_folders=False, ensure_success=True) + job_output = response[analysis_job.uuid][1].output + assert set(job_output["relax"]) == {"E0", "V0", "energy", "volume", "EOS"} + assert set(job_output["relax"]["EOS"]) == { + "murnaghan", + "birch", + "birch_murnaghan", + "pourier_tarantola", + "vinet", + } + + # Testing that percent errors are less than 5%. Makes sense for + # testing EOS close to minimum, where Taylor series applies + for eos in job_output["relax"]["EOS"]: + assert all( + abs(job_output["relax"]["EOS"][eos][par] / _eos_test_pars[par] - 1.0) < 0.05 + for par in _eos_test_pars + ) + + +def test_postprocess_eos_pressure(clean_dir): + volumes = _eos_test_pars["v0"] * np.linspace(0.95, 1.05, 3) + pressures = taylor_pressure( + volumes, *[_eos_test_pars[key] for key in ("b0", "b1", "v0")] + ) + energies = taylor_energy( + volumes, *[_eos_test_pars[key] for key in ("e0", "b0", "b1", "v0")] + ) + + e_v_dict = { + "relax": { + "energy": list(energies), + "pressure": list(pressures), + "volume": list(volumes), + } + } + + analysis_job = PostProcessEosPressure().make(e_v_dict) + response = run_locally(analysis_job, create_folders=False, ensure_success=True) + job_output = response[analysis_job.uuid][1].output + assert set(job_output["relax"]) == {"energy", "volume", "pressure", "EOS"} + + # Testing that percent errors are less than 5%. Makes sense for + # testing EOS close to minimum, where Taylor series applies + assert all( + abs(job_output["relax"]["EOS"][par] / _eos_test_pars[par] - 1.0) < 0.05 + for par in ("b0", "b1", "v0") + ) + + +def test_apply_strain_to_structure(clean_dir, si_structure): + strains = [1.0 + eps for eps in (-0.05, 0.0, 0.05)] + + expected_volumes = [strain**3 * si_structure.volume for strain in strains] + deformations = [strain * np.identity(3) for strain in strains] + + job = apply_strain_to_structure(si_structure, deformations) + response = run_locally(job) + transformations = response[job.uuid][1].output + + assert all( + transformations[i].final_structure.volume == approx(expected) + for i, expected in enumerate(expected_volumes) + ) diff --git a/tests/common/schemas/test_cclib.py b/tests/common/schemas/test_cclib.py index 2561316ad2..e348deabf8 100644 --- a/tests/common/schemas/test_cclib.py +++ b/tests/common/schemas/test_cclib.py @@ -1,8 +1,12 @@ import gzip +import json import os import shutil import pytest +from monty.json import MontyDecoder, MontyEncoder, jsanitize + +from atomate2.common.schemas.cclib import TaskDocument try: import cclib @@ -12,10 +16,6 @@ @pytest.mark.skipif(cclib is None, reason="requires cclib to be installed") def test_cclib_taskdoc(test_dir): - from monty.json import MontyDecoder, jsanitize - - from atomate2.common.schemas.cclib import TaskDocument - p = test_dir / "schemas" # Plain parsing of task doc. We do not check all cclib entries @@ -36,24 +36,23 @@ def test_cclib_taskdoc(test_dir): assert doc["molecule"][0].coords == pytest.approx([0.397382, 0.0, 0.0]) assert doc["last_updated"] is not None assert doc["attributes"]["homo_energies"] == pytest.approx( - [-7.054007346511501, -11.618445074798501] + [-7.05400734, -11.61844507] ) assert doc["attributes"]["lumo_energies"] == pytest.approx( - [4.2384453353880005, -3.9423854660440005] + [4.23844533, -3.94238546] ) assert doc["attributes"]["homo_lumo_gaps"] == pytest.approx( - [11.292452681899501, 7.6760596087545006] + [11.29245268, 7.67605960] ) - assert doc["attributes"]["min_homo_lumo_gap"] == pytest.approx(7.6760596087545006) + assert doc["attributes"]["min_homo_lumo_gap"] == pytest.approx(7.67605960) # Now we will try two possible extensions, but we will make sure that # it fails because the newest log file (.txt) is not valid - with open(p / "test.txt", "w") as f: - f.write("I am a dummy log file") - with pytest.raises(Exception) as e: + with open(p / "test.txt", "w") as file: + file.write("I am a dummy log file") + with pytest.raises(ValueError, match="Could not parse"): doc = TaskDocument.from_logfile(p, [".log", ".txt"]).dict() os.remove(p / "test.txt") - assert "Could not parse" in str(e.value) # Test a population analysis doc = TaskDocument.from_logfile(p, "psi_test.out", analysis="MBO").dict() @@ -101,3 +100,7 @@ def test_cclib_taskdoc(test_dir): # and decoded json_str = MontyDecoder().process_decoded(dct) assert "builder_meta=EmmetMeta" in json_str + + +def test_model_validate(): + TaskDocument.model_validate_json(json.dumps(TaskDocument(), cls=MontyEncoder)) diff --git a/tests/common/schemas/test_defect.py b/tests/common/schemas/test_defect.py index 931b3319db..4728e9dbd4 100644 --- a/tests/common/schemas/test_defect.py +++ b/tests/common/schemas/test_defect.py @@ -1,19 +1,44 @@ +import json + +import numpy as np +import pytest +from monty.json import MontyEncoder + +from atomate2.common.schemas.defects import ( + CCDDocument, + FormationEnergyDiagramDocument, + sort_pos_dist, +) + + def test_sort_pos_dist(): """ Test the sorting algorithm with a list of 2D positions. The algorithm should sort the list into a straight line depending on the direction of s1 and s2 """ - import numpy as np - - from atomate2.common.schemas.defects import sort_pos_dist def abs_d(s1, s2): return np.linalg.norm(np.array(s1) - np.array(s2)) points_on_line_2d = [(1, 1), (-2, -2), (0, 0), (2, 2), (-1, -1)] - r, d = sort_pos_dist(points_on_line_2d, s1=(0, 0), s2=(1.5, 1.5), dist=abs_d) - assert r == [(-2, -2), (-1, -1), (0, 0), (1, 1), (2, 2)] + sorted_pts, dists = sort_pos_dist( + points_on_line_2d, s1=(0, 0), s2=(1.5, 1.5), dist=abs_d + ) + assert sorted_pts == [(-2, -2), (-1, -1), (0, 0), (1, 1), (2, 2)] + assert dists == pytest.approx([-2.8284271, -1.4142135, 0, 1.41421356, 2.82842712]) + + sorted_pts, dists = sort_pos_dist( + points_on_line_2d, s1=(0, 0), s2=(-2.5, -2.5), dist=abs_d + ) + assert sorted_pts == [(2, 2), (1, 1), (0, 0), (-1, -1), (-2, -2)] + assert dists == pytest.approx([-2.8284271, -1.4142135, 0, 1.41421356, 2.82842712]) + - r, d = sort_pos_dist(points_on_line_2d, s1=(0, 0), s2=(-2.5, -2.5), dist=abs_d) - assert r == [(2, 2), (1, 1), (0, 0), (-1, -1), (-2, -2)] +# schemas where all fields have default values +@pytest.mark.parametrize( + "model_cls", + [FormationEnergyDiagramDocument, CCDDocument], +) +def test_model_validate(model_cls): + model_cls.model_validate_json(json.dumps(model_cls(), cls=MontyEncoder)) diff --git a/tests/common/schemas/test_elastic.py b/tests/common/schemas/test_elastic.py index c5b469fae6..f218e83034 100644 --- a/tests/common/schemas/test_elastic.py +++ b/tests/common/schemas/test_elastic.py @@ -1,10 +1,29 @@ -from atomate2.common.schemas.elastic import ElasticDocument +import json +import pytest +from monty.json import MontyEncoder + +from atomate2.common.schemas.elastic import ( + DerivedProperties, + ElasticDocument, + ElasticTensorDocument, + FittingData, +) -def test_elastic_document(test_dir): - import json +def test_elastic_document(test_dir): schema_path = test_dir / "schemas" / "elastic.json" schema_ref = json.loads(schema_path.read_text()) - ElasticDocument(**schema_ref) + doc = ElasticDocument(**schema_ref) + validated = ElasticDocument.model_validate_json(json.dumps(doc, cls=MontyEncoder)) + assert isinstance(validated, ElasticDocument) + + +# schemas where all fields have default values +@pytest.mark.parametrize( + "model_cls", + [ElasticDocument, ElasticTensorDocument, DerivedProperties, FittingData], +) +def test_model_validate(model_cls): + model_cls.model_validate_json(json.dumps(model_cls(), cls=MontyEncoder)) diff --git a/tests/common/schemas/test_phonons.py b/tests/common/schemas/test_phonons.py new file mode 100644 index 0000000000..649aa28c23 --- /dev/null +++ b/tests/common/schemas/test_phonons.py @@ -0,0 +1,60 @@ +import json + +import numpy as np +import pytest +from monty.json import MontyEncoder +from pydantic import ValidationError + +from atomate2.common.schemas.phonons import ( + PhononBSDOSDoc, + PhononComputationalSettings, + PhononJobDirs, + PhononUUIDs, + ThermalDisplacementData, +) + + +def test_thermal_displacement_data(): + doc = ThermalDisplacementData(freq_min_thermal_displacements=0.0) + validated = ThermalDisplacementData.model_validate_json( + json.dumps(doc, cls=MontyEncoder) + ) + assert isinstance(validated, ThermalDisplacementData) + + +def test_phonon_bs_dos_doc(): + kwargs = dict( + total_dft_energy=None, + supercell_matrix=np.eye(3), + primitive_matrix=np.eye(3), + code="test", + phonopy_settings=PhononComputationalSettings( + npoints_band=1, kpath_scheme="test", kpoint_density_dos=1 + ), + thermal_displacement_data=None, + jobdirs=None, + uuids=None, + ) + doc = PhononBSDOSDoc(**kwargs) + # check validation raises no errors + validated = PhononBSDOSDoc.model_validate_json(json.dumps(doc, cls=MontyEncoder)) + assert isinstance(validated, PhononBSDOSDoc) + + # test invalid supercell_matrix type fails + with pytest.raises(ValidationError): + doc = PhononBSDOSDoc(**kwargs | {"supercell_matrix": (1, 1, 1)}) + + # test optional material_id + doc = PhononBSDOSDoc(**kwargs | {"material_id": 1234}) + assert doc.material_id == 1234 + + # test extra="allow" option + doc = PhononBSDOSDoc(**kwargs | {"extra_field": "test"}) + assert doc.extra_field == "test" + + +# schemas where all fields have default values +@pytest.mark.parametrize("model_cls", [PhononJobDirs, PhononUUIDs]) +def test_model_validate(model_cls): + validated = model_cls.model_validate_json(json.dumps(model_cls(), cls=MontyEncoder)) + assert isinstance(validated, model_cls) diff --git a/tests/common/test_files.py b/tests/common/test_files.py index 2df1e4ce96..a3173ed1de 100644 --- a/tests/common/test_files.py +++ b/tests/common/test_files.py @@ -1,6 +1,9 @@ -def test_gunzip_force_overwrites(tmp_path): - from atomate2.common.files import gunzip_files, gzip_files +from pathlib import Path + +from atomate2.common.files import gunzip_files, gzip_files, gzip_output_folder + +def test_gunzip_force_overwrites(tmp_path): files = ["file1", "file2", "file3"] for fname in files: f = tmp_path / fname @@ -31,11 +34,7 @@ def test_gunzip_force_overwrites(tmp_path): def test_zip_outputs(tmp_dir): - from pathlib import Path - - from atomate2.common.files import gzip_output_folder - - for file_name in ["a", "b"]: + for file_name in ("a", "b"): (Path.cwd() / file_name).touch() gzip_output_folder(directory=Path.cwd(), setting=False, files_list=["a"]) diff --git a/tests/common/test_jobs.py b/tests/common/test_jobs.py index 08e4a40ab0..72ce4c4d31 100644 --- a/tests/common/test_jobs.py +++ b/tests/common/test_jobs.py @@ -1,13 +1,18 @@ import os +from datetime import datetime +from jobflow import run_locally +from pymatgen.core import Structure from pytest import approx, mark +from atomate2.common.jobs.utils import ( + retrieve_structure_from_materials_project, + structure_to_conventional, + structure_to_primitive, +) -def test_structure_to_primitive(si_structure): - from jobflow import run_locally - - from atomate2.common.jobs.utils import structure_to_primitive +def test_structure_to_primitive(si_structure): job = structure_to_primitive(si_structure) responses = run_locally(job) @@ -17,10 +22,6 @@ def test_structure_to_primitive(si_structure): def test_structure_to_conventional(si_structure): - from jobflow import run_locally - - from atomate2.common.jobs.utils import structure_to_conventional - job = structure_to_conventional(si_structure) responses = run_locally(job) @@ -34,13 +35,6 @@ def test_structure_to_conventional(si_structure): reason="Materials Project API key not set in environment.", ) def test_retrieve_structure_from_materials_project(): - from datetime import datetime - - from jobflow import run_locally - from pymatgen.core import Structure - - from atomate2.common.jobs.utils import retrieve_structure_from_materials_project - job = retrieve_structure_from_materials_project("mp-149") responses = run_locally(job) diff --git a/tests/common/test_settings.py b/tests/common/test_settings.py index 004adbdacc..db643665f8 100644 --- a/tests/common/test_settings.py +++ b/tests/common/test_settings.py @@ -1,17 +1,25 @@ +import os +from pathlib import Path + import pytest from pydantic import ValidationError +from atomate2.settings import Atomate2Settings -def test_empty_and_invalid_config_file(clean_dir): - import os - from pathlib import Path - - from atomate2.settings import Atomate2Settings +def test_empty_and_invalid_config_file(clean_dir): # set path to load settings from though ATOMATE2_CONFIG_FILE env variable config_file_path = Path.cwd() / "test-atomate2-config.yaml" os.environ["ATOMATE2_CONFIG_FILE"] = str(config_file_path) + settings = Atomate2Settings() + assert str(config_file_path) == settings.CONFIG_FILE + assert settings.SYMPREC == 0.1 + assert settings.BANDGAP_TOL == 1e-4 + assert settings.VASP_RUN_BADER is False + assert settings.VASP_RUN_DDEC6 is False + assert settings.DDEC6_ATOMIC_DENSITIES_DIR is None + # test warning if config file is empty config_file_path.touch() with pytest.warns( diff --git a/tests/conftest.py b/tests/conftest.py index 85951de8af..4280e9073b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,11 +1,24 @@ +import logging +import os +import shutil +import sys +import tempfile +from pathlib import Path +from unittest import mock + import pytest +from fireworks import LaunchPad +from jobflow import JobStore +from jobflow.settings import JobflowSettings +from maggma.stores import MemoryStore from monty.serialization import loadfn +from pymatgen.core import Structure + +from atomate2.utils.log import initialize_logger @pytest.fixture(scope="session") def test_dir(): - from pathlib import Path - module_dir = Path(__file__).resolve().parent test_dir = module_dir / "test_data" return test_dir.resolve() @@ -13,9 +26,6 @@ def test_dir(): @pytest.fixture(scope="session") def log_to_stdout(): - import logging - import sys - # Set Logging root = logging.getLogger() root.setLevel(logging.DEBUG) @@ -29,16 +39,12 @@ def log_to_stdout(): @pytest.fixture(scope="session") def clean_dir(debug_mode): - import os - import shutil - import tempfile - old_cwd = os.getcwd() new_path = tempfile.mkdtemp() os.chdir(new_path) yield if debug_mode: - print(f"Tests ran in {new_path}") + print(f"Tests ran in {new_path}") # noqa: T201 else: os.chdir(old_cwd) shutil.rmtree(new_path) @@ -47,9 +53,6 @@ def clean_dir(debug_mode): @pytest.fixture() def tmp_dir(): """Same as clean_dir but is fresh for every test""" - import os - import shutil - import tempfile old_cwd = os.getcwd() new_path = tempfile.mkdtemp() @@ -66,8 +69,6 @@ def debug_mode(): @pytest.fixture(scope="session") def lpad(database, debug_mode): - from fireworks import LaunchPad - lpad = LaunchPad(name=database) lpad.reset("", require_password=False) yield lpad @@ -80,9 +81,6 @@ def lpad(database, debug_mode): @pytest.fixture() def memory_jobstore(): - from jobflow import JobStore - from maggma.stores import MemoryStore - store = JobStore(MemoryStore(), additional_stores={"data": MemoryStore()}) store.connect() @@ -91,24 +89,17 @@ def memory_jobstore(): @pytest.fixture(scope="session", autouse=True) def log_to_stdout_auto_use(): - from atomate2.utils.log import initialize_logger - initialize_logger() @pytest.fixture() def si_structure(test_dir): - from pymatgen.core import Structure - return Structure.from_file(test_dir / "structures" / "Si.cif") @pytest.fixture(autouse=True) def mock_jobflow_settings(memory_jobstore): """Mock the jobflow settings to use our specific jobstore (with data store).""" - from unittest import mock - - from jobflow.settings import JobflowSettings settings = JobflowSettings(JOB_STORE=memory_jobstore) diff --git a/tests/cp2k/conftest.py b/tests/cp2k/conftest.py index 734b18aa8e..cb6403ff91 100644 --- a/tests/cp2k/conftest.py +++ b/tests/cp2k/conftest.py @@ -135,7 +135,7 @@ def fake_run_cp2k( input_settings: Sequence[str] = (), check_inputs: Sequence[Literal["cp2k.inp"]] = _VFILES, clear_inputs: bool = True, -): +) -> None: """ Emulate running CP2K and validate CP2K input files. @@ -171,16 +171,16 @@ def fake_run_cp2k( @pytest.fixture() def check_input(): - def _check_input(ref_path, user_input): - from pymatgen.io.cp2k.inputs import Cp2kInput + from pymatgen.io.cp2k.inputs import Cp2kInput - ref = Cp2kInput.from_file(ref_path / "inputs" / "cp2k.inp") + def _check_input(ref_path, user_input: Cp2kInput): + ref_input = Cp2kInput.from_file(ref_path / "inputs" / "cp2k.inp") user_input.verbosity(verbosity=False) - ref.verbosity(verbosity=False) - user_string = " ".join(user_input.get_string().lower().split()) + ref_input.verbosity(verbosity=False) + user_string = " ".join(user_input.get_str().lower().split()) user_hash = md5(user_string.encode("utf-8")).hexdigest() - ref_string = " ".join(ref.get_string().lower().split()) + ref_string = " ".join(ref_input.get_str().lower().split()) ref_hash = md5(ref_string.encode("utf-8")).hexdigest() if ref_hash != user_hash: @@ -190,10 +190,7 @@ def _check_input(ref_path, user_input): def clear_cp2k_inputs(): - for cp2k_file in ( - "cp2k.inp", - "cp2k.out", - ): + for cp2k_file in ("cp2k.inp", "cp2k.out"): if Path(cp2k_file).exists(): Path(cp2k_file).unlink() logger.info("Cleared cp2k inputs") diff --git a/tests/cp2k/jobs/test_core.py b/tests/cp2k/jobs/test_core.py index c7afa23e05..c3b6139d05 100644 --- a/tests/cp2k/jobs/test_core.py +++ b/tests/cp2k/jobs/test_core.py @@ -32,7 +32,7 @@ def test_static_maker(tmp_path, mock_cp2k, si_structure, basis_and_potential): # validate job outputs output1 = responses[job.uuid][1].output assert isinstance(output1, TaskDocument) - assert output1.output.energy == approx(-214.23651374775685) + assert output1.output.energy == approx(-214.23651374) def test_relax_maker(tmp_path, mock_cp2k, basis_and_potential, si_structure): @@ -66,7 +66,7 @@ def test_relax_maker(tmp_path, mock_cp2k, basis_and_potential, si_structure): # validate job outputs output1 = responses[job.uuid][1].output assert isinstance(output1, TaskDocument) - assert output1.output.energy == approx(-193.39161102270234) + assert output1.output.energy == approx(-193.39161102) assert len(output1.calcs_reversed[0].output.ionic_steps) == 1 assert output1.calcs_reversed[0].output.structure.lattice.abc == approx( si_structure.lattice.abc @@ -106,7 +106,7 @@ def test_transmuter(tmp_path, mock_cp2k, basis_and_potential, si_structure): # validate outputs output1 = responses[job.uuid][1].output assert isinstance(output1, TaskDocument) - assert output1.output.energy == approx(-404.0823179177859) + assert output1.output.energy == approx(-404.08231791) assert output1.transformations["history"][0]["scaling_matrix"] == [ [1, 0, 0], [0, 1, 0], diff --git a/tests/cp2k/sets/test_core.py b/tests/cp2k/sets/test_core.py index 42aca1baa6..48a5de33a3 100644 --- a/tests/cp2k/sets/test_core.py +++ b/tests/cp2k/sets/test_core.py @@ -13,18 +13,18 @@ def test_input_generators(si_structure, basis_and_potential): StaticSetGenerator, ) - for gen in [ + for gen in ( StaticSetGenerator(user_input_settings=basis_and_potential), HybridStaticSetGenerator(user_input_settings=basis_and_potential), - ]: + ): input_set = gen.get_input_set(si_structure) assert input_set.cp2k_input["GLOBAL"]["RUN_TYPE"].values[0] == "ENERGY_FORCE" assert input_set.cp2k_input.check("FORCE_EVAL/DFT/KPOINTS") - for gen in [ + for gen in ( RelaxSetGenerator(user_input_settings=basis_and_potential), HybridRelaxSetGenerator(user_input_settings=basis_and_potential), - ]: + ): input_set = gen.get_input_set(si_structure) assert input_set.cp2k_input["GLOBAL"]["RUN_TYPE"].values[0] == "GEO_OPT" assert input_set.cp2k_input.get("MOTION") @@ -32,10 +32,10 @@ def test_input_generators(si_structure, basis_and_potential): 0 ] == pytest.approx(0.1) - for gen in [ + for gen in ( CellOptSetGenerator(user_input_settings=basis_and_potential), HybridCellOptSetGenerator(user_input_settings=basis_and_potential), - ]: + ): input_set = gen.get_input_set(si_structure) assert input_set.cp2k_input["GLOBAL"]["RUN_TYPE"].values[0] == "CELL_OPT" diff --git a/tests/cp2k/test_powerups.py b/tests/cp2k/test_powerups.py index e3b74bb819..587bff8e8d 100644 --- a/tests/cp2k/test_powerups.py +++ b/tests/cp2k/test_powerups.py @@ -60,3 +60,43 @@ def test_update_user_settings(powerup, attribute, settings): getattr(flow.jobs[1].function.__self__.input_set_generator, attribute) != settings ) + + +@pytest.mark.parametrize( + "powerup,settings", + [ + ("add_metadata_to_flow", {"mp-id": "mp-xxx"}), + ("add_metadata_to_flow", {"mp-id": "mp-170", "composition": "NaCl"}), + ], +) +def test_add_metadata_to_flow(powerup, settings): + from atomate2.cp2k import powerups + from atomate2.cp2k.flows.core import DoubleRelaxMaker + + powerup_func = getattr(powerups, powerup) + + # test flow + drm = DoubleRelaxMaker() + flow = drm.make(1) + flow = powerup_func(flow, settings) + assert ( + flow.jobs[0].function.__self__.task_document_kwargs["additional_fields"] + == settings + ) + + +@pytest.mark.parametrize( + "powerup, settings", + [("update_cp2k_custodian_handlers", ())], +) +def test_update_cp2k_custodian_handlers(powerup, settings): + from atomate2.cp2k import powerups + from atomate2.cp2k.flows.core import DoubleRelaxMaker + + powerup_func = getattr(powerups, powerup) + + # test flow + drm = DoubleRelaxMaker() + flow = drm.make(1) + flow = powerup_func(flow, settings) + assert flow.jobs[0].function.__self__.run_cp2k_kwargs["handlers"] == settings diff --git a/tests/forcefields/flows/test_elastic.py b/tests/forcefields/flows/test_elastic.py index bd4c29848c..1f41671fcb 100644 --- a/tests/forcefields/flows/test_elastic.py +++ b/tests/forcefields/flows/test_elastic.py @@ -1,30 +1,34 @@ -def test_elastic_wf(clean_dir, si_structure): - from jobflow import run_locally - from numpy.testing import assert_allclose - from pymatgen.symmetry.analyzer import SpacegroupAnalyzer +import pytest +from jobflow import run_locally +from pymatgen.symmetry.analyzer import SpacegroupAnalyzer - from atomate2.common.schemas.elastic import ElasticDocument - from atomate2.forcefields.flows.elastic import ElasticMaker - from atomate2.forcefields.jobs import M3GNetRelaxMaker +from atomate2.common.schemas.elastic import ElasticDocument +from atomate2.forcefields.flows.elastic import ElasticMaker +from atomate2.forcefields.jobs import MACERelaxMaker + +def test_elastic_wf_with_mace(clean_dir, si_structure, test_dir): si_prim = SpacegroupAnalyzer(si_structure).get_primitive_standard_structure() + model_path = f"{test_dir}/forcefields/mace/MACE.model" + common_kwds = dict( + model=model_path, + relax_kwargs={"fmax": 0.00001}, + model_kwargs={"default_dtype": "float64"}, + ) - # !!! Generate job - job = ElasticMaker( - bulk_relax_maker=M3GNetRelaxMaker( - relax_cell=True, relax_kwargs={"fmax": 0.00001} - ), - elastic_relax_maker=M3GNetRelaxMaker( - relax_cell=False, relax_kwargs={"fmax": 0.00001} - ), + flow = ElasticMaker( + bulk_relax_maker=MACERelaxMaker(**common_kwds, relax_cell=True), + elastic_relax_maker=MACERelaxMaker(**common_kwds, relax_cell=False), ).make(si_prim) # run the flow or job and ensure that it finished running successfully - responses = run_locally(job, create_folders=True, ensure_success=True) - elastic_output = responses[job.jobs[-1].uuid][1].output + responses = run_locally(flow, create_folders=True, ensure_success=True) + elastic_output = responses[flow[-1].uuid][1].output assert isinstance(elastic_output, ElasticDocument) - assert_allclose(elastic_output.derived_properties.k_voigt, 118.26914, atol=1e-1) - assert_allclose( - elastic_output.derived_properties.g_voigt, 17.327374125417816, atol=1e-1 + assert elastic_output.derived_properties.k_voigt == pytest.approx( + 9.7005429, abs=0.01 + ) + assert elastic_output.derived_properties.g_voigt == pytest.approx( + 0.002005039, abs=0.01 ) assert elastic_output.chemsys == "Si" diff --git a/tests/forcefields/flows/test_eos.py b/tests/forcefields/flows/test_eos.py new file mode 100644 index 0000000000..ef7f565663 --- /dev/null +++ b/tests/forcefields/flows/test_eos.py @@ -0,0 +1,35 @@ +import pytest +import torch +from jobflow import run_locally +from monty.serialization import loadfn + +from atomate2.forcefields.flows.eos import CHGNetEosMaker, M3GNetEosMaker, MACEEosMaker + +_mlff_to_maker = { + "CHGNet": CHGNetEosMaker, + "M3GNet": M3GNetEosMaker, + "MACE": MACEEosMaker, +} + + +@pytest.mark.parametrize("mlff", list(_mlff_to_maker)) +def test_ml_ff_eos_makers(mlff: str, si_structure, clean_dir, test_dir): + # MACE changes the default dtype, ensure consistent dtype here + torch.set_default_dtype(torch.float32) + + job = _mlff_to_maker[mlff]().make(si_structure) + job_to_uuid = {job.name: job.uuid for job in job.jobs} + postprocess_uuid = job_to_uuid[f"{mlff} EOS Maker postprocessing"] + response = run_locally(job, ensure_success=True) + output = response[postprocess_uuid][1].output + + ref_data = loadfn(f"{test_dir}/forcefields/eos/{mlff}_Si_eos.json.gz") + + for key in ref_data["relax"]: + if isinstance(key, float): + assert output["relax"][key] == pytest.approx(ref_data["relax"][key]) + elif isinstance(key, list): + assert all( + output["relax"][key][i] == pytest.approx(value) + for i, value in ref_data["relax"][key].items() + ) diff --git a/tests/forcefields/flows/test_phonon.py b/tests/forcefields/flows/test_phonon.py index c18cb86622..34f8f3a2f0 100644 --- a/tests/forcefields/flows/test_phonon.py +++ b/tests/forcefields/flows/test_phonon.py @@ -1,3 +1,5 @@ +import torch +from jobflow import run_locally from numpy.testing import assert_allclose from pymatgen.core.structure import Structure from pymatgen.phonon.bandstructure import PhononBandStructureSymmLine @@ -13,7 +15,8 @@ def test_phonon_wf(clean_dir): - from jobflow import run_locally + # TODO brittle due to inability to adjust dtypes in CHGNetRelaxMaker + torch.set_default_dtype(torch.float32) structure = Structure( lattice=[[0, 2.73, 2.73], [2.73, 0, 2.73], [2.73, 2.73, 0]], @@ -38,7 +41,7 @@ def test_phonon_wf(clean_dir): assert_allclose( responses[job.jobs[-1].uuid][1].output.free_energies, [5058.4521752, 4907.4957516, 3966.5493299, 2157.8178928, -357.5054580], - rtol=0.08, + atol=1000, ) assert isinstance( @@ -55,7 +58,7 @@ def test_phonon_wf(clean_dir): assert isinstance(responses[job.jobs[-1].uuid][1].output.jobdirs, PhononJobDirs) assert isinstance(responses[job.jobs[-1].uuid][1].output.uuids, PhononUUIDs) assert_allclose( - responses[job.jobs[-1].uuid][1].output.total_dft_energy, -5.372457981109619, 4 + responses[job.jobs[-1].uuid][1].output.total_dft_energy, -5.37245798, 4 ) assert responses[job.jobs[-1].uuid][1].output.born is None assert responses[job.jobs[-1].uuid][1].output.epsilon_static is None @@ -68,7 +71,7 @@ def test_phonon_wf(clean_dir): ((0, 0.5, 0.5), (0.5, 0.0, 0.5), (0.5, 0.5, 0.0)), atol=1e-8, ) - assert responses[job.jobs[-1].uuid][1].output.code == "vasp" + assert responses[job.jobs[-1].uuid][1].output.code == "forcefields" assert isinstance( responses[job.jobs[-1].uuid][1].output.phonopy_settings, PhononComputationalSettings, @@ -80,21 +83,20 @@ def test_phonon_wf(clean_dir): ) assert ( responses[job.jobs[-1].uuid][1].output.phonopy_settings.kpoint_density_dos - == 7000 + == 7_000 ) assert_allclose( responses[job.jobs[-1].uuid][1].output.entropies, - [0.0, 4.7839398173, 13.993186953, 21.886413347, 28.191106671], - rtol=0.05, + [0.0, 4.78393981, 13.99318695, 21.88641334, 28.19110667], + atol=2, ) assert_allclose( responses[job.jobs[-1].uuid][1].output.heat_capacities, - [0.0, 8.8606058656, 17.557589434, 21.089039169, 22.625872713], - rtol=0.05, + [0.0, 8.86060586, 17.55758943, 21.08903916, 22.62587271], + atol=2, ) - assert_allclose( responses[job.jobs[-1].uuid][1].output.internal_energies, [5058.44158791, 5385.88058579, 6765.19854165, 8723.78588089, 10919.0199409], - rtol=0.05, + atol=1000, ) diff --git a/tests/forcefields/test_jobs.py b/tests/forcefields/test_jobs.py index f78bd3a9d2..e6249486f8 100644 --- a/tests/forcefields/test_jobs.py +++ b/tests/forcefields/test_jobs.py @@ -1,14 +1,23 @@ +from pathlib import Path + +import pytest +from jobflow import run_locally from pytest import approx, importorskip -importorskip("quippy") +from atomate2.forcefields.jobs import ( + CHGNetRelaxMaker, + CHGNetStaticMaker, + GAPRelaxMaker, + GAPStaticMaker, + M3GNetRelaxMaker, + M3GNetStaticMaker, + MACERelaxMaker, + MACEStaticMaker, +) +from atomate2.forcefields.schemas import ForceFieldTaskDocument def test_chgnet_static_maker(si_structure): - from jobflow import run_locally - - from atomate2.forcefields.jobs import CHGNetStaticMaker - from atomate2.forcefields.schemas import ForceFieldTaskDocument - task_doc_kwargs = {"ionic_step_data": ("structure", "energy")} # generate job @@ -20,22 +29,18 @@ def test_chgnet_static_maker(si_structure): # validate job outputs output1 = responses[job.uuid][1].output assert isinstance(output1, ForceFieldTaskDocument) - assert output1.output.energy == approx(-10.7452, rel=1e-4) + assert output1.output.energy == approx(-10.6275062, rel=1e-4) assert output1.output.ionic_steps[-1].magmoms is None assert output1.output.n_steps == 1 -def test_chgnet_relax_maker(si_structure): - from jobflow import run_locally - - from atomate2.forcefields.jobs import CHGNetRelaxMaker - from atomate2.forcefields.schemas import ForceFieldTaskDocument - +@pytest.mark.parametrize("relax_cell", [True, False]) +def test_chgnet_relax_maker(si_structure, relax_cell: bool): # translate one atom to ensure a small number of relaxation steps are taken si_structure.translate_sites(0, [0, 0, 0.1]) # generate job - job = CHGNetRelaxMaker(steps=25).make(si_structure) + job = CHGNetRelaxMaker(steps=25, relax_cell=relax_cell).make(si_structure) # run the flow or job and ensure that it finished running successfully responses = run_locally(job, ensure_success=True) @@ -43,17 +48,16 @@ def test_chgnet_relax_maker(si_structure): # validate job outputs output1 = responses[job.uuid][1].output assert isinstance(output1, ForceFieldTaskDocument) - assert output1.output.energy == approx(-10.74523544, rel=1e-4) - assert output1.output.ionic_steps[-1].magmoms[0] == approx(0.00211287, rel=1e-4) - assert output1.output.n_steps == 12 + assert output1.output.n_steps >= 12 + if relax_cell: + assert output1.output.energy == approx(-10.62461, abs=1e-2) + assert output1.output.ionic_steps[-1].magmoms[0] == approx(0.00251674, rel=1e-1) + else: + assert output1.output.energy == approx(-10.6274, rel=1e-2) + assert output1.output.ionic_steps[-1].magmoms[0] == approx(0.00303572, rel=1e-2) def test_m3gnet_static_maker(si_structure): - from jobflow import run_locally - - from atomate2.forcefields.jobs import M3GNetStaticMaker - from atomate2.forcefields.schemas import ForceFieldTaskDocument - task_doc_kwargs = {"ionic_step_data": ("structure", "energy")} # generate job @@ -70,11 +74,6 @@ def test_m3gnet_static_maker(si_structure): def test_m3gnet_relax_maker(si_structure): - from jobflow import run_locally - - from atomate2.forcefields.jobs import M3GNetRelaxMaker - from atomate2.forcefields.schemas import ForceFieldTaskDocument - # translate one atom to ensure a small number of relaxation steps are taken si_structure.translate_sites(0, [0, 0, 0.1]) @@ -88,14 +87,70 @@ def test_m3gnet_relax_maker(si_structure): output1 = responses[job.uuid][1].output assert isinstance(output1, ForceFieldTaskDocument) assert output1.output.energy == approx(-10.8, abs=0.2) - assert output1.output.n_steps == 14 + assert output1.output.n_steps == 27 -def test_gap_static_maker(si_structure, test_dir): - from jobflow import run_locally +mace_paths = pytest.mark.parametrize( + "model", + [ + # None, # TODO uncomment once https://github.com/ACEsuit/mace/pull/230 is merged + # to test loading MACE checkpoint on the fly from figshare + f"{Path(__file__).parent.parent}/test_data/forcefields/mace/MACE.model", + ], +) - from atomate2.forcefields.jobs import GAPStaticMaker - from atomate2.forcefields.schemas import ForceFieldTaskDocument + +@mace_paths +def test_mace_static_maker(si_structure, test_dir, model): + task_doc_kwargs = {"ionic_step_data": ("structure", "energy")} + + # generate job + # NOTE the test model is not trained on Si, so the energy is not accurate + job = MACEStaticMaker(model=model, task_document_kwargs=task_doc_kwargs).make( + si_structure + ) + + # run the flow or job and ensure that it finished running successfully + responses = run_locally(job, ensure_success=True) + + # validation the outputs of the job + output1 = responses[job.uuid][1].output + assert isinstance(output1, ForceFieldTaskDocument) + assert output1.output.energy == approx(-0.068231, rel=1e-4) + assert output1.output.n_steps == 1 + + +@pytest.mark.parametrize("relax_cell", [True, False]) +@mace_paths +def test_mace_relax_maker(si_structure, test_dir, model, relax_cell: bool): + # translate one atom to ensure a small number of relaxation steps are taken + si_structure.translate_sites(0, [0, 0, 0.1]) + + # generate job + # NOTE the test model is not trained on Si, so the energy is not accurate + job = MACERelaxMaker( + model=model, + steps=25, + optimizer_kwargs={"optimizer": "BFGSLineSearch"}, + relax_cell=relax_cell, + ).make(si_structure) + + # run the flow or job and ensure that it finished running successfully + responses = run_locally(job, ensure_success=True) + + # validating the outputs of the job + output1 = responses[job.uuid][1].output + assert isinstance(output1, ForceFieldTaskDocument) + if relax_cell: + assert output1.output.energy == approx(-0.0526856, rel=1e-1) + assert output1.output.n_steps >= 4 + else: + assert output1.output.energy == approx(-0.051912, rel=1e-4) + assert output1.output.n_steps == 4 + + +def test_gap_static_maker(si_structure, test_dir): + importorskip("quippy") task_doc_kwargs = {"ionic_step_data": ("structure", "energy")} @@ -103,9 +158,7 @@ def test_gap_static_maker(si_structure, test_dir): # Test files have been provided by Yuanbin Liu (University of Oxford) job = GAPStaticMaker( potential_args_str="IP GAP", - potential_param_file_name=str( - test_dir / "forcefields" / "gap" / "gap_file.xml" - ), + potential_param_file_name=test_dir / "forcefields" / "gap" / "gap_file.xml", task_document_kwargs=task_doc_kwargs, ).make(si_structure) @@ -119,11 +172,9 @@ def test_gap_static_maker(si_structure, test_dir): assert output1.output.n_steps == 1 -def test_gap_relax_maker(si_structure, test_dir): - from jobflow import run_locally - - from atomate2.forcefields.jobs import GAPRelaxMaker - from atomate2.forcefields.schemas import ForceFieldTaskDocument +@pytest.mark.parametrize("relax_cell", [True, False]) +def test_gap_relax_maker(si_structure, test_dir, relax_cell: bool): + importorskip("quippy") # translate one atom to ensure a small number of relaxation steps are taken si_structure.translate_sites(0, [0, 0, 0.1]) @@ -133,6 +184,7 @@ def test_gap_relax_maker(si_structure, test_dir): job = GAPRelaxMaker( potential_param_file_name=test_dir / "forcefields" / "gap" / "gap_file.xml", steps=25, + relax_cell=relax_cell, ).make(si_structure) # run the flow or job and ensure that it finished running successfully @@ -141,5 +193,9 @@ def test_gap_relax_maker(si_structure, test_dir): # validating the outputs of the job output1 = responses[job.uuid][1].output assert isinstance(output1, ForceFieldTaskDocument) - assert output1.output.energy == approx(-10.8523, rel=1e-4) - assert output1.output.n_steps == 17 + if relax_cell: + assert output1.output.energy == approx(-13.08492, rel=1e-2) + assert output1.output.n_steps == 27 + else: + assert output1.output.energy == approx(-10.8523, rel=1e-4) + assert output1.output.n_steps == 17 diff --git a/tests/forcefields/test_utils.py b/tests/forcefields/test_utils.py new file mode 100644 index 0000000000..9856b881d4 --- /dev/null +++ b/tests/forcefields/test_utils.py @@ -0,0 +1,119 @@ +import os + +import pytest +from ase.calculators.lj import LennardJones +from ase.optimize import BFGS +from numpy.testing import assert_allclose +from pymatgen.io.ase import AseAtomsAdaptor + +from atomate2.forcefields.utils import FrechetCellFilter, Relaxer, TrajectoryObserver + + +def test_safe_import(): + assert FrechetCellFilter is None or FrechetCellFilter.__module__ == "ase.filters" + + +def test_trajectory_observer(si_structure, test_dir, tmp_dir): + atoms = AseAtomsAdaptor.get_atoms(structure=si_structure, calculator=LennardJones()) + + traj = TrajectoryObserver(atoms) + + expected_energy = -0.06830751105 + assert traj.compute_energy() == pytest.approx(expected_energy) + + traj() + # NB: always 3 Cartesian components to each interatomic force, + # and only 6 unique elements of the flattened stress tensor + assert traj.energies[0] == pytest.approx(expected_energy) + + expected_forces = [ + [8.32667268e-17, 4.16333634e-17, 7.31069641e-17], + [-8.32667268e-17, -4.16333634e-17, -7.31069641e-17], + ] + assert_allclose(traj.forces[0], expected_forces, atol=1e-8) + expected_stresses = [ + 4.38808e-03, + 4.38808e-03, + 4.38808e-03, + -9.47784e-19, + -1.24675e-18, + -1.76448e-18, + ] + assert_allclose(traj.stresses[0], expected_stresses, atol=1e-8) + + save_file_name = "log_file.json.gz" + traj.save(save_file_name) + assert os.path.isfile(save_file_name) + + +@pytest.mark.parametrize( + ("optimizer", "traj_file"), + [("BFGS", None), (None, None), (BFGS, "log_file.json.gz")], +) +def test_relaxer(si_structure, test_dir, tmp_dir, optimizer, traj_file): + if FrechetCellFilter: + expected_lattice = { + "a": 3.866974, + "b": 3.866974, + "c": 3.866974, + "volume": 40.888292, + } + expected_forces = [ + [8.32667268e-17, 4.16333634e-17, 7.31069641e-17], + [-8.32667268e-17, -4.16333634e-17, -7.31069641e-17], + ] + expected_energy = -0.0683075110 + expected_stresses = [ + 4.38808588e-03, + 4.38808588e-03, + 4.38808588e-03, + -9.74728670e-19, + -1.31340626e-18, + -1.60482883e-18, + ] + else: + expected_lattice = { + "a": 1.77102507, + "b": 1.77102507, + "c": 1.77102507, + "volume": 3.927888, + } + expected_forces = [ + [-5.95083358e-12, -1.65202964e-12, 2.84683735e-13], + [5.92662724e-12, 1.65667133e-12, -2.77979812e-13], + ] + expected_energy = -5.846762493 + expected_stresses = [ + -1.27190530e-03, + -1.27190530e-03, + -1.27190530e-03, + -2.31413557e-14, + -3.26060788e-14, + 5.09222979e-13, + ] + + if optimizer is None: + with pytest.raises(ValueError, match="Optimizer cannot be None"): + Relaxer(calculator=LennardJones(), optimizer=optimizer) + return + + relaxer = Relaxer(calculator=LennardJones(), optimizer=optimizer) + + try: + relax_output = relaxer.relax(atoms=si_structure, traj_file=traj_file) + except TypeError: + return + + assert { + key: getattr(relax_output["final_structure"].lattice, key) + for key in expected_lattice + } == pytest.approx(expected_lattice) + + assert relax_output["trajectory"].energies[-1] == pytest.approx(expected_energy) + + assert_allclose(relax_output["trajectory"].forces[-1], expected_forces) + + assert_allclose(relax_output["trajectory"].stresses[-1], expected_stresses) + + if traj_file: + assert os.path.isfile(traj_file) diff --git a/tests/test_data/aims/basis-gw-convergence-o2/static-1/inputs/control.in.gz b/tests/test_data/aims/basis-gw-convergence-o2/static-1/inputs/control.in.gz new file mode 100644 index 0000000000..8e85e66e67 Binary files /dev/null and b/tests/test_data/aims/basis-gw-convergence-o2/static-1/inputs/control.in.gz differ diff --git a/tests/test_data/aims/basis-gw-convergence-o2/static-1/inputs/geometry.in.gz b/tests/test_data/aims/basis-gw-convergence-o2/static-1/inputs/geometry.in.gz new file mode 100644 index 0000000000..34e58f0b17 Binary files /dev/null and b/tests/test_data/aims/basis-gw-convergence-o2/static-1/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/basis-gw-convergence-o2/static-1/inputs/parameters.json b/tests/test_data/aims/basis-gw-convergence-o2/static-1/inputs/parameters.json new file mode 100644 index 0000000000..d7804d91eb --- /dev/null +++ b/tests/test_data/aims/basis-gw-convergence-o2/static-1/inputs/parameters.json @@ -0,0 +1,7 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "anacon_type": "two-pole", + "qpe_calc": "gw", + "species_dir": "/home/andrey/workspace/atomate2/tests/aims/species_dir/light" +} diff --git a/tests/test_data/aims/basis-gw-convergence-o2/static-1/outputs/aims.out.gz b/tests/test_data/aims/basis-gw-convergence-o2/static-1/outputs/aims.out.gz new file mode 100644 index 0000000000..9a45302ba8 Binary files /dev/null and b/tests/test_data/aims/basis-gw-convergence-o2/static-1/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/basis-gw-convergence-o2/static-1/outputs/convergence.json b/tests/test_data/aims/basis-gw-convergence-o2/static-1/outputs/convergence.json new file mode 100644 index 0000000000..8d7209bd81 --- /dev/null +++ b/tests/test_data/aims/basis-gw-convergence-o2/static-1/outputs/convergence.json @@ -0,0 +1 @@ +{"criterion_name": "vbm", "criterion_values": [-6.09530754], "convergence_field_name": "species_dir", "convergence_field_values": ["/home/andrey/workspace/atomate2/tests/aims/species_dir/light"], "converged": false, "idx": 0} diff --git a/tests/test_data/aims/basis-gw-convergence-o2/static-2/inputs/control.in.gz b/tests/test_data/aims/basis-gw-convergence-o2/static-2/inputs/control.in.gz new file mode 100644 index 0000000000..ee0c4686ba Binary files /dev/null and b/tests/test_data/aims/basis-gw-convergence-o2/static-2/inputs/control.in.gz differ diff --git a/tests/test_data/aims/basis-gw-convergence-o2/static-2/inputs/geometry.in.gz b/tests/test_data/aims/basis-gw-convergence-o2/static-2/inputs/geometry.in.gz new file mode 100644 index 0000000000..2b91e33fa9 Binary files /dev/null and b/tests/test_data/aims/basis-gw-convergence-o2/static-2/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/basis-gw-convergence-o2/static-2/inputs/parameters.json b/tests/test_data/aims/basis-gw-convergence-o2/static-2/inputs/parameters.json new file mode 100644 index 0000000000..d535ab4a86 --- /dev/null +++ b/tests/test_data/aims/basis-gw-convergence-o2/static-2/inputs/parameters.json @@ -0,0 +1,7 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "anacon_type": "two-pole", + "qpe_calc": "gw", + "species_dir": "/home/andrey/workspace/atomate2/tests/aims/species_dir/tight" +} diff --git a/tests/test_data/aims/basis-gw-convergence-o2/static-2/outputs/aims.out.gz b/tests/test_data/aims/basis-gw-convergence-o2/static-2/outputs/aims.out.gz new file mode 100644 index 0000000000..16e9258e8a Binary files /dev/null and b/tests/test_data/aims/basis-gw-convergence-o2/static-2/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/basis-gw-convergence-o2/static-2/outputs/convergence.json b/tests/test_data/aims/basis-gw-convergence-o2/static-2/outputs/convergence.json new file mode 100644 index 0000000000..d3abc388b5 --- /dev/null +++ b/tests/test_data/aims/basis-gw-convergence-o2/static-2/outputs/convergence.json @@ -0,0 +1 @@ +{"criterion_name": "vbm", "criterion_values": [-6.09530754, -6.14125161], "convergence_field_name": "species_dir", "convergence_field_values": ["/home/andrey/workspace/atomate2/tests/aims/species_dir/light", "/home/andrey/workspace/atomate2/tests/aims/species_dir/tight"], "converged": true, "idx": 1} diff --git a/tests/test_data/aims/double-relax-si/relax-1/inputs/control.in.gz b/tests/test_data/aims/double-relax-si/relax-1/inputs/control.in.gz new file mode 100644 index 0000000000..d9c370ef9a Binary files /dev/null and b/tests/test_data/aims/double-relax-si/relax-1/inputs/control.in.gz differ diff --git a/tests/test_data/aims/double-relax-si/relax-1/inputs/geometry.in.gz b/tests/test_data/aims/double-relax-si/relax-1/inputs/geometry.in.gz new file mode 100644 index 0000000000..112e2e9ee5 Binary files /dev/null and b/tests/test_data/aims/double-relax-si/relax-1/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/double-relax-si/relax-1/inputs/parameters.json b/tests/test_data/aims/double-relax-si/relax-1/inputs/parameters.json new file mode 100644 index 0000000000..df77f0481f --- /dev/null +++ b/tests/test_data/aims/double-relax-si/relax-1/inputs/parameters.json @@ -0,0 +1,12 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "relax_geometry": "trm 1.000000e-03", + "relax_unit_cell": "full", + "k_grid": [ + 2, + 2, + 2 + ], + "species_dir": "/home/andrey/workspace/atomate2-fhi-aims/tests/species_dir/light" +} diff --git a/tests/test_data/aims/double-relax-si/relax-1/outputs/aims.out.gz b/tests/test_data/aims/double-relax-si/relax-1/outputs/aims.out.gz new file mode 100644 index 0000000000..dadedac8f8 Binary files /dev/null and b/tests/test_data/aims/double-relax-si/relax-1/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/double-relax-si/relax-1/outputs/geometry.in.next_step.gz b/tests/test_data/aims/double-relax-si/relax-1/outputs/geometry.in.next_step.gz new file mode 100644 index 0000000000..877d725bd2 Binary files /dev/null and b/tests/test_data/aims/double-relax-si/relax-1/outputs/geometry.in.next_step.gz differ diff --git a/tests/test_data/aims/double-relax-si/relax-1/outputs/hessian.aims.gz b/tests/test_data/aims/double-relax-si/relax-1/outputs/hessian.aims.gz new file mode 100644 index 0000000000..cf260ff15e Binary files /dev/null and b/tests/test_data/aims/double-relax-si/relax-1/outputs/hessian.aims.gz differ diff --git a/tests/test_data/aims/double-relax-si/relax-1/outputs/parameters.json b/tests/test_data/aims/double-relax-si/relax-1/outputs/parameters.json new file mode 100644 index 0000000000..df77f0481f --- /dev/null +++ b/tests/test_data/aims/double-relax-si/relax-1/outputs/parameters.json @@ -0,0 +1,12 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "relax_geometry": "trm 1.000000e-03", + "relax_unit_cell": "full", + "k_grid": [ + 2, + 2, + 2 + ], + "species_dir": "/home/andrey/workspace/atomate2-fhi-aims/tests/species_dir/light" +} diff --git a/tests/test_data/aims/double-relax-si/relax-2/inputs/control.in.gz b/tests/test_data/aims/double-relax-si/relax-2/inputs/control.in.gz new file mode 100644 index 0000000000..491e8d6174 Binary files /dev/null and b/tests/test_data/aims/double-relax-si/relax-2/inputs/control.in.gz differ diff --git a/tests/test_data/aims/double-relax-si/relax-2/inputs/geometry.in.gz b/tests/test_data/aims/double-relax-si/relax-2/inputs/geometry.in.gz new file mode 100644 index 0000000000..d5f1112efa Binary files /dev/null and b/tests/test_data/aims/double-relax-si/relax-2/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/double-relax-si/relax-2/inputs/parameters.json b/tests/test_data/aims/double-relax-si/relax-2/inputs/parameters.json new file mode 100644 index 0000000000..d9a827c7f7 --- /dev/null +++ b/tests/test_data/aims/double-relax-si/relax-2/inputs/parameters.json @@ -0,0 +1,12 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "relax_geometry": "trm 1.000000e-03", + "relax_unit_cell": "full", + "k_grid": [ + 2, + 2, + 2 + ], + "species_dir": "/home/andrey/workspace/atomate2-fhi-aims/tests/species_dir/tight" +} diff --git a/tests/test_data/aims/double-relax-si/relax-2/outputs/aims.out.gz b/tests/test_data/aims/double-relax-si/relax-2/outputs/aims.out.gz new file mode 100644 index 0000000000..2097a29ec9 Binary files /dev/null and b/tests/test_data/aims/double-relax-si/relax-2/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/double-relax-si/relax-2/outputs/geometry.in.next_step.gz b/tests/test_data/aims/double-relax-si/relax-2/outputs/geometry.in.next_step.gz new file mode 100644 index 0000000000..c3b7e40488 Binary files /dev/null and b/tests/test_data/aims/double-relax-si/relax-2/outputs/geometry.in.next_step.gz differ diff --git a/tests/test_data/aims/double-relax-si/relax-2/outputs/hessian.aims.gz b/tests/test_data/aims/double-relax-si/relax-2/outputs/hessian.aims.gz new file mode 100644 index 0000000000..ae209dc9df Binary files /dev/null and b/tests/test_data/aims/double-relax-si/relax-2/outputs/hessian.aims.gz differ diff --git a/tests/test_data/aims/gw-o2/inputs/control.in.gz b/tests/test_data/aims/gw-o2/inputs/control.in.gz new file mode 100644 index 0000000000..d7b6de8d3c Binary files /dev/null and b/tests/test_data/aims/gw-o2/inputs/control.in.gz differ diff --git a/tests/test_data/aims/gw-o2/inputs/geometry.in.gz b/tests/test_data/aims/gw-o2/inputs/geometry.in.gz new file mode 100644 index 0000000000..e293b45689 Binary files /dev/null and b/tests/test_data/aims/gw-o2/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/gw-o2/inputs/parameters.json b/tests/test_data/aims/gw-o2/inputs/parameters.json new file mode 100644 index 0000000000..66b68b483d --- /dev/null +++ b/tests/test_data/aims/gw-o2/inputs/parameters.json @@ -0,0 +1,7 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "anacon_type": "two-pole", + "qpe_calc": "gw", + "species_dir": "/home/andrey/workspace/atomate2/tests/aims/species_dir" +} diff --git a/tests/test_data/aims/gw-o2/outputs/aims.out.gz b/tests/test_data/aims/gw-o2/outputs/aims.out.gz new file mode 100644 index 0000000000..c0ed3f7ae6 Binary files /dev/null and b/tests/test_data/aims/gw-o2/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/k-grid-convergence-si/static-1/inputs/control.in.gz b/tests/test_data/aims/k-grid-convergence-si/static-1/inputs/control.in.gz new file mode 100644 index 0000000000..5860bdbacf Binary files /dev/null and b/tests/test_data/aims/k-grid-convergence-si/static-1/inputs/control.in.gz differ diff --git a/tests/test_data/aims/k-grid-convergence-si/static-1/inputs/geometry.in.gz b/tests/test_data/aims/k-grid-convergence-si/static-1/inputs/geometry.in.gz new file mode 100644 index 0000000000..1e7b7e0b6d Binary files /dev/null and b/tests/test_data/aims/k-grid-convergence-si/static-1/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/k-grid-convergence-si/static-1/inputs/parameters.json b/tests/test_data/aims/k-grid-convergence-si/static-1/inputs/parameters.json new file mode 100644 index 0000000000..e0a715a788 --- /dev/null +++ b/tests/test_data/aims/k-grid-convergence-si/static-1/inputs/parameters.json @@ -0,0 +1,10 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "species_dir": "/home/andrey/workspace/atomate2-fhi-aims/tests/species_dir", + "k_grid": [ + 3, + 3, + 3 + ] +} diff --git a/tests/test_data/aims/k-grid-convergence-si/static-1/outputs/aims.out.gz b/tests/test_data/aims/k-grid-convergence-si/static-1/outputs/aims.out.gz new file mode 100644 index 0000000000..2595eefe98 Binary files /dev/null and b/tests/test_data/aims/k-grid-convergence-si/static-1/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/k-grid-convergence-si/static-1/outputs/convergence.json b/tests/test_data/aims/k-grid-convergence-si/static-1/outputs/convergence.json new file mode 100644 index 0000000000..414d4dca2e --- /dev/null +++ b/tests/test_data/aims/k-grid-convergence-si/static-1/outputs/convergence.json @@ -0,0 +1 @@ +{"criterion_name": "energy_per_atom", "criterion_values": [-7901.0179034638], "convergence_field_name": "k_grid", "convergence_field_values": [[3, 3, 3]], "converged": false, "idx": 0} diff --git a/tests/test_data/aims/k-grid-convergence-si/static-2/inputs/control.in.gz b/tests/test_data/aims/k-grid-convergence-si/static-2/inputs/control.in.gz new file mode 100644 index 0000000000..c9732ee23a Binary files /dev/null and b/tests/test_data/aims/k-grid-convergence-si/static-2/inputs/control.in.gz differ diff --git a/tests/test_data/aims/k-grid-convergence-si/static-2/inputs/geometry.in.gz b/tests/test_data/aims/k-grid-convergence-si/static-2/inputs/geometry.in.gz new file mode 100644 index 0000000000..498e11c2cd Binary files /dev/null and b/tests/test_data/aims/k-grid-convergence-si/static-2/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/k-grid-convergence-si/static-2/inputs/parameters.json b/tests/test_data/aims/k-grid-convergence-si/static-2/inputs/parameters.json new file mode 100644 index 0000000000..20bb9bfaeb --- /dev/null +++ b/tests/test_data/aims/k-grid-convergence-si/static-2/inputs/parameters.json @@ -0,0 +1,10 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "species_dir": "/home/andrey/workspace/atomate2-fhi-aims/tests/species_dir", + "k_grid": [ + 4, + 4, + 4 + ] +} diff --git a/tests/test_data/aims/k-grid-convergence-si/static-2/outputs/aims.out.gz b/tests/test_data/aims/k-grid-convergence-si/static-2/outputs/aims.out.gz new file mode 100644 index 0000000000..51707025c0 Binary files /dev/null and b/tests/test_data/aims/k-grid-convergence-si/static-2/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/k-grid-convergence-si/static-2/outputs/convergence.json b/tests/test_data/aims/k-grid-convergence-si/static-2/outputs/convergence.json new file mode 100644 index 0000000000..a39d506a81 --- /dev/null +++ b/tests/test_data/aims/k-grid-convergence-si/static-2/outputs/convergence.json @@ -0,0 +1 @@ +{"criterion_name": "energy_per_atom", "criterion_values": [-7901.0179034638, -7901.2322951835], "convergence_field_name": "k_grid", "convergence_field_values": [[3, 3, 3], [4, 4, 4]], "converged": false, "idx": 1} diff --git a/tests/test_data/aims/k-grid-convergence-si/static-3/inputs/control.in.gz b/tests/test_data/aims/k-grid-convergence-si/static-3/inputs/control.in.gz new file mode 100644 index 0000000000..1b4138221b Binary files /dev/null and b/tests/test_data/aims/k-grid-convergence-si/static-3/inputs/control.in.gz differ diff --git a/tests/test_data/aims/k-grid-convergence-si/static-3/inputs/geometry.in.gz b/tests/test_data/aims/k-grid-convergence-si/static-3/inputs/geometry.in.gz new file mode 100644 index 0000000000..e5c8eb4e76 Binary files /dev/null and b/tests/test_data/aims/k-grid-convergence-si/static-3/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/k-grid-convergence-si/static-3/inputs/parameters.json b/tests/test_data/aims/k-grid-convergence-si/static-3/inputs/parameters.json new file mode 100644 index 0000000000..4da6bc97ca --- /dev/null +++ b/tests/test_data/aims/k-grid-convergence-si/static-3/inputs/parameters.json @@ -0,0 +1,10 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "species_dir": "/home/andrey/workspace/atomate2-fhi-aims/tests/species_dir", + "k_grid": [ + 5, + 5, + 5 + ] +} diff --git a/tests/test_data/aims/k-grid-convergence-si/static-3/outputs/aims.out.gz b/tests/test_data/aims/k-grid-convergence-si/static-3/outputs/aims.out.gz new file mode 100644 index 0000000000..b7f3ec957f Binary files /dev/null and b/tests/test_data/aims/k-grid-convergence-si/static-3/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/k-grid-convergence-si/static-3/outputs/convergence.json b/tests/test_data/aims/k-grid-convergence-si/static-3/outputs/convergence.json new file mode 100644 index 0000000000..21187a30c5 --- /dev/null +++ b/tests/test_data/aims/k-grid-convergence-si/static-3/outputs/convergence.json @@ -0,0 +1 @@ +{"criterion_name": "energy_per_atom", "criterion_values": [-7901.0179034638, -7901.2322951835, -7901.2937239442], "convergence_field_name": "k_grid", "convergence_field_values": [[3, 3, 3], [4, 4, 4], [5, 5, 5]], "converged": true, "idx": 2} diff --git a/tests/test_data/aims/phonon-disp-default-si/inputs/control.in.gz b/tests/test_data/aims/phonon-disp-default-si/inputs/control.in.gz new file mode 100644 index 0000000000..5ffecf2b5c Binary files /dev/null and b/tests/test_data/aims/phonon-disp-default-si/inputs/control.in.gz differ diff --git a/tests/test_data/aims/phonon-disp-default-si/inputs/geometry.in.gz b/tests/test_data/aims/phonon-disp-default-si/inputs/geometry.in.gz new file mode 100644 index 0000000000..d78b872100 Binary files /dev/null and b/tests/test_data/aims/phonon-disp-default-si/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/phonon-disp-default-si/inputs/parameters.json b/tests/test_data/aims/phonon-disp-default-si/inputs/parameters.json new file mode 100644 index 0000000000..5b344c4e4e --- /dev/null +++ b/tests/test_data/aims/phonon-disp-default-si/inputs/parameters.json @@ -0,0 +1,10 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "compute_forces": true, + "k_grid": [ + 6, + 6, + 6 + ] +} diff --git a/tests/test_data/aims/phonon-disp-default-si/inputs/phonon_info.json b/tests/test_data/aims/phonon-disp-default-si/inputs/phonon_info.json new file mode 100644 index 0000000000..d1dfe9b1ae --- /dev/null +++ b/tests/test_data/aims/phonon-disp-default-si/inputs/phonon_info.json @@ -0,0 +1 @@ +{"displacement_number": 0, "original_structure": {"@module": "pymatgen.core.structure", "@class": "Structure", "charge": 0, "lattice": {"matrix": [[-3e-08, 2.73899405, 2.73899405], [2.7389941, 1e-08, 2.73899408], [2.73899409, 2.73899408, 1e-08]], "pbc": [true, true, true], "a": 3.8735225327692113, "b": 3.8735225893377536, "c": 3.873522582266686, "alpha": 59.99999957729348, "beta": 60.00000030193324, "gamma": 60.000000362319895, "volume": 41.096352213196255}, "properties": {}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [1.8254877120836109e-09, 1.8254877120836105e-09, -1.8254876987539895e-09], "xyz": [0.0, 0.0, 1e-08], "properties": {}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.25000000000000006, 0.24999999817451227, 0.25000000182548765], "xyz": [1.3694970399999997, 1.36949704, 1.36949703], "properties": {}, "label": "Si"}], "@version": null}, "supercell_matrix": [[-1, 1, 1], [1, -1, 1], [1, 1, -1]], "displaced_structure": {"@module": "pymatgen.core.structure", "@class": "Structure", "charge": 0, "lattice": {"matrix": [[5.47798822, 4.0000000196975395e-08, 4.000000025775011e-08], [-4.000000094515403e-08, 5.477988119999999, -2.0000000257750105e-08], [-1.999999913428692e-08, -2.000000031852481e-08, 5.477988119999999]], "pbc": [true, true, true], "a": 5.47798822, "b": 5.477988119999999, "c": 5.477988119999999, "alpha": 90.00000041837099, "beta": 89.99999979081451, "gamma": 90.00000000000001, "volume": 164.385408852785}, "properties": {}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [0.001825487678759564, 6.664810606729064e-18, 1.8254877120836105e-09], "xyz": [0.01, 7.301950750995721e-11, 1.00730195076209e-08], "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [6.664810462031997e-18, 0.49999999999999994, 0.5000000018254878], "xyz": [-3.0000000039720476e-08, 2.7389940499999987, 2.73899406], "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, 6.664810327060628e-18, 0.5000000018254878], "xyz": [2.7389941000000007, 9.999999939225287e-09, 2.7389940900000003], "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, 0.5, 1.8254877609535929e-09], "xyz": [2.73899409, 2.7389940799999994, 2.0000000267709184e-08], "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.24999999999999994, 0.2500000009127439, 0.24999999908725612], "xyz": [1.3694970399999997, 1.36949704, 1.3694970299999996], "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.7500000009127437, 0.7499999990872562], "xyz": [1.3694970100000001, 4.108491089999998, 4.108491079999999], "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.7499999999999999, 0.2500000009127439, 0.7499999990872561], "xyz": [4.10849114, 1.3694970499999999, 4.108491109999999], "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.7499999999999998, 0.7500000009127437, 0.24999999908725615], "xyz": [4.108491129999999, 4.108491119999997, 1.3694970399999997], "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}, "label": "Si"}], "@version": null}} diff --git a/tests/test_data/aims/phonon-disp-default-si/outputs/aims.out.gz b/tests/test_data/aims/phonon-disp-default-si/outputs/aims.out.gz new file mode 100644 index 0000000000..ea909dfc5f Binary files /dev/null and b/tests/test_data/aims/phonon-disp-default-si/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/phonon-disp-default-si/outputs/parameters.json b/tests/test_data/aims/phonon-disp-default-si/outputs/parameters.json new file mode 100644 index 0000000000..5b344c4e4e --- /dev/null +++ b/tests/test_data/aims/phonon-disp-default-si/outputs/parameters.json @@ -0,0 +1,10 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "compute_forces": true, + "k_grid": [ + 6, + 6, + 6 + ] +} diff --git a/tests/test_data/aims/phonon-disp-default-si/outputs/phonon_info.json b/tests/test_data/aims/phonon-disp-default-si/outputs/phonon_info.json new file mode 100644 index 0000000000..d1dfe9b1ae --- /dev/null +++ b/tests/test_data/aims/phonon-disp-default-si/outputs/phonon_info.json @@ -0,0 +1 @@ +{"displacement_number": 0, "original_structure": {"@module": "pymatgen.core.structure", "@class": "Structure", "charge": 0, "lattice": {"matrix": [[-3e-08, 2.73899405, 2.73899405], [2.7389941, 1e-08, 2.73899408], [2.73899409, 2.73899408, 1e-08]], "pbc": [true, true, true], "a": 3.8735225327692113, "b": 3.8735225893377536, "c": 3.873522582266686, "alpha": 59.99999957729348, "beta": 60.00000030193324, "gamma": 60.000000362319895, "volume": 41.096352213196255}, "properties": {}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [1.8254877120836109e-09, 1.8254877120836105e-09, -1.8254876987539895e-09], "xyz": [0.0, 0.0, 1e-08], "properties": {}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.25000000000000006, 0.24999999817451227, 0.25000000182548765], "xyz": [1.3694970399999997, 1.36949704, 1.36949703], "properties": {}, "label": "Si"}], "@version": null}, "supercell_matrix": [[-1, 1, 1], [1, -1, 1], [1, 1, -1]], "displaced_structure": {"@module": "pymatgen.core.structure", "@class": "Structure", "charge": 0, "lattice": {"matrix": [[5.47798822, 4.0000000196975395e-08, 4.000000025775011e-08], [-4.000000094515403e-08, 5.477988119999999, -2.0000000257750105e-08], [-1.999999913428692e-08, -2.000000031852481e-08, 5.477988119999999]], "pbc": [true, true, true], "a": 5.47798822, "b": 5.477988119999999, "c": 5.477988119999999, "alpha": 90.00000041837099, "beta": 89.99999979081451, "gamma": 90.00000000000001, "volume": 164.385408852785}, "properties": {}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [0.001825487678759564, 6.664810606729064e-18, 1.8254877120836105e-09], "xyz": [0.01, 7.301950750995721e-11, 1.00730195076209e-08], "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [6.664810462031997e-18, 0.49999999999999994, 0.5000000018254878], "xyz": [-3.0000000039720476e-08, 2.7389940499999987, 2.73899406], "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, 6.664810327060628e-18, 0.5000000018254878], "xyz": [2.7389941000000007, 9.999999939225287e-09, 2.7389940900000003], "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, 0.5, 1.8254877609535929e-09], "xyz": [2.73899409, 2.7389940799999994, 2.0000000267709184e-08], "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.24999999999999994, 0.2500000009127439, 0.24999999908725612], "xyz": [1.3694970399999997, 1.36949704, 1.3694970299999996], "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.7500000009127437, 0.7499999990872562], "xyz": [1.3694970100000001, 4.108491089999998, 4.108491079999999], "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.7499999999999999, 0.2500000009127439, 0.7499999990872561], "xyz": [4.10849114, 1.3694970499999999, 4.108491109999999], "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.7499999999999998, 0.7500000009127437, 0.24999999908725615], "xyz": [4.108491129999999, 4.108491119999997, 1.3694970399999997], "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}, "label": "Si"}], "@version": null}} diff --git a/tests/test_data/aims/phonon-disp-si/inputs/control.in.gz b/tests/test_data/aims/phonon-disp-si/inputs/control.in.gz new file mode 100644 index 0000000000..fe8140b3ab Binary files /dev/null and b/tests/test_data/aims/phonon-disp-si/inputs/control.in.gz differ diff --git a/tests/test_data/aims/phonon-disp-si/inputs/geometry.in.gz b/tests/test_data/aims/phonon-disp-si/inputs/geometry.in.gz new file mode 100644 index 0000000000..2b963fee14 Binary files /dev/null and b/tests/test_data/aims/phonon-disp-si/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/phonon-disp-si/inputs/parameters.json b/tests/test_data/aims/phonon-disp-si/inputs/parameters.json new file mode 100644 index 0000000000..af456f8145 --- /dev/null +++ b/tests/test_data/aims/phonon-disp-si/inputs/parameters.json @@ -0,0 +1,11 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "compute_forces": true, + "k_grid": [ + 2, + 2, + 2 + ], + "species_dir": "/home/tpurcell/git/fhi-aims-workflows/tests/species_dir" +} diff --git a/tests/test_data/aims/phonon-disp-si/outputs/aims.out.gz b/tests/test_data/aims/phonon-disp-si/outputs/aims.out.gz new file mode 100644 index 0000000000..a784d26199 Binary files /dev/null and b/tests/test_data/aims/phonon-disp-si/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/phonon-disp-si/outputs/parameters.json b/tests/test_data/aims/phonon-disp-si/outputs/parameters.json new file mode 100644 index 0000000000..af456f8145 --- /dev/null +++ b/tests/test_data/aims/phonon-disp-si/outputs/parameters.json @@ -0,0 +1,11 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "compute_forces": true, + "k_grid": [ + 2, + 2, + 2 + ], + "species_dir": "/home/tpurcell/git/fhi-aims-workflows/tests/species_dir" +} diff --git a/tests/test_data/aims/phonon-disp-si/outputs/phonon_info.json b/tests/test_data/aims/phonon-disp-si/outputs/phonon_info.json new file mode 100644 index 0000000000..d30543ad28 --- /dev/null +++ b/tests/test_data/aims/phonon-disp-si/outputs/phonon_info.json @@ -0,0 +1 @@ +{"displacement_number": 0, "original_structure": {"@module": "pymatgen.core.structure", "@class": "Structure", "charge": 0, "lattice": {"matrix": [[8e-08, 2.81517619, 2.81517619], [2.81517609, -4e-08, 2.81517614], [2.8151761, 2.81517615, -4e-08]], "pbc": [true, true, true], "a": 3.981260348367818, "b": 3.9812602423018, "c": 3.981260256443936, "alpha": 60.000001527565324, "beta": 59.999999236217384, "gamma": 59.999999236217384, "volume": 44.621762070481566}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [0.49999999467173656, 0.5000000000000001, 0.5000000053282636], "xyz": [2.81517615, 2.81517615, 2.8151761299999998], "label": "Si", "properties": {}}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.7500000088804388, 0.7499999991119557, 0.749999992895649], "xyz": [4.22276418, 4.222764230000001, 4.222764239999999], "label": "Si", "properties": {}}], "@version": null}, "supercell_matrix": [[-1, 1, 1], [1, -1, 1], [1, 1, -1]], "displaced_structure": {"@module": "pymatgen.core.structure", "@class": "Structure", "charge": 0, "lattice": {"matrix": [[5.63035211, -7.999999981810572e-08, -8.999999985240013e-08], [8.999999959281342e-08, 5.630352380000001, 9.999999852400117e-09], [7.000000032296964e-08, -5.838750140781575e-16, 5.63035237]], "pbc": [true, true, true], "a": 5.630352110000001, "b": 5.6303523800000015, "c": 5.63035237, "alpha": 89.99999989823768, "beta": 90.0000002035247, "gamma": 89.9999998982377, "volume": 178.48704828192623}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [0.5017760905187862, 0.49999999999999994, 0.49999999733586836], "xyz": [2.8251761499999986, 2.8151761498579124, 2.8151761298401516], "label": "Si", "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5000000026641317, -1.1034582707650634e-24, 0.9999999973358682], "xyz": [2.8151761399999993, -4.0000000706058416e-08, 5.630352309999998], "label": "Si", "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}}, {"species": [{"element": "Si", "occu": 1}], "abc": [2.6641318040532244e-09, 0.5, 0.9999999973358683], "xyz": [1.3000000005715633e-07, 2.81517619, 5.630352359999999], "label": "Si", "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}}, {"species": [{"element": "Si", "occu": 1}], "abc": [2.664131804053227e-09, -2.9512947386011535e-33, 0.4999999973358682], "xyz": [5.000000009926479e-08, -5.050680493232266e-16, 2.8151761699999986], "label": "Si", "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.7499999960038022, 0.7500000008880441, 0.7500000039961972], "xyz": [4.222764179999999, 4.222764230000002, 4.222764239999998], "label": "Si", "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.7499999960038023, 0.25000000088804386, 0.25000000399619715], "xyz": [4.2227641, 1.4075880400000003, 1.4075880499999984], "label": "Si", "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.24999999600380218, 0.750000000888044, 0.25000000399619715], "xyz": [1.4075880899999993, 4.222764270000001, 1.4075880999999983], "label": "Si", "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.2499999960038022, 0.25000000088804386, 0.7500000039961972], "xyz": [1.4075880799999998, 1.40758808, 4.222764279999998], "label": "Si", "properties": {"phonopy_masses": 28.0855, "magnetic_moments": 0}}], "@version": null}} diff --git a/tests/test_data/aims/phonon-energy-default-si/inputs/control.in.gz b/tests/test_data/aims/phonon-energy-default-si/inputs/control.in.gz new file mode 100644 index 0000000000..dbf16d54f1 Binary files /dev/null and b/tests/test_data/aims/phonon-energy-default-si/inputs/control.in.gz differ diff --git a/tests/test_data/aims/phonon-energy-default-si/inputs/geometry.in.gz b/tests/test_data/aims/phonon-energy-default-si/inputs/geometry.in.gz new file mode 100644 index 0000000000..73264e4327 Binary files /dev/null and b/tests/test_data/aims/phonon-energy-default-si/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/phonon-energy-default-si/inputs/parameters.json b/tests/test_data/aims/phonon-energy-default-si/inputs/parameters.json new file mode 100644 index 0000000000..1968c5ca95 --- /dev/null +++ b/tests/test_data/aims/phonon-energy-default-si/inputs/parameters.json @@ -0,0 +1,9 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "k_grid": [ + 10, + 10, + 10 + ] +} diff --git a/tests/test_data/aims/phonon-energy-default-si/outputs/aims.out.gz b/tests/test_data/aims/phonon-energy-default-si/outputs/aims.out.gz new file mode 100644 index 0000000000..46dcd5c848 Binary files /dev/null and b/tests/test_data/aims/phonon-energy-default-si/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/phonon-energy-default-si/outputs/parameters.json b/tests/test_data/aims/phonon-energy-default-si/outputs/parameters.json new file mode 100644 index 0000000000..1968c5ca95 --- /dev/null +++ b/tests/test_data/aims/phonon-energy-default-si/outputs/parameters.json @@ -0,0 +1,9 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "k_grid": [ + 10, + 10, + 10 + ] +} diff --git a/tests/test_data/aims/phonon-energy-si/inputs/control.in.gz b/tests/test_data/aims/phonon-energy-si/inputs/control.in.gz new file mode 100644 index 0000000000..a8f40f03a3 Binary files /dev/null and b/tests/test_data/aims/phonon-energy-si/inputs/control.in.gz differ diff --git a/tests/test_data/aims/phonon-energy-si/inputs/geometry.in.gz b/tests/test_data/aims/phonon-energy-si/inputs/geometry.in.gz new file mode 100644 index 0000000000..7e27b3b381 Binary files /dev/null and b/tests/test_data/aims/phonon-energy-si/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/phonon-energy-si/inputs/parameters.json b/tests/test_data/aims/phonon-energy-si/inputs/parameters.json new file mode 100644 index 0000000000..aae78df5bb --- /dev/null +++ b/tests/test_data/aims/phonon-energy-si/inputs/parameters.json @@ -0,0 +1,10 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "k_grid": [ + 2, + 2, + 2 + ], + "species_dir": "/home/tpurcell/git/fhi-aims-workflows/tests/species_dir" +} diff --git a/tests/test_data/aims/phonon-energy-si/outputs/aims.out.gz b/tests/test_data/aims/phonon-energy-si/outputs/aims.out.gz new file mode 100644 index 0000000000..864551875c Binary files /dev/null and b/tests/test_data/aims/phonon-energy-si/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/phonon-energy-si/outputs/parameters.json b/tests/test_data/aims/phonon-energy-si/outputs/parameters.json new file mode 100644 index 0000000000..aae78df5bb --- /dev/null +++ b/tests/test_data/aims/phonon-energy-si/outputs/parameters.json @@ -0,0 +1,10 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "k_grid": [ + 2, + 2, + 2 + ], + "species_dir": "/home/tpurcell/git/fhi-aims-workflows/tests/species_dir" +} diff --git a/tests/test_data/aims/phonon-relax-default-si/inputs/control.in.gz b/tests/test_data/aims/phonon-relax-default-si/inputs/control.in.gz new file mode 100644 index 0000000000..7b2397afff Binary files /dev/null and b/tests/test_data/aims/phonon-relax-default-si/inputs/control.in.gz differ diff --git a/tests/test_data/aims/phonon-relax-default-si/inputs/geometry.in.gz b/tests/test_data/aims/phonon-relax-default-si/inputs/geometry.in.gz new file mode 100644 index 0000000000..cdb8801e0f Binary files /dev/null and b/tests/test_data/aims/phonon-relax-default-si/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/phonon-relax-default-si/inputs/parameters.json b/tests/test_data/aims/phonon-relax-default-si/inputs/parameters.json new file mode 100644 index 0000000000..03313466fb --- /dev/null +++ b/tests/test_data/aims/phonon-relax-default-si/inputs/parameters.json @@ -0,0 +1,11 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "relax_geometry": "trm 1.000000e-03", + "relax_unit_cell": "full", + "k_grid": [ + 12, + 12, + 12 + ] +} diff --git a/tests/test_data/aims/phonon-relax-default-si/outputs/aims.out.gz b/tests/test_data/aims/phonon-relax-default-si/outputs/aims.out.gz new file mode 100644 index 0000000000..9778a19878 Binary files /dev/null and b/tests/test_data/aims/phonon-relax-default-si/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/phonon-relax-default-si/outputs/geometry.in.next_step.gz b/tests/test_data/aims/phonon-relax-default-si/outputs/geometry.in.next_step.gz new file mode 100644 index 0000000000..de204607fd Binary files /dev/null and b/tests/test_data/aims/phonon-relax-default-si/outputs/geometry.in.next_step.gz differ diff --git a/tests/test_data/aims/phonon-relax-default-si/outputs/hessian.aims.gz b/tests/test_data/aims/phonon-relax-default-si/outputs/hessian.aims.gz new file mode 100644 index 0000000000..bb878021d2 Binary files /dev/null and b/tests/test_data/aims/phonon-relax-default-si/outputs/hessian.aims.gz differ diff --git a/tests/test_data/aims/phonon-relax-default-si/outputs/parameters.json b/tests/test_data/aims/phonon-relax-default-si/outputs/parameters.json new file mode 100644 index 0000000000..03313466fb --- /dev/null +++ b/tests/test_data/aims/phonon-relax-default-si/outputs/parameters.json @@ -0,0 +1,11 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "relax_geometry": "trm 1.000000e-03", + "relax_unit_cell": "full", + "k_grid": [ + 12, + 12, + 12 + ] +} diff --git a/tests/test_data/aims/phonon-relax-si/inputs/control.in.gz b/tests/test_data/aims/phonon-relax-si/inputs/control.in.gz new file mode 100644 index 0000000000..19db70aa41 Binary files /dev/null and b/tests/test_data/aims/phonon-relax-si/inputs/control.in.gz differ diff --git a/tests/test_data/aims/phonon-relax-si/inputs/geometry.in.gz b/tests/test_data/aims/phonon-relax-si/inputs/geometry.in.gz new file mode 100644 index 0000000000..dad8ff21c8 Binary files /dev/null and b/tests/test_data/aims/phonon-relax-si/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/phonon-relax-si/inputs/geometry.in.next_step.gz b/tests/test_data/aims/phonon-relax-si/inputs/geometry.in.next_step.gz new file mode 100644 index 0000000000..d6296e86e3 Binary files /dev/null and b/tests/test_data/aims/phonon-relax-si/inputs/geometry.in.next_step.gz differ diff --git a/tests/test_data/aims/phonon-relax-si/inputs/parameters.json b/tests/test_data/aims/phonon-relax-si/inputs/parameters.json new file mode 100644 index 0000000000..94d2aefa89 --- /dev/null +++ b/tests/test_data/aims/phonon-relax-si/inputs/parameters.json @@ -0,0 +1,12 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "relax_geometry": "trm 1.000000e-03", + "relax_unit_cell": "full", + "k_grid": [ + 2, + 2, + 2 + ], + "species_dir": "/home/tpurcell/git/fhi-aims-workflows/tests/species_dir" +} diff --git a/tests/test_data/aims/phonon-relax-si/outputs/aims.out.gz b/tests/test_data/aims/phonon-relax-si/outputs/aims.out.gz new file mode 100644 index 0000000000..b57e84b688 Binary files /dev/null and b/tests/test_data/aims/phonon-relax-si/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/phonon-relax-si/outputs/hessian.aims.gz b/tests/test_data/aims/phonon-relax-si/outputs/hessian.aims.gz new file mode 100644 index 0000000000..719c08223b Binary files /dev/null and b/tests/test_data/aims/phonon-relax-si/outputs/hessian.aims.gz differ diff --git a/tests/test_data/aims/phonon-relax-si/outputs/parameters.json b/tests/test_data/aims/phonon-relax-si/outputs/parameters.json new file mode 100644 index 0000000000..94d2aefa89 --- /dev/null +++ b/tests/test_data/aims/phonon-relax-si/outputs/parameters.json @@ -0,0 +1,12 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "relax_geometry": "trm 1.000000e-03", + "relax_unit_cell": "full", + "k_grid": [ + 2, + 2, + 2 + ], + "species_dir": "/home/tpurcell/git/fhi-aims-workflows/tests/species_dir" +} diff --git a/tests/test_data/aims/relax-fixed-cell-si/inputs/control.in.gz b/tests/test_data/aims/relax-fixed-cell-si/inputs/control.in.gz new file mode 100644 index 0000000000..2491c79756 Binary files /dev/null and b/tests/test_data/aims/relax-fixed-cell-si/inputs/control.in.gz differ diff --git a/tests/test_data/aims/relax-fixed-cell-si/inputs/geometry.in.gz b/tests/test_data/aims/relax-fixed-cell-si/inputs/geometry.in.gz new file mode 100644 index 0000000000..9e4821e287 Binary files /dev/null and b/tests/test_data/aims/relax-fixed-cell-si/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/relax-fixed-cell-si/inputs/parameters.json b/tests/test_data/aims/relax-fixed-cell-si/inputs/parameters.json new file mode 100644 index 0000000000..c239896cd4 --- /dev/null +++ b/tests/test_data/aims/relax-fixed-cell-si/inputs/parameters.json @@ -0,0 +1,12 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "relax_geometry": "trm 1.000000e-03", + "relax_unit_cell": "none", + "k_grid": [ + 2, + 2, + 2 + ], + "species_dir": "/home/andrey/workspace/fhi-aims-workflows/tests/species_dir" +} diff --git a/tests/test_data/aims/relax-fixed-cell-si/outputs/aims.out.gz b/tests/test_data/aims/relax-fixed-cell-si/outputs/aims.out.gz new file mode 100644 index 0000000000..5d794247b2 Binary files /dev/null and b/tests/test_data/aims/relax-fixed-cell-si/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/relax-fixed-cell-si/outputs/geometry.in.next_step.gz b/tests/test_data/aims/relax-fixed-cell-si/outputs/geometry.in.next_step.gz new file mode 100644 index 0000000000..712bdd29ef Binary files /dev/null and b/tests/test_data/aims/relax-fixed-cell-si/outputs/geometry.in.next_step.gz differ diff --git a/tests/test_data/aims/relax-fixed-cell-si/outputs/hessian.aims.gz b/tests/test_data/aims/relax-fixed-cell-si/outputs/hessian.aims.gz new file mode 100644 index 0000000000..dd72b9da9f Binary files /dev/null and b/tests/test_data/aims/relax-fixed-cell-si/outputs/hessian.aims.gz differ diff --git a/tests/test_data/aims/relax-si/inputs/control.in.gz b/tests/test_data/aims/relax-si/inputs/control.in.gz new file mode 100644 index 0000000000..af14d9f6c9 Binary files /dev/null and b/tests/test_data/aims/relax-si/inputs/control.in.gz differ diff --git a/tests/test_data/aims/relax-si/inputs/geometry.in.gz b/tests/test_data/aims/relax-si/inputs/geometry.in.gz new file mode 100644 index 0000000000..c2e720a036 Binary files /dev/null and b/tests/test_data/aims/relax-si/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/relax-si/inputs/parameters.json b/tests/test_data/aims/relax-si/inputs/parameters.json new file mode 100644 index 0000000000..03d3f9b545 --- /dev/null +++ b/tests/test_data/aims/relax-si/inputs/parameters.json @@ -0,0 +1,12 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "relax_geometry": "trm 1.000000e-03", + "relax_unit_cell": "full", + "species_dir": "/home/tpurcell/git/atomate2/tests/aims/species_dir/light", + "k_grid": [ + 2, + 2, + 2 + ] +} diff --git a/tests/test_data/aims/relax-si/outputs/aims.out.gz b/tests/test_data/aims/relax-si/outputs/aims.out.gz new file mode 100644 index 0000000000..d20bcb7625 Binary files /dev/null and b/tests/test_data/aims/relax-si/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/relax-si/outputs/geometry.in.next_step.gz b/tests/test_data/aims/relax-si/outputs/geometry.in.next_step.gz new file mode 100644 index 0000000000..00a2d1f5fd Binary files /dev/null and b/tests/test_data/aims/relax-si/outputs/geometry.in.next_step.gz differ diff --git a/tests/test_data/aims/relax-si/outputs/hessian.aims.gz b/tests/test_data/aims/relax-si/outputs/hessian.aims.gz new file mode 100644 index 0000000000..cf260ff15e Binary files /dev/null and b/tests/test_data/aims/relax-si/outputs/hessian.aims.gz differ diff --git a/tests/test_data/aims/relax-si/outputs/parameters.json b/tests/test_data/aims/relax-si/outputs/parameters.json new file mode 100644 index 0000000000..51893ca6b0 --- /dev/null +++ b/tests/test_data/aims/relax-si/outputs/parameters.json @@ -0,0 +1 @@ +{"xc": "pbe", "relativistic": "atomic_zora scalar", "relax_geometry": "trm 1.000000e-03", "relax_unit_cell": "full", "k_grid": [2, 2, 2], "species_dir": "/home/purcellt/git/atomate2/tests/aims/species_dir/light"} diff --git a/tests/test_data/aims/relax-si/outputs/~parameters.json b/tests/test_data/aims/relax-si/outputs/~parameters.json new file mode 100644 index 0000000000..51893ca6b0 --- /dev/null +++ b/tests/test_data/aims/relax-si/outputs/~parameters.json @@ -0,0 +1 @@ +{"xc": "pbe", "relativistic": "atomic_zora scalar", "relax_geometry": "trm 1.000000e-03", "relax_unit_cell": "full", "k_grid": [2, 2, 2], "species_dir": "/home/purcellt/git/atomate2/tests/aims/species_dir/light"} diff --git a/tests/test_data/aims/static-si-bs-density/aims.out.gz b/tests/test_data/aims/static-si-bs-density/aims.out.gz new file mode 100644 index 0000000000..7b8a3b57e5 Binary files /dev/null and b/tests/test_data/aims/static-si-bs-density/aims.out.gz differ diff --git a/tests/test_data/aims/static-si-bs-density/band1001.out b/tests/test_data/aims/static-si-bs-density/band1001.out new file mode 100644 index 0000000000..d1b0ef3c68 --- /dev/null +++ b/tests/test_data/aims/static-si-bs-density/band1001.out @@ -0,0 +1,46 @@ + 1 0.0000000 0.0000000 0.0000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90289 2.00000 -133.89518 2.00000 -89.92384 2.00000 -89.92384 2.00000 -89.92384 2.00000 -89.90697 2.00000 -89.90697 2.00000 -89.90697 2.00000 -12.16929 2.00000 -0.18870 2.00000 -0.18870 2.00000 -0.18870 0.00000 2.37720 0.00000 2.37720 0.00000 2.37720 0.00000 3.21314 0.00000 7.69054 0.00000 7.69054 0.00000 8.40613 0.00000 11.78863 0.00000 11.78863 0.00000 11.78863 0.00000 22.04643 + 2 0.0111111 0.0000000 0.0111111 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90289 2.00000 -133.89518 2.00000 -89.92385 2.00000 -89.92385 2.00000 -89.92384 2.00000 -89.90698 2.00000 -89.90697 2.00000 -89.90697 2.00000 -12.16714 2.00000 -0.20369 2.00000 -0.19825 2.00000 -0.19825 0.00000 2.37187 0.00000 2.38942 0.00000 2.38942 0.00000 3.22792 0.00000 7.67469 0.00000 7.69291 0.00000 8.41312 0.00000 11.79275 0.00000 11.79275 0.00000 11.80396 0.00000 22.05584 + 3 0.0222222 0.0000000 0.0222222 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90288 2.00000 -133.89519 2.00000 -89.92386 2.00000 -89.92386 2.00000 -89.92382 2.00000 -89.90699 2.00000 -89.90696 2.00000 -89.90696 2.00000 -12.16068 2.00000 -0.24786 2.00000 -0.22633 2.00000 -0.22633 0.00000 2.35599 0.00000 2.42553 0.00000 2.42553 0.00000 3.27132 0.00000 7.62812 0.00000 7.70000 0.00000 8.43420 0.00000 11.80508 0.00000 11.80508 0.00000 11.84913 0.00000 22.08373 + 4 0.0333333 0.0000000 0.0333333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90287 2.00000 -133.89520 2.00000 -89.92387 2.00000 -89.92387 2.00000 -89.92380 2.00000 -89.90702 2.00000 -89.90694 2.00000 -89.90694 2.00000 -12.14991 2.00000 -0.31898 2.00000 -0.27142 2.00000 -0.27142 0.00000 2.32994 0.00000 2.48396 0.00000 2.48396 0.00000 3.34078 0.00000 7.55366 0.00000 7.71183 0.00000 8.46959 0.00000 11.82560 0.00000 11.82560 0.00000 11.92189 0.00000 22.12917 + 5 0.0444444 0.0000000 0.0444444 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90286 2.00000 -133.89521 2.00000 -89.92390 2.00000 -89.92390 2.00000 -89.92376 2.00000 -89.90705 2.00000 -89.90692 2.00000 -89.90692 2.00000 -12.13484 2.00000 -0.41389 2.00000 -0.33131 2.00000 -0.33131 0.00000 2.29431 0.00000 2.56253 0.00000 2.56253 0.00000 3.43250 0.00000 7.45546 0.00000 7.72839 0.00000 8.51958 0.00000 11.85425 0.00000 11.85425 0.00000 12.01902 0.00000 22.19072 + 6 0.0555556 0.0000000 0.0555556 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90284 2.00000 -133.89524 2.00000 -89.92393 2.00000 -89.92393 2.00000 -89.92372 2.00000 -89.90710 2.00000 -89.90689 2.00000 -89.90689 2.00000 -12.11546 2.00000 -0.52906 2.00000 -0.40351 2.00000 -0.40351 0.00000 2.24986 0.00000 2.65871 0.00000 2.65871 0.00000 3.54196 0.00000 7.33857 0.00000 7.74969 0.00000 8.58441 0.00000 11.89095 0.00000 11.89095 0.00000 12.13690 0.00000 22.26671 + 7 0.0666667 0.0000000 0.0666667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90281 2.00000 -133.89526 2.00000 -89.92397 2.00000 -89.92397 2.00000 -89.92366 2.00000 -89.90716 2.00000 -89.90685 2.00000 -89.90685 2.00000 -12.09177 2.00000 -0.66106 2.00000 -0.48558 2.00000 -0.48558 0.00000 2.19749 0.00000 2.77003 0.00000 2.77003 0.00000 3.66426 0.00000 7.20852 0.00000 7.77573 0.00000 8.66417 0.00000 11.93560 0.00000 11.93560 0.00000 12.27194 0.00000 22.35540 + 8 0.0777778 0.0000000 0.0777778 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90278 2.00000 -133.89529 2.00000 -89.92401 2.00000 -89.92401 2.00000 -89.92359 2.00000 -89.90722 2.00000 -89.90681 2.00000 -89.90681 2.00000 -12.06378 2.00000 -0.80677 2.00000 -0.57526 2.00000 -0.57526 0.00000 2.13818 0.00000 2.89422 0.00000 2.89422 0.00000 3.79416 0.00000 7.07120 0.00000 7.80651 0.00000 8.75880 0.00000 11.98808 0.00000 11.98808 0.00000 12.42092 0.00000 22.45519 + 9 0.0888889 0.0000000 0.0888889 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90275 2.00000 -133.89533 2.00000 -89.92406 2.00000 -89.92406 2.00000 -89.92352 2.00000 -89.90730 2.00000 -89.90676 2.00000 -89.90676 2.00000 -12.03148 2.00000 -0.96356 2.00000 -0.67060 2.00000 -0.67060 0.00000 2.07294 0.00000 3.02928 0.00000 3.02928 0.00000 3.92597 0.00000 6.93294 0.00000 7.84204 0.00000 8.86798 0.00000 12.04826 0.00000 12.04826 0.00000 12.58110 0.00000 22.53299 + 10 0.1000000 0.0000000 0.1000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90271 2.00000 -133.89537 2.00000 -89.92411 2.00000 -89.92411 2.00000 -89.92343 2.00000 -89.90739 2.00000 -89.90670 2.00000 -89.90670 2.00000 -11.99490 2.00000 -1.12924 2.00000 -0.76998 2.00000 -0.76998 0.00000 2.00278 0.00000 3.17356 0.00000 3.17356 0.00000 4.05315 0.00000 6.80084 0.00000 7.88232 0.00000 8.99123 0.00000 12.11598 0.00000 12.11598 0.00000 12.75019 0.00000 22.18714 + 11 0.1111111 0.0000000 0.1111111 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90267 2.00000 -133.89541 2.00000 -89.92417 2.00000 -89.92417 2.00000 -89.92334 2.00000 -89.90748 2.00000 -89.90664 2.00000 -89.90664 2.00000 -11.95403 2.00000 -1.30205 2.00000 -0.87203 2.00000 -0.87203 0.00000 1.92865 0.00000 3.32568 0.00000 3.32568 0.00000 4.16788 0.00000 6.68315 0.00000 7.92735 0.00000 9.12790 0.00000 12.19103 0.00000 12.19103 0.00000 12.92633 0.00000 21.84215 + 12 0.1222222 0.0000000 0.1222222 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90262 2.00000 -133.89546 2.00000 -89.92424 2.00000 -89.92424 2.00000 -89.92323 2.00000 -89.90759 2.00000 -89.90658 2.00000 -89.90658 2.00000 -11.90888 2.00000 -1.48058 2.00000 -0.97567 2.00000 -0.97567 0.00000 1.85148 0.00000 3.48448 0.00000 3.48448 0.00000 4.26087 0.00000 6.58947 0.00000 7.97715 0.00000 9.27722 0.00000 12.27321 0.00000 12.27321 0.00000 13.10802 0.00000 21.49965 + 13 0.1333333 0.0000000 0.1333333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90257 2.00000 -133.89551 2.00000 -89.92431 2.00000 -89.92431 2.00000 -89.92312 2.00000 -89.90770 2.00000 -89.90651 2.00000 -89.90651 2.00000 -11.85948 2.00000 -1.66370 2.00000 -1.07999 2.00000 -1.07999 0.00000 1.77210 0.00000 3.64905 0.00000 3.64905 0.00000 4.32197 0.00000 6.53020 0.00000 8.03171 0.00000 9.43836 0.00000 12.36225 0.00000 12.36225 0.00000 13.29395 0.00000 21.16090 + 14 0.1444445 0.0000000 0.1444445 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90251 2.00000 -133.89557 2.00000 -89.92438 2.00000 -89.92438 2.00000 -89.92299 2.00000 -89.90783 2.00000 -89.90644 2.00000 -89.90644 2.00000 -11.80583 2.00000 -1.85052 2.00000 -1.18428 2.00000 -1.18428 0.00000 1.69130 0.00000 3.81860 0.00000 3.81860 0.00000 4.34226 0.00000 6.51437 0.00000 8.09104 0.00000 9.61045 0.00000 12.45782 0.00000 12.45782 0.00000 13.48301 0.00000 20.82693 + 15 0.1555556 0.0000000 0.1555556 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90245 2.00000 -133.89563 2.00000 -89.92446 2.00000 -89.92446 2.00000 -89.92286 2.00000 -89.90796 2.00000 -89.90636 2.00000 -89.90636 2.00000 -11.74794 2.00000 -2.04033 2.00000 -1.28792 2.00000 -1.28792 0.00000 1.60977 0.00000 3.99252 0.00000 3.99252 0.00000 4.31726 0.00000 6.54660 0.00000 8.15516 0.00000 9.79258 0.00000 12.55951 0.00000 12.55951 0.00000 13.67423 0.00000 20.49867 + 16 0.1666667 0.0000000 0.1666667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90239 2.00000 -133.89570 2.00000 -89.92454 2.00000 -89.92454 2.00000 -89.92272 2.00000 -89.90811 2.00000 -89.90628 2.00000 -89.90628 2.00000 -11.68584 2.00000 -2.23256 2.00000 -1.39044 2.00000 -1.39044 0.00000 1.52813 0.00000 4.17027 0.00000 4.17027 0.00000 4.24873 0.00000 6.62524 0.00000 8.22406 0.00000 9.98386 0.00000 12.66683 0.00000 12.66683 0.00000 13.86678 0.00000 20.17701 + 17 0.1777778 0.0000000 0.1777778 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90232 2.00000 -133.89577 2.00000 -89.92462 2.00000 -89.92462 2.00000 -89.92257 2.00000 -89.90826 2.00000 -89.90620 2.00000 -89.90620 2.00000 -11.61955 2.00000 -2.42674 2.00000 -1.49143 2.00000 -1.49143 0.00000 1.44696 0.00000 4.14345 0.00000 4.35142 0.00000 4.35142 0.00000 6.74375 0.00000 8.29775 0.00000 10.18342 0.00000 12.77911 0.00000 12.77911 0.00000 14.05998 0.00000 19.86290 + 18 0.1888889 0.0000000 0.1888889 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90224 2.00000 -133.89584 2.00000 -89.92470 2.00000 -89.92470 2.00000 -89.92241 2.00000 -89.90842 2.00000 -89.90612 2.00000 -89.90612 2.00000 -11.54908 2.00000 -2.62250 2.00000 -1.59055 2.00000 -1.59055 0.00000 1.36673 0.00000 4.01013 0.00000 4.53559 0.00000 4.53559 0.00000 6.89382 0.00000 8.37624 0.00000 10.39036 0.00000 12.89552 0.00000 12.89552 0.00000 14.25335 0.00000 19.55739 + 19 0.2000000 0.0000000 0.2000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90217 2.00000 -133.89592 2.00000 -89.92479 2.00000 -89.92479 2.00000 -89.92224 2.00000 -89.90859 2.00000 -89.90604 2.00000 -89.90604 2.00000 -11.47446 2.00000 -2.81952 2.00000 -1.68752 2.00000 -1.68752 0.00000 1.28791 0.00000 3.85696 0.00000 4.72248 0.00000 4.72248 0.00000 7.06774 0.00000 8.45954 0.00000 10.60381 0.00000 13.01497 0.00000 13.01497 0.00000 14.44666 0.00000 19.26174 + 20 0.2111111 0.0000000 0.2111111 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90209 2.00000 -133.89600 2.00000 -89.92487 2.00000 -89.92487 2.00000 -89.92207 2.00000 -89.90877 2.00000 -89.90595 2.00000 -89.90595 2.00000 -11.39571 2.00000 -3.01756 2.00000 -1.78210 2.00000 -1.78210 0.00000 1.21089 0.00000 3.69069 0.00000 4.91183 0.00000 4.91183 0.00000 7.25940 0.00000 8.54765 0.00000 10.82286 0.00000 13.13604 0.00000 13.13604 0.00000 14.63991 0.00000 18.97749 + 21 0.2222222 0.0000000 0.2222222 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90200 2.00000 -133.89608 2.00000 -89.92496 2.00000 -89.92496 2.00000 -89.92188 2.00000 -89.90895 2.00000 -89.90586 2.00000 -89.90586 2.00000 -11.31285 2.00000 -3.21639 2.00000 -1.87409 2.00000 -1.87409 0.00000 1.13602 0.00000 3.51656 0.00000 5.10341 0.00000 5.10341 0.00000 7.46421 0.00000 8.64058 0.00000 11.04659 0.00000 13.25689 0.00000 13.25689 0.00000 14.83332 0.00000 18.70657 + 22 0.2333333 0.0000000 0.2333333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90191 2.00000 -133.89617 2.00000 -89.92505 2.00000 -89.92505 2.00000 -89.92169 2.00000 -89.90915 2.00000 -89.90578 2.00000 -89.90578 2.00000 -11.22592 2.00000 -3.41582 2.00000 -1.96331 2.00000 -1.96331 0.00000 1.06362 0.00000 3.33854 0.00000 5.29704 0.00000 5.29704 0.00000 7.67885 0.00000 8.73833 0.00000 11.27403 0.00000 13.37510 0.00000 13.37510 0.00000 15.02730 0.00000 18.45146 + 23 0.2444444 0.0000000 0.2444444 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90182 2.00000 -133.89626 2.00000 -89.92514 2.00000 -89.92514 2.00000 -89.92149 2.00000 -89.90935 2.00000 -89.90569 2.00000 -89.90569 2.00000 -11.13493 2.00000 -3.61568 2.00000 -2.04961 2.00000 -2.04961 0.00000 0.99397 0.00000 3.15959 0.00000 5.49256 0.00000 5.49256 0.00000 7.90089 0.00000 8.84092 0.00000 11.50412 0.00000 13.48756 0.00000 13.48756 0.00000 15.22239 0.00000 18.21529 + 24 0.2555556 0.0000000 0.2555556 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90173 2.00000 -133.89636 2.00000 -89.92522 2.00000 -89.92522 2.00000 -89.92128 2.00000 -89.90956 2.00000 -89.90560 2.00000 -89.90560 2.00000 -11.03992 2.00000 -3.81582 2.00000 -2.13287 2.00000 -2.13287 0.00000 0.92733 0.00000 2.98194 0.00000 5.68983 0.00000 5.68983 0.00000 8.12853 0.00000 8.94834 0.00000 11.73573 0.00000 13.59032 0.00000 13.59032 0.00000 15.41917 0.00000 18.00203 + 25 0.2666667 0.0000000 0.2666667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90163 2.00000 -133.89646 2.00000 -89.92531 2.00000 -89.92531 2.00000 -89.92107 2.00000 -89.90978 2.00000 -89.90552 2.00000 -89.90552 2.00000 -10.94093 2.00000 -4.01609 2.00000 -2.21296 2.00000 -2.21296 0.00000 0.86393 0.00000 2.80722 0.00000 5.88875 0.00000 5.88875 0.00000 8.36039 0.00000 9.06062 0.00000 11.96756 0.00000 13.67854 0.00000 13.67854 0.00000 15.61824 0.00000 17.81650 + 26 0.2777778 0.0000000 0.2777778 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90152 2.00000 -133.89656 2.00000 -89.92539 2.00000 -89.92539 2.00000 -89.92085 2.00000 -89.91000 2.00000 -89.90544 2.00000 -89.90544 2.00000 -10.83799 2.00000 -4.21637 2.00000 -2.28980 2.00000 -2.28980 0.00000 0.80398 0.00000 2.63665 0.00000 6.08923 0.00000 6.08923 0.00000 8.59540 0.00000 9.17774 0.00000 12.19816 0.00000 13.74657 0.00000 13.74657 0.00000 15.82016 0.00000 17.66428 + 27 0.2888889 0.0000000 0.2888889 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90142 2.00000 -133.89666 2.00000 -89.92548 2.00000 -89.92548 2.00000 -89.92062 2.00000 -89.91023 2.00000 -89.90535 2.00000 -89.90535 2.00000 -10.73112 2.00000 -4.41651 2.00000 -2.36329 2.00000 -2.36329 0.00000 0.74767 0.00000 2.47108 0.00000 6.29117 0.00000 6.29117 0.00000 8.83269 0.00000 9.29973 0.00000 12.42586 0.00000 13.78847 0.00000 13.78847 0.00000 16.02541 0.00000 17.54221 + 28 0.3000000 0.0000000 0.3000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90131 2.00000 -133.89677 2.00000 -89.92556 2.00000 -89.92556 2.00000 -89.92038 2.00000 -89.91047 2.00000 -89.90527 2.00000 -89.90527 2.00000 -10.62038 2.00000 -4.61638 2.00000 -2.43336 2.00000 -2.43336 0.00000 0.69518 0.00000 2.31114 0.00000 6.49452 0.00000 6.49452 0.00000 9.07156 0.00000 9.42658 0.00000 12.64869 0.00000 13.79881 0.00000 13.79881 0.00000 16.23440 0.00000 17.23924 + 29 0.3111111 0.0000000 0.3111111 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90120 2.00000 -133.89688 2.00000 -89.92564 2.00000 -89.92564 2.00000 -89.92014 2.00000 -89.91071 2.00000 -89.90520 2.00000 -89.90520 2.00000 -10.50580 2.00000 -4.81587 2.00000 -2.49994 2.00000 -2.49994 0.00000 0.64666 0.00000 2.15725 0.00000 6.69922 0.00000 6.69922 0.00000 9.31138 0.00000 9.55830 0.00000 12.86438 0.00000 13.77387 0.00000 13.77387 0.00000 16.44746 0.00000 16.94025 + 30 0.3222222 0.0000000 0.3222222 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90109 2.00000 -133.89699 2.00000 -89.92571 2.00000 -89.92571 2.00000 -89.91990 2.00000 -89.91096 2.00000 -89.90512 2.00000 -89.90512 2.00000 -10.38743 2.00000 -5.01484 2.00000 -2.56298 2.00000 -2.56298 0.00000 0.60228 0.00000 2.00972 0.00000 6.90523 0.00000 6.90523 0.00000 9.55163 0.00000 9.69491 0.00000 13.07030 0.00000 13.71256 0.00000 13.71256 0.00000 16.64538 0.00000 16.66480 + 31 0.3333333 0.0000000 0.3333333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90097 2.00000 -133.89711 2.00000 -89.92578 2.00000 -89.92578 2.00000 -89.91965 2.00000 -89.91121 2.00000 -89.90505 2.00000 -89.90505 2.00000 -10.26531 2.00000 -5.21316 2.00000 -2.62241 2.00000 -2.62241 0.00000 0.56217 0.00000 1.86874 0.00000 7.11248 0.00000 7.11248 0.00000 9.79185 0.00000 9.83639 0.00000 13.26340 0.00000 13.61664 0.00000 13.61664 0.00000 16.35474 0.00000 16.88656 + 32 0.3444445 0.0000000 0.3444445 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90086 2.00000 -133.89723 2.00000 -89.92585 2.00000 -89.92585 2.00000 -89.91939 2.00000 -89.91147 2.00000 -89.90498 2.00000 -89.90498 2.00000 -10.13948 2.00000 -5.41071 2.00000 -2.67820 2.00000 -2.67820 0.00000 0.52646 0.00000 1.73444 0.00000 7.32093 0.00000 7.32093 0.00000 9.98277 0.00000 10.03160 0.00000 13.44027 0.00000 13.49006 0.00000 13.49006 0.00000 16.06843 0.00000 17.11276 + 33 0.3555556 0.0000000 0.3555556 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90074 2.00000 -133.89735 2.00000 -89.92592 2.00000 -89.92592 2.00000 -89.91913 2.00000 -89.91173 2.00000 -89.90492 2.00000 -89.90492 2.00000 -10.01001 2.00000 -5.60735 2.00000 -2.73029 2.00000 -2.73029 0.00000 0.49527 0.00000 1.60688 0.00000 7.53053 0.00000 7.53053 0.00000 10.13404 0.00000 10.27050 0.00000 13.33790 0.00000 13.33790 0.00000 13.59722 0.00000 15.78653 0.00000 17.34333 + 34 0.3666667 0.0000000 0.3666667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90061 2.00000 -133.89747 2.00000 -89.92598 2.00000 -89.92598 2.00000 -89.91886 2.00000 -89.91200 2.00000 -89.90486 2.00000 -89.90486 2.00000 -9.87694 2.00000 -5.80296 2.00000 -2.77866 2.00000 -2.77866 0.00000 0.46874 0.00000 1.48610 0.00000 7.74120 0.00000 7.74120 0.00000 10.29022 0.00000 10.50816 0.00000 13.16536 0.00000 13.16536 0.00000 13.73043 0.00000 15.50911 0.00000 17.57803 + 35 0.3777778 0.0000000 0.3777778 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90049 2.00000 -133.89759 2.00000 -89.92604 2.00000 -89.92604 2.00000 -89.91859 2.00000 -89.91227 2.00000 -89.90480 2.00000 -89.90480 2.00000 -9.74034 2.00000 -5.99741 2.00000 -2.82327 2.00000 -2.82327 0.00000 0.44696 0.00000 1.37210 0.00000 7.95284 0.00000 7.95284 0.00000 10.45130 0.00000 10.74422 0.00000 12.97718 0.00000 12.97718 0.00000 13.83630 0.00000 15.23626 0.00000 17.81651 + 36 0.3888889 0.0000000 0.3888889 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90036 2.00000 -133.89772 2.00000 -89.92609 2.00000 -89.92609 2.00000 -89.91832 2.00000 -89.91255 2.00000 -89.90475 2.00000 -89.90475 2.00000 -9.60025 2.00000 -6.19057 2.00000 -2.86409 2.00000 -2.86409 0.00000 0.43006 0.00000 1.26486 0.00000 8.16530 0.00000 8.16530 0.00000 10.61730 0.00000 10.97831 0.00000 12.77738 0.00000 12.77738 0.00000 13.91184 0.00000 14.96801 0.00000 18.05816 + 37 0.4000000 0.0000000 0.4000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90024 2.00000 -133.89785 2.00000 -89.92614 2.00000 -89.92614 2.00000 -89.91804 2.00000 -89.91282 2.00000 -89.90470 2.00000 -89.90470 2.00000 -9.45674 2.00000 -6.38230 2.00000 -2.90109 2.00000 -2.90109 0.00000 0.41813 0.00000 1.16434 0.00000 8.37839 0.00000 8.37839 0.00000 10.78821 0.00000 11.21005 0.00000 12.56930 0.00000 12.56930 0.00000 13.95505 0.00000 14.70444 0.00000 18.30212 + 38 0.4111111 0.0000000 0.4111111 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90011 2.00000 -133.89798 2.00000 -89.92618 2.00000 -89.92618 2.00000 -89.91776 2.00000 -89.91311 2.00000 -89.90466 2.00000 -89.90466 2.00000 -9.30989 2.00000 -6.57249 2.00000 -2.93425 2.00000 -2.93425 0.00000 0.41127 0.00000 1.07048 0.00000 8.59180 0.00000 8.59180 0.00000 10.96404 0.00000 11.43905 0.00000 12.35571 0.00000 12.35571 0.00000 13.96523 0.00000 14.44557 0.00000 18.54712 + 39 0.4222222 0.0000000 0.4222222 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89998 2.00000 -133.89811 2.00000 -89.92622 2.00000 -89.92622 2.00000 -89.91747 2.00000 -89.91339 2.00000 -89.90462 2.00000 -89.90462 2.00000 -9.15975 2.00000 -6.76100 2.00000 -2.96356 2.00000 -2.96356 0.00000 0.40960 0.00000 0.98323 0.00000 8.80503 0.00000 8.80503 0.00000 11.14479 0.00000 11.66487 0.00000 12.13899 0.00000 12.13899 0.00000 13.94305 0.00000 14.19146 0.00000 18.79134 + 40 0.4333333 0.0000000 0.4333333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89985 2.00000 -133.89824 2.00000 -89.92626 2.00000 -89.92626 2.00000 -89.91719 2.00000 -89.91368 2.00000 -89.90458 2.00000 -89.90458 2.00000 -9.00641 2.00000 -6.94771 2.00000 -2.98900 2.00000 -2.98900 0.00000 0.41320 0.00000 0.90252 0.00000 9.01732 0.00000 9.01732 0.00000 11.33047 0.00000 11.88701 0.00000 11.92137 0.00000 11.92137 0.00000 13.89042 0.00000 13.94214 0.00000 19.03214 + 41 0.4444444 0.0000000 0.4444444 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89971 2.00000 -133.89837 2.00000 -89.92629 2.00000 -89.92629 2.00000 -89.91690 2.00000 -89.91397 2.00000 -89.90455 2.00000 -89.90455 2.00000 -8.84993 2.00000 -7.13250 2.00000 -3.01054 2.00000 -3.01054 0.00000 0.42218 0.00000 0.82827 0.00000 9.22734 0.00000 9.22734 0.00000 11.52108 0.00000 11.70529 0.00000 11.70529 0.00000 12.10491 0.00000 13.69762 0.00000 13.81005 0.00000 19.26569 + 42 0.4555556 0.0000000 0.4555556 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89958 2.00000 -133.89850 2.00000 -89.92631 2.00000 -89.92631 2.00000 -89.91661 2.00000 -89.91426 2.00000 -89.90453 2.00000 -89.90453 2.00000 -8.69040 2.00000 -7.31525 2.00000 -3.02818 2.00000 -3.02818 0.00000 0.43663 0.00000 0.76040 0.00000 9.43269 0.00000 9.43269 0.00000 11.49400 0.00000 11.49400 0.00000 11.71661 0.00000 12.31791 0.00000 13.45795 0.00000 13.70515 0.00000 19.48645 + 43 0.4666667 0.0000000 0.4666667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89945 2.00000 -133.89864 2.00000 -89.92633 2.00000 -89.92633 2.00000 -89.91632 2.00000 -89.91455 2.00000 -89.90451 2.00000 -89.90451 2.00000 -8.52791 2.00000 -7.49583 2.00000 -3.04191 2.00000 -3.04191 0.00000 0.45664 0.00000 0.69883 0.00000 9.62867 0.00000 9.62867 0.00000 11.29281 0.00000 11.29281 0.00000 11.91707 0.00000 12.52520 0.00000 13.22313 0.00000 13.57899 0.00000 19.68648 + 44 0.4777778 0.0000000 0.4777778 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89931 2.00000 -133.89877 2.00000 -89.92634 2.00000 -89.92634 2.00000 -89.91602 2.00000 -89.91485 2.00000 -89.90450 2.00000 -89.90450 2.00000 -8.36254 2.00000 -7.67415 2.00000 -3.05173 2.00000 -3.05173 0.00000 0.48231 0.00000 0.64347 0.00000 9.80526 0.00000 9.80526 0.00000 11.11221 0.00000 11.11221 0.00000 12.12246 0.00000 12.72584 0.00000 12.99320 0.00000 13.43465 0.00000 19.85495 + 45 0.4888889 0.0000000 0.4888889 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89918 2.00000 -133.89891 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91573 2.00000 -89.91514 2.00000 -89.90449 2.00000 -89.90449 2.00000 -8.19438 2.00000 -7.85008 2.00000 -3.05762 2.00000 -3.05762 0.00000 0.51374 0.00000 0.59423 0.00000 9.94033 0.00000 9.94033 0.00000 10.97460 0.00000 10.97460 0.00000 12.33278 0.00000 12.76815 0.00000 12.91866 0.00000 13.27494 0.00000 19.97871 + 46 0.5000000 0.0000000 0.5000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -8.02353 2.00000 -8.02353 2.00000 -3.05958 2.00000 -3.05958 0.00000 0.55101 0.00000 0.55101 0.00000 9.99426 0.00000 9.99426 0.00000 10.91981 0.00000 10.91981 0.00000 12.54801 0.00000 12.54801 0.00000 13.10226 0.00000 13.10226 0.00000 20.04541 diff --git a/tests/test_data/aims/static-si-bs-density/band1002.out b/tests/test_data/aims/static-si-bs-density/band1002.out new file mode 100644 index 0000000000..c3d71f17fa --- /dev/null +++ b/tests/test_data/aims/static-si-bs-density/band1002.out @@ -0,0 +1,23 @@ + 1 0.5000000 0.0000000 0.5000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -8.02353 2.00000 -8.02353 2.00000 -3.05958 2.00000 -3.05958 0.00000 0.55101 0.00000 0.55101 0.00000 9.99426 0.00000 9.99426 0.00000 10.91981 0.00000 10.91981 0.00000 12.54801 0.00000 12.54801 0.00000 13.10226 0.00000 13.10226 0.00000 20.04541 + 2 0.5000000 0.0113636 0.5113636 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -8.02277 2.00000 -8.02277 2.00000 -3.06646 2.00000 -3.06646 0.00000 0.56366 0.00000 0.56366 0.00000 9.97471 0.00000 9.97471 0.00000 10.88861 0.00000 10.88861 0.00000 12.57371 0.00000 12.57371 0.00000 13.12997 0.00000 13.12997 0.00000 20.00793 + 3 0.5000000 0.0227273 0.5227273 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -8.02051 2.00000 -8.02051 2.00000 -3.08675 2.00000 -3.08675 0.00000 0.60128 0.00000 0.60128 0.00000 9.91266 0.00000 9.91266 0.00000 10.81101 0.00000 10.81101 0.00000 12.63249 0.00000 12.63249 0.00000 13.21879 0.00000 13.21879 0.00000 19.90761 + 4 0.5000000 0.0340909 0.5340909 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -8.01678 2.00000 -8.01678 2.00000 -3.11948 2.00000 -3.11948 0.00000 0.66290 0.00000 0.66290 0.00000 9.80092 0.00000 9.80092 0.00000 10.72017 0.00000 10.72017 0.00000 12.69209 0.00000 12.69209 0.00000 13.37496 0.00000 13.37496 0.00000 19.76750 + 5 0.5000000 0.0454545 0.5454545 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -8.01164 2.00000 -8.01164 2.00000 -3.16315 2.00000 -3.16315 0.00000 0.74710 0.00000 0.74710 0.00000 9.63653 0.00000 9.63653 0.00000 10.64201 0.00000 10.64201 0.00000 12.73818 0.00000 12.73818 0.00000 13.58975 0.00000 13.58975 0.00000 19.60589 + 6 0.5000000 0.0568182 0.5568182 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -8.00517 2.00000 -8.00517 2.00000 -3.21599 2.00000 -3.21599 0.00000 0.85212 0.00000 0.85212 0.00000 9.42617 0.00000 9.42617 0.00000 10.58517 0.00000 10.58517 0.00000 12.77292 0.00000 12.77292 0.00000 13.84553 0.00000 13.84553 0.00000 19.43402 + 7 0.5000000 0.0681818 0.5681818 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.99747 2.00000 -7.99747 2.00000 -3.27604 2.00000 -3.27604 0.00000 0.97609 0.00000 0.97609 0.00000 9.18207 0.00000 9.18207 0.00000 10.54686 0.00000 10.54686 0.00000 12.80138 0.00000 12.80138 0.00000 14.12762 0.00000 14.12762 0.00000 19.25859 + 8 0.5000000 0.0795455 0.5795455 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.98868 2.00000 -7.98868 2.00000 -3.34137 2.00000 -3.34137 0.00000 1.11715 0.00000 1.11715 0.00000 8.91554 0.00000 8.91554 0.00000 10.52154 0.00000 10.52154 0.00000 12.82697 0.00000 12.82697 0.00000 14.42657 0.00000 14.42657 0.00000 19.08383 + 9 0.5000000 0.0909091 0.5909091 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.97893 2.00000 -7.97893 2.00000 -3.41013 2.00000 -3.41013 0.00000 1.27354 0.00000 1.27354 0.00000 8.63475 0.00000 8.63475 0.00000 10.50473 0.00000 10.50473 0.00000 12.85151 0.00000 12.85151 0.00000 14.73657 0.00000 14.73657 0.00000 18.91257 + 10 0.5000000 0.1022727 0.6022727 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.96840 2.00000 -7.96840 2.00000 -3.48062 2.00000 -3.48062 0.00000 1.44368 0.00000 1.44368 0.00000 8.34509 0.00000 8.34509 0.00000 10.49346 0.00000 10.49346 0.00000 12.87587 0.00000 12.87587 0.00000 15.05392 0.00000 15.05392 0.00000 18.74693 + 11 0.5000000 0.1136364 0.6136364 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.95728 2.00000 -7.95728 2.00000 -3.55132 2.00000 -3.55132 0.00000 1.62612 0.00000 1.62612 0.00000 8.05012 0.00000 8.05012 0.00000 10.48586 0.00000 10.48586 0.00000 12.90041 0.00000 12.90041 0.00000 15.37608 0.00000 15.37608 0.00000 18.58861 + 12 0.5000000 0.1250000 0.6250000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.94577 2.00000 -7.94577 2.00000 -3.62087 2.00000 -3.62087 0.00000 1.81962 0.00000 1.81962 0.00000 7.75225 0.00000 7.75225 0.00000 10.48073 0.00000 10.48073 0.00000 12.92516 0.00000 12.92516 0.00000 15.70112 0.00000 15.70112 0.00000 18.43912 + 13 0.5000000 0.1363636 0.6363636 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.93411 2.00000 -7.93411 2.00000 -3.68808 2.00000 -3.68808 0.00000 2.02305 0.00000 2.02305 0.00000 7.45319 0.00000 7.45319 0.00000 10.47730 0.00000 10.47730 0.00000 12.94996 0.00000 12.94996 0.00000 16.02734 0.00000 16.02734 0.00000 18.30002 + 14 0.5000000 0.1477273 0.6477273 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.92253 2.00000 -7.92253 2.00000 -3.75190 2.00000 -3.75190 0.00000 2.23543 0.00000 2.23543 0.00000 7.15424 0.00000 7.15424 0.00000 10.47506 0.00000 10.47506 0.00000 12.97452 0.00000 12.97452 0.00000 16.35284 0.00000 16.35284 0.00000 18.17319 + 15 0.5000000 0.1590909 0.6590909 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.91127 2.00000 -7.91127 2.00000 -3.81140 2.00000 -3.81140 0.00000 2.45581 0.00000 2.45581 0.00000 6.85645 0.00000 6.85645 0.00000 10.47363 0.00000 10.47363 0.00000 12.99846 0.00000 12.99846 0.00000 16.67477 0.00000 16.67477 0.00000 18.06148 + 16 0.5000000 0.1704545 0.6704545 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.90059 2.00000 -7.90059 2.00000 -3.86577 2.00000 -3.86577 0.00000 2.68331 0.00000 2.68331 0.00000 6.56075 0.00000 6.56075 0.00000 10.47277 0.00000 10.47277 0.00000 13.02131 0.00000 13.02131 0.00000 16.98717 0.00000 16.98717 0.00000 17.97089 + 17 0.5000000 0.1818182 0.6818182 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.89072 2.00000 -7.89072 2.00000 -3.91432 2.00000 -3.91432 0.00000 2.91693 0.00000 2.91693 0.00000 6.26811 0.00000 6.26811 0.00000 10.47230 0.00000 10.47230 0.00000 13.04258 0.00000 13.04258 0.00000 17.27257 0.00000 17.27257 0.00000 17.91876 + 18 0.5000000 0.1931818 0.6931818 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.88191 2.00000 -7.88191 2.00000 -3.95642 2.00000 -3.95642 0.00000 3.15548 0.00000 3.15548 0.00000 5.97970 0.00000 5.97970 0.00000 10.47208 0.00000 10.47208 0.00000 13.06174 0.00000 13.06174 0.00000 17.47421 0.00000 17.47421 0.00000 17.96143 + 19 0.5000000 0.2045455 0.7045455 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.87437 2.00000 -7.87437 2.00000 -3.99158 2.00000 -3.99158 0.00000 3.39719 0.00000 3.39719 0.00000 5.69725 0.00000 5.69725 0.00000 10.47201 0.00000 10.47201 0.00000 13.07828 0.00000 13.07828 0.00000 17.53400 0.00000 17.53400 0.00000 18.15591 + 20 0.5000000 0.2159091 0.7159091 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.86828 2.00000 -7.86828 2.00000 -4.01937 2.00000 -4.01937 0.00000 3.63878 0.00000 3.63878 0.00000 5.42402 0.00000 5.42402 0.00000 10.47202 0.00000 10.47202 0.00000 13.09172 0.00000 13.09172 0.00000 17.52371 0.00000 17.52371 0.00000 18.42777 + 21 0.5000000 0.2272727 0.7272727 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.86382 2.00000 -7.86382 2.00000 -4.03946 2.00000 -4.03946 0.00000 3.87255 0.00000 3.87255 0.00000 5.16766 0.00000 5.16766 0.00000 10.47206 0.00000 10.47206 0.00000 13.10164 0.00000 13.10164 0.00000 17.50198 0.00000 17.50198 0.00000 18.71113 + 22 0.5000000 0.2386364 0.7386364 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.86109 2.00000 -7.86109 2.00000 -4.05161 2.00000 -4.05161 0.00000 4.07501 0.00000 4.07501 0.00000 4.95166 0.00000 4.95166 0.00000 10.47210 0.00000 10.47210 0.00000 13.10773 0.00000 13.10773 0.00000 17.48574 0.00000 17.48574 0.00000 18.96466 + 23 0.5000000 0.2500000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.86017 2.00000 -7.86017 2.00000 -4.05567 2.00000 -4.05567 0.00000 4.17009 0.00000 4.17009 0.00000 4.85206 0.00000 4.85206 0.00000 10.47211 0.00000 10.47211 0.00000 13.10978 0.00000 13.10978 0.00000 17.47993 0.00000 17.47993 0.00000 19.08929 diff --git a/tests/test_data/aims/static-si-bs-density/band1003.out b/tests/test_data/aims/static-si-bs-density/band1003.out new file mode 100644 index 0000000000..36b8aed21f --- /dev/null +++ b/tests/test_data/aims/static-si-bs-density/band1003.out @@ -0,0 +1,16 @@ + 1 0.5000000 0.2500000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.86017 2.00000 -7.86017 2.00000 -4.05567 2.00000 -4.05567 0.00000 4.17009 0.00000 4.17009 0.00000 4.85206 0.00000 4.85206 0.00000 10.47211 0.00000 10.47211 0.00000 13.10978 0.00000 13.10978 0.00000 17.47993 0.00000 17.47993 0.00000 19.08929 + 2 0.4916667 0.2583333 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89911 2.00000 -133.89897 2.00000 -89.92638 2.00000 -89.92633 2.00000 -89.91563 2.00000 -89.91523 2.00000 -89.90451 2.00000 -89.90446 2.00000 -7.93439 2.00000 -7.78764 2.00000 -4.11175 2.00000 -3.99091 0.00000 4.01250 0.00000 4.20980 0.00000 4.89279 0.00000 4.93928 0.00000 10.32390 0.00000 10.60173 0.00000 12.96773 0.00000 13.26708 0.00000 17.33642 0.00000 17.61205 0.00000 18.92968 + 3 0.4833333 0.2666667 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89918 2.00000 -133.89891 2.00000 -89.92640 2.00000 -89.92630 2.00000 -89.91582 2.00000 -89.91503 2.00000 -89.90454 2.00000 -89.90444 2.00000 -8.00358 2.00000 -7.72348 2.00000 -4.16449 2.00000 -3.91240 0.00000 3.74553 0.00000 4.21910 0.00000 5.05573 0.00000 5.06444 0.00000 10.16604 0.00000 10.69667 0.00000 12.85464 0.00000 13.43347 0.00000 17.18957 0.00000 17.72569 0.00000 18.71328 + 4 0.4750000 0.2750000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89924 2.00000 -133.89885 2.00000 -89.92642 2.00000 -89.92627 2.00000 -89.91600 2.00000 -89.91485 2.00000 -89.90457 2.00000 -89.90442 2.00000 -8.06772 2.00000 -7.66754 2.00000 -4.21377 2.00000 -3.82100 0.00000 3.45043 0.00000 4.20935 0.00000 5.21594 0.00000 5.26034 0.00000 10.00024 0.00000 10.74257 0.00000 12.78589 0.00000 13.60691 0.00000 17.04477 0.00000 17.81417 0.00000 18.46562 + 5 0.4666667 0.2833333 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89930 2.00000 -133.89879 2.00000 -89.92644 2.00000 -89.92624 2.00000 -89.91618 2.00000 -89.91467 2.00000 -89.90460 2.00000 -89.90441 2.00000 -8.12679 2.00000 -7.61945 2.00000 -4.25946 2.00000 -3.71794 0.00000 3.15195 0.00000 4.18959 0.00000 5.38448 0.00000 5.48275 0.00000 9.82775 0.00000 10.72745 0.00000 12.77458 0.00000 13.78580 0.00000 16.90512 0.00000 17.87037 0.00000 18.20260 + 6 0.4583333 0.2916667 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89935 2.00000 -133.89874 2.00000 -89.92645 2.00000 -89.92621 2.00000 -89.91635 2.00000 -89.91451 2.00000 -89.90463 2.00000 -89.90439 2.00000 -8.18078 2.00000 -7.57870 2.00000 -4.30147 2.00000 -3.60487 0.00000 2.85864 0.00000 4.16530 0.00000 5.56426 0.00000 5.71543 0.00000 9.64953 0.00000 10.64828 0.00000 12.82483 0.00000 13.96879 0.00000 16.77191 0.00000 17.88678 0.00000 17.93320 + 7 0.4500000 0.3000000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89940 2.00000 -133.89869 2.00000 -89.92647 2.00000 -89.92617 2.00000 -89.91650 2.00000 -89.91435 2.00000 -89.90466 2.00000 -89.90437 2.00000 -8.22967 2.00000 -7.54464 2.00000 -4.33971 2.00000 -3.48381 0.00000 2.57484 0.00000 4.13964 0.00000 5.75178 0.00000 5.95534 0.00000 9.46638 0.00000 10.51268 0.00000 12.93016 0.00000 14.15466 0.00000 16.64476 0.00000 17.66352 0.00000 17.85389 + 8 0.4416667 0.3083333 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89944 2.00000 -133.89864 2.00000 -89.92648 2.00000 -89.92614 2.00000 -89.91664 2.00000 -89.91421 2.00000 -89.90470 2.00000 -89.90436 2.00000 -8.27345 2.00000 -7.51657 2.00000 -4.37411 2.00000 -3.35726 0.00000 2.30372 0.00000 4.11444 0.00000 5.94479 0.00000 6.20095 0.00000 9.27899 0.00000 10.33359 0.00000 13.07868 0.00000 14.34218 0.00000 16.52127 0.00000 17.39932 0.00000 17.76365 + 9 0.4333333 0.3166667 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89948 2.00000 -133.89861 2.00000 -89.92650 2.00000 -89.92611 2.00000 -89.91677 2.00000 -89.91408 2.00000 -89.90473 2.00000 -89.90435 2.00000 -8.31211 2.00000 -7.49377 2.00000 -4.40461 2.00000 -3.22823 0.00000 2.04829 0.00000 4.09081 0.00000 6.14171 0.00000 6.45130 0.00000 9.08807 0.00000 10.12353 0.00000 13.25888 0.00000 14.52998 0.00000 16.39596 0.00000 17.14823 0.00000 17.62566 + 10 0.4250000 0.3250000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89951 2.00000 -133.89857 2.00000 -89.92651 2.00000 -89.92608 2.00000 -89.91689 2.00000 -89.91397 2.00000 -89.90476 2.00000 -89.90434 2.00000 -8.34563 2.00000 -7.47555 2.00000 -4.43114 2.00000 -3.10029 0.00000 1.81188 0.00000 4.06946 0.00000 6.34118 0.00000 6.70567 0.00000 8.89441 0.00000 9.89224 0.00000 13.46192 0.00000 14.71633 0.00000 16.25876 0.00000 16.92173 0.00000 17.46280 + 11 0.4166667 0.3333333 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89954 2.00000 -133.89854 2.00000 -89.92652 2.00000 -89.92605 2.00000 -89.91699 2.00000 -89.91387 2.00000 -89.90478 2.00000 -89.90433 2.00000 -8.37401 2.00000 -7.46127 2.00000 -4.45366 2.00000 -2.97770 0.00000 1.59835 0.00000 4.05085 0.00000 6.54185 0.00000 6.96338 0.00000 8.69901 0.00000 9.64674 0.00000 13.68161 0.00000 14.89887 0.00000 16.09594 0.00000 16.73460 0.00000 17.29194 + 12 0.4083333 0.3416667 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89957 2.00000 -133.89852 2.00000 -89.92653 2.00000 -89.92603 2.00000 -89.91707 2.00000 -89.91379 2.00000 -89.90481 2.00000 -89.90432 2.00000 -8.39724 2.00000 -7.45038 2.00000 -4.47214 2.00000 -2.86543 0.00000 1.41230 0.00000 4.03530 0.00000 6.74200 0.00000 7.22362 0.00000 8.50339 0.00000 9.39216 0.00000 13.91367 0.00000 15.07394 0.00000 15.89889 0.00000 16.59634 0.00000 17.12321 + 13 0.4000000 0.3500000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89959 2.00000 -133.89850 2.00000 -89.92653 2.00000 -89.92601 2.00000 -89.91713 2.00000 -89.91372 2.00000 -89.90482 2.00000 -89.90431 2.00000 -8.41531 2.00000 -7.44240 2.00000 -4.48655 2.00000 -2.76908 0.00000 1.25897 0.00000 4.02302 0.00000 6.93871 0.00000 7.48515 0.00000 8.31031 0.00000 9.13263 0.00000 14.15501 0.00000 15.23552 0.00000 15.67235 0.00000 16.50305 0.00000 16.96531 + 14 0.3916667 0.3583333 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89960 2.00000 -133.89849 2.00000 -89.92654 2.00000 -89.92600 2.00000 -89.91718 2.00000 -89.91368 2.00000 -89.90484 2.00000 -89.90431 2.00000 -8.42822 2.00000 -7.43697 2.00000 -4.49685 2.00000 -2.69451 0.00000 1.14392 0.00000 4.01416 0.00000 7.12559 0.00000 7.74525 0.00000 8.12606 0.00000 8.87277 0.00000 14.40313 0.00000 15.37332 0.00000 15.42780 0.00000 16.44428 0.00000 16.82970 + 15 0.3833333 0.3666667 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89961 2.00000 -133.89848 2.00000 -89.92654 2.00000 -89.92599 2.00000 -89.91721 2.00000 -89.91365 2.00000 -89.90484 2.00000 -89.90431 2.00000 -8.43597 2.00000 -7.43382 2.00000 -4.50304 2.00000 -2.64713 0.00000 1.07234 0.00000 4.00880 0.00000 7.28402 0.00000 7.96923 0.00000 7.99382 0.00000 8.62391 0.00000 14.65525 0.00000 15.17531 0.00000 15.47059 0.00000 16.41185 0.00000 16.73361 + 16 0.3750000 0.3750000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89961 2.00000 -133.89848 2.00000 -89.92654 2.00000 -89.92599 2.00000 -89.91722 2.00000 -89.91364 2.00000 -89.90485 2.00000 -89.90431 2.00000 -8.43855 2.00000 -7.43279 2.00000 -4.50510 2.00000 -2.63086 0.00000 1.04802 0.00000 4.00701 0.00000 7.35679 0.00000 7.89701 0.00000 8.14738 0.00000 8.47017 0.00000 14.87484 0.00000 14.95523 0.00000 15.50658 0.00000 16.40147 0.00000 16.69799 diff --git a/tests/test_data/aims/static-si-bs-density/band1004.out b/tests/test_data/aims/static-si-bs-density/band1004.out new file mode 100644 index 0000000000..e5aa6fa79b --- /dev/null +++ b/tests/test_data/aims/static-si-bs-density/band1004.out @@ -0,0 +1,49 @@ + 1 0.3750000 0.3750000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89961 2.00000 -133.89848 2.00000 -89.92654 2.00000 -89.92599 2.00000 -89.91722 2.00000 -89.91364 2.00000 -89.90485 2.00000 -89.90431 2.00000 -8.43855 2.00000 -7.43279 2.00000 -4.50510 2.00000 -2.63086 0.00000 1.04802 0.00000 4.00701 0.00000 7.35679 0.00000 7.89701 0.00000 8.14738 0.00000 8.47017 0.00000 14.87484 0.00000 14.95523 0.00000 15.50658 0.00000 16.40147 0.00000 16.69799 + 2 0.3671875 0.3671875 0.7343750 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89968 2.00000 -133.89841 2.00000 -89.92654 2.00000 -89.92594 2.00000 -89.91741 2.00000 -89.91344 2.00000 -89.90489 2.00000 -89.90430 2.00000 -8.51204 2.00000 -7.35689 2.00000 -4.55338 2.00000 -2.57750 0.00000 1.10989 0.00000 4.32884 0.00000 7.16252 0.00000 7.69692 0.00000 7.99352 0.00000 8.30363 0.00000 15.01515 0.00000 15.12096 0.00000 15.73610 0.00000 16.18722 0.00000 16.72458 + 3 0.3593750 0.3593750 0.7187500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89975 2.00000 -133.89834 2.00000 -89.92654 2.00000 -89.92589 2.00000 -89.91761 2.00000 -89.91324 2.00000 -89.90494 2.00000 -89.90431 2.00000 -8.59249 2.00000 -7.27646 2.00000 -4.58879 2.00000 -2.52141 0.00000 1.17490 0.00000 4.65413 0.00000 6.97080 0.00000 7.50265 0.00000 7.84102 0.00000 8.14104 0.00000 15.14397 0.00000 15.28399 0.00000 15.96427 0.00000 15.98874 0.00000 16.64272 + 4 0.3515625 0.3515625 0.7031250 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89982 2.00000 -133.89826 2.00000 -89.92653 2.00000 -89.92585 2.00000 -89.91782 2.00000 -89.91303 2.00000 -89.90498 2.00000 -89.90431 2.00000 -8.67954 2.00000 -7.19151 2.00000 -4.61138 2.00000 -2.46271 0.00000 1.24290 0.00000 4.98084 0.00000 6.78185 0.00000 7.31580 0.00000 7.69036 0.00000 7.98272 0.00000 15.24266 0.00000 15.44419 0.00000 15.82383 0.00000 16.19088 0.00000 16.49719 + 5 0.3437500 0.3437500 0.6875000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89990 2.00000 -133.89819 2.00000 -89.92652 2.00000 -89.92579 2.00000 -89.91803 2.00000 -89.91282 2.00000 -89.90503 2.00000 -89.90432 2.00000 -8.77270 2.00000 -7.10205 2.00000 -4.62141 2.00000 -2.40149 0.00000 1.31376 0.00000 5.30529 0.00000 6.59586 0.00000 7.13961 0.00000 7.54197 0.00000 7.82896 0.00000 15.26102 0.00000 15.60143 0.00000 15.74120 0.00000 16.32187 0.00000 16.41579 + 6 0.3359375 0.3359375 0.6718750 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89998 2.00000 -133.89811 2.00000 -89.92651 2.00000 -89.92574 2.00000 -89.91824 2.00000 -89.91261 2.00000 -89.90509 2.00000 -89.90434 2.00000 -8.87136 2.00000 -7.00810 2.00000 -4.61927 2.00000 -2.33788 0.00000 1.38728 0.00000 5.61937 0.00000 6.41300 0.00000 6.98172 0.00000 7.39625 0.00000 7.68007 0.00000 15.16393 0.00000 15.75555 0.00000 15.77287 0.00000 16.13372 0.00000 16.63892 + 7 0.3281250 0.3281250 0.6562500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90007 2.00000 -133.89802 2.00000 -89.92649 2.00000 -89.92569 2.00000 -89.91846 2.00000 -89.91240 2.00000 -89.90514 2.00000 -89.90435 2.00000 -8.97484 2.00000 -6.90967 2.00000 -4.60545 2.00000 -2.27203 0.00000 1.46328 0.00000 5.90088 0.00000 6.23341 0.00000 6.86384 0.00000 7.25361 0.00000 7.53631 0.00000 15.00647 0.00000 15.85660 0.00000 15.90634 0.00000 15.94088 0.00000 16.86025 + 8 0.3203125 0.3203125 0.6406250 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90015 2.00000 -133.89794 2.00000 -89.92647 2.00000 -89.92563 2.00000 -89.91867 2.00000 -89.91218 2.00000 -89.90519 2.00000 -89.90438 2.00000 -9.08245 2.00000 -6.80678 2.00000 -4.58054 2.00000 -2.20406 0.00000 1.54153 0.00000 6.05721 0.00000 6.08767 0.00000 6.84757 0.00000 7.11440 0.00000 7.39798 0.00000 14.83142 0.00000 15.74762 0.00000 15.93013 0.00000 16.05355 0.00000 17.03281 + 9 0.3125000 0.3125000 0.6250000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90024 2.00000 -133.89785 2.00000 -89.92644 2.00000 -89.92558 2.00000 -89.91889 2.00000 -89.91197 2.00000 -89.90525 2.00000 -89.90441 2.00000 -9.19343 2.00000 -6.69945 2.00000 -4.54515 2.00000 -2.13415 0.00000 1.62178 0.00000 5.88451 0.00000 6.10806 0.00000 6.97901 0.00000 7.00395 0.00000 7.26535 0.00000 14.65277 0.00000 15.55640 0.00000 15.92463 0.00000 16.19682 0.00000 16.77610 + 10 0.3046875 0.3046875 0.6093750 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90033 2.00000 -133.89776 2.00000 -89.92640 2.00000 -89.92552 2.00000 -89.91910 2.00000 -89.91175 2.00000 -89.90531 2.00000 -89.90444 2.00000 -9.30710 2.00000 -6.58769 2.00000 -4.49990 2.00000 -2.06245 0.00000 1.70375 0.00000 5.71541 0.00000 6.01554 0.00000 6.84780 0.00000 7.13869 0.00000 7.27879 0.00000 14.47524 0.00000 15.36888 0.00000 15.75601 0.00000 16.33567 0.00000 16.68928 + 11 0.2968750 0.2968750 0.5937500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90042 2.00000 -133.89767 2.00000 -89.92636 2.00000 -89.92546 2.00000 -89.91932 2.00000 -89.91153 2.00000 -89.90536 2.00000 -89.90448 2.00000 -9.42275 2.00000 -6.47153 2.00000 -4.44541 2.00000 -1.98916 0.00000 1.78710 0.00000 5.54999 0.00000 5.88240 0.00000 6.72116 0.00000 7.01827 0.00000 7.59891 0.00000 14.30063 0.00000 15.18637 0.00000 15.45353 0.00000 16.46952 0.00000 16.74185 + 12 0.2890625 0.2890625 0.5781250 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90051 2.00000 -133.89758 2.00000 -89.92632 2.00000 -89.92540 2.00000 -89.91953 2.00000 -89.91132 2.00000 -89.90542 2.00000 -89.90453 2.00000 -9.53976 2.00000 -6.35099 2.00000 -4.38228 2.00000 -1.91448 0.00000 1.87148 0.00000 5.38834 0.00000 5.73604 0.00000 6.59948 0.00000 6.90438 0.00000 7.93586 0.00000 14.12956 0.00000 15.01003 0.00000 15.09675 0.00000 16.59757 0.00000 16.85418 + 13 0.2812500 0.2812500 0.5625000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90060 2.00000 -133.89749 2.00000 -89.92627 2.00000 -89.92534 2.00000 -89.91974 2.00000 -89.91111 2.00000 -89.90548 2.00000 -89.90457 2.00000 -9.65753 2.00000 -6.22609 2.00000 -4.31106 2.00000 -1.83861 0.00000 1.95646 0.00000 5.23051 0.00000 5.58578 0.00000 6.48317 0.00000 6.79730 0.00000 8.27894 0.00000 13.96183 0.00000 14.72189 0.00000 14.84113 0.00000 16.71887 0.00000 16.99076 + 14 0.2734375 0.2734375 0.5468750 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90069 2.00000 -133.89740 2.00000 -89.92622 2.00000 -89.92528 2.00000 -89.91995 2.00000 -89.91090 2.00000 -89.90554 2.00000 -89.90463 2.00000 -9.77552 2.00000 -6.09687 2.00000 -4.23228 2.00000 -1.76178 0.00000 2.04156 0.00000 5.07658 0.00000 5.43535 0.00000 6.37266 0.00000 6.69730 0.00000 8.62270 0.00000 13.79578 0.00000 14.34352 0.00000 14.68109 0.00000 16.83219 0.00000 17.13916 + 15 0.2656250 0.2656250 0.5312500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90079 2.00000 -133.89730 2.00000 -89.92616 2.00000 -89.92522 2.00000 -89.92016 2.00000 -89.91069 2.00000 -89.90560 2.00000 -89.90469 2.00000 -9.89323 2.00000 -5.96334 2.00000 -4.14643 2.00000 -1.68424 0.00000 2.12626 0.00000 4.92660 0.00000 5.28649 0.00000 6.26840 0.00000 6.60468 0.00000 8.96313 0.00000 13.62462 0.00000 13.97380 0.00000 14.53169 0.00000 16.93606 0.00000 17.29450 + 16 0.2578125 0.2578125 0.5156250 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90088 2.00000 -133.89721 2.00000 -89.92609 2.00000 -89.92516 2.00000 -89.92036 2.00000 -89.91048 2.00000 -89.90566 2.00000 -89.90475 2.00000 -10.01022 2.00000 -5.82554 2.00000 -4.05398 2.00000 -1.60624 0.00000 2.20995 0.00000 4.78063 0.00000 5.14009 0.00000 6.17085 0.00000 6.51971 0.00000 9.29631 0.00000 13.41571 0.00000 13.64805 0.00000 14.39523 0.00000 17.02870 0.00000 17.45458 + 17 0.2500000 0.2500000 0.5000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90098 2.00000 -133.89711 2.00000 -89.92603 2.00000 -89.92510 2.00000 -89.92056 2.00000 -89.91028 2.00000 -89.90572 2.00000 -89.90482 2.00000 -10.12610 2.00000 -5.68350 2.00000 -3.95534 2.00000 -1.52805 0.00000 2.29197 0.00000 4.63871 0.00000 4.99667 0.00000 6.08051 0.00000 6.44267 0.00000 9.61779 0.00000 13.10807 0.00000 13.42882 0.00000 14.27462 0.00000 17.10801 0.00000 17.44760 + 18 0.2421875 0.2421875 0.4843750 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90107 2.00000 -133.89702 2.00000 -89.92595 2.00000 -89.92504 2.00000 -89.92076 2.00000 -89.91009 2.00000 -89.90579 2.00000 -89.90489 2.00000 -10.24052 2.00000 -5.53727 2.00000 -3.85092 2.00000 -1.44996 0.00000 2.37158 0.00000 4.50089 0.00000 4.85652 0.00000 5.99785 0.00000 6.37383 0.00000 9.92202 0.00000 12.74806 0.00000 13.27083 0.00000 14.17359 0.00000 17.15502 0.00000 17.17157 + 19 0.2343750 0.2343750 0.4687500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90117 2.00000 -133.89692 2.00000 -89.92588 2.00000 -89.92498 2.00000 -89.92095 2.00000 -89.90989 2.00000 -89.90585 2.00000 -89.90496 2.00000 -10.35316 2.00000 -5.38686 2.00000 -3.74108 2.00000 -1.37226 0.00000 2.44801 0.00000 4.36721 0.00000 4.71984 0.00000 5.92337 0.00000 6.31345 0.00000 10.20215 0.00000 12.37826 0.00000 13.13231 0.00000 14.09656 0.00000 16.86802 0.00000 17.21666 + 20 0.2265625 0.2265625 0.4531250 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90126 2.00000 -133.89683 2.00000 -89.92580 2.00000 -89.92492 2.00000 -89.92114 2.00000 -89.90971 2.00000 -89.90591 2.00000 -89.90504 2.00000 -10.46373 2.00000 -5.23234 2.00000 -3.62619 2.00000 -1.29525 0.00000 2.52043 0.00000 4.23771 0.00000 4.58676 0.00000 5.85749 0.00000 6.26176 0.00000 10.45004 0.00000 12.00857 0.00000 13.00409 0.00000 14.04810 0.00000 16.59211 0.00000 17.24038 + 21 0.2187500 0.2187500 0.4375000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90135 2.00000 -133.89674 2.00000 -89.92572 2.00000 -89.92486 2.00000 -89.92132 2.00000 -89.90952 2.00000 -89.90597 2.00000 -89.90512 2.00000 -10.57199 2.00000 -5.07375 2.00000 -3.50658 2.00000 -1.21924 0.00000 2.58799 0.00000 4.11242 0.00000 4.45735 0.00000 5.80054 0.00000 6.21897 0.00000 10.65690 0.00000 11.64203 0.00000 12.88380 0.00000 14.03129 0.00000 16.33454 0.00000 17.23976 + 22 0.2109375 0.2109375 0.4218750 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90145 2.00000 -133.89664 2.00000 -89.92563 2.00000 -89.92480 2.00000 -89.92150 2.00000 -89.90935 2.00000 -89.90603 2.00000 -89.90521 2.00000 -10.67772 2.00000 -4.91114 2.00000 -3.38257 2.00000 -1.14455 0.00000 2.64989 0.00000 3.99137 0.00000 4.33166 0.00000 5.75274 0.00000 6.18525 0.00000 10.81496 0.00000 11.28016 0.00000 12.77063 0.00000 14.04447 0.00000 16.10605 0.00000 17.21200 + 23 0.2031250 0.2031250 0.4062500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90154 2.00000 -133.89655 2.00000 -89.92554 2.00000 -89.92474 2.00000 -89.92167 2.00000 -89.90918 2.00000 -89.90609 2.00000 -89.90529 2.00000 -10.78072 2.00000 -4.74456 2.00000 -3.25451 2.00000 -1.07147 0.00000 2.70535 0.00000 3.87459 0.00000 4.20972 0.00000 5.71404 0.00000 6.16075 0.00000 10.91961 0.00000 10.92406 0.00000 12.66424 0.00000 14.07639 0.00000 15.92357 0.00000 17.15475 + 24 0.1953125 0.1953125 0.3906250 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90163 2.00000 -133.89646 2.00000 -89.92545 2.00000 -89.92468 2.00000 -89.92183 2.00000 -89.90901 2.00000 -89.90614 2.00000 -89.90538 2.00000 -10.88081 2.00000 -4.57409 2.00000 -3.12270 2.00000 -1.00031 0.00000 2.75375 0.00000 3.76210 0.00000 4.09153 0.00000 5.68410 0.00000 6.14555 0.00000 10.57476 0.00000 10.97102 0.00000 12.56447 0.00000 14.10263 0.00000 15.81236 0.00000 17.06643 + 25 0.1875000 0.1875000 0.3750000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90171 2.00000 -133.89637 2.00000 -89.92536 2.00000 -89.92462 2.00000 -89.92199 2.00000 -89.90885 2.00000 -89.90620 2.00000 -89.90547 2.00000 -10.97783 2.00000 -4.39981 2.00000 -2.98747 2.00000 -0.93137 0.00000 2.79462 0.00000 3.65393 0.00000 3.97710 0.00000 5.66217 0.00000 6.13970 0.00000 10.23337 0.00000 10.97387 0.00000 12.47125 0.00000 14.09110 0.00000 15.80066 0.00000 16.94643 + 26 0.1796875 0.1796875 0.3593750 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90180 2.00000 -133.89629 2.00000 -89.92527 2.00000 -89.92457 2.00000 -89.92214 2.00000 -89.90869 2.00000 -89.90626 2.00000 -89.90556 2.00000 -11.07165 2.00000 -4.22178 2.00000 -2.84915 2.00000 -0.86490 0.00000 2.82770 0.00000 3.55009 0.00000 3.86641 0.00000 5.64696 0.00000 6.14317 0.00000 9.90123 0.00000 10.93548 0.00000 12.38451 0.00000 14.02214 0.00000 15.90161 0.00000 16.79529 + 27 0.1718750 0.1718750 0.3437500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90189 2.00000 -133.89620 2.00000 -89.92518 2.00000 -89.92451 2.00000 -89.92229 2.00000 -89.90855 2.00000 -89.90631 2.00000 -89.90566 2.00000 -11.16214 2.00000 -4.04011 2.00000 -2.70810 2.00000 -0.80117 0.00000 2.85297 0.00000 3.45060 0.00000 3.75943 0.00000 5.63656 0.00000 6.15589 0.00000 9.57998 0.00000 10.86375 0.00000 12.30419 0.00000 13.90156 0.00000 16.10224 0.00000 16.61469 + 28 0.1640625 0.1640625 0.3281250 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90197 2.00000 -133.89612 2.00000 -89.92508 2.00000 -89.92446 2.00000 -89.92243 2.00000 -89.90841 2.00000 -89.90637 2.00000 -89.90575 2.00000 -11.24919 2.00000 -3.85491 2.00000 -2.56466 2.00000 -0.74038 0.00000 2.87063 0.00000 3.35547 0.00000 3.65613 0.00000 5.62832 0.00000 6.17777 0.00000 9.27171 0.00000 10.76582 0.00000 12.23025 0.00000 13.74837 0.00000 16.37707 0.00000 16.40722 + 29 0.1562500 0.1562500 0.3125000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90205 2.00000 -133.89604 2.00000 -89.92499 2.00000 -89.92441 2.00000 -89.92256 2.00000 -89.90827 2.00000 -89.90642 2.00000 -89.90584 2.00000 -11.33270 2.00000 -3.66630 2.00000 -2.41924 2.00000 -0.68274 0.00000 2.88112 0.00000 3.26472 0.00000 3.55648 0.00000 5.61879 0.00000 6.20864 0.00000 8.97905 0.00000 10.64759 0.00000 12.16260 0.00000 13.57969 0.00000 16.17620 0.00000 16.70372 + 30 0.1484375 0.1484375 0.2968750 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90213 2.00000 -133.89596 2.00000 -89.92490 2.00000 -89.92436 2.00000 -89.92269 2.00000 -89.90814 2.00000 -89.90647 2.00000 -89.90593 2.00000 -11.41258 2.00000 -3.47443 2.00000 -2.27223 2.00000 -0.62838 0.00000 2.88501 0.00000 3.17835 0.00000 3.46041 0.00000 5.60363 0.00000 6.24831 0.00000 8.70531 0.00000 10.51385 0.00000 12.10115 0.00000 13.40684 0.00000 15.92536 0.00000 17.06675 + 31 0.1406250 0.1406250 0.2812500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90220 2.00000 -133.89589 2.00000 -89.92481 2.00000 -89.92431 2.00000 -89.92281 2.00000 -89.90802 2.00000 -89.90652 2.00000 -89.90602 2.00000 -11.48874 2.00000 -3.27948 2.00000 -2.12409 2.00000 -0.57742 0.00000 2.88301 0.00000 3.09637 0.00000 3.36789 0.00000 5.57767 0.00000 6.29654 0.00000 8.45452 0.00000 10.36846 0.00000 12.04580 0.00000 13.23661 0.00000 15.65860 0.00000 17.45608 + 32 0.1328125 0.1328125 0.2656250 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90227 2.00000 -133.89581 2.00000 -89.92472 2.00000 -89.92426 2.00000 -89.92292 2.00000 -89.90791 2.00000 -89.90656 2.00000 -89.90611 2.00000 -11.56111 2.00000 -3.08165 2.00000 -1.97530 2.00000 -0.52994 0.00000 2.87586 0.00000 3.01880 0.00000 3.27886 0.00000 5.53521 0.00000 6.35307 0.00000 8.23119 0.00000 10.21471 0.00000 11.99640 0.00000 13.07297 0.00000 15.37980 0.00000 17.86508 + 33 0.1250000 0.1250000 0.2500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90234 2.00000 -133.89574 2.00000 -89.92463 2.00000 -89.92421 2.00000 -89.92303 2.00000 -89.90780 2.00000 -89.90661 2.00000 -89.90619 2.00000 -11.62963 2.00000 -2.88119 2.00000 -1.82641 2.00000 -0.48596 0.00000 2.86434 0.00000 2.94563 0.00000 3.19326 0.00000 5.47065 0.00000 6.41756 0.00000 8.03974 0.00000 10.05544 0.00000 11.95282 0.00000 12.91818 0.00000 15.09270 0.00000 18.28920 + 34 0.1171875 0.1171875 0.2343750 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90240 2.00000 -133.89568 2.00000 -89.92455 2.00000 -89.92417 2.00000 -89.92313 2.00000 -89.90770 2.00000 -89.90665 2.00000 -89.90628 2.00000 -11.69425 2.00000 -2.67839 2.00000 -1.67799 2.00000 -0.44548 0.00000 2.84915 0.00000 2.87687 0.00000 3.11105 0.00000 5.37957 0.00000 6.48965 0.00000 7.88353 0.00000 9.89326 0.00000 11.91486 0.00000 12.77347 0.00000 14.80080 0.00000 18.72516 + 35 0.1093750 0.1093750 0.2187500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90247 2.00000 -133.89562 2.00000 -89.92446 2.00000 -89.92413 2.00000 -89.92322 2.00000 -89.90760 2.00000 -89.90669 2.00000 -89.90636 2.00000 -11.75490 2.00000 -2.47363 2.00000 -1.53073 2.00000 -0.40847 0.00000 2.81253 0.00000 2.83094 0.00000 3.03218 0.00000 5.25997 0.00000 6.56887 0.00000 7.76364 0.00000 9.73062 0.00000 11.88234 0.00000 12.63939 0.00000 14.50736 0.00000 19.17050 + 36 0.1015625 0.1015625 0.2031250 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90252 2.00000 -133.89556 2.00000 -89.92438 2.00000 -89.92409 2.00000 -89.92331 2.00000 -89.90751 2.00000 -89.90673 2.00000 -89.90644 2.00000 -11.81154 2.00000 -2.26734 2.00000 -1.38534 2.00000 -0.37485 0.00000 2.75261 0.00000 2.81025 0.00000 2.95662 0.00000 5.11294 0.00000 6.65464 0.00000 7.67829 0.00000 9.56981 0.00000 11.85502 0.00000 12.51610 0.00000 14.21541 0.00000 19.62319 + 37 0.0937500 0.0937500 0.1875000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90258 2.00000 -133.89550 2.00000 -89.92431 2.00000 -89.92406 2.00000 -89.92339 2.00000 -89.90743 2.00000 -89.90676 2.00000 -89.90651 2.00000 -11.86412 2.00000 -2.06010 2.00000 -1.24266 2.00000 -0.34452 0.00000 2.69711 0.00000 2.78749 0.00000 2.88439 0.00000 4.94237 0.00000 6.74625 0.00000 7.62319 0.00000 9.41305 0.00000 11.83264 0.00000 12.40351 0.00000 13.92771 0.00000 20.08148 + 38 0.0859375 0.0859375 0.1718750 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90263 2.00000 -133.89545 2.00000 -89.92424 2.00000 -89.92402 2.00000 -89.92346 2.00000 -89.90736 2.00000 -89.90679 2.00000 -89.90658 2.00000 -11.91262 2.00000 -1.85261 2.00000 -1.10361 2.00000 -0.31737 0.00000 2.64605 0.00000 2.76290 0.00000 2.81553 0.00000 4.75392 0.00000 6.84281 0.00000 7.59260 0.00000 9.26242 0.00000 11.81490 0.00000 12.30139 0.00000 13.64689 0.00000 20.54369 + 39 0.0781250 0.0781250 0.1562500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90267 2.00000 -133.89541 2.00000 -89.92417 2.00000 -89.92399 2.00000 -89.92353 2.00000 -89.90729 2.00000 -89.90682 2.00000 -89.90664 2.00000 -11.95699 2.00000 -1.64578 2.00000 -0.96923 2.00000 -0.29325 0.00000 2.59941 0.00000 2.73655 0.00000 2.75012 0.00000 4.55390 0.00000 6.94322 0.00000 7.58058 0.00000 9.11988 0.00000 11.80143 0.00000 12.20943 0.00000 13.37543 0.00000 21.00811 + 40 0.0703125 0.0703125 0.1406250 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90271 2.00000 -133.89536 2.00000 -89.92411 2.00000 -89.92397 2.00000 -89.92359 2.00000 -89.90723 2.00000 -89.90685 2.00000 -89.90670 2.00000 -11.99721 2.00000 -1.44082 2.00000 -0.84067 2.00000 -0.27203 0.00000 2.55721 0.00000 2.68836 0.00000 2.70827 0.00000 4.34863 0.00000 7.04609 0.00000 7.58175 0.00000 8.98725 0.00000 11.79182 0.00000 12.12731 0.00000 13.11581 0.00000 21.47277 + 41 0.0625000 0.0625000 0.1250000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90275 2.00000 -133.89532 2.00000 -89.92406 2.00000 -89.92394 2.00000 -89.92364 2.00000 -89.90717 2.00000 -89.90688 2.00000 -89.90676 2.00000 -12.03325 2.00000 -1.23927 2.00000 -0.71922 2.00000 -0.25355 0.00000 2.51944 0.00000 2.63050 0.00000 2.67760 0.00000 4.14423 0.00000 7.14974 0.00000 7.59163 0.00000 8.86612 0.00000 11.78561 0.00000 12.05470 0.00000 12.87054 0.00000 21.93531 + 42 0.0546875 0.0546875 0.1093750 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90279 2.00000 -133.89529 2.00000 -89.92401 2.00000 -89.92392 2.00000 -89.92369 2.00000 -89.90713 2.00000 -89.90690 2.00000 -89.90681 2.00000 -12.06509 2.00000 -1.04320 2.00000 -0.60632 2.00000 -0.23766 0.00000 2.48611 0.00000 2.57693 0.00000 2.64382 0.00000 3.94676 0.00000 7.25212 0.00000 7.60664 0.00000 8.75785 0.00000 11.78224 0.00000 11.99132 0.00000 12.64230 0.00000 22.12920 + 43 0.0468750 0.0468750 0.0937500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90281 2.00000 -133.89526 2.00000 -89.92397 2.00000 -89.92390 2.00000 -89.92373 2.00000 -89.90709 2.00000 -89.90692 2.00000 -89.90685 2.00000 -12.09271 2.00000 -0.85539 2.00000 -0.50350 2.00000 -0.22422 0.00000 2.45722 0.00000 2.52816 0.00000 2.60597 0.00000 3.76244 0.00000 7.35079 0.00000 7.62401 0.00000 8.66350 0.00000 11.78114 0.00000 11.93691 0.00000 12.43400 0.00000 22.17468 + 44 0.0390625 0.0390625 0.0781250 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90284 2.00000 -133.89523 2.00000 -89.92393 2.00000 -89.92388 2.00000 -89.92377 2.00000 -89.90705 2.00000 -89.90693 2.00000 -89.90689 2.00000 -12.11609 2.00000 -0.67955 2.00000 -0.41242 2.00000 -0.21310 0.00000 2.43278 0.00000 2.48485 0.00000 2.56325 0.00000 3.59768 0.00000 7.44288 0.00000 7.64161 0.00000 8.58377 0.00000 11.78166 0.00000 11.89123 0.00000 12.24879 0.00000 22.17949 + 45 0.0312500 0.0312500 0.0625000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90286 2.00000 -133.89521 2.00000 -89.92390 2.00000 -89.92387 2.00000 -89.92379 2.00000 -89.90702 2.00000 -89.90695 2.00000 -89.90692 2.00000 -12.13524 2.00000 -0.52057 2.00000 -0.33477 2.00000 -0.20417 0.00000 2.41277 0.00000 2.44774 0.00000 2.51590 0.00000 3.45854 0.00000 7.52516 0.00000 7.65786 0.00000 8.51898 0.00000 11.78319 0.00000 11.85410 0.00000 12.09013 0.00000 22.15532 + 46 0.0234375 0.0234375 0.0468750 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90287 2.00000 -133.89520 2.00000 -89.92387 2.00000 -89.92386 2.00000 -89.92382 2.00000 -89.90700 2.00000 -89.90696 2.00000 -89.90694 2.00000 -12.15013 2.00000 -0.38467 2.00000 -0.27221 2.00000 -0.19734 0.00000 2.39721 0.00000 2.41767 0.00000 2.46659 0.00000 3.34961 0.00000 7.59419 0.00000 7.67158 0.00000 8.46912 0.00000 11.78512 0.00000 11.82537 0.00000 11.96159 0.00000 22.11790 + 47 0.0156250 0.0156250 0.0312500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90288 2.00000 -133.89519 2.00000 -89.92386 2.00000 -89.92385 2.00000 -89.92383 2.00000 -89.90698 2.00000 -89.90697 2.00000 -89.90696 2.00000 -12.16078 2.00000 -0.27925 2.00000 -0.22627 2.00000 -0.19252 0.00000 2.38610 0.00000 2.39546 0.00000 2.42144 0.00000 3.27290 0.00000 7.64658 0.00000 7.68194 0.00000 8.43394 0.00000 11.78692 0.00000 11.80493 0.00000 11.86666 0.00000 22.08133 + 48 0.0078125 0.0078125 0.0156250 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90289 2.00000 -133.89518 2.00000 -89.92385 2.00000 -89.92384 2.00000 -89.92384 2.00000 -89.90698 2.00000 -89.90697 2.00000 -89.90697 2.00000 -12.16716 2.00000 -0.21192 2.00000 -0.19816 2.00000 -0.18965 0.00000 2.37943 0.00000 2.38181 0.00000 2.38905 0.00000 3.22790 0.00000 7.67937 0.00000 7.68836 0.00000 8.41305 0.00000 11.78818 0.00000 11.79270 0.00000 11.80832 0.00000 22.05561 + 49 0.0000000 0.0000000 0.0000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90289 2.00000 -133.89518 2.00000 -89.92384 2.00000 -89.92384 2.00000 -89.92384 2.00000 -89.90697 2.00000 -89.90697 2.00000 -89.90697 2.00000 -12.16929 2.00000 -0.18870 2.00000 -0.18870 2.00000 -0.18870 0.00000 2.37720 0.00000 2.37720 0.00000 2.37720 0.00000 3.21314 0.00000 7.69054 0.00000 7.69054 0.00000 8.40613 0.00000 11.78863 0.00000 11.78863 0.00000 11.78863 0.00000 22.04643 diff --git a/tests/test_data/aims/static-si-bs-density/band1005.out b/tests/test_data/aims/static-si-bs-density/band1005.out new file mode 100644 index 0000000000..61293a9060 --- /dev/null +++ b/tests/test_data/aims/static-si-bs-density/band1005.out @@ -0,0 +1,40 @@ + 1 0.0000000 0.0000000 0.0000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90289 2.00000 -133.89518 2.00000 -89.92384 2.00000 -89.92384 2.00000 -89.92384 2.00000 -89.90697 2.00000 -89.90697 2.00000 -89.90697 2.00000 -12.16929 2.00000 -0.18870 2.00000 -0.18870 2.00000 -0.18870 0.00000 2.37720 0.00000 2.37720 0.00000 2.37720 0.00000 3.21314 0.00000 7.69054 0.00000 7.69054 0.00000 8.40613 0.00000 11.78863 0.00000 11.78863 0.00000 11.78863 0.00000 22.04643 + 2 0.0128205 0.0128205 0.0128205 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90289 2.00000 -133.89518 2.00000 -89.92385 2.00000 -89.92385 2.00000 -89.92384 2.00000 -89.90697 2.00000 -89.90697 2.00000 -89.90697 2.00000 -12.16714 2.00000 -0.21500 2.00000 -0.19252 2.00000 -0.19252 0.00000 2.38277 0.00000 2.38277 0.00000 2.38486 0.00000 3.22809 0.00000 7.68380 0.00000 7.68380 0.00000 8.41312 0.00000 11.78291 0.00000 11.80327 0.00000 11.80327 0.00000 22.05566 + 3 0.0256410 0.0256410 0.0256410 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90288 2.00000 -133.89519 2.00000 -89.92385 2.00000 -89.92385 2.00000 -89.92383 2.00000 -89.90698 2.00000 -89.90696 2.00000 -89.90696 2.00000 -12.16069 2.00000 -0.29123 2.00000 -0.20386 2.00000 -0.20386 0.00000 2.39930 0.00000 2.39930 0.00000 2.40401 0.00000 3.27418 0.00000 7.66397 0.00000 7.66397 0.00000 8.43424 0.00000 11.76594 0.00000 11.84678 0.00000 11.84678 0.00000 22.08095 + 4 0.0384615 0.0384615 0.0384615 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90287 2.00000 -133.89520 2.00000 -89.92386 2.00000 -89.92386 2.00000 -89.92382 2.00000 -89.90699 2.00000 -89.90695 2.00000 -89.90695 2.00000 -12.14995 2.00000 -0.41060 2.00000 -0.22235 2.00000 -0.22235 0.00000 2.42569 0.00000 2.42632 0.00000 2.42632 0.00000 3.35382 0.00000 7.63222 0.00000 7.63222 0.00000 8.46983 0.00000 11.73833 0.00000 11.91806 0.00000 11.91806 0.00000 22.11460 + 5 0.0512821 0.0512821 0.0512821 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90286 2.00000 -133.89521 2.00000 -89.92388 2.00000 -89.92388 2.00000 -89.92380 2.00000 -89.90701 2.00000 -89.90694 2.00000 -89.90694 2.00000 -12.13491 2.00000 -0.56457 2.00000 -0.24743 2.00000 -0.24743 0.00000 2.44102 0.00000 2.46307 0.00000 2.46307 0.00000 3.46774 0.00000 7.59027 0.00000 7.59027 0.00000 8.52032 0.00000 11.70107 0.00000 12.01541 0.00000 12.01541 0.00000 22.14239 + 6 0.0641026 0.0641026 0.0641026 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90284 2.00000 -133.89524 2.00000 -89.92390 2.00000 -89.92390 2.00000 -89.92378 2.00000 -89.90703 2.00000 -89.90692 2.00000 -89.90692 2.00000 -12.11558 2.00000 -0.74500 2.00000 -0.27838 2.00000 -0.27838 0.00000 2.44505 0.00000 2.50855 0.00000 2.50855 0.00000 3.61325 0.00000 7.54030 0.00000 7.54030 0.00000 8.58592 0.00000 11.65555 0.00000 12.13675 0.00000 12.13675 0.00000 22.14319 + 7 0.0769231 0.0769231 0.0769231 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90281 2.00000 -133.89526 2.00000 -89.92392 2.00000 -89.92392 2.00000 -89.92376 2.00000 -89.90706 2.00000 -89.90690 2.00000 -89.90690 2.00000 -12.09197 2.00000 -0.94505 2.00000 -0.31440 2.00000 -0.31440 0.00000 2.43689 0.00000 2.56162 0.00000 2.56162 0.00000 3.78500 0.00000 7.48467 0.00000 7.48467 0.00000 8.66648 0.00000 11.60354 0.00000 12.27976 0.00000 12.27976 0.00000 22.09384 + 8 0.0897436 0.0897436 0.0897436 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90278 2.00000 -133.89529 2.00000 -89.92395 2.00000 -89.92395 2.00000 -89.92372 2.00000 -89.90709 2.00000 -89.90687 2.00000 -89.90687 2.00000 -12.06410 2.00000 -1.15940 2.00000 -0.35467 2.00000 -0.35467 0.00000 2.41791 0.00000 2.62100 0.00000 2.62100 0.00000 3.97699 0.00000 7.42579 0.00000 7.42579 0.00000 8.76130 0.00000 11.54723 0.00000 12.44210 0.00000 12.44210 0.00000 21.98096 + 9 0.1025641 0.1025641 0.1025641 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90275 2.00000 -133.89533 2.00000 -89.92398 2.00000 -89.92398 2.00000 -89.92369 2.00000 -89.90713 2.00000 -89.90684 2.00000 -89.90684 2.00000 -12.03198 2.00000 -1.38404 2.00000 -0.39838 2.00000 -0.39838 0.00000 2.39012 0.00000 2.68534 0.00000 2.68534 0.00000 4.18385 0.00000 7.36605 0.00000 7.36605 0.00000 8.86893 0.00000 11.48930 0.00000 12.62142 0.00000 12.62142 0.00000 21.80850 + 10 0.1153846 0.1153846 0.1153846 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90271 2.00000 -133.89536 2.00000 -89.92401 2.00000 -89.92401 2.00000 -89.92365 2.00000 -89.90717 2.00000 -89.90681 2.00000 -89.90681 2.00000 -11.99564 2.00000 -1.61593 2.00000 -0.44475 2.00000 -0.44475 0.00000 2.35547 0.00000 2.75323 0.00000 2.75323 0.00000 4.40137 0.00000 7.30773 0.00000 7.30773 0.00000 8.98707 0.00000 11.43307 0.00000 12.81543 0.00000 12.81543 0.00000 21.59105 + 11 0.1282051 0.1282051 0.1282051 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90267 2.00000 -133.89541 2.00000 -89.92405 2.00000 -89.92405 2.00000 -89.92361 2.00000 -89.90722 2.00000 -89.90677 2.00000 -89.90677 2.00000 -11.95510 2.00000 -1.85279 2.00000 -0.49308 2.00000 -0.49308 0.00000 2.31558 0.00000 2.82324 0.00000 2.82324 0.00000 4.62635 0.00000 7.25298 0.00000 7.25298 0.00000 9.11232 0.00000 11.38268 0.00000 13.02188 0.00000 13.02188 0.00000 21.34348 + 12 0.1410256 0.1410256 0.1410256 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90263 2.00000 -133.89545 2.00000 -89.92409 2.00000 -89.92409 2.00000 -89.92356 2.00000 -89.90726 2.00000 -89.90673 2.00000 -89.90673 2.00000 -11.91041 2.00000 -2.09289 2.00000 -0.54275 2.00000 -0.54275 0.00000 2.27181 0.00000 2.89392 0.00000 2.89392 0.00000 4.85643 0.00000 7.20380 0.00000 7.20380 0.00000 9.23995 0.00000 11.34340 0.00000 13.23855 0.00000 13.23855 0.00000 21.07681 + 13 0.1538462 0.1538462 0.1538462 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90258 2.00000 -133.89550 2.00000 -89.92413 2.00000 -89.92413 2.00000 -89.92351 2.00000 -89.90732 2.00000 -89.90669 2.00000 -89.90669 2.00000 -11.86158 2.00000 -2.33488 2.00000 -0.59318 2.00000 -0.59318 0.00000 2.22522 0.00000 2.96383 0.00000 2.96383 0.00000 5.08987 0.00000 7.16210 0.00000 7.16210 0.00000 9.36365 0.00000 11.32187 0.00000 13.46311 0.00000 13.46311 0.00000 20.79837 + 14 0.1666667 0.1666667 0.1666667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90252 2.00000 -133.89556 2.00000 -89.92418 2.00000 -89.92418 2.00000 -89.92345 2.00000 -89.90737 2.00000 -89.90664 2.00000 -89.90664 2.00000 -11.80869 2.00000 -2.57768 2.00000 -0.64390 2.00000 -0.64390 0.00000 2.17670 0.00000 3.03155 0.00000 3.03155 0.00000 5.32538 0.00000 7.12964 0.00000 7.12964 0.00000 9.47567 0.00000 11.32604 0.00000 13.69312 0.00000 13.69312 0.00000 20.51289 + 15 0.1794872 0.1794872 0.1794872 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90246 2.00000 -133.89562 2.00000 -89.92422 2.00000 -89.92422 2.00000 -89.92340 2.00000 -89.90743 2.00000 -89.90660 2.00000 -89.90660 2.00000 -11.75177 2.00000 -2.82042 2.00000 -0.69447 2.00000 -0.69447 0.00000 2.12699 0.00000 3.09570 0.00000 3.09570 0.00000 5.56197 0.00000 7.10804 0.00000 7.10804 0.00000 9.56771 0.00000 11.36423 0.00000 13.92579 0.00000 13.92579 0.00000 20.22354 + 16 0.1923077 0.1923077 0.1923077 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90240 2.00000 -133.89568 2.00000 -89.92427 2.00000 -89.92427 2.00000 -89.92334 2.00000 -89.90749 2.00000 -89.90655 2.00000 -89.90655 2.00000 -11.69090 2.00000 -3.06241 2.00000 -0.74454 2.00000 -0.74454 0.00000 2.07671 0.00000 3.15502 0.00000 3.15502 0.00000 5.79888 0.00000 7.09881 0.00000 7.09881 0.00000 9.63306 0.00000 11.44308 0.00000 14.15789 0.00000 14.15789 0.00000 19.93255 + 17 0.2051282 0.2051282 0.2051282 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90234 2.00000 -133.89574 2.00000 -89.92432 2.00000 -89.92432 2.00000 -89.92327 2.00000 -89.90756 2.00000 -89.90650 2.00000 -89.90650 2.00000 -11.62614 2.00000 -3.30303 2.00000 -0.79380 2.00000 -0.79380 0.00000 2.02635 0.00000 3.20837 0.00000 3.20837 0.00000 6.03551 0.00000 7.10323 0.00000 7.10323 0.00000 9.66901 0.00000 11.56511 0.00000 14.38541 0.00000 14.38541 0.00000 19.64158 + 18 0.2179487 0.2179487 0.2179487 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90227 2.00000 -133.89581 2.00000 -89.92437 2.00000 -89.92437 2.00000 -89.92321 2.00000 -89.90763 2.00000 -89.90645 2.00000 -89.90645 2.00000 -11.55758 2.00000 -3.54176 2.00000 -0.84198 2.00000 -0.84198 0.00000 1.97636 0.00000 3.25483 0.00000 3.25483 0.00000 6.27127 0.00000 7.12239 0.00000 7.12239 0.00000 9.67763 0.00000 11.72797 0.00000 14.60320 0.00000 14.60320 0.00000 19.35203 + 19 0.2307692 0.2307692 0.2307692 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90220 2.00000 -133.89588 2.00000 -89.92442 2.00000 -89.92442 2.00000 -89.92314 2.00000 -89.90769 2.00000 -89.90640 2.00000 -89.90640 2.00000 -11.48531 2.00000 -3.77815 2.00000 -0.88886 2.00000 -0.88886 0.00000 1.92709 0.00000 3.29373 0.00000 3.29373 0.00000 6.50562 0.00000 7.15711 0.00000 7.15711 0.00000 9.66435 0.00000 11.92587 0.00000 14.80445 0.00000 14.80445 0.00000 19.06516 + 20 0.2435897 0.2435897 0.2435897 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90213 2.00000 -133.89595 2.00000 -89.92447 2.00000 -89.92447 2.00000 -89.92308 2.00000 -89.90776 2.00000 -89.90635 2.00000 -89.90635 2.00000 -11.40946 2.00000 -4.01177 2.00000 -0.93425 2.00000 -0.93425 0.00000 1.87887 0.00000 3.32469 0.00000 3.32469 0.00000 6.73790 0.00000 7.20794 0.00000 7.20794 0.00000 9.63569 0.00000 12.15179 0.00000 14.98010 0.00000 14.98010 0.00000 18.78230 + 21 0.2564103 0.2564103 0.2564103 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90206 2.00000 -133.89603 2.00000 -89.92452 2.00000 -89.92452 2.00000 -89.92301 2.00000 -89.90783 2.00000 -89.90630 2.00000 -89.90630 2.00000 -11.33015 2.00000 -4.24223 2.00000 -0.97798 2.00000 -0.97798 0.00000 1.83196 0.00000 3.34765 0.00000 3.34765 0.00000 6.96727 0.00000 7.27511 0.00000 7.27511 0.00000 9.59787 0.00000 12.39896 0.00000 15.11852 0.00000 15.11852 0.00000 18.50496 + 22 0.2692308 0.2692308 0.2692308 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90198 2.00000 -133.89610 2.00000 -89.92457 2.00000 -89.92457 2.00000 -89.92294 2.00000 -89.90790 2.00000 -89.90625 2.00000 -89.90625 2.00000 -11.24755 2.00000 -4.46916 2.00000 -1.01993 2.00000 -1.01993 0.00000 1.78658 0.00000 3.36285 0.00000 3.36285 0.00000 7.19257 0.00000 7.35856 0.00000 7.35856 0.00000 9.55638 0.00000 12.66120 0.00000 15.20621 0.00000 15.20621 0.00000 18.23507 + 23 0.2820513 0.2820513 0.2820513 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90191 2.00000 -133.89618 2.00000 -89.92462 2.00000 -89.92462 2.00000 -89.92287 2.00000 -89.90797 2.00000 -89.90620 2.00000 -89.90620 2.00000 -11.16184 2.00000 -4.69217 2.00000 -1.05999 2.00000 -1.05999 0.00000 1.74293 0.00000 3.37079 0.00000 3.37079 0.00000 7.41210 0.00000 7.45796 0.00000 7.45796 0.00000 9.51617 0.00000 12.93267 0.00000 15.23079 0.00000 15.23079 0.00000 17.97518 + 24 0.2948718 0.2948718 0.2948718 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90183 2.00000 -133.89626 2.00000 -89.92467 2.00000 -89.92467 2.00000 -89.92281 2.00000 -89.90805 2.00000 -89.90616 2.00000 -89.90616 2.00000 -11.07324 2.00000 -4.91088 2.00000 -1.09804 2.00000 -1.09804 0.00000 1.70118 0.00000 3.37220 0.00000 3.37220 0.00000 7.57279 0.00000 7.57279 0.00000 7.62331 0.00000 9.48221 0.00000 13.20732 0.00000 15.18567 0.00000 15.18567 0.00000 17.72889 + 25 0.3076923 0.3076923 0.3076923 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90175 2.00000 -133.89633 2.00000 -89.92472 2.00000 -89.92472 2.00000 -89.92274 2.00000 -89.90811 2.00000 -89.90611 2.00000 -89.90611 2.00000 -10.98202 2.00000 -5.12488 2.00000 -1.13403 2.00000 -1.13403 0.00000 1.66146 0.00000 3.36794 0.00000 3.36794 0.00000 7.70233 0.00000 7.70233 0.00000 7.82238 0.00000 9.46006 0.00000 13.47802 0.00000 15.07349 0.00000 15.07349 0.00000 17.50148 + 26 0.3205128 0.3205128 0.3205128 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90167 2.00000 -133.89641 2.00000 -89.92476 2.00000 -89.92476 2.00000 -89.92267 2.00000 -89.90818 2.00000 -89.90606 2.00000 -89.90606 2.00000 -10.88851 2.00000 -5.33372 2.00000 -1.16788 2.00000 -1.16788 0.00000 1.62390 0.00000 3.35897 0.00000 3.35897 0.00000 7.84579 0.00000 7.84579 0.00000 8.00380 0.00000 9.45653 0.00000 13.73555 0.00000 14.90462 0.00000 14.90462 0.00000 17.30079 + 27 0.3333333 0.3333333 0.3333333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90160 2.00000 -133.89649 2.00000 -89.92480 2.00000 -89.92480 2.00000 -89.92261 2.00000 -89.90825 2.00000 -89.90602 2.00000 -89.90602 2.00000 -10.79309 2.00000 -5.53690 2.00000 -1.19954 2.00000 -1.19954 0.00000 1.58859 0.00000 3.34626 0.00000 3.34626 0.00000 8.00231 0.00000 8.00231 0.00000 8.16038 0.00000 9.47968 0.00000 13.96734 0.00000 14.69244 0.00000 14.69244 0.00000 17.13832 + 28 0.3461539 0.3461539 0.3461539 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90152 2.00000 -133.89656 2.00000 -89.92485 2.00000 -89.92485 2.00000 -89.92255 2.00000 -89.90831 2.00000 -89.90598 2.00000 -89.90598 2.00000 -10.69625 2.00000 -5.73385 2.00000 -1.22897 2.00000 -1.22897 0.00000 1.55564 0.00000 3.33077 0.00000 3.33077 0.00000 8.17101 0.00000 8.17101 0.00000 8.28478 0.00000 9.53746 0.00000 14.15684 0.00000 14.44943 0.00000 14.44943 0.00000 17.02986 + 29 0.3589744 0.3589744 0.3589744 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90145 2.00000 -133.89664 2.00000 -89.92488 2.00000 -89.92488 2.00000 -89.92249 2.00000 -89.90837 2.00000 -89.90594 2.00000 -89.90594 2.00000 -10.59856 2.00000 -5.92390 2.00000 -1.25612 2.00000 -1.25612 0.00000 1.52510 0.00000 3.31342 0.00000 3.31342 0.00000 8.35102 0.00000 8.35102 0.00000 8.37296 0.00000 9.63420 0.00000 14.18549 0.00000 14.18549 0.00000 14.28537 0.00000 16.99353 + 30 0.3717949 0.3717949 0.3717949 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90138 2.00000 -133.89671 2.00000 -89.92492 2.00000 -89.92492 2.00000 -89.92244 2.00000 -89.90843 2.00000 -89.90591 2.00000 -89.90591 2.00000 -10.50076 2.00000 -6.10624 2.00000 -1.28098 2.00000 -1.28098 0.00000 1.49705 0.00000 3.29502 0.00000 3.29502 0.00000 8.42716 0.00000 8.54147 0.00000 8.54147 0.00000 9.76771 0.00000 13.90800 0.00000 13.90800 0.00000 14.33886 0.00000 17.04306 + 31 0.3846154 0.3846154 0.3846154 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90131 2.00000 -133.89678 2.00000 -89.92495 2.00000 -89.92495 2.00000 -89.92239 2.00000 -89.90848 2.00000 -89.90587 2.00000 -89.90587 2.00000 -10.40375 2.00000 -6.27992 2.00000 -1.30352 2.00000 -1.30352 0.00000 1.47155 0.00000 3.27633 0.00000 3.27633 0.00000 8.45466 0.00000 8.74153 0.00000 8.74153 0.00000 9.93045 0.00000 13.62231 0.00000 13.62231 0.00000 14.31603 0.00000 17.17962 + 32 0.3974359 0.3974359 0.3974359 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90124 2.00000 -133.89684 2.00000 -89.92498 2.00000 -89.92498 2.00000 -89.92234 2.00000 -89.90853 2.00000 -89.90584 2.00000 -89.90584 2.00000 -10.30863 2.00000 -6.44377 2.00000 -1.32371 2.00000 -1.32371 0.00000 1.44862 0.00000 3.25800 0.00000 3.25800 0.00000 8.46400 0.00000 8.95031 0.00000 8.95031 0.00000 10.11327 0.00000 13.33238 0.00000 13.33238 0.00000 14.22919 0.00000 17.39105 + 33 0.4102564 0.4102564 0.4102564 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90119 2.00000 -133.89690 2.00000 -89.92501 2.00000 -89.92501 2.00000 -89.92230 2.00000 -89.90858 2.00000 -89.90582 2.00000 -89.90582 2.00000 -10.21678 2.00000 -6.59638 2.00000 -1.34156 2.00000 -1.34156 0.00000 1.42832 0.00000 3.24061 0.00000 3.24061 0.00000 8.46226 0.00000 9.16691 0.00000 9.16691 0.00000 10.30797 0.00000 13.04124 0.00000 13.04124 0.00000 14.09671 0.00000 17.65946 + 34 0.4230769 0.4230769 0.4230769 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90113 2.00000 -133.89695 2.00000 -89.92504 2.00000 -89.92504 2.00000 -89.92226 2.00000 -89.90862 2.00000 -89.90579 2.00000 -89.90579 2.00000 -10.12986 2.00000 -6.73602 2.00000 -1.35704 2.00000 -1.35704 0.00000 1.41067 0.00000 3.22462 0.00000 3.22462 0.00000 8.45453 0.00000 9.39021 0.00000 9.39021 0.00000 10.50765 0.00000 12.75143 0.00000 12.75143 0.00000 13.93607 0.00000 17.96830 + 35 0.4358974 0.4358974 0.4358974 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90109 2.00000 -133.89700 2.00000 -89.92506 2.00000 -89.92506 2.00000 -89.92223 2.00000 -89.90865 2.00000 -89.90577 2.00000 -89.90577 2.00000 -10.04988 2.00000 -6.86067 2.00000 -1.37015 2.00000 -1.37015 0.00000 1.39569 0.00000 3.21046 0.00000 3.21046 0.00000 8.44421 0.00000 9.61878 0.00000 9.61878 0.00000 10.70596 0.00000 12.46541 0.00000 12.46541 0.00000 13.76173 0.00000 18.30469 + 36 0.4487180 0.4487180 0.4487180 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90105 2.00000 -133.89704 2.00000 -89.92507 2.00000 -89.92507 2.00000 -89.92220 2.00000 -89.90868 2.00000 -89.90576 2.00000 -89.90576 2.00000 -9.97917 2.00000 -6.96796 2.00000 -1.38089 2.00000 -1.38089 0.00000 1.38342 0.00000 3.19844 0.00000 3.19844 0.00000 8.43358 0.00000 9.85034 0.00000 9.85034 0.00000 10.89597 0.00000 12.18613 0.00000 12.18613 0.00000 13.58616 0.00000 18.65857 + 37 0.4615385 0.4615385 0.4615385 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90101 2.00000 -133.89707 2.00000 -89.92509 2.00000 -89.92509 2.00000 -89.92218 2.00000 -89.90870 2.00000 -89.90574 2.00000 -89.90574 2.00000 -9.92029 2.00000 -7.05533 2.00000 -1.38924 2.00000 -1.38924 0.00000 1.37385 0.00000 3.18883 0.00000 3.18883 0.00000 8.42411 0.00000 10.08064 0.00000 10.08064 0.00000 11.06877 0.00000 11.91831 0.00000 11.91831 0.00000 13.42182 0.00000 19.02033 + 38 0.4743590 0.4743590 0.4743590 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90099 2.00000 -133.89709 2.00000 -89.92510 2.00000 -89.92510 2.00000 -89.92216 2.00000 -89.90872 2.00000 -89.90573 2.00000 -89.90573 2.00000 -9.87581 2.00000 -7.12017 2.00000 -1.39521 2.00000 -1.39521 0.00000 1.36701 0.00000 3.18183 0.00000 3.18183 0.00000 8.41675 0.00000 10.30005 0.00000 10.30005 0.00000 11.21195 0.00000 11.67190 0.00000 11.67190 0.00000 13.28337 0.00000 19.37572 + 39 0.4871795 0.4871795 0.4871795 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90098 2.00000 -133.89711 2.00000 -89.92510 2.00000 -89.92510 2.00000 -89.92215 2.00000 -89.90873 2.00000 -89.90573 2.00000 -89.90573 2.00000 -9.84803 2.00000 -7.16016 2.00000 -1.39879 2.00000 -1.39879 0.00000 1.36291 0.00000 3.17758 0.00000 3.17758 0.00000 8.41213 0.00000 10.48261 0.00000 10.48261 0.00000 11.30923 0.00000 11.47306 0.00000 11.47306 0.00000 13.18845 0.00000 19.68817 + 40 0.5000000 0.5000000 0.5000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90097 2.00000 -133.89711 2.00000 -89.92510 2.00000 -89.92510 2.00000 -89.92215 2.00000 -89.90873 2.00000 -89.90573 2.00000 -89.90573 2.00000 -9.83858 2.00000 -7.17368 2.00000 -1.39998 2.00000 -1.39998 0.00000 1.36154 0.00000 3.17615 0.00000 3.17615 0.00000 8.41055 0.00000 10.56281 0.00000 10.56281 0.00000 11.34414 0.00000 11.38743 0.00000 11.38743 0.00000 13.15425 0.00000 19.83777 diff --git a/tests/test_data/aims/static-si-bs-density/band1006.out b/tests/test_data/aims/static-si-bs-density/band1006.out new file mode 100644 index 0000000000..1f1be2c644 --- /dev/null +++ b/tests/test_data/aims/static-si-bs-density/band1006.out @@ -0,0 +1,28 @@ + 1 0.5000000 0.5000000 0.5000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90097 2.00000 -133.89711 2.00000 -89.92510 2.00000 -89.92510 2.00000 -89.92215 2.00000 -89.90873 2.00000 -89.90573 2.00000 -89.90573 2.00000 -9.83858 2.00000 -7.17368 2.00000 -1.39998 2.00000 -1.39998 0.00000 1.36154 0.00000 3.17615 0.00000 3.17615 0.00000 8.41055 0.00000 10.56281 0.00000 10.56281 0.00000 11.34414 0.00000 11.38743 0.00000 11.38743 0.00000 13.15425 0.00000 19.83777 + 2 0.5046296 0.4907407 0.5046296 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90097 2.00000 -133.89712 2.00000 -89.92511 2.00000 -89.92511 2.00000 -89.92213 2.00000 -89.90874 2.00000 -89.90572 2.00000 -89.90572 2.00000 -9.83633 2.00000 -7.17249 2.00000 -1.42172 2.00000 -1.40422 0.00000 1.38178 0.00000 3.17256 0.00000 3.18509 0.00000 8.41587 0.00000 10.47394 0.00000 10.53605 0.00000 11.36805 0.00000 11.41716 0.00000 11.45046 0.00000 13.16994 0.00000 19.83554 + 3 0.5092593 0.4814815 0.5092593 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90096 2.00000 -133.89712 2.00000 -89.92514 2.00000 -89.92511 2.00000 -89.92209 2.00000 -89.90879 2.00000 -89.90572 2.00000 -89.90569 2.00000 -9.82957 2.00000 -7.16892 2.00000 -1.48484 2.00000 -1.41682 0.00000 1.43991 0.00000 3.16256 0.00000 3.21180 0.00000 8.43087 0.00000 10.27635 0.00000 10.46508 0.00000 11.36149 0.00000 11.49706 0.00000 11.64972 0.00000 13.21684 0.00000 19.82876 + 4 0.5138889 0.4722222 0.5138889 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90095 2.00000 -133.89714 2.00000 -89.92519 2.00000 -89.92512 2.00000 -89.92201 2.00000 -89.90887 2.00000 -89.90571 2.00000 -89.90564 2.00000 -9.81832 2.00000 -7.16303 2.00000 -1.58384 2.00000 -1.43746 0.00000 1.52890 0.00000 3.14854 0.00000 3.25595 0.00000 8.45251 0.00000 10.04400 0.00000 10.36706 0.00000 11.34845 0.00000 11.60987 0.00000 11.88990 0.00000 13.29455 0.00000 19.81721 + 5 0.5185185 0.4629630 0.5185185 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90093 2.00000 -133.89715 2.00000 -89.92525 2.00000 -89.92514 2.00000 -89.92190 2.00000 -89.90897 2.00000 -89.90569 2.00000 -89.90558 2.00000 -9.80257 2.00000 -7.15491 2.00000 -1.71167 2.00000 -1.46562 0.00000 1.63876 0.00000 3.13475 0.00000 3.31701 0.00000 8.47485 0.00000 9.80696 0.00000 10.25494 0.00000 11.33518 0.00000 11.74252 0.00000 12.13958 0.00000 13.40285 0.00000 19.80047 + 6 0.5231481 0.4537037 0.5231481 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90091 2.00000 -133.89717 2.00000 -89.92532 2.00000 -89.92516 2.00000 -89.92177 2.00000 -89.90910 2.00000 -89.90567 2.00000 -89.90551 2.00000 -9.78234 2.00000 -7.14469 2.00000 -1.86136 2.00000 -1.50063 0.00000 1.75752 0.00000 3.12785 0.00000 3.39430 0.00000 8.48748 0.00000 9.58185 0.00000 10.13615 0.00000 11.32674 0.00000 11.88740 0.00000 12.38585 0.00000 13.54188 0.00000 19.77794 + 7 0.5277778 0.4444444 0.5277778 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90089 2.00000 -133.89720 2.00000 -89.92540 2.00000 -89.92518 2.00000 -89.92162 2.00000 -89.90924 2.00000 -89.90565 2.00000 -89.90543 2.00000 -9.75765 2.00000 -7.13254 2.00000 -2.02688 2.00000 -1.54174 0.00000 1.87158 0.00000 3.13730 0.00000 3.48703 0.00000 8.47291 0.00000 9.38606 0.00000 10.01479 0.00000 11.32861 0.00000 12.04019 0.00000 12.62134 0.00000 13.71181 0.00000 19.74875 + 8 0.5324074 0.4351852 0.5324074 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90085 2.00000 -133.89723 2.00000 -89.92549 2.00000 -89.92521 2.00000 -89.92146 2.00000 -89.90941 2.00000 -89.90562 2.00000 -89.90535 2.00000 -9.72851 2.00000 -7.11870 2.00000 -2.20332 2.00000 -1.58811 0.00000 1.96632 0.00000 3.17481 0.00000 3.59433 0.00000 8.40761 0.00000 9.24040 0.00000 9.89317 0.00000 11.34655 0.00000 12.19832 0.00000 12.84179 0.00000 13.91197 0.00000 19.71174 + 9 0.5370370 0.4259259 0.5370370 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90082 2.00000 -133.89727 2.00000 -89.92558 2.00000 -89.92524 2.00000 -89.92128 2.00000 -89.90959 2.00000 -89.90559 2.00000 -89.90526 2.00000 -9.69495 2.00000 -7.10344 2.00000 -2.38682 2.00000 -1.63889 0.00000 2.02931 0.00000 3.25095 0.00000 3.71532 0.00000 8.27751 0.00000 9.15506 0.00000 9.77264 0.00000 11.38622 0.00000 12.36011 0.00000 13.04587 0.00000 14.13991 0.00000 19.66543 + 10 0.5416667 0.4166667 0.5416667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90078 2.00000 -133.89731 2.00000 -89.92566 2.00000 -89.92527 2.00000 -89.92108 2.00000 -89.90978 2.00000 -89.90556 2.00000 -89.90518 2.00000 -9.65700 2.00000 -7.08712 2.00000 -2.57430 2.00000 -1.69323 0.00000 2.05530 0.00000 3.36984 0.00000 3.84910 0.00000 8.09390 0.00000 9.11482 0.00000 9.65409 0.00000 11.45265 0.00000 12.52435 0.00000 13.23475 0.00000 14.39141 0.00000 19.60808 + 11 0.5462963 0.4074074 0.5462963 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90073 2.00000 -133.89735 2.00000 -89.92575 2.00000 -89.92530 2.00000 -89.92088 2.00000 -89.90998 2.00000 -89.90552 2.00000 -89.90509 2.00000 -9.61470 2.00000 -7.07017 2.00000 -2.76325 2.00000 -1.75034 0.00000 2.04777 0.00000 3.52742 0.00000 3.99480 0.00000 7.87864 0.00000 9.09468 0.00000 9.53808 0.00000 11.54961 0.00000 12.69008 0.00000 13.41090 0.00000 14.66145 0.00000 19.53783 + 12 0.5509259 0.3981481 0.5509259 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90069 2.00000 -133.89740 2.00000 -89.92584 2.00000 -89.92534 2.00000 -89.92067 2.00000 -89.91019 2.00000 -89.90549 2.00000 -89.90500 2.00000 -9.56808 2.00000 -7.05313 2.00000 -2.95154 2.00000 -1.80946 0.00000 2.01478 0.00000 3.71529 0.00000 4.15158 0.00000 7.64754 0.00000 9.07716 0.00000 9.42504 0.00000 11.67909 0.00000 12.85649 0.00000 13.57688 0.00000 14.94525 0.00000 19.45305 + 13 0.5555556 0.3888889 0.5555556 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90063 2.00000 -133.89745 2.00000 -89.92592 2.00000 -89.92538 2.00000 -89.92045 2.00000 -89.91041 2.00000 -89.90545 2.00000 -89.90492 2.00000 -9.51721 2.00000 -7.03663 2.00000 -3.13731 2.00000 -1.86989 0.00000 1.96442 0.00000 3.92521 0.00000 4.31864 0.00000 7.40932 0.00000 9.05356 0.00000 9.31527 0.00000 11.84123 0.00000 13.02287 0.00000 13.73468 0.00000 15.23883 0.00000 19.35278 + 14 0.5601852 0.3796296 0.5601852 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90058 2.00000 -133.89751 2.00000 -89.92600 2.00000 -89.92542 2.00000 -89.92022 2.00000 -89.91064 2.00000 -89.90540 2.00000 -89.90484 2.00000 -9.46216 2.00000 -7.02143 2.00000 -3.31877 2.00000 -1.93101 0.00000 1.90296 0.00000 4.15077 0.00000 4.49525 0.00000 7.16877 0.00000 9.02058 0.00000 9.20901 0.00000 12.03463 0.00000 13.18857 0.00000 13.88552 0.00000 15.53909 0.00000 19.23703 + 15 0.5648148 0.3703704 0.5648148 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90052 2.00000 -133.89757 2.00000 -89.92608 2.00000 -89.92547 2.00000 -89.91999 2.00000 -89.91087 2.00000 -89.90536 2.00000 -89.90477 2.00000 -9.40299 2.00000 -7.00846 2.00000 -3.49422 2.00000 -1.99224 0.00000 1.83482 0.00000 4.38730 0.00000 4.68067 0.00000 6.92882 0.00000 8.97778 0.00000 9.10650 0.00000 12.25691 0.00000 13.35296 0.00000 14.02998 0.00000 15.84356 0.00000 19.10694 + 16 0.5694444 0.3611111 0.5694444 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90045 2.00000 -133.89764 2.00000 -89.92615 2.00000 -89.92551 2.00000 -89.91975 2.00000 -89.91110 2.00000 -89.90532 2.00000 -89.90470 2.00000 -9.33983 2.00000 -6.99878 2.00000 -3.66191 2.00000 -2.05308 0.00000 1.76307 0.00000 4.63110 0.00000 4.87421 0.00000 6.69180 0.00000 8.92613 0.00000 9.00795 0.00000 12.50527 0.00000 13.51547 0.00000 14.16815 0.00000 16.15018 0.00000 18.96454 + 17 0.5740741 0.3518519 0.5740741 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90038 2.00000 -133.89770 2.00000 -89.92621 2.00000 -89.92556 2.00000 -89.91952 2.00000 -89.91134 2.00000 -89.90527 2.00000 -89.90463 2.00000 -9.27279 2.00000 -6.99362 2.00000 -3.82002 2.00000 -2.11308 0.00000 1.68985 0.00000 4.87841 0.00000 5.07521 0.00000 6.46044 0.00000 8.86708 0.00000 8.91359 0.00000 12.77683 0.00000 13.67555 0.00000 14.29971 0.00000 16.45693 0.00000 18.81248 + 18 0.5787037 0.3425926 0.5787037 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90031 2.00000 -133.89777 2.00000 -89.92627 2.00000 -89.92560 2.00000 -89.91928 2.00000 -89.91158 2.00000 -89.90523 2.00000 -89.90457 2.00000 -9.20205 2.00000 -6.99430 2.00000 -3.96668 2.00000 -2.17183 0.00000 1.61673 0.00000 5.12304 0.00000 5.28296 0.00000 6.24020 0.00000 8.80215 0.00000 8.82370 0.00000 13.06887 0.00000 13.83267 0.00000 14.42402 0.00000 16.76134 0.00000 18.65405 + 19 0.5833333 0.3333333 0.5833333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90024 2.00000 -133.89785 2.00000 -89.92633 2.00000 -89.92565 2.00000 -89.91904 2.00000 -89.91182 2.00000 -89.90518 2.00000 -89.90452 2.00000 -9.12782 2.00000 -7.00226 2.00000 -4.09997 2.00000 -2.22898 0.00000 1.54484 0.00000 5.34663 0.00000 5.49674 0.00000 6.04894 0.00000 8.73276 0.00000 8.73861 0.00000 13.37888 0.00000 13.98630 0.00000 14.54021 0.00000 17.05920 0.00000 18.45921 + 20 0.5879630 0.3240741 0.5879630 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90017 2.00000 -133.89792 2.00000 -89.92637 2.00000 -89.92569 2.00000 -89.91880 2.00000 -89.91205 2.00000 -89.90514 2.00000 -89.90447 2.00000 -9.05040 2.00000 -7.01883 2.00000 -4.21800 2.00000 -2.28423 0.00000 1.47504 0.00000 5.47106 0.00000 5.71569 0.00000 5.96436 0.00000 8.65882 0.00000 8.66013 0.00000 13.70446 0.00000 14.13595 0.00000 14.64710 0.00000 17.34052 0.00000 18.11087 + 21 0.5925926 0.3148148 0.5925926 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90009 2.00000 -133.89800 2.00000 -89.92642 2.00000 -89.92574 2.00000 -89.91856 2.00000 -89.91229 2.00000 -89.90509 2.00000 -89.90443 2.00000 -8.97018 2.00000 -7.04517 2.00000 -4.31905 2.00000 -2.33729 0.00000 1.40800 0.00000 5.38805 0.00000 5.93881 0.00000 6.09445 0.00000 8.58499 0.00000 8.58528 0.00000 14.04325 0.00000 14.28106 0.00000 14.74334 0.00000 17.57194 0.00000 17.75932 + 22 0.5972222 0.3055556 0.5972222 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90001 2.00000 -133.89808 2.00000 -89.92645 2.00000 -89.92578 2.00000 -89.91833 2.00000 -89.91252 2.00000 -89.90505 2.00000 -89.90439 2.00000 -8.88773 2.00000 -7.08194 2.00000 -4.40173 2.00000 -2.38794 0.00000 1.34423 0.00000 5.20764 0.00000 6.16474 0.00000 6.32892 0.00000 8.50908 0.00000 8.51817 0.00000 14.39242 0.00000 14.42105 0.00000 14.82755 0.00000 17.40638 0.00000 17.65502 + 23 0.6018519 0.2962963 0.6018519 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89993 2.00000 -133.89815 2.00000 -89.92648 2.00000 -89.92582 2.00000 -89.91811 2.00000 -89.91274 2.00000 -89.90501 2.00000 -89.90437 2.00000 -8.80386 2.00000 -7.12910 2.00000 -4.46518 2.00000 -2.43596 0.00000 1.28415 0.00000 5.00617 0.00000 6.39159 0.00000 6.59113 0.00000 8.43229 0.00000 8.45994 0.00000 14.55513 0.00000 14.74470 0.00000 14.90199 0.00000 17.05387 0.00000 17.56052 + 24 0.6064815 0.2870370 0.6064815 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89986 2.00000 -133.89823 2.00000 -89.92650 2.00000 -89.92586 2.00000 -89.91790 2.00000 -89.91296 2.00000 -89.90497 2.00000 -89.90434 2.00000 -8.71979 2.00000 -7.18564 2.00000 -4.50912 2.00000 -2.48116 0.00000 1.22807 0.00000 4.80089 0.00000 6.61644 0.00000 6.86346 0.00000 8.35568 0.00000 8.41292 0.00000 14.68212 0.00000 14.93336 0.00000 15.12705 0.00000 16.70384 0.00000 17.39401 + 25 0.6111111 0.2777778 0.6111111 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89978 2.00000 -133.89830 2.00000 -89.92652 2.00000 -89.92589 2.00000 -89.91769 2.00000 -89.91316 2.00000 -89.90494 2.00000 -89.90432 2.00000 -8.63738 2.00000 -7.24926 2.00000 -4.53394 2.00000 -2.52339 0.00000 1.17625 0.00000 4.59678 0.00000 6.83467 0.00000 7.14023 0.00000 8.28026 0.00000 8.38145 0.00000 14.79976 0.00000 14.96642 0.00000 15.48596 0.00000 16.35930 0.00000 17.20480 + 26 0.6157407 0.2685185 0.6157407 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89972 2.00000 -133.89837 2.00000 -89.92653 2.00000 -89.92593 2.00000 -89.91751 2.00000 -89.91335 2.00000 -89.90490 2.00000 -89.90431 2.00000 -8.55957 2.00000 -7.31606 2.00000 -4.54060 2.00000 -2.56250 0.00000 1.12887 0.00000 4.39580 0.00000 7.03880 0.00000 7.41761 0.00000 8.20807 0.00000 8.37271 0.00000 14.90262 0.00000 14.96929 0.00000 15.83986 0.00000 16.02637 0.00000 17.01077 + 27 0.6203704 0.2592593 0.6203704 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89966 2.00000 -133.89843 2.00000 -89.92654 2.00000 -89.92596 2.00000 -89.91735 2.00000 -89.91351 2.00000 -89.90487 2.00000 -89.90431 2.00000 -8.49098 2.00000 -7.38006 2.00000 -4.53045 2.00000 -2.59836 0.00000 1.08610 0.00000 4.19900 0.00000 7.21743 0.00000 7.68731 0.00000 8.14653 0.00000 8.39780 0.00000 14.94028 0.00000 14.97385 0.00000 15.72253 0.00000 16.16611 0.00000 16.82701 + 28 0.6250000 0.2500000 0.6250000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89961 2.00000 -133.89848 2.00000 -89.92654 2.00000 -89.92599 2.00000 -89.91722 2.00000 -89.91364 2.00000 -89.90485 2.00000 -89.90431 2.00000 -8.43855 2.00000 -7.43279 2.00000 -4.50510 2.00000 -2.63086 0.00000 1.04802 0.00000 4.00701 0.00000 7.35679 0.00000 7.89701 0.00000 8.14738 0.00000 8.47017 0.00000 14.87484 0.00000 14.95523 0.00000 15.50658 0.00000 16.40147 0.00000 16.69799 diff --git a/tests/test_data/aims/static-si-bs-density/band1007.out b/tests/test_data/aims/static-si-bs-density/band1007.out new file mode 100644 index 0000000000..56040f5d53 --- /dev/null +++ b/tests/test_data/aims/static-si-bs-density/band1007.out @@ -0,0 +1,16 @@ + 1 0.6250000 0.2500000 0.6250000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89961 2.00000 -133.89848 2.00000 -89.92654 2.00000 -89.92599 2.00000 -89.91722 2.00000 -89.91364 2.00000 -89.90485 2.00000 -89.90431 2.00000 -8.43855 2.00000 -7.43279 2.00000 -4.50510 2.00000 -2.63086 0.00000 1.04802 0.00000 4.00701 0.00000 7.35679 0.00000 7.89701 0.00000 8.14738 0.00000 8.47017 0.00000 14.87484 0.00000 14.95523 0.00000 15.50658 0.00000 16.40147 0.00000 16.69799 + 2 0.6166667 0.2500000 0.6333333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89961 2.00000 -133.89848 2.00000 -89.92654 2.00000 -89.92599 2.00000 -89.91721 2.00000 -89.91365 2.00000 -89.90484 2.00000 -89.90431 2.00000 -8.43597 2.00000 -7.43382 2.00000 -4.50304 2.00000 -2.64713 0.00000 1.07234 0.00000 4.00880 0.00000 7.28402 0.00000 7.96923 0.00000 7.99382 0.00000 8.62391 0.00000 14.65525 0.00000 15.17531 0.00000 15.47059 0.00000 16.41185 0.00000 16.73361 + 3 0.6083333 0.2500000 0.6416667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89960 2.00000 -133.89849 2.00000 -89.92654 2.00000 -89.92600 2.00000 -89.91718 2.00000 -89.91368 2.00000 -89.90484 2.00000 -89.90431 2.00000 -8.42822 2.00000 -7.43697 2.00000 -4.49685 2.00000 -2.69451 0.00000 1.14392 0.00000 4.01416 0.00000 7.12559 0.00000 7.74525 0.00000 8.12606 0.00000 8.87277 0.00000 14.40313 0.00000 15.37332 0.00000 15.42780 0.00000 16.44428 0.00000 16.82970 + 4 0.6000000 0.2500000 0.6500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89959 2.00000 -133.89850 2.00000 -89.92653 2.00000 -89.92601 2.00000 -89.91713 2.00000 -89.91372 2.00000 -89.90482 2.00000 -89.90431 2.00000 -8.41531 2.00000 -7.44240 2.00000 -4.48655 2.00000 -2.76908 0.00000 1.25897 0.00000 4.02302 0.00000 6.93871 0.00000 7.48515 0.00000 8.31031 0.00000 9.13263 0.00000 14.15501 0.00000 15.23552 0.00000 15.67235 0.00000 16.50305 0.00000 16.96531 + 5 0.5916667 0.2500000 0.6583333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89957 2.00000 -133.89852 2.00000 -89.92653 2.00000 -89.92603 2.00000 -89.91707 2.00000 -89.91379 2.00000 -89.90481 2.00000 -89.90432 2.00000 -8.39724 2.00000 -7.45038 2.00000 -4.47214 2.00000 -2.86543 0.00000 1.41230 0.00000 4.03530 0.00000 6.74200 0.00000 7.22362 0.00000 8.50339 0.00000 9.39216 0.00000 13.91367 0.00000 15.07394 0.00000 15.89889 0.00000 16.59634 0.00000 17.12321 + 6 0.5833333 0.2500000 0.6666667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89954 2.00000 -133.89854 2.00000 -89.92652 2.00000 -89.92605 2.00000 -89.91699 2.00000 -89.91387 2.00000 -89.90478 2.00000 -89.90433 2.00000 -8.37401 2.00000 -7.46127 2.00000 -4.45366 2.00000 -2.97770 0.00000 1.59835 0.00000 4.05085 0.00000 6.54185 0.00000 6.96338 0.00000 8.69901 0.00000 9.64674 0.00000 13.68161 0.00000 14.89887 0.00000 16.09594 0.00000 16.73460 0.00000 17.29194 + 7 0.5750000 0.2500000 0.6750000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89951 2.00000 -133.89857 2.00000 -89.92651 2.00000 -89.92608 2.00000 -89.91689 2.00000 -89.91397 2.00000 -89.90476 2.00000 -89.90434 2.00000 -8.34563 2.00000 -7.47555 2.00000 -4.43114 2.00000 -3.10029 0.00000 1.81188 0.00000 4.06946 0.00000 6.34118 0.00000 6.70567 0.00000 8.89441 0.00000 9.89224 0.00000 13.46192 0.00000 14.71633 0.00000 16.25876 0.00000 16.92173 0.00000 17.46280 + 8 0.5666667 0.2500000 0.6833333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89948 2.00000 -133.89861 2.00000 -89.92650 2.00000 -89.92611 2.00000 -89.91677 2.00000 -89.91408 2.00000 -89.90473 2.00000 -89.90435 2.00000 -8.31211 2.00000 -7.49377 2.00000 -4.40461 2.00000 -3.22823 0.00000 2.04829 0.00000 4.09081 0.00000 6.14171 0.00000 6.45130 0.00000 9.08807 0.00000 10.12353 0.00000 13.25888 0.00000 14.52998 0.00000 16.39596 0.00000 17.14823 0.00000 17.62566 + 9 0.5583333 0.2500000 0.6916667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89944 2.00000 -133.89864 2.00000 -89.92648 2.00000 -89.92614 2.00000 -89.91664 2.00000 -89.91421 2.00000 -89.90470 2.00000 -89.90436 2.00000 -8.27345 2.00000 -7.51657 2.00000 -4.37411 2.00000 -3.35726 0.00000 2.30372 0.00000 4.11444 0.00000 5.94479 0.00000 6.20095 0.00000 9.27899 0.00000 10.33359 0.00000 13.07868 0.00000 14.34218 0.00000 16.52127 0.00000 17.39932 0.00000 17.76365 + 10 0.5500000 0.2500000 0.7000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89940 2.00000 -133.89869 2.00000 -89.92647 2.00000 -89.92617 2.00000 -89.91650 2.00000 -89.91435 2.00000 -89.90466 2.00000 -89.90437 2.00000 -8.22967 2.00000 -7.54464 2.00000 -4.33971 2.00000 -3.48381 0.00000 2.57484 0.00000 4.13964 0.00000 5.75178 0.00000 5.95534 0.00000 9.46638 0.00000 10.51268 0.00000 12.93016 0.00000 14.15466 0.00000 16.64476 0.00000 17.66352 0.00000 17.85389 + 11 0.5416667 0.2500000 0.7083333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89935 2.00000 -133.89874 2.00000 -89.92645 2.00000 -89.92621 2.00000 -89.91635 2.00000 -89.91451 2.00000 -89.90463 2.00000 -89.90439 2.00000 -8.18078 2.00000 -7.57870 2.00000 -4.30147 2.00000 -3.60487 0.00000 2.85864 0.00000 4.16530 0.00000 5.56426 0.00000 5.71543 0.00000 9.64953 0.00000 10.64828 0.00000 12.82483 0.00000 13.96879 0.00000 16.77191 0.00000 17.88678 0.00000 17.93321 + 12 0.5333333 0.2500000 0.7166667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89930 2.00000 -133.89879 2.00000 -89.92644 2.00000 -89.92624 2.00000 -89.91618 2.00000 -89.91467 2.00000 -89.90460 2.00000 -89.90441 2.00000 -8.12679 2.00000 -7.61945 2.00000 -4.25946 2.00000 -3.71794 0.00000 3.15195 0.00000 4.18959 0.00000 5.38448 0.00000 5.48275 0.00000 9.82775 0.00000 10.72745 0.00000 12.77458 0.00000 13.78580 0.00000 16.90512 0.00000 17.87037 0.00000 18.20260 + 13 0.5250000 0.2500000 0.7250000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89924 2.00000 -133.89885 2.00000 -89.92642 2.00000 -89.92627 2.00000 -89.91600 2.00000 -89.91485 2.00000 -89.90457 2.00000 -89.90442 2.00000 -8.06772 2.00000 -7.66754 2.00000 -4.21377 2.00000 -3.82100 0.00000 3.45043 0.00000 4.20935 0.00000 5.21594 0.00000 5.26034 0.00000 10.00024 0.00000 10.74257 0.00000 12.78589 0.00000 13.60691 0.00000 17.04477 0.00000 17.81417 0.00000 18.46562 + 14 0.5166667 0.2500000 0.7333333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89918 2.00000 -133.89891 2.00000 -89.92640 2.00000 -89.92630 2.00000 -89.91582 2.00000 -89.91503 2.00000 -89.90454 2.00000 -89.90444 2.00000 -8.00358 2.00000 -7.72348 2.00000 -4.16449 2.00000 -3.91240 0.00000 3.74553 0.00000 4.21910 0.00000 5.05573 0.00000 5.06444 0.00000 10.16604 0.00000 10.69667 0.00000 12.85464 0.00000 13.43347 0.00000 17.18957 0.00000 17.72569 0.00000 18.71328 + 15 0.5083333 0.2500000 0.7416667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89911 2.00000 -133.89897 2.00000 -89.92638 2.00000 -89.92633 2.00000 -89.91563 2.00000 -89.91523 2.00000 -89.90451 2.00000 -89.90446 2.00000 -7.93439 2.00000 -7.78764 2.00000 -4.11175 2.00000 -3.99091 0.00000 4.01250 0.00000 4.20980 0.00000 4.89279 0.00000 4.93928 0.00000 10.32390 0.00000 10.60173 0.00000 12.96773 0.00000 13.26708 0.00000 17.33642 0.00000 17.61205 0.00000 18.92968 + 16 0.5000000 0.2500000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.86017 2.00000 -7.86017 2.00000 -4.05567 2.00000 -4.05567 0.00000 4.17009 0.00000 4.17009 0.00000 4.85206 0.00000 4.85206 0.00000 10.47211 0.00000 10.47211 0.00000 13.10978 0.00000 13.10978 0.00000 17.47993 0.00000 17.47993 0.00000 19.08929 diff --git a/tests/test_data/aims/static-si-bs-density/band1008.out b/tests/test_data/aims/static-si-bs-density/band1008.out new file mode 100644 index 0000000000..faabf47ddd --- /dev/null +++ b/tests/test_data/aims/static-si-bs-density/band1008.out @@ -0,0 +1,33 @@ + 1 0.5000000 0.2500000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.86017 2.00000 -7.86017 2.00000 -4.05567 2.00000 -4.05567 0.00000 4.17009 0.00000 4.17009 0.00000 4.85206 0.00000 4.85206 0.00000 10.47211 0.00000 10.47211 0.00000 13.10978 0.00000 13.10978 0.00000 17.47993 0.00000 17.47993 0.00000 19.08929 + 2 0.5000000 0.2578125 0.7421875 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89914 2.00000 -133.89895 2.00000 -89.92638 2.00000 -89.92632 2.00000 -89.91570 2.00000 -89.91516 2.00000 -89.90452 2.00000 -89.90446 2.00000 -7.96235 2.00000 -7.75919 2.00000 -4.12819 2.00000 -3.97550 0.00000 4.08253 0.00000 4.22795 0.00000 4.78915 0.00000 4.95371 0.00000 10.26818 0.00000 10.64606 0.00000 12.92220 0.00000 13.32518 0.00000 17.27910 0.00000 17.64879 0.00000 18.91488 + 3 0.5000000 0.2656250 0.7343750 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89923 2.00000 -133.89885 2.00000 -89.92641 2.00000 -89.92628 2.00000 -89.91596 2.00000 -89.91489 2.00000 -89.90455 2.00000 -89.90443 2.00000 -8.06494 2.00000 -7.66028 2.00000 -4.19205 2.00000 -3.88859 0.00000 3.98357 0.00000 4.23137 0.00000 4.78965 0.00000 5.07586 0.00000 10.03643 0.00000 10.78973 0.00000 12.76108 0.00000 13.56764 0.00000 17.04729 0.00000 17.78740 0.00000 18.72533 + 4 0.5000000 0.2734375 0.7265625 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89933 2.00000 -133.89876 2.00000 -89.92643 2.00000 -89.92624 2.00000 -89.91623 2.00000 -89.91462 2.00000 -89.90459 2.00000 -89.90442 2.00000 -8.16730 2.00000 -7.56444 2.00000 -4.24613 2.00000 -3.79580 0.00000 3.88185 0.00000 4.17849 0.00000 4.85535 0.00000 5.20988 0.00000 9.78050 0.00000 10.90459 0.00000 12.62348 0.00000 13.83414 0.00000 16.78887 0.00000 17.89838 0.00000 18.52791 + 5 0.5000000 0.2812500 0.7187500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89942 2.00000 -133.89867 2.00000 -89.92644 2.00000 -89.92620 2.00000 -89.91650 2.00000 -89.91435 2.00000 -89.90464 2.00000 -89.90440 2.00000 -8.26884 2.00000 -7.47277 2.00000 -4.28925 2.00000 -3.69789 0.00000 3.78137 0.00000 4.09274 0.00000 4.96278 0.00000 5.35184 0.00000 9.50476 0.00000 10.99330 0.00000 12.50568 0.00000 14.11949 0.00000 16.51127 0.00000 17.98239 0.00000 18.32686 + 6 0.5000000 0.2890625 0.7109375 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89951 2.00000 -133.89857 2.00000 -89.92645 2.00000 -89.92616 2.00000 -89.91677 2.00000 -89.91409 2.00000 -89.90468 2.00000 -89.90439 2.00000 -8.36907 2.00000 -7.38643 2.00000 -4.32017 2.00000 -3.59559 0.00000 3.68413 0.00000 3.99283 0.00000 5.09310 0.00000 5.49975 0.00000 9.21357 0.00000 11.05898 0.00000 12.40392 0.00000 14.41532 0.00000 16.22520 0.00000 18.03339 0.00000 18.12485 + 7 0.5000000 0.2968750 0.7031250 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89960 2.00000 -133.89848 2.00000 -89.92645 2.00000 -89.92611 2.00000 -89.91703 2.00000 -89.91382 2.00000 -89.90473 2.00000 -89.90439 2.00000 -8.46758 2.00000 -7.30663 2.00000 -4.33764 2.00000 -3.48955 0.00000 3.59126 0.00000 3.88771 0.00000 5.23729 0.00000 5.65249 0.00000 8.91092 0.00000 11.10465 0.00000 12.31479 0.00000 14.70467 0.00000 15.94940 0.00000 17.92359 0.00000 18.03119 + 8 0.5000000 0.3046875 0.6953125 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89969 2.00000 -133.89839 2.00000 -89.92645 2.00000 -89.92606 2.00000 -89.91730 2.00000 -89.91356 2.00000 -89.90478 2.00000 -89.90439 2.00000 -8.56401 2.00000 -7.23450 2.00000 -4.34049 2.00000 -3.38042 0.00000 3.50349 0.00000 3.78138 0.00000 5.39121 0.00000 5.80936 0.00000 8.60017 0.00000 11.13292 0.00000 12.23552 0.00000 14.93452 0.00000 15.73755 0.00000 17.72484 0.00000 17.94632 + 9 0.5000000 0.3125000 0.6875000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89978 2.00000 -133.89830 2.00000 -89.92644 2.00000 -89.92601 2.00000 -89.91756 2.00000 -89.91329 2.00000 -89.90483 2.00000 -89.90440 2.00000 -8.65806 2.00000 -7.17104 2.00000 -4.32769 2.00000 -3.26883 0.00000 3.42132 0.00000 3.67575 0.00000 5.55284 0.00000 5.96983 0.00000 8.28413 0.00000 11.14585 0.00000 12.16392 0.00000 14.95521 0.00000 15.73783 0.00000 17.53164 0.00000 17.78069 + 10 0.5000000 0.3203125 0.6796875 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89987 2.00000 -133.89822 2.00000 -89.92643 2.00000 -89.92595 2.00000 -89.91782 2.00000 -89.91303 2.00000 -89.90488 2.00000 -89.90441 2.00000 -8.74947 2.00000 -7.11700 2.00000 -4.29853 2.00000 -3.15538 0.00000 3.34512 0.00000 3.57177 0.00000 5.72105 0.00000 6.13348 0.00000 7.96505 0.00000 11.14497 0.00000 12.09832 0.00000 14.75555 0.00000 15.95506 0.00000 17.35144 0.00000 17.56572 + 11 0.5000000 0.3281250 0.6718750 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89995 2.00000 -133.89813 2.00000 -89.92641 2.00000 -89.92590 2.00000 -89.91808 2.00000 -89.91277 2.00000 -89.90494 2.00000 -89.90443 2.00000 -8.83800 2.00000 -7.07277 2.00000 -4.25260 2.00000 -3.04067 0.00000 3.27521 0.00000 3.46991 0.00000 5.89519 0.00000 6.29994 0.00000 7.64482 0.00000 11.13131 0.00000 12.03750 0.00000 14.48701 0.00000 16.21616 0.00000 17.20660 0.00000 17.32418 + 12 0.5000000 0.3359375 0.6640625 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90004 2.00000 -133.89805 2.00000 -89.92639 2.00000 -89.92584 2.00000 -89.91834 2.00000 -89.91251 2.00000 -89.90499 2.00000 -89.90446 2.00000 -8.92347 2.00000 -7.03839 2.00000 -4.18995 2.00000 -2.92533 0.00000 3.21186 0.00000 3.37038 0.00000 6.07478 0.00000 6.46882 0.00000 7.32504 0.00000 11.10542 0.00000 11.98057 0.00000 14.20578 0.00000 16.39610 0.00000 17.06686 0.00000 17.16654 + 13 0.5000000 0.3437500 0.6562500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90012 2.00000 -133.89797 2.00000 -89.92635 2.00000 -89.92579 2.00000 -89.91859 2.00000 -89.91226 2.00000 -89.90504 2.00000 -89.90449 2.00000 -9.00571 2.00000 -7.01347 2.00000 -4.11101 2.00000 -2.80997 0.00000 3.15530 0.00000 3.27321 0.00000 6.25935 0.00000 6.63969 0.00000 7.00721 0.00000 11.06752 0.00000 11.92690 0.00000 13.92823 0.00000 16.39030 0.00000 16.79899 0.00000 17.31988 + 14 0.5000000 0.3515625 0.6484375 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90019 2.00000 -133.89789 2.00000 -89.92632 2.00000 -89.92573 2.00000 -89.91885 2.00000 -89.91201 2.00000 -89.90510 2.00000 -89.90453 2.00000 -9.08457 2.00000 -6.99731 2.00000 -4.01661 2.00000 -2.69521 0.00000 3.10574 0.00000 3.17832 0.00000 6.44698 0.00000 6.69426 0.00000 6.81209 0.00000 11.01752 0.00000 11.87606 0.00000 13.66145 0.00000 16.25580 0.00000 16.52343 0.00000 17.60274 + 15 0.5000000 0.3593750 0.6406250 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90027 2.00000 -133.89782 2.00000 -89.92627 2.00000 -89.92568 2.00000 -89.91910 2.00000 -89.91176 2.00000 -89.90515 2.00000 -89.90457 2.00000 -9.15993 2.00000 -6.98896 2.00000 -3.90783 2.00000 -2.58170 0.00000 3.06336 0.00000 3.08548 0.00000 6.37584 0.00000 6.64900 0.00000 6.98545 0.00000 10.95522 0.00000 11.82774 0.00000 13.40975 0.00000 16.07429 0.00000 16.24199 0.00000 17.92910 + 16 0.5000000 0.3671875 0.6328125 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90034 2.00000 -133.89775 2.00000 -89.92622 2.00000 -89.92563 2.00000 -89.91934 2.00000 -89.91151 2.00000 -89.90521 2.00000 -89.90462 2.00000 -9.23167 2.00000 -6.98731 2.00000 -3.78595 2.00000 -2.47010 0.00000 2.99437 0.00000 3.02828 0.00000 6.07172 0.00000 6.84661 0.00000 7.15907 0.00000 10.88051 0.00000 11.78176 0.00000 13.17624 0.00000 15.87479 0.00000 15.95595 0.00000 18.26638 + 17 0.5000000 0.3750000 0.6250000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90041 2.00000 -133.89768 2.00000 -89.92617 2.00000 -89.92557 2.00000 -89.91959 2.00000 -89.91127 2.00000 -89.90526 2.00000 -89.90468 2.00000 -9.29971 2.00000 -6.99121 2.00000 -3.65234 2.00000 -2.36105 0.00000 2.90455 0.00000 3.00060 0.00000 5.77221 0.00000 7.05059 0.00000 7.33208 0.00000 10.79370 0.00000 11.73803 0.00000 12.96313 0.00000 15.66631 0.00000 15.66701 0.00000 18.60148 + 18 0.5000000 0.3828125 0.6171875 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90047 2.00000 -133.89761 2.00000 -89.92610 2.00000 -89.92552 2.00000 -89.91982 2.00000 -89.91103 2.00000 -89.90531 2.00000 -89.90474 2.00000 -9.36394 2.00000 -6.99954 2.00000 -3.50840 2.00000 -2.25522 0.00000 2.81541 0.00000 2.98034 0.00000 5.48007 0.00000 7.25940 0.00000 7.50332 0.00000 10.69591 0.00000 11.69649 0.00000 12.77174 0.00000 15.37387 0.00000 15.45507 0.00000 18.92695 + 19 0.5000000 0.3906250 0.6093750 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90054 2.00000 -133.89755 2.00000 -89.92604 2.00000 -89.92547 2.00000 -89.92006 2.00000 -89.91080 2.00000 -89.90536 2.00000 -89.90481 2.00000 -9.42432 2.00000 -7.01123 2.00000 -3.35554 2.00000 -2.15327 0.00000 2.72617 0.00000 2.96742 0.00000 5.19696 0.00000 7.47276 0.00000 7.67130 0.00000 10.58943 0.00000 11.65716 0.00000 12.60228 0.00000 15.07934 0.00000 15.24122 0.00000 19.23726 + 20 0.5000000 0.3984375 0.6015625 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90059 2.00000 -133.89749 2.00000 -89.92597 2.00000 -89.92543 2.00000 -89.92029 2.00000 -89.91057 2.00000 -89.90540 2.00000 -89.90488 2.00000 -9.48075 2.00000 -7.02535 2.00000 -3.19516 2.00000 -2.05582 0.00000 2.63586 0.00000 2.96169 0.00000 4.92465 0.00000 7.69054 0.00000 7.83396 0.00000 10.47803 0.00000 11.62005 0.00000 12.45383 0.00000 14.78336 0.00000 15.02704 0.00000 19.39789 + 21 0.5000000 0.4062500 0.5937500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90065 2.00000 -133.89744 2.00000 -89.92589 2.00000 -89.92538 2.00000 -89.92051 2.00000 -89.91035 2.00000 -89.90545 2.00000 -89.90495 2.00000 -9.53320 2.00000 -7.04105 2.00000 -3.02866 2.00000 -1.96349 0.00000 2.54327 0.00000 2.96283 0.00000 4.66518 0.00000 7.91262 0.00000 7.98854 0.00000 10.36698 0.00000 11.58523 0.00000 12.32443 0.00000 14.48653 0.00000 14.81396 0.00000 19.46647 + 22 0.5000000 0.4140625 0.5859375 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90070 2.00000 -133.89739 2.00000 -89.92581 2.00000 -89.92534 2.00000 -89.92072 2.00000 -89.91014 2.00000 -89.90549 2.00000 -89.90503 2.00000 -9.58161 2.00000 -7.05761 2.00000 -2.85748 2.00000 -1.87684 0.00000 2.44702 0.00000 2.97040 0.00000 4.42090 0.00000 8.13128 0.00000 8.13888 0.00000 10.26311 0.00000 11.55278 0.00000 12.21137 0.00000 14.18945 0.00000 14.60344 0.00000 19.52991 + 23 0.5000000 0.4218750 0.5781250 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90075 2.00000 -133.89734 2.00000 -89.92573 2.00000 -89.92530 2.00000 -89.92093 2.00000 -89.90993 2.00000 -89.90553 2.00000 -89.90512 2.00000 -9.62594 2.00000 -7.07439 2.00000 -2.68317 2.00000 -1.79639 0.00000 2.34565 0.00000 2.98377 0.00000 4.19439 0.00000 8.25732 0.00000 8.36917 0.00000 10.17449 0.00000 11.52276 0.00000 12.11154 0.00000 13.89270 0.00000 14.39715 0.00000 19.58759 + 24 0.5000000 0.4296875 0.5703125 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90079 2.00000 -133.89730 2.00000 -89.92564 2.00000 -89.92526 2.00000 -89.92113 2.00000 -89.90974 2.00000 -89.90556 2.00000 -89.90520 2.00000 -9.66615 2.00000 -7.09088 2.00000 -2.50742 2.00000 -1.72259 0.00000 2.23787 0.00000 3.00210 0.00000 3.98832 0.00000 8.36091 0.00000 8.60330 0.00000 10.10989 0.00000 11.49528 0.00000 12.02166 0.00000 13.59691 0.00000 14.19708 0.00000 19.63908 + 25 0.5000000 0.4375000 0.5625000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90083 2.00000 -133.89726 2.00000 -89.92555 2.00000 -89.92523 2.00000 -89.92131 2.00000 -89.90955 2.00000 -89.90560 2.00000 -89.90528 2.00000 -9.70220 2.00000 -7.10664 2.00000 -2.33226 2.00000 -1.65583 0.00000 2.12299 0.00000 3.02437 0.00000 3.80508 0.00000 8.43662 0.00000 8.84104 0.00000 10.07735 0.00000 11.47042 0.00000 11.93849 0.00000 13.30274 0.00000 14.00560 0.00000 19.68417 + 26 0.5000000 0.4453125 0.5546875 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90086 2.00000 -133.89723 2.00000 -89.92547 2.00000 -89.92520 2.00000 -89.92149 2.00000 -89.90938 2.00000 -89.90563 2.00000 -89.90537 2.00000 -9.73408 2.00000 -7.12129 2.00000 -2.16008 2.00000 -1.59641 0.00000 2.00150 0.00000 3.04934 0.00000 3.64637 0.00000 8.48169 0.00000 9.08202 0.00000 10.08171 0.00000 11.44826 0.00000 11.85897 0.00000 13.01095 0.00000 13.82554 0.00000 19.72283 + 27 0.5000000 0.4531250 0.5468750 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90089 2.00000 -133.89720 2.00000 -89.92539 2.00000 -89.92518 2.00000 -89.92165 2.00000 -89.90922 2.00000 -89.90565 2.00000 -89.90545 2.00000 -9.76175 2.00000 -7.13453 2.00000 -1.99389 2.00000 -1.54459 0.00000 1.87553 0.00000 3.07562 0.00000 3.51286 0.00000 8.49810 0.00000 9.32567 0.00000 10.12220 0.00000 11.42886 0.00000 11.78038 0.00000 12.72247 0.00000 13.66014 0.00000 19.75524 + 28 0.5000000 0.4609375 0.5390625 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90091 2.00000 -133.89717 2.00000 -89.92531 2.00000 -89.92515 2.00000 -89.92179 2.00000 -89.90908 2.00000 -89.90567 2.00000 -89.90552 2.00000 -9.78519 2.00000 -7.14611 2.00000 -1.83751 2.00000 -1.50055 0.00000 1.74925 0.00000 3.10165 0.00000 3.40408 0.00000 8.49256 0.00000 9.57105 0.00000 10.19239 0.00000 11.41231 0.00000 11.70075 0.00000 12.43860 0.00000 13.51294 0.00000 19.78169 + 29 0.5000000 0.4687500 0.5312500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90094 2.00000 -133.89715 2.00000 -89.92524 2.00000 -89.92514 2.00000 -89.92191 2.00000 -89.90896 2.00000 -89.90569 2.00000 -89.90559 2.00000 -9.80440 2.00000 -7.15584 2.00000 -1.69575 2.00000 -1.46441 0.00000 1.62869 0.00000 3.12584 0.00000 3.31863 0.00000 8.47400 0.00000 9.81638 0.00000 10.28211 0.00000 11.39863 0.00000 11.61948 0.00000 12.16142 0.00000 13.38748 0.00000 19.80258 + 30 0.5000000 0.4765625 0.5234375 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90095 2.00000 -133.89713 2.00000 -89.92518 2.00000 -89.92512 2.00000 -89.92201 2.00000 -89.90886 2.00000 -89.90571 2.00000 -89.90565 2.00000 -9.81935 2.00000 -7.16356 2.00000 -1.57451 2.00000 -1.43624 0.00000 1.52148 0.00000 3.14663 0.00000 3.25473 0.00000 8.45090 0.00000 10.05801 0.00000 10.37934 0.00000 11.38780 0.00000 11.53857 0.00000 11.89491 0.00000 13.28690 0.00000 19.81830 + 31 0.5000000 0.4843750 0.5156250 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90096 2.00000 -133.89712 2.00000 -89.92514 2.00000 -89.92511 2.00000 -89.92209 2.00000 -89.90879 2.00000 -89.90572 2.00000 -89.90569 2.00000 -9.83003 2.00000 -7.16916 2.00000 -1.48054 2.00000 -1.41610 0.00000 1.43612 0.00000 3.16262 0.00000 3.21056 0.00000 8.42992 0.00000 10.28700 0.00000 10.47012 0.00000 11.37957 0.00000 11.46428 0.00000 11.64846 0.00000 13.21361 0.00000 19.82922 + 32 0.5000000 0.4921875 0.5078125 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90097 2.00000 -133.89712 2.00000 -89.92511 2.00000 -89.92511 2.00000 -89.92213 2.00000 -89.90874 2.00000 -89.90572 2.00000 -89.90572 2.00000 -9.83645 2.00000 -7.17255 2.00000 -1.42062 2.00000 -1.40401 0.00000 1.38076 0.00000 3.17270 0.00000 3.18467 0.00000 8.41560 0.00000 10.47801 0.00000 10.53739 0.00000 11.37130 0.00000 11.40868 0.00000 11.45024 0.00000 13.16914 0.00000 19.83565 + 33 0.5000000 0.5000000 0.5000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90097 2.00000 -133.89711 2.00000 -89.92510 2.00000 -89.92510 2.00000 -89.92215 2.00000 -89.90873 2.00000 -89.90573 2.00000 -89.90573 2.00000 -9.83858 2.00000 -7.17368 2.00000 -1.39998 2.00000 -1.39998 0.00000 1.36154 0.00000 3.17615 0.00000 3.17615 0.00000 8.41055 0.00000 10.56281 0.00000 10.56281 0.00000 11.34414 0.00000 11.38743 0.00000 11.38743 0.00000 13.15425 0.00000 19.83777 diff --git a/tests/test_data/aims/static-si-bs-density/band1009.out b/tests/test_data/aims/static-si-bs-density/band1009.out new file mode 100644 index 0000000000..f713a117c1 --- /dev/null +++ b/tests/test_data/aims/static-si-bs-density/band1009.out @@ -0,0 +1,28 @@ + 1 0.5000000 0.5000000 0.5000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90097 2.00000 -133.89711 2.00000 -89.92510 2.00000 -89.92510 2.00000 -89.92215 2.00000 -89.90873 2.00000 -89.90573 2.00000 -89.90573 2.00000 -9.83858 2.00000 -7.17368 2.00000 -1.39998 2.00000 -1.39998 0.00000 1.36154 0.00000 3.17615 0.00000 3.17615 0.00000 8.41055 0.00000 10.56281 0.00000 10.56281 0.00000 11.34414 0.00000 11.38743 0.00000 11.38743 0.00000 13.15425 0.00000 19.83777 + 2 0.4953704 0.4953704 0.5092593 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90097 2.00000 -133.89712 2.00000 -89.92511 2.00000 -89.92511 2.00000 -89.92213 2.00000 -89.90874 2.00000 -89.90572 2.00000 -89.90572 2.00000 -9.83633 2.00000 -7.17249 2.00000 -1.42172 2.00000 -1.40422 0.00000 1.38178 0.00000 3.17256 0.00000 3.18509 0.00000 8.41587 0.00000 10.47394 0.00000 10.53605 0.00000 11.36805 0.00000 11.41716 0.00000 11.45046 0.00000 13.16994 0.00000 19.83554 + 3 0.4907407 0.4907407 0.5185185 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90096 2.00000 -133.89712 2.00000 -89.92514 2.00000 -89.92511 2.00000 -89.92209 2.00000 -89.90879 2.00000 -89.90572 2.00000 -89.90569 2.00000 -9.82957 2.00000 -7.16892 2.00000 -1.48484 2.00000 -1.41682 0.00000 1.43991 0.00000 3.16256 0.00000 3.21180 0.00000 8.43087 0.00000 10.27635 0.00000 10.46508 0.00000 11.36149 0.00000 11.49706 0.00000 11.64972 0.00000 13.21684 0.00000 19.82876 + 4 0.4861111 0.4861111 0.5277778 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90095 2.00000 -133.89714 2.00000 -89.92519 2.00000 -89.92512 2.00000 -89.92201 2.00000 -89.90887 2.00000 -89.90571 2.00000 -89.90564 2.00000 -9.81832 2.00000 -7.16303 2.00000 -1.58384 2.00000 -1.43746 0.00000 1.52890 0.00000 3.14854 0.00000 3.25595 0.00000 8.45251 0.00000 10.04400 0.00000 10.36706 0.00000 11.34845 0.00000 11.60987 0.00000 11.88990 0.00000 13.29455 0.00000 19.81721 + 5 0.4814815 0.4814815 0.5370370 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90093 2.00000 -133.89715 2.00000 -89.92525 2.00000 -89.92514 2.00000 -89.92190 2.00000 -89.90897 2.00000 -89.90569 2.00000 -89.90558 2.00000 -9.80257 2.00000 -7.15491 2.00000 -1.71167 2.00000 -1.46562 0.00000 1.63876 0.00000 3.13475 0.00000 3.31701 0.00000 8.47485 0.00000 9.80696 0.00000 10.25494 0.00000 11.33518 0.00000 11.74252 0.00000 12.13958 0.00000 13.40285 0.00000 19.80047 + 6 0.4768519 0.4768519 0.5462963 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90091 2.00000 -133.89717 2.00000 -89.92532 2.00000 -89.92516 2.00000 -89.92177 2.00000 -89.90910 2.00000 -89.90567 2.00000 -89.90551 2.00000 -9.78234 2.00000 -7.14469 2.00000 -1.86136 2.00000 -1.50063 0.00000 1.75752 0.00000 3.12785 0.00000 3.39430 0.00000 8.48748 0.00000 9.58185 0.00000 10.13615 0.00000 11.32674 0.00000 11.88740 0.00000 12.38585 0.00000 13.54188 0.00000 19.77794 + 7 0.4722222 0.4722222 0.5555556 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90089 2.00000 -133.89720 2.00000 -89.92540 2.00000 -89.92518 2.00000 -89.92162 2.00000 -89.90924 2.00000 -89.90565 2.00000 -89.90543 2.00000 -9.75765 2.00000 -7.13254 2.00000 -2.02688 2.00000 -1.54174 0.00000 1.87158 0.00000 3.13730 0.00000 3.48703 0.00000 8.47291 0.00000 9.38606 0.00000 10.01479 0.00000 11.32861 0.00000 12.04019 0.00000 12.62134 0.00000 13.71181 0.00000 19.74875 + 8 0.4675926 0.4675926 0.5648148 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90085 2.00000 -133.89723 2.00000 -89.92549 2.00000 -89.92521 2.00000 -89.92146 2.00000 -89.90941 2.00000 -89.90562 2.00000 -89.90535 2.00000 -9.72851 2.00000 -7.11870 2.00000 -2.20332 2.00000 -1.58811 0.00000 1.96632 0.00000 3.17481 0.00000 3.59433 0.00000 8.40761 0.00000 9.24040 0.00000 9.89317 0.00000 11.34655 0.00000 12.19832 0.00000 12.84179 0.00000 13.91197 0.00000 19.71174 + 9 0.4629630 0.4629630 0.5740741 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90082 2.00000 -133.89727 2.00000 -89.92558 2.00000 -89.92524 2.00000 -89.92128 2.00000 -89.90959 2.00000 -89.90559 2.00000 -89.90526 2.00000 -9.69495 2.00000 -7.10344 2.00000 -2.38682 2.00000 -1.63889 0.00000 2.02931 0.00000 3.25095 0.00000 3.71532 0.00000 8.27751 0.00000 9.15506 0.00000 9.77264 0.00000 11.38622 0.00000 12.36011 0.00000 13.04587 0.00000 14.13991 0.00000 19.66543 + 10 0.4583333 0.4583333 0.5833333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90078 2.00000 -133.89731 2.00000 -89.92566 2.00000 -89.92527 2.00000 -89.92108 2.00000 -89.90978 2.00000 -89.90556 2.00000 -89.90518 2.00000 -9.65700 2.00000 -7.08712 2.00000 -2.57430 2.00000 -1.69323 0.00000 2.05530 0.00000 3.36984 0.00000 3.84910 0.00000 8.09390 0.00000 9.11482 0.00000 9.65409 0.00000 11.45265 0.00000 12.52435 0.00000 13.23475 0.00000 14.39141 0.00000 19.60808 + 11 0.4537037 0.4537037 0.5925926 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90073 2.00000 -133.89735 2.00000 -89.92575 2.00000 -89.92530 2.00000 -89.92088 2.00000 -89.90998 2.00000 -89.90552 2.00000 -89.90509 2.00000 -9.61470 2.00000 -7.07017 2.00000 -2.76325 2.00000 -1.75034 0.00000 2.04777 0.00000 3.52742 0.00000 3.99480 0.00000 7.87864 0.00000 9.09468 0.00000 9.53808 0.00000 11.54961 0.00000 12.69008 0.00000 13.41090 0.00000 14.66145 0.00000 19.53783 + 12 0.4490741 0.4490741 0.6018519 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90069 2.00000 -133.89740 2.00000 -89.92584 2.00000 -89.92534 2.00000 -89.92067 2.00000 -89.91019 2.00000 -89.90549 2.00000 -89.90500 2.00000 -9.56808 2.00000 -7.05313 2.00000 -2.95154 2.00000 -1.80946 0.00000 2.01478 0.00000 3.71529 0.00000 4.15158 0.00000 7.64754 0.00000 9.07716 0.00000 9.42504 0.00000 11.67909 0.00000 12.85649 0.00000 13.57688 0.00000 14.94525 0.00000 19.45305 + 13 0.4444444 0.4444444 0.6111111 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90063 2.00000 -133.89745 2.00000 -89.92592 2.00000 -89.92538 2.00000 -89.92045 2.00000 -89.91041 2.00000 -89.90545 2.00000 -89.90492 2.00000 -9.51721 2.00000 -7.03663 2.00000 -3.13731 2.00000 -1.86989 0.00000 1.96442 0.00000 3.92521 0.00000 4.31864 0.00000 7.40932 0.00000 9.05356 0.00000 9.31527 0.00000 11.84123 0.00000 13.02287 0.00000 13.73468 0.00000 15.23883 0.00000 19.35278 + 14 0.4398148 0.4398148 0.6203704 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90058 2.00000 -133.89751 2.00000 -89.92600 2.00000 -89.92542 2.00000 -89.92022 2.00000 -89.91064 2.00000 -89.90540 2.00000 -89.90484 2.00000 -9.46216 2.00000 -7.02143 2.00000 -3.31877 2.00000 -1.93101 0.00000 1.90296 0.00000 4.15077 0.00000 4.49525 0.00000 7.16877 0.00000 9.02058 0.00000 9.20901 0.00000 12.03463 0.00000 13.18857 0.00000 13.88552 0.00000 15.53909 0.00000 19.23703 + 15 0.4351852 0.4351852 0.6296296 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90052 2.00000 -133.89757 2.00000 -89.92608 2.00000 -89.92547 2.00000 -89.91999 2.00000 -89.91087 2.00000 -89.90536 2.00000 -89.90477 2.00000 -9.40299 2.00000 -7.00846 2.00000 -3.49422 2.00000 -1.99224 0.00000 1.83482 0.00000 4.38730 0.00000 4.68067 0.00000 6.92882 0.00000 8.97778 0.00000 9.10650 0.00000 12.25691 0.00000 13.35296 0.00000 14.02998 0.00000 15.84356 0.00000 19.10694 + 16 0.4305556 0.4305556 0.6388889 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90045 2.00000 -133.89764 2.00000 -89.92615 2.00000 -89.92551 2.00000 -89.91975 2.00000 -89.91110 2.00000 -89.90532 2.00000 -89.90470 2.00000 -9.33983 2.00000 -6.99878 2.00000 -3.66191 2.00000 -2.05308 0.00000 1.76307 0.00000 4.63110 0.00000 4.87421 0.00000 6.69180 0.00000 8.92613 0.00000 9.00795 0.00000 12.50527 0.00000 13.51547 0.00000 14.16815 0.00000 16.15018 0.00000 18.96454 + 17 0.4259259 0.4259259 0.6481481 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90038 2.00000 -133.89770 2.00000 -89.92621 2.00000 -89.92556 2.00000 -89.91952 2.00000 -89.91134 2.00000 -89.90527 2.00000 -89.90463 2.00000 -9.27279 2.00000 -6.99362 2.00000 -3.82002 2.00000 -2.11308 0.00000 1.68985 0.00000 4.87841 0.00000 5.07521 0.00000 6.46044 0.00000 8.86708 0.00000 8.91359 0.00000 12.77683 0.00000 13.67555 0.00000 14.29971 0.00000 16.45693 0.00000 18.81248 + 18 0.4212963 0.4212963 0.6574074 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90031 2.00000 -133.89777 2.00000 -89.92627 2.00000 -89.92560 2.00000 -89.91928 2.00000 -89.91158 2.00000 -89.90523 2.00000 -89.90457 2.00000 -9.20205 2.00000 -6.99430 2.00000 -3.96668 2.00000 -2.17183 0.00000 1.61673 0.00000 5.12304 0.00000 5.28296 0.00000 6.24020 0.00000 8.80215 0.00000 8.82370 0.00000 13.06887 0.00000 13.83267 0.00000 14.42402 0.00000 16.76134 0.00000 18.65405 + 19 0.4166667 0.4166667 0.6666667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90024 2.00000 -133.89785 2.00000 -89.92633 2.00000 -89.92565 2.00000 -89.91904 2.00000 -89.91182 2.00000 -89.90518 2.00000 -89.90452 2.00000 -9.12782 2.00000 -7.00226 2.00000 -4.09997 2.00000 -2.22898 0.00000 1.54484 0.00000 5.34663 0.00000 5.49674 0.00000 6.04894 0.00000 8.73276 0.00000 8.73861 0.00000 13.37888 0.00000 13.98630 0.00000 14.54021 0.00000 17.05920 0.00000 18.45921 + 20 0.4120370 0.4120370 0.6759259 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90017 2.00000 -133.89792 2.00000 -89.92637 2.00000 -89.92569 2.00000 -89.91880 2.00000 -89.91205 2.00000 -89.90514 2.00000 -89.90447 2.00000 -9.05040 2.00000 -7.01883 2.00000 -4.21800 2.00000 -2.28423 0.00000 1.47504 0.00000 5.47106 0.00000 5.71569 0.00000 5.96436 0.00000 8.65882 0.00000 8.66013 0.00000 13.70446 0.00000 14.13595 0.00000 14.64710 0.00000 17.34052 0.00000 18.11087 + 21 0.4074074 0.4074074 0.6851852 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90009 2.00000 -133.89800 2.00000 -89.92642 2.00000 -89.92574 2.00000 -89.91856 2.00000 -89.91229 2.00000 -89.90509 2.00000 -89.90443 2.00000 -8.97018 2.00000 -7.04517 2.00000 -4.31905 2.00000 -2.33729 0.00000 1.40800 0.00000 5.38805 0.00000 5.93881 0.00000 6.09445 0.00000 8.58499 0.00000 8.58528 0.00000 14.04325 0.00000 14.28106 0.00000 14.74334 0.00000 17.57194 0.00000 17.75932 + 22 0.4027778 0.4027778 0.6944444 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90001 2.00000 -133.89808 2.00000 -89.92645 2.00000 -89.92578 2.00000 -89.91833 2.00000 -89.91252 2.00000 -89.90505 2.00000 -89.90439 2.00000 -8.88773 2.00000 -7.08194 2.00000 -4.40173 2.00000 -2.38794 0.00000 1.34423 0.00000 5.20764 0.00000 6.16474 0.00000 6.32892 0.00000 8.50908 0.00000 8.51817 0.00000 14.39242 0.00000 14.42105 0.00000 14.82755 0.00000 17.40638 0.00000 17.65502 + 23 0.3981481 0.3981481 0.7037037 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89993 2.00000 -133.89815 2.00000 -89.92648 2.00000 -89.92582 2.00000 -89.91811 2.00000 -89.91274 2.00000 -89.90501 2.00000 -89.90437 2.00000 -8.80386 2.00000 -7.12910 2.00000 -4.46518 2.00000 -2.43596 0.00000 1.28415 0.00000 5.00617 0.00000 6.39159 0.00000 6.59113 0.00000 8.43229 0.00000 8.45994 0.00000 14.55513 0.00000 14.74470 0.00000 14.90199 0.00000 17.05387 0.00000 17.56052 + 24 0.3935185 0.3935185 0.7129630 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89986 2.00000 -133.89823 2.00000 -89.92650 2.00000 -89.92586 2.00000 -89.91790 2.00000 -89.91296 2.00000 -89.90497 2.00000 -89.90434 2.00000 -8.71979 2.00000 -7.18564 2.00000 -4.50912 2.00000 -2.48116 0.00000 1.22807 0.00000 4.80089 0.00000 6.61644 0.00000 6.86346 0.00000 8.35568 0.00000 8.41292 0.00000 14.68212 0.00000 14.93336 0.00000 15.12705 0.00000 16.70384 0.00000 17.39401 + 25 0.3888889 0.3888889 0.7222222 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89978 2.00000 -133.89830 2.00000 -89.92652 2.00000 -89.92589 2.00000 -89.91769 2.00000 -89.91316 2.00000 -89.90494 2.00000 -89.90432 2.00000 -8.63738 2.00000 -7.24926 2.00000 -4.53394 2.00000 -2.52339 0.00000 1.17625 0.00000 4.59678 0.00000 6.83467 0.00000 7.14023 0.00000 8.28026 0.00000 8.38145 0.00000 14.79976 0.00000 14.96642 0.00000 15.48596 0.00000 16.35930 0.00000 17.20480 + 26 0.3842593 0.3842593 0.7314815 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89972 2.00000 -133.89837 2.00000 -89.92653 2.00000 -89.92593 2.00000 -89.91751 2.00000 -89.91335 2.00000 -89.90490 2.00000 -89.90431 2.00000 -8.55957 2.00000 -7.31606 2.00000 -4.54060 2.00000 -2.56250 0.00000 1.12887 0.00000 4.39580 0.00000 7.03880 0.00000 7.41761 0.00000 8.20807 0.00000 8.37271 0.00000 14.90262 0.00000 14.96929 0.00000 15.83986 0.00000 16.02637 0.00000 17.01077 + 27 0.3796296 0.3796296 0.7407407 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89966 2.00000 -133.89843 2.00000 -89.92654 2.00000 -89.92596 2.00000 -89.91735 2.00000 -89.91351 2.00000 -89.90487 2.00000 -89.90431 2.00000 -8.49098 2.00000 -7.38006 2.00000 -4.53045 2.00000 -2.59836 0.00000 1.08610 0.00000 4.19900 0.00000 7.21743 0.00000 7.68731 0.00000 8.14653 0.00000 8.39780 0.00000 14.94028 0.00000 14.97385 0.00000 15.72253 0.00000 16.16611 0.00000 16.82701 + 28 0.3750000 0.3750000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89961 2.00000 -133.89848 2.00000 -89.92654 2.00000 -89.92599 2.00000 -89.91722 2.00000 -89.91364 2.00000 -89.90485 2.00000 -89.90431 2.00000 -8.43855 2.00000 -7.43279 2.00000 -4.50510 2.00000 -2.63086 0.00000 1.04802 0.00000 4.00701 0.00000 7.35679 0.00000 7.89701 0.00000 8.14738 0.00000 8.47017 0.00000 14.87484 0.00000 14.95523 0.00000 15.50658 0.00000 16.40147 0.00000 16.69799 diff --git a/tests/test_data/aims/static-si-bs-density/band1010.out b/tests/test_data/aims/static-si-bs-density/band1010.out new file mode 100644 index 0000000000..61ff18c01e --- /dev/null +++ b/tests/test_data/aims/static-si-bs-density/band1010.out @@ -0,0 +1,16 @@ + 1 0.6250000 0.2500000 0.6250000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89961 2.00000 -133.89848 2.00000 -89.92654 2.00000 -89.92599 2.00000 -89.91722 2.00000 -89.91364 2.00000 -89.90485 2.00000 -89.90431 2.00000 -8.43855 2.00000 -7.43279 2.00000 -4.50510 2.00000 -2.63086 0.00000 1.04802 0.00000 4.00701 0.00000 7.35679 0.00000 7.89701 0.00000 8.14738 0.00000 8.47017 0.00000 14.87484 0.00000 14.95523 0.00000 15.50658 0.00000 16.40147 0.00000 16.69799 + 2 0.6166667 0.2333333 0.6166667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89954 2.00000 -133.89855 2.00000 -89.92653 2.00000 -89.92603 2.00000 -89.91701 2.00000 -89.91384 2.00000 -89.90480 2.00000 -89.90431 2.00000 -8.36807 2.00000 -7.50873 2.00000 -4.43963 2.00000 -2.68467 0.00000 0.98561 0.00000 3.66909 0.00000 7.56649 0.00000 8.11581 0.00000 8.31244 0.00000 8.65177 0.00000 14.71978 0.00000 14.77562 0.00000 15.26061 0.00000 16.54270 0.00000 16.64072 + 3 0.6083333 0.2166667 0.6083333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89947 2.00000 -133.89861 2.00000 -89.92652 2.00000 -89.92607 2.00000 -89.91682 2.00000 -89.91404 2.00000 -89.90476 2.00000 -89.90432 2.00000 -8.30578 2.00000 -7.57949 2.00000 -4.36025 2.00000 -2.73517 0.00000 0.92704 0.00000 3.33801 0.00000 7.77838 0.00000 8.33939 0.00000 8.47776 0.00000 8.83700 0.00000 14.56247 0.00000 14.59329 0.00000 15.01390 0.00000 16.30378 0.00000 16.88817 + 4 0.6000000 0.2000000 0.6000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89941 2.00000 -133.89867 2.00000 -89.92651 2.00000 -89.92611 2.00000 -89.91663 2.00000 -89.91423 2.00000 -89.90472 2.00000 -89.90433 2.00000 -8.25149 2.00000 -7.64505 2.00000 -4.26785 2.00000 -2.78227 0.00000 0.87241 0.00000 3.01496 0.00000 7.99193 0.00000 8.56713 0.00000 8.64255 0.00000 9.02535 0.00000 14.40481 0.00000 14.40850 0.00000 14.76708 0.00000 16.02394 0.00000 17.14236 + 5 0.5916667 0.1833333 0.5916667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89935 2.00000 -133.89873 2.00000 -89.92650 2.00000 -89.92615 2.00000 -89.91646 2.00000 -89.91440 2.00000 -89.90469 2.00000 -89.90435 2.00000 -8.20483 2.00000 -7.70541 2.00000 -4.16368 2.00000 -2.82588 0.00000 0.82184 0.00000 2.70119 0.00000 8.20652 0.00000 8.79841 0.00000 8.80588 0.00000 9.21622 0.00000 14.22162 0.00000 14.24815 0.00000 14.52091 0.00000 15.72514 0.00000 17.40235 + 6 0.5833333 0.1666667 0.5833333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89930 2.00000 -133.89878 2.00000 -89.92648 2.00000 -89.92619 2.00000 -89.91629 2.00000 -89.91457 2.00000 -89.90465 2.00000 -89.90436 2.00000 -8.16529 2.00000 -7.76055 2.00000 -4.04936 2.00000 -2.86594 0.00000 0.77539 0.00000 2.39806 0.00000 8.42133 0.00000 8.96667 0.00000 9.03255 0.00000 9.40891 0.00000 14.03313 0.00000 14.09374 0.00000 14.27638 0.00000 15.41828 0.00000 17.66736 + 7 0.5750000 0.1500000 0.5750000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89925 2.00000 -133.89883 2.00000 -89.92646 2.00000 -89.92622 2.00000 -89.91614 2.00000 -89.91473 2.00000 -89.90462 2.00000 -89.90438 2.00000 -8.13224 2.00000 -7.81047 2.00000 -3.92692 2.00000 -2.90236 0.00000 0.73317 0.00000 2.10717 0.00000 8.63528 0.00000 9.12360 0.00000 9.26871 0.00000 9.60253 0.00000 13.84374 0.00000 13.94289 0.00000 14.03473 0.00000 15.10959 0.00000 17.93666 + 8 0.5666667 0.1333333 0.5666667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89921 2.00000 -133.89888 2.00000 -89.92645 2.00000 -89.92625 2.00000 -89.91600 2.00000 -89.91487 2.00000 -89.90459 2.00000 -89.90440 2.00000 -8.10498 2.00000 -7.85515 2.00000 -3.79885 2.00000 -2.93510 0.00000 0.69522 0.00000 1.83044 0.00000 8.84695 0.00000 9.27512 0.00000 9.50575 0.00000 9.79598 0.00000 13.65439 0.00000 13.79709 0.00000 13.79761 0.00000 14.80334 0.00000 18.20940 + 9 0.5583333 0.1166667 0.5583333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89917 2.00000 -133.89891 2.00000 -89.92643 2.00000 -89.92627 2.00000 -89.91587 2.00000 -89.91500 2.00000 -89.90457 2.00000 -89.90442 2.00000 -8.08284 2.00000 -7.89459 2.00000 -3.66812 2.00000 -2.96410 0.00000 0.66161 0.00000 1.57028 0.00000 9.05441 0.00000 9.41937 0.00000 9.74211 0.00000 9.98777 0.00000 13.46643 0.00000 13.56713 0.00000 13.65815 0.00000 14.50309 0.00000 18.48450 + 10 0.5500000 0.1000000 0.5500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89914 2.00000 -133.89895 2.00000 -89.92641 2.00000 -89.92629 2.00000 -89.91576 2.00000 -89.91511 2.00000 -89.90455 2.00000 -89.90443 2.00000 -8.06513 2.00000 -7.92878 2.00000 -3.53831 2.00000 -2.98932 0.00000 0.63239 0.00000 1.32966 0.00000 9.25497 0.00000 9.55408 0.00000 9.97545 0.00000 10.17586 0.00000 13.28180 0.00000 13.34616 0.00000 13.52823 0.00000 14.21252 0.00000 18.76049 + 11 0.5416667 0.0833333 0.5416667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89911 2.00000 -133.89898 2.00000 -89.92639 2.00000 -89.92631 2.00000 -89.91566 2.00000 -89.91521 2.00000 -89.90453 2.00000 -89.90445 2.00000 -8.05125 2.00000 -7.95772 2.00000 -3.41372 2.00000 -3.01073 0.00000 0.60759 0.00000 1.11233 0.00000 9.44491 0.00000 9.67659 0.00000 10.20226 0.00000 10.35731 0.00000 13.10338 0.00000 13.13860 0.00000 13.40992 0.00000 13.93609 0.00000 19.03514 + 12 0.5333333 0.0666667 0.5333333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89908 2.00000 -133.89900 2.00000 -89.92638 2.00000 -89.92633 2.00000 -89.91558 2.00000 -89.91529 2.00000 -89.90452 2.00000 -89.90446 2.00000 -8.04065 2.00000 -7.98141 2.00000 -3.29939 2.00000 -3.02828 0.00000 0.58726 0.00000 0.92284 0.00000 9.61907 0.00000 9.78382 0.00000 10.41708 0.00000 10.52773 0.00000 12.93549 0.00000 12.94979 0.00000 13.30622 0.00000 13.67994 0.00000 19.30481 + 13 0.5250000 0.0500000 0.5250000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89907 2.00000 -133.89902 2.00000 -89.92637 2.00000 -89.92634 2.00000 -89.91552 2.00000 -89.91535 2.00000 -89.90450 2.00000 -89.90447 2.00000 -8.03289 2.00000 -7.99983 2.00000 -3.20106 2.00000 -3.04196 0.00000 0.57142 0.00000 0.76649 0.00000 9.77037 0.00000 9.87240 0.00000 10.61131 0.00000 10.68044 0.00000 12.78478 0.00000 12.78694 0.00000 13.22045 0.00000 13.45314 0.00000 19.56283 + 14 0.5166667 0.0333333 0.5166667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89905 2.00000 -133.89903 2.00000 -89.92636 2.00000 -89.92635 2.00000 -89.91547 2.00000 -89.91540 2.00000 -89.90450 2.00000 -89.90448 2.00000 -8.02760 2.00000 -8.01300 2.00000 -3.12480 2.00000 -3.05175 0.00000 0.56009 0.00000 0.64904 0.00000 9.88981 0.00000 9.93888 0.00000 10.77183 0.00000 10.80553 0.00000 12.65918 0.00000 12.66113 0.00000 13.15599 0.00000 13.26914 0.00000 19.79565 + 15 0.5083333 0.0166667 0.5083333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92636 2.00000 -89.92635 2.00000 -89.91544 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -8.02453 2.00000 -8.02089 2.00000 -3.07627 2.00000 -3.05762 0.00000 0.55328 0.00000 0.57589 0.00000 9.96729 0.00000 9.98022 0.00000 10.88075 0.00000 10.88975 0.00000 12.57667 0.00000 12.57778 0.00000 13.11589 0.00000 13.14606 0.00000 19.97403 + 16 0.5000000 0.0000000 0.5000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -8.02353 2.00000 -8.02353 2.00000 -3.05958 2.00000 -3.05958 0.00000 0.55101 0.00000 0.55101 0.00000 9.99426 0.00000 9.99426 0.00000 10.91981 0.00000 10.91981 0.00000 12.54801 0.00000 12.54801 0.00000 13.10226 0.00000 13.10226 0.00000 20.04541 diff --git a/tests/test_data/aims/static-si-bs-density/control.in.gz b/tests/test_data/aims/static-si-bs-density/control.in.gz new file mode 100644 index 0000000000..c7f93e6fd5 Binary files /dev/null and b/tests/test_data/aims/static-si-bs-density/control.in.gz differ diff --git a/tests/test_data/aims/static-si-bs-density/geometry.in.gz b/tests/test_data/aims/static-si-bs-density/geometry.in.gz new file mode 100644 index 0000000000..c2e720a036 Binary files /dev/null and b/tests/test_data/aims/static-si-bs-density/geometry.in.gz differ diff --git a/tests/test_data/aims/static-si-bs-density/parameters.json b/tests/test_data/aims/static-si-bs-density/parameters.json new file mode 100644 index 0000000000..50e814eb48 --- /dev/null +++ b/tests/test_data/aims/static-si-bs-density/parameters.json @@ -0,0 +1,22 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "output": [ + "band 0.00000 0.00000 0.00000 0.50000 -0.00000 0.50000 48 G X ", + "band 0.50000 -0.00000 0.50000 0.50000 0.25000 0.75000 25 X W ", + "band 0.50000 0.25000 0.75000 0.37500 0.37500 0.75000 18 W K ", + "band 0.37500 0.37500 0.75000 0.00000 0.00000 0.00000 51 K G ", + "band 0.00000 0.00000 0.00000 0.50000 0.50000 0.50000 42 G L ", + "band 0.50000 0.50000 0.50000 0.62500 0.25000 0.62500 30 L U ", + "band 0.62500 0.25000 0.62500 0.50000 0.25000 0.75000 18 U W ", + "band 0.50000 0.25000 0.75000 0.50000 0.50000 0.50000 34 W L ", + "band 0.50000 0.50000 0.50000 0.37500 0.37500 0.75000 30 L K ", + "band 0.62500 0.25000 0.62500 0.50000 -0.00000 0.50000 18 U X " + ], + "species_dir": "/home/tpurcell/git/atomate2/tests/aims/species_dir/light", + "k_grid": [ + 8, + 8, + 8 + ] +} diff --git a/tests/test_data/aims/static-si-bs-output/control.in.gz b/tests/test_data/aims/static-si-bs-output/control.in.gz new file mode 100644 index 0000000000..d2b0e9fe82 Binary files /dev/null and b/tests/test_data/aims/static-si-bs-output/control.in.gz differ diff --git a/tests/test_data/aims/static-si-bs-output/geometry.in.gz b/tests/test_data/aims/static-si-bs-output/geometry.in.gz new file mode 100644 index 0000000000..c2e720a036 Binary files /dev/null and b/tests/test_data/aims/static-si-bs-output/geometry.in.gz differ diff --git a/tests/test_data/aims/static-si-bs-output/parameters.json b/tests/test_data/aims/static-si-bs-output/parameters.json new file mode 100644 index 0000000000..e8a43480c5 --- /dev/null +++ b/tests/test_data/aims/static-si-bs-output/parameters.json @@ -0,0 +1,23 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "output": [ + "band 0.00000 0.00000 0.00000 0.50000 -0.00000 0.50000 25 G X ", + "band 0.50000 -0.00000 0.50000 0.50000 0.25000 0.75000 13 X W ", + "band 0.50000 0.25000 0.75000 0.37500 0.37500 0.75000 10 W K ", + "band 0.37500 0.37500 0.75000 0.00000 0.00000 0.00000 26 K G ", + "band 0.00000 0.00000 0.00000 0.50000 0.50000 0.50000 22 G L ", + "band 0.50000 0.50000 0.50000 0.62500 0.25000 0.62500 16 L U ", + "band 0.62500 0.25000 0.62500 0.50000 0.25000 0.75000 10 U W ", + "band 0.50000 0.25000 0.75000 0.50000 0.50000 0.50000 18 W L ", + "band 0.50000 0.50000 0.50000 0.37500 0.37500 0.75000 16 L K ", + "band 0.62500 0.25000 0.62500 0.50000 -0.00000 0.50000 10 U X ", + "json_log" + ], + "species_dir": "/home/tpurcell/git/atomate2/tests/aims/species_dir/light", + "k_grid": [ + 8, + 8, + 8 + ] +} diff --git a/tests/test_data/aims/static-si-bs/aims.out.gz b/tests/test_data/aims/static-si-bs/aims.out.gz new file mode 100644 index 0000000000..a32fed991c Binary files /dev/null and b/tests/test_data/aims/static-si-bs/aims.out.gz differ diff --git a/tests/test_data/aims/static-si-bs/band1001.out b/tests/test_data/aims/static-si-bs/band1001.out new file mode 100644 index 0000000000..731e7ca33e --- /dev/null +++ b/tests/test_data/aims/static-si-bs/band1001.out @@ -0,0 +1,23 @@ + 1 0.0000000 0.0000000 0.0000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90289 2.00000 -133.89518 2.00000 -89.92384 2.00000 -89.92384 2.00000 -89.92384 2.00000 -89.90697 2.00000 -89.90697 2.00000 -89.90697 2.00000 -12.16929 2.00000 -0.18870 2.00000 -0.18870 2.00000 -0.18870 0.00000 2.37720 0.00000 2.37720 0.00000 2.37720 0.00000 3.21314 0.00000 7.69054 0.00000 7.69054 0.00000 8.40613 0.00000 11.78863 0.00000 11.78863 0.00000 11.78863 0.00000 22.04643 + 2 0.0227273 0.0000000 0.0227273 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90288 2.00000 -133.89519 2.00000 -89.92386 2.00000 -89.92386 2.00000 -89.92382 2.00000 -89.90699 2.00000 -89.90696 2.00000 -89.90696 2.00000 -12.16028 2.00000 -0.25053 2.00000 -0.22803 2.00000 -0.22803 0.00000 2.35502 0.00000 2.42771 0.00000 2.42771 0.00000 3.27394 0.00000 7.62532 0.00000 7.70044 0.00000 8.43550 0.00000 11.80584 0.00000 11.80584 0.00000 11.85186 0.00000 22.08543 + 3 0.0454545 0.0000000 0.0454545 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90286 2.00000 -133.89522 2.00000 -89.92390 2.00000 -89.92390 2.00000 -89.92376 2.00000 -89.90706 2.00000 -89.90691 2.00000 -89.90691 2.00000 -12.13325 2.00000 -0.42357 2.00000 -0.33740 2.00000 -0.33740 0.00000 2.29062 0.00000 2.57058 0.00000 2.57058 0.00000 3.44179 0.00000 7.44552 0.00000 7.73013 0.00000 8.52486 0.00000 11.85725 0.00000 11.85725 0.00000 12.02894 0.00000 22.19706 + 4 0.0681818 0.0000000 0.0681818 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90281 2.00000 -133.89527 2.00000 -89.92397 2.00000 -89.92397 2.00000 -89.92365 2.00000 -89.90716 2.00000 -89.90684 2.00000 -89.90684 2.00000 -12.08820 2.00000 -0.68018 2.00000 -0.49741 2.00000 -0.49741 0.00000 2.18979 0.00000 2.78626 0.00000 2.78626 0.00000 3.68164 0.00000 7.19009 0.00000 7.77965 0.00000 8.67621 0.00000 11.94230 0.00000 11.94230 0.00000 12.29150 0.00000 22.36839 + 5 0.0909091 0.0000000 0.0909091 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90274 2.00000 -133.89533 2.00000 -89.92407 2.00000 -89.92407 2.00000 -89.92350 2.00000 -89.90731 2.00000 -89.90675 2.00000 -89.90675 2.00000 -12.02515 2.00000 -0.99308 2.00000 -0.68842 2.00000 -0.68842 0.00000 2.06052 0.00000 3.05487 0.00000 3.05487 0.00000 3.94965 0.00000 6.90824 0.00000 7.84901 0.00000 8.88936 0.00000 12.06002 0.00000 12.06002 0.00000 12.61124 0.00000 22.47013 + 6 0.1136364 0.0000000 0.1136364 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90266 2.00000 -133.89542 2.00000 -89.92419 2.00000 -89.92419 2.00000 -89.92331 2.00000 -89.90751 2.00000 -89.90663 2.00000 -89.90663 2.00000 -11.94414 2.00000 -1.34217 2.00000 -0.89548 2.00000 -0.89548 0.00000 1.91135 0.00000 3.36122 0.00000 3.36122 0.00000 4.19128 0.00000 6.65938 0.00000 7.93825 0.00000 9.16076 0.00000 12.20909 0.00000 12.20909 0.00000 12.96719 0.00000 21.76404 + 7 0.1363636 0.0000000 0.1363636 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90255 2.00000 -133.89553 2.00000 -89.92433 2.00000 -89.92433 2.00000 -89.92309 2.00000 -89.90774 2.00000 -89.90649 2.00000 -89.90649 2.00000 -11.84527 2.00000 -1.71432 2.00000 -1.10846 2.00000 -1.10846 0.00000 1.75018 0.00000 3.69482 0.00000 3.69482 0.00000 4.33185 0.00000 6.52128 0.00000 8.04742 0.00000 9.48425 0.00000 12.38768 0.00000 12.38768 0.00000 13.34524 0.00000 21.06930 + 8 0.1590909 0.0000000 0.1590909 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90243 2.00000 -133.89565 2.00000 -89.92448 2.00000 -89.92448 2.00000 -89.92282 2.00000 -89.90801 2.00000 -89.90634 2.00000 -89.90634 2.00000 -11.72864 2.00000 -2.10126 2.00000 -1.32069 2.00000 -1.32069 0.00000 1.58378 0.00000 4.04868 0.00000 4.04868 0.00000 4.29992 0.00000 6.56682 0.00000 8.17656 0.00000 9.85249 0.00000 12.59308 0.00000 12.59308 0.00000 13.73539 0.00000 20.39556 + 9 0.1818182 0.0000000 0.1818182 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90229 2.00000 -133.89579 2.00000 -89.92465 2.00000 -89.92465 2.00000 -89.92251 2.00000 -89.90832 2.00000 -89.90617 2.00000 -89.90617 2.00000 -11.59441 2.00000 -2.49776 2.00000 -1.52771 2.00000 -1.52771 0.00000 1.41765 0.00000 4.09776 0.00000 4.41806 0.00000 4.41806 0.00000 6.79510 0.00000 8.32574 0.00000 10.25786 0.00000 12.82101 0.00000 12.82101 0.00000 14.13029 0.00000 19.75075 + 10 0.2045455 0.0000000 0.2045455 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90213 2.00000 -133.89595 2.00000 -89.92482 2.00000 -89.92482 2.00000 -89.92217 2.00000 -89.90866 2.00000 -89.90600 2.00000 -89.90600 2.00000 -11.44274 2.00000 -2.90043 2.00000 -1.72652 2.00000 -1.72652 0.00000 1.25617 0.00000 3.79019 0.00000 4.79966 0.00000 4.79966 0.00000 7.14430 0.00000 8.49500 0.00000 10.69279 0.00000 13.06440 0.00000 13.06440 0.00000 14.52571 0.00000 19.14398 + 11 0.2272727 0.0000000 0.2272727 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90196 2.00000 -133.89612 2.00000 -89.92500 2.00000 -89.92500 2.00000 -89.92179 2.00000 -89.90904 2.00000 -89.90582 2.00000 -89.90582 2.00000 -11.27384 2.00000 -3.30697 2.00000 -1.91500 2.00000 -1.91500 0.00000 1.10279 0.00000 3.43593 0.00000 5.19118 0.00000 5.19118 0.00000 7.56072 0.00000 8.68441 0.00000 11.14957 0.00000 13.31112 0.00000 13.31112 0.00000 14.92139 0.00000 18.58848 + 12 0.2500000 0.0000000 0.2500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90177 2.00000 -133.89631 2.00000 -89.92518 2.00000 -89.92518 2.00000 -89.92139 2.00000 -89.90945 2.00000 -89.90565 2.00000 -89.90565 2.00000 -11.08793 2.00000 -3.71572 2.00000 -2.09163 2.00000 -2.09163 0.00000 0.96026 0.00000 3.07048 0.00000 5.59098 0.00000 5.59098 0.00000 8.01411 0.00000 8.89403 0.00000 11.61981 0.00000 13.54044 0.00000 13.54044 0.00000 15.32053 0.00000 18.10552 + 13 0.2727273 0.0000000 0.2727273 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90157 2.00000 -133.89651 2.00000 -89.92536 2.00000 -89.92536 2.00000 -89.92095 2.00000 -89.90990 2.00000 -89.90547 2.00000 -89.90547 2.00000 -10.88527 2.00000 -4.12534 2.00000 -2.25528 2.00000 -2.25528 0.00000 0.83079 0.00000 2.71361 0.00000 5.99791 0.00000 5.99791 0.00000 8.48825 0.00000 9.12390 0.00000 12.09360 0.00000 13.71853 0.00000 13.71853 0.00000 15.72799 0.00000 17.72896 + 14 0.2954545 0.0000000 0.2954545 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90136 2.00000 -133.89673 2.00000 -89.92552 2.00000 -89.92552 2.00000 -89.92048 2.00000 -89.91037 2.00000 -89.90531 2.00000 -89.90531 2.00000 -10.66615 2.00000 -4.53465 2.00000 -2.40511 2.00000 -2.40511 0.00000 0.71618 0.00000 2.37586 0.00000 6.41117 0.00000 6.41117 0.00000 8.97369 0.00000 9.37410 0.00000 12.55825 0.00000 13.79869 0.00000 13.79869 0.00000 16.14843 0.00000 17.36271 + 15 0.3181818 0.0000000 0.3181818 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90113 2.00000 -133.89695 2.00000 -89.92568 2.00000 -89.92568 2.00000 -89.91999 2.00000 -89.91086 2.00000 -89.90515 2.00000 -89.90515 2.00000 -10.43091 2.00000 -4.94255 2.00000 -2.54047 2.00000 -2.54047 0.00000 0.61793 0.00000 2.06262 0.00000 6.83017 0.00000 6.83017 0.00000 9.46425 0.00000 9.64467 0.00000 12.99673 0.00000 13.73901 0.00000 13.73901 0.00000 16.58526 0.00000 16.75212 + 16 0.3409091 0.0000000 0.3409091 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90089 2.00000 -133.89719 2.00000 -89.92583 2.00000 -89.92583 2.00000 -89.91947 2.00000 -89.91138 2.00000 -89.90500 2.00000 -89.90500 2.00000 -10.17992 2.00000 -5.34794 2.00000 -2.66085 2.00000 -2.66085 0.00000 0.53733 0.00000 1.77644 0.00000 7.25448 0.00000 7.25448 0.00000 9.93566 0.00000 9.95539 0.00000 13.38597 0.00000 13.53337 0.00000 13.53337 0.00000 16.15905 0.00000 17.04031 + 17 0.3636364 0.0000000 0.3636364 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90065 2.00000 -133.89744 2.00000 -89.92596 2.00000 -89.92596 2.00000 -89.91893 2.00000 -89.91192 2.00000 -89.90487 2.00000 -89.90487 2.00000 -9.91359 2.00000 -5.74972 2.00000 -2.76584 2.00000 -2.76584 0.00000 0.47551 0.00000 1.51837 0.00000 7.68364 0.00000 7.68364 0.00000 10.24714 0.00000 10.44349 0.00000 13.21416 0.00000 13.21416 0.00000 13.69666 0.00000 15.58432 0.00000 17.51363 + 18 0.3863636 0.0000000 0.3863636 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90039 2.00000 -133.89769 2.00000 -89.92608 2.00000 -89.92608 2.00000 -89.91838 2.00000 -89.91248 2.00000 -89.90476 2.00000 -89.90476 2.00000 -9.63239 2.00000 -6.14679 2.00000 -2.85514 2.00000 -2.85514 0.00000 0.43347 0.00000 1.28864 0.00000 8.11695 0.00000 8.11695 0.00000 10.57914 0.00000 10.92530 0.00000 12.82362 0.00000 12.82362 0.00000 13.89746 0.00000 15.02857 0.00000 18.00300 + 19 0.4090909 0.0000000 0.4090909 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90013 2.00000 -133.89795 2.00000 -89.92618 2.00000 -89.92618 2.00000 -89.91781 2.00000 -89.91305 2.00000 -89.90466 2.00000 -89.90466 2.00000 -9.33683 2.00000 -6.53803 2.00000 -2.92851 2.00000 -2.92851 0.00000 0.41214 0.00000 1.08705 0.00000 8.55299 0.00000 8.55299 0.00000 10.93170 0.00000 11.39764 0.00000 12.39485 0.00000 12.39485 0.00000 13.96582 0.00000 14.49229 0.00000 18.50257 + 20 0.4318182 0.0000000 0.4318182 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89986 2.00000 -133.89822 2.00000 -89.92625 2.00000 -89.92625 2.00000 -89.91723 2.00000 -89.91364 2.00000 -89.90459 2.00000 -89.90459 2.00000 -9.02750 2.00000 -6.92236 2.00000 -2.98576 2.00000 -2.98576 0.00000 0.41240 0.00000 0.91315 0.00000 8.98847 0.00000 8.98847 0.00000 11.30486 0.00000 11.85696 0.00000 11.95101 0.00000 11.95101 0.00000 13.89929 0.00000 13.97585 0.00000 18.99963 + 21 0.4545455 0.0000000 0.4545455 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89959 2.00000 -133.89849 2.00000 -89.92631 2.00000 -89.92631 2.00000 -89.91663 2.00000 -89.91423 2.00000 -89.90453 2.00000 -89.90453 2.00000 -8.70503 2.00000 -7.29872 2.00000 -3.02674 2.00000 -3.02674 0.00000 0.43509 0.00000 0.76631 0.00000 9.41431 0.00000 9.41431 0.00000 11.51289 0.00000 11.51289 0.00000 11.69863 0.00000 12.29877 0.00000 13.47954 0.00000 13.71562 0.00000 19.46710 + 22 0.4772727 0.0000000 0.4772727 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89932 2.00000 -133.89877 2.00000 -89.92634 2.00000 -89.92634 2.00000 -89.91604 2.00000 -89.91483 2.00000 -89.90450 2.00000 -89.90450 2.00000 -8.37012 2.00000 -7.66610 2.00000 -3.05137 2.00000 -3.05137 0.00000 0.48102 0.00000 0.64585 0.00000 9.79790 0.00000 9.79790 0.00000 11.11972 0.00000 11.11972 0.00000 12.11302 0.00000 12.71688 0.00000 13.00354 0.00000 13.44157 0.00000 19.84816 + 23 0.5000000 0.0000000 0.5000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -8.02353 2.00000 -8.02353 2.00000 -3.05958 2.00000 -3.05958 0.00000 0.55101 0.00000 0.55101 0.00000 9.99426 0.00000 9.99426 0.00000 10.91981 0.00000 10.91981 0.00000 12.54801 0.00000 12.54801 0.00000 13.10226 0.00000 13.10226 0.00000 20.04541 diff --git a/tests/test_data/aims/static-si-bs/band1002.out b/tests/test_data/aims/static-si-bs/band1002.out new file mode 100644 index 0000000000..31566f9e29 --- /dev/null +++ b/tests/test_data/aims/static-si-bs/band1002.out @@ -0,0 +1,12 @@ + 1 0.5000000 0.0000000 0.5000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -8.02353 2.00000 -8.02353 2.00000 -3.05958 2.00000 -3.05958 0.00000 0.55101 0.00000 0.55101 0.00000 9.99426 0.00000 9.99426 0.00000 10.91981 0.00000 10.91981 0.00000 12.54801 0.00000 12.54801 0.00000 13.10226 0.00000 13.10226 0.00000 20.04541 + 2 0.5000000 0.0227273 0.5227273 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -8.02051 2.00000 -8.02051 2.00000 -3.08675 2.00000 -3.08675 0.00000 0.60128 0.00000 0.60128 0.00000 9.91266 0.00000 9.91266 0.00000 10.81101 0.00000 10.81101 0.00000 12.63249 0.00000 12.63249 0.00000 13.21879 0.00000 13.21879 0.00000 19.90761 + 3 0.5000000 0.0454545 0.5454545 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -8.01164 2.00000 -8.01164 2.00000 -3.16315 2.00000 -3.16315 0.00000 0.74710 0.00000 0.74710 0.00000 9.63653 0.00000 9.63653 0.00000 10.64201 0.00000 10.64201 0.00000 12.73818 0.00000 12.73818 0.00000 13.58975 0.00000 13.58975 0.00000 19.60589 + 4 0.5000000 0.0681818 0.5681818 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.99747 2.00000 -7.99747 2.00000 -3.27604 2.00000 -3.27604 0.00000 0.97609 0.00000 0.97609 0.00000 9.18207 0.00000 9.18207 0.00000 10.54686 0.00000 10.54686 0.00000 12.80138 0.00000 12.80138 0.00000 14.12762 0.00000 14.12762 0.00000 19.25859 + 5 0.5000000 0.0909091 0.5909091 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.97893 2.00000 -7.97893 2.00000 -3.41013 2.00000 -3.41013 0.00000 1.27354 0.00000 1.27354 0.00000 8.63475 0.00000 8.63475 0.00000 10.50473 0.00000 10.50473 0.00000 12.85151 0.00000 12.85151 0.00000 14.73657 0.00000 14.73657 0.00000 18.91257 + 6 0.5000000 0.1136364 0.6136364 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.95728 2.00000 -7.95728 2.00000 -3.55132 2.00000 -3.55132 0.00000 1.62612 0.00000 1.62612 0.00000 8.05012 0.00000 8.05012 0.00000 10.48586 0.00000 10.48586 0.00000 12.90041 0.00000 12.90041 0.00000 15.37608 0.00000 15.37608 0.00000 18.58861 + 7 0.5000000 0.1363636 0.6363636 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.93411 2.00000 -7.93411 2.00000 -3.68808 2.00000 -3.68808 0.00000 2.02305 0.00000 2.02305 0.00000 7.45319 0.00000 7.45319 0.00000 10.47730 0.00000 10.47730 0.00000 12.94996 0.00000 12.94996 0.00000 16.02734 0.00000 16.02734 0.00000 18.30002 + 8 0.5000000 0.1590909 0.6590909 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.91127 2.00000 -7.91127 2.00000 -3.81140 2.00000 -3.81140 0.00000 2.45581 0.00000 2.45581 0.00000 6.85645 0.00000 6.85645 0.00000 10.47363 0.00000 10.47363 0.00000 12.99846 0.00000 12.99846 0.00000 16.67477 0.00000 16.67477 0.00000 18.06148 + 9 0.5000000 0.1818182 0.6818182 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.89072 2.00000 -7.89072 2.00000 -3.91432 2.00000 -3.91432 0.00000 2.91693 0.00000 2.91693 0.00000 6.26811 0.00000 6.26811 0.00000 10.47230 0.00000 10.47230 0.00000 13.04258 0.00000 13.04258 0.00000 17.27257 0.00000 17.27257 0.00000 17.91876 + 10 0.5000000 0.2045455 0.7045455 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.87437 2.00000 -7.87437 2.00000 -3.99158 2.00000 -3.99158 0.00000 3.39719 0.00000 3.39719 0.00000 5.69725 0.00000 5.69725 0.00000 10.47201 0.00000 10.47201 0.00000 13.07828 0.00000 13.07828 0.00000 17.53400 0.00000 17.53400 0.00000 18.15591 + 11 0.5000000 0.2272727 0.7272727 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.86382 2.00000 -7.86382 2.00000 -4.03946 2.00000 -4.03946 0.00000 3.87255 0.00000 3.87255 0.00000 5.16766 0.00000 5.16766 0.00000 10.47206 0.00000 10.47206 0.00000 13.10164 0.00000 13.10164 0.00000 17.50198 0.00000 17.50198 0.00000 18.71113 + 12 0.5000000 0.2500000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.86017 2.00000 -7.86017 2.00000 -4.05567 2.00000 -4.05567 0.00000 4.17009 0.00000 4.17009 0.00000 4.85206 0.00000 4.85206 0.00000 10.47211 0.00000 10.47211 0.00000 13.10978 0.00000 13.10978 0.00000 17.47993 0.00000 17.47993 0.00000 19.08929 diff --git a/tests/test_data/aims/static-si-bs/band1003.out b/tests/test_data/aims/static-si-bs/band1003.out new file mode 100644 index 0000000000..fbd331a3c3 --- /dev/null +++ b/tests/test_data/aims/static-si-bs/band1003.out @@ -0,0 +1,8 @@ + 1 0.5000000 0.2500000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.86017 2.00000 -7.86017 2.00000 -4.05567 2.00000 -4.05567 0.00000 4.17009 0.00000 4.17009 0.00000 4.85206 0.00000 4.85206 0.00000 10.47211 0.00000 10.47211 0.00000 13.10978 0.00000 13.10978 0.00000 17.47993 0.00000 17.47993 0.00000 19.08929 + 2 0.4821429 0.2678571 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89919 2.00000 -133.89890 2.00000 -89.92640 2.00000 -89.92630 2.00000 -89.91585 2.00000 -89.91501 2.00000 -89.90454 2.00000 -89.90444 2.00000 -8.01305 2.00000 -7.71499 2.00000 -4.17175 2.00000 -3.90010 0.00000 3.70418 0.00000 4.21862 0.00000 5.08330 0.00000 5.08473 0.00000 10.14280 0.00000 10.70656 0.00000 12.84174 0.00000 13.45786 0.00000 17.16867 0.00000 17.74004 0.00000 18.67934 + 3 0.4642857 0.2857143 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89931 2.00000 -133.89877 2.00000 -89.92644 2.00000 -89.92623 2.00000 -89.91623 2.00000 -89.91463 2.00000 -89.90461 2.00000 -89.90440 2.00000 -8.14274 2.00000 -7.60709 2.00000 -4.27184 2.00000 -3.68658 0.00000 3.06739 0.00000 4.18294 0.00000 5.43489 0.00000 5.54836 0.00000 9.77738 0.00000 10.71120 0.00000 12.78277 0.00000 13.83772 0.00000 16.86639 0.00000 17.87948 0.00000 18.12599 + 4 0.4464286 0.3035714 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89942 2.00000 -133.89867 2.00000 -89.92648 2.00000 -89.92616 2.00000 -89.91656 2.00000 -89.91429 2.00000 -89.90468 2.00000 -89.90437 2.00000 -8.24906 2.00000 -7.53192 2.00000 -4.35493 2.00000 -3.43008 0.00000 2.45692 0.00000 4.12870 0.00000 5.83393 0.00000 6.05997 0.00000 9.38655 0.00000 10.44047 0.00000 12.98925 0.00000 14.23490 0.00000 16.59162 0.00000 17.54924 0.00000 17.82225 + 5 0.4285714 0.3214286 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89950 2.00000 -133.89859 2.00000 -89.92650 2.00000 -89.92609 2.00000 -89.91684 2.00000 -89.91402 2.00000 -89.90474 2.00000 -89.90434 2.00000 -8.33189 2.00000 -7.48284 2.00000 -4.42026 2.00000 -3.15473 0.00000 1.91064 0.00000 4.07829 0.00000 6.25546 0.00000 6.59620 0.00000 8.97769 0.00000 9.99346 0.00000 13.37255 0.00000 14.63678 0.00000 16.31987 0.00000 17.01486 0.00000 17.53435 + 6 0.4107143 0.3392857 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89956 2.00000 -133.89853 2.00000 -89.92652 2.00000 -89.92603 2.00000 -89.91705 2.00000 -89.91381 2.00000 -89.90480 2.00000 -89.90432 2.00000 -8.39113 2.00000 -7.45318 2.00000 -4.46728 2.00000 -2.89613 0.00000 1.46236 0.00000 4.03942 0.00000 6.68500 0.00000 7.14906 0.00000 8.55918 0.00000 9.46557 0.00000 13.84630 0.00000 15.02497 0.00000 15.95864 0.00000 16.63085 0.00000 17.17072 + 7 0.3928571 0.3571429 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89960 2.00000 -133.89849 2.00000 -89.92654 2.00000 -89.92600 2.00000 -89.91717 2.00000 -89.91368 2.00000 -89.90483 2.00000 -89.90431 2.00000 -8.42669 2.00000 -7.43760 2.00000 -4.49563 2.00000 -2.70361 0.00000 1.15780 0.00000 4.01521 0.00000 7.09996 0.00000 7.70839 0.00000 8.15138 0.00000 8.90965 0.00000 14.36736 0.00000 15.35565 0.00000 15.46343 0.00000 16.45092 0.00000 16.84713 + 8 0.3750000 0.3750000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89961 2.00000 -133.89848 2.00000 -89.92654 2.00000 -89.92599 2.00000 -89.91722 2.00000 -89.91364 2.00000 -89.90485 2.00000 -89.90431 2.00000 -8.43855 2.00000 -7.43279 2.00000 -4.50510 2.00000 -2.63086 0.00000 1.04802 0.00000 4.00701 0.00000 7.35679 0.00000 7.89701 0.00000 8.14738 0.00000 8.47017 0.00000 14.87484 0.00000 14.95523 0.00000 15.50658 0.00000 16.40147 0.00000 16.69799 diff --git a/tests/test_data/aims/static-si-bs/band1004.out b/tests/test_data/aims/static-si-bs/band1004.out new file mode 100644 index 0000000000..e5f37139cf --- /dev/null +++ b/tests/test_data/aims/static-si-bs/band1004.out @@ -0,0 +1,25 @@ + 1 0.3750000 0.3750000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89961 2.00000 -133.89848 2.00000 -89.92654 2.00000 -89.92599 2.00000 -89.91722 2.00000 -89.91364 2.00000 -89.90485 2.00000 -89.90431 2.00000 -8.43855 2.00000 -7.43279 2.00000 -4.50510 2.00000 -2.63086 0.00000 1.04802 0.00000 4.00701 0.00000 7.35679 0.00000 7.89701 0.00000 8.14738 0.00000 8.47017 0.00000 14.87484 0.00000 14.95523 0.00000 15.50658 0.00000 16.40147 0.00000 16.69799 + 2 0.3593750 0.3593750 0.7187500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89975 2.00000 -133.89834 2.00000 -89.92654 2.00000 -89.92589 2.00000 -89.91761 2.00000 -89.91324 2.00000 -89.90494 2.00000 -89.90431 2.00000 -8.59249 2.00000 -7.27646 2.00000 -4.58879 2.00000 -2.52141 0.00000 1.17490 0.00000 4.65413 0.00000 6.97080 0.00000 7.50265 0.00000 7.84102 0.00000 8.14104 0.00000 15.14397 0.00000 15.28399 0.00000 15.96427 0.00000 15.98874 0.00000 16.64272 + 3 0.3437500 0.3437500 0.6875000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89990 2.00000 -133.89819 2.00000 -89.92652 2.00000 -89.92579 2.00000 -89.91803 2.00000 -89.91282 2.00000 -89.90503 2.00000 -89.90432 2.00000 -8.77270 2.00000 -7.10205 2.00000 -4.62141 2.00000 -2.40149 0.00000 1.31376 0.00000 5.30529 0.00000 6.59586 0.00000 7.13961 0.00000 7.54197 0.00000 7.82896 0.00000 15.26102 0.00000 15.60143 0.00000 15.74120 0.00000 16.32187 0.00000 16.41579 + 4 0.3281250 0.3281250 0.6562500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90007 2.00000 -133.89802 2.00000 -89.92649 2.00000 -89.92569 2.00000 -89.91846 2.00000 -89.91240 2.00000 -89.90514 2.00000 -89.90435 2.00000 -8.97484 2.00000 -6.90967 2.00000 -4.60545 2.00000 -2.27203 0.00000 1.46328 0.00000 5.90088 0.00000 6.23341 0.00000 6.86384 0.00000 7.25361 0.00000 7.53631 0.00000 15.00647 0.00000 15.85660 0.00000 15.90634 0.00000 15.94088 0.00000 16.86025 + 5 0.3125000 0.3125000 0.6250000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90024 2.00000 -133.89785 2.00000 -89.92644 2.00000 -89.92558 2.00000 -89.91889 2.00000 -89.91197 2.00000 -89.90525 2.00000 -89.90441 2.00000 -9.19343 2.00000 -6.69945 2.00000 -4.54515 2.00000 -2.13415 0.00000 1.62178 0.00000 5.88451 0.00000 6.10806 0.00000 6.97901 0.00000 7.00395 0.00000 7.26535 0.00000 14.65277 0.00000 15.55640 0.00000 15.92463 0.00000 16.19682 0.00000 16.77610 + 6 0.2968750 0.2968750 0.5937500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90042 2.00000 -133.89767 2.00000 -89.92636 2.00000 -89.92546 2.00000 -89.91932 2.00000 -89.91153 2.00000 -89.90536 2.00000 -89.90448 2.00000 -9.42275 2.00000 -6.47153 2.00000 -4.44541 2.00000 -1.98916 0.00000 1.78710 0.00000 5.54999 0.00000 5.88240 0.00000 6.72116 0.00000 7.01827 0.00000 7.59891 0.00000 14.30063 0.00000 15.18637 0.00000 15.45353 0.00000 16.46952 0.00000 16.74185 + 7 0.2812500 0.2812500 0.5625000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90060 2.00000 -133.89749 2.00000 -89.92627 2.00000 -89.92534 2.00000 -89.91974 2.00000 -89.91111 2.00000 -89.90548 2.00000 -89.90457 2.00000 -9.65753 2.00000 -6.22609 2.00000 -4.31106 2.00000 -1.83861 0.00000 1.95646 0.00000 5.23051 0.00000 5.58578 0.00000 6.48317 0.00000 6.79730 0.00000 8.27894 0.00000 13.96183 0.00000 14.72189 0.00000 14.84113 0.00000 16.71887 0.00000 16.99076 + 8 0.2656250 0.2656250 0.5312500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90079 2.00000 -133.89730 2.00000 -89.92616 2.00000 -89.92522 2.00000 -89.92016 2.00000 -89.91069 2.00000 -89.90560 2.00000 -89.90469 2.00000 -9.89323 2.00000 -5.96334 2.00000 -4.14643 2.00000 -1.68424 0.00000 2.12626 0.00000 4.92660 0.00000 5.28649 0.00000 6.26840 0.00000 6.60468 0.00000 8.96313 0.00000 13.62462 0.00000 13.97380 0.00000 14.53169 0.00000 16.93606 0.00000 17.29450 + 9 0.2500000 0.2500000 0.5000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90098 2.00000 -133.89711 2.00000 -89.92603 2.00000 -89.92510 2.00000 -89.92056 2.00000 -89.91028 2.00000 -89.90572 2.00000 -89.90482 2.00000 -10.12610 2.00000 -5.68350 2.00000 -3.95534 2.00000 -1.52805 0.00000 2.29197 0.00000 4.63871 0.00000 4.99667 0.00000 6.08051 0.00000 6.44267 0.00000 9.61779 0.00000 13.10807 0.00000 13.42882 0.00000 14.27462 0.00000 17.10801 0.00000 17.44760 + 10 0.2343750 0.2343750 0.4687500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90117 2.00000 -133.89692 2.00000 -89.92588 2.00000 -89.92498 2.00000 -89.92095 2.00000 -89.90989 2.00000 -89.90585 2.00000 -89.90496 2.00000 -10.35316 2.00000 -5.38686 2.00000 -3.74108 2.00000 -1.37226 0.00000 2.44801 0.00000 4.36721 0.00000 4.71984 0.00000 5.92337 0.00000 6.31345 0.00000 10.20215 0.00000 12.37826 0.00000 13.13231 0.00000 14.09656 0.00000 16.86802 0.00000 17.21666 + 11 0.2187500 0.2187500 0.4375000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90135 2.00000 -133.89674 2.00000 -89.92572 2.00000 -89.92486 2.00000 -89.92132 2.00000 -89.90952 2.00000 -89.90597 2.00000 -89.90512 2.00000 -10.57199 2.00000 -5.07375 2.00000 -3.50658 2.00000 -1.21924 0.00000 2.58799 0.00000 4.11242 0.00000 4.45735 0.00000 5.80054 0.00000 6.21897 0.00000 10.65690 0.00000 11.64203 0.00000 12.88380 0.00000 14.03129 0.00000 16.33454 0.00000 17.23976 + 12 0.2031250 0.2031250 0.4062500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90154 2.00000 -133.89655 2.00000 -89.92554 2.00000 -89.92474 2.00000 -89.92167 2.00000 -89.90918 2.00000 -89.90609 2.00000 -89.90529 2.00000 -10.78072 2.00000 -4.74456 2.00000 -3.25451 2.00000 -1.07147 0.00000 2.70535 0.00000 3.87459 0.00000 4.20972 0.00000 5.71404 0.00000 6.16075 0.00000 10.91961 0.00000 10.92406 0.00000 12.66424 0.00000 14.07639 0.00000 15.92357 0.00000 17.15475 + 13 0.1875000 0.1875000 0.3750000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90171 2.00000 -133.89637 2.00000 -89.92536 2.00000 -89.92462 2.00000 -89.92199 2.00000 -89.90885 2.00000 -89.90620 2.00000 -89.90547 2.00000 -10.97783 2.00000 -4.39981 2.00000 -2.98747 2.00000 -0.93137 0.00000 2.79462 0.00000 3.65393 0.00000 3.97710 0.00000 5.66217 0.00000 6.13970 0.00000 10.23337 0.00000 10.97387 0.00000 12.47125 0.00000 14.09110 0.00000 15.80066 0.00000 16.94643 + 14 0.1718750 0.1718750 0.3437500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90189 2.00000 -133.89620 2.00000 -89.92518 2.00000 -89.92451 2.00000 -89.92229 2.00000 -89.90855 2.00000 -89.90631 2.00000 -89.90566 2.00000 -11.16214 2.00000 -4.04011 2.00000 -2.70810 2.00000 -0.80117 0.00000 2.85297 0.00000 3.45060 0.00000 3.75943 0.00000 5.63656 0.00000 6.15589 0.00000 9.57998 0.00000 10.86375 0.00000 12.30419 0.00000 13.90156 0.00000 16.10224 0.00000 16.61469 + 15 0.1562500 0.1562500 0.3125000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90205 2.00000 -133.89604 2.00000 -89.92499 2.00000 -89.92441 2.00000 -89.92256 2.00000 -89.90827 2.00000 -89.90642 2.00000 -89.90584 2.00000 -11.33270 2.00000 -3.66630 2.00000 -2.41924 2.00000 -0.68274 0.00000 2.88112 0.00000 3.26472 0.00000 3.55648 0.00000 5.61879 0.00000 6.20864 0.00000 8.97905 0.00000 10.64759 0.00000 12.16260 0.00000 13.57969 0.00000 16.17620 0.00000 16.70372 + 16 0.1406250 0.1406250 0.2812500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90220 2.00000 -133.89589 2.00000 -89.92481 2.00000 -89.92431 2.00000 -89.92281 2.00000 -89.90802 2.00000 -89.90652 2.00000 -89.90602 2.00000 -11.48874 2.00000 -3.27948 2.00000 -2.12409 2.00000 -0.57742 0.00000 2.88301 0.00000 3.09637 0.00000 3.36789 0.00000 5.57767 0.00000 6.29654 0.00000 8.45452 0.00000 10.36846 0.00000 12.04580 0.00000 13.23661 0.00000 15.65860 0.00000 17.45608 + 17 0.1250000 0.1250000 0.2500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90234 2.00000 -133.89574 2.00000 -89.92463 2.00000 -89.92421 2.00000 -89.92303 2.00000 -89.90780 2.00000 -89.90661 2.00000 -89.90619 2.00000 -11.62963 2.00000 -2.88119 2.00000 -1.82641 2.00000 -0.48596 0.00000 2.86434 0.00000 2.94563 0.00000 3.19326 0.00000 5.47065 0.00000 6.41756 0.00000 8.03974 0.00000 10.05544 0.00000 11.95282 0.00000 12.91818 0.00000 15.09270 0.00000 18.28920 + 18 0.1093750 0.1093750 0.2187500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90247 2.00000 -133.89562 2.00000 -89.92446 2.00000 -89.92413 2.00000 -89.92322 2.00000 -89.90760 2.00000 -89.90669 2.00000 -89.90636 2.00000 -11.75490 2.00000 -2.47363 2.00000 -1.53073 2.00000 -0.40847 0.00000 2.81253 0.00000 2.83094 0.00000 3.03218 0.00000 5.25997 0.00000 6.56887 0.00000 7.76364 0.00000 9.73062 0.00000 11.88234 0.00000 12.63939 0.00000 14.50736 0.00000 19.17050 + 19 0.0937500 0.0937500 0.1875000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90258 2.00000 -133.89550 2.00000 -89.92431 2.00000 -89.92406 2.00000 -89.92339 2.00000 -89.90743 2.00000 -89.90676 2.00000 -89.90651 2.00000 -11.86412 2.00000 -2.06010 2.00000 -1.24266 2.00000 -0.34452 0.00000 2.69711 0.00000 2.78749 0.00000 2.88439 0.00000 4.94237 0.00000 6.74625 0.00000 7.62319 0.00000 9.41305 0.00000 11.83264 0.00000 12.40351 0.00000 13.92771 0.00000 20.08148 + 20 0.0781250 0.0781250 0.1562500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90267 2.00000 -133.89541 2.00000 -89.92417 2.00000 -89.92399 2.00000 -89.92353 2.00000 -89.90729 2.00000 -89.90682 2.00000 -89.90664 2.00000 -11.95699 2.00000 -1.64578 2.00000 -0.96923 2.00000 -0.29325 0.00000 2.59941 0.00000 2.73655 0.00000 2.75012 0.00000 4.55390 0.00000 6.94322 0.00000 7.58058 0.00000 9.11988 0.00000 11.80143 0.00000 12.20943 0.00000 13.37543 0.00000 21.00811 + 21 0.0625000 0.0625000 0.1250000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90275 2.00000 -133.89532 2.00000 -89.92406 2.00000 -89.92394 2.00000 -89.92364 2.00000 -89.90717 2.00000 -89.90688 2.00000 -89.90676 2.00000 -12.03325 2.00000 -1.23927 2.00000 -0.71922 2.00000 -0.25355 0.00000 2.51944 0.00000 2.63050 0.00000 2.67760 0.00000 4.14423 0.00000 7.14974 0.00000 7.59163 0.00000 8.86612 0.00000 11.78561 0.00000 12.05470 0.00000 12.87054 0.00000 21.93531 + 22 0.0468750 0.0468750 0.0937500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90281 2.00000 -133.89526 2.00000 -89.92397 2.00000 -89.92390 2.00000 -89.92373 2.00000 -89.90709 2.00000 -89.90692 2.00000 -89.90685 2.00000 -12.09271 2.00000 -0.85539 2.00000 -0.50350 2.00000 -0.22422 0.00000 2.45722 0.00000 2.52816 0.00000 2.60597 0.00000 3.76244 0.00000 7.35079 0.00000 7.62401 0.00000 8.66350 0.00000 11.78114 0.00000 11.93691 0.00000 12.43400 0.00000 22.17468 + 23 0.0312500 0.0312500 0.0625000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90286 2.00000 -133.89521 2.00000 -89.92390 2.00000 -89.92387 2.00000 -89.92379 2.00000 -89.90702 2.00000 -89.90695 2.00000 -89.90692 2.00000 -12.13524 2.00000 -0.52057 2.00000 -0.33477 2.00000 -0.20417 0.00000 2.41277 0.00000 2.44774 0.00000 2.51590 0.00000 3.45854 0.00000 7.52516 0.00000 7.65786 0.00000 8.51898 0.00000 11.78319 0.00000 11.85410 0.00000 12.09013 0.00000 22.15532 + 24 0.0156250 0.0156250 0.0312500 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90288 2.00000 -133.89519 2.00000 -89.92386 2.00000 -89.92385 2.00000 -89.92383 2.00000 -89.90698 2.00000 -89.90697 2.00000 -89.90696 2.00000 -12.16078 2.00000 -0.27925 2.00000 -0.22627 2.00000 -0.19252 0.00000 2.38610 0.00000 2.39546 0.00000 2.42144 0.00000 3.27290 0.00000 7.64658 0.00000 7.68194 0.00000 8.43394 0.00000 11.78692 0.00000 11.80493 0.00000 11.86666 0.00000 22.08133 + 25 0.0000000 0.0000000 0.0000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90289 2.00000 -133.89518 2.00000 -89.92384 2.00000 -89.92384 2.00000 -89.92384 2.00000 -89.90697 2.00000 -89.90697 2.00000 -89.90697 2.00000 -12.16929 2.00000 -0.18870 2.00000 -0.18870 2.00000 -0.18870 0.00000 2.37720 0.00000 2.37720 0.00000 2.37720 0.00000 3.21314 0.00000 7.69054 0.00000 7.69054 0.00000 8.40613 0.00000 11.78863 0.00000 11.78863 0.00000 11.78863 0.00000 22.04643 diff --git a/tests/test_data/aims/static-si-bs/band1005.out b/tests/test_data/aims/static-si-bs/band1005.out new file mode 100644 index 0000000000..6f887f550c --- /dev/null +++ b/tests/test_data/aims/static-si-bs/band1005.out @@ -0,0 +1,20 @@ + 1 0.0000000 0.0000000 0.0000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90289 2.00000 -133.89518 2.00000 -89.92384 2.00000 -89.92384 2.00000 -89.92384 2.00000 -89.90697 2.00000 -89.90697 2.00000 -89.90697 2.00000 -12.16929 2.00000 -0.18870 2.00000 -0.18870 2.00000 -0.18870 0.00000 2.37720 0.00000 2.37720 0.00000 2.37720 0.00000 3.21314 0.00000 7.69054 0.00000 7.69054 0.00000 8.40613 0.00000 11.78863 0.00000 11.78863 0.00000 11.78863 0.00000 22.04643 + 2 0.0263158 0.0263158 0.0263158 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90288 2.00000 -133.89519 2.00000 -89.92385 2.00000 -89.92385 2.00000 -89.92383 2.00000 -89.90698 2.00000 -89.90696 2.00000 -89.90696 2.00000 -12.16023 2.00000 -0.29651 2.00000 -0.20466 2.00000 -0.20466 0.00000 2.40047 0.00000 2.40047 0.00000 2.40518 0.00000 3.27752 0.00000 7.66259 0.00000 7.66259 0.00000 8.43574 0.00000 11.76474 0.00000 11.84986 0.00000 11.84986 0.00000 22.08261 + 3 0.0526316 0.0526316 0.0526316 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90286 2.00000 -133.89522 2.00000 -89.92388 2.00000 -89.92388 2.00000 -89.92380 2.00000 -89.90701 2.00000 -89.90694 2.00000 -89.90694 2.00000 -12.13307 2.00000 -0.58245 2.00000 -0.25043 2.00000 -0.25043 0.00000 2.44202 0.00000 2.46746 0.00000 2.46746 0.00000 3.48165 0.00000 7.58535 0.00000 7.58535 0.00000 8.52651 0.00000 11.69664 0.00000 12.02710 0.00000 12.02710 0.00000 22.14416 + 4 0.0789474 0.0789474 0.0789474 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90281 2.00000 -133.89527 2.00000 -89.92392 2.00000 -89.92392 2.00000 -89.92375 2.00000 -89.90707 2.00000 -89.90689 2.00000 -89.90689 2.00000 -12.08786 2.00000 -0.97806 2.00000 -0.32050 2.00000 -0.32050 0.00000 2.43456 0.00000 2.57061 0.00000 2.57061 0.00000 3.81412 0.00000 7.47552 0.00000 7.47552 0.00000 8.68053 0.00000 11.59487 0.00000 12.30417 0.00000 12.30417 0.00000 22.08034 + 5 0.1052632 0.1052632 0.1052632 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90274 2.00000 -133.89533 2.00000 -89.92399 2.00000 -89.92399 2.00000 -89.92368 2.00000 -89.90714 2.00000 -89.90683 2.00000 -89.90683 2.00000 -12.02468 2.00000 -1.43234 2.00000 -0.40794 2.00000 -0.40794 0.00000 2.38334 0.00000 2.69938 0.00000 2.69938 0.00000 4.22888 0.00000 7.35358 0.00000 7.35358 0.00000 8.89302 0.00000 11.47720 0.00000 12.66112 0.00000 12.66112 0.00000 21.76592 + 6 0.1315790 0.1315790 0.1315790 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90266 2.00000 -133.89542 2.00000 -89.92406 2.00000 -89.92406 2.00000 -89.92359 2.00000 -89.90723 2.00000 -89.90676 2.00000 -89.90676 2.00000 -11.94374 2.00000 -1.91572 2.00000 -0.50605 2.00000 -0.50605 0.00000 2.30439 0.00000 2.84183 0.00000 2.84183 0.00000 4.68648 0.00000 7.23941 0.00000 7.23941 0.00000 9.14591 0.00000 11.37102 0.00000 13.07800 0.00000 13.07800 0.00000 21.27480 + 7 0.1578947 0.1578947 0.1578947 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90256 2.00000 -133.89552 2.00000 -89.92415 2.00000 -89.92415 2.00000 -89.92349 2.00000 -89.90733 2.00000 -89.90667 2.00000 -89.90667 2.00000 -11.84532 2.00000 -2.41151 2.00000 -0.60919 2.00000 -0.60919 0.00000 2.21007 0.00000 2.98552 0.00000 2.98552 0.00000 5.16407 0.00000 7.15077 0.00000 7.15077 0.00000 9.40068 0.00000 11.32001 0.00000 13.53528 0.00000 13.53528 0.00000 20.70880 + 8 0.1842105 0.1842105 0.1842105 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90244 2.00000 -133.89564 2.00000 -89.92424 2.00000 -89.92424 2.00000 -89.92337 2.00000 -89.90745 2.00000 -89.90658 2.00000 -89.90658 2.00000 -11.72980 2.00000 -2.90970 2.00000 -0.71299 2.00000 -0.71299 0.00000 2.10851 0.00000 3.11818 0.00000 3.11818 0.00000 5.64925 0.00000 7.10313 0.00000 7.10313 0.00000 9.59514 0.00000 11.38831 0.00000 14.01156 0.00000 14.01156 0.00000 20.11643 + 9 0.2105263 0.2105263 0.2105263 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90231 2.00000 -133.89577 2.00000 -89.92434 2.00000 -89.92434 2.00000 -89.92325 2.00000 -89.90759 2.00000 -89.90648 2.00000 -89.90648 2.00000 -11.59773 2.00000 -3.40380 2.00000 -0.81423 2.00000 -0.81423 0.00000 2.00523 0.00000 3.22882 0.00000 3.22882 0.00000 6.13491 0.00000 7.10944 0.00000 7.10944 0.00000 9.67571 0.00000 11.62899 0.00000 14.47864 0.00000 14.47864 0.00000 19.51942 + 10 0.2368421 0.2368421 0.2368421 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90217 2.00000 -133.89591 2.00000 -89.92444 2.00000 -89.92444 2.00000 -89.92311 2.00000 -89.90773 2.00000 -89.90638 2.00000 -89.90638 2.00000 -11.44982 2.00000 -3.88918 2.00000 -0.91056 2.00000 -0.91056 0.00000 1.90410 0.00000 3.30939 0.00000 3.30939 0.00000 6.61595 0.00000 7.17916 0.00000 7.17916 0.00000 9.65229 0.00000 12.02982 0.00000 14.89150 0.00000 14.89150 0.00000 18.93058 + 11 0.2631579 0.2631579 0.2631579 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90202 2.00000 -133.89607 2.00000 -89.92455 2.00000 -89.92455 2.00000 -89.92297 2.00000 -89.90787 2.00000 -89.90628 2.00000 -89.90628 2.00000 -11.28708 2.00000 -4.36213 2.00000 -1.00029 2.00000 -1.00029 0.00000 1.80787 0.00000 3.35659 0.00000 3.35659 0.00000 7.08645 0.00000 7.31702 0.00000 7.31702 0.00000 9.57617 0.00000 12.53547 0.00000 15.17186 0.00000 15.17186 0.00000 18.36185 + 12 0.2894737 0.2894737 0.2894737 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90186 2.00000 -133.89622 2.00000 -89.92465 2.00000 -89.92465 2.00000 -89.92284 2.00000 -89.90802 2.00000 -89.90618 2.00000 -89.90618 2.00000 -11.11088 2.00000 -4.81935 2.00000 -1.08227 2.00000 -1.08227 0.00000 1.71852 0.00000 3.37235 0.00000 3.37235 0.00000 7.52260 0.00000 7.52260 0.00000 7.53560 0.00000 9.49541 0.00000 13.09171 0.00000 15.21321 0.00000 15.21321 0.00000 17.83064 + 13 0.3157895 0.3157895 0.3157895 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90170 2.00000 -133.89638 2.00000 -89.92474 2.00000 -89.92474 2.00000 -89.92270 2.00000 -89.90816 2.00000 -89.90608 2.00000 -89.90608 2.00000 -10.92321 2.00000 -5.25741 2.00000 -1.15566 2.00000 -1.15566 0.00000 1.63748 0.00000 3.36276 0.00000 3.36276 0.00000 7.79137 0.00000 7.79137 0.00000 7.93944 0.00000 9.45518 0.00000 13.64291 0.00000 14.97259 0.00000 14.97259 0.00000 17.37098 + 14 0.3421053 0.3421053 0.3421053 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90155 2.00000 -133.89654 2.00000 -89.92483 2.00000 -89.92483 2.00000 -89.92257 2.00000 -89.90829 2.00000 -89.90599 2.00000 -89.90599 2.00000 -10.72695 2.00000 -5.67237 2.00000 -1.21992 2.00000 -1.21992 0.00000 1.56579 0.00000 3.33591 0.00000 3.33591 0.00000 8.11647 0.00000 8.11647 0.00000 8.24933 0.00000 9.51510 0.00000 14.10271 0.00000 14.52884 0.00000 14.52884 0.00000 17.05718 + 15 0.3684210 0.3684210 0.3684210 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90139 2.00000 -133.89669 2.00000 -89.92491 2.00000 -89.92491 2.00000 -89.92245 2.00000 -89.90841 2.00000 -89.90592 2.00000 -89.90592 2.00000 -10.52646 2.00000 -6.05905 2.00000 -1.27466 2.00000 -1.27466 0.00000 1.50419 0.00000 3.29992 0.00000 3.29992 0.00000 8.41583 0.00000 8.49039 0.00000 8.49039 0.00000 9.72938 0.00000 13.98200 0.00000 13.98200 0.00000 14.33241 0.00000 17.02136 + 16 0.3947369 0.3947369 0.3947369 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90126 2.00000 -133.89683 2.00000 -89.92498 2.00000 -89.92498 2.00000 -89.92235 2.00000 -89.90852 2.00000 -89.90585 2.00000 -89.90585 2.00000 -10.32843 2.00000 -6.41016 2.00000 -1.31966 2.00000 -1.31966 0.00000 1.45323 0.00000 3.26180 0.00000 3.26180 0.00000 8.46316 0.00000 8.90568 0.00000 8.90568 0.00000 10.07354 0.00000 13.39361 0.00000 13.39361 0.00000 14.25190 0.00000 17.34120 + 17 0.4210526 0.4210526 0.4210526 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90114 2.00000 -133.89695 2.00000 -89.92503 2.00000 -89.92503 2.00000 -89.92226 2.00000 -89.90861 2.00000 -89.90580 2.00000 -89.90580 2.00000 -10.14318 2.00000 -6.71491 2.00000 -1.35476 2.00000 -1.35476 0.00000 1.41328 0.00000 3.22704 0.00000 3.22704 0.00000 8.45599 0.00000 9.35456 0.00000 9.35456 0.00000 10.47605 0.00000 12.79701 0.00000 12.79701 0.00000 13.96268 0.00000 17.91741 + 18 0.4473684 0.4473684 0.4473684 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90105 2.00000 -133.89704 2.00000 -89.92507 2.00000 -89.92507 2.00000 -89.92220 2.00000 -89.90867 2.00000 -89.90576 2.00000 -89.90576 2.00000 -9.98611 2.00000 -6.95756 2.00000 -1.37987 2.00000 -1.37987 0.00000 1.38458 0.00000 3.19960 0.00000 3.19960 0.00000 8.43467 0.00000 9.82592 0.00000 9.82592 0.00000 10.87660 0.00000 12.21509 0.00000 12.21509 0.00000 13.60434 0.00000 18.62077 + 19 0.4736842 0.4736842 0.4736842 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90099 2.00000 -133.89709 2.00000 -89.92510 2.00000 -89.92510 2.00000 -89.92216 2.00000 -89.90871 2.00000 -89.90573 2.00000 -89.90573 2.00000 -9.87775 2.00000 -7.11736 2.00000 -1.39495 2.00000 -1.39495 0.00000 1.36731 0.00000 3.18213 0.00000 3.18213 0.00000 8.41708 0.00000 10.28907 0.00000 10.28907 0.00000 11.20541 0.00000 11.68403 0.00000 11.68403 0.00000 13.28973 0.00000 19.35758 + 20 0.5000000 0.5000000 0.5000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90097 2.00000 -133.89711 2.00000 -89.92510 2.00000 -89.92510 2.00000 -89.92215 2.00000 -89.90873 2.00000 -89.90573 2.00000 -89.90573 2.00000 -9.83858 2.00000 -7.17368 2.00000 -1.39998 2.00000 -1.39998 0.00000 1.36154 0.00000 3.17615 0.00000 3.17615 0.00000 8.41055 0.00000 10.56281 0.00000 10.56281 0.00000 11.34414 0.00000 11.38743 0.00000 11.38743 0.00000 13.15425 0.00000 19.83777 diff --git a/tests/test_data/aims/static-si-bs/band1006.out b/tests/test_data/aims/static-si-bs/band1006.out new file mode 100644 index 0000000000..e7f210d219 --- /dev/null +++ b/tests/test_data/aims/static-si-bs/band1006.out @@ -0,0 +1,14 @@ + 1 0.5000000 0.5000000 0.5000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90097 2.00000 -133.89711 2.00000 -89.92510 2.00000 -89.92510 2.00000 -89.92215 2.00000 -89.90873 2.00000 -89.90573 2.00000 -89.90573 2.00000 -9.83858 2.00000 -7.17368 2.00000 -1.39998 2.00000 -1.39998 0.00000 1.36154 0.00000 3.17615 0.00000 3.17615 0.00000 8.41055 0.00000 10.56281 0.00000 10.56281 0.00000 11.34414 0.00000 11.38743 0.00000 11.38743 0.00000 13.15425 0.00000 19.83777 + 2 0.5096154 0.4807692 0.5096154 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90096 2.00000 -133.89712 2.00000 -89.92515 2.00000 -89.92511 2.00000 -89.92208 2.00000 -89.90880 2.00000 -89.90572 2.00000 -89.90568 2.00000 -9.82887 2.00000 -7.16855 2.00000 -1.49127 2.00000 -1.41813 0.00000 1.44577 0.00000 3.16159 0.00000 3.21458 0.00000 8.43235 0.00000 10.25916 0.00000 10.45830 0.00000 11.36061 0.00000 11.50477 0.00000 11.66736 0.00000 13.22172 0.00000 19.82804 + 3 0.5192308 0.4615385 0.5192308 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90093 2.00000 -133.89716 2.00000 -89.92526 2.00000 -89.92514 2.00000 -89.92188 2.00000 -89.90899 2.00000 -89.90569 2.00000 -89.90557 2.00000 -9.79975 2.00000 -7.15347 2.00000 -1.73344 2.00000 -1.47057 0.00000 1.65677 0.00000 3.13303 0.00000 3.32786 0.00000 8.47777 0.00000 9.77117 0.00000 10.23696 0.00000 11.33344 0.00000 11.76415 0.00000 12.17792 0.00000 13.42223 0.00000 19.79740 + 4 0.5288462 0.4423077 0.5288462 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90088 2.00000 -133.89721 2.00000 -89.92542 2.00000 -89.92519 2.00000 -89.92159 2.00000 -89.90928 2.00000 -89.90564 2.00000 -89.90542 2.00000 -9.75132 2.00000 -7.12949 2.00000 -2.06678 2.00000 -1.55201 0.00000 1.89568 0.00000 3.14303 0.00000 3.51053 0.00000 8.46320 0.00000 9.34728 0.00000 9.98669 0.00000 11.33111 0.00000 12.07628 0.00000 12.67364 0.00000 13.75537 0.00000 19.74095 + 5 0.5384615 0.4230769 0.5384615 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90081 2.00000 -133.89728 2.00000 -89.92560 2.00000 -89.92525 2.00000 -89.92122 2.00000 -89.90965 2.00000 -89.90558 2.00000 -89.90524 2.00000 -9.68374 2.00000 -7.09851 2.00000 -2.44421 2.00000 -1.65527 0.00000 2.04124 0.00000 3.28302 0.00000 3.75516 0.00000 8.22568 0.00000 9.13909 0.00000 9.73592 0.00000 11.40360 0.00000 12.41043 0.00000 13.10550 0.00000 14.21501 0.00000 19.64904 + 6 0.5480769 0.4038462 0.5480769 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90072 2.00000 -133.89737 2.00000 -89.92579 2.00000 -89.92532 2.00000 -89.92080 2.00000 -89.91006 2.00000 -89.90551 2.00000 -89.90506 2.00000 -9.59727 2.00000 -7.06360 2.00000 -2.83585 2.00000 -1.77288 0.00000 2.03762 0.00000 3.59658 0.00000 4.05383 0.00000 7.79104 0.00000 9.08826 0.00000 9.49424 0.00000 11.59552 0.00000 12.75404 0.00000 13.47582 0.00000 14.76921 0.00000 19.50701 + 7 0.5576923 0.3846154 0.5576923 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90061 2.00000 -133.89748 2.00000 -89.92596 2.00000 -89.92540 2.00000 -89.92034 2.00000 -89.91051 2.00000 -89.90543 2.00000 -89.90488 2.00000 -9.49232 2.00000 -7.02940 2.00000 -3.22170 2.00000 -1.89805 0.00000 1.93713 0.00000 4.02769 0.00000 4.39901 0.00000 7.29838 0.00000 9.03957 0.00000 9.26577 0.00000 11.92673 0.00000 13.09947 0.00000 13.80511 0.00000 15.37674 0.00000 19.30124 + 8 0.5673077 0.3653846 0.5673077 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90048 2.00000 -133.89761 2.00000 -89.92612 2.00000 -89.92549 2.00000 -89.91986 2.00000 -89.91099 2.00000 -89.90534 2.00000 -89.90473 2.00000 -9.36947 2.00000 -7.00277 2.00000 -3.58559 2.00000 -2.02508 0.00000 1.79648 0.00000 4.51790 0.00000 4.78392 0.00000 6.80068 0.00000 8.95099 0.00000 9.05293 0.00000 12.38758 0.00000 13.44074 0.00000 14.10517 0.00000 16.00852 0.00000 19.03163 + 9 0.5769231 0.3461538 0.5769231 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90034 2.00000 -133.89775 2.00000 -89.92625 2.00000 -89.92558 2.00000 -89.91937 2.00000 -89.91148 2.00000 -89.90524 2.00000 -89.90459 2.00000 -9.22968 2.00000 -6.99326 2.00000 -3.91175 2.00000 -2.14940 0.00000 1.64476 0.00000 5.02993 0.00000 5.20230 0.00000 6.32297 0.00000 8.82772 0.00000 8.85772 0.00000 12.95429 0.00000 13.77262 0.00000 14.37712 0.00000 16.64474 0.00000 18.71549 + 10 0.5865385 0.3269231 0.5865385 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90019 2.00000 -133.89790 2.00000 -89.92636 2.00000 -89.92568 2.00000 -89.91887 2.00000 -89.91198 2.00000 -89.90515 2.00000 -89.90449 2.00000 -9.07454 2.00000 -7.01274 2.00000 -4.18342 2.00000 -2.26745 0.00000 1.49625 0.00000 5.45314 0.00000 5.64782 0.00000 5.96923 0.00000 8.68276 0.00000 8.68277 0.00000 13.60276 0.00000 14.09036 0.00000 14.61528 0.00000 17.25688 0.00000 18.21848 + 11 0.5961538 0.3076923 0.5961538 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90003 2.00000 -133.89806 2.00000 -89.92644 2.00000 -89.92577 2.00000 -89.91839 2.00000 -89.91247 2.00000 -89.90506 2.00000 -89.90440 2.00000 -8.90692 2.00000 -7.07251 2.00000 -4.38434 2.00000 -2.37648 0.00000 1.35863 0.00000 5.25235 0.00000 6.11244 0.00000 6.27113 0.00000 8.52675 0.00000 8.53289 0.00000 14.31112 0.00000 14.38924 0.00000 14.80923 0.00000 17.48786 0.00000 17.65470 + 12 0.6057692 0.2884615 0.6057692 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89987 2.00000 -133.89822 2.00000 -89.92650 2.00000 -89.92585 2.00000 -89.91793 2.00000 -89.91293 2.00000 -89.90498 2.00000 -89.90434 2.00000 -8.73267 2.00000 -7.17641 2.00000 -4.50362 2.00000 -2.47440 0.00000 1.23643 0.00000 4.83247 0.00000 6.58213 0.00000 6.82118 0.00000 8.36742 0.00000 8.41928 0.00000 14.66312 0.00000 14.92429 0.00000 15.07363 0.00000 16.75742 0.00000 17.42174 + 13 0.6153846 0.2692308 0.6153846 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89972 2.00000 -133.89837 2.00000 -89.92653 2.00000 -89.92592 2.00000 -89.91752 2.00000 -89.91333 2.00000 -89.90491 2.00000 -89.90431 2.00000 -8.56530 2.00000 -7.31093 2.00000 -4.54070 2.00000 -2.55960 0.00000 1.13236 0.00000 4.41113 0.00000 7.02383 0.00000 7.39637 0.00000 8.21341 0.00000 8.37235 0.00000 14.89548 0.00000 14.97015 0.00000 15.81325 0.00000 16.05131 0.00000 17.02556 + 14 0.6250000 0.2500000 0.6250000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89961 2.00000 -133.89848 2.00000 -89.92654 2.00000 -89.92599 2.00000 -89.91722 2.00000 -89.91364 2.00000 -89.90485 2.00000 -89.90431 2.00000 -8.43855 2.00000 -7.43279 2.00000 -4.50510 2.00000 -2.63086 0.00000 1.04802 0.00000 4.00701 0.00000 7.35679 0.00000 7.89701 0.00000 8.14738 0.00000 8.47017 0.00000 14.87484 0.00000 14.95523 0.00000 15.50658 0.00000 16.40147 0.00000 16.69799 diff --git a/tests/test_data/aims/static-si-bs/band1007.out b/tests/test_data/aims/static-si-bs/band1007.out new file mode 100644 index 0000000000..4c51d46561 --- /dev/null +++ b/tests/test_data/aims/static-si-bs/band1007.out @@ -0,0 +1,8 @@ + 1 0.6250000 0.2500000 0.6250000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89961 2.00000 -133.89848 2.00000 -89.92654 2.00000 -89.92599 2.00000 -89.91722 2.00000 -89.91364 2.00000 -89.90485 2.00000 -89.90431 2.00000 -8.43855 2.00000 -7.43279 2.00000 -4.50510 2.00000 -2.63086 0.00000 1.04802 0.00000 4.00701 0.00000 7.35679 0.00000 7.89701 0.00000 8.14738 0.00000 8.47017 0.00000 14.87484 0.00000 14.95523 0.00000 15.50658 0.00000 16.40147 0.00000 16.69799 + 2 0.6071429 0.2500000 0.6428571 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89960 2.00000 -133.89849 2.00000 -89.92654 2.00000 -89.92600 2.00000 -89.91717 2.00000 -89.91368 2.00000 -89.90483 2.00000 -89.90431 2.00000 -8.42669 2.00000 -7.43760 2.00000 -4.49563 2.00000 -2.70361 0.00000 1.15780 0.00000 4.01521 0.00000 7.09996 0.00000 7.70839 0.00000 8.15138 0.00000 8.90965 0.00000 14.36736 0.00000 15.35565 0.00000 15.46343 0.00000 16.45092 0.00000 16.84713 + 3 0.5892857 0.2500000 0.6607143 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89956 2.00000 -133.89853 2.00000 -89.92652 2.00000 -89.92603 2.00000 -89.91705 2.00000 -89.91381 2.00000 -89.90480 2.00000 -89.90432 2.00000 -8.39113 2.00000 -7.45318 2.00000 -4.46728 2.00000 -2.89613 0.00000 1.46236 0.00000 4.03942 0.00000 6.68500 0.00000 7.14906 0.00000 8.55918 0.00000 9.46557 0.00000 13.84630 0.00000 15.02497 0.00000 15.95864 0.00000 16.63085 0.00000 17.17072 + 4 0.5714286 0.2500000 0.6785714 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89950 2.00000 -133.89859 2.00000 -89.92650 2.00000 -89.92609 2.00000 -89.91684 2.00000 -89.91402 2.00000 -89.90474 2.00000 -89.90434 2.00000 -8.33189 2.00000 -7.48284 2.00000 -4.42026 2.00000 -3.15473 0.00000 1.91064 0.00000 4.07829 0.00000 6.25546 0.00000 6.59620 0.00000 8.97769 0.00000 9.99346 0.00000 13.37255 0.00000 14.63678 0.00000 16.31987 0.00000 17.01486 0.00000 17.53435 + 5 0.5535714 0.2500000 0.6964286 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89942 2.00000 -133.89867 2.00000 -89.92648 2.00000 -89.92616 2.00000 -89.91656 2.00000 -89.91429 2.00000 -89.90468 2.00000 -89.90437 2.00000 -8.24906 2.00000 -7.53192 2.00000 -4.35493 2.00000 -3.43008 0.00000 2.45692 0.00000 4.12870 0.00000 5.83393 0.00000 6.05997 0.00000 9.38655 0.00000 10.44047 0.00000 12.98925 0.00000 14.23490 0.00000 16.59162 0.00000 17.54924 0.00000 17.82225 + 6 0.5357143 0.2500000 0.7142857 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89931 2.00000 -133.89877 2.00000 -89.92644 2.00000 -89.92623 2.00000 -89.91623 2.00000 -89.91463 2.00000 -89.90461 2.00000 -89.90440 2.00000 -8.14274 2.00000 -7.60709 2.00000 -4.27184 2.00000 -3.68658 0.00000 3.06739 0.00000 4.18294 0.00000 5.43489 0.00000 5.54836 0.00000 9.77738 0.00000 10.71120 0.00000 12.78277 0.00000 13.83772 0.00000 16.86639 0.00000 17.87948 0.00000 18.12599 + 7 0.5178571 0.2500000 0.7321429 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89919 2.00000 -133.89890 2.00000 -89.92640 2.00000 -89.92630 2.00000 -89.91585 2.00000 -89.91501 2.00000 -89.90454 2.00000 -89.90444 2.00000 -8.01305 2.00000 -7.71499 2.00000 -4.17175 2.00000 -3.90010 0.00000 3.70418 0.00000 4.21862 0.00000 5.08330 0.00000 5.08473 0.00000 10.14280 0.00000 10.70656 0.00000 12.84174 0.00000 13.45786 0.00000 17.16867 0.00000 17.74004 0.00000 18.67934 + 8 0.5000000 0.2500000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.86017 2.00000 -7.86017 2.00000 -4.05567 2.00000 -4.05567 0.00000 4.17009 0.00000 4.17009 0.00000 4.85206 0.00000 4.85206 0.00000 10.47211 0.00000 10.47211 0.00000 13.10978 0.00000 13.10978 0.00000 17.47993 0.00000 17.47993 0.00000 19.08929 diff --git a/tests/test_data/aims/static-si-bs/band1008.out b/tests/test_data/aims/static-si-bs/band1008.out new file mode 100644 index 0000000000..7648a89985 --- /dev/null +++ b/tests/test_data/aims/static-si-bs/band1008.out @@ -0,0 +1,16 @@ + 1 0.5000000 0.2500000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -7.86017 2.00000 -7.86017 2.00000 -4.05567 2.00000 -4.05567 0.00000 4.17009 0.00000 4.17009 0.00000 4.85206 0.00000 4.85206 0.00000 10.47211 0.00000 10.47211 0.00000 13.10978 0.00000 13.10978 0.00000 17.47993 0.00000 17.47993 0.00000 19.08929 + 2 0.5000000 0.2666667 0.7333333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89925 2.00000 -133.89884 2.00000 -89.92641 2.00000 -89.92628 2.00000 -89.91600 2.00000 -89.91485 2.00000 -89.90456 2.00000 -89.90443 2.00000 -8.07862 2.00000 -7.64730 2.00000 -4.19985 2.00000 -3.87654 0.00000 3.97004 0.00000 4.22717 0.00000 4.79505 0.00000 5.09316 0.00000 10.00361 0.00000 10.80666 0.00000 12.74145 0.00000 13.60187 0.00000 17.01424 0.00000 17.80374 0.00000 18.69935 + 3 0.5000000 0.2833333 0.7166667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89945 2.00000 -133.89864 2.00000 -89.92644 2.00000 -89.92619 2.00000 -89.91657 2.00000 -89.91428 2.00000 -89.90465 2.00000 -89.90440 2.00000 -8.29571 2.00000 -7.44917 2.00000 -4.29874 2.00000 -3.67101 0.00000 3.75506 0.00000 4.06698 0.00000 4.99579 0.00000 5.39076 0.00000 9.42844 0.00000 11.01294 0.00000 12.47713 0.00000 14.19781 0.00000 16.43526 0.00000 17.99973 0.00000 18.27301 + 4 0.5000000 0.3000000 0.7000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89964 2.00000 -133.89845 2.00000 -89.92645 2.00000 -89.92609 2.00000 -89.91714 2.00000 -89.91372 2.00000 -89.90475 2.00000 -89.90439 2.00000 -8.50642 2.00000 -7.27680 2.00000 -4.34060 2.00000 -3.44623 0.00000 3.55551 0.00000 3.84518 0.00000 5.29783 0.00000 5.71478 0.00000 8.78742 0.00000 11.11792 0.00000 12.28204 0.00000 14.80959 0.00000 15.85117 0.00000 17.84367 0.00000 18.00822 + 5 0.5000000 0.3166667 0.6833333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89983 2.00000 -133.89826 2.00000 -89.92644 2.00000 -89.92598 2.00000 -89.91770 2.00000 -89.91315 2.00000 -89.90486 2.00000 -89.90440 2.00000 -8.70716 2.00000 -7.14101 2.00000 -4.31421 2.00000 -3.20851 0.00000 3.37991 0.00000 3.62005 0.00000 5.64178 0.00000 6.05674 0.00000 8.11421 0.00000 11.14702 0.00000 12.12827 0.00000 14.86429 0.00000 15.83933 0.00000 17.43307 0.00000 17.67036 + 6 0.5000000 0.3333333 0.6666667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90001 2.00000 -133.89808 2.00000 -89.92639 2.00000 -89.92586 2.00000 -89.91825 2.00000 -89.91260 2.00000 -89.90497 2.00000 -89.90445 2.00000 -8.89533 2.00000 -7.04877 2.00000 -4.21267 2.00000 -2.96381 0.00000 3.23223 0.00000 3.40329 0.00000 6.01434 0.00000 6.41228 0.00000 7.43149 0.00000 11.11539 0.00000 11.99916 0.00000 14.29962 0.00000 16.35370 0.00000 17.15400 0.00000 17.16098 + 7 0.5000000 0.3500000 0.6500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90018 2.00000 -133.89791 2.00000 -89.92632 2.00000 -89.92574 2.00000 -89.91880 2.00000 -89.91206 2.00000 -89.90509 2.00000 -89.90452 2.00000 -9.06908 2.00000 -6.99989 2.00000 -4.03668 2.00000 -2.71808 0.00000 3.11509 0.00000 3.19712 0.00000 6.40964 0.00000 6.75599 0.00000 6.77752 0.00000 11.02850 0.00000 11.88602 0.00000 13.71372 0.00000 16.28807 0.00000 16.57906 0.00000 17.54096 + 8 0.5000000 0.3666667 0.6333333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90034 2.00000 -133.89775 2.00000 -89.92622 2.00000 -89.92563 2.00000 -89.91933 2.00000 -89.91153 2.00000 -89.90520 2.00000 -89.90462 2.00000 -9.22700 2.00000 -6.98723 2.00000 -3.79445 2.00000 -2.47746 0.00000 3.00040 0.00000 3.03039 0.00000 6.09190 0.00000 6.83320 0.00000 7.14751 0.00000 10.88588 0.00000 11.78476 0.00000 13.19119 0.00000 15.88841 0.00000 15.97514 0.00000 18.24386 + 9 0.5000000 0.3833333 0.6166667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90048 2.00000 -133.89761 2.00000 -89.92610 2.00000 -89.92552 2.00000 -89.91984 2.00000 -89.91101 2.00000 -89.90531 2.00000 -89.90474 2.00000 -9.36809 2.00000 -7.00022 2.00000 -3.49847 2.00000 -2.24830 0.00000 2.80947 0.00000 2.97925 0.00000 5.46090 0.00000 7.27348 0.00000 7.51464 0.00000 10.68905 0.00000 11.69380 0.00000 12.75976 0.00000 15.35429 0.00000 15.44086 0.00000 18.94817 + 10 0.5000000 0.4000000 0.6000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90061 2.00000 -133.89748 2.00000 -89.92595 2.00000 -89.92542 2.00000 -89.92033 2.00000 -89.91053 2.00000 -89.90541 2.00000 -89.90489 2.00000 -9.49156 2.00000 -7.02839 2.00000 -3.16231 2.00000 -2.03693 0.00000 2.61757 0.00000 2.96138 0.00000 4.87165 0.00000 7.73462 0.00000 7.86563 0.00000 10.45559 0.00000 11.61290 0.00000 12.42650 0.00000 14.72404 0.00000 14.98429 0.00000 19.41198 + 11 0.5000000 0.4166667 0.5833333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90072 2.00000 -133.89737 2.00000 -89.92578 2.00000 -89.92533 2.00000 -89.92079 2.00000 -89.91007 2.00000 -89.90550 2.00000 -89.90506 2.00000 -9.59685 2.00000 -7.06321 2.00000 -2.79965 2.00000 -1.84931 0.00000 2.41387 0.00000 2.97425 0.00000 4.34329 0.00000 8.17542 0.00000 8.21520 0.00000 10.23145 0.00000 11.54250 0.00000 12.17679 0.00000 14.09047 0.00000 14.53411 0.00000 19.54980 + 12 0.5000000 0.4333333 0.5666667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90081 2.00000 -133.89728 2.00000 -89.92560 2.00000 -89.92525 2.00000 -89.92122 2.00000 -89.90965 2.00000 -89.90558 2.00000 -89.90524 2.00000 -9.68349 2.00000 -7.09835 2.00000 -2.42547 2.00000 -1.69054 0.00000 2.18515 0.00000 3.01207 0.00000 3.89984 0.00000 8.39997 0.00000 8.71382 0.00000 10.09031 0.00000 11.48335 0.00000 11.98220 0.00000 13.45938 0.00000 14.10649 0.00000 19.66093 + 13 0.5000000 0.4500000 0.5500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90088 2.00000 -133.89721 2.00000 -89.92542 2.00000 -89.92519 2.00000 -89.92159 2.00000 -89.90928 2.00000 -89.90564 2.00000 -89.90542 2.00000 -9.75119 2.00000 -7.12942 2.00000 -2.05942 2.00000 -1.56440 0.00000 1.92624 0.00000 3.06505 0.00000 3.56325 0.00000 8.49462 0.00000 9.22794 0.00000 10.10197 0.00000 11.43628 0.00000 11.81185 0.00000 12.83739 0.00000 13.72431 0.00000 19.74301 + 14 0.5000000 0.4666667 0.5333333 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90093 2.00000 -133.89716 2.00000 -89.92526 2.00000 -89.92514 2.00000 -89.92188 2.00000 -89.90899 2.00000 -89.90569 2.00000 -89.90557 2.00000 -9.79969 2.00000 -7.15344 2.00000 -1.73181 2.00000 -1.47327 0.00000 1.65987 0.00000 3.11965 0.00000 3.33924 0.00000 8.47972 0.00000 9.75112 0.00000 10.25693 0.00000 11.40199 0.00000 11.64126 0.00000 12.23451 0.00000 13.41862 0.00000 19.79753 + 15 0.5000000 0.4833333 0.5166667 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90096 2.00000 -133.89712 2.00000 -89.92515 2.00000 -89.92511 2.00000 -89.92208 2.00000 -89.90880 2.00000 -89.90572 2.00000 -89.90568 2.00000 -9.82885 2.00000 -7.16854 2.00000 -1.49124 2.00000 -1.41832 0.00000 1.44593 0.00000 3.16081 0.00000 3.21536 0.00000 8.43241 0.00000 10.25781 0.00000 10.45897 0.00000 11.38054 0.00000 11.47343 0.00000 11.67950 0.00000 13.22175 0.00000 19.82803 + 16 0.5000000 0.5000000 0.5000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90097 2.00000 -133.89711 2.00000 -89.92510 2.00000 -89.92510 2.00000 -89.92215 2.00000 -89.90873 2.00000 -89.90573 2.00000 -89.90573 2.00000 -9.83858 2.00000 -7.17368 2.00000 -1.39998 2.00000 -1.39998 0.00000 1.36154 0.00000 3.17615 0.00000 3.17615 0.00000 8.41055 0.00000 10.56281 0.00000 10.56281 0.00000 11.34414 0.00000 11.38743 0.00000 11.38743 0.00000 13.15425 0.00000 19.83777 diff --git a/tests/test_data/aims/static-si-bs/band1009.out b/tests/test_data/aims/static-si-bs/band1009.out new file mode 100644 index 0000000000..db8e67e3bb --- /dev/null +++ b/tests/test_data/aims/static-si-bs/band1009.out @@ -0,0 +1,14 @@ + 1 0.5000000 0.5000000 0.5000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90097 2.00000 -133.89711 2.00000 -89.92510 2.00000 -89.92510 2.00000 -89.92215 2.00000 -89.90873 2.00000 -89.90573 2.00000 -89.90573 2.00000 -9.83858 2.00000 -7.17368 2.00000 -1.39998 2.00000 -1.39998 0.00000 1.36154 0.00000 3.17615 0.00000 3.17615 0.00000 8.41055 0.00000 10.56281 0.00000 10.56281 0.00000 11.34414 0.00000 11.38743 0.00000 11.38743 0.00000 13.15425 0.00000 19.83777 + 2 0.4903846 0.4903846 0.5192308 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90096 2.00000 -133.89712 2.00000 -89.92515 2.00000 -89.92511 2.00000 -89.92208 2.00000 -89.90880 2.00000 -89.90572 2.00000 -89.90568 2.00000 -9.82887 2.00000 -7.16855 2.00000 -1.49127 2.00000 -1.41813 0.00000 1.44577 0.00000 3.16159 0.00000 3.21458 0.00000 8.43235 0.00000 10.25916 0.00000 10.45830 0.00000 11.36061 0.00000 11.50477 0.00000 11.66736 0.00000 13.22172 0.00000 19.82804 + 3 0.4807692 0.4807692 0.5384615 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90093 2.00000 -133.89716 2.00000 -89.92526 2.00000 -89.92514 2.00000 -89.92188 2.00000 -89.90899 2.00000 -89.90569 2.00000 -89.90557 2.00000 -9.79975 2.00000 -7.15347 2.00000 -1.73344 2.00000 -1.47057 0.00000 1.65677 0.00000 3.13303 0.00000 3.32786 0.00000 8.47777 0.00000 9.77117 0.00000 10.23696 0.00000 11.33344 0.00000 11.76415 0.00000 12.17792 0.00000 13.42223 0.00000 19.79740 + 4 0.4711538 0.4711538 0.5576923 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90088 2.00000 -133.89721 2.00000 -89.92542 2.00000 -89.92519 2.00000 -89.92159 2.00000 -89.90928 2.00000 -89.90564 2.00000 -89.90542 2.00000 -9.75132 2.00000 -7.12949 2.00000 -2.06678 2.00000 -1.55201 0.00000 1.89568 0.00000 3.14303 0.00000 3.51053 0.00000 8.46320 0.00000 9.34728 0.00000 9.98669 0.00000 11.33111 0.00000 12.07628 0.00000 12.67364 0.00000 13.75537 0.00000 19.74095 + 5 0.4615385 0.4615385 0.5769231 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90081 2.00000 -133.89728 2.00000 -89.92560 2.00000 -89.92525 2.00000 -89.92122 2.00000 -89.90965 2.00000 -89.90558 2.00000 -89.90524 2.00000 -9.68374 2.00000 -7.09851 2.00000 -2.44421 2.00000 -1.65527 0.00000 2.04124 0.00000 3.28302 0.00000 3.75516 0.00000 8.22568 0.00000 9.13909 0.00000 9.73592 0.00000 11.40360 0.00000 12.41043 0.00000 13.10550 0.00000 14.21501 0.00000 19.64904 + 6 0.4519231 0.4519231 0.5961538 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90072 2.00000 -133.89737 2.00000 -89.92579 2.00000 -89.92532 2.00000 -89.92080 2.00000 -89.91006 2.00000 -89.90551 2.00000 -89.90506 2.00000 -9.59727 2.00000 -7.06360 2.00000 -2.83585 2.00000 -1.77288 0.00000 2.03762 0.00000 3.59658 0.00000 4.05383 0.00000 7.79104 0.00000 9.08826 0.00000 9.49424 0.00000 11.59552 0.00000 12.75404 0.00000 13.47582 0.00000 14.76921 0.00000 19.50701 + 7 0.4423077 0.4423077 0.6153846 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90061 2.00000 -133.89748 2.00000 -89.92596 2.00000 -89.92540 2.00000 -89.92034 2.00000 -89.91051 2.00000 -89.90543 2.00000 -89.90488 2.00000 -9.49232 2.00000 -7.02940 2.00000 -3.22170 2.00000 -1.89805 0.00000 1.93713 0.00000 4.02769 0.00000 4.39901 0.00000 7.29838 0.00000 9.03957 0.00000 9.26577 0.00000 11.92673 0.00000 13.09947 0.00000 13.80511 0.00000 15.37674 0.00000 19.30124 + 8 0.4326923 0.4326923 0.6346154 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90048 2.00000 -133.89761 2.00000 -89.92612 2.00000 -89.92549 2.00000 -89.91986 2.00000 -89.91099 2.00000 -89.90534 2.00000 -89.90473 2.00000 -9.36947 2.00000 -7.00277 2.00000 -3.58559 2.00000 -2.02508 0.00000 1.79648 0.00000 4.51790 0.00000 4.78392 0.00000 6.80068 0.00000 8.95099 0.00000 9.05293 0.00000 12.38758 0.00000 13.44074 0.00000 14.10517 0.00000 16.00852 0.00000 19.03163 + 9 0.4230769 0.4230769 0.6538462 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90034 2.00000 -133.89775 2.00000 -89.92625 2.00000 -89.92558 2.00000 -89.91937 2.00000 -89.91148 2.00000 -89.90524 2.00000 -89.90459 2.00000 -9.22968 2.00000 -6.99326 2.00000 -3.91175 2.00000 -2.14940 0.00000 1.64476 0.00000 5.02993 0.00000 5.20230 0.00000 6.32297 0.00000 8.82772 0.00000 8.85772 0.00000 12.95429 0.00000 13.77262 0.00000 14.37712 0.00000 16.64474 0.00000 18.71549 + 10 0.4134615 0.4134615 0.6730769 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90019 2.00000 -133.89790 2.00000 -89.92636 2.00000 -89.92568 2.00000 -89.91887 2.00000 -89.91198 2.00000 -89.90515 2.00000 -89.90449 2.00000 -9.07454 2.00000 -7.01274 2.00000 -4.18342 2.00000 -2.26745 0.00000 1.49625 0.00000 5.45314 0.00000 5.64782 0.00000 5.96923 0.00000 8.68276 0.00000 8.68277 0.00000 13.60276 0.00000 14.09036 0.00000 14.61528 0.00000 17.25688 0.00000 18.21848 + 11 0.4038462 0.4038462 0.6923077 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.90003 2.00000 -133.89806 2.00000 -89.92644 2.00000 -89.92577 2.00000 -89.91839 2.00000 -89.91247 2.00000 -89.90506 2.00000 -89.90440 2.00000 -8.90692 2.00000 -7.07251 2.00000 -4.38434 2.00000 -2.37648 0.00000 1.35863 0.00000 5.25235 0.00000 6.11244 0.00000 6.27113 0.00000 8.52675 0.00000 8.53289 0.00000 14.31112 0.00000 14.38924 0.00000 14.80923 0.00000 17.48786 0.00000 17.65470 + 12 0.3942308 0.3942308 0.7115385 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89987 2.00000 -133.89822 2.00000 -89.92650 2.00000 -89.92585 2.00000 -89.91793 2.00000 -89.91293 2.00000 -89.90498 2.00000 -89.90434 2.00000 -8.73267 2.00000 -7.17641 2.00000 -4.50362 2.00000 -2.47440 0.00000 1.23643 0.00000 4.83247 0.00000 6.58213 0.00000 6.82118 0.00000 8.36742 0.00000 8.41928 0.00000 14.66312 0.00000 14.92429 0.00000 15.07363 0.00000 16.75742 0.00000 17.42174 + 13 0.3846154 0.3846154 0.7307692 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89972 2.00000 -133.89837 2.00000 -89.92653 2.00000 -89.92592 2.00000 -89.91752 2.00000 -89.91333 2.00000 -89.90491 2.00000 -89.90431 2.00000 -8.56530 2.00000 -7.31093 2.00000 -4.54070 2.00000 -2.55960 0.00000 1.13236 0.00000 4.41113 0.00000 7.02383 0.00000 7.39637 0.00000 8.21341 0.00000 8.37235 0.00000 14.89548 0.00000 14.97015 0.00000 15.81325 0.00000 16.05131 0.00000 17.02556 + 14 0.3750000 0.3750000 0.7500000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89961 2.00000 -133.89848 2.00000 -89.92654 2.00000 -89.92599 2.00000 -89.91722 2.00000 -89.91364 2.00000 -89.90485 2.00000 -89.90431 2.00000 -8.43855 2.00000 -7.43279 2.00000 -4.50510 2.00000 -2.63086 0.00000 1.04802 0.00000 4.00701 0.00000 7.35679 0.00000 7.89701 0.00000 8.14738 0.00000 8.47017 0.00000 14.87484 0.00000 14.95523 0.00000 15.50658 0.00000 16.40147 0.00000 16.69799 diff --git a/tests/test_data/aims/static-si-bs/band1010.out b/tests/test_data/aims/static-si-bs/band1010.out new file mode 100644 index 0000000000..88b4791f76 --- /dev/null +++ b/tests/test_data/aims/static-si-bs/band1010.out @@ -0,0 +1,8 @@ + 1 0.6250000 0.2500000 0.6250000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89961 2.00000 -133.89848 2.00000 -89.92654 2.00000 -89.92599 2.00000 -89.91722 2.00000 -89.91364 2.00000 -89.90485 2.00000 -89.90431 2.00000 -8.43855 2.00000 -7.43279 2.00000 -4.50510 2.00000 -2.63086 0.00000 1.04802 0.00000 4.00701 0.00000 7.35679 0.00000 7.89701 0.00000 8.14738 0.00000 8.47017 0.00000 14.87484 0.00000 14.95523 0.00000 15.50658 0.00000 16.40147 0.00000 16.69799 + 2 0.6071429 0.2142857 0.6071429 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89946 2.00000 -133.89862 2.00000 -89.92652 2.00000 -89.92608 2.00000 -89.91679 2.00000 -89.91407 2.00000 -89.90476 2.00000 -89.90432 2.00000 -8.29754 2.00000 -7.58918 2.00000 -4.34783 2.00000 -2.74211 0.00000 0.91899 0.00000 3.29134 0.00000 7.80880 0.00000 8.37169 0.00000 8.50135 0.00000 8.86373 0.00000 14.53993 0.00000 14.56703 0.00000 14.97863 0.00000 16.26561 0.00000 16.92410 + 3 0.5892857 0.1785714 0.5892857 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89934 2.00000 -133.89875 2.00000 -89.92649 2.00000 -89.92616 2.00000 -89.91641 2.00000 -89.91445 2.00000 -89.90468 2.00000 -89.90435 2.00000 -8.19284 2.00000 -7.72170 2.00000 -4.13197 2.00000 -2.83769 0.00000 0.80814 0.00000 2.61343 0.00000 8.26792 0.00000 8.85213 0.00000 8.86505 0.00000 9.27113 0.00000 14.16790 0.00000 14.20375 0.00000 14.45083 0.00000 15.63796 0.00000 17.47758 + 4 0.5714286 0.1428571 0.5714286 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89923 2.00000 -133.89885 2.00000 -89.92646 2.00000 -89.92623 2.00000 -89.91607 2.00000 -89.91479 2.00000 -89.90461 2.00000 -89.90439 2.00000 -8.11989 2.00000 -7.83026 2.00000 -3.87256 2.00000 -2.91685 0.00000 0.71638 0.00000 1.98671 0.00000 8.72638 0.00000 9.18930 0.00000 9.37027 0.00000 9.68553 0.00000 13.76252 0.00000 13.87969 0.00000 13.93244 0.00000 14.97783 0.00000 18.05318 + 5 0.5535714 0.1071429 0.5535714 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89915 2.00000 -133.89893 2.00000 -89.92642 2.00000 -89.92628 2.00000 -89.91580 2.00000 -89.91506 2.00000 -89.90456 2.00000 -89.90443 2.00000 -8.07222 2.00000 -7.91477 2.00000 -3.59357 2.00000 -2.97898 0.00000 0.64437 0.00000 1.43017 0.00000 9.17006 0.00000 9.49767 0.00000 9.87600 0.00000 10.09586 0.00000 13.36036 0.00000 13.43947 0.00000 13.58265 0.00000 14.33561 0.00000 18.64222 + 6 0.5357143 0.0714286 0.5357143 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89909 2.00000 -133.89899 2.00000 -89.92638 2.00000 -89.92632 2.00000 -89.91560 2.00000 -89.91527 2.00000 -89.90452 2.00000 -89.90446 2.00000 -8.04337 2.00000 -7.97518 2.00000 -3.33068 2.00000 -3.02366 0.00000 0.59261 0.00000 0.97384 0.00000 9.57129 0.00000 9.75493 0.00000 10.35736 0.00000 10.48050 0.00000 12.98205 0.00000 13.00144 0.00000 13.33417 0.00000 13.75060 0.00000 19.22857 + 7 0.5178571 0.0357143 0.5178571 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89905 2.00000 -133.89903 2.00000 -89.92636 2.00000 -89.92635 2.00000 -89.91548 2.00000 -89.91539 2.00000 -89.90450 2.00000 -89.90448 2.00000 -8.02822 2.00000 -8.01144 2.00000 -3.13412 2.00000 -3.05059 0.00000 0.56143 0.00000 0.66323 0.00000 9.87508 0.00000 9.93086 0.00000 10.75160 0.00000 10.78983 0.00000 12.67490 0.00000 12.67666 0.00000 13.16377 0.00000 13.29216 0.00000 19.76479 + 8 0.5000000 0.0000000 0.5000000 2.00000 -1783.99714 2.00000 -1783.99714 2.00000 -133.89904 2.00000 -133.89904 2.00000 -89.92635 2.00000 -89.92635 2.00000 -89.91543 2.00000 -89.91543 2.00000 -89.90449 2.00000 -89.90449 2.00000 -8.02353 2.00000 -8.02353 2.00000 -3.05958 2.00000 -3.05958 0.00000 0.55101 0.00000 0.55101 0.00000 9.99426 0.00000 9.99426 0.00000 10.91981 0.00000 10.91981 0.00000 12.54801 0.00000 12.54801 0.00000 13.10226 0.00000 13.10226 0.00000 20.04541 diff --git a/tests/test_data/aims/static-si-bs/control.in.gz b/tests/test_data/aims/static-si-bs/control.in.gz new file mode 100644 index 0000000000..0e18fbd9ee Binary files /dev/null and b/tests/test_data/aims/static-si-bs/control.in.gz differ diff --git a/tests/test_data/aims/static-si-bs/geometry.in.gz b/tests/test_data/aims/static-si-bs/geometry.in.gz new file mode 100644 index 0000000000..c2e720a036 Binary files /dev/null and b/tests/test_data/aims/static-si-bs/geometry.in.gz differ diff --git a/tests/test_data/aims/static-si-bs/parameters.json b/tests/test_data/aims/static-si-bs/parameters.json new file mode 100644 index 0000000000..df37f68116 --- /dev/null +++ b/tests/test_data/aims/static-si-bs/parameters.json @@ -0,0 +1,22 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "output": [ + "band 0.00000 0.00000 0.00000 0.50000 -0.00000 0.50000 25 G X ", + "band 0.50000 -0.00000 0.50000 0.50000 0.25000 0.75000 13 X W ", + "band 0.50000 0.25000 0.75000 0.37500 0.37500 0.75000 10 W K ", + "band 0.37500 0.37500 0.75000 0.00000 0.00000 0.00000 26 K G ", + "band 0.00000 0.00000 0.00000 0.50000 0.50000 0.50000 22 G L ", + "band 0.50000 0.50000 0.50000 0.62500 0.25000 0.62500 16 L U ", + "band 0.62500 0.25000 0.62500 0.50000 0.25000 0.75000 10 U W ", + "band 0.50000 0.25000 0.75000 0.50000 0.50000 0.50000 18 W L ", + "band 0.50000 0.50000 0.50000 0.37500 0.37500 0.75000 16 L K ", + "band 0.62500 0.25000 0.62500 0.50000 -0.00000 0.50000 10 U X " + ], + "species_dir": "/home/tpurcell/git/atomate2/tests/aims/species_dir/light", + "k_grid": [ + 8, + 8, + 8 + ] +} diff --git a/tests/test_data/aims/static-si/aims.out.gz b/tests/test_data/aims/static-si/aims.out.gz new file mode 100644 index 0000000000..8561cdc563 Binary files /dev/null and b/tests/test_data/aims/static-si/aims.out.gz differ diff --git a/tests/test_data/aims/static-si/control.in.gz b/tests/test_data/aims/static-si/control.in.gz new file mode 100644 index 0000000000..027bd2e2ea Binary files /dev/null and b/tests/test_data/aims/static-si/control.in.gz differ diff --git a/tests/test_data/aims/static-si/geometry.in.gz b/tests/test_data/aims/static-si/geometry.in.gz new file mode 100644 index 0000000000..c2e720a036 Binary files /dev/null and b/tests/test_data/aims/static-si/geometry.in.gz differ diff --git a/tests/test_data/aims/static-si/inputs/control.in.gz b/tests/test_data/aims/static-si/inputs/control.in.gz new file mode 100644 index 0000000000..3f5cdc7af5 Binary files /dev/null and b/tests/test_data/aims/static-si/inputs/control.in.gz differ diff --git a/tests/test_data/aims/static-si/inputs/geometry.in.gz b/tests/test_data/aims/static-si/inputs/geometry.in.gz new file mode 100644 index 0000000000..4e9a9758c6 Binary files /dev/null and b/tests/test_data/aims/static-si/inputs/geometry.in.gz differ diff --git a/tests/test_data/aims/static-si/inputs/parameters.json b/tests/test_data/aims/static-si/inputs/parameters.json new file mode 100644 index 0000000000..3b8dfe8fae --- /dev/null +++ b/tests/test_data/aims/static-si/inputs/parameters.json @@ -0,0 +1,10 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "species_dir": "/home/tpurcell/git/fhi-aims-workflows/tests/test_input_generators/species_dir", + "k_grid": [ + 2, + 2, + 2 + ] +} diff --git a/tests/test_data/aims/static-si/outputs/aims.out.gz b/tests/test_data/aims/static-si/outputs/aims.out.gz new file mode 100644 index 0000000000..9df80aa526 Binary files /dev/null and b/tests/test_data/aims/static-si/outputs/aims.out.gz differ diff --git a/tests/test_data/aims/static-si/parameters.json b/tests/test_data/aims/static-si/parameters.json new file mode 100644 index 0000000000..62b8f5feb9 --- /dev/null +++ b/tests/test_data/aims/static-si/parameters.json @@ -0,0 +1,10 @@ +{ + "xc": "pbe", + "relativistic": "atomic_zora scalar", + "species_dir": "/home/tpurcell/git/atomate2/tests/aims/species_dir/light", + "k_grid": [ + 2, + 2, + 2 + ] +} diff --git a/tests/test_data/forcefields/eos/CHGNet_Si_eos.json.gz b/tests/test_data/forcefields/eos/CHGNet_Si_eos.json.gz new file mode 100644 index 0000000000..dc73cab01f Binary files /dev/null and b/tests/test_data/forcefields/eos/CHGNet_Si_eos.json.gz differ diff --git a/tests/test_data/forcefields/eos/M3GNet_Si_eos.json.gz b/tests/test_data/forcefields/eos/M3GNet_Si_eos.json.gz new file mode 100644 index 0000000000..fccbcfa90a Binary files /dev/null and b/tests/test_data/forcefields/eos/M3GNet_Si_eos.json.gz differ diff --git a/tests/test_data/forcefields/eos/MACE_Si_eos.json.gz b/tests/test_data/forcefields/eos/MACE_Si_eos.json.gz new file mode 100644 index 0000000000..f036fc05e3 Binary files /dev/null and b/tests/test_data/forcefields/eos/MACE_Si_eos.json.gz differ diff --git a/tests/test_data/forcefields/mace/MACE.model b/tests/test_data/forcefields/mace/MACE.model new file mode 100644 index 0000000000..1b1348ae79 Binary files /dev/null and b/tests/test_data/forcefields/mace/MACE.model differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/inputs/INCAR b/tests/test_data/lobster/Fe_lobster/lobster_0/inputs/INCAR new file mode 100644 index 0000000000..600fd96aa3 --- /dev/null +++ b/tests/test_data/lobster/Fe_lobster/lobster_0/inputs/INCAR @@ -0,0 +1,19 @@ +ALGO = Normal +EDIFF = 1e-06 +ENCUT = 520 +IBRION = -1 +ISMEAR = -5 +ISPIN = 2 +ISYM = 0 +LASPH = True +LCHARG = True +LMAXMIX = 4 +LORBIT = 11 +LREAL = False +LWAVE = True +MAGMOM = 2*2.758 +NBANDS = 18 +NELM = 100 +NSW = 0 +PREC = Accurate +SIGMA = 0.05 diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/inputs/lobsterin b/tests/test_data/lobster/Fe_lobster/lobster_0/inputs/lobsterin new file mode 100644 index 0000000000..dc4198e95c --- /dev/null +++ b/tests/test_data/lobster/Fe_lobster/lobster_0/inputs/lobsterin @@ -0,0 +1,6 @@ +COHPstartEnergy -5.0 +COHPendEnergy 5.0 +basisSet pbeVaspFit2015 +cohpGenerator from 0.1 to 3.0 orbitalwise +saveProjectionToFile +basisfunctions Fe 3d 3p 4s diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/CHARGE.lobster.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/CHARGE.lobster.gz new file mode 100644 index 0000000000..3fd5a81f1a Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/CHARGE.lobster.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/COBICAR.lobster.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/COBICAR.lobster.gz new file mode 100644 index 0000000000..cee9ff704e Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/COBICAR.lobster.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/COHPCAR.lobster.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/COHPCAR.lobster.gz new file mode 100644 index 0000000000..c9b21fd1d6 Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/COHPCAR.lobster.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/CONTCAR.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/CONTCAR.gz new file mode 100644 index 0000000000..8aea3a1ee5 Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/CONTCAR.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/COOPCAR.lobster.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/COOPCAR.lobster.gz new file mode 100644 index 0000000000..114e2b1bea Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/COOPCAR.lobster.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/DOSCAR.lobster.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/DOSCAR.lobster.gz new file mode 100644 index 0000000000..a91146a219 Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/DOSCAR.lobster.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/GROSSPOP.lobster.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/GROSSPOP.lobster.gz new file mode 100644 index 0000000000..1cce095f12 Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/GROSSPOP.lobster.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/ICOBILIST.lobster.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/ICOBILIST.lobster.gz new file mode 100644 index 0000000000..781df15e70 Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/ICOBILIST.lobster.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/ICOHPLIST.lobster.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/ICOHPLIST.lobster.gz new file mode 100644 index 0000000000..48a837ed7c Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/ICOHPLIST.lobster.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/ICOOPLIST.lobster.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/ICOOPLIST.lobster.gz new file mode 100644 index 0000000000..d55a57cc42 Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/ICOOPLIST.lobster.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/INCAR.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/INCAR.gz new file mode 100644 index 0000000000..8d9363fa83 Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/INCAR.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/KPOINTS.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/KPOINTS.gz new file mode 100644 index 0000000000..9305300d71 Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/KPOINTS.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/MadelungEnergies.lobster.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/MadelungEnergies.lobster.gz new file mode 100644 index 0000000000..d367eb30b1 Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/MadelungEnergies.lobster.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/OUTCAR.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/OUTCAR.gz new file mode 100644 index 0000000000..5245222da5 Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/OUTCAR.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/POSCAR.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/POSCAR.gz new file mode 100644 index 0000000000..79ed430098 Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/POSCAR.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/POTCAR.spec b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/POTCAR.spec new file mode 100644 index 0000000000..012adc2642 --- /dev/null +++ b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/POTCAR.spec @@ -0,0 +1 @@ +Fe_pv diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/SitePotentials.lobster.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/SitePotentials.lobster.gz new file mode 100644 index 0000000000..b3cc9a2e3c Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/SitePotentials.lobster.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/bandOverlaps.lobster.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/bandOverlaps.lobster.gz new file mode 100644 index 0000000000..dd0dfcdfdc Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/bandOverlaps.lobster.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/custodian.json.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/custodian.json.gz new file mode 100644 index 0000000000..22f1318fc1 Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/custodian.json.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/lobsterin.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/lobsterin.gz new file mode 100644 index 0000000000..63a23ad795 Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/lobsterin.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/lobsterout.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/lobsterout.gz new file mode 100644 index 0000000000..a0aa1f309e Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/lobsterout.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/projectionData.lobster.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/projectionData.lobster.gz new file mode 100644 index 0000000000..c531975972 Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/projectionData.lobster.gz differ diff --git a/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/vasprun.xml.gz b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..ca9a5db841 Binary files /dev/null and b/tests/test_data/lobster/Fe_lobster/lobster_0/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/inputs/INCAR b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/inputs/INCAR new file mode 100644 index 0000000000..500fbd2d78 --- /dev/null +++ b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/inputs/INCAR @@ -0,0 +1,18 @@ +ALGO = Fast +EDIFF = 0.0001 +ENCUT = 520 +IBRION = 2 +ISIF = 3 +ISMEAR = -5 +ISPIN = 2 +LASPH = True +LCHARG = False +LMAXMIX = 4 +LORBIT = 11 +LREAL = Auto +LWAVE = False +MAGMOM = 2*2.758 +NELM = 100 +NSW = 99 +PREC = Accurate +SIGMA = 0.05 diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/inputs/KPOINTS b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/inputs/KPOINTS new file mode 100644 index 0000000000..bc596ffe8c --- /dev/null +++ b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/inputs/KPOINTS @@ -0,0 +1,4 @@ +pymatgen with grid density = 211 / number of atoms +0 +Gamma +5 5 3 diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/inputs/POSCAR b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/inputs/POSCAR new file mode 100644 index 0000000000..e10a1b50b1 --- /dev/null +++ b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/inputs/POSCAR @@ -0,0 +1,10 @@ +Fe2 +1.0 + 2.3361450900000000 0.0001116700000000 -0.8258229300000000 + -1.1680779800000001 2.0230472399999999 -0.8260822000000000 + 1.1700738700000000 2.0273050000000001 3.3103279600000000 +Fe +2 +direct + 0.5000000200000000 0.5000000800000000 0.4999999900000000 Fe + 0.9999999800000000 0.9999999200000000 0.0000000100000000 Fe diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/inputs/POTCAR.spec b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/inputs/POTCAR.spec new file mode 100644 index 0000000000..012adc2642 --- /dev/null +++ b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/inputs/POTCAR.spec @@ -0,0 +1 @@ +Fe_pv diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/CHGCAR.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/CHGCAR.gz new file mode 100644 index 0000000000..748fdae87b Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/CHGCAR.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/CONTCAR.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/CONTCAR.gz new file mode 100644 index 0000000000..30c121ef75 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/INCAR.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/INCAR.gz new file mode 100644 index 0000000000..9f18b48c3c Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/INCAR.orig.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..d2a8507af2 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/KPOINTS.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/KPOINTS.gz new file mode 100644 index 0000000000..fe4d0fd1a8 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/KPOINTS.orig.gz new file mode 100644 index 0000000000..ab178fc7d7 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/OUTCAR.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/OUTCAR.gz new file mode 100644 index 0000000000..7953f3312f Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/POSCAR.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/POSCAR.gz new file mode 100644 index 0000000000..5fcf8006c7 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..5f78d30567 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/POTCAR.spec b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/POTCAR.spec new file mode 100644 index 0000000000..012adc2642 --- /dev/null +++ b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/POTCAR.spec @@ -0,0 +1 @@ +Fe_pv diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/WAVECAR.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/WAVECAR.gz new file mode 100644 index 0000000000..f67d08b205 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/WAVECAR.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/custodian.json.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/custodian.json.gz new file mode 100644 index 0000000000..deb0136a5e Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/vasprun.xml.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..ce617d5edf Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_1/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/inputs/INCAR b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/inputs/INCAR new file mode 100644 index 0000000000..f372b1bb55 --- /dev/null +++ b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/inputs/INCAR @@ -0,0 +1,18 @@ +ALGO = Fast +EDIFF = 0.0001 +ENCUT = 520 +IBRION = 2 +ISIF = 3 +ISMEAR = -5 +ISPIN = 2 +LASPH = True +LCHARG = False +LMAXMIX = 4 +LORBIT = 11 +LREAL = Auto +LWAVE = False +MAGMOM = 1*2.106 1*2.107 +NELM = 100 +NSW = 99 +PREC = Accurate +SIGMA = 0.05 diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/inputs/KPOINTS b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/inputs/KPOINTS new file mode 100644 index 0000000000..5490d2f1ea --- /dev/null +++ b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/inputs/KPOINTS @@ -0,0 +1,4 @@ +pymatgen with grid density = 220 / number of atoms +0 +Gamma +5 5 3 diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/inputs/POSCAR b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/inputs/POSCAR new file mode 100644 index 0000000000..7f93a19b59 --- /dev/null +++ b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/inputs/POSCAR @@ -0,0 +1,10 @@ +Fe2 +1.0 + 2.3247697431142709 0.0011158394059855 -0.8224083286119700 + -1.1615226345878924 2.0137000999124477 -0.8226732920954348 + 1.1372826593766157 1.9704788611038830 3.2175225091681869 +Fe +2 +direct + 0.4999999975681003 0.5000000220874210 0.5000000028567035 Fe + 0.0000000024318998 0.9999999779125790 -0.0000000028567036 Fe diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/inputs/POTCAR.spec b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/inputs/POTCAR.spec new file mode 100644 index 0000000000..012adc2642 --- /dev/null +++ b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/inputs/POTCAR.spec @@ -0,0 +1 @@ +Fe_pv diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/CHGCAR.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/CHGCAR.gz new file mode 100644 index 0000000000..1358d4d348 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/CHGCAR.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/CONTCAR.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/CONTCAR.gz new file mode 100644 index 0000000000..3ceca3be4b Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/INCAR.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/INCAR.gz new file mode 100644 index 0000000000..4e4e2f8e5e Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/INCAR.orig.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..d134f6e45f Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/KPOINTS.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/KPOINTS.gz new file mode 100644 index 0000000000..772188c8ba Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/KPOINTS.orig.gz new file mode 100644 index 0000000000..3dfc56dfb4 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/OUTCAR.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/OUTCAR.gz new file mode 100644 index 0000000000..fa8d8ebd97 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/POSCAR.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/POSCAR.gz new file mode 100644 index 0000000000..67b83c95fb Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..773608e97f Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/POTCAR.spec b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/POTCAR.spec new file mode 100644 index 0000000000..012adc2642 --- /dev/null +++ b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/POTCAR.spec @@ -0,0 +1 @@ +Fe_pv diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/WAVECAR.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/WAVECAR.gz new file mode 100644 index 0000000000..4dce0933a8 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/WAVECAR.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/custodian.json.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/custodian.json.gz new file mode 100644 index 0000000000..a1a185998f Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/vasprun.xml.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..4d0f722ef3 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_relax_2/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_static/inputs/INCAR b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/inputs/INCAR new file mode 100644 index 0000000000..e5188468d2 --- /dev/null +++ b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/inputs/INCAR @@ -0,0 +1,19 @@ +ALGO = Normal +EDIFF = 1e-06 +ENCUT = 520 +IBRION = -1 +ISMEAR = -5 +ISPIN = 2 +ISYM = 0 +LASPH = True +LCHARG = True +LMAXMIX = 4 +LORBIT = 11 +LREAL = False +LWAVE = True +MAGMOM = 2*2.105 +NBANDS = 18 +NELM = 100 +NSW = 0 +PREC = Accurate +SIGMA = 0.05 diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_static/inputs/KPOINTS b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/inputs/KPOINTS new file mode 100644 index 0000000000..9deeb56b33 --- /dev/null +++ b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/inputs/KPOINTS @@ -0,0 +1,4 @@ +pymatgen with grid density = 221 / number of atoms +0 +Gamma +5 5 3 diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_static/inputs/POSCAR b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/inputs/POSCAR new file mode 100644 index 0000000000..0cfb8d7ad3 --- /dev/null +++ b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/inputs/POSCAR @@ -0,0 +1,10 @@ +Fe2 +1.0 + 2.3191222174320663 0.0022375575036685 -0.8210990887096972 + -1.1577271585521238 2.0093705129625041 -0.8213633337288552 + 1.1366928212633334 1.9694568925378289 3.2158537811988110 +Fe +2 +direct + 0.4999999975681035 0.5000000220874199 0.5000000028567015 Fe + 0.0000000024318965 0.9999999779125801 0.9999999971432985 Fe diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_static/inputs/POTCAR.spec b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/inputs/POTCAR.spec new file mode 100644 index 0000000000..012adc2642 --- /dev/null +++ b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/inputs/POTCAR.spec @@ -0,0 +1 @@ +Fe_pv diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/CONTCAR.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/CONTCAR.gz new file mode 100644 index 0000000000..77be35b127 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/INCAR.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/INCAR.gz new file mode 100644 index 0000000000..b53e04b905 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/INCAR.orig.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..62515ba1a0 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/KPOINTS.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/KPOINTS.gz new file mode 100644 index 0000000000..afe426fc36 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/KPOINTS.orig.gz new file mode 100644 index 0000000000..2a6fe59e39 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/OUTCAR.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/OUTCAR.gz new file mode 100644 index 0000000000..d4c9e0e4a5 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/POSCAR.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/POSCAR.gz new file mode 100644 index 0000000000..e7ff2cc441 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..ceb6acdd64 Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/POTCAR.spec b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/POTCAR.spec new file mode 100644 index 0000000000..012adc2642 --- /dev/null +++ b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/POTCAR.spec @@ -0,0 +1 @@ +Fe_pv diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/custodian.json.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/custodian.json.gz new file mode 100644 index 0000000000..e20179a7fb Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/vasprun.xml.gz b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..76e376c6fb Binary files /dev/null and b/tests/test_data/vasp/Fe_lobster_mp/GGA_static/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/H_Graphite/C4.vasp b/tests/test_data/vasp/H_Graphite/C4.vasp new file mode 100644 index 0000000000..8983404e55 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/C4.vasp @@ -0,0 +1,12 @@ +C4 +1.0 + 1.2338620000000000 -2.1371120000000001 0.0000000000000000 + 1.2338620000000000 2.1371120000000001 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 8.6850380000000005 +C +4 +direct + 0.0000000000000000 0.0000000000000000 0.7500000000000000 C + 0.0000000000000000 0.0000000000000000 0.2500000000000000 C + 0.3333330000000000 0.6666670000000000 0.7500000000000000 C + 0.6666670000000000 0.3333330000000000 0.2500000000000000 C diff --git a/tests/test_data/vasp/H_Graphite/H_entry.json b/tests/test_data/vasp/H_Graphite/H_entry.json new file mode 100644 index 0000000000..2d1c09dccc --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/H_entry.json @@ -0,0 +1,253 @@ +{ + "@module": "pymatgen.entries.computed_entries", + "@class": "ComputedStructureEntry", + "energy": -27.64089921, + "composition": { + "H": 8.0 + }, + "entry_id": "mp-730101-R2SCAN", + "correction": 0.0, + "energy_adjustments": [], + "parameters": { + "potcar_spec": [ + { + "titel": "PAW_PBE H 15Jun2001", + "hash": "4923e7a833556cc0a96744438c6686b8" + } + ], + "is_hubbard": false, + "hubbards": {}, + "run_type": "R2SCAN" + }, + "data": { + "oxide_type": "None", + "aspherical": true, + "last_updated": { + "@module": "datetime", + "@class": "datetime", + "string": "2021-07-24 01:50:36.696000" + }, + "task_id": "mp-2739144", + "material_id": "mp-730101", + "oxidation_states": { + "H": 0.0 + }, + "run_type": "R2SCAN" + }, + "structure": { + "@module": "pymatgen.core.structure", + "@class": "Structure", + "charge": 0, + "lattice": { + "matrix": [ + [ + 7.17722434, + 0.0, + 0.0 + ], + [ + 0.0, + 7.18692792, + 0.0 + ], + [ + 0.0, + 0.0, + 7.20815403 + ] + ], + "pbc": [ + true, + true, + true + ], + "a": 7.17722434, + "b": 7.18692792, + "c": 7.20815403, + "alpha": 90.0, + "beta": 90.0, + "gamma": 90.0, + "volume": 371.81239953751634 + }, + "properties": {}, + "sites": [ + { + "species": [ + { + "element": "H", + "occu": 1 + } + ], + "abc": [ + 0.36553261, + 0.72173629, + 0.64725933 + ], + "xyz": [ + 2.6235095455557276, + 5.187066693478216, + 4.6655449479946 + ], + "properties": { + "magmom": 0.0 + }, + "label": "H" + }, + { + "species": [ + { + "element": "H", + "occu": 1 + } + ], + "abc": [ + 0.86553261, + 0.77826371, + 0.35274067 + ], + "xyz": [ + 6.212121715555728, + 5.593325186521783, + 2.5426090820054 + ], + "properties": { + "magmom": 0.0 + }, + "label": "H" + }, + { + "species": [ + { + "element": "H", + "occu": 1 + } + ], + "abc": [ + 0.63446739, + 0.22173629, + 0.85274067 + ], + "xyz": [ + 4.553714794444272, + 1.5936027334782168, + 6.1466860970054 + ], + "properties": { + "magmom": 0.0 + }, + "label": "H" + }, + { + "species": [ + { + "element": "H", + "occu": 1 + } + ], + "abc": [ + 0.13446739, + 0.27826371, + 0.14725933 + ], + "xyz": [ + 0.9651026244442726, + 1.999861226521783, + 1.0614679329946 + ], + "properties": { + "magmom": 0.0 + }, + "label": "H" + }, + { + "species": [ + { + "element": "H", + "occu": 1 + } + ], + "abc": [ + 0.64452235, + 0.14925896, + 0.78027071 + ], + "xyz": [ + 4.6258814980939995, + 1.0727133869341632, + 5.624311462777461 + ], + "properties": { + "magmom": -0.0 + }, + "label": "H" + }, + { + "species": [ + { + "element": "H", + "occu": 1 + } + ], + "abc": [ + 0.14452235, + 0.35074104, + 0.21972929 + ], + "xyz": [ + 1.037269328093999, + 2.5207505730658366, + 1.5838425672225387 + ], + "properties": { + "magmom": -0.0 + }, + "label": "H" + }, + { + "species": [ + { + "element": "H", + "occu": 1 + } + ], + "abc": [ + 0.35547765, + 0.64925896, + 0.71972929 + ], + "xyz": [ + 2.551342841906001, + 4.666177346934163, + 5.187919582222539 + ], + "properties": { + "magmom": -0.0 + }, + "label": "H" + }, + { + "species": [ + { + "element": "H", + "occu": 1 + } + ], + "abc": [ + 0.85547765, + 0.85074104, + 0.28027071 + ], + "xyz": [ + 6.139955011906001, + 6.114214533065836, + 2.020234447777461 + ], + "properties": { + "magmom": -0.0 + }, + "label": "H" + } + ] + }, + "@version": null +} diff --git a/tests/test_data/vasp/H_Graphite/relax/inputs/INCAR b/tests/test_data/vasp/H_Graphite/relax/inputs/INCAR new file mode 100644 index 0000000000..dc4c633f14 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax/inputs/INCAR @@ -0,0 +1,28 @@ +ALGO = All +EDIFF = 1e-05 +EDIFFG = -0.1 +ENAUG = 1360 +ENCUT = 680 +IBRION = 2 +ISIF = 2 +ISMEAR = 0 +ISPIN = 2 +LAECHG = True +LASPH = True +LCHARG = True +LELF = False +LMIXTAU = True +LORBIT = 11 +LREAL = Auto +LVTOT = True +LWAVE = True +MAGMOM = 4*0.6 +METAGGA = R2scan +NCORE = 12 +NELM = 200 +NGX = 18 +NGY = 18 +NGZ = 60 +NSW = 99 +PREC = Accurate +SIGMA = 0.2 diff --git a/tests/test_data/vasp/H_Graphite/relax/inputs/KPOINTS b/tests/test_data/vasp/H_Graphite/relax/inputs/KPOINTS new file mode 100644 index 0000000000..e61e15ddb1 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax/inputs/KPOINTS @@ -0,0 +1,4 @@ +pymatgen with grid density = 88 / number of atoms +0 +Gamma +4 4 1 diff --git a/tests/test_data/vasp/H_Graphite/relax/inputs/POSCAR b/tests/test_data/vasp/H_Graphite/relax/inputs/POSCAR new file mode 100644 index 0000000000..8983404e55 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax/inputs/POSCAR @@ -0,0 +1,12 @@ +C4 +1.0 + 1.2338620000000000 -2.1371120000000001 0.0000000000000000 + 1.2338620000000000 2.1371120000000001 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 8.6850380000000005 +C +4 +direct + 0.0000000000000000 0.0000000000000000 0.7500000000000000 C + 0.0000000000000000 0.0000000000000000 0.2500000000000000 C + 0.3333330000000000 0.6666670000000000 0.7500000000000000 C + 0.6666670000000000 0.3333330000000000 0.2500000000000000 C diff --git a/tests/test_data/vasp/H_Graphite/relax/inputs/POTCAR.spec b/tests/test_data/vasp/H_Graphite/relax/inputs/POTCAR.spec new file mode 100644 index 0000000000..3cc58df837 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax/inputs/POTCAR.spec @@ -0,0 +1 @@ +C diff --git a/tests/test_data/vasp/H_Graphite/relax/outputs/CONTCAR.gz b/tests/test_data/vasp/H_Graphite/relax/outputs/CONTCAR.gz new file mode 100644 index 0000000000..0d927e336d Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax/outputs/INCAR.gz b/tests/test_data/vasp/H_Graphite/relax/outputs/INCAR.gz new file mode 100644 index 0000000000..644832e9ec Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax/outputs/INCAR.orig.gz b/tests/test_data/vasp/H_Graphite/relax/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..9764cae86b Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax/outputs/KPOINTS.gz b/tests/test_data/vasp/H_Graphite/relax/outputs/KPOINTS.gz new file mode 100644 index 0000000000..900383bc3d Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/H_Graphite/relax/outputs/KPOINTS.orig.gz new file mode 100644 index 0000000000..c602f38d06 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax/outputs/OUTCAR.gz b/tests/test_data/vasp/H_Graphite/relax/outputs/OUTCAR.gz new file mode 100644 index 0000000000..f42090c4b8 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax/outputs/POSCAR.gz b/tests/test_data/vasp/H_Graphite/relax/outputs/POSCAR.gz new file mode 100644 index 0000000000..4bfe3c2be1 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax/outputs/POSCAR.orig.gz b/tests/test_data/vasp/H_Graphite/relax/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..b25f5b62ed Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax/outputs/POTCAR.spec b/tests/test_data/vasp/H_Graphite/relax/outputs/POTCAR.spec new file mode 100644 index 0000000000..3cc58df837 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax/outputs/POTCAR.spec @@ -0,0 +1 @@ +C diff --git a/tests/test_data/vasp/H_Graphite/relax/outputs/custodian.json.gz b/tests/test_data/vasp/H_Graphite/relax/outputs/custodian.json.gz new file mode 100644 index 0000000000..8738ca5374 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax/outputs/vasprun.xml.gz b/tests/test_data/vasp/H_Graphite/relax/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..bf16084403 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_0_(0)/inputs/INCAR b/tests/test_data/vasp/H_Graphite/relax_0_(0)/inputs/INCAR new file mode 100644 index 0000000000..11640b1a7f --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_0_(0)/inputs/INCAR @@ -0,0 +1,28 @@ +ALGO = All +EDIFF = 1e-05 +EDIFFG = -0.1 +ENAUG = 1360 +ENCUT = 680 +IBRION = 2 +ISIF = 2 +ISMEAR = 0 +ISPIN = 2 +LAECHG = True +LASPH = True +LCHARG = True +LELF = False +LMIXTAU = True +LORBIT = 11 +LREAL = Auto +LVTOT = True +LWAVE = True +MAGMOM = 5*0.6 +METAGGA = R2scan +NCORE = 12 +NELM = 200 +NGX = 18 +NGY = 18 +NGZ = 60 +NSW = 99 +PREC = Accurate +SIGMA = 0.2 diff --git a/tests/test_data/vasp/H_Graphite/relax_0_(0)/inputs/KPOINTS b/tests/test_data/vasp/H_Graphite/relax_0_(0)/inputs/KPOINTS new file mode 100644 index 0000000000..9bcad4fb60 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_0_(0)/inputs/KPOINTS @@ -0,0 +1,4 @@ +pymatgen with grid density = 88 / number of atoms +0 +Gamma +3 3 1 diff --git a/tests/test_data/vasp/H_Graphite/relax_0_(0)/inputs/POSCAR b/tests/test_data/vasp/H_Graphite/relax_0_(0)/inputs/POSCAR new file mode 100644 index 0000000000..617f9a56fe --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_0_(0)/inputs/POSCAR @@ -0,0 +1,13 @@ +H1 C4 +1.0 + 1.2338620000000000 -2.1371120000000001 0.0000000000000000 + 1.2338620000000000 2.1371120000000001 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 8.6850380000000005 +H C +1 4 +direct + 0.0000000000000000 0.5000000000000000 0.0000000000000000 H+ + 0.0000000000000000 0.0000000000000000 0.7500000000000000 C0+ + 0.0000000000000000 0.0000000000000000 0.2500000000000000 C0+ + 0.3333330000000000 0.6666670000000000 0.7500000000000000 C0+ + 0.6666670000000000 0.3333330000000000 0.2500000000000000 C0+ diff --git a/tests/test_data/vasp/H_Graphite/relax_0_(0)/inputs/POTCAR.spec b/tests/test_data/vasp/H_Graphite/relax_0_(0)/inputs/POTCAR.spec new file mode 100644 index 0000000000..35025b8b16 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_0_(0)/inputs/POTCAR.spec @@ -0,0 +1,2 @@ +H +C diff --git a/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/CONTCAR.gz b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/CONTCAR.gz new file mode 100644 index 0000000000..e5ddced932 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/INCAR.gz b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/INCAR.gz new file mode 100644 index 0000000000..298597479c Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/INCAR.orig.gz b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..f071c7b83f Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/KPOINTS.gz b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/KPOINTS.gz new file mode 100644 index 0000000000..3c32dd3495 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/KPOINTS.orig.gz new file mode 100644 index 0000000000..2e72fdc6cf Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/OUTCAR.gz b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/OUTCAR.gz new file mode 100644 index 0000000000..3d70292be3 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/POSCAR.gz b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/POSCAR.gz new file mode 100644 index 0000000000..84804a9cb1 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/POSCAR.orig.gz b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..eeee286b38 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/POTCAR.spec b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/POTCAR.spec new file mode 100644 index 0000000000..35025b8b16 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/POTCAR.spec @@ -0,0 +1,2 @@ +H +C diff --git a/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/custodian.json.gz b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/custodian.json.gz new file mode 100644 index 0000000000..c140cd913d Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/vasprun.xml.gz b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..9bcab1bd0b Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_0_(0)/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(0)/inputs/INCAR b/tests/test_data/vasp/H_Graphite/relax_1_(0)/inputs/INCAR new file mode 100644 index 0000000000..6157886906 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_1_(0)/inputs/INCAR @@ -0,0 +1,28 @@ +ALGO = All +EDIFF = 1e-05 +EDIFFG = -0.1 +ENAUG = 1360 +ENCUT = 680 +IBRION = 2 +ISIF = 2 +ISMEAR = 0 +ISPIN = 2 +LAECHG = True +LASPH = True +LCHARG = True +LELF = False +LMIXTAU = True +LORBIT = 11 +LREAL = Auto +LVTOT = True +LWAVE = True +MAGMOM = 6*0.6 +METAGGA = R2scan +NCORE = 12 +NELM = 200 +NGX = 18 +NGY = 18 +NGZ = 60 +NSW = 99 +PREC = Accurate +SIGMA = 0.2 diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(0)/inputs/KPOINTS b/tests/test_data/vasp/H_Graphite/relax_1_(0)/inputs/KPOINTS new file mode 100644 index 0000000000..9bcad4fb60 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_1_(0)/inputs/KPOINTS @@ -0,0 +1,4 @@ +pymatgen with grid density = 88 / number of atoms +0 +Gamma +3 3 1 diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(0)/inputs/POSCAR b/tests/test_data/vasp/H_Graphite/relax_1_(0)/inputs/POSCAR new file mode 100644 index 0000000000..cdb39b39a6 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_1_(0)/inputs/POSCAR @@ -0,0 +1,14 @@ +H2 C4 +1.0 + 1.2338620000000000 -2.1371120000000001 0.0000000000000000 + 1.2338620000000000 2.1371120000000001 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 8.6850380000000005 +H C +2 4 +direct + 0.3888888888888888 0.1944444444444444 0.8999999999999999 H+ + 0.0000000000000000 0.5000000000000000 0.0000000000000000 H+ + 0.9036950000000000 0.9518480000000000 0.6974110000000000 C0.25- + 0.0963050000000000 0.0481520000000000 0.3025890000000000 C0.25- + 0.2373350000000000 0.6186680000000000 0.6984530000000000 C0.25- + 0.7626650000000000 0.3813320000000000 0.3015470000000000 C0.25- diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(0)/inputs/POTCAR.spec b/tests/test_data/vasp/H_Graphite/relax_1_(0)/inputs/POTCAR.spec new file mode 100644 index 0000000000..35025b8b16 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_1_(0)/inputs/POTCAR.spec @@ -0,0 +1,2 @@ +H +C diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/CONTCAR.gz b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/CONTCAR.gz new file mode 100644 index 0000000000..ff1c9e2278 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/INCAR.gz b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/INCAR.gz new file mode 100644 index 0000000000..929037d3b7 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/INCAR.orig.gz b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..148d46c003 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/KPOINTS.gz b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/KPOINTS.gz new file mode 100644 index 0000000000..a721397be0 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/KPOINTS.orig.gz new file mode 100644 index 0000000000..d08cc81c4c Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/OUTCAR.gz b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/OUTCAR.gz new file mode 100644 index 0000000000..2a84739a93 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/POSCAR.gz b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/POSCAR.gz new file mode 100644 index 0000000000..2212c4ca17 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/POSCAR.orig.gz b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..b5e8c71012 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/POTCAR.spec b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/POTCAR.spec new file mode 100644 index 0000000000..35025b8b16 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/POTCAR.spec @@ -0,0 +1,2 @@ +H +C diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/custodian.json.gz b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/custodian.json.gz new file mode 100644 index 0000000000..ab66c701a5 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/vasprun.xml.gz b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..d758882c2f Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(0)/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(1)/inputs/INCAR b/tests/test_data/vasp/H_Graphite/relax_1_(1)/inputs/INCAR new file mode 100644 index 0000000000..6157886906 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_1_(1)/inputs/INCAR @@ -0,0 +1,28 @@ +ALGO = All +EDIFF = 1e-05 +EDIFFG = -0.1 +ENAUG = 1360 +ENCUT = 680 +IBRION = 2 +ISIF = 2 +ISMEAR = 0 +ISPIN = 2 +LAECHG = True +LASPH = True +LCHARG = True +LELF = False +LMIXTAU = True +LORBIT = 11 +LREAL = Auto +LVTOT = True +LWAVE = True +MAGMOM = 6*0.6 +METAGGA = R2scan +NCORE = 12 +NELM = 200 +NGX = 18 +NGY = 18 +NGZ = 60 +NSW = 99 +PREC = Accurate +SIGMA = 0.2 diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(1)/inputs/KPOINTS b/tests/test_data/vasp/H_Graphite/relax_1_(1)/inputs/KPOINTS new file mode 100644 index 0000000000..9bcad4fb60 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_1_(1)/inputs/KPOINTS @@ -0,0 +1,4 @@ +pymatgen with grid density = 88 / number of atoms +0 +Gamma +3 3 1 diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(1)/inputs/POSCAR b/tests/test_data/vasp/H_Graphite/relax_1_(1)/inputs/POSCAR new file mode 100644 index 0000000000..e9f3c43aeb --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_1_(1)/inputs/POSCAR @@ -0,0 +1,14 @@ +H2 C4 +1.0 + 1.2338620000000000 -2.1371120000000001 0.0000000000000000 + 1.2338620000000000 2.1371120000000001 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 8.6850380000000005 +H C +2 4 +direct + 0.4444444444444444 0.7222222222222223 0.4833333333333334 H+ + 0.0000000000000000 0.5000000000000000 0.0000000000000000 H+ + 0.9036950000000000 0.9518480000000000 0.6974110000000000 C0.25- + 0.0963050000000000 0.0481520000000000 0.3025890000000000 C0.25- + 0.2373350000000000 0.6186680000000000 0.6984530000000000 C0.25- + 0.7626650000000000 0.3813320000000000 0.3015470000000000 C0.25- diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(1)/inputs/POTCAR.spec b/tests/test_data/vasp/H_Graphite/relax_1_(1)/inputs/POTCAR.spec new file mode 100644 index 0000000000..35025b8b16 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_1_(1)/inputs/POTCAR.spec @@ -0,0 +1,2 @@ +H +C diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/CONTCAR.gz b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/CONTCAR.gz new file mode 100644 index 0000000000..622e8ffcd2 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/INCAR.gz b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/INCAR.gz new file mode 100644 index 0000000000..64d0620094 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/INCAR.orig.gz b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..0342cc5f6d Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/KPOINTS.gz b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/KPOINTS.gz new file mode 100644 index 0000000000..184eaa70b9 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/KPOINTS.orig.gz new file mode 100644 index 0000000000..074f049c4b Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/OUTCAR.gz b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/OUTCAR.gz new file mode 100644 index 0000000000..3fe72a8827 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/POSCAR.gz b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/POSCAR.gz new file mode 100644 index 0000000000..28f1418840 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/POSCAR.orig.gz b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..52b84ab1ae Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/POTCAR.spec b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/POTCAR.spec new file mode 100644 index 0000000000..35025b8b16 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/POTCAR.spec @@ -0,0 +1,2 @@ +H +C diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/custodian.json.gz b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/custodian.json.gz new file mode 100644 index 0000000000..6ef90ac60b Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/vasprun.xml.gz b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..4bcab2b897 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(1)/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(2)/inputs/INCAR b/tests/test_data/vasp/H_Graphite/relax_1_(2)/inputs/INCAR new file mode 100644 index 0000000000..6157886906 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_1_(2)/inputs/INCAR @@ -0,0 +1,28 @@ +ALGO = All +EDIFF = 1e-05 +EDIFFG = -0.1 +ENAUG = 1360 +ENCUT = 680 +IBRION = 2 +ISIF = 2 +ISMEAR = 0 +ISPIN = 2 +LAECHG = True +LASPH = True +LCHARG = True +LELF = False +LMIXTAU = True +LORBIT = 11 +LREAL = Auto +LVTOT = True +LWAVE = True +MAGMOM = 6*0.6 +METAGGA = R2scan +NCORE = 12 +NELM = 200 +NGX = 18 +NGY = 18 +NGZ = 60 +NSW = 99 +PREC = Accurate +SIGMA = 0.2 diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(2)/inputs/KPOINTS b/tests/test_data/vasp/H_Graphite/relax_1_(2)/inputs/KPOINTS new file mode 100644 index 0000000000..9bcad4fb60 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_1_(2)/inputs/KPOINTS @@ -0,0 +1,4 @@ +pymatgen with grid density = 88 / number of atoms +0 +Gamma +3 3 1 diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(2)/inputs/POSCAR b/tests/test_data/vasp/H_Graphite/relax_1_(2)/inputs/POSCAR new file mode 100644 index 0000000000..e2b2d38465 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_1_(2)/inputs/POSCAR @@ -0,0 +1,14 @@ +H2 C4 +1.0 + 1.2338620000000000 -2.1371120000000001 0.0000000000000000 + 1.2338620000000000 2.1371120000000001 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 8.6850380000000005 +H C +2 4 +direct + 0.3333333333333333 0.1666666666666667 0.0833333333333333 H+ + 0.0000000000000000 0.5000000000000000 0.0000000000000000 H+ + 0.9036950000000000 0.9518480000000000 0.6974110000000000 C0.25- + 0.0963050000000000 0.0481520000000000 0.3025890000000000 C0.25- + 0.2373350000000000 0.6186680000000000 0.6984530000000000 C0.25- + 0.7626650000000000 0.3813320000000000 0.3015470000000000 C0.25- diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(2)/inputs/POTCAR.spec b/tests/test_data/vasp/H_Graphite/relax_1_(2)/inputs/POTCAR.spec new file mode 100644 index 0000000000..35025b8b16 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_1_(2)/inputs/POTCAR.spec @@ -0,0 +1,2 @@ +H +C diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/CONTCAR.gz b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/CONTCAR.gz new file mode 100644 index 0000000000..1b4e4e47f9 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/INCAR.gz b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/INCAR.gz new file mode 100644 index 0000000000..b2966e940a Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/INCAR.orig.gz b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..09448801c4 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/KPOINTS.gz b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/KPOINTS.gz new file mode 100644 index 0000000000..889a8d884e Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/KPOINTS.orig.gz new file mode 100644 index 0000000000..011a9da0c4 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/OUTCAR.gz b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/OUTCAR.gz new file mode 100644 index 0000000000..c49a7c5102 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/POSCAR.gz b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/POSCAR.gz new file mode 100644 index 0000000000..81c080b8f9 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/POSCAR.orig.gz b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..57ee6331a4 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/POTCAR.spec b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/POTCAR.spec new file mode 100644 index 0000000000..35025b8b16 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/POTCAR.spec @@ -0,0 +1,2 @@ +H +C diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/custodian.json.gz b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/custodian.json.gz new file mode 100644 index 0000000000..e6ec78a533 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/vasprun.xml.gz b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..9425deecf6 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/relax_1_(2)/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_0/inputs/INCAR b/tests/test_data/vasp/H_Graphite/static_0/inputs/INCAR new file mode 100644 index 0000000000..e8524053c0 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/static_0/inputs/INCAR @@ -0,0 +1,27 @@ +ALGO = Fast +EDIFF = 1e-05 +EDIFFG = -0.1 +ENAUG = 1360 +ENCUT = 680 +ISIF = 2 +ISMEAR = -5 +ISPIN = 2 +LAECHG = True +LASPH = True +LCHARG = True +LELF = False +LMIXTAU = True +LORBIT = 11 +LREAL = False +LVTOT = True +LWAVE = False +MAGMOM = 4*0.0 +METAGGA = R2scan +NCORE = 12 +NELM = 200 +NGX = 18 +NGY = 18 +NGZ = 60 +NSW = 0 +PREC = Accurate +SIGMA = 0.2 diff --git a/tests/test_data/vasp/H_Graphite/static_0/inputs/KPOINTS b/tests/test_data/vasp/H_Graphite/static_0/inputs/KPOINTS new file mode 100644 index 0000000000..e61e15ddb1 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/static_0/inputs/KPOINTS @@ -0,0 +1,4 @@ +pymatgen with grid density = 88 / number of atoms +0 +Gamma +4 4 1 diff --git a/tests/test_data/vasp/H_Graphite/static_0/inputs/POSCAR b/tests/test_data/vasp/H_Graphite/static_0/inputs/POSCAR new file mode 100644 index 0000000000..3a506ad1da --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/static_0/inputs/POSCAR @@ -0,0 +1,12 @@ +C4 +1.0 + 1.2338620000000000 -2.1371120000000001 0.0000000000000000 + 1.2338620000000000 2.1371120000000001 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 8.6850380000000005 +C +4 +direct + 0.0000000000000000 0.0000000000000000 0.7500000000000000 C + 0.0000000000000000 0.0000000000000000 0.2500000000000000 C + 0.3333330000000032 0.6666669999999968 0.7500000000000000 C + 0.6666669999999968 0.3333330000000032 0.2500000000000000 C diff --git a/tests/test_data/vasp/H_Graphite/static_0/inputs/POTCAR.spec b/tests/test_data/vasp/H_Graphite/static_0/inputs/POTCAR.spec new file mode 100644 index 0000000000..3cc58df837 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/static_0/inputs/POTCAR.spec @@ -0,0 +1 @@ +C diff --git a/tests/test_data/vasp/H_Graphite/static_0/outputs/AECCAR0.gz b/tests/test_data/vasp/H_Graphite/static_0/outputs/AECCAR0.gz new file mode 100644 index 0000000000..e950f36609 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_0/outputs/AECCAR0.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_0/outputs/AECCAR2.gz b/tests/test_data/vasp/H_Graphite/static_0/outputs/AECCAR2.gz new file mode 100644 index 0000000000..618526f6b2 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_0/outputs/AECCAR2.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_0/outputs/CONTCAR.gz b/tests/test_data/vasp/H_Graphite/static_0/outputs/CONTCAR.gz new file mode 100644 index 0000000000..c8345fb23f Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_0/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_0/outputs/INCAR.gz b/tests/test_data/vasp/H_Graphite/static_0/outputs/INCAR.gz new file mode 100644 index 0000000000..70880fa1a8 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_0/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_0/outputs/INCAR.orig.gz b/tests/test_data/vasp/H_Graphite/static_0/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..253baf50c7 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_0/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_0/outputs/KPOINTS.gz b/tests/test_data/vasp/H_Graphite/static_0/outputs/KPOINTS.gz new file mode 100644 index 0000000000..02e3064371 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_0/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_0/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/H_Graphite/static_0/outputs/KPOINTS.orig.gz new file mode 100644 index 0000000000..35eb45c3e2 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_0/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_0/outputs/OUTCAR.gz b/tests/test_data/vasp/H_Graphite/static_0/outputs/OUTCAR.gz new file mode 100644 index 0000000000..f96b57c80f Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_0/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_0/outputs/POSCAR.gz b/tests/test_data/vasp/H_Graphite/static_0/outputs/POSCAR.gz new file mode 100644 index 0000000000..0db2e468ba Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_0/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_0/outputs/POSCAR.orig.gz b/tests/test_data/vasp/H_Graphite/static_0/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..81bcb914f5 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_0/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_0/outputs/POTCAR.spec b/tests/test_data/vasp/H_Graphite/static_0/outputs/POTCAR.spec new file mode 100644 index 0000000000..3cc58df837 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/static_0/outputs/POTCAR.spec @@ -0,0 +1 @@ +C diff --git a/tests/test_data/vasp/H_Graphite/static_0/outputs/custodian.json.gz b/tests/test_data/vasp/H_Graphite/static_0/outputs/custodian.json.gz new file mode 100644 index 0000000000..f7ca5a6796 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_0/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_0/outputs/vasprun.xml.gz b/tests/test_data/vasp/H_Graphite/static_0/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..6a80426414 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_0/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_1/inputs/INCAR b/tests/test_data/vasp/H_Graphite/static_1/inputs/INCAR new file mode 100644 index 0000000000..7958558086 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/static_1/inputs/INCAR @@ -0,0 +1,27 @@ +ALGO = Fast +EDIFF = 1e-05 +EDIFFG = -0.1 +ENAUG = 1360 +ENCUT = 680 +ISIF = 2 +ISMEAR = -5 +ISPIN = 2 +LAECHG = True +LASPH = True +LCHARG = True +LELF = False +LMIXTAU = True +LORBIT = 11 +LREAL = False +LVTOT = True +LWAVE = False +MAGMOM = 1*-0.331 2*-0.215 2*0.21 +METAGGA = R2scan +NCORE = 12 +NELM = 200 +NGX = 18 +NGY = 18 +NGZ = 60 +NSW = 0 +PREC = Accurate +SIGMA = 0.2 diff --git a/tests/test_data/vasp/H_Graphite/static_1/inputs/KPOINTS b/tests/test_data/vasp/H_Graphite/static_1/inputs/KPOINTS new file mode 100644 index 0000000000..9bcad4fb60 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/static_1/inputs/KPOINTS @@ -0,0 +1,4 @@ +pymatgen with grid density = 88 / number of atoms +0 +Gamma +3 3 1 diff --git a/tests/test_data/vasp/H_Graphite/static_1/inputs/POSCAR b/tests/test_data/vasp/H_Graphite/static_1/inputs/POSCAR new file mode 100644 index 0000000000..28208eaa87 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/static_1/inputs/POSCAR @@ -0,0 +1,13 @@ +H1 C4 +1.0 + 1.2338620000000000 -2.1371120000000001 0.0000000000000000 + 1.2338620000000000 2.1371120000000001 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 8.6850380000000005 +H C +1 4 +direct + -0.0000000000000000 0.5000000000000000 -0.0000000000000000 H + -0.0963048435554477 -0.0481524217777239 0.6974110642484505 C + 0.0963048435554477 0.0481524217777239 0.3025889357515497 C + 0.2373351124142039 0.6186680562070971 0.6984529814857299 C + 0.7626648875857960 0.3813319437929029 0.3015470185142700 C diff --git a/tests/test_data/vasp/H_Graphite/static_1/inputs/POTCAR.spec b/tests/test_data/vasp/H_Graphite/static_1/inputs/POTCAR.spec new file mode 100644 index 0000000000..35025b8b16 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/static_1/inputs/POTCAR.spec @@ -0,0 +1,2 @@ +H +C diff --git a/tests/test_data/vasp/H_Graphite/static_1/outputs/AECCAR0.gz b/tests/test_data/vasp/H_Graphite/static_1/outputs/AECCAR0.gz new file mode 100644 index 0000000000..b9ada34059 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_1/outputs/AECCAR0.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_1/outputs/AECCAR2.gz b/tests/test_data/vasp/H_Graphite/static_1/outputs/AECCAR2.gz new file mode 100644 index 0000000000..5dce4754d1 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_1/outputs/AECCAR2.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_1/outputs/CONTCAR.gz b/tests/test_data/vasp/H_Graphite/static_1/outputs/CONTCAR.gz new file mode 100644 index 0000000000..d4f1c1da83 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_1/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_1/outputs/INCAR.gz b/tests/test_data/vasp/H_Graphite/static_1/outputs/INCAR.gz new file mode 100644 index 0000000000..7c494ff739 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_1/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_1/outputs/INCAR.orig.gz b/tests/test_data/vasp/H_Graphite/static_1/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..640521f55d Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_1/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_1/outputs/KPOINTS.gz b/tests/test_data/vasp/H_Graphite/static_1/outputs/KPOINTS.gz new file mode 100644 index 0000000000..6b52ac1081 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_1/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_1/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/H_Graphite/static_1/outputs/KPOINTS.orig.gz new file mode 100644 index 0000000000..8c081e5456 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_1/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_1/outputs/OUTCAR.gz b/tests/test_data/vasp/H_Graphite/static_1/outputs/OUTCAR.gz new file mode 100644 index 0000000000..e82ac55646 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_1/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_1/outputs/POSCAR.gz b/tests/test_data/vasp/H_Graphite/static_1/outputs/POSCAR.gz new file mode 100644 index 0000000000..f70c2eb53e Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_1/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_1/outputs/POSCAR.orig.gz b/tests/test_data/vasp/H_Graphite/static_1/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..6013829d78 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_1/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_1/outputs/POTCAR.spec b/tests/test_data/vasp/H_Graphite/static_1/outputs/POTCAR.spec new file mode 100644 index 0000000000..35025b8b16 --- /dev/null +++ b/tests/test_data/vasp/H_Graphite/static_1/outputs/POTCAR.spec @@ -0,0 +1,2 @@ +H +C diff --git a/tests/test_data/vasp/H_Graphite/static_1/outputs/custodian.json.gz b/tests/test_data/vasp/H_Graphite/static_1/outputs/custodian.json.gz new file mode 100644 index 0000000000..100362efd0 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_1/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/H_Graphite/static_1/outputs/vasprun.xml.gz b/tests/test_data/vasp/H_Graphite/static_1/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..ea65a1a889 Binary files /dev/null and b/tests/test_data/vasp/H_Graphite/static_1/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/Si_pressure_EOS_fit.json.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/Si_pressure_EOS_fit.json.gz new file mode 100644 index 0000000000..26d495f86e Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/Si_pressure_EOS_fit.json.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/inputs/INCAR b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/inputs/INCAR new file mode 100644 index 0000000000..1e04bce2fe --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/inputs/INCAR @@ -0,0 +1,27 @@ +ALGO = Fast +EDIFF = 1e-06 +EDIFFG = -0.02 +ENAUG = 1360 +ENCUT = 680 +IBRION = 2 +ISIF = 2 +ISMEAR = 0 +ISPIN = 2 +KPAR = 2 +KSPACING = 0.22 +LAECHG = False +LASPH = True +LCHARG = False +LELF = False +LMAXMIX = 6 +LMIXTAU = True +LORBIT = 11 +LREAL = False +LVTOT = False +LWAVE = True +MAGMOM = 2*0.0 +NCORE = 16 +NELM = 200 +NSW = 99 +PREC = Accurate +SIGMA = 0.05 diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/inputs/POSCAR b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/inputs/POSCAR new file mode 100644 index 0000000000..6bd2360833 --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/inputs/POSCAR @@ -0,0 +1,10 @@ +Si2 +1.0 + 3.1814727567389238 0.0000000000000000 1.8368238935270336 + 1.0604909189129750 2.9995224698857785 1.8368238935270336 + 0.0000000000000000 0.0000000000000000 3.6736477870540671 +Si +2 +direct + 0.8750000000000000 0.8750000000000000 0.8750000000000000 Si + 0.1250000000000000 0.1250000000000000 0.1250000000000000 Si diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/inputs/POTCAR.spec b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/inputs/POTCAR.spec similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/inputs/POTCAR.spec rename to tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/inputs/POTCAR.spec diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/CHG.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/CHG.gz new file mode 100644 index 0000000000..17aa32f879 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/CHG.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/CHGCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/CHGCAR.gz new file mode 100644 index 0000000000..2498abbe0b Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/CHGCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/CONTCAR.gz new file mode 100644 index 0000000000..2d072484c5 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/DOSCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/DOSCAR.gz new file mode 100644 index 0000000000..4924a4cda2 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/DOSCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/EIGENVAL.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/EIGENVAL.gz new file mode 100644 index 0000000000..41a60b534a Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/EIGENVAL.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/IBZKPT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/IBZKPT.gz new file mode 100644 index 0000000000..af15176a97 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/IBZKPT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/INCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/INCAR.gz new file mode 100644 index 0000000000..82d3842ac8 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..a7a0f032e6 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/OSZICAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/OSZICAR.gz new file mode 100644 index 0000000000..027b7a3473 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/OSZICAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/OUTCAR.gz new file mode 100644 index 0000000000..112cc40b8e Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/PCDAT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/PCDAT.gz new file mode 100644 index 0000000000..3267d33dd3 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/PCDAT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/POSCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/POSCAR.gz new file mode 100644 index 0000000000..597ef4bcfd Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..a93febd4db Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/inputs/POTCAR.spec b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/POTCAR.spec similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/inputs/POTCAR.spec rename to tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/POTCAR.spec diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/PROCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/PROCAR.gz new file mode 100644 index 0000000000..9220687ceb Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/PROCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/REPORT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/REPORT.gz new file mode 100644 index 0000000000..834faef8dc Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/REPORT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/WAVECAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/WAVECAR.gz new file mode 100644 index 0000000000..fea233c14c Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/WAVECAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/XDATCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/XDATCAR.gz new file mode 100644 index 0000000000..bdefb8580f Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/XDATCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/std_err.txt b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/std_err.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/vasp.out.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/vasp.out.gz new file mode 100644 index 0000000000..7208a154f6 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/vasp.out.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/vaspout.h5.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/vaspout.h5.gz new file mode 100644 index 0000000000..adafab65c2 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/vaspout.h5.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..b8d6f185fb Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_0/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/inputs/INCAR b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/inputs/INCAR new file mode 100644 index 0000000000..1e04bce2fe --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/inputs/INCAR @@ -0,0 +1,27 @@ +ALGO = Fast +EDIFF = 1e-06 +EDIFFG = -0.02 +ENAUG = 1360 +ENCUT = 680 +IBRION = 2 +ISIF = 2 +ISMEAR = 0 +ISPIN = 2 +KPAR = 2 +KSPACING = 0.22 +LAECHG = False +LASPH = True +LCHARG = False +LELF = False +LMAXMIX = 6 +LMIXTAU = True +LORBIT = 11 +LREAL = False +LVTOT = False +LWAVE = True +MAGMOM = 2*0.0 +NCORE = 16 +NELM = 200 +NSW = 99 +PREC = Accurate +SIGMA = 0.05 diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/inputs/POSCAR b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/inputs/POSCAR new file mode 100644 index 0000000000..61aff50833 --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/inputs/POSCAR @@ -0,0 +1,10 @@ +Si2 +1.0 + 3.5163646258693375 0.0000000000000000 2.0301737770561954 + 1.1721215419564459 3.3152616772421761 2.0301737770561954 + 0.0000000000000000 0.0000000000000000 4.0603475541123908 +Si +2 +direct + 0.8750000000000000 0.8750000000000000 0.8750000000000000 Si + 0.1250000000000000 0.1250000000000000 0.1250000000000000 Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/inputs/POTCAR.spec b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/inputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/inputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/CHG.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/CHG.gz new file mode 100644 index 0000000000..17aa32f879 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/CHG.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/CHGCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/CHGCAR.gz new file mode 100644 index 0000000000..2498abbe0b Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/CHGCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/CONTCAR.gz new file mode 100644 index 0000000000..9236d2c16d Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/DOSCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/DOSCAR.gz new file mode 100644 index 0000000000..1edd47573e Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/DOSCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/EIGENVAL.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/EIGENVAL.gz new file mode 100644 index 0000000000..227465a341 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/EIGENVAL.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/IBZKPT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/IBZKPT.gz new file mode 100644 index 0000000000..ea55e6807c Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/IBZKPT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/INCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/INCAR.gz new file mode 100644 index 0000000000..d112f2a413 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..354fbb998d Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/OSZICAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/OSZICAR.gz new file mode 100644 index 0000000000..27ef11e1db Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/OSZICAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/OUTCAR.gz new file mode 100644 index 0000000000..beb2962e9e Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/PCDAT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/PCDAT.gz new file mode 100644 index 0000000000..6490374080 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/PCDAT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/POSCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/POSCAR.gz new file mode 100644 index 0000000000..8e6a597e8d Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..bee699f0ea Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/POTCAR.spec b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/PROCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/PROCAR.gz new file mode 100644 index 0000000000..67befd98f8 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/PROCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/REPORT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/REPORT.gz new file mode 100644 index 0000000000..ba7bbe4d4b Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/REPORT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/WAVECAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/WAVECAR.gz new file mode 100644 index 0000000000..fea233c14c Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/WAVECAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/XDATCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/XDATCAR.gz new file mode 100644 index 0000000000..45545895f6 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/XDATCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/std_err.txt b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/std_err.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/vasp.out.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/vasp.out.gz new file mode 100644 index 0000000000..eebfc2bace Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/vasp.out.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/vaspout.h5.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/vaspout.h5.gz new file mode 100644 index 0000000000..ca6713a534 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/vaspout.h5.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..a68d4be234 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Deformation_Relax_1/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/inputs/INCAR b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/inputs/INCAR new file mode 100644 index 0000000000..1be7d45b90 --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/inputs/INCAR @@ -0,0 +1,27 @@ +ALGO = Fast +EDIFF = 1e-06 +EDIFFG = -0.05 +ENAUG = 1360 +ENCUT = 680 +IBRION = 2 +ISIF = 3 +ISMEAR = 0 +ISPIN = 2 +KPAR = 2 +KSPACING = 0.22 +LAECHG = False +LASPH = True +LCHARG = False +LELF = False +LMAXMIX = 6 +LMIXTAU = True +LORBIT = 11 +LREAL = False +LVTOT = False +LWAVE = True +MAGMOM = 2*-0.0 +NCORE = 16 +NELM = 200 +NSW = 99 +PREC = Accurate +SIGMA = 0.05 diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/inputs/POSCAR b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/inputs/POSCAR new file mode 100644 index 0000000000..fcb5af8c91 --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/inputs/POSCAR @@ -0,0 +1,10 @@ +Si2 +1.0 + 3.3335729999999999 0.0000000000000000 1.9246390000000000 + 1.1111910000000000 3.1429239999999998 1.9246390000000000 + 0.0000000000000000 0.0000000000000000 3.8492780000000000 +Si +2 +direct + 0.8750000000000000 0.8750000000000000 0.8750000000000000 Si + 0.1250000000000000 0.1250000000000000 0.1250000000000000 Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/inputs/POTCAR.spec b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/inputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/inputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/CHG.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/CHG.gz new file mode 100644 index 0000000000..6a033511ba Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/CHG.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/CHGCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/CHGCAR.gz new file mode 100644 index 0000000000..4e63eeb1e2 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/CHGCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/CONTCAR.gz new file mode 100644 index 0000000000..e794988f51 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/DOSCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/DOSCAR.gz new file mode 100644 index 0000000000..2d02a8f604 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/DOSCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/EIGENVAL.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/EIGENVAL.gz new file mode 100644 index 0000000000..a5e67b6f3c Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/EIGENVAL.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/IBZKPT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/IBZKPT.gz new file mode 100644 index 0000000000..18c56414a6 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/IBZKPT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/INCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/INCAR.gz new file mode 100644 index 0000000000..eacd08a195 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..3d2fa8c04f Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/OSZICAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/OSZICAR.gz new file mode 100644 index 0000000000..9bc7619492 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/OSZICAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/OUTCAR.gz new file mode 100644 index 0000000000..72bb5ecfba Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/PCDAT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/PCDAT.gz new file mode 100644 index 0000000000..46d6c5b48b Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/PCDAT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/POSCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/POSCAR.gz new file mode 100644 index 0000000000..cdf20b631b Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..8d84d5a766 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/POTCAR.spec b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/PROCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/PROCAR.gz new file mode 100644 index 0000000000..28bb9585d9 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/PROCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/REPORT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/REPORT.gz new file mode 100644 index 0000000000..7bf8e0b1aa Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/REPORT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/WAVECAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/WAVECAR.gz new file mode 100644 index 0000000000..100120f34b Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/WAVECAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/XDATCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/XDATCAR.gz new file mode 100644 index 0000000000..326838393f Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/XDATCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/std_err.txt b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/std_err.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/vasp.out.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/vasp.out.gz new file mode 100644 index 0000000000..7561c00c2c Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/vasp.out.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/vaspout.h5.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/vaspout.h5.gz new file mode 100644 index 0000000000..55e41e6fb3 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/vaspout.h5.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..ab2e233d6c Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/inputs/INCAR b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/inputs/INCAR new file mode 100644 index 0000000000..418d22a9da --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/inputs/INCAR @@ -0,0 +1,27 @@ +ALGO = Fast +EDIFF = 1e-06 +EDIFFG = -0.02 +ENAUG = 1360 +ENCUT = 680 +IBRION = 2 +ISIF = 3 +ISMEAR = 0 +ISPIN = 2 +KPAR = 2 +KSPACING = 0.22 +LAECHG = False +LASPH = True +LCHARG = False +LELF = False +LMAXMIX = 6 +LMIXTAU = True +LORBIT = 11 +LREAL = False +LVTOT = False +LWAVE = True +MAGMOM = 2*0.0 +NCORE = 16 +NELM = 200 +NSW = 99 +PREC = Accurate +SIGMA = 0.05 diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/inputs/POSCAR b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/inputs/POSCAR new file mode 100644 index 0000000000..8812f4b58f --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/inputs/POSCAR @@ -0,0 +1,10 @@ +Si2 +1.0 + 3.3489186913041307 -0.0000000000000000 1.9334988352916145 + 1.1163062304347104 3.1573920735639773 1.9334988352916145 + 0.0000000000000000 0.0000000000000000 3.8669976705832290 +Si +2 +direct + 0.8750000000000000 0.8750000000000000 0.8750000000000000 Si + 0.1250000000000000 0.1250000000000000 0.1250000000000000 Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/inputs/POTCAR.spec b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/inputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/inputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/CHG.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/CHG.gz new file mode 100644 index 0000000000..6a033511ba Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/CHG.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/CHGCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/CHGCAR.gz new file mode 100644 index 0000000000..4e63eeb1e2 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/CHGCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/CONTCAR.gz new file mode 100644 index 0000000000..cb39d3089f Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/DOSCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/DOSCAR.gz new file mode 100644 index 0000000000..c723b9bd92 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/DOSCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/EIGENVAL.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/EIGENVAL.gz new file mode 100644 index 0000000000..326a14d48f Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/EIGENVAL.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/IBZKPT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/IBZKPT.gz new file mode 100644 index 0000000000..01004a20f7 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/IBZKPT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/INCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/INCAR.gz new file mode 100644 index 0000000000..22265ab14c Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..7b6394cb08 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/OSZICAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/OSZICAR.gz new file mode 100644 index 0000000000..bff6e4afe9 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/OSZICAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/OUTCAR.gz new file mode 100644 index 0000000000..4233f732fe Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/PCDAT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/PCDAT.gz new file mode 100644 index 0000000000..be04ffab83 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/PCDAT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/POSCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/POSCAR.gz new file mode 100644 index 0000000000..9320b8e617 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..78670cafdf Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/POTCAR.spec b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/PROCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/PROCAR.gz new file mode 100644 index 0000000000..209693026b Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/PROCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/REPORT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/REPORT.gz new file mode 100644 index 0000000000..f2acdec2ec Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/REPORT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/WAVECAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/WAVECAR.gz new file mode 100644 index 0000000000..100120f34b Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/WAVECAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/XDATCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/XDATCAR.gz new file mode 100644 index 0000000000..4d3a5abb6c Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/XDATCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/std_err.txt b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/std_err.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/vasp.out.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/vasp.out.gz new file mode 100644 index 0000000000..7ede4c05ca Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/vasp.out.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/vaspout.h5.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/vaspout.h5.gz new file mode 100644 index 0000000000..ca0ecaea9d Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/vaspout.h5.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..f72a796a78 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/inputs/INCAR b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/inputs/INCAR new file mode 100644 index 0000000000..692243f78c --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/inputs/INCAR @@ -0,0 +1,24 @@ +ALGO = Normal +EDIFF = 1e-06 +ENAUG = 1360 +ENCUT = 680 +ISMEAR = -5 +ISPIN = 2 +KPAR = 2 +KSPACING = 0.22 +LAECHG = False +LASPH = True +LCHARG = False +LELF = False +LMAXMIX = 6 +LMIXTAU = True +LORBIT = 11 +LREAL = False +LVTOT = False +LWAVE = False +MAGMOM = 2*0.0 +NCORE = 16 +NELM = 200 +NSW = 0 +PREC = Accurate +SIGMA = 0.05 diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/inputs/POSCAR b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/inputs/POSCAR new file mode 100644 index 0000000000..6bd2360833 --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/inputs/POSCAR @@ -0,0 +1,10 @@ +Si2 +1.0 + 3.1814727567389238 0.0000000000000000 1.8368238935270336 + 1.0604909189129750 2.9995224698857785 1.8368238935270336 + 0.0000000000000000 0.0000000000000000 3.6736477870540671 +Si +2 +direct + 0.8750000000000000 0.8750000000000000 0.8750000000000000 Si + 0.1250000000000000 0.1250000000000000 0.1250000000000000 Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/inputs/POTCAR.spec b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/inputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/inputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/CHG.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/CHG.gz new file mode 100644 index 0000000000..17aa32f879 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/CHG.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/CHGCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/CHGCAR.gz new file mode 100644 index 0000000000..2498abbe0b Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/CHGCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/CONTCAR.gz new file mode 100644 index 0000000000..adaaa526cb Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/DOSCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/DOSCAR.gz new file mode 100644 index 0000000000..916cd5075d Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/DOSCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/EIGENVAL.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/EIGENVAL.gz new file mode 100644 index 0000000000..b89c4e7fe7 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/EIGENVAL.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/IBZKPT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/IBZKPT.gz new file mode 100644 index 0000000000..b0f6428cbc Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/IBZKPT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/INCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/INCAR.gz new file mode 100644 index 0000000000..c373c04efc Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..032ce160ae Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/OSZICAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/OSZICAR.gz new file mode 100644 index 0000000000..e23a7ed8f7 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/OSZICAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/OUTCAR.gz new file mode 100644 index 0000000000..68106b3ba0 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/PCDAT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/PCDAT.gz new file mode 100644 index 0000000000..a1241679b0 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/PCDAT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/POSCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/POSCAR.gz new file mode 100644 index 0000000000..851d87aaca Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..1386a02d38 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/POTCAR.spec b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/PROCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/PROCAR.gz new file mode 100644 index 0000000000..6e7b3a0162 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/PROCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/REPORT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/REPORT.gz new file mode 100644 index 0000000000..59ec0230ec Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/REPORT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/WAVECAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/WAVECAR.gz new file mode 100644 index 0000000000..fea233c14c Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/WAVECAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/XDATCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/XDATCAR.gz new file mode 100644 index 0000000000..7b928ba3e6 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/XDATCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/std_err.txt b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/std_err.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/vasp.out.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/vasp.out.gz new file mode 100644 index 0000000000..cd95f7a684 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/vasp.out.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/vaspout.h5.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/vaspout.h5.gz new file mode 100644 index 0000000000..ae650aee45 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/vaspout.h5.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..a517cda222 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/inputs/INCAR b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/inputs/INCAR new file mode 100644 index 0000000000..692243f78c --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/inputs/INCAR @@ -0,0 +1,24 @@ +ALGO = Normal +EDIFF = 1e-06 +ENAUG = 1360 +ENCUT = 680 +ISMEAR = -5 +ISPIN = 2 +KPAR = 2 +KSPACING = 0.22 +LAECHG = False +LASPH = True +LCHARG = False +LELF = False +LMAXMIX = 6 +LMIXTAU = True +LORBIT = 11 +LREAL = False +LVTOT = False +LWAVE = False +MAGMOM = 2*0.0 +NCORE = 16 +NELM = 200 +NSW = 0 +PREC = Accurate +SIGMA = 0.05 diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/inputs/POSCAR b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/inputs/POSCAR new file mode 100644 index 0000000000..61aff50833 --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/inputs/POSCAR @@ -0,0 +1,10 @@ +Si2 +1.0 + 3.5163646258693375 0.0000000000000000 2.0301737770561954 + 1.1721215419564459 3.3152616772421761 2.0301737770561954 + 0.0000000000000000 0.0000000000000000 4.0603475541123908 +Si +2 +direct + 0.8750000000000000 0.8750000000000000 0.8750000000000000 Si + 0.1250000000000000 0.1250000000000000 0.1250000000000000 Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/inputs/POTCAR.spec b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/inputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/inputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/CHG.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/CHG.gz new file mode 100644 index 0000000000..17aa32f879 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/CHG.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/CHGCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/CHGCAR.gz new file mode 100644 index 0000000000..2498abbe0b Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/CHGCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/CONTCAR.gz new file mode 100644 index 0000000000..f6c682922c Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/DOSCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/DOSCAR.gz new file mode 100644 index 0000000000..2aa9ff9321 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/DOSCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/EIGENVAL.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/EIGENVAL.gz new file mode 100644 index 0000000000..7fed6187f7 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/EIGENVAL.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/IBZKPT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/IBZKPT.gz new file mode 100644 index 0000000000..ff86c64a60 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/IBZKPT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/INCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/INCAR.gz new file mode 100644 index 0000000000..fe5634f25b Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..2ba91a25de Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/OSZICAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/OSZICAR.gz new file mode 100644 index 0000000000..65258c81b8 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/OSZICAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/OUTCAR.gz new file mode 100644 index 0000000000..4f9ded96fb Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/PCDAT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/PCDAT.gz new file mode 100644 index 0000000000..8406d21c2a Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/PCDAT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/POSCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/POSCAR.gz new file mode 100644 index 0000000000..9427674793 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..0b007cbffe Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/POTCAR.spec b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/PROCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/PROCAR.gz new file mode 100644 index 0000000000..9e0d1543c7 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/PROCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/REPORT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/REPORT.gz new file mode 100644 index 0000000000..1ecf34c42f Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/REPORT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/WAVECAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/WAVECAR.gz new file mode 100644 index 0000000000..fea233c14c Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/WAVECAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/XDATCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/XDATCAR.gz new file mode 100644 index 0000000000..231cfc83de Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/XDATCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/std_err.txt b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/std_err.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/vasp.out.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/vasp.out.gz new file mode 100644 index 0000000000..54025c8367 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/vasp.out.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/vaspout.h5.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/vaspout.h5.gz new file mode 100644 index 0000000000..e124cbbc97 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/vaspout.h5.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..0bae73948f Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_1/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/inputs/INCAR b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/inputs/INCAR new file mode 100644 index 0000000000..692243f78c --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/inputs/INCAR @@ -0,0 +1,24 @@ +ALGO = Normal +EDIFF = 1e-06 +ENAUG = 1360 +ENCUT = 680 +ISMEAR = -5 +ISPIN = 2 +KPAR = 2 +KSPACING = 0.22 +LAECHG = False +LASPH = True +LCHARG = False +LELF = False +LMAXMIX = 6 +LMIXTAU = True +LORBIT = 11 +LREAL = False +LVTOT = False +LWAVE = False +MAGMOM = 2*0.0 +NCORE = 16 +NELM = 200 +NSW = 0 +PREC = Accurate +SIGMA = 0.05 diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/inputs/POSCAR b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/inputs/POSCAR new file mode 100644 index 0000000000..8812f4b58f --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/inputs/POSCAR @@ -0,0 +1,10 @@ +Si2 +1.0 + 3.3489186913041307 -0.0000000000000000 1.9334988352916145 + 1.1163062304347104 3.1573920735639773 1.9334988352916145 + 0.0000000000000000 0.0000000000000000 3.8669976705832290 +Si +2 +direct + 0.8750000000000000 0.8750000000000000 0.8750000000000000 Si + 0.1250000000000000 0.1250000000000000 0.1250000000000000 Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/inputs/POTCAR.spec b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/inputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/inputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/CHG.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/CHG.gz new file mode 100644 index 0000000000..6a033511ba Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/CHG.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/CHGCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/CHGCAR.gz new file mode 100644 index 0000000000..4e63eeb1e2 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/CHGCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/CONTCAR.gz new file mode 100644 index 0000000000..2c16eb5f7b Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/DOSCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/DOSCAR.gz new file mode 100644 index 0000000000..aa6dcb0354 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/DOSCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/EIGENVAL.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/EIGENVAL.gz new file mode 100644 index 0000000000..fe6d778a2b Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/EIGENVAL.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/IBZKPT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/IBZKPT.gz new file mode 100644 index 0000000000..a9d5d537fc Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/IBZKPT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/INCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/INCAR.gz new file mode 100644 index 0000000000..065628f0fa Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..453de76f4b Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/OSZICAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/OSZICAR.gz new file mode 100644 index 0000000000..f554911e27 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/OSZICAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/OUTCAR.gz new file mode 100644 index 0000000000..5aa4e39e04 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/PCDAT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/PCDAT.gz new file mode 100644 index 0000000000..95fe066300 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/PCDAT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/POSCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/POSCAR.gz new file mode 100644 index 0000000000..6b1635af73 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..7b14ea72bd Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/POTCAR.spec b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/PROCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/PROCAR.gz new file mode 100644 index 0000000000..54df4c8030 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/PROCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/REPORT.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/REPORT.gz new file mode 100644 index 0000000000..a89e5347bc Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/REPORT.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/WAVECAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/WAVECAR.gz new file mode 100644 index 0000000000..100120f34b Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/WAVECAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/XDATCAR.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/XDATCAR.gz new file mode 100644 index 0000000000..cd561eb579 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/XDATCAR.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/std_err.txt b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/std_err.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/vasp.out.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/vasp.out.gz new file mode 100644 index 0000000000..741a77280d Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/vasp.out.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/vaspout.h5.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/vaspout.h5.gz new file mode 100644 index 0000000000..28e672fdbc Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/vaspout.h5.gz differ diff --git a/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..ce7da5ef86 Binary files /dev/null and b/tests/test_data/vasp/Si_EOS_MP_GGA/mp-149-PBE-EOS_equilibrium_static/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/inputs/INCAR b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/inputs/INCAR index 9527e3c3e9..82499cb770 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/inputs/INCAR +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/inputs/INCAR @@ -1,24 +1,24 @@ ALGO = Normal EDIFF = 1e-07 EDIFFG = -0.001 -ENAUG = 1360.0 -ENCUT = 700.0 +ENAUG = 1360 +ENCUT = 700 +GGA = Ps IBRION = 2 ISIF = 2 ISMEAR = -5 ISPIN = 2 -KSPACING = 0.2925287784072645 LAECHG = False LASPH = True -LCHARG = True -LELF = True +LCHARG = False +LELF = False LMIXTAU = True LORBIT = 11 LREAL = False LVTOT = True LWAVE = False -MAGMOM = 2*-0.0 +MAGMOM = 8*-0.0 NELM = 200 NSW = 99 PREC = Accurate -SIGMA = 0.05 +SIGMA = 0.2 diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/inputs/KPOINTS b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/inputs/KPOINTS index 093abbe92b..5a195a0bf8 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/inputs/KPOINTS +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/inputs/KPOINTS @@ -1,4 +1,4 @@ -pymatgen with grid density = 100 / number of atoms +pymatgen with grid density = 7000 / number of atoms 0 Gamma -3 3 3 +9 9 9 diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/inputs/POSCAR b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/inputs/POSCAR index dc16e02ee9..e34d0855c7 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/inputs/POSCAR +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/inputs/POSCAR @@ -1,10 +1,16 @@ -Si2 +Si8 1.0 -0.000000 2.752777 2.752777 -2.725110 0.000000 2.752777 -2.725110 2.752777 0.000000 + 5.3817476112613694 0.0000000000000000 0.0000000000000003 + -0.0000000000000003 5.4363860436534530 0.0000000000000003 + 0.0000000000000000 0.0000000000000000 5.4363860436534530 Si -2 +8 direct -0.750000 0.750000 0.750000 Si -0.500000 0.500000 0.500000 Si + 0.2500000000000000 0.2500000000000000 0.7500000000000000 Si + 0.5000000000000000 -0.0000000000000000 -0.0000000000000000 Si + 0.2500000000000000 0.7500000000000000 0.2500000000000000 Si + 0.5000000000000000 0.5000000000000000 0.5000000000000000 Si + 0.7500000000000000 0.2500000000000000 0.2500000000000000 Si + 0.0000000000000000 -0.0000000000000000 0.5000000000000000 Si + 0.7500000000000000 0.7500000000000000 0.7500000000000000 Si + -0.0000000000000000 0.5000000000000000 0.0000000000000000 Si diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/CONTCAR.gz index 4023196485..f2f550ce40 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/CONTCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/INCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/INCAR.gz index 80034f2faa..215040dbe3 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/INCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/INCAR.orig.gz index eebe8f9659..0b49ce5ceb 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/INCAR.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/KPOINTS.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/KPOINTS.gz index e0426be7b4..1124a2728e 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/KPOINTS.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/KPOINTS.orig.gz index c7d1b160a2..fe274fc108 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/KPOINTS.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/OUTCAR.gz index 65affbcf82..71e4f72293 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/OUTCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/POSCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/POSCAR.gz index c82a031038..401c8ecbf8 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/POSCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/POSCAR.orig.gz index 5cb5cb3396..9bfe335de9 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/POSCAR.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/custodian.json.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/custodian.json.gz index 740bec1d21..b708750cd0 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/custodian.json.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/transformations.json b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/transformations.json new file mode 100644 index 0000000000..5c3e2ab0b6 --- /dev/null +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/transformations.json @@ -0,0 +1 @@ +{"@module": "pymatgen.alchemy.materials", "@class": "TransformedStructure", "charge": 0.0, "lattice": {"matrix": [[5.381747611261369, 0.0, 3e-16], [-2.9698484809834997e-16, 5.436386043653453, 3e-16], [0.0, 0.0, 5.436386043653453]], "pbc": [true, true, true], "a": 5.381747611261369, "b": 5.436386043653453, "c": 5.436386043653453, "alpha": 90.0, "beta": 90.0, "gamma": 90.0, "volume": 159.05374691573508}, "properties": {}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.25, 0.75], "xyz": [1.3454369028153423, 1.3590965109133633, 4.07728953274009], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, -0.0, -0.0], "xyz": [2.6908738056306847, 0.0, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.75, 0.25], "xyz": [1.3454369028153421, 4.07728953274009, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, 0.5, 0.5], "xyz": [2.6908738056306847, 2.7181930218267265, 2.718193021826727], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.25, 0.25], "xyz": [4.036310708446027, 1.3590965109133633, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.0, -0.0, 0.5], "xyz": [0.0, 0.0, 2.7181930218267265], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.75, 0.75], "xyz": [4.036310708446027, 4.07728953274009, 4.077289532740091], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [-0.0, 0.5, 0.0], "xyz": [-1.4849242404917499e-16, 2.7181930218267265, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}], "history": [{"@module": "pymatgen.transformations.standard_transformations", "@class": "DeformStructureTransformation", "@version": null, "deformation": [[0.9899494936611666, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]], "input_structure": {"@module": "pymatgen.core.structure", "@class": "Structure", "charge": 0.0, "lattice": {"matrix": [[5.436386043653454, -0.0, 3e-16], [-3e-16, 5.436386043653453, 3e-16], [0.0, -0.0, 5.436386043653453]], "pbc": [true, true, true], "a": 5.436386043653454, "b": 5.436386043653453, "c": 5.436386043653453, "alpha": 90.0, "beta": 90.0, "gamma": 90.0, "volume": 160.66854716749313}, "properties": {}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.25, 0.75], "xyz": [1.3590965109133635, 1.3590965109133633, 4.07728953274009], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, -0.0, -0.0], "xyz": [2.718193021826727, 0.0, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.75, 0.25], "xyz": [1.3590965109133633, 4.07728953274009, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, 0.5, 0.5], "xyz": [2.718193021826727, 2.7181930218267265, 2.718193021826727], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.25, 0.25], "xyz": [4.077289532740091, 1.3590965109133633, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.0, -0.0, 0.5], "xyz": [0.0, 0.0, 2.7181930218267265], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.75, 0.75], "xyz": [4.077289532740091, 4.07728953274009, 4.077289532740091], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [-0.0, 0.5, 0.0], "xyz": [-1.5e-16, 2.7181930218267265, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}]}, "output_parameters": {}}], "last_modified": "2024-02-09 22:21:52.163462", "other_parameters": {}, "@version": null} diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/transformations.json.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/transformations.json.gz deleted file mode 100644 index 5b648c8094..0000000000 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/transformations.json.gz and /dev/null differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/vasprun.xml.gz index 990e334b60..4c9574bec2 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/vasprun.xml.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_1_6/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/inputs/INCAR b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/inputs/INCAR index 9527e3c3e9..82499cb770 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/inputs/INCAR +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/inputs/INCAR @@ -1,24 +1,24 @@ ALGO = Normal EDIFF = 1e-07 EDIFFG = -0.001 -ENAUG = 1360.0 -ENCUT = 700.0 +ENAUG = 1360 +ENCUT = 700 +GGA = Ps IBRION = 2 ISIF = 2 ISMEAR = -5 ISPIN = 2 -KSPACING = 0.2925287784072645 LAECHG = False LASPH = True -LCHARG = True -LELF = True +LCHARG = False +LELF = False LMIXTAU = True LORBIT = 11 LREAL = False LVTOT = True LWAVE = False -MAGMOM = 2*-0.0 +MAGMOM = 8*-0.0 NELM = 200 NSW = 99 PREC = Accurate -SIGMA = 0.05 +SIGMA = 0.2 diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/inputs/KPOINTS b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/inputs/KPOINTS index 093abbe92b..5a195a0bf8 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/inputs/KPOINTS +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/inputs/KPOINTS @@ -1,4 +1,4 @@ -pymatgen with grid density = 100 / number of atoms +pymatgen with grid density = 7000 / number of atoms 0 Gamma -3 3 3 +9 9 9 diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/inputs/POSCAR b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/inputs/POSCAR index 8611e314c7..b079e79e2d 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/inputs/POSCAR +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/inputs/POSCAR @@ -1,10 +1,16 @@ -Si2 +Si8 1.0 -0.000000 2.752777 2.752777 -2.738979 0.000000 2.752777 -2.738979 2.752777 0.000000 + 5.4091358166969474 0.0000000000000000 0.0000000000000003 + -0.0000000000000003 5.4363860436534530 0.0000000000000003 + 0.0000000000000000 0.0000000000000000 5.4363860436534530 Si -2 +8 direct -0.750000 0.750000 0.750000 Si -0.500000 0.500000 0.500000 Si + 0.2500000000000000 0.2500000000000000 0.7500000000000000 Si + 0.5000000000000000 -0.0000000000000000 -0.0000000000000000 Si + 0.2500000000000000 0.7500000000000000 0.2500000000000000 Si + 0.5000000000000000 0.5000000000000000 0.5000000000000000 Si + 0.7500000000000000 0.2500000000000000 0.2500000000000000 Si + 0.0000000000000000 -0.0000000000000000 0.5000000000000000 Si + 0.7500000000000000 0.7500000000000000 0.7500000000000000 Si + -0.0000000000000000 0.5000000000000000 0.0000000000000000 Si diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/CONTCAR.gz index c1138d4d43..74a4395b91 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/CONTCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/INCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/INCAR.gz index b0349f5fba..138f675d50 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/INCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/INCAR.orig.gz index d08d2b1e7e..1e47f39064 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/INCAR.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/KPOINTS.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/KPOINTS.gz index 8109e2acdf..7ff67a157a 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/KPOINTS.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/KPOINTS.orig.gz index 9438648af3..3da9136614 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/KPOINTS.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/OUTCAR.gz index 655b38a03d..5b05df0869 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/OUTCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/POSCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/POSCAR.gz index a00cb81df8..6785ac3edb 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/POSCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/POSCAR.orig.gz index f8ff8d08fc..3b4e8fa041 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/POSCAR.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/custodian.json.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/custodian.json.gz index fbb12a7d77..1caa502289 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/custodian.json.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/transformations.json b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/transformations.json new file mode 100644 index 0000000000..6fe80303b8 --- /dev/null +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/transformations.json @@ -0,0 +1 @@ +{"@module": "pymatgen.alchemy.materials", "@class": "TransformedStructure", "charge": 0.0, "lattice": {"matrix": [[5.409135816696947, 0.0, 3e-16], [-2.9849623113198597e-16, 5.436386043653453, 3e-16], [0.0, 0.0, 5.436386043653453]], "pbc": [true, true, true], "a": 5.409135816696947, "b": 5.436386043653453, "c": 5.436386043653453, "alpha": 90.0, "beta": 90.0, "gamma": 90.0, "volume": 159.86318596982807}, "properties": {}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.25, 0.75], "xyz": [1.3522839541742369, 1.3590965109133633, 4.07728953274009], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, -0.0, -0.0], "xyz": [2.7045679083484737, 0.0, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.75, 0.25], "xyz": [1.3522839541742366, 4.07728953274009, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, 0.5, 0.5], "xyz": [2.7045679083484737, 2.7181930218267265, 2.718193021826727], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.25, 0.25], "xyz": [4.05685186252271, 1.3590965109133633, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.0, -0.0, 0.5], "xyz": [0.0, 0.0, 2.7181930218267265], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.75, 0.75], "xyz": [4.05685186252271, 4.07728953274009, 4.077289532740091], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [-0.0, 0.5, 0.0], "xyz": [-1.4924811556599299e-16, 2.7181930218267265, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}], "history": [{"@module": "pymatgen.transformations.standard_transformations", "@class": "DeformStructureTransformation", "@version": null, "deformation": [[0.99498743710662, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]], "input_structure": {"@module": "pymatgen.core.structure", "@class": "Structure", "charge": 0.0, "lattice": {"matrix": [[5.436386043653454, -0.0, 3e-16], [-3e-16, 5.436386043653453, 3e-16], [0.0, -0.0, 5.436386043653453]], "pbc": [true, true, true], "a": 5.436386043653454, "b": 5.436386043653453, "c": 5.436386043653453, "alpha": 90.0, "beta": 90.0, "gamma": 90.0, "volume": 160.66854716749313}, "properties": {}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.25, 0.75], "xyz": [1.3590965109133635, 1.3590965109133633, 4.07728953274009], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, -0.0, -0.0], "xyz": [2.718193021826727, 0.0, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.75, 0.25], "xyz": [1.3590965109133633, 4.07728953274009, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, 0.5, 0.5], "xyz": [2.718193021826727, 2.7181930218267265, 2.718193021826727], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.25, 0.25], "xyz": [4.077289532740091, 1.3590965109133633, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.0, -0.0, 0.5], "xyz": [0.0, 0.0, 2.7181930218267265], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.75, 0.75], "xyz": [4.077289532740091, 4.07728953274009, 4.077289532740091], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [-0.0, 0.5, 0.0], "xyz": [-1.5e-16, 2.7181930218267265, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}]}, "output_parameters": {}}], "last_modified": "2024-02-09 22:23:18.407207", "other_parameters": {}, "@version": null} diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/transformations.json.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/transformations.json.gz deleted file mode 100644 index 9645ef9ab9..0000000000 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/transformations.json.gz and /dev/null differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/vasprun.xml.gz index ec1bc31406..39395dddc5 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/vasprun.xml.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_2_6/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/inputs/INCAR b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/inputs/INCAR index 9527e3c3e9..82499cb770 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/inputs/INCAR +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/inputs/INCAR @@ -1,24 +1,24 @@ ALGO = Normal EDIFF = 1e-07 EDIFFG = -0.001 -ENAUG = 1360.0 -ENCUT = 700.0 +ENAUG = 1360 +ENCUT = 700 +GGA = Ps IBRION = 2 ISIF = 2 ISMEAR = -5 ISPIN = 2 -KSPACING = 0.2925287784072645 LAECHG = False LASPH = True -LCHARG = True -LELF = True +LCHARG = False +LELF = False LMIXTAU = True LORBIT = 11 LREAL = False LVTOT = True LWAVE = False -MAGMOM = 2*-0.0 +MAGMOM = 8*-0.0 NELM = 200 NSW = 99 PREC = Accurate -SIGMA = 0.05 +SIGMA = 0.2 diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/inputs/KPOINTS b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/inputs/KPOINTS index 093abbe92b..5a195a0bf8 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/inputs/KPOINTS +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/inputs/KPOINTS @@ -1,4 +1,4 @@ -pymatgen with grid density = 100 / number of atoms +pymatgen with grid density = 7000 / number of atoms 0 Gamma -3 3 3 +9 9 9 diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/inputs/POSCAR b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/inputs/POSCAR index 6e30d19874..979cc8d8b4 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/inputs/POSCAR +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/inputs/POSCAR @@ -1,10 +1,16 @@ -Si2 +Si8 1.0 -0.000000 2.752777 2.752777 -2.766507 0.000000 2.752777 -2.766507 2.752777 0.000000 + 5.4635003567114691 0.0000000000000000 0.0000000000000003 + -0.0000000000000003 5.4363860436534530 0.0000000000000003 + 0.0000000000000000 0.0000000000000000 5.4363860436534530 Si -2 +8 direct -0.750000 0.750000 0.750000 Si -0.500000 0.500000 0.500000 Si + 0.2500000000000000 0.2500000000000000 0.7500000000000000 Si + 0.5000000000000000 -0.0000000000000000 -0.0000000000000000 Si + 0.2500000000000000 0.7500000000000000 0.2500000000000000 Si + 0.5000000000000000 0.5000000000000000 0.5000000000000000 Si + 0.7500000000000000 0.2500000000000000 0.2500000000000000 Si + 0.0000000000000000 -0.0000000000000000 0.5000000000000000 Si + 0.7500000000000000 0.7500000000000000 0.7500000000000000 Si + -0.0000000000000000 0.5000000000000000 0.0000000000000000 Si diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/CONTCAR.gz index c44e7f9052..8f59e1b22d 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/CONTCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/INCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/INCAR.gz index 82b0680f86..05a55b1814 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/INCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/INCAR.orig.gz index ad587af98d..0610d068f9 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/INCAR.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/KPOINTS.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/KPOINTS.gz index b90f944cf2..5f08e6848f 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/KPOINTS.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/KPOINTS.orig.gz index 52b5fbe4c6..4f0b2bbac2 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/KPOINTS.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/OUTCAR.gz index 29d1359d16..b081862cdb 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/OUTCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/POSCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/POSCAR.gz index dda27aba3e..929bb633e0 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/POSCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/POSCAR.orig.gz index af6337eb1e..725bc3e469 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/POSCAR.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/custodian.json.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/custodian.json.gz index b9409121ae..2a937a7f88 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/custodian.json.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/transformations.json b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/transformations.json new file mode 100644 index 0000000000..a13fd96552 --- /dev/null +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/transformations.json @@ -0,0 +1 @@ +{"@module": "pymatgen.alchemy.materials", "@class": "TransformedStructure", "charge": 0.0, "lattice": {"matrix": [[5.463500356711469, 0.0, 3e-16], [-3.014962686336267e-16, 5.436386043653453, 3e-16], [0.0, 0.0, 5.436386043653453]], "pbc": [true, true, true], "a": 5.463500356711469, "b": 5.436386043653453, "c": 5.436386043653453, "alpha": 90.0, "beta": 90.0, "gamma": 90.0, "volume": 161.4698915259501}, "properties": {}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.25, 0.75], "xyz": [1.3658750891778673, 1.3590965109133633, 4.07728953274009], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, -0.0, -0.0], "xyz": [2.7317501783557345, 0.0, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.75, 0.25], "xyz": [1.365875089177867, 4.07728953274009, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, 0.5, 0.5], "xyz": [2.7317501783557345, 2.7181930218267265, 2.718193021826727], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.25, 0.25], "xyz": [4.097625267533601, 1.3590965109133633, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.0, -0.0, 0.5], "xyz": [0.0, 0.0, 2.7181930218267265], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.75, 0.75], "xyz": [4.097625267533601, 4.07728953274009, 4.077289532740091], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [-0.0, 0.5, 0.0], "xyz": [-1.5074813431681335e-16, 2.7181930218267265, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}], "history": [{"@module": "pymatgen.transformations.standard_transformations", "@class": "DeformStructureTransformation", "@version": null, "deformation": [[1.004987562112089, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]], "input_structure": {"@module": "pymatgen.core.structure", "@class": "Structure", "charge": 0.0, "lattice": {"matrix": [[5.436386043653454, -0.0, 3e-16], [-3e-16, 5.436386043653453, 3e-16], [0.0, -0.0, 5.436386043653453]], "pbc": [true, true, true], "a": 5.436386043653454, "b": 5.436386043653453, "c": 5.436386043653453, "alpha": 90.0, "beta": 90.0, "gamma": 90.0, "volume": 160.66854716749313}, "properties": {}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.25, 0.75], "xyz": [1.3590965109133635, 1.3590965109133633, 4.07728953274009], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, -0.0, -0.0], "xyz": [2.718193021826727, 0.0, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.75, 0.25], "xyz": [1.3590965109133633, 4.07728953274009, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, 0.5, 0.5], "xyz": [2.718193021826727, 2.7181930218267265, 2.718193021826727], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.25, 0.25], "xyz": [4.077289532740091, 1.3590965109133633, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.0, -0.0, 0.5], "xyz": [0.0, 0.0, 2.7181930218267265], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.75, 0.75], "xyz": [4.077289532740091, 4.07728953274009, 4.077289532740091], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [-0.0, 0.5, 0.0], "xyz": [-1.5e-16, 2.7181930218267265, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}]}, "output_parameters": {}}], "last_modified": "2024-02-09 22:24:44.703000", "other_parameters": {}, "@version": null} diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/transformations.json.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/transformations.json.gz deleted file mode 100644 index 41f0001fc9..0000000000 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/transformations.json.gz and /dev/null differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/vasprun.xml.gz index 333442ec23..8b6a2daf82 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/vasprun.xml.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_3_6/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/inputs/INCAR b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/inputs/INCAR index 9527e3c3e9..82499cb770 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/inputs/INCAR +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/inputs/INCAR @@ -1,24 +1,24 @@ ALGO = Normal EDIFF = 1e-07 EDIFFG = -0.001 -ENAUG = 1360.0 -ENCUT = 700.0 +ENAUG = 1360 +ENCUT = 700 +GGA = Ps IBRION = 2 ISIF = 2 ISMEAR = -5 ISPIN = 2 -KSPACING = 0.2925287784072645 LAECHG = False LASPH = True -LCHARG = True -LELF = True +LCHARG = False +LELF = False LMIXTAU = True LORBIT = 11 LREAL = False LVTOT = True LWAVE = False -MAGMOM = 2*-0.0 +MAGMOM = 8*-0.0 NELM = 200 NSW = 99 PREC = Accurate -SIGMA = 0.05 +SIGMA = 0.2 diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/inputs/KPOINTS b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/inputs/KPOINTS index 093abbe92b..5a195a0bf8 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/inputs/KPOINTS +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/inputs/KPOINTS @@ -1,4 +1,4 @@ -pymatgen with grid density = 100 / number of atoms +pymatgen with grid density = 7000 / number of atoms 0 Gamma -3 3 3 +9 9 9 diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/inputs/POSCAR b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/inputs/POSCAR index 2bc21ac936..0b048e8908 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/inputs/POSCAR +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/inputs/POSCAR @@ -1,10 +1,16 @@ -Si2 +Si8 1.0 -0.000000 2.752777 2.752777 -2.780168 0.000000 2.752777 -2.780168 2.752777 0.000000 + 5.4904807694720743 0.0000000000000000 0.0000000000000003 + -0.0000000000000003 5.4363860436534530 0.0000000000000003 + 0.0000000000000000 0.0000000000000000 5.4363860436534530 Si -2 +8 direct -0.750000 0.750000 0.750000 Si -0.500000 0.500000 0.500000 Si + 0.2500000000000000 0.2500000000000000 0.7500000000000000 Si + 0.5000000000000000 -0.0000000000000000 -0.0000000000000000 Si + 0.2500000000000000 0.7500000000000000 0.2500000000000000 Si + 0.5000000000000000 0.5000000000000000 0.5000000000000000 Si + 0.7500000000000000 0.2500000000000000 0.2500000000000000 Si + 0.0000000000000000 -0.0000000000000000 0.5000000000000000 Si + 0.7500000000000000 0.7500000000000000 0.7500000000000000 Si + -0.0000000000000000 0.5000000000000000 0.0000000000000000 Si diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/CONTCAR.gz index 2e4cdb8cc7..0a3fb518c9 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/CONTCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/INCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/INCAR.gz index 4f94a52987..01605ed3bf 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/INCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/INCAR.orig.gz index afbeb54109..f2ebbcf235 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/INCAR.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/KPOINTS.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/KPOINTS.gz index 1c3fbd90e5..781be46e16 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/KPOINTS.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/KPOINTS.orig.gz index 44d2a57eab..72b1721b54 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/KPOINTS.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/OUTCAR.gz index 2e56d4dc6b..a5a39b4686 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/OUTCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/POSCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/POSCAR.gz index 35bf4d618f..c5663f6b25 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/POSCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/POSCAR.orig.gz index 95799a0642..8912e1213e 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/POSCAR.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/custodian.json.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/custodian.json.gz index 84b06d5cad..9462ff7f17 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/custodian.json.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/transformations.json b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/transformations.json new file mode 100644 index 0000000000..99e97f332f --- /dev/null +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/transformations.json @@ -0,0 +1 @@ +{"@module": "pymatgen.alchemy.materials", "@class": "TransformedStructure", "charge": 0.0, "lattice": {"matrix": [[5.490480769472074, 0.0, 3e-16], [-3.0298514815086237e-16, 5.436386043653453, 3e-16], [0.0, 0.0, 5.436386043653453]], "pbc": [true, true, true], "a": 5.490480769472074, "b": 5.436386043653453, "c": 5.436386043653453, "alpha": 90.0, "beta": 90.0, "gamma": 90.0, "volume": 162.26727855575575}, "properties": {}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.25, 0.75], "xyz": [1.3726201923680186, 1.3590965109133633, 4.07728953274009], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, -0.0, -0.0], "xyz": [2.745240384736037, 0.0, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.75, 0.25], "xyz": [1.3726201923680184, 4.07728953274009, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, 0.5, 0.5], "xyz": [2.745240384736037, 2.7181930218267265, 2.718193021826727], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.25, 0.25], "xyz": [4.1178605771040555, 1.3590965109133633, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.0, -0.0, 0.5], "xyz": [0.0, 0.0, 2.7181930218267265], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.75, 0.75], "xyz": [4.1178605771040555, 4.07728953274009, 4.077289532740091], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [-0.0, 0.5, 0.0], "xyz": [-1.5149257407543118e-16, 2.7181930218267265, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}], "history": [{"@module": "pymatgen.transformations.standard_transformations", "@class": "DeformStructureTransformation", "@version": null, "deformation": [[1.0099504938362078, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]], "input_structure": {"@module": "pymatgen.core.structure", "@class": "Structure", "charge": 0.0, "lattice": {"matrix": [[5.436386043653454, -0.0, 3e-16], [-3e-16, 5.436386043653453, 3e-16], [0.0, -0.0, 5.436386043653453]], "pbc": [true, true, true], "a": 5.436386043653454, "b": 5.436386043653453, "c": 5.436386043653453, "alpha": 90.0, "beta": 90.0, "gamma": 90.0, "volume": 160.66854716749313}, "properties": {}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.25, 0.75], "xyz": [1.3590965109133635, 1.3590965109133633, 4.07728953274009], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, -0.0, -0.0], "xyz": [2.718193021826727, 0.0, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.75, 0.25], "xyz": [1.3590965109133633, 4.07728953274009, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, 0.5, 0.5], "xyz": [2.718193021826727, 2.7181930218267265, 2.718193021826727], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.25, 0.25], "xyz": [4.077289532740091, 1.3590965109133633, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.0, -0.0, 0.5], "xyz": [0.0, 0.0, 2.7181930218267265], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.75, 0.75], "xyz": [4.077289532740091, 4.07728953274009, 4.077289532740091], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [-0.0, 0.5, 0.0], "xyz": [-1.5e-16, 2.7181930218267265, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}]}, "output_parameters": {}}], "last_modified": "2024-02-09 22:26:10.986675", "other_parameters": {}, "@version": null} diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/transformations.json.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/transformations.json.gz deleted file mode 100644 index de8d86ac20..0000000000 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/transformations.json.gz and /dev/null differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/vasprun.xml.gz index 81cd68973a..6467e36348 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/vasprun.xml.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_4_6/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/inputs/INCAR b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/inputs/INCAR index 9527e3c3e9..82499cb770 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/inputs/INCAR +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/inputs/INCAR @@ -1,24 +1,24 @@ ALGO = Normal EDIFF = 1e-07 EDIFFG = -0.001 -ENAUG = 1360.0 -ENCUT = 700.0 +ENAUG = 1360 +ENCUT = 700 +GGA = Ps IBRION = 2 ISIF = 2 ISMEAR = -5 ISPIN = 2 -KSPACING = 0.2925287784072645 LAECHG = False LASPH = True -LCHARG = True -LELF = True +LCHARG = False +LELF = False LMIXTAU = True LORBIT = 11 LREAL = False LVTOT = True LWAVE = False -MAGMOM = 2*-0.0 +MAGMOM = 8*-0.0 NELM = 200 NSW = 99 PREC = Accurate -SIGMA = 0.05 +SIGMA = 0.2 diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/inputs/KPOINTS b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/inputs/KPOINTS index 093abbe92b..5a195a0bf8 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/inputs/KPOINTS +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/inputs/KPOINTS @@ -1,4 +1,4 @@ -pymatgen with grid density = 100 / number of atoms +pymatgen with grid density = 7000 / number of atoms 0 Gamma -3 3 3 +9 9 9 diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/inputs/POSCAR b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/inputs/POSCAR index 6622bc6767..215fdad1e6 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/inputs/POSCAR +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/inputs/POSCAR @@ -1,10 +1,16 @@ -Si2 +Si8 1.0 -0.000000 2.697721 2.752226 -2.752777 -0.055056 2.752226 -2.752777 2.752777 0.000000 + 5.4363860436534539 -0.0000000000000000 0.0000000000000003 + -0.0000000000000003 5.4363860436534530 0.0000000000000003 + 0.0000000000000000 -0.1087277208730691 5.4352986576952507 Si -2 +8 direct -0.750000 0.750000 0.750000 Si -0.500000 0.500000 0.500000 Si + 0.2500000000000000 0.2500000000000000 0.7500000000000000 Si + 0.5000000000000000 -0.0000000000000000 -0.0000000000000000 Si + 0.2500000000000000 0.7500000000000000 0.2500000000000000 Si + 0.5000000000000000 0.5000000000000000 0.5000000000000000 Si + 0.7500000000000000 0.2500000000000000 0.2500000000000000 Si + 0.0000000000000000 -0.0000000000000000 0.5000000000000000 Si + 0.7500000000000000 0.7500000000000000 0.7500000000000000 Si + -0.0000000000000000 0.5000000000000000 0.0000000000000000 Si diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/CONTCAR.gz index d852620fa3..a11619312e 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/CONTCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/INCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/INCAR.gz index 0e11e46f1b..cb3d141a49 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/INCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/INCAR.orig.gz index d49ac7d772..059dbedd1d 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/INCAR.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/KPOINTS.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/KPOINTS.gz index f25452832b..7240210872 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/KPOINTS.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/KPOINTS.orig.gz index 243d51ff75..5841a5692e 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/KPOINTS.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/OUTCAR.gz index 0b9ad386f2..690bad4fb1 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/OUTCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/POSCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/POSCAR.gz index 7897fc6d02..5dd2d2dca0 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/POSCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/POSCAR.orig.gz index d1fdf70b39..3b5edfbca0 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/POSCAR.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/custodian.json.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/custodian.json.gz index bf925bb6b8..bff0efbb93 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/custodian.json.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/transformations.json b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/transformations.json new file mode 100644 index 0000000000..f2de9bdfd0 --- /dev/null +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/transformations.json @@ -0,0 +1 @@ +{"@module": "pymatgen.alchemy.materials", "@class": "TransformedStructure", "charge": 0.0, "lattice": {"matrix": [[5.436386043653454, -6e-18, 2.999399939987997e-16], [-3e-16, 5.436386043653453, 2.999399939987997e-16], [0.0, -0.10872772087306906, 5.435298657695251]], "pbc": [true, true, true], "a": 5.436386043653454, "b": 5.436386043653453, "c": 5.436386043653453, "alpha": 91.14599199838858, "beta": 90.0, "gamma": 90.0, "volume": 160.63641024404583}, "properties": {}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.25, 0.75], "xyz": [1.3590965109133635, 1.2775507202585614, 4.0764739932714384], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, -0.0, -0.0], "xyz": [2.718193021826727, -3e-18, 1.4996999699939984e-16], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.75, 0.25], "xyz": [1.3590965109133633, 4.050107602521822, 1.358824664423813], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, 0.5, 0.5], "xyz": [2.718193021826727, 2.663829161390192, 2.717649328847626], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.25, 0.25], "xyz": [4.077289532740091, 1.331914580695096, 1.358824664423813], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.0, -0.0, 0.5], "xyz": [0.0, -0.05436386043653453, 2.7176493288476253], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.75, 0.75], "xyz": [4.07728953274009, 3.995743742085288, 4.0764739932714384], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [-0.0, 0.5, 0.0], "xyz": [-1.5e-16, 2.7181930218267265, 1.4996999699939984e-16], "properties": {"magmom": -0.0}, "label": "Si"}], "history": [{"@module": "pymatgen.transformations.standard_transformations", "@class": "DeformStructureTransformation", "@version": null, "deformation": [[1.0, 0.0, 0.0], [0.0, 1.0, -0.02], [0.0, 0.0, 0.999799979995999]], "input_structure": {"@module": "pymatgen.core.structure", "@class": "Structure", "charge": 0.0, "lattice": {"matrix": [[5.436386043653454, -0.0, 3e-16], [-3e-16, 5.436386043653453, 3e-16], [0.0, -0.0, 5.436386043653453]], "pbc": [true, true, true], "a": 5.436386043653454, "b": 5.436386043653453, "c": 5.436386043653453, "alpha": 90.0, "beta": 90.0, "gamma": 90.0, "volume": 160.66854716749313}, "properties": {}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.25, 0.75], "xyz": [1.3590965109133635, 1.3590965109133633, 4.07728953274009], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, -0.0, -0.0], "xyz": [2.718193021826727, 0.0, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.75, 0.25], "xyz": [1.3590965109133633, 4.07728953274009, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, 0.5, 0.5], "xyz": [2.718193021826727, 2.7181930218267265, 2.718193021826727], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.25, 0.25], "xyz": [4.077289532740091, 1.3590965109133633, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.0, -0.0, 0.5], "xyz": [0.0, 0.0, 2.7181930218267265], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.75, 0.75], "xyz": [4.077289532740091, 4.07728953274009, 4.077289532740091], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [-0.0, 0.5, 0.0], "xyz": [-1.5e-16, 2.7181930218267265, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}]}, "output_parameters": {}}], "last_modified": "2024-02-09 22:27:37.213422", "other_parameters": {}, "@version": null} diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/transformations.json.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/transformations.json.gz deleted file mode 100644 index cfd5812ba5..0000000000 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/transformations.json.gz and /dev/null differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/vasprun.xml.gz index e438b32846..0138ca3eb0 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/vasprun.xml.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_5_6/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/inputs/INCAR b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/inputs/INCAR index 9527e3c3e9..82499cb770 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/inputs/INCAR +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/inputs/INCAR @@ -1,24 +1,24 @@ ALGO = Normal EDIFF = 1e-07 EDIFFG = -0.001 -ENAUG = 1360.0 -ENCUT = 700.0 +ENAUG = 1360 +ENCUT = 700 +GGA = Ps IBRION = 2 ISIF = 2 ISMEAR = -5 ISPIN = 2 -KSPACING = 0.2925287784072645 LAECHG = False LASPH = True -LCHARG = True -LELF = True +LCHARG = False +LELF = False LMIXTAU = True LORBIT = 11 LREAL = False LVTOT = True LWAVE = False -MAGMOM = 2*-0.0 +MAGMOM = 8*-0.0 NELM = 200 NSW = 99 PREC = Accurate -SIGMA = 0.05 +SIGMA = 0.2 diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/inputs/KPOINTS b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/inputs/KPOINTS index 093abbe92b..5a195a0bf8 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/inputs/KPOINTS +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/inputs/KPOINTS @@ -1,4 +1,4 @@ -pymatgen with grid density = 100 / number of atoms +pymatgen with grid density = 7000 / number of atoms 0 Gamma -3 3 3 +9 9 9 diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/inputs/POSCAR b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/inputs/POSCAR index fb79ae9d1b..6f75f7e62a 100644 --- a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/inputs/POSCAR +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/inputs/POSCAR @@ -1,10 +1,16 @@ -Si2 +Si8 1.0 -0.000000 2.725249 2.752639 -2.752777 -0.027528 2.752639 -2.752777 2.752777 0.000000 + 5.4363860436534539 -0.0000000000000000 0.0000000000000003 + -0.0000000000000003 5.4363860436534530 0.0000000000000003 + 0.0000000000000000 -0.0543638604365345 5.4361142175554482 Si -2 +8 direct -0.750000 0.750000 0.750000 Si -0.500000 0.500000 0.500000 Si + 0.2500000000000000 0.2500000000000000 0.7500000000000000 Si + 0.5000000000000000 -0.0000000000000000 -0.0000000000000000 Si + 0.2500000000000000 0.7500000000000000 0.2500000000000000 Si + 0.5000000000000000 0.5000000000000000 0.5000000000000000 Si + 0.7500000000000000 0.2500000000000000 0.2500000000000000 Si + 0.0000000000000000 -0.0000000000000000 0.5000000000000000 Si + 0.7500000000000000 0.7500000000000000 0.7500000000000000 Si + -0.0000000000000000 0.5000000000000000 0.0000000000000000 Si diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/CONTCAR.gz index e3617ca68f..9396e4e14b 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/CONTCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/INCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/INCAR.gz index 7847850b83..788578a996 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/INCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/INCAR.orig.gz index 73a1fcb82d..f097614919 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/INCAR.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/KPOINTS.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/KPOINTS.gz index 28fe843f8f..ffe6ac7b0e 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/KPOINTS.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/KPOINTS.orig.gz index 644e374352..bfe43720da 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/KPOINTS.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/OUTCAR.gz index ab25274eb7..191cc15d07 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/OUTCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/POSCAR.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/POSCAR.gz index 23b559f02c..a386ef963b 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/POSCAR.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/POSCAR.orig.gz index f96559ca62..0abfd0aa3c 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/POSCAR.orig.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/custodian.json.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/custodian.json.gz index bb06d4176d..39c714762c 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/custodian.json.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/transformations.json b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/transformations.json new file mode 100644 index 0000000000..b62ebfa4da --- /dev/null +++ b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/transformations.json @@ -0,0 +1 @@ +{"@module": "pymatgen.alchemy.materials", "@class": "TransformedStructure", "charge": 0.0, "lattice": {"matrix": [[5.436386043653454, -3e-18, 2.9998499962498123e-16], [-3e-16, 5.436386043653453, 2.9998499962498123e-16], [0.0, -0.05436386043653453, 5.436114217555448]], "pbc": [true, true, true], "a": 5.436386043653454, "b": 5.436386043653453, "c": 5.436386043653453, "alpha": 90.57296734485716, "beta": 90.0, "gamma": 90.0, "volume": 160.660513539289}, "properties": {}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.25, 0.75], "xyz": [1.3590965109133635, 1.3183236155859623, 4.077085663166586], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, -0.0, -0.0], "xyz": [2.718193021826727, -1.5e-18, 1.4999249981249061e-16], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.75, 0.25], "xyz": [1.3590965109133633, 4.063698567630956, 1.3590285543888623], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, 0.5, 0.5], "xyz": [2.718193021826727, 2.691011091608459, 2.7180571087777246], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.25, 0.25], "xyz": [4.077289532740091, 1.3455055458042295, 1.3590285543888623], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.0, -0.0, 0.5], "xyz": [0.0, -0.027181930218267265, 2.718057108777724], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.75, 0.75], "xyz": [4.07728953274009, 4.036516637412689, 4.077085663166587], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [-0.0, 0.5, 0.0], "xyz": [-1.5e-16, 2.7181930218267265, 1.4999249981249061e-16], "properties": {"magmom": -0.0}, "label": "Si"}], "history": [{"@module": "pymatgen.transformations.standard_transformations", "@class": "DeformStructureTransformation", "@version": null, "deformation": [[1.0, 0.0, 0.0], [0.0, 1.0, -0.01], [0.0, 0.0, 0.9999499987499375]], "input_structure": {"@module": "pymatgen.core.structure", "@class": "Structure", "charge": 0.0, "lattice": {"matrix": [[5.436386043653454, -0.0, 3e-16], [-3e-16, 5.436386043653453, 3e-16], [0.0, -0.0, 5.436386043653453]], "pbc": [true, true, true], "a": 5.436386043653454, "b": 5.436386043653453, "c": 5.436386043653453, "alpha": 90.0, "beta": 90.0, "gamma": 90.0, "volume": 160.66854716749313}, "properties": {}, "sites": [{"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.25, 0.75], "xyz": [1.3590965109133635, 1.3590965109133633, 4.07728953274009], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, -0.0, -0.0], "xyz": [2.718193021826727, 0.0, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.25, 0.75, 0.25], "xyz": [1.3590965109133633, 4.07728953274009, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.5, 0.5, 0.5], "xyz": [2.718193021826727, 2.7181930218267265, 2.718193021826727], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.25, 0.25], "xyz": [4.077289532740091, 1.3590965109133633, 1.3590965109133635], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.0, -0.0, 0.5], "xyz": [0.0, 0.0, 2.7181930218267265], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [0.75, 0.75, 0.75], "xyz": [4.077289532740091, 4.07728953274009, 4.077289532740091], "properties": {"magmom": -0.0}, "label": "Si"}, {"species": [{"element": "Si", "occu": 1}], "abc": [-0.0, 0.5, 0.0], "xyz": [-1.5e-16, 2.7181930218267265, 1.5e-16], "properties": {"magmom": -0.0}, "label": "Si"}]}, "output_parameters": {}}], "last_modified": "2024-02-09 22:31:55.260337", "other_parameters": {}, "@version": null} diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/transformations.json.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/transformations.json.gz deleted file mode 100644 index b4608bde14..0000000000 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/transformations.json.gz and /dev/null differ diff --git a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/vasprun.xml.gz index 8acade9475..6b00f8abe2 100644 Binary files a/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/vasprun.xml.gz and b/tests/test_data/vasp/Si_elastic/elastic_relax_6_6/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_1/inputs/INCAR b/tests/test_data/vasp/Si_elastic/tight_relax_1/inputs/INCAR index d7811c02f9..c030cd7e24 100644 --- a/tests/test_data/vasp/Si_elastic/tight_relax_1/inputs/INCAR +++ b/tests/test_data/vasp/Si_elastic/tight_relax_1/inputs/INCAR @@ -1,8 +1,9 @@ -ALGO = Normal +ALGO = Fast EDIFF = 1e-07 EDIFFG = -0.001 ENAUG = 1360 ENCUT = 700 +GGA = Ps IBRION = 2 ISIF = 3 ISMEAR = 0 @@ -10,14 +11,14 @@ ISPIN = 2 LAECHG = False LASPH = True LCHARG = False -LELF = True +LELF = False LMIXTAU = True LORBIT = 11 LREAL = False LVTOT = True LWAVE = False -MAGMOM = 2*0.6 +MAGMOM = 8*0.6 NELM = 200 NSW = 99 PREC = Accurate -SIGMA = 0.05 +SIGMA = 0.2 diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_1/inputs/KPOINTS b/tests/test_data/vasp/Si_elastic/tight_relax_1/inputs/KPOINTS index 093abbe92b..f37c0a02a2 100644 --- a/tests/test_data/vasp/Si_elastic/tight_relax_1/inputs/KPOINTS +++ b/tests/test_data/vasp/Si_elastic/tight_relax_1/inputs/KPOINTS @@ -1,4 +1,4 @@ -pymatgen with grid density = 100 / number of atoms +pymatgen with grid density = 777 / number of atoms 0 Gamma -3 3 3 +4 4 4 diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_1/inputs/POSCAR b/tests/test_data/vasp/Si_elastic/tight_relax_1/inputs/POSCAR index 6ce1d60136..4235d2a689 100644 --- a/tests/test_data/vasp/Si_elastic/tight_relax_1/inputs/POSCAR +++ b/tests/test_data/vasp/Si_elastic/tight_relax_1/inputs/POSCAR @@ -1,10 +1,16 @@ -Si2 +Si8 1.0 --0.000000 2.734364 2.734364 -2.734364 0.000000 2.734364 -2.734364 2.734364 0.000000 + 5.4687279953829524 0.0000000000000000 0.0000000000000003 + -0.0000000000000003 5.4687279953829524 0.0000000000000003 + 0.0000000000000000 0.0000000000000000 5.4687279953829524 Si -2 +8 direct -0.750000 0.750000 0.750000 Si -0.500000 0.500000 0.500000 Si + 0.2500000000000000 0.2500000000000000 0.7500000000000000 Si + 0.5000000000000000 0.0000000000000000 0.0000000000000000 Si + 0.2500000000000000 0.7500000000000000 0.2500000000000000 Si + 0.5000000000000000 0.5000000000000000 0.5000000000000000 Si + 0.7500000000000000 0.2500000000000000 0.2500000000000000 Si + 0.0000000000000000 0.0000000000000000 0.5000000000000000 Si + 0.7500000000000000 0.7500000000000000 0.7500000000000000 Si + 0.0000000000000000 0.5000000000000000 0.0000000000000000 Si diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/CONTCAR.gz index e7512e13a5..7907c8afeb 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/CONTCAR.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/INCAR.gz b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/INCAR.gz index 16bf29b49d..6b7428e713 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/INCAR.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/INCAR.orig.gz index b1db06842d..77521ab404 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/INCAR.orig.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/KPOINTS.gz b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/KPOINTS.gz index 4e2c40abd6..8f1edd9421 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/KPOINTS.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/KPOINTS.orig.gz index 017b9675c1..6eb78f18e8 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/KPOINTS.orig.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/OUTCAR.gz index 41517a498a..24f3b5c848 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/OUTCAR.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/POSCAR.gz b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/POSCAR.gz index f66fe88218..ac93551636 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/POSCAR.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/POSCAR.orig.gz index 15014feaee..a43906e2ee 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/POSCAR.orig.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/custodian.json.gz b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/custodian.json.gz index 7e4c78581a..a66adf0bd9 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/custodian.json.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/vasprun.xml.gz index 3b4143217b..52a6bd9030 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/vasprun.xml.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_1/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_2/inputs/INCAR b/tests/test_data/vasp/Si_elastic/tight_relax_2/inputs/INCAR index d8a35653fd..473d3fa10f 100644 --- a/tests/test_data/vasp/Si_elastic/tight_relax_2/inputs/INCAR +++ b/tests/test_data/vasp/Si_elastic/tight_relax_2/inputs/INCAR @@ -1,8 +1,9 @@ -ALGO = Normal +ALGO = Fast EDIFF = 1e-07 EDIFFG = -0.001 -ENAUG = 1360.0 +ENAUG = 1360 ENCUT = 700 +GGA = Ps IBRION = 2 ISIF = 3 ISMEAR = -5 @@ -10,13 +11,13 @@ ISPIN = 2 LAECHG = False LASPH = True LCHARG = False -LELF = True +LELF = False LMIXTAU = True LORBIT = 11 LREAL = False LVTOT = True LWAVE = False -MAGMOM = 2*-0.0 +MAGMOM = 8*0.0 NELM = 200 NSW = 99 PREC = Accurate diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_2/inputs/KPOINTS b/tests/test_data/vasp/Si_elastic/tight_relax_2/inputs/KPOINTS index 093abbe92b..fb8e7ffacc 100644 --- a/tests/test_data/vasp/Si_elastic/tight_relax_2/inputs/KPOINTS +++ b/tests/test_data/vasp/Si_elastic/tight_relax_2/inputs/KPOINTS @@ -1,4 +1,4 @@ -pymatgen with grid density = 100 / number of atoms +pymatgen with grid density = 791 / number of atoms 0 Gamma -3 3 3 +4 4 4 diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_2/inputs/POSCAR b/tests/test_data/vasp/Si_elastic/tight_relax_2/inputs/POSCAR index 125daeab82..c3cc56d351 100644 --- a/tests/test_data/vasp/Si_elastic/tight_relax_2/inputs/POSCAR +++ b/tests/test_data/vasp/Si_elastic/tight_relax_2/inputs/POSCAR @@ -1,10 +1,16 @@ -Si2 +Si8 1.0 -0.000000 2.752777 2.752777 -2.752777 -0.000000 2.752777 -2.752777 2.752777 0.000000 + 5.4360111679571759 0.0000000000000000 0.0000000000000003 + -0.0000000000000003 5.4360111679571759 0.0000000000000003 + -0.0000000000000000 -0.0000000000000000 5.4360111679571759 Si -2 +8 direct -0.750000 0.750000 0.750000 Si -0.500000 0.500000 0.500000 Si + 0.2500000000000000 0.2500000000000000 0.7500000000000000 Si + 0.5000000000000000 0.0000000000000000 0.0000000000000000 Si + 0.2500000000000000 0.7500000000000000 0.2500000000000000 Si + 0.5000000000000000 0.5000000000000000 0.5000000000000000 Si + 0.7500000000000000 0.2500000000000000 0.2500000000000000 Si + 0.0000000000000000 0.0000000000000000 0.5000000000000000 Si + 0.7500000000000000 0.7500000000000000 0.7500000000000000 Si + -0.0000000000000000 0.5000000000000000 0.0000000000000000 Si diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/CONTCAR.gz index 1405f3be86..64b791782f 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/CONTCAR.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/INCAR.gz b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/INCAR.gz index e88afa3316..4f7f67e261 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/INCAR.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/INCAR.orig.gz index 1ca34a43eb..cfc7c50694 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/INCAR.orig.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/KPOINTS.gz b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/KPOINTS.gz index 9eff2a9188..532b60d960 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/KPOINTS.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/KPOINTS.orig.gz index 89db07b535..56bdce9e17 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/KPOINTS.orig.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/OUTCAR.gz index a001ce445c..cf66b72c81 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/OUTCAR.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/POSCAR.gz b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/POSCAR.gz index efba016678..7922ac8544 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/POSCAR.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/POSCAR.orig.gz index 35fe145ba3..76e2a5761e 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/POSCAR.orig.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/custodian.json.gz b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/custodian.json.gz index 54b0420d67..5072b77960 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/custodian.json.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/vasprun.xml.gz index 9747fed937..7507775d0f 100644 Binary files a/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/vasprun.xml.gz and b/tests/test_data/vasp/Si_elastic/tight_relax_2/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_hse_optics/hse_optics/inputs/INCAR b/tests/test_data/vasp/Si_hse_optics/hse_optics/inputs/INCAR index 9ac70e3177..d7abd3ccae 100644 --- a/tests/test_data/vasp/Si_hse_optics/hse_optics/inputs/INCAR +++ b/tests/test_data/vasp/Si_hse_optics/hse_optics/inputs/INCAR @@ -10,7 +10,7 @@ KSPACING = 0.5 LAECHG = True LASPH = True LCHARG = False -LELF = True +LELF = False LHFCALC = True LMIXTAU = True LOPTICS = True diff --git a/tests/test_data/vasp/Si_mp_gga_relax/GGA_Relax_1/inputs/INCAR b/tests/test_data/vasp/Si_mp_gga_relax/GGA_Relax_1/inputs/INCAR index 8368b4e030..6e1fbb6731 100644 --- a/tests/test_data/vasp/Si_mp_gga_relax/GGA_Relax_1/inputs/INCAR +++ b/tests/test_data/vasp/Si_mp_gga_relax/GGA_Relax_1/inputs/INCAR @@ -3,7 +3,7 @@ EDIFF = 0.0001 ENCUT = 520 IBRION = 2 ISIF = 3 -ISMEAR = 0 +ISMEAR = -5 ISPIN = 2 LASPH = True LORBIT = 11 @@ -14,4 +14,4 @@ MAGMOM = 2*0.6 NELM = 100 NSW = 99 PREC = Accurate -SIGMA = 0.2 +SIGMA = 0.05 diff --git a/tests/test_data/vasp/Si_mp_meta_gga_relax/pbesol_pre_relax/inputs/INCAR b/tests/test_data/vasp/Si_mp_meta_gga_relax/pbesol_pre_relax/inputs/INCAR index f682301652..189d6d470f 100644 --- a/tests/test_data/vasp/Si_mp_meta_gga_relax/pbesol_pre_relax/inputs/INCAR +++ b/tests/test_data/vasp/Si_mp_meta_gga_relax/pbesol_pre_relax/inputs/INCAR @@ -22,4 +22,4 @@ MAGMOM = 2*0.6 NELM = 200 NSW = 99 PREC = Accurate -SIGMA = 0.2 +SIGMA = 0.05 diff --git a/tests/test_data/vasp/Si_mp_meta_gga_relax/r2scan_relax/inputs/INCAR b/tests/test_data/vasp/Si_mp_meta_gga_relax/r2scan_relax/inputs/INCAR index 7a2c6583db..70878e6b66 100644 --- a/tests/test_data/vasp/Si_mp_meta_gga_relax/r2scan_relax/inputs/INCAR +++ b/tests/test_data/vasp/Si_mp_meta_gga_relax/r2scan_relax/inputs/INCAR @@ -5,7 +5,7 @@ ENAUG = 1360.0 ENCUT = 680.0 IBRION = 2 ISIF = 3 -ISMEAR = -5 +ISMEAR = 0 ISPIN = 2 KSPACING = 0.28253269576667883 LAECHG = True diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/inputs/INCAR b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/inputs/INCAR new file mode 100644 index 0000000000..5385f3acb2 --- /dev/null +++ b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/inputs/INCAR @@ -0,0 +1,33 @@ +ALGO = Fast +EDIFF = 1e-05 +EDIFFG = -0.02 +ENAUG = 1360 +ENCUT = 520 +GGA = Ps +IBRION = 0 +ISIF = 2 +ISMEAR = 0 +ISPIN = 2 +ISYM = 0 +KBLOCK = 100 +LAECHG = True +LASPH = True +LCHARG = False +LELF = False +LMIXTAU = True +LORBIT = 11 +LREAL = False +LVTOT = True +LWAVE = False +MAGMOM = 2*0.6 +MAXMIX = 20 +MDALGO = 2 +NELM = 500 +NELMIN = 4 +NSW = 3 +POTIM = 1 +PREC = Normal +SIGMA = 0.2 +SMASS = 0 +TEBEG = 300 +TEEND = 300.0 diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/inputs/KPOINTS b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/inputs/KPOINTS new file mode 100644 index 0000000000..093abbe92b --- /dev/null +++ b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/inputs/KPOINTS @@ -0,0 +1,4 @@ +pymatgen with grid density = 100 / number of atoms +0 +Gamma +3 3 3 diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/inputs/POSCAR b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/inputs/POSCAR new file mode 100644 index 0000000000..3c72d993a0 --- /dev/null +++ b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/inputs/POSCAR @@ -0,0 +1,10 @@ +Si2 +1.0 + 3.3488980000000002 0.0000000000000000 1.9334870000000000 + 1.1162989999999999 3.1573720000000001 1.9334870000000000 + 0.0000000000000000 0.0000000000000000 3.8669750000000001 +Si +2 +direct + 0.2500000000000000 0.2500000000000000 0.2500000000000000 Si + 0.0000000000000000 0.0000000000000000 0.0000000000000000 Si diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/inputs/POTCAR.spec b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/inputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/inputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/CONTCAR.gz new file mode 100644 index 0000000000..6caf0b9685 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/INCAR.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/INCAR.gz new file mode 100644 index 0000000000..12c4ad3ed3 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..8901363a6b Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/KPOINTS.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/KPOINTS.gz new file mode 100644 index 0000000000..d66f7964c9 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/KPOINTS.orig.gz new file mode 100644 index 0000000000..92b96421da Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/OUTCAR.gz new file mode 100644 index 0000000000..fa7e41a76c Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/POSCAR.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/POSCAR.gz new file mode 100644 index 0000000000..b8e86e2924 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..2815ed3f58 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/POTCAR.spec b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/custodian.json.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/custodian.json.gz new file mode 100644 index 0000000000..1391e055a0 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..0a59e21721 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_1/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/inputs/INCAR b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/inputs/INCAR new file mode 100644 index 0000000000..a6eced0c4a --- /dev/null +++ b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/inputs/INCAR @@ -0,0 +1,32 @@ +ALGO = Fast +EDIFF = 1e-05 +EDIFFG = -0.02 +ENAUG = 1360 +ENCUT = 520 +GGA = Ps +IBRION = 0 +ISIF = 2 +ISMEAR = -5 +ISPIN = 1 +ISYM = 0 +KBLOCK = 100 +LAECHG = True +LASPH = True +LCHARG = False +LELF = False +LMIXTAU = True +LORBIT = 11 +LREAL = False +LVTOT = True +LWAVE = False +MAXMIX = 20 +MDALGO = 2 +NELM = 500 +NELMIN = 4 +NSW = 3 +POTIM = 1 +PREC = Normal +SIGMA = 0.05 +SMASS = 0 +TEBEG = 300.0 +TEEND = 300.0 diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/inputs/KPOINTS b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/inputs/KPOINTS new file mode 100644 index 0000000000..093abbe92b --- /dev/null +++ b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/inputs/KPOINTS @@ -0,0 +1,4 @@ +pymatgen with grid density = 100 / number of atoms +0 +Gamma +3 3 3 diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/inputs/POSCAR b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/inputs/POSCAR new file mode 100644 index 0000000000..d5f7bc1ac2 --- /dev/null +++ b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/inputs/POSCAR @@ -0,0 +1,23 @@ +Si2 +1.0 + 3.3488980000000002 0.0000000000000000 1.9334870000000000 + 1.1162989999999999 3.1573720000000001 1.9334870000000000 + 0.0000000000000000 0.0000000000000000 3.8669750000000001 +Si +2 +direct + 0.2509246999416777 0.2479629372437218 0.2497071651391614 Si + -0.0009246999416777 0.0020370627562782 0.0002928348608386 Si + + 0.0004025256800000 -0.0031480439000000 -0.0016045943000000 + -0.0004025256800000 0.0031480439000000 0.0016045943000000 + +1 + 1.0000000000000000 + -0.63509263E-03 -0.84024339E-03 -0.21494156E-03 -0.10750015E-03 + 0.2513772400000000 0.2469658900000000 0.2495644700000000 + 0.9986227600000001 0.0030341084000000 0.0004355327700000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/inputs/POTCAR.spec b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/inputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/inputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/CONTCAR.gz new file mode 100644 index 0000000000..9b64e4cceb Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/INCAR.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/INCAR.gz new file mode 100644 index 0000000000..cd648b93b4 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..d5276a2199 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/KPOINTS.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/KPOINTS.gz new file mode 100644 index 0000000000..1fc7e49e42 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/KPOINTS.orig.gz new file mode 100644 index 0000000000..65b1aa1275 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/OUTCAR.gz new file mode 100644 index 0000000000..161b55657b Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/POSCAR.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/POSCAR.gz new file mode 100644 index 0000000000..08ce6d4fb2 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..e8cffe8eb7 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/POTCAR.spec b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/custodian.json.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/custodian.json.gz new file mode 100644 index 0000000000..e1b6808bb3 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..9ed080c665 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_2/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/inputs/INCAR b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/inputs/INCAR new file mode 100644 index 0000000000..f1fb2a1630 --- /dev/null +++ b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/inputs/INCAR @@ -0,0 +1,32 @@ +ALGO = Fast +EDIFF = 1e-05 +EDIFFG = -0.02 +ENAUG = 1360 +ENCUT = 520 +GGA = Ps +IBRION = 0 +ISIF = 2 +ISMEAR = -5 +ISPIN = 1 +ISYM = 0 +KBLOCK = 100 +LAECHG = True +LASPH = True +LCHARG = False +LELF = False +LMIXTAU = True +LORBIT = 11 +LREAL = False +LVTOT = True +LWAVE = False +MAXMIX = 20 +MDALGO = 2 +NELM = 500 +NELMIN = 4 +NSW = 3 +POTIM = 1 +PREC = Normal +SIGMA = 0.05 +SMASS = 0 +TEBEG = 300 +TEEND = 300.0 diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/inputs/KPOINTS b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/inputs/KPOINTS new file mode 100644 index 0000000000..093abbe92b --- /dev/null +++ b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/inputs/KPOINTS @@ -0,0 +1,4 @@ +pymatgen with grid density = 100 / number of atoms +0 +Gamma +3 3 3 diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/inputs/POSCAR b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/inputs/POSCAR new file mode 100644 index 0000000000..5428183e57 --- /dev/null +++ b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/inputs/POSCAR @@ -0,0 +1,23 @@ +Si2 +1.0 + 3.3488980000000002 0.0000000000000000 1.9334870000000000 + 1.1162989999999999 3.1573720000000001 1.9334870000000000 + 0.0000000000000000 0.0000000000000000 3.8669750000000001 +Si +2 +direct + 0.2522405717926650 0.2450634335621342 0.2492943829866818 Si + 0.9977594282073351 0.0049365648378658 0.0007056197833182 Si + + 0.0003589612200000 -0.0028134973000000 -0.0014224528000000 + -0.0003589612200000 0.0028134973000000 0.0014224528000000 + +1 + 1.0000000000000000 + -0.10996701E-01 -0.72234638E-02 -0.42099336E-02 -0.52800025E-02 + 0.2526447900000000 0.2441723500000000 0.2491699700000000 + 0.9973552100000000 0.0058276532000000 0.0008300306800000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/inputs/POTCAR.spec b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/inputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/inputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/CONTCAR.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/CONTCAR.gz new file mode 100644 index 0000000000..3fa946cffb Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/CONTCAR.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/INCAR.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/INCAR.gz new file mode 100644 index 0000000000..da0dc8207a Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/INCAR.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/INCAR.orig.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/INCAR.orig.gz new file mode 100644 index 0000000000..34f8b022d4 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/INCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/KPOINTS.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/KPOINTS.gz new file mode 100644 index 0000000000..99ba394ea4 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/KPOINTS.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/KPOINTS.orig.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/KPOINTS.orig.gz new file mode 100644 index 0000000000..bf0816a1f7 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/KPOINTS.orig.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/OUTCAR.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/OUTCAR.gz new file mode 100644 index 0000000000..6bf737616e Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/OUTCAR.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/POSCAR.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/POSCAR.gz new file mode 100644 index 0000000000..b57a7ece7b Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/POSCAR.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/POSCAR.orig.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/POSCAR.orig.gz new file mode 100644 index 0000000000..4d04e8aca1 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/POSCAR.orig.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/POTCAR.spec b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/custodian.json.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/custodian.json.gz new file mode 100644 index 0000000000..8d4c906334 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/custodian.json.gz differ diff --git a/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/vasprun.xml.gz b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/vasprun.xml.gz new file mode 100644 index 0000000000..e202d02ca1 Binary files /dev/null and b/tests/test_data/vasp/Si_multi_md/molecular_dynamics_3/outputs/vasprun.xml.gz differ diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/inputs/INCAR b/tests/test_data/vasp/matpes_static_flow/pbe_static/inputs/INCAR similarity index 94% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/inputs/INCAR rename to tests/test_data/vasp/matpes_static_flow/pbe_static/inputs/INCAR index fc405a62d1..ca8fe85a58 100644 --- a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/inputs/INCAR +++ b/tests/test_data/vasp/matpes_static_flow/pbe_static/inputs/INCAR @@ -13,7 +13,7 @@ LMAXMIX = 6 LMIXTAU = True LORBIT = 11 LREAL = False -LWAVE = False +LWAVE = True NELM = 200 NSW = 0 PREC = Accurate diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/inputs/POSCAR b/tests/test_data/vasp/matpes_static_flow/pbe_static/inputs/POSCAR similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/inputs/POSCAR rename to tests/test_data/vasp/matpes_static_flow/pbe_static/inputs/POSCAR diff --git a/tests/test_data/vasp/matpes_static_flow/pbe_static/inputs/POTCAR.spec b/tests/test_data/vasp/matpes_static_flow/pbe_static/inputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/matpes_static_flow/pbe_static/inputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/CONTCAR.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/CONTCAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/CONTCAR.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/CONTCAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/DOSCAR.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/DOSCAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/DOSCAR.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/DOSCAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/EIGENVAL.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/EIGENVAL.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/EIGENVAL.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/EIGENVAL.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/IBZKPT.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/IBZKPT.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/IBZKPT.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/IBZKPT.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/INCAR.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/INCAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/INCAR.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/INCAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/INCAR.orig.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/INCAR.orig.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/INCAR.orig.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/INCAR.orig.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/OSZICAR.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/OSZICAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/OSZICAR.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/OSZICAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/OUTCAR.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/OUTCAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/OUTCAR.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/OUTCAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/PCDAT.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/PCDAT.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/PCDAT.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/PCDAT.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/POSCAR.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/POSCAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/POSCAR.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/POSCAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/POSCAR.orig.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/POSCAR.orig.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/POSCAR.orig.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/POSCAR.orig.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/PROCAR.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/PROCAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/PROCAR.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/PROCAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/REPORT.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/REPORT.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/REPORT.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/REPORT.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/WAVECAR.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/WAVECAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/WAVECAR.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/WAVECAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/XDATCAR.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/XDATCAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/XDATCAR.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/XDATCAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/custodian.json.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/custodian.json.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/custodian.json.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/custodian.json.gz diff --git a/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/std_err.txt b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/std_err.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/vasp.out.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/vasp.out.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/vasp.out.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/vasp.out.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/vasprun.xml.gz b/tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/vasprun.xml.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/pbe_static/outputs/vasprun.xml.gz rename to tests/test_data/vasp/matpes_static_flow/pbe_static/outputs/vasprun.xml.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/inputs/INCAR b/tests/test_data/vasp/matpes_static_flow/r2scan_static/inputs/INCAR similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/inputs/INCAR rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/inputs/INCAR diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/inputs/POSCAR b/tests/test_data/vasp/matpes_static_flow/r2scan_static/inputs/POSCAR similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/inputs/POSCAR rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/inputs/POSCAR diff --git a/tests/test_data/vasp/matpes_static_flow/r2scan_static/inputs/POTCAR.spec b/tests/test_data/vasp/matpes_static_flow/r2scan_static/inputs/POTCAR.spec new file mode 100644 index 0000000000..e267321d2c --- /dev/null +++ b/tests/test_data/vasp/matpes_static_flow/r2scan_static/inputs/POTCAR.spec @@ -0,0 +1 @@ +Si diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/CONTCAR.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/CONTCAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/CONTCAR.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/CONTCAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/DOSCAR.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/DOSCAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/DOSCAR.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/DOSCAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/EIGENVAL.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/EIGENVAL.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/EIGENVAL.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/EIGENVAL.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/IBZKPT.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/IBZKPT.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/IBZKPT.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/IBZKPT.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/INCAR.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/INCAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/INCAR.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/INCAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/INCAR.orig.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/INCAR.orig.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/INCAR.orig.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/INCAR.orig.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/OSZICAR.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/OSZICAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/OSZICAR.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/OSZICAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/OUTCAR.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/OUTCAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/OUTCAR.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/OUTCAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/PCDAT.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/PCDAT.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/PCDAT.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/PCDAT.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/POSCAR.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/POSCAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/POSCAR.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/POSCAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/POSCAR.orig.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/POSCAR.orig.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/POSCAR.orig.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/POSCAR.orig.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/PROCAR.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/PROCAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/PROCAR.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/PROCAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/REPORT.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/REPORT.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/REPORT.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/REPORT.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/WAVECAR.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/WAVECAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/WAVECAR.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/WAVECAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/XDATCAR.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/XDATCAR.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/XDATCAR.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/XDATCAR.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/custodian.json.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/custodian.json.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/custodian.json.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/custodian.json.gz diff --git a/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/std_err.txt b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/std_err.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/vasp.out.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/vasp.out.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/vasp.out.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/vasp.out.gz diff --git a/tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/vasprun.xml.gz b/tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/vasprun.xml.gz similarity index 100% rename from tests/test_data/vasp/matpes_pbe_r2scan_flow/r2scan_static/outputs/vasprun.xml.gz rename to tests/test_data/vasp/matpes_static_flow/r2scan_static/outputs/vasprun.xml.gz diff --git a/tests/vasp/conftest.py b/tests/vasp/conftest.py index 37d6d39a32..b8e665c640 100644 --- a/tests/vasp/conftest.py +++ b/tests/vasp/conftest.py @@ -1,15 +1,26 @@ from __future__ import annotations import logging +import shutil from pathlib import Path from typing import TYPE_CHECKING, Any, Callable, Final, Literal +import numpy as np import pytest +from jobflow import CURRENT_JOB +from pymatgen.io.vasp import Incar, Kpoints, Poscar, Potcar +from pymatgen.util.coord import pbc_diff from pytest import MonkeyPatch +import atomate2.vasp.jobs.base +import atomate2.vasp.jobs.defect +import atomate2.vasp.run +from atomate2.vasp.sets.base import VaspInputGenerator + if TYPE_CHECKING: from collections.abc import Generator, Sequence + logger = logging.getLogger("atomate2") _VFILES: Final = ("incar", "kpoints", "potcar", "poscar") @@ -73,14 +84,8 @@ def mock_vasp( For examples, see the tests in tests/vasp/makers/core.py. """ - import atomate2.vasp.jobs.base - import atomate2.vasp.jobs.defect - import atomate2.vasp.run - from atomate2.vasp.sets.base import VaspInputGenerator def mock_run_vasp(*args, **kwargs): - from jobflow import CURRENT_JOB - name = CURRENT_JOB.job.name try: ref_path = vasp_test_dir / _REF_PATHS[name] @@ -121,6 +126,7 @@ def _run(ref_paths, fake_run_vasp_kwargs=None): def fake_run_vasp( ref_path: Path, incar_settings: Sequence[str] = None, + incar_exclude: Sequence[str] = None, check_inputs: Sequence[Literal["incar", "kpoints", "poscar", "potcar"]] = _VFILES, clear_inputs: bool = True, ): @@ -135,6 +141,9 @@ def fake_run_vasp( incar_settings A list of INCAR settings to check. Defaults to None which checks all settings. Empty list or tuple means no settings will be checked. + incar_exclude + A list of INCAR settings to exclude from checking. Defaults to None, meaning + no settings will be excluded. check_inputs A list of vasp input files to check. Supported options are "incar", "kpoints", "poscar", "potcar", "wavecar". @@ -144,7 +153,7 @@ def fake_run_vasp( logger.info("Running fake VASP.") if "incar" in check_inputs: - check_incar(ref_path, incar_settings) + check_incar(ref_path, incar_settings, incar_exclude) if "kpoints" in check_inputs: check_kpoints(ref_path) @@ -170,14 +179,18 @@ def fake_run_vasp( logger.info("Generated fake vasp outputs") -def check_incar(ref_path: Path, incar_settings: Sequence[str]): - from pymatgen.io.vasp import Incar - +def check_incar( + ref_path: Path, incar_settings: Sequence[str], incar_exclude: Sequence[str] +) -> None: user_incar = Incar.from_file("INCAR") ref_incar_path = ref_path / "inputs" / "INCAR" ref_incar = Incar.from_file(ref_incar_path) defaults = {"ISPIN": 1, "ISMEAR": 1, "SIGMA": 0.2} - for key in list(user_incar) if incar_settings is None else incar_settings: + + keys_to_check = ( + set(user_incar) if incar_settings is None else set(incar_settings) + ) - set(incar_exclude or []) + for key in keys_to_check: user_val = user_incar.get(key, defaults.get(key)) ref_val = ref_incar.get(key, defaults.get(key)) if user_val != ref_val: @@ -188,8 +201,6 @@ def check_incar(ref_path: Path, incar_settings: Sequence[str]): def check_kpoints(ref_path: Path): - from pymatgen.io.vasp import Incar, Kpoints - user_kpoints_exists = Path("KPOINTS").exists() ref_kpoints_exists = Path(ref_path / "inputs" / "KPOINTS").exists() @@ -228,10 +239,6 @@ def check_kpoints(ref_path: Path): def check_poscar(ref_path: Path): - import numpy as np - from pymatgen.io.vasp import Poscar - from pymatgen.util.coord import pbc_diff - user_poscar = Poscar.from_file("POSCAR") ref_poscar = Poscar.from_file(ref_path / "inputs" / "POSCAR") @@ -251,8 +258,6 @@ def check_poscar(ref_path: Path): def check_potcar(ref_path: Path): - from pymatgen.io.vasp import Potcar - if Path(ref_path / "inputs" / "POTCAR").exists(): ref_potcar = Potcar.from_file(ref_path / "inputs" / "POTCAR").symbols elif Path(ref_path / "inputs" / "POTCAR.spec").exists(): @@ -292,8 +297,6 @@ def clear_vasp_inputs(): def copy_vasp_outputs(ref_path: Path): - import shutil - output_path = ref_path / "outputs" for output_file in output_path.iterdir(): if output_file.is_file(): diff --git a/tests/vasp/flows/test_core.py b/tests/vasp/flows/test_core.py index e73790e103..dcebd64ac0 100644 --- a/tests/vasp/flows/test_core.py +++ b/tests/vasp/flows/test_core.py @@ -1,14 +1,28 @@ import pytest +from emmet.core.tasks import TaskDoc +from emmet.core.vasp.calculation import VaspObject +from jobflow import run_locally +from pymatgen.electronic_structure.bandstructure import ( + BandStructure, + BandStructureSymmLine, +) + +from atomate2.vasp.flows.core import ( + BandStructureMaker, + DoubleRelaxMaker, + HSEBandStructureMaker, + HSELineModeBandStructureMaker, + HSEOpticsMaker, + HSEUniformBandStructureMaker, + LineModeBandStructureMaker, + OpticsMaker, + UniformBandStructureMaker, +) +from atomate2.vasp.jobs.core import RelaxMaker +from atomate2.vasp.sets.core import RelaxSetGenerator def test_double_relax(mock_vasp, clean_dir, si_structure): - from emmet.core.tasks import TaskDoc - from jobflow import run_locally - - from atomate2.vasp.flows.core import DoubleRelaxMaker - from atomate2.vasp.jobs.core import RelaxMaker - from atomate2.vasp.sets.core import RelaxSetGenerator - # mapping from job name to directory containing test files ref_paths = { "relax 1": "Si_double_relax/relax_1", @@ -75,15 +89,6 @@ def test_double_relax(mock_vasp, clean_dir, si_structure): def test_band_structure(mock_vasp, clean_dir, si_structure): - from emmet.core.vasp.calculation import VaspObject - from jobflow import run_locally - from pymatgen.electronic_structure.bandstructure import ( - BandStructure, - BandStructureSymmLine, - ) - - from atomate2.vasp.flows.core import BandStructureMaker - # mapping from job name to directory containing test files ref_paths = { "non-scf line": "Si_band_structure/non-scf_line", @@ -128,12 +133,6 @@ def test_band_structure(mock_vasp, clean_dir, si_structure): def test_uniform_band_structure(mock_vasp, clean_dir, si_structure): - from emmet.core.vasp.calculation import VaspObject - from jobflow import run_locally - from pymatgen.electronic_structure.bandstructure import BandStructure - - from atomate2.vasp.flows.core import UniformBandStructureMaker - # mapping from job name to directory containing test files ref_paths = { "non-scf uniform": "Si_band_structure/non-scf_uniform", @@ -171,12 +170,6 @@ def test_uniform_band_structure(mock_vasp, clean_dir, si_structure): def test_line_mode_band_structure(mock_vasp, clean_dir, si_structure): - from emmet.core.vasp.calculation import VaspObject - from jobflow import run_locally - from pymatgen.electronic_structure.bandstructure import BandStructureSymmLine - - from atomate2.vasp.flows.core import LineModeBandStructureMaker - # mapping from job name to directory containing test files ref_paths = { "non-scf line": "Si_band_structure/non-scf_line", @@ -210,15 +203,6 @@ def test_line_mode_band_structure(mock_vasp, clean_dir, si_structure): def test_hse_band_structure(mock_vasp, clean_dir, si_structure): - from emmet.core.vasp.calculation import VaspObject - from jobflow import run_locally - from pymatgen.electronic_structure.bandstructure import ( - BandStructure, - BandStructureSymmLine, - ) - - from atomate2.vasp.flows.core import HSEBandStructureMaker - # mapping from job name to directory containing test files ref_paths = { "hse band structure line": "Si_hse_band_structure/hse_band_structure_line", @@ -265,12 +249,6 @@ def test_hse_band_structure(mock_vasp, clean_dir, si_structure): def test_hse_uniform_band_structure(mock_vasp, clean_dir, si_structure): - from emmet.core.vasp.calculation import VaspObject - from jobflow import run_locally - from pymatgen.electronic_structure.bandstructure import BandStructure - - from atomate2.vasp.flows.core import HSEUniformBandStructureMaker - # mapping from job name to directory containing test files ref_paths = { "hse band structure uniform": "Si_hse_band_structure/" @@ -310,12 +288,6 @@ def test_hse_uniform_band_structure(mock_vasp, clean_dir, si_structure): def test_hse_line_mode_band_structure(mock_vasp, clean_dir, si_structure): - from emmet.core.vasp.calculation import VaspObject - from jobflow import run_locally - from pymatgen.electronic_structure.bandstructure import BandStructureSymmLine - - from atomate2.vasp.flows.core import HSELineModeBandStructureMaker - # mapping from job name to directory containing test files ref_paths = { "hse band structure line": "Si_hse_band_structure/hse_band_structure_line", @@ -350,11 +322,6 @@ def test_hse_line_mode_band_structure(mock_vasp, clean_dir, si_structure): def test_optics(mock_vasp, clean_dir, si_structure): - from emmet.core.tasks import TaskDoc - from jobflow import run_locally - - from atomate2.vasp.flows.core import OpticsMaker - # mapping from job name to directory containing test files ref_paths = {"optics": "Si_optics/optics", "static": "Si_optics/static"} @@ -390,11 +357,6 @@ def test_optics(mock_vasp, clean_dir, si_structure): def test_hse_optics(mock_vasp, clean_dir, si_structure): - from emmet.core.tasks import TaskDoc - from jobflow import run_locally - - from atomate2.vasp.flows.core import HSEOpticsMaker - # mapping from job name to directory containing test files ref_paths = { "hse optics": "Si_hse_optics/hse_optics", diff --git a/tests/vasp/flows/test_defect.py b/tests/vasp/flows/test_defect.py index a78fe897db..c11744de51 100644 --- a/tests/vasp/flows/test_defect.py +++ b/tests/vasp/flows/test_defect.py @@ -1,16 +1,24 @@ from typing import TYPE_CHECKING +import numpy as np +from jobflow import JobStore, run_locally +from maggma.stores.mongolike import MemoryStore +from pymatgen.analysis.defects.generators import SubstitutionGenerator +from pymatgen.core import Structure +from pymatgen.io.vasp.outputs import WSWQ + +from atomate2.vasp.flows.defect import ( + ConfigurationCoordinateMaker, + FormationEnergyMaker, + NonRadiativeMaker, +) + if TYPE_CHECKING: from atomate2.common.schemas.defects import CCDDocument from atomate2.vasp.schemas.defect import FiniteDifferenceDocument def test_ccd_maker(mock_vasp, clean_dir, test_dir): - from jobflow import run_locally - from pymatgen.core import Structure - - from atomate2.vasp.flows.defect import ConfigurationCoordinateMaker - # mapping from job name to directory containing test files # mapping from job name to directory containing test files ref_paths = { @@ -57,17 +65,6 @@ def test_ccd_maker(mock_vasp, clean_dir, test_dir): def test_nonrad_maker(mock_vasp, clean_dir, test_dir, monkeypatch): - import numpy as np - from jobflow import JobStore, run_locally - from maggma.stores.mongolike import MemoryStore - from pymatgen.core import Structure - from pymatgen.io.vasp.outputs import WSWQ - - from atomate2.vasp.flows.defect import ( - ConfigurationCoordinateMaker, - NonRadiativeMaker, - ) - # mapping from job name to directory containing test files ref_paths = { "relax q1": "Si_config_coord/relax_q1", @@ -132,10 +129,6 @@ def test_nonrad_maker(mock_vasp, clean_dir, test_dir, monkeypatch): def test_formation_energy_maker(mock_vasp, clean_dir, test_dir, monkeypatch): from jobflow import SETTINGS, run_locally - from pymatgen.analysis.defects.generators import SubstitutionGenerator - from pymatgen.core import Structure - - from atomate2.vasp.flows.defect import FormationEnergyMaker # mapping from job name to directory containing test files ref_paths = { @@ -153,14 +146,13 @@ def test_formation_energy_maker(mock_vasp, clean_dir, test_dir, monkeypatch): # automatically use fake VASP and write POTCAR.spec during the test mock_vasp(ref_paths, fake_run_vasp_kwargs) - struct_GaN = Structure.from_file(test_dir / "structures" / "GaN.cif") + struct = Structure.from_file(test_dir / "structures" / "GaN.cif") defects = list( SubstitutionGenerator().get_defects( - structure=struct_GaN, substitution={"Ga": ["Mg"]} + structure=struct, substitution={"Ga": ["Mg"]} ) ) - # rmaker = RelaxMaker(input_set_generator=ChargeStateRelaxSetGenerator()) maker = FormationEnergyMaker( relax_radius="auto", perturb=0.1, @@ -187,3 +179,16 @@ def _check_plnr_locpot(name): for k in ref_paths: _check_plnr_locpot(k) + + # make sure the the you can restart the calculation from prv + prv_dir = test_dir / "vasp/GaN_Mg_defect/bulk_relax/outputs" + flow2 = maker.make( + defects[0], + bulk_supercell_dir=prv_dir, + defect_index=0, + ) + _ = run_locally( + flow2, + create_folders=True, + ensure_success=True, + ) diff --git a/tests/vasp/flows/test_elastic.py b/tests/vasp/flows/test_elastic.py index 1a3448b8d4..209ae7f1d8 100644 --- a/tests/vasp/flows/test_elastic.py +++ b/tests/vasp/flows/test_elastic.py @@ -1,15 +1,18 @@ -def test_elastic(mock_vasp, clean_dir, si_structure): - from jobflow import run_locally - from numpy.testing import assert_allclose - from pymatgen.symmetry.analyzer import SpacegroupAnalyzer +import pytest +from jobflow import run_locally +from numpy.testing import assert_allclose +from pymatgen.symmetry.analyzer import SpacegroupAnalyzer + +from atomate2.common.schemas.elastic import ElasticDocument +from atomate2.vasp.flows.elastic import ElasticMaker +from atomate2.vasp.powerups import ( + update_user_incar_settings, + update_user_kpoints_settings, +) - from atomate2.common.schemas.elastic import ElasticDocument - from atomate2.vasp.flows.elastic import ElasticMaker - from atomate2.vasp.powerups import ( - update_user_incar_settings, - update_user_kpoints_settings, - ) +@pytest.mark.parametrize("conventional", [False, True]) +def test_elastic(mock_vasp, clean_dir, si_structure, conventional): # mapping from job name to directory containing test files ref_paths = { "elastic relax 1/6": "Si_elastic/elastic_relax_1_6", @@ -38,8 +41,8 @@ def test_elastic(mock_vasp, clean_dir, si_structure): mock_vasp(ref_paths, fake_run_vasp_kwargs) # generate flow - si_prim = SpacegroupAnalyzer(si_structure).get_primitive_standard_structure() - flow = ElasticMaker().make(si_prim) + si = SpacegroupAnalyzer(si_structure).get_conventional_standard_structure() + flow = ElasticMaker().make(si, conventional=conventional) flow = update_user_kpoints_settings( flow, {"grid_density": 100}, name_filter="relax" ) @@ -51,15 +54,16 @@ def test_elastic(mock_vasp, clean_dir, si_structure): # validation on the outputs elastic_output = responses[flow.jobs[-1].uuid][1].output assert isinstance(elastic_output, ElasticDocument) + assert_allclose( elastic_output.elastic_tensor.ieee_format, [ - [155.7923, 54.8871, 54.8871, 0.0, 0.0, 0.0], - [54.8871, 155.7923, 54.8871, 0.0, 0.0, 0.0], - [54.8871, 54.8871, 155.7923, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 94.6712, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 94.6712, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0, 94.6712], + [156.175, 62.1577, 62.1577, 0.0, 0.0, 0.0], + [62.1577, 156.175, 62.1577, 0.0, 0.0, 0.0], + [62.1577, 62.1577, 156.175, 0.0, 0.0, 0.0], + [0.0, 0.0, 0.0, 73.8819, 0.0, 0.0], + [0.0, 0.0, 0.0, 0.0, 73.8819, 0.0], + [0.0, 0.0, 0.0, 0.0, 0.0, 73.8819], ], atol=1e-3, ) diff --git a/tests/vasp/flows/test_electrode.py b/tests/vasp/flows/test_electrode.py new file mode 100644 index 0000000000..49c18ec005 --- /dev/null +++ b/tests/vasp/flows/test_electrode.py @@ -0,0 +1,122 @@ +from __future__ import annotations + +from unittest import mock + +import pytest +from jobflow.settings import JobflowSettings + + +@pytest.fixture() +def mock_jobflow_settings(memory_jobstore): + """Set the UID_TYPE to "ulid" to make sure the documents can be sorted. + + See: https://github.com/materialsproject/jobflow/issues/519#issuecomment-1906850096 + """ + + settings = JobflowSettings(JOB_STORE=memory_jobstore, UID_TYPE="ulid") + + with mock.patch("jobflow.SETTINGS", settings): + yield + + +def test_electrode_makers(mock_vasp, clean_dir, test_dir, mock_jobflow_settings): + from emmet.core.electrode import InsertionElectrodeDoc + from jobflow import OutputReference, run_locally + from monty.serialization import loadfn + from pymatgen.core import Structure + + from atomate2.vasp.flows.core import RelaxMaker, StaticMaker + from atomate2.vasp.flows.electrode import ElectrodeInsertionMaker + from atomate2.vasp.powerups import ( + update_user_incar_settings, + update_user_kpoints_settings, + ) + from atomate2.vasp.sets.mp import ( + MPMetaGGARelaxSetGenerator, + MPMetaGGAStaticSetGenerator, + ) + # mock the default setting + + # mapping from job name to directory containing test files + ref_paths = { + "relax": "H_Graphite/relax", + "relax 0 (0)": "H_Graphite/relax_0_(0)", + "relax 1 (0)": "H_Graphite/relax_1_(0)", + "relax 1 (1)": "H_Graphite/relax_1_(1)", + "relax 1 (2)": "H_Graphite/relax_1_(2)", + "static 0": "H_Graphite/static_0", + "static 1": "H_Graphite/static_1", + } + + fake_run_vasp_kwargs = { + "relax": { + "incar_settings": ["NSW", "ISIF"], + "check_inputs": ["incar", "poscar"], + }, + "relax 0 (0)": {"incar_settings": ["NSW"], "check_inputs": ["incar"]}, + "relax 1 (0)": {"incar_settings": ["NSW"], "check_inputs": ["incar"]}, + "relax 1 (1)": {"incar_settings": ["NSW"], "check_inputs": ["incar"]}, + "relax 1 (2)": {"incar_settings": ["NSW"], "check_inputs": ["incar"]}, + "static 0": {"incar_settings": ["NSW"], "check_inputs": ["incar"]}, + "static 1": {"incar_settings": ["NSW"], "check_inputs": ["incar"]}, + } + + # automatically use fake VASP and write POTCAR.spec during the test + mock_vasp(ref_paths, fake_run_vasp_kwargs) + + # create the workflow + struct = Structure.from_file(test_dir / "vasp/H_Graphite/C4.vasp") + h_entry = loadfn(test_dir / "vasp/H_Graphite/H_entry.json") + single_relax_maker = RelaxMaker(input_set_generator=MPMetaGGARelaxSetGenerator()) + static_maker = StaticMaker( + input_set_generator=MPMetaGGAStaticSetGenerator(), task_document_kwargs={} + ) + + maker = ElectrodeInsertionMaker( + relax_maker=single_relax_maker, static_maker=static_maker + ) + flow = maker.make( + struct, inserted_element="H", n_steps=2, working_ion_entry=h_entry + ) + + flow = update_user_kpoints_settings(flow, {"grid_density": 88}) + flow = update_user_incar_settings( + flow, {"NGX": 18, "NGY": 18, "NGZ": 60, "ISIF": 2, "EDIFFG": -0.1} + ) + + # run the flow or job and ensure that it finished running successfully + responses = run_locally( + flow, create_folders=True, ensure_success=True, raise_immediately=True + ) + + inserted_formulas = [] + ie_doc = None + for res in responses.values(): + for r in res.values(): + if not isinstance(r.output, OutputReference) and hasattr( + r.output, "formula_pretty" + ): + inserted_formulas.append( + f"{r.output.formula_pretty}-{r.output.task_label.split()[0]}" + ) + if isinstance(r.output, InsertionElectrodeDoc): + ie_doc = r.output + + inserted_formulas.sort() + + # C-relax, C-static + # HC4-relax (1x first insertion) + # HC4-static + # HC2-relax, (3x second insertion) + assert inserted_formulas == [ + "C-relax", + "C-static", + "HC2-relax", + "HC2-relax", + "HC2-relax", + "HC4-relax", + "HC4-static", + ] + + # None of the secondary insertions were topotactic + assert len(ie_doc.adj_pairs) == 1 diff --git a/tests/vasp/flows/test_elph.py b/tests/vasp/flows/test_elph.py index 9273cc7124..32c44d1f56 100644 --- a/tests/vasp/flows/test_elph.py +++ b/tests/vasp/flows/test_elph.py @@ -1,12 +1,11 @@ import pytest +from jobflow import run_locally +from atomate2.vasp.flows.elph import ElectronPhononMaker +from atomate2.vasp.schemas.elph import ElectronPhononRenormalisationDoc -def test_elph_renormalisation(mock_vasp, clean_dir, si_structure): - from jobflow import run_locally - - from atomate2.vasp.flows.elph import ElectronPhononMaker - from atomate2.vasp.schemas.elph import ElectronPhononRenormalisationDoc +def test_elph_renormalisation(mock_vasp, clean_dir, si_structure): # map job name to directory containing test files ref_paths = { "non-scf uniform T=0.0": "Si_elph_renorm/non-scf_uniform_T=0.0", @@ -43,24 +42,11 @@ def test_elph_renormalisation(mock_vasp, clean_dir, si_structure): flow = ElectronPhononMaker( min_supercell_length=3, temperatures=(0, 100), relax_maker=None ).make(si_structure) - flow.update_maker_kwargs( - { - "_set": { - "input_set_generator->user_kpoints_settings->reciprocal_density": 50 - } - }, - name_filter="static", - dict_mod=True, - ) - flow.update_maker_kwargs( - { - "_set": { - "input_set_generator->user_kpoints_settings->reciprocal_density": 50 - } - }, - name_filter="non-scf", - dict_mod=True, - ) + set_op = { + "_set": {"input_set_generator->user_kpoints_settings->reciprocal_density": 50} + } + flow.update_maker_kwargs(set_op, name_filter="static", dict_mod=True) + flow.update_maker_kwargs(set_op, name_filter="non-scf", dict_mod=True) # run the flow and ensure that it finished running successfully responses = run_locally(flow, create_folders=True, ensure_success=True) diff --git a/tests/vasp/flows/test_eos.py b/tests/vasp/flows/test_eos.py new file mode 100644 index 0000000000..af0bd4463c --- /dev/null +++ b/tests/vasp/flows/test_eos.py @@ -0,0 +1,180 @@ +import pytest +from emmet.core.tasks import TaskDoc +from jobflow import Flow, run_locally +from monty.serialization import loadfn +from pymatgen.core import Structure +from pytest import approx + +from atomate2.common.jobs.eos import PostProcessEosPressure +from atomate2.vasp.flows.eos import MPGGAEosDoubleRelaxMaker, MPGGAEosMaker +from atomate2.vasp.jobs.eos import MPGGAEosStaticMaker + +expected_incar_relax = { + "ISIF": 3, + "IBRION": 2, + "EDIFF": 1.0e-6, + "ISMEAR": 0, + "SIGMA": 0.05, + "LMAXMIX": 6, + "KSPACING": 0.22, +} + +expected_incar_relax_1 = { + **expected_incar_relax, + "EDIFFG": -0.05, +} + +expected_incar_deform = {**expected_incar_relax, "ISIF": 2} + +expected_incar_static = {**expected_incar_relax, "NSW": 0, "IBRION": -1, "ISMEAR": -5} +expected_incar_static.pop("ISIF") + + +def structure_equality(struct1: Structure, struct2: Structure): + structs = [struct1, struct2] + for struct in structs: + for site_prop in struct.site_properties: + struct.remove_site_property(site_prop) + return structs[0] == structs[1] + + +def test_mp_eos_double_relax_maker(mock_vasp, clean_dir, vasp_test_dir): + ref_paths = { + "EOS MP GGA relax 1": "Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1", + "EOS MP GGA relax 2": "Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_2", + } + + structure = Structure.from_file( + f"{vasp_test_dir}/{ref_paths['EOS MP GGA relax 1']}/inputs/POSCAR" + ) + + # settings passed to fake_run_vasp; adjust these to check for certain INCAR settings + fake_run_vasp_kwargs = { + key: {"incar_settings": list(expected_incar_relax)} for key in ref_paths + } + mock_vasp(ref_paths, fake_run_vasp_kwargs) + + flow = MPGGAEosDoubleRelaxMaker().make(structure) + # ensure flow runs successfully + responses = run_locally(flow, create_folders=True, ensure_success=True) + + for uuid in responses: + assert isinstance(responses[uuid][1].output, TaskDoc) + + taskdocs = [responses[uuid][1].output for uuid in responses] + + # ensure that output structure of first relaxation is fed to second + assert structure_equality(taskdocs[1].input.structure, taskdocs[0].output.structure) + + assert len(responses) == len(ref_paths) + + +@pytest.mark.parametrize("do_statics", [False, True]) +def test_mp_eos_maker( + do_statics: bool, + mock_vasp, + clean_dir, + vasp_test_dir, + nframes: int = 2, + linear_strain: tuple = (-0.05, 0.05), +): + base_ref_path = "Si_EOS_MP_GGA/" + ref_paths = {} + expected_incars = { + "EOS MP GGA relax 1": expected_incar_relax_1, + "EOS MP GGA relax 2": expected_incar_relax, + } + + for i in range(2): + ref_paths[f"EOS MP GGA relax {1+i}"] = f"mp-149-PBE-EOS_MP_GGA_relax_{1+i}" + + for i in range(nframes): + ref_paths[ + f"EOS MP GGA relax deformation {i}" + ] = f"mp-149-PBE-EOS_Deformation_Relax_{i}" + expected_incars[f"EOS MP GGA relax deformation {i}"] = expected_incar_deform + + if do_statics: + ref_paths[f"EOS MP GGA static {i}"] = f"mp-149-PBE-EOS_Static_{i}" + expected_incars[f"EOS MP GGA static {i}"] = expected_incar_static + + if do_statics: + ref_paths["EOS equilibrium static"] = "mp-149-PBE-EOS_equilibrium_static" + expected_incars["EOS equilibrium static"] = expected_incar_static + + ref_paths = {job: base_ref_path + ref_paths[job] for job in ref_paths} + + fake_run_vasp_kwargs = { + key: {"incar_settings": list(expected_incars[key])} for key in ref_paths + } + + mock_vasp(ref_paths, fake_run_vasp_kwargs) + + static_maker = None + if do_statics: + static_maker = MPGGAEosStaticMaker( + copy_vasp_kwargs={"additional_vasp_files": ("WAVECAR",)} + ) + + structure = Structure.from_file( + f"{vasp_test_dir}/{ref_paths['EOS MP GGA relax 1']}/inputs/POSCAR" + ) + + # cannot perform least-squares fit for four parameters with only 3 data points + flow = MPGGAEosMaker( + static_maker=static_maker, + number_of_frames=nframes, + linear_strain=linear_strain, + postprocessor=PostProcessEosPressure(), + _store_transformation_information=False, + ).make(structure) + + # ensure flow runs successfully + responses = run_locally(flow, create_folders=True, ensure_success=True) + + jobs = [] + for job in flow: + if isinstance(job, Flow): + jobs.extend(list(job.jobs)) + else: + jobs.append(job) + + postprocess_uuid = next( + job.uuid for job in jobs if job.name == "MP GGA EOS Maker postprocessing" + ) + flow_output = responses[postprocess_uuid][1].output + + jobs = {job.name: job.uuid for job in jobs if job.name in ref_paths} + job_output = { + job_name: responses[uuid][1].output for job_name, uuid in jobs.items() + } + + # deformation jobs not included in this + assert len(job_output) == len(ref_paths) + + ref_energies = {"EOS MP GGA relax 1": -10.849349, "EOS MP GGA relax 2": -10.849357} + if do_statics: + ref_energies["EOS equilibrium static"] = -10.849357 + + # check that TaskDoc energies agree + assert all( + approx(ref_energies[key]) == job_output[key].calcs_reversed[0].output.energy + for key in ref_energies + ) + + ref_eos_fit = loadfn(f"{vasp_test_dir}/{base_ref_path}/Si_pressure_EOS_fit.json.gz") + job_types_to_check = ("relax", "static") if do_statics else ("relax",) + for job_type in job_types_to_check: + for key in ("energy", "volume", "EOS"): + data = flow_output[job_type][key] + if isinstance(data, list): + assert all( + approx(ref_eos_fit[job_type][key][i]) == data[i] + for i in range(len(data)) + ) + elif isinstance(data, dict): + assert all( + approx(v) == data[k] for k, v in ref_eos_fit[job_type][key].items() + ) + elif isinstance(data, (float, int)): + assert approx(ref_eos_fit[job_type][key]) == data diff --git a/tests/vasp/flows/test_matpes.py b/tests/vasp/flows/test_matpes.py index 0df8f100d8..f6b98d8eb0 100644 --- a/tests/vasp/flows/test_matpes.py +++ b/tests/vasp/flows/test_matpes.py @@ -5,40 +5,44 @@ from jobflow import run_locally from pymatgen.core import Structure -from atomate2.vasp.flows.matpes import MatPesGGAPlusMetaGGAStaticMaker +from atomate2.vasp.flows.matpes import MatPesStaticFlowMaker -def test_matpes_gga_plus_meta_gga_static_maker(mock_vasp, clean_dir, vasp_test_dir): - # map from job name to directory containing reference output files - pre_relax_dir = "matpes_pbe_r2scan_flow/pbe_static" +def test_matpes_static_flow_maker(mock_vasp, clean_dir, vasp_test_dir): + # map from job name to directory containing reference input/output files + pre_relax_dir = "matpes_static_flow/pbe_static" ref_paths = { "MatPES GGA static": pre_relax_dir, - "MatPES meta-GGA static": "matpes_pbe_r2scan_flow/r2scan_static", + "MatPES meta-GGA static": "matpes_static_flow/r2scan_static", } si_struct = Structure.from_file(f"{vasp_test_dir}/{pre_relax_dir}/inputs/POSCAR") mock_vasp(ref_paths) # generate flow - flow = MatPesGGAPlusMetaGGAStaticMaker().make(si_struct) + flow = MatPesStaticFlowMaker().make(si_struct) - assert flow.name == "MatPES GGA plus meta-GGA static" + assert flow.name == "MatPES static flow" assert len(flow) == 2 assert [job.name for job in flow] == list(ref_paths) + # make sure first static has LWAVE=True so we can pass its WAVECAR to second static + # as pre-conditioned starting point + assert flow[0].maker.input_set_generator.user_incar_settings["LWAVE"] is True + # ensure flow runs successfully responses = run_locally(flow, create_folders=True, ensure_success=True) # validate output pbe_doc = responses[flow.jobs[0].uuid][1].output + assert isinstance(pbe_doc, TaskDoc) + assert pbe_doc.output.energy == pytest.approx(-10.84940729) + assert pbe_doc.output.bandgap == pytest.approx(0.6172, abs=1e-3) + r2scan_doc = responses[flow.jobs[-1].uuid][1].output assert isinstance(r2scan_doc, TaskDoc) assert r2scan_doc.output.energy == pytest.approx(-17.53895666) assert r2scan_doc.output.bandgap == pytest.approx(0.8087999) - assert isinstance(pbe_doc, TaskDoc) - assert pbe_doc.output.energy == pytest.approx(-10.84940729) - assert pbe_doc.output.bandgap == pytest.approx(0.6172, abs=1e-3) - assert isinstance(flow.output, dict) assert {*flow.output} == {"static1", "static2"} diff --git a/tests/vasp/flows/test_md.py b/tests/vasp/flows/test_md.py new file mode 100644 index 0000000000..61478740dc --- /dev/null +++ b/tests/vasp/flows/test_md.py @@ -0,0 +1,70 @@ +from emmet.core.vasp.calculation import VaspObject +from jobflow import Flow + +from atomate2.vasp.flows.md import MultiMDMaker +from atomate2.vasp.powerups import update_user_kpoints_settings +from atomate2.vasp.schemas.md import MultiMDOutput + + +def test_multi_md_flow(mock_vasp, clean_dir, si_structure): + from emmet.core.tasks import TaskDoc + from jobflow import run_locally + + # mapping from job name to directory containing test files + ref_paths = { + "molecular dynamics 1": "Si_multi_md/molecular_dynamics_1", + "molecular dynamics 2": "Si_multi_md/molecular_dynamics_2", + "molecular dynamics 3": "Si_multi_md/molecular_dynamics_3", + } + + # settings passed to fake_run_vasp; adjust these to check for certain INCAR settings + fake_run_vasp_kwargs = { + "molecular dynamics 1": {"incar_settings": ["NSW", "ISMEAR"]}, + "molecular dynamics 2": {"incar_settings": ["NSW", "ISMEAR"]}, + "molecular dynamics 3": {"incar_settings": ["NSW", "ISMEAR"]}, + } + + # automatically use fake VASP and write POTCAR.spec during the test + mock_vasp(ref_paths, fake_run_vasp_kwargs) + + mdflow1 = MultiMDMaker.from_parameters( + nsteps=3, time_step=1, n_runs=2, ensemble="nvt", start_temp=300 + ).make(si_structure) + mdflow2 = MultiMDMaker.from_parameters( + nsteps=3, time_step=1, n_runs=1, ensemble="nvt", start_temp=300 + ).restart_from_uuid(mdflow1.jobs[-1].output) + # set the name of the continuation MD Job, otherwise the folders for + # files will conflict + mdflow2.jobs[0].name = "molecular dynamics 3" + + flow = Flow([mdflow1, mdflow2]) + flow = update_user_kpoints_settings( + flow, {"grid_density": 100}, name_filter="molecular dynamics" + ) + + # run the flow or job and ensure that it finished running successfully + responses = run_locally(flow, create_folders=True, ensure_success=True) + + # validate the outputs + output_md_1 = responses[flow.jobs[0].jobs[0].uuid][1].output + traj = output_md_1.vasp_objects[VaspObject.TRAJECTORY] + assert len(traj.frame_properties) == 3 + assert isinstance(output_md_1, TaskDoc) + + output_recap_1 = responses[flow.jobs[0].jobs[2].uuid][1].output + assert len(output_recap_1.traj_ids) == 2 + assert len(output_recap_1.full_traj_ids) == 2 + assert isinstance(output_recap_1, MultiMDOutput) + + output_recap_2 = responses[flow.jobs[1].jobs[1].uuid][1].output + assert len(output_recap_2.traj_ids) == 1 + assert len(output_recap_2.full_traj_ids) == 3 + assert isinstance(output_recap_1, MultiMDOutput) + + +def test_multi_md_flow_restart_from_uuid(): + # check that the correct reference is used if a string is passed + ref_id = "475bf8ab-06ec-4222-8bad-6f9f3979f2ea" + flow = MultiMDMaker().restart_from_uuid(ref_id) + + assert flow.jobs[0].function_kwargs["prev_dir"].uuid == ref_id diff --git a/tests/vasp/flows/test_mp.py b/tests/vasp/flows/test_mp.py index 8741959937..930c83cad1 100644 --- a/tests/vasp/flows/test_mp.py +++ b/tests/vasp/flows/test_mp.py @@ -1,19 +1,18 @@ from __future__ import annotations -from typing import TYPE_CHECKING - import pytest +from emmet.core.tasks import TaskDoc +from jobflow import Maker, run_locally from pymatgen.core import Structure -from atomate2.vasp.jobs.mp import ( - MPMetaGGARelaxMaker, - MPPreRelaxMaker, +from atomate2.vasp.flows.mp import ( + MPGGADoubleRelaxMaker, + MPGGADoubleRelaxStaticMaker, + MPMetaGGADoubleRelaxStaticMaker, ) +from atomate2.vasp.jobs.mp import MPMetaGGARelaxMaker, MPPreRelaxMaker from atomate2.vasp.sets.mp import MPMetaGGARelaxSetGenerator -if TYPE_CHECKING: - from jobflow import Maker - @pytest.mark.parametrize("name", ["test", None]) @pytest.mark.parametrize( @@ -28,8 +27,6 @@ def test_mp_meta_gga_relax_custom_values( name: str, relax_maker: Maker | None, static_maker: Maker | None ): - from atomate2.vasp.flows.mp import MPMetaGGADoubleRelaxStaticMaker - kwargs = {} if name: kwargs["name"] = name @@ -48,12 +45,7 @@ def test_mp_meta_gga_relax_custom_values( def test_mp_meta_gga_double_relax_static(mock_vasp, clean_dir, vasp_test_dir): - from emmet.core.tasks import TaskDoc - from jobflow import run_locally - - from atomate2.vasp.flows.mp import MPMetaGGADoubleRelaxStaticMaker - - # map from job name to directory containing reference output files + # map from job name to directory containing reference input/output files pre_relax_dir = "Si_mp_meta_gga_relax/pbesol_pre_relax" ref_paths = { "MP pre-relax 1": pre_relax_dir, @@ -83,12 +75,7 @@ def test_mp_meta_gga_double_relax_static(mock_vasp, clean_dir, vasp_test_dir): def test_mp_gga_double_relax_static(mock_vasp, clean_dir, vasp_test_dir): - from emmet.core.tasks import TaskDoc - from jobflow import run_locally - - from atomate2.vasp.flows.mp import MPGGADoubleRelaxStaticMaker - - # map from job name to directory containing reference output files + # map from job name to directory containing reference input/output files pre_relax_dir = "Si_mp_gga_relax/GGA_Relax_1" ref_paths = { "MP GGA relax 1": pre_relax_dir, @@ -112,12 +99,7 @@ def test_mp_gga_double_relax_static(mock_vasp, clean_dir, vasp_test_dir): def test_mp_gga_double_relax(mock_vasp, clean_dir, vasp_test_dir): - from emmet.core.tasks import TaskDoc - from jobflow import run_locally - - from atomate2.vasp.flows.mp import MPGGADoubleRelaxMaker - - # map from job name to directory containing reference output files + # map from job name to directory containing reference input/output files pre_relax_dir = "Si_mp_gga_relax/GGA_Relax_1" ref_paths = { "MP GGA relax 1": pre_relax_dir, diff --git a/tests/vasp/flows/test_phonons.py b/tests/vasp/flows/test_phonons.py index 1c794cc89f..b63eefbb92 100644 --- a/tests/vasp/flows/test_phonons.py +++ b/tests/vasp/flows/test_phonons.py @@ -1,5 +1,6 @@ import numpy as np import pytest +from jobflow import run_locally from numpy.testing import assert_allclose from pymatgen.core.structure import Structure from pymatgen.phonon.bandstructure import PhononBandStructureSymmLine @@ -16,8 +17,6 @@ def test_phonon_wf_only_displacements3(mock_vasp, clean_dir): - from jobflow import run_locally - structure = Structure( lattice=[[0, 2.73, 2.73], [2.73, 0, 2.73], [2.73, 2.73, 0]], species=["Si", "Si"], @@ -58,7 +57,7 @@ def test_phonon_wf_only_displacements3(mock_vasp, clean_dir): assert_allclose( responses[job.jobs[-1].uuid][1].output.free_energies, - [5774.60355377, 5616.33406091, 4724.76619808, 3044.20807258, 696.337319349], + [5774.60355377, 5616.33406091, 4724.76619808, 3044.20807258, 696.33731934], ) assert isinstance( @@ -82,11 +81,11 @@ def test_phonon_wf_only_displacements3(mock_vasp, clean_dir): assert responses[job.jobs[-1].uuid][1].output.epsilon_static is None assert_allclose( responses[job.jobs[-1].uuid][1].output.supercell_matrix, - [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]], + np.eye(3), ) assert_allclose( responses[job.jobs[-1].uuid][1].output.primitive_matrix, - ((0, 0.5, 0.5), (0.5, 0, 0.5), (0.5, 0.5, 0)), + (np.ones((3, 3)) - np.eye(3)) / 2, atol=1e-8, ) assert responses[job.jobs[-1].uuid][1].output.code == "vasp" @@ -101,37 +100,37 @@ def test_phonon_wf_only_displacements3(mock_vasp, clean_dir): ) assert ( responses[job.jobs[-1].uuid][1].output.phonopy_settings.kpoint_density_dos - == 7000 + == 7_000 ) assert_allclose( responses[job.jobs[-1].uuid][1].output.entropies, [ 0.0, - 4.786689009990746, - 13.02544271435008, - 20.360935069065423, - 26.39830736008501, + 4.78668900, + 13.02544271, + 20.36093506, + 26.39830736, ], ) assert_allclose( responses[job.jobs[-1].uuid][1].output.heat_capacities, [ 0.0, - 8.047577577838897, - 15.97117761314484, - 19.97051059716143, - 21.87494655884403, + 8.04757757, + 15.97117761, + 19.97051059, + 21.87494655, ], ) assert_allclose( responses[job.jobs[-1].uuid][1].output.internal_energies, [ - 5774.603553771463, - 6095.002960937394, - 7329.854739783488, - 9152.488591840654, - 11255.660261586278, + 5774.60355377, + 6095.00296093, + 7329.85473978, + 9152.48859184, + 11255.66026158, ], ) assert responses[job.jobs[-1].uuid][1].output.chemsys == "Si" @@ -141,8 +140,6 @@ def test_phonon_wf_only_displacements3(mock_vasp, clean_dir): def test_phonon_wf_only_displacements_no_structural_transformation( mock_vasp, clean_dir ): - from jobflow import run_locally - structure = Structure( lattice=[[0, 2.73, 2.73], [2.73, 0, 2.73], [2.73, 2.73, 0]], species=["Si", "Si"], @@ -183,44 +180,20 @@ def test_phonon_wf_only_displacements_no_structural_transformation( assert_allclose( responses[job.jobs[-1].uuid][1].output.free_energies, - [ - 5774.566996471001, - 5616.29786373465, - 4724.736849262271, - 3044.193412800876, - 696.3435315493462, - ], + [5774.56699647, 5616.29786373, 4724.73684926, 3044.19341280, 696.34353154], ) assert_allclose( responses[job.jobs[-1].uuid][1].output.entropies, - [ - 0.0, - 4.78666294741712, - 13.025332342984333, - 20.36075467024152, - 26.398072464162844, - ], + [0.0, 4.78666294, 13.02533234, 20.36075467, 26.39807246], ) assert_allclose( responses[job.jobs[-1].uuid][1].output.heat_capacities, - [ - 0.0, - 8.047497695382027, - 15.971019069215203, - 19.970326488158854, - 21.874752681396565, - ], + [0.0, 8.04749769, 15.97101906, 19.97032648, 21.87475268], ) assert_allclose( responses[job.jobs[-1].uuid][1].output.internal_energies, - [ - 5774.566996471001, - 6094.964157503006, - 7329.8033166885825, - 9152.419812411707, - 11255.57251541699, - ], + [5774.56699647, 6094.96415750, 7329.80331668, 9152.41981241, 11255.57251541], ) assert isinstance( @@ -249,9 +222,9 @@ def test_phonon_wf_only_displacements_no_structural_transformation( assert_allclose( responses[job.jobs[-1].uuid][1].output.primitive_matrix, ( - (1.0000000000000002, 0.0, 0.0), - (0.0, 1.0000000000000002, 0.0), - (0.0, 0.0, 1.0000000000000002), + (1.00000000, 0.0, 0.0), + (0.0, 1.00000000, 0.0), + (0.0, 0.0, 1.00000000), ), ) assert responses[job.jobs[-1].uuid][1].output.code == "vasp" @@ -266,37 +239,37 @@ def test_phonon_wf_only_displacements_no_structural_transformation( ) assert ( responses[job.jobs[-1].uuid][1].output.phonopy_settings.kpoint_density_dos - == 7000 + == 7_000 ) assert_allclose( responses[job.jobs[-1].uuid][1].output.entropies, [ 0.0, - 4.78666294741712, - 13.025332342984333, - 20.36075467024152, - 26.398072464162844, + 4.78666294, + 13.02533234, + 20.36075467, + 26.39807246, ], ) assert_allclose( responses[job.jobs[-1].uuid][1].output.heat_capacities, [ 0.0, - 8.047497695382027, - 15.971019069215203, - 19.970326488158854, - 21.874752681396565, + 8.04749769, + 15.97101906, + 19.97032648, + 21.87475268, ], ) assert_allclose( responses[job.jobs[-1].uuid][1].output.internal_energies, [ - 5774.566996471001, - 6094.964157503006, - 7329.8033166885825, - 9152.419812411707, - 11255.57251541699, + 5774.56699647, + 6094.96415750, + 7329.80331668, + 9152.41981241, + 11255.57251541, ], ) @@ -306,8 +279,6 @@ def test_phonon_wf_only_displacements_no_structural_transformation( "kpath_scheme", ["seekpath", "hinuma", "setyawan_curtarolo", "latimer_munro"] ) def test_phonon_wf_only_displacements_kpath(mock_vasp, clean_dir, kpath_scheme): - from jobflow import run_locally - structure = Structure( lattice=[[0, 2.73, 2.73], [2.73, 0, 2.73], [2.73, 2.73, 0]], species=["Si", "Si"], @@ -331,6 +302,7 @@ def test_phonon_wf_only_displacements_kpath(mock_vasp, clean_dir, kpath_scheme): use_symmetrized_structure="primitive", kpath_scheme=kpath_scheme, generate_frequencies_eigenvectors_kwargs={"tstep": 100}, + create_thermal_displacements=True, ).make(structure) # run the flow or job and ensure that it finished running successfully @@ -342,7 +314,7 @@ def test_phonon_wf_only_displacements_kpath(mock_vasp, clean_dir, kpath_scheme): assert_allclose( responses[job.jobs[-1].uuid][1].output.free_energies, - [5776.14995034, 5617.74737777, 4725.50269363, 3043.81827626, 694.490783551], + [5776.14995034, 5617.74737777, 4725.50269363, 3043.81827626, 694.49078355], atol=1e-3, ) @@ -392,14 +364,12 @@ def test_phonon_wf_only_displacements_kpath(mock_vasp, clean_dir, kpath_scheme): ) assert ( responses[job.jobs[-1].uuid][1].output.phonopy_settings.kpoint_density_dos - == 7000 + == 7_000 ) -# test supply of born charges, epsilon, dft energy, supercell +# test supply of born charges, epsilon, DFT energy, supercell def test_phonon_wf_only_displacements_add_inputs_raises(mock_vasp, clean_dir): - from jobflow import run_locally - structure = Structure( lattice=[[0, 2.73, 2.73], [2.73, 0, 2.73], [2.73, 2.73, 0]], species=["Si", "Si"], @@ -416,13 +386,13 @@ def test_phonon_wf_only_displacements_add_inputs_raises(mock_vasp, clean_dir): mock_vasp(ref_paths, fake_run_vasp_kwargs) born = [ - [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], - [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], - [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.1]], + [[0, 0, 0], [0, 0, 0], [0, 0, 0]], + [[0, 0, 0], [0, 0, 0], [0, 0, 0]], + [[0, 0, 0], [0, 0, 0], [0, 0, 0.1]], ] epsilon_static = [ [5.25, 0, 0], - [0, 5.25, -0], + [0, 5.25, 0], [0, 0, 5.25], ] total_dft_energy_per_formula_unit = -5 @@ -434,6 +404,7 @@ def test_phonon_wf_only_displacements_add_inputs_raises(mock_vasp, clean_dir): born_maker=None, use_symmetrized_structure="primitive", generate_frequencies_eigenvectors_kwargs={"tstep": 100}, + create_thermal_displacements=True, ).make( structure=structure, total_dft_energy_per_formula_unit=total_dft_energy_per_formula_unit, @@ -444,10 +415,8 @@ def test_phonon_wf_only_displacements_add_inputs_raises(mock_vasp, clean_dir): run_locally(job, create_folders=True, ensure_success=True) -# test supply of born charges, epsilon, dft energy, supercell +# test supply of born charges, epsilon, DFT energy, supercell def test_phonon_wf_only_displacements_add_inputs(mock_vasp, clean_dir): - from jobflow import run_locally - structure = Structure( lattice=[[0, 2.73, 2.73], [2.73, 0, 2.73], [2.73, 2.73, 0]], species=["Si", "Si"], @@ -469,7 +438,7 @@ def test_phonon_wf_only_displacements_add_inputs(mock_vasp, clean_dir): ] epsilon_static = [ [5.25, 0, 0], - [0, 5.25, -0], + [0, 5.25, 0], [0, 0, 5.25], ] total_dft_energy_per_formula_unit = -5 @@ -480,6 +449,7 @@ def test_phonon_wf_only_displacements_add_inputs(mock_vasp, clean_dir): born_maker=None, use_symmetrized_structure="primitive", generate_frequencies_eigenvectors_kwargs={"tstep": 100}, + create_thermal_displacements=True, ).make( structure=structure, total_dft_energy_per_formula_unit=total_dft_energy_per_formula_unit, @@ -496,7 +466,7 @@ def test_phonon_wf_only_displacements_add_inputs(mock_vasp, clean_dir): assert_allclose( responses[job.jobs[-1].uuid][1].output.free_energies, - [5776.14995034, 5617.74737777, 4725.50269363, 3043.81827626, 694.490783551], + [5776.14995034, 5617.74737777, 4725.50269363, 3043.81827626, 694.49078355], atol=1e-3, ) @@ -551,14 +521,12 @@ def test_phonon_wf_only_displacements_add_inputs(mock_vasp, clean_dir): ) assert ( responses[job.jobs[-1].uuid][1].output.phonopy_settings.kpoint_density_dos - == 7000 + == 7_000 ) # test optional parameters def test_phonon_wf_only_displacements_optional_settings(mock_vasp, clean_dir): - from jobflow import run_locally - structure = Structure( lattice=[[0, 2.73, 2.73], [2.73, 0, 2.73], [2.73, 2.73, 0]], species=["Si", "Si"], @@ -594,17 +562,17 @@ def test_phonon_wf_only_displacements_optional_settings(mock_vasp, clean_dir): assert_allclose( responses[job.jobs[-1].uuid][1].output.free_energies, - [5776.14995034, 5617.74737777, 4725.50269363, 3043.81827626, 694.490783551], + [5776.14995034, 5617.74737777, 4725.50269363, 3043.81827626, 694.49078355], atol=1e-3, ) assert_allclose( responses[job.jobs[-1].uuid][1].output.entropies, - [0, 4.79066818396, 13.0347062141, 20.3740028425, 26.4142548987], + [0, 4.79066818, 13.03470621, 20.37400284, 26.41425489], atol=1e-8, ) assert_allclose( responses[job.jobs[-1].uuid][1].output.heat_capacities, - [0.0, 8.05373626383, 15.9800566903, 19.9803123493, 21.8851347674], + [0.0, 8.05373626, 15.98005669, 19.98031234, 21.88513476], atol=1e-8, ) @@ -652,14 +620,12 @@ def test_phonon_wf_only_displacements_optional_settings(mock_vasp, clean_dir): ) assert ( responses[job.jobs[-1].uuid][1].output.phonopy_settings.kpoint_density_dos - == 7000 + == 7_000 ) # test run including all steps of the computation for Si def test_phonon_wf_all_steps(mock_vasp, clean_dir): - from jobflow import run_locally - structure = Structure( lattice=[[0, 2.73, 2.73], [2.73, 0, 2.73], [2.73, 2.73, 0]], species=["Si", "Si"], @@ -691,6 +657,7 @@ def test_phonon_wf_all_steps(mock_vasp, clean_dir): min_length=3.0, use_symmetrized_structure=None, generate_frequencies_eigenvectors_kwargs={"tstep": 100}, + create_thermal_displacements=True, ).make(structure) # run the flow or job and ensure that it finished running successfully @@ -701,13 +668,7 @@ def test_phonon_wf_all_steps(mock_vasp, clean_dir): assert_allclose( responses[job.jobs[-1].uuid][1].output.free_energies, - [ - 5853.741503991992, - 5692.290895556432, - 4798.677849195808, - 3122.482960037922, - 782.1734533334413, - ], + [5853.74150399, 5692.29089555, 4798.67784919, 3122.48296003, 782.17345333], ) assert isinstance( @@ -728,13 +689,13 @@ def test_phonon_wf_all_steps(mock_vasp, clean_dir): responses[job.jobs[-1].uuid][1].output.force_constants.force_constants[0][0][0][ 0 ], - 13.411855999999997, + 13.41185599, ) assert isinstance(responses[job.jobs[-1].uuid][1].output.jobdirs, PhononJobDirs) assert isinstance(responses[job.jobs[-1].uuid][1].output.uuids, PhononUUIDs) assert_allclose(responses[job.jobs[-1].uuid][1].output.born, np.zeros((2, 3, 3))) assert_allclose( - responses[job.jobs[-1].uuid][1].output.total_dft_energy, -5.746290585 + responses[job.jobs[-1].uuid][1].output.total_dft_energy, -5.74629058 ) assert_allclose( responses[job.jobs[-1].uuid][1].output.epsilon_static, @@ -761,7 +722,7 @@ def test_phonon_wf_all_steps(mock_vasp, clean_dir): ) assert ( responses[job.jobs[-1].uuid][1].output.phonopy_settings.kpoint_density_dos - == 7000 + == 7_000 ) @@ -794,7 +755,11 @@ def test_phonon_wf_only_displacements_kpath_raises_no_cell_change( # automatically use fake VASP and write POTCAR.spec during the test mock_vasp(ref_paths, fake_run_vasp_kwargs) - with pytest.raises(ValueError): + with pytest.raises( + ValueError, + match=f"You can't use {kpath_scheme=} with the primitive standard " + "structure, please use seekpath", + ): PhononMaker( min_length=3.0, bulk_relax_maker=None, @@ -824,7 +789,11 @@ def test_phonon_wf_only_displacements_kpath_raises(mock_vasp, clean_dir, kpath_s # automatically use fake VASP and write POTCAR.spec during the test mock_vasp(ref_paths, fake_run_vasp_kwargs) - with pytest.raises(ValueError): + with pytest.raises( + ValueError, + match=f"You can't use {kpath_scheme=} with the primitive standard " + "structure, please use seekpath", + ): PhononMaker( min_length=3.0, bulk_relax_maker=None, @@ -837,11 +806,6 @@ def test_phonon_wf_only_displacements_kpath_raises(mock_vasp, clean_dir, kpath_s def test_phonon_wf_all_steps_na_cl(mock_vasp, clean_dir): - from jobflow import run_locally - from pymatgen.core.structure import Structure - - from atomate2.vasp.flows.phonons import PhononMaker - structure = Structure( lattice=[ [5.691694, 0.000000, 0.000000], @@ -895,24 +859,19 @@ def test_phonon_wf_all_steps_na_cl(mock_vasp, clean_dir): ) def test_phonon_wf_all_steps_na_cl(mock_vasp, clean_dir): - from jobflow import run_locally - from pymatgen.core.structure import Structure - - from atomate2.vasp.flows.phonons import PhononMaker - structure = Structure( lattice=[ - [2.3003714889113018, -3.9843602950772405, 0.0000000000000000], - [2.3003714889113018, 3.9843602950772405, 0.0000000000000000], - [0.0000000000000000, 0.0000000000000000, 7.2813299999999996], + [2.30037148, -3.98436029, 0.00000000], + [2.30037148, 3.98436029, 0.00000000], + [0.00000000, 0.00000000, 7.28132999], ], species=["Mg", "Mg", "Mg", "Sb", "Sb"], coords=[ [0.0, 0.0, 0.0], - [0.3333333333333333, 0.6666666666666666, 0.3683250000000000], - [0.6666666666666667, 0.3333333333333334, 0.6316750000000000], - [0.3333333333333333, 0.6666666666666666, 0.7747490000000000], - [0.6666666666666667, 0.3333333333333334, 0.2252510000000000], + [0.33333333, 0.66666666, 0.36832500], + [0.66666666, 0.33333333, 0.63167500], + [0.33333333, 0.66666666, 0.77474900], + [0.66666666, 0.33333333, 0.22525100], ], ) diff --git a/tests/vasp/jobs/test_core.py b/tests/vasp/jobs/test_core.py index 084f00321c..633816f069 100644 --- a/tests/vasp/jobs/test_core.py +++ b/tests/vasp/jobs/test_core.py @@ -1,14 +1,21 @@ +import jobflow +import numpy as np +from emmet.core.tasks import TaskDoc +from jobflow import run_locally from numpy.testing import assert_allclose from pytest import approx +from atomate2.vasp.jobs.core import ( + DielectricMaker, + HSERelaxMaker, + HSEStaticMaker, + RelaxMaker, + StaticMaker, + TransmuterMaker, +) -def test_static_maker(mock_vasp, clean_dir, si_structure): - import jobflow - from emmet.core.tasks import TaskDoc - from jobflow import run_locally - - from atomate2.vasp.jobs.core import StaticMaker +def test_static_maker(mock_vasp, clean_dir, si_structure): jstore = jobflow.SETTINGS.JOB_STORE # mapping from job name to directory containing test files @@ -42,11 +49,6 @@ def test_static_maker(mock_vasp, clean_dir, si_structure): def test_relax_maker(mock_vasp, clean_dir, si_structure): - from emmet.core.tasks import TaskDoc - from jobflow import run_locally - - from atomate2.vasp.jobs.core import RelaxMaker - # mapping from job name to directory containing test files ref_paths = {"relax": "Si_double_relax/relax_1"} @@ -71,10 +73,6 @@ def test_relax_maker(mock_vasp, clean_dir, si_structure): def test_dielectric(mock_vasp, clean_dir, si_structure): - from jobflow import run_locally - - from atomate2.vasp.jobs.core import DielectricMaker - # mapping from job name to directory containing test files ref_paths = {"dielectric": "Si_dielectric"} @@ -106,11 +104,6 @@ def test_dielectric(mock_vasp, clean_dir, si_structure): def test_hse_relax(mock_vasp, clean_dir, si_structure): - from emmet.core.tasks import TaskDoc - from jobflow import run_locally - - from atomate2.vasp.jobs.core import HSERelaxMaker - # mapping from job name to directory containing test files ref_paths = {"hse relax": "Si_hse_relax"} @@ -136,11 +129,6 @@ def test_hse_relax(mock_vasp, clean_dir, si_structure): def test_hse_static_maker(mock_vasp, clean_dir, si_structure): - from emmet.core.tasks import TaskDoc - from jobflow import run_locally - - from atomate2.vasp.jobs.core import HSEStaticMaker - # mapping from job name to directory containing test files ref_paths = {"hse static": "Si_hse_band_structure/hse_static"} @@ -166,12 +154,6 @@ def test_hse_static_maker(mock_vasp, clean_dir, si_structure): def test_transmuter(mock_vasp, clean_dir, si_structure): - import numpy as np - from emmet.core.tasks import TaskDoc - from jobflow import run_locally - - from atomate2.vasp.jobs.core import TransmuterMaker - # mapping from job name to directory containing test files ref_paths = {"transmuter": "Si_transmuter"} @@ -203,55 +185,3 @@ def test_transmuter(mock_vasp, clean_dir, si_structure): np.testing.assert_allclose( output1.structure.lattice.abc, [3.866974, 3.866975, 7.733949] ) - - -def test_molecular_dynamics(mock_vasp, clean_dir, si_structure): - import pytest - from emmet.core.tasks import TaskDoc - from emmet.core.vasp.calculation import IonicStep, VaspObject - from jobflow import run_locally - - from atomate2.vasp.jobs.core import MDMaker - - # mapping from job name to directory containing test files - ref_paths = {"molecular dynamics": "Si_molecular_dynamics/molecular_dynamics"} - - # settings passed to fake_run_vasp; adjust these to check for certain INCAR settings - fake_run_vasp_kwargs = { - "molecular dynamics": { - "incar_settings": [ - "IBRION", - "TBEN", - "TEND", - "NSW", - "POTIM", - "MDALGO", - "ISIF", - ] - } - } - - # automatically use fake VASP and write POTCAR.spec during the test - mock_vasp(ref_paths, fake_run_vasp_kwargs) - - # generate job - job = MDMaker().make(si_structure) - nsw = 3 - job.maker.input_set_generator.user_incar_settings["NSW"] = nsw - - # run the flow or job and ensure that it finished running successfully - responses = run_locally(job, create_folders=True, ensure_success=True) - - # validation on the output - - output1 = responses[job.uuid][1].output - assert isinstance(output1, TaskDoc) - assert output1.output.energy == pytest.approx(-11.46520398) - - # check ionic steps stored as pymatgen Trajectory - assert output1.calcs_reversed[0].output.ionic_steps is None - traj = output1.vasp_objects[VaspObject.TRAJECTORY] - assert len(traj.frame_properties) == nsw - # simply check a frame property can be converted to an IonicStep - for frame in traj.frame_properties: - IonicStep(**frame) diff --git a/tests/vasp/jobs/test_eos.py b/tests/vasp/jobs/test_eos.py new file mode 100644 index 0000000000..c4905bcbce --- /dev/null +++ b/tests/vasp/jobs/test_eos.py @@ -0,0 +1,82 @@ +from __future__ import annotations + +from emmet.core.tasks import TaskDoc +from jobflow import run_locally +from pymatgen.core import Structure +from pytest import approx + +from atomate2.vasp.jobs.eos import MPGGAEosRelaxMaker, MPGGAEosStaticMaker + +expected_incar_relax = { + "ISIF": 3, + "IBRION": 2, + "EDIFF": 1.0e-6, + "ISMEAR": 0, + "SIGMA": 0.05, + "LMAXMIX": 6, + "KSPACING": 0.22, +} + +expected_incar_static = {**expected_incar_relax, "NSW": 0, "IBRION": -1, "ISMEAR": -5} +expected_incar_static.pop("ISIF") + + +def test_mp_gga_eos_relax_maker(mock_vasp, clean_dir, vasp_test_dir): + # map from job name to directory containing reference output files + ref_paths = { + "EOS MP GGA relax": "Si_EOS_MP_GGA/mp-149-PBE-EOS_MP_GGA_relax_1", + } + + # settings passed to fake_run_vasp; adjust these to check for certain INCAR settings + fake_run_vasp_kwargs = { + key: {"incar_settings": list(expected_incar_relax)} for key in ref_paths + } + + mock_vasp(ref_paths, fake_run_vasp_kwargs) + + structure = Structure.from_file( + f"{vasp_test_dir}/{ref_paths['EOS MP GGA relax']}/inputs/POSCAR" + ) + maker = MPGGAEosRelaxMaker() + job = maker.make(structure) + + # ensure flow runs successfully + responses = run_locally(job, create_folders=True, ensure_success=True) + + # validate output + task_doc = responses[job.uuid][1].output + assert isinstance(task_doc, TaskDoc) + assert task_doc.output.energy == approx(-10.849349) + + +def test_mp_gga_eos_static_maker(mock_vasp, clean_dir, vasp_test_dir): + # map from job name to directory containing reference output files + ref_paths = { + "EOS MP GGA static": "Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0", + } + + # settings passed to fake_run_vasp; adjust these to check for certain INCAR settings + fake_run_vasp_kwargs = { + key: {"incar_settings": list(expected_incar_static)} for key in ref_paths + } + + mock_vasp(ref_paths, fake_run_vasp_kwargs) + + input_structure = Structure.from_file( + f"{vasp_test_dir}/Si_EOS_MP_GGA/" + f"mp-149-PBE-EOS_Deformation_Relax_0/outputs/POSCAR.gz" + ) + structure = Structure.from_file( + f"{vasp_test_dir}/Si_EOS_MP_GGA/mp-149-PBE-EOS_Static_0/inputs/POSCAR" + ) + assert input_structure == structure + + job = MPGGAEosStaticMaker().make(structure) + + # ensure flow runs successfully + responses = run_locally(job, create_folders=True, ensure_success=True) + + # validate output + task_doc = responses[job.uuid][1].output + assert isinstance(task_doc, TaskDoc) + assert task_doc.output.energy == approx(-10.547764) diff --git a/tests/vasp/jobs/test_matpes.py b/tests/vasp/jobs/test_matpes.py index 8619228a34..42e4aaf237 100644 --- a/tests/vasp/jobs/test_matpes.py +++ b/tests/vasp/jobs/test_matpes.py @@ -82,17 +82,17 @@ def test_matpes_static_maker_default_values(maker_cls: BaseVaspMaker): def test_matpes_gga_static_maker(mock_vasp, clean_dir, vasp_test_dir): # map from job name to directory containing reference input/output files - ref_paths = {"MatPES GGA static": "matpes_pbe_r2scan_flow/pbe_static"} + gga_job_name = "MatPES GGA static" + ref_paths = {gga_job_name: "matpes_static_flow/pbe_static"} si_struct = Structure.from_file( - f"{vasp_test_dir}/matpes_pbe_r2scan_flow/pbe_static/inputs/POSCAR" + f"{vasp_test_dir}/matpes_static_flow/pbe_static/inputs/POSCAR" ) - # settings passed to fake_run_vasp; adjust these to check for certain INCAR settings - fake_run_vasp_kwargs = {key: {"incar_settings": []} for key in ref_paths} + # exclude LWAVE from INCAR checking since it defaults to False in MatPesGGAStatic + # but is overridden to True in the MatPES static flow to speed up SCF convergence + # of 2nd static, but we use the same reference input files in both tests + mock_vasp(ref_paths, {gga_job_name: {"incar_exclude": ["LWAVE"]}}) - mock_vasp(ref_paths, fake_run_vasp_kwargs) - - # generate flow job = MatPesGGAStaticMaker().make(si_struct) # ensure flow runs successfully @@ -106,19 +106,13 @@ def test_matpes_gga_static_maker(mock_vasp, clean_dir, vasp_test_dir): def test_matpes_meta_gga_static_maker(mock_vasp, clean_dir, vasp_test_dir): # map from job name to directory containing reference input/output files - ref_paths = {"MatPES meta-GGA static": "matpes_pbe_r2scan_flow/r2scan_static"} + ref_paths = {"MatPES meta-GGA static": "matpes_static_flow/r2scan_static"} si_struct = Structure.from_file( - f"{vasp_test_dir}/matpes_pbe_r2scan_flow/r2scan_static/inputs/POSCAR" + f"{vasp_test_dir}/matpes_static_flow/r2scan_static/inputs/POSCAR" ) - # settings passed to fake_run_vasp; adjust these to check for certain INCAR settings - fake_run_vasp_kwargs = { - key: {"incar_settings": ["GGA", "METAGGA", "ALGO"]} for key in ref_paths - } - - mock_vasp(ref_paths, fake_run_vasp_kwargs) + mock_vasp(ref_paths) - # generate flow job = MatPesMetaGGAStaticMaker().make(si_struct) # ensure flow runs successfully diff --git a/tests/vasp/jobs/test_md.py b/tests/vasp/jobs/test_md.py new file mode 100644 index 0000000000..2f5c0c190d --- /dev/null +++ b/tests/vasp/jobs/test_md.py @@ -0,0 +1,53 @@ +import pytest +from emmet.core.tasks import TaskDoc +from emmet.core.vasp.calculation import IonicStep, VaspObject +from jobflow import run_locally + +from atomate2.vasp.jobs.md import MDMaker + + +def test_molecular_dynamics(mock_vasp, clean_dir, si_structure): + # mapping from job name to directory containing test files + ref_paths = {"molecular dynamics": "Si_molecular_dynamics/molecular_dynamics"} + + # settings passed to fake_run_vasp; adjust these to check for certain INCAR settings + fake_run_vasp_kwargs = { + "molecular dynamics": { + "incar_settings": [ + "IBRION", + "TBEN", + "TEND", + "NSW", + "POTIM", + "MDALGO", + "ISIF", + ] + } + } + + # automatically use fake VASP and write POTCAR.spec during the test + mock_vasp(ref_paths, fake_run_vasp_kwargs) + + # generate job + job = MDMaker().make(si_structure) + nsw = 3 + job.maker.input_set_generator.user_incar_settings["NSW"] = nsw + + # run the flow or job and ensure that it finished running successfully + responses = run_locally(job, create_folders=True, ensure_success=True) + + # validation on the output + + output1 = responses[job.uuid][1].output + assert isinstance(output1, TaskDoc) + assert output1.output.energy == pytest.approx(-11.46520398) + + # check ionic steps stored as pymatgen Trajectory + assert output1.calcs_reversed[0].output.ionic_steps is None + traj = output1.vasp_objects[VaspObject.TRAJECTORY] + assert len(traj.frame_properties) == nsw + # check that a frame property can be converted to an IonicStep + energies = [-11.47041923, -11.46905352, -11.46520398] + for idx, frame in enumerate(traj.frame_properties): + ionic_step = IonicStep(**frame) + assert ionic_step.e_wo_entrp == pytest.approx(energies[idx]) diff --git a/tests/vasp/jobs/test_mp.py b/tests/vasp/jobs/test_mp.py index dc21655d61..cfc7a5349f 100644 --- a/tests/vasp/jobs/test_mp.py +++ b/tests/vasp/jobs/test_mp.py @@ -1,4 +1,6 @@ import pytest +from emmet.core.tasks import TaskDoc +from jobflow import run_locally from pymatgen.core import Structure from atomate2.vasp.jobs.mp import ( @@ -42,10 +44,7 @@ def test_mp_meta_gga_relax_maker_default_values(): def test_mp_meta_gga_static_maker(mock_vasp, clean_dir, vasp_test_dir): - from emmet.core.tasks import TaskDoc - from jobflow import run_locally - - # map from job name to directory containing reference output files + # map from job name to directory containing reference input/output files ref_paths = { "MP meta-GGA static": "Si_mp_meta_gga_relax/r2scan_final_static", } @@ -58,7 +57,6 @@ def test_mp_meta_gga_static_maker(mock_vasp, clean_dir, vasp_test_dir): mock_vasp(ref_paths, fake_run_vasp_kwargs) - # generate flow job = MPMetaGGAStaticMaker( input_set_generator=MPMetaGGARelaxSetGenerator(auto_kspacing=0.8249) ).make(si_struct) @@ -73,10 +71,7 @@ def test_mp_meta_gga_static_maker(mock_vasp, clean_dir, vasp_test_dir): def test_mp_meta_gga_relax_maker(mock_vasp, clean_dir, vasp_test_dir): - from emmet.core.tasks import TaskDoc - from jobflow import run_locally - - # map from job name to directory containing reference output files + # map from job name to directory containing reference input/output files ref_paths = { "MP meta-GGA relax": "Si_mp_meta_gga_relax/r2scan_relax", } @@ -91,7 +86,6 @@ def test_mp_meta_gga_relax_maker(mock_vasp, clean_dir, vasp_test_dir): mock_vasp(ref_paths, fake_run_vasp_kwargs) - # generate flow job = MPMetaGGARelaxMaker( input_set_generator=MPMetaGGARelaxSetGenerator(auto_kspacing=0.4786) ).make(si_struct) @@ -106,10 +100,7 @@ def test_mp_meta_gga_relax_maker(mock_vasp, clean_dir, vasp_test_dir): def test_mp_gga_relax_maker(mock_vasp, clean_dir, vasp_test_dir): - from emmet.core.tasks import TaskDoc - from jobflow import run_locally - - # map from job name to directory containing reference output files + # map from job name to directory containing reference input/output files ref_paths = { "MP GGA relax": "Si_mp_gga_relax/GGA_Relax_1", } @@ -124,7 +115,6 @@ def test_mp_gga_relax_maker(mock_vasp, clean_dir, vasp_test_dir): mock_vasp(ref_paths, fake_run_vasp_kwargs) - # generate flow job = MPGGARelaxMaker().make(si_struct) # ensure flow runs successfully diff --git a/tests/vasp/lobster/conftest.py b/tests/vasp/lobster/conftest.py index e6c629db65..64abb34b0f 100644 --- a/tests/vasp/lobster/conftest.py +++ b/tests/vasp/lobster/conftest.py @@ -1,10 +1,15 @@ from __future__ import annotations import logging +import shutil from pathlib import Path from typing import TYPE_CHECKING, Literal import pytest +from pymatgen.io.lobster import Lobsterin + +import atomate2.lobster.jobs +import atomate2.lobster.run if TYPE_CHECKING: from collections.abc import Sequence @@ -62,8 +67,6 @@ def mock_lobster(monkeypatch, lobster_test_dir): dictionary created in step 4. 6. Run your lobster job after calling `mock_lobster`. """ - import atomate2.lobster.jobs - import atomate2.lobster.run def mock_run_lobster(*args, **kwargs): from jobflow import CURRENT_JOB @@ -123,8 +126,6 @@ def fake_run_lobster( def verify_inputs(ref_path: str | Path, lobsterin_settings: Sequence[str]): - from pymatgen.io.lobster import Lobsterin - user = Lobsterin.from_file("lobsterin") # Check lobsterin @@ -136,8 +137,6 @@ def verify_inputs(ref_path: str | Path, lobsterin_settings: Sequence[str]): def copy_lobster_outputs(ref_path: str | Path): - import shutil - output_path = ref_path / "outputs" for output_file in output_path.iterdir(): if output_file.is_file(): diff --git a/tests/vasp/lobster/flows/test_lobster.py b/tests/vasp/lobster/flows/test_lobster.py index 6ba1a8136f..5c601b1809 100644 --- a/tests/vasp/lobster/flows/test_lobster.py +++ b/tests/vasp/lobster/flows/test_lobster.py @@ -4,6 +4,7 @@ from atomate2.lobster.jobs import LobsterMaker from atomate2.lobster.schemas import LobsterTaskDocument from atomate2.vasp.flows.lobster import VaspLobsterMaker +from atomate2.vasp.flows.mp import MPVaspLobsterMaker from atomate2.vasp.jobs.lobster import LobsterStaticMaker from atomate2.vasp.powerups import update_user_incar_settings @@ -67,11 +68,14 @@ def test_lobster_uniform_maker(mock_vasp, mock_lobster, clean_dir, memory_jobsto ) job = VaspLobsterMaker( lobster_maker=LobsterMaker( + task_document_kwargs={ + "calc_quality_kwargs": {"potcar_symbols": ["Si"], "n_bins": 10} + }, user_lobsterin_settings={ "COHPstartEnergy": -5.0, "COHPEndEnergy": 5.0, "cohpGenerator": "from 0.1 to 3.0 orbitalwise", - } + }, ), delete_wavecars=False, ).make(si_structure) @@ -141,11 +145,14 @@ def test_lobstermaker(mock_vasp, mock_lobster, clean_dir, memory_jobstore): job = VaspLobsterMaker( lobster_static_maker=LobsterStaticMaker(), lobster_maker=LobsterMaker( + task_document_kwargs={ + "calc_quality_kwargs": {"potcar_symbols": ["Si"], "n_bins": 10} + }, user_lobsterin_settings={ "COHPstartEnergy": -5.0, "COHPEndEnergy": 5.0, "cohpGenerator": "from 0.1 to 3.0 orbitalwise", - } + }, ), delete_wavecars=False, ).make(si_structure) @@ -216,11 +223,14 @@ def test_lobstermaker_delete(mock_vasp, mock_lobster, clean_dir, memory_jobstore job = VaspLobsterMaker( lobster_static_maker=LobsterStaticMaker(), lobster_maker=LobsterMaker( + task_document_kwargs={ + "calc_quality_kwargs": {"potcar_symbols": ["Si"], "n_bins": 10} + }, user_lobsterin_settings={ "COHPstartEnergy": -5.0, "COHPEndEnergy": 5.0, "cohpGenerator": "from 0.1 to 3.0 orbitalwise", - } + }, ), delete_wavecars=True, ).make(si_structure) @@ -237,3 +247,88 @@ def test_lobstermaker_delete(mock_vasp, mock_lobster, clean_dir, memory_jobstore .resolve(memory_jobstore), LobsterTaskDocument, ) + + +def test_mp_vasp_lobstermaker( + mock_vasp, mock_lobster, clean_dir, memory_jobstore, vasp_test_dir +): + # mapping from job name to directory containing test files + ref_paths = { + "MP GGA relax 1": "Fe_lobster_mp/GGA_relax_1", + "MP GGA relax 2": "Fe_lobster_mp/GGA_relax_2", + "MP GGA static": "Fe_lobster_mp/GGA_static", + } + + # settings passed to fake_run_vasp; adjust these to check for certain INCAR settings + fake_run_vasp_kwargs = { + "MP GGA relax 1": { + "incar_settings": ["NSW", "ISMEAR"], + "check_inputs": ["poscar", "potcar", "kpoints", "incar"], + }, + "MP GGA relax 2": { + "incar_settings": ["NSW", "ISMEAR"], + "check_inputs": ["poscar", "potcar", "kpoints", "incar"], + }, + "MP GGA static": { + "incar_settings": ["NSW", "LWAVE", "ISMEAR", "ISYM", "NBANDS", "ISPIN"], + "check_inputs": ["poscar", "potcar", "kpoints", "incar"], + }, + } + + ref_paths_lobster = { + "lobster_run_0": "Fe_lobster/lobster_0", + "delete_lobster_wavecar": "Fe_lobster/lobster_0", + } + + # settings passed to fake_run_vasp; adjust these to check for certain INCAR settings + fake_run_lobster_kwargs = { + "lobster_run_0": {"lobsterin_settings": ["basisfunctions"]}, + } + + # automatically use fake VASP and write POTCAR.spec during the test + mock_vasp(ref_paths, fake_run_vasp_kwargs) + mock_lobster(ref_paths_lobster, fake_run_lobster_kwargs) + + fe_structure = Structure( + lattice=[ + [2.33614509e00, 1.11670000e-04, -8.25822930e-01], + [-1.16807798e00, 2.02304724e00, -8.26082200e-01], + [1.17007387e00, 2.02730500e00, 3.31032796e00], + ], + species=["Fe", "Fe"], + coords=[ + [5.0000002e-01, 5.0000008e-01, 4.9999999e-01], + [9.9999998e-01, 9.9999992e-01, 1.0000000e-08], + ], + ) + + job = MPVaspLobsterMaker( + lobster_maker=LobsterMaker( + task_document_kwargs={ + "calc_quality_kwargs": {"potcar_symbols": ["Fe_pv"], "n_bins": 10}, + "save_computational_data_jsons": False, + "save_cba_jsons": False, + }, + user_lobsterin_settings={ + "COHPstartEnergy": -5.0, + "COHPEndEnergy": 5.0, + "cohpGenerator": "from 0.1 to 3.0 orbitalwise", + }, + ), + ).make(fe_structure) + + # run the flow or job and ensure that it finished running successfully + responses = run_locally( + job, + create_folders=True, + ensure_success=True, + store=memory_jobstore, + ) + + task_doc = ( + responses[job.jobs[-2].uuid][1] + .replace.output["lobster_task_documents"][0] + .resolve(memory_jobstore) + ) + + assert isinstance(task_doc, LobsterTaskDocument) diff --git a/tests/vasp/lobster/schemas/test_lobster.py b/tests/vasp/lobster/schemas/test_lobster.py index 38f8bcfb93..6aadd0c0d6 100644 --- a/tests/vasp/lobster/schemas/test_lobster.py +++ b/tests/vasp/lobster/schemas/test_lobster.py @@ -1,26 +1,37 @@ +import os + +from numpy.testing import assert_allclose +from pymatgen.core.structure import Structure +from pymatgen.electronic_structure.cohp import Cohp, CompleteCohp +from pymatgen.electronic_structure.dos import LobsterCompleteDos + +from atomate2.common.files import copy_files, gunzip_files +from atomate2.lobster.schemas import ( + CohpPlotData, + CondensedBondingAnalysis, + LobsterinModel, + LobsteroutModel, + LobsterTaskDocument, + StrongestBonds, + read_saved_json, +) + + def test_lobster_task_document(lobster_test_dir): """ Test the CCDDocument schema, this test needs to be placed here since we are using the VASP TaskDocuments for testing. """ - from numpy.testing import assert_allclose - from pymatgen.core.structure import Structure - from pymatgen.electronic_structure.cohp import Cohp, CompleteCohp - from pymatgen.electronic_structure.dos import LobsterCompleteDos - - from atomate2.lobster.schemas import ( - LobsterinModel, - LobsteroutModel, - LobsterTaskDocument, - StrongestBonds, - ) - doc = LobsterTaskDocument.from_directory( - dir_name=lobster_test_dir / "lobsteroutputs/mp-2534", save_cohp_plots=False + dir_name=lobster_test_dir / "lobsteroutputs/mp-2534", + save_cohp_plots=False, + calc_quality_kwargs={"n_bins": 100, "potcar_symbols": ["Ga_d", "As"]}, + save_cba_jsons=False, + save_computational_data_jsons=False, ) assert isinstance(doc.structure, Structure) assert isinstance(doc.lobsterout, LobsteroutModel) - assert_allclose(doc.lobsterout.charge_spilling[0], 0.009899999999999999) + assert_allclose(doc.lobsterout.charge_spilling[0], 0.00989999, atol=1e-7) assert isinstance(doc.lobsterin, LobsterinModel) assert_allclose(doc.lobsterin.cohpstartenergy, -5) @@ -73,12 +84,12 @@ def test_lobster_task_document(lobster_test_dir): assert doc.strongest_bonds_icoop_cation_anion.which_bonds == "cation-anion" assert doc.strongest_bonds_icohp_cation_anion.which_bonds == "cation-anion" assert doc.strongest_bonds_icobi_cation_anion.which_bonds == "cation-anion" - assert isinstance(doc.lobsterpy_data.cohp_plot_data["Ga1: 4 x As-Ga"], Cohp) + assert isinstance(doc.lobsterpy_data.cohp_plot_data.data["Ga1: 4 x As-Ga"], Cohp) assert doc.lobsterpy_data.which_bonds == "all" assert doc.lobsterpy_data_cation_anion.which_bonds == "cation-anion" assert doc.lobsterpy_data.number_of_considered_ions == 2 assert isinstance( - doc.lobsterpy_data_cation_anion.cohp_plot_data["Ga1: 4 x As-Ga"], Cohp + doc.lobsterpy_data_cation_anion.cohp_plot_data.data["Ga1: 4 x As-Ga"], Cohp ) assert isinstance(doc.lobsterpy_text, str) assert isinstance(doc.lobsterpy_text_cation_anion, str) @@ -115,7 +126,11 @@ def test_lobster_task_document(lobster_test_dir): assert doc.chemsys == "As-Ga" doc2 = LobsterTaskDocument.from_directory( - dir_name=lobster_test_dir / "lobsteroutputs/mp-754354", save_cohp_plots=False + dir_name=lobster_test_dir / "lobsteroutputs/mp-754354", + save_cohp_plots=False, + calc_quality_kwargs={"n_bins": 100, "potcar_symbols": ["Ba_sv", "O", "F"]}, + save_cba_jsons=False, + save_computational_data_jsons=False, ) assert_allclose( doc2.strongest_bonds_icohp.strongest_bonds["Ba-O"]["ICOHP"], -0.55689 @@ -139,5 +154,256 @@ def test_lobster_task_document(lobster_test_dir): "2p_x": 1.97, "total": 7.88, } - gross_pop_here = doc2.gross_populations[10]["Mulliken GP"] + gross_popp_here = doc2.gross_populations[10]["Mulliken GP"] + assert expected_gross_pop == gross_popp_here + + +def test_lobster_task_document_non_gzip(lobster_test_dir, tmp_path): + """ + Test the CCDDocument schema, this test needs to be placed here + since we are using the VASP TaskDocuments for testing. + """ + + # copy test files to temp path + copy_files(src_dir=lobster_test_dir / "lobsteroutputs/mp-2534", dest_dir=tmp_path) + # Unzip test files to check if schema still works + gunzip_files(tmp_path) + + doc = LobsterTaskDocument.from_directory( + dir_name=tmp_path, # lobster_test_dir / "lobsteroutputs/mp-2534", + save_cohp_plots=False, + calc_quality_kwargs={"n_bins": 100, "potcar_symbols": ["Ga_d", "As"]}, + save_cba_jsons=False, + save_computational_data_jsons=False, + ) + assert isinstance(doc.structure, Structure) + assert isinstance(doc.lobsterout, LobsteroutModel) + assert_allclose(doc.lobsterout.charge_spilling[0], 0.009899999999999999) + + assert isinstance(doc.lobsterin, LobsterinModel) + assert_allclose(doc.lobsterin.cohpstartenergy, -5) + assert isinstance(doc.strongest_bonds_icohp, StrongestBonds) + assert_allclose( + doc.strongest_bonds_icohp.strongest_bonds["As-Ga"]["ICOHP"], -4.32971 + ) + assert_allclose( + doc.strongest_bonds_icobi.strongest_bonds["As-Ga"]["ICOBI"], 0.82707 + ) + assert_allclose( + doc.strongest_bonds_icoop.strongest_bonds["As-Ga"]["ICOOP"], 0.31405 + ) + assert_allclose( + doc.strongest_bonds_icohp.strongest_bonds["As-Ga"]["length"], 2.4899 + ) + assert_allclose( + doc.strongest_bonds_icobi.strongest_bonds["As-Ga"]["length"], 2.4899 + ) + assert_allclose( + doc.strongest_bonds_icoop.strongest_bonds["As-Ga"]["length"], 2.4899 + ) + assert doc.strongest_bonds_icoop.which_bonds == "all" + assert doc.strongest_bonds_icohp.which_bonds == "all" + assert doc.strongest_bonds_icobi.which_bonds == "all" + assert_allclose( + doc.strongest_bonds_icohp_cation_anion.strongest_bonds["As-Ga"]["ICOHP"], + -4.32971, + ) + assert_allclose( + doc.strongest_bonds_icobi_cation_anion.strongest_bonds["As-Ga"]["ICOBI"], + 0.82707, + ) + assert_allclose( + doc.strongest_bonds_icoop_cation_anion.strongest_bonds["As-Ga"]["ICOOP"], + 0.31405, + ) + assert_allclose( + doc.strongest_bonds_icohp_cation_anion.strongest_bonds["As-Ga"]["length"], + 2.4899, + ) + assert_allclose( + doc.strongest_bonds_icobi_cation_anion.strongest_bonds["As-Ga"]["length"], + 2.4899, + ) + assert_allclose( + doc.strongest_bonds_icoop_cation_anion.strongest_bonds["As-Ga"]["length"], + 2.4899, + ) + assert doc.strongest_bonds_icoop_cation_anion.which_bonds == "cation-anion" + assert doc.strongest_bonds_icohp_cation_anion.which_bonds == "cation-anion" + assert doc.strongest_bonds_icobi_cation_anion.which_bonds == "cation-anion" + assert isinstance(doc.lobsterpy_data.cohp_plot_data.data["Ga1: 4 x As-Ga"], Cohp) + assert doc.lobsterpy_data.which_bonds == "all" + assert doc.lobsterpy_data_cation_anion.which_bonds == "cation-anion" + assert doc.lobsterpy_data.number_of_considered_ions == 2 + assert isinstance(doc.lobsterpy_data_cation_anion.cohp_plot_data, CohpPlotData) + assert isinstance(doc.lobsterpy_text, str) + assert isinstance(doc.lobsterpy_text_cation_anion, str) + + assert isinstance(doc.cohp_data, CompleteCohp) + assert isinstance(doc.cobi_data, CompleteCohp) + assert isinstance(doc.coop_data, CompleteCohp) + assert isinstance(doc.dos, LobsterCompleteDos) + assert_allclose(doc.madelung_energies["Mulliken"], -0.68) + assert_allclose( + doc.site_potentials["Mulliken"], + [-1.26, -1.27, -1.26, -1.27, 1.27, 1.27, 1.26, 1.26], + rtol=1e-2, + ) + assert_allclose(doc.site_potentials["Ewald_splitting"], 3.14) + assert len(doc.gross_populations) == 8 + assert doc.gross_populations[5]["element"] == "As" + expected_gross_pop = { + "4s": 1.38, + "4p_y": 1.18, + "4p_z": 1.18, + "4p_x": 1.18, + "total": 4.93, + } + gross_pop_here = doc.gross_populations[5]["Loewdin GP"] assert expected_gross_pop == gross_pop_here + assert_allclose( + doc.charges["Mulliken"], + [0.13, 0.13, 0.13, 0.13, -0.13, -0.13, -0.13, -0.13], + rtol=1e-2, + ) + assert len(doc.band_overlaps["1"]) + len(doc.band_overlaps["-1"]) == 12 + + assert doc.chemsys == "As-Ga" + + +def test_lobster_task_doc_saved_jsons(lobster_test_dir): + """ + Test if jsons saved are valid + """ + + # Generate condensed bonding analysis (cba) json using lobstertaskdoc + + _ = LobsterTaskDocument.from_directory( + dir_name=lobster_test_dir / "lobsteroutputs/mp-2534", + save_cohp_plots=False, + calc_quality_kwargs={"n_bins": 100, "potcar_symbols": ["Ga_d", "As"]}, + save_cba_jsons=True, + add_coxxcar_to_task_document=False, + save_computational_data_jsons=False, + ) + + expected_cba_keys_json = [ + "cation_anion_bonds", + "all_bonds", + "madelung_energies", + "charges", + "calc_quality_summary", + "calc_quality_text", + "dos", + "lso_dos", + "builder_meta", + ] + + for cba_key in expected_cba_keys_json: + # read data from saved json as pymatgen objects + json_data = read_saved_json( + filename=lobster_test_dir / "lobsteroutputs/mp-2534/cba.json.gz", + pymatgen_objs=True, + query=cba_key, + ) + + if "dos" in cba_key and json_data[cba_key]: + assert isinstance(json_data[cba_key], LobsterCompleteDos) + + if (cba_key == "all_bonds" or cba_key == "cation_anion_bonds") and json_data[ + cba_key + ]: + assert isinstance( + json_data[cba_key]["lobsterpy_data"], CondensedBondingAnalysis + ) + assert isinstance( + json_data[cba_key]["lobsterpy_data"].cohp_plot_data, CohpPlotData + ) + # assert isinstance(cohp_data, Cohp) + + # read cba saved jsons without converting it to non pymatgen objects (read as dict) + + for cba_key in expected_cba_keys_json: + json_data = read_saved_json( + filename=lobster_test_dir / "lobsteroutputs/mp-2534/cba.json.gz", + pymatgen_objs=False, + query=cba_key, + ) + if "dos" in cba_key and json_data[cba_key]: + assert isinstance(json_data[cba_key], dict) + + if (cba_key == "all_bonds" or cba_key == "cation_anion_bonds") and json_data[ + cba_key + ]: + for cohp_data in json_data[cba_key]["lobsterpy_data"]["cohp_plot_data"][ + "data" + ].values(): + assert isinstance(cohp_data, dict) + + # delete the cba json after the test + os.remove(lobster_test_dir / "lobsteroutputs/mp-2534/cba.json.gz") + + # Generate computational data json from lobstertaskdoc + _ = LobsterTaskDocument.from_directory( + dir_name=lobster_test_dir / "lobsteroutputs/mp-754354", + save_cohp_plots=False, + calc_quality_kwargs={"n_bins": 100, "potcar_symbols": ["Ba_sv", "O", "F"]}, + save_cba_jsons=False, + add_coxxcar_to_task_document=False, + save_computational_data_jsons=True, + ) + + expected_computational_data_keys_json = [ + "builder_meta", + "structure", + "charges", + "lobsterout", + "lobsterin", + "lobsterpy_data", + "lobsterpy_text", + "calc_quality_summary", + "calc_quality_text", + "strongest_bonds_icohp", + "strongest_bonds_icoop", + "strongest_bonds_icobi", + "lobsterpy_data_cation_anion", + "lobsterpy_text_cation_anion", + "strongest_bonds_icohp_cation_anion", + "strongest_bonds_icoop_cation_anion", + "strongest_bonds_icobi_cation_anion", + "dos", + "lso_dos", + "madelung_energies", + "site_potentials", + "gross_populations", + "band_overlaps", + "cohp_data", + "coop_data", + "cobi_data", + ] + + # Read the data from saved computational data json as pymatgen objects + for taskdoc_key in expected_computational_data_keys_json: + json_data = read_saved_json( + filename=lobster_test_dir + / "lobsteroutputs/mp-754354/computational_data.json.gz", + pymatgen_objs=True, + query=taskdoc_key, + ) + if "dos" in taskdoc_key and json_data[taskdoc_key]: + assert isinstance(json_data[taskdoc_key], LobsterCompleteDos) + + if "lobsterpy_data" in taskdoc_key and json_data[taskdoc_key]: + assert isinstance(json_data[taskdoc_key], CondensedBondingAnalysis) + for cohp_data in json_data[taskdoc_key].cohp_plot_data.data.values(): + assert isinstance(cohp_data, Cohp) + + if ( + taskdoc_key == "cohp_data" + or taskdoc_key == "cobi_data" + or taskdoc_key == "coop_data" + ) and json_data[taskdoc_key]: + assert isinstance(json_data[taskdoc_key], CompleteCohp) + + # delete the computational data json after the test + os.remove(lobster_test_dir / "lobsteroutputs/mp-754354/computational_data.json.gz") diff --git a/tests/vasp/schemas/test_defect.py b/tests/vasp/schemas/test_defect.py index 72897e84ba..61350dd398 100644 --- a/tests/vasp/schemas/test_defect.py +++ b/tests/vasp/schemas/test_defect.py @@ -1,25 +1,29 @@ +from collections import defaultdict + +from emmet.core.tasks import TaskDoc + +from atomate2.common.schemas.defects import CCDDocument + + def test_ccd_document(vasp_test_dir): """ Test the CCDDocument schema, this test needs to be placed here since we are using the VASP TaskDocuments for testing. """ - from collections import defaultdict - - from emmet.core.tasks import TaskDoc - - from atomate2.common.schemas.defects import CCDDocument def is_strict_minimum(min_index, arr): min_val = arr[min_index] - return all(not (i != min_index and val < min_val) for i, val in enumerate(arr)) + return all( + not (idx != min_index and val < min_val) for idx, val in enumerate(arr) + ) static_tasks1: list[TaskDoc] = [] static_tasks2: list[TaskDoc] = [] static_dirs1: list[str] = [] static_dirs2: list[str] = [] - for i in range(5): - sdir1 = vasp_test_dir / "Si_config_coord" / f"static_q1_{i}" / "outputs" - sdir2 = vasp_test_dir / "Si_config_coord" / f"static_q2_{i}" / "outputs" + for idx in range(5): + sdir1 = vasp_test_dir / "Si_config_coord" / f"static_q1_{idx}" / "outputs" + sdir2 = vasp_test_dir / "Si_config_coord" / f"static_q2_{idx}" / "outputs" static_tasks1.append(TaskDoc.from_directory(sdir1)) static_tasks2.append(TaskDoc.from_directory(sdir2)) static_dirs1.append(str(sdir1)) @@ -51,9 +55,7 @@ def is_strict_minimum(min_index, arr): input_dict["relaxed_uuid1"] = static_dirs1[2] input_dict["relaxed_uuid2"] = static_dirs2[2] - ccd_doc = CCDDocument.from_task_outputs( - **input_dict, - ) + ccd_doc = CCDDocument.from_task_outputs(**input_dict) # create the CCD document # ccd_doc = CCDDocument.from_struct_en(static_tasks1, static_tasks2, s0, s1) diff --git a/tests/vasp/sets/test_matpes.py b/tests/vasp/sets/test_matpes.py new file mode 100644 index 0000000000..869f2e8e98 --- /dev/null +++ b/tests/vasp/sets/test_matpes.py @@ -0,0 +1,51 @@ +"""Confirm with @janosh before changing any of the expected values below.""" + +import pytest + +from atomate2.vasp.sets.base import VaspInputGenerator +from atomate2.vasp.sets.matpes import ( + MatPesGGAStaticSetGenerator, + MatPesMetaGGAStaticSetGenerator, +) + + +@pytest.mark.parametrize( + "set_generator", + [MatPesGGAStaticSetGenerator, MatPesMetaGGAStaticSetGenerator], +) +def test_matpes_sets(set_generator: VaspInputGenerator) -> None: + matpes_set: VaspInputGenerator = set_generator() + assert {*matpes_set.as_dict()} >= { + "@class", + "@module", + "@version", + "auto_ismear", + "auto_ispin", + "auto_kspacing", + "auto_lreal", + "auto_metal_kpoints", + "config_dict", + "constrain_total_magmom", + "force_gamma", + "inherit_incar", + "sort_structure", + "symprec", + "use_structure_charge", + "user_incar_settings", + "user_kpoints_settings", + "user_potcar_functional", + "user_potcar_settings", + "validate_magmom", + "vdw", + } + assert matpes_set.potcar_functional == "PBE_64" + assert matpes_set.inherit_incar is False + assert matpes_set.auto_ismear is False + assert matpes_set.auto_kspacing is False + assert matpes_set.force_gamma is True + assert matpes_set.auto_lreal is False + assert matpes_set.auto_metal_kpoints is True + assert matpes_set.sort_structure is True + assert matpes_set.symprec == 0.1 + assert matpes_set.use_structure_charge is False + assert matpes_set.vdw is None diff --git a/tests/vasp/sets/test_mp.py b/tests/vasp/sets/test_mp.py new file mode 100644 index 0000000000..709e3e3c15 --- /dev/null +++ b/tests/vasp/sets/test_mp.py @@ -0,0 +1,64 @@ +"""Confirm with @janosh before changing any of the expected values below.""" + +import pytest + +from atomate2.vasp.sets.base import VaspInputGenerator +from atomate2.vasp.sets.mp import ( + MPGGARelaxSetGenerator, + MPGGAStaticSetGenerator, + MPMetaGGARelaxSetGenerator, + MPMetaGGAStaticSetGenerator, +) + + +@pytest.mark.parametrize( + "set_generator", + [ + MPGGAStaticSetGenerator, + MPMetaGGAStaticSetGenerator, + MPGGARelaxSetGenerator, + MPMetaGGARelaxSetGenerator, + ], +) +def test_mp_sets(set_generator: VaspInputGenerator) -> None: + mp_set: VaspInputGenerator = set_generator() + assert {*mp_set.as_dict()} >= { + "@class", + "@module", + "@version", + "auto_ismear", + "auto_ispin", + "auto_kspacing", + "auto_lreal", + "auto_metal_kpoints", + "config_dict", + "constrain_total_magmom", + "force_gamma", + "inherit_incar", + "sort_structure", + "symprec", + "use_structure_charge", + "user_incar_settings", + "user_kpoints_settings", + "user_potcar_functional", + "user_potcar_settings", + "validate_magmom", + "vdw", + } + assert ( + mp_set.potcar_functional == "PBE_54" + if "Meta" in set_generator.__name__ + else "PBE" + ) + assert mp_set.inherit_incar is False + assert mp_set.auto_ismear is False + assert mp_set.auto_kspacing is True + assert mp_set.force_gamma is True + assert mp_set.auto_lreal is False + assert mp_set.auto_metal_kpoints is True + assert mp_set.sort_structure is True + assert mp_set.symprec == 0.1 + assert mp_set.use_structure_charge is False + assert mp_set.vdw is None + bandgap_tol = getattr(mp_set, "bandgap_tol", None) + assert bandgap_tol == (1e-4 if "Meta" in set_generator.__name__ else None) diff --git a/tests/vasp/test_base.py b/tests/vasp/test_base.py index 2ac5a90135..5195899a11 100644 --- a/tests/vasp/test_base.py +++ b/tests/vasp/test_base.py @@ -1,8 +1,10 @@ from __future__ import annotations import pytest +from custodian.vasp.handlers import ErrorHandler from pymatgen.core import Lattice, Structure +from atomate2.vasp.run import _DEFAULT_HANDLERS from atomate2.vasp.sets.base import _get_magmoms @@ -51,3 +53,8 @@ def test_get_magmoms_with_specie() -> None: assert struct[0].specie.spin is None out = _get_magmoms(struct) assert out == [0.6, 0.6] + + +def test_default_handlers(): + assert len(_DEFAULT_HANDLERS) >= 8 + assert all(isinstance(handler, ErrorHandler) for handler in _DEFAULT_HANDLERS) diff --git a/tests/vasp/test_drones.py b/tests/vasp/test_drones.py index 9a7c13fbd7..10da042827 100644 --- a/tests/vasp/test_drones.py +++ b/tests/vasp/test_drones.py @@ -1,6 +1,7 @@ -def test_structure_optimization(vasp_test_dir): - from atomate2.vasp.drones import VaspDrone +from atomate2.vasp.drones import VaspDrone + +def test_structure_optimization(vasp_test_dir): drone = VaspDrone() doc = drone.assimilate(vasp_test_dir / "Si_band_structure" / "static" / "outputs") assert doc diff --git a/tests/vasp/test_files.py b/tests/vasp/test_files.py index 5138f284a1..a5c75a1238 100644 --- a/tests/vasp/test_files.py +++ b/tests/vasp/test_files.py @@ -1,5 +1,9 @@ +from pathlib import Path + import pytest +from atomate2.vasp.files import copy_vasp_outputs, get_largest_relax_extension + @pytest.mark.parametrize( "copy_kwargs,files", @@ -10,10 +14,6 @@ ], ) def test_copy_vasp_outputs_static(vasp_test_dir, tmp_dir, copy_kwargs, files): - from pathlib import Path - - from atomate2.vasp.files import copy_vasp_outputs - path = vasp_test_dir / "Si_band_structure" / "static" / "outputs" copy_vasp_outputs(src_dir=path, **copy_kwargs) @@ -30,10 +30,6 @@ def test_copy_vasp_outputs_static(vasp_test_dir, tmp_dir, copy_kwargs, files): ], ) def test_copy_vasp_outputs_double(vasp_test_dir, tmp_dir, copy_kwargs, files): - from pathlib import Path - - from atomate2.vasp.files import copy_vasp_outputs - path = vasp_test_dir / "Si_old_double_relax" / "outputs" copy_vasp_outputs(src_dir=path, **copy_kwargs) @@ -42,8 +38,6 @@ def test_copy_vasp_outputs_double(vasp_test_dir, tmp_dir, copy_kwargs, files): def test_get_largest_relax_extension(vasp_test_dir): - from atomate2.vasp.files import get_largest_relax_extension - path = vasp_test_dir / "Si_old_double_relax" / "outputs" extension = get_largest_relax_extension(directory=path) assert extension == ".relax2" diff --git a/tests/vasp/test_powerups.py b/tests/vasp/test_powerups.py index 54d95c1c43..6d61dfa7e3 100644 --- a/tests/vasp/test_powerups.py +++ b/tests/vasp/test_powerups.py @@ -1,5 +1,9 @@ import pytest +from atomate2.vasp import powerups +from atomate2.vasp.flows.core import DoubleRelaxMaker +from atomate2.vasp.jobs.core import RelaxMaker + @pytest.mark.parametrize( "powerup,attribute,settings", @@ -16,10 +20,6 @@ ], ) def test_update_user_settings(powerup, attribute, settings): - from atomate2.vasp import powerups - from atomate2.vasp.flows.core import DoubleRelaxMaker - from atomate2.vasp.jobs.core import RelaxMaker - powerup_func = getattr(powerups, powerup) # test job maker @@ -63,3 +63,37 @@ def test_update_user_settings(powerup, attribute, settings): getattr(flow.jobs[1].function.__self__.input_set_generator, attribute) != settings ) + + +@pytest.mark.parametrize( + "powerup,settings", + [ + ("add_metadata_to_flow", {"mp-id": "mp-xxx"}), + ("add_metadata_to_flow", {"mp-id": "mp-161", "composition": "NaCl"}), + ], +) +def test_add_metadata_to_flow(powerup, settings): + powerup_func = getattr(powerups, powerup) + + # test flow + drm = DoubleRelaxMaker() + flow = drm.make(1) + flow = powerup_func(flow, settings) + assert ( + flow.jobs[0].function.__self__.task_document_kwargs["additional_fields"] + == settings + ) + + +@pytest.mark.parametrize( + "powerup, settings", + [("update_vasp_custodian_handlers", ())], +) +def test_update_vasp_custodian_handlers(powerup, settings): + powerup_func = getattr(powerups, powerup) + + # test flow + drm = DoubleRelaxMaker() + flow = drm.make(1) + flow = powerup_func(flow, settings) + assert flow.jobs[0].function.__self__.run_vasp_kwargs["handlers"] == settings diff --git a/tests/vasp/test_sets.py b/tests/vasp/test_sets.py index c9cecb0c63..580a86e0bc 100644 --- a/tests/vasp/test_sets.py +++ b/tests/vasp/test_sets.py @@ -7,24 +7,25 @@ @pytest.fixture(scope="module") def struct_no_magmoms() -> Structure: - """Dummy FeO structure with no magnetic moments defined.""" + """Dummy FeO structure with expected +U corrections but no magnetic moments + defined.""" return Structure( lattice=Lattice.cubic(3), - species=["Fe", "O"], - coords=[[0, 0, 0], [0.5, 0.5, 0.5]], + species=("Fe", "O"), + coords=((0, 0, 0), (0.5, 0.5, 0.5)), ) @pytest.fixture(scope="module") def struct_with_spin() -> Structure: """Dummy FeO structure with spins defined.""" - fe = Species("Fe2+", spin=4) - o = Species("O2-", spin=0.63) + iron = Species("Fe2+", spin=4) + oxi = Species("O2-", spin=0.63) return Structure( lattice=Lattice.cubic(3), - species=[fe, o], - coords=[[0, 0, 0], [0.5, 0.5, 0.5]], + species=(iron, oxi), + coords=((0, 0, 0), (0.5, 0.5, 0.5)), ) @@ -41,8 +42,8 @@ def struct_no_u_params() -> Structure: """Dummy SiO structure with no anticipated +U corrections""" return Structure( lattice=Lattice.cubic(3), - species=["Si", "O"], - coords=[[0, 0, 0], [0.5, 0.5, 0.5]], + species=("Si", "O"), + coords=((0, 0, 0), (0.5, 0.5, 0.5)), ) @@ -73,6 +74,10 @@ def test_user_incar_settings(): "NSW": 5_000, "PREC": 10, # wrong type, should be string. "SIGMA": 20, + "LDAUU": {"H": 5.0}, + "LDAUJ": {"H": 6.0}, + "LDAUL": {"H": 3.0}, + "LDAUTYPE": 2, } static_set_generator = StaticSetGenerator(user_incar_settings=uis) @@ -81,6 +86,8 @@ def test_user_incar_settings(): for key in uis: if isinstance(incar[key], str): assert incar[key].lower() == uis[key].lower() + elif isinstance(uis[key], dict): + assert incar[key] == [uis[key][str(site.specie)] for site in structure] else: assert incar[key] == uis[key] @@ -91,9 +98,9 @@ def test_user_incar_settings(): ("struct_no_magmoms", {}), ("struct_with_magmoms", {}), ("struct_with_spin", {}), - ("struct_no_magmoms", {"MAGMOM": [3.7, 0.8]}), - ("struct_with_magmoms", {"MAGMOM": [3.7, 0.8]}), - ("struct_with_spin", {"MAGMOM": [3.7, 0.8]}), + ("struct_no_magmoms", {"MAGMOM": {"Fe": 3.7, "O": 0.8}}), + ("struct_with_magmoms", {"MAGMOM": {"Fe": 3.7, "O": 0.8}}), + ("struct_with_spin", {"MAGMOM": {"Fe2+,spin=4": 3.7, "O2-,spin=0.63": 0.8}}), ], ) def test_incar_magmoms_precedence(structure, user_incar_settings, request) -> None: @@ -120,7 +127,9 @@ def test_incar_magmoms_precedence(structure, user_incar_settings, request) -> No has_struct_spin = getattr(structure.species[0], "spin", None) is not None if user_incar_settings: # case 1 - assert incar_magmom == user_incar_settings["MAGMOM"] + assert incar_magmom == [ + user_incar_settings["MAGMOM"][str(site.specie)] for site in structure + ] elif has_struct_magmom: # case 2 assert incar_magmom == structure.site_properties["magmom"] elif has_struct_spin: # case 3 @@ -151,11 +160,11 @@ def test_set_u_params(structure, request) -> None: # ensure that there are LDAU* keys, and that they match expected values # in config_dict assert len([key for key in incar if key.startswith("LDAU")]) > 0 - for LDAU_key in ["LDAUU", "LDAUJ", "LDAUL"]: - for isite, site in enumerate(structure): - assert incar[LDAU_key][isite] == input_gen.config_dict["INCAR"][ - LDAU_key - ]["O"].get(str(site.specie), 0) + for ldau_key in ("LDAUU", "LDAUJ", "LDAUL"): + for idx, site in enumerate(structure): + assert incar[ldau_key][idx] == input_gen.config_dict["INCAR"][ldau_key][ + "O" + ].get(str(site.specie), 0) else: # if no sites have a nonzero U value in the config_dict, # ensure that no keys starting with LDAU are in the INCAR @@ -166,9 +175,9 @@ def test_set_u_params(structure, request) -> None: "bandgap, expected_params", [ (0, {"KSPACING": 0.22, "ISMEAR": 2, "SIGMA": 0.2}), - (0.1, {"KSPACING": 0.269695615, "ISMEAR": -5, "SIGMA": 0.05}), - (1, {"KSPACING": 0.302352354, "ISMEAR": -5, "SIGMA": 0.05}), - (2, {"KSPACING": 0.349355136, "ISMEAR": -5, "SIGMA": 0.05}), + (0.1, {"KSPACING": 0.26969561, "ISMEAR": -5, "SIGMA": 0.05}), + (1, {"KSPACING": 0.30235235, "ISMEAR": -5, "SIGMA": 0.05}), + (2, {"KSPACING": 0.34935513, "ISMEAR": -5, "SIGMA": 0.05}), (5, {"KSPACING": 0.44, "ISMEAR": -5, "SIGMA": 0.05}), (10, {"KSPACING": 0.44, "ISMEAR": -5, "SIGMA": 0.05}), ],