module BTAP::BridgingData

—- —- —- —- —- —- —- —- —- —- —- —- —- —- —- #

Constants

FLOOR
MASS2

— —- —- —- —- —- —- —- —- —- —- —- —- —- — # BTAP costing data (both original BTAP constructions and EVOKE’s additions) hold sub-variants based on cladding/veneer, e.g.:

- "BTAP-ExteriorWall-WoodFramed-5" ... brick veneer
- "BTAP-ExteriorWall-WoodFramed-1" ... wood siding

Not all of these sub-variants are currently used within BTAP, e.g. “BTAP-ExteriorWall-WoodFramed-1” is unused. BTAP/TBD data is limited to the following wall constructions (paired LP & HP variants).

—- (Basic) Low Performance (LP) assemblies

ID    : (layers)
-----   ------------------------------------------
STEL1 : cladding | board   | wool | frame | gypsum
WOOD5 : brick    | board   | wool | frame | gypsum
MTAL1 : panel    | xps     | wool | frame | gypsum
MASS2 : brick    | xps     |      | cmu   |
MASS4 : precast  | xps     | wool | frame | gypsum
MASS6 : brick    | xps     |      | cmu   |

—- High Performance (HP) variants

ID    : (layers)
-----   ------------------------------------------
STEL2 : cladding | board   | wool | frame | gypsum ... switch from STEL1
WOOD7 : brick    | mineral | wool | frame | gypsum ... switch from WOOD5
MTALD : panel    | polyiso | foam | frame | gypsum ... switch from MTAL1
MASSB : brick    | mineral | cmu  | foam  | gypsum ... switch from MASS2
MASS8 : precast  | xps     | wool | frame | gypsum ... switch from MASS4
MASSC : cladding | mineral | cmu  | foam  | gypsum ... switch from MASS6

Paired LPs & HPs vall variants are critical for ‘uprating’ cases, e.g. NECB2017. See below, and end of this document for additional NOTES.

MASS2_BAD
MASS2_GOOD
MASS4
MASS4_BAD
MASS4_GOOD
MASS6
MASS6_BAD
MASS6_GOOD
MASS8
MASS8_BAD
MASS8_GOOD
MASSB
MASSB_BAD
MASSB_GOOD
MASSC
MASSC_BAD
MASSC_GOOD
MTAL1
MTAL1_BAD
MTAL1_GOOD
MTALD
MTALD_BAD
MTALD_GOOD
ROOFS
STEL1
STEL1_BAD
STEL1_GOOD
STEL2
STEL2_BAD
STEL2_GOOD
UMAX
UMIN
WOOD5
WOOD5_BAD
WOOD5_GOOD
WOOD7
WOOD7_BAD
WOOD7_GOOD

Public Class Methods

extended(base) click to toggle source
# File lib/openstudio-standards/btap/bridging.rb, line 1283
def self.extended(base)
  base.send(:include, self)
end

Public Instance Methods

assembly(sptype = :office, stypes = :walls, perform = :hp) click to toggle source

Retrieve building/space type-specific assembly/construction.

@param sptype [Symbol] BTAP/TBD spacetype @param stypes [Symbol] :walls, :floors or :roofs @param perform [Symbol] :lp (low-) or :hp (high-performance)

@return [String] corresponding BTAP construction (STEL2 if fail)

# File lib/openstudio-standards/btap/bridging.rb, line 1188
def assembly(sptype = :office, stypes = :walls, perform = :hp)
  return FLOOR if stypes == :floors
  return ROOFS if stypes == :roofs

  @@data.each do |id, construction|
    next  unless construction.key?(perform)
    return id if construction[:sptypes].key?(sptype)
  end

  STEL2
end
costed_uo(construction = STEL2, uo = UMAX) click to toggle source

Retrieve nearest building/space type-specific assembly Uo factor.

@param construction [String] BTAP construction identifier @param uo [Double] target Uo in W/m2.K

@return [Double] costed BTAP construction Uo factor (nil if fail)

# File lib/openstudio-standards/btap/bridging.rb, line 1207
def costed_uo(construction = STEL2, uo = UMAX)
  construction = STEL2 unless @@data.key?(construction)
  uo           = UMAX  unless uo.is_a?(Numeric) && uo.between?(UMIN, UMAX)

  @@data[construction][:uos].keys.each do |u|
    val = u.to_f / 1000
    return nil unless val.is_a?(Numeric) && val.between?(UMIN, UMAX)
    return val     if val < uo || (val - uo).abs < 0.001
  end

  nil
end
data() click to toggle source

Return BTAP/TBD data.

@return [Hash] preset BTAP/TBD data

# File lib/openstudio-standards/btap/bridging.rb, line 1279
def data
  @@data
end
lowest_uo(construction = STEL2) click to toggle source

Retrieve lowest building/space type-specific assembly Uo factor.

@param construction [String] BTAP construction identifier

@return [Double] lowest costed BTAP construction Uo factor (nil if fail)

# File lib/openstudio-standards/btap/bridging.rb, line 1226
def lowest_uo(construction = STEL2)
  uos          = []
  construction = STEL2 unless @@data.key?(construction)

  @@data[construction][:uos].keys.each do |u|
    val = u.to_f / 1000
    return nil unless val.is_a?(Numeric) && val.between?(UMIN, UMAX)

    uos << val
  end

  return uos.min unless uos.empty?

  nil
end
set(assembly = STEL2, quality = :good) click to toggle source

Retrieve assembly-specific PSI factor set.

@param assembly [String] BTAP/TBD wall construction @param quality [Symbol] BTAP/TBD PSI quality (:bad or :good)

@return [Hash] BTAP/TBD PSI factor set (defaults to STEL2, :good)

# File lib/openstudio-standards/btap/bridging.rb, line 1249
def set(assembly = STEL2, quality = :good)
  psi = {}
  chx = @@data[STEL2][:good  ]
  chx = @@data[STEL2][quality]          if @@data[STEL2   ].key?(quality)

  if @@data.key?(assembly)
    chx = @@data[assembly][quality]     if @@data[assembly].key?(quality)
    chx = @@data[assembly][:good  ] unless @@data[assembly].key?(quality)
  end

  psi[:id        ] = chx[:id        ]
  psi[:rimjoist  ] = chx[:rimjoist  ][:psi]
  psi[:parapet   ] = chx[:parapet   ][:psi]
  psi[:head      ] = chx[:head      ][:psi]
  psi[:jamb      ] = chx[:jamb      ][:psi]
  psi[:sill      ] = chx[:sill      ][:psi]
  psi[:corner    ] = chx[:corner    ][:psi]
  psi[:balcony   ] = chx[:balcony   ][:psi]
  psi[:party     ] = chx[:party     ][:psi]
  psi[:grade     ] = chx[:grade     ][:psi]
  psi[:joint     ] = chx[:joint     ][:psi]
  psi[:transition] = chx[:transition][:psi]

  psi
end
spacetype(sptype = "", stories = 999) click to toggle source

Retrieve TBD building/space type keyword.

@param spacetype [String] NECB (or other) building/space type @param stories [Integer] number of building stories

@return [Symbol] matching TBD keyword (:office if failure)

# File lib/openstudio-standards/btap/bridging.rb, line 1108
def spacetype(sptype = "", stories = 999)
  tp  = sptype.downcase
  typ = :office

  return typ unless stories.is_a?(Integer) && stories.between?(1,999)

  typ = :exercise       if tp.include?("exercise"     )
  typ = :firestation    if tp.include?("fire"         )
  typ = :gym            if tp.include?("gym"          )
  typ = :gym            if tp.include?("locker"       )
  typ = :courthouse     if tp.include?("courthouse"   )
  typ = :courtrhouse    if tp.include?("courtroom"    )
  typ = :museum         if tp.include?("museum"       )
  typ = :parking        if tp.include?("parking"      )
  typ = :post           if tp.include?("post"         )
  typ = :transportation if tp.include?("transp"       )
  typ = :transportation if tp.include?("maintenance"  )
  typ = :automotive     if tp.include?("automotive"   )
  typ = :penitentiary   if tp.include?("penitentiary" )
  typ = :penitentiary   if tp.include?("confinement"  )
  typ = :arena          if tp.include?("arena"        )
  typ = :warehouse      if tp.include?("warehouse"    )
  typ = :storage        if tp.include?("storage"      )
  typ = :mfg            if tp.include?("mfg"          )
  typ = :mfg            if tp.include?("manufacturing")
  typ = :mfg            if tp.include?("loading"      )
  typ = :workshop       if tp.include?("workshop"     )
  typ = :religious      if tp.include?("religious"    )
  typ = :dwelling5      if tp.include?("dorm"         )
  typ = :dwelling5      if tp.include?("otel"         )
  typ = :dwelling5      if tp.include?("residential"  )
  typ = :dwelling5      if tp.include?("long-term"    )
  typ = :dwelling5      if tp.include?("dwelling"     )
  typ = :dwelling5      if tp.include?("lodging"      )
  typ = :dwelling5      if tp.include?("RP-28"        )
  typ = :dwelling5      if tp.include?("guest"        )
  typ = :dwelling       if tp.include?("dorm"         ) && stories < 5
  typ = :dwelling       if tp.include?("otel"         ) && stories < 5
  typ = :dwelling       if tp.include?("residential"  ) && stories < 5
  typ = :dwelling       if tp.include?("long-term"    ) && stories < 5
  typ = :dwelling       if tp.include?("dwelling"     ) && stories < 5
  typ = :dwelling       if tp.include?("lodging"      ) && stories < 5
  typ = :dwelling       if tp.include?("RP-28"        ) && stories < 5
  typ = :dwelling       if tp.include?("guest"        ) && stories < 5
  typ = :library3       if tp.include?("library"      )
  typ = :library        if tp.include?("library"      ) && stories < 3
  typ = :school3        if tp.include?("school"       )
  typ = :school3        if tp.include?("classroom"    )
  typ = :school3        if tp.include?("lab"          )
  typ = :school3        if tp.include?("auditorium"   )
  typ = :school         if tp.include?("school"       ) && stories < 3
  typ = :school         if tp.include?("classroom"    ) && stories < 3
  typ = :school         if tp.include?("lab"          ) && stories < 3
  typ = :school         if tp.include?("auditorium"   ) && stories < 3
  typ = :convention     if tp.include?("convention"   )
  typ = :dining         if tp.include?("dining"       )
  typ = :dining         if tp.include?("food"         )
  typ = :health         if tp.include?("health"       )
  typ = :hospital       if tp.include?("hospital"     )
  typ = :hospital       if tp.include?("emergency"    )
  typ = :hospital       if tp.include?("laundry"      )
  typ = :hospital       if tp.include?("pharmacy"     )
  typ = :motion         if tp.include?("motion"       )
  typ = :performance    if tp.include?("perform"      )
  typ = :police         if tp.include?("police"       )
  typ = :retail         if tp.include?("retail"       )
  typ = :retail         if tp.include?("sales"        )
  typ = :town           if tp.include?("town"         )

  typ
end