Skip to content

Commit

Permalink
Merge pull request #1674 from NREL/defrost_improvements
Browse files Browse the repository at this point in the history
Defrost Model Improvements
  • Loading branch information
shorowit committed May 18, 2024
2 parents 6d5e02a + 512a071 commit d22f6ef
Show file tree
Hide file tree
Showing 30 changed files with 3,266 additions and 51 deletions.
13 changes: 13 additions & 0 deletions BuildResidentialHPXML/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,19 @@ Affects the transient calculation of indoor air temperatures. If not provided, t

<br/>

**Simulation Control: Defrost Model Type**

Research feature to select the type of defrost model. Use standard for default E+ defrost setting. Use advanced for an improved model that better accounts for load and energy use during defrost; using advanced may impact simulation runtime. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-simulation-control'>HPXML Simulation Control</a>) is used.

- **Name:** ``simulation_control_defrost_model_type``
- **Type:** ``Choice``

- **Required:** ``false``

- **Choices:** `standard`, `advanced`

<br/>

**Site: Type**

The type of site. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-site'>HPXML Site</a>) is used.
Expand Down
15 changes: 15 additions & 0 deletions BuildResidentialHPXML/measure.rb
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,14 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
arg.setDescription("Affects the transient calculation of indoor air temperatures. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-simulation-control'>HPXML Simulation Control</a>) is used.")
args << arg

defrost_model_type_choices = OpenStudio::StringVector.new
defrost_model_type_choices << HPXML::AdvancedResearchDefrostModelTypeStandard
defrost_model_type_choices << HPXML::AdvancedResearchDefrostModelTypeAdvanced
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('simulation_control_defrost_model_type', defrost_model_type_choices, false)
arg.setDisplayName('Simulation Control: Defrost Model Type')
arg.setDescription("Research feature to select the type of defrost model. Use #{HPXML::AdvancedResearchDefrostModelTypeStandard} for default E+ defrost setting. Use #{HPXML::AdvancedResearchDefrostModelTypeAdvanced} for an improved model that better accounts for load and energy use during defrost; using #{HPXML::AdvancedResearchDefrostModelTypeAdvanced} may impact simulation runtime. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-simulation-control'>HPXML Simulation Control</a>) is used.")
args << arg

site_type_choices = OpenStudio::StringVector.new
site_type_choices << HPXML::SiteTypeSuburban
site_type_choices << HPXML::SiteTypeUrban
Expand Down Expand Up @@ -4022,6 +4030,13 @@ def self.set_header(runner, hpxml, args)
hpxml.header.temperature_capacitance_multiplier = args[:simulation_control_temperature_capacitance_multiplier]
end

if not args[:simulation_control_defrost_model_type].nil?
if (not hpxml.header.defrost_model_type.nil?) && (hpxml.header.defrost_model_type != args[:simulation_control_defrost_model_type])
errors << "'Simulation Control: Defrost Model Type' cannot vary across dwelling units."
end
hpxml.header.defrost_model_type = args[:simulation_control_defrost_model_type]
end

if not args[:emissions_scenario_names].nil?
emissions_scenario_names = args[:emissions_scenario_names].split(',').map(&:strip)
emissions_types = args[:emissions_types].split(',').map(&:strip)
Expand Down
26 changes: 22 additions & 4 deletions BuildResidentialHPXML/measure.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
<schema_version>3.1</schema_version>
<name>build_residential_hpxml</name>
<uid>a13a8983-2b01-4930-8af2-42030b6e4233</uid>
<version_id>89391782-f408-4b0e-9801-b5f67d0f8241</version_id>
<version_modified>2024-05-15T20:26:57Z</version_modified>
<version_id>d6c720db-f7cf-4aff-b36e-a6e133c6ddc9</version_id>
<version_modified>2024-05-17T22:42:28Z</version_modified>
<xml_checksum>2C38F48B</xml_checksum>
<class_name>BuildResidentialHPXML</class_name>
<display_name>HPXML Builder</display_name>
Expand Down Expand Up @@ -153,6 +153,24 @@
<required>false</required>
<model_dependent>false</model_dependent>
</argument>
<argument>
<name>simulation_control_defrost_model_type</name>
<display_name>Simulation Control: Defrost Model Type</display_name>
<description>Research feature to select the type of defrost model. Use standard for default E+ defrost setting. Use advanced for an improved model that better accounts for load and energy use during defrost; using advanced may impact simulation runtime. If not provided, the OS-HPXML default (see &lt;a href='https://openstudio-hpxml.readthedocs.io/en/v1.7.0/workflow_inputs.html#hpxml-simulation-control'&gt;HPXML Simulation Control&lt;/a&gt;) is used.</description>
<type>Choice</type>
<required>false</required>
<model_dependent>false</model_dependent>
<choices>
<choice>
<value>standard</value>
<display_name>standard</display_name>
</choice>
<choice>
<value>advanced</value>
<display_name>advanced</display_name>
</choice>
</choices>
</argument>
<argument>
<name>site_type</name>
<display_name>Site: Type</display_name>
Expand Down Expand Up @@ -7325,7 +7343,7 @@
<filename>README.md</filename>
<filetype>md</filetype>
<usage_type>readme</usage_type>
<checksum>54A95546</checksum>
<checksum>65DD9340</checksum>
</file>
<file>
<filename>README.md.erb</filename>
Expand All @@ -7342,7 +7360,7 @@
<filename>measure.rb</filename>
<filetype>rb</filetype>
<usage_type>script</usage_type>
<checksum>8BEED0CA</checksum>
<checksum>4D94208D</checksum>
</file>
<file>
<filename>geometry.rb</filename>
Expand Down
5 changes: 4 additions & 1 deletion Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ __New Features__
- Allows optional ground diffusivity input.
- Updates to using G-Functions from the [G-Function Library for Modeling Vertical Bore Ground Heat Exchanger](https://gdr.openei.org/submissions/1325).
- Updated heating/cooling performance curves to reflect newer equipment.
- Adds geothermal loop outputs (number/length of boreholes) to annual results output file.
- Allows optional `Ducts/DuctShape` and `Ducts/DuctFractionRectangular` inputs, which affect duct effective R-value used for modeling.
- Allows optional `HeatingAutosizingFactor`, `CoolingAutosizingFactor`, `BackupHeatingAutosizingFactor` inputs to scale HVAC capacities for autosized equipment.
- Allows optional `HeatingAutosizingLimit`, `CoolingAutosizingLimit`, `BackupHeatingAutosizingLimit` inputs to set maximum HVAC capacities ceiling for autosized equipment.
Expand Down Expand Up @@ -61,7 +62,6 @@ __New Features__
- Adds net energy and net electricity timeseries output columns even when there is no PV or generator.
- Adds more error-checking for inappropriate inputs (e.g., HVAC SHR=0 or clothes washer IMEF=0).
- Allow alternative label energy use (W) input for ceiling fans.
- Adds geothermal loop outputs (number/length of boreholes) to annual results output file.
- Updates to run_simulation.rb script:
- Allows requesting timeseries outputs with different frequencies (e.g., `--hourly enduses --monthly temperatures`).
- **Breaking change**: Deprecates `--add-timeseries-output-variable`; EnergyPlus output variables can now be requested like other timeseries categories (using e.g. `--hourly 'Zone People Occupant Count'`).
Expand All @@ -71,6 +71,9 @@ __New Features__
- Other plug load schedules now use Other schedule fractions per ANSI/RESNET/ICC 301-2022 Addendum C.
- TV plug load schedules now use TV schedule fractions from the American Time Use Survey and monthly multipliers from the 2010 Building America Analysis Spreadsheets.
- Ceiling fan schedules now use ceiling fan schedule fractions and monthly multipliers from ANSI/RESNET/ICC 301-2022 Addendum C.
- Advanced research features:
- **Breaking change**: Replaces `SimulationControl/TemperatureCapacitanceMultiplier` with `SimulationControl/AdvancedResearchFeatures/TemperatureCapacitanceMultiplier`.
- Allows an optional boolean input `SimulationControl/AdvancedResearchFeatures/DefrostModelType` for heat pump advanced defrost model.

__Bugfixes__
- Fixes error if using AllowIncreasedFixedCapacities=true w/ HP detailed performance data.
Expand Down
9 changes: 6 additions & 3 deletions HPXMLtoOpenStudio/measure.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1629,7 +1629,8 @@ def add_cooling_system(model, runner, weather, spaces, airloop_map)

airloop_map[sys_id] = HVAC.apply_air_source_hvac_systems(model, runner, cooling_system, heating_system, sequential_cool_load_fracs, sequential_heat_load_fracs,
weather.data.AnnualMaxDrybulb, weather.data.AnnualMinDrybulb,
conditioned_zone, @hvac_unavailable_periods, @schedules_file, @hpxml_bldg)
conditioned_zone, @hvac_unavailable_periods, @schedules_file, @hpxml_bldg,
@hpxml_header)

elsif [HPXML::HVACTypeEvaporativeCooler].include? cooling_system.cooling_system_type

Expand Down Expand Up @@ -1674,7 +1675,8 @@ def add_heating_system(runner, model, weather, spaces, airloop_map)

airloop_map[sys_id] = HVAC.apply_air_source_hvac_systems(model, runner, nil, heating_system, [0], sequential_heat_load_fracs,
weather.data.AnnualMaxDrybulb, weather.data.AnnualMinDrybulb,
conditioned_zone, @hvac_unavailable_periods, @schedules_file, @hpxml_bldg)
conditioned_zone, @hvac_unavailable_periods, @schedules_file, @hpxml_bldg,
@hpxml_header)

elsif [HPXML::HVACTypeBoiler].include? heating_system.heating_system_type

Expand Down Expand Up @@ -1737,7 +1739,8 @@ def add_heat_pump(runner, model, weather, spaces, airloop_map)

airloop_map[sys_id] = HVAC.apply_air_source_hvac_systems(model, runner, heat_pump, heat_pump, sequential_cool_load_fracs, sequential_heat_load_fracs,
weather.data.AnnualMaxDrybulb, weather.data.AnnualMinDrybulb,
conditioned_zone, @hvac_unavailable_periods, @schedules_file, @hpxml_bldg)
conditioned_zone, @hvac_unavailable_periods, @schedules_file, @hpxml_bldg,
@hpxml_header)
elsif [HPXML::HVACTypeHeatPumpGroundToAir].include? heat_pump.heat_pump_type

airloop_map[sys_id] = HVAC.apply_ground_to_air_heat_pump(model, runner, weather, heat_pump,
Expand Down
18 changes: 9 additions & 9 deletions HPXMLtoOpenStudio/measure.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
<schema_version>3.1</schema_version>
<name>hpxm_lto_openstudio</name>
<uid>b1543b30-9465-45ff-ba04-1d1f85e763bc</uid>
<version_id>f36ca44a-aed9-492e-b937-3a607152cf54</version_id>
<version_modified>2024-05-17T19:57:43Z</version_modified>
<version_id>235ba31f-08b7-42da-9524-674d6b212611</version_id>
<version_modified>2024-05-18T14:58:34Z</version_modified>
<xml_checksum>D8922A73</xml_checksum>
<class_name>HPXMLtoOpenStudio</class_name>
<display_name>HPXML to OpenStudio Translator</display_name>
Expand Down Expand Up @@ -183,7 +183,7 @@
<filename>measure.rb</filename>
<filetype>rb</filetype>
<usage_type>script</usage_type>
<checksum>59D5267D</checksum>
<checksum>4D2BAEDD</checksum>
</file>
<file>
<filename>airflow.rb</filename>
Expand All @@ -201,7 +201,7 @@
<filename>constants.rb</filename>
<filetype>rb</filetype>
<usage_type>resource</usage_type>
<checksum>461EDD72</checksum>
<checksum>7B2EC023</checksum>
</file>
<file>
<filename>constructions.rb</filename>
Expand Down Expand Up @@ -345,13 +345,13 @@
<filename>hpxml.rb</filename>
<filetype>rb</filetype>
<usage_type>resource</usage_type>
<checksum>6812FFA1</checksum>
<checksum>65FDCD3D</checksum>
</file>
<file>
<filename>hpxml_defaults.rb</filename>
<filetype>rb</filetype>
<usage_type>resource</usage_type>
<checksum>963F5566</checksum>
<checksum>DCEA4986</checksum>
</file>
<file>
<filename>hpxml_schema/HPXML.xsd</filename>
Expand All @@ -369,7 +369,7 @@
<filename>hpxml_schematron/EPvalidator.xml</filename>
<filetype>xml</filetype>
<usage_type>resource</usage_type>
<checksum>A438D5D8</checksum>
<checksum>960E3924</checksum>
</file>
<file>
<filename>hpxml_schematron/iso-schematron.xsd</filename>
Expand All @@ -381,7 +381,7 @@
<filename>hvac.rb</filename>
<filetype>rb</filetype>
<usage_type>resource</usage_type>
<checksum>5C9FA161</checksum>
<checksum>0370F183</checksum>
</file>
<file>
<filename>hvac_sizing.rb</filename>
Expand Down Expand Up @@ -663,7 +663,7 @@
<filename>test_hvac.rb</filename>
<filetype>rb</filetype>
<usage_type>test</usage_type>
<checksum>1F2A5548</checksum>
<checksum>8CDA3FA3</checksum>
</file>
<file>
<filename>test_hvac_sizing.rb</filename>
Expand Down
4 changes: 4 additions & 0 deletions HPXMLtoOpenStudio/resources/constants.rb
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,10 @@ def self.ObjectNamePTAC
return 'packaged terminal air conditioner'
end

def self.ObjectNameBackupSuppHeat
return 'back up supp heat'
end

def self.ObjectNameMiscGrill
return 'misc grill'
end
Expand Down
16 changes: 12 additions & 4 deletions HPXMLtoOpenStudio/resources/hpxml.rb
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ class HPXML < Object
# FUTURE: Move some of these to within child classes (e.g., HPXML::Attic class)
AddressTypeMailing = 'mailing'
AddressTypeStreet = 'street'
AdvancedResearchDefrostModelTypeStandard = 'standard'
AdvancedResearchDefrostModelTypeAdvanced = 'advanced'
AirTypeFanCoil = 'fan coil'
AirTypeGravity = 'gravity'
AirTypeHighVelocity = 'high velocity'
Expand Down Expand Up @@ -775,7 +777,8 @@ def initialize(hpxml_object, *args, **kwargs)
:software_program_version, :apply_ashrae140_assumptions, :temperature_capacitance_multiplier, :timestep,
:sim_begin_month, :sim_begin_day, :sim_end_month, :sim_end_day, :sim_calendar_year,
:eri_calculation_version, :co2index_calculation_version, :energystar_calculation_version,
:iecc_eri_calculation_version, :zerh_calculation_version, :whole_sfa_or_mf_building_sim]
:iecc_eri_calculation_version, :zerh_calculation_version, :whole_sfa_or_mf_building_sim,
:defrost_model_type]
attr_accessor(*ATTRS)
attr_reader(:emissions_scenarios)
attr_reader(:utility_bill_scenarios)
Expand Down Expand Up @@ -835,7 +838,7 @@ def to_doc(doc)
calculation = XMLHelper.add_element(extension, element_name)
XMLHelper.add_element(calculation, 'Version', calculation_version, :string)
end
if (not @timestep.nil?) || (not @sim_begin_month.nil?) || (not @sim_begin_day.nil?) || (not @sim_end_month.nil?) || (not @sim_end_day.nil?) || (not @temperature_capacitance_multiplier.nil?)
if (not @timestep.nil?) || (not @sim_begin_month.nil?) || (not @sim_begin_day.nil?) || (not @sim_end_month.nil?) || (not @sim_end_day.nil?) || (not @temperature_capacitance_multiplier.nil?) || (not @defrost_model_type.nil?)
extension = XMLHelper.create_elements_as_needed(software_info, ['extension'])
simulation_control = XMLHelper.add_element(extension, 'SimulationControl')
XMLHelper.add_element(simulation_control, 'Timestep', @timestep, :integer, @timestep_isdefaulted) unless @timestep.nil?
Expand All @@ -844,7 +847,11 @@ def to_doc(doc)
XMLHelper.add_element(simulation_control, 'EndMonth', @sim_end_month, :integer, @sim_end_month_isdefaulted) unless @sim_end_month.nil?
XMLHelper.add_element(simulation_control, 'EndDayOfMonth', @sim_end_day, :integer, @sim_end_day_isdefaulted) unless @sim_end_day.nil?
XMLHelper.add_element(simulation_control, 'CalendarYear', @sim_calendar_year, :integer, @sim_calendar_year_isdefaulted) unless @sim_calendar_year.nil?
XMLHelper.add_element(simulation_control, 'TemperatureCapacitanceMultiplier', @temperature_capacitance_multiplier, :float, @temperature_capacitance_multiplier_isdefaulted) unless @temperature_capacitance_multiplier.nil?
if (not @defrost_model_type.nil?) || (not @temperature_capacitance_multiplier.nil?)
advanced_research_features = XMLHelper.create_elements_as_needed(simulation_control, ['AdvancedResearchFeatures'])
XMLHelper.add_element(advanced_research_features, 'TemperatureCapacitanceMultiplier', @temperature_capacitance_multiplier, :float, @temperature_capacitance_multiplier_isdefaulted) unless @temperature_capacitance_multiplier.nil?
XMLHelper.add_element(advanced_research_features, 'DefrostModelType', @defrost_model_type, :string, @defrost_model_type_isdefaulted) unless @defrost_model_type.nil?
end
end
@emissions_scenarios.to_doc(software_info)
@utility_bill_scenarios.to_doc(software_info)
Expand All @@ -871,7 +878,8 @@ def from_doc(hpxml)
@sim_end_month = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndMonth', :integer)
@sim_end_day = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndDayOfMonth', :integer)
@sim_calendar_year = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/CalendarYear', :integer)
@temperature_capacitance_multiplier = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/TemperatureCapacitanceMultiplier', :float)
@temperature_capacitance_multiplier = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/AdvancedResearchFeatures/TemperatureCapacitanceMultiplier', :float)
@defrost_model_type = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/AdvancedResearchFeatures/DefrostModelType', :string)
@apply_ashrae140_assumptions = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ApplyASHRAE140Assumptions', :boolean)
@whole_sfa_or_mf_building_sim = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/WholeSFAorMFBuildingSimulation', :boolean)
@emissions_scenarios.from_doc(XMLHelper.get_element(hpxml, 'SoftwareInfo'))
Expand Down
9 changes: 7 additions & 2 deletions HPXMLtoOpenStudio/resources/hpxml_defaults.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def self.apply(runner, hpxml, hpxml_bldg, eri_version, weather, epw_file: nil, s

add_zones_spaces_if_needed(hpxml, hpxml_bldg, cfa)

apply_header(hpxml.header, epw_file)
apply_header(hpxml.header, epw_file, hpxml_bldg)
apply_building(hpxml_bldg, epw_file)
apply_emissions_scenarios(hpxml.header, has_fuel)
apply_utility_bill_scenarios(runner, hpxml.header, hpxml_bldg, has_fuel)
Expand Down Expand Up @@ -134,7 +134,7 @@ def self.add_zones_spaces_if_needed(hpxml, hpxml_bldg, cfa)
end
end

def self.apply_header(hpxml_header, epw_file)
def self.apply_header(hpxml_header, epw_file, hpxml_bldg)
if hpxml_header.timestep.nil?
hpxml_header.timestep = 60
hpxml_header.timestep_isdefaulted = true
Expand Down Expand Up @@ -173,6 +173,11 @@ def self.apply_header(hpxml_header, epw_file)
hpxml_header.temperature_capacitance_multiplier_isdefaulted = true
end

if hpxml_header.defrost_model_type.nil? && (hpxml_bldg.heat_pumps.any? { |hp| [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpMiniSplit, HPXML::HVACTypeHeatPumpRoom, HPXML::HVACTypeHeatPumpPTHP].include? hp.heat_pump_type })
hpxml_header.defrost_model_type = HPXML::AdvancedResearchDefrostModelTypeStandard
hpxml_header.defrost_model_type_isdefaulted = true
end

hpxml_header.unavailable_periods.each do |unavailable_period|
if unavailable_period.begin_hour.nil?
unavailable_period.begin_hour = 0
Expand Down

0 comments on commit d22f6ef

Please sign in to comment.