76 for (
int32 p = 0; p < N; p++)
93 for (
int32 p = 0; p < N; p++)
119 for (int32 jjj = 0; jjj < int32(GridCells[1] / Grid.NPerDir); jjj++)
121 for (int32 kkk = 0; kkk < int32(GridCells[2] / Grid.NPerDir); kkk++)
123 TVector<int32, 3> MultiIndex = { iii * int32(Grid.NPerDir) + ii, jjj * int32(Grid.NPerDir) + jj, kkk * int32(Grid.NPerDir) + kk };
124 int32 CellIndex = Grid.FlatIndex(MultiIndex);
125 P2GApplyHelper(InParticles, CellIndex, GridData);
143 if (CellIndex < NumCells && CellData[CellIndex].
Num() > 0)
145 for (
int32 i = 0; i < CellData[CellIndex].Num(); i++)
147 int32 p = CellData[CellIndex][i];
162 for (
int32 alpha = 0; alpha < 3; alpha++)
177 for (
int32 l = 0; l < 3; ++l)
190 ElementGridNodes.SetNum(
InMesh.Num());
191 ElementGridNodeWeights.SetNum(
InMesh.Num());
192 ElementGridNodeIncidentElements.SetNum(
InMesh.Num());
193 ElementGridNodesSet.SetNum(
InMesh.Num());
197 ElementGridNodes[e].SetNum(NPerEle * 4);
198 ElementGridNodeWeights[e].SetNum(NPerEle * 4);
221 ComputeIncidentElements(ElementGridNodes[e], ElementGridNodeIncidentElements[e]);
222 ElementGridNodesSet[e].SetNum(ElementGridNodeIncidentElements[e].
Num());
223 for (
int32 kk = 0;
kk < ElementGridNodeIncidentElements[e].Num();
kk++)
225 ElementGridNodesSet[e][
kk] = ElementGridNodes[e][ElementGridNodeIncidentElements[e][
kk][0]];
253 Ranges.
SetNum(NumNodes + 1);
255 IncidentElements.SetNum(Ranges.
Num() - 1);
257 for (
int32 p = 0; p < IncidentElements.Num(); ++p)
259 IncidentElements[p].SetNum(Ranges[p + 1] - Ranges[p]);
260 for (
int32 e = Ranges[p]; e < Ranges[p + 1]; e++)
262 IncidentElements[p][e - Ranges[p]] =
Ordering[e];
269 GridPositions.SetNum(
Grid.Size());
273 T
Mass = GridData[(NTransfer + 1) * i];
275 GridPositions[i] =
XOld;
289 for (
int32 i = 0; i < 4; i++) {
291 int32 FlatIndex = ElementGridNodes[ElementIndex][NPerEle * i +
ii];
293 Result[i][
Alpha] += ElementGridNodeWeights[ElementIndex][NPerEle * i +
ii] * GridPositions[FlatIndex][
Alpha];
307 TVector<int32, 3> BaseIndex = Indices[p];
308 for (int32 ii = 0; ii < int32(Grid.NPerDir); ii++)
310 T Nii = Grid.Nijk(Weights[p][0], ii);
311 T dNii = Grid.dNijk(Weights[p][0], ii, Grid.GetDx()[0]);
312 for (int32 jj = 0; jj < int32(Grid.NPerDir); jj++)
314 T Njj = Grid.Nijk(Weights[p][1], jj);
315 T dNjj = Grid.dNijk(Weights[p][1], jj, Grid.GetDx()[0]);
316 for (int32 kk = 0; kk < int32(Grid.NPerDir); kk++)
318 T Nkk = Grid.Nijk(Weights[p][2], kk);
319 T dNkk = Grid.dNijk(Weights[p][2], kk, Grid.GetDx()[0]);
320 TVector<T, 3> Ni = { Nii, Njj, Nkk };
321 TVector<T, 3> dNi = { dNii, dNjj, dNkk };
322 TVector<int32, 3> LocIndex = { ii, jj, kk };
323 TVector<int32, 3> GlobIndex = Grid.Loc2GlobIndex(BaseIndex, LocIndex);
324 int32 GlobIndexFlat = Grid.FlatIndex(GlobIndex);
325 if (GridData[(NTransfer + 1) * GlobIndexFlat] != T(0))
327 if (Grid.interp == TMPMGrid<T>::linear)
329 TVector<T, 3> dN((T)0.);
330 Grid.GradNi(Ni, dNi, dN);
331 for (int32 l = 0; l < 3; l++)
333 T GridQuantity = GridData[(NTransfer + 1) * GlobIndexFlat + 1 + l] / GridData[(NTransfer + 1) * GlobIndexFlat];
334 for (int32 iii = 0; iii < int32(NumModes); ++iii)
335 AArray[NumModes * 3 * p + NumModes * l + iii] += dN[iii] * GridQuantity;
340 TVector<T, 3> rip = Grid.Node(GlobIndexFlat) - Particles.GetX(p);
341 T NiProdbInv = (T(4) * Ni[0] * Ni[1] * Ni[2]) / (Grid.GetDx()[0] * Grid.GetDx()[0]);
342 for (int32 l = 0; l < 3; l++)
344 T GridQuantity = GridData[(NTransfer + 1) * GlobIndexFlat + 1 + l] / GridData[(NTransfer + 1) * GlobIndexFlat];
345 for (int32 iii = 0; iii < int32(NumModes); ++iii)
346 AArray[NumModes * 3 * p + NumModes * l + iii] += NiProdbInv * rip[iii] * GridQuantity;
354 }, Particles.Size() < 50);
359 for (
int32 i = 0; i < GridPositions.Num(); i++)
361 T
Mi = GridData[(NTransfer + 1) * i];
365 for (
int32 alpha = 0; alpha < 3; alpha++)
367 GridData[(NTransfer + 1) * i + alpha + 1] =
Mi * (GridPositions[i][alpha] -
NodePos[alpha]) / Dt;
384 Particles.V(p) = TVec3<T>((T)0.);
385 for (int32 ii = 0; ii < int32(Grid.NPerDir); ii++)
387 T Nii = Grid.Nijk(Weights[p][0], ii);
388 for (int32 jj = 0; jj < int32(Grid.NPerDir); jj++)
390 T Njj = Grid.Nijk(Weights[p][1], jj);
391 for (int32 kk = 0; kk < int32(Grid.NPerDir); kk++)
393 T Nkk = Grid.Nijk(Weights[p][2], kk);
394 TVector<int32, 3> LocIndex = { ii, jj, kk };
395 TVector<int32, 3> GlobIndex = Grid.Loc2GlobIndex(Indices[p], LocIndex);
396 int32 GlobIndexFlat = Grid.FlatIndex(GlobIndex);
397 if (GridData[GlobIndexFlat * (NTransfer + 1)] > T(0))
399 for (int32 alpha = 0; alpha < 3; alpha++)
401 Particles.V(p)[alpha] += Nii * Njj * Nkk * GridData[GlobIndexFlat * (NTransfer + 1) + alpha + 1] / GridData[GlobIndexFlat * (NTransfer + 1)];
407 }, Particles.Size() < 50);
416 for (
int32 i = 0; i < 4; i++) {
418 for (
int32 alpha = 0; alpha < 3; alpha++) {
427 for (
int32 node = 0; node < ElementGridNodeIncidentElements[ElementIndex].Num(); node++)
431 for (
int32 alpha = 0; alpha < 3; alpha++)
#define ensure( InExpression)
Definition AssertionMacros.h:464
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
uint32 Size() const
Definition ArrayCollection.h:66
Definition DynamicParticles.h:11
Definition UniformGrid.h:315
Definition MPMTransfer.h:15
TMPMTransfer(TMPMGrid< T > &_Grid)
Definition MPMTransfer.h:43
TArray< TArray< TArray< int32 > > > ElementGridNodeIncidentElements
Definition MPMTransfer.h:35
TArray< TVector< T, 3 > > Weights
Definition MPMTransfer.h:27
TArray< TVector< int32, 3 > > Indices
Definition MPMTransfer.h:28
TArray< TArray< int32 > > ElementGridNodes
Definition MPMTransfer.h:33
TArray< TArray< T > > ElementGridNodeWeights
Definition MPMTransfer.h:34
void P2GApplyHelper(const TDynamicParticles< T, 3 > &InParticles, const int32 CellIndex, TArray< T > &GridData)
Definition MPMTransfer.h:140
TArray< TArray< int32 > > ElementGridNodesSet
Definition MPMTransfer.h:36
void G2P(const TArray< T > &GridData, TDynamicParticles< T, 3 > &Particles)
Definition MPMTransfer.h:380
void ComputeElementMetaData(const TArray< TVector< int32, 4 > > &InMesh)
Definition MPMTransfer.h:188
static void ComputeIncidentElements(const TArray< int32 > &ArrayIn, TArray< TArray< int32 > > &IncidentElements)
Definition MPMTransfer.h:231
void APICP2G(const int32 p, const int32 GlobIndex, const T mip, const TDynamicParticles< T, 3 > &Particles, TArray< T > &GridData)
Definition MPMTransfer.h:174
void InitialP2G(const TDynamicParticles< T, 3 > &InParticles, TArray< T > &GridData)
Definition MPMTransfer.h:61
uint32 NumModes
Definition MPMTransfer.h:40
TMPMTransfer(TMPMGrid< T > &_Grid, const int32 NumParticles)
Definition MPMTransfer.h:50
void ComputeGridPositions(const TArray< T > &GridData, const T Dt, TArray< TVector< T, 3 > > &GridPositions)
Definition MPMTransfer.h:267
TMPMTransfer()
Definition MPMTransfer.h:42
TArray< TArray< int32 > > CellData
Definition MPMTransfer.h:29
uint32 NPerSec
Definition MPMTransfer.h:18
TArray< TVector< T, 3 > > SparseP2G(const TVec4< TVector< T, 3 > > &InGradient, const int32 ElementIndex)
Definition MPMTransfer.h:411
TMPMGrid< T > & Grid
Definition MPMTransfer.h:25
TVec4< TVector< T, 3 > > SparseG2P(const TArray< TVector< T, 3 > > &GridPositions, const int32 ElementIndex)
Definition MPMTransfer.h:285
void GridPositionsToGridData(const TArray< TVector< T, 3 > > &GridPositions, const T Dt, TArray< T > &GridData)
Definition MPMTransfer.h:357
void ComputeAArray(const TArray< T > &GridData, const TDynamicParticles< T, 3 > &Particles)
Definition MPMTransfer.h:301
uint32 NPerEle
Definition MPMTransfer.h:19
int32 NumCells
Definition MPMTransfer.h:21
uint32 NTransfer
Definition MPMTransfer.h:20
TArray< T > AArray
Definition MPMTransfer.h:39
const TVector< T, d > & GetX(const int32 Index) const
Definition Particles.h:156
int32 Num() const
Definition Vector.h:150
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_FORCEINLINE_HINT SizeType Emplace(ArgsType &&... Args)
Definition Array.h:2561
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
UE_NODEBUG void Sort()
Definition Array.h:3418
Definition SkeletalMeshComponent.h:307
void CHAOS_API PhysicsParallelFor(int32 InNum, TFunctionRef< void(int32)> InCallable, bool bForceSingleThreaded=false)
Definition Parallel.cpp:55
U16 Index
Definition radfft.cpp:71