""" 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. Each property that has an enumerable list of different possible options is assigned a new test class, that should ideally test through all the options. The properties that can have any value imaginable will be tested only for one specific case inside a test class that is designed for a certain type of run (MD, optimization, QM/MM, etc.) """ import os import unittest import logging import numpy as np from cp2kparser import CP2KParser 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__) filename = os.path.join(dirname, folder, "unittest.out") parser = CP2KParser(filename, metainfo_to_keep) results = parser.parse() return results #=============================================================================== def get_result(folder, metaname): results = get_results(folder, metaname) result = results[metaname] return result #=============================================================================== class TestXCFunctional(unittest.TestCase): """Tests that the XC functionals can be properly parsed. """ def test_pade(self): xc = get_result("XC_functional/pade", "XC_functional") self.assertEqual(xc, "1*LDA_XC_TETER93") def test_lda(self): xc = get_result("XC_functional/lda", "XC_functional") self.assertEqual(xc, "1*LDA_XC_TETER93") def test_blyp(self): xc = get_result("XC_functional/blyp", "XC_functional") self.assertEqual(xc, "1*GGA_C_LYP+1*GGA_X_B88") def test_b3lyp(self): xc = get_result("XC_functional/b3lyp", "XC_functional") self.assertEqual(xc, "1*HYB_GGA_XC_B3LYP") def test_olyp(self): xc = get_result("XC_functional/olyp", "XC_functional") self.assertEqual(xc, "1*GGA_C_LYP+1*GGA_X_OPTX") def test_hcth120(self): xc = get_result("XC_functional/hcth120", "XC_functional") self.assertEqual(xc, "1*GGA_XC_HCTH_120") def test_pbe0(self): xc = get_result("XC_functional/pbe0", "XC_functional") self.assertEqual(xc, "1*HYB_GGA_XC_PBEH") def test_pbe(self): xc = get_result("XC_functional/pbe", "XC_functional") self.assertEqual(xc, "1*GGA_C_PBE+1*GGA_X_PBE") #=============================================================================== class TestSelfInteractionCorrectionMethod(unittest.TestCase): """Tests that the self-interaction correction can be properly parsed. """ def test_no(self): sic = get_result("sic/no", "self_interaction_correction_method") self.assertEqual(sic, "") def test_ad(self): sic = get_result("sic/ad", "self_interaction_correction_method") self.assertEqual(sic, "SIC_AD") def test_explicit_orbitals(self): sic = get_result("sic/explicit_orbitals", "self_interaction_correction_method") self.assertEqual(sic, "SIC_EXPLICIT_ORBITALS") def test_mauri_spz(self): sic = get_result("sic/mauri_spz", "self_interaction_correction_method") self.assertEqual(sic, "SIC_MAURI_SPZ") def test_mauri_us(self): sic = get_result("sic/mauri_us", "self_interaction_correction_method") self.assertEqual(sic, "SIC_MAURI_US") #=============================================================================== class TestEnergyForce(unittest.TestCase): """Tests for a CP2K calculation with RUN_TYPE ENERGY_FORCE. """ def setUp(self): self.results = get_results("energy_force", "section_run") 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_change_scf_iteration(self): energy_change = self.results["energy_change_scf_iteration"] expected_result = convert_unit(np.array(-3.22E+01), "hartree") self.assertTrue(np.array_equal(energy_change[0], expected_result)) def test_energy_XC_scf_iteration(self): result = self.results["energy_XC_scf_iteration"] expected_result = convert_unit(np.array(-9.4555961214), "hartree") self.assertTrue(np.array_equal(result[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_electronic_kinetic_energy(self): result = self.results["electronic_kinetic_energy"] expected_result = convert_unit(np.array(13.31525592466418), "hartree") self.assertTrue(np.array_equal(result, 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], ]), "forceAu" ) self.assertTrue(np.array_equal(atomic_forces, expected_result)) 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)) def test_cp2k_filenames(self): input_filename = self.results["cp2k_input_filename"] expected_input = "si_bulk8.inp" self.assertTrue(input_filename, expected_input) bs_filename = self.results["cp2k_basis_set_filename"] expected_bs = "../BASIS_SET" self.assertEqual(bs_filename, expected_bs) geminal_filename = self.results["cp2k_geminal_filename"] expected_geminal = "BASIS_GEMINAL" self.assertEqual(geminal_filename, expected_geminal) potential_filename = self.results["cp2k_potential_filename"] expected_potential = "../GTH_POTENTIALS" self.assertEqual(potential_filename, expected_potential) mm_potential_filename = self.results["cp2k_mm_potential_filename"] expected_mm_potential = "MM_POTENTIAL" self.assertEqual(mm_potential_filename, expected_mm_potential) coordinate_filename = self.results["cp2k_coordinate_filename"] expected_coordinate = "__STD_INPUT__" self.assertEqual(coordinate_filename, expected_coordinate) def test_target_multiplicity(self): multiplicity = self.results["target_multiplicity"] self.assertEqual(multiplicity, 1) def test_total_charge(self): charge = self.results["total_charge"] self.assertEqual(charge, 0) #=============================================================================== if __name__ == '__main__': pass logger = logging.getLogger("cp2kparser") logger.setLevel(logging.ERROR) suites = [] suites.append(unittest.TestLoader().loadTestsFromTestCase(TestXCFunctional)) suites.append(unittest.TestLoader().loadTestsFromTestCase(TestEnergyForce)) suites.append(unittest.TestLoader().loadTestsFromTestCase(TestSelfInteractionCorrectionMethod)) alltests = unittest.TestSuite(suites) unittest.TextTestRunner(verbosity=0).run(alltests)