openstudio-standards 0.2.6 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/DEER_ECC_DXEH.json +11 -0
  3. data/data/geometry/DEER_ECC_DXGF.json +11 -0
  4. data/data/geometry/DEER_ECC_DXHP.json +11 -0
  5. data/data/geometry/DEER_ECC_NCEH.json +11 -0
  6. data/data/geometry/DEER_ECC_NCGF.json +11 -0
  7. data/data/geometry/DEER_ECC_PVVE.json +11 -0
  8. data/data/geometry/DEER_ECC_PVVG.json +11 -0
  9. data/data/geometry/DEER_ECC_SVVE.json +11 -0
  10. data/data/geometry/DEER_ECC_SVVG.json +11 -0
  11. data/data/geometry/DEER_ECC_WLHP.json +11 -0
  12. data/data/geometry/DEER_EPr_DXEH.json +22 -0
  13. data/data/geometry/DEER_EPr_DXGF.json +22 -0
  14. data/data/geometry/DEER_EPr_DXHP.json +22 -0
  15. data/data/geometry/DEER_EPr_NCEH.json +22 -0
  16. data/data/geometry/DEER_EPr_NCGF.json +22 -0
  17. data/data/geometry/DEER_EPr_WLHP.json +22 -0
  18. data/data/geometry/DEER_ESe_DXEH.json +22 -0
  19. data/data/geometry/DEER_ESe_DXGF.json +22 -0
  20. data/data/geometry/DEER_ESe_DXHP.json +22 -0
  21. data/data/geometry/DEER_ESe_NCEH.json +22 -0
  22. data/data/geometry/DEER_ESe_NCGF.json +22 -0
  23. data/data/geometry/DEER_ESe_PVVE.json +22 -0
  24. data/data/geometry/DEER_ESe_PVVG.json +22 -0
  25. data/data/geometry/DEER_ESe_SVVE.json +22 -0
  26. data/data/geometry/DEER_ESe_SVVG.json +22 -0
  27. data/data/geometry/DEER_ESe_WLHP.json +22 -0
  28. data/data/geometry/DEER_EUn_DXEH.json +11 -0
  29. data/data/geometry/DEER_EUn_DXGF.json +11 -0
  30. data/data/geometry/DEER_EUn_DXHP.json +11 -0
  31. data/data/geometry/DEER_EUn_NCEH.json +11 -0
  32. data/data/geometry/DEER_EUn_NCGF.json +11 -0
  33. data/data/geometry/DEER_EUn_PVVE.json +11 -0
  34. data/data/geometry/DEER_EUn_PVVG.json +11 -0
  35. data/data/geometry/DEER_EUn_SVVE.json +11 -0
  36. data/data/geometry/DEER_EUn_SVVG.json +11 -0
  37. data/data/geometry/DEER_Hsp_DXEH.json +11 -0
  38. data/data/geometry/DEER_Hsp_DXGF.json +11 -0
  39. data/data/geometry/DEER_Hsp_DXHP.json +11 -0
  40. data/data/geometry/DEER_Hsp_NCEH.json +11 -0
  41. data/data/geometry/DEER_Hsp_NCGF.json +11 -0
  42. data/data/geometry/DEER_Hsp_PVVE.json +11 -0
  43. data/data/geometry/DEER_Hsp_PVVG.json +11 -0
  44. data/data/geometry/DEER_Hsp_SVVE.json +11 -0
  45. data/data/geometry/DEER_Hsp_SVVG.json +11 -0
  46. data/data/geometry/DEER_Htl_DXEH.json +33 -0
  47. data/data/geometry/DEER_Htl_DXGF.json +33 -0
  48. data/data/geometry/DEER_Htl_DXHP.json +33 -0
  49. data/data/geometry/DEER_Htl_NCEH.json +33 -0
  50. data/data/geometry/DEER_Htl_NCGF.json +33 -0
  51. data/data/geometry/DEER_Htl_PVVE.json +33 -0
  52. data/data/geometry/DEER_Htl_PVVG.json +33 -0
  53. data/data/geometry/DEER_Htl_SVVE.json +33 -0
  54. data/data/geometry/DEER_Htl_SVVG.json +33 -0
  55. data/data/geometry/DEER_Htl_WLHP.json +33 -0
  56. data/data/geometry/DEER_Nrs_DXEH.json +11 -0
  57. data/data/geometry/DEER_Nrs_DXGF.json +11 -0
  58. data/data/geometry/DEER_Nrs_DXHP.json +11 -0
  59. data/data/geometry/DEER_Nrs_FPFC.json +11 -0
  60. data/data/geometry/DEER_Nrs_NCEH.json +11 -0
  61. data/data/geometry/DEER_Nrs_PVVE.json +11 -0
  62. data/data/geometry/DEER_Nrs_PVVG.json +11 -0
  63. data/data/geometry/DEER_Nrs_SVVE.json +11 -0
  64. data/data/geometry/DEER_Nrs_SVVG.json +11 -0
  65. data/data/geometry/DEER_RFF_DXEH.json +22 -0
  66. data/data/geometry/DEER_RFF_DXGF.json +22 -0
  67. data/data/geometry/DEER_RFF_DXHP.json +22 -0
  68. data/data/geometry/DEER_RFF_NCEH.json +22 -0
  69. data/data/geometry/DEER_RFF_NCGF.json +22 -0
  70. data/data/geometry/DEER_RSD_DXEH.json +22 -0
  71. data/data/geometry/DEER_RSD_DXGF.json +22 -0
  72. data/data/geometry/DEER_RSD_DXHP.json +22 -0
  73. data/data/geometry/DEER_RSD_NCEH.json +22 -0
  74. data/data/geometry/DEER_RSD_NCGF.json +22 -0
  75. data/data/geometry/DEER_RtL_DXEH.json +11 -0
  76. data/data/geometry/DEER_RtL_DXGF.json +11 -0
  77. data/data/geometry/DEER_RtL_DXHP.json +11 -0
  78. data/data/geometry/DEER_RtL_NCEH.json +11 -0
  79. data/data/geometry/DEER_RtL_NCGF.json +11 -0
  80. data/data/standards/OpenStudio_Standards.xlsx +0 -0
  81. data/data/standards/OpenStudio_Standards_construction_properties.json +2560 -0
  82. data/data/standards/OpenStudio_Standards_construction_sets.json +730 -42
  83. data/data/standards/OpenStudio_Standards_constructions.json +40 -0
  84. data/data/standards/OpenStudio_Standards_entryways.json +44 -0
  85. data/data/standards/OpenStudio_Standards_fans.json +36 -0
  86. data/data/standards/OpenStudio_Standards_materials.json +163 -123
  87. data/data/standards/OpenStudio_Standards_parking.json +36 -0
  88. data/data/standards/OpenStudio_Standards_prototype_inputs.json +9640 -1608
  89. data/data/standards/OpenStudio_Standards_schedules.json +1259 -427
  90. data/data/standards/OpenStudio_Standards_space_types.json +1660 -444
  91. data/data/standards/OpenStudio_Standards_unitary_acs.json +580 -0
  92. data/data/standards/export_OpenStudio_libraries.rb +24 -3
  93. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +116 -58
  94. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +5 -8
  95. data/lib/openstudio-standards/standards/Standards.Model.rb +11 -2
  96. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +258 -0
  97. data/lib/openstudio-standards/utilities/logging.rb +6 -3
  98. data/lib/openstudio-standards/version.rb +1 -1
  99. metadata +2 -2
@@ -9,7 +9,22 @@ require 'json'
9
9
  require 'openstudio'
10
10
  require_relative '../../lib/openstudio-standards'
11
11
 
12
+ # gem install parallel
13
+ require 'parallel'
14
+
12
15
  def export_openstudio_libraries
16
+
17
+ # Environment variables
18
+ if ENV['N'].nil?
19
+ # Number of parallel runs caps to nproc - 1
20
+ # On a 8 core, 16 threads machine => 15
21
+ $nproc = [1, Parallel.processor_count - 1].max
22
+ puts "Defaulted Nproc to #{$nproc}"
23
+ else
24
+ $nproc = ENV['N'].to_i
25
+ puts "Using environment Nproc=#{$nproc}"
26
+ end
27
+
13
28
  start_time = Time.now
14
29
 
15
30
  ### Define what to include in the libraries ###
@@ -28,7 +43,9 @@ def export_openstudio_libraries
28
43
  templates_to_climate_zones = JSON.parse(temp)
29
44
 
30
45
  # Make a library model for each template
31
- std.standards_data["templates"].each do |template|
46
+ # We parallelize this loop, since it takes really long
47
+ Parallel.each(std.standards_data["templates"],
48
+ in_threads: $nproc) do |template|
32
49
 
33
50
  # Wrap each library creation in a begin/rescue because
34
51
  # the entire process can take a long time and
@@ -44,12 +61,14 @@ def export_openstudio_libraries
44
61
  std_applier = Standard.build(template_name)
45
62
  rescue Exception => e
46
63
  puts "'#{template_name}' is not defined in OpenStudio-Standards yet"
64
+ next
47
65
  end
48
66
 
49
67
  # Reset the openstudio-standards log
50
68
  reset_log
51
69
 
52
- next unless template_name == '90.1-2004'
70
+ # If you want to only do one specific template
71
+ # next unless template_name == '90.1-2004'
53
72
 
54
73
  # Make an empty model
55
74
  model = OpenStudio::Model::Model.new
@@ -416,7 +435,9 @@ def export_openstudio_libraries
416
435
  end
417
436
 
418
437
  # Save the library
419
- osm_lib_dir = "#{__dir__}/../../pkg/libraries"
438
+ pkg_dir = "#{__dir__}/../../pkg"
439
+ Dir.mkdir(pkg_dir) unless Dir.exists?(pkg_dir)
440
+ osm_lib_dir = "#{pkg_dir}/libraries"
420
441
  Dir.mkdir(osm_lib_dir) unless Dir.exists?(osm_lib_dir)
421
442
  library_path = "#{osm_lib_dir}/#{template_name.gsub(/\W/,'_')}.osm"
422
443
  puts "* Saving library #{library_path}"
@@ -835,8 +835,8 @@ class Standard
835
835
  #
836
836
  # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to connect to this system
837
837
  # @param system_name [String] the name of the system, or nil in which case it will be defaulted
838
- # @param hot_water_loop [String] hot water loop to connect to heating and zone fan coils
839
- # @param chilled_water_loop [String] chilled water loop to connect to cooling coil
838
+ # @param hot_water_loop [OpenStudio::Model::PlantLoop] hot water loop to connect to heating and zone fan coils
839
+ # @param chilled_water_loop [OpenStudio::Model::PlantLoop] chilled water loop to connect to cooling coil
840
840
  # @param hvac_op_sch [String] name of the HVAC operation schedule, default is always on
841
841
  # @param min_oa_sch [String] name of the minimum outdoor air schedule, default is always on
842
842
  # @param min_frac_oa_sch [String] name of the minimum fraction of outdoor air schedule, default is always on
@@ -1061,8 +1061,8 @@ class Standard
1061
1061
  # @param doas_type [String] DOASCV or DOASVAV, determines whether the DOAS is operated at scheduled,
1062
1062
  # constant flow rate, or airflow is variable to allow for economizing or demand controlled ventilation
1063
1063
  # @param doas_control_strategy [String] DOAS control strategy
1064
- # @param hot_water_loop [String] hot water loop to connect to heating and zone fan coils
1065
- # @param chilled_water_loop [String] chilled water loop to connect to cooling coil
1064
+ # @param hot_water_loop [OpenStudio::Model::PlantLoop] hot water loop to connect to heating and zone fan coils
1065
+ # @param chilled_water_loop [OpenStudio::Model::PlantLoop] chilled water loop to connect to cooling coil
1066
1066
  # @param hvac_op_sch [String] name of the HVAC operation schedule, default is always on
1067
1067
  # @param min_oa_sch [String] name of the minimum outdoor air schedule, default is always on
1068
1068
  # @param min_frac_oa_sch [String] name of the minimum fraction of outdoor air schedule, default is always on
@@ -1345,11 +1345,13 @@ class Standard
1345
1345
  # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to connect to this system
1346
1346
  # @param system_name [String] the name of the system, or nil in which case it will be defaulted
1347
1347
  # @param return_plenum [OpenStudio::Model::ThermalZone] the zone to attach as the supply plenum, or nil, in which case no return plenum will be used
1348
- # @param reheat_type [String] valid options are NaturalGas, Electricity, Water, nil (no heat)
1349
- # @param hot_water_loop [String] hot water loop to connect heating and reheat coils to
1350
- # @param chilled_water_loop [String] chilled water loop to connect cooling coil to
1348
+ # @param heating_type [String] main heating coil fuel type
1349
+ # valid choices are NaturalGas, Gas, Electricity, HeatPump, DistrictHeating, or nil (defaults to NaturalGas)
1350
+ # @param reheat_type [String] valid options are NaturalGas, Gas, Electricity, Water, nil (no heat)
1351
+ # @param hot_water_loop [OpenStudio::Model::PlantLoop] hot water loop to connect heating and reheat coils to
1352
+ # @param chilled_water_loop [OpenStudio::Model::PlantLoop] chilled water loop to connect cooling coil to
1351
1353
  # @param hvac_op_sch [String] name of the HVAC operation schedule or nil in which case will be defaulted to always on
1352
- # @param oa_damper_sch [Double] name of the oa damper schedule, or nil in which case will be defaulted to always open
1354
+ # @param oa_damper_sch [String] name of the oa damper schedule, or nil in which case will be defaulted to always open
1353
1355
  # @param fan_efficiency [Double] fan total efficiency, including motor and impeller
1354
1356
  # @param fan_motor_efficiency [Double] fan motor efficiency
1355
1357
  # @param fan_pressure_rise [Double] fan pressure rise, inH2O
@@ -1361,6 +1363,7 @@ class Standard
1361
1363
  thermal_zones,
1362
1364
  system_name: nil,
1363
1365
  return_plenum: nil,
1366
+ heating_type: nil,
1364
1367
  reheat_type: nil,
1365
1368
  hot_water_loop: nil,
1366
1369
  chilled_water_loop: nil,
@@ -1390,9 +1393,7 @@ class Standard
1390
1393
  end
1391
1394
 
1392
1395
  # oa damper schedule
1393
- if oa_damper_sch.nil?
1394
- oa_damper_sch = model.alwaysOnDiscreteSchedule
1395
- else
1396
+ unless oa_damper_sch.nil?
1396
1397
  oa_damper_sch = model_add_schedule(model, oa_damper_sch)
1397
1398
  end
1398
1399
 
@@ -1428,9 +1429,15 @@ class Standard
1428
1429
 
1429
1430
  # create heating coil
1430
1431
  if hot_water_loop.nil?
1431
- create_coil_heating_gas(model,
1432
- air_loop_node: air_loop.supplyInletNode,
1433
- name: 'Main Gas Htg Coil')
1432
+ if heating_type == 'Electricity'
1433
+ create_coil_heating_electric(model,
1434
+ air_loop_node: air_loop.supplyInletNode,
1435
+ name: "#{air_loop.name} Main Electric Htg Coil")
1436
+ else # default to NaturalGas
1437
+ create_coil_heating_gas(model,
1438
+ air_loop_node: air_loop.supplyInletNode,
1439
+ name: "#{air_loop.name} Main Gas Htg Coil")
1440
+ end
1434
1441
  else
1435
1442
  create_coil_heating_water(model,
1436
1443
  hot_water_loop,
@@ -1462,7 +1469,12 @@ class Standard
1462
1469
  oa_intake_controller.autosizeMinimumOutdoorAirFlowRate
1463
1470
  oa_intake_controller.resetMaximumFractionofOutdoorAirSchedule
1464
1471
  oa_intake_controller.resetEconomizerMinimumLimitDryBulbTemperature
1465
- # oa_intake_controller.setMinimumOutdoorAirSchedule(oa_damper_sch)
1472
+ unless econo_ctrl_mthd.nil?
1473
+ oa_intake_controller.setEconomizerControlType(econo_ctrl_mthd)
1474
+ end
1475
+ unless oa_damper_sch.nil?
1476
+ oa_intake_controller.setMinimumOutdoorAirSchedule(oa_damper_sch)
1477
+ end
1466
1478
  controller_mv = oa_intake_controller.controllerMechanicalVentilation
1467
1479
  controller_mv.setName("#{air_loop.name} Vent Controller")
1468
1480
  controller_mv.setSystemOutdoorAirMethod('VentilationRateProcedure')
@@ -1555,9 +1567,9 @@ class Standard
1555
1567
  #
1556
1568
  # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to connect to this system
1557
1569
  # @param system_name [String] the name of the system, or nil in which case it will be defaulted
1558
- # @param chilled_water_loop [String] chilled water loop to connect to the cooling coil
1570
+ # @param chilled_water_loop [OpenStudio::Model::PlantLoop] chilled water loop to connect to the cooling coil
1559
1571
  # @param hvac_op_sch [String] name of the HVAC operation schedule or nil in which case will be defaulted to always on
1560
- # @param oa_damper_sch [Double] name of the oa damper schedule or nil in which case will be defaulted to always open
1572
+ # @param oa_damper_sch [String] name of the oa damper schedule or nil in which case will be defaulted to always open
1561
1573
  # @param fan_efficiency [Double] fan total efficiency, including motor and impeller
1562
1574
  # @param fan_motor_efficiency [Double] fan motor efficiency
1563
1575
  # @param fan_pressure_rise [Double] fan pressure rise, inH2O
@@ -1687,11 +1699,13 @@ class Standard
1687
1699
  # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to connect to this system
1688
1700
  # @param system_name [String] the name of the system, or nil in which case it will be defaulted
1689
1701
  # @param return_plenum [OpenStudio::Model::ThermalZone] the zone to attach as the supply plenum, or nil, in which case no return plenum will be used
1690
- # @param hot_water_loop [String] hot water loop to connect heating and reheat coils to. If nil, will be electric heat and electric reheat
1691
- # @param chilled_water_loop [String] chilled water loop to connect cooling coils to. If nil, will be DX cooling
1702
+ # @param hot_water_loop [OpenStudio::Model::PlantLoop] hot water loop to connect heating and reheat coils to. If nil, will be electric heat and electric reheat
1703
+ # @param chilled_water_loop [OpenStudio::Model::PlantLoop] chilled water loop to connect cooling coils to. If nil, will be DX cooling
1704
+ # @param heating_type [String] main heating coil fuel type
1705
+ # valid choices are NaturalGas, Electricity, Water, or nil (defaults to NaturalGas)
1692
1706
  # @param electric_reheat [Bool] if true electric reheat coils, if false the reheat coils served by hot_water_loop
1693
1707
  # @param hvac_op_sch [String] name of the HVAC operation schedule or nil in which case will be defaulted to always on
1694
- # @param oa_damper_sch [Double] name of the oa damper schedule or nil in which case will be defaulted to always open
1708
+ # @param oa_damper_sch [String] name of the oa damper schedule or nil in which case will be defaulted to always open
1695
1709
  # @return [OpenStudio::Model::AirLoopHVAC] the resulting packaged VAV air loop
1696
1710
  def model_add_pvav(model,
1697
1711
  thermal_zones,
@@ -1699,6 +1713,7 @@ class Standard
1699
1713
  return_plenum: nil,
1700
1714
  hot_water_loop: nil,
1701
1715
  chilled_water_loop: nil,
1716
+ heating_type: nil,
1702
1717
  electric_reheat: false,
1703
1718
  hvac_op_sch: nil,
1704
1719
  oa_damper_sch: nil)
@@ -1757,9 +1772,15 @@ class Standard
1757
1772
 
1758
1773
  # create heating coil
1759
1774
  if hot_water_loop.nil?
1760
- create_coil_heating_gas(model,
1761
- air_loop_node: air_loop.supplyInletNode,
1762
- name: "#{air_loop.name} Main Gas Htg Coil")
1775
+ if heating_type == 'Electricity'
1776
+ create_coil_heating_electric(model,
1777
+ air_loop_node: air_loop.supplyInletNode,
1778
+ name: "#{air_loop.name} Main Electric Htg Coil")
1779
+ else # default to NaturalGas
1780
+ create_coil_heating_gas(model,
1781
+ air_loop_node: air_loop.supplyInletNode,
1782
+ name: "#{air_loop.name} Main Gas Htg Coil")
1783
+ end
1763
1784
  else
1764
1785
  create_coil_heating_water(model,
1765
1786
  hot_water_loop,
@@ -1855,9 +1876,9 @@ class Standard
1855
1876
  #
1856
1877
  # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to connect to this system
1857
1878
  # @param system_name [String] the name of the system, or nil in which case it will be defaulted
1858
- # @param chilled_water_loop [String] chilled water loop to connect cooling coils to. If nil, will be DX cooling
1879
+ # @param chilled_water_loop [OpenStudio::Model::PlantLoop] chilled water loop to connect cooling coils to. If nil, will be DX cooling
1859
1880
  # @param hvac_op_sch [String] name of the HVAC operation schedule or nil in which case will be defaulted to always on
1860
- # @param oa_damper_sch [Double] name of the oa damper schedule or nil in which case will be defaulted to always open
1881
+ # @param oa_damper_sch [String] name of the oa damper schedule or nil in which case will be defaulted to always open
1861
1882
  # @param fan_efficiency [Double] fan total efficiency, including motor and impeller
1862
1883
  # @param fan_motor_efficiency [Double] fan motor efficiency
1863
1884
  # @param fan_pressure_rise [Double] fan pressure rise, inH2O
@@ -1993,10 +2014,10 @@ class Standard
1993
2014
  #
1994
2015
  # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to connect to this system
1995
2016
  # @param system_name [String] the name of the system, or nil in which case it will be defaulted
1996
- # @param hot_water_loop [String] hot water loop to connect to heating and reheat coils.
1997
- # @param chilled_water_loop [String] chilled water loop to connect to the cooling coil.
2017
+ # @param hot_water_loop [OpenStudio::Model::PlantLoop] hot water loop to connect to heating and reheat coils.
2018
+ # @param chilled_water_loop [OpenStudio::Model::PlantLoop] chilled water loop to connect to the cooling coil.
1998
2019
  # @param hvac_op_sch [String] name of the HVAC operation schedule or nil in which case will be defaulted to always on
1999
- # @param oa_damper_sch [Double] name of the oa damper schedule or nil in which case will be defaulted to always open
2020
+ # @param oa_damper_sch [String] name of the oa damper schedule or nil in which case will be defaulted to always open
2000
2021
  # @param fan_efficiency [Double] fan total efficiency, including motor and impeller
2001
2022
  # @param fan_motor_efficiency [Double] fan motor efficiency
2002
2023
  # @param fan_pressure_rise [Double] fan pressure rise, inH2O
@@ -2152,14 +2173,14 @@ class Standard
2152
2173
  # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to connect to this system
2153
2174
  # @param system_name [String] the name of the system, or nil in which case it will be defaulted
2154
2175
  # @param cooling_type [String] valid choices are Water, Two Speed DX AC, Single Speed DX AC, Single Speed Heat Pump, Water To Air Heat Pump
2155
- # @param chilled_water_loop [String] chilled water loop to connect cooling coil to, or nil
2156
- # @param heating_type [Double] valid choices are NaturalGas, Electricity, Water, Single Speed Heat Pump, Water To Air Heat Pump, or nil (no heat)
2157
- # @param supplemental_heating_type [Double] valid choices are Electricity, NaturalGas, nil (no heat)
2158
- # @param hot_water_loop [String] hot water loop to connect heating coil to, or nil
2159
- # @param fan_location [Double] valid choices are BlowThrough, DrawThrough
2160
- # @param fan_type [Double] valid choices are ConstantVolume, Cycling
2176
+ # @param chilled_water_loop [OpenStudio::Model::PlantLoop] chilled water loop to connect cooling coil to, or nil
2177
+ # @param heating_type [String] valid choices are NaturalGas, Electricity, Water, Single Speed Heat Pump, Water To Air Heat Pump, or nil (no heat)
2178
+ # @param supplemental_heating_type [String] valid choices are Electricity, NaturalGas, nil (no heat)
2179
+ # @param hot_water_loop [OpenStudio::Model::PlantLoop] hot water loop to connect heating coil to, or nil
2180
+ # @param fan_location [String] valid choices are BlowThrough, DrawThrough
2181
+ # @param fan_type [String] valid choices are ConstantVolume, Cycling
2161
2182
  # @param hvac_op_sch [String] name of the HVAC operation schedule or nil in which case will be defaulted to always on
2162
- # @param oa_damper_sch [Double] name of the oa damper schedule or nil in which case will be defaulted to always open
2183
+ # @param oa_damper_sch [String] name of the oa damper schedule or nil in which case will be defaulted to always open
2163
2184
  # @return [Array<OpenStudio::Model::AirLoopHVAC>] an array of the resulting PSZ-AC air loops
2164
2185
  def model_add_psz_ac(model,
2165
2186
  thermal_zones,
@@ -2436,10 +2457,10 @@ class Standard
2436
2457
  #
2437
2458
  # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to connect to this system
2438
2459
  # @param system_name [String] the name of the system, or nil in which case it will be defaulted
2439
- # @param heating_type [Double] valid choices are NaturalGas, Electricity, Water, nil (no heat)
2440
- # @param supplemental_heating_type [Double] valid choices are Electricity, NaturalGas, nil (no heat)
2460
+ # @param heating_type [String] valid choices are NaturalGas, Electricity, Water, nil (no heat)
2461
+ # @param supplemental_heating_type [String] valid choices are Electricity, NaturalGas, nil (no heat)
2441
2462
  # @param hvac_op_sch [String] name of the HVAC operation schedule or nil in which case will be defaulted to always on
2442
- # @param oa_damper_sch [Double] name of the oa damper schedule or nil in which case will be defaulted to always open
2463
+ # @param oa_damper_sch [String] name of the oa damper schedule or nil in which case will be defaulted to always open
2443
2464
  # @return [Array<OpenStudio::Model::AirLoopHVAC>] an array of the resulting PSZ-AC air loops
2444
2465
  def model_add_psz_vav(model,
2445
2466
  thermal_zones,
@@ -2616,11 +2637,11 @@ class Standard
2616
2637
  # Creates a data center PSZ-AC system for each zone.
2617
2638
  #
2618
2639
  # @param system_name [String] the name of the system, or nil in which case it will be defaulted
2619
- # @param hot_water_loop [String] hot water loop to connect to the heating coil
2620
- # @param heat_pump_loop [String] heat pump water loop to connect to heat pump
2640
+ # @param hot_water_loop [OpenStudio::Model::PlantLoop] hot water loop to connect to the heating coil
2641
+ # @param heat_pump_loop [OpenStudio::Model::PlantLoop] heat pump water loop to connect to heat pump
2621
2642
  # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to connect to this system
2622
2643
  # @param hvac_op_sch [String] name of the HVAC operation schedule or nil in which case will be defaulted to always on
2623
- # @param oa_damper_sch [Double] name of the oa damper schedule or nil in which case will be defaulted to always open
2644
+ # @param oa_damper_sch [String] name of the oa damper schedule or nil in which case will be defaulted to always open
2624
2645
  # @param main_data_center [Bool] whether or not this is the main data center in the building.
2625
2646
  # @return [Array<OpenStudio::Model::AirLoopHVAC>] an array of the resulting air loops
2626
2647
  def model_add_data_center_hvac(model,
@@ -2777,12 +2798,12 @@ class Standard
2777
2798
  #
2778
2799
  # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to connect to this system
2779
2800
  # @param cooling_type [String] valid choices are Two Speed DX AC, Single Speed DX AC, Single Speed Heat Pump
2780
- # @param heating_type [Double] valid choices are Gas, Single Speed Heat Pump
2781
- # @param supplemental_heating_type [Double] valid choices are Electric, Gas
2782
- # @param fan_type [Double] valid choices are ConstantVolume, Cycling
2801
+ # @param heating_type [String] valid choices are Gas, Single Speed Heat Pump
2802
+ # @param supplemental_heating_type [String] valid choices are Electric, Gas
2803
+ # @param fan_type [String] valid choices are ConstantVolume, Cycling
2783
2804
  # @param hvac_op_sch [String] name of the HVAC operation schedule or nil in which case will be defaulted to always on
2784
- # @param oa_damper_sch [Double] name of the oa damper schedule, or nil in which case will be defaulted to always open
2785
- # @param econ_max_oa_frac_sch [Double] name of the economizer maximum outdoor air fraction schedule
2805
+ # @param oa_damper_sch [String] name of the oa damper schedule, or nil in which case will be defaulted to always open
2806
+ # @param econ_max_oa_frac_sch [String] name of the economizer maximum outdoor air fraction schedule
2786
2807
  # @return [OpenStudio::Model::AirLoopHVAC] the resulting split AC air loop
2787
2808
  def model_add_split_ac(model,
2788
2809
  thermal_zones,
@@ -2936,9 +2957,9 @@ class Standard
2936
2957
  #
2937
2958
  # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to connect to this system
2938
2959
  # @param cooling_type [String] valid choices are Two Speed DX AC, Single Speed DX AC
2939
- # @param heating_type [Double] valid choices are NaturalGas, Electricity, Water, nil (no heat)
2940
- # @param hot_water_loop [String] hot water loop to connect heating coil to. Set to nil for heating types besides water
2941
- # @param fan_type [Double] valid choices are ConstantVolume, Cycling
2960
+ # @param heating_type [String] valid choices are NaturalGas, Electricity, Water, nil (no heat)
2961
+ # @param hot_water_loop [OpenStudio::Model::PlantLoop] hot water loop to connect heating coil to. Set to nil for heating types besides water
2962
+ # @param fan_type [String] valid choices are ConstantVolume, Cycling
2942
2963
  # @return [Array<OpenStudio::Model::ZoneHVACPackagedTerminalAirConditioner>] an array of the resulting PTACs
2943
2964
  def model_add_ptac(model,
2944
2965
  thermal_zones,
@@ -3127,10 +3148,10 @@ class Standard
3127
3148
  #
3128
3149
  # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to connect to this system
3129
3150
  # @param hvac_op_sch [String] name of the HVAC operation schedule or nil in which case will be defaulted to always on
3130
- # @param fan_control_type [Double] valid choices are OnOff, ConstantVolume, VariableVolume
3151
+ # @param fan_control_type [String] valid choices are OnOff, ConstantVolume, VariableVolume
3131
3152
  # @param fan_pressure_rise [Double] fan pressure rise, inH2O
3132
- # @param heating_type [Double] valid choices are NaturalGas, Gas, Electricity, Electric, DistrictHeating
3133
- # @param hot_water_loop [String] hot water loop to connect to the heating coil
3153
+ # @param heating_type [String] valid choices are NaturalGas, Gas, Electricity, Electric, DistrictHeating
3154
+ # @param hot_water_loop [OpenStudio::Model::PlantLoop] hot water loop to connect to the heating coil
3134
3155
  # @param rated_inlet_water_temperature [Double] rated inlet water temperature in degrees Fahrenheit, default is 180F
3135
3156
  # @param rated_outlet_water_temperature [Double] rated outlet water temperature in degrees Fahrenheit, default is 160F
3136
3157
  # @param rated_inlet_air_temperature [Double] rated inlet air temperature in degrees Fahrenheit, default is 60F
@@ -3242,7 +3263,7 @@ class Standard
3242
3263
  # Creates a high temp radiant heater for each zone and adds it to the model.
3243
3264
  #
3244
3265
  # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] array of zones to connect to this system
3245
- # @param heating_type [Double] valid choices are Gas, Electric
3266
+ # @param heating_type [String] valid choices are Gas, Electric
3246
3267
  # @param combustion_efficiency [Double] combustion efficiency as decimal
3247
3268
  # @return [Array<OpenStudio::Model::ZoneHVACHighTemperatureRadiant>] an
3248
3269
  # array of the resulting radiant heaters.
@@ -4639,6 +4660,7 @@ class Standard
4639
4660
  hot_water_loop = nil
4640
4661
  else
4641
4662
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', 'Baseboards must have heating_type specified.')
4663
+ return false
4642
4664
  end
4643
4665
  model_add_baseboard(model,
4644
4666
  zones,
@@ -4687,17 +4709,41 @@ class Standard
4687
4709
  ventilation: false)
4688
4710
 
4689
4711
  when 'VAV Reheat'
4690
- hot_water_loop = model_get_or_add_hot_water_loop(model, main_heat_fuel,
4691
- hot_water_loop_type: hot_water_loop_type)
4692
- if air_loop_cooling_type == 'Water'
4712
+ case main_heat_fuel
4713
+ when 'NaturalGas', 'Gas', 'HeatPump', 'DistrictHeating'
4714
+ heating_type = main_heat_fuel
4715
+ hot_water_loop = model_get_or_add_hot_water_loop(model, main_heat_fuel,
4716
+ hot_water_loop_type: hot_water_loop_type)
4717
+ else
4718
+ heating_type = 'Electricity'
4719
+ hot_water_loop = nil
4720
+ end
4721
+
4722
+ case air_loop_cooling_type
4723
+ when 'Water'
4693
4724
  chilled_water_loop = model_get_or_add_chilled_water_loop(model, cool_fuel,
4694
4725
  chilled_water_loop_cooling_type: chilled_water_loop_cooling_type)
4695
4726
  else
4696
4727
  chilled_water_loop = nil
4697
4728
  end
4698
- reheat_type = zone_heat_fuel == 'Electricity' ? 'Electricity' : 'Water'
4729
+
4730
+ if hot_water_loop.nil?
4731
+ case zone_heat_fuel
4732
+ when 'NaturalGas', 'Gas'
4733
+ reheat_type = 'NaturalGas'
4734
+ when 'Electricity'
4735
+ reheat_type = 'Electricity'
4736
+ else
4737
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "zone_heat_fuel '#{zone_heat_fuel}' not supported with main_heat_fuel '#{main_heat_fuel}' for a 'VAV Reheat' system type.")
4738
+ return false
4739
+ end
4740
+ else
4741
+ reheat_type = 'Water'
4742
+ end
4743
+
4699
4744
  model_add_vav_reheat(model,
4700
4745
  zones,
4746
+ heating_type: heating_type,
4701
4747
  reheat_type: reheat_type,
4702
4748
  hot_water_loop: hot_water_loop,
4703
4749
  chilled_water_loop: chilled_water_loop,
@@ -4706,6 +4752,16 @@ class Standard
4706
4752
  fan_pressure_rise: 4.0)
4707
4753
 
4708
4754
  when 'VAV No Reheat'
4755
+ case main_heat_fuel
4756
+ when 'NaturalGas', 'Gas', 'HeatPump', 'DistrictHeating'
4757
+ heating_type = main_heat_fuel
4758
+ hot_water_loop = model_get_or_add_hot_water_loop(model, main_heat_fuel,
4759
+ hot_water_loop_type: hot_water_loop_type)
4760
+ else
4761
+ heating_type = 'Electricity'
4762
+ hot_water_loop = nil
4763
+ end
4764
+
4709
4765
  if air_loop_cooling_type == 'Water'
4710
4766
  chilled_water_loop = model_get_or_add_chilled_water_loop(model, cool_fuel,
4711
4767
  chilled_water_loop_cooling_type: chilled_water_loop_cooling_type)
@@ -4714,6 +4770,8 @@ class Standard
4714
4770
  end
4715
4771
  model_add_vav_reheat(model,
4716
4772
  zones,
4773
+ heating_type: heating_type,
4774
+ reheat_type: nil,
4717
4775
  hot_water_loop: hot_water_loop,
4718
4776
  chilled_water_loop: chilled_water_loop,
4719
4777
  fan_efficiency: 0.62,
@@ -4729,8 +4787,8 @@ class Standard
4729
4787
  end
4730
4788
  model_add_vav_reheat(model,
4731
4789
  zones,
4790
+ heating_type: 'NaturalGas',
4732
4791
  reheat_type: 'NaturalGas',
4733
- hot_water_loop: hot_water_loop,
4734
4792
  chilled_water_loop: chilled_water_loop,
4735
4793
  fan_efficiency: 0.62,
4736
4794
  fan_motor_efficiency: 0.9,
@@ -2164,8 +2164,7 @@ class Standard
2164
2164
  return has_erv
2165
2165
  end
2166
2166
 
2167
- # Set the VAV damper control to single maximum or
2168
- # dual maximum control depending on the standard.
2167
+ # Set the VAV damper control to single maximum or dual maximum control depending on the standard.
2169
2168
  #
2170
2169
  # @return [Bool] Returns true if successful, false if not
2171
2170
  # @todo see if this impacts the sizing run.
@@ -2187,8 +2186,7 @@ class Standard
2187
2186
  end
2188
2187
  end
2189
2188
 
2190
- # Set the control for any VAV reheat terminals
2191
- # on this airloop.
2189
+ # Set the control for any VAV reheat terminals on this airloop.
2192
2190
  control_type_set = false
2193
2191
  air_loop_hvac.demandComponents.each do |equip|
2194
2192
  if equip.to_AirTerminalSingleDuctVAVReheat.is_initialized
@@ -2214,8 +2212,8 @@ class Standard
2214
2212
  return true
2215
2213
  end
2216
2214
 
2217
- # Determine whether the VAV damper control is single maximum or
2218
- # dual maximum control. Defults to 90.1-2007.
2215
+ # Determine whether the VAV damper control is single maximum or dual maximum control.
2216
+ # Defaults to 90.1-2007.
2219
2217
  #
2220
2218
  # @return [String] the damper control type: Single Maximum, Dual Maximum
2221
2219
  def air_loop_hvac_vav_damper_action(air_loop_hvac)
@@ -2234,8 +2232,7 @@ class Standard
2234
2232
  return motorized_oa_damper_required
2235
2233
  end
2236
2234
 
2237
- # If the system has an economizer, it must have
2238
- # a motorized damper.
2235
+ # If the system has an economizer, it must have a motorized damper.
2239
2236
  if air_loop_hvac_economizer?(air_loop_hvac)
2240
2237
  motorized_oa_damper_required = true
2241
2238
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Because the system has an economizer, it requires a motorized OA damper.")