1 /*========================================================================= 2 3 Program: Visualization Toolkit 4 Module: vtkWendlandQuinticKernel.h 5 6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 7 All rights reserved. 8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 9 10 This software is distributed WITHOUT ANY WARRANTY; without even 11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 12 PURPOSE. See the above copyright notice for more information. 13 14 =========================================================================*/ 15 /** 16 * @class vtkWendlandQuinticKernel 17 * @brief a quintic SPH interpolation kernel 18 * 19 * 20 * vtkWendlandQuinticKernel is an smooth particle hydrodynamics interpolation kernel as 21 * described by D.J. Price. This is a quintic formulation. 22 * 23 * @warning 24 * FOr more information see D.J. Price, Smoothed particle hydrodynamics and 25 * magnetohydrodynamics, J. Comput. Phys. 231:759-794, 2012. Especially 26 * equation 49. 27 * 28 * @par Acknowledgments: 29 * The following work has been generously supported by Altair Engineering 30 * and FluiDyna GmbH. Please contact Steve Cosgrove or Milos Stanic for 31 * more information. 32 * 33 * @sa 34 * vtkSPHKernel vtkSPHInterpolator 35 */ 36 37 #ifndef vtkWendlandQuinticKernel_h 38 #define vtkWendlandQuinticKernel_h 39 40 #include "vtkFiltersPointsModule.h" // For export macro 41 #include "vtkSPHKernel.h" 42 #include <algorithm> // For std::min() 43 44 class vtkIdList; 45 class vtkDoubleArray; 46 47 48 class VTKFILTERSPOINTS_EXPORT vtkWendlandQuinticKernel : public vtkSPHKernel 49 { 50 public: 51 //@{ 52 /** 53 * Standard methods for instantiation, obtaining type information, and printing. 54 */ 55 static vtkWendlandQuinticKernel *New(); 56 vtkTypeMacro(vtkWendlandQuinticKernel,vtkSPHKernel); 57 void PrintSelf(ostream& os, vtkIndent indent) override; 58 //@} 59 60 /** 61 * Produce the computational parameters for the kernel. Invoke this method 62 * after setting initial values like SpatialStep. 63 */ 64 void Initialize(vtkAbstractPointLocator *loc, vtkDataSet *ds, 65 vtkPointData *pd) override; 66 67 //@{ 68 /** 69 * Compute weighting factor given a normalized distance from a sample point. 70 * Note that the formulation is slightly different to avoid an extra operation 71 * (which has the effect of affecting the NormFactor by 1/16). 72 */ ComputeFunctionWeight(const double d)73 double ComputeFunctionWeight(const double d) override 74 { 75 if ( d >= 2.0 ) 76 { 77 return 0.0; 78 } 79 else 80 { 81 double tmp = 1.0 - 0.5*d; 82 return (tmp*tmp*tmp*tmp) * (1.0 + 2.0*d); 83 } 84 } 85 //@} 86 87 //@{ 88 /** 89 * Compute weighting factor for derivative quantities given a normalized 90 * distance from a sample point. 91 */ ComputeDerivWeight(const double d)92 double ComputeDerivWeight(const double d) override 93 { 94 if ( d >= 2.0 ) 95 { 96 return 0.0; 97 } 98 else 99 { 100 double tmp = 1.0 - 0.5*d; 101 return -2.0*(tmp*tmp*tmp) * (1.0 + 2.0*d) + 102 2.0*(tmp*tmp*tmp*tmp); 103 } 104 } 105 //@} 106 107 protected: 108 vtkWendlandQuinticKernel(); 109 ~vtkWendlandQuinticKernel() override; 110 111 private: 112 vtkWendlandQuinticKernel(const vtkWendlandQuinticKernel&) = delete; 113 void operator=(const vtkWendlandQuinticKernel&) = delete; 114 }; 115 116 #endif 117