21 , m_multi_spectrums(1)
22 , m_idft_plan(nullptr)
32 fftw_destroy_plan(m_dft_plan);
34 fftw_destroy_plan(m_idft_plan);
38 : m_high_freq(rhs.m_high_freq)
39 , m_interp_ups(rhs.m_interp_ups)
40 , m_interp_dns(rhs.m_interp_dns)
42 , m_multi_paddeds(rhs.m_multi_paddeds)
43 , m_multi_spectrums(rhs.m_multi_spectrums)
44 , m_idft_plan(nullptr)
45 , m_local_paddeds(rhs.m_local_paddeds)
46 , m_locals(rhs.m_locals)
54 int expansion_length = int(40.0 + 9.0 * drel);
55 bool is_high = drel > 3.0;
62 m_expansion_length = expansion_length;
66 fftw_destroy_plan(m_dft_plan);
68 fftw_destroy_plan(m_idft_plan);
70 size_t S = 2 * (2 * m_expansion_length) + 1;
73 for (
auto &a : m_multi_paddeds)
75 for (
auto &a : m_multi_spectrums)
77 m_dft_plan = fftw_plan_dft_1d(
int(S), (fftw_complex *)m_multi_paddeds[0].data(),
78 (fftw_complex *)m_multi_spectrums[0].data(), FFTW_FORWARD, FFTW_MEASURE);
81 for (
auto &a : m_locals)
83 for (
auto &a : m_local_paddeds)
85 m_idft_plan = fftw_plan_dft_1d(
int(S), (fftw_complex *)m_locals[0].data(),
86 (fftw_complex *)m_local_paddeds[0].data(), FFTW_BACKWARD, FFTW_MEASURE);
88 for (
auto &a : m_locals)
89 a.resize(2 * m_expansion_length + 1, 1);
91 for (
auto &a : m_multi_paddeds)
97 return m_expansion_length;
102 size_t M = m_expansion_length;
104 return 2 * (2 * M) + 1;
122 auto const idx = omp_get_thread_num();
124 if (multi.rows() != 2 * m_expansion_length + 1)
125 throw std::runtime_error(
"Invalid multipole size");
128 m_multi_paddeds[idx].tail(m_expansion_length) = multi.head(m_expansion_length);
129 m_multi_paddeds[idx].head(m_expansion_length + 1) = multi.tail(m_expansion_length + 1);
132 fftw_execute_dft(m_dft_plan, (fftw_complex *)m_multi_paddeds[idx].data(),
133 (fftw_complex *)m_multi_spectrums[idx].data());
135 return m_multi_spectrums[idx];
141 auto const idx = omp_get_thread_num();
143 if (local_spect.rows() != 2 * (2 * m_expansion_length) + 1)
144 throw std::runtime_error(
"Invalid local spectrum size");
147 fftw_execute_dft(m_idft_plan, (fftw_complex *)local_spect.data(),
148 (fftw_complex *)m_local_paddeds[idx].data());
149 m_local_paddeds[idx] /= double(2 * (2 * m_expansion_length) + 1);
152 m_locals[idx].head(m_expansion_length) = m_local_paddeds[idx].tail(m_expansion_length);
153 m_locals[idx].tail(1 + m_expansion_length) = m_local_paddeds[idx].head(1 + m_expansion_length);
155 return m_locals[idx];
161 for (
size_t i = 1; i < m_interp_ups.size(); ++i)
162 m_interp_ups[i] = m_interp_ups[0];
168 auto const idx = omp_get_thread_num();
169 return m_interp_ups[idx].interpolate(multi);
175 for (
size_t i = 1; i < m_interp_dns.size(); ++i)
176 m_interp_dns[i] = m_interp_dns[0];
182 auto const idx = omp_get_thread_num();
183 return m_interp_dns[idx].interpolate(local);
186 void helmholtz_2d_wb_level_data::set_num_threads(
size_t n)
189 m_interp_dns.resize(n, m_interp_dns[0]);
190 m_interp_ups.resize(n, m_interp_ups[0]);
191 m_multi_paddeds.resize(n, m_multi_paddeds[0]);
192 m_multi_spectrums.resize(n, m_multi_spectrums[0]);
193 m_locals.resize(n, m_locals[0]);
194 m_local_paddeds.resize(n, m_local_paddeds[0]);