21 template <
typename T,
typename ParticleType>
39 const T GridDx = (T).1,
44 const T&
EMesh = (T)1000.0,
47 :
Base(
InParticles,
InMesh, GridDx,
EMesh,
NuMesh),
MaxDt(
MaxDtIn),
MinDt(
MinDtIn),
CFLCoeff(
CFLCoeffIn),
MPMGrid(GridDx),
MPMTransfer(
MPMGrid,
InParticles.
Size()),
PreviousColoringPtr(nullptr)
52 LambdaArray.
Init((T)0., 2 * MeshConstraints.Num());
53 DmInverse.
Init((T)0., 9 * MeshConstraints.Num());
54 Measure.
Init((T)0., MeshConstraints.Num());
57 for (
int e = 0; e <
InMesh.Num(); e++)
61 for (
int r = 0; r < 3; r++) {
62 for (
int c = 0; c < 3; c++) {
63 DmInverse[(3 * 3) * e + 3 * r + c] =
DmInv.GetAt(r, c);
67 Measure[e] =
Dm.Determinant() / (T)6.;
69 if (Measure[e] < (T)0.)
71 Measure[e] = -Measure[e];
85 file.Append(
TEXT(
"/HoudiniOutput/GridData.geo"));
103 FString
HeaderInfo = FString(
TEXT(
"NPoints ")) + FString::FromInt(Np) + FString(
TEXT(
" NPrims ")) + FString::FromInt(0) + FString(
TEXT(
"\r\n"));
104 FString
MoreHeader = FString(
TEXT(
"NPointGroups 0 NPrimGroups 0\r\nNPointAttrib 0 NVertexAttrib 0 NPrimAttrib 0 NAttrib 0\r\n"));
109 for (
int32 i = 0; i < Np; i++) {
124 for (T& Lambdas : LambdaArray) { Lambdas = (T)0.; }
135 MPMTransfer.ComputeElementMetaData(MeshConstraints);
226 T
AlphaTilde = (T)1. / (Dt * Dt * Mu * Measure[ElementIndex]);
231 for (
int32 k = 0; k <
MPMTransfer.ElementGridNodeIncidentElements[ElementIndex].Num(); k++) {
234 for (
int32 alpha = 0; alpha < 3; alpha++) {
243 for (
int32 k = 0; k <
MPMTransfer.ElementGridNodeIncidentElements[ElementIndex].Num(); k++) {
247 for (
int32 alpha = 0; alpha < 3; alpha++) {
254 void ApplyDet(ParticleType& Particles,
const T Dt,
const int32 ElementIndex)
274 T
AlphaTilde = (T)2. / (Dt * Dt * Lambda * Measure[ElementIndex]);
279 for (
int32 k = 0; k <
MPMTransfer.ElementGridNodeIncidentElements[ElementIndex].Num(); k++) {
282 for (
int32 alpha = 0; alpha < 3; alpha++) {
291 for (
int32 k = 0; k <
MPMTransfer.ElementGridNodeIncidentElements[ElementIndex].Num(); k++) {
295 for (
int32 alpha = 0; alpha < 3; alpha++) {
312 ApplyDet(Particles, Dt, ElementIndex);
324 for (
int i = 0; i < 3; i++) {
325 for (
int c = 0; c < 3; c++) {
326 Result.SetAt(c, i, LocalPositions[i+1][c] - LocalPositions[0][c]);
338 TVec4<TVector<T, 3>> GetPolarGradient(
const TVec4<TVector<T, 3>>& LocalPositions,
const int32 ElementIndex, T& Constraint,
const T Tol = T(1e-4))
const
346 for (
int i = 0; i < 3; i++)
348 for (
int j = 0; j < 3; j++)
353 C1 = FMath::Sqrt(C1);
368 for (
int alpha = 0; alpha < 3; alpha++) {
369 for (
int l = 0; l < 3; l++) {
375 for (
int ie = 0;
ie < 3;
ie++) {
376 for (
int alpha = 0; alpha < 3; alpha++) {
381 for (
int ie = 0;
ie < 3;
ie++) {
382 for (
int alpha = 0; alpha < 3; alpha++) {
383 for (
int m = 0;
m < 3;
m++) {
384 for (
int n = 0; n < 3; n++) {
385 for (
int j = 0; j < 3; j++) {
386 dC1[
ie + 1][alpha] -= (
Fe.GetAt(
m, n) - Re.GetAt(
m, n)) *
dRdF[9 * (alpha * 3 + j) +
m * 3 + n] *
DmInvT.GetAt(j,
ie);
392 for (
int alpha = 0; alpha < 3; alpha++) {
393 for (
int m = 0;
m < 3;
m++) {
394 for (
int n = 0; n < 3; n++) {
395 for (
int l = 0; l < 3; l++) {
396 for (
int j = 0; j < 3; j++) {
397 dC1[0][alpha] += (
Fe.GetAt(
m, n) - Re.GetAt(
m, n)) *
dRdF[9 * (alpha * 3 + j) +
m * 3 + n] *
DmInvT.GetAt(j, l);
406 for (
int i = 0; i < 4; i++)
408 for (
int j = 0; j < 3; j++)
417 TVec4<TVector<T, 3>> GetDetGradient(
const TVec4<TVector<T, 3>>& LocalPositions,
const int32 ElementIndex, T& Constraint,
const T Tol = T(1e-4))
const
422 T J =
Fe.Determinant();
433 JFinvT.SetAt(0, 0,
Fe.GetAt(1, 1) *
Fe.GetAt(2, 2) -
Fe.GetAt(2, 1) *
Fe.GetAt(1, 2));
434 JFinvT.SetAt(0, 1,
Fe.GetAt(2, 0) *
Fe.GetAt(1, 2) -
Fe.GetAt(1, 0) *
Fe.GetAt(2, 2));
435 JFinvT.SetAt(0, 2,
Fe.GetAt(1, 0) *
Fe.GetAt(2, 1) -
Fe.GetAt(2, 0) *
Fe.GetAt(1, 1));
436 JFinvT.SetAt(1, 0,
Fe.GetAt(2, 1) *
Fe.GetAt(0, 2) -
Fe.GetAt(0, 1) *
Fe.GetAt(2, 2));
437 JFinvT.SetAt(1, 1,
Fe.GetAt(0, 0) *
Fe.GetAt(2, 2) -
Fe.GetAt(2, 0) *
Fe.GetAt(0, 2));
438 JFinvT.SetAt(1, 2,
Fe.GetAt(2, 0) *
Fe.GetAt(0, 1) -
Fe.GetAt(0, 0) *
Fe.GetAt(2, 1));
439 JFinvT.SetAt(2, 0,
Fe.GetAt(0, 1) *
Fe.GetAt(1, 2) -
Fe.GetAt(1, 1) *
Fe.GetAt(0, 2));
440 JFinvT.SetAt(2, 1,
Fe.GetAt(1, 0) *
Fe.GetAt(0, 2) -
Fe.GetAt(0, 0) *
Fe.GetAt(1, 2));
441 JFinvT.SetAt(2, 2,
Fe.GetAt(0, 0) *
Fe.GetAt(1, 1) -
Fe.GetAt(1, 0) *
Fe.GetAt(0, 1));
446 for (
int32 alpha = 0; alpha < 3; alpha++) {
450 for (
int32 alpha = 0; alpha < 3; alpha++) {
451 for (
int32 l = 0; l < 3; l++) {
459 void FinalG2P(ParticleType& Particles)
463 Particles.P(p) = TVec3<T>((T)0.);
464 for (int32 ii = 0; ii < int32(MPMGrid.NPerDir); ii++)
466 T Nii = MPMGrid.Nijk(MPMTransfer.Weights[p][0], ii);
467 for (int32 jj = 0; jj < int32(MPMGrid.NPerDir); jj++)
469 T Njj = MPMGrid.Nijk(MPMTransfer.Weights[p][1], jj);
470 for (int32 kk = 0; kk < int32(MPMGrid.NPerDir); kk++)
472 T Nkk = MPMGrid.Nijk(MPMTransfer.Weights[p][2], kk);
473 TVector<int32, 3> LocIndex = { ii, jj, kk };
474 TVector<int32, 3> GlobIndex = MPMGrid.Loc2GlobIndex(MPMTransfer.Indices[p], LocIndex);
475 int32 GlobIndexFlat = MPMGrid.FlatIndex(GlobIndex);
477 Particles.P(p) += Nii * Njj * Nkk * GridPositions[GlobIndexFlat];
481 }, Particles.Size() < 50);
497 bool InitialGridDataWritten =
false;
OODEFFUNC typedef const char * file
Definition oodle2.h:678
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
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
@ FILEWRITE_Append
Definition FileManager.h:20
uint32 Size
Definition VulkanMemory.cpp:4034
static TArray< TArray< int32 > > ComputeGraphColoringAllDynamic(const TArray< TVec4< int32 > > &Graph, const Chaos::TDynamicParticles< T, 3 > &InParticles, const int32 GraphParticlesStart, const int32 GraphParticlesEnd)
Definition GraphColoring.h:40
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
PMatrix< T, 3, 3 > DsInit(const int e, const ParticleType &InParticles) const
Definition XPBDCorotatedConstraints.h:208
virtual void Init() const
Definition XPBDCorotatedConstraints.h:254
TArray< T > DmInverse
Definition XPBDCorotatedConstraints.h:638
PMatrix< T, 3, 3 > ElementDmInv(const int e) const
Definition XPBDCorotatedConstraints.h:234
T Mu
Definition XPBDCorotatedConstraints.h:644
Definition XPBDGridBasedCorotatedConstraints.h:23
T MaxDt
Definition XPBDGridBasedCorotatedConstraints.h:485
const TArray< TArray< int32 > > GetElementsPerColor() const
Definition XPBDGridBasedCorotatedConstraints.h:203
void ApplyInParallel(ParticleType &Particles, const T Dt)
Definition XPBDGridBasedCorotatedConstraints.h:302
void Init(const ParticleType &InParticles, const T Dt)
Definition XPBDGridBasedCorotatedConstraints.h:122
TArray< TArray< int32 > > ElementsPerColor
Definition XPBDGridBasedCorotatedConstraints.h:490
FXPBDGridBasedCorotatedConstraints(const ParticleType &InParticles, const TArray< TVector< int32, 4 > > &InMesh, const T GridDx=(T).1, const bool bRecordMetricIn=true, const T MaxDtIn=(T).1, const T MinDtIn=(T).01, const T CFLCoeffIn=(T).4, const T &EMesh=(T) 1000.0, const T &NuMesh=(T).3)
Definition XPBDGridBasedCorotatedConstraints.h:36
const TMPMTransfer< T > GetMPMTransfer() const
Definition XPBDGridBasedCorotatedConstraints.h:206
void ApplyPolar(ParticleType &Particles, const T Dt, const int32 ElementIndex)
Definition XPBDGridBasedCorotatedConstraints.h:208
TMPMGrid< T > MPMGrid
Definition XPBDGridBasedCorotatedConstraints.h:488
TMPMTransfer< T > MPMTransfer
Definition XPBDGridBasedCorotatedConstraints.h:489
void ApplyDet(ParticleType &Particles, const T Dt, const int32 ElementIndex)
Definition XPBDGridBasedCorotatedConstraints.h:254
void TimeStepPostprocessing(ParticleType &InParticles, const T Dt)
Definition XPBDGridBasedCorotatedConstraints.h:147
const TArray< TArray< TArray< int32 > > > GetElementsPerSubColors() const
Definition XPBDGridBasedCorotatedConstraints.h:205
void WriteGridNodes()
Definition XPBDGridBasedCorotatedConstraints.h:81
const TArray< TArray< int32 > > GetPreviousColoring() const
Definition XPBDGridBasedCorotatedConstraints.h:204
T CFLCoeff
Definition XPBDGridBasedCorotatedConstraints.h:487
TArray< TVector< T, 3 > > GridPositions
Definition XPBDGridBasedCorotatedConstraints.h:496
T ComputeCFLDt(const ParticleType &InParticles)
Definition XPBDGridBasedCorotatedConstraints.h:166
TArray< TArray< TArray< int32 > > > ElementsPerSubColors
Definition XPBDGridBasedCorotatedConstraints.h:494
T MinDt
Definition XPBDGridBasedCorotatedConstraints.h:486
TUniquePtr< TArray< TArray< int32 > > > PreviousColoringPtr
Definition XPBDGridBasedCorotatedConstraints.h:493
TArray< T > GridData
Definition XPBDGridBasedCorotatedConstraints.h:495
Definition UniformGrid.h:315
Definition MPMTransfer.h:15
int32 Num() const
Definition Vector.h:150
static CORE_API FString ProjectDir()
Definition Paths.cpp:457
static CORE_API IFileManager & Get()
Definition FileManagerGeneric.cpp:1072
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void Init(const ElementType &Element, SizeType Number)
Definition Array.h:3043
Definition UniquePtr.h:107
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
void dRdFCorotated(const PMatrix< T, 3, 3 > &F, TVector< T, 81 > &dRdF)
Definition ImplicitQRSVD.h:782
TVector< T, 4 > TVec4
Definition Core.h:44
void CHAOS_API PhysicsParallelFor(int32 InNum, TFunctionRef< void(int32)> InCallable, bool bForceSingleThreaded=false)
Definition Parallel.cpp:55
void PolarDecomposition(const PMatrix< T, 2, 2 > &A, GivensRotation< T > &R, PMatrix< T, 2, 2 > &S_Sym)
2x2 polar decomposition.
Definition ImplicitQRSVD.h:323
void ComputeGridBasedGraphSubColoringPointer(const TArray< TArray< int32 > > &ElementsPerColor, const TMPMGrid< T > &Grid, const int32 GridSize, TArray< TArray< int32 > > *&PreviousColoring, const TArray< TArray< int32 > > &ConstraintsNodesSet, TArray< TArray< TArray< int32 > > > &ElementsPerSubColors)
Definition GraphColoring.h:53
@ false
Definition radaudio_common.h:23
static CORE_API bool SaveStringToFile(FStringView String, const TCHAR *Filename, EEncodingOptions EncodingOptions=EEncodingOptions::AutoDetect, IFileManager *FileManager=&IFileManager::Get(), uint32 WriteFlags=0)
Definition FileHelper.cpp:669
static constexpr UE_FORCEINLINE_HINT T Square(const T A)
Definition UnrealMathUtility.h:578