LOBSTER Workflow Tutorial (Using VASP for DFT)ΒΆ

The first lines are needed to ensure that we can mock VASP and LOBSTER runs. The test files here might not belong to the same calculation but are good enough for testing.

import warnings

from mock_lobster import mock_lobster
from mock_vasp import TEST_DIR, mock_vasp

ref_paths = {
    "relax 1": "Si_lobster_uniform/relax_1",
    "relax 2": "Si_lobster_uniform/relax_2",
    "static": "Si_lobster_uniform/static",
    "non-scf uniform": "Si_lobster_uniform/non-scf_uniform",
}
ref_paths_lobster = {
    "lobster_run_0": "Si_lobster/lobster_0",
}

We first load a structure that we want to analyze with bonding analysis.

from jobflow import JobStore, run_locally
from maggma.stores import MemoryStore
from pymatgen.core import Structure

from atomate2.vasp.flows.lobster import LobsterMaker, VaspLobsterMaker
from atomate2.vasp.powerups import update_user_incar_settings

warnings.filterwarnings("ignore")

job_store = JobStore(MemoryStore(), additional_stores={"data": MemoryStore()})
si_structure = Structure.from_file(TEST_DIR / "structures" / "Si.cif")

Then, we initialize a workflow:

job = VaspLobsterMaker(
    lobster_maker=LobsterMaker(
        task_document_kwargs={
            "calc_quality_kwargs": {"potcar_symbols": ["Si"], "n_bins": 10},
            "add_coxxcar_to_task_document": True,
        },
        user_lobsterin_settings={
            "COHPstartEnergy": -5.0,
            "COHPEndEnergy": 5.0,
            "cohpGenerator": "from 0.1 to 3.0 orbitalwise",
        },
    ),
    delete_wavecars=True,
).make(si_structure)
job = update_user_incar_settings(job, {"NPAR": 4})

# run the flow or job and ensure that it finished running successfully

We then run this workflow locally to show-case the capabilities. In real-life, you would omit the mock* parts.

with mock_vasp(ref_paths) as mf, mock_lobster(ref_paths_lobster) as mf2:
    responses = run_locally(
        job,
        store=job_store,
        create_folders=True,
        ensure_success=True,
        raise_immediately=True,
    )

We can also analyze the data from the database

from pymatgen.electronic_structure.cohp import Cohp
from pymatgen.electronic_structure.plotter import CohpPlotter

store = job_store

result = store.query_one(
    {"name": "lobster_run_0"},
    properties=[
        "output.lobsterpy_data.cohp_plot_data",
        "output.lobsterpy_data_cation_anion.cohp_plot_data",
    ],
    load=True,
)

for key, cohp in result["output"]["lobsterpy_data"]["cohp_plot_data"]["data"].items():
    plotter = CohpPlotter()
    cohp_obj = Cohp.from_dict(cohp)
    plotter.add_cohp(key, cohp_obj)
    plotter.show()

for key, cohp in result["output"]["lobsterpy_data_cation_anion"]["cohp_plot_data"][
    "data"
].items():
    plotter = CohpPlotter()
    cohp_obj = Cohp.from_dict(cohp)
    plotter.add_cohp(key, cohp_obj)
    plotter.show()