forked from s_ranjbar/city_retrofit
Found a bug in comnet factory and modified type of data from temperature to any number
This commit is contained in:
parent
a6e239bb45
commit
6c8b8ec35b
|
@ -160,14 +160,19 @@ class Idf:
|
||||||
_kwargs = {'Name': f'{schedule_type} schedules {usage}',
|
_kwargs = {'Name': f'{schedule_type} schedules {usage}',
|
||||||
'Schedule_Type_Limits_Name': self.idf_type_limits[schedules[0].data_type],
|
'Schedule_Type_Limits_Name': self.idf_type_limits[schedules[0].data_type],
|
||||||
'Field_1': 'Through: 12/31'}
|
'Field_1': 'Through: 12/31'}
|
||||||
|
counter = 1
|
||||||
for j, schedule in enumerate(schedules):
|
for j, schedule in enumerate(schedules):
|
||||||
_val = schedule.values
|
_val = schedule.values
|
||||||
_new_field = ''
|
_new_field = ''
|
||||||
for day_type in schedule.day_types:
|
for day_type in schedule.day_types:
|
||||||
_new_field += f' {self.idf_day_types[day_type]}'
|
_new_field += f' {self.idf_day_types[day_type]}'
|
||||||
_kwargs[f'Field_{j * 25 + 2}'] = f'For:{_new_field}'
|
_kwargs[f'Field_{j * 25 + 2}'] = f'For:{_new_field}'
|
||||||
|
counter += 1
|
||||||
for i in range(0, len(_val)):
|
for i in range(0, len(_val)):
|
||||||
_kwargs[f'Field_{j * 25 + 3 + i}'] = f'Until: {i + 1:02d}:00,{_val[i]}'
|
_kwargs[f'Field_{j * 25 + 3 + i}'] = f'Until: {i + 1:02d}:00,{_val[i]}'
|
||||||
|
counter += 1
|
||||||
|
_kwargs[f'Field_{counter + 1}'] = f'For AllOtherDays'
|
||||||
|
_kwargs[f'Field_{counter + 2}'] = f'Until: 24:00,0.0'
|
||||||
self._idf.newidfobject(self._COMPACT_SCHEDULE, **_kwargs)
|
self._idf.newidfobject(self._COMPACT_SCHEDULE, **_kwargs)
|
||||||
|
|
||||||
def _write_schedules_file(self, usage, schedule):
|
def _write_schedules_file(self, usage, schedule):
|
||||||
|
@ -210,6 +215,24 @@ class Idf:
|
||||||
return
|
return
|
||||||
return self._add_standard_compact_hourly_schedule(thermal_zone.usage, 'Infiltration', _infiltration_schedules)
|
return self._add_standard_compact_hourly_schedule(thermal_zone.usage, 'Infiltration', _infiltration_schedules)
|
||||||
|
|
||||||
|
def _add_people_activity_level_schedules(self, thermal_zone):
|
||||||
|
_occ = thermal_zone.occupancy
|
||||||
|
if _occ.occupancy_density == 0:
|
||||||
|
_total_heat = 0
|
||||||
|
else:
|
||||||
|
_total_heat = (_occ.sensible_convective_internal_gain + _occ.sensible_radiative_internal_gain
|
||||||
|
+ _occ.latent_internal_gain) / _occ.occupancy_density
|
||||||
|
for schedule in self._idf.idfobjects[self._HOURLY_SCHEDULE]:
|
||||||
|
if schedule.Name == f'Activity Level schedules {thermal_zone.usage}':
|
||||||
|
return
|
||||||
|
_kwargs = {'Name': f'Activity Level schedules {thermal_zone.usage}',
|
||||||
|
'Schedule_Type_Limits_Name': self.idf_type_limits[cte.ANY_NUMBER],
|
||||||
|
'Field_1': 'Through: 12/31',
|
||||||
|
'Field_2': 'For AllDays',
|
||||||
|
'Field_3': f'Until: 24:00,{_total_heat}'}
|
||||||
|
self._idf.newidfobject(self._COMPACT_SCHEDULE, **_kwargs)
|
||||||
|
return
|
||||||
|
|
||||||
def _add_schedules(self, usage, schedule_type, new_schedules, schedule_from_file=False):
|
def _add_schedules(self, usage, schedule_type, new_schedules, schedule_from_file=False):
|
||||||
if schedule_from_file:
|
if schedule_from_file:
|
||||||
new_schedule = new_schedules[0]
|
new_schedule = new_schedules[0]
|
||||||
|
@ -302,13 +325,9 @@ class Idf:
|
||||||
|
|
||||||
def _add_occupancy(self, thermal_zone):
|
def _add_occupancy(self, thermal_zone):
|
||||||
number_of_people = thermal_zone.occupancy.occupancy_density * thermal_zone.total_floor_area
|
number_of_people = thermal_zone.occupancy.occupancy_density * thermal_zone.total_floor_area
|
||||||
print('aaaaaaaa', thermal_zone.occupancy.sensible_radiative_internal_gain)
|
|
||||||
print(thermal_zone.occupancy.sensible_convective_internal_gain)
|
|
||||||
print(thermal_zone.occupancy.latent_internal_gain)
|
|
||||||
fraction_radiant = thermal_zone.occupancy.sensible_radiative_internal_gain / \
|
fraction_radiant = thermal_zone.occupancy.sensible_radiative_internal_gain / \
|
||||||
(thermal_zone.occupancy.sensible_radiative_internal_gain +
|
(thermal_zone.occupancy.sensible_radiative_internal_gain +
|
||||||
thermal_zone.occupancy.sensible_convective_internal_gain +
|
thermal_zone.occupancy.sensible_convective_internal_gain)
|
||||||
thermal_zone.occupancy.latent_internal_gain)
|
|
||||||
self._idf.newidfobject(self._PEOPLE,
|
self._idf.newidfobject(self._PEOPLE,
|
||||||
Name=f'{thermal_zone.id}_occupancy',
|
Name=f'{thermal_zone.id}_occupancy',
|
||||||
Zone_or_ZoneList_Name=thermal_zone.id,
|
Zone_or_ZoneList_Name=thermal_zone.id,
|
||||||
|
@ -316,7 +335,7 @@ class Idf:
|
||||||
Number_of_People_Calculation_Method="People",
|
Number_of_People_Calculation_Method="People",
|
||||||
Number_of_People=number_of_people,
|
Number_of_People=number_of_people,
|
||||||
Fraction_Radiant=fraction_radiant,
|
Fraction_Radiant=fraction_radiant,
|
||||||
Activity_Level_Schedule_Name=f'Occupancy schedules {thermal_zone.usage}'
|
Activity_Level_Schedule_Name=f'Activity Level schedules {thermal_zone.usage}'
|
||||||
)
|
)
|
||||||
|
|
||||||
def _add_infiltration(self, thermal_zone):
|
def _add_infiltration(self, thermal_zone):
|
||||||
|
@ -363,12 +382,11 @@ class Idf:
|
||||||
self._add_window_construction_and_material(thermal_opening)
|
self._add_window_construction_and_material(thermal_opening)
|
||||||
usage = thermal_zone.usage
|
usage = thermal_zone.usage
|
||||||
self._add_infiltration_schedules(thermal_zone)
|
self._add_infiltration_schedules(thermal_zone)
|
||||||
# todo: why are there schedules unused?
|
self._add_schedules(usage, 'Occupancy', thermal_zone.occupancy.occupancy_schedules, schedule_from_file=True)
|
||||||
self._add_schedules(usage, 'Lighting', thermal_zone.lighting.schedules)
|
|
||||||
self._add_schedules(usage, 'Occupancy', thermal_zone.occupancy.occupancy_schedules, schedule_from_file=False)
|
|
||||||
self._add_schedules(usage, 'HVAC AVAIL', thermal_zone.thermal_control.hvac_availability_schedules)
|
self._add_schedules(usage, 'HVAC AVAIL', thermal_zone.thermal_control.hvac_availability_schedules)
|
||||||
self._add_schedules(usage, 'Heating thermostat', thermal_zone.thermal_control.heating_set_point_schedules)
|
self._add_schedules(usage, 'Heating thermostat', thermal_zone.thermal_control.heating_set_point_schedules)
|
||||||
self._add_schedules(usage, 'Cooling thermostat', thermal_zone.thermal_control.cooling_set_point_schedules)
|
self._add_schedules(usage, 'Cooling thermostat', thermal_zone.thermal_control.cooling_set_point_schedules)
|
||||||
|
self._add_people_activity_level_schedules(thermal_zone)
|
||||||
|
|
||||||
self._add_zone(thermal_zone)
|
self._add_zone(thermal_zone)
|
||||||
self._add_heating_system(thermal_zone)
|
self._add_heating_system(thermal_zone)
|
||||||
|
@ -397,7 +415,7 @@ class Idf:
|
||||||
"""
|
"""
|
||||||
Start the energy plus simulation
|
Start the energy plus simulation
|
||||||
"""
|
"""
|
||||||
self._idf.run(expandobjects=True, readvars=True, output_directory=self._output_path,
|
self._idf.run(expandobjects=False, readvars=True, output_directory=self._output_path,
|
||||||
output_prefix=f'{self._city.name}_')
|
output_prefix=f'{self._city.name}_')
|
||||||
|
|
||||||
def _add_block(self, building):
|
def _add_block(self, building):
|
||||||
|
@ -422,15 +440,28 @@ class Idf:
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones:
|
||||||
for boundary in thermal_zone.thermal_boundaries:
|
for boundary in thermal_zone.thermal_boundaries:
|
||||||
idf_surface_type = self.idf_surfaces[boundary.parent_surface.type]
|
idf_surface_type = self.idf_surfaces[boundary.parent_surface.type]
|
||||||
|
outside_boundary_condition = 'Outdoors'
|
||||||
|
sun_exposure = 'SunExposed'
|
||||||
|
wind_exposure = 'WindExposed'
|
||||||
|
if boundary.parent_surface.type == cte.GROUND:
|
||||||
|
outside_boundary_condition = 'Ground'
|
||||||
|
sun_exposure = 'NoSun'
|
||||||
|
wind_exposure = 'NoWind'
|
||||||
if boundary.vegetation is not None:
|
if boundary.vegetation is not None:
|
||||||
construction_name = f'{boundary.construction_name}_{boundary.vegetation.name}'
|
construction_name = f'{boundary.construction_name}_{boundary.vegetation.name}'
|
||||||
else:
|
else:
|
||||||
construction_name = boundary.construction_name
|
construction_name = boundary.construction_name
|
||||||
|
print(outside_boundary_condition, sun_exposure, wind_exposure)
|
||||||
surface = self._idf.newidfobject(self._SURFACE, Name=f'{boundary.parent_surface.name}',
|
surface = self._idf.newidfobject(self._SURFACE, Name=f'{boundary.parent_surface.name}',
|
||||||
Surface_Type=idf_surface_type, Zone_Name=thermal_zone.id,
|
Surface_Type=idf_surface_type,
|
||||||
Construction_Name=construction_name)
|
Zone_Name=thermal_zone.id,
|
||||||
|
Construction_Name=construction_name,
|
||||||
|
Outside_Boundary_Condition=outside_boundary_condition,
|
||||||
|
Sun_Exposure=sun_exposure,
|
||||||
|
Wind_Exposure=wind_exposure)
|
||||||
coordinates = self._matrix_to_list(boundary.parent_surface.solid_polygon.coordinates,
|
coordinates = self._matrix_to_list(boundary.parent_surface.solid_polygon.coordinates,
|
||||||
self._city.lower_corner)
|
self._city.lower_corner)
|
||||||
|
|
||||||
surface.setcoords(coordinates)
|
surface.setcoords(coordinates)
|
||||||
self._add_windows(boundary)
|
self._add_windows(boundary)
|
||||||
|
|
||||||
|
|
|
@ -117,6 +117,7 @@ COOLING_SET_POINT = 'ClgSetPt'
|
||||||
HEATING_SET_POINT = 'HtgSetPt'
|
HEATING_SET_POINT = 'HtgSetPt'
|
||||||
EQUIPMENT = 'Equipment'
|
EQUIPMENT = 'Equipment'
|
||||||
ACTIVITY = 'Activity'
|
ACTIVITY = 'Activity'
|
||||||
|
PEOPLE_ACTIVITY_LEVEL = 'People Activity Level'
|
||||||
|
|
||||||
# Geometry
|
# Geometry
|
||||||
EPSILON = 0.0000001
|
EPSILON = 0.0000001
|
||||||
|
|
|
@ -232,13 +232,13 @@ class ComnetUsageParameters:
|
||||||
_occupancy.occupancy_density = archetype.occupancy.occupancy_density * cte.METERS_TO_FEET**2
|
_occupancy.occupancy_density = archetype.occupancy.occupancy_density * cte.METERS_TO_FEET**2
|
||||||
_occupancy.sensible_radiative_internal_gain = archetype.occupancy.sensible_radiative_internal_gain \
|
_occupancy.sensible_radiative_internal_gain = archetype.occupancy.sensible_radiative_internal_gain \
|
||||||
* archetype.occupancy.occupancy_density \
|
* archetype.occupancy.occupancy_density \
|
||||||
* cte.BTU_H_TO_WATTS
|
* cte.METERS_TO_FEET**2 * cte.BTU_H_TO_WATTS
|
||||||
_occupancy.latent_internal_gain = archetype.occupancy.latent_internal_gain \
|
_occupancy.latent_internal_gain = archetype.occupancy.latent_internal_gain \
|
||||||
* archetype.occupancy.occupancy_density \
|
* archetype.occupancy.occupancy_density \
|
||||||
* cte.BTU_H_TO_WATTS
|
* cte.METERS_TO_FEET**2 * cte.BTU_H_TO_WATTS
|
||||||
_occupancy.sensible_convective_internal_gain = archetype.occupancy.sensible_convective_internal_gain \
|
_occupancy.sensible_convective_internal_gain = archetype.occupancy.sensible_convective_internal_gain \
|
||||||
* archetype.occupancy.occupancy_density \
|
* archetype.occupancy.occupancy_density \
|
||||||
* cte.BTU_H_TO_WATTS
|
* cte.METERS_TO_FEET**2 * cte.BTU_H_TO_WATTS
|
||||||
_occupancy.occupancy_schedules = archetype.occupancy.occupancy_schedules
|
_occupancy.occupancy_schedules = archetype.occupancy.occupancy_schedules
|
||||||
usage_zone.occupancy = _occupancy
|
usage_zone.occupancy = _occupancy
|
||||||
_lighting = Lighting()
|
_lighting = Lighting()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user