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;
            }
        }
示例#2
0
        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];
        }