private void initializeGraph(SuitAMSResultItem item) { GraphPane spane = zedGraphControlAMS.GraphPane; spane.Title.Text = "Сравнение среднемесячных относительных\r\nскоростей на МС и выбранной АМС"; spane.XAxis.Title.IsVisible = false; spane.YAxis.Title.Text = "Относительная скорость"; spane.GraphObjList.Clear(); spane.CurveList.Clear(); spane.XAxis.ScaleFormatEvent += xAxis_ScaleFormatEvent; spane.XAxis.Scale.MajorStep = 1; spane.XAxis.Scale.FontSpec.Size = 8; spane.XAxis.Scale.FontSpec.Angle = 45; spane.XAxis.Scale.Min = 1; spane.XAxis.Scale.Max = 12; PointPairList msList = new PointPairList(); PointPairList amsList = new PointPairList(); for (int i = 1; i <= 12; i++) { Months month = (Months)i; msList.Add(i, AMSList.RangeRelativeSpeeds[month]); amsList.Add(i, item.AMS.RelativeSpeeds[month]); } _ = spane.AddCurve("Ряд данных", msList, Color.Black); _ = spane.AddCurve(item.AMS.Name, amsList, Color.Red); zedGraphControlAMS.AxisChange(); zedGraphControlAMS.Invalidate(); }
private void listViewAMS_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) { if (e.IsSelected) { selectedAMS = e.Item.Tag as SuitAMSResultItem; initializeGraph(selectedAMS); } }
public FormPowerCalculatorResult(RawRange range, EquipmentItemInfo selectedEquipment, double startHeight, SuitAMSResultItem ams, bool needRecalcWithAirDensity) { this.range = range ?? throw new ArgumentNullException(nameof(range)); this.equipment = selectedEquipment ?? throw new ArgumentNullException(nameof(selectedEquipment)); this.ams = ams; InitializeComponent(); equipment = selectedEquipment; this.startHeight = startHeight; this.needRecalcWithAirDensity = needRecalcWithAirDensity; foreach (double h in equipment.TowerHeight) { _ = comboBoxTowerHeights.Items.Add(h); } comboBoxTowerHeights.SelectedItem = equipment.TowerHeight.First(); Text = $"Расчет ВЭУ {selectedEquipment.Developer} - {selectedEquipment.Model}"; refreshInterface(); }
private void buttonSelectAMS_Click(object sender, EventArgs e) { bool check = true; double radius = double.NaN; if (checkBoxSetRadius.Checked) { check &= double.TryParse(textBoxAMSSearchRadius.Text.Replace('.', Constants.DecimalSeparator), out radius); } if (check) { //находим все подходящие АМС SuitAMSResult suitAMSList = AMSSupport.GetSuitAMS( range, range.Position, Vars.AMSMeteostations, radius * 1000, Vars.Options.UseSuitAMSMaximalRelativeSpeedDeviation ? Vars.Options.SuitAMSMaximalRelativeSpeedDeviation : double.NaN ); //открывам диалоговое окно списка АМС FormRangeElevatorConfirmation frec = new FormRangeElevatorConfirmation(suitAMSList); if (frec.ShowDialog(this) == DialogResult.OK) { selectedAMS = frec.Result; } else //если ничего не выбрали, то выходим { return; } recalculateInterface(false); } else { _ = MessageBox.Show(this, "Радиус поиска задан неверно", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }
private void buttonOk_Click(object sender, EventArgs e) { DialogResult = DialogResult.OK; Result = selectedAMS; Close(); }
/// <summary> /// основной расчет для ВЭУ по заданному ряду /// </summary> /// <param name="range"></param> /// <param name="equipment"></param> /// <param name="h"></param> /// <param name="startHeight"></param> /// <param name="ams">выбранная АМС для пересчета на высоту или null, если не надо проводить пересчет</param> /// <param name="needRecalcWithAirDensity"></param> /// <returns></returns> public async static Task <PowerCalculatorResult> Calculate(RawRange range, EquipmentItemInfo equipment, double h, double startHeight, SuitAMSResultItem ams, bool needRecalcWithAirDensity) { //пересчитать ряд на высоту h (считаем, что ряд на высоте startHeight) //расчитать Ni для каждого наблюдения //расчитать основные показатели Э, kиум, Эуд, hиум //расчитать кривую обеспеченности //проверка, надо ли пересчитывать скорости ветра на высоту RawRange altedRange; if (ams != null) { altedRange = await RangeElevator.ProcessRange(range, new ElevatorParameters() { ToHeight = h, Coordinates = range.Position, HellmanCoefficientSource = HellmanCoefficientSource.AMSAnalog, SelectedAMS = ams, FromHeight = startHeight }); } else { altedRange = range; } //если надо, то пересчитываем мощностную характеристику с учетом плотности воздуха Dictionary <double, double> characteristic; if (needRecalcWithAirDensity) { characteristic = RecalcPerfomanceCharacteristicWithAirDensity(range.AirDensity, equipment.PerformanceCharacteristic, equipment); } else { characteristic = equipment.PerformanceCharacteristic; } //расчет мощности для каждого наблюдения и годовой выработки LinearInterpolateMethod interpolator = new LinearInterpolateMethod(characteristic); Dictionary <double, double> production = new Dictionary <double, double>(); Dictionary <DateTime, double> productionRange = new Dictionary <DateTime, double>(); Dictionary <Months, double> energyByMonth = new Dictionary <Months, double>(); double totalE = 0; for (int i = 0; i < altedRange.Count; i++) { RawItem item = altedRange[i]; double N; if (!interpolator.InBounds(item.Speed)) { N = 0; //мощность в кВт } else { N = interpolator.GetValue(item.Speed); //мощность в кВт } production.Add(item.DateArgument, N); productionRange.Add(item.Date, N); //расчет выработки if (i > 0) { double energyBit = N * (item.DateArgument - altedRange[i - 1].DateArgument) / 60; //перевод в часы (DateArgumet в минутах) totalE += energyBit; //суммарная выработка в кВт*ч //выработка по месяцам Months month = (Months)item.Date.Month; if (energyByMonth.ContainsKey(month)) { energyByMonth[month] += energyBit; } else { energyByMonth.Add(month, energyBit); } } } //поскольку ряд мб произвольной длины, то надо привести выработку к среднегодовой //коэффициент пересчета к одному году double yearKoeff = 8760 / ((altedRange.Last().Date - altedRange.First().Date).TotalHours); double E = totalE * yearKoeff; //коэфф использования установленной мощности double kium = E / (equipment.Power * 8760); //выработка уже приведена к году, используем как есть //удельная выработка double Edensity = E / (Math.PI * Math.Pow(equipment.Diameter, 2) / 4); // Эгод/Fом //число часов использования установленной мощности double hium = E / equipment.Power; //выработка уже приведена к году, используем как есть PowerCalculatorResult result = new PowerCalculatorResult() { YearEnergy = E, TotalEnergy = totalE, EnergyByMonth = energyByMonth, EDensity = Edensity, Kium = kium, Hium = hium, SupportingPower = calculateSupportingPower(production), Production = productionRange, Equipment = equipment, TowerHeight = h, Range = range }; return(result); }