tbd 3.5.1 → 3.6.0
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.
- checksums.yaml +4 -4
- data/.github/workflows/pull_request.yml +9 -9
- data/lib/measures/tbd/measure.xml +6 -6
- data/lib/measures/tbd/resources/geo.rb +22 -13
- data/lib/measures/tbd/resources/psi.rb +14 -16
- data/lib/measures/tbd/resources/ua.rb +258 -256
- data/lib/measures/tbd/resources/utils.rb +102 -16
- data/lib/tbd/geo.rb +22 -13
- data/lib/tbd/psi.rb +14 -16
- data/lib/tbd/ua.rb +258 -256
- data/lib/tbd/version.rb +1 -1
- data/tbd.gemspec +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cb6b147213a6c055e7b7970c44786b22ba050f0aa2f935079fcd33d1b692a874
|
|
4
|
+
data.tar.gz: a19bb5aa01a18c44cca0b7048a1cd5dfcbb287d2f746a08363f9951edfc1c585
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 962a2c9d02edfd6eae2b0dd81fcd1e4b84e5ab437328c3bde0705942a3697131d7c8136d05d706903574837b4fb5fccf1a54d89773b51f5010ee0ad4e4279f75
|
|
7
|
+
data.tar.gz: 980abb816039d7acd1ba61a30cc19cef98d5bf131249e4c04084975660ee5b7154ea81af661149119c32f261344f507402c8b492b36c3be9ebdd57fdfc3861ce
|
|
@@ -70,7 +70,7 @@ jobs:
|
|
|
70
70
|
docker exec -t test bundle update
|
|
71
71
|
docker exec -t test bundle exec rake
|
|
72
72
|
docker kill test
|
|
73
|
-
|
|
73
|
+
test_390x:
|
|
74
74
|
runs-on: ubuntu-22.04
|
|
75
75
|
steps:
|
|
76
76
|
- name: Check out repository
|
|
@@ -79,14 +79,14 @@ jobs:
|
|
|
79
79
|
run: |
|
|
80
80
|
echo $(pwd)
|
|
81
81
|
echo $(ls)
|
|
82
|
-
docker pull nrel/openstudio:3.
|
|
83
|
-
docker run --name test --rm -d -t -v $(pwd):/work -w /work nrel/openstudio:3.
|
|
82
|
+
docker pull nrel/openstudio:3.9.0
|
|
83
|
+
docker run --name test --rm -d -t -v $(pwd):/work -w /work nrel/openstudio:3.9.0
|
|
84
84
|
docker exec -t test pwd
|
|
85
85
|
docker exec -t test ls
|
|
86
86
|
docker exec -t test bundle update
|
|
87
87
|
docker exec -t test bundle exec rake
|
|
88
88
|
docker kill test
|
|
89
|
-
|
|
89
|
+
test_310x:
|
|
90
90
|
runs-on: ubuntu-22.04
|
|
91
91
|
steps:
|
|
92
92
|
- name: Check out repository
|
|
@@ -95,14 +95,14 @@ jobs:
|
|
|
95
95
|
run: |
|
|
96
96
|
echo $(pwd)
|
|
97
97
|
echo $(ls)
|
|
98
|
-
docker pull nrel/openstudio:3.
|
|
99
|
-
docker run --name test --rm -d -t -v $(pwd):/work -w /work nrel/openstudio:3.
|
|
98
|
+
docker pull nrel/openstudio:3.10.0
|
|
99
|
+
docker run --name test --rm -d -t -v $(pwd):/work -w /work nrel/openstudio:3.10.0
|
|
100
100
|
docker exec -t test pwd
|
|
101
101
|
docker exec -t test ls
|
|
102
102
|
docker exec -t test bundle update
|
|
103
103
|
docker exec -t test bundle exec rake
|
|
104
104
|
docker kill test
|
|
105
|
-
|
|
105
|
+
test_311x:
|
|
106
106
|
runs-on: ubuntu-22.04
|
|
107
107
|
steps:
|
|
108
108
|
- name: Check out repository
|
|
@@ -111,8 +111,8 @@ jobs:
|
|
|
111
111
|
run: |
|
|
112
112
|
echo $(pwd)
|
|
113
113
|
echo $(ls)
|
|
114
|
-
docker pull nrel/openstudio:3.
|
|
115
|
-
docker run --name test --rm -d -t -v $(pwd):/work -w /work nrel/openstudio:3.
|
|
114
|
+
docker pull nrel/openstudio:3.11.0
|
|
115
|
+
docker run --name test --rm -d -t -v $(pwd):/work -w /work nrel/openstudio:3.11.0
|
|
116
116
|
docker exec -t test pwd
|
|
117
117
|
docker exec -t test ls
|
|
118
118
|
docker exec -t test bundle update
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
<schema_version>3.1</schema_version>
|
|
4
4
|
<name>tbd_measure</name>
|
|
5
5
|
<uid>8890787b-8c25-4dc8-8641-b6be1b6c2357</uid>
|
|
6
|
-
<version_id>
|
|
7
|
-
<version_modified>2026-
|
|
6
|
+
<version_id>4934dc58-443d-436f-9358-2d221b4de65a</version_id>
|
|
7
|
+
<version_modified>2026-04-17T10:47:02Z</version_modified>
|
|
8
8
|
<xml_checksum>99772807</xml_checksum>
|
|
9
9
|
<class_name>TBDMeasure</class_name>
|
|
10
10
|
<display_name>Thermal Bridging and Derating - TBD</display_name>
|
|
@@ -499,7 +499,7 @@
|
|
|
499
499
|
<filename>geo.rb</filename>
|
|
500
500
|
<filetype>rb</filetype>
|
|
501
501
|
<usage_type>resource</usage_type>
|
|
502
|
-
<checksum>
|
|
502
|
+
<checksum>AD9546E1</checksum>
|
|
503
503
|
</file>
|
|
504
504
|
<file>
|
|
505
505
|
<filename>geometry.rb</filename>
|
|
@@ -523,7 +523,7 @@
|
|
|
523
523
|
<filename>psi.rb</filename>
|
|
524
524
|
<filetype>rb</filetype>
|
|
525
525
|
<usage_type>resource</usage_type>
|
|
526
|
-
<checksum>
|
|
526
|
+
<checksum>9F7B97ED</checksum>
|
|
527
527
|
</file>
|
|
528
528
|
<file>
|
|
529
529
|
<filename>tbd.rb</filename>
|
|
@@ -541,13 +541,13 @@
|
|
|
541
541
|
<filename>ua.rb</filename>
|
|
542
542
|
<filetype>rb</filetype>
|
|
543
543
|
<usage_type>resource</usage_type>
|
|
544
|
-
<checksum>
|
|
544
|
+
<checksum>0FB3F654</checksum>
|
|
545
545
|
</file>
|
|
546
546
|
<file>
|
|
547
547
|
<filename>utils.rb</filename>
|
|
548
548
|
<filetype>rb</filetype>
|
|
549
549
|
<usage_type>resource</usage_type>
|
|
550
|
-
<checksum>
|
|
550
|
+
<checksum>26EC8C4F</checksum>
|
|
551
551
|
</file>
|
|
552
552
|
<file>
|
|
553
553
|
<filename>version.rb</filename>
|
|
@@ -299,14 +299,16 @@ module TBD
|
|
|
299
299
|
return invalid("#{nom} normal", mth, 0, ERR) unless n
|
|
300
300
|
|
|
301
301
|
type = surface.surfaceType.downcase
|
|
302
|
-
facing = surface.outsideBoundaryCondition
|
|
302
|
+
facing = surface.outsideBoundaryCondition.downcase
|
|
303
|
+
interz = false
|
|
303
304
|
setpts = setpoints(space)
|
|
304
305
|
|
|
305
|
-
if facing
|
|
306
|
-
|
|
307
|
-
return invalid("#{nom}: adjacent surface", mth, 0, ERR) if empty
|
|
306
|
+
if facing == "surface"
|
|
307
|
+
adj = surface.adjacentSurface
|
|
308
|
+
return invalid("#{nom}: adjacent surface", mth, 0, ERR) if adj.empty?
|
|
308
309
|
|
|
309
|
-
facing =
|
|
310
|
+
facing = adj.get.nameString
|
|
311
|
+
interz = true
|
|
310
312
|
end
|
|
311
313
|
|
|
312
314
|
unless surface.construction.empty?
|
|
@@ -315,8 +317,9 @@ module TBD
|
|
|
315
317
|
unless lc.empty?
|
|
316
318
|
lc = lc.get
|
|
317
319
|
lyr = insulatingLayer(lc)
|
|
320
|
+
idx = lyr[:index]
|
|
318
321
|
|
|
319
|
-
if
|
|
322
|
+
if idx.is_a?(Integer) && idx.between?(0, lc.numLayers - 1)
|
|
320
323
|
surf[:construction] = lc
|
|
321
324
|
# index: ... of layer/material (to derate) within construction
|
|
322
325
|
# ltype: either :massless (RSi) or :standard (k + d)
|
|
@@ -358,8 +361,14 @@ module TBD
|
|
|
358
361
|
surf[:story ] = story.get unless story.empty?
|
|
359
362
|
surf[:n ] = n
|
|
360
363
|
surf[:gross ] = surface.grossArea
|
|
361
|
-
surf[:filmRSI ] = surface.filmResistance
|
|
362
364
|
surf[:spandrel ] = spandrel?(surface)
|
|
365
|
+
surf[:filmRSI ] = surface.filmResistance
|
|
366
|
+
|
|
367
|
+
if interz
|
|
368
|
+
typ = :ceiling # interzone roof or ceiling
|
|
369
|
+
typ = :partition if surf[:type] == :wall
|
|
370
|
+
surf[:filmRSI] = TBD.filmResistances(typ, surface.tilt)
|
|
371
|
+
end
|
|
363
372
|
|
|
364
373
|
surface.subSurfaces.sort_by { |s| s.nameString }.each do |s|
|
|
365
374
|
next if poly(s).empty?
|
|
@@ -508,7 +517,7 @@ module TBD
|
|
|
508
517
|
end
|
|
509
518
|
|
|
510
519
|
unless u.is_a?(Numeric)
|
|
511
|
-
r = rsi(c,
|
|
520
|
+
r = rsi(c, surf[:filmRSI])
|
|
512
521
|
|
|
513
522
|
if r < TOL
|
|
514
523
|
log(ERR, "Skipping '#{id}': U-factor unavailable (#{mth})")
|
|
@@ -831,7 +840,7 @@ module TBD
|
|
|
831
840
|
edge[:surfaces].keys.each do |id|
|
|
832
841
|
next unless floors.key?(id)
|
|
833
842
|
|
|
834
|
-
next unless floors[id][:boundary]
|
|
843
|
+
next unless floors[id][:boundary] == "foundation"
|
|
835
844
|
next if floors[id].key?(:kiva)
|
|
836
845
|
|
|
837
846
|
# Initially set as slab-on-grade. Track 'exposed foundation perimeter'.
|
|
@@ -845,7 +854,7 @@ module TBD
|
|
|
845
854
|
edge[:surfaces].keys.each do |i|
|
|
846
855
|
next if i == id
|
|
847
856
|
next unless walls.key?(i)
|
|
848
|
-
next unless walls[i][:boundary]
|
|
857
|
+
next unless walls[i][:boundary] == "foundation"
|
|
849
858
|
next if walls[i].key?(:kiva)
|
|
850
859
|
|
|
851
860
|
floors[id][:kiva ] = :basement
|
|
@@ -857,7 +866,7 @@ module TBD
|
|
|
857
866
|
edge[:surfaces].keys.each do |i|
|
|
858
867
|
next if i == id
|
|
859
868
|
next unless walls.key?(i)
|
|
860
|
-
next unless walls[i][:boundary]
|
|
869
|
+
next unless walls[i][:boundary] == "outdoors"
|
|
861
870
|
|
|
862
871
|
floors[id][:exposed] += edge[:length]
|
|
863
872
|
end
|
|
@@ -872,7 +881,7 @@ module TBD
|
|
|
872
881
|
e[:surfaces].keys.each do |ii|
|
|
873
882
|
next if i == ii
|
|
874
883
|
next unless walls.key?(ii)
|
|
875
|
-
next unless walls[ii][:boundary]
|
|
884
|
+
next unless walls[ii][:boundary] == "foundation"
|
|
876
885
|
next if walls[ii].key?(:kiva)
|
|
877
886
|
|
|
878
887
|
floors[id][:kiva ] = :basement
|
|
@@ -883,7 +892,7 @@ module TBD
|
|
|
883
892
|
e[:surfaces].keys.each do |ii|
|
|
884
893
|
next if i == ii
|
|
885
894
|
next unless walls.key?(ii)
|
|
886
|
-
next unless walls[ii][:boundary]
|
|
895
|
+
next unless walls[ii][:boundary] == "outdoors"
|
|
887
896
|
|
|
888
897
|
floors[id][:exposed] += e[:length]
|
|
889
898
|
end
|
|
@@ -1424,8 +1424,10 @@ module TBD
|
|
|
1424
1424
|
m = m.clone(model).to_MasslessOpaqueMaterial.get
|
|
1425
1425
|
m.setName("#{id} #{up}m tbd")
|
|
1426
1426
|
|
|
1427
|
-
|
|
1428
|
-
|
|
1427
|
+
if de_r < RMIN
|
|
1428
|
+
de_r = RMIN
|
|
1429
|
+
loss = (de_u - 1 / de_r) * net
|
|
1430
|
+
end
|
|
1429
1431
|
|
|
1430
1432
|
unless m.setThermalResistance(de_r)
|
|
1431
1433
|
return invalid("Can't derate #{id}: RSi#{de_r.round(2)}", mth)
|
|
@@ -1555,7 +1557,7 @@ module TBD
|
|
|
1555
1557
|
next unless surface[:conditioned]
|
|
1556
1558
|
next if surface[:ground ]
|
|
1557
1559
|
|
|
1558
|
-
unless surface[:boundary]
|
|
1560
|
+
unless surface[:boundary] == "outdoors"
|
|
1559
1561
|
next unless tbd[:surfaces].key?(surface[:boundary])
|
|
1560
1562
|
next if tbd[:surfaces][surface[:boundary]][:conditioned]
|
|
1561
1563
|
end
|
|
@@ -2202,7 +2204,7 @@ module TBD
|
|
|
2202
2204
|
next if holes.key?(i)
|
|
2203
2205
|
next if shades.key?(i)
|
|
2204
2206
|
|
|
2205
|
-
facing = tbd[:surfaces][i][:boundary]
|
|
2207
|
+
facing = tbd[:surfaces][i][:boundary]
|
|
2206
2208
|
next unless facing == "othersidecoefficients"
|
|
2207
2209
|
|
|
2208
2210
|
s1 = edge[:surfaces][id]
|
|
@@ -2971,6 +2973,7 @@ module TBD
|
|
|
2971
2973
|
# derate a construction/material pair having " tbd" in their OpenStudio name.
|
|
2972
2974
|
tbd[:surfaces].each do |id, surface|
|
|
2973
2975
|
next unless surface.key?(:construction)
|
|
2976
|
+
next unless surface.key?(:filmRSI)
|
|
2974
2977
|
next unless surface.key?(:index)
|
|
2975
2978
|
next unless surface.key?(:ltype)
|
|
2976
2979
|
next unless surface.key?(:r)
|
|
@@ -2981,8 +2984,7 @@ module TBD
|
|
|
2981
2984
|
s = model.getSurfaceByName(id)
|
|
2982
2985
|
next if s.empty?
|
|
2983
2986
|
|
|
2984
|
-
s
|
|
2985
|
-
|
|
2987
|
+
s = s.get
|
|
2986
2988
|
index = surface[:index ]
|
|
2987
2989
|
current_c = surface[:construction]
|
|
2988
2990
|
c = current_c.clone(model).to_LayeredConstruction.get
|
|
@@ -2995,7 +2997,7 @@ module TBD
|
|
|
2995
2997
|
if m
|
|
2996
2998
|
c.setLayer(index, m)
|
|
2997
2999
|
c.setName("#{id} c tbd")
|
|
2998
|
-
current_R = rsi(current_c,
|
|
3000
|
+
current_R = rsi(current_c, surface[:filmRSI])
|
|
2999
3001
|
|
|
3000
3002
|
# In principle, the derated "ratio" could be calculated simply by
|
|
3001
3003
|
# accessing a surface's uFactor. Yet air layers within constructions
|
|
@@ -3035,7 +3037,7 @@ module TBD
|
|
|
3035
3037
|
|
|
3036
3038
|
# Compute updated RSi value from layers.
|
|
3037
3039
|
updated_c = s.construction.get.to_LayeredConstruction.get
|
|
3038
|
-
updated_R = rsi(updated_c,
|
|
3040
|
+
updated_R = rsi(updated_c, surface[:filmRSI])
|
|
3039
3041
|
ratio = -(current_R - updated_R) * 100 / current_R
|
|
3040
3042
|
|
|
3041
3043
|
surface[:ratio] = ratio if ratio.abs > TOL
|
|
@@ -3047,14 +3049,10 @@ module TBD
|
|
|
3047
3049
|
tbd[:surfaces].each do |id, surface|
|
|
3048
3050
|
next unless surface[:deratable]
|
|
3049
3051
|
next unless surface.key?(:construction)
|
|
3052
|
+
next unless surface.key?(:filmRSI)
|
|
3050
3053
|
next if surface.key?(:u)
|
|
3051
3054
|
|
|
3052
|
-
|
|
3053
|
-
msg = "Skipping missing surface '#{id}' (#{mth})"
|
|
3054
|
-
log(ERR, msg) if s.empty?
|
|
3055
|
-
next if s.empty?
|
|
3056
|
-
|
|
3057
|
-
surface[:u] = 1.0 / rsi(surface[:construction], s.get.filmResistance)
|
|
3055
|
+
surface[:u] = 1.0 / rsi(surface[:construction], surface[:filmRSI])
|
|
3058
3056
|
end
|
|
3059
3057
|
|
|
3060
3058
|
json[:io][:edges] = []
|
|
@@ -3204,8 +3202,8 @@ module TBD
|
|
|
3204
3202
|
|
|
3205
3203
|
uo = format("%.3f", g[:uo])
|
|
3206
3204
|
ut = format("%.3f", g[:ut])
|
|
3207
|
-
output = "An
|
|
3208
|
-
"
|
|
3205
|
+
output = "An area-weighted #{label.to_s} Uo of #{uo} W/m2•K is " \
|
|
3206
|
+
"required to meet an overall Ut of #{ut} W/m2•K for #{g[:op]}"
|
|
3209
3207
|
u_t << output
|
|
3210
3208
|
runner.registerInfo(output)
|
|
3211
3209
|
end
|