Conversation
| UMAX = KMAX / DMIN # material USi upper limit, 200.000 | ||
| UMIN = KMIN / DMAX # material USi lower limit, 0.010 | ||
| RMIN = 1.0 / UMAX # material RSi lower limit, 0.005 (or R-IP 0.03) | ||
| RMAX = 1.0 / UMIN # material RSi upper limit, 100.000 (or R-IP 567.80) |
There was a problem hiding this comment.
Extending OSut constants to cover material MIN/MAX thresholds, e.g.:
- thickness
- thermal conductivity
- thermal resistance
- thermal conductance
The goal is to ensure that TBD and BTAP inherit the very same constants, preventing conflicts with extreme cases (e.g. when TBD uprates a construction).
| # | ||
| # @return [Bool] whether all layers are valid | ||
| # @return [false] if invalid input (see logs) | ||
| def standardOpaqueLayers?(lc = nil) |
| a[:clad][:mat] = @@mats[mt] | ||
| a[:clad][:d ] = d | ||
| a[:clad][:id ] = "OSut|#{mt}|#{format('%03d', d*1000)[-3..-1]}" | ||
| a[:clad][:id ] = "OSut:#{mt}:#{format('%03d', d*1000)[-3..-1]}" |
There was a problem hiding this comment.
Switching string separating chars, from pipe "|" to colon ":". Inserting pipe chars is not a great idea.
| nom += "|" | ||
| nom += format("%03d", d*1000)[-3..-1] | ||
| k = (layer.thickness / (ro - rsi(c) + lyr[:r])).clamp(KMIN, KMAX) | ||
| d = (k * (ro - rsi(c) + lyr[:r])).clamp(DMIN, DMAX) |
There was a problem hiding this comment.
When adjusting material thermal resistance, the revised approach is to first adjust thermal conductivity (rather than thickness), then thickness if required. Clamping along the way.
| exterior = false | ||
| adjacent = s.adjacentSurface.empty? ? nil : s.adjacentSurface.get | ||
| aspace = adjacent.nil? || adjacent.space.empty? ? nil : adjacent.space.get | ||
| typ = adjacent.nil? ? nil : adjacent.surfaceType |
There was a problem hiding this comment.
Not checking if a surface inherits a default construction from its adjacent:
- surface
- space
- spacetype
- story
... is a big no-no, creating a ton of headaches for both TBD and BTAP. Initial tests are green.
| expect(u).to be_within(TOL).of(uo2) | ||
| expect(surface.layers[1].nameString).to eq("OSut|polyiso|108") | ||
| expect(surface.layers[2].nameString).to eq("OSut|concrete|100") | ||
| expect(surface.layers[1].nameString).to eq("OSut:polyiso:K0.023:100") |
There was a problem hiding this comment.
Whenever a standard OSut material requires a post-generation thermal adjustment, the material is renamed using both its revised thermal conductivity (e.g. "K0.023") and possibly a revised thickness (e.g. "100" mm).
| expect(oID).to eq("90.1-2010 - SmOffice - ASHRAE 169-2013-3B") | ||
| expect(mod1.holdsConstruction?(bset, base, false, false, type)).to be false | ||
|
|
||
| # Check for adjacent surface. |
There was a problem hiding this comment.
Previous iterations of OSut's holdsConstruction? and defaultConstructionSet unfortunately omitted to check for adjacent surfaces. My bad.
| DMIN = 0.010 # min. insulating material thickness | ||
| DMAX = 1.000 # max. insulating material thickness | ||
| KMIN = 0.010 # min. insulating material thermal conductivity | ||
| KMAX = 2.000 # max. insulating material thermal conductivity |
There was a problem hiding this comment.
OpenStudio/EnergyPlus materials can obviously support thermal conductivities way beyond 2.0 (e.g. metals, concrete). OSut methods deal more specifically with opaque materials (in a multilayered construction) that can be labelled as insulating. Sure, a 10mm thick material with a 2.0 thermal conductivity is hardly insulating, but certainly more than a sheet of aluminium.
An effort to harmonize OSut, TBD & BTAP constants/methods when dealing with multilayered constructions and opaque materials.