-
Notifications
You must be signed in to change notification settings - Fork 23
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
Allow Modeling Two Speed & Var Speed Geothermal Heat Pumps #1878
base: master
Are you sure you want to change the base?
Changes from 1 commit
100e02a
6c0629b
f41d4f1
74e100c
0788320
346d8c9
2182a8f
cba4f31
4615f89
c883e62
ed642d8
58e8142
7facd88
b1512e2
d1d0cc8
ab22fcc
1010b16
7cabcbc
302d4a8
ec12831
f7b74a3
00aa08d
130e448
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -594,34 +594,92 @@ def self.apply_ground_to_air_heat_pump(model, runner, weather, heat_pump, hvac_s | |
geothermal_loop.num_bore_holes *= unit_multiplier | ||
|
||
# Cooling Coil | ||
clg_total_cap_curve = Model.add_curve_quad_linear( | ||
model, | ||
name: "#{obj_name} clg total cap curve", | ||
coeff: hp_ap.cool_cap_curve_spec[0] | ||
) | ||
clg_sens_cap_curve = Model.add_curve_quint_linear( | ||
model, | ||
name: "#{obj_name} clg sens cap curve", | ||
coeff: hp_ap.cool_sh_curve_spec[0] | ||
) | ||
clg_power_curve = Model.add_curve_quad_linear( | ||
model, | ||
name: "#{obj_name} clg power curve", | ||
coeff: hp_ap.cool_power_curve_spec[0] | ||
) | ||
clg_coil = OpenStudio::Model::CoilCoolingWaterToAirHeatPumpEquationFit.new(model, clg_total_cap_curve, clg_sens_cap_curve, clg_power_curve) | ||
clg_coil.setName(obj_name + ' clg coil') | ||
clg_coil.setRatedCoolingCoefficientofPerformance(hp_ap.cool_rated_cops[0]) | ||
clg_coil.setNominalTimeforCondensateRemovaltoBegin(1000) | ||
clg_coil.setRatioofInitialMoistureEvaporationRateandSteadyStateLatentCapacity(1.5) | ||
clg_coil.setRatedAirFlowRate(UnitConversions.convert(clg_cfm_rated, 'cfm', 'm^3/s')) | ||
clg_coil.setRatedWaterFlowRate(UnitConversions.convert(geothermal_loop.loop_flow, 'gal/min', 'm^3/s')) | ||
clg_coil.setRatedEnteringWaterTemperature(UnitConversions.convert(80, 'F', 'C')) | ||
clg_coil.setRatedEnteringAirDryBulbTemperature(UnitConversions.convert(80, 'F', 'C')) | ||
clg_coil.setRatedEnteringAirWetBulbTemperature(UnitConversions.convert(67, 'F', 'C')) | ||
clg_coil.setRatedTotalCoolingCapacity(UnitConversions.convert(heat_pump.cooling_capacity, 'Btu/hr', 'W')) | ||
clg_coil.setRatedSensibleCoolingCapacity(UnitConversions.convert(hp_ap.cooling_capacity_sensible, 'Btu/hr', 'W')) | ||
clg_coil.additionalProperties.setFeature('HPXML_ID', heat_pump.id) # Used by reporting measure | ||
if heat_pump.compressor_type = HPXML::HVACCompressorTypeSingleStage | ||
clg_total_cap_curve = Model.add_curve_quad_linear( | ||
model, | ||
name: "#{obj_name} clg total cap curve", | ||
coeff: hp_ap.cool_cap_curve_spec[0] | ||
) | ||
clg_sens_cap_curve = Model.add_curve_quint_linear( | ||
model, | ||
name: "#{obj_name} clg sens cap curve", | ||
coeff: hp_ap.cool_sh_curve_spec[0] | ||
) | ||
clg_power_curve = Model.add_curve_quad_linear( | ||
model, | ||
name: "#{obj_name} clg power curve", | ||
coeff: hp_ap.cool_power_curve_spec[0] | ||
) | ||
clg_coil = OpenStudio::Model::CoilCoolingWaterToAirHeatPumpEquationFit.new(model, clg_total_cap_curve, clg_sens_cap_curve, clg_power_curve) | ||
clg_coil.setRatedCoolingCoefficientofPerformance(hp_ap.cool_rated_cops[0]) | ||
clg_coil.setNominalTimeforCondensateRemovaltoBegin(1000) | ||
clg_coil.setRatioofInitialMoistureEvaporationRateandSteadyStateLatentCapacity(1.5) | ||
clg_coil.setRatedAirFlowRate(UnitConversions.convert(clg_cfm_rated, 'cfm', 'm^3/s')) | ||
clg_coil.setRatedWaterFlowRate(UnitConversions.convert(geothermal_loop.loop_flow, 'gal/min', 'm^3/s')) | ||
clg_coil.setRatedEnteringWaterTemperature(UnitConversions.convert(80, 'F', 'C')) | ||
clg_coil.setRatedEnteringAirDryBulbTemperature(UnitConversions.convert(80, 'F', 'C')) | ||
clg_coil.setRatedEnteringAirWetBulbTemperature(UnitConversions.convert(67, 'F', 'C')) | ||
clg_coil.setRatedTotalCoolingCapacity(UnitConversions.convert(heat_pump.cooling_capacity, 'Btu/hr', 'W')) | ||
clg_coil.setRatedSensibleCoolingCapacity(UnitConversions.convert(hp_ap.cooling_capacity_sensible, 'Btu/hr', 'W')) | ||
else | ||
num_speeds = clg_ap.cool_capacity_ratios.size | ||
# TODO: Curve placeholder | ||
plf_fplr_curve = Model.add_curve_quadratic( | ||
model, | ||
name: "Cool-PLF-fPLR#{i + 1}", | ||
coeff: [1, 0, 0], | ||
min_x: 0, max_x: 1, min_y: 0.7, max_y: 1 | ||
) | ||
clg_coil = OpenStudio::Model::CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFit.new(model, plf_fplr_curve) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Be sure to audit the code for references to e.g. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We talked about desuperheaters, the variable speed coil type is not yet supported by E+ to be connected with desuperheater, so we may have to temporarily ignore that feature (and document that only single speed gshp is currently supported). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @shorowit @afontani The E+ IO freeze for March release is 2/12, is it still possible to add this capability to Coil:Cooling:WaterToAirHeatPump:VariableSpeedEquationFit for the upcoming release? There're 12 open PR for the E+ team to review before 2/12, so I'm not sure if it's possible to add this one and get someone's review. Also the date is overlapping with the two speed/var speed tasks (plan to be wrapped up before end of Feb). Is it fine if we prioritize the two/var speed system work, then if we still get some space we can add the capability to the E+ Oct release? We can explicitly document that the 2/var speed is not currently supporting desuperheater, and if user still needs to model it, the workaround will be specifying a single speed system (instead of defaulting based on efficiency, or specifying it as two/var speed systems) with desuperheater, which will be handled in the same way as before. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It seems like it should be easy to review and there are many possible reviewers, I wouldn't worry about that. As far as I'm aware, you are allowed to just make the IDD change before the IO freeze and complete the implementation later. So that could give you another 4-6 weeks? You could confirm by asking Edwin or Mike. Documenting that we are introducing a breaking change is not a great solution. For a downstream software tool (like REM), it could be a lot of work -- adding a new compressor type input in their user interface for GSHPs, adding logic when there's a desuperheater, etc. And their user would get different heating/cooling results based on whether there is a desuperheater or not? That's confusing. In my opinion, either we make it a non-breaking change or we defer this for a subsequent OS-HPXML release. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
The IDD change before IO freeze and implement later sounds interesting, I'm fine with that, assuming we'll wrap up most of the 2/var speed system OS-HPXML changes before that. Do you mean that it's better to wait for the E+ release and this PR is non-breaking then we can merge it? @afontani Is it fine to do so? The E+ release is end of March, so probably the merge will be early April, but we can still have most functions being implemented so that ResStock can test the batch runs based on this branch. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Another thought to make it non-breaking to merge early. So what about if we exclude the efficiency-based defaulting for now, and always default the compressor type to be single speed, and when the E+ capability is added then we add the efficiency-based defaulting approach? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That seems like a great idea/compromise to me! |
||
for i in 0..(num_speeds - 1) | ||
# TODO: Curve placeholder | ||
cap_ft_curve = Model.add_curve_biquadratic( | ||
model, | ||
name: "Cool-CAP-fT#{i + 1}", | ||
coeff: [1, 0, 0, 0, 0, 0] | ||
) | ||
cap_faf_curve = Model.add_curve_quadratic( | ||
model, | ||
name: "Cool-CAP-fAF#{i + 1}", | ||
coeff: [1, 0, 0], | ||
min_x: 0, max_x: 2, min_y: 0, max_y: 2 | ||
) | ||
cap_fwf_curve = Model.add_curve_quadratic( | ||
model, | ||
name: "Cool-CAP-fWF#{i + 1}", | ||
coeff: [1, 0, 0], | ||
min_x: 0, max_x: 2, min_y: 0, max_y: 2 | ||
) | ||
eir_ft_curve = Model.add_curve_biquadratic( | ||
model, | ||
name: "Cool-EIR-fT#{i + 1}", | ||
coeff: [1, 0, 0, 0, 0, 0] | ||
) | ||
eir_faf_curve = Model.add_curve_quadratic( | ||
model, | ||
name: "Cool-EIR-fAF#{i + 1}", | ||
coeff: [1, 0, 0], | ||
min_x: 0, max_x: 2, min_y: 0, max_y: 2 | ||
) | ||
eir_fwf_curve = Model.add_curve_quadratic( | ||
model, | ||
name: "Cool-EIR-fWF#{i + 1}", | ||
coeff: [1, 0, 0], | ||
min_x: 0, max_x: 2, min_y: 0, max_y: 2 | ||
) | ||
# Recoverable heat modifier as a function of indoor wet-bulb and water entering temperatures. | ||
waste_heat_ft = Model.add_curve_biquadratic( | ||
model, | ||
name: "WastHeat-FT#{i + 1}", | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "WasteHeat" (I think there's a typo, missing the "e") |
||
coeff: [1, 0, 0, 0, 0, 0] | ||
) | ||
speed = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model, cap_ft_curve, cap_faf_curve, cap_fwf_curve, eir_ft_curve, eir_faf_curve, eir_fwf_curve, waste_heat_ft) | ||
# TODO: Add speed property inputs | ||
clg_coil.addSpeed(speed) | ||
# TODO: Add coil inputs | ||
end | ||
clg_coil.additionalProperties.setFeature('HPXML_ID', heat_pump.id) # Used by reporting measure | ||
end | ||
|
||
# Heating Coil | ||
htg_cap_curve = Model.add_curve_quad_linear( | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Need to update the argument description for
heat_pump_cooling_compressor_type
to include ground-to-air systems.