""" This is a module for unit testing the CP2K parser. The unit tests are run with a custom backend that outputs the results directly into native python object for easier and faster analysis. """ import os import unittest import logging import numpy as np from cp2kparser import CP2KParser from nomadtoolkit import Analyzer from nomadcore.unit_conversion.unit_conversion import convert_unit #=============================================================================== def get_results(folder, metainfo_to_keep=None): """Get the given result from the calculation in the given folder by using the Analyzer in the nomadtoolkit package. Tries to optimize the parsing by giving the metainfo_to_keep argument. Args: folder: The folder relative to the directory of this script where the parsed calculation resides. metaname: The quantity to extract. """ dirname = os.path.dirname(__file__) folder = os.path.join(dirname, folder) parser = CP2KParser(folder, metainfo_to_keep) analyzer = Analyzer(parser) results = analyzer.parse() return results #=============================================================================== def get_result(folder, metaname): results = get_results(folder, metaname) result = results[metaname] return result #=============================================================================== class TestXCFunctional(unittest.TestCase): def test_pade(self): xc = get_result("XC_functional/pade", "XC_functional") self.assertEqual(xc, "LDA_XC_TETER93") def test_lda(self): xc = get_result("XC_functional/lda", "XC_functional") self.assertEqual(xc, "LDA_XC_TETER93") def test_becke88(self): xc = get_result("XC_functional/becke88", "XC_functional") self.assertEqual(xc, "GGA_X_B88") def test_blyp(self): xc = get_result("XC_functional/blyp", "XC_functional") self.assertEqual(xc, "GGA_C_LYP_GGA_X_B88") #=============================================================================== class TestSectionSingleConfigurationCalculation(unittest.TestCase): def setUp(self): self.results = get_results("section_single_configuration_calculation", "section_single_configuration_calculation") def test_energy_total_scf_iteration(self): energy_total = self.results["energy_total_scf_iteration"] expected_result = convert_unit(np.array(-32.2320848878), "hartree") self.assertTrue(np.array_equal(energy_total[0], expected_result)) def test_energy_total(self): energy_total = self.results["energy_total"] expected_result = convert_unit(np.array(-31.297885372811063), "hartree") self.assertTrue(np.array_equal(energy_total, expected_result)) def test_atom_forces(self): atomic_forces = self.results["atom_forces"] expected_result = convert_unit( np.array([ [0.00000000, 0.00000000, 0.00000000], [0.00000000, 0.00000001, 0.00000001], [0.00000001, 0.00000001, 0.00000000], [0.00000001, 0.00000000, 0.00000001], [-0.00000001, -0.00000001, -0.00000001], [-0.00000001, -0.00000001, -0.00000001], [-0.00000001, -0.00000001, -0.00000001], [-0.00000001, -0.00000001, -0.00000001], ]), "force_au" ) self.assertTrue(np.array_equal(atomic_forces, expected_result)) #=============================================================================== class TestSectionSystemDescription(unittest.TestCase): def setUp(self): self.results = get_results("section_system_description", "section_system_description") def test_atom_label(self): atom_labels = self.results["atom_label"] expected_labels = np.array(8*["Si"]) self.assertTrue(np.array_equal(atom_labels, expected_labels)) def test_simulation_cell(self): cell = self.results["simulation_cell"] n_vectors = cell.shape[0] n_dim = cell.shape[1] self.assertEqual(n_vectors, 3) self.assertEqual(n_dim, 3) expected_cell = convert_unit(np.array([[5.431, 0, 0], [0, 5.431, 0], [0, 0, 5.431]]), "angstrom") self.assertTrue(np.array_equal(cell, expected_cell)) def test_number_of_atoms(self): n_atoms = self.results["number_of_atoms"] self.assertEqual(n_atoms, 8) def test_atom_position(self): atom_position = self.results["atom_position"] expected_position = convert_unit(np.array([4.073023, 4.073023, 1.357674]), "angstrom") self.assertTrue(np.array_equal(atom_position[-1, :], expected_position)) #=============================================================================== if __name__ == '__main__': pass logger = logging.getLogger("cp2kparser") logger.setLevel(logging.ERROR) suites = [] suites.append(unittest.TestLoader().loadTestsFromTestCase(TestXCFunctional)) suites.append(unittest.TestLoader().loadTestsFromTestCase(TestSectionSingleConfigurationCalculation)) suites.append(unittest.TestLoader().loadTestsFromTestCase(TestSectionSystemDescription)) alltests = unittest.TestSuite(suites) unittest.TextTestRunner(verbosity=0).run(alltests)