Skip to content

Commit

Permalink
Merge pull request #1534 from NREL/feature/radiant_controls_update
Browse files Browse the repository at this point in the history
Feature/radiant controls update
  • Loading branch information
mdahlhausen authored Jul 21, 2023
2 parents 12bbfab + d66ec66 commit 19db3eb
Show file tree
Hide file tree
Showing 6 changed files with 362 additions and 663 deletions.
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

0 comments on commit 19db3eb

Please sign in to comment.