private void MakeAbregelungWorksheet([NotNull] ScenarioSliceParameters slice, double maxDailyGen,
                                             [NotNull] Profile addedProfile)
        {
            RowCollection rc = new RowCollection("effect", "Effekt");

            for (double i = 0; i < 1; i += 0.01)
            {
                double storageSize = maxDailyGen * 2;
                var    minimzed    = ProfileSmoothing.FindBestPowerReductionRatio(addedProfile,
                                                                                  storageSize,
                                                                                  out var _,
                                                                                  out var reductionFactor, i);
                double friendlySize = storageSize / Constants.GWhFactor;
                Info("Size: " + i + " " + friendlySize + " gwh, Reduction factor: " + reductionFactor);
                RowBuilder rb = RowBuilder.Start("Size", friendlySize);
                rb.Add("storage", storageSize);
                rb.Add("ReductionFactor", reductionFactor);
                rb.Add("Capping", i);
                rb.Add("Max Power", minimzed.MaxPower() / 1000);
                rb.Add("Min Power", minimzed.MinPower() / 1000);
                rc.Add(rb);
            }

            var fnFactor = MakeAndRegisterFullFilename("CappingImpact.xlsx", slice);

            XlsxDumper.WriteToXlsx(fnFactor, rc);
            SaveToPublicationDirectory(fnFactor, slice, "4.5");
        }
        private void MakeStorageSizeSheet([NotNull] ScenarioSliceParameters slice, double maxDailyGen,
                                          [NotNull] Profile addedProfile)
        {
            RowCollection rc = new RowCollection("effect", "Effekt");

            for (double i = 0; i < 10; i += 0.1)
            {
                double storageSize = maxDailyGen * i;
                var    minimzed    = ProfileSmoothing.FindBestPowerReductionRatio(addedProfile,
                                                                                  storageSize,
                                                                                  out var _,
                                                                                  out var reductionFactor, 1);
                var minimzed2 = ProfileSmoothing.FindBestPowerReductionRatio(addedProfile,
                                                                             storageSize,
                                                                             out var _,
                                                                             out var reductionFactor2, 0.5);
                double friendlySize = storageSize / Constants.GWhFactor;
                Info("Size: " + i + " " + friendlySize + " gwh, Reduction factor: " + reductionFactor);
                RowBuilder rb = RowBuilder.Start("Size", friendlySize);
                rb.Add("DaySize", i);
                rb.Add("ReductionFactor", reductionFactor);
                rb.Add("Max Power", minimzed.MaxPower() / 1000);
                rb.Add("Min Power", minimzed.MinPower() / 1000);
                rb.Add("Energy", minimzed.EnergySum() / 1000000);
                rb.Add("EnergyFromGrid", minimzed.GetOnlyPositive("pos").EnergySum() / 1000000);
                rb.Add("EnergyToGrid", minimzed.GetOnlyNegative("neg").EnergySum() / 1000000);
                rb.Add("ReductionFactor Curtailed", reductionFactor2);
                rb.Add("Max Power Curtailed", minimzed2.MaxPower() / 1000);
                rb.Add("Min Power Curtailed", minimzed2.MinPower() / 1000);
                rb.Add("Energy Curtailed", minimzed2.EnergySum() / 1000000);
                rb.Add("EnergyFromGrid Curtailed", minimzed2.GetOnlyPositive("pos").EnergySum() / 1000000);
                rb.Add("EnergyToGrid Curtailed", minimzed2.GetOnlyNegative("neg").EnergySum() / 1000000);
                rc.Add(rb);
            }

            var fnFactor = MakeAndRegisterFullFilename("BatterySizeImpact.xlsx", slice);

            XlsxDumper.WriteToXlsx(fnFactor, rc);
            SaveToPublicationDirectory(fnFactor, slice, "4.5");
        }
        private void MakeExampleWsForSmartgrid([NotNull] ScenarioSliceParameters slice, [NotNull] Profile addedProfile, double storageSize, double cappingFactor)
        {
            var           minimzed3 = ProfileSmoothing.FindBestPowerReductionRatio(addedProfile, storageSize, out var _, out var reductionFactor3, cappingFactor);
            RowCollection rc        = new RowCollection("TotalReduction", "Total Reduction");
            var           rb        = RowBuilder.Start("Reduction", reductionFactor3);

            rb.Add("BatterySize [GWh]", storageSize / 1000000);

            rc.Add(rb);
            var fnProf           = MakeAndRegisterFullFilename("SmartGridTestProfiles_centralstorage_" + slice.DstYear + "_capp_" + cappingFactor + ".xlsx", slice);
            var manualParameters = ProfileSmoothing.UsePeakShaving(addedProfile,
                                                                   storageSize,
                                                                   true,
                                                                   out var storageProfile,
                                                                   reductionFactor3,
                                                                   out var temporaryTargetProfile,
                                                                   out var sum24HProfile,
                                                                   cappingFactor);
            var adjustedStorageProfile = storageProfile?.MultiplyWith(1 / 4000000.0, "Speicherfüllstand") ?? throw new FlaException();

            rb.Add("Energy", manualParameters.EnergySum());
            rb.Add("Min Power", manualParameters.MinPower());
            rb.Add("Max Power", manualParameters.MaxPower());
            XlsxDumper.DumpProfilesToExcel(fnProf,
                                           slice.DstYear,
                                           15,
                                           new RowWorksheetContent(rc),
                                           new ProfileWorksheetContent("raw", "Last [kW]", 240, addedProfile),
                                           new ProfileWorksheetContent("manualParameters", "Netto-Last [MW]", 240, manualParameters),
                                           new ProfileWorksheetContent("storageprofile", "Speicherfüllstand [GWh]", 240, adjustedStorageProfile),
                                           new ProfileWorksheetContent("minimized", "Netto-Last [MW]", 240, minimzed3),
                                           new ProfileWorksheetContent("temptarget", "Ziel-Füllstand Speicher [kWh]", 240, temporaryTargetProfile),
                                           new ProfileWorksheetContent("sum24h", "Tages-Energiemenge [GWh]", 240, sum24HProfile)
                                           );

            SaveToPublicationDirectory(fnProf, slice, "4.5");
        }
Exemplo n.º 4
0
        private void ApplySmartGridstuff([JetBrains.Annotations.NotNull] Dictionary <string, List <Prosumer> > dictionary,
                                         [JetBrains.Annotations.NotNull] string trafokreis,
                                         [JetBrains.Annotations.NotNull] ChangableProfile smartLoad,
                                         [JetBrains.Annotations.NotNull] ChangableProfile smartGeneration,
                                         [JetBrains.Annotations.NotNull] RowCollection smartGridPointValues,
                                         [JetBrains.Annotations.NotNull] SmartGridInformation summedSgi,
                                         [JetBrains.Annotations.NotNull] ScenarioSliceParameters smartSlice)
        {
            trafokreis = FilenameHelpers.CleanUmlaute(trafokreis);
            var loadFilename       = MakeAndRegisterFullFilename(trafokreis + ".load.csv", smartSlice, false);
            var generationFilename = MakeAndRegisterFullFilename(trafokreis + ".generation.csv", smartSlice, false);

            using (StreamWriter loadsw = new StreamWriter(loadFilename)) {
                using (StreamWriter generationsw = new StreamWriter(generationFilename)) {
                    foreach (var ha in dictionary)
                    {
                        var loadsum = ChangableProfile.FromProfile(Profile.MakeConstantProfile(0, "Sum", Profile.ProfileResolution.QuarterHour));
                        var gensum  = ChangableProfile.FromProfile(Profile.MakeConstantProfile(0, "Sum", Profile.ProfileResolution.QuarterHour));

                        foreach (var prosumer in ha.Value)
                        {
                            if (prosumer.GenerationOrLoad == GenerationOrLoad.Load)
                            {
                                loadsum.Add(prosumer.Profile ?? throw new FlaException());
                            }
                            else
                            {
                                gensum.Subtract(prosumer.Profile ?? throw new FlaException());
                            }
                        }

                        RowBuilder rb = RowBuilder.Start("Hausanschluss", ha.Key);
                        smartGridPointValues.Add(rb);
                        var loadProfile = loadsum.ToProfile();
                        rb.Add("Load Energy Sum [kWh]", loadProfile.EnergySum());
                        var genProfile = gensum.ToProfile();
                        rb.Add("Generation Energy Sum [kWh]", genProfile.EnergySum());
                        rb.Add("Number of Prosumers", ha.Value.Count);

                        var    sum             = loadProfile.Add(genProfile, "sum");
                        double storagesizeLoad = //Math.Abs(sum.MakeDailyAverages().Values.Max()) * 24 * 4 * 1.5;
                                                 loadProfile.EnergySum() / 1000 * 4;
                        double storageSizeGen = Math.Abs(genProfile.EnergySum()) / 1000 * 4;
                        double storagesize    = Math.Max(storageSizeGen, storagesizeLoad);
                        sum = ProfileSmoothing.FindBestPowerReductionRatio(sum, storagesize, out _, out var reductionFactor, 0.7);
                        //if (reductionFactor > 0.99) {
//                            storagesize = 0;
                        //}
                        summedSgi.NumberOfReductionFactors++;
                        summedSgi.SummedReductionFactor += reductionFactor;
                        summedSgi.TotalStorageSize      += storagesize;
                        summedSgi.NumberOfProsumers++;
                        rb.Add("Trafokreis", trafokreis);
                        rb.Add("Faktor", reductionFactor);
                        rb.Add("Storage Size", storagesize);
                        var positive = sum.GetOnlyPositive("positive");
                        smartLoad.Add(positive);
                        var negative = sum.GetOnlyNegative("negative");
                        smartGeneration.Add(negative);
                        rb.Add("Energy Sum  Size", storagesize);
                        string csvhakey = ha.Value.First().Isn + ";SM-Pros;MAXMEASUREDVALUE;" + ha.Key + ";";
                        if (positive.EnergySum() > 0)
                        {
                            loadsw.WriteLine(csvhakey + positive.GetCSVLine());
                        }

                        if (negative.EnergySum() < 0)
                        {
                            var generation = negative.MultiplyWith(-1, "generation");
                            generationsw.WriteLine(csvhakey + generation.GetCSVLine());
                        }

                        //positive.GetCSVLine()
                    }

                    loadsw.Close();
                    generationsw.Close();
                }
            }

            if (smartSlice.DstYear == 2050)
            {
                FileInfo lfn = new FileInfo(loadFilename);
                if (lfn.Length > 0)
                {
                    SaveToArchiveDirectory(loadFilename, RelativeDirectory.Load, smartSlice);
                }

                var gfn = new FileInfo(generationFilename);
                if (gfn.Length > 0)
                {
                    SaveToArchiveDirectory(generationFilename, RelativeDirectory.Generation, smartSlice);
                }
            }
        }