OpenFPM  5.2.0
Project that contain the implementation of distributed structures
kernel_functions.h
1 #include <math.h>
2 // This is a collection of 1D, 2D and 3D SPH kernel functions.
3 //
4 // Created by lschulze
5 
6 // Template typenames for kernel function types
7 struct WendlandC2 {};
8 
9 template<size_t dim, typename kernel_function_type> class kernel_function
10 {
11  public:
12  kernel_function(double smoothing_length) : H(smoothing_length)
13  {
14  // 1D Wendland C2
15  if ((dim == 1) && (std::is_same<kernel_function_type, WendlandC2>::value))
16  {
17  kernel_type = 0;
18  coefficient = 5.0/(8.0*H);
19  }
20  // 2D Wendland C2
21  if ((dim == 2) && (std::is_same<kernel_function_type, WendlandC2>::value))
22  {
23  kernel_type = 1;
24  coefficient = 7.0/(4.0*M_PI*H*H);
25  }
26  // 3D Wendland C2
27  if ((dim == 3) && (std::is_same<kernel_function_type, WendlandC2>::value))
28  {
29  kernel_type = 2;
30  coefficient = 21.0/(16.0*M_PI*H*H*H);
31  }
32  }
33 
34  double Wab(double r)
35  {
36  const double q = r/H;
37  // 1D Wendland C2
38  if (kernel_type == 0)
39  {
40  if (q <= 2.0)
41  {
42  double factor = 1.0 - q/2.0;
43  factor = factor*factor*factor;
44  return(coefficient*factor*(1.5*q + 1));
45  }
46  else return(0.0);
47  }
48  // 2D Wendland C2
49  if (kernel_type == 1)
50  {
51  if (q <= 2.0)
52  {
53  double factor = 1.0 - q/2.0;
54  factor = factor*factor;
55  factor = factor*factor;
56  return(coefficient*factor*(1.0 + 2.0*q));
57  }
58  else return(0.0);
59  }
60  // 3D Wendland C2
61  if (kernel_type == 2)
62  {
63  if (q <= 2.0)
64  {
65  double factor = 1.0 - q/2.0;
66  factor = factor*factor;
67  factor = factor*factor;
68  return(coefficient*factor*(1.0 + 2.0*q));
69  }
70  else return(0.0);
71 
72  }
73  }
74 
75  void DWab(Point<dim,double> & dx, Point<dim,double> & DW, double r, bool print, double & dwdrab)
76  {
77  const double q = r/H;
78  // 2D Wendland C2
79  if(kernel_type == 1)
80  {
81  if (q <= 2.0)
82  {
83  double factor = (-5.0*coefficient/(H))*q*(1.0 - q/2.0)*(1.0 - q/2.0)*(1.0 - q/2.0);
84 
85  DW.get(0) = factor * dx.get(0)/r;
86  DW.get(1) = factor * dx.get(1)/r;
87 
88  dwdrab = factor;
89  }
90  else
91  {
92  DW.get(0) = 0.0;
93  DW.get(1) = 0.0;
94 
95  dwdrab = 0.0;
96  }
97  }
98  // 3D Wendland C2
99  if (kernel_type == 2)
100  {
101  if (q <= 2.0)
102  {
103  double factor = (-5.0*coefficient/(H))*q*(1.0 - q/2.0)*(1.0 - q/2.0)*(1.0 - q/2.0);
104 
105  DW.get(0) = factor * dx.get(0)/r;
106  DW.get(1) = factor * dx.get(1)/r;
107  DW.get(2) = factor * dx.get(2)/r;
108 
109  dwdrab = factor;
110  }
111  else
112  {
113  DW.get(0) = 0.0;
114  DW.get(1) = 0.0;
115  DW.get(2) = 0.0;
116 
117  dwdrab = 0.0;
118  }
119  }
120  }
121 
122  private:
123  double H;
124  int kernel_type;
125  double coefficient;
126 
127 };
This class implement the point shape in an N-dimensional space.
Definition: Point.hpp:28
__device__ __host__ const T & get(unsigned int i) const
Get coordinate.
Definition: Point.hpp:172