11#include <oneapi/tbb.h>
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);
29template <
typename Derived>
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);
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);
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)
78#undef INSTANTIATE_DIAGONALIZE_HELPER
79#undef INSTANTIATE_DIAGONALIZE
#define INSTANTIATE_DIAGONALIZE(SCALAR)
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)