example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb in urbanopt-cli-0.9.3 vs example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb in urbanopt-cli-0.10.0
- old
+ new
@@ -1616,11 +1616,11 @@
# Create and assign construction to subsurfaces
constr.create_and_assign_constructions([subsurface], model)
end
def self.apply_window_skylight_shading(model, window_or_skylight, index, shading_vertices, parent_surface, sub_surface, shading_group,
- shading_schedules, shading_ems, name, cooling_season)
+ shading_schedules, shading_ems, name, hpxml)
sf_summer = window_or_skylight.interior_shading_factor_summer * window_or_skylight.exterior_shading_factor_summer
sf_winter = window_or_skylight.interior_shading_factor_winter * window_or_skylight.exterior_shading_factor_winter
if (sf_summer < 1.0) || (sf_winter < 1.0)
# Apply shading
# We use a ShadingSurface instead of a Shade so that we perfectly get the result we want.
@@ -1631,19 +1631,49 @@
shading_surface = OpenStudio::Model::ShadingSurface.new(shading_vertices, model)
shading_surface.setName("#{window_or_skylight.id} shading surface")
shading_surface.additionalProperties.setFeature('Azimuth', window_or_skylight.azimuth)
shading_surface.additionalProperties.setFeature('ParentSurface', parent_surface.name.to_s)
- # Create transmittance schedule for heating/cooling seasons
- trans_values = cooling_season.map { |c| c == 1 ? sf_summer : sf_winter }
+ # Determine transmittance values throughout the year
+ trans_values = []
+ num_days_in_year = Constants.NumDaysInYear(hpxml.header.sim_calendar_year)
+ if not hpxml.header.shading_summer_begin_month.nil?
+ summer_start_day_num = Schedule.get_day_num_from_month_day(hpxml.header.sim_calendar_year,
+ hpxml.header.shading_summer_begin_month,
+ hpxml.header.shading_summer_begin_day)
+ summer_end_day_num = Schedule.get_day_num_from_month_day(hpxml.header.sim_calendar_year,
+ hpxml.header.shading_summer_end_month,
+ hpxml.header.shading_summer_end_day)
+ for i in 0..(num_days_in_year - 1)
+ day_num = i + 1
+ if summer_end_day_num >= summer_start_day_num
+ if (day_num >= summer_start_day_num) && (day_num <= summer_end_day_num)
+ trans_values << [sf_summer] * 24
+ next
+ end
+ else
+ if (day_num >= summer_start_day_num) || (day_num <= summer_end_day_num)
+ trans_values << [sf_summer] * 24
+ next
+ end
+ end
+ # If we got this far, winter
+ trans_values << [sf_winter] * 24
+ end
+ else
+ # No summer (year-round winter)
+ trans_values = [[sf_winter] * 24] * num_days_in_year
+ end
+
+ # Create transmittance schedule
if shading_schedules[trans_values].nil?
sch_name = "trans schedule winter=#{sf_winter} summer=#{sf_summer}"
- if trans_values.uniq.size == 1
+ if trans_values.flatten.uniq.size == 1
trans_sch = OpenStudio::Model::ScheduleConstant.new(model)
- trans_sch.setValue(trans_values[0])
+ trans_sch.setValue(trans_values[0][0])
trans_sch.setName(sch_name)
else
- trans_sch = MonthWeekdayWeekendSchedule.new(model, sch_name, Array.new(24, 1), Array.new(24, 1), trans_values, Constants.ScheduleTypeLimitsFraction, false).schedule
+ trans_sch = HourlyByDaySchedule.new(model, sch_name, trans_values, trans_values, Constants.ScheduleTypeLimitsFraction, false).schedule
end
shading_schedules[trans_values] = trans_sch
end
shading_surface.setTransmittanceSchedule(shading_schedules[trans_values])