PeriDyno 1.2.1
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 DYN_FUNC static inline Real weight(const Real r, const Real h, Real scale)
124 {
125 return Real(1) * scale;
126 }
127
128 DYN_FUNC static inline Real gradient(const Real r, const Real h, Real scale)
129 {
130 return Real(0) * scale;
131 }
132
133 DYN_FUNC static inline Real weightRR(const Real r, const Real h, Real scale)
134 {
135 return Real(0) * scale;
136 }
137
138 };
139
140
141 template<typename Real>
142 class SmoothKernel : public Kernel<Real>
143 {
144 public:
145 DYN_FUNC SmoothKernel() : Kernel<Real>() {};
146 DYN_FUNC ~SmoothKernel() {};
147
148 DYN_FUNC inline Real Weight(const Real r, const Real h) override
149 {
150// const Real q = r / h;
151// if (q > 1.0f) return 0.0f;
152// else {
153// return (1.0f - q*q) * this->m_scale;
154// }
155 return SmoothKernel<Real>::weight(r, h, this->m_scale);
156 }
157
158 DYN_FUNC inline Real Gradient(const Real r, const Real h) override
159 {
160// const Real q = r / h;
161// if (q > Real(1)) return Real(0);
162// else {
163// const Real hh = h*h;
164// const Real dd = Real(1) - q*q;
165// const Real alpha = 1.0f;// (Real) 945.0f / (32.0f * (Real)M_PI * hh *h);
166// return -alpha * dd* this->m_scale;
167// }
168 return SmoothKernel<Real>::gradient(r, h, this->m_scale);
169 }
170
171 DYN_FUNC static inline Real weight(const Real r, const Real h, const Real scale)
172 {
173 const Real q = r / h;
174 if (q > 1.0f) return 0.0f;
175 else {
176 return scale * (1.0f - q * q);
177 }
178 }
179
180 DYN_FUNC static inline Real gradient(const Real r, const Real h, const Real scale)
181 {
182 const Real q = r / h;
183 if (q > Real(1)) return Real(0);
184 else {
185 const Real hh = h * h;
186 const Real dd = Real(1) - q * q;
187 const Real alpha = 1.0f;// (Real) 945.0f / (32.0f * (Real)M_PI * hh *h);
188 return -alpha * dd* scale;
189 }
190 }
191
192 // Integral of f(x)r^2
193 DYN_FUNC static inline Real integral(const Real r, const Real h, Real scale)
194 {
195 const Real q = r / h;
196 if (q > Real(1)) return Real(0);
197 else {
198 const Real hh = h * h;
199 return 1.0 / (hh * h) * (Real(2) / 3 - q + q * q / Real(3));
200 }
201 }
202 };
203
204
205 //spiky kernel
206 template<typename Real>
207 class CorrectedKernel : public Kernel<Real>
208 {
209 public:
210 DYN_FUNC CorrectedKernel() : Kernel<Real>() {};
211 DYN_FUNC ~CorrectedKernel() {};
212
213 DYN_FUNC inline Real Weight(const Real r, const Real h) override
214 {
215 return CorrectedKernel<Real>::weight(r, h, this->m_scale);
216 }
217
218 DYN_FUNC inline Real Gradient(const Real r, const Real h) override
219 {
220 return CorrectedKernel<Real>::gradient(r, h, this->m_scale);
221 }
222
223 DYN_FUNC inline Real WeightRR(const Real r, const Real h)
224 {
225 return CorrectedKernel<Real>::weightRR(r, h, this->m_scale);
226 }
227
228 DYN_FUNC static inline Real weight(const Real r, const Real h, Real scale)
229 {
230 const Real q = r / h;
231 SmoothKernel<Real> kernSmooth;
232 return q*q*q*kernSmooth.Weight(r, h) * scale;
233 }
234
235 DYN_FUNC static inline Real gradient(const Real r, const Real h, Real scale)
236 {
237 const Real q = r / h;
238 SmoothKernel<Real> kernSmooth;
239 return q*q*kernSmooth.Weight(r, h)/h * scale;
240 }
241
242 DYN_FUNC static inline Real weightRR(const Real r, const Real h, Real scale)
243 {
244 const Real q = r / h;
245 SmoothKernel<Real> kernSmooth;
246 return q*kernSmooth.Weight(r, h) / (h*h) * scale;
247 }
248 };
249
250 //cubic kernel
251 template<typename Real>
252 class CubicKernel : public Kernel<Real>
253 {
254 public:
255 DYN_FUNC CubicKernel() : Kernel<Real>() {};
256 DYN_FUNC ~CubicKernel() {};
257
258 DYN_FUNC inline Real Weight(const Real r, const Real h) override
259 {
260 this->m_scale = 1.0f;
261 return CubicKernel<Real>::weight(r, h, this->m_scale);
262 }
263
264 DYN_FUNC inline Real Gradient(const Real r, const Real h) override
265 {
266 this->m_scale = 1.0f;
267 return CubicKernel<Real>::gradient(r, h, this->m_scale);
268 }
269
270 DYN_FUNC static inline Real weight(const Real r, const Real h, Real scale)
271 {
272 const Real hh = h*h;
273 const Real q = 2.0f*r / h;
274
275 const Real alpha = 3.0f / (2.0f * (Real)M_PI * hh * h) * scale;
276
277 if (q > 2.0f) return 0.0f;
278 else if (q >= 1.0f)
279 {
280 //1/6*(2-q)*(2-q)*(2-q)
281 const Real d = 2.0f - q;
282 return alpha / 6.0f*d*d*d;
283 }
284 else
285 {
286 //(2/3)-q*q+0.5f*q*q*q
287 const Real qq = q*q;
288 const Real qqq = qq*q;
289 return alpha*(2.0f / 3.0f - qq + 0.5f*qqq);
290 }
291 }
292
293 DYN_FUNC static inline Real gradient(const Real r, const Real h, Real scale)
294 {
295 const Real hh = h*h;
296 const Real q = 2.0f*r / h;
297
298 const Real alpha = 3.0f / (2.0f * (Real)M_PI * hh * h) * scale;
299
300 if (q > 2.0f) return Real(0);
301 else if (q >= 1.0f)
302 {
303 //-0.5*(2.0-q)*(2.0-q)
304 const Real d = 2.0f - q;
305 return -0.5f*alpha*d*d;
306 }
307 else
308 {
309 //-2q+1.5*q*q
310 const Real qq = q*q;
311 return alpha*(-2.0f*q + 1.5f*qq);
312 //return alpha*(-0.5);
313 }
314 }
315 };
316
317 template<typename Real>
318 class QuarticKernel : public Kernel<Real>
319 {
320 public:
321 DYN_FUNC QuarticKernel() : Kernel<Real>() {};
322 DYN_FUNC ~QuarticKernel() {};
323
324
325 DYN_FUNC inline Real Weight(const Real r, const Real h) override
326 {
327 return QuarticKernel<Real>::weight(r, h, this->m_scale);
328 }
329
330 DYN_FUNC inline Real Gradient(const Real r, const Real h) override
331 {
332 return QuarticKernel<Real>::gradient(r, h, this->m_scale);
333 }
334
335 DYN_FUNC static inline Real weight(const Real r, const Real h, Real scale)
336 {
337 const Real hh = h*h;
338 const Real q = 2.5f*r / h;
339 if (q > 2.5) return 0.0f;
340 else if (q > 1.5f)
341 {
342 const Real d = 2.5f - q;
343 const Real dd = d*d;
344 return 0.0255f*dd*dd / hh * scale;
345 }
346 else if (q > 0.5f)
347 {
348 const Real d = 2.5f - q;
349 const Real t = 1.5f - q;
350 const Real dd = d*d;
351 const Real tt = t*t;
352 return 0.0255f*(dd*dd - 5.0f*tt*tt) / hh * scale;
353 }
354 else
355 {
356 const Real d = 2.5f - q;
357 const Real t = 1.5f - q;
358 const Real w = 0.5f - q;
359 const Real dd = d*d;
360 const Real tt = t*t;
361 const Real ww = w*w;
362 return 0.0255f*(dd*dd - 5.0f*tt*tt + 10.0f*ww*ww) / hh * scale;
363 }
364 }
365
366 DYN_FUNC static inline Real gradient(const Real r, const Real h, Real scale)
367 {
368 const Real hh = h*h;
369 const Real q = 2.5f*r / h;
370 if (q > 2.5) return 0.0f;
371 else if (q > 1.5f)
372 {
373 //0.102*(2.5-q)^3
374 const Real d = 2.5f - q;
375 return -0.102f*d*d*d / hh * scale;
376 }
377 else if (q > 0.5f)
378 {
379 const Real d = 2.5f - q;
380 const Real t = 1.5f - q;
381 return -0.102f*(d*d*d - 5.0f*t*t*t) / hh * scale;
382 }
383 else
384 {
385 const Real d = 2.5f - q;
386 const Real t = 1.5f - q;
387 const Real w = 0.5f - q;
388 return -0.102f*(d*d*d - 5.0f*t*t*t + 10.0f*w*w*w) / hh * scale;
389 }
390 }
391 };
392
393 template<typename Real>
394 class CorrectedQuaticKernel : public Kernel<Real>
395 {
396 public:
399
400 DYN_FUNC inline Real Weight(const Real r, const Real h) override
401 {
403 }
404
405 DYN_FUNC inline Real Gradient(const Real r, const Real h) override
406 {
408 }
409
410 DYN_FUNC static inline Real weight(const Real r, const Real h, Real scale)
411 {
412 const float q = r / h;
413 if (q > 1.0f) return 0.0f;
414 else {
415 const float d = 1.0f - q;
416 const float hh = h * h;
417 return (1.0 - glm::pow(q, 4.0f)) * scale;
418 }
419 }
420
421 DYN_FUNC static inline Real gradient(const float r, const float h, Real scale)
422 {
423 float w = CorrectedQuaticKernel<Real>::weight(r, h, scale);
424 const float q = r / h;
425 if (q < 0.4f)
426 {
427 return scale * w / (0.4f * h);
428 }
429 return scale * w / r;
430 }
431
432 DYN_FUNC static inline Real weightRR(const float r, const float h, Real scale)
433 {
434 float w = CorrectedQuaticKernel<Real>::weight(r, h, scale);
435 const float q = r / h;
436 if (q < 0.4f)
437 {
438 return scale * w / (0.16f * h * h);
439 }
440 return scale * w / r / r;
441 }
442
443 };
444
445 template<typename Real>
446 class WendlandC2Kernel : public Kernel<Real>
447 {
448 public:
449 DYN_FUNC WendlandC2Kernel() : Kernel<Real>() {};
450 DYN_FUNC ~WendlandC2Kernel() {};
451
452 DYN_FUNC inline Real Weight(const Real r, const Real h) override
453 {
454 return WendlandC2Kernel<Real>::weight(r, h, this->m_scale);
455 }
456
457 DYN_FUNC inline Real Gradient(const Real r, const Real h) override
458 {
459 return WendlandC2Kernel<Real>::gradient(r, h, this->m_scale);
460 }
461
462 DYN_FUNC static inline Real weight(const Real r, const Real h, Real scale)
463 {
464 Real alpha = 12.0 / (2.0 * M_PI);
465 const float q = r / h;
466 if (q > 1.0f) return 0.0f;
467 else {
468 Real p = 1.0 - q;
469 return alpha * glm::pow(p, 4.0) * (1 + 4 * q) * scale;
470 }
471 }
472
473 DYN_FUNC static inline Real gradient(const float r, const float h, Real scale)
474 {
475 Real alpha = 12.0 / (2.0 * M_PI);
476 const float q = r / h;
477 if (q > 1.0f) return 0.0f;
478 else {
479 Real p = 1.0 - q;
480 Real p3 = glm::pow(p, 3.0);
481 return scale * 4 * alpha * (p * p3 - p3 * (1 + 4 * q));
482 }
483
484 }
485
486
487 };
488
489 template<typename Real>
490 class CorrectedMPSKernel : public Kernel<Real>
491 {
492 public:
493 DYN_FUNC CorrectedMPSKernel() : Kernel<Real>() {};
494 DYN_FUNC ~CorrectedMPSKernel() {};
495
496 DYN_FUNC inline Real Weight(const Real r, const Real h) override
497 {
498 return CorrectedMPSKernel<Real>::weight(r, h, this->m_scale);
499 }
500
501 DYN_FUNC inline Real Gradient(const Real r, const Real h) override
502 {
504 }
505
506 DYN_FUNC inline Real WeightRR(const Real r, const Real h)
507 {
509 }
510
511 DYN_FUNC static inline Real weight(const Real r, const Real h, Real scale)
512 {
513 const Real q = r / h;
514 if (q > 1.0f) return 0.0f;
515 else {
516 //const float d = 1.0f - q;
517 //const float hh = h * h;
518 return (1.0 - glm::pow(q, 4.0f));
519 }
520 }
521
522 DYN_FUNC static inline Real gradient(const Real r, const Real h, Real scale)
523 {
524 float w = CorrectedMPSKernel<Real>::weight(r, h, scale);
525 const float q = r / h;
526 if (q < 0.4f)
527 {
528 return w / (0.4f * h);
529 }
530 return w / r;
531 }
532
533 DYN_FUNC static inline Real weightRR(const Real r, const Real h, Real scale)
534 {
535 float w = CorrectedMPSKernel<Real>::weight(r, h, scale);
536 const float q = r / h;
537 if (q < 0.4f)
538 {
539 return w / (0.16f * h * h);
540 }
541 return w / r / r;
542 }
543 };
544}
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
static DYN_FUNC Real weight(const Real r, const Real h, Real scale)
Definition Kernel.h:123
static DYN_FUNC Real gradient(const Real r, const Real h, Real scale)
Definition Kernel.h:128
static DYN_FUNC Real weightRR(const Real r, const Real h, Real scale)
Definition Kernel.h:133
static DYN_FUNC Real weight(const Real r, const Real h, Real scale)
Definition Kernel.h:228
static DYN_FUNC Real gradient(const Real r, const Real h, Real scale)
Definition Kernel.h:235
DYN_FUNC Real Weight(const Real r, const Real h) override
Definition Kernel.h:213
DYN_FUNC ~CorrectedKernel()
Definition Kernel.h:211
DYN_FUNC Real Gradient(const Real r, const Real h) override
Definition Kernel.h:218
DYN_FUNC CorrectedKernel()
Definition Kernel.h:210
static DYN_FUNC Real weightRR(const Real r, const Real h, Real scale)
Definition Kernel.h:242
DYN_FUNC Real WeightRR(const Real r, const Real h)
Definition Kernel.h:223
static DYN_FUNC Real weightRR(const Real r, const Real h, Real scale)
Definition Kernel.h:533
DYN_FUNC Real Gradient(const Real r, const Real h) override
Definition Kernel.h:501
static DYN_FUNC Real gradient(const Real r, const Real h, Real scale)
Definition Kernel.h:522
static DYN_FUNC Real weight(const Real r, const Real h, Real scale)
Definition Kernel.h:511
DYN_FUNC CorrectedMPSKernel()
Definition Kernel.h:493
DYN_FUNC ~CorrectedMPSKernel()
Definition Kernel.h:494
DYN_FUNC Real Weight(const Real r, const Real h) override
Definition Kernel.h:496
DYN_FUNC Real WeightRR(const Real r, const Real h)
Definition Kernel.h:506
DYN_FUNC Real Gradient(const Real r, const Real h) override
Definition Kernel.h:405
DYN_FUNC CorrectedQuaticKernel()
Definition Kernel.h:397
static DYN_FUNC Real weight(const Real r, const Real h, Real scale)
Definition Kernel.h:410
static DYN_FUNC Real weightRR(const float r, const float h, Real scale)
Definition Kernel.h:432
DYN_FUNC ~CorrectedQuaticKernel()
Definition Kernel.h:398
DYN_FUNC Real Weight(const Real r, const Real h) override
Definition Kernel.h:400
static DYN_FUNC Real gradient(const float r, const float h, Real scale)
Definition Kernel.h:421
DYN_FUNC Real Gradient(const Real r, const Real h) override
Definition Kernel.h:264
static DYN_FUNC Real weight(const Real r, const Real h, Real scale)
Definition Kernel.h:270
DYN_FUNC Real Weight(const Real r, const Real h) override
Definition Kernel.h:258
DYN_FUNC ~CubicKernel()
Definition Kernel.h:256
DYN_FUNC CubicKernel()
Definition Kernel.h:255
static DYN_FUNC Real gradient(const Real r, const Real h, Real scale)
Definition Kernel.h:293
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:330
static DYN_FUNC Real weight(const Real r, const Real h, Real scale)
Definition Kernel.h:335
static DYN_FUNC Real gradient(const Real r, const Real h, Real scale)
Definition Kernel.h:366
DYN_FUNC QuarticKernel()
Definition Kernel.h:321
DYN_FUNC ~QuarticKernel()
Definition Kernel.h:322
DYN_FUNC Real Weight(const Real r, const Real h) override
Definition Kernel.h:325
static DYN_FUNC Real gradient(const Real r, const Real h, const Real scale)
Definition Kernel.h:180
static DYN_FUNC Real weight(const Real r, const Real h, const Real scale)
Definition Kernel.h:171
DYN_FUNC SmoothKernel()
Definition Kernel.h:145
DYN_FUNC Real Weight(const Real r, const Real h) override
Definition Kernel.h:148
DYN_FUNC ~SmoothKernel()
Definition Kernel.h:146
static DYN_FUNC Real integral(const Real r, const Real h, Real scale)
Definition Kernel.h:193
DYN_FUNC Real Gradient(const Real r, const Real h) override
Definition Kernel.h:158
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
static DYN_FUNC Real weight(const Real r, const Real h, Real scale)
Definition Kernel.h:462
DYN_FUNC Real Gradient(const Real r, const Real h) override
Definition Kernel.h:457
DYN_FUNC ~WendlandC2Kernel()
Definition Kernel.h:450
DYN_FUNC WendlandC2Kernel()
Definition Kernel.h:449
static DYN_FUNC Real gradient(const float r, const float h, Real scale)
Definition Kernel.h:473
DYN_FUNC Real Weight(const Real r, const Real h) override
Definition Kernel.h:452
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
Definition Builder.h:33