NiHu  2.0
double_integral.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 
25 #ifndef NIHU_DOUBLE_INTEGRAL_HPP_INCLUDED
26 #define NIHU_DOUBLE_INTEGRAL_HPP_INCLUDED
27 
28 #include "../util/matrix_traits.hpp"
29 #include "../util/product_type.hpp"
30 #include "../util/plain_type.hpp"
31 #include "../util/block_product.hpp"
32 #include "../library/location_normal.hpp"
33 #include "../library/weighted_input.hpp"
34 #include "../tmp/control.hpp"
35 #include "../util/store_pattern.hpp"
36 #include "complexity_estimator.hpp"
37 #include "element_match.hpp"
39 #include "formalism.hpp"
40 #include "global_definitions.hpp"
41 #include "kernel.hpp"
42 #include "match_types.hpp"
44 #include "singular_accelerator.hpp"
45 #include "singular_integral_shortcut.hpp"
46 
47 
48 namespace NiHu
49 {
50 
51 
52 /*
53 template <class Elem>
54 struct weighted_brick;
55 
56 template <class LSet, class Scalar>
57 struct weighted_brick<volume_element<LSet, Scalar> >
58 {
59  typedef volume_jacobian<typename volume_element<LSet, Scalar>::space_t> type;
60 };
61 
62 template <class LSet, class Scalar>
63 struct weighted_brick<surface_element<LSet, Scalar> >
64 {
65  typedef normal_jacobian<typename surface_element<LSet, Scalar>::space_t> type;
66 };
67 */
68 
69 
71 template <class SingularityDimension>
73 {
74  struct type
75  {
76  template <class result_t, class Kernel, class TestField, class TrialField>
77  bool operator()(
78  result_t &result,
79  kernel_base<Kernel> const &kernel,
80  field_base<TestField> const &test_field,
81  field_base<TrialField> const &trial_field,
82  element_match const &mtch)
83  {
84  // if the parameter singularity is valid, evaluate shortcut
85  if (mtch.get_match_dimension() == SingularityDimension::value)
86  {
87 #if NIHU_DEBUGGING
88  static bool printed = false;
89  if (!printed)
90  {
91  std::cout <<
92  "Singular shortcut switch called for mtch dim: " <<
93  mtch.get_match_dimension() <<
94  ", sing val: " << SingularityDimension::value << std::endl;
95  printed = true;
96  }
97 #endif
99  result, kernel, test_field, trial_field, mtch);
100  return true;
101  }
102 
103  return false;
104  }
105  };
106 };
107 
108 
109 
110 template <class Kernel, class TestField, class TrialField>
112 {
114  typedef typename block_product_result_type<
115  typename TestField::nset_t::shape_t,
116  typename Kernel::result_t,
117  typename TrialField::nset_t::shape_t
118  >::type result_t;
119 };
120 
121 
122 
129 template <
130  class Kernel, class TestField, class TrialField,
131  class Formalism = typename get_formalism<TestField, TrialField>::type
132 >
134 
135 
142 template <class Kernel, class TestField, class TrialField>
143 class double_integral<Kernel, TestField, TrialField, formalism::general>
144 {
146 
147 public:
148  typedef std::true_type WITH_SINGULARITY_CHECK;
149  typedef std::false_type WITHOUT_SINGULARITY_CHECK;
150 
152  typedef typename TestField::elem_t test_elem_t;
154  typedef typename TrialField::elem_t trial_elem_t;
163 
166 
168  typedef typename traits_t::result_t result_t;
169 
170 protected:
180  template <class dual_iterator_t>
182  result_t &result,
183  kernel_base<Kernel> const &kernel,
184  field_base<TestField> const &test_field,
185  field_base<TrialField> const &trial_field,
186  dual_iterator_t it,
187  dual_iterator_t end
188  )
189  {
190  for (; it != end; ++it)
191  {
192  w_test_input_t test_input(test_field.get_elem(), it.get_first()->get_xi());
193  w_trial_input_t trial_input(trial_field.get_elem(), it.get_second()->get_xi());
194 
195  result += block_product(
196  test_field.eval(it.get_first()->get_xi()) *
197  (test_input.get_jacobian() * it.get_first()->get_w()),
198  kernel(test_input, trial_input),
199  trial_field.eval(it.get_second()->get_xi()) *
200  (trial_input.get_jacobian() * it.get_second()->get_w())
201  );
202  }
203 
204  return result;
205  }
206 
207 public:
212  template <class singular_accelerator_t, class dummy>
213  struct eval_singular_on_accelerator
214  {
224  template <class singular_iterator_t>
225  static result_t &eval(
226  result_t &result,
227  kernel_base<Kernel> const &kernel,
228  field_base<TestField> const &test_field,
229  field_base<TrialField> const &trial_field,
230  singular_iterator_t begin,
231  singular_iterator_t end)
232  {
233  for (; begin != end; ++begin)
234  {
235  w_test_input_t test_input(test_field.get_elem(), begin.get_test_quadrature_elem().get_xi());
236  w_trial_input_t trial_input(trial_field.get_elem(), begin.get_trial_quadrature_elem().get_xi());
237 
238  result += block_product(
239  test_field.eval(begin.get_test_quadrature_elem().get_xi()) *
240  (test_input.get_jacobian() * begin.get_test_quadrature_elem().get_w()),
241  kernel(test_input, trial_input),
242  trial_field.eval(begin.get_trial_quadrature_elem().get_xi()) *
243  (trial_input.get_jacobian() * begin.get_trial_quadrature_elem().get_w())
244  );
245  }
246 
247  return result;
248  }
249  };
250 
254  template <class dummy>
255  struct eval_singular_on_accelerator<invalid_singular_accelerator, dummy>
256  {
260  template <class singular_iterator_t>
261  static result_t &eval(
262  result_t &result,
263  kernel_base<Kernel> const &,
264  field_base<TestField> const &,
265  field_base<TrialField> const &,
266  singular_iterator_t,
267  singular_iterator_t)
268  {
269  throw std::runtime_error("Invalid general singular quadrature");
270  return result;
271  }
272  };
273 
274 protected:
282  static result_t &eval(
283  WITHOUT_SINGULARITY_CHECK,
284  result_t &result,
285  kernel_base<Kernel> const &kernel,
286  field_base<TestField> const &test_field,
287  field_base<TrialField> const &trial_field)
288  {
289 #if NIHU_MEX_DEBUGGING
290  static bool printed = false;
291  if (!printed)
292  {
293  mexPrintf("double_integral::eval without singularity check called on elements %d <- %d\n",
294  test_field.get_dofs()(0), trial_field.get_dofs()(0));
295  printed = true;
296  }
297 #endif
298  // store type of the regular test quadratures
301  > > test_store_t;
302 
303  // store type of the regular trial quadratures
306  > > trial_store_t;
307 
308  // determine integration degree based on the complexity estimator
309  unsigned degree = complexity_estimator<
310  TestField, TrialField,
311  typename Kernel::estimator_t
312  >::eval(test_field, trial_field);
313 
314  auto acc(create_dual_field_type_accelerator(
315  test_store_t::get_data()[degree], trial_store_t::get_data()[degree], iteration::diadic()));
316 
317  return eval_on_accelerator(
318  result, kernel, test_field, trial_field, acc.begin(), acc.end());
319  }
320 
321 
329  static result_t &eval(
330  WITH_SINGULARITY_CHECK,
331  result_t &result,
332  kernel_base<Kernel> const &kernel,
333  field_base<TestField> const &test_field,
334  field_base<TrialField> const &trial_field)
335  {
336  // evaluate element match
337  auto mtch(element_match_eval(test_field, trial_field));
338 
339  // if no match simple regular integral is computed
340  if (mtch.get_match_dimension() == -1)
341  return eval(WITHOUT_SINGULARITY_CHECK(), result, kernel, test_field, trial_field);
342 
343  typedef typename match_type_vector<TestField, TrialField>::type possible_match_types;
344 
345  // traverse possible singular integral shortcuts with tmp::call_until
346  if (!tmp::call_until<
347  possible_match_types,
349  result_t &,
350  kernel_base<Kernel> const &,
351  field_base<TestField> const &,
352  field_base<TrialField> const &,
353  element_match const &
354  >(result, kernel, test_field, trial_field, mtch))
355  std::cerr << "UNHANDLED GALERKIN SINGULARITY TYPE: " << mtch.get_match_dimension() << std::endl;
356 
357  return result;
358  }
359 
360 public:
367  template <class OnSameMesh>
368  static result_t eval(
369  kernel_base<Kernel> const &kernel,
370  field_base<TestField> const &test_field,
371  field_base<TrialField> const &trial_field,
372  OnSameMesh)
373  {
374  static bool const sing_check_needed =
375  kernel_traits<Kernel>::is_singular && std::is_same<OnSameMesh, std::true_type>::value;
376 
377  result_t result;
378  result.setZero(); // clear result
379 
380  return eval(std::integral_constant<bool, sing_check_needed>(),
381  result, kernel, test_field, trial_field);
382  }
383 };
384 
385 
386 
387 
394 template <class Kernel, class TestField, class TrialField>
395 class double_integral<Kernel, TestField, TrialField, formalism::collocational>
396 {
397 
399 
400 public:
401  typedef std::true_type WITH_SINGULARITY_CHECK;
402  typedef std::false_type WITHOUT_SINGULARITY_CHECK;
403 
405  typedef typename TrialField::elem_t trial_elem_t;
412 
415 
418 
420  typedef typename TestField::nset_t test_nset_t;
422  typedef typename TrialField::nset_t trial_nset_t;
423 
425  typedef typename traits_t::result_t result_t;
426 
427  enum {
432  };
433 
434 protected:
445  template <class dual_iterator_t>
447  result_t &result,
448  kernel_base<Kernel> const &kernel,
449  field_base<TestField> const &test_field,
450  field_base<TrialField> const &trial_field,
451  dual_iterator_t first,
452  dual_iterator_t last)
453  {
454  for (; first != last; ++first)
455  {
456  test_input_t test_input(test_field.get_elem(), first.get_first()->get_xi());
457  w_trial_input_t trial_input(trial_field.get_elem(), first.get_second()->get_xi());
458 
459  /*
460  result += block_product(
461  first.get_first()->get_N() * (first.get_first()->get_w()),
462  kernel(test_input, trial_input),
463  first.get_second()->get_N() * (trial_input.get_jacobian() * first.get_second()->get_w())
464  );
465  */
466  result += block_product(
467  //test_field.eval(first.get_first()->get_xi()) * (first.get_first()->get_w()),
468  first.get_first()->get_N() * (first.get_first()->get_w()),
469  kernel(test_input, trial_input),
470  trial_field.eval(first.get_second()->get_xi()) * (trial_input.get_jacobian() * first.get_second()->get_w())
471  );
472 
473  }
474 
475  return result;
476  }
477 
478 public:
483  template <class singular_accelerator_t, class dummy>
484  struct eval_singular_on_accelerator
485  {
494  static result_t & eval(
495  result_t &result,
496  kernel_base<Kernel> const &kernel,
497  field_base<TestField> const &test_field,
498  field_base<TrialField> const &trial_field,
499  singular_accelerator_t const &sa)
500  {
501  for (unsigned idx = 0; idx < test_nset_t::num_nodes; ++idx)
502  {
503  test_input_t collocation_point(test_field.get_elem(), test_nset_t::corner_at(idx));
504 
505  for (auto const &q : sa.get_trial_quadrature(idx))
506  {
507  w_trial_input_t trial_input(trial_field.get_elem(), q.get_xi());
508 
509  result.template block<kernel_rows, kernel_cols*trial_nset_t::num_nodes>(idx*kernel_rows, 0)
511  kernel(collocation_point, trial_input),
512  trial_field.eval(q.get_xi()) * trial_input.get_jacobian() * q.get_w()
513  );
514  }
515  }
516 
517  return result;
518  }
519  };
520 
524  template <class dummy>
525  struct eval_singular_on_accelerator<invalid_singular_accelerator, dummy>
526  {
532  static result_t & eval(
533  result_t &result,
534  kernel_base<Kernel> const &,
535  field_base<TestField> const &,
536  field_base<TrialField> const &,
538  {
539  throw std::runtime_error("Invalid quadrature returned by eval_singular_on_accelerator");
540  return result;
541  }
542  };
543 
544 protected:
552  static result_t &eval(
553  WITHOUT_SINGULARITY_CHECK,
554  result_t &result,
555  kernel_base<Kernel> const &kernel,
556  field_base<TestField> const &test_field,
557  field_base<TrialField> const &trial_field)
558  {
559  // evaluate nearly with nearly singular shortcut if needed
561  kernel, test_field, trial_field))
563  result, kernel, test_field, trial_field);
564 
565  // evaluate regular integral
566  unsigned degree = complexity_estimator<
567  TestField, TrialField,
568  typename Kernel::estimator_t
569  >::eval(test_field, trial_field);
570 
571 #if NIHU_MEX_DEBUGGING
572  static bool printed = false;
573  if (!printed)
574  {
575  mexPrintf("double_integral::eval without singularity check called on elements %d <- %d\n",
576  test_field.get_dofs()(0), trial_field.get_dofs()(0));
577  mexPrintf("Regular integral with degree %d\n", degree);
578  printed = true;
579  }
580 #endif
581 
582  if (degree > GLOBAL_MAX_ORDER)
583  throw std::out_of_range("Too high quadrature degree selected for collocational integration");
584 
587  > > test_store_t;
588 
591  > > trial_store_t;
592 
593  auto acc(create_dual_field_type_accelerator(
594  test_store_t::get_data()[degree], trial_store_t::get_data()[degree], iteration::diadic()));
595 
596  return eval_on_accelerator(
597  result, kernel, test_field, trial_field, acc.begin(), acc.end());
598  }
599 
600 
608  static result_t &eval(
609  WITH_SINGULARITY_CHECK,
610  result_t &result,
611  kernel_base<Kernel> const &kernel,
612  field_base<TestField> const &test_field,
613  field_base<TrialField> const &trial_field)
614  {
615 
616  // perform singularity check and call regular integral if not singular
617  auto mtch(element_match_eval(test_field, trial_field));
618  if (mtch.get_match_dimension() == -1)
619  return eval(WITHOUT_SINGULARITY_CHECK(), result, kernel, test_field, trial_field);
620 
621 
622 #if NIHU_DEBUGGING
623  static bool printed = false;
624  if (!printed)
625  std::cout << "Now checking singular shortcuts" << std::endl;
626 #endif
627 
628  // call singular_shortcut_switch for each possible match type
629  typedef typename match_type_vector<TestField, TrialField>::type possible_match_types;
630  if (!tmp::call_until<
631  possible_match_types,
633  result_t &,
634  kernel_base<Kernel> const &,
635  field_base<TestField> const &,
636  field_base<TrialField> const &,
637  element_match const &
638  >(result, kernel, test_field, trial_field, mtch))
639  {
640  std::cerr << "UNHANDLED COLLOCATIONAL SINGULARITY TYPE: " << mtch.get_match_dimension() << std::endl;
641  }
642 
643 #if NIHU_DEBUGGING
644  if (!printed)
645  printed = true;
646 #endif
647 
648  return result;
649  }
650 
651 public:
659  template <class OnSameMesh>
660  static result_t eval(
661  kernel_base<Kernel> const &kernel,
662  field_base<TestField> const &test_field,
663  field_base<TrialField> const &trial_field,
664  OnSameMesh)
665  {
666  typedef typename TrialField::nset_t trial_nset_t;
667 
668  static unsigned const num_test_corners = shape_set_traits::num_nodes<typename TestField::nset_t>::value;
669 
670  static bool const sing_check_needed =
671  kernel_traits<Kernel>::is_singular && std::is_same<OnSameMesh, std::true_type>::value;
672 
673 #if NIHU_MEX_DEBUGGING
674  static bool printed = false;
675  if (!printed)
676  {
677  mexPrintf("double_integral<collocation>::eval called\nSingular kernel: %d\tSing needed: %d\n", kernel_traits<Kernel>::is_singular, sing_check_needed);
678  printed = true;
679  }
680 #endif
681 
682  result_t result = result_t::Zero();
683 
684  eval(
685  std::integral_constant<bool, sing_check_needed>(),
686  result, kernel, test_field, trial_field);
687 
688  // Weighting by corner angles
689  for (unsigned corner_idx = 0; corner_idx < num_test_corners; ++corner_idx)
690  {
691  double weight = test_field.get_corner_angle(corner_idx);
692  // Block for each corner in result
693  result.template block<kernel_rows, kernel_cols*trial_nset_t::num_nodes>(corner_idx*kernel_rows, 0) *= weight;
694  }
695 
696  return result;
697  }
698 };
699 
700 
708 template <class Kernel, class TestField, class TrialField, class SingularityDimension, class Enable>
710 {
711 public:
712  typedef void unspecialised;
713 
714 private:
715 
716  typedef typename get_formalism<TestField, TrialField>::type formalism_t;
717  typedef typename select_singular_accelerator<
718  Kernel, TestField, TrialField, SingularityDimension
719  >::type singular_accelerator_t;
722 
723  template <class result_t>
724  static result_t &eval_impl(
726  result_t &result,
727  kernel_base<Kernel> const &kernel,
728  field_base<TestField> const &test_field,
729  field_base<TrialField> const &trial_field,
730  element_match const &match)
731  {
732  return double_integral_t::template eval_singular_on_accelerator<singular_accelerator_t, void>::eval(
733  result, kernel, test_field, trial_field,
734  store_t::get_data().begin(match),
735  store_t::get_data().end(match));
736  }
737 
738  template <class result_t>
739  static result_t &eval_impl(
741  result_t &result,
742  kernel_base<Kernel> const &kernel,
743  field_base<TestField> const &test_field,
744  field_base<TrialField> const &trial_field,
745  element_match const &)
746  {
747 #if NIHU_DEBUGGING
748  static bool printed = false;
749  if (!printed) {
750  std::cout << "General version of singular_integral_shortcut called" << std::endl;
751  printed = true;
752  }
753 #endif
754 #if NIHU_MEX_DEBUGGING
755  {
756 
757  static bool printed = false;
758  if (!printed)
759  {
760  mexPrintf("General singular integral shortcut for collocation called\n");
761  printed = true;
762  }
763  }
764 #endif
765  return double_integral_t::template eval_singular_on_accelerator<singular_accelerator_t, void>::eval(
766  result, kernel, test_field, trial_field, store_t::get_data());
767  }
768 
769 public:
779  template <class result_t>
780  static result_t &eval(
781  result_t &result,
782  kernel_base<Kernel> const &kernel,
783  field_base<TestField> const &test_field,
784  field_base<TrialField> const &trial_field,
785  element_match const &match)
786  {
787 #if NIHU_MEX_DEBUGGING
788  static bool printed = false;
789  if (!printed)
790  {
791  mexPrintf("General singular integral shortcut called\n");
792  printed = true;
793  }
794 #endif
795  return eval_impl(formalism_t(), result, kernel, test_field, trial_field, match);
796  }
797 };
798 
799 }
800 
801 #endif /* NIHU_DOUBLE_INTEGRAL_HPP_INCLUDED */
NiHu::double_integral< Kernel, TestField, TrialField, formalism::general >::w_trial_input_t
weighted_input< trial_input_t, trial_elem_t >::type w_trial_input_t
weighted trial input type of kernel
Definition: double_integral.hpp:162
NiHu::element_match_eval
element_match element_match_eval(field_base< test_field_t > const &test_field, field_base< trial_field_t > const &trial_field)
function to determine the overlapping state of two elements
Definition: element_match.hpp:86
NiHu::double_integral< Kernel, TestField, TrialField, formalism::general >::quadrature_family_t
kernel_traits< Kernel >::quadrature_family_t quadrature_family_t
the quadrature family the kernel requires
Definition: double_integral.hpp:165
NiHu::store
Storage class with a static member.
Definition: store_pattern.hpp:34
NiHu::formalism::collocational
collocational case when the test field is Dirac
Definition: formalism.hpp:39
NiHu::double_integral
class evaluating double integrals of the weighted residual approach
Definition: double_integral.hpp:133
NiHu::select_singular_accelerator
select a singular accelerator for a kernel and test and trial fields
Definition: singular_accelerator.hpp:483
NiHu::match_type_vector
matafunction assigning a match type vector to two fields
Definition: match_types.hpp:50
NiHu::double_integral< Kernel, TestField, TrialField, formalism::collocational >::trial_input_t
kernel_traits< Kernel >::trial_input_t trial_input_t
trial input type of kernel
Definition: double_integral.hpp:409
singular_accelerator.hpp
implementation of class NiHu::singular_accelerator
NiHu::double_integral< Kernel, TestField, TrialField, formalism::general >::trial_elem_t
TrialField::elem_t trial_elem_t
the trial elem type
Definition: double_integral.hpp:154
kernel.hpp
implementation of class kernel and its traits
NiHu::kernel_traits::quadrature_family_t
kernel_traits_ns::quadrature_family< Derived >::type quadrature_family_t
the far field asymptotic behaviour of the kernel
Definition: kernel.hpp:84
formalism.hpp
return weak form formalism from the test and trial field types
element_match.hpp
determine element singularities
global_definitions.hpp
global constants governing some accuracy parameters
NiHu::double_integral_traits
Definition: double_integral.hpp:111
NiHu::store::get_data
static const C & get_data(void)
Return reference to stored data.
Definition: store_pattern.hpp:39
NiHu::double_integral_traits::result_t
block_product_result_type< typename TestField::nset_t::shape_t, typename Kernel::result_t, typename TrialField::nset_t::shape_t >::type result_t
result type of the weighted residual
Definition: double_integral.hpp:118
NiHu::double_integral< Kernel, TestField, TrialField, formalism::general >::eval
static result_t eval(kernel_base< Kernel > const &kernel, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field, OnSameMesh)
evaluate double integral on given fields
Definition: double_integral.hpp:368
NiHu::double_integral< Kernel, TestField, TrialField, formalism::collocational >::trial_nset_t
TrialField::nset_t trial_nset_t
N-set of the trial field.
Definition: double_integral.hpp:422
NiHu::iteration::diadic
inner and outer iterators (Descartes)
Definition: dual_range.hpp:34
NiHu::double_integral< Kernel, TestField, TrialField, formalism::collocational >::test_input_t
kernel_traits< Kernel >::test_input_t test_input_t
test input type of kernel
Definition: double_integral.hpp:407
nearly_singular_integral.hpp
Nearly singular integral general case.
NiHu::semi_block_product
semi_block_product_result_type< mat, rightDerived >::type semi_block_product(mat const &m, Eigen::MatrixBase< rightDerived > const &r)
compute semi block product of a matrix and a vector m * v^T
Definition: block_product.hpp:194
NiHu::double_integral< Kernel, TestField, TrialField, formalism::general >::eval
static result_t & eval(WITH_SINGULARITY_CHECK, result_t &result, kernel_base< Kernel > const &kernel, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field)
evaluate double integral of a kernel on specific fields with singularity check
Definition: double_integral.hpp:329
NiHu::kernel_traits::test_input_t
kernel_traits_ns::test_input< Derived >::type test_input_t
kernel test input type
Definition: kernel.hpp:76
NiHu::double_integral< Kernel, TestField, TrialField, formalism::general >::eval_singular_on_accelerator::eval
static result_t & eval(result_t &result, kernel_base< Kernel > const &kernel, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field, singular_iterator_t begin, singular_iterator_t end)
evaluate double singular integral with selected singular accelerator
Definition: double_integral.hpp:225
NiHu::double_integral< Kernel, TestField, TrialField, formalism::collocational >::eval_singular_on_accelerator::eval
static result_t & eval(result_t &result, kernel_base< Kernel > const &kernel, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field, singular_accelerator_t const &sa)
evaluate collocational singular integral with selected singular accelerator
Definition: double_integral.hpp:494
match_types.hpp
NiHu::invalid_singular_accelerator
an invalid singular accelerator assigned to nonexisting integrals
Definition: singular_accelerator.hpp:91
NiHu::element_match::get_match_dimension
int get_match_dimension() const
return singularity type
Definition: element_match.hpp:55
NiHu::formalism::general
general case when the test field is not Dirac
Definition: formalism.hpp:37
NiHu::double_integral< Kernel, TestField, TrialField, formalism::collocational >::test_nset_t
TestField::nset_t test_nset_t
N-set of the test field.
Definition: double_integral.hpp:420
NiHu::singular_shortcut_switch::type
Definition: double_integral.hpp:74
NiHu::kernel_base
CRTP base class of all BEM kernels.
Definition: kernel.hpp:133
NiHu::double_integral< Kernel, TestField, TrialField, formalism::collocational >::w_trial_input_t
weighted_input< trial_input_t, trial_elem_t >::type w_trial_input_t
weighted trial input type
Definition: double_integral.hpp:414
NiHu::kernel_traits
traits class of a kernel
Definition: kernel.hpp:71
NiHu::double_integral< Kernel, TestField, TrialField, formalism::collocational >::eval
static result_t & eval(WITHOUT_SINGULARITY_CHECK, result_t &result, kernel_base< Kernel > const &kernel, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field)
evaluate single integral of a kernel on specific fields without singularity check
Definition: double_integral.hpp:552
NiHu::double_integral< Kernel, TestField, TrialField, formalism::general >::trial_input_t
kernel_traits< Kernel >::trial_input_t trial_input_t
trial input type of kernel
Definition: double_integral.hpp:158
NiHu::nearly_singular_integral
Definition: nearly_singular_integral.hpp:27
NiHu::kernel_traits::result_t
kernel_traits_ns::result< Derived >::type result_t
the kernel result type
Definition: kernel.hpp:80
NiHu::double_integral< Kernel, TestField, TrialField, formalism::general >::w_test_input_t
weighted_input< test_input_t, test_elem_t >::type w_test_input_t
weighted test input type of kernel
Definition: double_integral.hpp:160
NiHu::get_formalism
return formalism from Test and Trial field types
Definition: formalism.hpp:47
NiHu::double_integral< Kernel, TestField, TrialField, formalism::collocational >::eval
static result_t eval(kernel_base< Kernel > const &kernel, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field, OnSameMesh)
evaluate collocational integral on given fields
Definition: double_integral.hpp:660
NiHu::element_match
class describing the adjacency (match) state of two elements
Definition: element_match.hpp:39
NiHu::num_rows
metafunction returning the number of compile time rows
Definition: matrix_traits.hpp:16
NiHu::double_integral< Kernel, TestField, TrialField, formalism::collocational >::kernel_result_t
kernel_traits< Kernel >::result_t kernel_result_t
result type of kernel
Definition: double_integral.hpp:411
NiHu::singular_integral_shortcut
a shortcut for the user to define customised singular integral methods
Definition: double_integral.hpp:709
NiHu::field_type_accelerator_pool
Definition: field_type_accelerator.hpp:348
NiHu::double_integral< Kernel, TestField, TrialField, formalism::collocational >::result_t
traits_t::result_t result_t
result type of the weighted residual
Definition: double_integral.hpp:425
NiHu::double_integral< Kernel, TestField, TrialField, formalism::general >::eval
static result_t & eval(WITHOUT_SINGULARITY_CHECK, result_t &result, kernel_base< Kernel > const &kernel, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field)
evaluate double integral of a kernel on specific fields without singularity check
Definition: double_integral.hpp:282
NiHu::field_base::get_dofs
dofs_return_t get_dofs() const
return DOF vector
Definition: field.hpp:155
NiHu::double_integral< Kernel, TestField, TrialField, formalism::general >::eval_singular_on_accelerator< invalid_singular_accelerator, dummy >::eval
static result_t & eval(result_t &result, kernel_base< Kernel > const &, field_base< TestField > const &, field_base< TrialField > const &, singular_iterator_t, singular_iterator_t)
evaluate double singular integral with the invalid accelerator
Definition: double_integral.hpp:261
NiHu::double_integral< Kernel, TestField, TrialField, formalism::collocational >::eval_on_accelerator
static result_t & eval_on_accelerator(result_t &result, kernel_base< Kernel > const &kernel, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field, dual_iterator_t first, dual_iterator_t last)
evaluate regular collocational integral with selected trial field accelerator
Definition: double_integral.hpp:446
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::double_integral< Kernel, TestField, TrialField, formalism::general >::test_input_t
kernel_traits< Kernel >::test_input_t test_input_t
test input type of kernel
Definition: double_integral.hpp:156
NiHu::double_integral< Kernel, TestField, TrialField, formalism::general >::result_t
traits_t::result_t result_t
result type of the weighted residual
Definition: double_integral.hpp:168
NiHu::block_product
block_product_result_type< leftDerived, mat, rightDerived >::type block_product(Eigen::MatrixBase< leftDerived > const &l, mat const &m, Eigen::MatrixBase< rightDerived > const &r)
compute a block product l * m * r^T
Definition: block_product.hpp:170
complexity_estimator.hpp
Estimate kernel complexity between two elements.
NiHu::singular_integral_shortcut::eval
static result_t & eval(result_t &result, kernel_base< Kernel > const &kernel, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field, element_match const &match)
evaluate singular integral
Definition: double_integral.hpp:780
NiHu::GLOBAL_MAX_ORDER
const unsigned GLOBAL_MAX_ORDER
the maximal order of accelerated quadratures and field type accelerators
Definition: global_definitions.hpp:41
NiHu::block_product_result_type
metafunction returning the value type of a block product
Definition: block_product.hpp:154
NiHu::double_integral< Kernel, TestField, TrialField, formalism::collocational >::eval_singular_on_accelerator< invalid_singular_accelerator, dummy >::eval
static result_t & eval(result_t &result, kernel_base< Kernel > const &, field_base< TestField > const &, field_base< TrialField > const &, invalid_singular_accelerator const &)
evaluate collocational singular integral with selected singular accelerator
Definition: double_integral.hpp:532
NiHu::double_integral< Kernel, TestField, TrialField, formalism::general >::eval_on_accelerator
static result_t & eval_on_accelerator(result_t &result, kernel_base< Kernel > const &kernel, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field, dual_iterator_t it, dual_iterator_t end)
evaluate regular double integral with selected accelerators
Definition: double_integral.hpp:181
NiHu::num_cols
metafunction returning the number of compile time columns
Definition: matrix_traits.hpp:41
NiHu::double_integral< Kernel, TestField, TrialField, formalism::general >::test_elem_t
TestField::elem_t test_elem_t
the test elem type
Definition: double_integral.hpp:152
NiHu::double_integral< Kernel, TestField, TrialField, formalism::collocational >::trial_elem_t
TrialField::elem_t trial_elem_t
type of the trial element
Definition: double_integral.hpp:405
NiHu::kernel_traits::trial_input_t
kernel_traits_ns::trial_input< Derived >::type trial_input_t
kernel trial input type
Definition: kernel.hpp:78
NiHu::shape_set_traits::num_nodes
Defines the number of shape functions in the set.
Definition: shapeset.hpp:110
NiHu::acceleration::hard
real acceleration
Definition: field_type_acceleration_option.hpp:35
NiHu::complexity_estimator
class to estimate kernel complexity between two fields
Definition: complexity_estimator.hpp:39
NiHu::weighted_input
the weigthed input is an extended input that contains the jacobian a well
Definition: weighted_input.hpp:19
NiHu::singular_shortcut_switch
Definition: double_integral.hpp:72
NiHu::double_integral< Kernel, TestField, TrialField, formalism::collocational >::eval
static result_t & eval(WITH_SINGULARITY_CHECK, result_t &result, kernel_base< Kernel > const &kernel, field_base< TestField > const &test_field, field_base< TrialField > const &trial_field)
evaluate single integral of a kernel on specific fields with singularity check
Definition: double_integral.hpp:608
NiHu::double_integral< Kernel, TestField, TrialField, formalism::collocational >::quadrature_family_t
kernel_traits< Kernel >::quadrature_family_t quadrature_family_t
the quadrature family the kernel requires
Definition: double_integral.hpp:417
field_type_accelerator.hpp
Acceleration of field types by storing shape functions for each quadrature point.