pairinteraction
A Rydberg Interaction Calculator
diagonalize.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2024 Pairinteraction Developers
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
5
9
10#include <complex>
11#include <oneapi/tbb.h>
12#include <optional>
13
14namespace pairinteraction {
15
16template <typename Derived>
17void diagonalize(std::initializer_list<std::reference_wrapper<Derived>> systems,
19 std::optional<typename Derived::real_t> min_eigenenergy,
20 std::optional<typename Derived::real_t> max_eigenenergy, double rtol) {
21 oneapi::tbb::parallel_for(
22 oneapi::tbb::blocked_range(systems.begin(), systems.end()), [&](const auto &range) {
23 for (auto &system : range) {
24 system.get().diagonalize(diagonalizer, min_eigenenergy, max_eigenenergy, rtol);
25 }
26 });
27}
28
29template <typename Derived>
30void diagonalize(std::vector<Derived> &systems,
32 std::optional<typename Derived::real_t> min_eigenenergy,
33 std::optional<typename Derived::real_t> max_eigenenergy, double rtol) {
34 oneapi::tbb::parallel_for(
35 oneapi::tbb::blocked_range(systems.begin(), systems.end()), [&](const auto &range) {
36 for (auto &system : range) {
37 system.diagonalize(diagonalizer, min_eigenenergy, max_eigenenergy, rtol);
38 }
39 });
40}
41
42template <typename Derived>
43void diagonalize(std::vector<std::reference_wrapper<Derived>> systems,
45 std::optional<typename Derived::real_t> min_eigenenergy,
46 std::optional<typename Derived::real_t> max_eigenenergy, double rtol) {
47 oneapi::tbb::parallel_for(
48 oneapi::tbb::blocked_range(systems.begin(), systems.end()), [&](const auto &range) {
49 for (auto &system : range) {
50 system.get().diagonalize(diagonalizer, min_eigenenergy, max_eigenenergy, rtol);
51 }
52 });
53}
54
55// Explicit instantiations
56// NOLINTBEGIN(bugprone-macro-parentheses, cppcoreguidelines-macro-usage)
57#define INSTANTIATE_DIAGONALIZE_HELPER(SCALAR, TYPE) \
58 template void diagonalize(std::initializer_list<std::reference_wrapper<TYPE<SCALAR>>> systems, \
59 const DiagonalizerInterface<TYPE<SCALAR>::scalar_t> &diagonalizer, \
60 std::optional<TYPE<SCALAR>::real_t> min_eigenenergy, \
61 std::optional<TYPE<SCALAR>::real_t> max_eigenenergy, double rtol); \
62 template void diagonalize(std::vector<TYPE<SCALAR>> &systems, \
63 const DiagonalizerInterface<TYPE<SCALAR>::scalar_t> &diagonalizer, \
64 std::optional<TYPE<SCALAR>::real_t> min_eigenenergy, \
65 std::optional<TYPE<SCALAR>::real_t> max_eigenenergy, double rtol); \
66 template void diagonalize(std::vector<std::reference_wrapper<TYPE<SCALAR>>> systems, \
67 const DiagonalizerInterface<TYPE<SCALAR>::scalar_t> &diagonalizer, \
68 std::optional<TYPE<SCALAR>::real_t> min_eigenenergy, \
69 std::optional<TYPE<SCALAR>::real_t> max_eigenenergy, double rtol);
70#define INSTANTIATE_DIAGONALIZE(SCALAR) \
71 INSTANTIATE_DIAGONALIZE_HELPER(SCALAR, SystemAtom) \
72 INSTANTIATE_DIAGONALIZE_HELPER(SCALAR, SystemPair)
73// NOLINTEND(bugprone-macro-parentheses, cppcoreguidelines-macro-usage)
74
76INSTANTIATE_DIAGONALIZE(std::complex<double>)
77
78#undef INSTANTIATE_DIAGONALIZE_HELPER
79#undef INSTANTIATE_DIAGONALIZE
80
81} // namespace pairinteraction
#define INSTANTIATE_DIAGONALIZE(SCALAR)
Definition: diagonalize.cpp:70
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)
Definition: diagonalize.cpp:17