Source code for aim2dat.aiida_workflows.cp2k.cell_opt_work_chain
"""
AiiDA work chain to optimize the atomic positions and the unit cell using CP2K.
"""
# Third party library imports
import aiida.orm as aiida_orm
# Internal library imports
from aim2dat.aiida_workflows.cp2k.base_opt_work_chain import _BaseOptimizationWorkChain
from aim2dat.utils.dict_tools import (
dict_set_parameter,
dict_create_tree,
)
def _validate_ref_cell_scaling_factor(ref_cell_scaling_factor, _):
"""Validate scf-method input."""
if ref_cell_scaling_factor.value <= 0.0:
return "'optimization_p.ref_cell_scaling_factor' needs to be larger than 0.0."
[docs]class CellOptWorkChain(_BaseOptimizationWorkChain):
"""
AiiDA work chain to optimize the unit cell of a periodic system.
"""
_opt_type = "cell_opt"
@classmethod
def define(cls, spec):
"""
Specify inputs, outputs and the workflow.
"""
super().define(spec)
spec.input(
"optimization_p.keep_symmetry",
valid_type=aiida_orm.Bool,
required=False,
help="Constrain the lattice symmetry during cell optimization.",
)
spec.input(
"optimization_p.cell_symmetry",
valid_type=aiida_orm.Str,
required=False,
help="The applied cell symmetry which is constrained during cell optimization.",
)
spec.input(
"optimization_p.keep_angles",
valid_type=aiida_orm.Bool,
required=False,
help="Constrain the lattice angles during cell optimization.",
)
spec.input(
"optimization_p.pressure_tolerance",
valid_type=aiida_orm.Float,
required=False,
help="Specifies the Pressure tolerance to achieve during the cell optimization.",
)
spec.input(
"optimization_p.ref_cell_scaling_factor",
valid_type=aiida_orm.Float,
validator=_validate_ref_cell_scaling_factor,
required=False,
help="Scaling factor for the reference cell (CELL_REF).",
)
def setup_wc_specific_inputs(self):
"""Set stress tensor calculation to analystical."""
# Set stress tensor for cell optimization and add symmetry constraints:
parameters = self.ctx.inputs.parameters.get_dict()
dict_create_tree(parameters, ["FORCE_EVAL"])
dict_set_parameter(parameters, ["FORCE_EVAL", "STRESS_TENSOR"], "ANALYTICAL")
self.ctx.inputs.parameters = aiida_orm.Dict(dict=parameters)