PeriDyno 1.0.0
Loading...
Searching...
No Matches
SemiAnalyticalSFINode.cpp
Go to the documentation of this file.
3
4//#include "PBFM.h"
7#include "ParticleSystem/ParticleSystem.h"
8
9#include "ParticleSystem/Module/ParticleIntegrator.h"
11
12#include "Collision/NeighborPointQuery.h"
14
16
18
20
21namespace dyno
22{
24
25 template<typename TDataType>
27 : ParticleFluid<TDataType>()
28 {
29 //Clear the animation pipeline in ParticleFluid
30 this->animationPipeline()->clear();
31
32 auto smoothingLength = std::make_shared<FloatingNumber<TDataType>>();
33 smoothingLength->setName("Smoothing Length");
34 smoothingLength->varValue()->setValue(Real(0.012));
35 this->animationPipeline()->pushModule(smoothingLength);
36
37 auto samplingDistance = std::make_shared<FloatingNumber<TDataType>>();
38 samplingDistance->setName("Sampling Distance");
39 samplingDistance->varValue()->setValue(Real(0.005));
40 this->animationPipeline()->pushModule(samplingDistance);
41
42 //integrator
43 auto integrator = std::make_shared<ParticleIntegrator<TDataType>>();
44 this->stateTimeStep()->connect(integrator->inTimeStep());
45 this->statePosition()->connect(integrator->inPosition());
46 this->stateVelocity()->connect(integrator->inVelocity());
47 this->animationPipeline()->pushModule(integrator);
48
49 //neighbor query
50 auto nbrQuery = std::make_shared<NeighborPointQuery<TDataType>>();
51 smoothingLength->outFloating()->connect(nbrQuery->inRadius());
52 this->statePosition()->connect(nbrQuery->inPosition());
53 this->animationPipeline()->pushModule(nbrQuery);
54
55 //triangle neighbor
56 auto nbrQueryTri = std::make_shared<NeighborTriangleQuery<TDataType>>();
57 smoothingLength->outFloating()->connect(nbrQueryTri->inRadius());
58 this->statePosition()->connect(nbrQueryTri->inPosition());
59 this->inTriangleSet()->connect(nbrQueryTri->inTriangleSet());
60 this->animationPipeline()->pushModule(nbrQueryTri);
61
62 //mesh collision
63 auto meshCollision = std::make_shared<TriangularMeshConstraint<TDataType>>();
64 this->stateTimeStep()->connect(meshCollision->inTimeStep());
65 this->statePosition()->connect(meshCollision->inPosition());
66 this->stateVelocity()->connect(meshCollision->inVelocity());
67// this->stateTriangleVertex()->connect(meshCollision->inTriangleVertex());
68// this->stateTriangleIndex()->connect(meshCollision->inTriangleIndex());
69 this->inTriangleSet()->connect(meshCollision->inTriangleSet());
70 nbrQueryTri->outNeighborIds()->connect(meshCollision->inTriangleNeighborIds());
71 this->animationPipeline()->pushModule(meshCollision);
72
73 //viscosity
74 auto viscosity = std::make_shared<ImplicitViscosity<TDataType>>();
75 viscosity->varViscosity()->setValue(Real(0.5));//0.5
76 this->stateTimeStep()->connect(viscosity->inTimeStep());
77 smoothingLength->outFloating()->connect(viscosity->inSmoothingLength());
78 samplingDistance->outFloating()->connect(viscosity->inSamplingDistance());
79 this->statePosition()->connect(viscosity->inPosition());
80 this->stateVelocity()->connect(viscosity->inVelocity());
81 nbrQuery->outNeighborIds()->connect(viscosity->inNeighborIds());
82 this->animationPipeline()->pushModule(viscosity);
83
84 //particle shifting
85 auto pshiftModule = std::make_shared<SemiAnalyticalParticleShifting<TDataType>>();
86 samplingDistance->outFloating()->connect(pshiftModule->inSamplingDistance());
87 smoothingLength->outFloating()->connect(pshiftModule->inSmoothingLength());
88 this->stateTimeStep()->connect(pshiftModule->inTimeStep());
89 this->statePosition()->connect(pshiftModule->inPosition());
90 this->stateVelocity()->connect(pshiftModule->inVelocity());
91 nbrQuery->outNeighborIds()->connect(pshiftModule->inNeighborIds());
92 this->inTriangleSet()->connect(pshiftModule->inTriangleSet());
93// this->stateTriangleVertex()->connect(pshiftModule->inTriangleVer());
94// this->stateTriangleIndex()->connect(pshiftModule->inTriangleInd());
95// this->stateAttribute()->connect(pshiftModule->inAttribute());
96 nbrQueryTri->outNeighborIds()->connect(pshiftModule->inNeighborTriIds());
97 this->animationPipeline()->pushModule(pshiftModule);
98
99 this->setDt(0.001f);
100 }
101
102 template<typename TDataType>
107
108 template<typename TDataType>
110 {
111 auto inBoundary = this->inTriangleSet()->getDataPtr();
112 bool validateBoundary = inBoundary != nullptr && !inBoundary->isEmpty();
113
114 bool ret = Node::validateInputs();
115
116 return ret && validateBoundary;
117 }
118
119 template<typename TDataType>
121 {
122 if (this->varFast()->getData() == true)
123 {
124 this->animationPipeline()->clear();
125 auto pbd = std::make_shared<SemiAnalyticalPositionBasedFluidModel<DataType3f>>();
126 pbd->varSmoothingLength()->setValue(0.0085);
127
128 this->animationPipeline()->clear();
129 this->stateTimeStep()->connect(pbd->inTimeStep());
130 this->statePosition()->connect(pbd->inPosition());
131 this->stateVelocity()->connect(pbd->inVelocity());
132 this->inTriangleSet()->connect(pbd->inTriangleSet());
133 this->animationPipeline()->pushModule(pbd);
134 }
135
137 }
138
139 template<typename TDataType>
144
145 template<typename TDataType>
150
152}
#define DEFINE_CLASS(name)
Definition Object.h:140
#define IMPLEMENT_TCLASS(name, T1)
Definition Object.h:103
void setDt(Real dt)
Definition Node.cpp:98
std::shared_ptr< AnimationPipeline > animationPipeline()
Definition Node.cpp:311
virtual bool validateInputs()
Definition Node.cpp:219
void postUpdateStates() override
void preUpdateStates() override
void resetStates() override
Semi-Analytical Solid Fluid Interaction.
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25