コード例 #1
0
 private void CalculateDivergence()
 {
     for (var i = 0; i < VelocityX.GetLength(0); i++)
     {
         for (var j = 0; j < VelocityX.GetLength(1); j++)
         {
             if (!IsInSimulatedSpace(i, j) || DefineBoundaryType(i, j) != BoundaryCondition.None)
             {
                 continue;
             }
             _divergence[i, j] = (_gradientX[i, j] - _gradientX[i - 1, j]) / GridStep +
                                 (_gradientY[i, j] - _gradientY[i - 1, j]) / GridStep;
         }
     }
 }
コード例 #2
0
        private void RecalculateBoundaries()
        {
            for (var i = 0; i < Boundaries.Count / 5; i += 5)
            {
                switch ((BoundaryCondition)Boundaries[i * 5 + 4])
                {
                case BoundaryCondition.ParabaloidInput:
                    break;

                case BoundaryCondition.None:
                    break;

                case BoundaryCondition.SimpleOutput:
                {
                    if (Boundaries[i * 5] == Boundaries[i * 5 + 2]) //Если сток вертикальный
                    {
                        if (Boundaries[i * 5] == 0)                 //Если сток слева
                        {
                            for (var j = Boundaries[i * 5 + 1]; j < Boundaries[i * 5 + 3]; j++)
                            {
                                VelocityX[0, j] = VelocityX[1, j];
                                VelocityY[0, j] = VelocityY[1, j];
                            }
                        }
                        else         //Если сток справа
                        {
                            for (var j = Boundaries[i * 5 + 1]; j < Boundaries[i * 5 + 3]; j++)
                            {
                                VelocityX[VelocityX.GetLength(0), j] = VelocityX[VelocityX.GetLength(0) - 1, j];
                                VelocityY[VelocityY.GetLength(0), j] = VelocityY[VelocityY.GetLength(0) - 1, j];
                            }
                        }
                    }
                    else                                //Если сток горизонтальный
                    {
                        if (Boundaries[i * 5 + 1] == 0) //Если сток сверху
                        {
                            for (var j = Boundaries[i * 5 + 2]; j < Boundaries[i * 5 + 4]; j++)
                            {
                                VelocityX[j, 0] = VelocityX[j, 1];
                                VelocityY[j, 0] = VelocityY[j, 1];
                            }
                        }
                        else         //Если сток снизу
                        {
                            for (var j = Boundaries[i * 5 + 2]; j < Boundaries[i * 5 + 4]; j++)
                            {
                                VelocityX[j, VelocityX.GetLength(1)] = VelocityX[j, VelocityX.GetLength(1) - 1];
                                VelocityY[j, VelocityX.GetLength(1)] = VelocityY[j, VelocityX.GetLength(1) - 1];
                            }
                        }
                    }
                    break;
                }

                case BoundaryCondition.SolidWall:
                {
                    //Знак_вопроса
                    break;
                }

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
        }