コード例 #1
0
        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();
        }
コード例 #2
0
 private void listViewAMS_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
 {
     if (e.IsSelected)
     {
         selectedAMS = e.Item.Tag as SuitAMSResultItem;
         initializeGraph(selectedAMS);
     }
 }
コード例 #3
0
        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();
        }
コード例 #4
0
        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);
            }
        }
コード例 #5
0
 private void buttonOk_Click(object sender, EventArgs e)
 {
     DialogResult = DialogResult.OK;
     Result       = selectedAMS;
     Close();
 }
コード例 #6
0
        /// <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);
        }