public CalculateTrajectoryEventArgs( StagesVariableValues StagesVariableValues, OutputParameters OutputParameters, CalculationInputData id) : base() { this.StagesVariableValues = StagesVariableValues; this.OutputParameters = OutputParameters; this.id = id; }
public void SetCalculationResult(StagesVariableValues variableParameterValues, OutputParameters outputParameters) { FirstStageVariableParameterTextBoxes[FirstStageVariableParameterType.n_0].Text = FormatConvert.ToString(variableParameterValues.firstStageVariableValues.n_0); FirstStageVariableParameterTextBoxes[FirstStageVariableParameterType.a_to].Text = FormatConvert.ToString(variableParameterValues.firstStageVariableValues.a_to * 1E-3); FirstStageVariableParameterTextBoxes[FirstStageVariableParameterType.mu_su_pr].Text = FormatConvert.ToString(variableParameterValues.firstStageVariableValues.mu_su_pr); FirstStageVariableParameterTextBoxes[FirstStageVariableParameterType.gamma_du].Text = FormatConvert.ToString(variableParameterValues.firstStageVariableValues.gamma_du); FirstStageVariableParameterTextBoxes[FirstStageVariableParameterType.mu_k].Text = FormatConvert.ToString(variableParameterValues.firstStageVariableValues.mu_k); SecondStageVariableParameterTextBoxes[SecondStageVariableParameterType.n_0].Text = FormatConvert.ToString(variableParameterValues.secondStageVariableValues.n_0); SecondStageVariableParameterTextBoxes[SecondStageVariableParameterType.a_to].Text = FormatConvert.ToString(variableParameterValues.secondStageVariableValues.a_to * 1E-3); SecondStageVariableParameterTextBoxes[SecondStageVariableParameterType.mu_su_pr].Text = FormatConvert.ToString(variableParameterValues.secondStageVariableValues.mu_su_pr); SecondStageVariableParameterTextBoxes[SecondStageVariableParameterType.gamma_du].Text = FormatConvert.ToString(variableParameterValues.secondStageVariableValues.gamma_du); TrajectoryOutputParameters[TrajectoryOutputParameterType.phi_k1].Text = FormatConvert.ToString(outputParameters.TrajectoryOutputParameters.phi_k1 * 180 / Math.PI); TrajectoryOutputParameters[TrajectoryOutputParameterType.phi_k2].Text = FormatConvert.ToString(outputParameters.TrajectoryOutputParameters.phi_k2 * 180 / Math.PI); TrajectoryOutputParameters[TrajectoryOutputParameterType.phi_0].Text = FormatConvert.ToString(outputParameters.TrajectoryOutputParameters.phi_0 * 180 / Math.PI); TrajectoryOutputParameters[TrajectoryOutputParameterType.V].Text = FormatConvert.ToString(outputParameters.TrajectoryOutputParameters.V); TrajectoryOutputParameters[TrajectoryOutputParameterType.H].Text = FormatConvert.ToString(outputParameters.TrajectoryOutputParameters.H * 1E-3); TrajectoryOutputParameters[TrajectoryOutputParameterType.nu].Text = FormatConvert.ToString(outputParameters.TrajectoryOutputParameters.nu * 180 / Math.PI); TrajectoryOutputParameters[TrajectoryOutputParameterType.t_1].Text = FormatConvert.ToString(outputParameters.TrajectoryOutputParameters.t_1); TrajectoryOutputParameters[TrajectoryOutputParameterType.t_2].Text = FormatConvert.ToString(outputParameters.TrajectoryOutputParameters.t_2); FirstStageOutputParameterTextBoxes[FirstStageOutputParameterType.P_0].Text = FormatConvert.ToString(outputParameters.FirstStageOutputData.P_0 * 1E-3); FirstStageOutputParameterTextBoxes[FirstStageOutputParameterType.m_0].Text = FormatConvert.ToString(outputParameters.FirstStageOutputData.m_0); FirstStageOutputParameterTextBoxes[FirstStageOutputParameterType.m_k].Text = FormatConvert.ToString(outputParameters.FirstStageOutputData.m_k); FirstStageOutputParameterTextBoxes[FirstStageOutputParameterType.m_t].Text = FormatConvert.ToString(outputParameters.FirstStageOutputData.m_t); FirstStageOutputParameterTextBoxes[FirstStageOutputParameterType.m_o].Text = FormatConvert.ToString(outputParameters.FirstStageOutputData.m_o); FirstStageOutputParameterTextBoxes[FirstStageOutputParameterType.m_g].Text = FormatConvert.ToString(outputParameters.FirstStageOutputData.m_g); FirstStageOutputParameterTextBoxes[FirstStageOutputParameterType.m_to].Text = FormatConvert.ToString(outputParameters.FirstStageOutputData.m_to); FirstStageOutputParameterTextBoxes[FirstStageOutputParameterType.m_su_pr].Text = FormatConvert.ToString(outputParameters.FirstStageOutputData.m_su_pr); FirstStageOutputParameterTextBoxes[FirstStageOutputParameterType.m_du].Text = FormatConvert.ToString(outputParameters.FirstStageOutputData.m_du); FirstStageOutputParameterTextBoxes[FirstStageOutputParameterType.m_sux].Text = FormatConvert.ToString(outputParameters.FirstStageOutputData.m_sux); FirstStageOutputParameterTextBoxes[FirstStageOutputParameterType.mu_sux].Text = FormatConvert.ToString(outputParameters.FirstStageOutputData.mu_sux); SecondStageOutputParameterTextBoxes[SecondStageOutputParameterType.P_0].Text = FormatConvert.ToString(outputParameters.SecondStageOutputData.P_0 * 1E-3); SecondStageOutputParameterTextBoxes[SecondStageOutputParameterType.m_0].Text = FormatConvert.ToString(outputParameters.SecondStageOutputData.m_0); SecondStageOutputParameterTextBoxes[SecondStageOutputParameterType.m_k].Text = FormatConvert.ToString(outputParameters.SecondStageOutputData.m_k); SecondStageOutputParameterTextBoxes[SecondStageOutputParameterType.m_t].Text = FormatConvert.ToString(outputParameters.SecondStageOutputData.m_t); SecondStageOutputParameterTextBoxes[SecondStageOutputParameterType.m_o].Text = FormatConvert.ToString(outputParameters.SecondStageOutputData.m_o); SecondStageOutputParameterTextBoxes[SecondStageOutputParameterType.m_g].Text = FormatConvert.ToString(outputParameters.SecondStageOutputData.m_g); SecondStageOutputParameterTextBoxes[SecondStageOutputParameterType.m_to].Text = FormatConvert.ToString(outputParameters.SecondStageOutputData.m_to); SecondStageOutputParameterTextBoxes[SecondStageOutputParameterType.m_su_pr].Text = FormatConvert.ToString(outputParameters.SecondStageOutputData.m_su_pr); SecondStageOutputParameterTextBoxes[SecondStageOutputParameterType.m_du].Text = FormatConvert.ToString(outputParameters.SecondStageOutputData.m_du); SecondStageOutputParameterTextBoxes[SecondStageOutputParameterType.m_sux].Text = FormatConvert.ToString(outputParameters.SecondStageOutputData.m_sux); SecondStageOutputParameterTextBoxes[SecondStageOutputParameterType.mu_sux].Text = FormatConvert.ToString(outputParameters.SecondStageOutputData.mu_sux); SecondStageOutputParameterTextBoxes[SecondStageOutputParameterType.mu_k].Text = FormatConvert.ToString(outputParameters.SecondStageOutputData.mu_k); PayloadMassRatioTextBox.Text = FormatConvert.ToString(outputParameters.mu_pg); }
public static void Open(XmlDocument XML, out CalculationInputData id, out Dictionary <StagesVariableValues, OutputParameters> io) { Func <XmlNode, VariableParameter> GetVariableParameter = Node => new VariableParameter( Convert.ToDouble(Node.Attributes["StartValue"].InnerText), Convert.ToDouble(Node.Attributes["EndValue"].InnerText)); Func <XmlNode, StageConstantParameters> GetStageConstantParameters = Node => { var Parameters = new StageConstantParameters(); Parameters.I_p = Convert.ToDouble(Node.Attributes["VoidSpecificImpulse"].InnerText); Parameters.l = Convert.ToDouble(Node.Attributes["SpecificImpulsesRatio"].InnerText); Parameters.P_m = Convert.ToDouble(Node.Attributes["MidshipLoad"].InnerText); Parameters.rg = Convert.ToDouble(Node.Attributes["FuelDensity"].InnerText); Parameters.ro = Convert.ToDouble(Node.Attributes["OxidizeDensity"].InnerText); Parameters.kd = Convert.ToDouble(Node.Attributes["FuelRatio"].InnerText); return(Parameters); }; Action <XmlNode, StageVariableParameters> FillStageVariableParameters = (Node, Parameters) => { Parameters.n_0 = GetVariableParameter(Node.FindChildByName("InitialThrustToWeightRatio")); Parameters.a_to = GetVariableParameter(Node.FindChildByName("FuelBayRatio")); Parameters.mu_su_pr = GetVariableParameter(Node.FindChildByName("OtherSystemsRatio")); Parameters.gamma_du = GetVariableParameter(Node.FindChildByName("EngineBayRatio")); if (Parameters is FirstStageVariableParameters) { (Parameters as FirstStageVariableParameters).mu_k = GetVariableParameter(Node.FindChildByName("EndMassRatio")); } }; var idNode = XML.ChildNodes[0].ChildNodes[0]; id = new CalculationInputData { M_pg = Convert.ToDouble(idNode.FindChildByName("PayloadMass").InnerText), H = Convert.ToDouble(idNode.FindChildByName("EndPoint").Attributes["Height"].InnerText), V = Convert.ToDouble(idNode.FindChildByName("EndPoint").Attributes["Velocity"].InnerText), nu = Convert.ToDouble(idNode.FindChildByName("EndPoint").Attributes["Angle"].InnerText), phi_k1 = GetVariableParameter(idNode.FindChildByName("FirstStageEndPitchAngle")), phi_0 = GetVariableParameter(idNode.FindChildByName("SecondStageInitialPitchAngle")), phi_k2 = GetVariableParameter(idNode.FindChildByName("SecondStageEndPitchAngle")), FirstStageConstantParameters = GetStageConstantParameters(idNode.FindChildByName("FirstStageConstantParameters")), SecondStageConstantParameters = GetStageConstantParameters(idNode.FindChildByName("SecondStageConstantParameters")), FirstStageVariableParameters = new FirstStageVariableParameters(), SecondStageVariableParameters = new SecondStageVariableParameters() }; FillStageVariableParameters(idNode.FindChildByName("FirstStageVariableParameters"), id.FirstStageVariableParameters); FillStageVariableParameters(idNode.FindChildByName("SecondStageVariableParameters"), id.SecondStageVariableParameters); if (XML.ChildNodes[0].ChildNodes.Count == 1) { io = null; return; } var ioNode = XML.ChildNodes[0].ChildNodes[1]; Action <XmlNode, StageVariableValues> FillStageVariableValues = (Node, Parameters) => { Parameters.n_0 = Convert.ToDouble(Node.Attributes["InitialThrustToWeightRatio"].InnerText); Parameters.a_to = Convert.ToDouble(Node.Attributes["FuelBayRatio"].InnerText); Parameters.mu_su_pr = Convert.ToDouble(Node.Attributes["OtherSystemsRatio"].InnerText); Parameters.gamma_du = Convert.ToDouble(Node.Attributes["EngineBayRatio"].InnerText); if (Parameters is FirstStageVariableValues) { (Parameters as FirstStageVariableValues).mu_k = Convert.ToDouble(Node.Attributes["EndMassRatio"].InnerText); } }; Action <XmlNode, StageOutputData> FillStageOutputData = (Node, Parameters) => { Parameters.P_0 = Convert.ToDouble(Node.FindChildByName("Thrust").InnerText); Parameters.m_0 = Convert.ToDouble(Node.FindChildByName("InitialMass").InnerText); Parameters.m_k = Convert.ToDouble(Node.FindChildByName("EndMass").InnerText); Parameters.m_du = Convert.ToDouble(Node.FindChildByName("EngineBayMass").InnerText); Parameters.m_g = Convert.ToDouble(Node.FindChildByName("CombustibleMass").InnerText); Parameters.m_o = Convert.ToDouble(Node.FindChildByName("OxidizeMass").InnerText); Parameters.m_t = Convert.ToDouble(Node.FindChildByName("FuelMass").InnerText); Parameters.m_to = Convert.ToDouble(Node.FindChildByName("FuelBayMass").InnerText); Parameters.m_su_pr = Convert.ToDouble(Node.FindChildByName("OtherSystemsMass").InnerText); Parameters.m_sux = Convert.ToDouble(Node.FindChildByName("DryMass").InnerText); Parameters.mu_sux = Convert.ToDouble(Node.FindChildByName("DryMassRatio").InnerText); if (Parameters is SecondStageOutputData) { (Parameters as SecondStageOutputData).mu_k = Convert.ToDouble(Node.FindChildByName("EndMassRatio").InnerText); } }; Func <XmlNode, TrajectoryOutputParameters> GetTrajectoryParameters = Node => new TrajectoryOutputParameters { H = Convert.ToDouble(Node.FindChildByName("EndPoint").Attributes["Height"].InnerText), V = Convert.ToDouble(Node.FindChildByName("EndPoint").Attributes["Velocity"].InnerText), nu = Convert.ToDouble(Node.FindChildByName("EndPoint").Attributes["Angle"].InnerText), t_1 = Convert.ToDouble(Node.FindChildByName("FlightTime").Attributes["FirstStage"].InnerText), t_2 = Convert.ToDouble(Node.FindChildByName("FlightTime").Attributes["SecondStage"].InnerText), phi_k1 = Convert.ToDouble(Node.FindChildByName("PitchProgram").Attributes["FirstStageEndPitchAngle"].InnerText), phi_0 = Convert.ToDouble(Node.FindChildByName("PitchProgram").Attributes["SecondStageInitialPitchAngle"].InnerText), phi_k2 = Convert.ToDouble(Node.FindChildByName("PitchProgram").Attributes["SecondStageEndPitchAngle"].InnerText) }; Func <XmlNode, KeyValuePair <StagesVariableValues, OutputParameters> > GetOutputParameters = Node => { var stagesVariableValues = new StagesVariableValues { firstStageVariableValues = new FirstStageVariableValues() }; FillStageVariableValues(Node.FindChildByName("FirstStageVariableValues"), stagesVariableValues.firstStageVariableValues); stagesVariableValues.secondStageVariableValues = new SecondStageVariableValues(); FillStageVariableValues(Node.FindChildByName("SecondStageVariableValues"), stagesVariableValues.secondStageVariableValues); var outputParameters = new OutputParameters { FirstStageOutputData = new FirstStageOutputData() }; FillStageOutputData(Node.FindChildByName("FirstStageOutputData"), outputParameters.FirstStageOutputData); outputParameters.SecondStageOutputData = new SecondStageOutputData(); FillStageOutputData(Node.FindChildByName("SecondStageOutputData"), outputParameters.SecondStageOutputData); outputParameters.TrajectoryOutputParameters = GetTrajectoryParameters(Node.FindChildByName("TrajectoryParameters")); outputParameters.mu_pg = Convert.ToDouble(Node.FindChildByName("PayLoadMassRatio").InnerText); return(new KeyValuePair <StagesVariableValues, OutputParameters>(stagesVariableValues, outputParameters)); }; io = new Dictionary <StagesVariableValues, OutputParameters>(); foreach (var node in ioNode.FindChildByName("PossibleSolutions").ChildNodes.Cast <XmlNode>()) { var OutputParameters = GetOutputParameters(node); io.Add(OutputParameters.Key, OutputParameters.Value); } }
public OutputParameters Get_mu_k2( StagesVariableValues vid, StageConstantParameters cid_1, StageConstantParameters cid_2, double phi_k1, double phi_k2, double phi_0, double V, double M_pg) { double t_k1 = (1 - vid.firstStageVariableValues.mu_k) / (g * vid.firstStageVariableValues.n_0) * cid_1.I_p * cid_1.l; var F1 = GetF(vid.firstStageVariableValues.n_0, cid_1.I_p, cid_1.l, cid_1.P_m, phi_1(phi_k1, t_k1)); double t_1 = 0; double dt = 0.1; var X_1 = new double[] { 0, 0, 0, 0, 1, 0, 0 }; while (t_1 < t_k1) { X_1 = X_1.Zip(RungeKuttaIteration.Get(X_1, F1, t_1, dt), (x, dx) => x + dx).ToArray(); t_1 += dt; } Func <double, double[]> T = mu_k_2 => { double t_k2 = (1 - mu_k_2) / (g * vid.secondStageVariableValues.n_0) * cid_2.I_p * cid_2.l; double t_2 = 0; var F2 = GetF(vid.secondStageVariableValues.n_0, cid_2.I_p, cid_2.l, cid_2.P_m, phi_2(phi_0, phi_k2, t_k2)); var x_2 = X_1.Select(x => x).ToArray(); x_2[4] = 1; while (t_2 < t_k2) { x_2 = x_2.Zip(RungeKuttaIteration.Get(x_2, F2, t_2, dt), (x, dx) => x + dx).ToArray(); t_2 += dt; } return(x_2); }; double mu_k2 = 0.2; var X_2 = T(mu_k2); double v_char = X_2[0]; double v_pot = X_2[1] + X_2[2] + X_2[3]; int N = 1; while (Math.Abs(v_char - v_pot + 7.2921E-5 * 6371E3 - V) > 5) { double v_potr = V + v_pot - 7.2921E-5 * 6371E3; mu_k2 = Math.Exp(-(v_potr + cid_1.I_p * Math.Log(vid.firstStageVariableValues.mu_k)) / cid_2.I_p); X_2 = T(mu_k2); v_char = X_2[0]; v_pot = X_2[1] + X_2[2] + X_2[3]; N += 1; if (N == 10) { return(null); } } double r_t1 = (1 + cid_1.kd) / (1 / cid_1.rg + cid_1.kd / cid_1.ro); double r_t2 = (1 + cid_2.kd) / (1 / cid_2.rg + cid_2.kd / cid_2.ro); double[] mu_0 = new double[] { 1, vid.firstStageVariableValues.mu_k - (vid.firstStageVariableValues.a_to / r_t1 * (1 - vid.firstStageVariableValues.mu_k) + vid.firstStageVariableValues.gamma_du * vid.firstStageVariableValues.n_0 * g) * (1 + vid.firstStageVariableValues.mu_su_pr), mu_k2 - (vid.secondStageVariableValues.a_to / r_t2 * (1 - mu_k2) + vid.secondStageVariableValues.gamma_du * vid.secondStageVariableValues.n_0 * g) * (1 + vid.secondStageVariableValues.mu_su_pr) }; double mu_pg = mu_0[0] * mu_0[1] * mu_0[2]; if (mu_pg <= 0) { return(null); } double m_0 = M_pg / mu_pg; var sod_1 = new FirstStageOutputData(); sod_1.m_0 = m_0 * mu_0[0]; sod_1.m_t = sod_1.m_0 * (1 - vid.firstStageVariableValues.mu_k); sod_1.m_g = sod_1.m_t / (1 + cid_1.kd); sod_1.m_o = sod_1.m_t / (1 + cid_1.kd) * cid_1.kd; sod_1.m_to = vid.firstStageVariableValues.a_to / r_t1 * sod_1.m_t; sod_1.P_0 = vid.firstStageVariableValues.n_0 * sod_1.m_0 * g; sod_1.m_du = vid.firstStageVariableValues.gamma_du * sod_1.P_0; sod_1.m_su_pr = vid.firstStageVariableValues.mu_su_pr * (sod_1.m_to + sod_1.m_du); sod_1.m_k = sod_1.m_0 * vid.firstStageVariableValues.mu_k; var sod_2 = new SecondStageOutputData(); sod_2.m_0 = m_0 * mu_0[0] * mu_0[1]; sod_2.m_t = sod_2.m_0 * (1 - mu_k2); sod_2.m_g = sod_2.m_t / (1 + cid_2.kd); sod_2.m_o = sod_2.m_t / (1 + cid_2.kd) * cid_2.kd; sod_2.m_to = vid.secondStageVariableValues.a_to / r_t2 * sod_2.m_t; sod_2.P_0 = vid.secondStageVariableValues.n_0 * sod_2.m_0 * g; sod_2.m_du = vid.secondStageVariableValues.gamma_du * sod_2.P_0; sod_2.m_su_pr = vid.secondStageVariableValues.mu_su_pr * (sod_2.m_to + sod_2.m_du); sod_2.m_k = sod_2.m_0 * mu_k2; sod_2.mu_k = mu_k2; sod_1.m_sux = sod_1.m_k - sod_2.m_0; sod_2.m_sux = sod_2.m_k - M_pg; sod_1.mu_sux = sod_1.m_sux / sod_1.m_0; sod_2.mu_sux = sod_2.m_sux / sod_2.m_0; var tod = new TrajectoryOutputParameters() { H = Math.Sqrt(Math.Pow(R + X_2[6], 2) + Math.Pow(X_2[5], 2)) - R, nu = phi_k2 + Math.Atan(X_2[5] / (R + X_2[6])), V = v_char - v_pot + 7.2921E-5 * 6371E3, phi_0 = phi_0, phi_k1 = phi_k1, phi_k2 = phi_k2, t_1 = t_k1, t_2 = (1 - mu_k2) / (g * vid.secondStageVariableValues.n_0) * cid_2.I_p * cid_2.l }; return(new OutputParameters() { mu_pg = mu_pg, FirstStageOutputData = sod_1, SecondStageOutputData = sod_2, TrajectoryOutputParameters = tod }); }
public List <TrajectoryParameters> GetTrajectory( StagesVariableValues StagesVariableValues, OutputParameters OutputParameters, CalculationInputData id) { var Trajectory = new List <TrajectoryParameters>(); try { double t_k1 = OutputParameters.TrajectoryOutputParameters.t_1; Func <double, double> firstStage_phi = phi_1(OutputParameters.TrajectoryOutputParameters.phi_k1, t_k1); var F1 = GetF( StagesVariableValues.firstStageVariableValues.n_0, id.FirstStageConstantParameters.I_p, id.FirstStageConstantParameters.l, id.FirstStageConstantParameters.P_m, firstStage_phi); double t_1 = 0; double dt = 0.1; var X_1 = new double[] { 0, 0, 0, 0, 1, 0, 0 }; Action <double, double[], double, double> AddTrajectoryParameter = (Time, X, m_0, phi) => { Trajectory.Add(new TrajectoryParameters() { Time = Time, v_char = X[0], v_grav = X[1], v_aer = X[2], v_press = X[3], m = X[4] * m_0, x = X[5], y = X[6], phi = phi, h = Math.Sqrt(Math.Pow(X[5], 2) + Math.Pow(X[6] + R, 2)) - R, xi = Math.Atan(X[5] / (R + X[6])), nu = phi + Math.Atan(X[5] / (R + X[6])) }); }; do { AddTrajectoryParameter(t_1, X_1, OutputParameters.FirstStageOutputData.m_0, firstStage_phi(t_1)); X_1 = X_1.Zip(RungeKuttaIteration.Get(X_1, F1, t_1, dt), (x, dx) => x + dx).ToArray(); t_1 += dt; } while (t_1 < t_k1); double t_k2 = OutputParameters.TrajectoryOutputParameters.t_2; Func <double, double> secondStage_phi = phi_2(OutputParameters.TrajectoryOutputParameters.phi_0, OutputParameters.TrajectoryOutputParameters.phi_k2, t_k2); var F2 = GetF( StagesVariableValues.secondStageVariableValues.n_0, id.SecondStageConstantParameters.I_p, id.SecondStageConstantParameters.l, id.SecondStageConstantParameters.P_m, secondStage_phi); double t_2 = 0; var X_2 = X_1; X_2[4] = 1; while (t_2 < t_k2) { X_2 = X_2.Zip(RungeKuttaIteration.Get(X_2, F2, t_2, dt), (x, dx) => x + dx).ToArray(); t_2 = t_2 + dt; AddTrajectoryParameter(t_2 + t_k1, X_2, OutputParameters.SecondStageOutputData.m_0, secondStage_phi(t_2)); } } catch { } return(Trajectory); }