/home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/common/quadrature/quadrature_provider.hh Source File#

DiFfRG: /home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/common/quadrature/quadrature_provider.hh Source File
DiFfRG
quadrature_provider.hh
Go to the documentation of this file.
1#pragma once
2
3// DiFfRG
7
8// standard library
9#include <mutex>
10
11namespace DiFfRG
12{
13 namespace internal
14 {
21 {
22 public:
27 template <typename NT = double> MatsubaraQuadrature<NT> &get_matsubara_quadrature(const NT T, const NT E)
28 {
29 std::lock_guard<std::mutex> lock(m_mutex);
30
31 if constexpr (std::is_same_v<NT, double>) {
32 auto T_it = find_T_d(T);
33 auto E_it = find_E_d(E, T_it);
34 return E_it->second;
35 } else if constexpr (std::is_same_v<NT, float>) {
36 auto T_it = find_T_f(T);
37 auto E_it = find_E_f(E, T_it);
38 return E_it->second;
39 }
40 static_assert(std::is_same_v<NT, double> || std::is_same_v<NT, float>,
41 "Unknown type requested of MatsubaraStorage::get_matsubara_quadrature");
42 }
43
44 void set_verbosity(int v);
45
46 void set_vacuum_quad_size(const int size);
47 void set_min_matsubara_size(const int value);
48 void set_max_matsubara_size(const int value);
49 void set_matsubara_precision_factor(const int value);
50
51 private:
54
55 template <typename NT = double> using StorageType = std::map<double, std::map<double, MatsubaraQuadrature<NT>>>;
56 template <typename NT = double> using SubStorageType = std::map<double, MatsubaraQuadrature<NT>>;
57
58 template <typename NT = double> using TemperatureIterator = typename StorageType<NT>::iterator;
59 template <typename NT = double> using EnergyIterator = typename StorageType<NT>::mapped_type::iterator;
60
63
66
69
70 int verbosity = 0;
75
76 std::mutex m_mutex;
77 };
78
85 {
86 public:
87 template <typename NT = double> Quadrature<NT> &get_quadrature(const size_t order, const QuadratureType type)
88 {
89 std::lock_guard<std::mutex> lock(m_mutex);
90
91 if constexpr (std::is_same_v<NT, double>) {
92 auto type_it = find_type_d(type);
93 auto order_it = find_order_d(order, type_it);
94 return order_it->second;
95 } else if constexpr (std::is_same_v<NT, float>) {
96 auto type_it = find_type_f(type);
97 auto order_it = find_order_f(order, type_it);
98 return order_it->second;
99 }
100 static_assert(std::is_same_v<NT, double> || std::is_same_v<NT, float>,
101 "Unknown type requested of QuadratureStorage::get_quadrature");
102 }
103
104 void set_verbosity(int v);
105
106 private:
107 Quadrature<double> &get_quadrature_d(const size_t order, const QuadratureType type);
108 Quadrature<float> &get_quadrature_f(const size_t order, const QuadratureType type);
109
110 template <typename NT = double> using StorageType = std::map<QuadratureType, std::map<size_t, Quadrature<NT>>>;
111 template <typename NT = double> using SubStorageType = std::map<size_t, Quadrature<NT>>;
112
113 template <typename NT = double> using TypeIterator = typename StorageType<NT>::iterator;
114 template <typename NT = double> using OrderIterator = typename StorageType<NT>::mapped_type::iterator;
115
118
121
124
125 int verbosity = 0;
126
127 std::mutex m_mutex;
128 };
129 } // namespace internal
130
137 {
138 public:
141
148 template <typename NT = double, typename MemorySpace = CPU_memory>
149 auto nodes(const size_t order, const QuadratureType type = QuadratureType::legendre)
150 {
151 return quadrature_storage.get_quadrature<NT>(order, type).template nodes<MemorySpace>();
152 }
153
160 template <typename NT = double, typename MemorySpace = CPU_memory>
161 auto weights(const size_t order, const QuadratureType type = QuadratureType::legendre)
162 {
163 return quadrature_storage.get_quadrature<NT>(order, type).template weights<MemorySpace>();
164 }
165
172 template <typename NT = double, typename MemorySpace = CPU_memory>
173 auto matsubara_nodes(const NT T, const NT typical_E)
174 {
175 return matsubara_storage.get_matsubara_quadrature<NT>(T, typical_E).template nodes<MemorySpace>();
176 }
177
184 template <typename NT = double, typename MemorySpace = CPU_memory>
185 auto matsubara_weights(const NT T, const NT typical_E)
186 {
187 return matsubara_storage.get_matsubara_quadrature<NT>(T, typical_E).template weights<MemorySpace>();
188 }
189
194 template <typename NT = double> NT matsubara_T(const NT T, const NT typical_E)
195 {
196 return matsubara_storage.get_matsubara_quadrature<NT>(T, typical_E).get_T();
197 }
198
199 private:
202
204 };
205} // 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:25
A class that provides quadrature points and weights, in host and device memory. The quadrature points...
Definition quadrature_provider.hh:137
NT matsubara_T(const NT T, const NT typical_E)
Get the effective temperature for the Matsubara zero-mode weight. Returns 0 for vacuum (T=0) quadratu...
Definition quadrature_provider.hh:194
int verbosity
Definition quadrature_provider.hh:203
internal::QuadratureStorage quadrature_storage
Definition quadrature_provider.hh:201
auto 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
auto nodes(const size_t order, const QuadratureType type=QuadratureType::legendre)
Get the quadrature points for a quadrature of size quadrature_size.
Definition quadrature_provider.hh:149
auto matsubara_nodes(const NT T, const NT typical_E)
Get the quadrature points for a quadrature of size quadrature_size.
Definition quadrature_provider.hh:173
QuadratureProvider(const JSONValue &json)
internal::MatsubaraStorage matsubara_storage
Definition quadrature_provider.hh:200
auto 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:161
Definition quadrature.hh:56
A class that stores Matsubara quadrature points and weights for a given T, E. Its main purpose is to ...
Definition quadrature_provider.hh:21
EnergyIterator< double > find_E_d(const double E, TemperatureIterator< double > T_it)
void set_min_matsubara_size(const int value)
void set_vacuum_quad_size(const int size)
void set_matsubara_precision_factor(const int value)
StorageType< double > quadratures_d
Definition quadrature_provider.hh:67
EnergyIterator< float > find_E_f(const float E, TemperatureIterator< float > T_it)
std::mutex m_mutex
Definition quadrature_provider.hh:76
int matsubara_precision_factor
Definition quadrature_provider.hh:72
void set_max_matsubara_size(const int value)
int min_matsubara_size
Definition quadrature_provider.hh:73
int vacuum_quad_size
Definition quadrature_provider.hh:71
MatsubaraQuadrature< NT > & get_matsubara_quadrature(const NT T, const NT E)
Return the MatsubaraQuadrature object for a given T, E.
Definition quadrature_provider.hh:27
TemperatureIterator< double > find_T_d(const double T)
std::map< double, MatsubaraQuadrature< NT > > SubStorageType
Definition quadrature_provider.hh:56
MatsubaraQuadrature< float > & get_matsubara_quadrature_f(const float T, const float E)
typename StorageType< NT >::mapped_type::iterator EnergyIterator
Definition quadrature_provider.hh:59
typename StorageType< NT >::iterator TemperatureIterator
Definition quadrature_provider.hh:58
int verbosity
Definition quadrature_provider.hh:70
TemperatureIterator< float > find_T_f(const float T)
int max_matsubara_size
Definition quadrature_provider.hh:74
MatsubaraQuadrature< double > & get_matsubara_quadrature_d(const double T, const double E)
StorageType< float > quadratures_f
Definition quadrature_provider.hh:68
std::map< double, std::map< double, MatsubaraQuadrature< NT > > > StorageType
Definition quadrature_provider.hh:55
A class that stores Quadrature points and weights for a given type and order Its main purpose is to a...
Definition quadrature_provider.hh:85
typename StorageType< NT >::mapped_type::iterator OrderIterator
Definition quadrature_provider.hh:114
Quadrature< NT > & get_quadrature(const size_t order, const QuadratureType type)
Definition quadrature_provider.hh:87
TypeIterator< float > find_type_f(const QuadratureType type)
std::mutex m_mutex
Definition quadrature_provider.hh:127
std::map< size_t, Quadrature< NT > > SubStorageType
Definition quadrature_provider.hh:111
int verbosity
Definition quadrature_provider.hh:125
TypeIterator< double > find_type_d(const QuadratureType type)
typename StorageType< NT >::iterator TypeIterator
Definition quadrature_provider.hh:113
OrderIterator< double > find_order_d(const size_t order, TypeIterator< double > type_it)
StorageType< float > quadratures_f
Definition quadrature_provider.hh:123
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:110
OrderIterator< float > find_order_f(const size_t order, TypeIterator< float > type_it)
StorageType< double > quadratures_d
Definition quadrature_provider.hh:122
Quadrature< float > & get_quadrature_f(const size_t order, const QuadratureType type)
Definition complex_math.hh:10
Definition quadrature.hh:44
@ legendre
Definition quadrature.hh:45