Exemplo n.º 1
0
 public SPHSimulation(float cellSpace, Rect domain)
 {
     CellSpace   = cellSpace;
     Domain      = domain;
     Viscosity   = 0.2f;
     m_grid      = new IndexGrid(CellSpace, Domain);
     SKGeneral   = new Poly6(CellSpace);
     SKPressure  = new Spiky(CellSpace);
     SKViscosity = new Viscosity(CellSpace);
 }
Exemplo n.º 2
0
        public void Test_VerifyPageIndex_Keep_Fraction()
        {
            IndexGrid grid = new IndexGrid();

            grid.CurrentPageIndex = 1;
            grid.PageSize         = 10;
            grid.VirtualItemCount = 19;

            int pageIndex = grid.GetValidPageIndex();

            Assert.AreEqual(1, pageIndex, "The valid page index wasn't kept.");
        }
Exemplo n.º 3
0
        public void Test_GetValidPageIndex_ZeroItems_Adjust()
        {
            IndexGrid grid = new IndexGrid();

            grid.CurrentPageIndex = 1;
            grid.PageSize         = 10;
            grid.VirtualItemCount = 0;

            int pageIndex = grid.GetValidPageIndex();

            Assert.AreEqual(0, pageIndex, "Invalid page index.");
        }
Exemplo n.º 4
0
        /// <summary>
        /// Initializes the page and the controller for the specified type.
        /// </summary>
        /// <param name="type"></param>
        /// <param name="isPaged"></param>
        public void Initialize(Type type, IndexGrid indexGrid, bool isPaged)
        {
            Command = new IndexCommandInfo(type.Name);

            Grid       = indexGrid;
            controller = IndexController.New(this,
                                             new PagingLocation(Grid.CurrentPageIndex, Grid.PageSize));

            Grid.SortCommand      += new DataGridSortCommandEventHandler(Grid_SortCommand);
            Grid.PageIndexChanged += new DataGridPageChangedEventHandler(Grid_PageIndexChanged);
            SortExpression         = indexGrid.CurrentSort;
        }
Exemplo n.º 5
0
        public void Test_VerifyPageIndex_Adjust_Fraction()
        {
            IndexGrid grid = new IndexGrid();

            grid.CurrentPageIndex = 2;
            grid.PageSize         = 10;
            grid.VirtualItemCount = 11;

            int pageIndex = grid.GetValidPageIndex();

            // Check that the page index was moved from 1 (an invalid index) to 0 (which is valid)
            Assert.AreEqual(1, pageIndex, "The page index wasn't adjusted according to the maximum number of pages.");
        }
Exemplo n.º 6
0
    private void CalculatePressureAndDensities(ref ArrayList particles, ref IndexGrid grid)
    {
        Vector3 dist;

        foreach (FluidParticle particle in particles)
        {
            particle.Density = 0.0f;
            foreach (int nIdx in grid.GetNeighbourIndex(particle))
            {
                if (particle != (FluidParticle)particles[nIdx])
                {
                    dist              = particle.Position - ((FluidParticle)particles[nIdx]).Position;
                    particle.Density += particle.Mass * (float)this.SKGeneral.Calculate(ref dist);
                }
            }
            particle.UpdatePressure();
        }
    }
Exemplo n.º 7
0
    private void CheckParticleDistance(ref ArrayList particles, ref IndexGrid grid)
    {
        float minDist   = 0.5f * CellSpace;
        float minDistSq = minDist * minDist;

        Vector3 dist;

        for (int i = 0; i < particles.Count; i++)
        {
            FluidParticle p = (FluidParticle)particles[i];

            foreach (int nIdx in grid.GetNeighbourIndex(p))
            {
                FluidParticle pn = (FluidParticle)particles[nIdx];

                if (p != pn)
                {
                    dist = pn.Position - p.Position;
                    float distLenSq = dist.sqrMagnitude;

                    if (distLenSq < minDistSq)
                    {
                        if (distLenSq > Mathf.Epsilon)
                        {
                            float distLen = (float)Math.Sqrt((double)distLenSq);
                            dist           = dist * 0.5f * (distLen - minDist) / distLen;
                            pn.Position    = pn.Position - dist;
                            pn.PositionOld = pn.PositionOld - dist;
                            p.Position     = p.Position + dist;
                            p.PositionOld  = p.PositionOld + dist;
                        }
                        else
                        {
                            float diff = 0.5f * minDist;
                            pn.Position.x   -= diff;
                            pn.Position.y   -= diff;
                            p.Position.x    += diff;
                            p.PositionOld.y += diff;
                        }
                    }
                }
            }
        }
    }
Exemplo n.º 8
0
    private void CalculateForces(ref ArrayList particles, ref IndexGrid grid, Vector3 globalForce)
    {
        Vector3 f, dist;
        float   scalar;

        for (int i = 0; i < particles.Count; i++)
        {
            FluidParticle p = (FluidParticle)particles[i];
            p.Force += globalForce;

            foreach (int nIdx in grid.GetNeighbourIndex(p))
            {
                if (nIdx < i)
                {
                    FluidParticle pn = (FluidParticle)particles[nIdx];

                    if (pn.Density > Mathf.Epsilon && p != pn)
                    {
                        dist = p.Position - pn.Position;

                        scalar    = pn.Mass * (p.Pressure + pn.Pressure) / (2.0f * pn.Density);
                        f         = SKPressure.CalculateGradient(ref dist);
                        f         = f * scalar;
                        p.Force  -= f;
                        pn.Force += f;

                        scalar    = pn.Mass * (float)this.SKViscosity.CalculateLaplacian(ref dist) * Viscosity * 1 / pn.Density;
                        f         = pn.Velocity - p.Velocity;
                        f         = f * scalar;
                        p.Force  += f;
                        pn.Force -= f;
                    }
                }
            }
        }
    }
Exemplo n.º 9
0
 /// <summary>
 /// Initializes the page and the controller for the specified type.
 /// </summary>
 /// <param name="type"></param>
 /// <param name="indexGrid"></param>
 public void Initialize(Type type, IndexGrid indexGrid)
 {
     Initialize(type, indexGrid, false);
 }