public static PulsationSolutionItemModel ToItemModel(this Bundle bundle, PulsationData pulsationData) { var result = new PulsationSolutionItemModel(pulsationData); result.Id = bundle.Id; result.Name = bundle.Name; result.Count = bundle.GetCount(); result.IsTimeDependent = bundle.IsTimeDependent(); return(result); }
public PulsationSolutionItemModel(PulsationData data) { ObjectHelper.Copy(data, this, typeof(ParameterAttribute)); Info = JsonConvert.SerializeObject(new { data.H1, data.H2, data.H3 }); }
public static void Solve(PulsationModel model) { PulsationData data = new PulsationData(model); IContinue timeMaxContinue = new TimeMaxContinue(data.TimeMax); IContinue calculationTimeoutContinue = new CalculationTimeoutContinue(); IContinue periodicConvergenceContinue = new ConvergencePeriodicContinue(); PulsationSchemeSolver pulsationSchemeSolver = new PulsationSchemeSolver(); PulsationLaminarExactSolver pulsationLaminarExactSolver = new PulsationLaminarExactSolver(); double H1 = data.H1; double H2 = data.H2; double H3 = data.H3; double s = data.s; double Re = data.Re; double epsilon = data.epsilon; double beta = data.beta; if (!model.IsComplexMode) { H1 = s * s; H2 = Re * beta * beta; H3 = epsilon * Re; } Func <double, double, double> f = (r, t) => PulsationSolver.f(H2, H3, r, t); Func <double, double, double> u = (r, t) => PulsationSolver.u(Re, s, r, t); double a = 1 / Math.Sqrt(H1); var leftBoundaryCondition = new BoundaryCondition(BoundaryConditionLocation.Left, BoundaryConditionType.Neumann); var rightBoundaryCondition = new BoundaryCondition(BoundaryConditionLocation.Right, BoundaryConditionType.Dirichlet); double[] initial = new double[data.GridN]; if (model.Exact) { data.FlowMode = "Ћаминарный"; data.SolverType = typeof(PulsationLaminarExactSolver).Name; pulsationLaminarExactSolver.Solve("ѕульсирующее ламинарное течение в трубе: точное решение", data, u, timeMaxContinue); } if (model.Implicit) { data.FlowMode = "Ћаминарный"; data.SolverType = typeof(PulsationSchemeSolver).Name; data.SchemeType = typeof(DiffusionImplicitCylindricScheme1D).Name; pulsationSchemeSolver.Solve( "ѕульсирующее ламинарное течение в трубе: численное решение с помощью не¤вной схемы", data, new DiffusionImplicitCylindricScheme1D(a, f), initial, leftBoundaryCondition, rightBoundaryCondition, timeMaxContinue); } if (model.CrankNikolson) { data.FlowMode = "Ћаминарный"; data.SolverType = typeof(PulsationSchemeSolver).Name; data.SchemeType = typeof(DiffusionCrankNicolsonCylindricScheme1D).Name; pulsationSchemeSolver.Solve( "ѕульсирующее ламинарное течение в трубе: численное решение с помощью схемы ранка Ќикольсона", data, new DiffusionCrankNicolsonCylindricScheme1D(a, f), initial, leftBoundaryCondition, rightBoundaryCondition, timeMaxContinue, periodicConvergenceContinue); } if (model.Explicit) { data.FlowMode = "Ћаминарный"; data.SolverType = typeof(PulsationSchemeSolver).Name; data.SchemeType = typeof(DiffusionExplicitScheme1D).Name; pulsationSchemeSolver.Solve( "ѕульсирующее ламинарное течение в трубе: численное решение с помощью ¤вной схемы", data, new DiffusionExplicitScheme1D(a, f), initial, leftBoundaryCondition, rightBoundaryCondition, timeMaxContinue); } if (model.Turbulent) { data.FlowMode = "“урбулентный"; data.SolverType = typeof(PulsationSchemeSolver).Name; data.SchemeType = typeof(DiffusionInhomogeneousImplicitCylindricScheme1D).Name; pulsationSchemeSolver.Solve( "ѕульсирующее турбулентное течение в трубе: численное решение с помощью не¤вной схемы", data, new DiffusionInhomogeneousImplicitCylindricScheme1D(PulsationSolver.k, f), initial, leftBoundaryCondition, rightBoundaryCondition, timeMaxContinue, periodicConvergenceContinue); } }