import os
import six
from aiida.plugins import DataFactory
from aiida_crystal17.calculations.cry_abstract import CryAbstractCalculation
from aiida_crystal17.parsers.raw.doss_input import create_doss_content
from aiida_crystal17.validation import validate_against_schema
def _validate_inputs(dict_data):
validate_against_schema(dict_data.get_dict(), "doss_input.schema.json")
[docs]class CryDossCalculation(CryAbstractCalculation):
"""
AiiDA calculation plugin to run the runprop17 executable,
for DOSS calculations.
"""
[docs] @classmethod
def define(cls, spec):
super(CryDossCalculation, cls).define(spec)
spec.input('metadata.options.input_wf_name',
valid_type=six.string_types, default='fort.9')
spec.input('metadata.options.symlink_wf',
valid_type=bool, default=True)
spec.input('metadata.options.output_isovalue_fname',
valid_type=six.string_types, default='fort.25')
spec.input('metadata.options.parser_name',
valid_type=six.string_types, default='crystal17.doss')
spec.input(
'parameters', valid_type=DataFactory('dict'),
required=True, validator=_validate_inputs,
help='the input parameters to create the DOSS input file.')
spec.input(
'wf_folder', valid_type=DataFactory('remote'),
required=True,
help='the folder containing the wavefunction fort.9 file')
spec.exit_code(
352, 'ERROR_ISOVALUE_FILE_MISSING',
message='parser could not find the output isovalue (fort.25) file')
spec.output("results",
valid_type=DataFactory('dict'),
required=True,
help='summary of the parsed data')
spec.default_output_node = "results"
spec.output('arrays',
valid_type=DataFactory('array'),
required=False,
help='energies and DoS arrays')
[docs] def prepare_for_submission(self, tempfolder):
"""
This is the routine to be called when you want to create
the input files and related stuff with a plugin.
:param tempfolder: an aiida.common.folders.Folder subclass
where the plugin should put all its files.
"""
input_lines = create_doss_content(self.inputs.parameters.get_dict())
with tempfolder.open(self.metadata.options.input_file_name, 'w') as f:
f.write(six.ensure_text("\n".join(input_lines)))
with tempfolder.open(self.metadata.options.input_file_name, 'w') as f:
f.write(six.ensure_text("\n".join(input_lines)))
remote_files = [(
self.inputs.wf_folder.computer.uuid,
os.path.join(self.inputs.wf_folder.get_remote_path(),
self.metadata.options.input_wf_name),
'fort.9'
)]
return self.create_calc_info(
tempfolder,
remote_copy_list=remote_files if not self.metadata.options.symlink_wf else None,
remote_symlink_list=remote_files if self.metadata.options.symlink_wf else None,
retrieve_list=[
self.metadata.options.output_main_file_name,
self.metadata.options.output_isovalue_fname
]
)