diff --git a/parser/parser-cp2k/cp2kparser/generic/utils.py b/parser/parser-cp2k/cp2kparser/generic/utils.py deleted file mode 100644 index 4b4f8c488c713e3192e1149b3e643163cb071530..0000000000000000000000000000000000000000 --- a/parser/parser-cp2k/cp2kparser/generic/utils.py +++ /dev/null @@ -1,12 +0,0 @@ -#=============================================================================== -def try_to_add_value(backend, section, source_name, destination_name): - original = section[source_name] - if original is not None: - backend.addValue(destination_name, original[0]) - - -#=============================================================================== -def try_to_add_array_values(backend, section, source_name, destination_name, unit=None): - original = section[source_name] - if original is not None: - backend.addArrayValues(destination_name, original[0]) diff --git a/parser/parser-cp2k/cp2kparser/versions/cp2k262/commonmatcher.py b/parser/parser-cp2k/cp2kparser/versions/cp2k262/commonmatcher.py index b4a0533ae59989928070933499d422278a46aeea..7b0ebdaec00b5ea103da981f9c06662bd97d0d65 100644 --- a/parser/parser-cp2k/cp2kparser/versions/cp2k262/commonmatcher.py +++ b/parser/parser-cp2k/cp2kparser/versions/cp2k262/commonmatcher.py @@ -37,7 +37,7 @@ class CommonMatcher(object): } #======================================================================= - # Cached values + # Globally cached values self.cache_service.add_cache_object("simulation_cell", single=False, update=False) self.cache_service.add_cache_object("number_of_scf_iterations", 0) self.cache_service.add_cache_object("atom_positions", single=False, update=True) @@ -175,7 +175,7 @@ class CommonMatcher(object): ] ) - # SimpleMatcher for an SCF wavefunction optimization + # SimpleMatcher the stuff that is done to initialize a quickstep calculation def quickstep_header(self): return SM( " MODULE QUICKSTEP: ATOMIC COORDINATES IN angstrom", @@ -192,8 +192,9 @@ class CommonMatcher(object): # onClose triggers def onClose_x_cp2k_section_total_numbers(self, backend, gIndex, section): """Keep track of how many SCF iteration are made.""" - number_of_atoms = section["x_cp2k_atoms"][0] - self.cache_service["number_of_atoms"] = number_of_atoms + number_of_atoms = section.get_latest_value("x_cp2k_atoms") + if number_of_atoms is not None: + self.cache_service["number_of_atoms"] = number_of_atoms def onClose_section_run(self, backend, gIndex, section): """Information that is pushed regardless at the end of parsing. @@ -212,7 +213,7 @@ class CommonMatcher(object): # Transform the CP2K self-interaction correction string to the NOMAD # correspondent, and push directly to the superBackend to avoid caching try: - sic_cp2k = section["self_interaction_correction_method"][0] + sic_cp2k = section.get_latest_value("self_interaction_correction_method") sic_map = { "NO": "", "AD SIC": "SIC_AD", @@ -232,7 +233,7 @@ class CommonMatcher(object): """ """ # If the input file is available, parse it - input_file = section["x_cp2k_input_filename"][0] + input_file = section.get_latest_value("x_cp2k_input_filename") filepath = self.file_service.get_absolute_path_to_file(input_file) if filepath is not None: input_parser = CP2KInputParser(filepath, self.parser_context) @@ -245,19 +246,13 @@ class CommonMatcher(object): let's get it dynamically just in case there's something wrong. """ self.section_system_index = gIndex - # if self.forces is not None: - # backend.addArrayValues("atom_forces", self.forces, unit="forceAu") - # self.forces = None self.cache_service.push_value("number_of_atoms") self.cache_service.push_array_values("simulation_cell", unit="angstrom") self.cache_service.push_array_values("configuration_periodic_dimensions") self.cache_service.push_array_values("atom_positions", unit="angstrom") - # self.cache_service.push_array_values("atom_forces", unit="forceAu") self.cache_service.push_array_values("atom_labels") def onClose_section_single_configuration_calculation(self, backend, gIndex, section): - """ - """ # Write the references to section_method and section_system backend.addValue('single_configuration_to_calculation_method_ref', self.section_method_index) backend.addValue('single_configuration_calculation_to_system_ref', self.section_system_index) diff --git a/parser/parser-cp2k/cp2kparser/versions/cp2k262/geooptparser.py b/parser/parser-cp2k/cp2kparser/versions/cp2k262/geooptparser.py index c3a49e883645b82ed1f6e62c1ce462ac5917401d..040b4b136f1a79d10079e07530781b5c7c862663 100644 --- a/parser/parser-cp2k/cp2kparser/versions/cp2k262/geooptparser.py +++ b/parser/parser-cp2k/cp2kparser/versions/cp2k262/geooptparser.py @@ -5,9 +5,6 @@ import cp2kparser.generic.configurationreading import cp2kparser.generic.csvparsing from nomadcore.caching_backend import CachingLevel import logging -import ase.io -import numpy as np -import math logger = logging.getLogger("nomad") @@ -24,9 +21,11 @@ class CP2KGeoOptParser(MainHierarchicalParser): self.traj_iterator = None #======================================================================= - # Cached values + # Globally cached values self.cache_service.add_cache_object("number_of_frames_in_sequence", 0) self.cache_service.add_cache_object("frame_sequence_potential_energy", []) + self.cache_service.add_cache_object("frame_sequence_local_frames_ref", []) + self.cache_service.add_cache_object("geometry_optimization_method") #======================================================================= # Cache levels @@ -74,7 +73,7 @@ class CP2KGeoOptParser(MainHierarchicalParser): endReStr=" Conv. in RMS gradients =", name="geooptstep", repeats=True, - sections=["section_system"], + sections=["section_single_configuration_calculation", "section_system"], subMatchers=[ SM( "", forwardMatch=True, @@ -174,23 +173,33 @@ class CP2KGeoOptParser(MainHierarchicalParser): def onClose_x_cp2k_section_geometry_optimization(self, backend, gIndex, section): # Get the re-evaluated energy and add it to frame_sequence_potential_energy - reeval = section["x_cp2k_section_geometry_optimization_energy_reevaluation"][0] - quickstep = reeval["x_cp2k_section_quickstep_calculation"][0] - energy = quickstep["x_cp2k_energy_total"] - self.cache_service["frame_sequence_potential_energy"].append(energy[0]) + energy = section.get_latest_value([ + "x_cp2k_section_geometry_optimization_energy_reevaluation", + "x_cp2k_section_quickstep_calculation", + "x_cp2k_energy_total"] + ) + if energy is not None: + self.cache_service["frame_sequence_potential_energy"].append(energy) + # Push values from cache self.cache_service.push_value("number_of_frames_in_sequence") self.cache_service.push_array_values("frame_sequence_potential_energy") + self.cache_service.push_array_values("frame_sequence_local_frames_ref") + self.cache_service.push_value("geometry_optimization_method") + self.backend.addValue("frame_sequence_to_sampling_ref", 0) - opt_section = section["x_cp2k_section_geometry_optimization_step"] - if opt_section is not None: - opt_section = opt_section[-1] - geo_limit = opt_section["x_cp2k_optimization_step_size_convergence_limit"] - if geo_limit is not None: - self.backend.addValue("geometry_optimization_geometry_change", geo_limit[0]) - force_limit = opt_section["x_cp2k_optimization_gradient_convergence_limit"] - if force_limit is not None: - self.backend.addValue("geometry_optimization_threshold_force", force_limit[0]) + # Get the optimization convergence criteria from the last optimization + # step + section.add_latest_value([ + "x_cp2k_section_geometry_optimization_step", + "x_cp2k_optimization_step_size_convergence_limit"], + "geometry_optimization_geometry_change", + ) + section.add_latest_value([ + "x_cp2k_section_geometry_optimization_step", + "x_cp2k_optimization_gradient_convergence_limit"], + "geometry_optimization_threshold_force", + ) def onClose_section_sampling_method(self, backend, gIndex, section): self.backend.addValue("sampling_method", "geometry_optimization") @@ -214,6 +223,9 @@ class CP2KGeoOptParser(MainHierarchicalParser): except ValueError: pass + def onClose_section_single_configuration_calculation(self, backend, gIndex, section): + self.cache_service["frame_sequence_local_frames_ref"].append(gIndex) + #=========================================================================== # adHoc functions def adHoc_geo_opt_converged(self): @@ -234,14 +246,14 @@ class CP2KGeoOptParser(MainHierarchicalParser): """Called when conjugate gradient method is used. """ def wrapper(parser): - parser.backend.addValue("geometry_optimization_method", "conjugate_gradient") + self.cache_service["geometry_optimization_method"] = "conjugate_gradient" return wrapper def adHoc_bfgs(self): """Called when conjugate gradient method is used. """ def wrapper(parser): - parser.backend.addValue("geometry_optimization_method", "bfgs") + self.cache_service["geometry_optimization_method"] = "bfgs" return wrapper def adHoc_step(self): @@ -253,8 +265,6 @@ class CP2KGeoOptParser(MainHierarchicalParser): # Get the next position from the trajectory file if self.traj_iterator is not None: - # pos = next(self.traj_iterator) - # self.cache_service["atom_positions"] = pos try: pos = next(self.traj_iterator) except StopIteration: @@ -263,13 +273,3 @@ class CP2KGeoOptParser(MainHierarchicalParser): self.cache_service["atom_positions"] = pos return wrapper - - def adHoc_setup_traj_file(self): - def wrapper(parser): - pass - return wrapper - - def debug(self): - def wrapper(parser): - print "FOUND" - return wrapper diff --git a/parser/parser-cp2k/cp2kparser/versions/cp2k262/singlepointparser.py b/parser/parser-cp2k/cp2kparser/versions/cp2k262/singlepointparser.py index 44dfb53473559bf1ffb9df41b7b8ad1be1926d77..469efa4c69dbe18622b29751360e2527bc65777b 100644 --- a/parser/parser-cp2k/cp2kparser/versions/cp2k262/singlepointparser.py +++ b/parser/parser-cp2k/cp2kparser/versions/cp2k262/singlepointparser.py @@ -3,7 +3,6 @@ from nomadcore.baseclasses import MainHierarchicalParser from singlepointforceparser import CP2KSinglePointForceParser from nomadcore.caching_backend import CachingLevel from commonmatcher import CommonMatcher -from cp2kparser.generic.utils import try_to_add_value, try_to_add_array_values import logging logger = logging.getLogger("nomad") @@ -68,22 +67,22 @@ class CP2KSinglePointParser(MainHierarchicalParser): """Keep track of how many SCF iteration are made.""" self.cache_service["number_of_scf_iterations"] += 1 gId = backend.openSection("section_scf_iteration") - try_to_add_value(backend, section, "x_cp2k_energy_total_scf_iteration", "energy_total_scf_iteration") - try_to_add_value(backend, section, "x_cp2k_energy_XC_scf_iteration", "energy_XC_scf_iteration") - try_to_add_value(backend, section, "x_cp2k_energy_change_scf_iteration", "energy_change_scf_iteration") + section.add_latest_value("x_cp2k_energy_total_scf_iteration", "energy_total_scf_iteration") + section.add_latest_value("x_cp2k_energy_XC_scf_iteration", "energy_XC_scf_iteration") + section.add_latest_value("x_cp2k_energy_change_scf_iteration", "energy_change_scf_iteration") backend.closeSection("section_scf_iteration", gId) def onClose_x_cp2k_section_quickstep_calculation(self, backend, gIndex, section): """""" - try_to_add_value(backend, section, "x_cp2k_energy_total", "energy_total") - try_to_add_value(backend, section, "x_cp2k_electronic_kinetic_energy", "electronic_kinetic_energy") - try_to_add_value(backend, section, "x_cp2k_quickstep_converged", "single_configuration_calculation_converged") - try_to_add_array_values(backend, section, "x_cp2k_atom_forces", "atom_forces") + section.add_latest_value("x_cp2k_energy_total", "energy_total") + section.add_latest_value("x_cp2k_electronic_kinetic_energy", "electronic_kinetic_energy") + section.add_latest_value("x_cp2k_quickstep_converged", "single_configuration_calculation_converged") + section.add_latest_array_values("x_cp2k_atom_forces", "atom_forces") def onClose_x_cp2k_section_stress_tensor(self, backend, gIndex, section): """""" gId = backend.openSection("section_stress_tensor") - try_to_add_array_values(backend, section, "x_cp2k_stress_tensor", "stress_tensor") + section.add_latest_array_values("x_cp2k_stress_tensor", "stress_tensor") backend.closeSection("section_stress_tensor", gId) #=========================================================================== diff --git a/src/main/scala/eu/nomad_lab/parsers/Cp2kParser.scala b/src/main/scala/eu/nomad_lab/parsers/Cp2kParser.scala index 3b5361dc1f2dda7b2c11063742adab169b8dfd5f..7ae2929b8ca7252e651ea611c441cbae4cfbeefa 100644 --- a/src/main/scala/eu/nomad_lab/parsers/Cp2kParser.scala +++ b/src/main/scala/eu/nomad_lab/parsers/Cp2kParser.scala @@ -42,7 +42,6 @@ object Cp2kParser extends SimpleExternalParserGenerator( "parser-cp2k/cp2kparser/generic/inputparsing.py", "parser-cp2k/cp2kparser/generic/configurationreading.py", "parser-cp2k/cp2kparser/generic/csvparsing.py", - "parser-cp2k/cp2kparser/generic/utils.py", "parser-cp2k/cp2kparser/versions/__init__.py", "parser-cp2k/cp2kparser/versions/versionsetup.py", "parser-cp2k/cp2kparser/versions/cp2k262/__init__.py", diff --git a/test/unittests/cp2k_2.6.2/run_tests.py b/test/unittests/cp2k_2.6.2/run_tests.py index 28d467a831b7591b409dd89a535ac382ed696767..b3edee84874b534a636462c2ac904df77e33dd25 100644 --- a/test/unittests/cp2k_2.6.2/run_tests.py +++ b/test/unittests/cp2k_2.6.2/run_tests.py @@ -462,6 +462,15 @@ class TestGeoOpt(unittest.TestCase): result = self.results["number_of_frames_in_sequence"] self.assertEqual(result, 7) + def test_frame_sequence_to_sampling_ref(self): + result = self.results["frame_sequence_to_sampling_ref"] + self.assertEqual(result, 0) + + def test_frame_sequence_local_frames_ref(self): + result = self.results["frame_sequence_local_frames_ref"] + expected_result = np.array([0, 1, 2, 3, 4, 5]) + self.assertTrue(np.array_equal(result, expected_result)) + def test_sampling_method(self): result = self.results["sampling_method"] self.assertEqual(result, "geometry_optimization")