Commit 60e34b37 authored by Eric Duminil's avatar Eric Duminil
Browse files

Remove old/ from version control and add to .gitignore



Co-Authored-By: default avatarClaude Sonnet 4.6 <noreply@anthropic.com>
parent 0a044d42
......@@ -8,3 +8,6 @@ wheels/
# Virtual environments
.venv
# Legacy reference code (not part of the library)
old/
import logging
logging.basicConfig(
level=logging.INFO,
format='%(levelname)s: %(message)s'
)
from pathlib import Path
import logging
import re
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
matplotlib.use('agg')
log = logging.getLogger(__name__)
RAIN_L = "Sum rain [L]"
RUNOFF_L = "Sum runoff [L]"
ETC_L = "Sum ETc [L]"
SINGLE_TREE_ETC_L = "Single tree ETc [L]"
SINGLE_TREE_MISSING_WATER_L = "Single tree missing water [L]"
SINGLE_TREE_MISSING_WATER_MM = "Single tree missing water [mm]"
RAIN_MM = "Average rain [mm]"
RUNOFF_MM = "Average runoff [mm]"
ET0_MM = "et0 [mm]"
ETC_MM = "Average ETc [mm]"
# NOTE: This code isn't used anywhere, it was just a proposal for diagrams
def parse_green_water_results(csv_path: str |Path, year: int = 2005) -> pd.DataFrame:
times = pd.date_range(start=f'{year}-01-01 00:00', freq='1h', periods=8760)
df = pd.read_csv(csv_path,
sep=';',
header=0,
skiprows=list(range(9)) + list(range(10, 14)),
)
df = df.rename(columns={"#": "time",
"Sum rain over trees [L]": RAIN_L,
"Missing water [L]": SINGLE_TREE_MISSING_WATER_L,
"ETc [L]": SINGLE_TREE_ETC_L
})
with open(csv_path, encoding='utf-8') as csv:
for _ in range(5):
line = next(csv)
tree_area_header = re.split('[;,]', line.strip())
tree_area = float(tree_area_header[1])
for _ in range(6):
line = next(csv)
species = re.split(';+', line)[1]
line = next(csv)
single_tree_area = float(re.split('[;,]+', line)[1])
log.info('Total tree area : %g m²', tree_area)
log.info('Largest tree (%s): %g m²', species, single_tree_area)
sum_columns = [col for col in df if 'Sum' in col]
for sum_column in sum_columns:
new_column = sum_column.replace('Sum', 'Average').replace('[L]', '[mm]')
column_idx = list(df).index(sum_column)
df.insert(loc=column_idx + 1, column=new_column, value= df[sum_column] / tree_area)
single_tree_columns = [col for col in df if 'Single tree' in col]
df[SINGLE_TREE_MISSING_WATER_L] = -df[SINGLE_TREE_MISSING_WATER_L]
for single_tree_column in single_tree_columns:
new_column = single_tree_column.replace('[L]', '[mm]')
column_idx = list(df).index(single_tree_column)
df.insert(loc=column_idx + 1, column=new_column, value= df[single_tree_column] / single_tree_area)
df = df.set_index(times)
df = df.drop(columns=['time'])
return df
def plot_greenwater(csv_path, description, output_dir=Path('output')):
df = parse_green_water_results(csv_path)
df['net_rain_sum'] = (df[RAIN_MM]-df[RUNOFF_MM]).cumsum()
ax = (df[[SINGLE_TREE_MISSING_WATER_MM, RAIN_MM, RUNOFF_MM]]).plot(grid=True)
title = f"Missing Water\n{description}"
plt.title(title)
ax.set_ylabel("[mm]")
png_path1 = output_dir / f"missing_water_{description}.png"
plt.savefig(png_path1, bbox_inches='tight')
plt.close()
ax = (df[[SINGLE_TREE_MISSING_WATER_MM, 'net_rain_sum']]).plot()
title = f"Missing Water\n{description}"
ax.set_ylabel("[mm]")
plt.title(title)
png_path2 = output_dir / f"missing_water_sum_{description}.png"
plt.savefig(png_path2,
bbox_inches='tight')
plt.close()
ax = df[[ETC_MM, RAIN_MM]].resample('1ME').sum().plot.bar()
title = f"Monthly ETc & Rain\n{description}"
ax.set_ylabel("[mm]")
month_labels = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
ax.set_xticklabels(month_labels)
plt.title(title)
png_path3 = output_dir / f"etc_{description}.png"
plt.savefig(png_path3,
bbox_inches='tight')
plt.close()
return png_path1, png_path2, png_path3
r"""Tries to find simstadt, find a workflowstep, and run it with the specified
CityGMLs.
It could be useful in order to run the same workflows with many different CityGMLs, or with slightly different
parameters.
User config part will probably need to be updated.
Corresponding workflows can be defined and saved in the SimStadt GUI.
Example output with the current configuration:
# SimStadt found in C:\Users\eric.duminil\Desktop\SimStadt_0.10.0-SNAPSHOT_master_20230601_607b426
# Preparing 'Gruenbuehl_PhotovoltaicPotential&Financial' workflow (a.step):
* Adding Gruenbuehl_LOD2_ALKIS_1010.gml
* Adding Gruenbuehl_LOD2_ALKIS_1010_2buildings.gml
# Launching Gruenbuehl_PhotovoltaicPotential&Financial:
Workflow finished succesfuly!
# Listing written files :
* 'Gruenbuehl.proj\a.step\a.step\a.step\a.step\a.step\hourly_GHI_DHI_Ta.prn'
* 'Gruenbuehl.proj\a.step\a.step\a.step\a.step\a.step\a.step\a.step\a.step\Gruenbuehl_LOD2_ALKIS_1010_2buildings_pvgis_SARAH_2005_2016_Hay_pv_potential.csv'
* 'Gruenbuehl.proj\a.step\a.step\a.step\a.step\a.step\a.step\a.step\a.step\Gruenbuehl_LOD2_ALKIS_1010_pvgis_SARAH_2005_2016_Hay_pv_potential.csv'
# Preparing 'Gruenbuehl_HeatDemand' workflow (b.step):
* Adding Gruenbuehl_LOD2_ALKIS_1010.gml
* Adding Gruenbuehl_LOD2_ALKIS_1010_2buildings.gml
# Launching Gruenbuehl_HeatDemand:
Workflow finished succesfuly!
# Listing written files :
* 'Gruenbuehl.proj\b.step\a.step\a.step\a.step\a.step\hourly_GHI_DHI_Ta.prn'
* 'Gruenbuehl.proj\b.step\a.step\a.step\a.step\a.step\a.step\a.step\Gruenbuehl_LOD2_ALKIS_1010_2buildings_DIN18599_HEATING.csv'
* 'Gruenbuehl.proj\b.step\a.step\a.step\a.step\a.step\a.step\a.step\Gruenbuehl_LOD2_ALKIS_1010_2buildings_DIN18599_HEATING.log'
* 'Gruenbuehl.proj\b.step\a.step\a.step\a.step\a.step\a.step\a.step\Gruenbuehl_LOD2_ALKIS_1010_DIN18599_HEATING.csv'
* 'Gruenbuehl.proj\b.step\a.step\a.step\a.step\a.step\a.step\a.step\Gruenbuehl_LOD2_ALKIS_1010_DIN18599_HEATING.log'
"""
import logging
import os
import platform
import re
import shutil
import subprocess
from pathlib import Path
from xml.etree import ElementTree as et
from dotenv import load_dotenv
from lib.simstadt_results import SimStadtResults, create_simstadt_results
from lib.utils import PROJECT_PATH, SCRIPT_DIR, chdir, random_id
PARAMS = "params.xml"
SIMSTADT2_GLOB = "SimStadt2_0.*/"
TEMPLATE_PATH = SCRIPT_DIR / 'Template'
load_dotenv()
log = logging.getLogger(__name__)
def find_simstadt(parent_folder: Path, simstadt_glob: str) -> Path:
try:
found = next(parent_folder.glob(simstadt_glob))
log.info("# SimStadt found in %s\n", found)
return found
except StopIteration as e:
log.error("Sorry, no SimStadt installation could be found in : %s/%s", parent_folder, simstadt_glob)
raise ValueError("SimStadt not found. Please define SIMSTADT_FOLDER environment variable.") from e
def check_paths(repo_path: Path, workflow_path: Path):
if not repo_path.exists():
raise ValueError(f"Sorry, no Repository could be found in {repo_path}")
if not workflow_path.exists():
raise ValueError(f"Sorry, no workflow could be found in {workflow_path}")
if not (workflow_path / PARAMS).exists():
raise ValueError(f"Sorry, no workflow is defined in {workflow_path / PARAMS}")
proj_path = workflow_path.parent
for gml in proj_path.glob("*.gml"):
log.debug(" * Available citygml : %s", gml.name)
def prepare_workflow(workflow_path: Path, citygmls: list[str]) -> str:
tree = et.parse(workflow_path / PARAMS)
root = tree.getroot()
node = root.find(".//void[@property='name']/string")
if node is None:
raise ValueError("Unknown workflow!")
name = node.text or "workflow"
log.info("# Preparing '%s' workflow (%s):", name, workflow_path.name)
citygml_node = root.find(".//void[@property='cityGmlFileNames']")
if citygml_node:
log.debug(" Removing old citygmls")
children = list(citygml_node)
for add_node in children:
citygml_node.remove(add_node)
else:
log.debug(" Add new XML node")
workflow_node = root.find(".//object[@class='eu.simstadt.workflows.CityGmlWorkflow']")
if workflow_node is None:
raise ValueError("Broken workflow!")
citygml_node = et.SubElement(workflow_node, "void")
citygml_node.set("property", "cityGmlFileNames")
for citygml in citygmls:
log.info(" * Adding %s", citygml)
add_node = et.SubElement(citygml_node, "void")
add_node.set("method", "add")
gml = et.SubElement(add_node, "string")
gml.text = citygml
tree.write(workflow_path / PARAMS)
return name
def get_all_files(folder: Path) -> dict[Path, float]:
files = [f for f in folder.glob("**/*") if f.is_file() and f.name != PARAMS]
return {f: f.stat().st_mtime for f in files}
def simstadt_script():
if platform.system().lower() == "windows":
return "SimStadt.bat"
return "./SimStadt.sh"
def regionchooser_script():
if platform.system().lower() == "windows":
return "RegionChooser.bat"
return "./RegionChooser.sh"
def run_simstadt(workflow_path: Path, name: str) -> str:
with chdir(get_simstadt_folder()):
log.info("Launching %s:", name)
result = subprocess.run([simstadt_script(), str(workflow_path)], text=True, capture_output=True, check=False)
if result.returncode != 0:
log.warning(" Workflow failed!\n%s", result.stdout)
raise ValueError("Workflow failed!")
log.debug(result.stdout)
log.info(" Workflow finished succesfuly!\n")
return result.stdout
def run_regionchooser(*params: str):
with chdir(get_simstadt_folder()):
result = None
try:
log.info("Launching RegionChooser %s:", params)
result = subprocess.run([regionchooser_script(), *params], text=True, capture_output=True, check=True)
log.debug(result.stdout)
log.info(" RegionChooser finished succesfuly!\n")
except subprocess.CalledProcessError as e:
log.warning(" RegionChooser failed!\n")
log.info(e.stderr)
raise
return result.stdout
def compare_written_files(repo_path: Path, before, after) -> list[Path]:
modified_files = []
log.info("# Listing written files :")
for result_file, modification_time in after.items():
before_time = before.get(result_file, 0)
if modification_time > before_time:
log.info(" * '%s'", result_file.relative_to(repo_path))
modified_files.append(result_file)
log.info("\n")
return modified_files
def run_workflow(workflow_path: Path, citygmls: list[str]) -> list[Path]:
repo_path = workflow_path.parent.parent
check_paths(repo_path, workflow_path)
name = prepare_workflow(workflow_path, citygmls)
before = get_all_files(workflow_path)
run_simstadt(workflow_path, name)
after = get_all_files(workflow_path)
return compare_written_files(repo_path, before, after)
def replace_params(workflow_path: Path, replaces: dict[str, str]):
param_files = workflow_path.glob(f"**/{PARAMS}")
replaced = False
for param_file in param_files:
with open(param_file, encoding="utf-8") as f:
content = f.read()
new_content = content
for old, new in replaces.items():
new_content = re.sub(old, new, new_content)
if new_content != content:
log.debug("Replacing parameters in %s", param_file)
replaced = True
with open(param_file, "w", encoding="utf-8") as f:
f.write(new_content)
if not replaced:
log.warning("No parameter has been replaced! %r", replaces)
def copy_workflow_from_template(
template_path: Path, project_path: Path, destination: str, replaces: dict | None = None
) -> Path:
template_path = template_path.with_suffix(".flow")
workflow_path = (project_path / destination).with_suffix(".flow")
shutil.copytree(template_path, workflow_path, dirs_exist_ok=True)
if replaces:
replace_params(workflow_path, replaces)
return workflow_path
def get_simstadt_folder():
if "SIMSTADT_FOLDER" in os.environ:
return Path(os.environ["SIMSTADT_FOLDER"])
return find_simstadt(Path.home() / "Desktop", SIMSTADT2_GLOB)
def run_workflow_with_citygml(
template: str | Path,
citygml_path: Path,
replaces: dict | None = None,
description: str | None = None,
destination: str | None = None,
) -> SimStadtResults:
if isinstance(template, str):
template_path = TEMPLATE_PATH / template
else:
template_path = template
template_name = template_path.stem
if destination is None:
# In order to avoid conflicts when two simulations are run as the same time
destination = random_id() + "_" + template_name.rsplit("_", 1)[-1]
project_path = citygml_path.parent
workflow_path = copy_workflow_from_template(
template_path,
project_path,
destination,
replaces,
)
output_files = run_workflow(workflow_path, [citygml_path.name])
if description is None:
description = f"{template_name} for {citygml_path.name}"
return create_simstadt_results(description, output_files)
if __name__ == "__main__":
template_and_citygmls = [
("101_HeatDemand", "Grombuehl_mini_Steinheilstrasse.gml"),
("102_GreenWater", "Grombühl_mini_with_trees.gml"),
("103_PV", "Grombühl_mini_with_trees.gml"),
]
set_weather_file = {"<string>METEONORM_FILE</string>": f"<string>Wuerzburg-hour.csv</string>"}
for template, citygml in template_and_citygmls:
results = run_workflow_with_citygml(template, PROJECT_PATH / citygml, replaces=set_weather_file)
print(results.dataframe)
print(repr(results))
import logging
import subprocess
from pathlib import Path
from lib.utils import chdir
log = logging.getLogger(__name__)
def run_urbi(
urbi_folder: Path,
gml_path: Path,
path_config_urbi: Path,
urbi_output_folder: Path,
gui_activate: bool = False,
):
if gui_activate:
gui = ["python", urbi_folder / "urbi.py", "--gui"]
try:
with chdir(urbi_folder):
process = subprocess.Popen(gui, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = process.communicate()
except Exception as e:
log.error(f"Error starting process: {e}")
else:
log.info(f"Output: {output.decode()}")
log.info(f"Error: {error.decode()}")
else:
log.info("Urbi+ started without GUI")
no_gui = [
"python",
"urbi.py",
"--config",
path_config_urbi,
gml_path,
"--output",
urbi_output_folder,
]
try:
with chdir(urbi_folder):
process = subprocess.Popen(no_gui, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
output, error = process.communicate()
log.info("Urbi+ success")
except Exception as e:
log.error(f"Error starting process: {e}")
This diff is collapsed.
from pathlib import Path
from lib.run_simstadt_workflow import run_workflow_with_citygml
from lib.simstadt_results import SimStadtResults
from lib.utils import PROJECT_PATH, remove_random_id, set_random_seed
################################################################################
# Simulation functions, for callbacks, testing and optimization #
################################################################################
def set_weather_file(meteonorm_filename: str) -> dict[str, str]:
# Input filename sometimes contains just the basename, sometimes the whole path
return {"<string>METEONORM_FILE</string>": f"<string>{Path(meteonorm_filename).name}</string>"}
def set_calculation_mode(calculation_mode: str) -> dict[str, str]:
allowed_modes = ["HEATING", "COOLING", "HEATING_AND_COOLING"]
if calculation_mode not in allowed_modes:
raise ValueError(f"{calculation_mode} should be in {allowed_modes}")
return {"<string>CALCULATION_MODE</string>": f"<string>{calculation_mode}</string>"}
def set_refurbishment(geg_ratio: float) -> dict[str, str]:
return {"<double>GEG_RATIO</double>": f"<double>{geg_ratio}</double>"}
def photovoltaic_simulation(
gml_filename: str,
meteonorm_filename: str,
roof_percentage: float = 100.0, # [%]
pv_share_flat: float = 40, # [%]
pv_share_tilted: float = 50, # [%]
min_roof_insolation: float = 1000, # [kWh / (m² . a)]
hourly_pv: bool = False,
with_shadows: bool = True,
description="🌤️ Photovoltaik",
) -> SimStadtResults:
set_weather_file_and_pv_share = set_weather_file(meteonorm_filename) | {
"<int>PV_SHARE_FLAT_ROOF</int>": f"<int>{pv_share_flat}</int>",
"<int>PV_SHARE_TILTED_ROOF</int>": f"<int>{pv_share_tilted}</int>",
"<int>MIN_ROOF_INSOLATION</int>": f"<int>{min_roof_insolation}</int>",
"<boolean>HOURLY_PV</boolean>": f"<boolean>{str(hourly_pv).lower()}</boolean>",
}
template = "105_PVWithShadow" if with_shadows else "103_PV"
pv_results = run_workflow_with_citygml(
template,
PROJECT_PATH / gml_filename,
replaces=set_weather_file_and_pv_share,
description=description,
)
set_random_seed(remove_random_id(gml_filename))
# Only keep roof_percentage of rows
pv_results._df = pv_results.dataframe.sample(frac=roof_percentage / 100.0)
return pv_results
def heatdemand_simulation(
gml_filename: str,
meteonorm_filename: str,
with_shadows: bool = True,
calculation_mode: str = "HEATING",
refurbishment_ratio: float = 0.0,
description="🏡🌤️ Wärmebedarf",
) -> SimStadtResults:
template = "104_HeatDemandWithShadow" if with_shadows else "101_HeatDemand"
return run_workflow_with_citygml(
template,
PROJECT_PATH / gml_filename,
replaces=set_weather_file(meteonorm_filename)
| set_calculation_mode(calculation_mode)
| set_refurbishment(refurbishment_ratio),
description=description,
)
def greenwater_simulation(
gml_filename: str, meteonorm_filename: str, irrigation_ratio: float, description="🌱 Grün & Wasser"
) -> SimStadtResults:
# irrigation_ratio 1.0 : Irrigation when needed
# irrigation_ratio 0.0 : No irrigation
set_weather_file_and_irrigation = set_weather_file(meteonorm_filename) | {
"<double>MAX_WATER_STRESS</double>": f"<double>{1 - irrigation_ratio}</double>",
}
return run_workflow_with_citygml(
"102_GreenWater",
PROJECT_PATH / gml_filename,
replaces=set_weather_file_and_irrigation,
description=description,
)
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.citygml.steps.ImportCityGml" id="ImportCityGml0">
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>startStep</string>
<void method="set">
<object idref="ImportCityGml0"/>
<boolean>true</boolean>
</void>
</void>
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>selectedNextStepPath</string>
<void method="set">
<object idref="ImportCityGml0"/>
<string>01_Preprocessing.step</string>
</void>
</void>
<void property="name">
<string>Base</string>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.GeometricPreprocessorStep" id="GeometricPreprocessorStep0">
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>startStep</string>
<void method="set">
<object idref="GeometricPreprocessorStep0"/>
<boolean>true</boolean>
</void>
</void>
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>selectedNextStepPath</string>
<void method="set">
<object idref="GeometricPreprocessorStep0"/>
<string>01_GeometricEstimator.step</string>
</void>
</void>
<void property="name">
<string>Base</string>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.GeometricEstimatorStep" id="GeometricEstimatorStep0">
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>selectedNextStepPath</string>
<void method="set">
<object idref="GeometricEstimatorStep0"/>
<string>02_PhysicsPreprocessor.step</string>
</void>
</void>
<void property="name">
<string>Base</string>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.PhysicsPreprocessorStep" id="PhysicsPreprocessorStep0">
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>selectedNextStepPath</string>
<void method="set">
<object idref="PhysicsPreprocessorStep0"/>
<string>03_UsagePreprocessor.step</string>
</void>
</void>
<void property="name">
<string>Base</string>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.UsagePreprocessorStep">
<void property="name">
<string>Base</string>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.Preprocessing" id="Preprocessing0">
<void class="de.hftstuttgart.hierarchicworkflow.Workflow" method="getField">
<string>selectedStartStepPath</string>
<void method="set">
<object idref="Preprocessing0"/>
<string>00_GeometricPreprocessor.step</string>
</void>
</void>
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>selectedNextStepPath</string>
<void method="set">
<object idref="Preprocessing0"/>
<string>02_WeatherProcessor.step</string>
</void>
</void>
<void property="name">
<string>Base</string>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.WeatherProcessorStep" id="WeatherProcessorStep0">
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>selectedNextStepPath</string>
<void method="set">
<object idref="WeatherProcessorStep0"/>
<string>03_IrradianceProcessor.step</string>
</void>
</void>
<void property="inputFilename">
<string>Wuerzburg-hour.csv</string>
</void>
<void property="name">
<string>Base</string>
</void>
<void property="weatherDataSource">
<object class="java.lang.Enum" method="valueOf">
<class>de.hft.stuttgart.simstadt2.weather.WeatherDataSourceType</class>
<string>TMY3_HOURLY_FILE</string>
</object>
</void>
</object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.IrradianceProcessorStep" id="IrradianceProcessorStep0">
<void class="de.hftstuttgart.hierarchicworkflow.WorkflowStep" method="getField">
<string>selectedNextStepPath</string>
<void method="set">
<object idref="IrradianceProcessorStep0"/>
<string>04_MonthlyEnergyBalance.step</string>
</void>
</void>
<void property="name">
<string>Base</string>
</void>
</object>
</java>
## SimStadt DIN18599 Monthly Energy Balance
#
# Weather data source;meteonorm tmy3 file 2000-2009
# Location;Wuerzburg
# Coordinate reference system;EPSG:25832
# Latitude;49,77;°
# Longitude;9,97;°
# Radiation model;meteonorm_Hay
# Calculation Mode;HEATING
# Consumer behaviour;IWU_NUTZUNG
#
# Building physics library;German Building Typology Library IWU (http://www.iwu.de)
# Building usage library;Germany (based on UsageLibrary.xlsx, sheet: Germany)
# Has custom building usage codes?;false
#
# SimStadt version;0.14.0-SNAPSHOT (develop, rev. a5cbb2b, 20250317)
# Created at;2025/04/23 09:41:31
# Cache version;7
#
GMLId;ParentGMLId;Latitude;Longitude;X-coordinate;Y-coordinate;LOD;Year of construction;Year of refurbishment;Refurbishment Variant;ALKIS code;PrimaryUsageZoneType;PrimaryUsageZoneArea;SecondaryUsageZoneType;SecondaryUsageZoneArea;BuildingType;Footprint area;Total wall thermal area above ground;Total wall thermal area below ground;Total outwall area;Total shared wall area;Total roof area;Gross volume;Is Gross volume approximated?;Heated volume;Ridge/mean Height;Eaves/mean Height;Storey number;Average Storey Height;Number of households;Number of occupants;Attic Heating;Basement Heating;Basement ceiling height above ground;Surface area to volume ratio;Heated area;Mean Uvalue;Specific domestic hot water demand;Domestic hot water demand;Specific space heating demand;Yearly Heating demand;Total Yearly Heating + DHW demand;January Heating demand;February Heating demand;March Heating demand;April Heating demand;May Heating demand;June Heating demand;July Heating demand;August Heating demand;September Heating demand;October Heating demand;November Heating demand;December Heating demand
[-];[-];[°];[°];[?];[?];LOD;[YYYY];[YYYY];[-];[-];[-];[m²];[-];[m²];[-];[m²];[m²];[m²];[m²];[m²];[m²];[m³];[0/1];[m³];[m];[m];[-];[m];[-];[-];[-];[-];[m];[m⁻¹];[m²];[W/(m²·K)];[kWh/(m²·a)];[kWh/a];[kWh/(m²·a)];[kWh/a];[kWh/a];[kWh];[kWh];[kWh];[kWh];[kWh];[kWh];[kWh];[kWh];[kWh];[kWh];[kWh];[kWh]
DEBY_LOD2_604868;;49,80340;9,94771;568195,65;5517202,94;LOD_2;1973;;Original;31001_1000;residential;658,3;none;0,0;GMH;139,5;385,7;0,0;414,3;308,0;156,8;2196,6;false;2057,1;17,0;14,47;6;2,7;6;19;HEATED;NOT_HEATED;1,0;0,324;658,3;1,20;15,8;10427,0;74,5;49073;59500;10945;8297;5868;2017;175;3;0;0;385;3222;7460;10702
DEBY_LOD2_604870;;49,80340;9,94729;568165,37;5517202,14;LOD_2;1960;;Original;31001_1000;residential;912,4;none;0,0;GMH;184,1;573,4;0,0;616,8;192,3;250,3;3035,3;false;2851,2;19,2;14,17;7;2,6;9;18;HEATED;NOT_HEATED;1,0;0,346;912,4;1,28;15,8;14452,0;86,3;78709;93161;17271;13206;9629;3531;336;5;0;0;750;5375;11798;16808
DEBY_LOD2_604869;;49,80340;9,94676;568127,19;5517202,25;LOD_2;2014;;Original;31001_1000;residential;864,4;none;0,0;GMH;179,3;566,3;0,0;609,2;180,9;225,8;2880,6;false;2701,3;18,6;14,11;7;2,5;8;18;HEATED;NOT_HEATED;1,0;0,352;864,4;0,40;15,8;13692,0;32,2;27835;41527;6804;4944;3024;545;11;0;0;0;44;1384;4416;6662
DEBY_LOD2_604871;;49,80340;9,94697;568142,65;5517202,19;LOD_2;1978;;Original;31001_1000;residential;825,2;none;0,0;GMH;179,8;529,0;0,0;571,6;180,9;225,9;2758,5;false;2578,8;17,7;13,43;6;2,8;8;12;HEATED;NOT_HEATED;1,0;0,354;825,2;1,20;15,8;13071,0;78,4;64691;77762;14652;10977;7606;2331;186;2;0;0;447;4177;9981;14333
DEBY_LOD2_604872;;49,80319;9,94676;568127,23;5517178,83;LOD_2;1974;;Original;31001_1000;residential;782,4;none;0,0;GMH;179,5;506,9;0,0;549,7;168,6;220,2;2624,4;false;2445,0;16,9;12,82;6;2,7;7;10;HEATED;NOT_HEATED;1,0;0,362;782,4;1,19;15,8;12393,0;82,3;64359;76752;14356;10877;7723;2621;222;3;0;0;520;4268;9767;14002
DEBY_LOD2_604874;;49,80318;9,94749;568180,49;5517178,18;LOD_2;1990;;Original;31001_1000;residential;720,6;none;0,0;GMH;164,4;417,0;0,0;451,5;249,7;205,3;2416,4;false;2252,0;16,8;12,61;6;2,6;7;13;HEATED;NOT_HEATED;1,0;0,340;720,6;0,81;15,8;11415,0;56,5;40720;52135;9243;6955;4826;1460;94;1;0;0;247;2583;6269;9043
DEBY_LOD2_604873;;49,80319;9,94697;568142,69;5517178,70;LOD_2;1960;;Original;31001_1000;residential;763,1;none;0,0;GMH;178,0;491,8;0,0;534,1;168,6;219,1;2562,7;false;2384,7;16,6;12,59;6;2,6;7;11;HEATED;NOT_HEATED;1,0;0,363;763,1;1,27;15,8;12088,0;87,7;66901;78989;14860;11269;8075;2719;248;3;0;0;568;4502;10166;14490
DEBY_LOD2_604876;;49,80318;9,94728;568165,25;5517178,28;LOD_2;1922;;Original;31001_1000;residential;785,3;none;0,0;GMH;172,0;524,6;0,0;530,5;161,3;216,0;2478,0;false;2453,9;16,6;12,57;6;2,8;7;15;HEATED;NOT_HEATED;0,1;0,371;785,3;1,57;15,8;12439,0;104,5;82097;94536;18223;13935;10124;3420;185;1;0;0;556;5545;12398;17712
DEBY_LOD2_604875;;49,80339;9,94751;568181,00;5517202,13;LOD_2;1916;;Original;31001_1000;residential;896,3;none;0,0;GMH;171,9;450,0;0,0;481,7;362,2;225,8;2972,7;false;2800,8;19,7;14,70;7;2,7;8;12;HEATED;NOT_HEATED;1,0;0,296;896,3;1,80;15,8;14197,0;96,2;86184;100381;19335;14656;10459;3426;175;1;0;0;520;5627;13139;18847
DEBY_LOD2_604877;;49,80340;9,94791;568209,80;5517202,83;LOD_2;1988;;Original;31001_1000;residential;722,0;none;0,0;GMH;138,1;416,7;0,0;445,6;324,2;180,3;2394,5;false;2256,4;19,4;15,27;7;2,6;7;9;HEATED;NOT_HEATED;1,0;0,319;722,0;0,82;15,8;11437,0;53,8;38842;50279;8840;6638;4580;1424;91;1;0;0;226;2409;5975;8659
DEBY_LOD2_604878;;49,80339;9,94810;568223,83;5517202,73;LOD_2;1956;;Original;31001_1000;residential;894,8;none;0,0;GMH;138,6;593,0;0,0;597,4;170,0;180,7;2392,0;false;2375,7;19,3;15,18;8;2,4;8;15;HEATED;NOT_HEATED;0,1;0,383;894,8;1,39;15,8;14174,0;82,7;73961;88135;16514;12477;8864;2948;261;4;0;0;595;4902;11277;16121
DEBY_LOD2_604879;;49,80317;9,94790;568209,32;5517177,33;LOD_2;1968;;Original;31001_1000;residential;616,0;none;0,0;GMH;137,5;411,6;0,0;443,2;235,4;154,8;2062,6;false;1925,1;16,3;13,73;6;2,5;6;8;HEATED;NOT_HEATED;1,0;0,357;616,0;1,28;15,8;9758,0;89,8;55308;65066;12044;9253;6806;2577;269;4;0;0;560;3822;8253;11720
DEBY_LOD2_604880;;49,80316;9,94809;568223,38;5517177,20;LOD_2;1937;;Original;31001_1000;residential;557,8;none;0,0;GMH;138,8;494,9;0,0;532,1;147,3;156,7;2075,2;false;1936,4;16,2;13,66;5;3,0;5;10;HEATED;NOT_HEATED;1,0;0,399;557,8;1,57;15,8;8836,0;117,9;65781;74617;14962;11282;7868;2321;111;0;0;0;330;4224;10112;14572
DEBY_LOD2_604882;;49,80317;9,94770;568195,11;5517177,45;LOD_2;1882;;Original;31001_1000;residential;363,9;none;0,0;RH;142,2;231,7;0,0;260,7;176,6;142,2;1279,5;false;1137,3;9,0;9,00;3;2,7;5;8;NO_ROOM;NOT_HEATED;1,0;0,426;363,9;1,31;15,8;5765,0;107,5;39128;44893;8497;6561;4898;1915;150;1;0;0;332;2694;5822;8259
DEBY_LOD2_605659;;49,80331;9,94669;568122,33;5517191,87;LOD_2;1966;;Original;31001_2000;commercial;12,5;none;0,0;EFH;15,6;45,3;0,0;49,5;0,0;15,7;45,7;false;39,0;3,1;2,75;1;2,5;0;0;NOT_HEATED;NOT_HEATED;0,3;1,769;12,5;1,23;73,0;912,0;258,7;3231;4143;799;574;360;88;0;0;0;0;2;145;488;775
DEBY_LOD2_605660;;49,80331;9,94722;568160,33;5517192,29;LOD_2;1976;;Original;31001_2000;commercial;14,4;none;0,0;RH;17,4;30,7;0,0;33,6;15,9;17,4;49,3;false;45,1;2,8;2,84;1;2,6;0;0;NO_ROOM;NOT_HEATED;0,2;1,384;14,4;1,15;73,0;1054,0;225,0;3247;4301;765;565;379;108;4;0;0;0;12;188;491;736
DEBY_LOD2_605661;;49,80330;9,94700;568144,89;5517191,77;LOD_2;1991;;Original;31001_2000;commercial;23,9;none;0,0;EFH;29,9;71,7;0,0;79,6;0,0;30,0;87,3;false;74,7;3,0;2,79;1;2,5;0;0;NOT_HEATED;NOT_HEATED;0,3;1,599;23,9;0,59;73,0;1745,0;140,1;3349;5094;807;574;356;97;7;0;0;0;15;180;521;793
DEBY_LOD2_605664;;49,80327;9,94722;568160,29;5517188,10;LOD_2;1953;;Original;31001_2000;commercial;26,5;none;0,0;RH;29,3;43,1;0,0;48,3;15,9;29,4;86,7;false;70,2;3,2;2,72;1;2,4;0;0;NOT_HEATED;NOT_HEATED;0,3;1,233;26,5;1,21;73,0;1932,0;185,1;4898;6830;1190;847;527;138;6;0;0;0;15;253;759;1164
DEBY_LOD2_605665;;49,80327;9,94805;568220,45;5517189,01;LOD_2;1918;;Original;31001_2000;commercial;15,1;none;0,0;RH;18,2;31,4;0,0;41,5;19,4;18,2;62,4;false;47,3;3,4;3,43;1;2,6;0;0;NO_ROOM;NOT_HEATED;0,8;1,249;15,1;1,33;73,0;1105,0;246,9;3735;4840;878;657;449;133;2;0;0;0;8;204;558;846
DEBY_LOD2_605663;;49,80332;9,94747;568178,23;5517193,67;LOD_2;1984;;Original;31001_2000;commercial;27,7;none;0,0;RH;34,6;40,9;0,0;56,5;24,8;34,6;119,4;false;86,5;3,5;3,45;1;2,5;0;0;NO_ROOM;NOT_HEATED;1,0;1,052;27,7;0,66;73,0;2021,0;134,0;3709;5730;859;631;420;126;12;0;0;0;25;226;571;838
DEBY_LOD2_605662;;49,80327;9,94744;568176,42;5517187,76;LOD_2;2002;;Original;31001_2000;commercial;31,1;none;0,0;EFH;38,9;53,7;0,0;54,0;8,8;38,9;97,8;false;97,3;2,5;2,51;1;2,5;0;0;NO_ROOM;NOT_HEATED;0,0;1,347;31,1;0,39;73,0;2273,0;94,2;2934;5207;672;497;335;105;12;0;0;0;23;181;451;658
DEBY_LOD2_605668;;49,80326;9,94815;568227,84;5517187,71;LOD_2;2007;;Original;31001_2000;commercial;14,2;none;0,0;RH;17,8;24,0;0,0;32,1;26,4;17,8;59,6;false;44,5;3,4;3,35;1;2,5;0;0;NO_ROOM;NOT_HEATED;0,9;1,135;14,2;0,41;73,0;1040,0;87,9;1251;2291;297;212;132;38;5;0;0;0;7;67;198;296
DEBY_LOD2_605669;;49,80327;9,94810;568223,57;5517188,98;LOD_2;1935;;Original;31001_2000;commercial;14,9;none;0,0;RH;16,9;18,1;0,0;22,9;37,2;16,9;58,9;false;46,5;3,5;3,49;1;2,8;0;0;NO_ROOM;NOT_HEATED;0,7;0,962;14,9;1,26;73,0;1086,0;203,1;3022;4108;684;520;372;131;7;0;0;0;15;183;449;662
DEBY_LOD2_605670;;49,80329;9,94816;568227,85;5517190,95;LOD_2;1965;;Original;31001_2000;commercial;14,4;none;0,0;RH;18,0;24,1;0,0;28,4;22,6;18,0;52,9;false;44,9;2,9;2,94;1;2,5;0;0;NO_ROOM;NOT_HEATED;0,4;1,216;14,4;1,29;73,0;1049,0;244,5;3514;4563;808;609;430;134;5;0;0;0;15;216;523;774
======================== Summary ========================
================ Excluded buildings lists ===============
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_422" class="java.beans.XMLDecoder">
<object class="eu.simstadt.workflowsteps.MonthlyEnergyBalanceStep">
<void property="name">
<string>Base</string>
</void>
</object>
</java>
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment