Source code for aiida_lammps.parsers.raw
"""Base parser for LAMMPS output."""
import time
from aiida import orm
from aiida.parsers.parser import Parser
from aiida_lammps.calculations.raw import LammpsRawCalculation
from aiida_lammps.parsers.parse_raw import parse_outputfile
[docs]class LammpsRawParser(Parser):
"""Base parser for LAMMPS output."""
[docs] def parse(self, **kwargs):
"""Parse the contents of the output files stored in the ``retrieved`` output node."""
retrieved = self.retrieved
retrieved_filenames = retrieved.base.repository.list_object_names()
filename_out = LammpsRawCalculation.FILENAME_OUTPUT
if filename_out not in retrieved_filenames:
return self.exit_codes.ERROR_OUTFILE_MISSING
parsed_data = parse_outputfile(
file_contents=retrieved.base.repository.get_object_content(filename_out)
)
if parsed_data is None:
return self.exit_codes.ERROR_PARSING_OUTFILE
if parsed_data["global"]["errors"]:
# Output the data for checking what was parsed
self.out("results", orm.Dict({"compute_variables": parsed_data["global"]}))
for entry in parsed_data["global"]["errors"]:
self.logger.error(f"LAMMPS emitted the error {entry}")
return self.exit_codes.ERROR_PARSER_DETECTED_LAMMPS_RUN_ERROR.format(
error=entry
)
global_data = parsed_data["global"]
results = {"compute_variables": global_data}
if "total_wall_time" in global_data:
try:
parsed_time = time.strptime(global_data["total_wall_time"], "%H:%M:%S")
except ValueError:
pass
else:
total_wall_time_seconds = (
parsed_time.tm_hour * 3600
+ parsed_time.tm_min * 60
+ parsed_time.tm_sec
)
global_data["total_wall_time_seconds"] = total_wall_time_seconds
self.out("results", orm.Dict(results))
return None