SPHinXsys  alpha version
base_kernel.h
Go to the documentation of this file.
1 /* -------------------------------------------------------------------------*
2 * SPHinXsys *
3 * --------------------------------------------------------------------------*
4 * SPHinXsys (pronunciation: s'finksis) is an acronym from Smoothed Particle *
5 * Hydrodynamics for industrial compleX systems. It provides C++ APIs for *
6 * physical accurate simulation and aims to model coupled industrial dynamic *
7 * systems including fluid, solid, multi-body dynamics and beyond with SPH *
8 * (smoothed particle hydrodynamics), a meshless computational method using *
9 * particle discretization. *
10 * *
11 * SPHinXsys is partially funded by German Research Foundation *
12 * (Deutsche Forschungsgemeinschaft) DFG HU1527/6-1, HU1527/10-1 *
13 * and HU1527/12-1. *
14 * *
15 * Portions copyright (c) 2017-2020 Technical University of Munich and *
16 * the authors' affiliations. *
17 * *
18 * Licensed under the Apache License, Version 2.0 (the "License"); you may *
19 * not use this file except in compliance with the License. You may obtain a *
20 * copy of the License at http://www.apache.org/licenses/LICENSE-2.0. *
21 * *
22 * --------------------------------------------------------------------------*/
37 #ifndef BASE_KERNELS_H
38 #define BASE_KERNELS_H
39 
40 
41 
42 #include "base_data_package.h"
43 
44 #include <string>
45 #include <functional>
46 
47 using namespace std::placeholders;
48 
49 namespace SPH
50 {
63  class Kernel
64  {
65  protected:
66  const std::string kernel_name_;
67  Real h_, inv_h_;
68  Real cutoff_radius_ref_;
70  Real factor_W_1D_, factor_W_2D_, factor_W_3D_;
72  Real factor_dW_1D_, factor_dW_2D_, factor_dW_3D_;
74  Real factor_d2W_1D_, factor_d2W_2D_, factor_d2W_3D_;
75 
76  void setDerivativeParameters();
77  public:
79  explicit Kernel(Real h, const std::string &kernel_name = "Kernel");
80  virtual ~Kernel() {};
81 
82  std::string Name() const { return kernel_name_; };
83  Real SmoothingLength() const { return h_; };
85  virtual Real KernelSize() const { return 2.0; };
86  Real CutOffRadius() const { return cutoff_radius_ref_; };
87  Real FactorW1D() const { return factor_W_1D_; };
88  Real FactorW2D() const { return factor_W_2D_; };
89  Real FactorW3D() const { return factor_W_3D_; };
90 
94  virtual Real W(const Real& r_ij, const Real& displacement) const;
95  virtual Real W(const Real& r_ij, const Vec2d& displacement) const;
96  virtual Real W(const Real& r_ij, const Vec3d& displacement) const;
97 
101  virtual Real W_1D(const Real q) const = 0;
102  virtual Real W_2D(const Real q) const = 0;
103  virtual Real W_3D(const Real q) const = 0;
104 
106  virtual Real W0(const Real& point_i) const { return factor_W_1D_; };
107  virtual Real W0(const Vec2d& point_i) const { return factor_W_2D_; };
108  virtual Real W0(const Vec3d& point_i) const { return factor_W_3D_; };
109 
113  virtual Real dW(const Real& r_ij, const Real& displacement) const;
114  virtual Real dW(const Real& r_ij, const Vec2d& displacement) const;
115  virtual Real dW(const Real& r_ij, const Vec3d& displacement) const;
116 
120  virtual Real dW_1D(const Real q) const = 0;
121  virtual Real dW_2D(const Real q) const = 0;
122  virtual Real dW_3D(const Real q) const = 0;
123 
127  virtual Real d2W(const Real& r_ij, const Real& displacement) const;
128  virtual Real d2W(const Real& r_ij, const Vec2d& displacement) const;
129  virtual Real d2W(const Real& r_ij, const Vec3d& displacement) const;
130 
134  virtual Real d2W_1D(const Real q) const = 0;
135  virtual Real d2W_2D(const Real q) const = 0;
136  virtual Real d2W_3D(const Real q) const = 0;
137 
138  //----------------------------------------------------------------------
139  // Below are for variable smoothing length.
140  // Note that we input the ratio between the reference smoothing length
141  // to the variable smoothing length.
142  //----------------------------------------------------------------------
143  protected:
145  typedef std::function<Real(const Real&)> FactorFunctor;
146  FactorFunctor h_factor_W_1D_, h_factor_W_2D_, h_factor_W_3D_;
147  FactorFunctor h_factor_dW_1D_, h_factor_dW_2D_, h_factor_dW_3D_;
148  FactorFunctor h_factor_d2W_1D_, h_factor_d2W_2D_, h_factor_d2W_3D_;
149 
150  Real factorW1D(const Real& h_ratio) const { return h_ratio; };
151  Real factorW2D(const Real& h_ratio) const { return h_ratio * h_ratio; };
152  Real factorW3D(const Real& h_ratio) const { return h_ratio * h_ratio * h_ratio; };
153  Real factordW1D(const Real& h_ratio) const { return factorW1D(h_ratio) * h_ratio; };
154  Real factordW2D(const Real& h_ratio) const { return factorW2D(h_ratio) * h_ratio; };
155  Real factordW3D(const Real& h_ratio) const { return factorW3D(h_ratio)* h_ratio; };
156  Real factord2W1D(const Real& h_ratio) const { return factordW1D(h_ratio) * h_ratio; };
157  Real factord2W2D(const Real& h_ratio) const { return factordW2D(h_ratio) * h_ratio; };
158  Real factord2W3D(const Real& h_ratio) const { return factordW3D(h_ratio) * h_ratio; };
159 
160  public:
161  Real CutOffRadius(Real h_ratio) const { return cutoff_radius_ref_ / h_ratio; };
162 
163  Real W(const Real& h_ratio, const Real& r_ij, const Real& displacement) const;
164  Real W(const Real& h_ratio, const Real& r_ij, const Vec2d& displacement) const;
165  Real W(const Real& h_ratio, const Real& r_ij, const Vec3d& displacement) const;
166 
168  Real W0(const Real& h_ratio, const Real& point_i) const;
169  Real W0(const Real& h_ratio, const Vec2d& point_i) const;
170  Real W0(const Real& h_ratio, const Vec3d& point_i) const;
171 
173  Real dW(const Real& h_ratio, const Real& r_ij, const Real& displacement) const;
174  Real dW(const Real& h_ratio, const Real& r_ij, const Vec2d& displacement) const;
175  Real dW(const Real& h_ratio, const Real& r_ij, const Vec3d& displacement) const;
176 
178  Real d2W(const Real& h_ratio, const Real& r_ij, const Real& displacement) const;
179  Real d2W(const Real& h_ratio, const Real& r_ij, const Vec2d& displacement) const;
180  Real d2W(const Real& h_ratio, const Real& r_ij, const Vec3d& displacement) const;
181  //----------------------------------------------------------------------
182  // Below are for reduced kernels.
183  //----------------------------------------------------------------------
184  public:
185  void reduceOnce();
186  void reduceTwice();
187  };
188 }
189 #endif //BASE_KERNELS_H
std::function< Real(const Real &)> FactorFunctor
Definition: base_kernel.h:145
virtual Real KernelSize() const
Definition: base_kernel.h:85
virtual Real W0(const Real &point_i) const
Definition: base_kernel.h:106
Abstract base class of a general SPH kernel function which is a smoothed Dirac delta function...
Definition: base_kernel.h:63
Real inv_h_
Definition: base_kernel.h:67
Real factor_dW_1D_
Definition: base_kernel.h:72
Real factor_d2W_1D_
Definition: base_kernel.h:74
Real factor_W_1D_
Definition: base_kernel.h:70
Definition: solid_body_supplementary.cpp:9