public void OpenEngineNoiseInputData( XmlDocument xmlDoc, out double Thrust, out FlowParameters FlowParameters, out EngineSoundContourParameters ContourParameters) { engineNoiseModel.Open(xmlDoc, out Thrust, out FlowParameters, out ContourParameters); }
public void OpenEngineNoiseInputData( string FileName, out double Thrust, out FlowParameters FlowParameters, out EngineSoundContourParameters ContourParameters) { engineNoiseModel.Open(FileName, out Thrust, out FlowParameters, out ContourParameters); }
public void SaveEngineNoiseInputData( string FileName, double Thrust, FlowParameters FlowParameters, EngineSoundContourParameters ContourParameters) { engineNoiseModel.Save(FileName, Thrust, FlowParameters, ContourParameters); }
public void Open( string FileName, out double Thrust, out FlowParameters FlowParameters, out EngineSoundContourParameters ContourParameters) // см. метод с аналогичной сигнатурой в IModel { var xmlDoc = new XmlDocument(); xmlDoc.Load(FileName); Open(FileName, out Thrust, out FlowParameters, out ContourParameters); }
public void Open( XmlDocument xmlDoc, out double Thrust, out FlowParameters FlowParameters, out EngineSoundContourParameters ContourParameters) // см. метод с аналогичной сигнатурой в IModel { Func <XmlNode, double> GetThrust = Node => Convert.ToDouble(Node.InnerText); Func <XmlNode, FlowParameters> GetFlowParameters = Node => new FlowParameters( Convert.ToDouble(Node.Attributes["MassFlow"].Value), Convert.ToDouble(Node.Attributes["NozzleDiameter"].Value), Convert.ToDouble(Node.Attributes["NozzleMachNumber"].Value), Convert.ToDouble(Node.Attributes["NozzleFlowVelocity"].Value), Convert.ToDouble(Node.Attributes["ChamberSoundVelocity"].Value), Convert.ToDouble(Node.Attributes["NozzleAdiabaticIndex"].Value)); Func <XmlNode, List <WeatherParameters> > GetWeatherParameters = Node => Node.ChildNodes.Cast <XmlNode>().Select(x => new WeatherParameters( x.Name, Convert.ToDouble(x.Attributes["Humidity"].Value), Convert.ToDouble(x.Attributes["Temperature"].Value))).ToList(); Func <XmlNode, Dictionary <double, Color> > GetSoundLevels = Node => { if (Node == null) { return(null); } return(Node.ChildNodes.Cast <XmlNode>() .Select(x => new { SoundLevel = Convert.ToDouble(x.InnerText), Color = Color.FromArgb( Convert.ToInt32(x.Attributes["A"].Value), Convert.ToInt32(x.Attributes["R"].Value), Convert.ToInt32(x.Attributes["G"].Value), Convert.ToInt32(x.Attributes["B"].Value)) }) .ToDictionary(x => x.SoundLevel, x => x.Color)); }; var Root = xmlDoc.ChildNodes[0]; Func <XmlNode, string, XmlNode> FindNode = (Node, ChildNodeName) => Node.ChildNodes.Cast <XmlNode>().FirstOrDefault(x => x.Name == ChildNodeName); Thrust = GetThrust(FindNode(Root, "Thrust")); FlowParameters = GetFlowParameters(FindNode(Root, "FlowParameters")); var contourParanetersNode = FindNode(Root, "ContourParaneters"); ContourParameters = new EngineSoundContourParameters( Convert.ToInt32(contourParanetersNode.Attributes["Width"].Value), Convert.ToInt32(contourParanetersNode.Attributes["Height"].Value), Convert.ToInt32(contourParanetersNode.Attributes["NozzleCoordinate"].Value), Convert.ToInt32(contourParanetersNode.Attributes["MinSoundLevel"].Value), Convert.ToInt32(contourParanetersNode.Attributes["MaxSoundLevel"].Value)); }
public void Save( string FileName, double Thrust, FlowParameters FlowParameters, EngineSoundContourParameters ContourParameters) // см. метод с аналогичной сигнатурой в IModel { var xmlDoc = new XmlDocument(); var Root = xmlDoc.CreateElement("EngineNoiseInputData"); Action <XmlNode, string, double> AddAttribute = (node, name, value) => { var attribute = xmlDoc.CreateAttribute(name); attribute.Value = value.ToString(); node.Attributes.Append(attribute); }; var thrustNode = xmlDoc.CreateElement("Thrust"); thrustNode.InnerText = Thrust.ToString(); Root.AppendChild(thrustNode); var flowParametersNode = xmlDoc.CreateElement("FlowParameters"); AddAttribute(flowParametersNode, "MassFlow", FlowParameters.MassFlow); AddAttribute(flowParametersNode, "NozzleDiameter", FlowParameters.NozzleDiameter); AddAttribute(flowParametersNode, "NozzleMachNumber", FlowParameters.NozzleMachNumber); AddAttribute(flowParametersNode, "NozzleFlowVelocity", FlowParameters.NozzleFlowVelocity); AddAttribute(flowParametersNode, "ChamberSoundVelocity", FlowParameters.ChamberSoundVelocity); AddAttribute(flowParametersNode, "NozzleAdiabaticIndex", FlowParameters.NozzleAdiabaticIndex); Root.AppendChild(flowParametersNode); var contourParanetersNode = xmlDoc.CreateElement("ContourParaneters"); AddAttribute(contourParanetersNode, "Width", ContourParameters.ContourAreaWidth); AddAttribute(contourParanetersNode, "Height", ContourParameters.ContourAreaHeight); AddAttribute(contourParanetersNode, "NozzleCoordinate", ContourParameters.NozzleCoordinate); AddAttribute(contourParanetersNode, "MinSoundLevel", ContourParameters.MinSoundLevel); AddAttribute(contourParanetersNode, "MaxSoundLevel", ContourParameters.MaxSoundLevel); Root.AppendChild(contourParanetersNode); xmlDoc.AppendChild(Root); xmlDoc.Save(FileName); }
public void Calculate( double Thrust, FlowParameters FlowParameters, EngineSoundContourParameters ContourParameters, out EngineSoundContour EngineSoundContour) // см. метод с аналогичной сигнатурой в IModel { var FlowSoundParameters = GetFlowSoundParameters(Thrust, FlowParameters); var EngineSoundLevel = GetEngineSoundLevel(Thrust, FlowParameters); int Nx, Ny, W, H; if (ContourParameters.ContourAreaWidth >= ContourParameters.ContourAreaHeight) { Ny = 51; H = 1000; Nx = (int)(Ny * ContourParameters.ContourAreaWidth / ContourParameters.ContourAreaHeight); W = (int)(H * ContourParameters.ContourAreaWidth / ContourParameters.ContourAreaHeight); } else { Nx = 51; W = 1000; Ny = (int)(Nx * ContourParameters.ContourAreaHeight / ContourParameters.ContourAreaWidth); H = (int)(W * ContourParameters.ContourAreaHeight / ContourParameters.ContourAreaWidth); } var X = new double[Nx]; var Y = new double[Ny]; double dX = ContourParameters.ContourAreaWidth / (Nx - 1); double dY = ContourParameters.ContourAreaHeight / (Ny - 1); for (int i = 0; i < Nx; i++) { X[i] = i * dX; } for (int i = 0; i < Ny; i++) { Y[i] = i * dY; } var SoundLevels = new double[Nx, Ny]; for (int i = 0; i < Nx; i++) { double x = X[i] - FlowSoundParameters.DistanceToPointOfMaximalSoundLevel - ContourParameters.NozzleCoordinate; x = Math.Abs(x) < 0.001 ? 0.001 : x; for (int j = 0; j < Ny; j++) { double y = Math.Abs(Y[j] - ContourParameters.ContourAreaHeight / 2); double Angle; if (x == 0) { Angle = Math.Sign(y) * Math.PI / 2; } else { Angle = Math.Atan(y / Math.Abs(x)); if (x < 0) { Angle = Math.PI - Angle; } } double Radius = Math.Sqrt(x * x + y * y); SoundLevels[i, j] = EngineSoundLevel(Radius, Angle); } } var Contour = new Bitmap(W, H); EngineSoundContour = new EngineSoundContour(X, Y, SoundLevels, Contour); ModifyEngineSoundContour(ContourParameters.MinSoundLevel, ContourParameters.MaxSoundLevel, ref EngineSoundContour); }
public void CalculateEngineSoundContour(double Thrust, FlowParameters FlowParameters, EngineSoundContourParameters ContourParameters, out EngineSoundContour EngineSoundContour) { engineNoiseModel.Calculate(Thrust, FlowParameters, ContourParameters, out EngineSoundContour); }