PeriDyno 1.0.0
Loading...
Searching...
No Matches
Kernel.h
Go to the documentation of this file.
1#pragma once
2#include "Platform.h"
3#include "DeclareEnum.h"
4
5namespace dyno {
6
7 template<typename Real>
8 class Kernel
9 {
10 public:
11 DYN_FUNC Kernel() {};
12 DYN_FUNC ~Kernel() {};
13
14 DYN_FUNC inline virtual Real Weight(const Real r, const Real h)
15 {
16 return Real(0);
17 }
18
19 DYN_FUNC inline virtual Real Gradient(const Real r, const Real h)
20 {
21 return Real(0);
22 }
23
24 DYN_FUNC inline virtual Real integral(const Real r, const Real h)
25 {
26 return Real(0);
27 }
28
29 public:
31 };
32
33 //spiky kernel
34 template<typename Real>
35 class SpikyKernel : public Kernel<Real>
36 {
37 public:
38 DYN_FUNC SpikyKernel() : Kernel<Real>() {};
39 DYN_FUNC ~SpikyKernel() {};
40
41 DYN_FUNC inline Real Weight(const Real r, const Real h) override
42 {
43// const Real q = r / h;
44// if (q > 1.0f) return 0.0f;
45// else {
46// const Real d = Real(1) - q;
47// const Real hh = h*h;
48// return 15.0f / ((Real)M_PI * hh * h) * d * d * d * this->m_scale;
49// }
50 return SpikyKernel<Real>::weight(r, h, this->m_scale);
51 }
52
53 DYN_FUNC inline Real Gradient(const Real r, const Real h) override
54 {
55// const Real q = r / h;
56// if (q > 1.0f) return 0.0;
57// //else if (r==0.0f) return 0.0f;
58// else {
59// const Real d = Real(1) - q;
60// const Real hh = h*h;
61// return -45.0f / ((Real)M_PI * hh*h) *d*d * this->m_scale;
62// }
63 return SpikyKernel<Real>::gradient(r, h, this->m_scale);
64 }
65
66 DYN_FUNC inline Real integral(const Real r, const Real h) override
67 {
68 return SpikyKernel<Real>::integral(r, h, this->m_scale);
69 }
70
71 DYN_FUNC static inline Real weight(const Real r, const Real h, Real scale)
72 {
73 const Real q = r / h;
74 if (q > 1.0f) return 0.0f;
75 else {
76 const Real d = Real(1) - q;
77 const Real hh = h * h;
78 return 15.0f / ((Real)M_PI * hh * h) * d * d * d * scale;
79 }
80 }
81
82 DYN_FUNC static inline Real gradient(const Real r, const Real h, Real scale)
83 {
84 const Real q = r / h;
85 if (q > 1.0f) return 0.0;
86 //else if (r==0.0f) return 0.0f;
87 else {
88 const Real d = Real(1) - q;
89 const Real hh = h * h;
90 return -45.0f / ((Real)M_PI * hh*hh) *d*d * scale;
91 }
92 }
93
94 DYN_FUNC static inline Real integral(const Real r, const Real h, Real scale)
95 {
96 const Real q = r / h;
97 if (q > 1.0f) return 0.0f;
98 else {
99 const Real qq = q * q;
100 const Real hh = h * h;
101 return -15.0f / ((Real)M_PI * hh) * (q - Real(1.5) * qq + q * qq - Real(0.25) * qq * qq - Real(0.25)) * scale;
102 }
103 }
104 };
105
106 template<typename Real>
107 class ConstantKernel : public Kernel<Real>
108 {
109 public:
110 DYN_FUNC ConstantKernel() : Kernel<Real>() {};
111 DYN_FUNC ~ConstantKernel() {};
112
113 DYN_FUNC inline Real Weight(const Real r, const Real h) override
114 {
115 return Real(1);
116 }
117
118 DYN_FUNC inline Real Gradient(const Real r, const Real h) override
119 {
120 return Real(0);
121 }
122 };
123
124
125 template<typename Real>
126 class SmoothKernel : public Kernel<Real>
127 {
128 public:
129 DYN_FUNC SmoothKernel() : Kernel<Real>() {};
130 DYN_FUNC ~SmoothKernel() {};
131
132 DYN_FUNC inline Real Weight(const Real r, const Real h) override
133 {
134// const Real q = r / h;
135// if (q > 1.0f) return 0.0f;
136// else {
137// return (1.0f - q*q) * this->m_scale;
138// }
139 return SmoothKernel<Real>::weight(r, h, this->m_scale);
140 }
141
142 DYN_FUNC inline Real Gradient(const Real r, const Real h) override
143 {
144// const Real q = r / h;
145// if (q > Real(1)) return Real(0);
146// else {
147// const Real hh = h*h;
148// const Real dd = Real(1) - q*q;
149// const Real alpha = 1.0f;// (Real) 945.0f / (32.0f * (Real)M_PI * hh *h);
150// return -alpha * dd* this->m_scale;
151// }
152 return SmoothKernel<Real>::gradient(r, h, this->m_scale);
153 }
154
155 DYN_FUNC static inline Real weight(const Real r, const Real h, const Real scale)
156 {
157 const Real q = r / h;
158 if (q > 1.0f) return 0.0f;
159 else {
160 return scale * (1.0f - q * q);
161 }
162 }
163
164 DYN_FUNC static inline Real gradient(const Real r, const Real h, const Real scale)
165 {
166 const Real q = r / h;
167 if (q > Real(1)) return Real(0);
168 else {
169 const Real hh = h * h;
170 const Real dd = Real(1) - q * q;
171 const Real alpha = 1.0f;// (Real) 945.0f / (32.0f * (Real)M_PI * hh *h);
172 return -alpha * dd* scale;
173 }
174 }
175
176 DYN_FUNC static inline Real integral(const Real r, const Real h, Real scale)
177 {
178 const Real q = r / h;
179 if (q > Real(1)) return Real(0);
180 else {
181 const Real hh = h * h;
182 return 1.0 / (hh * h) * (Real(2) / 3 - q + q * q / Real(3));
183 }
184 }
185 };
186
187
188 //spiky kernel
189 template<typename Real>
190 class CorrectedKernel : public Kernel<Real>
191 {
192 public:
193 DYN_FUNC CorrectedKernel() : Kernel<Real>() {};
194 DYN_FUNC ~CorrectedKernel() {};
195
196 DYN_FUNC inline Real Weight(const Real r, const Real h) override
197 {
198 const Real q = r / h;
199 SmoothKernel<Real> kernSmooth;
200 return q*q*q*kernSmooth.Weight(r, h);
201 }
202
203 DYN_FUNC inline Real WeightR(const Real r, const Real h)
204 {
205 const Real q = r / h;
206 SmoothKernel<Real> kernSmooth;
207 return q*q*kernSmooth.Weight(r, h)/h;
208 }
209
210 DYN_FUNC inline Real WeightRR(const Real r, const Real h)
211 {
212 const Real q = r / h;
213 SmoothKernel<Real> kernSmooth;
214 return q*kernSmooth.Weight(r, h) / (h*h);
215 }
216 };
217
218 //cubic kernel
219 template<typename Real>
220 class CubicKernel : public Kernel<Real>
221 {
222 public:
223 DYN_FUNC CubicKernel() : Kernel<Real>() {};
224 DYN_FUNC ~CubicKernel() {};
225
226 DYN_FUNC inline Real Weight(const Real r, const Real h) override
227 {
228 const Real hh = h*h;
229 const Real q = 2.0f*r / h;
230
231 const Real alpha = 3.0f / (2.0f * (Real)M_PI * hh * h);
232
233 if (q > 2.0f) return 0.0f;
234 else if (q >= 1.0f)
235 {
236 //1/6*(2-q)*(2-q)*(2-q)
237 const Real d = 2.0f - q;
238 return alpha / 6.0f*d*d*d;
239 }
240 else
241 {
242 //(2/3)-q*q+0.5f*q*q*q
243 const Real qq = q*q;
244 const Real qqq = qq*q;
245 return alpha*(2.0f / 3.0f - qq + 0.5f*qqq);
246 }
247 }
248
249 DYN_FUNC inline Real Gradient(const Real r, const Real h) override
250 {
251 const Real hh = h*h;
252 const Real q = 2.0f*r / h;
253
254 const Real alpha = 3.0f / (2.0f * (Real)M_PI * hh * h);
255
256 if (q > 2.0f) return Real(0);
257 else if (q >= 1.0f)
258 {
259 //-0.5*(2.0-q)*(2.0-q)
260 const Real d = 2.0f - q;
261 return -0.5f*alpha*d*d;
262 }
263 else
264 {
265 //-2q+1.5*q*q
266 const Real qq = q*q;
267 return alpha*(-2.0f*q + 1.5f*qq);
268 //return alpha*(-0.5);
269 }
270 }
271 };
272
273 template<typename Real>
274 class QuarticKernel : public Kernel<Real>
275 {
276 public:
277 DYN_FUNC QuarticKernel() : Kernel<Real>() {};
278 DYN_FUNC ~QuarticKernel() {};
279
280 DYN_FUNC inline Real Weight(const Real r, const Real h) override
281 {
282 const Real hh = h*h;
283 const Real q = 2.5f*r / h;
284 if (q > 2.5) return 0.0f;
285 else if (q > 1.5f)
286 {
287 const Real d = 2.5f - q;
288 const Real dd = d*d;
289 return 0.0255f*dd*dd / hh;
290 }
291 else if (q > 0.5f)
292 {
293 const Real d = 2.5f - q;
294 const Real t = 1.5f - q;
295 const Real dd = d*d;
296 const Real tt = t*t;
297 return 0.0255f*(dd*dd - 5.0f*tt*tt) / hh;
298 }
299 else
300 {
301 const Real d = 2.5f - q;
302 const Real t = 1.5f - q;
303 const Real w = 0.5f - q;
304 const Real dd = d*d;
305 const Real tt = t*t;
306 const Real ww = w*w;
307 return 0.0255f*(dd*dd - 5.0f*tt*tt + 10.0f*ww*ww) / hh;
308 }
309 }
310
311 DYN_FUNC inline Real Gradient(const Real r, const Real h) override
312 {
313 const Real hh = h*h;
314 const Real q = 2.5f*r / h;
315 if (q > 2.5) return 0.0f;
316 else if (q > 1.5f)
317 {
318 //0.102*(2.5-q)^3
319 const Real d = 2.5f - q;
320 return -0.102f*d*d*d / hh;
321 }
322 else if (q > 0.5f)
323 {
324 const Real d = 2.5f - q;
325 const Real t = 1.5f - q;
326 return -0.102f*(d*d*d - 5.0f*t*t*t) / hh;
327 }
328 else
329 {
330 const Real d = 2.5f - q;
331 const Real t = 1.5f - q;
332 const Real w = 0.5f - q;
333 return -0.102f*(d*d*d - 5.0f*t*t*t + 10.0f*w*w*w) / hh;
334 }
335 }
336 };
337}
double Real
Definition Typedef.inl:23
#define M_PI
Definition Typedef.inl:36
DYN_FUNC ~ConstantKernel()
Definition Kernel.h:111
DYN_FUNC ConstantKernel()
Definition Kernel.h:110
DYN_FUNC Real Weight(const Real r, const Real h) override
Definition Kernel.h:113
DYN_FUNC Real Gradient(const Real r, const Real h) override
Definition Kernel.h:118
DYN_FUNC Real Weight(const Real r, const Real h) override
Definition Kernel.h:196
DYN_FUNC ~CorrectedKernel()
Definition Kernel.h:194
DYN_FUNC CorrectedKernel()
Definition Kernel.h:193
DYN_FUNC Real WeightRR(const Real r, const Real h)
Definition Kernel.h:210
DYN_FUNC Real WeightR(const Real r, const Real h)
Definition Kernel.h:203
DYN_FUNC Real Gradient(const Real r, const Real h) override
Definition Kernel.h:249
DYN_FUNC Real Weight(const Real r, const Real h) override
Definition Kernel.h:226
DYN_FUNC ~CubicKernel()
Definition Kernel.h:224
DYN_FUNC CubicKernel()
Definition Kernel.h:223
DYN_FUNC ~Kernel()
Definition Kernel.h:12
virtual DYN_FUNC Real integral(const Real r, const Real h)
Definition Kernel.h:24
Real m_scale
Definition Kernel.h:30
virtual DYN_FUNC Real Gradient(const Real r, const Real h)
Definition Kernel.h:19
virtual DYN_FUNC Real Weight(const Real r, const Real h)
Definition Kernel.h:14
DYN_FUNC Kernel()
Definition Kernel.h:11
DYN_FUNC Real Gradient(const Real r, const Real h) override
Definition Kernel.h:311
DYN_FUNC QuarticKernel()
Definition Kernel.h:277
DYN_FUNC ~QuarticKernel()
Definition Kernel.h:278
DYN_FUNC Real Weight(const Real r, const Real h) override
Definition Kernel.h:280
static DYN_FUNC Real gradient(const Real r, const Real h, const Real scale)
Definition Kernel.h:164
static DYN_FUNC Real weight(const Real r, const Real h, const Real scale)
Definition Kernel.h:155
DYN_FUNC SmoothKernel()
Definition Kernel.h:129
DYN_FUNC Real Weight(const Real r, const Real h) override
Definition Kernel.h:132
DYN_FUNC ~SmoothKernel()
Definition Kernel.h:130
static DYN_FUNC Real integral(const Real r, const Real h, Real scale)
Definition Kernel.h:176
DYN_FUNC Real Gradient(const Real r, const Real h) override
Definition Kernel.h:142
static DYN_FUNC Real weight(const Real r, const Real h, Real scale)
Definition Kernel.h:71
DYN_FUNC ~SpikyKernel()
Definition Kernel.h:39
static DYN_FUNC Real integral(const Real r, const Real h, Real scale)
Definition Kernel.h:94
DYN_FUNC SpikyKernel()
Definition Kernel.h:38
DYN_FUNC Real integral(const Real r, const Real h) override
Definition Kernel.h:66
DYN_FUNC Real Gradient(const Real r, const Real h) override
Definition Kernel.h:53
static DYN_FUNC Real gradient(const Real r, const Real h, Real scale)
Definition Kernel.h:82
DYN_FUNC Real Weight(const Real r, const Real h) override
Definition Kernel.h:41
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
Definition Builder.h:33