NiHu  2.0
laplace_3d_nearly_singular_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-2019 Peter Fiala <fiala@hit.bme.hu>
4 // Copyright (C) 2012-2019 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 
41 #ifndef NIHU_LAPLACE_3D_NEARLY_SINGULAR_INTEGRALS_HPP_INCLUDED
42 #define NIHU_LAPLACE_3D_NEARLY_SINGULAR_INTEGRALS_HPP_INCLUDED
43 
44 #include <boost/math/constants/constants.hpp>
45 
46 #include "../core/formalism.hpp"
47 #include "../core/nearly_singular_integral.hpp"
48 #include "../core/nearly_singular_planar_constant_collocation_shortcut.hpp"
49 #include "../util/math_functions.hpp"
50 #include "field_type_helpers.hpp"
51 #include "laplace_kernel.hpp"
52 #include "nearly_singular_collocational.hpp"
53 #include "plane_element_helper.hpp"
54 #include "quadrature_store_helper.hpp"
55 
56 namespace NiHu
57 {
58 
63 {
66  enum { quadrature_order = 10 };
68 
69 public:
70  template <class elem_t>
71  static double eval(elem_t const &elem, typename elem_t::x_t const &x0_in)
72  {
73  using namespace boost::math::double_constants;
74 
75  typedef typename elem_t::x_t x_t;
76 
77  enum { N = elem_t::domain_t::num_corners };
78 
79  Eigen::Matrix<double, 3, N> corners;
80  for (unsigned i = 0; i < N; ++i)
81  corners.col(i) = elem.get_x(elem_t::domain_t::get_corner(i));
82 
83  auto T = plane_elem_transform(corners.col(1) - corners.col(0), corners.col(2) - corners.col(0));
84  auto Tdec = T.partialPivLu();
85  corners = Tdec.solve(corners);
86  x_t x0 = Tdec.solve(x0_in);
87 
88  double theta_lim[N];
89  double ref_distance[N];
90  double theta0[N];
91 
92  plane_elem_helper_mid(corners, x0, ref_distance, theta_lim, theta0);
93 
94 
95  double z = x0(2) - corners(2, 0);
96 
97  double result = 0.0;
98 
99  // loop over triange sides
100  for (unsigned i = 0; i < N; ++i)
101  {
102  double th1 = theta_lim[i];
103  double th2 = theta_lim[(i + 1) % N];
104 
105  // angle check
106  if (std::abs(th2 - th1) > pi)
107  {
108  if (th2 > th1)
109  th1 += two_pi;
110  else th2 += two_pi;
111  }
112 
113  double jac = (th2 - th1) / 2.;
114  // this means that the singular point lies on the edge
115  if (std::abs(jac) < 1e-10)
116  continue;
117 
118  // loop over quadrature points
119  for (auto it = quadrature_t::quadrature.begin();
120  it != quadrature_t::quadrature.end(); ++it)
121  {
122  double xi = it->get_xi()(0);
123  double w = it->get_w();
124 
125  // apply shape function to get angle
126  double theta = th1 * (1. - xi) / 2. + th2 * (1. + xi) / 2.;
127 
128  double R = ref_distance[i] / std::cos(theta - theta0[i]);
129  double r = std::sqrt(R*R + z * z);
130 
131  // although z is constant, it can not be extracted from the
132  // numerical integration, as int dtheta is 2pi or 0
133  result += (r - std::abs(z)) * jac * w;
134  }
135  }
136 
137  return result / (4. * pi);
138  }
139 };
140 
141 
143 {
145  enum { quadrature_order = 10 };
147 
148 public:
149  template <class elem_t>
150  static double eval(elem_t const &elem, typename elem_t::x_t const &x0_in)
151  {
152  using namespace boost::math::double_constants;
153 
154  typedef typename elem_t::x_t x_t;
155 
156  enum { N = elem_t::domain_t::num_corners };
157 
158  Eigen::Matrix<double, 3, N> corners;
159  for (unsigned i = 0; i < N; ++i)
160  corners.col(i) = elem.get_x(elem_t::domain_t::get_corner(i));
161 
162  auto T = plane_elem_transform(corners.col(1) - corners.col(0), corners.col(2) - corners.col(0));
163  auto Tdec = T.partialPivLu();
164  corners = Tdec.solve(corners);
165  x_t x0 = Tdec.solve(x0_in);
166  double z = x0(2) - corners(2, 0);
167 
168  double theta_lim[N];
169  double ref_distance[N];
170  double theta0[N];
171 
172  plane_elem_helper_mid(corners, x0, ref_distance, theta_lim, theta0);
173 
174  double result = 0.0;
175 
176  // loop over triange sides
177  for (unsigned i = 0; i < N; ++i)
178  {
179  double th1 = theta_lim[i];
180  double th2 = theta_lim[(i + 1) % N];
181 
182  // angle check
183  if (std::abs(th2 - th1) > pi)
184  {
185  if (th2 > th1) th1 += two_pi;
186  else th2 += two_pi;
187  }
188 
189  double jac = (th2 - th1) / 2.;
190  // this means that the singular point lies on the edge
191  if (std::abs(jac) < 1e-10)
192  continue;
193 
194  // loop over quadrature points
195  for (auto it = quadrature_t::quadrature.begin();
196  it != quadrature_t::quadrature.end(); ++it)
197  {
198  double xi = it->get_xi()(0);
199  double w = it->get_w();
200 
201  // apply shape function to get angle
202  double theta = th1 * (1. - xi) / 2. + th2 * (1. + xi) / 2.;
203 
204  double R = ref_distance[i] / std::cos(theta - theta0[i]);
205  double r = std::sqrt(R*R + z * z);
206 
207  // although z is constant, it can not be extracted from the
208  // numerical integration, as int dtheta is 2pi or 0
209  result += (1.0 - std::abs(z) / r) * jac * w;
210  }
211  }
212 
213  return sgn(z) * result / (4. * pi);
214  }
215 };
216 
217 
220 {
222  enum { quadrature_order = 10 };
224 
225 public:
226  template <class elem_t>
227  static double eval(
228  elem_t const &elem,
229  typename elem_t::x_t const &x0_in,
230  typename elem_t::x_t const &nx_in)
231  {
232  using namespace boost::math::double_constants;
233 
234  typedef typename elem_t::x_t x_t;
235 
236  enum { N = elem_t::domain_t::num_corners };
237 
238  Eigen::Matrix<double, 3, N> corners;
239  for (unsigned i = 0; i < N; ++i)
240  corners.col(i) = elem.get_x(elem_t::domain_t::get_corner(i));
241 
242  auto T = plane_elem_transform(corners.col(1) - corners.col(0),
243  corners.col(2) - corners.col(0));
244  auto Tdec = T.partialPivLu();
245  corners = Tdec.solve(corners);
246  x_t x0 = Tdec.solve(x0_in);
247  x_t nx = Tdec.solve(nx_in);
248 
249  double z = x0(2) - corners(2, 0);
250 
251  double theta_lim[N];
252  double ref_distance[N];
253  double theta0[N];
254 
255  plane_elem_helper_mid(corners, x0, ref_distance, theta_lim, theta0);
256 
257  double result = 0.0;
258 
259  // loop over triange sides
260  for (unsigned i = 0; i < N; ++i)
261  {
262  double th1 = theta_lim[i];
263  double th2 = theta_lim[(i + 1) % N];
264 
265  // angle check
266  if (std::abs(th2 - th1) > pi)
267  {
268  if (th2 > th1)
269  th1 += two_pi;
270  else th2 += two_pi;
271  }
272 
273  double jac = (th2 - th1) / 2.;
274 
275  // this means that the singular point lies on the edge
276  if (std::abs(jac) < 1e-10)
277  continue;
278 
279  // loop over quadrature points
280  for (auto it = quadrature_t::quadrature.begin();
281  it != quadrature_t::quadrature.end(); ++it)
282  {
283  double xi = it->get_xi()(0);
284  double w = it->get_w();
285 
286  // apply shape function to get angle
287  double theta = th1 * (1. - xi) / 2. + th2 * (1. + xi) / 2.;
288 
289  double R = ref_distance[i] / std::cos(theta - theta0[i]);
290  double r = std::sqrt(R*R + z * z);
291 
292  x_t rvec;
293  rvec(0) = R * std::cos(theta);
294  rvec(1) = R * std::sin(theta);
295  rvec(2) = -z;
296 
297  // although z is constant, it can not be extracted from the
298  // numerical integration, as int dtheta is 2pi or 0
299  result += (
300  -nx.dot(rvec) / r +
301  (nx(0) * std::cos(theta) + nx(1) * std::sin(theta)) * std::log((R + r))
302  - nx(2) * sgn(z)
303  ) * jac * w;
304  }
305  }
306 
307  return result / (4.*pi);
308  }
309 };
310 
311 
313 {
315  enum { quadrature_order = 40 };
317 
318 public:
319  template <class elem_t>
320  static double eval(
321  elem_t const &elem,
322  typename elem_t::x_t const &x0_in,
323  typename elem_t::x_t const &nx_in)
324  {
325  using namespace boost::math::double_constants;
326 
327  typedef typename elem_t::x_t x_t;
328 
329  enum { N = elem_t::domain_t::num_corners };
330 
331  Eigen::Matrix<double, 3, N> corners;
332  for (unsigned i = 0; i < N; ++i)
333  corners.col(i) = elem.get_x(elem_t::domain_t::get_corner(i));
334 
335  auto T = plane_elem_transform(corners.col(1) - corners.col(0), corners.col(2) - corners.col(0));
336  auto Tdec = T.partialPivLu();
337  corners = Tdec.solve(corners);
338  x_t x0 = Tdec.solve(x0_in);
339  x_t nx = Tdec.solve(nx_in);
340 
341  double theta_lim[N];
342  double ref_distance[N];
343  double theta0[N];
344 
345 
346  plane_elem_helper_mid(corners, x0, ref_distance, theta_lim, theta0);
347 
348  double result = 0.0;
349  double z = x0(2) - corners(2, 0);
350 
351  // loop over triangle sides
352  for (unsigned i = 0; i < N; ++i)
353  {
354  double th1 = theta_lim[i];
355  double th2 = theta_lim[(i + 1) % N];
356 
357  // angle check
358  if (std::abs(th2 - th1) > pi)
359  {
360  if (th2 > th1)
361  th1 += two_pi;
362  else th2 += two_pi;
363  }
364 
365  double jac = (th2 - th1) / 2.;
366 
367  // this means that the singular point lies on the edge
368  if (std::abs(jac) < 1e-10)
369  continue;
370 
371  // loop over quadrature points
372  for (auto it = quadrature_t::quadrature.begin();
373  it != quadrature_t::quadrature.end(); ++it)
374  {
375  double xi = it->get_xi()(0);
376  double w = it->get_w();
377 
378  // apply shape function to get angle
379  double theta = th1 * (1. - xi) / 2. + th2 * (1. + xi) / 2.;
380 
381  double R = ref_distance[i] / std::cos(theta - theta0[i]);
382  double r = std::sqrt(R*R + z * z);
383 
384  x_t rvec;
385  rvec(0) = R * std::cos(theta);
386  rvec(1) = R * std::sin(theta);
387  rvec(2) = -z;
388 
389  double rdnx = -rvec.dot(nx) / r;
390  double integrand;
391 
393  if (std::abs(z) > 1e-12)
394  integrand = -R * R / (r*r) / z * rdnx;
395  else
396  integrand = -nx(2) / R;
397 
398  result += integrand * jac * w;
399  }
400  }
401 
402  return result / (4.*pi);
403  }
404 };
405 
414 template <class TestField, class TrialField>
416  laplace_3d_SLP_kernel, TestField, TrialField,
417  typename std::enable_if<
418  is_collocational<TestField, TrialField>::value &&
419  is_constant_tria<TrialField>::value
420  >::type
421 >
422 {
423 public:
428  static bool needed(
430  field_base<TestField> const &test_field,
431  field_base<TrialField> const &trial_field
432  )
433  {
434  double const limit = 1.5;
435 
436  // distance between element centres
437  double d = (test_field.get_elem().get_center() - trial_field.get_elem().get_center()).norm();
438  double R = trial_field.get_elem().get_linear_size_estimate();
439  return d / R < limit;
440  }
441 
442  template <class result_t>
443  static result_t &eval(
444  result_t &result,
446  field_base<TestField> const &test_field,
447  field_base<TrialField> const &trial_field
448  )
449  {
450  result(0) = laplace_3d_SLP_collocation_constant_plane_nearly_singular::eval(
451  trial_field.get_elem(),
452  test_field.get_elem().get_center());
453  return result;
454  }
455 };
456 
457 template <class TestField, class TrialField>
459  laplace_3d_SLP_kernel, TestField, TrialField,
460  typename std::enable_if<
461  is_collocational<TestField, TrialField>::value
462  &&
463  !is_constant_tria<TrialField>::value
464  >::type
465 >
466 {
468  typedef typename kernel_t::test_input_t test_input_t;
469  typedef TestField test_field_t;
470  typedef typename test_field_t::nset_t test_nset_t;
471  static unsigned const num_test_nodes = test_nset_t::num_nodes;
472 
473 public:
474  static bool needed(
475  kernel_base<kernel_t> const &kernel,
476  field_base<TestField> const &test_field,
477  field_base<TrialField> const &trial_field
478  )
479  {
480  double const limit = 1.5;
481 
482  // distance between element centres
483  double d = (test_field.get_elem().get_center() - trial_field.get_elem().get_center()).norm();
484  double R = trial_field.get_elem().get_linear_size_estimate();
485  return d / R < limit;
486  }
487 
488  template <class result_t>
489  static result_t &eval(
490  result_t &result,
491  kernel_base<kernel_t> const &kernel,
492  field_base<TestField> const &test_field,
493  field_base<TrialField> const &trial_field
494  )
495  {
497  nsc_t nsc(trial_field, kernel);
498 
499  for (unsigned i = 0; i < num_test_nodes; ++i)
500  {
501  test_input_t tsti(test_field.get_elem(), test_nset_t::corner_at(i));
502  nsc.integrate(result.row(i), tsti);
503  }
504 
505  return result;
506  }
507 };
508 
509 
510 
511 
512 template <class TestField, class TrialField>
514  laplace_3d_DLP_kernel, TestField, TrialField,
515  typename std::enable_if<
516  is_collocational<TestField, TrialField>::value
517  &&
518  is_constant_tria<TrialField>::value
519  >::type
520 >
521 {
522 public:
523  static bool needed(
525  field_base<TestField> const &test_field,
526  field_base<TrialField> const &trial_field
527  )
528  {
529  double const limit = 1.5;
530 
531  // distance between element centres
532  double d = (test_field.get_elem().get_center() - trial_field.get_elem().get_center()).norm();
533  double R = trial_field.get_elem().get_linear_size_estimate();
534  return d / R < limit;
535  }
536 
537  template <class result_t>
538  static result_t &eval(
539  result_t &result,
541  field_base<TestField> const &test_field,
542  field_base<TrialField> const &trial_field
543  )
544  {
545  result(0) = laplace_3d_DLP_collocation_constant_plane_nearly_singular::eval(
546  trial_field.get_elem(),
547  test_field.get_elem().get_center());
548  return result;
549  }
550 };
551 
552 
553 template <class TestField, class TrialField>
555  laplace_3d_DLP_kernel, TestField, TrialField,
556  typename std::enable_if<
557  is_collocational<TestField, TrialField>::value
558  &&
559  !is_constant_tria<TrialField>::value
560  >::type
561 >
562 {
563 public:
565  typedef typename kernel_t::test_input_t test_input_t;
566  typedef TestField test_field_t;
567  typedef typename test_field_t::nset_t test_nset_t;
568  static unsigned const num_test_nodes = test_nset_t::num_nodes;
569 
570  static bool needed(
571  kernel_base<kernel_t> const &kernel,
572  field_base<TestField> const &test_field,
573  field_base<TrialField> const &trial_field
574  )
575  {
576  double const limit = 1.5;
577 
578  // distance between element centres
579  double d = (test_field.get_elem().get_center() - trial_field.get_elem().get_center()).norm();
580  double R = trial_field.get_elem().get_linear_size_estimate();
581  return d / R < limit;
582  }
583 
584  template <class result_t>
585  static result_t &eval(
586  result_t &result,
587  kernel_base<kernel_t> const &kernel,
588  field_base<TestField> const &test_field,
589  field_base<TrialField> const &trial_field
590  )
591  {
593  nsc_t nsc(trial_field, kernel);
594 
595  for (unsigned i = 0; i < num_test_nodes; ++i)
596  {
597  test_input_t tsti(test_field.get_elem(), test_nset_t::corner_at(i));
598  nsc.integrate(result.row(i), tsti);
599  }
600 
601  return result;
602  }
603 };
604 
605 
606 template <class TestField, class TrialField>
608  laplace_3d_DLPt_kernel, TestField, TrialField,
609  typename std::enable_if<
610  is_collocational<TestField, TrialField>::value
611  &&
612  is_constant_tria<TrialField>::value
613  >::type
614 >
615 {
616 public:
617  static bool needed(
619  field_base<TestField> const &test_field,
620  field_base<TrialField> const &trial_field
621  )
622  {
623  double const limit = 1.5;
624 
625  // distance between element centres
626  double d = (test_field.get_elem().get_center() - trial_field.get_elem().get_center()).norm();
627  double R = trial_field.get_elem().get_linear_size_estimate();
628  return d / R < limit;
629  }
630 
631  template <class result_t>
632  static result_t &eval(
633  result_t &result,
635  field_base<TestField> const &test_field,
636  field_base<TrialField> const &trial_field
637  )
638  {
639  result(0) = laplace_3d_DLPt_collocation_constant_plane_nearly_singular::eval(
640  trial_field.get_elem(),
641  test_field.get_elem().get_center(),
642  test_field.get_elem().get_normal().normalized());
643  return result;
644  }
645 };
646 
647 
648 template <class TestField, class TrialField>
650  laplace_3d_DLPt_kernel, TestField, TrialField,
651  typename std::enable_if<
652  is_collocational<TestField, TrialField>::value
653  &&
654  !is_constant_tria<TrialField>::value
655  >::type
656 >
657 {
659  typedef typename kernel_t::test_input_t test_input_t;
660  typedef TestField test_field_t;
661  typedef typename test_field_t::nset_t test_nset_t;
662  static unsigned const num_test_nodes = test_nset_t::num_nodes;
663 
664 public:
665  static bool needed(
666  kernel_base<kernel_t> const &kernel,
667  field_base<TestField> const &test_field,
668  field_base<TrialField> const &trial_field
669  )
670  {
671  double const limit = 1.5;
672 
673  // distance between element centres
674  double d = (test_field.get_elem().get_center() - trial_field.get_elem().get_center()).norm();
675  double R = trial_field.get_elem().get_linear_size_estimate();
676  return d / R < limit;
677  }
678 
679  template <class result_t>
680  static result_t &eval(
681  result_t &result,
682  kernel_base<kernel_t> const &kernel,
683  field_base<TestField> const &test_field,
684  field_base<TrialField> const &trial_field
685  )
686  {
688  nsc_t nsc(trial_field, kernel);
689 
690  for (unsigned i = 0; i < num_test_nodes; ++i)
691  {
692  test_input_t tsti(test_field.get_elem(), test_nset_t::corner_at(i));
693  nsc.integrate(result.row(i), tsti);
694  }
695 
696  return result;
697  }
698 };
699 
700 
701 
702 template <class TestField, class TrialField>
704  laplace_3d_HSP_kernel, TestField, TrialField,
705  typename std::enable_if<
706  is_collocational<TestField, TrialField>::value
707  &&
708  is_constant_tria<TrialField>::value
709  >::type
710 >
711 {
712 public:
713  static bool needed(
715  field_base<TestField> const &test_field,
716  field_base<TrialField> const &trial_field
717  )
718  {
719  double const limit = 1.5;
720 
721  // distance between element centres
722  double d = (test_field.get_elem().get_center() - trial_field.get_elem().get_center()).norm();
723  double R = trial_field.get_elem().get_linear_size_estimate();
724  return d / R < limit;
725  }
726 
727  template <class result_t>
728  static result_t &eval(
729  result_t &result,
731  field_base<TestField> const &test_field,
732  field_base<TrialField> const &trial_field
733  )
734  {
736  trial_field.get_elem(),
737  test_field.get_elem().get_center(),
738  test_field.get_elem().get_normal().normalized());
739  return result;
740  }
741 };
742 
743 
744 template <class TestField, class TrialField>
746  laplace_3d_HSP_kernel, TestField, TrialField,
747  typename std::enable_if<
748  is_collocational<TestField, TrialField>::value
749  &&
750  !is_constant_tria<TrialField>::value
751  >::type
752 >
753 {
755  typedef typename kernel_t::test_input_t test_input_t;
756  typedef TestField test_field_t;
757  typedef typename test_field_t::nset_t test_nset_t;
758  static unsigned const num_test_nodes = test_nset_t::num_nodes;
759 
760 public:
761  static bool needed(
762  kernel_base<kernel_t> const &kernel,
763  field_base<TestField> const &test_field,
764  field_base<TrialField> const &trial_field
765  )
766  {
767  double const limit = 1.5;
768 
769  // distance between element centres
770  double d = (test_field.get_elem().get_center() - trial_field.get_elem().get_center()).norm();
771  double R = trial_field.get_elem().get_linear_size_estimate();
772  return d / R < limit;
773  }
774 
775  template <class result_t>
776  static result_t &eval(
777  result_t &result,
778  kernel_base<kernel_t> const &kernel,
779  field_base<TestField> const &test_field,
780  field_base<TrialField> const &trial_field
781  )
782  {
784  nsc_t nsc(trial_field, kernel);
785 
786  for (unsigned i = 0; i < num_test_nodes; ++i)
787  {
788  test_input_t tsti(test_field.get_elem(), test_nset_t::corner_at(i));
789  nsc.integrate(result.row(i), tsti);
790  }
791 
792  return result;
793  }
794 };
795 
796 
797 
798 
799 template <class Elem>
801 {
802 public:
803  typedef Elem elem_t;
805  typedef kernel_t::result_t res_t;
806 
807  static res_t eval(
808  kernel_t::test_input_t const &test_input,
809  elem_t const &elem,
810  kernel_base<kernel_t> const &)
811  {
812  return laplace_3d_SLP_collocation_constant_plane_nearly_singular::eval(
813  elem, test_input.get_x());
814  }
815 };
816 
817 
818 template <class Elem>
820 {
821 public:
822  typedef Elem elem_t;
824  typedef kernel_t::result_t res_t;
825 
826  static res_t eval(
827  kernel_t::test_input_t const &test_input,
828  elem_t const &elem,
829  kernel_base<kernel_t> const &)
830  {
831  return laplace_3d_DLP_collocation_constant_plane_nearly_singular::eval(
832  elem, test_input.get_x());
833  }
834 };
835 
836 
837 template <class Elem>
839 {
840 public:
841  typedef Elem elem_t;
843  typedef kernel_t::result_t res_t;
844 
845  static res_t eval(
846  kernel_t::test_input_t const &test_input,
847  elem_t const &elem,
848  kernel_base<kernel_t> const &)
849  {
850  return laplace_3d_DLPt_collocation_constant_plane_nearly_singular::eval(
851  elem, test_input.get_x(), test_input.get_unit_normal());
852  }
853 };
854 
855 
856 template <class Elem>
858 {
859 public:
860  typedef Elem elem_t;
862  typedef kernel_t::result_t res_t;
863 
864  static res_t eval(
865  kernel_t::test_input_t const &test_input,
866  elem_t const &elem,
867  kernel_base<kernel_t> const &)
868  {
870  elem, test_input.get_x(), test_input.get_unit_normal());
871  }
872 };
873 
874 } // end of namespace NiHu
875 
876 #endif /* NIHU_LAPLACE_3D_NEARLY_SINGULAR_INTEGRALS_HPP_INCLUDED */
NiHu::laplace_3d_SLP_collocation_constant_plane_nearly_singular
Nearly singular collocational integral of the 3D Laplace SLP kernel over planes.
Definition: laplace_3d_nearly_singular_integrals.hpp:62
NiHu::nearly_singular_collocational
Definition: nearly_singular_collocational.hpp:22
NiHu::volume_element
class describing a volume element that has no normal vector
Definition: element.hpp:455
NiHu::plane_elem_transform
Eigen::Matrix< double, 3, 3 > plane_elem_transform(Eigen::DenseBase< V > const &v1_in, Eigen::DenseBase< V > const &v2_in)
Transformation matrix to get planar element parallel to the x-y plane.
Definition: plane_element_helper.hpp:111
laplace_kernel.hpp
implementation of kernels of the Laplace equation
NiHu::laplace_3d_HSP_collocation_constant_plane_nearly_singular::eval
static double eval(elem_t const &elem, typename elem_t::x_t const &x0_in, typename elem_t::x_t const &nx_in)
Definition: laplace_3d_nearly_singular_integrals.hpp:320
plane_element_helper.hpp
helper functions to compute analytical integrals over plane elements
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::laplace_3d_DLPt_collocation_constant_plane_nearly_singular
collocational near.sing. integral of the laplace 3D DLPt kernel over constant plane elements
Definition: laplace_3d_nearly_singular_integrals.hpp:219
NiHu::regular_quad_store
store-wrapper of a statically stored quadrature
Definition: quadrature_store_helper.hpp:13
NiHu::nearly_singular_integral< laplace_3d_SLP_kernel, TestField, TrialField, typename std::enable_if< is_collocational< TestField, TrialField >::value &&is_constant_tria< TrialField >::value >::type >::needed
static bool needed(kernel_base< laplace_3d_SLP_kernel > const &kernel, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field)
Check if singular evaluation is needed.
Definition: laplace_3d_nearly_singular_integrals.hpp:428
NiHu::laplace_3d_HSP_collocation_constant_plane_nearly_singular
Definition: laplace_3d_nearly_singular_integrals.hpp:312
NiHu::line_domain
a 1D line domain
Definition: lib_domain.hpp:53
NiHu::kernel_base
CRTP base class of all BEM kernels.
Definition: kernel.hpp:133
NiHu::laplace_3d_DLP_collocation_constant_plane_nearly_singular
Definition: laplace_3d_nearly_singular_integrals.hpp:142
NiHu::nearly_singular_integral
Definition: nearly_singular_integral.hpp:27
NiHu::nearly_singular_planar_constant_collocation_shortcut
Definition: nearly_singular_planar_constant_collocation_shortcut.hpp:8
NiHu::field_base::get_elem
const elem_t & get_elem() const
return underlying element
Definition: field.hpp:149
NiHu::field_base
CRTP base class of all fields.
Definition: field.hpp:111
NiHu::sgn
int sgn(T val)
signum function
Definition: math_functions.hpp:43
NiHu::normal_derivative_kernel
Normal derivative of a distance dependent kernel.
Definition: normal_derivative_kernel.hpp:26
NiHu::regular_quad_store::quadrature
static const gaussian_quadrature< domain_t > quadrature
the stored static quadrature member
Definition: quadrature_store_helper.hpp:16