PeriDyno 1.0.0
Loading...
Searching...
No Matches
PJSoftConstraintSolver.cu
Go to the documentation of this file.
1#include "PJSoftConstraintSolver.h"
2#include "SharedFuncsForRigidBody.h"
3
4namespace dyno
5{
6 IMPLEMENT_TCLASS(PJSoftConstraintSolver, TDataType)
7
8 template<typename TDataType>
9 PJSoftConstraintSolver<TDataType>::PJSoftConstraintSolver()
10 :ConstraintModule()
11 {
12 this->inContacts()->tagOptional(true);
13 }
14
15 template<typename TDataType>
16 PJSoftConstraintSolver<TDataType>::~PJSoftConstraintSolver()
17 {
18 }
19
20 template<typename TDataType>
21 void PJSoftConstraintSolver<TDataType>::initializeJacobian(Real dt)
22 {
23 int constraint_size = 0;
24 int contact_size = this->inContacts()->size();
25
26 auto topo = this->inDiscreteElements()->constDataPtr();
27
28 int ballAndSocketJoint_size = topo->ballAndSocketJoints().size();
29 int sliderJoint_size = topo->sliderJoints().size();
30 int hingeJoint_size = topo->hingeJoints().size();
31 int fixedJoint_size = topo->fixedJoints().size();
32 int pointJoint_size = topo->pointJoints().size();
33
34 if (this->varFrictionEnabled()->getData())
35 {
36 constraint_size += 3 * contact_size;
37 }
38 else
39 {
40 constraint_size = contact_size;
41 }
42
43 if (ballAndSocketJoint_size != 0)
44 {
45 constraint_size += 3 * ballAndSocketJoint_size;
46 }
47
48 if (sliderJoint_size != 0)
49 {
50 constraint_size += 8 * sliderJoint_size;
51 }
52
53 if (hingeJoint_size != 0)
54 {
55 constraint_size += 8 * hingeJoint_size;
56 }
57
58 if (fixedJoint_size != 0)
59 {
60 constraint_size += 6 * fixedJoint_size;
61 }
62
63 if (pointJoint_size != 0)
64 {
65 constraint_size += 3 * pointJoint_size;
66 }
67
68 if (constraint_size == 0)
69 {
70 return;
71 }
72
73 mVelocityConstraints.resize(constraint_size);
74
75 if (contact_size != 0)
76 {
77 if (mContactsInLocalFrame.size() != this->inContacts()->size()) {
78 mContactsInLocalFrame.resize(this->inContacts()->size());
79 }
80
81 setUpContactsInLocalFrame(
82 mContactsInLocalFrame,
83 this->inContacts()->getData(),
84 this->inCenter()->getData(),
85 this->inRotationMatrix()->getData()
86 );
87
88 auto& contacts = this->inContacts()->getData();
89 setUpContactAndFrictionConstraints(
90 mVelocityConstraints,
91 mContactsInLocalFrame,
92 this->inCenter()->getData(),
93 this->inRotationMatrix()->getData(),
94 this->varFrictionEnabled()->getData()
95 );
96 }
97
98 if (ballAndSocketJoint_size != 0)
99 {
100 auto& joints = topo->ballAndSocketJoints();
101 int begin_index = contact_size;
102
103 if (this->varFrictionEnabled()->getData())
104 {
105 begin_index += 2 * contact_size;
106 }
107
108 setUpBallAndSocketJointConstraints(
109 mVelocityConstraints,
110 joints,
111 this->inCenter()->getData(),
112 this->inRotationMatrix()->getData(),
113 begin_index
114 );
115 }
116
117 if (sliderJoint_size != 0)
118 {
119 auto& joints = topo->sliderJoints();
120 int begin_index = contact_size;
121
122 if (this->varFrictionEnabled()->getData())
123 {
124 begin_index += 2 * contact_size;
125 }
126 begin_index += 3 * ballAndSocketJoint_size;
127 setUpSliderJointConstraints(
128 mVelocityConstraints,
129 joints,
130 this->inCenter()->getData(),
131 this->inRotationMatrix()->getData(),
132 this->inQuaternion()->getData(),
133 begin_index
134 );
135 }
136
137 if (hingeJoint_size != 0)
138 {
139 auto& joints = topo->hingeJoints();
140 int begin_index = contact_size + 3 * ballAndSocketJoint_size + 8 * sliderJoint_size;
141 if (this->varFrictionEnabled()->getData())
142 {
143 begin_index += 2 * contact_size;
144 }
145 setUpHingeJointConstraints(
146 mVelocityConstraints,
147 joints,
148 this->inCenter()->getData(),
149 this->inRotationMatrix()->getData(),
150 this->inQuaternion()->getData(),
151 begin_index
152 );
153 }
154
155 if (fixedJoint_size != 0)
156 {
157 auto& joints = topo->fixedJoints();
158 int begin_index = contact_size + 3 * ballAndSocketJoint_size + 8 * sliderJoint_size + 8 * hingeJoint_size;
159 if (this->varFrictionEnabled()->getData())
160 {
161 begin_index += 2 * contact_size;
162 }
163 setUpFixedJointConstraints(
164 mVelocityConstraints,
165 joints,
166 this->inRotationMatrix()->getData(),
167 this->inQuaternion()->getData(),
168 begin_index
169 );
170 }
171
172 if (pointJoint_size != 0)
173 {
174 auto& joints = topo->pointJoints();
175 int begin_index = contact_size + 3 * ballAndSocketJoint_size + 8 * sliderJoint_size + 8 * hingeJoint_size + 6 * fixedJoint_size;
176 if (this->varFrictionEnabled()->getData())
177 {
178 begin_index += 2 * contact_size;
179 }
180 setUpPointJointConstraints(
181 mVelocityConstraints,
182 joints,
183 this->inCenter()->getData(),
184 begin_index
185 );
186 }
187
188 auto sizeOfRigids = this->inCenter()->size();
189 mContactNumber.resize(sizeOfRigids);
190
191 mJ.resize(4 * constraint_size);
192 mB.resize(4 * constraint_size);
193 mK_1.resize(constraint_size);
194 mK_2.resize(constraint_size);
195 mK_3.resize(constraint_size);
196 mEta.resize(constraint_size);
197 mLambda.resize(constraint_size);
198
199 mJ.reset();
200 mB.reset();
201 mK_1.reset();
202 mK_2.reset();
203 mK_3.reset();
204 mEta.reset();
205 mLambda.reset();
206
207 mContactNumber.reset();
208
209 calculateJacobianMatrix(
210 mJ,
211 mB,
212 this->inCenter()->getData(),
213 this->inInertia()->getData(),
214 this->inMass()->getData(),
215 this->inRotationMatrix()->getData(),
216 mVelocityConstraints
217 );
218
219 calculateK(
220 mVelocityConstraints,
221 mJ,
222 mB,
223 this->inCenter()->getData(),
224 this->inInertia()->getData(),
225 this->inMass()->getData(),
226 mK_1,
227 mK_2,
228 mK_3
229 );
230
231 calculateEtaVectorForPJSoft(
232 mEta,
233 mJ,
234 this->inVelocity()->getData(),
235 this->inAngularVelocity()->getData(),
236 this->inCenter()->getData(),
237 this->inQuaternion()->getData(),
238 mVelocityConstraints,
239 this->varSlop()->getValue(),
240 this->varDampingRatio()->getValue(),
241 this->varHertz()->getData(),
242 1.0,
243 dt
244 );
245
246 if (contact_size != 0)
247 {
248 calculateContactPoints(
249 this->inContacts()->getData(),
250 mContactNumber);
251 }
252 }
253
254 template<typename TDataType>
255 void PJSoftConstraintSolver<TDataType>::constrain()
256 {
257 uint bodyNum = this->inCenter()->size();
258
259 auto topo = this->inDiscreteElements()->constDataPtr();
260
261 mImpulseC.resize(bodyNum * 2);
262 mImpulseExt.resize(bodyNum * 2);
263 mImpulseC.reset();
264 mImpulseExt.reset();
265
266 Real dt = this->inTimeStep()->getData();
267
268 if (this->varGravityEnabled()->getValue())
269 {
270 setUpGravity(
271 mImpulseExt,
272 this->varGravityValue()->getValue(),
273 dt
274 );
275 }
276
277
278 updateVelocity(
279 this->inAttribute()->getData(),
280 this->inVelocity()->getData(),
281 this->inAngularVelocity()->getData(),
282 mImpulseExt,
283 this->varLinearDamping()->getValue(),
284 this->varAngularDamping()->getValue(),
285 dt
286 );
287
288 if (!this->inContacts()->isEmpty() || topo->totalJointSize() > 0)
289 {
290 initializeJacobian(dt);
291 int constraint_size = mVelocityConstraints.size();
292 for (int i = 0; i < this->varIterationNumberForVelocitySolver()->getValue(); i++)
293 {
294 JacobiIterationForSoft(
295 mLambda,
296 mImpulseC,
297 mJ,
298 mB,
299 mEta,
300 mVelocityConstraints,
301 mContactNumber,
302 mK_1,
303 mK_2,
304 mK_3,
305 this->inMass()->getData(),
306 this->inFrictionCoefficients()->getData(),
307 this->varGravityValue()->getValue(),
308 dt,
309 this->varDampingRatio()->getValue(),
310 this->varHertz()->getValue()
311 );
312 }
313 }
314
315 updateVelocity(
316 this->inAttribute()->getData(),
317 this->inVelocity()->getData(),
318 this->inAngularVelocity()->getData(),
319 mImpulseC,
320 this->varLinearDamping()->getValue(),
321 this->varAngularDamping()->getValue(),
322 dt
323 );
324
325 updateGesture(
326 this->inAttribute()->getData(),
327 this->inCenter()->getData(),
328 this->inQuaternion()->getData(),
329 this->inRotationMatrix()->getData(),
330 this->inInertia()->getData(),
331 this->inVelocity()->getData(),
332 this->inAngularVelocity()->getData(),
333 this->inInitialInertia()->getData(),
334 dt
335 );
336 }
337
338 DEFINE_CLASS(PJSoftConstraintSolver);
339}