14 template <
typename T,
typename ParticleType>
32 const T&
EMesh = (T)10.0,
78 virtual void ApplyInSerial(ParticleType& Particles,
const T Dt,
const int32 ElementIndex)
const override
82 for (
int i = 0; i < 4; i++)
84 Particles.P(MeshConstraints[ElementIndex][i]) +=
PolarDelta[i];
89 for (
int i = 0; i < 4; i++)
91 Particles.P(MeshConstraints[ElementIndex][i]) +=
DetDelta[i];
95 virtual void Init()
const override
97 for (T& Lambdas : LambdaArray) { Lambdas = (T)0.; }
111 T J =
Fe.Determinant();
124 for (
int i = 0; i < 4; i++)
126 for (
int j = 0; j < 3; j++)
128 Denom +=
dC2[i][j] * Particles.InvM(MeshConstraints[ElementIndex][i]) *
dC2[i][j];
132 LambdaArray[2 * ElementIndex + 1] +=
DLambda;
134 for (
int i = 0; i < 4; i++)
136 for (
int j = 0; j < 3; j++)
138 Delta2[i][j] = Particles.InvM(MeshConstraints[ElementIndex][i]) *
dC2[i][j] *
DLambda;
142 for (
int i = 0; i < 4; i++)
144 for (
int j = 0; j < 3; j++)
146 Delta1[i][j] = Particles.InvM(MeshConstraints[ElementIndex][i])
147 *
dC2[i][j] * LambdaArray[2 * ElementIndex + 1] - C2Contribution[ElementIndex][i][j];
151 for (
int i = 0; i < 4; i++)
156 for (
int i = 0; i < 4; i++)
158 C2Contribution[ElementIndex][i] +=
Delta[i];
177 for (
int i = 0; i < 3; i++)
179 for (
int j = 0; j < 3; j++)
184 C1 = FMath::Sqrt(C1);
200 for (
int i = 0; i < 4; i++)
202 for (
int j = 0; j < 3; j++)
204 Denom +=
dC1[i][j] * Particles.InvM(MeshConstraints[ElementIndex][i]) *
dC1[i][j];
208 LambdaArray[2 * ElementIndex + 0] +=
DLambda;
211 for (
int i = 0; i < 4; i++)
213 for (
int j = 0; j < 3; j++)
215 Delta2[i][j] = Particles.InvM(MeshConstraints[ElementIndex][i]) *
dC1[i][j] *
DLambda;
219 for (
int i = 0; i < 4; i++)
221 for (
int j = 0; j < 3; j++)
223 Delta1[i][j] = Particles.InvM(MeshConstraints[ElementIndex][i])
224 *
dC1[i][j] * LambdaArray[2 * ElementIndex + 0] - C1Contribution[ElementIndex][i][j];
228 for (
int i = 0; i < 4; i++)
233 for (
int i = 0; i < 4; i++)
235 C1Contribution[ElementIndex][i] +=
Delta[i];
#define SCOPE_CYCLE_COUNTER(Stat)
Definition Stats.h:650
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
Definition BlendedXPBDCorotatedConstraints.h:16
virtual TVec4< TVector< T, 3 > > GetDeterminantDelta(const ParticleType &Particles, const T Dt, const int32 ElementIndex, const T Tol=(T) 1e-3) const override
Definition BlendedXPBDCorotatedConstraints.h:104
FBlendedXPBDCorotatedConstraints(const ParticleType &InParticles, const TArray< TVector< int32, 4 > > &InMesh, const TArray< T > &EMeshArray, const T &NuMesh=(T).3, const bool bRecordMetricIn=false, const T &InZeta=(T) 1.)
Definition BlendedXPBDCorotatedConstraints.h:52
virtual ~FBlendedXPBDCorotatedConstraints()
Definition BlendedXPBDCorotatedConstraints.h:75
FBlendedXPBDCorotatedConstraints(const ParticleType &InParticles, const TArray< TVector< int32, 4 > > &InMesh, const bool bRecordMetricIn=true, const T &EMesh=(T) 10.0, const T &NuMesh=(T).3, const T &InZeta=(T) 1.)
Definition BlendedXPBDCorotatedConstraints.h:28
virtual void Init() const override
Definition BlendedXPBDCorotatedConstraints.h:95
virtual TVec4< TVector< T, 3 > > GetPolarDelta(const ParticleType &Particles, const T Dt, const int32 ElementIndex, const T Tol=(T) 1e-3) const override
Definition BlendedXPBDCorotatedConstraints.h:166
virtual void ApplyInSerial(ParticleType &Particles, const T Dt, const int32 ElementIndex) const override
Definition BlendedXPBDCorotatedConstraints.h:78
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
T Lambda
Definition XPBDCorotatedConstraints.h:645
TArray< T > DmInverse
Definition XPBDCorotatedConstraints.h:638
PMatrix< T, 3, 3 > F(const int e, const ParticleType &InParticles) const
Definition XPBDCorotatedConstraints.h:230
TVec4< TVector< T, 3 > > GetDeterminantGradient(const PMatrix< T, 3, 3 > &Fe, const PMatrix< T, 3, 3 > &DmInvT) const
Definition XPBDCorotatedConstraints.h:373
PMatrix< T, 3, 3 > ElementDmInv(const int e) const
Definition XPBDCorotatedConstraints.h:234
TVec4< TVector< T, 3 > > GetPolarGradient(const PMatrix< T, 3, 3 > &Fe, const PMatrix< T, 3, 3 > &Re, const PMatrix< T, 3, 3 > &DmInvT, const T C1) const
Definition XPBDCorotatedConstraints.h:341
T Mu
Definition XPBDCorotatedConstraints.h:644
bool bRecordMetric
Definition XPBDCorotatedConstraints.h:651
int32 Num() const
Definition Vector.h:150
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
void PolarDecomposition(const PMatrix< T, 2, 2 > &A, GivensRotation< T > &R, PMatrix< T, 2, 2 > &S_Sym)
2x2 polar decomposition.
Definition ImplicitQRSVD.h:323
static constexpr UE_FORCEINLINE_HINT T Square(const T A)
Definition UnrealMathUtility.h:578