diff --git a/Changelog.md b/Changelog.md
index 5900c773c8..499070bb67 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -19,6 +19,7 @@ __New Features__
- Central Fan Integrated Supply (CFIS) mechanical ventilation enhancements:
- CFIS systems without automatic flow control of outdoor air (`CFISControls/HasOutdoorAirControl=false`).
- CFIS systems with no strategy to meet remainder of ventilation target (`CFISControls/AdditionalRuntimeOperatingMode="none"`).
+ - CFIS systems with supplemental fans that run simultaneously with the air handler (`CFISControls/extension/SupplementalFanRunsWithAirHandlerFan=true`).
- HVAC Manual J design load and sizing calculations:
- Adds optional `DistributionSystemType/AirDistribution/extension/ManualJInputs/BlowerFanHeatBtuh` input.
- Adds optional `DistributionSystemType/HydronicDistribution/extension/ManualJInputs/HotWaterPipingBtuh` input.
diff --git a/HPXMLtoOpenStudio/measure.xml b/HPXMLtoOpenStudio/measure.xml
index 819304b94d..2f9ffeebaf 100644
--- a/HPXMLtoOpenStudio/measure.xml
+++ b/HPXMLtoOpenStudio/measure.xml
@@ -3,8 +3,8 @@
3.1
hpxm_lto_openstudio
b1543b30-9465-45ff-ba04-1d1f85e763bc
- e7d819f6-fda2-4bf2-b6c3-cd1ff3adb569
- 2024-10-22T17:43:11Z
+ 6f307da4-b354-4c31-897f-de2161a9de82
+ 2024-10-22T21:49:52Z
D8922A73
HPXMLtoOpenStudio
HPXML to OpenStudio Translator
@@ -189,7 +189,7 @@
airflow.rb
rb
resource
- D2A99996
+ FFA79541
battery.rb
@@ -327,7 +327,7 @@
defaults.rb
rb
resource
- 5B6D3CB2
+ E52E98C6
energyplus.rb
@@ -357,7 +357,7 @@
hpxml.rb
rb
resource
- E862E878
+ 656CF61F
hpxml_schema/HPXML.xsd
@@ -375,7 +375,7 @@
hpxml_schematron/EPvalidator.xml
xml
resource
- 009BEB48
+ DD7BB2F9
hpxml_schematron/iso-schematron.xsd
@@ -663,7 +663,7 @@
test_defaults.rb
rb
test
- 9D489184
+ 77AFEE2C
test_enclosure.rb
diff --git a/HPXMLtoOpenStudio/resources/airflow.rb b/HPXMLtoOpenStudio/resources/airflow.rb
index f852cb20c5..d799dd5992 100644
--- a/HPXMLtoOpenStudio/resources/airflow.rb
+++ b/HPXMLtoOpenStudio/resources/airflow.rb
@@ -725,7 +725,7 @@ def self.create_return_air_duct_zone(model, loop_name, unit_multiplier, adiabati
# @param unavailable_periods [HPXML::UnavailablePeriods] Object that defines periods for, e.g., power outages or vacancies
# @return [TODO] TODO
def self.initialize_cfis(model, vent_fans, airloop_map, unavailable_periods)
- cfis_data = { airloop: {}, t_sum_open_damper_var: {}, f_extra_open_damper_var: {} }
+ cfis_data = { airloop: {}, t_sum_open_damper_var: {}, f_vent_only_mode_var: {} }
return cfis_data if vent_fans[:mech].empty?
index = 0
@@ -745,11 +745,11 @@ def self.initialize_cfis(model, vent_fans, airloop_map, unavailable_periods)
cfis_data[:t_sum_open_damper_var][vent_mech.id] = Model.add_ems_global_var(
model,
var_name: "#{Constants::ObjectTypeMechanicalVentilation} cfis t sum open damper #{index}"
- ) # Sums the time during an hour the CFIS damper has been open
- cfis_data[:f_extra_open_damper_var][vent_mech.id] = Model.add_ems_global_var(
+ )
+ cfis_data[:f_vent_only_mode_var][vent_mech.id] = Model.add_ems_global_var(
model,
- var_name: "#{Constants::ObjectTypeMechanicalVentilation} cfis f open damper #{index}"
- ) # Fraction of timestep the CFIS blower is running while hvac is not operating. Used by infiltration and duct leakage programs
+ var_name: "#{Constants::ObjectTypeMechanicalVentilation} cfis f vent only mode #{index}"
+ )
# CFIS Initialization Program
cfis_program = Model.add_ems_program(
@@ -757,7 +757,7 @@ def self.initialize_cfis(model, vent_fans, airloop_map, unavailable_periods)
name: "#{Constants::ObjectTypeMechanicalVentilation} cfis init program #{index}"
)
cfis_program.addLine("Set #{cfis_data[:t_sum_open_damper_var][vent_mech.id].name} = 0")
- cfis_program.addLine("Set #{cfis_data[:f_extra_open_damper_var][vent_mech.id].name} = 0")
+ cfis_program.addLine("Set #{cfis_data[:f_vent_only_mode_var][vent_mech.id].name} = 0")
Model.add_ems_program_calling_manager(
model,
@@ -1585,12 +1585,12 @@ def self.apply_duct_location(model, spaces, hpxml_bldg, ducts, object, i, duct_l
add_cfis_duct_losses = (cfis_fan.cfis_addtl_runtime_operating_mode == HPXML::CFISModeAirHandler)
if add_cfis_duct_losses
- # Calculate CFIS duct losses when the outdoor air damper is open
- f_extra_open_damper_var = cfis_data[:f_extra_open_damper_var][cfis_id]
+ # Calculate additional CFIS duct losses when the air handler is in ventilation only mode
+ f_vent_only_mode_var = cfis_data[:f_vent_only_mode_var][cfis_id]
- duct_program.addLine("If #{f_extra_open_damper_var.name} > 0")
+ duct_program.addLine("If #{f_vent_only_mode_var.name} > 0")
duct_program.addLine(" Set cfis_m3s = (#{fan_data[:mfr_max_var][object].name} * #{cfis_fan.cfis_vent_mode_airflow_fraction} / 1.16097654)") # Density of 1.16097654 was back calculated using E+ results
- duct_program.addLine(" Set #{fan_data[:rtf_var][object].name} = #{f_extra_open_damper_var.name}") # Need to use global vars to sync duct_program and infiltration program of different calling points
+ duct_program.addLine(" Set #{fan_data[:rtf_var][object].name} = #{f_vent_only_mode_var.name}") # Need to use global vars to sync duct_program and infiltration program of different calling points
duct_program.addLine(" Set #{ah_vfr_var.name} = #{fan_data[:rtf_var][object].name}*cfis_m3s")
duct_program.addLine(" Set rho_in = (@RhoAirFnPbTdbW #{sensors[:pbar].name} #{sensors[:t_in].name} #{sensors[:w_in].name})")
duct_program.addLine(" Set #{ah_mfr_var.name} = #{ah_vfr_var.name} * rho_in")
@@ -1978,7 +1978,7 @@ def self.apply_cfis(runner, infil_program, vent_mech_fans, cfis_data, cfis_fan_a
end
t_sum_open_damper_var = cfis_data[:t_sum_open_damper_var][vent_mech.id]
- f_extra_open_damper_var = cfis_data[:f_extra_open_damper_var][vent_mech.id]
+ f_vent_only_mode_var = cfis_data[:f_vent_only_mode_var][vent_mech.id]
infil_program.addLine('If @ABS(Minute - ZoneTimeStep*60) < 0.1')
infil_program.addLine(" Set #{t_sum_open_damper_var.name} = 0") # New hour, time on summation re-initializes to 0
@@ -1986,23 +1986,26 @@ def self.apply_cfis(runner, infil_program, vent_mech_fans, cfis_data, cfis_fan_a
infil_program.addLine("Set t_min_hr_open = #{[vent_mech.hours_in_operation / 24.0 * 60.0, 59.999].min}") # Minimum CFIS damper open time in minutes
infil_program.addLine("Set Q_duct_oa = #{UnitConversions.convert(vent_mech.oa_unit_flow_rate, 'cfm', 'm^3/s')}")
- infil_program.addLine('Set f_total_open_damper = 0') # Fraction of the timestep the CFIS damper is open
- infil_program.addLine("Set #{f_extra_open_damper_var.name} = 0")
+ infil_program.addLine('Set f_open_damper = 0')
+ infil_program.addLine("Set #{f_vent_only_mode_var.name} = 0")
infil_program.addLine("Set has_additional_runtime = #{vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeNone ? 0 : 1}")
infil_program.addLine("Set has_outdoor_air_control = #{vent_mech.cfis_has_outdoor_air_control ? 1 : 0}")
+ if vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeSupplementalFan
+ infil_program.addLine("Set suppl_fan_w = #{vent_mech.cfis_supplemental_fan.unit_fan_power}") # W
+ end
infil_program.addLine("If #{t_sum_open_damper_var.name} < t_min_hr_open") # Check whether we've met the minimum hourly runtime
infil_program.addLine(" Set t_damper_open = 60 - (t_min_hr_open - #{t_sum_open_damper_var.name})") # Minute of the hour at which the damper must be opened
infil_program.addLine(' If ((Minute+0.00001) >= t_damper_open) && (has_additional_runtime == 1)') # Check whether the damper must be opened to achieve target minutes per hour of operation
- infil_program.addLine(' Set open_damper_runtime = @Max (@ABS(Minute - t_damper_open)) (fan_rtf_hvac * ZoneTimeStep * 60)') # How many minutes this hour the damper is open
+ infil_program.addLine(' Set open_damper_runtime = @Max (@ABS(Minute - t_damper_open)) (fan_rtf_hvac * ZoneTimeStep * 60)') # How many minutes this timestep the damper is open
infil_program.addLine(" Set open_damper_runtime = @Min open_damper_runtime (t_min_hr_open - #{t_sum_open_damper_var.name})") # Make sure it's not exceeding target ventilation
- infil_program.addLine(' Set f_total_open_damper = open_damper_runtime / (60.0 * ZoneTimeStep)') # Fraction of the timestep that the damper is open
- infil_program.addLine(" Set #{t_sum_open_damper_var.name} = #{t_sum_open_damper_var.name} + open_damper_runtime")
- infil_program.addLine(" Set #{f_extra_open_damper_var.name} = @Max (f_total_open_damper - fan_rtf_hvac) 0.0") # Fraction of the timestep with additional ventilation mode runtime
+ infil_program.addLine(" Set #{t_sum_open_damper_var.name} = #{t_sum_open_damper_var.name} + open_damper_runtime") # How many minutes this hour the damper is open
+ infil_program.addLine(' Set f_open_damper = open_damper_runtime / (60.0 * ZoneTimeStep)') # Fraction of the timestep that the damper is open
+ infil_program.addLine(" Set #{f_vent_only_mode_var.name} = @Max (f_open_damper - fan_rtf_hvac) 0.0") # Fraction of the timestep with ventilation only mode runtime
if vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeAirHandler
# Air handler meets additional runtime requirement
infil_program.addLine(" Set fan_w = #{vent_mech.unit_fan_power}") # W
- infil_program.addLine(" Set #{cfis_fan_actuator.name} = #{cfis_fan_actuator.name} + fan_w * #{f_extra_open_damper_var.name}")
+ infil_program.addLine(" Set #{cfis_fan_actuator.name} = #{cfis_fan_actuator.name} + fan_w * #{f_vent_only_mode_var.name}")
elsif vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeSupplementalFan
# Supplemental fan meets additional runtime requirement
if vent_mech.cfis_supplemental_fan.oa_unit_flow_rate < vent_mech.average_unit_flow_rate
@@ -2010,12 +2013,11 @@ def self.apply_cfis(runner, infil_program, vent_mech_fans, cfis_data, cfis_fan_a
end
infil_program.addLine(" Set suppl_Q_oa = #{UnitConversions.convert(vent_mech.cfis_supplemental_fan.oa_unit_flow_rate, 'cfm', 'm^3/s')}")
if vent_mech.cfis_supplemental_fan.oa_unit_flow_rate > 0
- infil_program.addLine(" Set suppl_f = #{f_extra_open_damper_var.name} / (suppl_Q_oa / Q_duct_oa)") # Calculate desired runtime for supplemental fan to provide remaining ventilation requirement
+ infil_program.addLine(" Set suppl_f = #{f_vent_only_mode_var.name} / (suppl_Q_oa / Q_duct_oa)") # Calculate desired runtime for supplemental fan to provide remaining ventilation requirement
infil_program.addLine(' Set suppl_f = @Min suppl_f 1.0') # Ensure desired runtime does not exceed 100% (if the supplemental fan is undersized)
else
infil_program.addLine(' Set suppl_f = 0.0')
end
- infil_program.addLine(" Set suppl_fan_w = #{vent_mech.cfis_supplemental_fan.unit_fan_power}") # W
infil_program.addLine(" Set #{cfis_suppl_fan_actuator.name} = #{cfis_suppl_fan_actuator.name} + suppl_fan_w * suppl_f")
if vent_mech.cfis_supplemental_fan.fan_type == HPXML::MechVentTypeSupply
infil_program.addLine(' Set QWHV_cfis_suppl_sup = QWHV_cfis_suppl_sup + (suppl_f * suppl_Q_oa)')
@@ -2024,21 +2026,39 @@ def self.apply_cfis(runner, infil_program, vent_mech_fans, cfis_data, cfis_fan_a
end
end
infil_program.addLine(' Else') # No additional ventilation mode runtime
- infil_program.addLine(' Set open_damper_runtime = fan_rtf_hvac * ZoneTimeStep * 60') # How many minutes this hour the damper is open
+ infil_program.addLine(' Set open_damper_runtime = fan_rtf_hvac * ZoneTimeStep * 60') # How many minutes this timestep the damper is open
infil_program.addLine(" If (#{t_sum_open_damper_var.name} + open_damper_runtime) > t_min_hr_open") # Damper is only open for a portion of this time step to achieve target ventilation
infil_program.addLine(" Set open_damper_runtime = t_min_hr_open - #{t_sum_open_damper_var.name}")
infil_program.addLine(' EndIf')
- infil_program.addLine(' Set f_total_open_damper = open_damper_runtime / (ZoneTimeStep * 60)') # Fraction of the timestep that the damper is open
- infil_program.addLine(" Set #{t_sum_open_damper_var.name} = #{t_sum_open_damper_var.name} + open_damper_runtime")
+ infil_program.addLine(' Set f_open_damper = open_damper_runtime / (ZoneTimeStep * 60)') # Fraction of the timestep that the damper is open
+ infil_program.addLine(" Set #{t_sum_open_damper_var.name} = #{t_sum_open_damper_var.name} + open_damper_runtime") # How many minutes this hour the damper is open
infil_program.addLine(' EndIf')
+ infil_program.addLine('EndIf')
+
+ # Calculate fraction of the timestep that the damper is open and the air handler fan is running
if vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeSupplementalFan
- infil_program.addLine(" Set f_total_open_damper = @Max (f_total_open_damper - #{f_extra_open_damper_var.name}) 0.0")
+ infil_program.addLine("Set f_open_damper_ah = @Max (f_open_damper - #{f_vent_only_mode_var.name}) 0.0")
+ else
+ infil_program.addLine('Set f_open_damper_ah = f_open_damper')
end
- infil_program.addLine('EndIf')
+
+ # If no outdoor air control, then outdoor air is introduced for at least the entire time the HVAC system is running
infil_program.addLine('If has_outdoor_air_control == 0')
- infil_program.addLine(' Set f_total_open_damper = @Max f_total_open_damper fan_rtf_hvac') # Outdoor air is introduced for at least the entire time the HVAC system is running
+ infil_program.addLine(' Set f_open_damper_ah = @Max f_open_damper_ah fan_rtf_hvac')
infil_program.addLine('EndIf')
- infil_program.addLine('Set QWHV_cfis_sup = QWHV_cfis_sup + (f_total_open_damper * Q_duct_oa)')
+
+ # Airflow brought in through air handler
+ infil_program.addLine('Set QWHV_cfis_sup = QWHV_cfis_sup + (f_open_damper_ah * Q_duct_oa)')
+
+ next unless vent_mech.cfis_addtl_runtime_operating_mode == HPXML::CFISModeSupplementalFan && vent_mech.cfis_supplemental_fan_runs_with_air_handler_fan
+
+ # Also run supplemental fan when damper is open and HVAC system is running
+ infil_program.addLine("Set #{cfis_suppl_fan_actuator.name} = #{cfis_suppl_fan_actuator.name} + (suppl_fan_w * f_open_damper_ah)")
+ if vent_mech.cfis_supplemental_fan.fan_type == HPXML::MechVentTypeSupply
+ infil_program.addLine('Set QWHV_cfis_suppl_sup = QWHV_cfis_suppl_sup + (f_open_damper_ah * suppl_Q_oa)')
+ elsif vent_mech.cfis_supplemental_fan.fan_type == HPXML::MechVentTypeExhaust
+ infil_program.addLine('Set QWHV_cfis_suppl_exh = QWHV_cfis_suppl_exh + (f_open_damper_ah * suppl_Q_oa)')
+ end
end
end
diff --git a/HPXMLtoOpenStudio/resources/defaults.rb b/HPXMLtoOpenStudio/resources/defaults.rb
index df077becff..9f62f339b3 100644
--- a/HPXMLtoOpenStudio/resources/defaults.rb
+++ b/HPXMLtoOpenStudio/resources/defaults.rb
@@ -2755,6 +2755,10 @@ def self.apply_ventilation_fans(hpxml_bldg, weather, eri_version)
vent_fan.cfis_vent_mode_airflow_fraction = 1.0
vent_fan.cfis_vent_mode_airflow_fraction_isdefaulted = true
end
+ if vent_fan.cfis_supplemental_fan_runs_with_air_handler_fan.nil? && (vent_fan.cfis_addtl_runtime_operating_mode == HPXML::CFISModeSupplementalFan)
+ vent_fan.cfis_supplemental_fan_runs_with_air_handler_fan = false
+ vent_fan.cfis_supplemental_fan_runs_with_air_handler_fan_isdefaulted = true
+ end
end
# Default kitchen fan
diff --git a/HPXMLtoOpenStudio/resources/hpxml.rb b/HPXMLtoOpenStudio/resources/hpxml.rb
index f536684c1d..537abbc77d 100644
--- a/HPXMLtoOpenStudio/resources/hpxml.rb
+++ b/HPXMLtoOpenStudio/resources/hpxml.rb
@@ -7993,41 +7993,42 @@ def from_doc(building)
# Object for /HPXML/Building/BuildingDetails/Systems/MechanicalVentilation/VentilationFans/VentilationFan.
class VentilationFan < BaseElement
- ATTRS = [:id, # [String] SystemIdentifier/@id
- :count, # [Integer] Count
- :fan_type, # [String] FanType (HPXML::MechVentTypeXXX)
- :cfis_has_outdoor_air_control, # [Boolean] CFISControls/HasOutdoorAirControl
- :cfis_addtl_runtime_operating_mode, # [String] CFISControls/AdditionalRuntimeOperatingMode (HPXML::CFISModeXXX)
- :cfis_supplemental_fan_idref, # [String] CFISControls/SupplementalFan/@idref
- :rated_flow_rate, # [Double] RatedFlowRate (cfm)
- :calculated_flow_rate, # [Double] CalculatedFlowRate (cfm)
- :tested_flow_rate, # [Double] TestedFlowRate (cfm)
- :hours_in_operation, # [Double] HoursInOperation (hrs/day)
- :delivered_ventilation, # [Double] DeliveredVentilation (cfm)
- :fan_location, # [String] FanLocation (HPXML::LocationXXX)
- :used_for_local_ventilation, # [Boolean] UsedForLocalVentilation
- :used_for_whole_building_ventilation, # [Boolean] UsedForWholeBuildingVentilation
- :used_for_seasonal_cooling_load_reduction, # [Boolean] UsedForSeasonalCoolingLoadReduction
- :used_for_garage_ventilation, # [Boolean] UsedForGarageVentilation
- :is_shared_system, # [Boolean] IsSharedSystem
- :fraction_recirculation, # [Double] FractionRecirculation (frac)
- :total_recovery_efficiency, # [Double] TotalRecoveryEfficiency (frac)
- :sensible_recovery_efficiency, # [Double] SensibleRecoveryEfficiency (frac)
- :total_recovery_efficiency_adjusted, # [Double] AdjustedTotalRecoveryEfficiency (frac)
- :sensible_recovery_efficiency_adjusted, # [Double] AdjustedSensibleRecoveryEfficiency (frac)
- :fan_power, # [Double] FanPower (W)
- :distribution_system_idref, # [String] AttachedToHVACDistributionSystem/@idref
- :start_hour, # [Integer] extension/StartHour
- :in_unit_flow_rate, # [Double] extension/InUnitFlowRate (cfm)
- :preheating_fuel, # [String] extension/PreHeating/Fuel (HPXML::FuelTypeXXX)
- :preheating_efficiency_cop, # [Double] extension/PreHeating/AnnualHeatingEfficiency[Units="COP"]/Value (W/W)
- :preheating_fraction_load_served, # [Double] extension/PreHeating/FractionVentilationHeatLoadServed (frac)
- :precooling_fuel, # [String] extension/PreCooling/Fuel (HPXML::FuelTypeXXX)
- :precooling_efficiency_cop, # [Double] extension/PreCooling/AnnualCoolingEfficiency[Units="COP"]/Value (W/W)
- :precooling_fraction_load_served, # [Double] extension/PreCooling/FractionVentilationCoolLoadServed (frac)
- :flow_rate_not_tested, # [Boolean] extension/FlowRateNotTested
- :fan_power_defaulted, # [Boolean] extension/FanPowerDefaulted
- :cfis_vent_mode_airflow_fraction] # [Double] extension/VentilationOnlyModeAirflowFraction (frac)
+ ATTRS = [:id, # [String] SystemIdentifier/@id
+ :count, # [Integer] Count
+ :fan_type, # [String] FanType (HPXML::MechVentTypeXXX)
+ :cfis_has_outdoor_air_control, # [Boolean] CFISControls/HasOutdoorAirControl
+ :cfis_addtl_runtime_operating_mode, # [String] CFISControls/AdditionalRuntimeOperatingMode (HPXML::CFISModeXXX)
+ :cfis_supplemental_fan_idref, # [String] CFISControls/SupplementalFan/@idref
+ :cfis_supplemental_fan_runs_with_air_handler_fan, # [Boolean] CFISControls/extension/SupplementalFanRunsWithAirHandlerFan
+ :rated_flow_rate, # [Double] RatedFlowRate (cfm)
+ :calculated_flow_rate, # [Double] CalculatedFlowRate (cfm)
+ :tested_flow_rate, # [Double] TestedFlowRate (cfm)
+ :hours_in_operation, # [Double] HoursInOperation (hrs/day)
+ :delivered_ventilation, # [Double] DeliveredVentilation (cfm)
+ :fan_location, # [String] FanLocation (HPXML::LocationXXX)
+ :used_for_local_ventilation, # [Boolean] UsedForLocalVentilation
+ :used_for_whole_building_ventilation, # [Boolean] UsedForWholeBuildingVentilation
+ :used_for_seasonal_cooling_load_reduction, # [Boolean] UsedForSeasonalCoolingLoadReduction
+ :used_for_garage_ventilation, # [Boolean] UsedForGarageVentilation
+ :is_shared_system, # [Boolean] IsSharedSystem
+ :fraction_recirculation, # [Double] FractionRecirculation (frac)
+ :total_recovery_efficiency, # [Double] TotalRecoveryEfficiency (frac)
+ :sensible_recovery_efficiency, # [Double] SensibleRecoveryEfficiency (frac)
+ :total_recovery_efficiency_adjusted, # [Double] AdjustedTotalRecoveryEfficiency (frac)
+ :sensible_recovery_efficiency_adjusted, # [Double] AdjustedSensibleRecoveryEfficiency (frac)
+ :fan_power, # [Double] FanPower (W)
+ :distribution_system_idref, # [String] AttachedToHVACDistributionSystem/@idref
+ :start_hour, # [Integer] extension/StartHour
+ :in_unit_flow_rate, # [Double] extension/InUnitFlowRate (cfm)
+ :preheating_fuel, # [String] extension/PreHeating/Fuel (HPXML::FuelTypeXXX)
+ :preheating_efficiency_cop, # [Double] extension/PreHeating/AnnualHeatingEfficiency[Units="COP"]/Value (W/W)
+ :preheating_fraction_load_served, # [Double] extension/PreHeating/FractionVentilationHeatLoadServed (frac)
+ :precooling_fuel, # [String] extension/PreCooling/Fuel (HPXML::FuelTypeXXX)
+ :precooling_efficiency_cop, # [Double] extension/PreCooling/AnnualCoolingEfficiency[Units="COP"]/Value (W/W)
+ :precooling_fraction_load_served, # [Double] extension/PreCooling/FractionVentilationCoolLoadServed (frac)
+ :flow_rate_not_tested, # [Boolean] extension/FlowRateNotTested
+ :fan_power_defaulted, # [Boolean] extension/FanPowerDefaulted
+ :cfis_vent_mode_airflow_fraction] # [Double] extension/VentilationOnlyModeAirflowFraction (frac)
attr_accessor(*ATTRS)
# Returns the HVAC distribution system for the ventilation fan.
@@ -8244,7 +8245,7 @@ def to_doc(building)
XMLHelper.add_attribute(sys_id, 'id', @id)
XMLHelper.add_element(ventilation_fan, 'Count', @count, :integer, @count_isdefaulted) unless @count.nil?
XMLHelper.add_element(ventilation_fan, 'FanType', @fan_type, :string) unless @fan_type.nil?
- if (not @cfis_addtl_runtime_operating_mode.nil?) || (not @cfis_supplemental_fan_idref.nil?) || (not @cfis_has_outdoor_air_control.nil?)
+ if (not @cfis_addtl_runtime_operating_mode.nil?) || (not @cfis_supplemental_fan_idref.nil?) || (not @cfis_has_outdoor_air_control.nil?) || (not @cfis_supplemental_fan_runs_with_air_handler_fan.nil?)
cfis_controls = XMLHelper.add_element(ventilation_fan, 'CFISControls')
XMLHelper.add_element(cfis_controls, 'HasOutdoorAirControl', @cfis_has_outdoor_air_control, :boolean, @cfis_has_outdoor_air_control_isdefaulted) unless @cfis_has_outdoor_air_control.nil?
XMLHelper.add_element(cfis_controls, 'AdditionalRuntimeOperatingMode', @cfis_addtl_runtime_operating_mode, :string, @cfis_addtl_runtime_operating_mode_isdefaulted) unless @cfis_addtl_runtime_operating_mode.nil?
@@ -8252,6 +8253,7 @@ def to_doc(building)
supplemental_fan = XMLHelper.add_element(cfis_controls, 'SupplementalFan')
XMLHelper.add_attribute(supplemental_fan, 'idref', @cfis_supplemental_fan_idref)
end
+ XMLHelper.add_extension(cfis_controls, 'SupplementalFanRunsWithAirHandlerFan', @cfis_supplemental_fan_runs_with_air_handler_fan, :boolean, @cfis_supplemental_fan_runs_with_air_handler_fan_isdefaulted) unless @cfis_supplemental_fan_runs_with_air_handler_fan.nil?
end
XMLHelper.add_element(ventilation_fan, 'RatedFlowRate', @rated_flow_rate, :float, @rated_flow_rate_isdefaulted) unless @rated_flow_rate.nil?
XMLHelper.add_element(ventilation_fan, 'CalculatedFlowRate', @calculated_flow_rate, :float, @calculated_flow_rate_isdefaulted) unless @calculated_flow_rate.nil?
@@ -8310,6 +8312,7 @@ def from_doc(ventilation_fan)
@cfis_has_outdoor_air_control = XMLHelper.get_value(ventilation_fan, 'CFISControls/HasOutdoorAirControl', :boolean)
@cfis_addtl_runtime_operating_mode = XMLHelper.get_value(ventilation_fan, 'CFISControls/AdditionalRuntimeOperatingMode', :string)
@cfis_supplemental_fan_idref = HPXML::get_idref(XMLHelper.get_element(ventilation_fan, 'CFISControls/SupplementalFan'))
+ @cfis_supplemental_fan_runs_with_air_handler_fan = XMLHelper.get_value(ventilation_fan, 'CFISControls/extension/SupplementalFanRunsWithAirHandlerFan', :boolean)
@rated_flow_rate = XMLHelper.get_value(ventilation_fan, 'RatedFlowRate', :float)
@calculated_flow_rate = XMLHelper.get_value(ventilation_fan, 'CalculatedFlowRate', :float)
@tested_flow_rate = XMLHelper.get_value(ventilation_fan, 'TestedFlowRate', :float)
diff --git a/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml b/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml
index 8f592c8c44..df22728743 100644
--- a/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml
+++ b/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml
@@ -2039,6 +2039,7 @@
[CFISAdditionalRuntimeMode=AirHandlerFan]
Expected 0 element(s) for xpath: CFISControls/SupplementalFan
+ Expected 0 element(s) for xpath: CFISControls/extension/SupplementalFanRunsWithAirHandlerFan
Expected 0 or 1 element(s) for xpath: FanPower
Expected 0 or 1 element(s) for xpath: extension/VentilationOnlyModeAirflowFraction
Expected extension/VentilationOnlyModeAirflowFraction to be greater than or equal to 0
@@ -2050,6 +2051,7 @@
[CFISAdditionalRuntimeMode=SupplementalFan]
Expected 1 element(s) for xpath: CFISControls/SupplementalFan
+ Expected 0 or 1 element(s) for xpath: CFISControls/extension/SupplementalFanRunsWithAirHandlerFan
Expected 0 element(s) for xpath: FanPower
Expected 0 element(s) for xpath: extension/VentilationOnlyModeAirflowFraction
@@ -2059,6 +2061,7 @@
[CFISAdditionalRuntimeMode=None]
Expected 0 element(s) for xpath: CFISControls/SupplementalFan
+ Expected 0 element(s) for xpath: CFISControls/extension/SupplementalFanRunsWithAirHandlerFan
Expected 0 element(s) for xpath: FanPower
Expected 0 element(s) for xpath: extension/VentilationOnlyModeAirflowFraction
diff --git a/HPXMLtoOpenStudio/tests/test_defaults.rb b/HPXMLtoOpenStudio/tests/test_defaults.rb
index e1a38bd9d7..e8fcf4d0d4 100644
--- a/HPXMLtoOpenStudio/tests/test_defaults.rb
+++ b/HPXMLtoOpenStudio/tests/test_defaults.rb
@@ -3039,14 +3039,27 @@ def test_mech_ventilation_fans
vent_fan = hpxml_bldg.ventilation_fans.find { |f| f.used_for_whole_building_ventilation && f.fan_type == HPXML::MechVentTypeCFIS }
vent_fan.hours_in_operation = 12.0
vent_fan.rated_flow_rate = 222.0
+ vent_fan.cfis_supplemental_fan_runs_with_air_handler_fan = true
suppl_vent_fan = vent_fan.cfis_supplemental_fan
suppl_vent_fan.tested_flow_rate = 79.0
suppl_vent_fan.fan_power = 9.0
XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_default_hpxml, default_hpxml_bldg = _test_measure()
- _test_default_mech_vent_values(default_hpxml_bldg, false, 12.0, nil, 222.0, nil, HPXML::CFISModeSupplementalFan, true)
+ _test_default_mech_vent_values(default_hpxml_bldg, false, 12.0, nil, 222.0, nil, HPXML::CFISModeSupplementalFan, true, true)
_test_default_mech_vent_suppl_values(default_hpxml_bldg, false, nil, 9.0, 79.0)
+ # Test defaults w/ CFIS & supplemental fan
+ vent_fan.is_shared_system = nil
+ vent_fan.hours_in_operation = nil
+ vent_fan.fan_power = nil
+ vent_fan.rated_flow_rate = nil
+ vent_fan.cfis_vent_mode_airflow_fraction = nil
+ vent_fan.cfis_has_outdoor_air_control = nil
+ vent_fan.cfis_supplemental_fan_runs_with_air_handler_fan = nil
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
+ _default_hpxml, default_hpxml_bldg = _test_measure()
+ _test_default_mech_vent_values(default_hpxml_bldg, false, 8.0, nil, 305.4, nil, HPXML::CFISModeSupplementalFan, true, false)
+
# Test defaults w/ CFIS supplemental fan
suppl_vent_fan.tested_flow_rate = nil
suppl_vent_fan.is_shared_system = nil
@@ -5437,7 +5450,7 @@ def _test_default_hydronic_distribution_values(hpxml_bldg, manualj_hot_water_pip
def _test_default_mech_vent_values(hpxml_bldg, is_shared_system, hours_in_operation, fan_power, flow_rate,
cfis_vent_mode_airflow_fraction = nil, cfis_addtl_runtime_operating_mode = nil,
- cfis_has_outdoor_air_control = nil)
+ cfis_has_outdoor_air_control = nil, cfis_suppl_fan_runs_with_air_handler = nil)
vent_fan = hpxml_bldg.ventilation_fans.find { |f| f.used_for_whole_building_ventilation && !f.is_cfis_supplemental_fan }
assert_equal(is_shared_system, vent_fan.is_shared_system)
@@ -5463,6 +5476,11 @@ def _test_default_mech_vent_values(hpxml_bldg, is_shared_system, hours_in_operat
else
assert_equal(cfis_has_outdoor_air_control, vent_fan.cfis_has_outdoor_air_control)
end
+ if cfis_suppl_fan_runs_with_air_handler.nil?
+ assert_nil(vent_fan.cfis_supplemental_fan_runs_with_air_handler_fan)
+ else
+ assert_equal(cfis_suppl_fan_runs_with_air_handler, vent_fan.cfis_supplemental_fan_runs_with_air_handler_fan)
+ end
end
def _test_default_mech_vent_suppl_values(hpxml_bldg, is_shared_system, hours_in_operation, fan_power, flow_rate)
diff --git a/docs/source/workflow_inputs.rst b/docs/source/workflow_inputs.rst
index fcdad049de..722ea85d65 100644
--- a/docs/source/workflow_inputs.rst
+++ b/docs/source/workflow_inputs.rst
@@ -3780,6 +3780,7 @@ A CFIS system is a supply ventilation system that provides outdoor air to the re
``CFISControls/HasOutdoorAirControl`` boolean No true Presence of controls to block outdoor air when not ventilating [#]_
``CFISControls/AdditionalRuntimeOperatingMode`` string See [#]_ No air handler fan How additional ventilation is provided (beyond HVAC system operation)
``CFISControls/SupplementalFan`` idref See [#]_ See [#]_ The supplemental fan providing additional ventilation
+ ``CFISControls/extension/SupplementalFanRunsWithAirHandlerFan`` boolean No [#]_ false Whether the supplemental fan also runs with the air handler fan [#]_
``RatedFlowRate`` or ``TestedFlowRate`` or ``CalculatedFlowRate`` or ``DeliveredVentilation`` double cfm >= 0 No See [#]_ Flow rate [#]_
``HoursInOperation`` double hrs/day >= 0, <= 24 false 8 Hours per day of operation [#]_
``UsedForWholeBuildingVentilation`` boolean true Yes Ventilation fan use case [#]_
@@ -3792,6 +3793,9 @@ A CFIS system is a supply ventilation system that provides outdoor air to the re
.. [#] AdditionalRuntimeOperatingMode choices are "air handler fan", "supplemental fan", or "none".
.. [#] SupplementalFan must reference another ``VentilationFan`` where UsedForWholeBuildingVentilation=true, IsSharedSystem=false, and FanType="exhaust only" or "supply only".
.. [#] SupplementalFan only required if AdditionalRuntimeOperatingMode is "supplemental fan".
+ .. [#] SupplementalFanRunsWithAirHandlerFan only applies when AdditionalRuntimeOperatingMode="supplemental fan".
+ .. [#] If SupplementalFanRunsWithAirHandlerFan is true, in addition to its normal operation, the supplemental fan will also run simultaneously with the air handler fan when outdoor air is being brought in.
+ This is typically used with a supplemental exhaust fan to provide "balanced" (supply + exhaust) airflow.
.. [#] If flow rate not provided, defaults to the required mechanical ventilation rate per `ANSI/RESNET/ICC 301-2022 `_:
Qfan = required mechanical ventilation rate (cfm) = ((Qtot^2 – 4*Qinf_eff^2 + 2*Qinf_eff*Qtot + Qinf_eff^2)^0.5 + Qtot - Qinf_eff) / 2
diff --git a/tasks.rb b/tasks.rb
index 9a3fd0d023..dfa5ba2190 100644
--- a/tasks.rb
+++ b/tasks.rb
@@ -2280,18 +2280,22 @@ def apply_hpxml_modification_sample_files(hpxml_path, hpxml)
elsif ['base-mechvent-cfis-no-outdoor-air-control.xml'].include? hpxml_file
hpxml_bldg.ventilation_fans[0].cfis_has_outdoor_air_control = false
elsif ['base-mechvent-cfis-supplemental-fan-exhaust.xml',
- 'base-mechvent-cfis-supplemental-fan-supply.xml'].include? hpxml_file
+ 'base-mechvent-cfis-supplemental-fan-supply.xml',
+ 'base-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml'].include? hpxml_file
hpxml_bldg.ventilation_fans.add(id: "VentilationFan#{hpxml_bldg.ventilation_fans.size + 1}",
tested_flow_rate: 120,
fan_power: 30,
used_for_whole_building_ventilation: true)
- if hpxml_file == 'base-mechvent-cfis-supplemental-fan-exhaust.xml'
+ if hpxml_file.include? 'exhaust'
hpxml_bldg.ventilation_fans[-1].fan_type = HPXML::MechVentTypeExhaust
- else
+ elsif hpxml_file.include? 'supply'
hpxml_bldg.ventilation_fans[-1].fan_type = HPXML::MechVentTypeSupply
end
hpxml_bldg.ventilation_fans[0].cfis_addtl_runtime_operating_mode = HPXML::CFISModeSupplementalFan
hpxml_bldg.ventilation_fans[0].cfis_supplemental_fan_idref = hpxml_bldg.ventilation_fans[1].id
+ if hpxml_file == 'base-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml'
+ hpxml_bldg.ventilation_fans[0].cfis_supplemental_fan_runs_with_air_handler_fan = true
+ end
end
# ---------------- #
diff --git a/workflow/hpxml_inputs.json b/workflow/hpxml_inputs.json
index f12654cfc0..3ed9121fbc 100644
--- a/workflow/hpxml_inputs.json
+++ b/workflow/hpxml_inputs.json
@@ -3215,6 +3215,9 @@
"parent_hpxml": "sample_files/base-mechvent-cfis.xml",
"mech_vent_fan_power": null
},
+ "sample_files/base-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml": {
+ "parent_hpxml": "sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml"
+ },
"sample_files/base-mechvent-cfis-supplemental-fan-supply.xml": {
"parent_hpxml": "sample_files/base-mechvent-cfis.xml",
"mech_vent_fan_power": null
diff --git a/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml b/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml
new file mode 100644
index 0000000000..50a3ddeae7
--- /dev/null
+++ b/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml
@@ -0,0 +1,577 @@
+
+
+
+ HPXML
+ tasks.rb
+ 2000-01-01T00:00:00-07:00
+ create
+
+
+
+
+ 60
+
+
+
+ Bills
+
+
+
+
+
+
+
+
+
+ CO
+
+
+
+ proposed workscope
+
+
+
+
+ suburban
+ stand-alone
+ no units above or below
+ 180
+
+ electricity
+ natural gas
+
+
+
+ single-family detached
+ 2.0
+ 1.0
+ 8.0
+ 3
+ 2
+ 2700.0
+ 21600.0
+
+
+
+
+ 2006
+ 5B
+
+
+
+ USA_CO_Denver.Intl.AP.725650_TMY3
+
+ USA_CO_Denver.Intl.AP.725650_TMY3.epw
+
+
+
+
+
+
+
+ 50.0
+
+ ACH
+ 3.0
+
+ 21600.0
+
+
+
+
+
+
+
+ false
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+ attic - unvented
+ 1509.3
+ asphalt or fiberglass shingles
+ 0.7
+ 0.92
+ 6.0
+
+
+ 2.3
+
+
+
+
+
+
+ outside
+ basement - conditioned
+ 115.6
+ wood siding
+ 0.7
+ 0.92
+
+
+ 23.0
+
+
+
+
+
+
+ outside
+ conditioned space
+
+
+
+ 1200.0
+ wood siding
+ 0.7
+ 0.92
+
+ gypsum board
+
+
+
+ 23.0
+
+
+
+
+ outside
+ attic - unvented
+ gable
+
+
+
+ 225.0
+ wood siding
+ 0.7
+ 0.92
+
+
+ 4.0
+
+
+
+
+
+
+ ground
+ basement - conditioned
+ 8.0
+ 1200.0
+ 8.0
+ 7.0
+
+ gypsum board
+
+
+
+
+ continuous - exterior
+ 8.9
+ 0.0
+ 8.0
+
+
+ continuous - interior
+ 0.0
+
+
+
+
+
+
+
+ attic - unvented
+ conditioned space
+ ceiling
+
+
+
+ 1350.0
+
+ gypsum board
+
+
+
+ 39.3
+
+
+
+
+
+
+ basement - conditioned
+ 1350.0
+ 4.0
+ 150.0
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+ 0.0
+ 0.0
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+ 108.0
+ 0
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 72.0
+ 90
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 108.0
+ 180
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 72.0
+ 270
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+
+
+
+ 40.0
+ 180
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ natural gas
+ 36000.0
+
+ AFUE
+ 0.92
+
+ 1.0
+
+
+
+
+ central air conditioner
+ electricity
+ 24000.0
+ single stage
+ 1.0
+
+ SEER
+ 13.0
+
+ 0.73
+
+
+
+
+ 68.0
+ 78.0
+
+
+
+
+
+ regular velocity
+
+ supply
+
+ CFM25
+ 75.0
+ to outside
+
+
+
+ return
+
+ CFM25
+ 25.0
+ to outside
+
+
+
+
+ supply
+ 4.0
+ attic - unvented
+ 150.0
+
+
+
+ return
+ 0.0
+ attic - unvented
+ 50.0
+
+
+
+
+
+
+
+
+
+ central fan integrated supply
+
+ supplemental fan
+
+
+ true
+
+
+ 330.0
+ 8.0
+ true
+
+
+
+
+ exhaust only
+ 120.0
+ true
+ 30.0
+
+
+
+
+
+
+ electricity
+ storage water heater
+ conditioned space
+ 40.0
+ 1.0
+ 18767.0
+ 0.95
+ 125.0
+
+
+
+
+
+ 50.0
+
+
+
+ 0.0
+
+
+
+
+ shower head
+ true
+
+
+
+ faucet
+ false
+
+
+
+
+
+
+ conditioned space
+ 1.21
+ 380.0
+ 0.12
+ 1.09
+ 27.0
+ 6.0
+ 3.2
+
+
+
+ conditioned space
+ electricity
+ 3.73
+ true
+ 150.0
+
+
+
+ conditioned space
+ 307.0
+ 12
+ 0.12
+ 1.09
+ 22.32
+ 4.0
+
+
+
+ conditioned space
+ 650.0
+
+
+
+ conditioned space
+ electricity
+ false
+
+
+
+ false
+
+
+
+
+
+ interior
+ 0.4
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.25
+
+
+
+
+
+
+ exterior
+ 0.4
+
+
+
+
+
+
+ exterior
+ 0.1
+
+
+
+
+
+
+ exterior
+ 0.25
+
+
+
+
+
+
+
+
+ TV other
+
+ kWh/year
+ 620.0
+
+
+
+
+ other
+
+ kWh/year
+ 2457.0
+
+
+ 0.855
+ 0.045
+
+
+
+
+
+
\ No newline at end of file
diff --git a/workflow/tests/base_results/results_simulations_bills.csv b/workflow/tests/base_results/results_simulations_bills.csv
index 31c586f6ed..95a14683c4 100644
--- a/workflow/tests/base_results/results_simulations_bills.csv
+++ b/workflow/tests/base_results/results_simulations_bills.csv
@@ -364,6 +364,7 @@ base-mechvent-cfis-dse.xml,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0
base-mechvent-cfis-evap-cooler-only-ducted.xml,1366.37,144.0,1222.37,0.0,1366.37,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-mechvent-cfis-no-additional-runtime.xml,1928.74,144.0,1312.33,0.0,1456.33,144.0,328.41,472.41,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-mechvent-cfis-no-outdoor-air-control.xml,2106.53,144.0,1377.18,0.0,1521.18,144.0,441.35,585.35,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
+base-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml,2006.02,144.0,1326.37,0.0,1470.37,144.0,391.65,535.65,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-mechvent-cfis-supplemental-fan-exhaust.xml,1985.8,144.0,1320.96,0.0,1464.96,144.0,376.84,520.84,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-mechvent-cfis-supplemental-fan-supply.xml,2002.27,144.0,1322.53,0.0,1466.53,144.0,391.74,535.74,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-mechvent-cfis.xml,2051.18,144.0,1367.98,0.0,1511.98,144.0,395.2,539.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
diff --git a/workflow/tests/base_results/results_simulations_energy.csv b/workflow/tests/base_results/results_simulations_energy.csv
index 294f10f282..8b9b020e31 100644
--- a/workflow/tests/base_results/results_simulations_energy.csv
+++ b/workflow/tests/base_results/results_simulations_energy.csv
@@ -364,6 +364,7 @@ base-mechvent-cfis-dse.xml,74.313,74.313,38.621,38.621,35.692,0.0,0.0,0.0,0.0,0.
base-mechvent-cfis-evap-cooler-only-ducted.xml,33.582,33.582,33.582,33.582,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.837,9.084,0.0,0.0,4.507,0.0,0.334,2.771,0.0,0.0,0.0,1.824,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-mechvent-cfis-no-additional-runtime.xml,67.426,67.426,36.054,36.054,31.372,0.0,0.0,0.0,0.0,0.0,0.0,0.778,0.0,0.0,4.455,0.669,9.014,0.0,0.0,4.507,0.0,0.334,0.0,0.0,0.0,0.0,2.072,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,31.372,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-mechvent-cfis-no-outdoor-air-control.xml,79.997,79.997,37.835,37.835,42.161,0.0,0.0,0.0,0.0,0.0,0.0,1.046,0.0,0.0,4.345,0.642,9.018,0.0,0.0,4.507,0.0,0.334,1.661,0.0,0.0,0.0,2.057,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,42.161,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
+base-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml,73.853,73.853,36.439,36.439,37.414,0.0,0.0,0.0,0.0,0.0,0.0,0.928,0.0,0.0,4.166,0.611,9.019,0.0,0.0,4.507,0.0,0.334,0.595,0.0,0.0,0.0,2.055,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,37.414,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-mechvent-cfis-supplemental-fan-exhaust.xml,72.29,72.29,36.291,36.291,35.999,0.0,0.0,0.0,0.0,0.0,0.0,0.893,0.0,0.0,4.174,0.613,9.019,0.0,0.0,4.507,0.0,0.334,0.471,0.0,0.0,0.0,2.055,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,35.999,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-mechvent-cfis-supplemental-fan-supply.xml,73.756,73.756,36.334,36.334,37.423,0.0,0.0,0.0,0.0,0.0,0.0,0.928,0.0,0.0,4.188,0.615,9.018,0.0,0.0,4.507,0.0,0.334,0.461,0.0,0.0,0.0,2.057,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,37.423,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
base-mechvent-cfis.xml,75.336,75.336,37.582,37.582,37.753,0.0,0.0,0.0,0.0,0.0,0.0,0.937,0.0,0.0,4.219,0.62,9.018,0.0,0.0,4.507,0.0,0.334,1.665,0.0,0.0,0.0,2.057,0.0,0.0,0.319,0.365,1.513,1.529,0.0,2.116,8.384,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,37.753,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
diff --git a/workflow/tests/base_results/results_simulations_hvac.csv b/workflow/tests/base_results/results_simulations_hvac.csv
index 3c3ada84e9..6b094ba7c0 100644
--- a/workflow/tests/base_results/results_simulations_hvac.csv
+++ b/workflow/tests/base_results/results_simulations_hvac.csv
@@ -364,6 +364,7 @@ base-mechvent-cfis-dse.xml,6.8,91.76,36000.0,24000.0,0.0,25282.0,0.0,7508.0,0.0,
base-mechvent-cfis-evap-cooler-only-ducted.xml,6.8,91.76,0.0,24000.0,0.0,25282.0,0.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,17555.0,2561.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
base-mechvent-cfis-no-additional-runtime.xml,6.8,91.76,36000.0,24000.0,0.0,33814.0,8531.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,21135.0,6140.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
base-mechvent-cfis-no-outdoor-air-control.xml,6.8,91.76,36000.0,24000.0,0.0,33814.0,8531.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,21135.0,6140.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
+base-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml,6.8,91.76,36000.0,24000.0,0.0,33814.0,8531.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,21135.0,6140.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
base-mechvent-cfis-supplemental-fan-exhaust.xml,6.8,91.76,36000.0,24000.0,0.0,33814.0,8531.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,21135.0,6140.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
base-mechvent-cfis-supplemental-fan-supply.xml,6.8,91.76,36000.0,24000.0,0.0,33814.0,8531.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,21135.0,6140.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
base-mechvent-cfis.xml,6.8,91.76,36000.0,24000.0,0.0,33814.0,8531.0,7508.0,0.0,575.0,6918.0,0.0,0.0,1738.0,2171.0,0.0,6372.0,0.0,21135.0,6140.0,7037.0,0.0,207.0,448.0,0.0,0.0,0.0,2293.0,0.0,1690.0,3320.0,0.0,0.0,-995.0,0.0,0.0,-1795.0,800.0
diff --git a/workflow/tests/base_results/results_simulations_loads.csv b/workflow/tests/base_results/results_simulations_loads.csv
index ca5e0cc750..ca64888e55 100644
--- a/workflow/tests/base_results/results_simulations_loads.csv
+++ b/workflow/tests/base_results/results_simulations_loads.csv
@@ -364,6 +364,7 @@ base-mechvent-cfis-dse.xml,26.959,0.0,10.124,9.071,0.619,0.0,0.0,0.0,4.221,3.977
base-mechvent-cfis-evap-cooler-only-ducted.xml,0.0,0.0,10.579,9.071,0.69,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.389,0.053,0.019,2.824,0.09,0.196,9.632,0.0,0.0,0.0,-6.055,-0.263,-0.14,-3.152,-1.452,0.0,0.66,6.271,1.619
base-mechvent-cfis-no-additional-runtime.xml,29.643,0.0,13.898,9.071,0.615,0.0,0.0,0.0,3.742,3.883,0.545,7.571,0.682,10.761,-13.574,0.0,0.0,0.0,8.367,-0.116,2.979,0.0,8.67,0.0,6.913,-8.475,-2.662,0.0,0.025,-0.187,-0.014,2.828,0.035,-0.631,10.839,0.0,0.0,0.0,-6.136,-0.112,-0.815,-3.874,-0.103,0.0,3.21,7.106,1.845
base-mechvent-cfis-no-outdoor-air-control.xml,39.835,0.0,13.324,9.071,0.62,0.0,0.0,0.0,3.733,3.996,0.561,7.365,0.703,11.202,-14.382,0.0,0.0,0.0,8.178,-0.265,1.538,0.0,18.718,0.0,10.039,-9.041,-2.826,0.0,0.291,0.02,0.015,2.91,0.08,0.105,10.031,0.0,0.0,0.0,-5.926,-0.261,-0.154,-3.258,-1.454,0.0,2.826,6.53,1.681
+base-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml,35.354,0.0,12.647,9.071,0.62,0.0,0.0,0.0,3.813,3.994,0.56,7.388,0.7,11.183,-14.518,0.0,0.0,0.0,8.31,-0.217,2.992,0.0,14.725,0.0,8.074,-9.123,-2.852,0.0,0.267,0.032,0.016,2.977,0.081,0.13,9.895,0.0,0.0,0.0,-5.742,-0.214,-0.157,-3.187,-2.5,0.0,3.027,6.446,1.655
base-mechvent-cfis-supplemental-fan-exhaust.xml,34.018,0.0,12.692,9.071,0.62,0.0,0.0,0.0,3.826,3.994,0.56,7.388,0.7,11.183,-14.518,0.0,0.0,0.0,8.309,-0.217,2.58,0.0,14.066,0.0,7.796,-9.123,-2.852,0.0,0.267,0.032,0.016,2.977,0.081,0.13,9.895,0.0,0.0,0.0,-5.743,-0.214,-0.17,-3.19,-2.437,0.0,3.027,6.446,1.655
base-mechvent-cfis-supplemental-fan-supply.xml,35.363,0.0,12.728,9.071,0.62,0.0,0.0,0.0,3.805,3.988,0.56,7.403,0.702,11.181,-14.404,0.0,0.0,0.0,8.289,-0.227,1.759,0.0,15.823,0.0,8.069,-9.066,-2.834,0.0,0.248,0.014,0.014,2.956,0.079,0.091,10.009,0.0,0.0,0.0,-5.811,-0.223,-0.138,-3.248,-2.393,0.0,3.046,6.504,1.673
base-mechvent-cfis.xml,35.676,0.0,12.838,9.071,0.619,0.0,0.0,0.0,3.77,3.998,0.561,7.37,0.704,11.207,-14.382,0.0,0.0,0.0,8.185,-0.265,1.755,0.0,15.196,0.0,9.133,-9.041,-2.826,0.0,0.296,0.02,0.015,2.911,0.08,0.105,10.031,0.0,0.0,0.0,-5.925,-0.261,-0.145,-3.258,-1.83,0.0,2.701,6.53,1.681
diff --git a/workflow/tests/base_results/results_simulations_misc.csv b/workflow/tests/base_results/results_simulations_misc.csv
index 3f3e3f4ef5..69c01a2007 100644
--- a/workflow/tests/base_results/results_simulations_misc.csv
+++ b/workflow/tests/base_results/results_simulations_misc.csv
@@ -364,6 +364,7 @@ base-mechvent-cfis-dse.xml,0.0,0.0,1354.7,998.0,11171.5,2563.5,2085.1,2926.2,292
base-mechvent-cfis-evap-cooler-only-ducted.xml,0.0,0.0,1354.7,998.0,11171.6,2563.5,2018.6,2306.5,2306.5,0.0,16.216,0.0
base-mechvent-cfis-no-additional-runtime.xml,0.0,0.0,1354.7,998.0,11171.6,2563.5,2135.2,4049.8,4049.8,29.918,20.857,0.0
base-mechvent-cfis-no-outdoor-air-control.xml,49.0,5.0,1354.7,998.0,11171.5,2563.5,2230.6,3773.0,3773.0,37.835,21.601,0.0
+base-mechvent-cfis-supplemental-fan-exhaust-synchronized.xml,0.0,0.0,1354.7,998.0,11171.5,2563.5,2150.8,3723.0,3723.0,30.62,20.864,0.0
base-mechvent-cfis-supplemental-fan-exhaust.xml,0.0,0.0,1354.7,998.0,11171.5,2563.5,2135.7,3696.2,3696.2,29.918,20.705,0.0
base-mechvent-cfis-supplemental-fan-supply.xml,0.0,0.0,1354.7,998.0,11171.5,2563.5,2135.6,3697.7,3697.7,29.918,20.72,0.0
base-mechvent-cfis.xml,0.0,0.0,1354.7,998.0,11171.5,2563.5,2127.6,3727.2,3727.2,29.917,20.735,0.0