NiHu  2.0
normal_derivative_kernel.hpp
Go to the documentation of this file.
1 
8 #ifndef NORMAL_DERIVATIVE_KERNEL_HPP_INCLUDED
9 #define NORMAL_DERIVATIVE_KERNEL_HPP_INCLUDED
10 
12 #include "location_normal.hpp"
13 
14 #include "core/kernel.hpp"
15 
16 namespace NiHu
17 {
18 
25 template <class DistanceKernel, int Nx, int Ny>
27 
29 namespace kernel_traits_ns
30 {
31  // the space is inherited
32  template <class DK, int Nx, int Ny>
33  struct space<normal_derivative_kernel<DK, Nx, Ny> >
35 
36  // the result is inherited
37  template <class DK, int Nx, int Ny>
38  struct result<normal_derivative_kernel<DK, Nx, Ny> >
40 
41  // the quadrature family is inherited
42  template <class DK, int Nx, int Ny>
45 
46  // singularity is inherited
47  template <class DK, int Nx, int Ny>
50 
51  // singular quadrature order is inherited
52  template <class DK, int Nx, int Ny>
55 
56  // singular core is normal derivative of the singular core
57  template <class DK, int Nx, int Ny>
58  struct singular_core<normal_derivative_kernel<DK, Nx, Ny> > {
61  Nx, Ny
62  > type;
63  };
64 
65  // symmetric if x and y orders are the same
66  template <class DK, int Nx, int Ny>
68  : std::integral_constant<bool, Nx == Ny> {};
69 
70  // in the general case, the test input is normal_jacobian
71  template <class DK, int Nx, int Ny>
72  struct test_input<normal_derivative_kernel<DK, Nx, Ny> >
73  {
75  };
76 
77  // for the Nx = 0 case the test input is location
78  template <class DK, int Ny>
80  {
82  };
83 
84  // in the general case, the trial input is normal_jacobian
85  template <class DK, int Nx, int Ny>
87  {
89  };
90 
91  // for the Ny = 0 case the trial input is location
92  template <class DK, int Nx>
94  {
96  };
97 
98 /*
99  template <class DK>
100  struct far_field_behaviour<normal_derivative_kernel<DK, 0, 0> >
101  : distance_dependent_kernel_traits_ns::far_field_behaviour<DK> {};
102 
103  template <class DK>
104  struct singularity_type<normal_derivative_kernel<DK, 0, 0> >
105  : distance_dependent_kernel_traits_ns::singularity_type<DK> {};
106 */
107 }
108 
109 
114 template <class DistanceKernel>
115 class normal_derivative_kernel<DistanceKernel, 0, 0>
116  : public kernel_base<normal_derivative_kernel<DistanceKernel, 0, 0> >
117  , public DistanceKernel
118 {
119 public:
121  typedef typename base_t::test_input_t test_input_t;
122  typedef typename base_t::trial_input_t trial_input_t;
123  typedef typename base_t::result_t result_t;
124  typedef typename base_t::x_t x_t;
125 
126  normal_derivative_kernel(DistanceKernel const &dk = DistanceKernel())
127  : DistanceKernel(dk.derived())
128  {
129  }
130 
131  result_t operator()(typename base_t::x_t const &x, typename base_t::x_t const &y) const
132  {
133  x_t rvec = y - x;
134  result_t g;
135  DistanceKernel::template eval<0>(rvec.norm(), &g);
136  return g;
137  }
138 
139  result_t operator()(test_input_t const &x, trial_input_t const &y) const
140  {
141  return (*this)(x.get_x(), y.get_x());
142  }
143 };
144 
145 
149 template <class DistanceKernel>
150 class normal_derivative_kernel<DistanceKernel, 0, 1>
151  : public kernel_base<normal_derivative_kernel<DistanceKernel, 0, 1> >
152  , public DistanceKernel
153 {
154 public:
156  typedef typename base_t::test_input_t test_input_t;
157  typedef typename base_t::trial_input_t trial_input_t;
158  typedef typename base_t::result_t result_t;
159  typedef typename base_t::scalar_t scalar_t;
160  typedef typename base_t::x_t x_t;
161 
162  normal_derivative_kernel(DistanceKernel const &dk = DistanceKernel())
163  : DistanceKernel(dk.derived())
164  {
165  }
166 
167  result_t operator()(x_t const &x, x_t const &y, x_t const &ny) const
168  {
169  x_t rvec = y - x;
170  scalar_t r = rvec.norm();
171  scalar_t rdny = rvec.dot(ny) / r;
172  result_t f;
173  DistanceKernel::template eval<1>(r, &f);
174  return f * rdny;
175  }
176 
177  result_t operator()(test_input_t const &x, trial_input_t const &y) const
178  {
179  return (*this)(x.get_x(), y.get_x(), y.get_unit_normal());
180  }
181 };
182 
186 template <class DistanceKernel>
187 class normal_derivative_kernel<DistanceKernel, 1, 0>
188  : public kernel_base<normal_derivative_kernel<DistanceKernel, 1, 0> >
189  , public DistanceKernel
190 {
191 public:
193  typedef typename base_t::test_input_t test_input_t;
194  typedef typename base_t::trial_input_t trial_input_t;
195  typedef typename base_t::result_t result_t;
196  typedef typename base_t::scalar_t scalar_t;
197  typedef typename base_t::x_t x_t;
198 
199  normal_derivative_kernel(DistanceKernel const &dk = DistanceKernel())
200  : DistanceKernel(dk.derived())
201  {
202  }
203 
204  result_t operator()(x_t const &x, x_t const &y, x_t const &nx) const
205  {
206  x_t rvec = y - x;
207  scalar_t r = rvec.norm();
208  scalar_t rdnx = -rvec.dot(nx) / r;
209  result_t f;
210  DistanceKernel::template eval<1>(r, &f);
211  return f * rdnx;
212  }
213 
214  result_t operator()(test_input_t const &x, trial_input_t const &y) const
215  {
216  return (*this)(x.get_x(), y.get_x(), x.get_unit_normal());
217  }
218 };
219 
220 
224 template <class DistanceKernel>
225 class normal_derivative_kernel<DistanceKernel, 1, 1>
226  : public kernel_base<normal_derivative_kernel<DistanceKernel, 1, 1> >
227  , public DistanceKernel
228 {
229 public:
231  typedef typename base_t::test_input_t test_input_t;
232  typedef typename base_t::trial_input_t trial_input_t;
233  typedef typename base_t::result_t result_t;
234  typedef typename base_t::scalar_t scalar_t;
235  typedef typename base_t::x_t x_t;
236 
237  normal_derivative_kernel(DistanceKernel const &dk = DistanceKernel())
238  : DistanceKernel(dk.derived())
239  {
240  }
241 
242  result_t operator()(x_t const &x, x_t const &y, x_t const &nx, x_t const &ny) const
243  {
244  x_t rvec = y - x;
245  scalar_t r = rvec.norm();
246  scalar_t rdny = rvec.dot(ny) / r;
247  scalar_t rdnx = -rvec.dot(nx) / r;
248  result_t f[2]; /* f[0] = G'' - G'/r, f[1] = G'/r */
249  DistanceKernel::template eval<2>(r, f);
250  return f[0] * rdnx * rdny - f[1] * nx.dot(ny);
251  }
252 
253  result_t operator()(test_input_t const &x, trial_input_t const &y) const
254  {
255  return (*this)(x.get_x(), y.get_x(), x.get_unit_normal(), y.get_unit_normal());
256  }
257 };
258 
262 template <class DistanceKernel>
263 class normal_derivative_kernel<DistanceKernel, 2, 0>
264  : public kernel_base<normal_derivative_kernel<DistanceKernel, 2, 0> >
265  , public DistanceKernel
266 {
267 public:
269  typedef typename base_t::test_input_t test_input_t;
270  typedef typename base_t::trial_input_t trial_input_t;
271  typedef typename base_t::result_t result_t;
272  typedef typename base_t::scalar_t scalar_t;
273  typedef typename base_t::x_t x_t;
274 
275  normal_derivative_kernel(DistanceKernel const &dk = DistanceKernel())
276  : DistanceKernel(dk.derived())
277  {
278  }
279 
280  result_t operator()(x_t const &x, x_t const &y, x_t const &nx) const
281  {
282  x_t rvec = y - x;
283  scalar_t r = rvec.norm();
284  scalar_t rdnx = -rvec.dot(nx) / r;
285  result_t f[2]; /* f[0] = G'' - G'/r, f[1] = G'/r */
286  DistanceKernel::template eval<2>(r, f);
287  return f[0] * rdnx * rdnx + f[1];
288  }
289 
290  result_t operator()(test_input_t const &x, trial_input_t const &y) const
291  {
292  return (*this)(x.get_x(), y.get_x(), x.get_unit_normal());
293  }
294 };
295 
296 } // end of namespace NiHu
297 
298 #endif /* NORMAL_DERIVATIVE_KERNEL_HPP_INCLUDED */
NiHu::distance_dependent_kernel_traits_ns::quadrature_family
Definition: distance_dependent_kernel.hpp:29
kernel.hpp
implementation of class kernel and its traits
NiHu::kernel_traits_ns::result
return the kernel's result type
Definition: kernel.hpp:47
NiHu::distance_dependent_kernel_traits_ns::singular_core
Definition: distance_dependent_kernel.hpp:35
NiHu::distance_dependent_kernel_traits_ns::result
Definition: distance_dependent_kernel.hpp:26
NiHu::distance_dependent_kernel_traits_ns::singular_quadrature_order
Definition: distance_dependent_kernel.hpp:38
NiHu::kernel_traits_ns::singular_core
return the kernel's singular core type
Definition: kernel.hpp:63
NiHu::location_normal_jacobian_input
a class representing a normal + Jacobian input
Definition: location_normal.hpp:79
NiHu::kernel_traits_ns::is_singular
return whether the kernel is singular or not
Definition: kernel.hpp:56
NiHu::kernel_base
CRTP base class of all BEM kernels.
Definition: kernel.hpp:133
NiHu::kernel_base< normal_derivative_kernel< DistanceKernel, 0, 1 > >::scalar_t
space_t::scalar_t scalar_t
type of the scalar coordinate in the kernel's domain
Definition: kernel.hpp:156
distance_dependent_kernel.hpp
Class NiHu::distance_dependent_kernel.
NiHu::distance_dependent_kernel_traits_ns::is_singular
Definition: distance_dependent_kernel.hpp:32
NiHu::distance_dependent_kernel_traits_ns::space
Definition: distance_dependent_kernel.hpp:23
NiHu::kernel_traits_ns::singular_quadrature_order
return the quadrature order the singular kernel needs to be integrated with
Definition: kernel.hpp:61
NiHu::kernel_traits_ns::is_symmetric
return whether the kernel is symmetric or not
Definition: kernel.hpp:54
NiHu::kernel_traits_ns::quadrature_family
return the quadrature family the kernel is integrated with
Definition: kernel.hpp:49
NiHu::kernel_base< normal_derivative_kernel< DistanceKernel, 0, 0 > >::trial_input_t
traits_t::trial_input_t trial_input_t
type of the second (trial) kernel input
Definition: kernel.hpp:144
NiHu::kernel_base< normal_derivative_kernel< DistanceKernel, 0, 0 > >::test_input_t
traits_t::test_input_t test_input_t
type of the first (test) kernel input
Definition: kernel.hpp:142
NiHu::kernel_traits_ns::trial_input
return the kernel's trial input
Definition: kernel.hpp:45
location_normal.hpp
implementation of location and normal kernel inputs
NiHu::normal_derivative_kernel
Normal derivative of a distance dependent kernel.
Definition: normal_derivative_kernel.hpp:26
NiHu::kernel_traits_ns::space
return the coordinate space where the kernel is defined
Definition: kernel.hpp:41
NiHu::kernel_base< normal_derivative_kernel< DistanceKernel, 0, 0 > >::result_t
traits_t::result_t result_t
compile time check if the two kernel inputs are compatible
Definition: kernel.hpp:147
NiHu::kernel_traits_ns::test_input
return the kernel's test input
Definition: kernel.hpp:43
NiHu::location_input
a class representing a simple location
Definition: location_normal.hpp:37
NiHu::kernel_base< normal_derivative_kernel< DistanceKernel, 0, 0 > >::x_t
space_t::location_t x_t
type of a location vector in the kernel's domain
Definition: kernel.hpp:154