Commit de5522f1 authored by Eric Duminil's avatar Eric Duminil
Browse files

Testing high level workflows

parent 14952505
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
"""Live integration tests for high-level workflow simulations."""
from pathlib import Path
import pytest
from simstadt import greenwater_simulation, heatdemand_simulation, photovoltaic_simulation
from simstadt.results import KPI
TEST_REPOSITORY = Path(__file__).parent / "data" / "TestRepo"
PROJECT_PATH = TEST_REPOSITORY / "Grombühl.proj"
MINI = TEST_REPOSITORY / "Grombühl_mini.gml"
MINI_TREES = TEST_REPOSITORY / "Grombühl_mini_with_trees.gml"
METEONORM = "Wuerzburg-hour.csv"
def to_dict(values: list[KPI]) -> dict[str, KPI]:
return {kpi.name: kpi for kpi in values}
@pytest.mark.live
def test_pv_no_shadow(simstadt_folder):
results = photovoltaic_simulation(MINI, METEONORM, with_shadows=False, min_roof_insolation=800,
project_path=PROJECT_PATH)
kpis = to_dict(results.kpis)
assert "PV potential yield" in kpis
assert "Roof area for PV" in kpis
assert abs(kpis["PV specific yield"].value - 1_100) < 200
@pytest.mark.live
def test_pv_more_modules(simstadt_folder):
base_kpis = to_dict(photovoltaic_simulation(MINI, METEONORM, with_shadows=False, min_roof_insolation=800,
project_path=PROJECT_PATH).kpis)
more_kpis = to_dict(photovoltaic_simulation(MINI, METEONORM, with_shadows=False, min_roof_insolation=800,
pv_share_flat=80, pv_share_tilted=80,
project_path=PROJECT_PATH).kpis)
assert more_kpis["PV potential nominal power"].value > base_kpis["PV potential nominal power"].value * 1.5
assert more_kpis["PV potential yield"].value > base_kpis["PV potential yield"].value * 1.5
assert abs(more_kpis["Irradiance in module plane"].value - base_kpis["Irradiance in module plane"].value) < 1
assert abs(more_kpis["Roof area for PV"].value - base_kpis["Roof area for PV"].value) < 100
@pytest.mark.live
def test_pv_shadow_reduces_yield(simstadt_folder):
kpis = to_dict(photovoltaic_simulation(MINI, METEONORM, with_shadows=False, min_roof_insolation=800,
project_path=PROJECT_PATH).kpis)
shadow_kpis = to_dict(photovoltaic_simulation(MINI, METEONORM, with_shadows=True, min_roof_insolation=800,
project_path=PROJECT_PATH).kpis)
assert shadow_kpis["PV potential yield"].value < kpis["PV potential yield"].value
assert shadow_kpis["Irradiance in module plane"].value < kpis["Irradiance in module plane"].value
@pytest.mark.live
def test_pv_trees_reduce_yield(simstadt_folder):
shadow_kpis = to_dict(photovoltaic_simulation(MINI, METEONORM, with_shadows=True, min_roof_insolation=800,
project_path=PROJECT_PATH).kpis)
tree_kpis = to_dict(photovoltaic_simulation(
TEST_REPOSITORY / "Grombühl_mini_with_comically_large_trees.gml",
METEONORM, with_shadows=True, min_roof_insolation=800, project_path=PROJECT_PATH,
).kpis)
assert tree_kpis["PV potential nominal power"].value < shadow_kpis["PV potential nominal power"].value * 0.8
assert tree_kpis["PV potential yield"].value < shadow_kpis["PV potential yield"].value * 0.8
@pytest.mark.live
def test_heatdemand_heating_and_cooling(simstadt_folder):
kpis = to_dict(heatdemand_simulation(MINI, METEONORM, with_shadows=False,
calculation_mode="HEATING_AND_COOLING",
project_path=PROJECT_PATH).kpis)
assert "Heated area" in kpis
assert "Yearly Heating demand" in kpis
assert "Yearly Cooling demand" in kpis
assert kpis["Year of construction"].value > 1900
@pytest.mark.live
def test_heatdemand_shadow_increases_heating(simstadt_folder):
kpis = to_dict(heatdemand_simulation(MINI, METEONORM, with_shadows=False,
calculation_mode="HEATING_AND_COOLING",
project_path=PROJECT_PATH).kpis)
shadow_kpis = to_dict(heatdemand_simulation(MINI, METEONORM, with_shadows=True,
calculation_mode="HEATING_AND_COOLING",
project_path=PROJECT_PATH).kpis)
assert shadow_kpis["Yearly Heating demand"].value > kpis["Yearly Heating demand"].value * 1.02
assert shadow_kpis["Yearly Cooling demand"].value < kpis["Yearly Cooling demand"].value * 0.95
@pytest.mark.live
def test_heatdemand_trees_increase_heating(simstadt_folder):
shadow_kpis = to_dict(heatdemand_simulation(MINI, METEONORM, with_shadows=True,
calculation_mode="HEATING_AND_COOLING",
project_path=PROJECT_PATH).kpis)
tree_kpis = to_dict(heatdemand_simulation(MINI_TREES, METEONORM, with_shadows=True,
calculation_mode="HEATING_AND_COOLING",
project_path=PROJECT_PATH).kpis)
assert tree_kpis["Yearly Heating demand"].value > shadow_kpis["Yearly Heating demand"].value * 1.01
assert tree_kpis["Yearly Cooling demand"].value < shadow_kpis["Yearly Cooling demand"].value * 0.95
@pytest.mark.live
def test_heatdemand_refurbishment_reduces_demand(simstadt_folder):
tree_kpis = to_dict(heatdemand_simulation(MINI_TREES, METEONORM, with_shadows=True,
calculation_mode="HEATING_AND_COOLING",
project_path=PROJECT_PATH).kpis)
refurb_kpis = to_dict(heatdemand_simulation(MINI_TREES, METEONORM, with_shadows=True,
calculation_mode="HEATING_AND_COOLING",
refurbishment_ratio=1.0,
project_path=PROJECT_PATH).kpis)
assert refurb_kpis["Yearly Heating demand"].value < tree_kpis["Yearly Heating demand"].value * 0.50
assert refurb_kpis["Mean Uvalue"].value < tree_kpis["Mean Uvalue"].value * 0.50
@pytest.mark.live
def test_greenwater(simstadt_folder):
kpis = to_dict(greenwater_simulation(MINI_TREES, METEONORM, irrigation_ratio=1.0,
project_path=PROJECT_PATH).kpis)
assert "Rain" in kpis
assert "Evaporative cooling" in kpis
assert "Irrigation" in kpis
assert abs(kpis["Rain"].rounded_value - 458) < 1
@pytest.mark.live
def test_greenwater_no_irrigation(simstadt_folder):
kpis = to_dict(greenwater_simulation(MINI_TREES, METEONORM, irrigation_ratio=1.0,
project_path=PROJECT_PATH).kpis)
no_irr_kpis = to_dict(greenwater_simulation(MINI_TREES, METEONORM, irrigation_ratio=0.0,
project_path=PROJECT_PATH).kpis)
assert kpis["Irrigation"].value > 500
assert no_irr_kpis["Irrigation"].rounded_value == 0
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