diff --git a/python_scripts/run_simstadt_from_python/Template/99_HeatDemand.flow/04_MonthlyEnergyBalance.step/params.xml b/python_scripts/run_simstadt_from_python/Template/99_HeatDemand.flow/04_MonthlyEnergyBalance.step/params.xml index 9c25cedad5d9acc73d59f45fe57a70984815f139..602ce19572122da1083c5e50111cf99887f59d88 100644 --- a/python_scripts/run_simstadt_from_python/Template/99_HeatDemand.flow/04_MonthlyEnergyBalance.step/params.xml +++ b/python_scripts/run_simstadt_from_python/Template/99_HeatDemand.flow/04_MonthlyEnergyBalance.step/params.xml @@ -1,6 +1,12 @@ <?xml version="1.0" encoding="UTF-8"?> <java version="1.8.0_345" class="java.beans.XMLDecoder"> <object class="eu.simstadt.workflowsteps.MonthlyEnergyBalanceStep"> + <void property="calculationMode"> + <object class="java.lang.Enum" method="valueOf"> + <class>de.hft.stuttgart.simstadt2.buildingenergymodels.MonthlyBalanceDIN18599$CalculationMode</class> + <string>HEATING_AND_COOLING</string> + </object> + </void> <void property="name"> <string>Base</string> </void> diff --git a/python_scripts/run_simstadt_from_python/variable_window_ratio.py b/python_scripts/run_simstadt_from_python/variable_window_ratio.py index 48748ba81fa7eee9ba62deff6b57cbf90633db76..718b47a2d9b469ca6d14e564cf0a5b9d46f02a8e 100644 --- a/python_scripts/run_simstadt_from_python/variable_window_ratio.py +++ b/python_scripts/run_simstadt_from_python/variable_window_ratio.py @@ -1,59 +1,65 @@ from pathlib import Path import shutil from xml.etree import ElementTree as et -import logging import pandas as pd -import re from run_simstadt_workflow import find_simstadt, SCRIPT_DIR, run_workflow -# logging.getLogger().setLevel(logging.WARN) +import logging +logging.getLogger().setLevel(logging.WARN) +####################################################################### +# User params SIMSTADT2_GLOB = 'Desktop/SimStadt2_0.*/' REPO_PATH = Path.home() / 'git' / 'simstadt2' / 'TestRepository' PROJECT_NAME = 'Gruenbuehl' CITYGMLS = ['Gruenbuehl_LOD2_ALKIS_1010.gml'] SURFACES = ['outWalls', 'pitchedRoof'] +WINDOW_RATIOS = [0, 0.5, 1] +# Heat demand, with custom BuildingPhysics +TEMPLATE_NAME = '99_HeatDemand' +####################################################################### + +####################################################################### XML_LIB_URL = 'http://www.simstadt.eu/BuildingPhysicsLibraries' NAMESPACE = {'': XML_LIB_URL} - PROJECT_PATH = REPO_PATH / f'{PROJECT_NAME}.proj' PARAMS = 'params.xml' - BUILDING_PHYSICS_LIBRARY = 'GermanBuildingTypologyLibrary_IWU.xml' +####################################################################### -WINDOW_RATIOS = [0, 0.5, 1] - -TEMPLATE_NAME = '99_HeatDemand' -template = SCRIPT_DIR / 'Template' / f'{TEMPLATE_NAME}.flow' # Heat demand, with custom BuildingPhysics +def copy_workflow_from_template(template_name, project_path): + template = SCRIPT_DIR / 'Template' / f'{template_name}.flow' + workflow_path = project_path / f'{template_name}.flow' -workflow_path = PROJECT_PATH / f'{TEMPLATE_NAME}.flow' + shutil.copytree(template, workflow_path, dirs_exist_ok=True) -shutil.copytree(template, workflow_path, dirs_exist_ok=True) -print(workflow_path) + physics_processor_step = workflow_path / '01_Preprocessing.step/02_PhysicsPreprocessor.step' + return workflow_path, physics_processor_step -physics_processor_step = workflow_path / '01_Preprocessing.step/02_PhysicsPreprocessor.step' +def set_custom_library(physics_processor_step): + custom_library_path = physics_processor_step / BUILDING_PHYSICS_LIBRARY -############# Specify custom lib ######################### -custom_library_path = physics_processor_step / BUILDING_PHYSICS_LIBRARY + physics_processor_params = physics_processor_step / PARAMS -physics_processor_params = physics_processor_step / PARAMS + param_tree = et.parse(physics_processor_params) + root = param_tree.getroot() -param_tree = et.parse(physics_processor_params) -root = param_tree.getroot() + lib_node = root.find( + ".//object[@class='de.hft.stuttgart.simstadt2.assessment.PhysicsXmlLib']/void[@property='path']/string") + lib_node.text = str(custom_library_path) + param_tree.write(physics_processor_params) + return custom_library_path -lib_node = root.find(".//object[@class='de.hft.stuttgart.simstadt2.assessment.PhysicsXmlLib']/void[@property='path']/string") -lib_node.text = str(custom_library_path) -param_tree.write(physics_processor_params) ########################################################## + def parse_library(library_path: Path) -> et.ElementTree: et.register_namespace('', XML_LIB_URL) return et.parse(library_path) -lib_tree = parse_library(custom_library_path) def set_custom_window_ratio(tree: et.ElementTree, window_ratio_node: float, export_path: Path): root = tree.getroot() @@ -65,36 +71,33 @@ def set_custom_window_ratio(tree: et.ElementTree, window_ratio_node: float, expo window_ratio_node.text = str(window_ratio) tree.write(export_path) -for window_ratio in WINDOW_RATIOS: - #################### Update lib with custom values ############################ +def parse_results(window_ratio, heat_demand_csv): + df = pd.read_csv(heat_demand_csv, + skiprows=list(range(19)) + [20], + sep=';', + decimal=',' + ) + + heat_demand_MWh = df['Yearly Heating demand'].sum() / 1000 + cool_demand_MWh = df['Yearly Cooling demand'].sum() / 1000 + print(f"Window Ratio : {window_ratio * 100} %") + print(f"Total heating demand : {heat_demand_MWh:.0f} MWh / a") + print(f"Total cooling demand : {cool_demand_MWh:.0f} MWh / a") - set_custom_window_ratio(lib_tree, window_ratio, custom_library_path) - # new_content = re.sub(r"<name>[\w ]+</name>", - # f"<name>Custom Physics Library with Window Ratio : {window_ratio}</name>", - # content, 1) - # # FIXME: Use et.parse instead. Because groundSurfaces shouldn't have any WindowRatio - # new_content = re.sub(r"<windowRatio>[\d\.]+</windowRatio>", - # f"<windowRatio>{window_ratio}</windowRatio>", - # new_content) +workflow_path, physics_processor_step = copy_workflow_from_template(TEMPLATE_NAME, PROJECT_PATH) +custom_library_path = set_custom_library(physics_processor_step) +lib_tree = parse_library(custom_library_path) - # with open(custom_library_path, 'w') as library_file: - # library_file.write(new_content) - ################################################################################# +for window_ratio in WINDOW_RATIOS: + # TODO: Status quo too + set_custom_window_ratio(lib_tree, window_ratio, custom_library_path) output_files = run_workflow(find_simstadt(SIMSTADT2_GLOB), workflow_path, CITYGMLS) - heat_demand_csv = next(file for file in output_files if 'HEATING.csv' in file.name) + heat_demand_csv = next(file for file in output_files if 'HEATING_AND_COOLING.csv' in file.name) ################### Parse heat demand ######################## - df = pd.read_csv(heat_demand_csv, - skiprows=list(range(19)) + [20], - sep=';', - decimal=',' - ) - - heat_demand_MWh = df['Yearly Heating demand'].sum() / 1000 - print(f"Window Ratio : {window_ratio * 100} %") - print(f"Total heat demand : {heat_demand_MWh:.0f} MWh / a") + parse_results(window_ratio, heat_demand_csv)