private void ReportProgress(DateTime start,
                                    int processedHouseCount,
                                    int totalNumberOfComponents,
                                    [NotNull] ScenarioSliceParameters slice,
                                    ref DateTime lastLog,
                                    [NotNull] Stopwatch collecting,
                                    [NotNull] Stopwatch writing)
        {
            TimeSpan durationsinceLastLog = DateTime.Now - lastLog;

            if (durationsinceLastLog.TotalSeconds < 10)
            {
                return;
            }

            lastLog = DateTime.Now;
            TimeSpan duration = DateTime.Now - start;
            double   average  = processedHouseCount / duration.TotalSeconds;
            double   timeLeft = (totalNumberOfComponents - processedHouseCount) / average / 60;

            _services.Logger.Info(slice + ": processed " + processedHouseCount + "/" + totalNumberOfComponents + " components in " +
                                  duration.TotalSeconds + "s, for a rate of " + average + " per second, estimated time left: " +
                                  timeLeft.ToString("F1") + " minutes, collecting took " + collecting.Elapsed + ", writing took " + writing.Elapsed,
                                  Stage.ProfileGeneration,
                                  "HouseProcessor");
        }
示例#2
0
        public static string MakeAndRegisterFullFilenameStatic([NotNull] string filename,
                                                               Stage stage,
                                                               int sequenceNumber,
                                                               [NotNull] string name,
                                                               [NotNull] ScenarioSliceParameters slice,
                                                               [NotNull] RunningConfig config,
                                                               bool replaceSpaces)
        {
            if (replaceSpaces)
            {
                filename = filename.Replace(" ", "");
            }

            var fullpath = GetTargetDirectory(stage, sequenceNumber, name, slice, config);

            if (!Directory.Exists(fullpath))
            {
                Directory.CreateDirectory(fullpath);
                Thread.Sleep(500);
            }

            var fullName = Path.Combine(fullpath, filename);

            if (_usedFileNames.ContainsKey(fullName))
            {
                throw new FlaException("File already registered: " + fullName + " @ this location:\n" + _usedFileNames[fullName] +
                                       " \n--------------------------\n");
            }

            StackTrace t = new StackTrace();

            _usedFileNames.Add(fullName, t.ToString());
            return(fullName);
        }
        protected override void RunActualProcess([NotNull] ScenarioSliceParameters slice)
        {
            var dbSrcProfiles = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice);
            var dbDstProfiles = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.ProfileGeneration, slice);

            dbDstProfiles.RecreateTable <ResidualProfile>();
            var bkw         = dbSrcProfiles.Fetch <BkwProfile>();
            var rlmProfiles = dbSrcProfiles.Fetch <RlmProfile>();
            var main        = new Profile(bkw[0].Profile);

            foreach (var rlm in rlmProfiles)
            {
                Profile profile = new Profile(rlm.Name, rlm.Profile.Values, rlm.Profile.EnergyOrPower);
                main = main.Minus(profile, "residual");
            }

            JsonSerializableProfile jsp = new JsonSerializableProfile(main);
            var residualProfile         = new ResidualProfile("Residual after all RLMs")
            {
                Profile = jsp
            };

            dbDstProfiles.BeginTransaction();
            dbDstProfiles.Save(residualProfile);
            dbDstProfiles.CompleteTransaction();
        }
        private void CopyCSVFiles([NotNull] ScenarioSliceParameters parameters, int sequence, [NotNull] string exporteRName, [NotNull] string subPath)
        {
            var path = FilenameHelpers.GetTargetDirectory(Stage.ProfileExport, sequence, exporteRName, parameters);
            var di   = new DirectoryInfo(Path.Combine(path, "Export"));

            if (!di.Exists)
            {
                throw new FlaException("Directory " + di.FullName + " does not exist");
            }
            var csvfiles = di.GetFiles("*.csv");

            if (csvfiles.Length == 0)
            {
                throw new FlaException("No exported files found");
            }

            string dstpath = @"v:\tstcopy\v01";

            dstpath = Path.Combine(dstpath, parameters.DstScenario.ToString(), parameters.DstYear.ToString(), subPath);
            if (Directory.Exists(dstpath))
            {
                Directory.Delete(dstpath, true);
                Thread.Sleep(500);
            }
            Directory.CreateDirectory(dstpath);
            Thread.Sleep(500);
            foreach (var fileInfo in csvfiles)
            {
                string dstfullName = Path.Combine(dstpath, fileInfo.Name);
                Info("Copying " + dstfullName);
                fileInfo.CopyTo(dstfullName);
            }
        }
示例#5
0
        public void SaveToPublicationDirectory([NotNull] string fn, [NotNull] ScenarioSliceParameters slice, [NotNull] string chapter)
        {
            var      dstDir = GetResultArchiveDirectory(slice, Services.StartingTime, Services.RunningConfig, RelativeDirectory.Abschlussbericht, chapter);
            FileInfo fi1    = new FileInfo(fn);

            fi1.CopyTo(Path.Combine(dstDir, fi1.Name), true);
        }
示例#6
0
        private void MakeResultExcel([NotNull][ItemNotNull] List <CSVFile> csvs, [NotNull] ScenarioSliceParameters slice)
        {
            string suffix = csvs[0].GenerationOrLoad.ToString();

            using (var p = new ExcelPackage()) {
                var ws  = p.Workbook.Worksheets.Add("MySheet");
                var tgt = FilenameHelpers.GetTargetDirectory(MyStage,
                                                             SequenceNumber,
                                                             nameof(C01_CSVProfileVisualizer),
                                                             slice,
                                                             Services.RunningConfig);

                var row = 1;
                var col = 1;
                ws.Cells[row, col++].Value = "TrafoKreis";
                ws.Cells[row, col++].Value = "ISN ID";
                ws.Cells[row, col++].Value = "CSV Energy";
                ws.Cells[row, col].Value   = "DB Energy";
                row++;
                foreach (var csvFile in csvs)
                {
                    foreach (var csvLine in csvFile.Lines)
                    {
                        col = 1;
                        ws.Cells[row, col++].Value = csvFile.TsName;
                        ws.Cells[row, col++].Value = csvLine.HausanschlussID;
                        var csvEnergy = csvLine.CalculateTotalEnergy();
                        ws.Cells[row, col].Value = csvEnergy;
                    }
                }


                p.SaveAs(new FileInfo(Path.Combine(tgt, "ComparisonCSVvsDB" + suffix + ".xlsx")));
            }
        }
示例#7
0
        protected override void RunActualProcess([NotNull] ScenarioSliceParameters slice)
        {
            var dbSrcHouses = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice.PreviousSliceNotNull);
            var dbDstHouses = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice);

            dbDstHouses.RecreateTable <BusinessEntry>();
            var srcBusinessEntries = dbSrcHouses.Fetch <BusinessEntry>();

            if (srcBusinessEntries.Count == 0)
            {
                throw new FlaException("No srcBusinessEntries were found");
            }

            dbDstHouses.BeginTransaction();
            double factor = slice.EnergyReductionFactorBusiness;

            if (Math.Abs(factor) < 0.000001)
            {
                throw new FlaException("Factor 0 for energy reduction in slice " + slice);
            }
            foreach (var entry in srcBusinessEntries)
            {
                entry.ID = 0;
                entry.SetEnergyReduction(slice.DstYear.ToString(), entry.EffectiveEnergyDemand * (1 - factor));
                entry.LocalnetEntries.Clear();
                dbDstHouses.Save(entry);
            }

            dbDstHouses.CompleteTransaction();
        }
        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");
        }
        protected override void RunActualProcess(ScenarioSliceParameters slice)
        {
            string srcPath = FilenameHelpers.GetTargetDirectory(Stage.ProfileGeneration,
                                                                500,
                                                                nameof(E_ApplySmartGridToGeneratedProfiles),
                                                                slice,
                                                                Services.RunningConfig);
            string lz4ProfilePath = Path.Combine(srcPath, "addedProfile.lz4");

            byte[] arr             = File.ReadAllBytes(lz4ProfilePath);
            var    addedProfileraw = LZ4MessagePackSerializer.Deserialize <Profile>(arr);
            var    pos             = addedProfileraw.GetOnlyPositive("pos");
            var    neg             = addedProfileraw.GetOnlyNegative("neg");
            var    addedProfile    = pos.Add(neg, "added");

            var maxDailyGen = addedProfile.MakeDailyAverages().Values.Max() * 24 * 4;

            double storageSize = maxDailyGen * 2;

            MakeXlsForCurrentProfile(slice);

            MakeExampleWsForSmartgrid(slice, addedProfile, storageSize, 1);
            MakeExampleWsForSmartgrid(slice, addedProfile, storageSize, 0.5);
            MakeStorageSizeSheet(slice, maxDailyGen, addedProfile);
            MakeAbregelungWorksheet(slice, maxDailyGen, addedProfile);
        }
        private void ProcessOneSumTypeWithXls([NotNull] ScenarioSliceParameters slice, [NotNull] string fn, SumType sumType)
        {
            var dbArchive = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.ProfileGeneration, slice, DatabaseCode.SummedLoadForAnalysis);
            var saHouses  = SaveableEntry <ArchiveEntry> .GetSaveableEntry(dbArchive, SaveableEntryTableType.SummedLoadsForAnalysis, Services.Logger);

            var entries         = saHouses.LoadAllOrMatching();
            var providerentries = entries.Where(x => x.Key.SumType == sumType).ToList();
            var dbRaw           = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice);
            var bkwJ            = dbRaw.Fetch <BkwProfile>();

            foreach (var ae in providerentries)
            {
                if (sumType == SumType.ByProvider)
                {
                    ae.Profile.Name = ae.Key.ProviderType + " " + ae.GenerationOrLoad;
                }
                else if (sumType == SumType.ByProfileSource)
                {
                    ae.Profile.Name = ae.Key.ProfileSource ?? throw new InvalidOperationException();
                }
                else
                {
                    throw new FlaException("Unknown sum type");
                }
            }
            var profiles = providerentries.Select(x => x.Profile).ToList();
            var bkw      = new Profile(bkwJ[0].Profile);

            bkw.Name = "Messung 2017";
            profiles.Add(bkw);
            XlsxDumper.DumpProfilesToExcel(fn, 2017, 15, new ProfileWorksheetContent("Profile", "Leistung [MW]", bkw.Name, profiles));
        }
        public void RunForScenarios([NotNull] ScenarioSliceParameters parameters)
        {
            ClearTargetDirectory(parameters);
            Debug("Starting " + Name);
            Info("Slice " + parameters.DstScenario + " - " + parameters.DstYear);
            var sw = new Stopwatch();

            sw.Start();
            RunActualProcess(parameters);
            if (Services.RunningConfig.MakeCharts)
            {
                var sw2 = new Stopwatch();
                Debug("Starting " + Name + " - Chartmaking");
                MakeChartFunctionExecuted = true;
                RunChartMaking(parameters);
                sw2.Stop();
                Debug("Finished " + Name + " - Chartmaking: " + Helpers.GetElapsedTimeString(sw2));
            }

            if (VisualizeSlice != null && Services.RunningConfig.MakeCharts)
            {
                var sw3 = new Stopwatch();
                Debug("Starting " + Name + " - visualization");
                // ReSharper disable once PossibleNullReferenceException
                VisualizeSlice.MakeVisualization(parameters, this);
                sw3.Stop();
                Debug("Finished " + Name + " - visualization: " + Helpers.GetElapsedTimeString(sw3));
            }

            LogCall(sw);
            sw.Stop();
            Info("Finished " + Name + ": " + Helpers.GetElapsedTimeString(sw) + "Scenario " + parameters.DstScenario + " - " + parameters.DstYear);
        }
        protected override void RunActualProcess([NotNull] ScenarioSliceParameters slice)
        {
            if (slice.PreviousSlice == null)
            {
                throw new FlaException("Previous slice was null");
            }
            var dbSrcHouses = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice.PreviousSlice);
            var dbDstHouses = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice);

            dbDstHouses.RecreateTable <KleinWasserkraft>();
            var srcKwk = dbSrcHouses.Fetch <KleinWasserkraft>();

            if (srcKwk.Count == 0)
            {
                throw new Exception("No building infrastructures were found");
            }
            dbDstHouses.BeginTransaction();
            foreach (var wasserkraft in srcKwk)
            {
                wasserkraft.ID = 0;
                dbDstHouses.Save(wasserkraft);
            }

            dbDstHouses.CompleteTransaction();
        }
        private static List <string> WriteExcelResultFiles([NotNull] ScenarioSliceParameters parameters,
                                                           [NotNull] Func <string, ScenarioSliceParameters, bool, string> makeAndRegisterFullFilename,
                                                           ProcessingMode processingMode,
                                                           [NotNull] ProfileGenerationRo pgRo)
        {
            List <string> excelFileNames = new List <string>();
            var           fn1            = makeAndRegisterFullFilename("AllGeneratedLoadProfilesAndEnergy." + processingMode + ".Tree.xlsx", parameters, true);

            excelFileNames.Add(fn1);
            pgRo.DumpToExcel(fn1, XlsResultOutputMode.Tree);
            var fn2 = makeAndRegisterFullFilename("AllGeneratedLoadProfilesAndEnergy." + processingMode + ".Full.xlsx", parameters, true);

            pgRo.DumpToExcel(fn2, XlsResultOutputMode.FullLine);
            excelFileNames.Add(fn2);
            var fn3 = makeAndRegisterFullFilename("AllGeneratedLoadProfilesAndEnergy." + processingMode + ".ByTrafoStationTree.xlsx",
                                                  parameters,
                                                  true);

            excelFileNames.Add(fn3);
            pgRo.DumpToExcel(fn3, XlsResultOutputMode.ByTrafoStationTree);

            var fn4 = makeAndRegisterFullFilename("AllGeneratedLoadProfilesAndEnergy." + processingMode + ".ByTrafoStationHausanschlussTree.xlsx",
                                                  parameters,
                                                  true);

            excelFileNames.Add(fn4);
            pgRo.DumpToExcel(fn4, XlsResultOutputMode.ByTrafoStationHausanschlussTree);
            return(excelFileNames);
        }
        private static void WriteBrokenLpgCalcCleanupBatch([NotNull] ScenarioSliceParameters parameters,
                                                           [NotNull] Func <string, ScenarioSliceParameters, bool, string> makeAndRegisterFullFilename,
                                                           ProcessingMode processingMode,
                                                           [NotNull][ItemNotNull] List <string> brokenLpgDirectories,
                                                           [NotNull][ItemNotNull] List <string> brokenLpgJsons)
        {
            var lpgCleaner = makeAndRegisterFullFilename("CleanBrokenLPGStuff." + processingMode + "." + parameters.GetFileName() + ".cmd",
                                                         parameters,
                                                         true);
            Encoding     utf8WithoutBom = new UTF8Encoding(false);
            FileStream   fs             = new FileStream(lpgCleaner, FileMode.Create);
            StreamWriter sw             = new StreamWriter(fs, utf8WithoutBom);

            sw.WriteLine("chcp 65001");
            foreach (string brokenLpgDirectory in brokenLpgDirectories)
            {
                sw.WriteLine("rmdir /S /Q \"" + brokenLpgDirectory + "\" ");
            }

            foreach (string brokenLpgJson in brokenLpgJsons)
            {
                sw.WriteLine("del \"" + brokenLpgJson + "\" ");
            }

            sw.Close();
        }
示例#15
0
        protected override void RunActualProcess([NotNull] ScenarioSliceParameters slice)
        {
            Log(MessageType.Debug, "running house copying");
            Services.SqlConnection.RecreateTable <Household>(Stage.Houses, slice);
            var dbSrcHouses   = Services.SqlConnection.GetDatabaseConnection(Stage.Houses, slice.PreviousScenarioNotNull).Database;
            var dbDstHouses   = Services.SqlConnection.GetDatabaseConnection(Stage.Houses, slice).Database;
            var dstHouses     = dbDstHouses.Fetch <House>();
            var srcHouseholds = dbSrcHouses.Fetch <Household>();

            dbDstHouses.BeginTransaction();
            var houseHoldsByHouseKey = new Dictionary <string, List <Household> >();

            foreach (var hh in srcHouseholds)
            {
                if (!houseHoldsByHouseKey.ContainsKey(hh.HouseGuid))
                {
                    houseHoldsByHouseKey.Add(hh.HouseGuid, new List <Household>());
                }
                houseHoldsByHouseKey[hh.HouseGuid].Add(hh);
            }

            /*
             * WeightedRandomAllocator<House> wra = new WeightedRandomAllocator<House>(Services.Rnd);
             * List<House> tornDownHouses = wra.PickObjects(srcHouses, (x => x.AverageBuildingAge), parameters.TornDownHouses);
             *
             *
             * List<House> newHouses = new List<House>();
             * for (int i = 0; i < parameters.NewlyBuiltHouses; i++) {
             *  //replace an existing house
             *  if (tornDownHouses.Count > 0) {
             *      House pickedHouse = null;
             *      pickedHouse = tornDownHouses[Services.Rnd.Next(tornDownHouses.Count)];
             *      tornDownHouses.Remove(pickedHouse);
             *  }
             *  else
             *  {
             *      var h = new House();
             *      h.Area = pickedHouse 200 + Services.Rnd.NextDouble(1000);
             *      h.AverageBuildingAge = 0;
             *  }
             * }*/
            int householdsSaved = 0;

            foreach (var house in dstHouses)
            {
                if (houseHoldsByHouseKey.ContainsKey(house.HouseGuid))
                {
                    var hhs = houseHoldsByHouseKey[house.HouseGuid];
                    foreach (var hh in hhs)
                    {
                        hh.HouseholdID = 0;
                        dbDstHouses.Save(hh);
                        householdsSaved++;
                    }
                }
            }
            Log(MessageType.Info, "finished writing " + householdsSaved + " households");
            dbDstHouses.CompleteTransaction();
            Log(MessageType.Debug, "finished house copying");
        }
示例#16
0
        protected override void RunActualProcess([NotNull] ScenarioSliceParameters slice)
        {
            var dbSrcHouses = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice.PreviousSliceNotNull);
            var dbDstHouses = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice);

            dbDstHouses.RecreateTable <DHWHeaterEntry>();
            var srcdhwsystems = dbSrcHouses.Fetch <DHWHeaterEntry>();

            dbDstHouses.BeginTransaction();
            WeightedRandomAllocator <DHWHeaterEntry> dhwAllocator = new WeightedRandomAllocator <DHWHeaterEntry>(Services.Rnd, Services.Logger);
            int numberOfObjects = (int)slice.DHWSystemConversionNumber;
            var electricBoilers = srcdhwsystems.Where(x => x.DhwHeatingSystemType == DhwHeatingSystem.Electricity).ToList();

            if (electricBoilers.Count == 0 && numberOfObjects > 0)
            {
                throw new FlaException("No electric boilers left when trying to allocate " + numberOfObjects);
            }

            bool failOnOversubscribe = slice.DstYear != 2050;
            var  systemsToChange     = dhwAllocator.PickNumberOfObjects(srcdhwsystems, x => x.EffectiveEnergyDemand, numberOfObjects, failOnOversubscribe);

            foreach (var entry in systemsToChange)
            {
                entry.DhwHeatingSystemType  = DhwHeatingSystem.Heatpump;
                entry.EffectiveEnergyDemand = entry.EffectiveEnergyDemand / 3;
            }

            foreach (var dhw in srcdhwsystems)
            {
                dhw.ID = 0;
                dbDstHouses.Save(dhw);
            }

            dbDstHouses.CompleteTransaction();
        }
示例#17
0
            void MakeTrafoKreisMapForNonTrafoKreisHouses(ScenarioSliceParameters slice)
            {
                RGBWithSize GetColor(House h)
                {
                    var eu     = energyUses.Single(x => x.HouseGuid == h.Guid);
                    var energy = eu.ElectricityUse / 1_000_000;

                    if (energy < 10)
                    {
                        energy = 10;
                    }

                    if (string.IsNullOrWhiteSpace(h.TrafoKreis))
                    {
                        return(new RGBWithSize(255, 0, 0, (int)energy));
                    }

                    return(new RGBWithSize(0, 0, 0, 10));
                }

                var mapPoints     = houses.Select(x => x.GetMapPointWithSize(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("HousesWithoutTrafoKreisEnergyUse.svg", slice);
                var legendEntries = new List <MapLegendEntry>();

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }
示例#18
0
 public string MakeAndRegisterFullFilename([NotNull] string filename, [NotNull] ScenarioSliceParameters slice, bool replaceSpaces = true)
 {
     FilesCreated++;
     return(FilenameHelpers.MakeAndRegisterFullFilenameStatic(
                filename, MyStage, SequenceNumber,
                Name, slice, Services.RunningConfig, replaceSpaces));
 }
示例#19
0
        protected override void RunChartMaking(ScenarioSliceParameters slice)
        {
            var dbProfileExport = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.ProfileGeneration, slice, DatabaseCode.HouseProfiles);
            var sa = SaveableEntry <Prosumer> .GetSaveableEntry(dbProfileExport, SaveableEntryTableType.HouseLoad, Services.Logger);

            var            dbHouses          = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice);
            var            houses            = dbHouses.Fetch <House>();
            var            house             = houses.Single(x => x.ComplexName == "Kornhausgasse 16");
            List <Profile> relevantProsumers = new List <Profile>();

            foreach (var prosumer in sa.ReadEntireTableDBAsEnumerable())
            {
                if (prosumer.HouseGuid == house.Guid)
                {
                    if (prosumer.Profile == null)
                    {
                        throw new FlaException("profile was null");
                    }
                    relevantProsumers.Add(new Profile(prosumer.Name + " " + prosumer.ProfileSourceName, prosumer.Profile.Values, prosumer.Profile.EnergyOrPower));
                }
            }

            var fn = MakeAndRegisterFullFilename("ExportedProfiles.xlsx", slice);

            XlsxDumper.DumpProfilesToExcel(fn, slice.DstYear, 15, new ProfileWorksheetContent("kornhausgasse 16", "Last", relevantProsumers));
        }
示例#20
0
        public void ClearTargetDirectory([NotNull] ScenarioSliceParameters slice)
        {
            var fullpath = FilenameHelpers.GetTargetDirectory(MyStage,
                                                              SequenceNumber, Name, slice, Services.RunningConfig);

            if (Directory.Exists(fullpath))
            {
                try {
                    DirectoryInfo di    = new DirectoryInfo(fullpath);
                    var           files = di.GetFiles("*.*", SearchOption.AllDirectories);
                    foreach (var fileInfo in files)
                    {
                        fileInfo.Delete();
                    }
                    di.Delete(true);
                }
#pragma warning disable CA1031 // Do not catch general exception types
                catch (Exception e) {
#pragma warning restore CA1031 // Do not catch general exception types
                    SLogger.Error(e.Message);
                }
            }

            if (!Directory.Exists(fullpath))
            {
                Directory.CreateDirectory(fullpath);
                Thread.Sleep(250);
            }
        }
示例#21
0
        protected override void RunChartMaking()
        {
            ScenarioSliceParameters slice = Constants.PresentSlice;
            double min           = 0;
            var    dbSrcProfiles = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice);
            {
                var allLs   = new List <LineSeriesEntry>();
                var bkws    = dbSrcProfiles.Fetch <BkwProfile>();
                var bkwProf = new Profile(bkws[0].Profile);
                var ls      = bkwProf.GetLineSeriesEntry();
                allLs.Add(ls);
                var filename = MakeAndRegisterFullFilename("BKW_Profile.png", slice);
                Services.PlotMaker.MakeLineChart(filename, bkwProf.Name, allLs, new List <AnnotationEntry>(), min);
            }

            var rlms = dbSrcProfiles.Fetch <RlmProfile>();

            foreach (var rlm in rlms)
            {
                var     allLs   = new List <LineSeriesEntry>();
                Profile profile = new Profile(rlm.Name, rlm.Profile.Values, rlm.Profile.EnergyOrPower);
                var     ls1     = profile.GetLineSeriesEntry();
                allLs.Add(ls1);

                var filename = MakeAndRegisterFullFilename("RLMProfile." + rlm.Name + ".png", slice);
                min = Math.Min(0, rlm.Profile.Values.Min());
                Services.PlotMaker.MakeLineChart(filename, rlm.Name, allLs, new List <AnnotationEntry>(), min);
            }
        }
示例#22
0
        protected override void RunActualProcess([NotNull] ScenarioSliceParameters slice)
        {
            var dbSrcHouses = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice.PreviousSliceNotNull);
            var dbDstHouses = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice);

            dbDstHouses.RecreateTable <BuildingInfrastructure>();
            var srcBuildingInfrastructures = dbSrcHouses.Fetch <BuildingInfrastructure>();

            if (srcBuildingInfrastructures.Count == 0)
            {
                throw new Exception("No building infrastructures were found");
            }

            dbDstHouses.BeginTransaction();
            foreach (var buildingInfrastructure in srcBuildingInfrastructures)
            {
                buildingInfrastructure.ID = 0;
                double energy = buildingInfrastructure.LocalnetLowVoltageYearlyTotalElectricityUse +
                                buildingInfrastructure.LocalnetHighVoltageYearlyTotalElectricityUse;

                double energyReduction = energy * (1 - slice.EnergyReductionFactorBuildingInfrastructure);
                if (Math.Abs(energyReduction) > 0.000001)
                {
                    buildingInfrastructure.SetEnergyReduction(slice.ToString(), energyReduction);
                    //throw new FlaException("Factor 0 for house infrastructure energy reduction in slice " + slice);
                }

                dbDstHouses.Save(buildingInfrastructure);
            }

            dbDstHouses.CompleteTransaction();
        }
示例#23
0
        public static string GetResultArchiveDirectory([NotNull] ScenarioSliceParameters slice,
                                                       DateTime startingTime,
                                                       [NotNull] RunningConfig config,
                                                       RelativeDirectory relativeDir,
                                                       [CanBeNull] string chapter)
        {
            string date     = FilenameHelpers.CleanFileName(startingTime.ToString("yyyy-MM-dd"));
            string scenario = slice.GetFileName();

            if (slice.SmartGridEnabled)
            {
                scenario += "smart";
            }

            string resultArchiveDirectory = Path.Combine(config.Directories.ResultStorageDirectory, date, scenario, relativeDir.ToString());

            if (chapter != null)
            {
                resultArchiveDirectory = Path.Combine(config.Directories.ResultStorageDirectory,
                                                      "Abschlussbericht",
                                                      date,
                                                      "Kapitel " + chapter,
                                                      scenario);
            }

            if (!Directory.Exists(resultArchiveDirectory))
            {
                Directory.CreateDirectory(resultArchiveDirectory);
                Thread.Sleep(250);
            }

            return(resultArchiveDirectory);
        }
        protected override void MakeVisualization([NotNull] ScenarioSliceParameters slice, bool isPresent)
        {
            var dbHouse   = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice);
            var houses    = dbHouse.Fetch <House>();
            var pvSystems = dbHouse.Fetch <PvSystemEntry>();

            MakePvSystemSankey();
            MakePVMap();
            MakePvSystemComparison();

            void MakePvSystemSankey()
            {
                var ssa = new SingleSankeyArrow("HousePVSystems", 1500, MyStage, SequenceNumber, Name, slice, Services);

                ssa.AddEntry(new SankeyEntry("Houses", houses.Count, 5000, Orientation.Straight));
                var count = pvSystems.Count;

                ssa.AddEntry(new SankeyEntry("PVSystems", count * -1, 2000, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Kein PV", (houses.Count - count) * -1, 2000, Orientation.Straight));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakePvSystemComparison()
            {
                var          ssa = new SingleSankeyArrow("RealPVSystemsVsPotential", 50, MyStage, SequenceNumber, Name, slice, Services);
                var          houseGuidsWithPV   = pvSystems.Select(x => x.HouseGuid).ToList();
                var          potentials         = dbHouse.Fetch <PVPotential>();
                var          relevantPotentials = potentials.Where(x => houseGuidsWithPV.Contains(x.HouseGuid)).ToList();
                const double fac             = 1_000_000;
                var          potentialEnergy = relevantPotentials.Sum(x => x.SonnendachStromErtrag) / fac;
                var          installedEnergy = pvSystems.Sum(x => x.EffectiveEnergyDemand) / fac;

                ssa.AddEntry(new SankeyEntry("Sonnendach Potential auf Häusern mit PV", potentialEnergy, 20, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Installed", installedEnergy * -1, 20, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Verschwendetes Potential", (potentialEnergy - installedEnergy) * -1, 20, Orientation.Down));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakePVMap()
            {
                RGB GetColor(House h)
                {
                    if (pvSystems.Any(x => x.HouseGuid == h.Guid))
                    {
                        return(Constants.Red);
                    }

                    return(Constants.Black);
                }

                var mapPoints = houses.Select(x => x.GetMapPoint(GetColor)).ToList();

                var filename      = MakeAndRegisterFullFilename("PVSystems.svg", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("PV", Constants.Red)
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }
        }
示例#25
0
        protected override void RunActualProcess([NotNull] ScenarioSliceParameters parameters)
        {
            Log(MessageType.Debug, "Allocating occupants");
            Services.SqlConnection.RecreateTable <Occupant>(Stage.Houses, parameters);
            var dbSrcHouses  = Services.SqlConnection.GetDatabaseConnection(Stage.Houses, parameters.PreviousScenarioNotNull).Database;
            var dbDstHouses  = Services.SqlConnection.GetDatabaseConnection(Stage.Houses, parameters).Database;
            var srcOccupants = dbSrcHouses.Fetch <Occupant>();
            var yearsToAge   = parameters.DstYear - parameters.PreviousScenario?.DstYear ?? throw new FlaException("No Previous Scenario Set");

            dbDstHouses.BeginTransaction();
            int occupantsWritten = 0;

            foreach (var occ in srcOccupants)
            {
                occ.OccupantID = 0;
                occ.Age       += yearsToAge;
                if (occ.Age < 100)
                {
                    dbDstHouses.Save(occ);
                    occupantsWritten++;
                }
            }
            Log(MessageType.Info, "transfered " + occupantsWritten + " people");
            //make new children
            //
            //add immigration
            dbDstHouses.CompleteTransaction();
        }
        protected override void RunActualProcess([NotNull] ScenarioSliceParameters parameters)
        {
            Log(MessageType.Debug, "running house copying");
            Services.SqlConnection.RecreateTable <House>(Stage.Houses, parameters);
            var dbSrcHouses = Services.SqlConnection.GetDatabaseConnection(Stage.Houses, parameters.PreviousScenarioNotNull).Database;
            var dbDstHouses = Services.SqlConnection.GetDatabaseConnection(Stage.Houses, parameters).Database;
            var srcHouses   = dbSrcHouses.Fetch <House>();

            if (srcHouses.Count == 0)
            {
                throw new FlaException("No houses were found in source slice " + parameters.PreviousScenario);
            }
            dbDstHouses.BeginTransaction();
            int housecount = 0;

            foreach (var srcHouse in srcHouses)
            {
                srcHouse.HouseID = 0;
                dbDstHouses.Save(srcHouse);
                housecount++;
            }
            dbDstHouses.CompleteTransaction();
            Log(MessageType.Info, "Transfered " + housecount + " houses from " + parameters.PreviousScenarioNotNull + " to " + parameters + " in the scenario " + parameters.DstScenario);
            Log(MessageType.Debug, "finished house copying");
        }
 protected override void RunActualProcess([NotNull] ScenarioSliceParameters parameters)
 {
     /*
      *          throw new NotImplementedException();
      *          Services.SqlConnection.RecreateTable<HeatingSystemEntry>(Stage.Houses, up.DstScenario, up.DstYear);
      *          var dbSrcHouses = Services.SqlConnection.GetDatabaseConnection(Stage.Houses, up.SrcScenario, up.SrcYear).Database;
      *          var dbDstHouses = Services.SqlConnection.GetDatabaseConnection(Stage.Houses, up.DstScenario, up.DstYear).Database;
      *          var srcHeatingSystems = dbSrcHouses.Fetch<HeatingSystemEntry>();
      *          if (srcHeatingSystems.Count == 0)
      *          {
      *              throw new Exception("No cars were found");
      *          }
      *
      *          int yearsToAge = up.DstYear - up.SrcYear;
      *          var potentialSystemsToChange = srcHeatingSystems.Where(x =>
      *              x.HeatingSystemType == HeatingSystemType.OilHeating ||
      *              x.HeatingSystemType == HeatingSystemType.Gasheating).ToList();
      *          List<G_DHWSystemChanger.RangeEntry> rangeEntries = new List<G_DHWSystemChanger.RangeEntry>();
      *          foreach (HeatingSystemEntry heatingSystemEntry in potentialSystemsToChange)
      *          {
      *              G_DHWSystemChanger.RangeEntry re = new G_DHWSystemChanger.RangeEntry();
      *              heatingSystemEntry.Age += yearsToAge;
      *              double ageWeight = heatingSystemEntry.Age / 30.0;
      *              double energyWeight = 1 - heatingSystemEntry.AverageHeatingEnergyDemandDensity / 200;
      *              if (energyWeight <= 0)
      *              {
      *                  energyWeight = 0.000001;
      *              }
      *              double combinedWeight = 1 / (ageWeight * energyWeight);
      *              if (double.IsInfinity(combinedWeight))
      *              {
      *                  throw new Exception("Invalid weight");
      *              }
      *
      *              re.HeatingSystemEntry = heatingSystemEntry;
      *              re.Weight = combinedWeight;
      *              rangeEntries.Add(re);
      *          }
      *
      *          if (potentialSystemsToChange.Count < up.ConversionToHeatPumpNumber)
      *          {
      *              throw new Exception("not enough other heating systems left for heat pump conversion demand");
      *          }
      *          double maxRangeValue = rangeEntries.Max(x => x.EndRange);
      *          for (int i = 0; i < up.ConversionToHeatPumpNumber; i++)
      *          {
      *              double pick = Services.Rnd.NextDouble() * maxRangeValue;
      *              var re = rangeEntries.Single(x => pick >= x.StartRange && pick <= x.EndRange);
      *              re.HeatingSystemEntry.Age = 0;
      *              re.HeatingSystemEntry.HeatingSystemType = HeatingSystemType.Heatpump;
      *          }
      *          dbDstHouses.BeginTransaction();
      *          foreach (HeatingSystemEntry heatingSystemEntry in srcHeatingSystems)
      *          {
      *              heatingSystemEntry.HeatingSystemID = 0;
      *              dbDstHouses.Save(heatingSystemEntry);
      *          }
      *
      *          dbDstHouses.CompleteTransaction();*/
 }
示例#28
0
        public void RunPVProviderTestForAllEntries()
        {
            ServiceRepository services = new ServiceRepository(null, null, Logger, Config, new Random(1));
            var slice             = new ScenarioSliceParameters(Scenario.FromEnum(ScenarioEnum.Utopia), 2050, null);
            var dbHouse           = services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice);
            var pventries         = dbHouse.Fetch <PvSystemEntry>();
            var has               = dbHouse.Fetch <Hausanschluss>();
            var dbdto             = new DBDto(null, has, null, null, null);
            PVProfileProvider pvp = new PVProfileProvider(services, slice, dbdto);

            foreach (var entry in pventries)
            {
                HouseComponentRo     hcro = new HouseComponentRo("myname", "PV", 1, 1, "status", "isns", "standort", 0);
                ProviderParameterDto pp   = new ProviderParameterDto(entry, null, hcro);
                pvp.PrepareLoadProfileIfNeeded(pp);
                var prosumer = pvp.ProvideProfile(pp);
                if (prosumer?.Profile == null)
                {
                    throw new FlaException("No profile");
                }

                if (Math.Abs(prosumer.Profile.EnergySum() - entry.EffectiveEnergyDemand) > 0.1)
                {
                    throw new FlaException("Invalid profile: missing energy: should be " + entry.EffectiveEnergyDemand + " but was " +
                                           prosumer.Profile.EnergySum());
                }

                Info("Profile generated correctly.");
            }
        }
        public void RunSingleParameterSlice()
        {
            _output?.WriteLine("This is output from {0}", "RunSingleParameterSlice");
            RunningConfig settings = RunningConfig.MakeDefaults();

            settings.MyOptions.Add(Options.ReadFromExcel);
            settings.LimitToYears.Add(2050);
            settings.LimitToScenarios.Add(Scenario.FromEnum(ScenarioEnum.Utopia));
            settings.MakeCharts = false;
            using (Logger logger = new Logger(_output, settings)) {
                settings.InitializeSlices(logger);
                using (var container = CreateBuilderContainer(_output, logger, settings)) {
                    using (var scope = container.BeginLifetimeScope()) {
                        if (settings.Slices == null)
                        {
                            throw new FlaException("slices was not initalized");
                        }

                        ScenarioSliceParameters ssp = settings.Slices[0];
                        //ssp = Constants.PresentSlice;
                        var s1 = scope.Resolve <Z_GeneralExporter>();
                        s1.RunForScenarios(ssp);
                        var pm = scope.Resolve <PlotMaker>();
                        pm.Finish();
                        PngSvgConverter con = new PngSvgConverter(logger, Stage.Preparation);
                        con.ConvertAllSVG(settings);
                        logger.SaveToDatabase(Constants.PresentSlice);
                    }
                }
            }
        }
        private static JsonCalcSpecification MakeCalcSpec([NotNull] ScenarioSliceParameters parameters, DateTime endtime)
        {
            DateTime      startTime     = new DateTime(parameters.DstYear, 1, 1);
            JsonReference geoloc        = new JsonReference("(Germany) Chemnitz", "eddeb22c-fbd4-44c1-bf2d-fbde3342f1bd");
            JsonReference tempReference = new JsonReference("Berlin, Germany 1996 from Deutscher Wetterdienst DWD (www.dwd.de)",
                                                            "ec337ba6-60a1-404b-9db0-9be52c9e5702");
            JsonCalcSpecification jcs = new JsonCalcSpecification(null,
                                                                  null,
                                                                  false,
                                                                  null,
                                                                  false,
                                                                  endtime,
                                                                  "00:15:00",
                                                                  "00:01:00",
                                                                  geoloc,
                                                                  LoadTypePriority.RecommendedForHouses,
                                                                  null,
                                                                  false,
                                                                  startTime,
                                                                  tempReference,
                                                                  null,
                                                                  null)
            {
                DeleteDAT             = true,
                DefaultForOutputFiles = OutputFileDefault.None, SkipExisting = true
            };

            jcs.CalcOptions.Add(CalcOption.SumProfileExternalIndividualHouseholdsAsJson);
            jcs.LoadtypesForPostprocessing.Add("Electricity");
            jcs.LoadtypesForPostprocessing.Add("Car Charging Electricity");
            jcs.OutputDirectory = "Results";
            jcs.IgnorePreviousActivitiesWhenNeeded = true;
            return(jcs);
        }