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; } } }
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(); } } }