LCOV - code coverage report
Current view: top level - src/database - Database.test.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 64 64 100.0 %
Date: 2026-06-19 12:50:25 Functions: 9 9 100.0 %

          Line data    Source code
       1             : // SPDX-FileCopyrightText: 2024 PairInteraction Developers
       2             : // SPDX-License-Identifier: LGPL-3.0-or-later
       3             : 
       4             : #include "pairinteraction/database/Database.hpp"
       5             : 
       6             : #include "pairinteraction/basis/BasisAtom.hpp"
       7             : #include "pairinteraction/database/AtomDescriptionByParameters.hpp"
       8             : #include "pairinteraction/database/AtomDescriptionByRanges.hpp"
       9             : #include "pairinteraction/enums/OperatorType.hpp"
      10             : #include "pairinteraction/ket/KetAtom.hpp"
      11             : 
      12             : #include <doctest/doctest.h>
      13             : 
      14             : namespace pairinteraction {
      15           1 : DOCTEST_TEST_CASE("get a KetAtom") {
      16           1 :     Database &database = Database::get_global_instance();
      17             : 
      18           1 :     AtomDescriptionByParameters description;
      19           4 :     description.quantum_numbers = {{"n", 60}, {"l", 0}, {"m", 0.5}};
      20             : 
      21           1 :     auto ket = database.get_ket("Rb", description);
      22             : 
      23           1 :     DOCTEST_MESSAGE("KetAtom: ", *ket);
      24           2 : }
      25             : 
      26           1 : DOCTEST_TEST_CASE("too large quantum number m") {
      27           1 :     Database &database = Database::get_global_instance();
      28             : 
      29           1 :     AtomDescriptionByParameters description;
      30           4 :     description.quantum_numbers = {{"n", 60}, {"l", 0}, {"m", 1.5}};
      31             : 
      32           3 :     DOCTEST_CHECK_THROWS(database.get_ket("Rb", description));
      33           2 : }
      34             : 
      35           1 : DOCTEST_TEST_CASE("not uniquely specified ket") {
      36           1 :     Database &database = Database::get_global_instance();
      37             : 
      38           1 :     AtomDescriptionByParameters description;
      39           4 :     description.quantum_numbers = {{"n", 60}, {"l", 0.9}, {"m", 0.5}};
      40             : 
      41           3 :     DOCTEST_CHECK_THROWS(database.get_ket("Rb", description));
      42           2 : }
      43             : 
      44           1 : DOCTEST_TEST_CASE("quantum number not stored in the database table for get_ket") {
      45           1 :     Database &database = Database::get_global_instance();
      46             : 
      47           1 :     AtomDescriptionByParameters description;
      48           4 :     description.quantum_numbers = {{"n", 60}, {"m", 0.5}, {"not_a_quantum_number", 1}};
      49             : 
      50           3 :     DOCTEST_CHECK_THROWS_WITH_AS(
      51             :         database.get_ket("Rb", description),
      52             :         "The quantum number 'not_a_quantum_number' is not stored in the database table for species "
      53             :         "'Rb'.",
      54             :         std::invalid_argument);
      55           2 : }
      56             : 
      57           1 : DOCTEST_TEST_CASE("quantum number not stored in the database table for get_basis") {
      58           1 :     Database &database = Database::get_global_instance();
      59             : 
      60           1 :     AtomDescriptionByRanges description;
      61           4 :     description.quantum_number_ranges = {{"not_a_quantum_number", {1, 2}}};
      62             : 
      63           4 :     DOCTEST_CHECK_THROWS_WITH_AS(
      64             :         database.get_basis<double>("Yb171_mqdt", description, {}),
      65             :         "The quantum number 'not_a_quantum_number' is not stored in the database table for species "
      66             :         "'Yb171_mqdt'.",
      67             :         std::invalid_argument);
      68           5 : }
      69             : 
      70           1 : DOCTEST_TEST_CASE("uniquely specified ket") {
      71           1 :     Database &database = Database::get_global_instance();
      72             : 
      73           1 :     AtomDescriptionByParameters description;
      74           5 :     description.quantum_numbers = {{"n", 60}, {"l", 0.9}, {"j", 0.5}, {"m", 0.5}};
      75             : 
      76           1 :     DOCTEST_CHECK_NOTHROW(database.get_ket("Rb", description));
      77           2 : }
      78             : 
      79           1 : DOCTEST_TEST_CASE("get a BasisAtom") {
      80           1 :     Database &database = Database::get_global_instance();
      81             : 
      82           1 :     AtomDescriptionByRanges description;
      83           7 :     description.quantum_number_ranges = {{"n", {60, 60}}, {"l", {0, 1}}};
      84             : 
      85           1 :     auto basis = database.get_basis<double>("Rb", description, {});
      86             : 
      87          17 :     for (const auto &ket : *basis) {
      88           8 :         DOCTEST_MESSAGE("KetAtom: ", *ket);
      89           8 :     }
      90           7 : }
      91             : 
      92           1 : DOCTEST_TEST_CASE("get atomic matrix elements") {
      93           1 :     Database &database = Database::get_global_instance();
      94             : 
      95           1 :     AtomDescriptionByRanges description;
      96           7 :     description.quantum_number_ranges = {{"n", {60, 60}}, {"l", {0, 1}}};
      97             : 
      98           1 :     auto basis = database.get_basis<double>("Rb", description, {});
      99             : 
     100             :     auto dipole = database.get_matrix_elements_in_canonical_basis<double>(
     101           1 :         basis, basis, OperatorType::ELECTRIC_DIPOLE, 0);
     102             : 
     103           1 :     DOCTEST_MESSAGE("Number of basis states: ", basis->get_number_of_states());
     104           1 :     DOCTEST_MESSAGE("Number of non-zero entries: ", dipole.nonZeros());
     105           7 : }
     106             : 
     107           1 : DOCTEST_TEST_CASE("atomic matrix elements reject bases from a different database") {
     108           1 :     Database &database = Database::get_global_instance();
     109             : 
     110           1 :     AtomDescriptionByRanges description;
     111           7 :     description.quantum_number_ranges = {{"n", {60, 60}}, {"l", {0, 1}}};
     112             : 
     113           1 :     auto basis = database.get_basis<double>("Rb", description, {});
     114             : 
     115           1 :     Database other_database(database.get_download_missing(), database.get_use_cache(),
     116           2 :                             database.get_database_dir());
     117             : 
     118           3 :     DOCTEST_CHECK_THROWS_WITH_AS(
     119             :         other_database.get_matrix_elements_in_canonical_basis<double>(
     120             :             basis, basis, OperatorType::ELECTRIC_DIPOLE, 0),
     121             :         "The initial and final bases must belong to the Database instance used for the matrix "
     122             :         "element calculation.",
     123             :         std::invalid_argument);
     124           7 : }
     125             : } // namespace pairinteraction

Generated by: LCOV version 1.16