15#define PERF_SCOPE(X) SCOPE_CYCLE_COUNTER(X); TRACE_CPUPROFILER_EVENT_SCOPE(X);
26 template <
typename T,
typename ParticleType>
52 for (
int32 j = 0; j < 3; j++)
72 StaticIncidentElements.
SetNum(NewSize);
73 StaticIncidentElementsLocal.
SetNum(NewSize);
74 DynamicIncidentElements.
SetNum(NewSize);
75 DynamicIncidentElementsLocal.
SetNum(NewSize);
76 TransientIncidentElements.
SetNum(NewSize);
77 TransientIncidentElementsLocal.
SetNum(NewSize);
95 int32 CurrentSize = AddStaticConstraintResidualAndHessian.Num();
96 AddStaticConstraintResidualAndHessian.AddDefaulted(NumConstraints);
102 int32 CurrentSize = AddTransientConstraintResidualAndHessian.Num();
103 AddTransientConstraintResidualAndHessian.AddDefaulted(NumConstraints);
109 int32 CurrentSize = AddDynamicConstraintResidualAndHessian.Num();
110 AddDynamicConstraintResidualAndHessian.AddDefaulted(NumConstraints);
116 int32 CurrentSize = AddPerNodeHessian.
Num();
123 int32 CurrentSize = AddInternalForceDifferentials.Num();
124 AddInternalForceDifferentials.AddDefaulted(NumConstraints);
136 DynamicConstraints = {};
137 for (
int32 p = 0; p < DynamicIncidentElements.
Num(); p++)
139 DynamicIncidentElements[p].
SetNum(0);
140 DynamicIncidentElementsLocal[p].
SetNum(0);
142 DynamicIncidentElementsOffsets = {};
157 for (
int32 i = 0; i < ParticlesPerColor.
Num(); i++)
169 if (TaskIndex < ParticlesPerColor[i].
Num())
171 if (Particles.InvM(ParticlesPerColor[i][TaskIndex]) != T(0))
173 int32 ParticleIndex = ParticlesPerColor[i][TaskIndex];
174 if (!ApplySingleParticle(ParticleIndex, Dt, Particles))
197 this->AccelerationTechniquePerParticle(Particles, ParticleIndex);
198 }, Particles.Size() < 1000);
212 StaticParticlesPerColor =
ComputeNodalColoring(StaticConstraints, Particles, 0, Particles.Size(), StaticIncidentElements, StaticIncidentElementsLocal,
InParticleActiveView, &StaticParticleColors);
213 ParticleColors = StaticParticleColors;
214 ParticlesPerColor = StaticParticlesPerColor;
220 ParticleColors = StaticParticleColors;
221 ParticlesPerColor = StaticParticlesPerColor;
222 Chaos::ComputeExtraNodalColoring(StaticConstraints, DynamicConstraints, TransientConstraints, Particles, StaticIncidentElements, DynamicIncidentElements, TransientIncidentElements, ParticleColors, ParticlesPerColor);
228 ParticleColors = StaticParticleColors;
229 ParticlesPerColor = StaticParticlesPerColor;
230 Chaos::ComputeExtraNodalColoring(StaticConstraints, DynamicConstraints, Particles, StaticIncidentElements, TransientIncidentElements, ParticleColors, ParticlesPerColor);
233 void Init(
const T Dt,
const ParticleType& Particles)
238 TransientConstraints.
SetNum(0);
239 for (
int32 p = 0; p < TransientIncidentElements.
Num(); p++)
241 TransientIncidentElements[p].
SetNum(0);
242 TransientIncidentElementsLocal[p].
SetNum(0);
244 TransientIncidentElementsOffsets.
SetNum(0);
245 if (!bDoQuasistatics)
247 for (
int32 i = 0; i < xtilde.
Num(); i++)
250 xtilde[i] = Particles.P(i);
260 int32 TotalEntries = 0;
276 if (TotalEntries > 0)
295 bool ApplySingleParticle(
const int32 p,
const T Dt, ParticleType& Particles)
297 int32 ConstraintIndex = 0;
303 for (
int32 i = 0; i < StaticIncidentElements[p].
Num(); i++)
305 while (StaticIncidentElements[p][i] >= StaticIncidentElementsOffsets[ConstraintIndex + 1] && ConstraintIndex < StaticIncidentElementsOffsets.
Num() - 1)
310 AddStaticConstraintResidualAndHessian[ConstraintIndex](Particles, StaticIncidentElements[p][i] - StaticIncidentElementsOffsets[ConstraintIndex], StaticIncidentElementsLocal[p][i], Dt,
ParticleResidual,
ParticleHessian);
315 for (
int32 i = 0; i < DynamicIncidentElements[p].
Num(); i++)
317 while (DynamicIncidentElements[p][i] >= DynamicIncidentElementsOffsets[ConstraintIndex + 1] && ConstraintIndex < DynamicIncidentElementsOffsets.
Num() - 1)
322 AddDynamicConstraintResidualAndHessian[ConstraintIndex](Particles, DynamicIncidentElements[p][i] - DynamicIncidentElementsOffsets[ConstraintIndex], DynamicIncidentElementsLocal[p][i], Dt,
ParticleResidual,
ParticleHessian);
327 for (
int32 i = 0; i < TransientIncidentElements[p].
Num(); i++)
329 while (TransientIncidentElements[p][i] >= TransientIncidentElementsOffsets[ConstraintIndex + 1] && ConstraintIndex < TransientIncidentElementsOffsets.
Num() - 1)
334 AddTransientConstraintResidualAndHessian[ConstraintIndex](Particles, TransientIncidentElements[p][i] - TransientIncidentElementsOffsets[ConstraintIndex], TransientIncidentElementsLocal[p][i], Dt,
ParticleResidual,
ParticleHessian);
337 for (
int32 i = 0; i < AddPerNodeHessian.
Num(); i++)
379 if (Dx.Size() < MaxDxSize)
381 Particles.P(p) += Dx;
390 void InitializeLambdas()
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]);
398 for (
int32 alpha = 0; alpha < 3; alpha++) {
404 for (
int32 alpha = 0; alpha < 3; alpha++) {
410 AccelerationTechniquePerParticle = [
this](ParticleType& Particles,
int32 ParticleIndex)
412 if (Particles.InvM(ParticleIndex) != T(0) && CurrentIt > SORStart)
414 Particles.P(ParticleIndex) = OmegaSOR * (Particles.P(ParticleIndex) - this->X_k_1[ParticleIndex]) + this->X_k_1[ParticleIndex];
416 if (Particles.InvM(ParticleIndex) != T(0))
418 this->X_k_1[ParticleIndex] = this->X_k[ParticleIndex];
419 this->X_k[ParticleIndex] = Particles.P(ParticleIndex);
454 bool bDoQuasistatics =
false;
462 bool bDoAcceleration =
true;
466 int32 ParallelMax = 1000;
468 FDeformableXPBDCorotatedParams CorotatedParams;
474 int32 NumTotalParticles;
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#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
uint32 Size
Definition VulkanMemory.cpp:4034
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
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)