Recipes#

The recipe system provides reusable calculation patterns.

Core Recipes#

Static Calculation#

from vasp.recipes import static_job

result = static_job(atoms, runner=runner, encut=500)

print(result.energy)
print(result.forces)

Relaxation#

from vasp.recipes import relax_job

result = relax_job(atoms, runner=runner, relax_cell=True)

relaxed_atoms = result.atoms

Double Relaxation#

from vasp.recipes import double_relax_flow

# Coarse → fine relaxation
result = double_relax_flow(atoms, runner=runner)

Slab Recipes#

from vasp.recipes.slabs import (
    slab_static_job,
    slab_relax_job,
    bulk_to_slabs_flow,
    make_slabs_from_bulk,
)

# Generate slabs from bulk
slabs = make_slabs_from_bulk(bulk_atoms, miller_indices=[(1,1,1)])

# Calculate all slabs
results = bulk_to_slabs_flow(bulk_atoms, miller_indices=[(1,1,1)])

Phonon Recipes#

from vasp.recipes.phonons import phonon_flow

result = phonon_flow(
    atoms,
    runner=runner,
    supercell_matrix=(2, 2, 2),
)

print(result.frequencies)

Custom Recipes#

Create a Job#

from vasp.recipes.decorators import job

@job
def my_calculation(atoms, runner=None, **kwargs):
    calc = Vasp(atoms=atoms, runner=runner, **kwargs)
    energy = calc.potential_energy
    return VaspResult(atoms=atoms, energy=energy)

Create a Flow#

from vasp.recipes.decorators import flow

@flow
def my_workflow(atoms, runner=None):
    relaxed = relax_job(atoms, runner=runner)
    static = static_job(relaxed.atoms, runner=runner)
    return {'relaxed': relaxed, 'static': static}

Workflow Engines#

Set environment variable to enable:

export VASP_WORKFLOW_ENGINE=prefect

Recipes automatically use the engine’s decorators.