NiHu  2.0
singular_galerkin_quadrature.hpp
Go to the documentation of this file.
1 // This file is a part of NiHu, a C++ BEM template library.
2 //
3 // Copyright (C) 2012-2014 Peter Fiala <fiala@hit.bme.hu>
4 // Copyright (C) 2012-2014 Peter Rucz <rucz@hit.bme.hu>
5 //
6 // This program is free software: you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation, either version 3 of the License, or
9 // (at your option) any later version.
10 //
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with this program. If not, see <http://www.gnu.org/licenses/>.
18 
26 #ifndef NIHU_SINGULAR_GALERKIN_QUADRATURE_HPP_INCLUDED
27 #define NIHU_SINGULAR_GALERKIN_QUADRATURE_HPP_INCLUDED
28 
29 #include "quadrature.hpp"
30 #include "element_match.hpp"
31 #include "../library/lib_shape.hpp"
32 
33 namespace NiHu
34 {
35 
49 template <class quadrature_family_t, class test_domain_t, class trial_domain_t>
51 
57 template <class test_domain_t, class trial_domain_t>
59 {
61  typedef typename test_domain_t::scalar_t scalar_t;
63  typedef Eigen::Matrix<scalar_t,
64  test_domain_t::dimension + trial_domain_t::dimension, 1> descartes_quad_t;
65 };
66 
67 
68 
73 template <class match_type>
74 struct line_helper;
75 
79 template <>
80 struct line_helper<match::match_0d_type>
81  : public helper_base<line_domain, line_domain>
82 {
84  static bool const is_symmetric = true;
86  static unsigned const num_domains = 1;
87 
94  static void transform_inplace(descartes_quad_t &x, scalar_t &w, unsigned idx)
95  {
96  switch (idx)
97  {
98  case 0:
99  x(1) *= x(0);
100  w *= x(0);
101  break;
102  default:
103  throw std::logic_error("invalid domain index for singular Galerkin quadrature on lines with 0d match ");
104  }
105  }
106 };
107 
108 
113 template <class quadrature_family_t>
115 {
116 public:
120  typedef typename quadrature_t::quadrature_elem_t quadrature_elem_t;
121 
130  template <class match_type>
131  static void generate(
132  quadrature_t &test_quadrature,
133  quadrature_t &trial_quadrature,
134  unsigned singular_quadrature_order)
135  {
137  typedef line_helper<match_type> hlp_t;
139  typedef typename hlp_t::scalar_t scalar_t;
141  typedef typename hlp_t::descartes_quad_t descartes_quad_t;
142 
144  typename quadrature_type<quadrature_family_t, line_domain>::type base_quad(singular_quadrature_order);
145  // transform the regular line quadrature into the (0,1) domain
146  Eigen::Matrix<scalar_t, 2, 1> c(0.0, 1.0);
147  base_quad.template transform_inplace<line_1_shape_set>(c);
148 
149  // traversing the two dimensional regular quadrature elements
150  for (unsigned i1 = 0; i1 < base_quad.size(); ++i1)
151  {
152  scalar_t x1 = base_quad[i1].get_xi()(0);
153  scalar_t w1 = base_quad[i1].get_w();
154  for (unsigned i2 = 0; i2 < base_quad.size(); ++i2)
155  {
156  scalar_t x2 = base_quad[i2].get_xi()(0);
157  scalar_t w2 = base_quad[i2].get_w();
158 
159  for (unsigned idx = 0; idx < hlp_t::num_domains; ++idx)
160  {
161  // generate the descartes quadrature element
162  descartes_quad_t x(x1, x2);
163  scalar_t w = w1 * w2;
164 
165  // transform the 2d quadrature into the desired singular one
166  hlp_t::transform_inplace(x, w, idx);
167 
168  // transform back to standard lines
169  x = (2. * x).array() - 1.0;
170  w *= 4.0;
171 
172  // separate into test and trial quadratures
173  test_quadrature.push_back(quadrature_elem_t(x.topRows(1), w));
174  trial_quadrature.push_back(quadrature_elem_t(x.bottomRows(1), 1.0));
175 
176  // and vica versa if symmetry requires
177  if (hlp_t::is_symmetric)
178  {
179  test_quadrature.push_back(quadrature_elem_t(x.bottomRows(1), w));
180  trial_quadrature.push_back(quadrature_elem_t(x.topRows(1), 1.0));
181  }
182  }
183  } // for loop for i2
184  } // for loop for i1
185  } // function generate
186 };
187 
188 
189 
190 
195 template <class match_type>
196 struct tria_helper;
197 
201 template <>
203  : public helper_base<tria_domain, tria_domain>
204 {
206  static bool const is_symmetric = true;
208  static unsigned const num_domains = 3;
209 
216  static void transform_inplace(descartes_quad_t &x, scalar_t &w, unsigned idx)
217  {
218  scalar_t mu1, mu2, xi1, xi2, J;
219  switch (idx)
220  {
221  case 0:
222  mu1 = x(0);
223  mu2 = x(0) * x(1);
224  xi1 = (1-mu1) * x(2);
225  xi2 = xi1 * x(3);
226  J = (1-mu1) * xi1;
227  break;
228  case 1:
229  mu1 = x(0) * x(1);
230  mu2 = x(0) * (x(1) - 1.0);
231  xi1 = (1-mu1+mu2) * x(2) - mu2;
232  xi2 = (xi1+mu2) * x(3) - mu2;
233  J = (1.0-mu1+mu2) * (xi1+mu2);
234  break;
235  case 2:
236  mu1 = x(0) * x(1);
237  mu2 = x(0);
238  xi1 = (1-mu2) * x(2) + mu2 - mu1;
239  xi2 = (xi1-mu2+mu1) * x(3);
240  J = (1-mu2) * (xi1-mu2+mu1);
241  break;
242  }
243 
244  w *= J * x(0);
245 
246  x(0) = xi1;
247  x(1) = xi2;
248  x(2) = mu1+xi1; // eta1
249  x(3) = mu2+xi2; // eta2
250  }
251 };
252 
256 template <>
258  : public helper_base<tria_domain, tria_domain>
259 {
261  static bool const is_symmetric = false;
263  static unsigned const num_domains = 6;
264 
271  static void transform_inplace(descartes_quad_t &x, scalar_t &w, unsigned idx)
272  {
273  scalar_t mu1, mu2, xi1, xi2;
274  switch (idx)
275  {
276  case 0:
277  mu1 = -x(0) * x(1);
278  mu2 = -x(0) * x(1) * x(2);
279  xi1 = (1.0-x(0)) * x(3) + x(0);
280  xi2 = x(0) * (1.0-x(1) + x(1)*x(2));
281  break;
282  case 1:
283  mu1 = x(0) * x(1);
284  mu2 = x(0) * x(1) * x(2);
285  xi1 = (1.0-x(0)) * x(3) + x(0) * (1.0-x(1));
286  xi2 = x(0) * (1.0-x(1));
287  break;
288  case 2:
289  mu1 = -x(0) * x(1) * x(2);
290  mu2 = x(0) * x(1) * (1.0 - x(2));
291  xi1 = (1.0-x(0)) * x(3) + x(0);
292  xi2 = x(0) * (1.0-x(1));
293  break;
294  case 3:
295  mu1 = x(0) * x(1) * x(2);
296  mu2 = x(0) * x(1) * (x(2) - 1.0);
297  xi1 = (1.0-x(0)) * x(3) + x(0) * (1.0 - x(1)*x(2));
298  xi2 = x(0) * (1.0 - x(1)*x(2));
299  break;
300  case 4:
301  mu1 = -x(0) * x(1) * x(2);
302  mu2 = -x(0) * x(1);
303  xi1 = (1.0-x(0)) * x(3) + x(0);
304  xi2 = x(0);
305  break;
306  case 5:
307  mu1 = x(0) * x(1) * x(2);
308  mu2 = x(0) * x(1);
309  xi1 = (1.0-x(0)) * x(3) + x(0) * (1.0-x(1)*x(2));
310  xi2 = x(0) * (1.0-x(1));
311  break;
312  default:
313  throw std::runtime_error("Invalid idx argument in tria_helper::transform_inplace");
314  }
315  double J = x(1) * x(0)*x(0) * (1.0-x(0));
316  w *= J;
317 
318  x(0) = xi1;
319  x(1) = xi2;
320  x(2) = mu1+xi1; // eta1
321  x(3) = mu2+xi2; // eta2
322  }
323 };
324 
328 template <>
330  : public helper_base<tria_domain, tria_domain>
331 {
333  static bool const is_symmetric = true;
335  static unsigned const num_domains = 1;
336 
342  static void transform_inplace(descartes_quad_t &x, scalar_t &w, unsigned)
343  {
344  scalar_t xi1 = x(0);
345  scalar_t xi2 = xi1*x(1);
346  scalar_t eta1 = xi1*x(2);
347  scalar_t eta2 = eta1*x(3);
348  scalar_t J = x(2)*x(0)*x(0)*x(0);
349 
350  w *= J;
351 
352  x(0) = xi1;
353  x(1) = xi2;
354  x(2) = eta1;
355  x(3) = eta2;
356  }
357 };
358 
359 
365 template <class quadrature_family_t>
367 {
368 public:
372  typedef typename quadrature_t::quadrature_elem_t quadrature_elem_t;
373 
384  template <class match_type>
385  static void generate(
386  quadrature_t &test_quadrature,
387  quadrature_t &trial_quadrature,
388  unsigned singular_quadrature_order)
389  {
391  typedef tria_helper<match_type> hlp_t;
393  typedef typename hlp_t::scalar_t scalar_t;
395  typedef typename hlp_t::descartes_quad_t descartes_quad_t;
396 
398  typename quadrature_type<quadrature_family_t, line_domain>::type base_quad(singular_quadrature_order);
399  // transform the regular line quadrature into the (0,1) domain
400  Eigen::Matrix<scalar_t, 2, 1> c(0.0, 1.0);
401  base_quad.template transform_inplace<line_1_shape_set>(c);
402 
403  // traversing the four dimensional regular quadrature elements
404  for (unsigned i1 = 0; i1 < base_quad.size(); ++i1)
405  {
406  scalar_t x1 = base_quad[i1].get_xi()(0);
407  scalar_t w1 = base_quad[i1].get_w();
408  for (unsigned i2 = 0; i2 < base_quad.size(); ++i2)
409  {
410  scalar_t x2 = base_quad[i2].get_xi()(0);
411  scalar_t w2 = base_quad[i2].get_w();
412  for (unsigned i3 = 0; i3 < base_quad.size(); ++i3)
413  {
414  scalar_t x3 = base_quad[i3].get_xi()(0);
415  scalar_t w3 = base_quad[i3].get_w();
416  for (unsigned i4 = 0; i4 < base_quad.size(); ++i4)
417  {
418  scalar_t x4 = base_quad[i4].get_xi()(0);
419  scalar_t w4 = base_quad[i4].get_w();
420 
421  for (unsigned idx = 0; idx < hlp_t::num_domains; ++idx)
422  {
423  // generate the descartes quadrature element
424  descartes_quad_t x(x1, x2, x3, x4);
425  scalar_t w = w1 * w2 * w3 * w4;
426 
427  // transform the 4d quadrature into the desired singular one
428  hlp_t::transform_inplace(x, w, idx);
429 
430  // transform back into our standard triangle simplex
431  x(0) -= x(1);
432  x(2) -= x(3); // Jacobian is 1.0
433 
434  // separate into test and trial quadratures
435  test_quadrature.push_back(quadrature_elem_t(x.topRows(2), w));
436  trial_quadrature.push_back(quadrature_elem_t(x.bottomRows(2), 1.0));
437 
438  // and vica versa if symmetry requires
439  if (hlp_t::is_symmetric)
440  {
441  test_quadrature.push_back(quadrature_elem_t(x.bottomRows(2), w));
442  trial_quadrature.push_back(quadrature_elem_t(x.topRows(2), 1.0));
443  }
444  }
445  } // for loop for i4
446  } // for loop for i3
447  } // for loop for i2
448  } // for loop for i1
449  } // function generate
450 };
451 
452 
456 template <class match_type>
457 struct quad_helper;
458 
460 template <>
461 struct quad_helper<match::match_2d_type> : helper_base<quad_domain, quad_domain>
462 {
464  static const unsigned num_domains = 4;
466  static const bool is_symmetric = true;
472  static scalar_t const corners[4][4][2];
474  static xi_t transform_eta(xi_t const &eta)
475  {
476  return eta;
477  }
478 };
479 
481 template <>
482 struct quad_helper<match::match_1d_type> : helper_base<quad_domain, quad_domain>
483 {
485  static const unsigned num_domains = 6;
487  static const bool is_symmetric = false;
493  static scalar_t const corners[6][4][2];
495  static xi_t transform_eta(xi_t const &eta)
496  {
497  return xi_t(eta(0), -2.0-eta(1));
498  }
499 };
500 
502 template <>
503 struct quad_helper<match::match_0d_type> : helper_base<quad_domain, quad_domain>
504 {
506  static const unsigned num_domains = 5;
508  static const bool is_symmetric = false;
512  static scalar_t const corners[5][4][2];
516  static xi_t transform_eta(xi_t const &eta)
517  {
518  return -2.0 * xi_t::Ones() - eta;
519  }
520 };
521 
527 template <class quadrature_family_t>
529 {
530 public:
534  typedef typename quadrature_t::quadrature_elem_t quadrature_elem_t;
536  typedef typename quadrature_elem_t::xi_t xi_t;
537 
545  template <class match_type>
546  static void generate(
547  quadrature_t &test_quadrature,
548  quadrature_t &trial_quadrature,
549  unsigned singular_quadrature_order)
550  {
552  typedef quad_helper<match_type> hlp_t;
553  typedef typename hlp_t::scalar_t scalar_t;
554 
555  // create a regular quad quadrature for Duffy transformation purposes
556  quadrature_t base_quad(singular_quadrature_order);
557 
558  for (unsigned d = 0; d < hlp_t::num_domains; ++d)
559  {
560  // Duffy transformation corners
561  Eigen::Matrix<scalar_t, 4, 2> corners;
562 
563  // Copy transformation corners from helper struct
564  for (unsigned c = 0; c < 4; ++c)
565  for (unsigned j = 0; j < 2; ++j)
566  corners(c,j) = hlp_t::corners[d][c][j];
567 
568  // perform transform
569  quadrature_t outer_quad = base_quad.template transform<quad_1_shape_set>(corners);
570 
571  for (unsigned out_idx = 0; out_idx < outer_quad.size(); ++out_idx)
572  {
573  // compute opposite corners of Y rectangle
574  xi_t eta_lims[2];
575  eta_lims[0] = hlp_t::transform_eta(quad_domain::get_corner(0));
576  eta_lims[1] = hlp_t::transform_eta(quad_domain::get_corner(2));
577 
578  // make sure that the Y rectangle has positive side lengths
579  for (unsigned j = 0; j < 2; ++j)
580  if (eta_lims[0](j) > eta_lims[1](j))
581  std::swap(eta_lims[0](j), eta_lims[1](j));
582 
583  // compute (-mu + Y) intersection with X
584  xi_t mu = outer_quad[out_idx].get_xi();
585  scalar_t out_w = outer_quad[out_idx].get_w();
586  corners <<
587  -mu(0)+eta_lims[0](0), -mu(1)+eta_lims[0](1),
588  -mu(0)+eta_lims[1](0), -mu(1)+eta_lims[0](1),
589  -mu(0)+eta_lims[1](0), -mu(1)+eta_lims[1](1),
590  -mu(0)+eta_lims[0](0), -mu(1)+eta_lims[1](1);
591  // limit into quad domain
592  xi_t const &ximin = quad_domain::get_corner(0);
593  xi_t const &ximax = quad_domain::get_corner(2);
594  for (int i = 0; i < corners.rows(); ++i)
595  for (unsigned j = 0; j < 2; ++j)
596  corners(i,j) = std::max(std::min(corners(i,j), ximax(j)), ximin(j));
597 
598  quadrature_t inner_quad = base_quad.template transform<quad_1_shape_set>(corners);
599 
600  for (unsigned in_idx = 0; in_idx < inner_quad.size(); ++in_idx)
601  {
602  xi_t xi = inner_quad[in_idx].get_xi();
603  xi_t eta = hlp_t::transform_eta(mu + xi);
604 
605  scalar_t w = out_w * inner_quad[in_idx].get_w();
606 
607  test_quadrature.push_back(quadrature_elem_t(xi, w));
608  trial_quadrature.push_back(quadrature_elem_t(eta, 1.0));
609 
610  if (hlp_t::is_symmetric)
611  {
612  test_quadrature.push_back(quadrature_elem_t(eta, 1.0));
613  trial_quadrature.push_back(quadrature_elem_t(xi, w));
614  }
615  } // inner quadrature loop
616  } // outer quadrature loop
617  } // domain loop
618  } // function generate()
619 };
620 
621 
627 template <class quadrature_family_t>
629 {
630 public:
636  typedef typename test_quadrature_t::quadrature_elem_t quadrature_elem_t;
638  typedef typename quadrature_elem_t::xi_t xi_t;
641 
649  template <class match_type>
650  static void generate(
651  test_quadrature_t &test_quadrature,
652  trial_quadrature_t &trial_quadrature,
653  unsigned singular_quadrature_order)
654  {
655  // call specialised function member
656  generate(match_type(), test_quadrature, trial_quadrature, singular_quadrature_order);
657  }
658 
659 
660 private:
667  static void generate(
669  test_quadrature_t &test_quadrature,
670  trial_quadrature_t &trial_quadrature,
671  unsigned singular_quadrature_order)
672  {
673  trial_quadrature_t test_base;
674  trial_quadrature_t trial_base;
675  base_sing_t::template generate<match::match_0d_type>(
676  test_base, trial_base, singular_quadrature_order);
677 
678  unsigned corner_idx[2][3] = {
679  {0, 1, 2},
680  {0, 2, 3}
681  };
682 
683  for (unsigned d = 0; d < 2; ++d)
684  {
685  Eigen::Matrix<tria_domain::scalar_t, 3, 2> corners;
686  for (unsigned i = 0; i < 3; ++i)
687  corners.row(i) = quad_domain::get_corner(corner_idx[d][i]);
688  trial_quadrature_t test_trans = test_base.template transform<tria_1_shape_set>(corners);
689 
690  for (unsigned i = 0; i < test_trans.size(); ++i)
691  {
692  test_quadrature.push_back(test_trans[i]);
693  trial_quadrature.push_back(trial_base[i]);
694  }
695  }
696  }
697 
704  static void generate(
706  test_quadrature_t &test_quadrature,
707  trial_quadrature_t &trial_quadrature,
708  unsigned singular_quadrature_order)
709  {
710  // the quad domain is divided into two triangles
711  unsigned corner_idx[2][3] = {
712  {0, 1, 2}, // 1d match
713  {0, 2, 3} // 0d match
714  };
715 
716  // for transformation pusposes
717  Eigen::Matrix<tria_domain::scalar_t, 3, 2> corners;
718 
719  // the underlying edge-singular tria-tria quadratures
720  trial_quadrature_t test_base;
721  trial_quadrature_t trial_base;
722  base_sing_t::template generate<match::match_1d_type>(
723  test_base, trial_base, singular_quadrature_order);
724 
725  // assemble corners, transform and insert into result
726  for (unsigned i = 0; i < 3; ++i)
727  corners.row(i) = quad_domain::get_corner(corner_idx[0][i]);
728  test_base.template transform_inplace<tria_1_shape_set>(corners);
729  for (unsigned i = 0; i < test_base.size(); ++i)
730  {
731  test_quadrature.push_back(test_base[i]);
732  trial_quadrature.push_back(trial_base[i]);
733  }
734 
735  // clear the quadratures before filling them again
736  test_base.clear();
737  trial_base.clear();
738 
739  // the underlying corner-singular tria-tria quadratures
740  base_sing_t::template generate<match::match_0d_type>(
741  test_base, trial_base, singular_quadrature_order);
742 
743  // assemble corners, transform and insert into result
744  for (unsigned i = 0; i < 3; ++i)
745  corners.row(i) = quad_domain::get_corner(corner_idx[1][i]);
746  test_base.template transform_inplace<tria_1_shape_set>(corners);
747  for (unsigned i = 0; i < test_base.size(); ++i)
748  {
749  test_quadrature.push_back(test_base[i]);
750  trial_quadrature.push_back(trial_base[i]);
751  }
752  } // function generate
753 };
754 
755 
761 template <class quadrature_family_t>
763 {
764 public:
769 
777  template <class match_type>
778  static void generate(
779  test_quadrature_t &test_quadrature,
780  trial_quadrature_t &trial_quadrature,
781  unsigned singular_quadrature_order)
782  {
783  // call quad-tria version with swapped arguments
785  template generate<match_type>(trial_quadrature, test_quadrature, singular_quadrature_order);
786  }
787 };
788 
789 } // end of namespace NiHu
790 
791 #endif // NIHU_SINGULAR_GALERKIN_QUADRATURE_HPP_INCLUDED
792 
NiHu::tria_helper< match::match_2d_type >::transform_inplace
static void transform_inplace(descartes_quad_t &x, scalar_t &w, unsigned idx)
transform the 4d quadrature into a singular Duffy one
Definition: singular_galerkin_quadrature.hpp:216
NiHu::domain_base< quad_domain >::scalar_t
space_t::scalar_t scalar_t
coordinate scalar type
Definition: domain.hpp:89
NiHu::singular_galerkin_quadrature< quadrature_family_t, quad_domain, quad_domain >::quadrature_elem_t
quadrature_t::quadrature_elem_t quadrature_elem_t
the quadrature element type
Definition: singular_galerkin_quadrature.hpp:534
NiHu::helper_base::descartes_quad_t
Eigen::Matrix< scalar_t, test_domain_t::dimension+trial_domain_t::dimension, 1 > descartes_quad_t
the matrix type of a Descartes quadrature element
Definition: singular_galerkin_quadrature.hpp:64
NiHu::singular_galerkin_quadrature< quadrature_family_t, tria_domain, quad_domain >::generate
static void generate(test_quadrature_t &test_quadrature, trial_quadrature_t &trial_quadrature, unsigned singular_quadrature_order)
generate a singular quadrature for a given singularity type
Definition: singular_galerkin_quadrature.hpp:778
NiHu::singular_galerkin_quadrature< quadrature_family_t, tria_domain, tria_domain >::generate
static void generate(quadrature_t &test_quadrature, quadrature_t &trial_quadrature, unsigned singular_quadrature_order)
generate a singular quadrature for a given singularity type
Definition: singular_galerkin_quadrature.hpp:385
NiHu::singular_galerkin_quadrature< quadrature_family_t, tria_domain, quad_domain >::test_quadrature_t
quadrature_type< quadrature_family_t, tria_domain >::type test_quadrature_t
the regular test quadrature type
Definition: singular_galerkin_quadrature.hpp:766
NiHu::quad_helper< match::match_2d_type >::scalar_t
quad_domain::scalar_t scalar_t
type of the domain scalar
Definition: singular_galerkin_quadrature.hpp:470
NiHu::quad_helper< match::match_1d_type >::scalar_t
quad_domain::scalar_t scalar_t
type of the domain scalar
Definition: singular_galerkin_quadrature.hpp:491
quadrature.hpp
implementation of class NiHu::quadrature_elem, NiHu::quadrature_base
NiHu::singular_galerkin_quadrature< quadrature_family_t, quad_domain, tria_domain >::trial_quadrature_t
quadrature_type< quadrature_family_t, tria_domain >::type trial_quadrature_t
the (regular) trial quadrature type
Definition: singular_galerkin_quadrature.hpp:634
element_match.hpp
determine element singularities
NiHu::quad_helper< match::match_0d_type >::scalar_t
quad_domain::scalar_t scalar_t
type of the domain scalar
Definition: singular_galerkin_quadrature.hpp:510
NiHu::helper_base::scalar_t
test_domain_t::scalar_t scalar_t
the scalar type of the singular quadrature
Definition: singular_galerkin_quadrature.hpp:61
NiHu::quad_helper< match::match_0d_type >::xi_t
quad_domain::xi_t xi_t
type of the domain variable
Definition: singular_galerkin_quadrature.hpp:514
NiHu::domain_base< quad_domain >::get_corner
static const xi_t & get_corner(unsigned idx)
return specified corner of domain
Definition: domain.hpp:112
NiHu::singular_galerkin_quadrature< quadrature_family_t, quad_domain, tria_domain >::base_sing_t
singular_galerkin_quadrature< quadrature_family_t, tria_domain, tria_domain > base_sing_t
the underlying singular quadrature type (tria-tria)
Definition: singular_galerkin_quadrature.hpp:640
NiHu::singular_galerkin_quadrature< quadrature_family_t, quad_domain, quad_domain >::generate
static void generate(quadrature_t &test_quadrature, quadrature_t &trial_quadrature, unsigned singular_quadrature_order)
generate a singular quadrature for a given singularity type
Definition: singular_galerkin_quadrature.hpp:546
NiHu::singular_galerkin_quadrature< quadrature_family_t, quad_domain, tria_domain >::test_quadrature_t
quadrature_type< quadrature_family_t, quad_domain >::type test_quadrature_t
the (regular) test quadrature type
Definition: singular_galerkin_quadrature.hpp:632
NiHu::singular_galerkin_quadrature< quadrature_family_t, tria_domain, tria_domain >::quadrature_elem_t
quadrature_t::quadrature_elem_t quadrature_elem_t
the quadrature element type
Definition: singular_galerkin_quadrature.hpp:372
NiHu::singular_galerkin_quadrature< quadrature_family_t, quad_domain, quad_domain >::quadrature_t
quadrature_type< quadrature_family_t, quad_domain >::type quadrature_t
the (regular) quadrature type
Definition: singular_galerkin_quadrature.hpp:532
NiHu::helper_base
base structure for quadrature helpers
Definition: singular_galerkin_quadrature.hpp:58
NiHu::singular_galerkin_quadrature< quadrature_family_t, tria_domain, tria_domain >::quadrature_t
quadrature_type< quadrature_family_t, tria_domain >::type quadrature_t
the (regular) quadrature type
Definition: singular_galerkin_quadrature.hpp:370
NiHu::tria_helper
helper structure for the tria-tria case
Definition: singular_galerkin_quadrature.hpp:196
NiHu::line_domain
a 1D line domain
Definition: lib_domain.hpp:53
NiHu::tria_helper< match::match_0d_type >::transform_inplace
static void transform_inplace(descartes_quad_t &x, scalar_t &w, unsigned)
transform the 4d quadrature into a singular Duffy one
Definition: singular_galerkin_quadrature.hpp:342
NiHu::singular_galerkin_quadrature
class computing singular Galerkin type quadratures for different domains
Definition: singular_galerkin_quadrature.hpp:50
NiHu::match::match_2d_type
std::integral_constant< int, 2 > match_2d_type
two elements are adjacent with a 2d (surface) match
Definition: match_types.hpp:42
NiHu::quad_helper< match::match_0d_type >::transform_eta
static xi_t transform_eta(xi_t const &eta)
transform vector from Y' domain to Y domain
Definition: singular_galerkin_quadrature.hpp:516
NiHu::tria_helper< match::match_1d_type >::transform_inplace
static void transform_inplace(descartes_quad_t &x, scalar_t &w, unsigned idx)
transform the 4d quadrature into a singular Duffy one
Definition: singular_galerkin_quadrature.hpp:271
NiHu::singular_galerkin_quadrature< quadrature_family_t, tria_domain, quad_domain >::trial_quadrature_t
quadrature_type< quadrature_family_t, quad_domain >::type trial_quadrature_t
the regular trial quadrature type
Definition: singular_galerkin_quadrature.hpp:768
NiHu::quad_helper< match::match_2d_type >::transform_eta
static xi_t transform_eta(xi_t const &eta)
transform vector from Y' domain to Y domain
Definition: singular_galerkin_quadrature.hpp:474
NiHu::singular_galerkin_quadrature< quadrature_family_t, tria_domain, tria_domain >
specialisation of NiHu::singular_galerkin_quadrature for the tria-tria case
Definition: singular_galerkin_quadrature.hpp:366
NiHu::line_helper
helper structure for the line-line case
Definition: singular_galerkin_quadrature.hpp:74
NiHu::match::match_0d_type
std::integral_constant< int, 0 > match_0d_type
two elements are adjacent with a 0d (vertex) match
Definition: match_types.hpp:38
NiHu::quad_helper< match::match_2d_type >::xi_t
quad_domain::xi_t xi_t
type of the domain variable
Definition: singular_galerkin_quadrature.hpp:468
NiHu::singular_galerkin_quadrature< quadrature_family_t, quad_domain, quad_domain >::xi_t
quadrature_elem_t::xi_t xi_t
location type of the outer and inner quadratures
Definition: singular_galerkin_quadrature.hpp:536
NiHu::line_helper< match::match_0d_type >::transform_inplace
static void transform_inplace(descartes_quad_t &x, scalar_t &w, unsigned idx)
transform the 2d quadrature into a singular Duffy one
Definition: singular_galerkin_quadrature.hpp:94
NiHu::quadrature_type
metafunction to assign a quadrature type to a quadrature family and a domain
Definition: quadrature.hpp:326
NiHu::match::match_1d_type
std::integral_constant< int, 1 > match_1d_type
two elements are adjacent with a 1d (line) match
Definition: match_types.hpp:40
NiHu::singular_galerkin_quadrature< quadrature_family_t, quad_domain, tria_domain >::xi_t
quadrature_elem_t::xi_t xi_t
location type of the outer and inner quadratures
Definition: singular_galerkin_quadrature.hpp:638
NiHu::quad_helper< match::match_1d_type >::xi_t
quad_domain::xi_t xi_t
type of the domain variable
Definition: singular_galerkin_quadrature.hpp:489
NiHu::singular_galerkin_quadrature< quadrature_family_t, line_domain, line_domain >::quadrature_elem_t
quadrature_t::quadrature_elem_t quadrature_elem_t
the quadrature element type
Definition: singular_galerkin_quadrature.hpp:120
NiHu::bessel::J
T J(T const &z)
Bessel function J_nu(z)
Definition: math_functions.hpp:223
NiHu::singular_galerkin_quadrature< quadrature_family_t, quad_domain, tria_domain >::generate
static void generate(test_quadrature_t &test_quadrature, trial_quadrature_t &trial_quadrature, unsigned singular_quadrature_order)
generate a singular quadrature for a given singularity type
Definition: singular_galerkin_quadrature.hpp:650
NiHu::singular_galerkin_quadrature< quadrature_family_t, quad_domain, tria_domain >
specialisation of NiHu::singular_galerkin_quadrature for the quad-tria case
Definition: singular_galerkin_quadrature.hpp:628
NiHu::domain_base< quad_domain >::xi_t
space_t::location_t xi_t
coordinate vector type
Definition: domain.hpp:91
NiHu::quad_domain
a 2D quad domain
Definition: lib_domain.hpp:157
NiHu::singular_galerkin_quadrature< quadrature_family_t, line_domain, line_domain >::quadrature_t
quadrature_type< quadrature_family_t, line_domain >::type quadrature_t
the (regular) quadrature type
Definition: singular_galerkin_quadrature.hpp:118
NiHu::quad_helper
helper struct of the quad-quad algorithm
Definition: singular_galerkin_quadrature.hpp:457
NiHu::quad_helper< match::match_1d_type >::transform_eta
static xi_t transform_eta(xi_t const &eta)
transform vector from Y' domain to Y domain
Definition: singular_galerkin_quadrature.hpp:495
NiHu::singular_galerkin_quadrature< quadrature_family_t, quad_domain, tria_domain >::quadrature_elem_t
test_quadrature_t::quadrature_elem_t quadrature_elem_t
the quadrature element type
Definition: singular_galerkin_quadrature.hpp:636
NiHu::singular_galerkin_quadrature< quadrature_family_t, line_domain, line_domain >::generate
static void generate(quadrature_t &test_quadrature, quadrature_t &trial_quadrature, unsigned singular_quadrature_order)
generate a singular quadrature for a given singularity type
Definition: singular_galerkin_quadrature.hpp:131
NiHu::tria_domain
a 2D triangle domain
Definition: lib_domain.hpp:101