9 #ifndef KERNEL_TABULATED_HPP 10 #define KERNEL_TABULATED_HPP 17 template <
class KernelType>
21 KernelType original_kernel_;
22 int kernel_resolution_;
23 Real dq_, delta_q_0_, delta_q_1_, delta_q_2_, delta_q_3_;
31 int location = (int)floor(q / dq_);
33 Real fraction_1 = q - Real(location) * dq_;
34 Real fraction_0 = fraction_1 + dq_;
35 Real fraction_2 = fraction_1 - dq_;
36 Real fraction_3 = fraction_1 - 2 * dq_;
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]);
44 virtual Real
KernelSize()
const override {
return original_kernel_.KernelSize(); };
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;
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;
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;
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)
65 factor_W_2D_ = original_kernel_.FactorW2D();
66 factor_W_3D_ = original_kernel_.FactorW3D();
69 for (
int i = 0; i < kernel_resolution_ + 4; i++)
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_));
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_;
87 setDerivativeParameters();
90 template <
class KernelType>
93 return InterpolationCubic(w_1d, q);
96 template <
class KernelType>
99 return InterpolationCubic(w_2d, q);
102 template <
class KernelType>
103 Real KernelTabulated<KernelType>::W_3D(Real q)
const 105 return InterpolationCubic(w_3d, q);
108 template <
class KernelType>
111 return InterpolationCubic(dw_1d, q);
114 template <
class KernelType>
117 return InterpolationCubic(dw_2d, q);
120 template <
class KernelType>
121 Real KernelTabulated<KernelType>::dW_3D(Real q)
const 123 return InterpolationCubic(dw_3d, q);
126 template <
class KernelType>
129 return InterpolationCubic(d2w_1d, q);
132 template <
class KernelType>
135 return InterpolationCubic(d2w_2d, q);
138 template <
class KernelType>
139 Real KernelTabulated<KernelType>::d2W_3D(Real q)
const 141 return InterpolationCubic(d2w_3d, q);
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