basic and advanced retrofit
This commit is contained in:
parent
20b6167245
commit
9de0f48d9d
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -13,3 +13,5 @@ cerc_hub.egg-info
|
||||||
/out_files
|
/out_files
|
||||||
/input_files
|
/input_files
|
||||||
/CitRetrofitEnv
|
/CitRetrofitEnv
|
||||||
|
/cityretrofit_env
|
||||||
|
/.eggs
|
|
@ -9,27 +9,40 @@ class RetrofitFactory:
|
||||||
|
|
||||||
def apply_retrofit(self, wall_u_value=None, roof_u_value=None, ground_u_value=None):
|
def apply_retrofit(self, wall_u_value=None, roof_u_value=None, ground_u_value=None):
|
||||||
for building in self._city.buildings:
|
for building in self._city.buildings:
|
||||||
|
print("building", building.name)
|
||||||
self._apply_retrofit_to_building(building, wall_u_value, roof_u_value, ground_u_value)
|
self._apply_retrofit_to_building(building, wall_u_value, roof_u_value, ground_u_value)
|
||||||
|
|
||||||
def _apply_retrofit_to_building(self, building: Building, wall_u_value, roof_u_value, ground_u_value):
|
def _apply_retrofit_to_building(self, building: Building, wall_u_value, roof_u_value, ground_u_value):
|
||||||
# for internal_zone in building.internal_zones:
|
|
||||||
# print(internal_zone.id)
|
|
||||||
|
|
||||||
for thermal_zone in building.thermal_zones_from_internal_zones:
|
for thermal_zone in building.thermal_zones_from_internal_zones:
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
for thermal_boundary in thermal_zone.thermal_boundaries:
|
||||||
if wall_u_value and thermal_boundary.type == cte.WALL:
|
if wall_u_value and thermal_boundary.type == cte.WALL:
|
||||||
print(thermal_boundary.u_value)
|
print("old_u_value", thermal_boundary.u_value)
|
||||||
|
self._change_thermal_resistance(thermal_boundary, wall_u_value)
|
||||||
thermal_boundary.u_value = wall_u_value
|
thermal_boundary.u_value = wall_u_value
|
||||||
print(thermal_boundary.u_value)
|
|
||||||
elif roof_u_value and thermal_boundary.type == cte.ROOF:
|
elif roof_u_value and thermal_boundary.type == cte.ROOF:
|
||||||
print("roof", thermal_boundary.u_value)
|
self._change_thermal_resistance(thermal_boundary, roof_u_value)
|
||||||
thermal_boundary.u_value = roof_u_value
|
thermal_boundary.u_value = roof_u_value
|
||||||
print("roof", thermal_boundary.u_value)
|
|
||||||
elif ground_u_value and thermal_boundary.type == cte.GROUND:
|
elif ground_u_value and thermal_boundary.type == cte.GROUND:
|
||||||
|
self._change_thermal_resistance(thermal_boundary, ground_u_value)
|
||||||
thermal_boundary.u_value = ground_u_value
|
thermal_boundary.u_value = ground_u_value
|
||||||
print("ground", thermal_boundary.u_value)
|
|
||||||
|
|
||||||
|
def _change_thermal_resistance(self, thermal_boundary, u_value):
|
||||||
|
old_u_value =thermal_boundary.u_value
|
||||||
|
new_u_value = u_value
|
||||||
|
if new_u_value < old_u_value:
|
||||||
|
delta_r = 1/(old_u_value - new_u_value)
|
||||||
|
for layer in thermal_boundary.layers:
|
||||||
|
if "virtual_no_mass" in layer.material_name.lower():
|
||||||
|
new_thermal_resistance = layer.thermal_resistance + delta_r
|
||||||
|
layer.thermal_resistance = new_thermal_resistance
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def enrich(self):
|
def enrich(self):
|
||||||
# This method can be expanded to include different retrofit strategies
|
# This method can be expanded to include different retrofit strategies
|
||||||
if self._retrofit_type == 'basic':
|
if self._retrofit_type == 'basic':
|
||||||
self.apply_retrofit(wall_u_value=0.85, roof_u_value=0.95, ground_u_value=0.95)
|
self.apply_retrofit(wall_u_value=0.247, roof_u_value=0.138, ground_u_value=0.156)
|
||||||
|
elif self._retrofit_type == 'advanced':
|
||||||
|
self.apply_retrofit(wall_u_value=0.15, roof_u_value=0.08, ground_u_value=0.1)
|
||||||
|
|
63
hub/imports/retrofit_factory_virtual.py
Normal file
63
hub/imports/retrofit_factory_virtual.py
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
from hub.city_model_structure.city import City
|
||||||
|
from hub.city_model_structure.building_demand.thermal_archetype import ThermalArchetype
|
||||||
|
from hub.city_model_structure.building_demand.construction import Construction
|
||||||
|
from hub.catalog_factories.construction_catalog_factory import ConstructionCatalogFactory
|
||||||
|
|
||||||
|
class RetrofitFactoryVirtual:
|
||||||
|
def __init__(self, retrofit_type, city):
|
||||||
|
self._retrofit_type = retrofit_type
|
||||||
|
self._city = city
|
||||||
|
self._cerc_catalog = ConstructionCatalogFactory('cerc').catalog
|
||||||
|
|
||||||
|
def apply_retrofit(self, **u_values):
|
||||||
|
for building in self._city.buildings:
|
||||||
|
for internal_zone in building.internal_zones:
|
||||||
|
self._apply_retrofit_to_thermal_archetype(internal_zone.thermal_archetype, u_values)
|
||||||
|
|
||||||
|
def _apply_retrofit_to_thermal_archetype(self, thermal_archetype: ThermalArchetype, u_values):
|
||||||
|
for construction in thermal_archetype.constructions:
|
||||||
|
if construction.type in u_values and any(surface in construction.type.lower() for surface in ['wall', 'roof', 'ground']):
|
||||||
|
self._update_construction_u_value(construction, u_values[construction.type])
|
||||||
|
|
||||||
|
def _update_construction_u_value(self, construction: Construction, new_u_value):
|
||||||
|
virtual_no_mass_layer = next((layer for layer in construction.layers if "virtual_no_mass" in layer.material_name.lower()), None)
|
||||||
|
|
||||||
|
if virtual_no_mass_layer:
|
||||||
|
old_r_value = 1 / construction.u_value
|
||||||
|
new_r_value = 1 / new_u_value
|
||||||
|
delta_r = new_r_value - old_r_value
|
||||||
|
|
||||||
|
virtual_no_mass_layer.thermal_resistance += delta_r
|
||||||
|
print(f"Updated {construction.type} - New thermal resistance: {virtual_no_mass_layer.thermal_resistance}")
|
||||||
|
construction.u_value = new_u_value
|
||||||
|
|
||||||
|
def modify_thermal_resistance(self, new_thermal_resistance):
|
||||||
|
import sys
|
||||||
|
|
||||||
|
for building in self._city.buildings:
|
||||||
|
for zone in building.thermal_zones_from_internal_zones:
|
||||||
|
for boundary in zone.thermal_boundaries:
|
||||||
|
if any(surface in boundary.type.lower() for surface in ['wall', 'roof', 'ground']):
|
||||||
|
layers = getattr(boundary, 'get_layers', lambda: [])()
|
||||||
|
sys.stderr.write(f"Checking boundary type: {boundary.type}, found {len(layers)} layers\n")
|
||||||
|
for layer in layers:
|
||||||
|
if layer and hasattr(layer, 'material_name'):
|
||||||
|
sys.stderr.write(f"Checking layer: {layer.material_name}\n")
|
||||||
|
if "virtual_no_mass" in layer.material_name.lower():
|
||||||
|
layer.thermal_resistance = new_thermal_resistance
|
||||||
|
sys.stderr.write(f"Set thermal resistance to {new_thermal_resistance} for {layer.material_name} in {boundary.type}\n")
|
||||||
|
sys.stderr.flush()
|
||||||
|
|
||||||
|
def enrich(self):
|
||||||
|
if self._retrofit_type == 'basic':
|
||||||
|
self.apply_retrofit(
|
||||||
|
OutdoorsWall=0.85,
|
||||||
|
GroundWall=0.85,
|
||||||
|
OutdoorsRoofCeiling=0.95,
|
||||||
|
GroundRoofCeiling=0.95,
|
||||||
|
OutdoorsFloor=0.95,
|
||||||
|
GroundFloor=0.95
|
||||||
|
)
|
||||||
|
# After applying the retrofit, set a specific thermal resistance
|
||||||
|
self.modify_thermal_resistance(2.0)
|
||||||
|
# Add more retrofit types as needed
|
7
main.py
7
main.py
|
@ -7,6 +7,7 @@ from hub.imports.construction_factory import ConstructionFactory
|
||||||
from hub.imports.usage_factory import UsageFactory
|
from hub.imports.usage_factory import UsageFactory
|
||||||
from hub.imports.weather_factory import WeatherFactory
|
from hub.imports.weather_factory import WeatherFactory
|
||||||
from hub.imports.retrofit_factory import RetrofitFactory
|
from hub.imports.retrofit_factory import RetrofitFactory
|
||||||
|
|
||||||
# Specify the GeoJSON file path
|
# Specify the GeoJSON file path
|
||||||
input_files_path = (Path(__file__).parent / 'input_files')
|
input_files_path = (Path(__file__).parent / 'input_files')
|
||||||
input_files_path.mkdir(parents=True, exist_ok=True)
|
input_files_path.mkdir(parents=True, exist_ok=True)
|
||||||
|
@ -22,9 +23,9 @@ city = GeometryFactory('geojson',
|
||||||
function_field='function',
|
function_field='function',
|
||||||
function_to_hub=Dictionaries().montreal_function_to_hub_function).city
|
function_to_hub=Dictionaries().montreal_function_to_hub_function).city
|
||||||
# Enrich city data
|
# Enrich city data
|
||||||
ConstructionFactory('cerc', city).enrich()
|
ConstructionFactory('nrcan', city).enrich()
|
||||||
UsageFactory('cerc', city).enrich()
|
UsageFactory('nrcan', city).enrich()
|
||||||
RetrofitFactory('basic', city).enrich()
|
RetrofitFactory('advanced', city).enrich()
|
||||||
|
|
||||||
WeatherFactory('epw', city).enrich()
|
WeatherFactory('epw', city).enrich()
|
||||||
energy_plus_workflow(city)
|
energy_plus_workflow(city)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user