DiFfRG
Loading...
Searching...
No Matches
quadrature_provider.hh
Go to the documentation of this file.
1#pragma once
2
3// DiFfRG
10
11// standard library
12#include <mutex>
13#include <vector>
14
15namespace DiFfRG
16{
17 namespace internal
18 {
25 {
26 public:
31 template <typename NT = double> MatsubaraQuadrature<NT> &get_matsubara_quadrature(const NT T, const NT E)
32 {
33 std::lock_guard<std::mutex> lock(m_mutex);
34
35 if constexpr (std::is_same_v<NT, double>) {
36 auto T_it = find_T_d(T);
37 auto E_it = find_E_d(E, T_it);
38 return E_it->second;
39 } else if constexpr (std::is_same_v<NT, float>) {
40 auto T_it = find_T_f(T);
41 auto E_it = find_E_f(E, T_it);
42 return E_it->second;
43 }
44 static_assert(std::is_same_v<NT, double> || std::is_same_v<NT, float>,
45 "Unknown type requested of MatsubaraStorage::get_matsubara_quadrature");
46 }
47
48 void set_verbosity(int v);
49
50 void set_vacuum_quad_size(const int size);
51 void set_min_matsubara_size(const int value);
52 void set_add_matsubara_size(const int value);
53
54 private:
57
58 template <typename NT = double> using StorageType = std::map<double, std::map<double, MatsubaraQuadrature<NT>>>;
59 template <typename NT = double> using SubStorageType = std::map<double, MatsubaraQuadrature<NT>>;
60
61 template <typename NT = double> using TemperatureIterator = typename StorageType<NT>::iterator;
62 template <typename NT = double> using EnergyIterator = typename StorageType<NT>::mapped_type::iterator;
63
66
69
72
73 int verbosity = 0;
77
78 std::mutex m_mutex;
79 };
80
87 {
88 public:
89 template <typename NT = double> Quadrature<NT> &get_quadrature(const size_t order, const QuadratureType type)
90 {
91 std::lock_guard<std::mutex> lock(m_mutex);
92
93 if constexpr (std::is_same_v<NT, double>) {
94 auto type_it = find_type_d(type);
95 auto order_it = find_order_d(order, type_it);
96 return order_it->second;
97 } else if constexpr (std::is_same_v<NT, float>) {
98 auto type_it = find_type_f(type);
99 auto order_it = find_order_f(order, type_it);
100 return order_it->second;
101 }
102 static_assert(std::is_same_v<NT, double> || std::is_same_v<NT, float>,
103 "Unknown type requested of QuadratureStorage::get_quadrature");
104 }
105
106 void set_verbosity(int v);
107
108 private:
109 Quadrature<double> &get_quadrature_d(const size_t order, const QuadratureType type);
110 Quadrature<float> &get_quadrature_f(const size_t order, const QuadratureType type);
111
112 template <typename NT = double> using StorageType = std::map<QuadratureType, std::map<size_t, Quadrature<NT>>>;
113 template <typename NT = double> using SubStorageType = std::map<size_t, Quadrature<NT>>;
114
115 template <typename NT = double> using TypeIterator = typename StorageType<NT>::iterator;
116 template <typename NT = double> using OrderIterator = typename StorageType<NT>::mapped_type::iterator;
117
120
123
126
127 int verbosity = 0;
128
129 std::mutex m_mutex;
130 };
131 } // namespace internal
132
139 {
140 public:
143
150 template <typename NT = double>
151 const std::vector<NT> &get_points(const size_t order, const QuadratureType type = QuadratureType::legendre)
152 {
153 return quadrature_storage.get_quadrature<NT>(order, type).nodes();
154 }
155
162 template <typename NT = double>
163 const std::vector<NT> &get_weights(const size_t order, const QuadratureType type = QuadratureType::legendre)
164 {
165 return quadrature_storage.get_quadrature<NT>(order, type).weights();
166 }
167
174 template <typename NT = double> const std::vector<NT> &get_matsubara_points(const NT T, const NT typical_E)
175 {
176 return matsubara_storage.get_matsubara_quadrature<NT>(T, typical_E).nodes();
177 }
178
185 template <typename NT = double> const std::vector<NT> &get_matsubara_weights(const NT T, const NT typical_E)
186 {
187 return matsubara_storage.get_matsubara_quadrature<NT>(T, typical_E).weights();
188 }
189
190#ifdef USE_CUDA
197 template <typename NT = double>
198 const NT *get_device_points(const size_t order, const int device = 0,
200 {
201 return quadrature_storage.get_quadrature<NT>(order, type).device_nodes();
202 }
203
210 template <typename NT = double>
211 const NT *get_device_weights(const size_t order, const int device = 0,
213
214 {
215 return quadrature_storage.get_quadrature<NT>(order, type).device_weights();
216 }
217
224 template <typename NT = double>
225 const NT *get_device_matsubara_points(const NT T, const NT typical_E, const int device = 0)
226 {
227 return matsubara_storage.get_matsubara_quadrature<NT>(T, typical_E).device_nodes();
228 }
229
236 template <typename NT = double>
237 const NT *get_device_matsubara_weights(const NT T, const NT typical_E, const int device = 0)
238 {
239 return matsubara_storage.get_matsubara_quadrature<NT>(T, typical_E).device_weights();
240 }
241#endif
242
243 private:
246
248 };
249} // namespace DiFfRG
A wrapper around the boost json value class.
Definition json.hh:19
A quadrature rule for (bosonic) Matsubara frequencies, based on the method of Monien [1]....
Definition matsubara.hh:26
A class that provides quadrature points and weights, in host and device memory. The quadrature points...
Definition quadrature_provider.hh:139
int verbosity
Definition quadrature_provider.hh:247
const std::vector< NT > & get_matsubara_weights(const NT T, const NT typical_E)
Get the quadrature weights for a quadrature of size quadrature_size.
Definition quadrature_provider.hh:185
internal::QuadratureStorage quadrature_storage
Definition quadrature_provider.hh:245
const NT * get_device_weights(const size_t order, const int device=0, const QuadratureType type=QuadratureType::legendre)
Get the device-side quadrature weights for a quadrature of size quadrature_size.
Definition quadrature_provider.hh:211
const std::vector< NT > & get_weights(const size_t order, const QuadratureType type=QuadratureType::legendre)
Get the quadrature weights for a quadrature of size quadrature_size.
Definition quadrature_provider.hh:163
const NT * get_device_matsubara_points(const NT T, const NT typical_E, const int device=0)
Get the device-side quadrature points for a quadrature of size quadrature_size.
Definition quadrature_provider.hh:225
const std::vector< NT > & get_matsubara_points(const NT T, const NT typical_E)
Get the quadrature points for a quadrature of size quadrature_size.
Definition quadrature_provider.hh:174
const std::vector< NT > & get_points(const size_t order, const QuadratureType type=QuadratureType::legendre)
Get the quadrature points for a quadrature of size quadrature_size.
Definition quadrature_provider.hh:151
QuadratureProvider(const JSONValue &json)
const NT * get_device_points(const size_t order, const int device=0, const QuadratureType type=QuadratureType::legendre)
Get the device-side quadrature points for a quadrature of size quadrature_size.
Definition quadrature_provider.hh:198
const NT * get_device_matsubara_weights(const NT T, const NT typical_E, const int device=0)
Get the device-side quadrature weights for a quadrature of size quadrature_size.
Definition quadrature_provider.hh:237
internal::MatsubaraStorage matsubara_storage
Definition quadrature_provider.hh:244
Definition quadrature.hh:50
A class that stores Matsubara quadrature points and weights for a given T, E. Its main purpose is to ...
Definition quadrature_provider.hh:25
EnergyIterator< double > find_E_d(const double E, TemperatureIterator< double > T_it)
int add_matsubara_size
Definition quadrature_provider.hh:75
void set_min_matsubara_size(const int value)
void set_vacuum_quad_size(const int size)
StorageType< double > quadratures_d
Definition quadrature_provider.hh:70
EnergyIterator< float > find_E_f(const float E, TemperatureIterator< float > T_it)
std::mutex m_mutex
Definition quadrature_provider.hh:78
void set_add_matsubara_size(const int value)
int min_matsubara_size
Definition quadrature_provider.hh:76
int vacuum_quad_size
Definition quadrature_provider.hh:74
MatsubaraQuadrature< NT > & get_matsubara_quadrature(const NT T, const NT E)
Return the MatsubaraQuadrature object for a given T, E.
Definition quadrature_provider.hh:31
TemperatureIterator< double > find_T_d(const double T)
std::map< double, MatsubaraQuadrature< NT > > SubStorageType
Definition quadrature_provider.hh:59
MatsubaraQuadrature< float > & get_matsubara_quadrature_f(const float T, const float E)
typename StorageType< NT >::mapped_type::iterator EnergyIterator
Definition quadrature_provider.hh:62
typename StorageType< NT >::iterator TemperatureIterator
Definition quadrature_provider.hh:61
int verbosity
Definition quadrature_provider.hh:73
TemperatureIterator< float > find_T_f(const float T)
MatsubaraQuadrature< double > & get_matsubara_quadrature_d(const double T, const double E)
StorageType< float > quadratures_f
Definition quadrature_provider.hh:71
std::map< double, std::map< double, MatsubaraQuadrature< NT > > > StorageType
Definition quadrature_provider.hh:58
A class that stores Quadrature points and weights for a given type and order Its main purpose is to a...
Definition quadrature_provider.hh:87
typename StorageType< NT >::mapped_type::iterator OrderIterator
Definition quadrature_provider.hh:116
Quadrature< NT > & get_quadrature(const size_t order, const QuadratureType type)
Definition quadrature_provider.hh:89
TypeIterator< float > find_type_f(const QuadratureType type)
std::mutex m_mutex
Definition quadrature_provider.hh:129
std::map< size_t, Quadrature< NT > > SubStorageType
Definition quadrature_provider.hh:113
int verbosity
Definition quadrature_provider.hh:127
TypeIterator< double > find_type_d(const QuadratureType type)
typename StorageType< NT >::iterator TypeIterator
Definition quadrature_provider.hh:115
OrderIterator< double > find_order_d(const size_t order, TypeIterator< double > type_it)
StorageType< float > quadratures_f
Definition quadrature_provider.hh:125
Quadrature< double > & get_quadrature_d(const size_t order, const QuadratureType type)
std::map< QuadratureType, std::map< size_t, Quadrature< NT > > > StorageType
Definition quadrature_provider.hh:112
OrderIterator< float > find_order_f(const size_t order, TypeIterator< float > type_it)
StorageType< double > quadratures_d
Definition quadrature_provider.hh:124
Quadrature< float > & get_quadrature_f(const size_t order, const QuadratureType type)
Definition complex_math.hh:14
QuadratureType
Definition quadrature.hh:47