openstudio-standards 0.2.6 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
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.")