private void CreateBoundryPsi() { Psi = new double[NumParticles]; double cellSize = ParticleRadius * 4.0; ParticleHash3d hash = new ParticleHash3d(NumParticles, cellSize); hash.NeighborhoodSearch(Positions); int[,] neighbors = hash.Neighbors; int[] numNeighbors = hash.NumNeighbors; CubicKernel3d kernel = new CubicKernel3d(cellSize); for (int i = 0; i < NumParticles; i++) { double delta = kernel.W_zero; for (int j = 0; j < numNeighbors[i]; j++) { int neighborIndex = neighbors[i, j]; Vector3d p = Positions[i] - Positions[neighborIndex]; delta += kernel.W(p.x, p.y, p.z); } double volume = 1.0 / delta; Psi[i] = Density * volume; } }
public FluidBody3d(ParticleSource source, double radius, double density, Matrix4x4d RTS) : base(source.NumParticles, radius, 1.0) { Density = density; Viscosity = 0.02; Dampning = 0; double d = ParticleDiameter; ParticleMass = 0.8 * d * d * d * Density; CreateParticles(source, RTS); double cellSize = ParticleRadius * 4.0; Kernel = new CubicKernel3d(cellSize); Hash = new ParticleHash3d(NumParticles, cellSize); Lambda = new double[NumParticles]; Densities = new double[NumParticles]; }