UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
GaussSeidelMainConstraint.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
6#include "ChaosStats.h"
13
14
15#define PERF_SCOPE(X) SCOPE_CYCLE_COUNTER(X); TRACE_CPUPROFILER_EVENT_SCOPE(X);
16DECLARE_CYCLE_STAT(TEXT("Chaos.Deformable.GSMainConstraint.Apply"), STAT_ChaosGSMainConstraint_Apply, STATGROUP_Chaos);
17DECLARE_CYCLE_STAT(TEXT("Chaos.Deformable.GSMainConstraint.Acceleration"), STAT_ChaosGSMainConstraint_Acceleration, STATGROUP_Chaos);
18DECLARE_CYCLE_STAT(TEXT("Chaos.Deformable.GSMainConstraint.Init"), STAT_ChaosGSMainConstraint_Init, STATGROUP_Chaos);
19DECLARE_CYCLE_STAT(TEXT("Chaos.Deformable.GSMainConstraint.InitTransientColor"), STAT_ChaosGSMainConstraint_InitTransientColor, STATGROUP_Chaos);
20DECLARE_CYCLE_STAT(TEXT("Chaos.Deformable.GSMainConstraint.InitDynamicColor"), STAT_ChaosGSMainConstraint_InitDynamicColor, STATGROUP_Chaos);
21
23
24namespace Chaos::Softs
25{
26 template <typename T, typename ParticleType>
28 {
29
30 public:
32 const ParticleType& InParticles,
33 const bool bDoQuasistaticsIn = false,
34 const bool bDoSORIn = true,
35 const T InOmegaSOR = (T)1.6,
36 const int32 ParallelMaxIn = 1000,
37 const T MaxDxRatioIn = T(1),
39 : bDoQuasistatics(bDoQuasistaticsIn)
40 , bDoAcceleration(bDoSORIn)
41 , OmegaSOR(InOmegaSOR)
42 , ParallelMax(ParallelMaxIn)
43 , CorotatedParams(InParams)
44 {
45 Resize((int32)InParticles.Size());
46
47 InitializeLambdas();
48
49 TVec3<T> MaxCoord((T)100.), MinCoord((T)-100.);
50 for (int32 i = 0; i < (int32)InParticles.Size(); i++)
51 {
52 for (int32 j = 0; j < 3; j++)
53 {
54 if (InParticles.X(i)[j] < MinCoord[j])
55 {
56 MinCoord[j] = InParticles.X(i)[j];
57 }
58 if (InParticles.X(i)[j] > MaxCoord[j])
59 {
60 MaxCoord[j] = InParticles.X(i)[j];
61 }
62 }
63 }
64 MaxDxSize = (MaxCoord - MinCoord).Size() * MaxDxRatioIn;
65 }
66
68
69 void Resize(const int32 NewSize)
70 {
71 xtilde.SetNum(NewSize);
72 StaticIncidentElements.SetNum(NewSize);
73 StaticIncidentElementsLocal.SetNum(NewSize);
74 DynamicIncidentElements.SetNum(NewSize);
75 DynamicIncidentElementsLocal.SetNum(NewSize);
76 TransientIncidentElements.SetNum(NewSize);
77 TransientIncidentElementsLocal.SetNum(NewSize);
78 X_k_1.Init(TVector<T, 3>(T(0.)), NewSize);
79 X_k.Init(TVector<T, 3>(T(0.)), NewSize);
80 }
81
82 const TArray<TFunction<void(const ParticleType&, const int32, const int32, const T, TVec3<T>&, Chaos::PMatrix<T, 3, 3>&)>>& StaticConstraintResidualAndHessian() const { return AddStaticConstraintResidualAndHessian; }
83 TArray<TFunction<void(const ParticleType&, const int32, const int32, const T, TVec3<T>&, Chaos::PMatrix<T, 3, 3>&)>>& StaticConstraintResidualAndHessian() { return AddStaticConstraintResidualAndHessian; }
84 const TArray<TFunction<void(const ParticleType&, const int32, const int32, const T, TVec3<T>&, Chaos::PMatrix<T, 3, 3>&)>>& TransientConstraintResidualAndHessian() const { return AddTransientConstraintResidualAndHessian; }
85 TArray<TFunction<void(const ParticleType&, const int32, const int32, const T, TVec3<T>&, Chaos::PMatrix<T, 3, 3>&)>>& TransientConstraintResidualAndHessian() { return AddTransientConstraintResidualAndHessian; }
86 const TArray<TFunction<void(const ParticleType&, const int32, const int32, const T, TVec3<T>&, Chaos::PMatrix<T, 3, 3>&)>>& DynamicConstraintResidualAndHessian() const { return AddDynamicConstraintResidualAndHessian; }
87 TArray<TFunction<void(const ParticleType&, const int32, const int32, const T, TVec3<T>&, Chaos::PMatrix<T, 3, 3>&)>>& DynamicConstraintResidualAndHessian() { return AddDynamicConstraintResidualAndHessian; }
88 const TArray<TFunction<void(const int32, const T, Chaos::PMatrix<T, 3, 3>&)>>& PerNodeHessian() const { return AddPerNodeHessian; }
89 TArray<TFunction<void(const int32, const T, Chaos::PMatrix<T, 3, 3>&)>>& PerNodeHessian() { return AddPerNodeHessian; }
90 const TArray<TFunction<void(const ParticleType&, const TArray<TVec3<T>>&, TArray<TVec3<T>>&)>>& InternalForceDifferentials() const { return AddInternalForceDifferentials; }
91 TArray<TFunction<void(const ParticleType&, const TArray<TVec3<T>>&, TArray<TVec3<T>>&)>>& InternalForceDifferentials() { return AddInternalForceDifferentials; }
92
94 {
95 int32 CurrentSize = AddStaticConstraintResidualAndHessian.Num();
96 AddStaticConstraintResidualAndHessian.AddDefaulted(NumConstraints);
97 return CurrentSize;
98 }
99
101 {
102 int32 CurrentSize = AddTransientConstraintResidualAndHessian.Num();
103 AddTransientConstraintResidualAndHessian.AddDefaulted(NumConstraints);
104 return CurrentSize;
105 }
106
108 {
109 int32 CurrentSize = AddDynamicConstraintResidualAndHessian.Num();
110 AddDynamicConstraintResidualAndHessian.AddDefaulted(NumConstraints);
111 return CurrentSize;
112 }
113
115 {
116 int32 CurrentSize = AddPerNodeHessian.Num();
117 AddPerNodeHessian.AddDefaulted(NumConstraints);
118 return CurrentSize;
119 }
120
122 {
123 int32 CurrentSize = AddInternalForceDifferentials.Num();
124 AddInternalForceDifferentials.AddDefaulted(NumConstraints);
125 return CurrentSize;
126 }
127
129
131
133
135 {
136 DynamicConstraints = {};
137 for (int32 p = 0; p < DynamicIncidentElements.Num(); p++)
138 {
139 DynamicIncidentElements[p].SetNum(0);
140 DynamicIncidentElementsLocal[p].SetNum(0);
141 }
142 DynamicIncidentElementsOffsets = {};
143 }
144
145
146 void Apply(ParticleType& Particles, const T Dt, const int32 MaxWriteIters = 10, const bool Write2File = false, const TPBDActiveView<FSolverParticles>* InParticleActiveView = nullptr)
147 {
149
151 {
152 ComputeNewtonResiduals(Particles, Dt, Write2File);
153 }
154
155 std::atomic<int32> ParticleFailureCounter(0);
156
157 for (int32 i = 0; i < ParticlesPerColor.Num(); i++)
158 {
159 int32 NumBatch = ParticlesPerColor[i].Num() / CorotatedParams.XPBDCorotatedBatchSize;
160 if (ParticlesPerColor[i].Num() % CorotatedParams.XPBDCorotatedBatchSize != 0)
161 {
162 NumBatch ++;
163 }
164
165 PhysicsParallelFor(NumBatch, [&](const int32 BatchIndex)
166 {
168 int32 TaskIndex = CorotatedParams.XPBDCorotatedBatchSize * BatchIndex + BatchSubIndex;
169 if (TaskIndex < ParticlesPerColor[i].Num())
170 {
171 if (Particles.InvM(ParticlesPerColor[i][TaskIndex]) != T(0))
172 {
173 int32 ParticleIndex = ParticlesPerColor[i][TaskIndex];
174 if (!ApplySingleParticle(ParticleIndex, Dt, Particles))
175 {
176 ParticleFailureCounter.fetch_add(1, std::memory_order_relaxed);
177 }
178 }
179 }
180 }
181 }, NumBatch < CorotatedParams.XPBDCorotatedBatchThreshold);
182
183 }
184
185
186 if (bDoAcceleration)
187 {
190 {
191 InParticleActiveView->ParallelFor(AccelerationTechniquePerParticle, CorotatedParams.XPBDCorotatedBatchSize);
192 }
193 else
194 {
195 PhysicsParallelFor(Particles.Size(), [this, &Particles](const int32 ParticleIndex)
196 {
197 this->AccelerationTechniquePerParticle(Particles, ParticleIndex);
198 }, Particles.Size() < 1000);
199 }
200 }
201
202 CurrentIt ++;
203
204 if (ParticleFailureCounter.load(std::memory_order_relaxed) > 0)
205 {
206 UE_LOG(LogDeformableGaussSeidelMainConstraint, Warning, TEXT("%d Particle(s) are skipped because of too large dx size"), ParticleFailureCounter.load(std::memory_order_relaxed));
207 }
208 }
209
210 void InitStaticColor(const ParticleType& Particles, const TPBDActiveView<FSolverParticles>* InParticleActiveView = nullptr)
211 {
212 StaticParticlesPerColor = ComputeNodalColoring(StaticConstraints, Particles, 0, Particles.Size(), StaticIncidentElements, StaticIncidentElementsLocal, InParticleActiveView, &StaticParticleColors);
213 ParticleColors = StaticParticleColors;
214 ParticlesPerColor = StaticParticlesPerColor;
215 }
216
217 void InitTransientColor(const ParticleType& Particles)
218 {
220 ParticleColors = StaticParticleColors;
221 ParticlesPerColor = StaticParticlesPerColor;
222 Chaos::ComputeExtraNodalColoring(StaticConstraints, DynamicConstraints, TransientConstraints, Particles, StaticIncidentElements, DynamicIncidentElements, TransientIncidentElements, ParticleColors, ParticlesPerColor);
223 }
224
225 void InitDynamicColor(const ParticleType& Particles)
226 {
228 ParticleColors = StaticParticleColors;
229 ParticlesPerColor = StaticParticlesPerColor;
230 Chaos::ComputeExtraNodalColoring(StaticConstraints, DynamicConstraints, Particles, StaticIncidentElements, TransientIncidentElements, ParticleColors, ParticlesPerColor);
231 }
232
233 void Init(const T Dt, const ParticleType& Particles)
234 {
235 Resize((int32)Particles.Size());
236
238 TransientConstraints.SetNum(0);
239 for (int32 p = 0; p < TransientIncidentElements.Num(); p++)
240 {
241 TransientIncidentElements[p].SetNum(0);
242 TransientIncidentElementsLocal[p].SetNum(0);
243 }
244 TransientIncidentElementsOffsets.SetNum(0);
245 if (!bDoQuasistatics)
246 {
247 for (int32 i = 0; i < xtilde.Num(); i++)
248 {
249 //xtilde[i] = Particles.X(i) + Dt * Particles.V(i);
250 xtilde[i] = Particles.P(i);
251 }
252 }
253 CurrentIt = 0;
254 }
255
257 {
259 {
260 int32 TotalEntries = 0;
261 for (int32 i = 0; i < IncidentElementsIn.Num(); i++)
262 {
263 TotalEntries += IncidentElementsIn[i].Num();
265 {
266 return false;
267 }
268 for (int32 j = 0; j < IncidentElementsIn[i].Num(); j++)
269 {
271 {
272 return false;
273 }
274 }
275 }
276 if (TotalEntries > 0)
277 {
278 return true;
279 }
280 }
281 return false;
282 }
283
284 CHAOS_API TArray<TVec3<T>> ComputeNewtonResiduals(const ParticleType& Particles, const T Dt, const bool Write2File = false, TArray<PMatrix<T, 3, 3>>* AllParticleHessian = nullptr);
285
286 CHAOS_API void ApplyCG(ParticleType& Particles, const T Dt);
287
288 /* Adds external acceleration, e.g. gravity (0,0,-980) cm/s^2 */
290
292
293 private:
294
295 bool ApplySingleParticle(const int32 p, const T Dt, ParticleType& Particles)
296 {
297 int32 ConstraintIndex = 0;
299 Chaos::PMatrix<T, 3, 3> ParticleHessian((T)0., (T)0., (T)0.);
300
301 ComputeInitialResidualAndHessian(Particles, p, Dt, ParticleResidual, ParticleHessian);
302
303 for (int32 i = 0; i < StaticIncidentElements[p].Num(); i++)
304 {
305 while (StaticIncidentElements[p][i] >= StaticIncidentElementsOffsets[ConstraintIndex + 1] && ConstraintIndex < StaticIncidentElementsOffsets.Num() - 1)
306 {
307 ConstraintIndex ++;
308 }
309
310 AddStaticConstraintResidualAndHessian[ConstraintIndex](Particles, StaticIncidentElements[p][i] - StaticIncidentElementsOffsets[ConstraintIndex], StaticIncidentElementsLocal[p][i], Dt, ParticleResidual, ParticleHessian);
311 }
312
313 ConstraintIndex = 0;
314
315 for (int32 i = 0; i < DynamicIncidentElements[p].Num(); i++)
316 {
317 while (DynamicIncidentElements[p][i] >= DynamicIncidentElementsOffsets[ConstraintIndex + 1] && ConstraintIndex < DynamicIncidentElementsOffsets.Num() - 1)
318 {
319 ConstraintIndex ++;
320 }
321
322 AddDynamicConstraintResidualAndHessian[ConstraintIndex](Particles, DynamicIncidentElements[p][i] - DynamicIncidentElementsOffsets[ConstraintIndex], DynamicIncidentElementsLocal[p][i], Dt, ParticleResidual, ParticleHessian);
323 }
324
325 ConstraintIndex = 0;
326
327 for (int32 i = 0; i < TransientIncidentElements[p].Num(); i++)
328 {
329 while (TransientIncidentElements[p][i] >= TransientIncidentElementsOffsets[ConstraintIndex + 1] && ConstraintIndex < TransientIncidentElementsOffsets.Num() - 1)
330 {
331 ConstraintIndex ++;
332 }
333
334 AddTransientConstraintResidualAndHessian[ConstraintIndex](Particles, TransientIncidentElements[p][i] - TransientIncidentElementsOffsets[ConstraintIndex], TransientIncidentElementsLocal[p][i], Dt, ParticleResidual, ParticleHessian);
335 }
336
337 for (int32 i = 0; i < AddPerNodeHessian.Num(); i++)
338 {
339 AddPerNodeHessian[i](p, Dt, ParticleHessian);
340 }
341
342 T HessianScale = (T)1.;
343 T HessianDet = ParticleHessian.Determinant();
344 auto IsIllConditioned = [](T HessianDet)
345 {
346 return FMath::Abs(HessianDet) < TMathUtilConstants<T>::Epsilon ||
348 };
350 {
351 // scale the hessian so that the determinant (~HessianScale^3) falls into the normal range.
352 HessianScale = (T)0.;
353 for (int32 RowIdx = 0; RowIdx < 3; ++RowIdx)
354 {
355 for (int32 ColIdx = 0; ColIdx < 3; ++ColIdx)
356 {
357 HessianScale = FMath::Max(FMath::Abs(ParticleHessian.GetAt(RowIdx, ColIdx)), HessianScale);
358 }
359 }
361 {
362 return false;
363 }
364 else
365 {
367 HessianDet = ParticleHessian.Determinant();
369 {
370 return false;
371 }
372 }
373 }
374
375 Chaos::PMatrix<T, 3, 3> HessianInv = ParticleHessian.SymmetricCofactorMatrix();
376 HessianInv *= T(1) / HessianDet;
377 Chaos::TVector<T, 3> Dx = HessianInv.GetTransposed() * (-ParticleResidual) / HessianScale; // add back HessianScale
378
379 if (Dx.Size() < MaxDxSize)
380 {
381 Particles.P(p) += Dx;
382 }
383 else
384 {
385 return false;
386 }
387 return true;
388 }
389
390 void InitializeLambdas()
391 {
392 ComputeInitialResidualAndHessian = [this](const ParticleType& Particles, const int32 p, const T Dt, TVec3<T>& ParticleResidual, Chaos::PMatrix<T, 3, 3>& ParticleHessian)
393 {
394 if (!this->bDoQuasistatics) {
395 for (int32 alpha = 0; alpha < 3; alpha++) {
396 ParticleResidual[alpha] = Particles.M(p) * (Particles.P(p)[alpha] - this->xtilde[p][alpha]);
397 }
398 for (int32 alpha = 0; alpha < 3; alpha++) {
399 ParticleHessian.SetAt(alpha, alpha, Particles.M(p));
400 }
401 }
402 else
403 {
404 for (int32 alpha = 0; alpha < 3; alpha++) {
405 ParticleResidual[alpha] = -Dt * Dt * ExternalAcceleration[alpha] * Particles.M(p);
406 }
407 }
408 };
409
410 AccelerationTechniquePerParticle = [this](ParticleType& Particles, int32 ParticleIndex)
411 {
412 if (Particles.InvM(ParticleIndex) != T(0) && CurrentIt > SORStart)
413 {
414 Particles.P(ParticleIndex) = OmegaSOR * (Particles.P(ParticleIndex) - this->X_k_1[ParticleIndex]) + this->X_k_1[ParticleIndex];
415 }
416 if (Particles.InvM(ParticleIndex) != T(0))
417 {
418 this->X_k_1[ParticleIndex] = this->X_k[ParticleIndex];
419 this->X_k[ParticleIndex] = Particles.P(ParticleIndex);
420 }
421 };
422 }
423
424
425 //Constraints storage:
426 TArray<TArray<int32>> StaticConstraints = {};
427 TArray<TArray<int32>> StaticIncidentElements;
428 TArray<TArray<int32>> StaticIncidentElementsLocal;
429 TArray<TArray<int32>> TransientConstraints = {};
430 TArray<TArray<int32>> TransientIncidentElements;
431 TArray<TArray<int32>> TransientIncidentElementsLocal;
432 TArray<TArray<int32>> DynamicConstraints = {};
433 TArray<TArray<int32>> DynamicIncidentElements;
434 TArray<TArray<int32>> DynamicIncidentElementsLocal;
435
436 //Lambds for spcifying residual/hessian computations:
437 TFunction<void(const ParticleType&, const int32, const T, TVec3<T>&, Chaos::PMatrix<T, 3, 3>&)> ComputeInitialResidualAndHessian;
438 TArray<TFunction<void(const ParticleType&, const int32, const int32, const T, TVec3<T>&, Chaos::PMatrix<T, 3, 3>&)>> AddStaticConstraintResidualAndHessian;
439 TArray<TFunction<void(const ParticleType&, const int32, const int32, const T, TVec3<T>&, Chaos::PMatrix<T, 3, 3>&)>> AddDynamicConstraintResidualAndHessian;
440 TArray<TFunction<void(const ParticleType&, const int32, const int32, const T, TVec3<T>&, Chaos::PMatrix<T, 3, 3>&)>> AddTransientConstraintResidualAndHessian;
441 TArray<TFunction<void(const int32, const T, Chaos::PMatrix<T, 3, 3>&)>> AddPerNodeHessian;
442
443 //Coloring information:
444 TArray<int32> StaticParticleColors;
445 TArray<TArray<int32>> StaticParticlesPerColor;
446
447 TArray<int32> ParticleColors;
448 TArray<TArray<int32>> ParticlesPerColor;
449
450 TArray<int32> StaticIncidentElementsOffsets;
451 TArray<int32> TransientIncidentElementsOffsets;
452 TArray<int32> DynamicIncidentElementsOffsets;
453
454 bool bDoQuasistatics = false;
455 mutable TArray<Chaos::TVector<T, 3>> xtilde;
456
457 //SOR variables:
458 TFunction<void(ParticleType&, int32)> AccelerationTechniquePerParticle;
459 mutable TArray<Chaos::TVector<T, 3>> X_k_1;
460 mutable TArray<Chaos::TVector<T, 3>> X_k;
461 int32 CurrentIt = 0;
462 bool bDoAcceleration = true;
463 T OmegaSOR = T(1.6);
464 int32 SORStart = 1; //1 is smallest
465
466 int32 ParallelMax = 1000;
467
468 FDeformableXPBDCorotatedParams CorotatedParams;
469
470 //Newton solver variables:
471 TArray<TFunction<void(const ParticleType&, const TArray<TVec3<T>>&, TArray<TVec3<T>>&)>> AddInternalForceDifferentials;
472 TUniquePtr<TArray<int32>> use_list;
473
474 int32 NumTotalParticles;
475 TArray<TVec3<T>> ReorderedPs;
476
477 T MaxDxSize = T(0);
478
479 public:
480 bool DebugResidual = false;
481 bool IsFirstFrame = true;
483
485
486 };
487
488 //template class FGaussSeidelMainConstraint<FSolverReal, FSolverParticles>;
489}
490
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define PERF_SCOPE(X)
Definition ChaosDeformableSolver.cpp:49
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define DECLARE_CYCLE_STAT(CounterName, StatId, GroupId)
Definition Stats.h:669
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define DEFINE_LOG_CATEGORY_STATIC(CategoryName, DefaultVerbosity, CompileTimeVerbosity)
Definition LogMacros.h:380
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
@ Num
Definition MetalRHIPrivate.h:234
uint32 Size
Definition VulkanMemory.cpp:4034
Definition Matrix.h:21
Definition GaussSeidelMainConstraint.h:28
void Resize(const int32 NewSize)
Definition GaussSeidelMainConstraint.h:69
const TArray< TFunction< void(const ParticleType &, const TArray< TVec3< T > > &, TArray< TVec3< T > > &)> > & InternalForceDifferentials() const
Definition GaussSeidelMainConstraint.h:90
int32 AddTransientConstraintResidualAndHessianRange(int32 NumConstraints)
Definition GaussSeidelMainConstraint.h:100
void ResetDynamicConstraints()
Definition GaussSeidelMainConstraint.h:134
void Init(const T Dt, const ParticleType &Particles)
Definition GaussSeidelMainConstraint.h:233
CHAOS_API void AddStaticConstraints(const TArray< TArray< int32 > > &ExtraConstraints, TArray< TArray< int32 > > &ExtraIncidentElements, TArray< TArray< int32 > > &ExtraIncidentElementsLocal)
Definition GaussSeidelMainConstraint.cpp:17
void InitDynamicColor(const ParticleType &Particles)
Definition GaussSeidelMainConstraint.h:225
static bool IsClean(const TArray< TArray< int32 > > &ConstraintsIn, const TArray< TArray< int32 > > &IncidentElementsIn, const TArray< TArray< int32 > > &IncidentElementsLocalIn)
Definition GaussSeidelMainConstraint.h:256
TVec3< T > ExternalAcceleration
Definition GaussSeidelMainConstraint.h:484
CHAOS_API void AddTransientConstraints(const TArray< TArray< int32 > > &ExtraConstraints, TArray< TArray< int32 > > &ExtraIncidentElements, TArray< TArray< int32 > > &ExtraIncidentElementsLocal, bool CheckIncidentElements=false)
Definition GaussSeidelMainConstraint.cpp:48
const TArray< TFunction< void(const ParticleType &, const int32, const int32, const T, TVec3< T > &, Chaos::PMatrix< T, 3, 3 > &)> > & TransientConstraintResidualAndHessian() const
Definition GaussSeidelMainConstraint.h:84
FGaussSeidelMainConstraint(const ParticleType &InParticles, const bool bDoQuasistaticsIn=false, const bool bDoSORIn=true, const T InOmegaSOR=(T) 1.6, const int32 ParallelMaxIn=1000, const T MaxDxRatioIn=T(1), const FDeformableXPBDCorotatedParams &InParams=FDeformableXPBDCorotatedParams())
Definition GaussSeidelMainConstraint.h:31
virtual ~FGaussSeidelMainConstraint()
Definition GaussSeidelMainConstraint.h:67
bool IsFirstFrame
Definition GaussSeidelMainConstraint.h:481
void ResetExternalAcceleration()
Definition GaussSeidelMainConstraint.h:291
TArray< TFunction< void(const ParticleType &, const int32, const int32, const T, TVec3< T > &, Chaos::PMatrix< T, 3, 3 > &)> > & TransientConstraintResidualAndHessian()
Definition GaussSeidelMainConstraint.h:85
const TArray< TFunction< void(const ParticleType &, const int32, const int32, const T, TVec3< T > &, Chaos::PMatrix< T, 3, 3 > &)> > & StaticConstraintResidualAndHessian() const
Definition GaussSeidelMainConstraint.h:82
TArray< TFunction< void(const ParticleType &, const int32, const int32, const T, TVec3< T > &, Chaos::PMatrix< T, 3, 3 > &)> > & StaticConstraintResidualAndHessian()
Definition GaussSeidelMainConstraint.h:83
int32 AddPerNodeHessianRange(int32 NumConstraints)
Definition GaussSeidelMainConstraint.h:114
void Apply(ParticleType &Particles, const T Dt, const int32 MaxWriteIters=10, const bool Write2File=false, const TPBDActiveView< FSolverParticles > *InParticleActiveView=nullptr)
Definition GaussSeidelMainConstraint.h:146
CHAOS_API TArray< TVec3< T > > ComputeNewtonResiduals(const ParticleType &Particles, const T Dt, const bool Write2File=false, TArray< PMatrix< T, 3, 3 > > *AllParticleHessian=nullptr)
Definition GaussSeidelMainConstraint.cpp:117
bool DebugResidual
Definition GaussSeidelMainConstraint.h:480
TArray< TFunction< void(const ParticleType &, const TArray< TVec3< T > > &, TArray< TVec3< T > > &)> > & InternalForceDifferentials()
Definition GaussSeidelMainConstraint.h:91
CHAOS_API void AddDynamicConstraints(const TArray< TArray< int32 > > &ExtraConstraints, TArray< TArray< int32 > > &ExtraIncidentElements, TArray< TArray< int32 > > &ExtraIncidentElementsLocal, bool CheckIncidentElements=false)
Definition GaussSeidelMainConstraint.cpp:83
const TArray< TFunction< void(const int32, const T, Chaos::PMatrix< T, 3, 3 > &)> > & PerNodeHessian() const
Definition GaussSeidelMainConstraint.h:88
int32 AddStaticConstraintResidualAndHessianRange(int32 NumConstraints)
Definition GaussSeidelMainConstraint.h:93
void InitStaticColor(const ParticleType &Particles, const TPBDActiveView< FSolverParticles > *InParticleActiveView=nullptr)
Definition GaussSeidelMainConstraint.h:210
TArray< TFunction< void(const ParticleType &, const int32, const int32, const T, TVec3< T > &, Chaos::PMatrix< T, 3, 3 > &)> > & DynamicConstraintResidualAndHessian()
Definition GaussSeidelMainConstraint.h:87
void InitTransientColor(const ParticleType &Particles)
Definition GaussSeidelMainConstraint.h:217
CHAOS_API void ApplyCG(ParticleType &Particles, const T Dt)
Definition GaussSeidelMainConstraint.cpp:203
int32 AddDynamicConstraintResidualAndHessianRange(int32 NumConstraints)
Definition GaussSeidelMainConstraint.h:107
int32 AddAddInternalForceDifferentialsRange(int32 NumConstraints)
Definition GaussSeidelMainConstraint.h:121
const TArray< TFunction< void(const ParticleType &, const int32, const int32, const T, TVec3< T > &, Chaos::PMatrix< T, 3, 3 > &)> > & DynamicConstraintResidualAndHessian() const
Definition GaussSeidelMainConstraint.h:86
TArray< TFunction< void(const int32, const T, Chaos::PMatrix< T, 3, 3 > &)> > & PerNodeHessian()
Definition GaussSeidelMainConstraint.h:89
void AddExternalAcceleration(const TVec3< T > &Acceleration)
Definition GaussSeidelMainConstraint.h:289
int32 PassedIters
Definition GaussSeidelMainConstraint.h:482
Definition PBDActiveView.h:47
Definition Vector.h:1000
Definition Vector.h:41
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
SizeType AddDefaulted()
Definition Array.h:2795
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
void Init(const ElementType &Element, SizeType Number)
Definition Array.h:3043
Definition AndroidPlatformMisc.h:14
Definition UniquePtr.h:107
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
CHAOS_API TArray< TArray< int32 > > ComputeNodalColoring(const TArray< TVec4< int32 > > &Graph, const Chaos::TDynamicParticles< T, 3 > &InParticles, const int32 GraphParticlesStart, const int32 GraphParticlesEnd, const TArray< TArray< int32 > > &IncidentElements, const TArray< TArray< int32 > > &IncidentElementsLocalIndex)
void CHAOS_API PhysicsParallelFor(int32 InNum, TFunctionRef< void(int32)> InCallable, bool bForceSingleThreaded=false)
Definition Parallel.cpp:55
CHAOS_API void ComputeExtraNodalColoring(const TArray< TArray< int32 > > &Graph, const TArray< TArray< int32 > > &ExtraGraph, const Chaos::TDynamicParticles< T, 3 > &InParticles, const TArray< TArray< int32 > > &IncidentElements, const TArray< TArray< int32 > > &ExtraIncidentElements, TArray< int32 > &ParticleColors, TArray< TArray< int32 > > &ParticlesPerColor)
Definition ChaosDeformableSolverTypes.h:219
int32 XPBDCorotatedBatchSize
Definition ChaosDeformableSolverTypes.h:220
int32 XPBDCorotatedBatchThreshold
Definition ChaosDeformableSolverTypes.h:221
Definition MathUtil.h:16