SPHinXsys  alpha version
kernel_tabulated.hpp
1 
9 #ifndef KERNEL_TABULATED_HPP
10 #define KERNEL_TABULATED_HPP
11 
12 #include "base_kernel.h"
13 #include <cmath>
14 
15 namespace SPH
16 {
17  template <class KernelType>
18  class KernelTabulated : public Kernel
19  {
20  protected:
21  KernelType original_kernel_;
22  int kernel_resolution_;
23  Real dq_, delta_q_0_, delta_q_1_, delta_q_2_, delta_q_3_;
24  StdVec<Real> w_1d, w_2d, w_3d;
25  StdVec<Real> dw_1d, dw_2d, dw_3d;
26  StdVec<Real> d2w_1d, d2w_2d, d2w_3d;
27 
29  Real InterpolationCubic(const StdVec<Real> &data, Real q) const
30  {
31  int location = (int)floor(q / dq_);
32  int i = location + 1;
33  Real fraction_1 = q - Real(location) * dq_; // fraction_1 correspond to i
34  Real fraction_0 = fraction_1 + dq_; // fraction_0 correspond to i-1
35  Real fraction_2 = fraction_1 - dq_; // fraction_2 correspond to i+1
36  Real fraction_3 = fraction_1 - 2 * dq_;
37 
38  return ((fraction_1 * fraction_2 * fraction_3) / delta_q_0_ * data[i - 1] + (fraction_0 * fraction_2 * fraction_3) / delta_q_1_ * data[i] + (fraction_0 * fraction_1 * fraction_3) / delta_q_2_ * data[i + 1] + (fraction_0 * fraction_1 * fraction_2) / delta_q_3_ * data[i + 2]);
39  };
40 
41  public:
42  explicit KernelTabulated(Real h, int kernel_resolution);
43 
44  virtual Real KernelSize() const override { return original_kernel_.KernelSize(); };
45 
46  virtual Real W_1D(const Real q) const override;
47  virtual Real W_2D(const Real q) const override;
48  virtual Real W_3D(const Real q) const override;
49 
50  virtual Real dW_1D(const Real q) const override;
51  virtual Real dW_2D(const Real q) const override;
52  virtual Real dW_3D(const Real q) const override;
53 
54  virtual Real d2W_1D(const Real q) const override;
55  virtual Real d2W_2D(const Real q) const override;
56  virtual Real d2W_3D(const Real q) const override;
57  };
58  //=================================================================================================//
59  template <class KernelType>
60  KernelTabulated<KernelType>::KernelTabulated(Real h, int kernel_resolution)
61  : Kernel(h, "KernelTabulated"), original_kernel_(h),
62  kernel_resolution_(kernel_resolution)
63  {
64  factor_W_1D_ = original_kernel_.FactorW1D();
65  factor_W_2D_ = original_kernel_.FactorW2D();
66  factor_W_3D_ = original_kernel_.FactorW3D();
67 
68  dq_ = KernelSize() / Real(kernel_resolution_);
69  for (int i = 0; i < kernel_resolution_ + 4; i++)
70  {
71  w_1d.push_back(original_kernel_.W_1D(Real(i - 1) * dq_));
72  w_2d.push_back(original_kernel_.W_2D(Real(i - 1) * dq_));
73  w_3d.push_back(original_kernel_.W_3D(Real(i - 1) * dq_));
74  dw_1d.push_back(original_kernel_.dW_1D(Real(i - 1) * dq_));
75  dw_2d.push_back(original_kernel_.dW_2D(Real(i - 1) * dq_));
76  dw_3d.push_back(original_kernel_.dW_3D(Real(i - 1) * dq_));
77  d2w_1d.push_back(original_kernel_.d2W_1D(Real(i - 1) * dq_));
78  d2w_2d.push_back(original_kernel_.d2W_2D(Real(i - 1) * dq_));
79  d2w_3d.push_back(original_kernel_.d2W_3D(Real(i - 1) * dq_));
80  }
81 
82  delta_q_0_ = (-1.0 * dq_) * (-2.0 * dq_) * (-3.0 * dq_);
83  delta_q_1_ = dq_ * (-1.0 * dq_) * (-2.0 * dq_);
84  delta_q_2_ = (2.0 * dq_) * dq_ * (-1.0 * dq_);
85  delta_q_3_ = (3.0 * dq_) * (2.0 * dq_) * dq_;
86 
87  setDerivativeParameters();
88  }
89  //=================================================================================================//
90  template <class KernelType>
92  {
93  return InterpolationCubic(w_1d, q);
94  }
95  //=================================================================================================//
96  template <class KernelType>
97  Real KernelTabulated<KernelType>::W_2D(Real q) const
98  {
99  return InterpolationCubic(w_2d, q);
100  }
101  //=================================================================================================//
102  template <class KernelType>
103  Real KernelTabulated<KernelType>::W_3D(Real q) const
104  {
105  return InterpolationCubic(w_3d, q);
106  }
107  //=================================================================================================//
108  template <class KernelType>
110  {
111  return InterpolationCubic(dw_1d, q);
112  }
113  //=================================================================================================//
114  template <class KernelType>
115  Real KernelTabulated<KernelType>::dW_2D(Real q) const
116  {
117  return InterpolationCubic(dw_2d, q);
118  }
119  //=================================================================================================//
120  template <class KernelType>
121  Real KernelTabulated<KernelType>::dW_3D(Real q) const
122  {
123  return InterpolationCubic(dw_3d, q);
124  }
125  //=================================================================================================//
126  template <class KernelType>
128  {
129  return InterpolationCubic(d2w_1d, q);
130  }
131  //=================================================================================================//
132  template <class KernelType>
133  Real KernelTabulated<KernelType>::d2W_2D(Real q) const
134  {
135  return InterpolationCubic(d2w_2d, q);
136  }
137  //=================================================================================================//
138  template <class KernelType>
139  Real KernelTabulated<KernelType>::d2W_3D(Real q) const
140  {
141  return InterpolationCubic(d2w_3d, q);
142  }
143  //=================================================================================================//
144 }
145 #endif // KERNEL_TABULATED_HPP
Definition: kernel_tabulated.hpp:18
virtual Real dW_1D(const Real q) const override
Definition: kernel_tabulated.hpp:109
Abstract base class of a general SPH kernel function which is a smoothed Dirac delta function...
Definition: base_kernel.h:63
virtual Real d2W_1D(const Real q) const override
Definition: kernel_tabulated.hpp:127
virtual Real KernelSize() const override
Definition: kernel_tabulated.hpp:44
Real InterpolationCubic(const StdVec< Real > &data, Real q) const
Definition: kernel_tabulated.hpp:29
This is the base classes of kernel functions. Implementation will be implemented in derived classes...
virtual Real W_1D(const Real q) const override
Definition: kernel_tabulated.hpp:91
Real factor_W_1D_
Definition: base_kernel.h:70
Definition: solid_body_supplementary.cpp:9