LCOV - code coverage report
Current view: top level - src/database - Database.test.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 74 74 100.0 %
Date: 2026-10-14 13:16:16 Functions: 10 10 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             : #include <stdexcept>
      14             : 
      15             : namespace pairinteraction {
      16           1 : DOCTEST_TEST_CASE("get a KetAtom") {
      17           1 :     Database &database = Database::get_global_instance();
      18             : 
      19           1 :     AtomDescriptionByParameters description;
      20           4 :     description.quantum_numbers = {{"n", 60}, {"l", 0}, {"m", 0.5}};
      21             : 
      22           1 :     auto ket = database.get_ket("Rb", description);
      23           1 :     DOCTEST_REQUIRE(ket != nullptr);
      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           1 :     DOCTEST_CHECK(basis->get_number_of_states() > 0);
      88           7 : }
      89             : 
      90           1 : DOCTEST_TEST_CASE("get atomic matrix elements") {
      91           1 :     Database &database = Database::get_global_instance();
      92             : 
      93           1 :     AtomDescriptionByRanges description;
      94           7 :     description.quantum_number_ranges = {{"n", {60, 60}}, {"l", {0, 1}}};
      95             : 
      96           1 :     auto basis = database.get_basis<double>("Rb", description, {});
      97             : 
      98             :     auto dipole = database.get_matrix_elements_in_canonical_basis<double>(
      99           1 :         basis, basis, OperatorType::ELECTRIC_DIPOLE, 0);
     100             : 
     101           1 :     DOCTEST_MESSAGE("Number of basis states: ", basis->get_number_of_states());
     102           1 :     DOCTEST_MESSAGE("Number of non-zero entries: ", dipole.nonZeros());
     103           7 : }
     104             : 
     105           1 : DOCTEST_TEST_CASE("get the monopole operator") {
     106           1 :     Database &database = Database::get_global_instance();
     107             : 
     108           1 :     AtomDescriptionByRanges description;
     109           7 :     description.quantum_number_ranges = {{"n", {60, 60}}, {"l", {0, 1}}};
     110             : 
     111           1 :     DOCTEST_SUBCASE("singly charged ion") {
     112           1 :         auto basis = database.get_basis<double>("Sr88_ion", description, {});
     113             :         auto monopole = database.get_matrix_elements_in_canonical_basis<double>(
     114           1 :             basis, basis, OperatorType::ELECTRIC_MONOPOLE, 0);
     115             : 
     116             :         // The charge is given in units of the charge -e of the Rydberg electron
     117           1 :         Eigen::MatrixXd expected = -Eigen::MatrixXd::Identity(monopole.rows(), monopole.cols());
     118           1 :         DOCTEST_CHECK(basis->get_number_of_kets() > 0);
     119           1 :         DOCTEST_CHECK(Eigen::MatrixXd(monopole).isApprox(expected, 1e-12));
     120           2 :     }
     121           7 : }
     122             : 
     123           1 : DOCTEST_TEST_CASE("atomic matrix elements reject bases from a different database") {
     124           1 :     Database &database = Database::get_global_instance();
     125             : 
     126           1 :     AtomDescriptionByRanges description;
     127           7 :     description.quantum_number_ranges = {{"n", {60, 60}}, {"l", {0, 1}}};
     128             : 
     129           1 :     auto basis = database.get_basis<double>("Rb", description, {});
     130             : 
     131           1 :     Database other_database(database.get_download_missing(), database.get_use_cache(),
     132           2 :                             database.get_database_dir());
     133             : 
     134           3 :     DOCTEST_CHECK_THROWS_WITH_AS(
     135             :         other_database.get_matrix_elements_in_canonical_basis<double>(
     136             :             basis, basis, OperatorType::ELECTRIC_DIPOLE, 0),
     137             :         "The initial and final bases must belong to the Database instance used for the matrix "
     138             :         "element calculation.",
     139             :         std::invalid_argument);
     140           7 : }
     141             : } // namespace pairinteraction

Generated by: LCOV version 1.16