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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 551371a237284715450e716fba2b269ae37d1f54f348311acbf50245c8df0b29
4
- data.tar.gz: ea3e0c6489c60e354518c3a38516fb70fda77d9250772e5db2995c32e6bc17c5
3
+ metadata.gz: cb6b147213a6c055e7b7970c44786b22ba050f0aa2f935079fcd33d1b692a874
4
+ data.tar.gz: a19bb5aa01a18c44cca0b7048a1cd5dfcbb287d2f746a08363f9951edfc1c585
5
5
  SHA512:
6
- metadata.gz: 2779d70ffa38269af0eea2cd7cd83bab7223f55b0c22a198fc2b0c612454441bda39eb9ef129c2480109a83060da6a84ee81901fad42c3b19691ef6bb297f1d1
7
- data.tar.gz: 7cab12e47384c1aad5b86960a21c042f96b07b8912c910314925e235c817c3e2618c4d3a90155834294c31831943e3c4c3124178afe27c1dc540cb92b77aa825
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
- test_380x:
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.8.0
83
- docker run --name test --rm -d -t -v $(pwd):/work -w /work nrel/openstudio:3.8.0
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
- test_390x:
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.9.0
99
- docker run --name test --rm -d -t -v $(pwd):/work -w /work nrel/openstudio:3.9.0
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
- test_3100x:
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.10.0
115
- docker run --name test --rm -d -t -v $(pwd):/work -w /work nrel/openstudio:3.10.0
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>8649cb7e-2e58-4a6d-ba67-911b6e0a41a6</version_id>
7
- <version_modified>2026-01-04T12:08:45Z</version_modified>
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>9CA80CEB</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>B9FB5E02</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>69C2A886</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>BDF50D67</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.downcase == "surface"
306
- empty = surface.adjacentSurface.empty?
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 = surface.adjacentSurface.get.nameString
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 lyr[:index].is_a?(Integer) && lyr[:index].between?(0, lc.numLayers - 1)
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, surface.filmResistance)
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].downcase == "foundation"
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].downcase == "foundation"
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].downcase == "outdoors"
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].downcase == "foundation"
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].downcase == "outdoors"
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
- de_r = RMIN unless de_r > RMIN
1428
- loss = (de_u - 1 / de_r) * net unless de_r > RMIN
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].downcase == "outdoors"
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].downcase
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 = s.get
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, s.filmResistance)
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, s.filmResistance)
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
- s = model.getSurfaceByName(id)
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 initial #{label.to_s} Uo of #{uo} W/m2•K is required to " \
3208
- "achieve an overall Ut of #{ut} W/m2•K for #{g[:op]}"
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