LCOV - code coverage report
Current view: top level - src/ket - KetAtomCreator.test.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 125 125 100.0 %
Date: 2026-10-14 13:16:16 Functions: 6 6 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/ket/KetAtomCreator.hpp"
       5             : 
       6             : #include "pairinteraction/database/Database.hpp"
       7             : #include "pairinteraction/ket/KetAtom.hpp"
       8             : #include "pairinteraction/ket/QuantumNumberNotAvailableError.hpp"
       9             : 
      10             : #include <doctest/doctest.h>
      11             : #include <string>
      12             : 
      13             : namespace pairinteraction {
      14           1 : DOCTEST_TEST_CASE("create a ket for rubidium") {
      15           1 :     Database &database = Database::get_global_instance();
      16           1 :     auto ket = KetAtomCreator(database)
      17           2 :                    .set_species("Rb")
      18           2 :                    .set_quantum_number("n", 60)
      19           2 :                    .set_quantum_number("l", 1)
      20           2 :                    .set_quantum_number("j", 0.5)
      21           2 :                    .set_quantum_number("m", 0.5)
      22           1 :                    .create();
      23           1 :     DOCTEST_CHECK(ket->get_species() == "Rb");
      24           1 :     DOCTEST_CHECK(ket->get_quantum_number("n") == 60);
      25           1 :     DOCTEST_CHECK(ket->get_quantum_number("l") == 1);
      26           1 :     DOCTEST_CHECK(ket->get_quantum_number("f") == 0.5);
      27           1 :     DOCTEST_CHECK(ket->get_quantum_number("j") == 0.5);
      28           1 :     DOCTEST_CHECK(ket->get_quantum_number("m") == 0.5);
      29           1 :     DOCTEST_CHECK(ket->get_quantum_number("s") == 0.5);
      30           1 :     DOCTEST_CHECK(ket->get_quantum_number("parity") == -1); // odd parity
      31           1 : }
      32             : 
      33           1 : DOCTEST_TEST_CASE("create a ket for strontium") {
      34           1 :     Database &database = Database::get_global_instance();
      35           1 :     auto ket = KetAtomCreator(database)
      36           2 :                    .set_species("Sr88_sqdt")
      37           2 :                    .set_quantum_number("n", 60)
      38           2 :                    .set_quantum_number("l", 1)
      39           2 :                    .set_quantum_number("f", 1)
      40           2 :                    .set_quantum_number("m", 0)
      41           2 :                    .set_quantum_number("s", 0)
      42           1 :                    .create();
      43           1 :     DOCTEST_CHECK(ket->get_species() == "Sr88_sqdt");
      44           1 :     DOCTEST_CHECK(ket->get_quantum_number("n") == 60);
      45           1 :     DOCTEST_CHECK(ket->get_quantum_number("f") == 1);
      46           1 :     DOCTEST_CHECK(ket->get_quantum_number("m") == 0);
      47           1 :     DOCTEST_CHECK(ket->get_quantum_number("parity") == -1); // odd parity
      48           1 : }
      49             : 
      50           1 : DOCTEST_TEST_CASE("quantum number std fallback") {
      51           1 :     Database &database = Database::get_global_instance();
      52             : 
      53             :     // n, f, and nu have no "std_<name>" column in the states table, so get_quantum_number_std
      54             :     // falls back to 0.
      55           1 :     auto ket = KetAtomCreator(database)
      56           2 :                    .set_species("Rb")
      57           2 :                    .set_quantum_number("n", 60)
      58           2 :                    .set_quantum_number("l", 0)
      59           2 :                    .set_quantum_number("j", 0.5)
      60           2 :                    .set_quantum_number("m", 0.5)
      61           1 :                    .create();
      62           1 :     DOCTEST_CHECK(ket->get_quantum_number_std("n") == 0);
      63           1 :     DOCTEST_CHECK(ket->get_quantum_number_std("f") == 0);
      64           1 :     DOCTEST_CHECK(ket->get_quantum_number_std("nu") == 0);
      65             : 
      66             :     // For an MQDT ket, quantum numbers that do have a "std_<name>" column report a nonzero spread,
      67             :     // confirming the zeros above come from the fallback and not from a stored value that is zero.
      68           1 :     auto ket_mqdt = KetAtomCreator(database)
      69           2 :                         .set_species("Yb171_mqdt")
      70           2 :                         .set_quantum_number("nu", 60)
      71           2 :                         .set_quantum_number("l", 0)
      72           2 :                         .set_quantum_number("f", 0.5)
      73           2 :                         .set_quantum_number("m", 0.5)
      74           1 :                         .create();
      75           1 :     DOCTEST_CHECK(ket_mqdt->get_quantum_number_std("l") > 0);
      76           1 :     DOCTEST_CHECK(ket_mqdt->get_quantum_number_std("n") == 0);
      77           1 : }
      78             : 
      79           1 : DOCTEST_TEST_CASE("quantum numbers of the coupling schemes") {
      80           1 :     Database &database = Database::get_global_instance();
      81             : 
      82             :     // The backend does not know any of these names; they are whatever the states table provides.
      83           1 :     auto ket = KetAtomCreator(database)
      84           2 :                    .set_species("Rb")
      85           2 :                    .set_quantum_number("n", 60)
      86           2 :                    .set_quantum_number("l", 1)
      87           2 :                    .set_quantum_number("j", 0.5)
      88           2 :                    .set_quantum_number("m", 0.5)
      89           1 :                    .create();
      90          12 :     for (const auto &name : {"l", "s", "j", "l_ryd", "s_ryd", "j_ryd", "l_core", "s_core", "j_core",
      91          13 :                              "i_core", "f_core"}) {
      92          11 :         DOCTEST_CHECK_NOTHROW(ket->get_quantum_number(name));
      93          11 :         DOCTEST_CHECK_NOTHROW(ket->get_quantum_number_std(name));
      94             :     }
      95             : 
      96             :     // The Rydberg electron is a single electron and the core of rubidium is a closed shell.
      97           1 :     DOCTEST_CHECK(ket->get_quantum_number("s_ryd") == 0.5);
      98           1 :     DOCTEST_CHECK(ket->get_quantum_number("j_core") == 0);
      99           1 :     DOCTEST_CHECK(ket->get_quantum_number("s_core") == 0);
     100             : 
     101             :     // Selecting a state by any of these quantum numbers must work
     102           1 :     auto ket_selected = KetAtomCreator(database)
     103           2 :                             .set_species("Rb")
     104           2 :                             .set_quantum_number("n", 60)
     105           2 :                             .set_quantum_number("l", 1)
     106           2 :                             .set_quantum_number("j", 0.5)
     107           2 :                             .set_quantum_number("m", 0.5)
     108           2 :                             .set_quantum_number("s_ryd", 0.5)
     109           1 :                             .create();
     110           1 :     DOCTEST_CHECK(*ket_selected == *ket);
     111           1 : }
     112             : 
     113           1 : DOCTEST_TEST_CASE("unavailable quantum number") {
     114           1 :     Database &database = Database::get_global_instance();
     115           1 :     auto ket = KetAtomCreator(database)
     116           2 :                    .set_species("Rb")
     117           2 :                    .set_quantum_number("n", 60)
     118           2 :                    .set_quantum_number("l", 1)
     119           2 :                    .set_quantum_number("j", 0.5)
     120           2 :                    .set_quantum_number("m", 0.5)
     121           1 :                    .create();
     122             : 
     123             :     // The states table of Rb has no column for this quantum number (here a misspelling of "nui"),
     124           3 :     DOCTEST_CHECK_THROWS_AS(ket->get_quantum_number("nu_i"), QuantumNumberNotAvailableError);
     125           3 :     DOCTEST_CHECK_THROWS_AS(ket->get_quantum_number_std("nu_i"), QuantumNumberNotAvailableError);
     126             : 
     127             :     // The error names the quantum number, so that a caller can react to it.
     128             :     try {
     129           3 :         ket->get_quantum_number("nu_i");
     130           1 :     } catch (const QuantumNumberNotAvailableError &e) {
     131           1 :         DOCTEST_CHECK(e.get_name() == "nu_i");
     132           1 :         DOCTEST_CHECK(std::string(e.what()).find("nu_i") != std::string::npos);
     133           1 :     }
     134           1 : }
     135             : 
     136           1 : DOCTEST_TEST_CASE("test for equality") {
     137           1 :     Database &database = Database::get_global_instance();
     138           1 :     auto ket1 = KetAtomCreator(database)
     139           2 :                     .set_species("Rb")
     140           2 :                     .set_quantum_number("n", 60)
     141           2 :                     .set_quantum_number("l", 1)
     142           2 :                     .set_quantum_number("j", 0.5)
     143           2 :                     .set_quantum_number("m", 0.5)
     144           1 :                     .create();
     145           1 :     auto ket2 = KetAtomCreator(database)
     146           2 :                     .set_species("Rb")
     147           2 :                     .set_quantum_number("n", 60)
     148           2 :                     .set_quantum_number("l", 1)
     149           2 :                     .set_quantum_number("j", 0.5)
     150           2 :                     .set_quantum_number("m", 0.5)
     151           1 :                     .create();
     152           1 :     auto ket3 = KetAtomCreator(database)
     153           2 :                     .set_species("Rb")
     154           2 :                     .set_quantum_number("n", 60)
     155           2 :                     .set_quantum_number("l", 1)
     156           2 :                     .set_quantum_number("j", 1.5)
     157           2 :                     .set_quantum_number("m", 0.5)
     158           1 :                     .create();
     159           1 :     DOCTEST_CHECK(*ket1 == *ket2);
     160           1 :     DOCTEST_CHECK(*ket1 != *ket3);
     161           1 : }
     162             : 
     163             : } // namespace pairinteraction

Generated by: LCOV version 1.16