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"); }
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); } } }