Skip to content

Conversation

@brgix
Copy link
Member

@brgix brgix commented Sep 7, 2025

An effort to harmonize OSut, TBD & BTAP constants/methods when dealing with multilayered constructions and opaque materials.

@brgix brgix self-assigned this Sep 7, 2025
@brgix brgix added the enhancement New feature or request label Sep 7, 2025
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)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reordering methods.

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]}"
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
Copy link
Member Author

@brgix brgix Sep 7, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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")
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@brgix brgix merged commit 427aed1 into develop Sep 10, 2025
7 checks passed
@brgix brgix deleted the tbd branch September 10, 2025 18:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants