10#include <spdlog/spdlog.h>
16int main(
int argc,
char **argv) {
23 bool download_missing =
false;
25 for (
int i = 1; i < argc; ++i) {
47 .restrict_quantum_number_n(58, 62)
48 .restrict_quantum_number_l(0, 2)
51 SPDLOG_INFO(
"Number of basis states: {}", basis->get_number_of_states());
54 std::vector<pairinteraction::SystemAtom<double>> systems;
56 for (
int i = 0; i < 11; ++i) {
59 systems.push_back(std::move(system));
67 for (
auto &system : systems) {
69 system.transform(sorter);
73 std::vector<std::string> kets;
76 systems.size(), basis->get_number_of_states() * basis->get_number_of_states());
79 kets.reserve(basis->get_number_of_states());
80 for (
const auto &ket : *basis) {
83 kets.push_back(ss.str());
86 for (Eigen::Index i = 0; i < static_cast<Eigen::Index>(systems.size()); ++i) {
87 eigenenergies.row(i) = systems[i].get_eigenenergies() *
HARTREE_IN_GHZ;
90 systems[i].get_eigenbasis()->get_coefficients().toDense().transpose();
91 eigenstates.row(i) = Eigen::Map<Eigen::VectorXd>(tmp.data(), tmp.size());
93 overlaps.row(i) = systems[i].get_eigenbasis()->get_overlaps(ket);
101 SPDLOG_INFO(
"Reference kets: {}", reference_kets_file.string());
103 std::vector<std::string> reference_kets;
105 std::ifstream stream(reference_kets_file);
107 SPDLOG_ERROR(
"Could not open reference kets file");
110 reference_kets.reserve(basis->get_number_of_states());
111 while (std::getline(stream, line)) {
112 reference_kets.push_back(line);
115 if (kets.size() != reference_kets.size()) {
116 SPDLOG_ERROR(
"Number of kets does not match reference data");
118 }
else if (kets != reference_kets) {
119 for (
size_t i = 0; i < kets.size(); ++i) {
120 SPDLOG_DEBUG(
"Ket: {} vs {}, match: {}", kets[i], reference_kets[i],
121 kets[i] == reference_kets[i]);
123 SPDLOG_ERROR(
"Kets do not match reference data");
130 data_dir /
"reference_stark_map/eigenenergies.txt";
131 SPDLOG_INFO(
"Reference eigenenergies: {}", reference_eigenenergies_file.string());
133 Eigen::MatrixXd reference_eigenenergies(systems.size(), basis->get_number_of_states());
134 stream = std::ifstream(reference_eigenenergies_file);
136 SPDLOG_ERROR(
"Could not open reference eigenenergies file");
139 for (Eigen::Index i = 0; i < static_cast<Eigen::Index>(systems.size()); ++i) {
140 for (Eigen::Index j = 0; j < static_cast<Eigen::Index>(basis->get_number_of_states());
142 stream >> reference_eigenenergies(i, j);
146 if ((eigenenergies - reference_eigenenergies).array().abs().maxCoeff() >
148 for (Eigen::Index i = 0; i < eigenenergies.size(); ++i) {
149 SPDLOG_DEBUG(
"Eigenenergy: {} vs {}, delta: {}", eigenenergies(i),
150 reference_eigenenergies(i),
151 std::abs(eigenenergies(i) - reference_eigenenergies(i)));
153 SPDLOG_ERROR(
"Eigenenergies do not match reference data");
160 data_dir /
"reference_stark_map/overlaps.txt";
161 SPDLOG_INFO(
"Reference overlaps: {}", reference_overlaps_file.string());
163 Eigen::MatrixXd reference_overlaps(systems.size(), basis->get_number_of_states());
164 stream = std::ifstream(reference_overlaps_file);
166 SPDLOG_ERROR(
"Could not open reference overlap file");
169 for (Eigen::Index i = 0; i < static_cast<Eigen::Index>(systems.size()); ++i) {
170 for (Eigen::Index j = 0; j < static_cast<Eigen::Index>(basis->get_number_of_states());
172 stream >> reference_overlaps(i, j);
176 if ((overlaps - reference_overlaps).array().abs().maxCoeff() > 5e-5) {
177 for (Eigen::Index i = 0; i < overlaps.size(); ++i) {
178 SPDLOG_DEBUG(
"Overlap: {} vs {}, delta: {}", overlaps(i), reference_overlaps(i),
179 std::abs(overlaps(i) - reference_overlaps(i)));
181 SPDLOG_ERROR(
"Overlaps do not match reference data");
189 Eigen::VectorXd cumulative_norm =
190 (eigenstates.adjoint().array() * eigenstates.transpose().array()).colwise().sum();
191 if (!cumulative_norm.isApprox(Eigen::VectorXd::Constant(11, 90), 5e-5)) {
192 SPDLOG_ERROR(
"Eigenvectors are not orthonormal.");
196 return success ? 0 : 1;
Builder class for creating BasisAtom objects.
BasisAtomCreator< Scalar > & set_species(const std::string &value)
Builder class for creating KetAtom objects.
KetAtomCreator & set_quantum_number_n(int value)
std::shared_ptr< const KetAtom > create(Database &database) const
KetAtomCreator & set_quantum_number_l(double value)
KetAtomCreator & set_species(const std::string &value)
KetAtomCreator & set_quantum_number_m(double value)
Type & set_electric_field(const std::array< real_t, 3 > &field)
Matrix< Type, Dynamic, Dynamic > MatrixX
bool parse_data_dir(int &i, int argc, char **const argv, std::filesystem::path &data_dir)
bool parse_database_dir(int &i, int argc, char **const argv, std::filesystem::path &database_dir)
bool parse_download_missing(int &i, int argc, char **const argv, bool &download_missing)
void diagonalize(std::initializer_list< std::reference_wrapper< Derived > > systems, const DiagonalizerInterface< typename Derived::scalar_t > &diagonalizer, std::optional< typename Derived::real_t > min_eigenenergy={}, std::optional< typename Derived::real_t > max_eigenenergy={}, double rtol=1e-6)
constexpr double HARTREE_IN_GHZ
int main(int argc, char **argv)
constexpr double VOLT_PER_CM_IN_ATOMIC_UNITS