diff --git a/docs/source/topics/workflows/index.md b/docs/source/topics/workflows/index.md
index 11edc4cd5..3f083fb0d 100644
--- a/docs/source/topics/workflows/index.md
+++ b/docs/source/topics/workflows/index.md
@@ -10,6 +10,7 @@ ph
pw/base
pw/relax
pw/bands
+neb
q2r
pdos
```
diff --git a/docs/source/topics/workflows/neb.md b/docs/source/topics/workflows/neb.md
new file mode 100644
index 000000000..ed62bdf00
--- /dev/null
+++ b/docs/source/topics/workflows/neb.md
@@ -0,0 +1,8 @@
+(topics-workflows-neb)=
+
+# `NebBaseWorkChain`
+
+```{eval-rst}
+.. aiida-workchain:: NebBaseWorkChain
+ :module: aiida_quantumespresso.workflows.neb.base
+```
diff --git a/pyproject.toml b/pyproject.toml
index c92fb6b50..104eae865 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -121,6 +121,7 @@ aiida-quantumespresso = 'aiida_quantumespresso.cli:cmd_root'
'quantumespresso.matdyn.base' = 'aiida_quantumespresso.workflows.matdyn.base:MatdynBaseWorkChain'
'quantumespresso.pdos' = 'aiida_quantumespresso.workflows.pdos:PdosWorkChain'
'quantumespresso.bands.base' = 'aiida_quantumespresso.workflows.bands.base:BandsBaseWorkChain'
+'quantumespresso.neb.base' = 'aiida_quantumespresso.workflows.neb.base:NebBaseWorkChain'
[tool.flit.module]
name = 'aiida_quantumespresso'
diff --git a/src/aiida_quantumespresso/calculations/neb.py b/src/aiida_quantumespresso/calculations/neb.py
index 6ce12d7dc..2d665eaf2 100644
--- a/src/aiida_quantumespresso/calculations/neb.py
+++ b/src/aiida_quantumespresso/calculations/neb.py
@@ -5,12 +5,14 @@
import warnings
from aiida import orm
-from aiida.common import CalcInfo, CodeInfo, InputValidationError
+from aiida.common import AttributeDict, CalcInfo, CodeInfo, InputValidationError
from aiida.common.lang import classproperty
from aiida.common.warnings import AiidaDeprecationWarning
+import numpy as np
from aiida_quantumespresso.calculations import _lowercase_dict, _pop_parser_options, _uppercase_dict
from aiida_quantumespresso.calculations.pw import PwCalculation
+from aiida_quantumespresso.calculations import BasePwCpInputGenerator
from aiida_quantumespresso.utils.convert import convert_input_to_namelist_entry
from .base import CalcJob
@@ -29,6 +31,7 @@ class NebCalculation(CalcJob):
_DEFAULT_OUTPUT_FILE = 'aiida.out'
_PSEUDO_SUBFOLDER = PwCalculation._PSEUDO_SUBFOLDER # pylint: disable=protected-access
_OUTPUT_SUBFOLDER = PwCalculation._OUTPUT_SUBFOLDER # pylint: disable=protected-access
+ _ENABLED_PARALLELIZATION_FLAGS = ('npool', 'nband', 'ntg', 'ndiag', 'nimage')
# Keywords that cannot be set (for the PW input)
_blocked_keywords = []
@@ -62,15 +65,29 @@ def define(cls, spec):
spec.input('metadata.options.input_filename', valid_type=str, default=cls._DEFAULT_INPUT_FILE)
spec.input('metadata.options.output_filename', valid_type=str, default=cls._DEFAULT_OUTPUT_FILE)
spec.input('metadata.options.parser_name', valid_type=str, default='quantumespresso.neb')
- spec.input('first_structure', valid_type=orm.StructureData, help='Initial structure')
- spec.input('last_structure', valid_type=orm.StructureData, help='Final structure')
+ spec.input('first_structure', valid_type=orm.StructureData, help='Initial structure', required=False)
+ spec.input('last_structure', valid_type=orm.StructureData, help='Final structure', required=False)
+ spec.input('images', valid_type=orm.TrajectoryData, required=False,
+ help='Ordered trajectory of all NEB images along the reaction path, including'
+ 'initial, intermediate, and final configurations.')
spec.input('parameters', valid_type=orm.Dict, help='NEB-specific input parameters')
spec.input('settings', valid_type=orm.Dict, required=False,
help='Optional parameters to affect the way the calculation job and the parsing are performed.')
spec.input('parent_folder', valid_type=orm.RemoteData, required=False,
help='An optional working directory of a previously completed calculation to restart from.')
+ spec.input('parallelization', valid_type=orm.Dict, required=False,
+ validator=lambda value, _: BasePwCpInputGenerator.validate_parallelization.__func__(cls, value, _),
+ help=(
+ 'Parallelization options. The following flags are allowed:\n' + '\n'.join(
+ f'{flag_name:<7}: {BasePwCpInputGenerator._PARALLELIZATION_FLAGS[flag_name]}'
+ for flag_name in cls._ENABLED_PARALLELIZATION_FLAGS
+ )
+ ))
# We reuse some inputs from PwCalculation to construct the PW-specific parts of the input files
spec.expose_inputs(PwCalculation, namespace='pw', include=('parameters', 'pseudos', 'kpoints', 'vdw_table'))
+
+ spec.inputs.validator = cls.validate_inputs
+
spec.output('output_parameters', valid_type=orm.Dict,
help='The output parameters dictionary of the NEB calculation')
spec.output('output_trajectory', valid_type=orm.TrajectoryData)
@@ -78,18 +95,114 @@ def define(cls, spec):
spec.output('output_mep', valid_type=orm.ArrayData,
help='The original and interpolated energy profiles along the minimum-energy path (mep)')
spec.default_output_node = 'output_parameters'
- spec.exit_code(303, 'ERROR_MISSING_XML_FILE',
+
+ spec.exit_code(303, 'ERROR_OUTPUT_XML_MISSING',
message='The required XML file is not present in the retrieved folder.')
+ spec.exit_code(304, 'ERROR_OUTPUT_XML_MULTIPLE',
+ message='The retrieved folder contained multiple XML files.')
+ spec.exit_code(305, 'ERROR_OUTPUT_FILES',
+ message='Both the stdout and XML output files could not be read or parsed.')
+ spec.exit_code(310, 'ERROR_OUTPUT_STDOUT_READ',
+ message='The stdout output file could not be read.')
spec.exit_code(320, 'ERROR_OUTPUT_XML_READ',
message='The XML output file could not be read.')
spec.exit_code(321, 'ERROR_OUTPUT_XML_PARSE',
message='The XML output file could not be parsed.')
spec.exit_code(322, 'ERROR_OUTPUT_XML_FORMAT',
message='The XML output file has an unsupported format.')
+ spec.exit_code(340, 'ERROR_NEB_INTERRUPTED_WITHOUT_PARTIAL_TRAJECTORY',
+ message='The calculation was interrupted during first NEB minimization steps,'
+ 'no partial trajectory can be parsed.')
spec.exit_code(350, 'ERROR_UNEXPECTED_PARSER_EXCEPTION',
message='The parser raised an unexpected exception: {exception}')
+
+ spec.exit_code(400, 'ERROR_OUT_OF_WALLTIME',
+ message='The calculation stopped prematurely because it ran out of walltime.')
+ spec.exit_code(410, 'ERROR_ELECTRONIC_CONVERGENCE_NOT_REACHED',
+ message='The electronic minimization cycle did not reach self-consistency.')
+
+ spec.exit_code(461, 'ERROR_DEXX_IS_NEGATIVE',
+ message='The code failed with negative dexx in the exchange calculation.')
+ spec.exit_code(462, 'ERROR_COMPUTING_CHOLESKY',
+ message='The code failed during the cholesky factorization.')
+ spec.exit_code(463, 'ERROR_DIAGONALIZATION_TOO_MANY_BANDS_NOT_CONVERGED',
+ message='Too many bands failed to converge during the diagonalization.')
+ spec.exit_code(464, 'ERROR_S_MATRIX_NOT_POSITIVE_DEFINITE',
+ message='The S matrix was found to be not positive definite.')
+ spec.exit_code(465, 'ERROR_ZHEGVD_FAILED',
+ message='The `zhegvd` failed in the PPCG diagonalization.')
+ spec.exit_code(466, 'ERROR_QR_FAILED',
+ message='The `[Q, R] = qr(X, 0)` failed in the PPCG diagonalization.')
+ spec.exit_code(467, 'ERROR_EIGENVECTOR_CONVERGENCE',
+ message='The eigenvector failed to converge.')
+ spec.exit_code(468, 'ERROR_BROYDEN_FACTORIZATION',
+ message='The factorization in the Broyden routine failed.')
+
+ spec.exit_code(481, 'ERROR_NPOOLS_TOO_HIGH',
+ message='The k-point parallelization "npools" is too high, given the number of available processes.')
+ spec.exit_code(482, 'ERROR_NIMAGE_HIGHER_THAN_NPROC',
+ message='The number of images "nimage" is higher than the number of available processes.')
+ spec.exit_code(483, 'ERROR_NIMAGE_HIGHER_THAN_IMAGES',
+ message='The number of images "nimage" is higher than the number of images in the NEB path.')
+ spec.exit_code(484, 'ERROR_NIMAGE_NOT_DIVISOR_OF_NPROC',
+ message='The number of images "nimage" is not a divisor of the total number of processes.')
+
+ spec.exit_code(502, 'ERROR_NEB_CYCLE_EXCEEDED_NSTEP',
+ message='The NEB minimization cycle did not converge after the maximum number of steps.')
+ spec.exit_code(503, 'ERROR_NEB_INTERRUPTED_PARTIAL_TRAJECTORY',
+ message='The NEB minimization cycle did not finish because the calculation was interrupted but a partial '
+ 'trajectory and output structure was successfully parsed which can be used for a restart.'
+ )
# yapf: enable
+ @classmethod
+ def validate_inputs(cls, inputs, _):
+ """Validate the top-level inputs."""
+ if 'images' not in inputs:
+ if 'first_structure' not in inputs or 'last_structure' not in inputs:
+ return 'Either the `images` input or both `first_structure` and `last_structure` must be provided.'
+ warnings.warn(
+ 'The `first_structure` and `last_structure` inputs input are deprecated'
+ 'and will be removed in a future release. Use `images` instead.', AiidaDeprecationWarning
+ )
+ inputs['images'] = orm.TrajectoryData([inputs['first_structure'], inputs['last_structure']])
+ elif 'first_structure' in inputs or 'last_structure' in inputs:
+ return 'Specify either `images` or both `first_structure` and `last_structure`, but not both.'
+
+ num_images = len(inputs['images'].get_stepids())
+ structure_list = [inputs['images'].get_step_structure(i) for i in range(num_images)]
+ for image_idx, structure in enumerate(structure_list[1:]):
+ # Check that all images have the same cell
+ if abs(np.array(structure_list[0].cell) - np.array(structure.cell)).max() > 1.e-4:
+ return f'Different cell in the first and image {image_idx+1}'
+
+ # Check that all images have the same number of sites
+ if len(structure_list[0].sites) != len(structure.sites):
+ return f'Different number of sites in the first and image {image_idx+1}'
+
+ # Check that all images have the same kinds
+ if structure_list[0].get_site_kindnames() != structure.get_site_kindnames():
+ return f'Mismatch between the kind names and/or order between the first and image {image_idx+1}'
+
+ # Check that a pseudo potential was specified for each kind present in the `StructureData`
+ # self.inputs.pw.pseudos is a plumpy.utils.AttributesFrozendict
+ kindnames = [kind.name for kind in structure_list[0].kinds]
+ if set(kindnames) != set(inputs['pw']['pseudos'].keys()):
+ formatted_pseudos = ', '.join(list(inputs['pw']['pseudos'].keys()))
+ formatted_kinds = ', '.join(list(kindnames))
+ return 'Mismatch between the defined pseudos and the list of kinds of the structure.\n' \
+ f'Pseudos: {formatted_pseudos};\nKinds: {formatted_kinds}'
+
+ #validate nimages
+ num_of_images = int(inputs['parameters']['PATH'].get('num_of_images', 3))
+ ni = int(inputs.get('parallelization', {}).get('nimage', 1))
+ first_last_opt = bool(inputs['parameters']['PATH'].get('first_last_opt', False))
+
+ max_ni = num_of_images if first_last_opt else num_of_images - 2
+ if ni > max_ni:
+ return f'The specified nimage {ni} parallelization is higher than the number of images {max_ni}.'
+ cls.inputs = AttributeDict(inputs)
+
@classmethod
def _generate_input_files(cls, neb_parameters, settings_dict):
"""Generate the input data for the NEB part of the calculation."""
@@ -158,7 +271,7 @@ def _generate_input_files(cls, neb_parameters, settings_dict):
f'type of calculation: {",".join(list(input_params.keys()))}'
)
- return input_data
+ return input_data, namelist
def prepare_for_submission(self, folder):
"""Prepare the calculation job for submission by transforming input nodes into input files.
@@ -171,7 +284,6 @@ def prepare_for_submission(self, folder):
:return: :class:`~aiida.common.datastructures.CalcInfo` instance.
"""
# pylint: disable=too-many-branches,too-many-statements
- import numpy as np
local_copy_list = []
remote_copy_list = []
@@ -189,38 +301,8 @@ def prepare_for_submission(self, folder):
else:
settings_dict = {}
- first_structure = self.inputs.first_structure
- last_structure = self.inputs.last_structure
-
- # Check that the first and last image have the same cell
- if abs(np.array(first_structure.cell) - np.array(last_structure.cell)).max() > 1.e-4:
- raise InputValidationError('Different cell in the fist and last image')
-
- # Check that the first and last image have the same number of sites
- if len(first_structure.sites) != len(last_structure.sites):
- raise InputValidationError('Different number of sites in the fist and last image')
-
- # Check that sites in the initial and final structure have the same kinds
- if first_structure.get_site_kindnames() != last_structure.get_site_kindnames():
- raise InputValidationError(
- 'Mismatch between the kind names and/or order between '
- 'the first and final image'
- )
-
- # Check that a pseudo potential was specified for each kind present in the `StructureData`
- # self.inputs.pw.pseudos is a plumpy.utils.AttributesFrozendict
- kindnames = [kind.name for kind in first_structure.kinds]
- if set(kindnames) != set(self.inputs.pw.pseudos.keys()):
- formatted_pseudos = ', '.join(list(self.inputs.pw.pseudos.keys()))
- formatted_kinds = ', '.join(list(kindnames))
- raise InputValidationError(
- 'Mismatch between the defined pseudos and the list of kinds of the structure.\n'
- f'Pseudos: {formatted_pseudos};\nKinds: {formatted_kinds}'
- )
-
- ##############################
- # END OF INITIAL INPUT CHECK #
- ##############################
+ num_images = len(self.inputs.images.get_stepids())
+ structure_list = [self.inputs.images.get_step_structure(i) for i in range(num_images)]
# Create the subfolder that will contain the pseudopotentials
folder.get_subfolder(self._PSEUDO_SUBFOLDER, create=True)
@@ -228,13 +310,13 @@ def prepare_for_submission(self, folder):
folder.get_subfolder(self._OUTPUT_SUBFOLDER, create=True)
# We first prepare the NEB-specific input file.
- neb_input_filecontent = self._generate_input_files(self.inputs.parameters, settings_dict)
+ neb_input_filecontent, _ = self._generate_input_files(self.inputs.parameters, settings_dict)
with folder.open(self.inputs.metadata.options.input_filename, 'w') as handle:
handle.write(neb_input_filecontent)
# We now generate the PW input files for each input structure
local_copy_pseudo_list = []
- for i, structure in enumerate([first_structure, last_structure]):
+ for i, structure in enumerate(structure_list):
# We need to a pass a copy of the settings_dict for each structure
this_settings_dict = copy.deepcopy(settings_dict)
pw_input_filecontent, this_local_copy_pseudo_list = PwCalculation._generate_PWCPinputdata( # pylint: disable=protected-access
@@ -308,12 +390,17 @@ def prepare_for_submission(self, folder):
codeinfo = CodeInfo()
calcinfo.uuid = self.uuid
- cmdline_params = settings_dict.pop('CMDLINE', [])
+
+ inputs_parallelization = lambda: None
+ inputs_parallelization.inputs = AttributeDict({'parallelization':self.inputs.get('parallelization', orm.Dict({}))})
+ inputs_parallelization._ENABLED_PARALLELIZATION_FLAGS = self._ENABLED_PARALLELIZATION_FLAGS
+ inputs_parallelization._PARALLELIZATION_FLAG_ALIASES = BasePwCpInputGenerator._PARALLELIZATION_FLAG_ALIASES
+ cmdline_params = BasePwCpInputGenerator._add_parallelization_flags_to_cmdline_params(inputs_parallelization, cmdline_params=settings_dict.pop('CMDLINE', []))
calcinfo.local_copy_list = local_copy_list
calcinfo.remote_copy_list = remote_copy_list
calcinfo.remote_symlink_list = remote_symlink_list
# In neb calculations there is no input read from standard input!!
- codeinfo.cmdline_params = (['-input_images', '2'] + list(cmdline_params))
+ codeinfo.cmdline_params = (['-input_images', str(len(structure_list))] + list(cmdline_params))
codeinfo.stdout_name = self.inputs.metadata.options.output_filename
codeinfo.code_uuid = self.inputs.code.uuid
calcinfo.codes_info = [codeinfo]
diff --git a/src/aiida_quantumespresso/parsers/neb.py b/src/aiida_quantumespresso/parsers/neb.py
index eff77f28b..fba85aeb4 100644
--- a/src/aiida_quantumespresso/parsers/neb.py
+++ b/src/aiida_quantumespresso/parsers/neb.py
@@ -1,17 +1,18 @@
# -*- coding: utf-8 -*-
import os
+from sys import stdout
from aiida.common import AttributeDict, NotExistent
+from aiida.engine import ExitCode
from aiida.orm import ArrayData, Dict, TrajectoryData
import numpy
+from aiida_quantumespresso.calculations.neb import NebCalculation
from aiida_quantumespresso.calculations.pw import PwCalculation
from aiida_quantumespresso.parsers.parse_raw import convert_qe_to_aiida_structure
from aiida_quantumespresso.parsers.parse_raw.neb import parse_raw_output_neb
from aiida_quantumespresso.parsers.parse_raw.pw import parse_stdout as parse_pw_stdout
from aiida_quantumespresso.parsers.parse_raw.pw import reduce_symmetries
-from aiida_quantumespresso.parsers.parse_xml.exceptions import XMLParseError, XMLUnsupportedFormatError
-from aiida_quantumespresso.parsers.parse_xml.pw.parse import parse_xml as parse_pw_xml
from aiida_quantumespresso.parsers.pw import PwParser
from aiida_quantumespresso.utils.mapping import get_logging_container
@@ -27,7 +28,8 @@ class NebParser(BaseParser):
class_warning_map = {
'scf convergence NOT achieved on image': 'SCF did not converge for a given image',
'Maximum CPU time exceeded': 'Maximum CPU time exceeded',
- 'reached the maximum number of steps': 'Maximum number of iterations reached in the image optimization',
+ # !! 'step' and not 'steps' is needed in order to be found by regex
+ 'reached the maximum number of step': 'Maximum number of iterations reached in the image optimization',
}
def parse(self, **kwargs):
@@ -41,6 +43,8 @@ def parse(self, **kwargs):
prefix = self.node.process_class._PREFIX
+ self.exit_code_xml = None
+
# Look for optional settings input node and potential 'parser_options' dictionary within it
# Note that we look for both NEB and PW parser options under "inputs.settings.parser_options";
# we don't even have a namespace "inputs.pw.settings".
@@ -60,50 +64,42 @@ def parse(self, **kwargs):
if base_exit_code:
return self.exit(base_exit_code, logs)
- neb_out_dict, iteration_data = parse_raw_output_neb(stdout)
- parsed_data.update(neb_out_dict)
+ try:
+ neb_out_dict, iteration_data = parse_raw_output_neb(stdout)
+ except:
+ return self.exit(self.exit_codes.ERROR_OUTPUT_STDOUT_READ)
- num_images = parsed_data['num_of_images']
+ if len(neb_out_dict['errors']) > 0:
+ return self.exit(self.exit_codes[neb_out_dict['errors'][0]])
+ parsed_data.update(neb_out_dict)
+
+ # If num_images is empty, it means that the calculation was interrupted before completing
+ # the first NEB minimization step, so we cannot retrieve any partial trajectory.
+ try:
+ num_images = parsed_data['num_of_images']
+ except:
+ return self.exit(self.exit_codes.ERROR_NEB_INTERRUPTED_WITHOUT_PARTIAL_TRAJECTORY)
+
# Now parse the information from the individual pw calculations for the different images
image_data = {}
positions = []
cells = []
for i in range(num_images):
- # check if any of the known XML output file names are present, and parse the first that we find
+ # check if any of the known XML output file names are present, and parse it
relative_output_folder = os.path.join(f'{prefix}_{i + 1}', f'{prefix}.save')
- retrieved_files = self.retrieved.base.repository.list_object_names(relative_output_folder)
-
- for xml_filename in PwCalculation.xml_filenames:
- if xml_filename in retrieved_files:
- xml_file_path = os.path.join(relative_output_folder, xml_filename)
- try:
- with self.retrieved.base.repository.open(xml_file_path) as xml_file:
- parsed_data_xml, logs_xml = parse_pw_xml(xml_file, None)
- except IOError:
- return self.exit(self.exit_codes.ERROR_OUTPUT_XML_READ)
- except XMLParseError:
- return self.exit(self.exit_codes.ERROR_OUTPUT_XML_PARSE)
- except XMLUnsupportedFormatError:
- return self.exit(self.exit_codes.ERROR_OUTPUT_XML_FORMAT)
- except Exception:
- import traceback
- traceback.print_exc()
- return self.exit(self.exit_codes.ERROR_UNEXPECTED_PARSER_EXCEPTION)
- # this image is dealt with, so break the inner loop and go to the next image
- break
- # otherwise, if none of the filenames we tried exists, exit with an error
- else:
- return self.exit(self.exit_codes.ERROR_MISSING_XML_FILE)
+ parsed_data_xml, logs_xml = self.parse_xml(relative_output_folder)
# look for pw output and parse it
pw_out_file = os.path.join(f'{prefix}_{i + 1}', 'PW.out')
try:
with self.retrieved.base.repository.open(pw_out_file, 'r') as f:
pw_out_text = f.read() # Note: read() and not readlines()
+ # Output file can contain the output of many scf iterations, analyse only the last one
+ pw_out_text = ' coordinates at iteration' + pw_out_text.split('coordinates at iteration')[-1]
except IOError:
- return self.exit(self.exit_codes.ERROR_OUTPUT_STDOUT_READ)
+ logs_stdout = self.exit_codes.ERROR_OUTPUT_STDOUT_READ
try:
parsed_data_stdout, logs_stdout = parse_pw_stdout(
@@ -112,9 +108,29 @@ def parse(self, **kwargs):
except Exception as exc:
return self.exit(self.exit_codes.ERROR_UNEXPECTED_PARSER_EXCEPTION.format(exception=exc))
+ logs_stdout['error'].remove('ERROR_OUTPUT_STDOUT_INCOMPLETE')
+
+ # Determine issues coming from electronic structure calculations
+ exit_code = self.validate_electronic(logs_stdout)
+ if exit_code:
+ return self.exit(exit_code)
+
+ exit_code = self.validate_premature_exit(logs_stdout)
+ if exit_code:
+ return self.exit(exit_code)
+
+ if logs_stdout.error and self.exit_code_xml:
+ return self.exit(self.exit_codes.ERROR_OUTPUT_FILES)
+
parsed_structure = parsed_data_stdout.pop('structure', {})
parsed_trajectory = parsed_data_xml.pop('trajectory', {})
parsed_parameters = parsed_data_xml
+
+ if len(parsed_structure) == 0:
+ # Before exiting with xml parse error, check if scheduler already reported an exit code.
+ if self.node.exit_status is not None:
+ return ExitCode(self.node.exit_status, self.node.exit_message)
+ return self.exit(self.exit_codes.ERROR_OUTPUT_XML_PARSE)
PwParser.backwards_compatibility_parameters(parsed_parameters, parsed_data_stdout)
# Explicit information about k-points does not need to be queryable so we remove it from the parameters
@@ -193,7 +209,96 @@ def parse(self, **kwargs):
mep_arraydata.set_array('interpolated_mep', interp_mep)
self.out('output_mep', mep_arraydata)
- if 'ERROR_OUTPUT_STDOUT_INCOMPLETE'in logs.error:
- return self.exit(self.exit_codes.ERROR_OUTPUT_STDOUT_INCOMPLETE, logs)
+ if logs.error:
+ # First check whether the scheduler already reported an exit code.
+ if self.node.exit_status is not None:
+ # The following scheduler errors should correspond to cases where we can simply restart the calculation
+ # and have a chance that the calculation will succeed as the error can be transient.
+ recoverable_scheduler_error = self.node.exit_status in [
+ NebCalculation.exit_codes.ERROR_SCHEDULER_OUT_OF_WALLTIME.status,
+ NebCalculation.exit_codes.ERROR_SCHEDULER_NODE_FAILURE.status,
+ ]
+ if recoverable_scheduler_error:
+ return NebCalculation.exit_codes.ERROR_NEB_INTERRUPTED_PARTIAL_TRAJECTORY
+ elif 'Maximum number of iterations reached in the image optimization' in logs.warning:
+ return NebCalculation.exit_codes.ERROR_NEB_CYCLE_EXCEEDED_NSTEP
+ else:
+ # Calculation completed successfully shortly after exceeding walltime but before being terminated by the
+ # scheduler. In that case 'exit_status' can be reset.
+ self.node.set_exit_status(None)
return self.exit(logs=logs)
+
+ def parse_xml(self, relative_output_folder):
+ """Parse the XML output file for the specific image.
+
+ :param relative_output_folder: relative path to the output folder of the image.
+ :return: tuple of two dictionaries, first with raw parsed data and second with log messages
+ """
+ from aiida_quantumespresso.parsers.parse_xml.exceptions import XMLParseError, XMLUnsupportedFormatError
+ from aiida_quantumespresso.parsers.parse_xml.pw.parse import parse_xml as parse_pw_xml
+
+ logs = get_logging_container()
+ parsed_data = {}
+
+ try:
+ retrieved_files = self.retrieved.base.repository.list_object_names(relative_output_folder)
+ except:
+ self.exit_code_xml = self.exit_codes.ERROR_OUTPUT_XML_MISSING
+ return parsed_data, logs
+
+ xml_filenames = [os.path.join(relative_output_folder, xml_file) for xml_file in PwCalculation.xml_filenames if xml_file in retrieved_files]
+ if not xml_filenames:
+ if not self.node.get_option('without_xml'):
+ self.exit_code_xml = self.exit_codes.ERROR_OUTPUT_XML_MISSING
+ return parsed_data, logs
+
+ if len(xml_filenames) > 1:
+ self.exit_code_xml = self.exit_codes.ERROR_OUTPUT_XML_MULTIPLE
+ return parsed_data, logs
+
+ try:
+ with self.retrieved.base.repository.open(xml_filenames[0]) as xml_file:
+ parsed_data, logs = parse_pw_xml(xml_file, None)
+ except IOError:
+ self.exit_code_xml = self.exit_codes.ERROR_OUTPUT_XML_READ
+ except XMLParseError:
+ self.exit_code_xml = self.exit_codes.ERROR_OUTPUT_XML_PARSE
+ except XMLUnsupportedFormatError:
+ self.exit_code_xml = self.exit_codes.ERROR_OUTPUT_XML_FORMAT
+ except Exception:
+ import traceback
+ logs.critical.append(traceback.format_exc())
+ self.exit_code_xml = self.exit_codes.ERROR_UNEXPECTED_PARSER_EXCEPTION
+
+ return parsed_data, logs
+
+ def validate_premature_exit(self, logs):
+ """Analyze problems that will cause a pre-mature termination of the calculation, controlled or not."""
+
+ for error_label in [
+ 'ERROR_OUT_OF_WALLTIME',
+ 'ERROR_DEXX_IS_NEGATIVE',
+ 'ERROR_COMPUTING_CHOLESKY',
+ 'ERROR_DIAGONALIZATION_TOO_MANY_BANDS_NOT_CONVERGED',
+ 'ERROR_S_MATRIX_NOT_POSITIVE_DEFINITE',
+ 'ERROR_ZHEGVD_FAILED',
+ 'ERROR_QR_FAILED',
+ 'ERROR_EIGENVECTOR_CONVERGENCE',
+ 'ERROR_BROYDEN_FACTORIZATION',
+ ]:
+ if error_label in logs['error']:
+ return self.exit_codes.get(error_label)
+
+ def validate_electronic(self, logs):
+ """Analyze problems that are specific to `electronic` scf calculations."""
+
+ if 'ERROR_ELECTRONIC_CONVERGENCE_NOT_REACHED' in logs['error']:
+ scf_must_converge = self.node.inputs.pw.parameters.base.attributes.get('ELECTRONS',
+ {}).get('scf_must_converge', True)
+ electron_maxstep = self.node.inputs.pw.parameters.base.attributes.get('ELECTRONS', {}).get('electron_maxstep', 1)
+
+ if electron_maxstep == 0 or not scf_must_converge:
+ return self.exit_codes.WARNING_ELECTRONIC_CONVERGENCE_NOT_REACHED
+ else:
+ return self.exit_codes.ERROR_ELECTRONIC_CONVERGENCE_NOT_REACHED
\ No newline at end of file
diff --git a/src/aiida_quantumespresso/parsers/parse_raw/neb.py b/src/aiida_quantumespresso/parsers/parse_raw/neb.py
index c38cb776e..4ba25d352 100644
--- a/src/aiida_quantumespresso/parsers/parse_raw/neb.py
+++ b/src/aiida_quantumespresso/parsers/parse_raw/neb.py
@@ -7,7 +7,26 @@
"""
from qe_tools import CONSTANTS
-
+def detect_important_message(logs, line):
+ message_map = {
+ 'error': {'invalid number of pools, out of range': 'ERROR_NPOOLS_TOO_HIGH',
+ 'invalid number of images, out of range': 'ERROR_NIMAGE_HIGHER_THAN_NPROC',
+ 'n. of images must be divisor of nproc': 'ERROR_NIMAGE_NOT_DIVISOR_OF_NPROC',
+ 'nimage is larger than the available number of images': 'ERROR_NIMAGE_HIGHER_THAN_IMAGES'},
+ }
+
+ for marker, message in message_map['error'].items():
+ if hasattr(marker, 'search'):
+ if marker.match(line):
+ if message is None:
+ message = line
+ logs['errors'].append(message)
+ else:
+ if marker in line:
+ if message is None:
+ message = line
+ logs['errors'].append(message)
+
def parse_raw_output_neb(stdout):
"""Parses the output of a neb calculation Receives in input the paths to the output file.
@@ -54,12 +73,15 @@ def parse_neb_text_output(data):
parsed_data = {}
parsed_data['warnings'] = []
+ parsed_data['errors'] = []
iteration_data = defaultdict(list)
# set by default the calculation as not converged.
parsed_data['converged'] = [False, 0]
for count, line in enumerate(data.split('\n')):
+ detect_important_message(parsed_data, line)
+
if 'initial path length' in line:
initial_path_length = float(line.split('=')[1].split('bohr')[0])
parsed_data['initial_path_length'] = initial_path_length * CONSTANTS.bohr_to_ang
@@ -99,7 +121,7 @@ def parse_neb_text_output(data):
elif 'neb: convergence achieved in' in line:
parsed_data['converged'] = [True, int(line.split('iteration')[0].split()[-1])]
- num_images = parsed_data['num_of_images']
+ num_images = parsed_data['num_of_images'] if 'num_of_images' in parsed_data else None
iteration_lines = data.split('-- iteration')[1:]
iteration_lines = [i.split('\n') for i in iteration_lines]
@@ -107,10 +129,16 @@ def parse_neb_text_output(data):
for iteration in iteration_lines:
for count, line in enumerate(iteration):
if 'activation energy (->)' in line:
- activ_energy = float(line.split('=')[1].split('eV')[0])
+ try:
+ activ_energy = float(line.split('=')[1].split('eV')[0])
+ except Exception:
+ activ_energy = None
iteration_data['forward_activation_energy'].append(activ_energy)
elif 'activation energy (<-)' in line:
- activ_energy = float(line.split('=')[1].split('eV')[0])
+ try:
+ activ_energy = float(line.split('=')[1].split('eV')[0])
+ except Exception:
+ activ_energy = None
iteration_data['backward_activation_energy'].append(activ_energy)
elif 'image energy (eV) error (eV/A) frozen' in line:
energies = []
@@ -130,10 +158,16 @@ def parse_neb_text_output(data):
elif 'climbing image' in line:
iteration_data['climbing_image_auto'].append([int(_) for _ in line.split('=')[1].split(',')])
elif 'path length' in line:
- path_length = float(line.split('=')[1].split('bohr')[0])
- iteration_data['path_length'].append(path_length * CONSTANTS.bohr_to_ang)
+ try:
+ path_length = float(line.split('=')[1].split('bohr')[0])
+ iteration_data['path_length'].append(path_length * CONSTANTS.bohr_to_ang)
+ except Exception:
+ iteration_data['path_length'].append(None)
elif 'inter-image distance' in line:
- image_dist = float(line.split('=')[1].split('bohr')[0])
- iteration_data['image_dist'].append(image_dist * CONSTANTS.bohr_to_ang)
+ try:
+ image_dist = float(line.split('=')[1].split('bohr')[0])
+ iteration_data['image_dist'].append(image_dist * CONSTANTS.bohr_to_ang)
+ except Exception:
+ iteration_data['image_dist'].append(None)
return parsed_data, dict(iteration_data)
diff --git a/src/aiida_quantumespresso/workflows/neb/__init__.py b/src/aiida_quantumespresso/workflows/neb/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/aiida_quantumespresso/workflows/neb/base.py b/src/aiida_quantumespresso/workflows/neb/base.py
new file mode 100644
index 000000000..9e7af4743
--- /dev/null
+++ b/src/aiida_quantumespresso/workflows/neb/base.py
@@ -0,0 +1,331 @@
+# -*- coding: utf-8 -*-
+"""Workchain to run a Quantum ESPRESSO neb.x calculation with automated error handling and restarts."""
+from aiida import orm
+from aiida.common import AttributeDict, InputValidationError
+from aiida.engine import BaseRestartWorkChain, ProcessHandlerReport, process_handler, while_
+
+from aiida_quantumespresso.calculations.functions.create_kpoints_from_distance import create_kpoints_from_distance
+from aiida_quantumespresso.common.types import ElectronicType, RestartType, SpinType
+from aiida_quantumespresso.utils.defaults.calculation import pw as qe_defaults
+
+from ...calculations.neb import NebCalculation
+from ...workflows.pw.base import PwBaseWorkChain
+from ..protocols.utils import ProtocolMixin
+
+
+class NebBaseWorkChain(ProtocolMixin, BaseRestartWorkChain):
+ """Workchain to run a Quantum ESPRESSO neb.x calculation with automated error handling and restarts."""
+
+ # pylint: disable=too-many-public-methods, too-many-statements
+
+ _process_class = NebCalculation
+
+ defaults = AttributeDict({
+ 'qe': qe_defaults,
+ 'delta_factor_mixing_beta': 0.8,
+ })
+
+ @classmethod
+ def define(cls, spec):
+ """Define the process specification."""
+ # yapf: disable
+ super().define(spec)
+ spec.expose_inputs(NebCalculation, namespace='neb', exclude=('pw.kpoints', 'first_structure', 'last_structure'))
+ spec.input('kpoints', valid_type=orm.KpointsData, required=False,
+ help='An explicit k-points list or mesh. Either this or `kpoints_distance` has to be provided.')
+ spec.input('kpoints_distance', valid_type=orm.Float, required=False,
+ help='The minimum desired distance in 1/Å between k-points in reciprocal space. The explicit k-points will '
+ 'be generated automatically by a calculation function based on the input structure.')
+ spec.input('kpoints_force_parity', valid_type=orm.Bool, required=False,
+ help='Optional input when constructing the k-points based on a desired `kpoints_distance`. Setting this to '
+ '`True` will force the k-point mesh to have an even number of points along each lattice vector except '
+ 'for any non-periodic directions.')
+
+ spec.outline(
+ cls.setup,
+ cls.validate_kpoints,
+ while_(cls.should_run_process)(
+ cls.run_process,
+ cls.inspect_process,
+ ),
+ cls.results,
+ )
+
+ spec.expose_outputs(NebCalculation)
+
+ spec.exit_code(202, 'ERROR_INVALID_INPUT_KPOINTS',
+ message='Neither the `kpoints` nor the `kpoints_distance` input was specified.')
+
+ spec.exit_code(300, 'ERROR_UNRECOVERABLE_FAILURE',
+ message='The calculation failed with an unidentified unrecoverable error.')
+ spec.exit_code(310, 'ERROR_KNOWN_UNRECOVERABLE_FAILURE',
+ message='The calculation failed with a known unrecoverable error.')
+ spec.exit_code(320, 'ERROR_PARALLELIZATION_SETTINGS',
+ message='The calculation failed due to wrong parallelization settings.')
+ # yapf: enable
+
+ @classmethod
+ def get_protocol_filepath(cls):
+ """Return ``pathlib.Path`` to the ``.yaml`` file that defines the protocols."""
+ from importlib_resources import files
+
+ from ..protocols import pw as pw_protocols
+ return files(pw_protocols) / 'base.yaml'
+
+ @classmethod
+ def get_builder_from_protocol(
+ cls,
+ code,
+ images,
+ protocol=None,
+ overrides=None,
+ electronic_type=ElectronicType.METAL,
+ spin_type=SpinType.NONE,
+ initial_magnetic_moments=None,
+ options=None,
+ **kargs
+ ):
+ """Return a builder prepopulated with inputs selected according to the chosen protocol.
+
+ :param code: the ``Code`` instance configured for the ``quantumespresso.pw`` plugin.
+ :param images: the ``TrajectoryData`` instance to use for initial guess of NEB images.
+ :param protocol: protocol to use, if not specified, the default will be used.
+ :param overrides: optional dictionary of inputs to override the defaults of the protocol.
+ :param electronic_type: indicate the electronic character of the system through ``ElectronicType`` instance.
+ :param spin_type: indicate the spin polarization type to use through a ``SpinType`` instance.
+ :param initial_magnetic_moments: optional dictionary that maps the initial magnetic moment of each kind to a
+ desired value for a spin polarized calculation. Note that in case the ``starting_magnetization`` is also
+ provided in the ``overrides``, this takes precedence over the values provided here. In case neither is
+ provided and ``spin_type == SpinType.COLLINEAR``, an initial guess for the magnetic moments is used.
+ :param options: A dictionary of options that will be recursively set for the ``metadata.options`` input of all
+ the ``CalcJobs`` that are nested in this work chain.
+ :return: a process builder instance with all inputs defined ready for launch.
+ """
+
+ pw_base = PwBaseWorkChain.get_builder_from_protocol(
+ code,
+ images.get_step_structure(-1),
+ protocol=protocol,
+ overrides=overrides,
+ electronic_type=electronic_type,
+ spin_type=spin_type,
+ initial_magnetic_moments=initial_magnetic_moments,
+ options=options,
+ **kargs
+ )
+ #pylint: disable=no-member
+ builder = cls.get_builder()
+ builder.neb.code = code
+ builder.neb.images = images
+ builder.neb.pw.pseudos = pw_base.pw.pseudos
+ builder.neb.pw.parameters = pw_base.pw.parameters
+ builder.neb.metadata.options = pw_base.pw.metadata.options
+
+ if 'kpoints' in pw_base:
+ builder.kpoints = pw_base['kpoints']
+ else:
+ builder.kpoints_distance = orm.Float(pw_base['kpoints_distance'])
+ builder.kpoints_force_parity = orm.Bool(pw_base['kpoints_force_parity'])
+ builder.max_iterations = orm.Int(pw_base['max_iterations'])
+ # pylint: enable=no-member
+ return builder
+
+ def setup(self):
+ """Call the ``setup`` of the ``BaseRestartWorkChain`` and create the inputs dictionary in ``self.ctx.inputs``.
+
+ This ``self.ctx.inputs`` dictionary will be used by the ``BaseRestartWorkChain`` to submit the calculations
+ in the internal loop.
+
+ The ``parameters`` and ``settings`` input ``Dict`` nodes are converted into a regular dictionary and the
+ default namelists for the ``parameters`` are set to empty dictionaries if not specified.
+ """
+ super().setup()
+
+ if 'images' not in self.inputs.neb:
+ raise InputValidationError('Input `images` are required.')
+
+ self.ctx.inputs = AttributeDict(self.exposed_inputs(NebCalculation, 'neb'))
+
+ self.ctx.inputs.parameters = self.ctx.inputs.parameters.get_dict()
+ self.ctx.inputs.pw.parameters = self.ctx.inputs.pw.parameters.get_dict()
+ self.ctx.inputs.pw.parameters.setdefault('CONTROL', {})
+ self.ctx.inputs.pw.parameters.setdefault('ELECTRONS', {})
+ self.ctx.inputs.pw.parameters.setdefault('SYSTEM', {})
+
+ self.ctx.inputs.pw.parameters['CONTROL'].setdefault('calculation', 'scf')
+
+ def validate_kpoints(self):
+ """Validate the inputs related to k-points.
+
+ Either an explicit `KpointsData` with given mesh/path, or a desired k-points distance should be specified. In
+ the case of the latter, the `KpointsData` will be constructed for the input `StructureData` using the
+ `create_kpoints_from_distance` calculation function.
+ """
+ if all(key not in self.inputs for key in ['kpoints', 'kpoints_distance']):
+ return self.exit_codes.ERROR_INVALID_INPUT_KPOINTS
+
+ try:
+ kpoints = self.inputs.kpoints
+ except AttributeError:
+ inputs = {
+ 'structure': self.inputs.neb.images.get_step_structure(-1),
+ 'distance': self.inputs.kpoints_distance,
+ 'force_parity': self.inputs.get('kpoints_force_parity', orm.Bool(False)),
+ 'metadata': {
+ 'call_link_label': 'create_kpoints_from_distance'
+ }
+ }
+ kpoints = create_kpoints_from_distance(**inputs) # pylint: disable=unexpected-keyword-arg
+
+ self.ctx.inputs.pw.kpoints = kpoints
+
+ def set_restart_type(self, restart_type, parent_folder=None):
+ """Set the restart type for the next iteration."""
+
+ if parent_folder is None and restart_type != RestartType.FROM_SCRATCH:
+ raise ValueError('When not restarting from scratch, a `parent_folder` must be provided.')
+
+ if restart_type == RestartType.FROM_SCRATCH:
+ self.ctx.inputs.parameters['PATH']['restart_mode'] = 'from_scratch'
+ self.ctx.inputs.pop('parent_folder', None)
+
+ elif restart_type == RestartType.FULL:
+ self.ctx.inputs.parameters['PATH']['restart_mode'] = 'restart'
+ self.ctx.inputs.parent_folder = parent_folder
+
+ def report_error_handled(self, calculation, action):
+ """Report an action taken for a calculation that has failed.
+
+ This should be called in a registered error handler if its condition is met and an action was taken.
+
+ :param calculation: the failed calculation node
+ :param action: a string message with the action taken
+ """
+ arguments = [calculation.process_label, calculation.pk, calculation.exit_status, calculation.exit_message]
+ self.report('{}<{}> failed with exit status {}: {}'.format(*arguments))
+ self.report(f'Action taken: {action}')
+
+ @process_handler(
+ priority=585,
+ exit_codes=[
+ NebCalculation.exit_codes.ERROR_COMPUTING_CHOLESKY,
+ NebCalculation.exit_codes.ERROR_DIAGONALIZATION_TOO_MANY_BANDS_NOT_CONVERGED,
+ NebCalculation.exit_codes.ERROR_S_MATRIX_NOT_POSITIVE_DEFINITE,
+ NebCalculation.exit_codes.ERROR_ZHEGVD_FAILED,
+ NebCalculation.exit_codes.ERROR_QR_FAILED,
+ NebCalculation.exit_codes.ERROR_EIGENVECTOR_CONVERGENCE,
+ NebCalculation.exit_codes.ERROR_BROYDEN_FACTORIZATION,
+ ]
+ )
+ def handle_diagonalization_errors(self, calculation):
+ """Handle known issues related to the diagonalization.
+
+ We use the following strategy. When a diagonalization algorithm fails, we try using an other one
+ still not used. Conjugate gradient (CG) is kept as last option, as it is the slowest among the
+ available ones, but on the contrary it is the most stable as well, thus kept as `last resort`.
+
+ Once the error handler has tried all ``diagonalization`` options, abort.
+ """
+ current = self.ctx.inputs.pw.parameters['ELECTRONS'].get('diagonalization', 'david')
+
+ if 'diagonalizations' not in self.ctx:
+ # Initialize a list to track diagonalisations that haven't been tried in reverse order or preference
+ self.ctx.diagonalizations = [value for value in ['cg', 'paro', 'ppcg', 'david'] if value != current.lower()]
+
+ try:
+ new = self.ctx.diagonalizations.pop()
+ self.ctx.inputs.pw.parameters['ELECTRONS']['diagonalization'] = new
+ action = f'found diagonalization issues for ``{current}``, switching to ``{new}`` diagonalization.'
+ self.report_error_handled(calculation, action)
+ return ProcessHandlerReport(True)
+ except IndexError:
+ action = 'found diagonalization issues but already exploited all supported algorithms, aborting...'
+ self.report_error_handled(calculation, action)
+ return ProcessHandlerReport(True, self.exit_codes.ERROR_KNOWN_UNRECOVERABLE_FAILURE)
+
+ @process_handler(priority=575, exit_codes=[
+ NebCalculation.exit_codes.ERROR_NEB_INTERRUPTED_PARTIAL_TRAJECTORY,
+ ])
+ def handle_neb_interrupted_partial_trajectory(self, calculation):
+ """Handle `ERROR_NEB_INTERRUPTED_PARTIAL_TRAJECTORY` and exit code.
+
+ In this case the calculation shut down cleanly and we can do a full restart.
+ """
+
+ self.set_restart_type(RestartType.FULL, calculation.outputs.remote_folder)
+ self.report_error_handled(calculation, "restarting in full with `CONTROL.restart_mode` = 'restart'")
+
+ return ProcessHandlerReport(True)
+
+ @process_handler(priority=575, exit_codes=[
+ NebCalculation.exit_codes.ERROR_NEB_CYCLE_EXCEEDED_NSTEP,
+ ])
+ def handle_neb_cycle_exceeded_nstep(self, calculation):
+ """Handle `ERROR_NEB_CYCLE_EXCEEDED_NSTEP` and exit code.
+
+ In this case the calculation shut down cleanly and we can do a full restart.
+ """
+ self.ctx.inputs.parameters['PATH'].setdefault('nstep_path', 1)
+ input_nsteps = self.inputs.neb.parameters['PATH']['nstep_path'] if 'nstep_path' in self.inputs.neb.parameters[
+ 'PATH'] else 1
+ self.ctx.inputs.parameters['PATH']['nstep_path'] += input_nsteps
+
+ self.set_restart_type(RestartType.FULL, calculation.outputs.remote_folder)
+ self.report_error_handled(calculation, "restarting in full with `CONTROL.restart_mode` = 'restart'")
+
+ return ProcessHandlerReport(True)
+
+ @process_handler(priority=410, exit_codes=[
+ NebCalculation.exit_codes.ERROR_ELECTRONIC_CONVERGENCE_NOT_REACHED,
+ ])
+ def handle_electronic_convergence_not_reached(self, calculation):
+ """Handle `ERROR_ELECTRONIC_CONVERGENCE_NOT_REACHED` error.
+
+ Decrease the mixing beta and fully restart from the previous calculation.
+ """
+ factor = self.defaults.delta_factor_mixing_beta
+ mixing_beta = self.ctx.inputs.pw.parameters.get('ELECTRONS',
+ {}).get('mixing_beta', self.defaults.qe.mixing_beta)
+ mixing_beta_new = mixing_beta * factor
+
+ self.ctx.inputs.pw.parameters['ELECTRONS']['mixing_beta'] = mixing_beta_new
+ action = f'reduced beta mixing from {mixing_beta} to {mixing_beta_new} and restarting from the last calculation'
+
+ self.set_restart_type(RestartType.FULL, calculation.outputs.remote_folder)
+ self.report_error_handled(calculation, action)
+ return ProcessHandlerReport(True)
+
+ @process_handler(
+ priority=400, exit_codes=[
+ NebCalculation.exit_codes.ERROR_NEB_INTERRUPTED_WITHOUT_PARTIAL_TRAJECTORY,
+ ]
+ )
+ def handle_neb_interrupted_without_partial_trajectory(self, calculation):
+ """Handle `ERROR_NEB_INTERRUPTED_WITHOUT_PARTIAL_TRAJECTORY` error.
+
+ In this case the calculation was interrupted before completing the first NEB minimization step,
+ so we cannot retrieve any partial trajectory, no way to restart the calculation.
+ Probably the walltime was too short.
+ """
+ action = 'Calculation was interrupted before completing the first NEB minimization step.'
+ action += 'An increase of the walltime is probably needed. Aborting...'
+ self.report_error_handled(calculation, action)
+ return ProcessHandlerReport(True, self.exit_codes.ERROR_KNOWN_UNRECOVERABLE_FAILURE)
+
+
+ @process_handler(
+ priority=390, exit_codes=[
+ NebCalculation.exit_codes.ERROR_NPOOLS_TOO_HIGH,
+ NebCalculation.exit_codes.ERROR_NIMAGE_HIGHER_THAN_NPROC,
+ NebCalculation.exit_codes.ERROR_NIMAGE_HIGHER_THAN_IMAGES,
+ NebCalculation.exit_codes.ERROR_NIMAGE_NOT_DIVISOR_OF_NPROC
+ ]
+ )
+ def handle_neb_interrupted_for_parallelization(self, calculation):
+ """Handle parallelization errors.
+
+ In this case the calculation was interrupted due to wrong parallelization settings.
+ """
+ action = 'Calculation was interrupted due to wrong parallelization settings.'
+ self.report_error_handled(calculation, action)
+ return ProcessHandlerReport(True, self.exit_codes.ERROR_PARALLELIZATION_SETTINGS)
diff --git a/src/aiida_quantumespresso/workflows/pw/base.py b/src/aiida_quantumespresso/workflows/pw/base.py
index 667bb352c..fd6189e6c 100644
--- a/src/aiida_quantumespresso/workflows/pw/base.py
+++ b/src/aiida_quantumespresso/workflows/pw/base.py
@@ -16,6 +16,7 @@
SsspFamily = GroupFactory('pseudo.family.sssp')
PseudoDojoFamily = GroupFactory('pseudo.family.pseudo_dojo')
CutoffsPseudoPotentialFamily = GroupFactory('pseudo.family.cutoffs')
+PseudoPotentialFamily = GroupFactory('pseudo.family')
class PwBaseWorkChain(ProtocolMixin, BaseRestartWorkChain):
@@ -176,8 +177,22 @@ def get_builder_from_protocol(
else:
try:
- pseudo_set = (PseudoDojoFamily, SsspFamily, CutoffsPseudoPotentialFamily)
- pseudo_family = orm.QueryBuilder().append(pseudo_set, filters={'label': pseudo_family}).one()[0]
+ try:
+ pseudo_has_cutoff = True
+ pseudo_set = (PseudoDojoFamily, SsspFamily, CutoffsPseudoPotentialFamily)
+ pseudo_family = orm.QueryBuilder().append(pseudo_set, filters={'label': pseudo_family}).one()[0]
+ except exceptions.NotExistent:
+ pseudo_has_cutoff = False
+ #try, as fallback, to load from the generic PseudoPotentialFamily and check that the cutoffs are defined
+ pseudo_family = orm.QueryBuilder().append(PseudoPotentialFamily, filters={'label': pseudo_family}).one()[0]
+ #check that cutoffs are defined in the overrides
+ system_overrides = overrides.get('pw', {}).get('parameters', {}).get('SYSTEM', {}) if overrides else {}
+ if not all(key in system_overrides for key in ('ecutwfc', 'ecutrho')):
+ raise ValueError(
+ 'When overriding the pseudo potentials from a generic `PseudoPotentialFamily`, both '
+ '`ecutwfc` and `ecutrho` cutoffs should be provided in the `overrides`: '
+ f'{overrides}'
+ )
except exceptions.NotExistent as exception:
raise ValueError(
f'required pseudo family `{pseudo_family}` is not installed. Please use `aiida-pseudo install` to'
@@ -185,8 +200,9 @@ def get_builder_from_protocol(
) from exception
try:
- parameters['SYSTEM']['ecutwfc'], parameters['SYSTEM'][
- 'ecutrho'] = pseudo_family.get_recommended_cutoffs(structure=structure, unit='Ry')
+ if pseudo_has_cutoff:
+ parameters['SYSTEM']['ecutwfc'], parameters['SYSTEM'][
+ 'ecutrho'] = pseudo_family.get_recommended_cutoffs(structure=structure, unit='Ry')
pseudos = pseudo_family.get_pseudos(structure=structure)
except ValueError as exception:
raise ValueError(
@@ -210,7 +226,7 @@ def get_builder_from_protocol(
z_valences={kind.name: pseudos[kind.name].z_valence for kind in structure.kinds},
initial_magnetic_moments=initial_magnetic_moments,
spin_type=spin_type,
- )
+ ) if spin_type != SpinType.NONE else {}
if spin_type is SpinType.COLLINEAR:
parameters['SYSTEM']['starting_magnetization'] = magnetization['starting_magnetization']
parameters['SYSTEM']['nspin'] = 2
diff --git a/tests/conftest.py b/tests/conftest.py
index d4fc02cc1..714147063 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -413,6 +413,37 @@ def _generate_structure(structure_id='silicon'):
return _generate_structure
+@pytest.fixture
+def generate_trajectory():
+ """Return a ``TrajectoryData`` representing H2-H."""
+
+ def _generate_trajectory(trajectory_id='hydrogen'):
+ """Return a ``TrajectoryData`` representing H2-H.
+
+ :param trajectory_id: identifies the ``TrajectoryData`` you want to generate. Accepted values are 'hydrogen'.
+ """
+ from aiida.orm import StructureData, TrajectoryData
+
+ if trajectory_id.startswith('hydrogen'):
+ cell = [[6, 0, 0], [0, 2.5, 0], [0, 0, 2.5]]
+ structure_1 = StructureData(cell=cell)
+ structure_1.append_atom(position=(-2.4166, 0., 0.), symbols='H', name='H')
+ structure_1.append_atom(position=(0, 0, 0), symbols='H', name='H')
+ structure_1.append_atom(position=(0.8243, 0, 0), symbols='H', name='H')
+
+ structure_2 = StructureData(cell=cell)
+ structure_2.append_atom(position=(-0.8243, 0., 0.), symbols='H', name='H')
+ structure_2.append_atom(position=(0, 0, 0), symbols='H', name='H')
+ structure_2.append_atom(position=(2.4166, 0, 0), symbols='H', name='H')
+
+ trajectory = TrajectoryData([structure_1, structure_2])
+ else:
+ raise KeyError(f'Unknown trajectory_id="{trajectory_id}"')
+ return trajectory
+
+ return _generate_trajectory
+
+
@pytest.fixture
def generate_structure_from_kinds():
"""Return a dummy `StructureData` instance with the specified kind names."""
@@ -729,6 +760,44 @@ def _generate_inputs_pw():
return _generate_inputs_pw
+@pytest.fixture
+def generate_inputs_neb(fixture_code, generate_trajectory, generate_kpoints_mesh, generate_upf_data):
+ """Generate default inputs for a `NebCalculation."""
+
+ def _generate_inputs_neb():
+ """Generate default inputs for a `NebCalculation."""
+ from aiida.orm import Dict
+
+ pw_parameters = Dict({
+ 'CONTROL': {
+ 'calculation': 'scf'
+ },
+ 'SYSTEM': {
+ 'ecutrho': 240.0,
+ 'ecutwfc': 30.0
+ },
+ 'ELECTRONS': {
+ 'electron_maxstep': 60,
+ }
+ })
+ neb_parameters = Dict({'PATH': {'nstep_path': 50, 'num_of_images': 7}})
+ trajectory = generate_trajectory()
+ inputs = {
+ 'code': fixture_code('quantumespresso.neb'),
+ 'images': trajectory,
+ 'parameters': neb_parameters,
+ 'kpoints': generate_kpoints_mesh(1),
+ 'pw': {
+ 'parameters': pw_parameters,
+ 'pseudos':
+ {kind: generate_upf_data(kind) for kind in trajectory.get_step_structure(-1).get_kind_names()},
+ }
+ }
+ return inputs
+
+ return _generate_inputs_neb
+
+
@pytest.fixture
def generate_inputs_cp(fixture_code, generate_structure, generate_upf_data):
"""Generate default inputs for a CpCalculation."""
@@ -823,6 +892,53 @@ def _generate_workchain_pw(exit_code=None, inputs=None, return_inputs=False, pw_
return _generate_workchain_pw
+@pytest.fixture
+def generate_workchain_neb(generate_workchain, generate_inputs_neb, generate_calc_job_node):
+ """Generate an instance of a ``NebBaseWorkChain``."""
+
+ def _generate_workchain_neb(exit_code=None, inputs=None, return_inputs=False, neb_outputs=None):
+ """Generate an instance of a ``NebBaseWorkChain``.
+
+ :param exit_code: exit code for the ``NebCalculation``.
+ :param inputs: inputs for the ``NebBaseWorkChain``.
+ :param return_inputs: return the inputs of the ``NebBaseWorkChain``.
+ :param neb_outputs: ``dict`` of outputs for the ``NebCalculation``. The keys must correspond to the link labels
+ and the values to the output nodes.
+ """
+ from aiida.common import LinkType
+ from aiida.orm import Dict
+ from plumpy import ProcessState
+
+ entry_point = 'quantumespresso.neb.base'
+
+ if inputs is None:
+ neb_inputs = generate_inputs_neb()
+ kpoints = neb_inputs.pop('kpoints')
+ inputs = {'neb': neb_inputs, 'kpoints': kpoints}
+
+ if return_inputs:
+ return inputs
+
+ process = generate_workchain(entry_point, inputs)
+
+ neb_node = generate_calc_job_node(inputs={'parameters': Dict()})
+ process.ctx.iteration = 1
+ process.ctx.children = [neb_node]
+
+ if neb_outputs is not None:
+ for link_label, output_node in neb_outputs.items():
+ output_node.base.links.add_incoming(neb_node, link_type=LinkType.CREATE, link_label=link_label)
+ output_node.store()
+
+ if exit_code is not None:
+ neb_node.set_process_state(ProcessState.FINISHED)
+ neb_node.set_exit_status(exit_code.status)
+
+ return process
+
+ return _generate_workchain_neb
+
+
@pytest.fixture
def generate_workchain_ph(generate_workchain, generate_inputs_ph, generate_calc_job_node):
"""Generate an instance of a `PhBaseWorkChain`."""
diff --git a/tests/parsers/fixtures/neb/failed_broyden_factorization/aiida.out b/tests/parsers/fixtures/neb/failed_broyden_factorization/aiida.out
new file mode 100644
index 000000000..e9ee33d58
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_broyden_factorization/aiida.out
@@ -0,0 +1,317 @@
+
+ Program NEB v.6.4.1 starts on 9Sep2019 at 21: 3:57
+
+ This program is part of the open-source Quantum ESPRESSO suite
+ for quantum simulation of materials; please cite
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 21 395502 (2009);
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 29 465901 (2017);
+ URL http://www.quantum-espresso.org",
+ in publications or presentations arising from this work. More details at
+ http://www.quantum-espresso.org/quote
+
+ Parallel version (MPI), running on 1 processors
+
+ MPI processes distributed on 1 nodes
+
+ No input file found, assuming nothing to parse
+ Searching argument -input_images or --input_images
+ Reading input from pw_1.in
+ Reading input from pw_2.in
+
+ initial path length = 4.2553 bohr
+ initial inter-image distance = 2.1276 bohr
+
+ string_method = neb
+ restart_mode = from_scratch
+ opt_scheme = broyden
+ num_of_images = 3
+ nstep_path = 20
+ CI_scheme = auto
+ first_last_opt = F
+ use_freezing = F
+ ds = 2.0000 a.u.
+ k_max = 0.3000 a.u.
+ k_min = 0.2000 a.u.
+ suggested k_max = 0.1542 a.u.
+ suggested k_min = 0.1028 a.u.
+ path_thr = 0.0500 eV / A
+
+ ------------------------------ iteration 1 ------------------------------
+
+ tcpu = 0.2 self-consistency for image 1
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 0.9 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 1.8 self-consistency for image 3
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.487921 eV
+ activation energy (<-) = 2.487921 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.1363465 2.305560 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.255 bohr
+ inter-image distance = 2.128 bohr
+
+ ------------------------------ iteration 2 ------------------------------
+
+ tcpu = 2.6 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.035025 eV
+ activation energy (<-) = 2.035025 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.5892425 2.460480 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.285 bohr
+ inter-image distance = 2.143 bohr
+
+ ------------------------------ iteration 3 ------------------------------
+
+ tcpu = 3.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 1.525016 eV
+ activation energy (<-) = 1.525016 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -43.0992523 2.556790 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.383 bohr
+ inter-image distance = 2.191 bohr
+
+ ------------------------------ iteration 4 ------------------------------
+
+ tcpu = 4.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.447076 eV
+ activation energy (<-) = 0.447076 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.1771919 2.253546 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.796 bohr
+ inter-image distance = 2.398 bohr
+
+ ------------------------------ iteration 5 ------------------------------
+
+ tcpu = 5.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 3.249031 T
+ 2 -44.8839649 0.577080 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.454 bohr
+ inter-image distance = 2.727 bohr
+
+ ------------------------------ iteration 6 ------------------------------
+
+ tcpu = 6.1 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.396607 eV
+ activation energy (<-) = 0.396607 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.2276605 4.438232 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 6.275 bohr
+ inter-image distance = 3.137 bohr
+
+ ------------------------------ iteration 7 ------------------------------
+
+ tcpu = 7.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.844563 T
+ 2 -44.9016945 0.317440 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.520 bohr
+ inter-image distance = 2.760 bohr
+
+ ------------------------------ iteration 8 ------------------------------
+
+ tcpu = 7.7 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.749293 T
+ 2 -44.9043340 0.258570 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.536 bohr
+ inter-image distance = 2.768 bohr
+
+ ------------------------------ iteration 9 ------------------------------
+
+ tcpu = 8.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.685185 T
+ 2 -44.9057771 0.215664 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.546 bohr
+ inter-image distance = 2.773 bohr
+
+ ------------------------------ iteration 10 ------------------------------
+
+ tcpu = 8.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.639147 T
+ 2 -44.9066490 0.185069 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.554 bohr
+ inter-image distance = 2.777 bohr
+
+ ------------------------------ iteration 11 ------------------------------
+
+ tcpu = 9.4 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.180484 T
+ 2 -44.9079701 0.126805 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.628 bohr
+ inter-image distance = 2.814 bohr
+
+ ------------------------------ iteration 12 ------------------------------
+
+ tcpu = 10.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.586315 T
+ 2 -44.9074826 0.149493 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.562 bohr
+ inter-image distance = 2.781 bohr
+
+ ------------------------------ iteration 13 ------------------------------
+
+ tcpu = 10.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.419674 T
+ 2 -44.9089522 0.037855 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.589 bohr
+ inter-image distance = 2.795 bohr
+
+ ---------------------------------------------------------------------------
+
+
+ neb: convergence achieved in 13 iterations
+
+ NEB : 10.54s CPU 11.44s WALL
+
+
+ This run was terminated on: 21: 4: 8 9Sep2019
+
+=------------------------------------------------------------------------------=
+ JOB DONE.
+=------------------------------------------------------------------------------=
diff --git a/tests/parsers/fixtures/neb/failed_broyden_factorization/aiida_1/PW.out b/tests/parsers/fixtures/neb/failed_broyden_factorization/aiida_1/PW.out
new file mode 100644
index 000000000..9ad72c7ff
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_broyden_factorization/aiida_1/PW.out
@@ -0,0 +1,6 @@
+# NOTE: lines of output removed
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Error in routine broyden (1):
+ factorization
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+# NOTE: lines of output removed
diff --git a/tests/parsers/fixtures/neb/failed_computing_cholesky/aiida.out b/tests/parsers/fixtures/neb/failed_computing_cholesky/aiida.out
new file mode 100644
index 000000000..e9ee33d58
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_computing_cholesky/aiida.out
@@ -0,0 +1,317 @@
+
+ Program NEB v.6.4.1 starts on 9Sep2019 at 21: 3:57
+
+ This program is part of the open-source Quantum ESPRESSO suite
+ for quantum simulation of materials; please cite
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 21 395502 (2009);
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 29 465901 (2017);
+ URL http://www.quantum-espresso.org",
+ in publications or presentations arising from this work. More details at
+ http://www.quantum-espresso.org/quote
+
+ Parallel version (MPI), running on 1 processors
+
+ MPI processes distributed on 1 nodes
+
+ No input file found, assuming nothing to parse
+ Searching argument -input_images or --input_images
+ Reading input from pw_1.in
+ Reading input from pw_2.in
+
+ initial path length = 4.2553 bohr
+ initial inter-image distance = 2.1276 bohr
+
+ string_method = neb
+ restart_mode = from_scratch
+ opt_scheme = broyden
+ num_of_images = 3
+ nstep_path = 20
+ CI_scheme = auto
+ first_last_opt = F
+ use_freezing = F
+ ds = 2.0000 a.u.
+ k_max = 0.3000 a.u.
+ k_min = 0.2000 a.u.
+ suggested k_max = 0.1542 a.u.
+ suggested k_min = 0.1028 a.u.
+ path_thr = 0.0500 eV / A
+
+ ------------------------------ iteration 1 ------------------------------
+
+ tcpu = 0.2 self-consistency for image 1
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 0.9 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 1.8 self-consistency for image 3
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.487921 eV
+ activation energy (<-) = 2.487921 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.1363465 2.305560 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.255 bohr
+ inter-image distance = 2.128 bohr
+
+ ------------------------------ iteration 2 ------------------------------
+
+ tcpu = 2.6 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.035025 eV
+ activation energy (<-) = 2.035025 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.5892425 2.460480 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.285 bohr
+ inter-image distance = 2.143 bohr
+
+ ------------------------------ iteration 3 ------------------------------
+
+ tcpu = 3.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 1.525016 eV
+ activation energy (<-) = 1.525016 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -43.0992523 2.556790 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.383 bohr
+ inter-image distance = 2.191 bohr
+
+ ------------------------------ iteration 4 ------------------------------
+
+ tcpu = 4.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.447076 eV
+ activation energy (<-) = 0.447076 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.1771919 2.253546 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.796 bohr
+ inter-image distance = 2.398 bohr
+
+ ------------------------------ iteration 5 ------------------------------
+
+ tcpu = 5.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 3.249031 T
+ 2 -44.8839649 0.577080 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.454 bohr
+ inter-image distance = 2.727 bohr
+
+ ------------------------------ iteration 6 ------------------------------
+
+ tcpu = 6.1 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.396607 eV
+ activation energy (<-) = 0.396607 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.2276605 4.438232 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 6.275 bohr
+ inter-image distance = 3.137 bohr
+
+ ------------------------------ iteration 7 ------------------------------
+
+ tcpu = 7.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.844563 T
+ 2 -44.9016945 0.317440 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.520 bohr
+ inter-image distance = 2.760 bohr
+
+ ------------------------------ iteration 8 ------------------------------
+
+ tcpu = 7.7 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.749293 T
+ 2 -44.9043340 0.258570 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.536 bohr
+ inter-image distance = 2.768 bohr
+
+ ------------------------------ iteration 9 ------------------------------
+
+ tcpu = 8.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.685185 T
+ 2 -44.9057771 0.215664 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.546 bohr
+ inter-image distance = 2.773 bohr
+
+ ------------------------------ iteration 10 ------------------------------
+
+ tcpu = 8.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.639147 T
+ 2 -44.9066490 0.185069 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.554 bohr
+ inter-image distance = 2.777 bohr
+
+ ------------------------------ iteration 11 ------------------------------
+
+ tcpu = 9.4 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.180484 T
+ 2 -44.9079701 0.126805 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.628 bohr
+ inter-image distance = 2.814 bohr
+
+ ------------------------------ iteration 12 ------------------------------
+
+ tcpu = 10.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.586315 T
+ 2 -44.9074826 0.149493 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.562 bohr
+ inter-image distance = 2.781 bohr
+
+ ------------------------------ iteration 13 ------------------------------
+
+ tcpu = 10.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.419674 T
+ 2 -44.9089522 0.037855 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.589 bohr
+ inter-image distance = 2.795 bohr
+
+ ---------------------------------------------------------------------------
+
+
+ neb: convergence achieved in 13 iterations
+
+ NEB : 10.54s CPU 11.44s WALL
+
+
+ This run was terminated on: 21: 4: 8 9Sep2019
+
+=------------------------------------------------------------------------------=
+ JOB DONE.
+=------------------------------------------------------------------------------=
diff --git a/tests/parsers/fixtures/neb/failed_computing_cholesky/aiida_1/PW.out b/tests/parsers/fixtures/neb/failed_computing_cholesky/aiida_1/PW.out
new file mode 100644
index 000000000..d55984c80
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_computing_cholesky/aiida_1/PW.out
@@ -0,0 +1,8 @@
+# NOTE: lines of output removed.
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Error in routine cdiaghg (668):
+ problems computing cholesky
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+# NOTE: lines of output removed.
diff --git a/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida.out b/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida.out
new file mode 100644
index 000000000..5ca881d10
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida.out
@@ -0,0 +1,317 @@
+
+ Program NEB v.6.4.1 starts on 9Sep2019 at 21: 3:57
+
+ This program is part of the open-source Quantum ESPRESSO suite
+ for quantum simulation of materials; please cite
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 21 395502 (2009);
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 29 465901 (2017);
+ URL http://www.quantum-espresso.org",
+ in publications or presentations arising from this work. More details at
+ http://www.quantum-espresso.org/quote
+
+ Parallel version (MPI), running on 1 processors
+
+ MPI processes distributed on 1 nodes
+
+ No input file found, assuming nothing to parse
+ Searching argument -input_images or --input_images
+ Reading input from pw_1.in
+ Reading input from pw_2.in
+
+ initial path length = 4.2553 bohr
+ initial inter-image distance = 2.1276 bohr
+
+ string_method = neb
+ restart_mode = from_scratch
+ opt_scheme = broyden
+ num_of_images = 3
+ nstep_path = 20
+ CI_scheme = auto
+ first_last_opt = F
+ use_freezing = F
+ ds = 2.0000 a.u.
+ k_max = 0.3000 a.u.
+ k_min = 0.2000 a.u.
+ suggested k_max = 0.1542 a.u.
+ suggested k_min = 0.1028 a.u.
+ path_thr = 0.0500 eV / A
+
+ ------------------------------ iteration 1 ------------------------------
+
+ tcpu = 0.2 self-consistency for image 1
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 0.9 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 1.8 self-consistency for image 3
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.487921 eV
+ activation energy (<-) = 2.487921 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.1363465 2.305560 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.255 bohr
+ inter-image distance = 2.128 bohr
+
+ ------------------------------ iteration 2 ------------------------------
+
+ tcpu = 2.6 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.035025 eV
+ activation energy (<-) = 2.035025 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.5892425 2.460480 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.285 bohr
+ inter-image distance = 2.143 bohr
+
+ ------------------------------ iteration 3 ------------------------------
+
+ tcpu = 3.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 1.525016 eV
+ activation energy (<-) = 1.525016 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -43.0992523 2.556790 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.383 bohr
+ inter-image distance = 2.191 bohr
+
+ ------------------------------ iteration 4 ------------------------------
+
+ tcpu = 4.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.447076 eV
+ activation energy (<-) = 0.447076 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.1771919 2.253546 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.796 bohr
+ inter-image distance = 2.398 bohr
+
+ ------------------------------ iteration 5 ------------------------------
+
+ tcpu = 5.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 3.249031 T
+ 2 -44.8839649 0.577080 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.454 bohr
+ inter-image distance = 2.727 bohr
+
+ ------------------------------ iteration 6 ------------------------------
+
+ tcpu = 6.1 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.396607 eV
+ activation energy (<-) = 0.396607 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.2276605 4.438232 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 6.275 bohr
+ inter-image distance = 3.137 bohr
+
+ ------------------------------ iteration 7 ------------------------------
+
+ tcpu = 7.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.844563 T
+ 2 -44.9016945 0.317440 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.520 bohr
+ inter-image distance = 2.760 bohr
+
+ ------------------------------ iteration 8 ------------------------------
+
+ tcpu = 7.7 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.749293 T
+ 2 -44.9043340 0.258570 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.536 bohr
+ inter-image distance = 2.768 bohr
+
+ ------------------------------ iteration 9 ------------------------------
+
+ tcpu = 8.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.685185 T
+ 2 -44.9057771 0.215664 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.546 bohr
+ inter-image distance = 2.773 bohr
+
+ ------------------------------ iteration 10 ------------------------------
+
+ tcpu = 8.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.639147 T
+ 2 -44.9066490 0.185069 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.554 bohr
+ inter-image distance = 2.777 bohr
+
+ ------------------------------ iteration 11 ------------------------------
+
+ tcpu = 9.4 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.180484 T
+ 2 -44.9079701 0.126805 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.628 bohr
+ inter-image distance = 2.814 bohr
+
+ ------------------------------ iteration 12 ------------------------------
+
+ tcpu = 10.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.586315 T
+ 2 -44.9074826 0.149493 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.562 bohr
+ inter-image distance = 2.781 bohr
+
+ ------------------------------ iteration 13 ------------------------------
+
+ tcpu = 10.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.419674 T
+ 2 -44.9089522 0.037855 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.589 bohr
+ inter-image distance = 2.795 bohr
+
+ ---------------------------------------------------------------------------
+
+
+ neb: reached the maximum number of steps
+
+ NEB : 10.54s CPU 11.44s WALL
+
+
+ This run was terminated on: 21: 4: 8 9Sep2019
+
+=------------------------------------------------------------------------------=
+ JOB DONE.
+=------------------------------------------------------------------------------=
diff --git a/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_1/PW.out b/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_1/PW.out
new file mode 100644
index 000000000..414cb5ace
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_1/PW.out
@@ -0,0 +1,11 @@
+
+ coordinates at iteration 0
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
diff --git a/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_1/aiida.save/data-file-schema.xml b/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_1/aiida.save/data-file-schema.xml
new file mode 100644
index 000000000..38cc762a6
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_1/aiida.save/data-file-schema.xml
@@ -0,0 +1,489 @@
+
+
+
+
+ QEXSD_19.03
+ XML file generated by PWSCF
+ This run was terminated on: 21: 3:58 9 Sep 2019
+
+
+
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+ relax
+ from_scratch
+ aiida
+ ./pseudo/
+ ./out/
+ false
+ false
+ true
+ low
+ 10000000
+ 50
+ 5.000000000000000e-5
+ 5.000000000000000e-4
+ 5.000000000000000e-1
+ high
+ 100000
+
+
+
+ 1.007940000000000e0
+ H.pbe-rrkjus_psl.1.0.0.UPF
+ 5.000000000000000e-1
+
+
+
+
+ -1.557766760016841e0 0.000000000000000e0 0.000000000000000e0
+ 0.000000000000000e0 0.000000000000000e0 0.000000000000000e0
+ 4.566700090011524e0 0.000000000000000e0 0.000000000000000e0
+
+ |
+ 1.200000000003780e1 0.000000000000000e0 0.000000000000000e0
+ 0.000000000000000e0 4.999999999905514e0 0.000000000000000e0
+ 0.000000000000000e0 0.000000000000000e0 4.999999999905514e0
+ |
+
+
+ PBE
+
+
+ true
+ false
+ false
+
+
+ gaussian
+ 0.000000000000000e0
+ smearing
+
+
+ false
+ 1.000000000000000e1
+ 5.000000000000000e1
+
+
+ davidson
+ plain
+ 3.000000000000000e-1
+ 5.000000000000000e-9
+ 8
+ 100
+ false
+ false
+ false
+ false
+ 0.000000000000000e0
+ false
+ 20
+ 20
+
+
+ Monkhorst-Pack
+
+
+ bfgs
+ 1.000000000000000e2
+ false
+ false
+
+ 1
+ 1.000000000000000e-4
+ 8.000000000000000e-1
+ 5.000000000000000e-1
+ 1.000000000000000e-2
+ 5.000000000000000e-1
+
+
+
+ none
+ 0.000000000000000e0
+ 2.756043328244409e3
+ 0.000000000000000e0
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ 1 0 0
+ 0 0 0
+ 1 0 0
+
+
+
+ 0
+
+
+ 7.039320000000000e-1
+ 7.156929969787598e-1
+
+
+ 5.901860000000001e-1
+ 6.019501686096191e-1
+
+
+
+
diff --git a/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_2/PW.out b/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_2/PW.out
new file mode 100644
index 000000000..2ac5fd328
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_2/PW.out
@@ -0,0 +1,124 @@
+
+ coordinates at iteration 0
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ iteration # 10 ecut= 20.00 Ry beta= 0.30
+ iteration # 11 ecut= 20.00 Ry beta= 0.30
+ iteration # 12 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 1
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ iteration # 10 ecut= 20.00 Ry beta= 0.30
+ iteration # 11 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 2
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ iteration # 10 ecut= 20.00 Ry beta= 0.30
+ iteration # 11 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 3
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ iteration # 10 ecut= 20.00 Ry beta= 0.30
+ iteration # 11 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 4
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ iteration # 10 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 5
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 6
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 7
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 8
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 9
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 10
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 11
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 12
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
diff --git a/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_2/aiida.save/data-file-schema.xml b/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_2/aiida.save/data-file-schema.xml
new file mode 100644
index 000000000..571c0cc11
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_2/aiida.save/data-file-schema.xml
@@ -0,0 +1,521 @@
+
+
+
+
+ QEXSD_19.03
+ XML file generated by PWSCF
+ This run was terminated on: 21: 4: 8 9 Sep 2019
+
+
+
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+ relax
+ from_scratch
+ aiida
+ ./pseudo/
+ ./out/
+ false
+ false
+ true
+ low
+ 10000000
+ 50
+ 5.000000000000000e-5
+ 5.000000000000000e-4
+ 5.000000000000000e-1
+ high
+ 100000
+
+
+
+ 1.007940000000000e0
+ H.pbe-rrkjus_psl.1.0.0.UPF
+ 5.000000000000000e-1
+
+
+
+
+ -1.557766760016841e0 0.000000000000000e0 0.000000000000000e0
+ 0.000000000000000e0 0.000000000000000e0 0.000000000000000e0
+ 4.566700090011524e0 0.000000000000000e0 0.000000000000000e0
+
+
+ 1.200000000003780e1 0.000000000000000e0 0.000000000000000e0
+ 0.000000000000000e0 4.999999999905514e0 0.000000000000000e0
+ 0.000000000000000e0 0.000000000000000e0 4.999999999905514e0
+ |
+
+
+ PBE
+
+
+ true
+ false
+ false
+
+
+ gaussian
+ 0.000000000000000e0
+ smearing
+
+
+ false
+ 1.000000000000000e1
+ 5.000000000000000e1
+
+
+ davidson
+ plain
+ 3.000000000000000e-1
+ 5.000000000000000e-9
+ 8
+ 100
+ false
+ false
+ false
+ false
+ 0.000000000000000e0
+ false
+ 20
+ 20
+
+
+ Monkhorst-Pack
+
+
+ bfgs
+ 1.000000000000000e2
+ false
+ false
+
+ 1
+ 1.000000000000000e-4
+ 8.000000000000000e-1
+ 5.000000000000000e-1
+ 1.000000000000000e-2
+ 5.000000000000000e-1
+
+
+
+ none
+ 0.000000000000000e0
+ 2.756043328244409e3
+ 0.000000000000000e0
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ 1 0 0
+ 0 0 0
+ 1 0 0
+
+
+
+ 0
+
+
+ 1.034973800000000e1
+ 1.115338492393494e1
+
+
+ 8.266386000000001e0
+ 8.398051500320435e0
+
+
+
+
diff --git a/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_3/PW.out b/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_3/PW.out
new file mode 100644
index 000000000..414cb5ace
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_3/PW.out
@@ -0,0 +1,11 @@
+
+ coordinates at iteration 0
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
diff --git a/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_3/aiida.save/data-file-schema.xml b/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_3/aiida.save/data-file-schema.xml
new file mode 100644
index 000000000..643e413bc
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_cycle_exceeded_nstep/aiida_3/aiida.save/data-file-schema.xml
@@ -0,0 +1,489 @@
+
+
+
+
+ QEXSD_19.03
+ XML file generated by PWSCF
+ This run was terminated on: 21: 4: 0 9 Sep 2019
+
+
+
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+ relax
+ from_scratch
+ aiida
+ ./pseudo/
+ ./out/
+ false
+ false
+ true
+ low
+ 10000000
+ 50
+ 5.000000000000000e-5
+ 5.000000000000000e-4
+ 5.000000000000000e-1
+ high
+ 100000
+
+
+
+ 1.007940000000000e0
+ H.pbe-rrkjus_psl.1.0.0.UPF
+ 5.000000000000000e-1
+
+
+
+
+ -1.557766760016841e0 0.000000000000000e0 0.000000000000000e0
+ 0.000000000000000e0 0.000000000000000e0 0.000000000000000e0
+ 4.566700090011524e0 0.000000000000000e0 0.000000000000000e0
+
+
+ 1.200000000003780e1 0.000000000000000e0 0.000000000000000e0
+ 0.000000000000000e0 4.999999999905514e0 0.000000000000000e0
+ 0.000000000000000e0 0.000000000000000e0 4.999999999905514e0
+ |
+
+
+ PBE
+
+
+ true
+ false
+ false
+
+
+ gaussian
+ 0.000000000000000e0
+ smearing
+
+
+ false
+ 1.000000000000000e1
+ 5.000000000000000e1
+
+
+ davidson
+ plain
+ 3.000000000000000e-1
+ 5.000000000000000e-9
+ 8
+ 100
+ false
+ false
+ false
+ false
+ 0.000000000000000e0
+ false
+ 20
+ 20
+
+
+ Monkhorst-Pack
+
+
+ bfgs
+ 1.000000000000000e2
+ false
+ false
+
+ 1
+ 1.000000000000000e-4
+ 8.000000000000000e-1
+ 5.000000000000000e-1
+ 1.000000000000000e-2
+ 5.000000000000000e-1
+
+
+
+ none
+ 0.000000000000000e0
+ 2.756043328244409e3
+ 0.000000000000000e0
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ 1 0 0
+ 0 0 0
+ 1 0 0
+
+
+
+ 0
+
+
+ 2.349583000000000e0
+ 2.380792856216431e0
+
+
+ 2.020140000000000e0
+ 2.051357030868530e0
+
+
+
+
diff --git a/tests/parsers/fixtures/neb/failed_dexx_negative/aiida.out b/tests/parsers/fixtures/neb/failed_dexx_negative/aiida.out
new file mode 100644
index 000000000..e9ee33d58
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_dexx_negative/aiida.out
@@ -0,0 +1,317 @@
+
+ Program NEB v.6.4.1 starts on 9Sep2019 at 21: 3:57
+
+ This program is part of the open-source Quantum ESPRESSO suite
+ for quantum simulation of materials; please cite
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 21 395502 (2009);
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 29 465901 (2017);
+ URL http://www.quantum-espresso.org",
+ in publications or presentations arising from this work. More details at
+ http://www.quantum-espresso.org/quote
+
+ Parallel version (MPI), running on 1 processors
+
+ MPI processes distributed on 1 nodes
+
+ No input file found, assuming nothing to parse
+ Searching argument -input_images or --input_images
+ Reading input from pw_1.in
+ Reading input from pw_2.in
+
+ initial path length = 4.2553 bohr
+ initial inter-image distance = 2.1276 bohr
+
+ string_method = neb
+ restart_mode = from_scratch
+ opt_scheme = broyden
+ num_of_images = 3
+ nstep_path = 20
+ CI_scheme = auto
+ first_last_opt = F
+ use_freezing = F
+ ds = 2.0000 a.u.
+ k_max = 0.3000 a.u.
+ k_min = 0.2000 a.u.
+ suggested k_max = 0.1542 a.u.
+ suggested k_min = 0.1028 a.u.
+ path_thr = 0.0500 eV / A
+
+ ------------------------------ iteration 1 ------------------------------
+
+ tcpu = 0.2 self-consistency for image 1
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 0.9 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 1.8 self-consistency for image 3
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.487921 eV
+ activation energy (<-) = 2.487921 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.1363465 2.305560 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.255 bohr
+ inter-image distance = 2.128 bohr
+
+ ------------------------------ iteration 2 ------------------------------
+
+ tcpu = 2.6 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.035025 eV
+ activation energy (<-) = 2.035025 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.5892425 2.460480 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.285 bohr
+ inter-image distance = 2.143 bohr
+
+ ------------------------------ iteration 3 ------------------------------
+
+ tcpu = 3.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 1.525016 eV
+ activation energy (<-) = 1.525016 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -43.0992523 2.556790 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.383 bohr
+ inter-image distance = 2.191 bohr
+
+ ------------------------------ iteration 4 ------------------------------
+
+ tcpu = 4.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.447076 eV
+ activation energy (<-) = 0.447076 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.1771919 2.253546 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.796 bohr
+ inter-image distance = 2.398 bohr
+
+ ------------------------------ iteration 5 ------------------------------
+
+ tcpu = 5.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 3.249031 T
+ 2 -44.8839649 0.577080 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.454 bohr
+ inter-image distance = 2.727 bohr
+
+ ------------------------------ iteration 6 ------------------------------
+
+ tcpu = 6.1 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.396607 eV
+ activation energy (<-) = 0.396607 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.2276605 4.438232 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 6.275 bohr
+ inter-image distance = 3.137 bohr
+
+ ------------------------------ iteration 7 ------------------------------
+
+ tcpu = 7.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.844563 T
+ 2 -44.9016945 0.317440 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.520 bohr
+ inter-image distance = 2.760 bohr
+
+ ------------------------------ iteration 8 ------------------------------
+
+ tcpu = 7.7 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.749293 T
+ 2 -44.9043340 0.258570 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.536 bohr
+ inter-image distance = 2.768 bohr
+
+ ------------------------------ iteration 9 ------------------------------
+
+ tcpu = 8.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.685185 T
+ 2 -44.9057771 0.215664 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.546 bohr
+ inter-image distance = 2.773 bohr
+
+ ------------------------------ iteration 10 ------------------------------
+
+ tcpu = 8.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.639147 T
+ 2 -44.9066490 0.185069 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.554 bohr
+ inter-image distance = 2.777 bohr
+
+ ------------------------------ iteration 11 ------------------------------
+
+ tcpu = 9.4 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.180484 T
+ 2 -44.9079701 0.126805 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.628 bohr
+ inter-image distance = 2.814 bohr
+
+ ------------------------------ iteration 12 ------------------------------
+
+ tcpu = 10.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.586315 T
+ 2 -44.9074826 0.149493 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.562 bohr
+ inter-image distance = 2.781 bohr
+
+ ------------------------------ iteration 13 ------------------------------
+
+ tcpu = 10.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.419674 T
+ 2 -44.9089522 0.037855 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.589 bohr
+ inter-image distance = 2.795 bohr
+
+ ---------------------------------------------------------------------------
+
+
+ neb: convergence achieved in 13 iterations
+
+ NEB : 10.54s CPU 11.44s WALL
+
+
+ This run was terminated on: 21: 4: 8 9Sep2019
+
+=------------------------------------------------------------------------------=
+ JOB DONE.
+=------------------------------------------------------------------------------=
diff --git a/tests/parsers/fixtures/neb/failed_dexx_negative/aiida_1/PW.out b/tests/parsers/fixtures/neb/failed_dexx_negative/aiida_1/PW.out
new file mode 100644
index 000000000..c29da6069
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_dexx_negative/aiida_1/PW.out
@@ -0,0 +1,6 @@
+# NOTE: lines of output removed.
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Error in routine electrons (1):
+ dexx is negative! Check that exxdiv_treatment is appropriate for the system, or ecutfock may be too low
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+# NOTE: lines of output removed.
diff --git a/tests/parsers/fixtures/neb/failed_eigenvectors_convergence/aiida.out b/tests/parsers/fixtures/neb/failed_eigenvectors_convergence/aiida.out
new file mode 100644
index 000000000..e9ee33d58
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_eigenvectors_convergence/aiida.out
@@ -0,0 +1,317 @@
+
+ Program NEB v.6.4.1 starts on 9Sep2019 at 21: 3:57
+
+ This program is part of the open-source Quantum ESPRESSO suite
+ for quantum simulation of materials; please cite
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 21 395502 (2009);
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 29 465901 (2017);
+ URL http://www.quantum-espresso.org",
+ in publications or presentations arising from this work. More details at
+ http://www.quantum-espresso.org/quote
+
+ Parallel version (MPI), running on 1 processors
+
+ MPI processes distributed on 1 nodes
+
+ No input file found, assuming nothing to parse
+ Searching argument -input_images or --input_images
+ Reading input from pw_1.in
+ Reading input from pw_2.in
+
+ initial path length = 4.2553 bohr
+ initial inter-image distance = 2.1276 bohr
+
+ string_method = neb
+ restart_mode = from_scratch
+ opt_scheme = broyden
+ num_of_images = 3
+ nstep_path = 20
+ CI_scheme = auto
+ first_last_opt = F
+ use_freezing = F
+ ds = 2.0000 a.u.
+ k_max = 0.3000 a.u.
+ k_min = 0.2000 a.u.
+ suggested k_max = 0.1542 a.u.
+ suggested k_min = 0.1028 a.u.
+ path_thr = 0.0500 eV / A
+
+ ------------------------------ iteration 1 ------------------------------
+
+ tcpu = 0.2 self-consistency for image 1
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 0.9 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 1.8 self-consistency for image 3
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.487921 eV
+ activation energy (<-) = 2.487921 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.1363465 2.305560 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.255 bohr
+ inter-image distance = 2.128 bohr
+
+ ------------------------------ iteration 2 ------------------------------
+
+ tcpu = 2.6 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.035025 eV
+ activation energy (<-) = 2.035025 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.5892425 2.460480 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.285 bohr
+ inter-image distance = 2.143 bohr
+
+ ------------------------------ iteration 3 ------------------------------
+
+ tcpu = 3.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 1.525016 eV
+ activation energy (<-) = 1.525016 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -43.0992523 2.556790 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.383 bohr
+ inter-image distance = 2.191 bohr
+
+ ------------------------------ iteration 4 ------------------------------
+
+ tcpu = 4.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.447076 eV
+ activation energy (<-) = 0.447076 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.1771919 2.253546 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.796 bohr
+ inter-image distance = 2.398 bohr
+
+ ------------------------------ iteration 5 ------------------------------
+
+ tcpu = 5.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 3.249031 T
+ 2 -44.8839649 0.577080 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.454 bohr
+ inter-image distance = 2.727 bohr
+
+ ------------------------------ iteration 6 ------------------------------
+
+ tcpu = 6.1 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.396607 eV
+ activation energy (<-) = 0.396607 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.2276605 4.438232 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 6.275 bohr
+ inter-image distance = 3.137 bohr
+
+ ------------------------------ iteration 7 ------------------------------
+
+ tcpu = 7.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.844563 T
+ 2 -44.9016945 0.317440 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.520 bohr
+ inter-image distance = 2.760 bohr
+
+ ------------------------------ iteration 8 ------------------------------
+
+ tcpu = 7.7 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.749293 T
+ 2 -44.9043340 0.258570 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.536 bohr
+ inter-image distance = 2.768 bohr
+
+ ------------------------------ iteration 9 ------------------------------
+
+ tcpu = 8.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.685185 T
+ 2 -44.9057771 0.215664 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.546 bohr
+ inter-image distance = 2.773 bohr
+
+ ------------------------------ iteration 10 ------------------------------
+
+ tcpu = 8.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.639147 T
+ 2 -44.9066490 0.185069 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.554 bohr
+ inter-image distance = 2.777 bohr
+
+ ------------------------------ iteration 11 ------------------------------
+
+ tcpu = 9.4 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.180484 T
+ 2 -44.9079701 0.126805 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.628 bohr
+ inter-image distance = 2.814 bohr
+
+ ------------------------------ iteration 12 ------------------------------
+
+ tcpu = 10.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.586315 T
+ 2 -44.9074826 0.149493 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.562 bohr
+ inter-image distance = 2.781 bohr
+
+ ------------------------------ iteration 13 ------------------------------
+
+ tcpu = 10.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.419674 T
+ 2 -44.9089522 0.037855 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.589 bohr
+ inter-image distance = 2.795 bohr
+
+ ---------------------------------------------------------------------------
+
+
+ neb: convergence achieved in 13 iterations
+
+ NEB : 10.54s CPU 11.44s WALL
+
+
+ This run was terminated on: 21: 4: 8 9Sep2019
+
+=------------------------------------------------------------------------------=
+ JOB DONE.
+=------------------------------------------------------------------------------=
diff --git a/tests/parsers/fixtures/neb/failed_eigenvectors_convergence/aiida_1/PW.out b/tests/parsers/fixtures/neb/failed_eigenvectors_convergence/aiida_1/PW.out
new file mode 100644
index 000000000..7b648766b
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_eigenvectors_convergence/aiida_1/PW.out
@@ -0,0 +1,6 @@
+# NOTE: lines of output removed
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Error in routine cdiaghg (91):
+ eigenvectors failed to converge
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+# NOTE: lines of output removed
diff --git a/tests/parsers/fixtures/neb/failed_empty_stdout/aiida.out b/tests/parsers/fixtures/neb/failed_empty_stdout/aiida.out
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida.out b/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida.out
new file mode 100644
index 000000000..23b006d48
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida.out
@@ -0,0 +1,46 @@
+
+ Program NEB v.6.4.1 starts on 9Sep2019 at 21: 3:57
+
+ This program is part of the open-source Quantum ESPRESSO suite
+ for quantum simulation of materials; please cite
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 21 395502 (2009);
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 29 465901 (2017);
+ URL http://www.quantum-espresso.org",
+ in publications or presentations arising from this work. More details at
+ http://www.quantum-espresso.org/quote
+
+ Parallel version (MPI), running on 1 processors
+
+ MPI processes distributed on 1 nodes
+
+ No input file found, assuming nothing to parse
+ Searching argument -input_images or --input_images
+ Reading input from pw_1.in
+ Reading input from pw_2.in
+
+ initial path length = 4.2553 bohr
+ initial inter-image distance = 2.1276 bohr
+
+ string_method = neb
+ restart_mode = from_scratch
+ opt_scheme = broyden
+ num_of_images = 3
+ nstep_path = 20
+ CI_scheme = auto
+ first_last_opt = F
+ use_freezing = F
+ ds = 2.0000 a.u.
+ k_max = 0.3000 a.u.
+ k_min = 0.2000 a.u.
+ suggested k_max = 0.1542 a.u.
+ suggested k_min = 0.1028 a.u.
+ path_thr = 0.0500 eV / A
+
+ ------------------------------ iteration 1 ------------------------------
+
+ tcpu = 0.2 self-consistency for image 1
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 0.9 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
diff --git a/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida_1/PW.out b/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida_1/PW.out
new file mode 100644
index 000000000..414cb5ace
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida_1/PW.out
@@ -0,0 +1,11 @@
+
+ coordinates at iteration 0
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
diff --git a/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida_1/aiida.save/data-file-schema.xml b/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida_1/aiida.save/data-file-schema.xml
new file mode 100644
index 000000000..38cc762a6
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida_1/aiida.save/data-file-schema.xml
@@ -0,0 +1,489 @@
+
+
+
+
+ QEXSD_19.03
+ XML file generated by PWSCF
+ This run was terminated on: 21: 3:58 9 Sep 2019
+
+
+
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+ relax
+ from_scratch
+ aiida
+ ./pseudo/
+ ./out/
+ false
+ false
+ true
+ low
+ 10000000
+ 50
+ 5.000000000000000e-5
+ 5.000000000000000e-4
+ 5.000000000000000e-1
+ high
+ 100000
+
+
+
+ 1.007940000000000e0
+ H.pbe-rrkjus_psl.1.0.0.UPF
+ 5.000000000000000e-1
+
+
+
+
+ -1.557766760016841e0 0.000000000000000e0 0.000000000000000e0
+ 0.000000000000000e0 0.000000000000000e0 0.000000000000000e0
+ 4.566700090011524e0 0.000000000000000e0 0.000000000000000e0
+
+
+ 1.200000000003780e1 0.000000000000000e0 0.000000000000000e0
+ 0.000000000000000e0 4.999999999905514e0 0.000000000000000e0
+ 0.000000000000000e0 0.000000000000000e0 4.999999999905514e0
+ |
+
+
+ PBE
+
+
+ true
+ false
+ false
+
+
+ gaussian
+ 0.000000000000000e0
+ smearing
+
+
+ false
+ 1.000000000000000e1
+ 5.000000000000000e1
+
+
+ davidson
+ plain
+ 3.000000000000000e-1
+ 5.000000000000000e-9
+ 8
+ 100
+ false
+ false
+ false
+ false
+ 0.000000000000000e0
+ false
+ 20
+ 20
+
+
+ Monkhorst-Pack
+
+
+ bfgs
+ 1.000000000000000e2
+ false
+ false
+
+ 1
+ 1.000000000000000e-4
+ 8.000000000000000e-1
+ 5.000000000000000e-1
+ 1.000000000000000e-2
+ 5.000000000000000e-1
+
+
+
+ none
+ 0.000000000000000e0
+ 2.756043328244409e3
+ 0.000000000000000e0
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ 1 0 0
+ 0 0 0
+ 1 0 0
+
+
+
+ 0
+
+
+ 7.039320000000000e-1
+ 7.156929969787598e-1
+
+
+ 5.901860000000001e-1
+ 6.019501686096191e-1
+
+
+
+
diff --git a/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida_2/PW.out b/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida_2/PW.out
new file mode 100644
index 000000000..2ac5fd328
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida_2/PW.out
@@ -0,0 +1,124 @@
+
+ coordinates at iteration 0
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ iteration # 10 ecut= 20.00 Ry beta= 0.30
+ iteration # 11 ecut= 20.00 Ry beta= 0.30
+ iteration # 12 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 1
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ iteration # 10 ecut= 20.00 Ry beta= 0.30
+ iteration # 11 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 2
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ iteration # 10 ecut= 20.00 Ry beta= 0.30
+ iteration # 11 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 3
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ iteration # 10 ecut= 20.00 Ry beta= 0.30
+ iteration # 11 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 4
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ iteration # 10 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 5
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 6
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 7
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 8
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 9
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 10
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 11
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 12
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
diff --git a/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida_2/aiida.save/data-file-schema.xml b/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida_2/aiida.save/data-file-schema.xml
new file mode 100644
index 000000000..571c0cc11
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida_2/aiida.save/data-file-schema.xml
@@ -0,0 +1,521 @@
+
+
+
+
+ QEXSD_19.03
+ XML file generated by PWSCF
+ This run was terminated on: 21: 4: 8 9 Sep 2019
+
+
+
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+ relax
+ from_scratch
+ aiida
+ ./pseudo/
+ ./out/
+ false
+ false
+ true
+ low
+ 10000000
+ 50
+ 5.000000000000000e-5
+ 5.000000000000000e-4
+ 5.000000000000000e-1
+ high
+ 100000
+
+
+
+ 1.007940000000000e0
+ H.pbe-rrkjus_psl.1.0.0.UPF
+ 5.000000000000000e-1
+
+
+
+
+ -1.557766760016841e0 0.000000000000000e0 0.000000000000000e0
+ 0.000000000000000e0 0.000000000000000e0 0.000000000000000e0
+ 4.566700090011524e0 0.000000000000000e0 0.000000000000000e0
+
+
+ 1.200000000003780e1 0.000000000000000e0 0.000000000000000e0
+ 0.000000000000000e0 4.999999999905514e0 0.000000000000000e0
+ 0.000000000000000e0 0.000000000000000e0 4.999999999905514e0
+ |
+
+
+ PBE
+
+
+ true
+ false
+ false
+
+
+ gaussian
+ 0.000000000000000e0
+ smearing
+
+
+ false
+ 1.000000000000000e1
+ 5.000000000000000e1
+
+
+ davidson
+ plain
+ 3.000000000000000e-1
+ 5.000000000000000e-9
+ 8
+ 100
+ false
+ false
+ false
+ false
+ 0.000000000000000e0
+ false
+ 20
+ 20
+
+
+ Monkhorst-Pack
+
+
+ bfgs
+ 1.000000000000000e2
+ false
+ false
+
+ 1
+ 1.000000000000000e-4
+ 8.000000000000000e-1
+ 5.000000000000000e-1
+ 1.000000000000000e-2
+ 5.000000000000000e-1
+
+
+
+ none
+ 0.000000000000000e0
+ 2.756043328244409e3
+ 0.000000000000000e0
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ 1 0 0
+ 0 0 0
+ 1 0 0
+
+
+
+ 0
+
+
+ 1.034973800000000e1
+ 1.115338492393494e1
+
+
+ 8.266386000000001e0
+ 8.398051500320435e0
+
+
+
+
diff --git a/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida_3/PW.out b/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida_3/PW.out
new file mode 100644
index 000000000..414cb5ace
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_first_step_interrupted/aiida_3/PW.out
@@ -0,0 +1,11 @@
+
+ coordinates at iteration 0
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
diff --git a/tests/parsers/fixtures/neb/failed_images_not_divisor_of_nproc/aiida.out b/tests/parsers/fixtures/neb/failed_images_not_divisor_of_nproc/aiida.out
new file mode 100644
index 000000000..025b2c4e2
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_images_not_divisor_of_nproc/aiida.out
@@ -0,0 +1,7 @@
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Error in routine mp_start_images (1):
+ n. of images must be divisor of nproc
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ stopping ...
diff --git a/tests/parsers/fixtures/neb/failed_interrupted/aiida.dat b/tests/parsers/fixtures/neb/failed_interrupted/aiida.dat
new file mode 100644
index 000000000..5494a7e9a
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_interrupted/aiida.dat
@@ -0,0 +1,3 @@
+ 0.0000000000 0.0000000000 2.4196735479
+ 0.5000000000 -0.2846843152 0.0378546205
+ 1.0000000000 -0.0000000001 2.1764156108
diff --git a/tests/parsers/fixtures/neb/failed_interrupted/aiida.int b/tests/parsers/fixtures/neb/failed_interrupted/aiida.int
new file mode 100644
index 000000000..1f55e45b7
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_interrupted/aiida.int
@@ -0,0 +1,11 @@
+ 0.0000000000 0.0000000000
+ 0.1000000000 -0.0296071688
+ 0.2000000000 -0.1002088789
+ 0.3000000000 -0.1844754362
+ 0.4000000000 -0.2550771464
+ 0.5000000000 -0.2846843152
+ 0.6000000000 -0.2550771464
+ 0.7000000000 -0.1844754362
+ 0.8000000000 -0.1002088790
+ 0.9000000000 -0.0296071688
+ 1.0000000000 -0.0000000001
diff --git a/tests/parsers/fixtures/neb/failed_interrupted/aiida.out b/tests/parsers/fixtures/neb/failed_interrupted/aiida.out
new file mode 100644
index 000000000..80ae3c4c2
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_interrupted/aiida.out
@@ -0,0 +1,305 @@
+
+ Program NEB v.6.4.1 starts on 9Sep2019 at 21: 3:57
+
+ This program is part of the open-source Quantum ESPRESSO suite
+ for quantum simulation of materials; please cite
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 21 395502 (2009);
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 29 465901 (2017);
+ URL http://www.quantum-espresso.org",
+ in publications or presentations arising from this work. More details at
+ http://www.quantum-espresso.org/quote
+
+ Parallel version (MPI), running on 1 processors
+
+ MPI processes distributed on 1 nodes
+
+ No input file found, assuming nothing to parse
+ Searching argument -input_images or --input_images
+ Reading input from pw_1.in
+ Reading input from pw_2.in
+
+ initial path length = 4.2553 bohr
+ initial inter-image distance = 2.1276 bohr
+
+ string_method = neb
+ restart_mode = from_scratch
+ opt_scheme = broyden
+ num_of_images = 3
+ nstep_path = 20
+ CI_scheme = auto
+ first_last_opt = F
+ use_freezing = F
+ ds = 2.0000 a.u.
+ k_max = 0.3000 a.u.
+ k_min = 0.2000 a.u.
+ suggested k_max = 0.1542 a.u.
+ suggested k_min = 0.1028 a.u.
+ path_thr = 0.0500 eV / A
+
+ ------------------------------ iteration 1 ------------------------------
+
+ tcpu = 0.2 self-consistency for image 1
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 0.9 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 1.8 self-consistency for image 3
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.487921 eV
+ activation energy (<-) = 2.487921 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.1363465 2.305560 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.255 bohr
+ inter-image distance = 2.128 bohr
+
+ ------------------------------ iteration 2 ------------------------------
+
+ tcpu = 2.6 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.035025 eV
+ activation energy (<-) = 2.035025 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.5892425 2.460480 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.285 bohr
+ inter-image distance = 2.143 bohr
+
+ ------------------------------ iteration 3 ------------------------------
+
+ tcpu = 3.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 1.525016 eV
+ activation energy (<-) = 1.525016 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -43.0992523 2.556790 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.383 bohr
+ inter-image distance = 2.191 bohr
+
+ ------------------------------ iteration 4 ------------------------------
+
+ tcpu = 4.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.447076 eV
+ activation energy (<-) = 0.447076 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.1771919 2.253546 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.796 bohr
+ inter-image distance = 2.398 bohr
+
+ ------------------------------ iteration 5 ------------------------------
+
+ tcpu = 5.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 3.249031 T
+ 2 -44.8839649 0.577080 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.454 bohr
+ inter-image distance = 2.727 bohr
+
+ ------------------------------ iteration 6 ------------------------------
+
+ tcpu = 6.1 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.396607 eV
+ activation energy (<-) = 0.396607 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.2276605 4.438232 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 6.275 bohr
+ inter-image distance = 3.137 bohr
+
+ ------------------------------ iteration 7 ------------------------------
+
+ tcpu = 7.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.844563 T
+ 2 -44.9016945 0.317440 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.520 bohr
+ inter-image distance = 2.760 bohr
+
+ ------------------------------ iteration 8 ------------------------------
+
+ tcpu = 7.7 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.749293 T
+ 2 -44.9043340 0.258570 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.536 bohr
+ inter-image distance = 2.768 bohr
+
+ ------------------------------ iteration 9 ------------------------------
+
+ tcpu = 8.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.685185 T
+ 2 -44.9057771 0.215664 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.546 bohr
+ inter-image distance = 2.773 bohr
+
+ ------------------------------ iteration 10 ------------------------------
+
+ tcpu = 8.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.639147 T
+ 2 -44.9066490 0.185069 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.554 bohr
+ inter-image distance = 2.777 bohr
+
+ ------------------------------ iteration 11 ------------------------------
+
+ tcpu = 9.4 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.180484 T
+ 2 -44.9079701 0.126805 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.628 bohr
+ inter-image distance = 2.814 bohr
+
+ ------------------------------ iteration 12 ------------------------------
+
+ tcpu = 10.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.586315 T
+ 2 -44.9074826 0.149493 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.562 bohr
+ inter-image distance = 2.781 bohr
+
+ ------------------------------ iteration 13 ------------------------------
+
+ tcpu = 10.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.419674 T
+ 2 -44.9089522 0.037855 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.589 bohr
+ inter-image distance = 2.795 bohr
+
+ ---------------------------------------------------------------------------
diff --git a/tests/parsers/fixtures/neb/failed_interrupted/aiida.path b/tests/parsers/fixtures/neb/failed_interrupted/aiida.path
new file mode 100644
index 000000000..6b891b487
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_interrupted/aiida.path
@@ -0,0 +1,22 @@
+RESTART INFORMATION
+ 13
+ 20
+ 0
+NUMBER OF IMAGES
+ 3
+ENERGIES, POSITIONS AND GRADIENTS
+Image: 1
+ -1.6399117415
+ -4.566700090012 0.000000000000 0.000000000000 -0.000384669442 -0.000000000000 -0.000000000000 1 0 0
+ 0.000000000000 0.000000000000 0.000000000000 -0.000000000000 -0.000000000000 -0.000000000000 0 0 0
+ 1.557766760017 0.000000000000 0.000000000000 0.042324797747 -0.000000000000 -0.000000000000 1 0 0
+Image: 2
+ -1.6503736981
+ -1.781001759286 0.000000000000 0.000000000000 -0.000736155225 -0.000000000000 -0.000000000000
+ 0.000000000000 0.000000000000 0.000000000000 -0.000000000000 -0.000000000000 -0.000000000000
+ 1.781001759285 0.000000000000 0.000000000000 0.000736155225 -0.000000000000 -0.000000000000
+Image: 3
+ -1.6399117415
+ -1.557766760017 0.000000000000 0.000000000000 -0.042324548563 -0.000000000000 -0.000000000000
+ 0.000000000000 0.000000000000 0.000000000000 0.000000000000 -0.000000000000 -0.000000000000
+ 4.566700090012 0.000000000000 0.000000000000 0.000384670746 -0.000000000000 -0.000000000000
diff --git a/tests/parsers/fixtures/neb/failed_interrupted/aiida_1/PW.out b/tests/parsers/fixtures/neb/failed_interrupted/aiida_1/PW.out
new file mode 100644
index 000000000..414cb5ace
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_interrupted/aiida_1/PW.out
@@ -0,0 +1,11 @@
+
+ coordinates at iteration 0
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
diff --git a/tests/parsers/fixtures/neb/failed_interrupted/aiida_1/aiida.save/data-file-schema.xml b/tests/parsers/fixtures/neb/failed_interrupted/aiida_1/aiida.save/data-file-schema.xml
new file mode 100644
index 000000000..38cc762a6
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_interrupted/aiida_1/aiida.save/data-file-schema.xml
@@ -0,0 +1,489 @@
+
+
+
+
+ QEXSD_19.03
+ XML file generated by PWSCF
+ This run was terminated on: 21: 3:58 9 Sep 2019
+
+
+
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+ relax
+ from_scratch
+ aiida
+ ./pseudo/
+ ./out/
+ false
+ false
+ true
+ low
+ 10000000
+ 50
+ 5.000000000000000e-5
+ 5.000000000000000e-4
+ 5.000000000000000e-1
+ high
+ 100000
+
+
+
+ 1.007940000000000e0
+ H.pbe-rrkjus_psl.1.0.0.UPF
+ 5.000000000000000e-1
+
+
+
+
+ -1.557766760016841e0 0.000000000000000e0 0.000000000000000e0
+ 0.000000000000000e0 0.000000000000000e0 0.000000000000000e0
+ 4.566700090011524e0 0.000000000000000e0 0.000000000000000e0
+
+
+ 1.200000000003780e1 0.000000000000000e0 0.000000000000000e0
+ 0.000000000000000e0 4.999999999905514e0 0.000000000000000e0
+ 0.000000000000000e0 0.000000000000000e0 4.999999999905514e0
+ |
+
+
+ PBE
+
+
+ true
+ false
+ false
+
+
+ gaussian
+ 0.000000000000000e0
+ smearing
+
+
+ false
+ 1.000000000000000e1
+ 5.000000000000000e1
+
+
+ davidson
+ plain
+ 3.000000000000000e-1
+ 5.000000000000000e-9
+ 8
+ 100
+ false
+ false
+ false
+ false
+ 0.000000000000000e0
+ false
+ 20
+ 20
+
+
+ Monkhorst-Pack
+
+
+ bfgs
+ 1.000000000000000e2
+ false
+ false
+
+ 1
+ 1.000000000000000e-4
+ 8.000000000000000e-1
+ 5.000000000000000e-1
+ 1.000000000000000e-2
+ 5.000000000000000e-1
+
+
+
+ none
+ 0.000000000000000e0
+ 2.756043328244409e3
+ 0.000000000000000e0
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ 1 0 0
+ 0 0 0
+ 1 0 0
+
+
+
+ 0
+
+
+ 7.039320000000000e-1
+ 7.156929969787598e-1
+
+
+ 5.901860000000001e-1
+ 6.019501686096191e-1
+
+
+
+
diff --git a/tests/parsers/fixtures/neb/failed_interrupted/aiida_2/PW.out b/tests/parsers/fixtures/neb/failed_interrupted/aiida_2/PW.out
new file mode 100644
index 000000000..2ac5fd328
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_interrupted/aiida_2/PW.out
@@ -0,0 +1,124 @@
+
+ coordinates at iteration 0
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ iteration # 10 ecut= 20.00 Ry beta= 0.30
+ iteration # 11 ecut= 20.00 Ry beta= 0.30
+ iteration # 12 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 1
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ iteration # 10 ecut= 20.00 Ry beta= 0.30
+ iteration # 11 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 2
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ iteration # 10 ecut= 20.00 Ry beta= 0.30
+ iteration # 11 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 3
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ iteration # 10 ecut= 20.00 Ry beta= 0.30
+ iteration # 11 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 4
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ iteration # 10 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 5
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 6
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 7
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 8
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 9
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 10
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 11
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ coordinates at iteration 12
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
diff --git a/tests/parsers/fixtures/neb/failed_interrupted/aiida_2/aiida.save/data-file-schema.xml b/tests/parsers/fixtures/neb/failed_interrupted/aiida_2/aiida.save/data-file-schema.xml
new file mode 100644
index 000000000..571c0cc11
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_interrupted/aiida_2/aiida.save/data-file-schema.xml
@@ -0,0 +1,521 @@
+
+
+
+
+ QEXSD_19.03
+ XML file generated by PWSCF
+ This run was terminated on: 21: 4: 8 9 Sep 2019
+
+
+
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+ relax
+ from_scratch
+ aiida
+ ./pseudo/
+ ./out/
+ false
+ false
+ true
+ low
+ 10000000
+ 50
+ 5.000000000000000e-5
+ 5.000000000000000e-4
+ 5.000000000000000e-1
+ high
+ 100000
+
+
+
+ 1.007940000000000e0
+ H.pbe-rrkjus_psl.1.0.0.UPF
+ 5.000000000000000e-1
+
+
+
+
+ -1.557766760016841e0 0.000000000000000e0 0.000000000000000e0
+ 0.000000000000000e0 0.000000000000000e0 0.000000000000000e0
+ 4.566700090011524e0 0.000000000000000e0 0.000000000000000e0
+
+
+ 1.200000000003780e1 0.000000000000000e0 0.000000000000000e0
+ 0.000000000000000e0 4.999999999905514e0 0.000000000000000e0
+ 0.000000000000000e0 0.000000000000000e0 4.999999999905514e0
+ |
+
+
+ PBE
+
+
+ true
+ false
+ false
+
+
+ gaussian
+ 0.000000000000000e0
+ smearing
+
+
+ false
+ 1.000000000000000e1
+ 5.000000000000000e1
+
+
+ davidson
+ plain
+ 3.000000000000000e-1
+ 5.000000000000000e-9
+ 8
+ 100
+ false
+ false
+ false
+ false
+ 0.000000000000000e0
+ false
+ 20
+ 20
+
+
+ Monkhorst-Pack
+
+
+ bfgs
+ 1.000000000000000e2
+ false
+ false
+
+ 1
+ 1.000000000000000e-4
+ 8.000000000000000e-1
+ 5.000000000000000e-1
+ 1.000000000000000e-2
+ 5.000000000000000e-1
+
+
+
+ none
+ 0.000000000000000e0
+ 2.756043328244409e3
+ 0.000000000000000e0
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ 1 0 0
+ 0 0 0
+ 1 0 0
+
+
+
+ 0
+
+
+ 1.034973800000000e1
+ 1.115338492393494e1
+
+
+ 8.266386000000001e0
+ 8.398051500320435e0
+
+
+
+
diff --git a/tests/parsers/fixtures/neb/failed_interrupted/aiida_3/PW.out b/tests/parsers/fixtures/neb/failed_interrupted/aiida_3/PW.out
new file mode 100644
index 000000000..414cb5ace
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_interrupted/aiida_3/PW.out
@@ -0,0 +1,11 @@
+
+ coordinates at iteration 0
+ iteration # 1 ecut= 20.00 Ry beta= 0.30
+ iteration # 2 ecut= 20.00 Ry beta= 0.30
+ iteration # 3 ecut= 20.00 Ry beta= 0.30
+ iteration # 4 ecut= 20.00 Ry beta= 0.30
+ iteration # 5 ecut= 20.00 Ry beta= 0.30
+ iteration # 6 ecut= 20.00 Ry beta= 0.30
+ iteration # 7 ecut= 20.00 Ry beta= 0.30
+ iteration # 8 ecut= 20.00 Ry beta= 0.30
+ iteration # 9 ecut= 20.00 Ry beta= 0.30
diff --git a/tests/parsers/fixtures/neb/failed_interrupted/aiida_3/aiida.save/data-file-schema.xml b/tests/parsers/fixtures/neb/failed_interrupted/aiida_3/aiida.save/data-file-schema.xml
new file mode 100644
index 000000000..643e413bc
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_interrupted/aiida_3/aiida.save/data-file-schema.xml
@@ -0,0 +1,489 @@
+
+
+
+
+ QEXSD_19.03
+ XML file generated by PWSCF
+ This run was terminated on: 21: 4: 0 9 Sep 2019
+
+
+
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+ relax
+ from_scratch
+ aiida
+ ./pseudo/
+ ./out/
+ false
+ false
+ true
+ low
+ 10000000
+ 50
+ 5.000000000000000e-5
+ 5.000000000000000e-4
+ 5.000000000000000e-1
+ high
+ 100000
+
+
+
+ 1.007940000000000e0
+ H.pbe-rrkjus_psl.1.0.0.UPF
+ 5.000000000000000e-1
+
+
+
+
+ -1.557766760016841e0 0.000000000000000e0 0.000000000000000e0
+ 0.000000000000000e0 0.000000000000000e0 0.000000000000000e0
+ 4.566700090011524e0 0.000000000000000e0 0.000000000000000e0
+
+
+ 1.200000000003780e1 0.000000000000000e0 0.000000000000000e0
+ 0.000000000000000e0 4.999999999905514e0 0.000000000000000e0
+ 0.000000000000000e0 0.000000000000000e0 4.999999999905514e0
+ |
+
+
+ PBE
+
+
+ true
+ false
+ false
+
+
+ gaussian
+ 0.000000000000000e0
+ smearing
+
+
+ false
+ 1.000000000000000e1
+ 5.000000000000000e1
+
+
+ davidson
+ plain
+ 3.000000000000000e-1
+ 5.000000000000000e-9
+ 8
+ 100
+ false
+ false
+ false
+ false
+ 0.000000000000000e0
+ false
+ 20
+ 20
+
+
+ Monkhorst-Pack
+
+
+ bfgs
+ 1.000000000000000e2
+ false
+ false
+
+ 1
+ 1.000000000000000e-4
+ 8.000000000000000e-1
+ 5.000000000000000e-1
+ 1.000000000000000e-2
+ 5.000000000000000e-1
+
+
+
+ none
+ 0.000000000000000e0
+ 2.756043328244409e3
+ 0.000000000000000e0
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ 1 0 0
+ 0 0 0
+ 1 0 0
+
+
+
+ 0
+
+
+ 2.349583000000000e0
+ 2.380792856216431e0
+
+
+ 2.020140000000000e0
+ 2.051357030868530e0
+
+
+
+
diff --git a/tests/parsers/fixtures/neb/failed_nimage_higher_than_images/aiida.out b/tests/parsers/fixtures/neb/failed_nimage_higher_than_images/aiida.out
new file mode 100644
index 000000000..875b50faf
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_nimage_higher_than_images/aiida.out
@@ -0,0 +1,7 @@
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Error in routine initialize_path (1):
+ nimage is larger than the available number of images
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ stopping ...
\ No newline at end of file
diff --git a/tests/parsers/fixtures/neb/failed_nimage_higher_than_nproc/aiida.out b/tests/parsers/fixtures/neb/failed_nimage_higher_than_nproc/aiida.out
new file mode 100644
index 000000000..d34aa8310
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_nimage_higher_than_nproc/aiida.out
@@ -0,0 +1,7 @@
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Error in routine mp_start_images (1):
+ invalid number of images, out of range
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ stopping ...
diff --git a/tests/parsers/fixtures/neb/failed_nimage_not_divisor_of_nproc/aiida.out b/tests/parsers/fixtures/neb/failed_nimage_not_divisor_of_nproc/aiida.out
new file mode 100644
index 000000000..b48eb8d81
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_nimage_not_divisor_of_nproc/aiida.out
@@ -0,0 +1,7 @@
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Error in routine mp_start_images (1):
+ n. of images must be divisor of nproc
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ stopping ...
\ No newline at end of file
diff --git a/tests/parsers/fixtures/neb/failed_npools_too_high/aiida.out b/tests/parsers/fixtures/neb/failed_npools_too_high/aiida.out
new file mode 100644
index 000000000..06c0783f8
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_npools_too_high/aiida.out
@@ -0,0 +1,57 @@
+
+ Program NEB v.7.4.1 starts on 17Oct2025 at 18:11:44
+
+ This program is part of the open-source Quantum ESPRESSO suite
+ for quantum simulation of materials; please cite
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 21 395502 (2009);
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 29 465901 (2017);
+ "P. Giannozzi et al., J. Chem. Phys. 152 154105 (2020);
+ URL http://www.quantum-espresso.org",
+ in publications or presentations arising from this work. More details at
+ http://www.quantum-espresso.org/quote
+
+ Parallel version (MPI), running on 1 processors
+
+ MPI processes distributed on 1 nodes
+ 13732 MiB available memory on the printing compute node when the environment starts
+
+
+ No input file found, assuming nothing to parse
+ Searching argument -input_images or --input_images
+ Reading input from pw_1.in
+ Reading input from pw_2.in
+
+ File ./out/aiida_1/PW.out deleted, as requested
+
+ File ./out/aiida_7/PW.out deleted, as requested
+
+ initial path length = 4.2553 bohr
+ initial inter-image distance = 0.7092 bohr
+
+ string_method = neb
+ restart_mode = from_scratch
+ opt_scheme = broyden
+ num_of_images = 7
+ nstep_path = 100
+ CI_scheme = auto
+ first_last_opt = F
+ use_freezing = F
+ ds = 2.0000 a.u.
+ k_max = 0.3000 a.u.
+ k_min = 0.2000 a.u.
+ suggested k_max = 0.1542 a.u.
+ suggested k_min = 0.1028 a.u.
+ path_thr = 0.1000 eV / A
+
+ ------------------------------ iteration 1 ------------------------------
+
+ tcpu = 0.0 self-consistency for image 1
+ Message from routine setup:
+ using ibrav=0 with symmetry is DISCOURAGED, use correct ibrav instead
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Error in routine mp_start_pools (1):
+ invalid number of pools, out of range
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ stopping ...
diff --git a/tests/parsers/fixtures/neb/failed_qr_failed/aiida.out b/tests/parsers/fixtures/neb/failed_qr_failed/aiida.out
new file mode 100644
index 000000000..e9ee33d58
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_qr_failed/aiida.out
@@ -0,0 +1,317 @@
+
+ Program NEB v.6.4.1 starts on 9Sep2019 at 21: 3:57
+
+ This program is part of the open-source Quantum ESPRESSO suite
+ for quantum simulation of materials; please cite
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 21 395502 (2009);
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 29 465901 (2017);
+ URL http://www.quantum-espresso.org",
+ in publications or presentations arising from this work. More details at
+ http://www.quantum-espresso.org/quote
+
+ Parallel version (MPI), running on 1 processors
+
+ MPI processes distributed on 1 nodes
+
+ No input file found, assuming nothing to parse
+ Searching argument -input_images or --input_images
+ Reading input from pw_1.in
+ Reading input from pw_2.in
+
+ initial path length = 4.2553 bohr
+ initial inter-image distance = 2.1276 bohr
+
+ string_method = neb
+ restart_mode = from_scratch
+ opt_scheme = broyden
+ num_of_images = 3
+ nstep_path = 20
+ CI_scheme = auto
+ first_last_opt = F
+ use_freezing = F
+ ds = 2.0000 a.u.
+ k_max = 0.3000 a.u.
+ k_min = 0.2000 a.u.
+ suggested k_max = 0.1542 a.u.
+ suggested k_min = 0.1028 a.u.
+ path_thr = 0.0500 eV / A
+
+ ------------------------------ iteration 1 ------------------------------
+
+ tcpu = 0.2 self-consistency for image 1
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 0.9 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 1.8 self-consistency for image 3
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.487921 eV
+ activation energy (<-) = 2.487921 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.1363465 2.305560 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.255 bohr
+ inter-image distance = 2.128 bohr
+
+ ------------------------------ iteration 2 ------------------------------
+
+ tcpu = 2.6 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.035025 eV
+ activation energy (<-) = 2.035025 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.5892425 2.460480 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.285 bohr
+ inter-image distance = 2.143 bohr
+
+ ------------------------------ iteration 3 ------------------------------
+
+ tcpu = 3.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 1.525016 eV
+ activation energy (<-) = 1.525016 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -43.0992523 2.556790 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.383 bohr
+ inter-image distance = 2.191 bohr
+
+ ------------------------------ iteration 4 ------------------------------
+
+ tcpu = 4.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.447076 eV
+ activation energy (<-) = 0.447076 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.1771919 2.253546 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.796 bohr
+ inter-image distance = 2.398 bohr
+
+ ------------------------------ iteration 5 ------------------------------
+
+ tcpu = 5.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 3.249031 T
+ 2 -44.8839649 0.577080 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.454 bohr
+ inter-image distance = 2.727 bohr
+
+ ------------------------------ iteration 6 ------------------------------
+
+ tcpu = 6.1 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.396607 eV
+ activation energy (<-) = 0.396607 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.2276605 4.438232 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 6.275 bohr
+ inter-image distance = 3.137 bohr
+
+ ------------------------------ iteration 7 ------------------------------
+
+ tcpu = 7.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.844563 T
+ 2 -44.9016945 0.317440 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.520 bohr
+ inter-image distance = 2.760 bohr
+
+ ------------------------------ iteration 8 ------------------------------
+
+ tcpu = 7.7 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.749293 T
+ 2 -44.9043340 0.258570 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.536 bohr
+ inter-image distance = 2.768 bohr
+
+ ------------------------------ iteration 9 ------------------------------
+
+ tcpu = 8.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.685185 T
+ 2 -44.9057771 0.215664 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.546 bohr
+ inter-image distance = 2.773 bohr
+
+ ------------------------------ iteration 10 ------------------------------
+
+ tcpu = 8.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.639147 T
+ 2 -44.9066490 0.185069 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.554 bohr
+ inter-image distance = 2.777 bohr
+
+ ------------------------------ iteration 11 ------------------------------
+
+ tcpu = 9.4 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.180484 T
+ 2 -44.9079701 0.126805 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.628 bohr
+ inter-image distance = 2.814 bohr
+
+ ------------------------------ iteration 12 ------------------------------
+
+ tcpu = 10.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.586315 T
+ 2 -44.9074826 0.149493 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.562 bohr
+ inter-image distance = 2.781 bohr
+
+ ------------------------------ iteration 13 ------------------------------
+
+ tcpu = 10.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.419674 T
+ 2 -44.9089522 0.037855 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.589 bohr
+ inter-image distance = 2.795 bohr
+
+ ---------------------------------------------------------------------------
+
+
+ neb: convergence achieved in 13 iterations
+
+ NEB : 10.54s CPU 11.44s WALL
+
+
+ This run was terminated on: 21: 4: 8 9Sep2019
+
+=------------------------------------------------------------------------------=
+ JOB DONE.
+=------------------------------------------------------------------------------=
diff --git a/tests/parsers/fixtures/neb/failed_qr_failed/aiida_1/PW.out b/tests/parsers/fixtures/neb/failed_qr_failed/aiida_1/PW.out
new file mode 100644
index 000000000..569c5991a
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_qr_failed/aiida_1/PW.out
@@ -0,0 +1,3 @@
+# NOTE: lines of output removed
+ [Q, R] = qr(X, 0) failed
+# NOTE: lines of output removed
diff --git a/tests/parsers/fixtures/neb/failed_s_matrix_not_positive_definite/aiida.out b/tests/parsers/fixtures/neb/failed_s_matrix_not_positive_definite/aiida.out
new file mode 100644
index 000000000..e9ee33d58
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_s_matrix_not_positive_definite/aiida.out
@@ -0,0 +1,317 @@
+
+ Program NEB v.6.4.1 starts on 9Sep2019 at 21: 3:57
+
+ This program is part of the open-source Quantum ESPRESSO suite
+ for quantum simulation of materials; please cite
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 21 395502 (2009);
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 29 465901 (2017);
+ URL http://www.quantum-espresso.org",
+ in publications or presentations arising from this work. More details at
+ http://www.quantum-espresso.org/quote
+
+ Parallel version (MPI), running on 1 processors
+
+ MPI processes distributed on 1 nodes
+
+ No input file found, assuming nothing to parse
+ Searching argument -input_images or --input_images
+ Reading input from pw_1.in
+ Reading input from pw_2.in
+
+ initial path length = 4.2553 bohr
+ initial inter-image distance = 2.1276 bohr
+
+ string_method = neb
+ restart_mode = from_scratch
+ opt_scheme = broyden
+ num_of_images = 3
+ nstep_path = 20
+ CI_scheme = auto
+ first_last_opt = F
+ use_freezing = F
+ ds = 2.0000 a.u.
+ k_max = 0.3000 a.u.
+ k_min = 0.2000 a.u.
+ suggested k_max = 0.1542 a.u.
+ suggested k_min = 0.1028 a.u.
+ path_thr = 0.0500 eV / A
+
+ ------------------------------ iteration 1 ------------------------------
+
+ tcpu = 0.2 self-consistency for image 1
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 0.9 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 1.8 self-consistency for image 3
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.487921 eV
+ activation energy (<-) = 2.487921 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.1363465 2.305560 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.255 bohr
+ inter-image distance = 2.128 bohr
+
+ ------------------------------ iteration 2 ------------------------------
+
+ tcpu = 2.6 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.035025 eV
+ activation energy (<-) = 2.035025 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.5892425 2.460480 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.285 bohr
+ inter-image distance = 2.143 bohr
+
+ ------------------------------ iteration 3 ------------------------------
+
+ tcpu = 3.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 1.525016 eV
+ activation energy (<-) = 1.525016 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -43.0992523 2.556790 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.383 bohr
+ inter-image distance = 2.191 bohr
+
+ ------------------------------ iteration 4 ------------------------------
+
+ tcpu = 4.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.447076 eV
+ activation energy (<-) = 0.447076 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.1771919 2.253546 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.796 bohr
+ inter-image distance = 2.398 bohr
+
+ ------------------------------ iteration 5 ------------------------------
+
+ tcpu = 5.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 3.249031 T
+ 2 -44.8839649 0.577080 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.454 bohr
+ inter-image distance = 2.727 bohr
+
+ ------------------------------ iteration 6 ------------------------------
+
+ tcpu = 6.1 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.396607 eV
+ activation energy (<-) = 0.396607 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.2276605 4.438232 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 6.275 bohr
+ inter-image distance = 3.137 bohr
+
+ ------------------------------ iteration 7 ------------------------------
+
+ tcpu = 7.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.844563 T
+ 2 -44.9016945 0.317440 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.520 bohr
+ inter-image distance = 2.760 bohr
+
+ ------------------------------ iteration 8 ------------------------------
+
+ tcpu = 7.7 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.749293 T
+ 2 -44.9043340 0.258570 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.536 bohr
+ inter-image distance = 2.768 bohr
+
+ ------------------------------ iteration 9 ------------------------------
+
+ tcpu = 8.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.685185 T
+ 2 -44.9057771 0.215664 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.546 bohr
+ inter-image distance = 2.773 bohr
+
+ ------------------------------ iteration 10 ------------------------------
+
+ tcpu = 8.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.639147 T
+ 2 -44.9066490 0.185069 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.554 bohr
+ inter-image distance = 2.777 bohr
+
+ ------------------------------ iteration 11 ------------------------------
+
+ tcpu = 9.4 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.180484 T
+ 2 -44.9079701 0.126805 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.628 bohr
+ inter-image distance = 2.814 bohr
+
+ ------------------------------ iteration 12 ------------------------------
+
+ tcpu = 10.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.586315 T
+ 2 -44.9074826 0.149493 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.562 bohr
+ inter-image distance = 2.781 bohr
+
+ ------------------------------ iteration 13 ------------------------------
+
+ tcpu = 10.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.419674 T
+ 2 -44.9089522 0.037855 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.589 bohr
+ inter-image distance = 2.795 bohr
+
+ ---------------------------------------------------------------------------
+
+
+ neb: convergence achieved in 13 iterations
+
+ NEB : 10.54s CPU 11.44s WALL
+
+
+ This run was terminated on: 21: 4: 8 9Sep2019
+
+=------------------------------------------------------------------------------=
+ JOB DONE.
+=------------------------------------------------------------------------------=
diff --git a/tests/parsers/fixtures/neb/failed_s_matrix_not_positive_definite/aiida_1/PW.out b/tests/parsers/fixtures/neb/failed_s_matrix_not_positive_definite/aiida_1/PW.out
new file mode 100644
index 000000000..3f01d0d56
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_s_matrix_not_positive_definite/aiida_1/PW.out
@@ -0,0 +1,6 @@
+# NOTE: lines of output removed
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Error in routine cdiaghg (286):
+ S matrix not positive definite
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+# NOTE: lines of output removed
diff --git a/tests/parsers/fixtures/neb/failed_too_many_bands_not_converged/aiida.out b/tests/parsers/fixtures/neb/failed_too_many_bands_not_converged/aiida.out
new file mode 100644
index 000000000..e9ee33d58
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_too_many_bands_not_converged/aiida.out
@@ -0,0 +1,317 @@
+
+ Program NEB v.6.4.1 starts on 9Sep2019 at 21: 3:57
+
+ This program is part of the open-source Quantum ESPRESSO suite
+ for quantum simulation of materials; please cite
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 21 395502 (2009);
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 29 465901 (2017);
+ URL http://www.quantum-espresso.org",
+ in publications or presentations arising from this work. More details at
+ http://www.quantum-espresso.org/quote
+
+ Parallel version (MPI), running on 1 processors
+
+ MPI processes distributed on 1 nodes
+
+ No input file found, assuming nothing to parse
+ Searching argument -input_images or --input_images
+ Reading input from pw_1.in
+ Reading input from pw_2.in
+
+ initial path length = 4.2553 bohr
+ initial inter-image distance = 2.1276 bohr
+
+ string_method = neb
+ restart_mode = from_scratch
+ opt_scheme = broyden
+ num_of_images = 3
+ nstep_path = 20
+ CI_scheme = auto
+ first_last_opt = F
+ use_freezing = F
+ ds = 2.0000 a.u.
+ k_max = 0.3000 a.u.
+ k_min = 0.2000 a.u.
+ suggested k_max = 0.1542 a.u.
+ suggested k_min = 0.1028 a.u.
+ path_thr = 0.0500 eV / A
+
+ ------------------------------ iteration 1 ------------------------------
+
+ tcpu = 0.2 self-consistency for image 1
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 0.9 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 1.8 self-consistency for image 3
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.487921 eV
+ activation energy (<-) = 2.487921 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.1363465 2.305560 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.255 bohr
+ inter-image distance = 2.128 bohr
+
+ ------------------------------ iteration 2 ------------------------------
+
+ tcpu = 2.6 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.035025 eV
+ activation energy (<-) = 2.035025 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.5892425 2.460480 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.285 bohr
+ inter-image distance = 2.143 bohr
+
+ ------------------------------ iteration 3 ------------------------------
+
+ tcpu = 3.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 1.525016 eV
+ activation energy (<-) = 1.525016 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -43.0992523 2.556790 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.383 bohr
+ inter-image distance = 2.191 bohr
+
+ ------------------------------ iteration 4 ------------------------------
+
+ tcpu = 4.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.447076 eV
+ activation energy (<-) = 0.447076 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.1771919 2.253546 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.796 bohr
+ inter-image distance = 2.398 bohr
+
+ ------------------------------ iteration 5 ------------------------------
+
+ tcpu = 5.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 3.249031 T
+ 2 -44.8839649 0.577080 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.454 bohr
+ inter-image distance = 2.727 bohr
+
+ ------------------------------ iteration 6 ------------------------------
+
+ tcpu = 6.1 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.396607 eV
+ activation energy (<-) = 0.396607 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.2276605 4.438232 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 6.275 bohr
+ inter-image distance = 3.137 bohr
+
+ ------------------------------ iteration 7 ------------------------------
+
+ tcpu = 7.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.844563 T
+ 2 -44.9016945 0.317440 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.520 bohr
+ inter-image distance = 2.760 bohr
+
+ ------------------------------ iteration 8 ------------------------------
+
+ tcpu = 7.7 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.749293 T
+ 2 -44.9043340 0.258570 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.536 bohr
+ inter-image distance = 2.768 bohr
+
+ ------------------------------ iteration 9 ------------------------------
+
+ tcpu = 8.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.685185 T
+ 2 -44.9057771 0.215664 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.546 bohr
+ inter-image distance = 2.773 bohr
+
+ ------------------------------ iteration 10 ------------------------------
+
+ tcpu = 8.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.639147 T
+ 2 -44.9066490 0.185069 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.554 bohr
+ inter-image distance = 2.777 bohr
+
+ ------------------------------ iteration 11 ------------------------------
+
+ tcpu = 9.4 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.180484 T
+ 2 -44.9079701 0.126805 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.628 bohr
+ inter-image distance = 2.814 bohr
+
+ ------------------------------ iteration 12 ------------------------------
+
+ tcpu = 10.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.586315 T
+ 2 -44.9074826 0.149493 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.562 bohr
+ inter-image distance = 2.781 bohr
+
+ ------------------------------ iteration 13 ------------------------------
+
+ tcpu = 10.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.419674 T
+ 2 -44.9089522 0.037855 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.589 bohr
+ inter-image distance = 2.795 bohr
+
+ ---------------------------------------------------------------------------
+
+
+ neb: convergence achieved in 13 iterations
+
+ NEB : 10.54s CPU 11.44s WALL
+
+
+ This run was terminated on: 21: 4: 8 9Sep2019
+
+=------------------------------------------------------------------------------=
+ JOB DONE.
+=------------------------------------------------------------------------------=
diff --git a/tests/parsers/fixtures/neb/failed_too_many_bands_not_converged/aiida_1/PW.out b/tests/parsers/fixtures/neb/failed_too_many_bands_not_converged/aiida_1/PW.out
new file mode 100644
index 000000000..54dfb3b72
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_too_many_bands_not_converged/aiida_1/PW.out
@@ -0,0 +1,8 @@
+# NOTE: lines of output removed.
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Error in routine c_bands (1):
+ too many bands are not converged
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+# NOTE: lines of output removed.
diff --git a/tests/parsers/fixtures/neb/failed_zhegvd_failed/aiida.out b/tests/parsers/fixtures/neb/failed_zhegvd_failed/aiida.out
new file mode 100644
index 000000000..e9ee33d58
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_zhegvd_failed/aiida.out
@@ -0,0 +1,317 @@
+
+ Program NEB v.6.4.1 starts on 9Sep2019 at 21: 3:57
+
+ This program is part of the open-source Quantum ESPRESSO suite
+ for quantum simulation of materials; please cite
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 21 395502 (2009);
+ "P. Giannozzi et al., J. Phys.:Condens. Matter 29 465901 (2017);
+ URL http://www.quantum-espresso.org",
+ in publications or presentations arising from this work. More details at
+ http://www.quantum-espresso.org/quote
+
+ Parallel version (MPI), running on 1 processors
+
+ MPI processes distributed on 1 nodes
+
+ No input file found, assuming nothing to parse
+ Searching argument -input_images or --input_images
+ Reading input from pw_1.in
+ Reading input from pw_2.in
+
+ initial path length = 4.2553 bohr
+ initial inter-image distance = 2.1276 bohr
+
+ string_method = neb
+ restart_mode = from_scratch
+ opt_scheme = broyden
+ num_of_images = 3
+ nstep_path = 20
+ CI_scheme = auto
+ first_last_opt = F
+ use_freezing = F
+ ds = 2.0000 a.u.
+ k_max = 0.3000 a.u.
+ k_min = 0.2000 a.u.
+ suggested k_max = 0.1542 a.u.
+ suggested k_min = 0.1028 a.u.
+ path_thr = 0.0500 eV / A
+
+ ------------------------------ iteration 1 ------------------------------
+
+ tcpu = 0.2 self-consistency for image 1
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 0.9 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+ tcpu = 1.8 self-consistency for image 3
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.487921 eV
+ activation energy (<-) = 2.487921 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.1363465 2.305560 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.255 bohr
+ inter-image distance = 2.128 bohr
+
+ ------------------------------ iteration 2 ------------------------------
+
+ tcpu = 2.6 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 2.035025 eV
+ activation energy (<-) = 2.035025 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -42.5892425 2.460480 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.285 bohr
+ inter-image distance = 2.143 bohr
+
+ ------------------------------ iteration 3 ------------------------------
+
+ tcpu = 3.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 1.525016 eV
+ activation energy (<-) = 1.525016 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -43.0992523 2.556790 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.383 bohr
+ inter-image distance = 2.191 bohr
+
+ ------------------------------ iteration 4 ------------------------------
+
+ tcpu = 4.5 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.447076 eV
+ activation energy (<-) = 0.447076 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.1771919 2.253546 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 4.796 bohr
+ inter-image distance = 2.398 bohr
+
+ ------------------------------ iteration 5 ------------------------------
+
+ tcpu = 5.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 3.249031 T
+ 2 -44.8839649 0.577080 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.454 bohr
+ inter-image distance = 2.727 bohr
+
+ ------------------------------ iteration 6 ------------------------------
+
+ tcpu = 6.1 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.396607 eV
+ activation energy (<-) = 0.396607 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.176428 T
+ 2 -44.2276605 4.438232 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 2
+
+ path length = 6.275 bohr
+ inter-image distance = 3.137 bohr
+
+ ------------------------------ iteration 7 ------------------------------
+
+ tcpu = 7.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.844563 T
+ 2 -44.9016945 0.317440 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.520 bohr
+ inter-image distance = 2.760 bohr
+
+ ------------------------------ iteration 8 ------------------------------
+
+ tcpu = 7.7 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.749293 T
+ 2 -44.9043340 0.258570 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.536 bohr
+ inter-image distance = 2.768 bohr
+
+ ------------------------------ iteration 9 ------------------------------
+
+ tcpu = 8.3 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.685185 T
+ 2 -44.9057771 0.215664 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.546 bohr
+ inter-image distance = 2.773 bohr
+
+ ------------------------------ iteration 10 ------------------------------
+
+ tcpu = 8.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.639147 T
+ 2 -44.9066490 0.185069 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.554 bohr
+ inter-image distance = 2.777 bohr
+
+ ------------------------------ iteration 11 ------------------------------
+
+ tcpu = 9.4 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.180484 T
+ 2 -44.9079701 0.126805 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.628 bohr
+ inter-image distance = 2.814 bohr
+
+ ------------------------------ iteration 12 ------------------------------
+
+ tcpu = 10.0 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.586315 T
+ 2 -44.9074826 0.149493 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.562 bohr
+ inter-image distance = 2.781 bohr
+
+ ------------------------------ iteration 13 ------------------------------
+
+ tcpu = 10.8 self-consistency for image 2
+ Message from routine setup:
+ DEPRECATED: symmetry with ibrav=0, use correct ibrav instead
+
+ activation energy (->) = 0.000000 eV
+ activation energy (<-) = 0.000000 eV
+
+ image energy (eV) error (eV/A) frozen
+
+ 1 -44.6242679 2.419674 T
+ 2 -44.9089522 0.037855 F
+ 3 -44.6242679 2.176416 T
+
+ climbing image = 1
+
+ path length = 5.589 bohr
+ inter-image distance = 2.795 bohr
+
+ ---------------------------------------------------------------------------
+
+
+ neb: convergence achieved in 13 iterations
+
+ NEB : 10.54s CPU 11.44s WALL
+
+
+ This run was terminated on: 21: 4: 8 9Sep2019
+
+=------------------------------------------------------------------------------=
+ JOB DONE.
+=------------------------------------------------------------------------------=
diff --git a/tests/parsers/fixtures/neb/failed_zhegvd_failed/aiida_1/PW.out b/tests/parsers/fixtures/neb/failed_zhegvd_failed/aiida_1/PW.out
new file mode 100644
index 000000000..d4a67a751
--- /dev/null
+++ b/tests/parsers/fixtures/neb/failed_zhegvd_failed/aiida_1/PW.out
@@ -0,0 +1,6 @@
+# NOTE: lines of output removed
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Error in routine ppcg (13):
+ zhegvd failed
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+# NOTE: lines of output removed
diff --git a/tests/parsers/test_neb.py b/tests/parsers/test_neb.py
index e8e6698bf..b313f6669 100644
--- a/tests/parsers/test_neb.py
+++ b/tests/parsers/test_neb.py
@@ -1,22 +1,33 @@
# -*- coding: utf-8 -*-
+# pylint: disable=invalid-name,redefined-outer-name, too-many-lines
"""Tests for the `NebParser`."""
from aiida import orm
from aiida.common import AttributeDict
import numpy as np
+import pytest
+from aiida_quantumespresso.calculations.neb import NebCalculation
-def generate_inputs(parser_options=None):
- """Return only those inputs that the parser will expect to be there."""
- inputs = {
- 'parameters': orm.Dict({'PATH': {
- 'num_of_images': 3
- }}),
- 'pw': {
- 'parameters': orm.Dict()
- },
- 'settings': orm.Dict({'parser_options': parser_options})
- }
- return AttributeDict(inputs)
+
+@pytest.fixture
+def generate_inputs(generate_trajectory):
+ """Generate the inputs for the NEB parser."""
+
+ def _generate_inputs(parser_options=None):
+ """Return only those inputs that the parser will expect to be there."""
+ inputs = {
+ 'images': generate_trajectory(),
+ 'parameters': orm.Dict({'PATH': {
+ 'num_of_images': 3
+ }}),
+ 'pw': {
+ 'parameters': orm.Dict()
+ },
+ 'settings': orm.Dict({'parser_options': parser_options})
+ }
+ return AttributeDict(inputs)
+
+ return _generate_inputs
def build_num_regression_dictionary(arrays, array_names):
@@ -44,7 +55,9 @@ def build_num_regression_dictionary(arrays, array_names):
return result
-def test_neb_default(fixture_localhost, generate_calc_job_node, generate_parser, data_regression, num_regression):
+def test_neb_default(
+ fixture_localhost, generate_calc_job_node, generate_parser, generate_inputs, data_regression, num_regression
+):
"""Test a NEB calculation with symmetric images and automatic climbing image."""
name = 'default'
entry_point_calc_job = 'quantumespresso.neb'
@@ -79,7 +92,7 @@ def test_neb_default(fixture_localhost, generate_calc_job_node, generate_parser,
def test_neb_all_iterations(
- fixture_localhost, generate_calc_job_node, generate_parser, data_regression, num_regression
+ fixture_localhost, generate_calc_job_node, generate_parser, data_regression, num_regression, generate_inputs
):
"""Test a NEB calculation with the parser option `all_iterations=True`."""
name = 'default'
@@ -104,3 +117,159 @@ def test_neb_all_iterations(
data = build_num_regression_dictionary([results['iteration_array']], [results['iteration_array'].get_arraynames()])
num_regression.check(data, default_tolerance=dict(atol=0, rtol=1e-18))
+
+
+@pytest.mark.parametrize(
+ 'filename, exception', [
+ ('failed_computing_cholesky', 'ERROR_COMPUTING_CHOLESKY'),
+ ('failed_too_many_bands_not_converged', 'ERROR_DIAGONALIZATION_TOO_MANY_BANDS_NOT_CONVERGED'),
+ ('failed_s_matrix_not_positive_definite', 'ERROR_S_MATRIX_NOT_POSITIVE_DEFINITE'),
+ ('failed_zhegvd_failed', 'ERROR_ZHEGVD_FAILED'),
+ ('failed_qr_failed', 'ERROR_QR_FAILED'),
+ ('failed_eigenvectors_convergence', 'ERROR_EIGENVECTOR_CONVERGENCE'),
+ ('failed_broyden_factorization', 'ERROR_BROYDEN_FACTORIZATION'),
+ ('failed_dexx_negative', 'ERROR_DEXX_IS_NEGATIVE'),
+ ]
+)
+def test_failed_diagonalization(
+ fixture_localhost, generate_calc_job_node, generate_parser, generate_inputs, filename, exception
+):
+ """Test the parsing of a calculation that failed with diagonalization exceptions.
+
+ In this test the stdout is incomplete, and the XML is missing completely. The stdout contains
+ the relevant error message.
+ """
+
+ entry_point_calc_job = 'quantumespresso.neb'
+ entry_point_parser = 'quantumespresso.neb'
+
+ node = generate_calc_job_node(entry_point_calc_job, fixture_localhost, filename, generate_inputs())
+ parser = generate_parser(entry_point_parser)
+ _, calcfunction = parser.parse_from_node(node, store_provenance=False)
+
+ assert calcfunction.is_finished, calcfunction.exception
+ assert calcfunction.is_failed, calcfunction.exit_status
+ assert calcfunction.exit_status == node.process_class.exit_codes.get(exception).status
+
+
+@pytest.mark.parametrize(
+ 'test_case, expected_exit_code', (
+ ('default', None),
+ ('failed_interrupted', NebCalculation.exit_codes.ERROR_NEB_INTERRUPTED_PARTIAL_TRAJECTORY),
+ )
+)
+def test_failed_interrupted_scheduler(
+ fixture_localhost, generate_calc_job_node, generate_parser, generate_inputs, test_case, expected_exit_code
+):
+ """Test that an exit code set by the scheduler is not overridden unless a more specific error is parsed.
+
+ The test is run twice, once for the ``default`` test case and once for ``failed_interrupted``, which correspond to a
+ successful run and a run that got interrupted (usually due to scheduler killing the job). Before calling the parser
+ the ``ERROR_SCHEDULER_OUT_OF_WALLTIME`` is set on the node. In the case of the ``default`` test case, this should be
+ ignored and the parser should return ``ExitCode(0)``. For the interrupted case, the exit code of the scheduler
+ should not be overridden so the parser should return ``ERROR_NEB_INTERRUPTED_PARTIAL_TRAJECTORY``.
+ """
+ entry_point_calc_job = 'quantumespresso.neb'
+ entry_point_parser = 'quantumespresso.neb'
+
+ # Generate the node and set an exit status as if it would have been set by the scheduler parser
+ node = generate_calc_job_node(entry_point_calc_job, fixture_localhost, test_case, generate_inputs())
+ node.set_exit_status(NebCalculation.exit_codes.ERROR_SCHEDULER_OUT_OF_WALLTIME.status)
+
+ parser = generate_parser(entry_point_parser)
+ _, calcfunction = parser.parse_from_node(node, store_provenance=False)
+
+ if expected_exit_code is None:
+ assert calcfunction.is_finished_ok, (calcfunction.exit_status, calcfunction.exception)
+ else:
+ assert not calcfunction.is_finished_ok, calcfunction.exception
+ assert calcfunction.exit_status == expected_exit_code.status
+
+
+def test_failed_cycle_exceeded_nstep(
+ fixture_localhost,
+ generate_calc_job_node,
+ generate_parser,
+ generate_inputs,
+):
+ """Test the parsing of a calculation that stopped due to exceeding the maximum number of steps."""
+ name = 'failed_cycle_exceeded_nstep'
+ entry_point_calc_job = 'quantumespresso.neb'
+ entry_point_parser = 'quantumespresso.neb'
+
+ node = generate_calc_job_node(entry_point_calc_job, fixture_localhost, name, generate_inputs())
+ parser = generate_parser(entry_point_parser)
+ _, calcfunction = parser.parse_from_node(node, store_provenance=False)
+
+ assert calcfunction.is_finished, calcfunction.exception
+ assert calcfunction.is_failed, calcfunction.exit_status
+ assert calcfunction.exit_status == node.process_class.exit_codes.ERROR_NEB_CYCLE_EXCEEDED_NSTEP.status
+
+
+def test_failed_empty_stdout(
+ fixture_localhost,
+ generate_calc_job_node,
+ generate_parser,
+ generate_inputs,
+):
+ """Test the parsing of a calculation that stopped producing an empty stdout."""
+ name = 'failed_empty_stdout'
+ entry_point_calc_job = 'quantumespresso.neb'
+ entry_point_parser = 'quantumespresso.neb'
+
+ node = generate_calc_job_node(entry_point_calc_job, fixture_localhost, name, generate_inputs())
+ parser = generate_parser(entry_point_parser)
+ _, calcfunction = parser.parse_from_node(node, store_provenance=False)
+
+ assert calcfunction.is_finished, calcfunction.exception
+ assert calcfunction.is_failed, calcfunction.exit_status
+ assert calcfunction.exit_status == node.process_class.exit_codes.ERROR_OUTPUT_STDOUT_READ.status
+
+
+def test_failed_first_step_interrupted(
+ fixture_localhost,
+ generate_calc_job_node,
+ generate_parser,
+ generate_inputs,
+):
+ """Test the parsing of a calculation that stopped because it was interrupted during the first step."""
+ name = 'failed_first_step_interrupted'
+ entry_point_calc_job = 'quantumespresso.neb'
+ entry_point_parser = 'quantumespresso.neb'
+
+ node = generate_calc_job_node(entry_point_calc_job, fixture_localhost, name, generate_inputs())
+ parser = generate_parser(entry_point_parser)
+ _, calcfunction = parser.parse_from_node(node, store_provenance=False)
+
+ exit_status = node.process_class.exit_codes.ERROR_NEB_INTERRUPTED_WITHOUT_PARTIAL_TRAJECTORY.status
+ assert calcfunction.is_finished, calcfunction.exception
+ assert calcfunction.is_failed, calcfunction.exit_status
+ assert calcfunction.exit_status == exit_status
+
+@pytest.mark.parametrize(
+ 'filename, exception', [
+ ('failed_npools_too_high', 'ERROR_NPOOLS_TOO_HIGH'),
+ ('failed_nimage_higher_than_nproc', 'ERROR_NIMAGE_HIGHER_THAN_NPROC'),
+ ('failed_nimage_higher_than_images', 'ERROR_NIMAGE_HIGHER_THAN_IMAGES'),
+ ('failed_nimage_not_divisor_of_nproc', 'ERROR_NIMAGE_NOT_DIVISOR_OF_NPROC')
+ ]
+)
+def test_failed_parallelization(
+ fixture_localhost, generate_calc_job_node, generate_parser, generate_inputs, filename, exception
+):
+ """Test the parsing of a calculation that failed with parallelization exceptions.
+
+ In this test the stdout is incomplete, and the XML is missing completely. The stdout contains
+ the relevant error message.
+ """
+
+ entry_point_calc_job = 'quantumespresso.neb'
+ entry_point_parser = 'quantumespresso.neb'
+
+ node = generate_calc_job_node(entry_point_calc_job, fixture_localhost, filename, generate_inputs())
+ parser = generate_parser(entry_point_parser)
+ _, calcfunction = parser.parse_from_node(node, store_provenance=False)
+
+ assert calcfunction.is_finished, calcfunction.exception
+ assert calcfunction.is_failed, calcfunction.exit_status
+ assert calcfunction.exit_status == node.process_class.exit_codes.get(exception).status
\ No newline at end of file
diff --git a/tests/parsers/test_neb/test_neb_default.yml b/tests/parsers/test_neb/test_neb_default.yml
index f22768407..777505958 100644
--- a/tests/parsers/test_neb/test_neb_default.yml
+++ b/tests/parsers/test_neb/test_neb_default.yml
@@ -417,5 +417,4 @@ parameters:
suggested_k_min_au: 0.1028
use_freezing: false
wall_time_seconds: 11.44
- warnings:
- - 'error: ERROR_OUTPUT_STDOUT_INCOMPLETE'
+ warnings: []
diff --git a/tests/workflows/neb/__init__.py b/tests/workflows/neb/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/workflows/neb/test_base.py b/tests/workflows/neb/test_base.py
new file mode 100644
index 000000000..35eaed7fd
--- /dev/null
+++ b/tests/workflows/neb/test_base.py
@@ -0,0 +1,153 @@
+# -*- coding: utf-8 -*-
+# pylint: disable=no-member,redefined-outer-name
+"""Tests for the `PwBaseWorkChain` class."""
+from aiida.common import AttributeDict
+from aiida.engine import ProcessHandlerReport
+import pytest
+
+from aiida_quantumespresso.calculations.neb import NebCalculation
+from aiida_quantumespresso.workflows.neb.base import NebBaseWorkChain
+
+
+def test_setup(generate_workchain_neb):
+ """Test `NebBaseWorkChain.setup`."""
+ process = generate_workchain_neb()
+ process.setup()
+
+ assert isinstance(process.ctx.inputs, AttributeDict)
+
+
+def test_handle_electronic_convergence_not_reached(generate_workchain_neb, fixture_localhost, generate_remote_data):
+ """Test `NebBaseWorkChain.handle_electronic_convergence_not_reached`."""
+ remote_data = generate_remote_data(computer=fixture_localhost, remote_path='/path/to/remote')
+
+ process = generate_workchain_neb(
+ exit_code=NebCalculation.exit_codes.ERROR_ELECTRONIC_CONVERGENCE_NOT_REACHED,
+ neb_outputs={'remote_folder': remote_data}
+ )
+ process.setup()
+
+ process.ctx.inputs.pw.parameters['ELECTRONS']['mixing_beta'] = 0.5
+
+ result = process.handle_electronic_convergence_not_reached(process.ctx.children[-1])
+ assert isinstance(result, ProcessHandlerReport)
+ assert process.ctx.inputs.pw.parameters['ELECTRONS']['mixing_beta'] == \
+ process.defaults.delta_factor_mixing_beta * 0.5
+ assert process.ctx.inputs.parameters['PATH']['restart_mode'] == 'restart'
+ assert result.do_break
+
+ result = process.inspect_process()
+ assert result.status == 0
+
+
+@pytest.mark.parametrize(
+ 'exit_code', (
+ NebCalculation.exit_codes.ERROR_COMPUTING_CHOLESKY,
+ NebCalculation.exit_codes.ERROR_DIAGONALIZATION_TOO_MANY_BANDS_NOT_CONVERGED,
+ NebCalculation.exit_codes.ERROR_S_MATRIX_NOT_POSITIVE_DEFINITE,
+ NebCalculation.exit_codes.ERROR_ZHEGVD_FAILED,
+ NebCalculation.exit_codes.ERROR_QR_FAILED,
+ NebCalculation.exit_codes.ERROR_EIGENVECTOR_CONVERGENCE,
+ NebCalculation.exit_codes.ERROR_BROYDEN_FACTORIZATION,
+ )
+)
+def test_handle_diagonalization_errors(generate_workchain_neb, exit_code):
+ """Test `NebBaseWorkChain.handle_diagonalization_errors`."""
+ process = generate_workchain_neb(exit_code=exit_code)
+ process.setup()
+
+ process.ctx.inputs.pw.parameters['ELECTRONS']['diagonalization'] = 'david'
+
+ result = process.handle_diagonalization_errors(process.ctx.children[-1])
+ assert isinstance(result, ProcessHandlerReport)
+ assert process.ctx.inputs.pw.parameters['ELECTRONS']['diagonalization'] == 'ppcg'
+ assert result.do_break
+
+ result = process.handle_diagonalization_errors(process.ctx.children[-1])
+ assert isinstance(result, ProcessHandlerReport)
+ assert process.ctx.inputs.pw.parameters['ELECTRONS']['diagonalization'] == 'paro'
+ assert result.do_break
+
+ result = process.handle_diagonalization_errors(process.ctx.children[-1])
+ assert isinstance(result, ProcessHandlerReport)
+ assert process.ctx.inputs.pw.parameters['ELECTRONS']['diagonalization'] == 'cg'
+ assert result.do_break
+
+ result = process.inspect_process()
+ assert result == NebBaseWorkChain.exit_codes.ERROR_KNOWN_UNRECOVERABLE_FAILURE
+
+
+@pytest.mark.parametrize(
+ 'exit_code', (
+ NebCalculation.exit_codes.ERROR_COMPUTING_CHOLESKY,
+ NebCalculation.exit_codes.ERROR_DIAGONALIZATION_TOO_MANY_BANDS_NOT_CONVERGED,
+ NebCalculation.exit_codes.ERROR_S_MATRIX_NOT_POSITIVE_DEFINITE,
+ NebCalculation.exit_codes.ERROR_ZHEGVD_FAILED,
+ NebCalculation.exit_codes.ERROR_QR_FAILED,
+ NebCalculation.exit_codes.ERROR_EIGENVECTOR_CONVERGENCE,
+ NebCalculation.exit_codes.ERROR_BROYDEN_FACTORIZATION,
+ )
+)
+def test_handle_diagonalization_errors_not_from_david(generate_workchain_neb, exit_code):
+ """Test `NebBaseWorkChain.handle_diagonalization_errors` starting from a different diagonalization."""
+ process = generate_workchain_neb(exit_code=exit_code)
+ process.setup()
+
+ process.ctx.inputs.pw.parameters['ELECTRONS']['diagonalization'] = 'ppcg'
+
+ result = process.handle_diagonalization_errors(process.ctx.children[-1])
+ assert isinstance(result, ProcessHandlerReport)
+ assert process.ctx.inputs.pw.parameters['ELECTRONS']['diagonalization'] == 'david'
+ assert result.do_break
+
+ result = process.handle_diagonalization_errors(process.ctx.children[-1])
+ assert isinstance(result, ProcessHandlerReport)
+ assert process.ctx.inputs.pw.parameters['ELECTRONS']['diagonalization'] == 'paro'
+ assert result.do_break
+
+ result = process.handle_diagonalization_errors(process.ctx.children[-1])
+ assert isinstance(result, ProcessHandlerReport)
+ assert process.ctx.inputs.pw.parameters['ELECTRONS']['diagonalization'] == 'cg'
+ assert result.do_break
+
+ result = process.inspect_process()
+ assert result == NebBaseWorkChain.exit_codes.ERROR_KNOWN_UNRECOVERABLE_FAILURE
+
+
+@pytest.mark.parametrize('exit_code', (NebCalculation.exit_codes.ERROR_NEB_INTERRUPTED_PARTIAL_TRAJECTORY,))
+def test_handle_neb_interrupted_partial_trajectory(
+ generate_workchain_neb, generate_remote_data, fixture_localhost, exit_code
+):
+ """Test `NebBaseWorkChain.handle_neb_interrupted_partial_trajectory`."""
+ remote_data = generate_remote_data(computer=fixture_localhost, remote_path='/path/to/remote')
+ process = generate_workchain_neb(neb_outputs={'remote_folder': remote_data}, exit_code=exit_code)
+ process.setup()
+
+ result = process.handle_neb_interrupted_partial_trajectory(process.ctx.children[-1])
+ assert isinstance(result, ProcessHandlerReport)
+ assert result.do_break
+ assert result.exit_code.status == 0
+ assert process.ctx.inputs.parameters['PATH']['restart_mode'] == 'restart'
+
+ result = process.inspect_process()
+ assert result.status == 0
+
+
+@pytest.mark.parametrize('exit_code', (NebCalculation.exit_codes.ERROR_NEB_CYCLE_EXCEEDED_NSTEP,))
+def test_handle_neb_cycle_exceeded_nstep_error(
+ generate_workchain_neb, generate_remote_data, fixture_localhost, exit_code
+):
+ """Test `NebBaseWorkChain.handle_neb_cycle_exceeded_nstep`."""
+ remote_data = generate_remote_data(computer=fixture_localhost, remote_path='/path/to/remote')
+ process = generate_workchain_neb(neb_outputs={'remote_folder': remote_data}, exit_code=exit_code)
+ process.setup()
+ input_nsteps = process.ctx.inputs.parameters['PATH']['nstep_path'] if 'nstep_path' in process.ctx.inputs.parameters[
+ 'PATH'] else 1
+ result = process.handle_neb_cycle_exceeded_nstep(process.ctx.children[-1])
+ assert isinstance(result, ProcessHandlerReport)
+ assert result.do_break
+ assert result.exit_code.status == 0
+ assert process.ctx.inputs.parameters['PATH']['restart_mode'] == 'restart'
+ assert process.ctx.inputs.parameters['PATH']['nstep_path'] == input_nsteps * 2
+ result = process.inspect_process()
+ assert result.status == 0