Source code for aiida_lsmo.workchains.zeopp_multistage_ddec

"""ZeoppMultistageDdecWorkChain work chain"""

from aiida.plugins import CalculationFactory, DataFactory, WorkflowFactory
from aiida.common import AttributeDict
from aiida.engine import WorkChain, ToContext
from aiida_lsmo.utils import get_structure_from_cif

# import sub-workchains
Cp2kMultistageDdecWorkChain = WorkflowFactory('lsmo.cp2k_multistage_ddec')  # pylint: disable=invalid-name

# import calculations
DdecCalculation = CalculationFactory('ddec')  # pylint: disable=invalid-name
ZeoppCalculation = CalculationFactory("zeopp.network")  # pylint: disable=invalid-name

# import aiida data
CifData = DataFactory('cif')  # pylint: disable=invalid-name
NetworkParameters = DataFactory("zeopp.parameters")  # pylint: disable=invalid-name

ZEOPP_PARAMETERS_DEFAULT = {  #Default parameters for microporous materials
    'ha': 'DEF',  # Using high accuracy (mandatory!)
    'res': True,  # Max included, free and incl in free sphere
    'sa': [1.86, 1.86, 100000],  # Nitrogen probe to compute surface
    'vol': [0.0, 0.0, 1000000],  # Geometric pore volume
    'volpo': [1.86, 1.86, 100000],  # Nitrogen probe to compute PO pore volume
    'psd': [1.2, 1.2, 10000]  # Small probe to compute the pore size distr
}


[docs]class ZeoppMultistageDdecWorkChain(WorkChain): """A workchain that combines: Zeopp + Cp2kMultistageWorkChain + Cp2kDdecWorkChain + Zeopp"""
[docs] @classmethod def define(cls, spec): """Define workflow specification.""" super().define(spec) spec.input('structure', valid_type=CifData, help='input structure') spec.expose_inputs(ZeoppCalculation, namespace='zeopp', exclude=['structure']) spec.inputs['zeopp']['parameters'].default = lambda: NetworkParameters(dict=ZEOPP_PARAMETERS_DEFAULT) spec.inputs['zeopp']['parameters'].required = False spec.expose_inputs(Cp2kMultistageDdecWorkChain, exclude=['structure']) spec.outline(cls.run_zeopp_before, cls.run_multistageddec, cls.run_zeopp_after, cls.return_results) spec.expose_outputs(ZeoppCalculation, namespace='zeopp_before_opt', include=['output_parameters']) spec.expose_outputs(ZeoppCalculation, namespace='zeopp_after_opt', include=['output_parameters']) spec.expose_outputs(Cp2kMultistageDdecWorkChain)
[docs] def run_zeopp_before(self): """Run Zeo++ for the original structure""" #Merging all inputs zeopp_inp = AttributeDict(self.exposed_inputs(ZeoppCalculation, 'zeopp')) zeopp_inp['parameters'] = self.inputs.zeopp.parameters zeopp_inp['structure'] = self.inputs.structure zeopp_inp['metadata']['label'] = "zeopp_before_opt" zeopp_inp['metadata']['call_link_label'] = "call_zeopp_before_opt" running_zeopp = self.submit(ZeoppCalculation, **zeopp_inp) self.report("Running Zeo++ calculation <{}>".format(running_zeopp.pk)) return ToContext(zeopp_before=running_zeopp)
[docs] def run_multistageddec(self): """Run MultistageDdec work chain""" msddec_inputs = AttributeDict(self.exposed_inputs(Cp2kMultistageDdecWorkChain)) msddec_inputs['structure'] = get_structure_from_cif(self.inputs.structure) msddec_inputs['metadata']['call_link_label'] = 'call_multistageddec' running = self.submit(Cp2kMultistageDdecWorkChain, **msddec_inputs) return ToContext(msddec_wc=running)
[docs] def run_zeopp_after(self): """Run Zeo++ for the oprimized structure""" zeopp_inp = AttributeDict(self.exposed_inputs(ZeoppCalculation, 'zeopp')) zeopp_inp['parameters'] = self.inputs.zeopp.parameters zeopp_inp['structure'] = self.ctx.msddec_wc.outputs.structure_ddec zeopp_inp['metadata']['label'] = "zeopp_after_opt" zeopp_inp['metadata']['call_link_label'] = "call_zeopp_after_opt" running_zeopp = self.submit(ZeoppCalculation, **zeopp_inp) self.report("Running Zeo++ calculation <{}>".format(running_zeopp.pk)) return ToContext(zeopp_after=running_zeopp)
[docs] def return_results(self): """Return exposed outputs""" self.out_many(self.exposed_outputs(self.ctx.zeopp_before, ZeoppCalculation, namespace='zeopp_before_opt')) self.out_many(self.exposed_outputs(self.ctx.msddec_wc, Cp2kMultistageDdecWorkChain)) self.out_many(self.exposed_outputs(self.ctx.zeopp_after, ZeoppCalculation, namespace='zeopp_after_opt')) self.report("WorkChain terminated correctly.")