NiHu  2.0
convected_helmholtz_3d_hf_fmm.hpp
Go to the documentation of this file.
1 
7 #ifndef NIHU_CONVECTED_HELMHOLTZ_3D_HF_FMM_HPP_INCLUDED
8 #define NIHU_CONVECTED_HELMHOLTZ_3D_HF_FMM_HPP_INCLUDED
9 
10 #include "cluster_tree.hpp"
11 #include "fmm_operator.hpp"
13 #include "helmholtz_3d_hf_shift.h"
14 #include "m2l_indices.hpp"
16 
17 #include "library/convected_helmholtz_3d_kernel.hpp"
18 #include "library/convected_helmholtz_3d_singular_integrals.hpp"
19 #include "library/convected_helmholtz_3d_nearly_singular_integrals.hpp"
20 
21 #include <boost/math/constants/constants.hpp>
22 #include <boost/math/special_functions/hankel.hpp>
23 #include <boost/math/special_functions/legendre.hpp>
24 
25 #include <vector>
26 
27 namespace NiHu
28 {
29 namespace fmm
30 {
31 
37 template <class WaveNumber>
39  : public operator_with_wave_number<WaveNumber>
40 {
41 public:
42  typedef Eigen::Matrix<double, 3, 3> dmatrix3_t;
43  typedef WaveNumber wave_number_t;
44 
52  convected_operator(wave_number_t const &k, wave_number_t const &kappa, dmatrix3_t const &T)
53  : operator_with_wave_number<wave_number_t>(k)
54  , m_kappa(kappa)
55  , m_T(T)
56  {
57  }
58 
63  dmatrix3_t get_T() const
64  {
65  return m_T;
66  }
67 
72  wave_number_t const &get_kappa() const
73  {
74  return m_kappa;
75  }
76 
77 private:
78  wave_number_t const m_kappa;
79  dmatrix3_t const m_T;
80 };
81 
87 template <class WaveNumber>
89 {
90 public:
92  using wave_number_t = WaveNumber;
100  using location_t = typename bounding_box_t::location_t;
102  using dmatrix3_t = Eigen::Matrix<double, 3, 3>;
104  using cvector_t = Eigen::Matrix<std::complex<double>, Eigen::Dynamic, 1>;
105 
110  : m_wave_number(wn)
111  , m_mach_vector(mach_vector)
112  , m_mach_number(mach_vector.norm())
113  , m_kappa(m_wave_number / (1. - m_mach_number * m_mach_number))
114  , m_accuracy(3.0)
115  {
116  // compute transform matrix
117  location_t e = m_mach_vector.normalized();
118  dmatrix3_t E = e * e.transpose();
119  m_T = (dmatrix3_t::Identity() - E) * std::sqrt(1 - m_mach_number*m_mach_number) + E;
120  }
121 
125  static size_t compute_expansion_length(double drel, double C)
126  {
127  using namespace boost::math::double_constants;
128  auto kd = two_pi * drel;
129  return size_t(std::ceil(kd + C * std::log(kd + pi)));
130  }
131 
134  void set_accuracy(double C)
135  {
136  m_accuracy = C;
137  }
138 
141  void init_level_data(cluster_tree_t const &tree)
142  {
143  using namespace boost::math::double_constants;
144  double lambda_scaled = two_pi / std::real(m_kappa);
145  m_level_data_vector.clear();
146  m_level_data_vector.resize(tree.get_n_levels());
147 
148  // set the expansion length for each level
149  for (size_t i = 0; i < tree.get_n_levels(); ++i)
150  {
151  auto &ld = m_level_data_vector[i];
152  // get the diameter from the first cluster on the level
153  auto idx = tree.level_begin(i);
154  auto d = tree[idx].get_bounding_box().get_diameter();
155  auto L = compute_expansion_length(d / lambda_scaled, m_accuracy);
156  ld.set_expansion_length(L);
157  }
158 
159  // compute interpolation matrices
160  for (size_t i = 0; i < tree.get_n_levels(); ++i)
161  {
162  auto &ld = m_level_data_vector[i];
163  auto const &Sto = ld.get_unit_sphere();
164  if (i >= 3)
165  ld.set_interp_dn(interpolator(m_level_data_vector[i - 1].get_unit_sphere(), Sto));
166  if (i < tree.get_n_levels() - 1 && i >= 2)
167  ld.set_interp_up(interpolator(m_level_data_vector[i + 1].get_unit_sphere(), Sto));
168  }
169  } // end of function init_level_data
170 
175  {
176  return m_level_data_vector[idx];
177  }
178 
183  {
184  return m_level_data_vector[idx];
185  }
186 
188  class m2m
189  : public convected_operator<wave_number_t>
190  , public fmm_operator<m2m_tag>
191  {
192  public:
196 
197  m2m(wave_number_t const &wave_number, wave_number_t const &kappa, dmatrix3_t const &T)
198  : wn_base_t(wave_number, kappa, T)
199  {
200  }
201 
202  static size_t unique_idx(cluster_t const &to, cluster_t const &from)
203  {
204  return bounding_box_t::dist2idx(
205  from.get_bounding_box().get_center(),
207  }
208 
209  result_t operator()(cluster_t const &to, cluster_t const &from) const
210  {
211  using namespace std::complex_literals;
212  auto const &Sto = to.get_level_data().get_unit_sphere();
213  location_t TD = this->get_T() * (to.get_bounding_box().get_center()
214  - from.get_bounding_box().get_center());
215  auto const &kappa = this->get_kappa();
216  cvector_t shift = exp((-1.i * kappa * Sto.get_s().transpose() * TD).array());
217  return result_t(shift, to.get_level_data());
218  }
219  };
220 
221 
223  class l2l
224  : public convected_operator<wave_number_t>
225  , public fmm_operator<l2l_tag>
226  {
227  public:
231 
232  l2l(wave_number_t const &wave_number, wave_number_t const &kappa, dmatrix3_t const &T)
233  : wn_base_t(wave_number, kappa, T)
234  {
235  }
236 
237  static size_t unique_idx(cluster_t const &to, cluster_t const &from)
238  {
239  return bounding_box_t::dist2idx(
241  from.get_bounding_box().get_center());
242  }
243 
244  result_t operator()(cluster_t const &to, cluster_t const &from) const
245  {
246  using namespace std::complex_literals;
247 #if L2L_SHIFT_FIRST
248  auto const &Sfrom = from.get_level_data().get_unit_sphere();
249 #else
250  auto const &Sto = to.get_level_data().get_unit_sphere();
251 #endif
252  location_t TD = this->get_T() * (to.get_bounding_box().get_center()
253  - from.get_bounding_box().get_center());
254  auto const &kappa = this->get_kappa();
255 #if L2L_SHIFT_FIRST
256  cvector_t shift = exp((-1.i * kappa * Sfrom.get_s().transpose() * TD).array());
257 #else
258  cvector_t shift = exp((-1.i * kappa * Sto.get_s().transpose() * TD).array());
259 #endif
260  return result_t(shift, to.get_level_data());
261  }
262  };
263 
264 
266  class m2l
267  : public convected_operator<wave_number_t>
268  , public fmm_operator<m2l_tag>
269  {
270  public:
272  using result_t = Eigen::DiagonalMatrix<std::complex<double>, Eigen::Dynamic>;
274 
275  m2l(wave_number_t const &wave_number, wave_number_t const &kappa, dmatrix3_t const &T)
276  : convected_base_t(wave_number, kappa, T)
277  {
278  }
279 
280  static size_t unique_idx(cluster_t const &to, cluster_t const &from)
281  {
283  }
284 
285  result_t operator()(cluster_t const &to, cluster_t const &from) const
286  {
287  auto const &kappa = this->get_kappa();
288 
289  auto const &X = to.get_bounding_box().get_center();
290  auto const &Y = from.get_bounding_box().get_center();
291  location_t TDvec = this->get_T() * (X - Y);
292 
293  auto L = to.get_level_data().get_expansion_length();
294  auto const &s = to.get_level_data().get_unit_sphere().get_s();
295 
296  return m2l_matrix_impl(TDvec, s, kappa, L).asDiagonal();
297  }
298 
299  private:
300  static cvector_t m2l_matrix_impl(location_t const &TDvec,
301  Eigen::Matrix<double, 3, Eigen::Dynamic> const &s,
302  wave_number_t const &kappa,
303  size_t L)
304  {
305  using namespace boost::math::double_constants;
306  using namespace std::complex_literals;
307  using boost::math::legendre_p;
308  using boost::math::sph_hankel_1;
309 
310  double TD = TDvec.norm();
311  location_t TUvec = TDvec / TD;
312  auto N = s.cols();
313 
314  Eigen::Matrix<double, 1, Eigen::Dynamic> x = TUvec.transpose() * s;
315  auto z = -kappa * TD;
316 
317  cvector_t M2L = cvector_t::Zero(N, 1);
318 
319  for (size_t l = 0; l <= L; ++l)
320  {
321  auto h = sph_hankel_1(l, z);
322  auto c = double(2 * l + 1) * std::pow(1.i, l) * h;
323  for (int i = 0; i < s.cols(); ++i)
324  M2L(i) += c * legendre_p(int(l), x(0, i));
325  }
326  M2L *= -1.i * kappa / (4.0 * pi) / (4.0 * pi);
327 
328  return M2L;
329  }
330  };
331 
333  class p2m_SLP
334  : public convected_operator<wave_number_t>
335  , public fmm_operator<p2m_tag>
336  {
337  public:
338  using test_input_t = cluster_t;
340  using result_t = Eigen::Matrix<std::complex<double>, Eigen::Dynamic, 1>;
341 
342  p2m_SLP(wave_number_t const &k, wave_number_t const &kappa, dmatrix3_t const &T, location_t const &mach_vector)
343  : convected_operator<wave_number_t>(k, kappa, T)
344  , m_mach_vector(mach_vector)
345  {
346  }
347 
348  size_t rows(test_input_t const &to) const
349  {
351  }
352 
353  result_t operator()(test_input_t const &to, trial_input_t const &tri) const
354  {
355  return eval(to, tri);
356  }
357 
358  private:
360  result_t eval(test_input_t const &to, trial_input_t const &tri) const
361  {
362  using namespace std::complex_literals;
363  auto const &Y = to.get_bounding_box().get_center();
364  auto const &y = tri.get_x();
365  auto const &s = to.get_level_data().get_unit_sphere().get_s();
366  auto const &kappa = this->get_kappa();
367  auto const &Mvec = this->m_mach_vector;
368  location_t Td = this->get_T() * (Y - y);
369  double M_dot_ny = Mvec.dot(tri.get_unit_normal());
370  return Eigen::exp(-1.i * kappa * (s.transpose() * Td).array())
371  * std::exp(-1.i * kappa * Mvec.dot(y))
372  * (1. - M_dot_ny*M_dot_ny);
373  }
374 
375  location_t m_mach_vector;
376  };
377 
379  class p2m_DLP
380  : public convected_operator<wave_number_t>
381  , public fmm_operator<p2m_tag>
382  {
383  public:
384  using test_input_t = cluster_t;
386  using result_t = Eigen::Matrix<std::complex<double>, Eigen::Dynamic, 1>;
387 
388  p2m_DLP(wave_number_t const &k, wave_number_t const &kappa, dmatrix3_t const &T, location_t const &mach_vector)
389  : convected_operator<wave_number_t>(k, kappa, T)
390  , m_mach_vector(mach_vector)
391  {
392  }
393 
394  size_t rows(test_input_t const &to) const
395  {
397  }
398 
399  result_t operator()(test_input_t const &to, trial_input_t const &tri) const
400  {
401  return eval(to, tri);
402  }
403 
404  private:
406  result_t eval(test_input_t const &to, trial_input_t const &tri) const
407  {
408  using namespace std::complex_literals;
409  auto const &Y = to.get_bounding_box().get_center();
410  auto const &y = tri.get_x();
411  auto const &ny = tri.get_unit_normal();
412  auto const &s = to.get_level_data().get_unit_sphere().get_s();
413  auto const &kappa = this->get_kappa();
414  auto const &Mvec = this->m_mach_vector;
415  double M2 = Mvec.dot(Mvec);
416  auto const &T = this->get_T();
417  location_t Td = T * (Y - y);
418  return Eigen::exp(-1.i * kappa * (s.transpose() * Td).array()) * std::exp(-1.i * kappa * Mvec.dot(y))
419  * (1.i * kappa) *
420  ((s.transpose() * (T * ny)).array() + Mvec.dot(ny) * (1. - M2 - (s.transpose()*Mvec).array()));
421  }
422 
423  location_t m_mach_vector;
424  };
425 
427  class p2l
428  : public convected_operator<wave_number_t>
429  , public fmm_operator<p2l_tag>
430  {
431  public:
432  using test_input_t = cluster_t;
434  using result_t = Eigen::Matrix<std::complex<double>, Eigen::Dynamic, 1>;
435 
436  p2l(wave_number_t const &k, wave_number_t const &kappa, dmatrix3_t const &T, location_t const &mach_vector)
437  : convected_operator<wave_number_t>(k, kappa, T)
438  , m_mach_vector(mach_vector)
439  {
440  }
441 
442  size_t rows(test_input_t const &to) const
443  {
445  }
446 
447  result_t operator()(test_input_t const &to, trial_input_t const &tri) const
448  {
449  return eval(to, tri);
450  }
451 
452  private:
453  result_t eval(test_input_t const &to, trial_input_t const &tri) const
454  {
455  throw std::logic_error("Unimplemented p2l operator");
456  }
457 
458  location_t m_mach_vector;
459  };
460 
462  class m2p
463  : public convected_operator<wave_number_t>
464  , public fmm_operator<m2p_tag>
465  {
466  public:
468  using trial_input_t = cluster_t;
469  using result_t = Eigen::Matrix<std::complex<double>, Eigen::Dynamic, 1>;
470 
471  m2p(wave_number_t const &k, wave_number_t const &kappa, dmatrix3_t const &T, location_t const &mach_vector)
472  : convected_operator<wave_number_t>(k, kappa, T)
473  , m_mach_vector(mach_vector)
474  {
475  }
476 
477  size_t cols(trial_input_t const &from) const
478  {
480  }
481 
482  result_t operator()(test_input_t const &tsi, trial_input_t const &from) const
483  {
484  return eval(tsi, from);
485  }
486 
487  private:
488  result_t eval(test_input_t const &tsi, trial_input_t const &from) const
489  {
490  throw std::logic_error("Unimplemented m2p operator");
491  }
492 
493  location_t m_mach_vector;
494  };
495 
497  class l2p
498  : public convected_operator<wave_number_t>
499  , public fmm_operator<l2p_tag>
500  {
501  public:
503  using trial_input_t = cluster_t;
504  using result_t = Eigen::Matrix<std::complex<double>, 1, Eigen::Dynamic>;
505 
506  l2p(wave_number_t const &k, wave_number_t const &kappa, dmatrix3_t const &T, location_t const &mach_vector)
507  : convected_operator<wave_number_t>(k, kappa, T)
508  , m_mach_vector(mach_vector)
509  {
510  }
511 
512  size_t cols(trial_input_t const &from) const
513  {
515  }
516 
517  result_t operator()(test_input_t const &tsi, trial_input_t const &from) const
518  {
519  return eval(tsi, from);
520  }
521 
522  private:
524  result_t eval(test_input_t const &tsi, trial_input_t const &from) const
525  {
526  using namespace std::complex_literals;
527  auto const &X = from.get_bounding_box().get_center();
528  auto const &x = tsi.get_x();
529  auto const &S = from.get_level_data().get_unit_sphere();
530  auto const &s = S.get_s();
531  auto const &w = S.get_w();
532  auto const &kappa = this->get_kappa();
533  auto const &Mvec = this->m_mach_vector;
534  location_t Td = this->get_T() * (x - X);
535  return Eigen::exp(-1.i * kappa * (s.transpose() * Td).array()) * w.array() * std::exp(1.i * kappa * Mvec.dot(x));
536  }
537 
538  location_t m_mach_vector;
539  };
540 
542  class p2p_SLP
543  : public fmm_operator<p2p_tag>
544  {
545  public:
547  typedef typename kernel_t::result_t result_t;
548  typedef typename kernel_t::test_input_t test_input_t;
549  typedef typename kernel_t::trial_input_t trial_input_t;
550 
551  p2p_SLP(wave_number_t const &k, location_t const &mvec)
552  : m_kernel(k, mvec)
553  {
554  }
555 
556  result_t operator()(test_input_t const &tsi, trial_input_t const &tri) const
557  {
558  return m_kernel(tsi, tri);
559  }
560 
561  kernel_t const &get_kernel() const
562  {
563  return m_kernel;
564  }
565 
566  private:
567  kernel_t m_kernel;
568  };
569 
571  class p2p_DLP
572  : public fmm_operator<p2p_tag>
573  {
574  public:
576  typedef typename kernel_t::result_t result_t;
577  typedef typename kernel_t::test_input_t test_input_t;
578  typedef typename kernel_t::trial_input_t trial_input_t;
579 
580  p2p_DLP(wave_number_t const &k, location_t const &mvec)
581  : m_kernel(k, mvec)
582  {
583  }
584 
585  result_t operator()(test_input_t const &tsi, trial_input_t const &tri) const
586  {
587  return m_kernel(tsi, tri);
588  }
589 
590  kernel_t const &get_kernel() const
591  {
592  return m_kernel;
593  }
594 
595  private:
596  kernel_t m_kernel;
597  };
598 
601  m2m create_m2m() const
602  {
603  return m2m(m_wave_number, m_kappa, m_T);
604  }
605 
608  l2l create_l2l() const
609  {
610  return l2l(m_wave_number, m_kappa, m_T);
611  }
612 
615  m2l create_m2l() const
616  {
617  return m2l(m_wave_number, m_kappa, m_T);
618  }
619 
620  p2l create_p2l() const
621  {
622  return p2l(m_wave_number, m_kappa, m_T, m_mach_vector);
623  }
624 
625  m2p create_m2p() const
626  {
627  return m2p(m_wave_number, m_kappa, m_T, m_mach_vector);
628  }
629 
633  {
634  return p2m_SLP(m_wave_number, m_kappa, m_T, m_mach_vector);
635  }
636 
640  {
641  return p2m_DLP(m_wave_number, m_kappa, m_T, m_mach_vector);
642  }
643 
646  l2p create_l2p() const
647  {
648  return l2p(m_wave_number, m_kappa, m_T, m_mach_vector);
649  }
650 
654  {
655  return p2p_SLP(m_wave_number, m_mach_vector);
656  }
657 
661  {
662  return p2p_DLP(m_wave_number, m_mach_vector);
663  }
664 
665 private:
666  wave_number_t m_wave_number; // the wave number
667  location_t m_mach_vector; // the mach number vector (v / c)
668  double m_mach_number; // the scalar mach number
669  wave_number_t m_kappa; // the upscaled wave_number
670  dmatrix3_t m_T; // the coordinate transform matrix
671  double m_accuracy; // the expansion accuracy
672  std::vector<helmholtz_3d_hf_level_data> m_level_data_vector;
673 };
674 
675 }
676 }
677 
678 #endif // NIHU_CONVECTED_HELMHOLTZ_3D_HF_FMM_HPP_INCLUDED
NiHu::fmm::convected_helmholtz_3d_hf_fmm::p2p_DLP
P2P operator of the Convected Helmholtz DLP kernel.
Definition: convected_helmholtz_3d_hf_fmm.hpp:571
NiHu::fmm::convected_helmholtz_3d_hf_fmm::create_l2p
l2p create_l2p() const
factory function for the L2P operator
Definition: convected_helmholtz_3d_hf_fmm.hpp:646
NiHu::fmm::cluster_tree< cluster_t >
NiHu::fmm::convected_helmholtz_3d_hf_fmm::wave_number_t
WaveNumber wave_number_t
template argument as nested type
Definition: convected_helmholtz_3d_hf_fmm.hpp:92
NiHu::fmm::unit_sphere::get_num_directions
size_t get_num_directions() const
return number of directions (quadrature points)
Definition: unit_sphere.h:54
NiHu::fmm::convected_helmholtz_3d_hf_fmm::p2m_DLP
P2M operator of the Convected Helmholtz DLP kernel.
Definition: convected_helmholtz_3d_hf_fmm.hpp:379
NiHu::fmm::convected_operator::get_T
dmatrix3_t get_T() const
return the transform matrix
Definition: convected_helmholtz_3d_hf_fmm.hpp:63
NiHu::fmm::helmholtz_3d_hf_cluster::get_level_data
const helmholtz_3d_hf_level_data & get_level_data() const
return the cluster's level data
Definition: helmholtz_3d_hf_cluster.cpp:37
NiHu::location_normal_jacobian_input
a class representing a normal + Jacobian input
Definition: location_normal.hpp:79
NiHu::fmm::cluster_base< helmholtz_3d_hf_cluster >::bounding_box_t
bounding_box< dimension, double > bounding_box_t
Bounding box type.
Definition: cluster.hpp:50
NiHu::fmm::convected_helmholtz_3d_hf_fmm::dmatrix3_t
Eigen::Matrix< double, 3, 3 > dmatrix3_t
the 3x3 transform matrix type
Definition: convected_helmholtz_3d_hf_fmm.hpp:102
NiHu::convected_helmholtz_3d_SLP_kernel< wave_number_t >
m2l_indices.hpp
Implementation of class template Nihu::fmm::m2l_indices.
NiHu::location_input
a class representing a simple location
Definition: location_normal.hpp:37
NiHu::fmm::cluster_tree::get_n_levels
size_t get_n_levels() const
return number of levels
Definition: cluster_tree.hpp:253
NiHu::fmm::convected_helmholtz_3d_hf_fmm::cvector_t
Eigen::Matrix< std::complex< double >, Eigen::Dynamic, 1 > cvector_t
complex dynamic column vector
Definition: convected_helmholtz_3d_hf_fmm.hpp:104
NiHu::fmm::m2l_indices
Class assigning indices to M2L distances.
Definition: m2l_indices.hpp:21
NiHu::fmm::bounding_box::get_center
const location_t & get_center(void) const
return center
Definition: bounding_box.hpp:75
NiHu::fmm::convected_helmholtz_3d_hf_fmm::m2p
M2P operator of the Convected Helmholtz SLP kernel.
Definition: convected_helmholtz_3d_hf_fmm.hpp:462
NiHu::fmm::convected_helmholtz_3d_hf_fmm::create_p2p_DLP
p2p_DLP create_p2p_DLP() const
factory function for the P2P operator for DLP
Definition: convected_helmholtz_3d_hf_fmm.hpp:660
NiHu::fmm::convected_helmholtz_3d_hf_fmm::create_p2m_DLP
p2m_DLP create_p2m_DLP() const
factory function for the P2M operator for DLP
Definition: convected_helmholtz_3d_hf_fmm.hpp:639
NiHu::fmm::convected_helmholtz_3d_hf_fmm::init_level_data
void init_level_data(cluster_tree_t const &tree)
initialize the level data of the fmm method
Definition: convected_helmholtz_3d_hf_fmm.hpp:141
NiHu::fmm::convected_helmholtz_3d_hf_fmm
The FMM for the convected Helmholtz equation in 3D.
Definition: convected_helmholtz_3d_hf_fmm.hpp:88
NiHu::fmm::convected_helmholtz_3d_hf_fmm::compute_expansion_length
static size_t compute_expansion_length(double drel, double C)
compute expansion length based on relative cluster size
Definition: convected_helmholtz_3d_hf_fmm.hpp:125
NiHu::fmm::helmholtz_3d_hf_fmm_upshift
Class for shifting up Multipole contributions This class is the result of the M2M operation....
Definition: helmholtz_3d_hf_shift.h:18
NiHu::fmm::convected_helmholtz_3d_hf_fmm::cluster_t
helmholtz_3d_hf_cluster cluster_t
the cluster type
Definition: convected_helmholtz_3d_hf_fmm.hpp:94
NiHu::fmm::unit_sphere::get_s
const Eigen::Matrix< double, 3, Eigen::Dynamic > & get_s(void) const
return Cartesian quadrature points
Definition: unit_sphere.h:94
NiHu::fmm::convected_operator::get_kappa
const wave_number_t & get_kappa() const
return the modified wave number
Definition: convected_helmholtz_3d_hf_fmm.hpp:72
cluster_tree.hpp
Implementation of class NiHu::fmm::cluster_tree.
NiHu::fmm::convected_helmholtz_3d_hf_fmm::p2p_SLP
P2P operator of the Convected Helmholtz SLP kernel.
Definition: convected_helmholtz_3d_hf_fmm.hpp:542
NiHu::fmm::convected_helmholtz_3d_hf_fmm::location_t
typename bounding_box_t::location_t location_t
the physical location type
Definition: convected_helmholtz_3d_hf_fmm.hpp:100
NiHu::fmm::convected_helmholtz_3d_hf_fmm::create_m2l
m2l create_m2l() const
factory function for the M2L operator
Definition: convected_helmholtz_3d_hf_fmm.hpp:615
NiHu::fmm::convected_helmholtz_3d_hf_fmm::get_level_data
const helmholtz_3d_hf_level_data & get_level_data(size_t idx) const
return level data for a specific level
Definition: convected_helmholtz_3d_hf_fmm.hpp:174
NiHu::fmm::convected_helmholtz_3d_hf_fmm::p2l
P2L operator of the Convected Helmholtz SLP kernel.
Definition: convected_helmholtz_3d_hf_fmm.hpp:427
NiHu::fmm::convected_helmholtz_3d_hf_fmm::bounding_box_t
typename cluster_t::bounding_box_t bounding_box_t
the bounding box type
Definition: convected_helmholtz_3d_hf_fmm.hpp:98
NiHu::fmm::convected_helmholtz_3d_hf_fmm::create_l2l
l2l create_l2l() const
factory function for the L2L operator
Definition: convected_helmholtz_3d_hf_fmm.hpp:608
operator_with_wave_number.hpp
Implementation of class template NiHu::fmm::operator_with_wave_number.
NiHu::fmm::convected_helmholtz_3d_hf_fmm::get_level_data
helmholtz_3d_hf_level_data & get_level_data(size_t idx)
return level data reference for a specific level
Definition: convected_helmholtz_3d_hf_fmm.hpp:182
fmm_operator.hpp
FMM operator types and tags.
NiHu::bessel::Y
std::complex< double > Y(std::complex< double > const &z)
Bessel function Y_nu(z)
Definition: math_functions.hpp:315
NiHu::fmm::helmholtz_3d_hf_level_data::get_unit_sphere
const unit_sphere & get_unit_sphere() const
return the stored unit sphere
Definition: helmholtz_3d_hf_level_data.cpp:21
NiHu::fmm::convected_helmholtz_3d_hf_fmm::l2l
L2L operator of the Convected Helmholtz FMM.
Definition: convected_helmholtz_3d_hf_fmm.hpp:223
NiHu::fmm::interpolator
class interpolating over the unit sphere
Definition: unit_sphere_interpolator.h:25
NiHu::fmm::cluster_tree::level_begin
size_t level_begin(size_t idx) const
Begin iterator to idx-th level clusters.
Definition: cluster_tree.hpp:264
NiHu::fmm::convected_helmholtz_3d_hf_fmm::convected_helmholtz_3d_hf_fmm
convected_helmholtz_3d_hf_fmm(wave_number_t const &wn, location_t const &mach_vector)
Construct the fmm object.
Definition: convected_helmholtz_3d_hf_fmm.hpp:109
NiHu::fmm::convected_helmholtz_3d_hf_fmm::create_p2p_SLP
p2p_SLP create_p2p_SLP() const
factory function for the P2P operator for SLP
Definition: convected_helmholtz_3d_hf_fmm.hpp:653
NiHu::fmm::cluster_base::get_bounding_box
const bounding_box_t & get_bounding_box() const
return cluster's bounding box
Definition: cluster.hpp:111
NiHu::fmm::convected_helmholtz_3d_hf_fmm::p2m_SLP
P2M operator of the Convected Helmholtz SLP kernel.
Definition: convected_helmholtz_3d_hf_fmm.hpp:333
NiHu::fmm::helmholtz_3d_hf_level_data::get_expansion_length
size_t get_expansion_length() const
return the expansion length
Definition: helmholtz_3d_hf_level_data.cpp:26
NiHu::convected_helmholtz_3d_DLP_kernel< wave_number_t >
NiHu::fmm::convected_helmholtz_3d_hf_fmm::m2m
M2M operator of the Convected Helmholtz FMM.
Definition: convected_helmholtz_3d_hf_fmm.hpp:188
NiHu::fmm::helmholtz_3d_hf_fmm_downshift
Class for shifting down Local contributions This class is the result of the L2L operation....
Definition: helmholtz_3d_hf_shift.h:50
NiHu::fmm::fmm_operator
Operator defining its tag type.
Definition: fmm_operator.hpp:85
NiHu::fmm::convected_helmholtz_3d_hf_fmm::l2p
L2P operator of the Convected Helmholtz FMM.
Definition: convected_helmholtz_3d_hf_fmm.hpp:497
NiHu::fmm::operator_with_wave_number
class storing a wave number
Definition: operator_with_wave_number.hpp:17
NiHu::fmm::convected_helmholtz_3d_hf_fmm::create_m2m
m2m create_m2m() const
factory function for the M2M operator
Definition: convected_helmholtz_3d_hf_fmm.hpp:601
NiHu::fmm::convected_operator
Base class of convected operators This class stores the wave number, kappa, the mach number vector an...
Definition: convected_helmholtz_3d_hf_fmm.hpp:38
NiHu::fmm::helmholtz_3d_hf_cluster
cluster type of the Helmholtz 3D High frequency FMM
Definition: helmholtz_3d_hf_cluster.h:35
NiHu::fmm::convected_helmholtz_3d_hf_fmm::create_p2m_SLP
p2m_SLP create_p2m_SLP() const
factory function for the P2M operator for SLP
Definition: convected_helmholtz_3d_hf_fmm.hpp:632
NiHu::fmm::helmholtz_3d_hf_level_data
level data of the helmholtz 3d hf fmm
Definition: helmholtz_3d_hf_level_data.h:23
NiHu::fmm::convected_helmholtz_3d_hf_fmm::set_accuracy
void set_accuracy(double C)
Set the accuracy parameter that controls the expansion length.
Definition: convected_helmholtz_3d_hf_fmm.hpp:134
NiHu::fmm::convected_operator::convected_operator
convected_operator(wave_number_t const &k, wave_number_t const &kappa, dmatrix3_t const &T)
Construct a new convected operator object.
Definition: convected_helmholtz_3d_hf_fmm.hpp:52
C
Definition: bbfmm_covariance.cpp:47
NiHu::fmm::convected_helmholtz_3d_hf_fmm::m2l
M2L (translation) operator of the Convected Helmholtz FMM.
Definition: convected_helmholtz_3d_hf_fmm.hpp:266
helmholtz_3d_hf_cluster.h
Interface of class fmm::helmholtz_3d_hf_cluster.