Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/radiant controls update #1534

Merged
merged 8 commits into from
Jul 21, 2023
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -4521,6 +4521,11 @@ def model_add_four_pipe_fan_coil(model,
# @param hot_water_loop [OpenStudio::Model::PlantLoop] the hot water loop that serves the radiant loop.
# @param chilled_water_loop [OpenStudio::Model::PlantLoop] the chilled water loop that serves the radiant loop.
# @param radiant_type [String] type of radiant system, floor or ceiling, to create in zone.
# @param radiant_temperature_control_type [String] determines the controlled temperature for the radiant system
# options are 'MeanAirTemperature', 'MeanRadiantTemperature', 'OperativeTemperature', 'OutdoorDryBulbTemperature',
# 'OutdoorWetBulbTemperature', 'SurfaceFaceTemperature', 'SurfaceInteriorTemperature'
# @param radiant_setpoint_control_type [String] determines the response of the radiant system at setpoint temperature
# options are 'ZeroFlowPower', 'HalfFlowPower'
# @param include_carpet [Bool] boolean to include thin carpet tile over radiant slab, default to true
# @param carpet_thickness_in [Double] thickness of carpet in inches
# @param model_occ_hr_start [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
Expand All @@ -4533,12 +4538,6 @@ def model_add_four_pipe_fan_coil(model,
# Otherwise no control strategy will be applied and the radiant system will assume the EnergyPlus default controls.
# @param proportional_gain [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
# Proportional gain constant (recommended 0.3 or less).
# @param minimum_operation [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
# Minimum number of hours of operation for radiant system before it shuts off.
# @param weekend_temperature_reset [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
# Weekend temperature reset for slab temperature setpoint in degree Celsius.
# @param early_reset_out_arg [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
# Time at which the weekend temperature reset is removed.
# @param switch_over_time [Double] Time limitation for when the system can switch between heating and cooling
# @param radiant_lockout [Bool] True if system contains a radiant lockout
# @param radiant_lockout_start_time [double] decimal hour of when radiant lockout starts
Expand All @@ -4553,15 +4552,14 @@ def model_add_low_temp_radiant(model,
hot_water_loop,
chilled_water_loop,
radiant_type: 'floor',
radiant_temperature_control_type: 'SurfaceFaceTemperature',
radiant_setpoint_control_type: 'ZeroFlowPower',
include_carpet: true,
carpet_thickness_in: 0.25,
model_occ_hr_start: 6.0,
model_occ_hr_end: 18.0,
control_strategy: 'proportional_control',
proportional_gain: 0.3,
minimum_operation: 1,
weekend_temperature_reset: 2,
early_reset_out_arg: 20,
switch_over_time: 24.0,
radiant_lockout: false,
radiant_lockout_start_time: 12.0,
Expand Down Expand Up @@ -4682,9 +4680,16 @@ def model_add_low_temp_radiant(model,
radiant_interior_floor_slab_construction = OpenStudio::Model::ConstructionWithInternalSource.new(layers)
radiant_interior_floor_slab_construction.setName('Radiant Interior Floor Slab Construction')
radiant_interior_floor_slab_construction.setSourcePresentAfterLayerNumber(1)
radiant_interior_floor_slab_construction.setTemperatureCalculationRequestedAfterLayerNumber(2)
radiant_interior_floor_slab_construction.setTemperatureCalculationRequestedAfterLayerNumber(1)
radiant_interior_floor_slab_construction.setTubeSpacing(0.2286) # 9 inches

# create reversed interior floor construction
rev_radiant_interior_floor_slab_construction = OpenStudio::Model::ConstructionWithInternalSource.new(layers.reverse())
rev_radiant_interior_floor_slab_construction.setName('Radiant Interior Floor Slab Construction - Reversed')
rev_radiant_interior_floor_slab_construction.setSourcePresentAfterLayerNumber(layers.length - 1)
rev_radiant_interior_floor_slab_construction.setTemperatureCalculationRequestedAfterLayerNumber(layers.length - 1)
rev_radiant_interior_floor_slab_construction.setTubeSpacing(0.2286) # 9 inches

layers = []
layers << mat_thin_carpet_tile if include_carpet
layers << mat_concrete_3_5in
Expand All @@ -4693,9 +4698,16 @@ def model_add_low_temp_radiant(model,
radiant_interior_ceiling_slab_construction.setName('Radiant Interior Ceiling Slab Construction')
slab_src_loc = include_carpet ? 2 : 1
radiant_interior_ceiling_slab_construction.setSourcePresentAfterLayerNumber(slab_src_loc)
radiant_interior_ceiling_slab_construction.setTemperatureCalculationRequestedAfterLayerNumber(slab_src_loc + 1)
radiant_interior_ceiling_slab_construction.setTemperatureCalculationRequestedAfterLayerNumber(slab_src_loc)
radiant_interior_ceiling_slab_construction.setTubeSpacing(0.2286) # 9 inches

# create reversed interior ceiling construction
rev_radiant_interior_ceiling_slab_construction = OpenStudio::Model::ConstructionWithInternalSource.new(layers.reverse())
rev_radiant_interior_ceiling_slab_construction.setName('Radiant Interior Ceiling Slab Construction - Reversed')
rev_radiant_interior_ceiling_slab_construction.setSourcePresentAfterLayerNumber(layers.length - slab_src_loc)
rev_radiant_interior_ceiling_slab_construction.setTemperatureCalculationRequestedAfterLayerNumber(layers.length - slab_src_loc)
rev_radiant_interior_ceiling_slab_construction.setTubeSpacing(0.2286) # 9 inches

layers = []
layers << mat_refl_roof_membrane
layers << mat_roof_insulation
Expand Down Expand Up @@ -4824,6 +4836,10 @@ def model_add_low_temp_radiant(model,
surface.setConstruction(radiant_exterior_slab_construction)
else # interior floor
surface.setConstruction(radiant_interior_floor_slab_construction)

# also assign construciton to adjacent surface
adjacent_surface = surface.adjacentSurface.get
adjacent_surface.setConstruction(rev_radiant_interior_floor_slab_construction)
end
end
elsif radiant_type == 'ceiling'
Expand All @@ -4832,6 +4848,10 @@ def model_add_low_temp_radiant(model,
surface.setConstruction(radiant_ceiling_slab_construction)
else # interior ceiling
surface.setConstruction(radiant_interior_ceiling_slab_construction)

# also assign construciton to adjacent surface
adjacent_surface = surface.adjacentSurface.get
adjacent_surface.setConstruction(rev_radiant_interior_ceiling_slab_construction)
end
end
end
Expand All @@ -4854,8 +4874,11 @@ def model_add_low_temp_radiant(model,
radiant_loop.setNumberofCircuits('CalculateFromCircuitLength')
radiant_loop.setCircuitLength(106.7)

# radiant loop controls
radiant_loop.setTemperatureControlType('MeanAirTemperature')
# radiant loop temperature controls
radiant_loop.setTemperatureControlType(radiant_temperature_control_type)

# radiant loop setpoint temperature response
radiant_loop.setSetpointControlType(radiant_setpoint_control_type)
radiant_loop.addToThermalZone(zone)
radiant_loops << radiant_loop

Expand All @@ -4865,13 +4888,10 @@ def model_add_low_temp_radiant(model,
# set radiant loop controls
if control_strategy == 'proportional_control'
model_add_radiant_proportional_controls(model, zone, radiant_loop,
radiant_type: radiant_type,
radiant_temperature_control_type: radiant_temperature_control_type,
model_occ_hr_start: model_occ_hr_start,
model_occ_hr_end: model_occ_hr_end,
proportional_gain: proportional_gain,
minimum_operation: minimum_operation,
weekend_temperature_reset: weekend_temperature_reset,
early_reset_out_arg: early_reset_out_arg,
switch_over_time: switch_over_time)
end
end
Expand Down
Loading