Ejemplo n.º 1
0
        public const double NOMINAL_AIR_DENSITY = 1.2041; //  кг/м3

        /// <summary>
        /// расчет мощностной характеристики на основе основных параметров ВЭУ
        /// </summary>
        /// <param name="selectedEquipment"></param>
        /// <returns></returns>
        public static Dictionary <double, double> CalculatePerformanceCharacteristic(EquipmentItemInfo selectedEquipment)
        {
            if (!selectedEquipment.EnoughDataToCalculateCharacteristic)
            {
                throw new WindEnergyException("Недостаточно данных для расчета мощностной характеристики");
            }

            LinearInterpolateMethod interpolator = new LinearInterpolateMethod(new Dictionary <double, double>()
            {
                { 0, 0 },
                { selectedEquipment.MinWindSpeed, 0 },
                { selectedEquipment.NomWindSpeed, selectedEquipment.Power },
                { selectedEquipment.MaxWindSpeed, selectedEquipment.Power },
                { selectedEquipment.MaxWindSpeed + MIN_WIND_SPEED_STEP, 0 },
                { 31, 0 },
            });

            Dictionary <double, double> res = new Dictionary <double, double>();

            for (double speed = 1; speed <= 30; speed++)
            {
                res.Add(speed, interpolator.GetValue(speed));
            }
            return(res);
        }
        private void buttonSave_Click(object sender, EventArgs e)
        {
            if (Result.Count == 0)
            {
                _ = MessageBox.Show(this, "Для сохранения надо добавить хотя бы одну точку в характеристику", "Редактирование мощностной характеристики", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            Result[0]            = 0;
            Result[maxSpeed + 1] = 0;
            LinearInterpolateMethod interpolator = new LinearInterpolateMethod(Result);

            for (int i = 1; i <= maxSpeed; i++)
            {
                Result[i] = interpolator.GetValue(i);
            }

            _ = Result.Remove(0);
            _ = Result.Remove(maxSpeed + 1);

            this.DialogResult = DialogResult.OK;
            Close();
        }
Ejemplo n.º 3
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);
        }