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 : 9 : #include <doctest/doctest.h> 10 : 11 : namespace pairinteraction { 12 1 : DOCTEST_TEST_CASE("create a ket for rubidium") { 13 1 : Database &database = Database::get_global_instance(); 14 1 : auto ket = KetAtomCreator("Rb", 60, 1, 0.5, 0.5).create(database); 15 1 : DOCTEST_CHECK(ket->get_species() == "Rb"); 16 1 : DOCTEST_CHECK(ket->get_quantum_number("n") == 60); 17 1 : DOCTEST_CHECK(ket->get_quantum_number("l") == 1); 18 1 : DOCTEST_CHECK(ket->get_quantum_number("f") == 0.5); 19 1 : DOCTEST_CHECK(ket->get_quantum_number("j") == 0.5); 20 1 : DOCTEST_CHECK(ket->get_quantum_number("m") == 0.5); 21 1 : DOCTEST_CHECK(ket->get_quantum_number("s") == 0.5); 22 1 : DOCTEST_CHECK(ket->get_quantum_number("parity") == -1); // odd parity 23 1 : DOCTEST_MESSAGE("Ket: ", *ket); 24 1 : } 25 : 26 1 : DOCTEST_TEST_CASE("create a ket for strontium") { 27 1 : Database &database = Database::get_global_instance(); 28 1 : auto ket = KetAtomCreator() 29 2 : .set_species("Sr88_singlet") 30 2 : .set_quantum_number("n", 60) 31 2 : .set_quantum_number("l", 1) 32 2 : .set_quantum_number("f", 1) 33 2 : .set_quantum_number("m", 0) 34 2 : .set_quantum_number("s", 0) 35 1 : .create(database); 36 1 : DOCTEST_CHECK(ket->get_species() == "Sr88_singlet"); 37 1 : DOCTEST_CHECK(ket->get_quantum_number("n") == 60); 38 1 : DOCTEST_CHECK(ket->get_quantum_number("f") == 1); 39 1 : DOCTEST_CHECK(ket->get_quantum_number("m") == 0); 40 1 : DOCTEST_CHECK(ket->get_quantum_number("parity") == -1); // odd parity 41 1 : DOCTEST_MESSAGE("Ket: ", *ket); 42 1 : } 43 : 44 1 : DOCTEST_TEST_CASE("quantum number std fallback") { 45 1 : Database &database = Database::get_global_instance(); 46 : 47 : // n, f, and nu have no "std_<name>" column in the states table, so get_quantum_number_std 48 : // falls back to 0. 49 1 : auto ket = KetAtomCreator("Rb", 60, 0, 0.5, 0.5).create(database); 50 1 : DOCTEST_CHECK(ket->get_quantum_number_std("n") == 0); 51 1 : DOCTEST_CHECK(ket->get_quantum_number_std("f") == 0); 52 1 : DOCTEST_CHECK(ket->get_quantum_number_std("nu") == 0); 53 : 54 : // For an MQDT ket, quantum numbers that do have a "std_<name>" column report a nonzero spread, 55 : // confirming the zeros above come from the fallback and not from a stored value that is zero. 56 1 : auto ket_mqdt = KetAtomCreator() 57 2 : .set_species("Yb171_mqdt") 58 2 : .set_quantum_number("nu", 60) 59 2 : .set_quantum_number("l", 0) 60 2 : .set_quantum_number("f", 0.5) 61 2 : .set_quantum_number("m", 0.5) 62 1 : .create(database); 63 1 : DOCTEST_CHECK(ket_mqdt->get_quantum_number_std("l") > 0); 64 1 : DOCTEST_CHECK(ket_mqdt->get_quantum_number_std("n") == 0); 65 1 : } 66 : 67 1 : DOCTEST_TEST_CASE("test for equality") { 68 1 : Database &database = Database::get_global_instance(); 69 1 : auto ket1 = KetAtomCreator("Rb", 60, 1, 0.5, 0.5).create(database); 70 1 : auto ket2 = KetAtomCreator("Rb", 60, 1, 0.5, 0.5).create(database); 71 1 : auto ket3 = KetAtomCreator("Rb", 60, 1, 1.5, 0.5).create(database); 72 1 : DOCTEST_CHECK(*ket1 == *ket2); 73 1 : DOCTEST_CHECK(*ket1 != *ket3); 74 1 : } 75 : 76 : } // namespace pairinteraction