diff --git a/parser/parser-cp2k/cp2kparser/generic/utils.py b/parser/parser-cp2k/cp2kparser/generic/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..4b4f8c488c713e3192e1149b3e643163cb071530 --- /dev/null +++ b/parser/parser-cp2k/cp2kparser/generic/utils.py @@ -0,0 +1,12 @@ +#=============================================================================== +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 ed96e37899e48aaea614f250a5018f7407dfdd60..b4a0533ae59989928070933499d422278a46aeea 100644 --- a/parser/parser-cp2k/cp2kparser/versions/cp2k262/commonmatcher.py +++ b/parser/parser-cp2k/cp2kparser/versions/cp2k262/commonmatcher.py @@ -19,6 +19,7 @@ class CommonMatcher(object): # Repeating regex definitions self.parser_context = parser_context + self.backend = parser_context.caching_backend self.file_service = parser_context.file_service self.cache_service = parser_context.cache_service self.regex_f = "-?\d+\.\d+(?:E(?:\+|-)\d+)?" # Regex for a floating point value @@ -26,7 +27,6 @@ class CommonMatcher(object): self.regex_word = "[^\s]+" # Regex for a single word. Can contain anything else but whitespace self.section_method_index = None self.section_system_index = None - self.forces = None #======================================================================= # Cache levels @@ -34,15 +34,6 @@ class CommonMatcher(object): 'x_cp2k_atoms': CachingLevel.ForwardAndCache, 'section_XC_functionals': CachingLevel.ForwardAndCache, 'self_interaction_correction_method': CachingLevel.Cache, - 'x_cp2k_section_md_coordinates': CachingLevel.Cache, - 'x_cp2k_section_md_coordinate_atom': CachingLevel.Cache, - 'x_cp2k_md_coordinate_atom_string': CachingLevel.Cache, - 'x_cp2k_md_coordinate_atom_float': CachingLevel.Cache, - - 'x_cp2k_section_md_forces': CachingLevel.Cache, - 'x_cp2k_section_md_force_atom': CachingLevel.Cache, - 'x_cp2k_md_force_atom_string': CachingLevel.Cache, - 'x_cp2k_md_force_atom_float': CachingLevel.Cache, } #======================================================================= @@ -135,15 +126,16 @@ class CommonMatcher(object): ) # SimpleMatcher for an SCF wavefunction optimization - def scf(self): + def quickstep_calculation(self): return SM( " SCF WAVEFUNCTION OPTIMIZATION", + sections=["x_cp2k_section_quickstep_calculation"], subMatchers=[ SM( r" Trace\(PS\):", - sections=["section_scf_iteration"], + sections=["x_cp2k_section_scf_iteration"], repeats=True, subMatchers=[ - SM( r" Exchange-correlation energy:\s+(?P<energy_XC_scf_iteration__hartree>{})".format(self.regex_f)), - SM( r"\s+\d+\s+\S+\s+{0}\s+{0}\s+{0}\s+(?P<energy_total_scf_iteration__hartree>{0})\s+(?P<energy_change_scf_iteration__hartree>{0})".format(self.regex_f)), + SM( r" Exchange-correlation energy:\s+(?P<x_cp2k_energy_XC_scf_iteration__hartree>{})".format(self.regex_f)), + SM( r"\s+\d+\s+\S+\s+{0}\s+{0}\s+{0}\s+(?P<x_cp2k_energy_total_scf_iteration__hartree>{0})\s+(?P<x_cp2k_energy_change_scf_iteration__hartree>{0})".format(self.regex_f)), ] ), SM( r" \*\*\* SCF run converged in\s+(\d+) steps \*\*\*", @@ -154,22 +146,25 @@ class CommonMatcher(object): otherMetaInfo=["single_configuration_calculation_converged"], adHoc=self.adHoc_single_point_not_converged() ), - SM( r" Electronic kinetic energy:\s+(?P<electronic_kinetic_energy__hartree>{})".format(self.regex_f)), + SM( r" Electronic kinetic energy:\s+(?P<x_cp2k_electronic_kinetic_energy__hartree>{})".format(self.regex_f)), SM( r" **************************** NUMERICAL STRESS ********************************".replace("*", "\*"), + # endReStr=" **************************** NUMERICAL STRESS END *****************************".replace("*", "\*"), adHoc=self.adHoc_stress_calculation(), ), - SM( r" ENERGY\| Total FORCE_EVAL \( \w+ \) energy \(a\.u\.\):\s+(?P<energy_total__hartree>{0})".format(self.regex_f)), + SM( r" ENERGY\| Total FORCE_EVAL \( \w+ \) energy \(a\.u\.\):\s+(?P<x_cp2k_energy_total__hartree>{0})".format(self.regex_f), + otherMetaInfo=["energy_total"], + ), SM( r" ATOMIC FORCES in \[a\.u\.\]"), SM( r" # Atom Kind Element X Y Z", adHoc=self.adHoc_atom_forces(), - otherMetaInfo=["atom_forces"], + otherMetaInfo=["atom_forces", "x_cp2k_atom_forces"], ), SM( r" (?:NUMERICAL )?STRESS TENSOR \[GPa\]", - sections=["section_stress_tensor"], - otherMetaInfo=["stress_tensor"], + sections=["x_cp2k_section_stress_tensor"], subMatchers=[ SM( r"\s+X\s+Y\s+Z", - adHoc=self.adHoc_stress_tensor() + adHoc=self.adHoc_stress_tensor(), + otherMetaInfo=["stress_tensor", "section_stress_tensor"], ), SM( " 1/3 Trace\(stress tensor\):\s+(?P<x_cp2k_stress_tensor_one_third_of_trace__GPa>{})".format(self.regex_f)), SM( " Det\(stress tensor\)\s+:\s+(?P<x_cp2k_stress_tensor_determinant__GPa3>{})".format(self.regex_f)), @@ -181,7 +176,7 @@ class CommonMatcher(object): ) # SimpleMatcher for an SCF wavefunction optimization - def quickstep(self): + def quickstep_header(self): return SM( " MODULE QUICKSTEP: ATOMIC COORDINATES IN angstrom", forwardMatch=True, @@ -195,10 +190,6 @@ class CommonMatcher(object): #=========================================================================== # onClose triggers - def onClose_section_scf_iteration(self, backend, gIndex, section): - """Keep track of how many SCF iteration are made.""" - self.cache_service["number_of_scf_iterations"] += 1 - 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] @@ -254,13 +245,14 @@ 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 + # 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): @@ -321,7 +313,8 @@ class CommonMatcher(object): # If anything found, push the results to the correct section if len(force_array) != 0: - self.forces = force_array + # self.cache_service["atom_forces"] = force_array + self.backend.addArrayValues("x_cp2k_atom_forces", force_array, unit="forceAu") return wrapper @@ -334,7 +327,7 @@ class CommonMatcher(object): row2 = [float(x) for x in parser.fIn.readline().split()[-3:]] row3 = [float(x) for x in parser.fIn.readline().split()[-3:]] stress_array = np.array([row1, row2, row3]) - parser.backend.addArrayValues("stress_tensor", stress_array, unit="GPa") + parser.backend.addArrayValues("x_cp2k_stress_tensor", stress_array, unit="GPa") return wrapper @@ -369,14 +362,14 @@ class CommonMatcher(object): """Called when the SCF cycle of a single point calculation has converged. """ def wrapper(parser): - parser.backend.addValue("single_configuration_calculation_converged", True) + parser.backend.addValue("x_cp2k_quickstep_converged", True) return wrapper def adHoc_single_point_not_converged(self): """Called when the SCF cycle of a single point calculation did not converge. """ def wrapper(parser): - parser.backend.addValue("single_configuration_calculation_converged", False) + parser.backend.addValue("x_cp2k_quickstep_converged", False) return wrapper def adHoc_x_cp2k_section_quickstep_atom_information(self): @@ -420,6 +413,11 @@ class CommonMatcher(object): return wrapper + def debug(self): + def wrapper(parser): + print "FOUND" + return wrapper + #=========================================================================== def getOnCloseTriggers(self): """ diff --git a/parser/parser-cp2k/cp2kparser/versions/cp2k262/geooptparser.py b/parser/parser-cp2k/cp2kparser/versions/cp2k262/geooptparser.py index e9b2d8e189b158c31ce602a925a878b09bb59674..c3a49e883645b82ed1f6e62c1ce462ac5917401d 100644 --- a/parser/parser-cp2k/cp2kparser/versions/cp2k262/geooptparser.py +++ b/parser/parser-cp2k/cp2kparser/versions/cp2k262/geooptparser.py @@ -6,6 +6,8 @@ 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") @@ -30,80 +32,83 @@ class CP2KGeoOptParser(MainHierarchicalParser): # Cache levels self.caching_level_for_metaname.update({ 'x_cp2k_optimization_energy': CachingLevel.ForwardAndCache, - 'x_cp2k_optimization_step_size_convergence_limit': CachingLevel.ForwardAndCache, - 'x_cp2k_section_geometry_optimization_information': CachingLevel.ForwardAndCache, + 'x_cp2k_section_geometry_optimization_step': CachingLevel.ForwardAndCache, + 'x_cp2k_section_quickstep_calculation': CachingLevel.ForwardAndCache, + 'x_cp2k_section_geometry_optimization': CachingLevel.ForwardAndCache, + 'x_cp2k_section_geometry_optimization_energy_reevaluation': CachingLevel.ForwardAndCache, }) #======================================================================= # SimpleMatchers self.geo_opt = SM( " *** STARTING GEOMETRY OPTIMIZATION ***".replace("*", "\*"), - sections=["section_frame_sequence"], + sections=["section_frame_sequence", "x_cp2k_section_geometry_optimization"], subMatchers=[ SM( " *** CONJUGATE GRADIENTS ***".replace("*", "\*"), adHoc=self.adHoc_conjugate_gradient(), - otherMetaInfo=["geometry_optimization_method"] + otherMetaInfo=["geometry_optimization_method"], ), SM( " *** BFGS ***".replace("*", "\*"), adHoc=self.adHoc_bfgs(), - otherMetaInfo=["geometry_optimization_method"] + otherMetaInfo=["geometry_optimization_method"], ), SM( " *** L-BFGS ***".replace("*", "\*"), adHoc=self.adHoc_bfgs(), - otherMetaInfo=["geometry_optimization_method"] - ), - SM( "", - forwardMatch=True, - sections=["section_single_configuration_calculation", "section_system", "x_cp2k_section_geometry_optimization_information"], - subMatchers=[ - self.cm.scf(), - SM( " -------- Informations at step"), - SM( " Optimization Method =\s+(?P<x_cp2k_optimization_method>{})".format(self.cm.regex_word)), - SM( " Total Energy =\s+(?P<x_cp2k_optimization_energy__hartree>{})".format(self.cm.regex_f), - otherMetaInfo=["frame_sequence_potential_energy"] - ), - ], - adHoc=self.adHoc_step() + otherMetaInfo=["geometry_optimization_method"], ), + # SM( "", + # forwardMatch=True, + # sections=["section_single_configuration_calculation", "section_system", "x_cp2k_section_geometry_optimization_step"], + # subMatchers=[ + # self.cm.quickstep_calculation(), + # SM( " -------- Informations at step"), + # SM( " Optimization Method =\s+(?P<x_cp2k_optimization_method>{})".format(self.cm.regex_word)), + # SM( " Total Energy =\s+(?P<x_cp2k_optimization_energy__hartree>{})".format(self.cm.regex_f), + # otherMetaInfo=["frame_sequence_potential_energy"] + # ), + # ], + # otherMetaInfo=["atom_positions"], + # adHoc=self.adHoc_step(), + # ), SM( " OPTIMIZATION STEP:", + endReStr=" Conv. in RMS gradients =", name="geooptstep", repeats=True, - sections=["section_single_configuration_calculation", "section_system"], + sections=["section_system"], subMatchers=[ SM( "", forwardMatch=True, - sections=["x_cp2k_section_geometry_optimization_information"], + sections=["x_cp2k_section_geometry_optimization_step"], otherMetaInfo=[ "atom_positions", ], subMatchers=[ - SM( "", - forwardMatch=True, - endReStr=" *** MNBRACK - NUMBER OF ENERGY EVALUATIONS :\s+{}\s+***".replace("*", "\*").format(self.cm.regex_i), - subMatchers=[ - SM(" SCF WAVEFUNCTION OPTIMIZATION", - forwardMatch=True, - adHoc=self.debug(), - repeats=True, - subMatchers=[ - self.cm.scf(), - ] - ) - ] - ), - SM( "", - forwardMatch=True, - endReStr=" *** BRENT - NUMBER OF ENERGY EVALUATIONS :\s+{}\s+***".replace("*", "\*").format(self.cm.regex_i), - subMatchers=[ - SM(" SCF WAVEFUNCTION OPTIMIZATION", - forwardMatch=True, - repeats=True, - subMatchers=[ - self.cm.scf(), - ] - ) - ] - ), + # SM( "", + # forwardMatch=True, + # endReStr=" *** MNBRACK - NUMBER OF ENERGY EVALUATIONS :\s+{}\s+***".replace("*", "\*").format(self.cm.regex_i), + # subMatchers=[ + # SM(" SCF WAVEFUNCTION OPTIMIZATION", + # forwardMatch=True, + # repeats=True, + # subMatchers=[ + # self.cm.quickstep_calculation(), + # ] + # ) + # ] + # ), + # SM( "", + # forwardMatch=True, + # endReStr=" *** BRENT - NUMBER OF ENERGY EVALUATIONS :\s+{}\s+***".replace("*", "\*").format(self.cm.regex_i), + # subMatchers=[ + # SM(" SCF WAVEFUNCTION OPTIMIZATION", + # forwardMatch=True, + # repeats=True, + # subMatchers=[ + # self.cm.quickstep_calculation(), + # ] + # ) + # ] + # ), SM( " -------- Informations at step"), SM( " Optimization Method =\s+(?P<x_cp2k_optimization_method>{})".format(self.cm.regex_word)), SM( " Total Energy =\s+(?P<x_cp2k_optimization_energy__hartree>{})".format(self.cm.regex_f), @@ -135,6 +140,13 @@ class CP2KGeoOptParser(MainHierarchicalParser): adHoc=self.adHoc_geo_opt_converged(), otherMetaInfo=["geometry_optimization_converged"] ), + SM( " Reevaluating energy at the minimum", + sections=["x_cp2k_section_geometry_optimization_energy_reevaluation", "section_system"], + subMatchers=[ + self.cm.quickstep_calculation(), + ], + adHoc=self.adHoc_step() + ), ], ) @@ -150,7 +162,7 @@ class CP2KGeoOptParser(MainHierarchicalParser): sections=["section_method"], subMatchers=[ self.cm.header(), - self.cm.quickstep(), + self.cm.quickstep_header(), ], ), self.geo_opt @@ -159,11 +171,18 @@ class CP2KGeoOptParser(MainHierarchicalParser): #=========================================================================== # onClose triggers - def onClose_section_frame_sequence(self, backend, gIndex, section): + 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]) + self.cache_service.push_value("number_of_frames_in_sequence") self.cache_service.push_array_values("frame_sequence_potential_energy") - opt_section = section["x_cp2k_section_geometry_optimization_information"] + 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"] @@ -176,10 +195,10 @@ class CP2KGeoOptParser(MainHierarchicalParser): def onClose_section_sampling_method(self, backend, gIndex, section): self.backend.addValue("sampling_method", "geometry_optimization") - def onClose_x_cp2k_section_geometry_optimization_information(self, backend, gIndex, section): - energy = section["x_cp2k_optimization_energy"][0] - # backend.addValue("energy_total", energy) - self.cache_service["frame_sequence_potential_energy"].append(energy) + def onClose_x_cp2k_section_geometry_optimization_step(self, backend, gIndex, section): + energy = section["x_cp2k_optimization_energy"] + if energy is not None: + self.cache_service["frame_sequence_potential_energy"].append(energy[0]) def onClose_section_method(self, backend, gIndex, section): traj_file = self.file_service.get_file_by_id("trajectory") @@ -230,7 +249,6 @@ class CP2KGeoOptParser(MainHierarchicalParser): output file. Here further information is gathered from external files. """ def wrapper(parser): - # print "STEP" self.cache_service["number_of_frames_in_sequence"] += 1 # Get the next position from the trajectory file diff --git a/parser/parser-cp2k/cp2kparser/versions/cp2k262/singlepointparser.py b/parser/parser-cp2k/cp2kparser/versions/cp2k262/singlepointparser.py index 709210e77d52d4ddc35ec909c422d225dd619e44..44dfb53473559bf1ffb9df41b7b8ad1be1926d77 100644 --- a/parser/parser-cp2k/cp2kparser/versions/cp2k262/singlepointparser.py +++ b/parser/parser-cp2k/cp2kparser/versions/cp2k262/singlepointparser.py @@ -1,7 +1,9 @@ from nomadcore.simple_parser import SimpleMatcher as SM 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") @@ -18,6 +20,16 @@ class CP2KSinglePointParser(MainHierarchicalParser): super(CP2KSinglePointParser, self).__init__(file_path, parser_context) self.setup_common_matcher(CommonMatcher(parser_context)) + #======================================================================= + # Cache levels + self.caching_level_for_metaname.update({ + 'x_cp2k_energy_total_scf_iteration': CachingLevel.ForwardAndCache, + 'x_cp2k_energy_XC_scf_iteration': CachingLevel.ForwardAndCache, + 'x_cp2k_energy_change_scf_iteration': CachingLevel.ForwardAndCache, + 'x_cp2k_stress_tensor': CachingLevel.ForwardAndCache, + 'x_cp2k_section_stress_tensor': CachingLevel.ForwardAndCache, + }) + #======================================================================= # SimpleMatchers self.root_matcher = SM("", @@ -26,8 +38,8 @@ class CP2KSinglePointParser(MainHierarchicalParser): otherMetaInfo=["atom_forces"], subMatchers=[ self.cm.header(), - self.cm.quickstep(), - self.cm.scf() + self.cm.quickstep_header(), + self.cm.quickstep_calculation(), ] ) @@ -51,7 +63,28 @@ class CP2KSinglePointParser(MainHierarchicalParser): # iterations is given. E.g. in geometry optimization there are multiple # scf calculations so this loses it's meaning sort of. self.cache_service.push_value("number_of_scf_iterations") - self.cache_service["number_of_scf_iterations"] = 0 + + def onClose_x_cp2k_section_scf_iteration(self, backend, gIndex, section): + """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") + 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") + + 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") + backend.closeSection("section_stress_tensor", gId) #=========================================================================== # adHoc functions diff --git a/src/main/scala/eu/nomad_lab/parsers/Cp2kParser.scala b/src/main/scala/eu/nomad_lab/parsers/Cp2kParser.scala index 7ae2929b8ca7252e651ea611c441cbae4cfbeefa..3b5361dc1f2dda7b2c11063742adab169b8dfd5f 100644 --- a/src/main/scala/eu/nomad_lab/parsers/Cp2kParser.scala +++ b/src/main/scala/eu/nomad_lab/parsers/Cp2kParser.scala @@ -42,6 +42,7 @@ 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 eac9b2f0da1e9ad8a75d99b433f460e5fd142be7..28d467a831b7591b409dd89a535ac382ed696767 100644 --- a/test/unittests/cp2k_2.6.2/run_tests.py +++ b/test/unittests/cp2k_2.6.2/run_tests.py @@ -18,15 +18,19 @@ from cp2kparser import CP2KParser from nomadcore.unit_conversion.unit_conversion import convert_unit # Setup the logger so that it doesn't spam messages during tests -logging.basicConfig(level=logging.DEBUG, - format=('%(filename)s: ' - '%(levelname)s: ' - '%(funcName)s(): ' - '%(lineno)d:\t' - '%(message)s') - ) +logging.basicConfig( + level=logging.DEBUG, + format=( + '%(filename)s: ' + '%(levelname)s: ' + '%(funcName)s(): ' + '%(lineno)d:\t' + '%(message)s' + ) +) logger = logging.getLogger("nomad") logger.setLevel(logging.CRITICAL) +logging.getLogger("nomadcore.caching_backend").setLevel(logging.CRITICAL) #=============================================================================== @@ -42,7 +46,7 @@ def get_results(folder, metainfo_to_keep=None): """ dirname = os.path.dirname(__file__) filename = os.path.join(dirname, folder, "unittest.out") - parser = CP2KParser(filename, metainfo_to_keep) + parser = CP2KParser(filename, None) results = parser.parse() return results @@ -50,7 +54,7 @@ def get_results(folder, metainfo_to_keep=None): #=============================================================================== def get_result(folder, metaname, optimize=True): if optimize: - results = get_results(folder, metaname) + results = get_results(folder, None) else: results = get_results(folder) result = results[metaname] @@ -298,7 +302,7 @@ class TestEnergyForce(unittest.TestCase): self.assertTrue(np.array_equal(result, expected_result)) def test_atom_forces(self): - atomic_forces = self.results["atom_forces"] + result = self.results["atom_forces"] expected_result = convert_unit( np.array([ [0.00000000, 0.00000000, 0.00000000], @@ -312,7 +316,7 @@ class TestEnergyForce(unittest.TestCase): ]), "forceAu" ) - self.assertTrue(np.array_equal(atomic_forces, expected_result)) + self.assertTrue(np.array_equal(result, expected_result)) def test_atom_label(self): atom_labels = self.results["atom_labels"] @@ -486,13 +490,13 @@ class TestGeoOpt(unittest.TestCase): result = self.results["frame_sequence_potential_energy"] expected_result = convert_unit( np.array([ - -17.1488237635, -17.1534159246, -17.1941015290, -17.2092321965, -17.2097667733, -17.2097743028, -17.2097743229, + -17.20977820662248, ]), "hartree" ) @@ -527,9 +531,8 @@ class TestGeoOpt(unittest.TestCase): class TestGeoOptTrajFormats(unittest.TestCase): def test_xyz(self): + result = get_result("geo_opt/geometry_formats/xyz", "atom_positions", optimize=True) - # print "XYZ" - # print result expected_start = convert_unit( np.array([ [12.2353220000, 1.3766420000, 10.8698800000], @@ -597,17 +600,17 @@ if __name__ == '__main__': logger.setLevel(logging.ERROR) suites = [] - # suites.append(unittest.TestLoader().loadTestsFromTestCase(TestErrors)) - # suites.append(unittest.TestLoader().loadTestsFromTestCase(TestXCFunctional)) - # suites.append(unittest.TestLoader().loadTestsFromTestCase(TestEnergyForce)) - # suites.append(unittest.TestLoader().loadTestsFromTestCase(TestStressTensorMethods)) - # suites.append(unittest.TestLoader().loadTestsFromTestCase(TestSelfInteractionCorrectionMethod)) - # suites.append(unittest.TestLoader().loadTestsFromTestCase(TestConfigurationPeriodicDimensions)) - # suites.append(unittest.TestLoader().loadTestsFromTestCase(TestSCFConvergence)) - # suites.append(unittest.TestLoader().loadTestsFromTestCase(TestForceFiles)) - # suites.append(unittest.TestLoader().loadTestsFromTestCase(TestPreprocessor)) - # suites.append(unittest.TestLoader().loadTestsFromTestCase(TestGeoOpt)) - # suites.append(unittest.TestLoader().loadTestsFromTestCase(TestGeoOptTrajFormats)) + suites.append(unittest.TestLoader().loadTestsFromTestCase(TestErrors)) + suites.append(unittest.TestLoader().loadTestsFromTestCase(TestXCFunctional)) + suites.append(unittest.TestLoader().loadTestsFromTestCase(TestEnergyForce)) + suites.append(unittest.TestLoader().loadTestsFromTestCase(TestStressTensorMethods)) + suites.append(unittest.TestLoader().loadTestsFromTestCase(TestSelfInteractionCorrectionMethod)) + suites.append(unittest.TestLoader().loadTestsFromTestCase(TestConfigurationPeriodicDimensions)) + suites.append(unittest.TestLoader().loadTestsFromTestCase(TestSCFConvergence)) + suites.append(unittest.TestLoader().loadTestsFromTestCase(TestForceFiles)) + suites.append(unittest.TestLoader().loadTestsFromTestCase(TestPreprocessor)) + suites.append(unittest.TestLoader().loadTestsFromTestCase(TestGeoOpt)) + suites.append(unittest.TestLoader().loadTestsFromTestCase(TestGeoOptTrajFormats)) suites.append(unittest.TestLoader().loadTestsFromTestCase(TestGeoOptOptimizers)) alltests = unittest.TestSuite(suites) unittest.TextTestRunner(verbosity=0).run(alltests)