1#include "AdaptiveBoundary.h"
2#include "Algorithm/CudaRand.h"
6//#include "Module/AdaptiveBoundaryConstraint.h"
8//#include "Topology/DistanceField3D.h"
9//#include "Topology/TriangleSet.h"
13 IMPLEMENT_TCLASS(AdaptiveBoundary, TDataType)
15 template<typename TDataType>
16 AdaptiveBoundary<TDataType>::AdaptiveBoundary()
19 this->varNormalFriction()->setValue(0.95);
20 this->varTangentialFriction()->setValue(0.0);
23 template<typename TDataType>
24 AdaptiveBoundary<TDataType>::~AdaptiveBoundary()
28 template<typename Real, typename Coord>
29 __global__ void K_ConstrainSDF(
33 DArray<Coord> posNormal,
35 Real tangentialFriction,
38 int pId = threadIdx.x + (blockIdx.x * blockDim.x);
39 if (pId >= posArr.size()) return;
41 Coord pos = posArr[pId];
42 Coord vec = velArr[pId];
44 Real dist = posSDF[pId];
45 Coord normal = posNormal[pId];
51 dist = 0.0001f*rGen.Generate();
53 pos -= (olddist + dist)*normal;
55 Real vlength = vec.norm();
56 Real vec_n = vec.dot(normal);
57 Coord vec_normal = vec_n * normal;
58 Coord vec_tan = vec - vec_normal;
59 if (vec_n > 0) vec_normal = -vec_normal;
60 vec_normal *= (1.0f - normalFriction);
61 vec = vec_normal + vec_tan * (1.0f - tangentialFriction);
62 //vec *= pow(Real(M_E), -dt*tangentialFriction);
63 //vec *= (1.0f - tangentialFriction);
70 template<typename TDataType>
71 void AdaptiveBoundary<TDataType>::updateStates()
73 Real dt = this->stateTimeStep()->getData();
75 auto aSDF = this->getBoundarys();
77 auto pSys = this->getParticleSystems();
79 DArray<Coord> pos_normal;
81 for (int i = 0; i < pSys.size(); i++)
83 DArray<Coord>& position = pSys[i]->statePosition()->getData();
84 DArray<Coord>& velocity = pSys[i]->stateVelocity()->getData();
85 for (int j = 0; j < aSDF.size(); j++)
87 aSDF[j]->stateSDFTopology()->constDataPtr()->getSignDistance(position, pos_sdf, pos_normal);
88 cuExecute(position.size(),
94 this->varNormalFriction()->getData(),
95 this->varTangentialFriction()->getData(),
100 auto triSys = this->getTriangularSystems();
101 for (int i = 0; i < triSys.size(); i++)
103 DArray<Coord>& position = triSys[i]->statePosition()->getData();
104 DArray<Coord>& velocity = triSys[i]->stateVelocity()->getData();
106 for (int j = 0; j < aSDF.size(); j++)
108 aSDF[j]->stateSDFTopology()->constDataPtr()->getSignDistance(position, pos_sdf, pos_normal);
109 cuExecute(position.size(),
115 this->varNormalFriction()->getData(),
116 this->varTangentialFriction()->getData(),
125 DEFINE_CLASS(AdaptiveBoundary);