Static Workflows

Static workflows are pre-defined AiiDA WorkChains that are registered as entry points and can be imported by the AiiDA daemon. They work with both run() and submit().

Evaluation WorkChains

Three static evaluators are shipped with the package:

Class

Calculator

Entry point

CrystalLatticeProblem

BaseCrystalWorkChain

reoptimize.CrystalLatticeProblem

FleurSCFLatticeProblem

FleurScfWorkChain

reoptimize.FleurSCFLatticeProblem

FleurRelaxLatticeProblem

FleurRelaxWorkChain

reoptimize.FleurRelaxLatticeProblem

All three inherit from StaticEvalLatticeProblem and share the same inputs:

  • structure (StructureData): the source crystal structure

  • targets (List): list of lattice parameter perturbations to evaluate

  • calculator_parameters (Dict): inputs forwarded to the calculator workchain

  • structure_keyword (List, optional): path to the structure input in the builder (defaults to ["structure"])

Optimization WorkChains

Twenty-one static optimizer workchains are available, combining 7 algorithms with 3 evaluator types:

(The same 7 algorithms are also available for FLEUR relax, e.g. AdamFleurRelaxOptimizer.)

Submitting a Static Optimizer

from aiida.engine import submit
from aiida.orm import Dict, Int, StructureData
from aiida_reoptimize.workflows import BFGSFleurSCFOptimizer

result = submit(
    BFGSFleurSCFOptimizer,
    parameters=Dict({
        "algorithm_settings": {...},
        "calculator_parameters": {...},
    }),
    structure=my_structure,
    itmax=Int(50),
)

Adding Custom Static Workflows

Create a custom evaluator and bind optimizers to it:

from aiida_reoptimize.base.Evaluation import StaticEvalLatticeProblem
from aiida_reoptimize.workflows.Optimization._common import (
    AdamOptimizer,
    StaticOptimizerBinding,
)

class MyLatticeProblem(StaticEvalLatticeProblem):
    calculator_workchain = MyCalculatorWorkChain

class BaseMyOptimizer(StaticOptimizerBinding):
    evaluator_workchain = MyLatticeProblem
    extractor_path = ("output_parameters", "energy")

class AdamMyOptimizer(BaseMyOptimizer, AdamOptimizer):
    pass

Then register the entry points in pyproject.toml:

[project.entry-points."aiida.workflows"]
"reoptimize.MyLatticeProblem" = "my_module:MyLatticeProblem"
"reoptimize.AdamMyOptimizer" = "my_module:AdamMyOptimizer"