NiHu  2.0
laplace_2d_singular_double_integrals.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 
22 #ifndef LAPLACE_2D_SINGULAR_DOUBLE_INTEGRALS_HPP_INCLUDED
23 #define LAPLACE_2D_SINGULAR_DOUBLE_INTEGRALS_HPP_INCLUDED
24 
25 #include "../core/match_types.hpp"
26 #include "../core/singular_integral_shortcut.hpp"
27 #include "../util/math_functions.hpp"
28 #include "field_type_helpers.hpp"
29 #include "lib_element.hpp"
30 #include "laplace_kernel.hpp"
31 #include "normal_derivative_singular_integrals.hpp"
32 #include "quadrature_store_helper.hpp"
33 
34 #include <boost/math/constants/constants.hpp>
35 
36 #define NIHU_PRINT_DEBUG
37 
38 #ifdef NIHU_PRINT_DEBUG
39 #include <iostream>
40 #endif
41 
42 namespace NiHu
43 {
44 
49 template <class TestField, class TrialField, size_t order>
51 {
52  typedef TestField test_field_t;
53  typedef TrialField trial_field_t;
54 
55  typedef typename test_field_t::nset_t test_shape_t;
56  typedef typename trial_field_t::nset_t trial_shape_t;
57 
58  static size_t const nTest = test_shape_t::num_nodes;
59  static size_t const nTrial = trial_shape_t::num_nodes;
60 
61  typedef Eigen::Matrix<double, nTest, nTrial> result_t;
62 
63  typedef typename trial_field_t::elem_t elem_t;
64  typedef typename elem_t::domain_t domain_t;
65 
66  typedef typename domain_t::xi_t xi_t;
67  typedef typename elem_t::x_t x_t;
68 
70  static size_t const inner_order =
71  elem_t::lset_t::jacobian_order * 2 + // Jy(v) (possible overkill)
72  elem_t::lset_t::jacobian_order * 2 + // Jx(v) (possible overkill)
73  trial_field_t::nset_t::polynomial_order + // Ny(v) exact
74  test_field_t::nset_t::polynomial_order + // Nx(v) exact
75  1; // 1-v (exact)
77 
78 public:
82  static result_t eval(elem_t const &elem)
83  {
84  using namespace boost::math::double_constants;
85 
86 #ifdef NIHU_PRINT_DEBUG
87  static bool printed = false;
88  if (!printed) {
89  std::cout << "Using laplace_2d_SLP_galerkin_face_general, inner order: " << inner_order << std::endl;
90  printed = true;
91  }
92 #endif
93 
94  result_t I = result_t::Zero();
95 
96  // loop over u
97  for (auto const &qu : quadrature_t::quadrature) {
98  double u = qu.get_xi()(0);
99  double wu = qu.get_w();
100 
101  // loop over Gauss-Legendre base points
102  for (auto const &qv : quadrature_t::quadrature) {
103  double v = (qv.get_xi()(0) + 1.) / 2.;
104  double wv = qv.get_w() / 2.;
105 
106  xi_t xi, eta;
107 
108  // loop over domains (0) upper triangle, (1) lower triangle
109  for (int d = 0; d < 2; ++d) {
110  if (d == 0) {
111  xi(0) = u + (+1. - u) * v;
112  eta(0) = u + (-1. - u) * v;
113  }
114  else {
115  xi(0) = u + (-1. - u) * v;
116  eta(0) = u + (+1. - u) * v;
117  }
118 
119  x_t x = elem.get_x(xi);
120  x_t y = elem.get_x(eta);
121  double r = (y - x).norm();
122  double Jxi = elem.get_dx(xi).norm();
123  double Jeta = elem.get_dx(eta).norm();
124  auto Nxi = test_shape_t::template eval_shape<0>(xi);
125  auto Neta = trial_shape_t::template eval_shape<0>(eta);
126 
127  // The regular part of the kernel
128  double Greg = -std::log(r / v) / two_pi;
129  // evaluate regular integrand
130  I += Greg * Jxi * Jeta * (2. * (1. - v)) * wu * wv
131  * (Nxi * Neta.transpose());
132  } // loop over domains
133  } // loop over v
134 
135  // loop over logarithmic Gaussian base points
136  for (auto const &quad : log_quadrature_t::quadrature) {
137  double v = quad.get_xi()(0);
138  double wv = quad.get_w();
139 
140  xi_t xi, eta;
141 
142  // loop over domains (0) upper triangle, (1) lower triangle
143  for (int d = 0; d < 2; ++d) {
144  if (d == 0) {
145  xi(0) = u + (+1. - u) * v;
146  eta(0) = u + (-1. - u) * v;
147  }
148  else {
149  xi(0) = u + (-1. - u) * v;
150  eta(0) = u + (+1. - u) * v;
151  }
152 
153  double Jxi = elem.get_dx(xi).norm();
154  double Jeta = elem.get_dx(eta).norm();
155  auto Nxi = test_shape_t::template eval_shape<0>(xi);
156  auto Neta = trial_shape_t::template eval_shape<0>(eta);
157 
158  double Gsing = 1.0 / two_pi; // -log(v) / two_pi;
159 
160  // evaluate regular integrand
161  result_t F = Gsing * Jxi * Jeta * (Nxi * Neta.transpose());
162  I += F * (2. * (1. - v)) * wu * wv;
163  } // loop over domains
164  } // loop over v
165  } // loop over u
166  return I;
167  } // function eval
168 }; // class laplace_2d_SLP_galerkin_face_general
169 
170 
173 {
174 public:
178  static double eval(line_1_elem const &elem)
179  {
180  using namespace boost::math::double_constants;
181 
182 #ifdef NIHU_PRINT_DEBUG
183  static bool printed = false;
184  if (!printed) {
185  std::cout << "Using laplace_2d_SLP_galerkin_face_constant_line" << std::endl;
186  printed = true;
187  }
188 #endif
189 
190  auto const &C = elem.get_coords();
191  double d = (C.col(1) - C.col(0)).norm();
192  return d * d * (1.5 - std::log(d)) / two_pi;
193  }
194 };
195 
198 {
199 public:
204  static void eval(line_1_elem const &elem, double &i1, double &i2)
205  {
206  using namespace boost::math::double_constants;
207 
208 #ifdef NIHU_PRINT_DEBUG
209  static bool printed = false;
210  if (!printed) {
211  std::cout << "Using laplace_2d_SLP_galerkin_face_linear_line" << std::endl;
212  printed = true;
213  }
214 #endif
215 
216  auto const &C = elem.get_coords();
217  double d = (C.col(1) - C.col(0)).norm(); // element length
218  double c = d * d / (8. * pi);
219  double lnd = std::log(d);
220  i1 = c * (1.75 - lnd);
221  i2 = c * (1.25 - lnd);
222  }
223 };
224 
225 
234 template <class TestField, class TrialField, size_t order>
236 {
237  typedef TestField test_field_t;
238  typedef TrialField trial_field_t;
239 
240  typedef typename test_field_t::nset_t test_shape_t;
241  typedef typename test_shape_t::shape_t test_N_t;
242  typedef typename trial_field_t::nset_t trial_shape_t;
243  typedef typename trial_shape_t::shape_t trial_N_t;
244 
245  static size_t const nTest = test_shape_t::num_nodes;
246  static size_t const nTrial = trial_shape_t::num_nodes;
247 
248  typedef Eigen::Matrix<double, nTest, nTrial> result_t;
249 
250  typedef typename trial_field_t::elem_t trial_elem_t;
251  typedef typename test_field_t::elem_t test_elem_t;
252 
253  typedef typename trial_elem_t::domain_t domain_t;
254  typedef typename domain_t::xi_t xi_t;
255  typedef typename trial_elem_t::x_t x_t;
256 
258  static size_t const inner_order =
259  trial_elem_t::lset_t::jacobian_order * 2 + // Jy(v) (possible overkill)
260  test_elem_t::lset_t::jacobian_order * 2 + // Jx(v) (possible overkill)
261  trial_field_t::nset_t::polynomial_order + // Ny(v) exact
262  test_field_t::nset_t::polynomial_order + // Nx(v) exact
263  1; // v (exact)
265 
266 public:
271  static result_t eval(
272  test_elem_t const &test_elem,
273  trial_elem_t const &trial_elem)
274  {
275 #ifdef NIHU_PRINT_DEBUG
276  static bool printed = false;
277  if (!printed) {
278  std::cout << "Using laplace_2d_SLP_galerkin_edge_general, inner order: " << inner_order << std::endl;
279  printed = true;
280  }
281 #endif
282  using namespace boost::math::double_constants;
283 
284  laplace_2d_SLP_kernel kernel;
285 
286  result_t I = result_t::Zero();
287 
288  int singular_domain;
289  if (test_elem.get_nodes()(test_elem_t::num_nodes - 1) == trial_elem.get_nodes()(0))
290  singular_domain = 1;
291  else if (test_elem.get_nodes()(0) == trial_elem.get_nodes()(trial_elem_t::num_nodes - 1))
292  singular_domain = 0;
293  else throw std::logic_error("Invalid singular case detected");
294 
295  // loop over two subdomains
296  for (int d = 0; d < 2; ++d) {
297  xi_t xi0, eta0;
298  if (d == 0) {
299  xi0 << -1;
300  eta0 << +1;
301  }
302  else {
303  xi0 << +1;
304  eta0 << -1;
305  }
306 
307  bool singular = singular_domain == d;
308 
309  // loop over u
310  for (auto const &qu : reg_quadrature_t::quadrature) {
311  xi_t u = qu.get_xi();
312  double wu = qu.get_w();
313 
314  // loop over v
315  for (auto const &qv : reg_quadrature_t::quadrature) {
316  double v = (qv.get_xi()(0) + 1.) / 2.;
317  double wv = qv.get_w() / 2.;
318 
319  // compute intrinsic variables
320  xi_t xi = xi0 + (u - xi0) * v;
321  xi_t eta = eta0 + (u - eta0) * v;
322 
323  // compute kernel value
324  double r = (trial_elem.get_x(eta) - test_elem.get_x(xi)).norm();
325  double G = -std::log(r) / two_pi;
326  if (singular)
327  G -= -std::log(v) / two_pi;
328 
329  double Jxi = test_elem.get_normal(xi).norm();
330  double Jeta = trial_elem.get_normal(eta).norm();
331  test_N_t Nxi = test_shape_t::template eval_shape<0>(xi);
332  trial_N_t Neta = trial_shape_t::template eval_shape<0>(eta);
333 
334  // evaluate integrand
335  I += G * Jxi * Jeta * (Nxi * Neta.transpose()) * 2. * v * wv * wu;
336  } // loop over regular v
337 
338  if (!singular)
339  continue;
340 
341  // loop over logarithmic v
342  for (auto const &qv : log_quadrature_t::quadrature) {
343  double v = qv.get_xi()(0);
344  double wv = qv.get_w();
345 
346  // compute intrinsic variables
347  xi_t xi = xi0 + (u - xi0) * v;
348  xi_t eta = eta0 + (u - eta0) * v;
349 
350  // compute kernel value
351  double G = 1.0 / two_pi;
352  double Jxi = test_elem.get_normal(xi).norm();
353  double Jeta = trial_elem.get_normal(eta).norm();
354  test_N_t Nxi = test_shape_t::template eval_shape<0>(xi);
355  trial_N_t Neta = trial_shape_t::template eval_shape<0>(eta);
356 
357  // evaluate integrand
358  I += G * Jxi * Jeta * (Nxi * Neta.transpose()) * 2. * v * wv * wu;
359  } // loop over singular v
360  } // loop over u
361  } // loop over domains
362 
363  return I;
364  } // function eval
365 }; // class laplace_2d_SLP_galerkin_edge_general
366 
367 
370 {
371  static double qfunc(double a, double phi)
372  {
373  using namespace boost::math::double_constants;
374 
375  if (std::abs(phi) < 1e-3)
376  return a / (a + 1.);
377  double cotphi = std::tan(half_pi - phi);
378  return std::atan(a / std::sin(phi) + cotphi) - std::atan(cotphi);
379  }
380 
381 public:
386  static double eval(line_1_elem const &elem1, line_1_elem const &elem2)
387  {
388  using namespace boost::math::double_constants;
389 
390 #ifdef NIHU_PRINT_DEBUG
391  static bool printed = false;
392  if (!printed) {
393  std::cout << "Using laplace_2d_SLP_galerkin_edge_constant_line" << std::endl;
394  printed = true;
395  }
396 #endif
397 
398  // get the element corner coordinates
399  auto const &C1 = elem1.get_coords();
400  auto const &C2 = elem2.get_coords();
401  // and side vectors
402  auto r1vec = (C1.col(1) - C1.col(0)).eval(), r2vec = (C2.col(1) - C2.col(0)).eval();
403  // and side lengths
404  double r1 = r1vec.norm(), r2 = r2vec.norm();
405  // and signed angle between them
406  double phi = std::asin(r1vec(0) * r2vec(1) - r2vec(0) * r1vec(1)) / (r1 * r2);
407  // third side length
408  double r3 = std::sqrt(r1 * r1 + 2 * r1 * r2 * std::cos(phi) + r2 * r2);
409  return (
410  r1 * r2 * (3. - 2. * std::log(r3))
411  + std::cos(phi) * (r1 * r1 * std::log(r1 / r3) + r2 * r2 * std::log(r2 / r3))
412  - std::sin(phi) * (r1 * r1 * qfunc(r2 / r1, phi) + r2 * r2 * qfunc(r1 / r2, phi))
413  ) / (4. * pi);
414  }
415 };
416 
417 
428 template <class TestField, class TrialField, size_t order>
430 {
431  typedef TestField test_field_t;
432  typedef TrialField trial_field_t;
433 
434  typedef typename test_field_t::nset_t test_shape_t;
435  typedef typename trial_field_t::nset_t trial_shape_t;
436 
437  static size_t const nTest = test_shape_t::num_nodes;
438  static size_t const nTrial = trial_shape_t::num_nodes;
439 
440  typedef Eigen::Matrix<double, nTest, nTrial> result_t;
441 
442  typedef typename trial_field_t::elem_t elem_t;
443  typedef typename elem_t::domain_t domain_t;
444 
445  typedef typename domain_t::xi_t xi_t;
446  typedef typename elem_t::x_t x_t;
447 
449 
451 
452 public:
456  static result_t eval(elem_t const &elem)
457  {
458 #ifdef NIHU_PRINT_DEBUG
459  static bool printed = false;
460  if (!printed) {
461  std::cout << "Using laplace_2d_DLP_galerkin_face_general" << std::endl;
462  printed = true;
463  }
464 #endif
465 
466  using namespace boost::math::double_constants;
467 
468  kernel_t kernel;
469 
470  result_t I = result_t::Zero();
471 
472  // loop over v
473  for (auto const &qv : quadrature_t::quadrature) {
474  xi_t v = qv.get_xi();
475  v(0) = (v(0) + 1.) / 2.;
476  double wv = qv.get_w() / 2.;
477 
478  // loop over u
479  for (auto const &qu : quadrature_t::quadrature) {
480  xi_t u = qu.get_xi();
481  double wu = qu.get_w();
482 
483  // loop over domains
484  for (int d = 0; d < 2; ++d) {
485  xi_t xi, eta;
486 
487  if (d == 0) {
488  xi(0) = u(0) + (+1. - u(0)) * v(0);
489  eta(0) = u(0) + (-1. - u(0)) * v(0);
490  }
491  else {
492  xi(0) = u(0) + (-1. - u(0)) * v(0);
493  eta(0) = u(0) + (+1. - u(0)) * v(0);
494  }
495 
496  double Jxi = elem.get_normal(xi).norm();
497  double G = kernel(elem.get_x(xi), elem.get_x(eta), elem.get_normal(eta));
498 
499  auto Nxi = test_shape_t::template eval_shape<0>(xi);
500  auto Neta = trial_shape_t::template eval_shape<0>(eta);
501 
502  // evaluate integrand (Jeta is incorporated in the Kernel with the normal)
503  result_t F = G * Jxi * 2 * (1. - v(0)) * (Nxi * Neta.transpose());
504 
505  I += F * wv * wu;
506  } // loop over domains
507  } // loop over u
508  } // loop over v
509  return I;
510  } // end fo function eval
511 }; // class laplace_2d_DLP_galerkin_face_general
512 
513 
518 {
519  static double qfunc(double a, double phi)
520  {
521  using namespace boost::math::double_constants;
522 
523  if (std::abs(phi) < 1e-3)
524  return a / (a + 1.);
525  double cotphi = std::tan(half_pi - phi);
526  return std::atan(a / std::sin(phi) + cotphi) - std::atan(cotphi);
527  }
528 
529 public:
534  static double eval(line_1_elem const &elem1, line_1_elem const &elem2)
535  {
536  using namespace boost::math::double_constants;
537 
538 #ifdef NIHU_PRINT_DEBUG
539  static bool printed = false;
540  if (!printed) {
541  std::cout << "Using laplace_2d_DLP_galerkin_edge_constant_line" << std::endl;
542  printed = true;
543  }
544 #endif
545 
546  // get element corners
547  auto const &C1 = elem1.get_coords();
548  auto const &C2 = elem2.get_coords();
549  // get side vectors
550  auto r1vec = (C1.col(1) - C1.col(0)).eval(), r2vec = (C2.col(1) - C2.col(0)).eval();
551  // get side lengths
552  double r1 = r1vec.norm(), r2 = r2vec.norm();
553  // get angle between elements
554  double phi = std::asin(r1vec(0) * r2vec(1) - r2vec(0) * r1vec(1)) / (r1 * r2);
555  // general expression
556  double r3 = std::sqrt(r1 * r1 + 2 * r1 * r2 * std::cos(phi) + r2 * r2);
557  double res = (
558  r2 * std::cos(phi) * qfunc(r1 / r2, phi)
559  - r1 * qfunc(r2 / r1, phi)
560  + r2 * std::sin(phi) * std::log(r2 / r3)
561  ) / two_pi;
562 
563  if (elem1.get_nodes()(0) == elem2.get_nodes()(1))
564  res *= -1;
565 
566  return res;
567  }
568 };
569 
570 
581 template <class TestField, class TrialField, size_t order>
583 {
584  typedef TestField test_field_t;
585  typedef TrialField trial_field_t;
586 
587  typedef typename test_field_t::nset_t test_shape_t;
588  typedef typename trial_field_t::nset_t trial_shape_t;
589 
590  static size_t const nTest = test_shape_t::num_nodes;
591  static size_t const nTrial = trial_shape_t::num_nodes;
592 
593  typedef Eigen::Matrix<double, nTest, nTrial> result_t;
594 
595  typedef typename trial_field_t::elem_t elem_t;
596  typedef typename elem_t::domain_t domain_t;
597 
598  typedef typename domain_t::xi_t xi_t;
599  typedef typename elem_t::x_t x_t;
600 
602 
604 
605 public:
609  static result_t eval(elem_t const &elem)
610  {
611 #ifdef NIHU_PRINT_DEBUG
612  static bool printed = false;
613  if (!printed) {
614  std::cout << "Using laplace_2d_DLPt_galerkin_face_general" << std::endl;
615  printed = true;
616  }
617 #endif
618 
619  using namespace boost::math::double_constants;
620 
621  kernel_t kernel;
622 
623  result_t I = result_t::Zero();
624 
625  // loop over v
626  for (auto const &qv : quadrature_t::quadrature) {
627  xi_t v = qv.get_xi();
628  v(0) = (v(0) + 1.) / 2.;
629  double wv = qv.get_w() / 2.;
630 
631  // loop over u
632  for (auto const &qu : quadrature_t::quadrature) {
633  xi_t u = qu.get_xi();
634  double wu = qu.get_w();
635 
636  // loop over domains
637  for (int d = 0; d < 2; ++d) {
638  xi_t xi, eta;
639 
640  if (d == 0) {
641  xi(0) = u(0) + (+1. - u(0)) * v(0);
642  eta(0) = u(0) + (-1. - u(0)) * v(0);
643  }
644  else {
645  xi(0) = u(0) + (-1. - u(0)) * v(0);
646  eta(0) = u(0) + (+1. - u(0)) * v(0);
647  }
648 
649  double Jeta = elem.get_normal(xi).norm();
650  double G = kernel(elem.get_x(xi), elem.get_x(eta), elem.get_normal(xi));
651 
652  auto Nxi = test_shape_t::template eval_shape<0>(xi);
653  auto Neta = trial_shape_t::template eval_shape<0>(eta);
654 
655  // evaluate integrand (Jeta is incorporated in the Kernel with the normal)
656  result_t F = G * Jeta * 2 * (1. - v(0)) * (Nxi * Neta.transpose());
657 
658  I += F * wv * wu;
659  } // loop over domains
660  } // loop over u
661  } // loop over v
662  return I;
663  } // end fo function eval
664 }; // class laplace_2d_DLPt_galerkin_face_general
665 
666 
678 template <class TestField, class TrialField, size_t order>
680 {
681  typedef TestField test_field_t;
682  typedef TrialField trial_field_t;
683 
684  typedef typename test_field_t::nset_t test_shape_t;
685  typedef typename trial_field_t::nset_t trial_shape_t;
686 
687  static size_t const nTest = test_shape_t::num_nodes;
688  static size_t const nTrial = trial_shape_t::num_nodes;
689 
690  typedef Eigen::Matrix<double, nTest, nTrial> result_t;
691 
692  typedef typename trial_field_t::elem_t elem_t;
693  typedef typename elem_t::domain_t domain_t;
694 
695  typedef typename domain_t::xi_t xi_t;
696  typedef typename elem_t::x_t x_t;
697 
699 
701 
702  static result_t F2(xi_t const &u)
703  {
704  using namespace boost::math::double_constants;
705  return test_shape_t::template eval_shape<0>(u)
706  * trial_shape_t::template eval_shape<0>(u).transpose()
707  / (2.0 * two_pi);
708  }
709 
710 public:
714  static result_t eval(elem_t const &elem)
715  {
716 #ifdef NIHU_PRINT_DEBUG
717  static bool printed = false;
718  if (!printed) {
719  std::cout << "Using laplace_2d_HSP_galerkin_face_general" << std::endl;
720  printed = true;
721  }
722 #endif
723 
724  using namespace boost::math::double_constants;
725 
726  kernel_t kernel;
727 
728  result_t I = result_t::Zero();
729 
730  // loop over v
731  for (auto const &qv : quadrature_t::quadrature) {
732  xi_t v = qv.get_xi();
733  v(0) = (v(0) + 1.) / 2.;
734  double wv = qv.get_w() / 2.;
735 
736  // loop over u
737  for (auto jt = quadrature_t::quadrature.begin(); jt != quadrature_t::quadrature.end(); ++jt) {
738  xi_t u = jt->get_xi();
739  double wu = jt->get_w();
740 
741  // loop over domains
742  for (int d = 0; d < 2; ++d) {
743  xi_t xi, eta;
744 
745  if (d == 0) {
746  xi(0) = u(0) + (+1. - u(0)) * v(0);
747  eta(0) = u(0) + (-1. - u(0)) * v(0);
748  }
749  else {
750  xi(0) = u(0) + (-1. - u(0)) * v(0);
751  eta(0) = u(0) + (+1. - u(0)) * v(0);
752  }
753 
754  x_t x = elem.get_x(xi);
755  x_t y = elem.get_x(eta);
756  x_t Jeta = elem.get_normal(eta);
757  x_t Jxi = elem.get_normal(xi);
758  double G = kernel(x, y, Jxi, Jeta);
759 
760  auto Nxi = test_shape_t::template eval_shape<0>(xi);
761  auto Neta = trial_shape_t::template eval_shape<0>(eta);
762 
763  // evaluate integrand
764  result_t F = G * 2 * (1. - v(0)) * (Nxi * Neta.transpose());
765 
766  I += F * wv * wu;
767  } // loop over domains
768 
769  I -= 2.0 * F2(u) / (v(0) * v(0)) * wv * wu;
770  } // loop over u
771 
772  I += 2.0 * (F2(xi_t(1.)) + F2(xi_t(-1.0))) / v(0) * wv;
773  } // loop over v
774 
775  for (auto jt = quadrature_t::quadrature.begin(); jt != quadrature_t::quadrature.end(); ++jt) {
776  xi_t u = jt->get_xi();
777  double wu = jt->get_w();
778  I -= 2.0 * F2(u) * wu;
779  }
780 
781  I -= 2.0 * (F2(xi_t(1.0)) * std::log(2.0 * elem.get_dx(xi_t(1.0)).norm())
782  + F2(xi_t(-1.0)) * std::log(2.0 * elem.get_dx(xi_t(-1.0)).norm()));
783 
784  return I;
785  } // end fo function eval
786 }; // class laplace_2d_HSP_galerkin_face_general
787 
788 
795 {
796  typedef line_1_elem elem_t;
797 public:
801  static double eval(elem_t const &elem)
802  {
803 #ifdef NIHU_PRINT_DEBUG
804  static bool printed = false;
805  if (!printed) {
806  std::cout << "Using laplace_2d_HSP_galerkin_face_constant_line" << std::endl;
807  printed = true;
808  }
809 #endif
810 
811  using namespace boost::math::double_constants;
812  double J = elem.get_normal().norm();
813  return -(1.0 + std::log(2.0 * J)) / pi;
814  } // end of function eval
815 }; // class laplace_2d_HSP_galerkin_face_constant_line
816 
817 
828 template <class TestField, class TrialField, size_t order>
830 {
831  typedef TestField test_field_t;
832  typedef TrialField trial_field_t;
833 
834  typedef typename test_field_t::nset_t test_shape_t;
835  typedef typename test_shape_t::shape_t test_N_t;
836  typedef typename trial_field_t::nset_t trial_shape_t;
837  typedef typename trial_shape_t::shape_t trial_N_t;
838 
839  static size_t const nTest = test_shape_t::num_nodes;
840  static size_t const nTrial = trial_shape_t::num_nodes;
841 
842  typedef Eigen::Matrix<double, nTest, nTrial> result_t;
843 
844  typedef typename trial_field_t::elem_t trial_elem_t;
845  typedef typename test_field_t::elem_t test_elem_t;
846 
847  typedef typename trial_elem_t::domain_t domain_t;
848  typedef typename domain_t::xi_t xi_t;
849  typedef typename trial_elem_t::x_t x_t;
850 
852 
854 
855 public:
860  static result_t eval(
861  test_elem_t const &test_elem,
862  trial_elem_t const &trial_elem)
863  {
864 #ifdef NIHU_PRINT_DEBUG
865  static bool printed = false;
866  if (!printed) {
867  std::cout << "Using laplace_2d_HSP_galerkin_edge_general" << std::endl;
868  printed = true;
869  }
870 #endif
871  using namespace boost::math::double_constants;
872 
873  kernel_t kernel;
874 
875  result_t I = result_t::Zero();
876 
877  int singular_domain;
878  if (test_elem.get_nodes()(test_elem_t::num_nodes - 1) == trial_elem.get_nodes()(0))
879  singular_domain = 1;
880  else if (test_elem.get_nodes()(0) == trial_elem.get_nodes()(trial_elem_t::num_nodes - 1))
881  singular_domain = 0;
882  else throw std::logic_error("Invalid singular case detected");
883 
884  // loop over two subdomains
885  for (int d = 0; d < 2; ++d) {
886  xi_t xi0, eta0;
887  if (d == 0) {
888  xi0 << -1;
889  eta0 << +1;
890  }
891  else {
892  xi0 << +1;
893  eta0 << -1;
894  }
895 
896  bool singular = singular_domain == d;
897 
898  x_t ax0, ay0, Jx0, Jy0;
899  test_N_t Nx0;
900  trial_N_t Ny0;
901 
902  // prepare quantities needed to compute F1(u)
903  if (singular) {
904  ax0 = test_elem.get_dx(xi0);
905  ay0 = trial_elem.get_dx(eta0);
906  Jx0 = test_elem.get_normal(xi0);
907  Jy0 = trial_elem.get_normal(eta0);
908  Nx0 = test_shape_t::template eval_shape<0>(xi0);
909  Ny0 = trial_shape_t::template eval_shape<0>(eta0);
910  }
911 
912  // loop over u
913  for (auto const &qu : quadrature_t::quadrature) {
914  xi_t u = qu.get_xi();
915  double wu = qu.get_w();
916 
917  // s and F1 are only computed if singular
918  double s;
919  result_t F1;
920 
921  if (singular) {
922  x_t svec = ay0 * (u - eta0)(0) - ax0 * (u - xi0)(0);
923  s = svec.norm();
924  x_t es = svec.normalized();
925  F1 = (Jx0.dot(Jy0) - 2 * es.dot(Jx0) * es.dot(Jy0)) / pi / s / s *
926  (Nx0 * Ny0.transpose());
927  }
928 
929  // loop over v
930  for (auto const &qv : quadrature_t::quadrature) {
931  xi_t v = qv.get_xi();
932  // transform v to (0,1) from (-1,1)
933  v(0) = (v(0) + 1.) / 2.;
934  double wv = qv.get_w() / 2.;
935 
936  // compute intrinsic variables
937  xi_t xi = xi0 + (u - xi0) * v;
938  xi_t eta = eta0 + (u - eta0) * v;
939 
940  // compute kernel value
941  x_t x = test_elem.get_x(xi);
942  x_t y = trial_elem.get_x(eta);
943  x_t Jxi = test_elem.get_normal(xi);
944  x_t Jeta = trial_elem.get_normal(eta);
945  double G = kernel(x, y, Jxi, Jeta);
946 
947  test_N_t Nxi = test_shape_t::template eval_shape<0>(xi);
948  trial_N_t Neta = trial_shape_t::template eval_shape<0>(eta);
949 
950  // evaluate integrand
951  result_t F = G * 2. * v(0) * (Nxi * Neta.transpose());
952 
953  I += F * wv * wu;
954 
955  if (singular)
956  // subtract singular part
957  I -= F1 / v(0) * wv * wu;
958  } // loop over v
959 
960  if (singular)
961  // add analytic (inner) integral of singular part
962  I += F1 * std::log(s) * wu;
963 
964  } // loop over u
965  } // loop over domains
966 
967  return I;
968  } // function eval
969 }; // class laplace_2d_HSP_galerkin_edge_general
970 
971 
975 template <class TestField, class TrialField>
977  laplace_2d_SLP_kernel, TestField, TrialField, match::match_1d_type,
978  typename std::enable_if<
979  std::is_same<typename get_formalism<TestField, TrialField>::type, formalism::general>::value &&
980  is_constant_line<TestField>::value &&
981  is_constant_line<TrialField>::value
982  >::type
983 >
984 {
985 public:
992  template <class result_t>
993  static result_t &eval(
994  result_t &result,
996  field_base<TestField> const &,
997  field_base<TrialField> const &trial_field,
998  element_match const &)
999  {
1000  result(0, 0) = laplace_2d_SLP_galerkin_face_constant_line::eval(trial_field.get_elem());
1001  return result;
1002  }
1003 };
1004 
1005 
1009 template <class TestField, class TrialField>
1011  laplace_2d_SLP_kernel, TestField, TrialField, match::match_1d_type,
1012  typename std::enable_if<
1013  std::is_same<typename get_formalism<TestField, TrialField>::type, formalism::general>::value &&
1014  is_linear_line<TrialField>::value &&
1015  is_linear_line<TestField>::value
1016  >::type
1017 >
1018 {
1019 public:
1026  template <class result_t>
1027  static result_t &eval(
1028  result_t &result,
1030  field_base<TestField> const &,
1031  field_base<TrialField> const &trial_field,
1032  element_match const &)
1033  {
1034  laplace_2d_SLP_galerkin_face_linear_line::eval(trial_field.get_elem(), result(0, 0), result(0, 1));
1035  result(1, 0) = result(0, 1);
1036  result(1, 1) = result(0, 0);
1037  return result;
1038  }
1039 };
1040 
1041 
1045 template <class TestField, class TrialField>
1047  laplace_2d_SLP_kernel, TestField, TrialField, match::match_1d_type,
1048  typename std::enable_if<
1049  std::is_same<typename get_formalism<TestField, TrialField>::type, formalism::general>::value &&
1050  !(is_linear_line<TrialField>::value &&is_linear_line<TestField>::value) &&
1051  !(is_constant_line<TrialField>::value &&is_constant_line<TestField>::value)
1052  >::type
1053 >
1054 {
1055 public:
1062  template <class result_t>
1063  static result_t &eval(
1064  result_t &result,
1066  field_base<TestField> const &,
1067  field_base<TrialField> const &trial_field,
1068  element_match const &)
1069  {
1071  return result;
1072  }
1073 };
1074 
1075 
1076 
1080 template <class TestField, class TrialField>
1082  laplace_2d_SLP_kernel, TestField, TrialField, match::match_0d_type,
1083  typename std::enable_if<
1084  std::is_same<typename get_formalism<TestField, TrialField>::type, formalism::general>::value &&
1085  is_constant_line<TrialField>::value &&is_constant_line<TestField>::value
1086  >::type
1087 >
1088 {
1089 public:
1097  template <class result_t>
1098  static result_t &eval(
1099  result_t &result,
1101  field_base<TestField> const &test_field,
1102  field_base<TrialField> const &trial_field,
1103  element_match const &)
1104  {
1106  test_field.get_elem(), trial_field.get_elem());
1107  return result;
1108  }
1109 };
1110 
1111 
1115 template <class TestField, class TrialField>
1117  laplace_2d_SLP_kernel, TestField, TrialField, match::match_0d_type,
1118  typename std::enable_if<
1119  std::is_same<typename get_formalism<TestField, TrialField>::type, formalism::general>::value &&
1120  !(is_constant_line<TrialField>::value &&is_constant_line<TestField>::value)
1121  >::type
1122 >
1123 {
1124 public:
1132  template <class result_t>
1133  static result_t &eval(
1134  result_t &result,
1136  field_base<TestField> const &test_field,
1137  field_base<TrialField> const &trial_field,
1138  element_match const &)
1139  {
1141  TestField, TrialField, 8
1142  >::eval(test_field.get_elem(), trial_field.get_elem());
1143  return result;
1144  }
1145 };
1146 
1147 
1151 template <class TestField, class TrialField>
1153  laplace_2d_DLP_kernel, TestField, TrialField, match::match_1d_type,
1154  typename std::enable_if<
1155  std::is_same<typename get_formalism<TestField, TrialField>::type, formalism::general>::value &&
1156  !std::is_same<typename TrialField::elem_t::lset_t, line_1_shape_set>::value
1157  >::type
1158 >
1159 {
1160 public:
1169  template <class result_t>
1170  static result_t &eval(
1171  result_t &result,
1173  field_base<TestField> const &test_field,
1174  field_base<TrialField> const &trial_field,
1175  element_match const &)
1176  {
1178  test_field.get_elem());
1179  return result;
1180  }
1181 };
1182 
1183 
1187 template <class TestField, class TrialField>
1189  laplace_2d_DLP_kernel, TestField, TrialField, match::match_0d_type,
1190  typename std::enable_if<
1191  std::is_same<typename get_formalism<TestField, TrialField>::type, formalism::general>::value &&
1192  is_constant_line<TrialField>::value &&
1193  is_constant_line<TestField>::value
1194  >::type
1195 >
1196 {
1197 public:
1204  template <class result_t>
1205  static result_t &eval(
1206  result_t &result,
1208  field_base<TestField> const &test_field,
1209  field_base<TrialField> const &trial_field,
1210  element_match const &)
1211  {
1213  test_field.get_elem(), trial_field.get_elem());
1214  return result;
1215  }
1216 };
1217 
1218 
1222 template <class TestField, class TrialField>
1224  laplace_2d_DLPt_kernel, TestField, TrialField, match::match_1d_type,
1225  typename std::enable_if<
1226  std::is_same<typename get_formalism<TestField, TrialField>::type, formalism::general>::value &&
1227  !std::is_same<typename TrialField::elem_t::lset_t, line_1_shape_set>::value
1228  >::type
1229 >
1230 {
1231 public:
1237  template <class result_t>
1238  static result_t &eval(
1239  result_t &result,
1241  field_base<TestField> const &test_field,
1242  field_base<TrialField> const &,
1243  element_match const &)
1244  {
1246  test_field.get_elem());
1247  return result;
1248  }
1249 };
1250 
1251 
1255 template <class TestField, class TrialField>
1257  laplace_2d_HSP_kernel, TestField, TrialField, match::match_1d_type,
1258  typename std::enable_if<
1259  std::is_same<typename get_formalism<TestField, TrialField>::type, formalism::general>::value &&
1260  !(is_constant_line<TestField>::value &&is_constant_line<TrialField>::value)
1261  >::type
1262 >
1263 {
1264 public:
1265  template <class result_t>
1266  static result_t &eval(
1267  result_t &result,
1269  field_base<TestField> const &test_field,
1270  field_base<TrialField> const &,
1271  element_match const &)
1272  {
1274  test_field.get_elem()
1275  );
1276  return result;
1277  }
1278 };
1279 
1280 
1284 template <class TestField, class TrialField>
1286  laplace_2d_HSP_kernel, TestField, TrialField, match::match_1d_type,
1287  typename std::enable_if<
1288  std::is_same<typename get_formalism<TestField, TrialField>::type, formalism::general>::value &&
1289  is_constant_line<TestField>::value &&is_constant_line<TrialField>::value
1290  >::type
1291 >
1292 {
1293 public:
1294  template <class result_t>
1295  static result_t &eval(
1296  result_t &result,
1298  field_base<TestField> const &test_field,
1299  field_base<TrialField> const &,
1300  element_match const &)
1301  {
1302  result(0, 0) = laplace_2d_HSP_galerkin_face_constant_line::eval(test_field.get_elem());
1303  return result;
1304  }
1305 };
1306 
1307 
1311 template <class TestField, class TrialField>
1313  laplace_2d_HSP_kernel, TestField, TrialField, match::match_0d_type,
1314  typename std::enable_if<
1315  std::is_same<typename get_formalism<TestField, TrialField>::type, formalism::general>::value
1316  >::type
1317 >
1318 {
1319 public:
1326  template <class result_t>
1327  static result_t &eval(
1328  result_t &result,
1330  field_base<TestField> const &test_field,
1331  field_base<TrialField> const &trial_field,
1332  element_match const &)
1333  {
1335  TestField, TrialField, 11>::eval(
1336  test_field.get_elem(), trial_field.get_elem());
1337  return result;
1338  }
1339 };
1340 
1341 } // namespace NiHu
1342 
1343 #endif /* LAPLACE_2D_SINGULAR_DOUBLE_INTEGRALS_HPP_INCLUDED */
NiHu::laplace_2d_HSP_galerkin_face_general
Face match double integral of the HSP kernel.
Definition: laplace_2d_singular_double_integrals.hpp:679
NiHu::bessel::J
T J(T const &z)
Bessel function J_nu(z)
Definition: math_functions.hpp:223
NiHu::laplace_2d_DLP_galerkin_face_general
Face match double integral of the DLP kernel.
Definition: laplace_2d_singular_double_integrals.hpp:429
NiHu::log_quad_store
Definition: quadrature_store_helper.hpp:24
NiHu::laplace_2d_SLP_galerkin_edge_general::eval
static result_t eval(test_elem_t const &test_elem, trial_elem_t const &trial_elem)
Evaluate the integral.
Definition: laplace_2d_singular_double_integrals.hpp:271
NiHu::laplace_2d_DLP_galerkin_face_general::eval
static result_t eval(elem_t const &elem)
Evaluate the integral.
Definition: laplace_2d_singular_double_integrals.hpp:456
NiHu::surface_element::get_normal
normal_return_type get_normal(xi_t const &xi=domain_t::get_center()) const
return element normal
Definition: element.hpp:611
laplace_kernel.hpp
implementation of kernels of the Laplace equation
C
Definition: bbfmm_covariance.cpp:47
NiHu::laplace_2d_SLP_galerkin_edge_constant_line
Edge match double integral of the SLP kernel over constant lines.
Definition: laplace_2d_singular_double_integrals.hpp:369
NiHu::singular_integral_shortcut< laplace_2d_SLP_kernel, TestField, TrialField, match::match_0d_type, typename std::enable_if< std::is_same< typename get_formalism< TestField, TrialField >::type, formalism::general >::value &&!(is_constant_line< TrialField >::value &&is_constant_line< TestField >::value) >::type >::eval
static result_t & eval(result_t &result, kernel_base< laplace_2d_SLP_kernel > const &, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field, element_match const &)
evaluate singular integral
Definition: laplace_2d_singular_double_integrals.hpp:1133
NiHu::laplace_2d_SLP_galerkin_face_constant_line
Face match double integral of the SLP kernel over a constant line.
Definition: laplace_2d_singular_double_integrals.hpp:172
NiHu::singular_integral_shortcut< laplace_2d_SLP_kernel, TestField, TrialField, match::match_0d_type, typename std::enable_if< std::is_same< typename get_formalism< TestField, TrialField >::type, formalism::general >::value &&is_constant_line< TrialField >::value &&is_constant_line< TestField >::value >::type >::eval
static result_t & eval(result_t &result, kernel_base< laplace_2d_SLP_kernel > const &, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field, element_match const &)
evaluate singular integral
Definition: laplace_2d_singular_double_integrals.hpp:1098
NiHu::volume_element::x_t
element_traits::location_value_type< Derived, 0 >::type x_t
type of the element's physical location variable
Definition: element.hpp:220
NiHu::regular_quad_store
store-wrapper of a statically stored quadrature
Definition: quadrature_store_helper.hpp:13
NiHu::laplace_2d_SLP_galerkin_edge_general
Edge match double integral of the HSP kernel.
Definition: laplace_2d_singular_double_integrals.hpp:235
NiHu::laplace_2d_HSP_galerkin_face_general::eval
static result_t eval(elem_t const &elem)
Evaluate the integral.
Definition: laplace_2d_singular_double_integrals.hpp:714
NiHu::laplace_2d_SLP_galerkin_face_general
Face match double integral of the SLP kernel.
Definition: laplace_2d_singular_double_integrals.hpp:50
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::kernel_base
CRTP base class of all BEM kernels.
Definition: kernel.hpp:133
NiHu::element_match
class describing the adjacency (match) state of two elements
Definition: element_match.hpp:39
NiHu::laplace_2d_SLP_galerkin_face_linear_line::eval
static void eval(line_1_elem const &elem, double &i1, double &i2)
Evaluate the integral.
Definition: laplace_2d_singular_double_integrals.hpp:204
NiHu::singular_integral_shortcut
a shortcut for the user to define customised singular integral methods
Definition: double_integral.hpp:709
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::laplace_2d_SLP_galerkin_edge_constant_line::eval
static double eval(line_1_elem const &elem1, line_1_elem const &elem2)
Evaluate the integral.
Definition: laplace_2d_singular_double_integrals.hpp:386
NiHu::laplace_2d_HSP_galerkin_face_constant_line::eval
static double eval(elem_t const &elem)
Evaluate the integral.
Definition: laplace_2d_singular_double_integrals.hpp:801
NiHu::singular_integral_shortcut< laplace_2d_DLP_kernel, TestField, TrialField, match::match_0d_type, typename std::enable_if< std::is_same< typename get_formalism< TestField, TrialField >::type, formalism::general >::value &&is_constant_line< TrialField >::value &&is_constant_line< TestField >::value >::type >::eval
static result_t & eval(result_t &result, kernel_base< laplace_2d_DLP_kernel > const &, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field, element_match const &)
evaluate singular integral
Definition: laplace_2d_singular_double_integrals.hpp:1205
NiHu::laplace_2d_SLP_galerkin_face_constant_line::eval
static double eval(line_1_elem const &elem)
Evaluate the integral.
Definition: laplace_2d_singular_double_integrals.hpp:178
NiHu::laplace_2d_DLPt_galerkin_face_general
Face match double integral of the DLPt kernel.
Definition: laplace_2d_singular_double_integrals.hpp:582
NiHu::field_base::get_elem
const elem_t & get_elem() const
return underlying element
Definition: field.hpp:149
NiHu::laplace_2d_SLP_galerkin_face_general::eval
static result_t eval(elem_t const &elem)
Evaluate the integral.
Definition: laplace_2d_singular_double_integrals.hpp:82
NiHu::field_base
CRTP base class of all fields.
Definition: field.hpp:111
NiHu::laplace_2d_DLP_galerkin_edge_constant_line::eval
static double eval(line_1_elem const &elem1, line_1_elem const &elem2)
Evaluate the integral.
Definition: laplace_2d_singular_double_integrals.hpp:534
NiHu::surface_element
class describing a surface element that provides a normal vector
Definition: element.hpp:451
NiHu::laplace_2d_HSP_galerkin_edge_general::eval
static result_t eval(test_elem_t const &test_elem, trial_elem_t const &trial_elem)
Evaluate the integral.
Definition: laplace_2d_singular_double_integrals.hpp:860
NiHu::laplace_2d_DLPt_galerkin_face_general::eval
static result_t eval(elem_t const &elem)
Evaluate the integral.
Definition: laplace_2d_singular_double_integrals.hpp:609
NiHu::singular_integral_shortcut< laplace_2d_SLP_kernel, TestField, TrialField, match::match_1d_type, typename std::enable_if< std::is_same< typename get_formalism< TestField, TrialField >::type, formalism::general >::value &&!(is_linear_line< TrialField >::value &&is_linear_line< TestField >::value) &&!(is_constant_line< TrialField >::value &&is_constant_line< TestField >::value) >::type >::eval
static result_t & eval(result_t &result, kernel_base< laplace_2d_SLP_kernel > const &, field_base< TestField > const &, field_base< TrialField > const &trial_field, element_match const &)
evaluate singular integral
Definition: laplace_2d_singular_double_integrals.hpp:1063
NiHu::singular_integral_shortcut< laplace_2d_DLP_kernel, TestField, TrialField, match::match_1d_type, typename std::enable_if< std::is_same< typename get_formalism< TestField, TrialField >::type, formalism::general >::value &&!std::is_same< typename TrialField::elem_t::lset_t, line_1_shape_set >::value >::type >::eval
static result_t & eval(result_t &result, kernel_base< laplace_2d_DLP_kernel > const &, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field, element_match const &)
evaluate singular integral
Definition: laplace_2d_singular_double_integrals.hpp:1170
NiHu::log_quad_store::quadrature
static const log_gaussian_quadrature quadrature
definition of the statically stored quadrature member
Definition: quadrature_store_helper.hpp:26
NiHu::volume_element::domain_t
typename base_t::domain_t domain_t
the domain type
Definition: element.hpp:637
NiHu::normal_derivative_kernel
Normal derivative of a distance dependent kernel.
Definition: normal_derivative_kernel.hpp:26
lib_element.hpp
NiHu::singular_integral_shortcut< laplace_2d_HSP_kernel, TestField, TrialField, match::match_0d_type, typename std::enable_if< std::is_same< typename get_formalism< TestField, TrialField >::type, formalism::general >::value >::type >::eval
static result_t & eval(result_t &result, kernel_base< laplace_2d_HSP_kernel > const &, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field, element_match const &)
evaluate singular integral
Definition: laplace_2d_singular_double_integrals.hpp:1327
NiHu::singular_integral_shortcut< laplace_2d_SLP_kernel, TestField, TrialField, match::match_1d_type, typename std::enable_if< std::is_same< typename get_formalism< TestField, TrialField >::type, formalism::general >::value &&is_linear_line< TrialField >::value &&is_linear_line< TestField >::value >::type >::eval
static result_t & eval(result_t &result, kernel_base< laplace_2d_SLP_kernel > const &, field_base< TestField > const &, field_base< TrialField > const &trial_field, element_match const &)
evaluate singular integral
Definition: laplace_2d_singular_double_integrals.hpp:1027
NiHu::laplace_2d_HSP_galerkin_face_constant_line
Face match double integral of the HSP kernel over a constant line.
Definition: laplace_2d_singular_double_integrals.hpp:794
NiHu::laplace_2d_DLP_galerkin_edge_constant_line
Edge match double integral of the DLP kernel over constant lines.
Definition: laplace_2d_singular_double_integrals.hpp:517
NiHu::laplace_2d_SLP_galerkin_face_linear_line
Face match double integral of the SLP kernel over a linear line.
Definition: laplace_2d_singular_double_integrals.hpp:197
NiHu::laplace_2d_HSP_galerkin_edge_general
Edge match double integral of the HSP kernel.
Definition: laplace_2d_singular_double_integrals.hpp:829
NiHu::singular_integral_shortcut< laplace_2d_SLP_kernel, TestField, TrialField, match::match_1d_type, typename std::enable_if< std::is_same< typename get_formalism< TestField, TrialField >::type, formalism::general >::value &&is_constant_line< TestField >::value &&is_constant_line< TrialField >::value >::type >::eval
static result_t & eval(result_t &result, kernel_base< laplace_2d_SLP_kernel > const &, field_base< TestField > const &, field_base< TrialField > const &trial_field, element_match const &)
evaluate singular integral
Definition: laplace_2d_singular_double_integrals.hpp:993
NiHu::regular_quad_store::quadrature
static const gaussian_quadrature< domain_t > quadrature
the stored static quadrature member
Definition: quadrature_store_helper.hpp:16
NiHu::singular_integral_shortcut< laplace_2d_DLPt_kernel, TestField, TrialField, match::match_1d_type, typename std::enable_if< std::is_same< typename get_formalism< TestField, TrialField >::type, formalism::general >::value &&!std::is_same< typename TrialField::elem_t::lset_t, line_1_shape_set >::value >::type >::eval
static result_t & eval(result_t &result, kernel_base< laplace_2d_DLPt_kernel > const &, field_base< TestField > const &test_field, field_base< TrialField > const &, element_match const &)
evaluate singular integral
Definition: laplace_2d_singular_double_integrals.hpp:1238