16 template <
typename T,
typename ParticleType>
48 :
Base(
InParticles,
InMesh,
EMeshArray,
NuMeshArray,
MoveTemp(
AlphaJMeshArray),
InParams,
NuMesh,
bRecordMetricIn,
false),
IncidentElements(
IncidentElementsIn),
IncidentElementsLocal(
IncidentElementsLocalIn),
59 for (
int32 r = 0; r < 3; r++) {
60 for (
int32 c = 0; c < 3; c++) {
81 void Apply(ParticleType& Particles,
const T Dt)
const
101 Particles.P(ParticleIndex) += Dx;
111 void Init(
const T Dt,
const ParticleType& Particles)
const
134 for (
int32 i = 0; i < MeshConstraints.Num(); i++)
146 void ApplySOR(ParticleType& Particles,
const T Dt)
const
153 if (Particles.InvM(ParticleIndex) != T(0) &&
CurrentIt > 3)
155 Particles.P(ParticleIndex) =
OmegaSOR * (Particles.P(ParticleIndex) -
X_k_1[i]) +
X_k_1[i];
158 X_k[i] = Particles.P(ParticleIndex);
164 const T Dt,
const bool AddMass =
true)
const
169 for (
int32 alpha = 0; alpha < 3; alpha++) {
186 for (
int32 c = 0; c < 3; c++)
193 for (
int32 c = 0; c < 3; c++)
195 for (
int32 h = 0; h < 3; h++)
206 for (
int32 alpha = 0; alpha < 3; alpha++) {
207 res[alpha] -=
dx[alpha];
215 const T Dt,
const bool AddMass =
true)
const
219 for (
int32 alpha = 0; alpha < 3; alpha++) {
230 T
Coeff = Dt * Dt * Measure[ElementIndex];
245 this->
ComputeStress(Fe, MuElementArray[ElementIndex], LambdaElementArray[ElementIndex], P);
251 for (
int32 c = 0; c < 3; c++)
258 for (
int32 c = 0; c < 3; c++)
260 for (
int32 h = 0; h < 3; h++)
271 for (
int32 alpha = 0; alpha < 3; alpha++) {
291 ComputeHessianHelper = [](
const Chaos::PMatrix<T, 3, 3>&
Fe,
const Chaos::PMatrix<T, 3, 3>&
DmInv,
const T
mu,
const T
lambda,
const int32 local_index,
const T
Coeff,
Chaos::PMatrix<T, 3, 3>&
final_hessian)
294 JFinvT.SetAt(0, 0,
Fe.GetAt(1, 1) *
Fe.GetAt(2, 2) -
Fe.GetAt(2, 1) *
Fe.GetAt(1, 2));
295 JFinvT.SetAt(0, 1,
Fe.GetAt(2, 0) *
Fe.GetAt(1, 2) -
Fe.GetAt(1, 0) *
Fe.GetAt(2, 2));
296 JFinvT.SetAt(0, 2,
Fe.GetAt(1, 0) *
Fe.GetAt(2, 1) -
Fe.GetAt(2, 0) *
Fe.GetAt(1, 1));
297 JFinvT.SetAt(1, 0,
Fe.GetAt(2, 1) *
Fe.GetAt(0, 2) -
Fe.GetAt(0, 1) *
Fe.GetAt(2, 2));
298 JFinvT.SetAt(1, 1,
Fe.GetAt(0, 0) *
Fe.GetAt(2, 2) -
Fe.GetAt(2, 0) *
Fe.GetAt(0, 2));
299 JFinvT.SetAt(1, 2,
Fe.GetAt(2, 0) *
Fe.GetAt(0, 1) -
Fe.GetAt(0, 0) *
Fe.GetAt(2, 1));
300 JFinvT.SetAt(2, 0,
Fe.GetAt(0, 1) *
Fe.GetAt(1, 2) -
Fe.GetAt(1, 1) *
Fe.GetAt(0, 2));
301 JFinvT.SetAt(2, 1,
Fe.GetAt(1, 0) *
Fe.GetAt(0, 2) -
Fe.GetAt(0, 0) *
Fe.GetAt(1, 2));
302 JFinvT.SetAt(2, 2,
Fe.GetAt(0, 0) *
Fe.GetAt(1, 1) -
Fe.GetAt(1, 0) *
Fe.GetAt(0, 1));
308 for (
int32 nu = 0; nu < 3; nu++) {
310 for (
int32 k = 0; k < 3; k++) {
315 for (
int32 alpha = 0; alpha < 3; alpha++) {
321 for (
int32 alpha = 0; alpha < 3; alpha++) {
322 for (
int32 k = 0; k < 3; k++) {
326 for (
int32 alpha = 0; alpha < 3; alpha++)
334 for (
int32 nu = 0; nu < 3; nu++)
338 for (
int32 alpha = 0; alpha < 3; alpha++)
345 for (
int32 alpha = 0; alpha < 3; alpha++) {
348 for (
int32 alpha = 0; alpha < 3; alpha++)
381 return TVector<T, 3>((T)0.);
404 TFunction<
void(
const Chaos::PMatrix<T, 3, 3>&,
const Chaos::PMatrix<T, 3, 3>&,
const T,
const T,
const int32,
const T,
Chaos::PMatrix<T, 3, 3>&)>
ComputeHessianHelper;
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
@ INDEX_NONE
Definition CoreMiscDefines.h:150
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define TRACE_CPUPROFILER_EVENT_SCOPE(Name)
Definition CpuProfilerTrace.h:528
#define UE_SMALL_NUMBER
Definition UnrealMathUtility.h:130
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition GaussSeidelCorotatedConstraints.h:18
TArray< int32 > Particle2Incident
Definition GaussSeidelCorotatedConstraints.h:388
virtual ~FGaussSeidelCorotatedConstraints()
Definition GaussSeidelCorotatedConstraints.h:78
void Init(const T Dt, const ParticleType &Particles) const
Definition GaussSeidelCorotatedConstraints.h:111
TUniquePtr< TArray< int32 > > ParticleColors
Definition GaussSeidelCorotatedConstraints.h:409
Chaos::PMatrix< T, 3, 3 > ComputePerParticleCorotatedHessianSimple(const int32 p, const int32 IncidentIndex, const ParticleType &Particles, const T Dt, const bool AddMass=true) const
Definition GaussSeidelCorotatedConstraints.h:214
void SetParticlesPerColor(TArray< TArray< int32 > > &&InParticlesPerColor)
Definition GaussSeidelCorotatedConstraints.h:128
FGaussSeidelCorotatedConstraints(const ParticleType &InParticles, const TArray< TVector< int32, 4 > > &InMesh, const TArray< T > &EMeshArray, const TArray< T > &NuMeshArray, TArray< T > &&AlphaJMeshArray, TArray< TArray< int32 > > &&IncidentElementsIn, TArray< TArray< int32 > > &&IncidentElementsLocalIn, const int32 ParticleStartIndexIn, const int32 ParticleEndIndexIn, const bool bDoQuasistaticsIn=false, const bool bDoSORIn=true, const T InOmegaSOR=(T) 1.6, const FDeformableXPBDCorotatedParams &InParams=FDeformableXPBDCorotatedParams(), const T &NuMesh=(T).3, const bool bRecordMetricIn=false)
Definition GaussSeidelCorotatedConstraints.h:31
TArray< Chaos::TVector< T, 3 > > X_k
Definition GaussSeidelCorotatedConstraints.h:397
bool bDoSOR
Definition GaussSeidelCorotatedConstraints.h:399
int32 ParticleStartIndex
Definition GaussSeidelCorotatedConstraints.h:393
TFunction< void(const Chaos::PMatrix< T, 3, 3 > &, const Chaos::PMatrix< T, 3, 3 > &, const T, const T, const int32, const T, Chaos::PMatrix< T, 3, 3 > &)> ComputeHessianHelper
Definition GaussSeidelCorotatedConstraints.h:404
TFunction< void(const Chaos::PMatrix< T, 3, 3 > &, const T, const T, Chaos::PMatrix< T, 3, 3 > &)> ComputeStress
Definition GaussSeidelCorotatedConstraints.h:403
void InitializeCorotatedLambdas()
Definition GaussSeidelCorotatedConstraints.h:285
T LocalNewtonTol
Definition GaussSeidelCorotatedConstraints.h:391
int32 CurrentIt
Definition GaussSeidelCorotatedConstraints.h:402
void InitColor(const ParticleType &Particles)
Definition GaussSeidelCorotatedConstraints.h:280
TFunction< void(const ParticleType &, const int32, const T, TVec3< T > &)> AddAdditionalRes
Definition GaussSeidelCorotatedConstraints.h:407
void Init() const override
Definition GaussSeidelCorotatedConstraints.h:123
void ApplySOR(ParticleType &Particles, const T Dt) const
Definition GaussSeidelCorotatedConstraints.h:146
TArray< TArray< int32 > > GetMeshArray() const
Definition GaussSeidelCorotatedConstraints.h:130
TArray< TArray< int32 > > IncidentElements
Definition GaussSeidelCorotatedConstraints.h:389
TArray< TVector< int32, 4 > > GetMeshConstraints() const
Definition GaussSeidelCorotatedConstraints.h:127
TArray< TArray< int32 > > ParticlesPerColor
Definition GaussSeidelCorotatedConstraints.h:392
T OmegaSOR
Definition GaussSeidelCorotatedConstraints.h:401
bool bDoQuasistatics
Definition GaussSeidelCorotatedConstraints.h:398
TArray< Chaos::TVector< T, 3 > > xtilde
Definition GaussSeidelCorotatedConstraints.h:395
TFunction< void(const ParticleType &, const int32, const T, Chaos::PMatrix< T, 3, 3 > &)> AddAdditionalHessian
Definition GaussSeidelCorotatedConstraints.h:408
int32 ParticleEndIndex
Definition GaussSeidelCorotatedConstraints.h:394
void Apply(ParticleType &Particles, const T Dt) const
Definition GaussSeidelCorotatedConstraints.h:81
TArray< TArray< int32 > > IncidentElementsLocal
Definition GaussSeidelCorotatedConstraints.h:390
TArray< TArray< int32 > > & GetIncidentElements()
Definition GaussSeidelCorotatedConstraints.h:125
TArray< TArray< int32 > > & GetIncidentElementsLocal()
Definition GaussSeidelCorotatedConstraints.h:126
TArray< Chaos::TVector< T, 3 > > X_k_1
Definition GaussSeidelCorotatedConstraints.h:396
void AddHyperelasticResidualAndHessian(const ParticleType &Particles, const int32 ElementIndex, const int32 ElementIndexLocal, const T Dt, TVec3< T > &ParticleResidual, Chaos::PMatrix< T, 3, 3 > &ParticleHessian)
Definition GaussSeidelCorotatedConstraints.h:239
Chaos::TVector< T, 3 > ComputePerParticleResidual(const int32 p, const int32 IncidentIndex, const ParticleType &Particles, const T Dt, const bool AddMass=true) const
Definition GaussSeidelCorotatedConstraints.h:163
Definition XPBDCorotatedConstraints.h:20
TArray< T > LambdaArray
Definition XPBDCorotatedConstraints.h:637
TArray< TVector< int32, 4 > > MeshConstraints
Definition XPBDCorotatedConstraints.h:654
TArray< T > Measure
Definition XPBDCorotatedConstraints.h:655
TArray< T > AlphaJArray
Definition XPBDCorotatedConstraints.h:648
FDeformableXPBDCorotatedParams CorotatedParams
Definition XPBDCorotatedConstraints.h:641
TArray< T > DmInverse
Definition XPBDCorotatedConstraints.h:638
PMatrix< T, 3, 3 > F(const int e, const ParticleType &InParticles) const
Definition XPBDCorotatedConstraints.h:230
TArray< T > MuElementArray
Definition XPBDCorotatedConstraints.h:646
PMatrix< T, 3, 3 > ElementDmInv(const int e) const
Definition XPBDCorotatedConstraints.h:234
TArray< T > LambdaElementArray
Definition XPBDCorotatedConstraints.h:647
UE_REWRITE SizeType Num() const
Definition Array.h:1144
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
void PCorotated(const Chaos::PMatrix< T, 3, 3 > &Fe, const T mu, const T lambda, Chaos::PMatrix< T, 3, 3 > &P)
Definition NewtonCorotatedCache.cpp:116
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
@ false
Definition radaudio_common.h:23