diff --git a/parser/parser-cp2k/cp2kparser/versions/cp2k262/commonmatcher.py b/parser/parser-cp2k/cp2kparser/versions/cp2k262/commonmatcher.py index c24ccdddd830cff2e52a522352b03a971fe8a3f6..3639dacb44a53404f3ad647b63de7bc3e925e769 100644 --- a/parser/parser-cp2k/cp2kparser/versions/cp2k262/commonmatcher.py +++ b/parser/parser-cp2k/cp2kparser/versions/cp2k262/commonmatcher.py @@ -37,6 +37,7 @@ class CommonMatcher(object): 'section_XC_functionals': CachingLevel.ForwardAndCache, 'self_interaction_correction_method': CachingLevel.Cache, 'x_cp2k_section_programinformation': CachingLevel.ForwardAndCache, + 'x_cp2k_section_quickstep_settings': CachingLevel.ForwardAndCache, } #======================================================================= @@ -189,11 +190,14 @@ class CommonMatcher(object): def quickstep_header(self): return SM( " *******************************************************************************".replace("*", "\*"), forwardMatch=True, + sections=["x_cp2k_section_quickstep_settings"], subMatchers=[ SM( " DFT\|", forwardMatch=True, subMatchers=[ + SM( " DFT\| Spin restricted Kohn-Sham (RKS) calculation\s+(?P<x_cp2k_spin_restriction>{})".format(self.regex_word)), SM( " DFT\| Multiplicity\s+(?P<spin_target_multiplicity>{})".format(self.regex_i)), + SM( " DFT\| Number of spin states\s+(?P<number_of_spin_channels>{})".format(self.regex_i)), SM( " DFT\| Charge\s+(?P<total_charge>{})".format(self.regex_i)), SM( " DFT\| Self-interaction correction \(SIC\)\s+(?P<self_interaction_correction_method>[^\n]+)"), ], @@ -231,6 +235,16 @@ class CommonMatcher(object): otherMetaInfo=["atom_labels", "atom_positions"] ) ] + ), + SM( " SCF PARAMETERS", + forwardMatch=True, + subMatchers=[ + SM( " SCF PARAMETERS Density guess:\s+{}".format(self.regex_eol)), + SM( " max_scf:\s+(?P<scf_max_iteration>{})".format(self.regex_i)), + SM( " max_scf_history:\s+{}".format(self.regex_i)), + SM( " max_diis:\s+{}".format(self.regex_i)), + SM( " eps_scf:\s+(?P<scf_threshold_energy_change>{})".format(self.regex_f)), + ] ) ] ) @@ -243,13 +257,6 @@ class CommonMatcher(object): 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. - Contains also information that is totally agnostic on the calculation - contents, like program_basis_set_type. - """ - backend.addValue("program_basis_set_type", "gaussian") - def onClose_section_method(self, backend, gIndex, section): """When all the functional definitions have been gathered, matches them with the nomad correspondents and combines into one single string which @@ -276,6 +283,10 @@ class CommonMatcher(object): except: pass + def onClose_x_cp2k_section_quickstep_settings(self, backend, gIndex, section): + backend.addValue("program_basis_set_type", "gaussian") + # backend.addValue("electronic_structure_method", "DFT") + def onClose_x_cp2k_section_programinformation(self, backend, gIndex, section): input_file = section.get_latest_value("x_cp2k_input_filename") self.file_service.set_file_id(input_file, "input") diff --git a/parser/parser-cp2k/cp2kparser/versions/cp2k262/inputparser.py b/parser/parser-cp2k/cp2kparser/versions/cp2k262/inputparser.py index dacf5513968942311fe1489bcee56db256888422..f411c860432bd670af33122bdf9b0e4ea6321090 100644 --- a/parser/parser-cp2k/cp2kparser/versions/cp2k262/inputparser.py +++ b/parser/parser-cp2k/cp2kparser/versions/cp2k262/inputparser.py @@ -64,6 +64,7 @@ class CP2KInputParser(BasicParser): self.cache_service.add("vel_add_last") self.cache_service.add("each_geo_opt") self.cache_service.add("traj_add_last") + self.cache_service.add("electronic_structure_method") def parse(self): @@ -215,6 +216,10 @@ class CP2KInputParser(BasicParser): pint_vel_unit = self.get_pint_unit_string(vel_unit) self.cache_service["velocity_unit"] = pint_vel_unit + #======================================================================= + # See if some more exotic calculation is requested (e.g. MP2, DFT+U, GW, RPA) + + #======================================================================= # Stress tensor calculation method stress_tensor_method = self.input_tree.get_keyword("FORCE_EVAL/STRESS_TENSOR") diff --git a/test/unittests/cp2k_2.6.2/run_tests.py b/test/unittests/cp2k_2.6.2/run_tests.py index 5e5e7a5d97c916a7899a46059adf65b36d7c34ac..d99e2dd3a1155ac703476410d59195dd5f56c488 100644 --- a/test/unittests/cp2k_2.6.2/run_tests.py +++ b/test/unittests/cp2k_2.6.2/run_tests.py @@ -281,6 +281,18 @@ class TestEnergyForce(unittest.TestCase): expected_result = convert_unit(np.array(-32.2320848878), "hartree") self.assertTrue(np.array_equal(result[0], expected_result)) + def test_scf_max_iteration(self): + result = self.results["scf_max_iteration"] + self.assertEqual(result, 300) + + def test_scf_threshold_energy_change(self): + result = self.results["scf_threshold_energy_change"] + self.assertEqual(result, 1.00E-07) + + def test_number_of_spin_channels(self): + result = self.results["number_of_spin_channels"] + self.assertEqual(result, 1) + def test_energy_change_scf_iteration(self): energy_change = self.results["energy_change_scf_iteration"] expected_result = convert_unit(np.array(-3.22E+01), "hartree")