tbd 3.4.2 → 3.4.4
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 +16 -0
- data/Rakefile +1 -1
- data/lib/measures/tbd/measure.xml +7 -7
- data/lib/measures/tbd/resources/geo.rb +16 -13
- data/lib/measures/tbd/resources/psi.rb +21 -44
- data/lib/measures/tbd/resources/tbd.rb +10 -10
- data/lib/measures/tbd/resources/ua.rb +8 -8
- data/lib/measures/tbd/resources/utils.rb +1354 -895
- data/lib/tbd/geo.rb +16 -13
- data/lib/tbd/psi.rb +21 -44
- data/lib/tbd/ua.rb +8 -8
- data/lib/tbd/version.rb +1 -1
- data/lib/tbd.rb +13 -13
- data/tbd.schema.json +5 -5
- metadata +4 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 24c3c1ce27d2513d0f1529795e7016ad07a69e3499d5e79f7164698e1a16dc48
|
|
4
|
+
data.tar.gz: f23f7f85a54bcc551179ba751e826dc2951520e4ad0e17eaafad8fac01cea9fc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 02cb220811ddcc388c7ae20d17ffc2cfc0b64322605d5c571c2fbd1e325018ec44c7801b7aa0b0d7f2481ec0f0ebee25061130ccd7814f5badf7cb3b01fce625
|
|
7
|
+
data.tar.gz: 7cf328dca053b90d53c05f070c36f13a7ac9b9813435276ddaf9c14a4bc24e4d287ed7ffb698a6e3f1e5a71822b0f568bfa48155053620a3297d497a4cac5c21
|
|
@@ -134,3 +134,19 @@ jobs:
|
|
|
134
134
|
docker exec -t test bundle update
|
|
135
135
|
docker exec -t test bundle exec rake
|
|
136
136
|
docker kill test
|
|
137
|
+
test_390x:
|
|
138
|
+
runs-on: ubuntu-22.04
|
|
139
|
+
steps:
|
|
140
|
+
- name: Check out repository
|
|
141
|
+
uses: actions/checkout@v2
|
|
142
|
+
- name: Run Tests
|
|
143
|
+
run: |
|
|
144
|
+
echo $(pwd)
|
|
145
|
+
echo $(ls)
|
|
146
|
+
docker pull nrel/openstudio:3.9.0
|
|
147
|
+
docker run --name test --rm -d -t -v $(pwd):/work -w /work nrel/openstudio:3.9.0
|
|
148
|
+
docker exec -t test pwd
|
|
149
|
+
docker exec -t test ls
|
|
150
|
+
docker exec -t test bundle update
|
|
151
|
+
docker exec -t test bundle exec rake
|
|
152
|
+
docker kill test
|
data/Rakefile
CHANGED
|
@@ -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>2024-
|
|
6
|
+
<version_id>70223737-c3ea-4df0-8506-67083c92fb6e</version_id>
|
|
7
|
+
<version_modified>2024-11-20T20:02:15Z</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>9FAC0CDC</checksum>
|
|
503
503
|
</file>
|
|
504
504
|
<file>
|
|
505
505
|
<filename>geometry.rb</filename>
|
|
@@ -523,13 +523,13 @@
|
|
|
523
523
|
<filename>psi.rb</filename>
|
|
524
524
|
<filetype>rb</filetype>
|
|
525
525
|
<usage_type>resource</usage_type>
|
|
526
|
-
<checksum>
|
|
526
|
+
<checksum>4B7F3586</checksum>
|
|
527
527
|
</file>
|
|
528
528
|
<file>
|
|
529
529
|
<filename>tbd.rb</filename>
|
|
530
530
|
<filetype>rb</filetype>
|
|
531
531
|
<usage_type>resource</usage_type>
|
|
532
|
-
<checksum>
|
|
532
|
+
<checksum>FCCCAE84</checksum>
|
|
533
533
|
</file>
|
|
534
534
|
<file>
|
|
535
535
|
<filename>transformation.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>626D3BE0</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>CBC3935D</checksum>
|
|
551
551
|
</file>
|
|
552
552
|
<file>
|
|
553
553
|
<filename>version.rb</filename>
|
|
@@ -722,15 +722,10 @@ module TBD
|
|
|
722
722
|
kva = true unless surface.surfacePropertyExposedFoundationPerimeter.empty?
|
|
723
723
|
surface.resetAdjacentFoundation
|
|
724
724
|
surface.resetSurfacePropertyExposedFoundationPerimeter
|
|
725
|
-
next unless surface.isGroundSurface
|
|
726
725
|
next if surface.outsideBoundaryCondition.capitalize == boundary
|
|
726
|
+
next unless surface.outsideBoundaryCondition.capitalize == "Foundation"
|
|
727
727
|
|
|
728
|
-
lc = surface.construction.empty? ? nil : surface.construction.get
|
|
729
728
|
surface.setOutsideBoundaryCondition(boundary)
|
|
730
|
-
next if boundary == "Ground"
|
|
731
|
-
next if lc.nil?
|
|
732
|
-
|
|
733
|
-
surface.setConstruction(lc) if surface.construction.empty?
|
|
734
729
|
end
|
|
735
730
|
|
|
736
731
|
perimeters = model.getSurfacePropertyExposedFoundationPerimeters
|
|
@@ -834,11 +829,16 @@ module TBD
|
|
|
834
829
|
edges.each do |code1, edge|
|
|
835
830
|
edge[:surfaces].keys.each do |id|
|
|
836
831
|
next unless floors.key?(id)
|
|
832
|
+
|
|
837
833
|
next unless floors[id][:boundary].downcase == "foundation"
|
|
838
834
|
next if floors[id].key?(:kiva)
|
|
839
835
|
|
|
840
|
-
|
|
841
|
-
|
|
836
|
+
# Initially set as slab-on-grade. Track 'exposed foundation perimeter'.
|
|
837
|
+
# - outdoor wall/slab-on-grade edge lengths
|
|
838
|
+
# - outdoor wall/basement slab walkout edge lengths
|
|
839
|
+
# - basement wall/basement slab edge lengths
|
|
840
|
+
floors[id][:kiva ] = :slab
|
|
841
|
+
floors[id][:exposed] = 0.0
|
|
842
842
|
|
|
843
843
|
# Loop around current edge.
|
|
844
844
|
edge[:surfaces].keys.each do |i|
|
|
@@ -847,8 +847,9 @@ module TBD
|
|
|
847
847
|
next unless walls[i][:boundary].downcase == "foundation"
|
|
848
848
|
next if walls[i].key?(:kiva)
|
|
849
849
|
|
|
850
|
-
floors[id][:kiva]
|
|
851
|
-
|
|
850
|
+
floors[id][:kiva ] = :basement
|
|
851
|
+
floors[id][:exposed] += edge[:length]
|
|
852
|
+
walls[i ][:kiva ] = id
|
|
852
853
|
end
|
|
853
854
|
|
|
854
855
|
# Loop around current edge.
|
|
@@ -862,7 +863,7 @@ module TBD
|
|
|
862
863
|
|
|
863
864
|
# Loop around other floor edges.
|
|
864
865
|
edges.each do |code2, e|
|
|
865
|
-
next if code1 == code2 #
|
|
866
|
+
next if code1 == code2 # skip - same edge
|
|
866
867
|
|
|
867
868
|
e[:surfaces].keys.each do |i|
|
|
868
869
|
next unless i == id # good - same floor
|
|
@@ -873,8 +874,9 @@ module TBD
|
|
|
873
874
|
next unless walls[ii][:boundary].downcase == "foundation"
|
|
874
875
|
next if walls[ii].key?(:kiva)
|
|
875
876
|
|
|
876
|
-
floors[id][:kiva]
|
|
877
|
-
walls[ii ][:kiva]
|
|
877
|
+
floors[id][:kiva ] = :basement
|
|
878
|
+
walls[ii ][:kiva ] = id
|
|
879
|
+
floors[id][:exposed] += e[:length]
|
|
878
880
|
end
|
|
879
881
|
|
|
880
882
|
e[:surfaces].keys.each do |ii|
|
|
@@ -889,6 +891,7 @@ module TBD
|
|
|
889
891
|
|
|
890
892
|
foundation = OpenStudio::Model::FoundationKiva.new(model)
|
|
891
893
|
foundation.setName("KIVA Foundation Floor #{id}")
|
|
894
|
+
|
|
892
895
|
floor = model.getSurfaceByName(id)
|
|
893
896
|
kiva = false if floor.empty?
|
|
894
897
|
next if floor.empty?
|
|
@@ -1678,8 +1678,8 @@ module TBD
|
|
|
1678
1678
|
# around edge with respect to a reference vector (perpendicular to the
|
|
1679
1679
|
# edge), +clockwise as one is looking in the opposite position of the edge
|
|
1680
1680
|
# vector. For instance, a vertical edge has a reference vector pointing
|
|
1681
|
-
# North - surfaces eastward of the edge are (
|
|
1682
|
-
# westward of the edge are (
|
|
1681
|
+
# North - surfaces eastward of the edge are (0deg,180deg], while surfaces
|
|
1682
|
+
# westward of the edge are (180deg,360deg].
|
|
1683
1683
|
#
|
|
1684
1684
|
# Much of the following code is of a topological nature, and should ideally
|
|
1685
1685
|
# (or eventually) become available functionality offered by Topolys. Topolys
|
|
@@ -1717,54 +1717,31 @@ module TBD
|
|
|
1717
1717
|
t_model.wires.each do |wire|
|
|
1718
1718
|
next unless surface[:wire] == wire.id # should be a unique match
|
|
1719
1719
|
|
|
1720
|
-
normal
|
|
1721
|
-
normal
|
|
1722
|
-
normal
|
|
1723
|
-
farthest
|
|
1724
|
-
farthest_V
|
|
1725
|
-
|
|
1726
|
-
i_origin = wire.points.index(origin)
|
|
1727
|
-
i_terminal = wire.points.index(terminal)
|
|
1728
|
-
i_last = wire.points.size - 1
|
|
1729
|
-
|
|
1730
|
-
if i_terminal == 0
|
|
1731
|
-
inverted = true unless i_origin == i_last
|
|
1732
|
-
elsif i_origin == i_last
|
|
1733
|
-
inverted = true unless i_terminal == 0
|
|
1734
|
-
else
|
|
1735
|
-
inverted = true unless i_terminal - i_origin == 1
|
|
1736
|
-
end
|
|
1720
|
+
normal = tbd[:surfaces][id][:n] if tbd[:surfaces].key?(id)
|
|
1721
|
+
normal = holes[id].attributes[:n] if holes.key?(id)
|
|
1722
|
+
normal = shades[id][:n] if shades.key?(id)
|
|
1723
|
+
farthest = Topolys::Point3D.new(origin.x, origin.y, origin.z)
|
|
1724
|
+
farthest_V = farthest - origin # zero magnitude, initially
|
|
1725
|
+
farthest_mag = 0
|
|
1737
1726
|
|
|
1738
1727
|
wire.points.each do |point|
|
|
1739
1728
|
next if point == origin
|
|
1740
1729
|
next if point == terminal
|
|
1741
1730
|
|
|
1742
|
-
point_on_plane
|
|
1743
|
-
origin_point_V
|
|
1744
|
-
|
|
1745
|
-
next unless
|
|
1746
|
-
|
|
1747
|
-
# Generate a plane between origin, terminal & point. Only consider
|
|
1748
|
-
# planes that share the same normal as wire.
|
|
1749
|
-
if inverted
|
|
1750
|
-
plane = Topolys::Plane3D.from_points(terminal, origin, point)
|
|
1751
|
-
else
|
|
1752
|
-
plane = Topolys::Plane3D.from_points(origin, terminal, point)
|
|
1753
|
-
end
|
|
1754
|
-
|
|
1755
|
-
dnx = (normal.x - plane.normal.x).abs
|
|
1756
|
-
dny = (normal.y - plane.normal.y).abs
|
|
1757
|
-
dnz = (normal.z - plane.normal.z).abs
|
|
1758
|
-
next unless dnx < TOL && dny < TOL && dnz < TOL
|
|
1731
|
+
point_on_plane = edge_plane.project(point)
|
|
1732
|
+
origin_point_V = point_on_plane - origin
|
|
1733
|
+
point_V_mag = origin_point_V.magnitude
|
|
1734
|
+
next unless point_V_mag > TOL
|
|
1735
|
+
next unless point_V_mag > farthest_mag
|
|
1759
1736
|
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1737
|
+
farthest = point
|
|
1738
|
+
farthest_V = origin_point_V
|
|
1739
|
+
fathest_mag = point_V_mag
|
|
1763
1740
|
end
|
|
1764
1741
|
|
|
1765
1742
|
angle = reference_V.angle(farthest_V)
|
|
1766
1743
|
angle = 0 if angle.nil?
|
|
1767
|
-
adjust = false # adjust angle [
|
|
1744
|
+
adjust = false # adjust angle [180deg, 360deg] if necessary
|
|
1768
1745
|
|
|
1769
1746
|
if vertical
|
|
1770
1747
|
adjust = true if east.dot(farthest_V) < -TOL
|
|
@@ -2125,7 +2102,7 @@ module TBD
|
|
|
2125
2102
|
end
|
|
2126
2103
|
|
|
2127
2104
|
# Label edge as :ceiling if linked to:
|
|
2128
|
-
# +1 deratable
|
|
2105
|
+
# +1 deratable surface(s)
|
|
2129
2106
|
# 1x underatable CONDITIONED floor linked to an unoccupied space
|
|
2130
2107
|
# 1x adjacent CONDITIONED ceiling linked to an occupied space
|
|
2131
2108
|
edge[:surfaces].keys.each do |i|
|
|
@@ -2139,9 +2116,9 @@ module TBD
|
|
|
2139
2116
|
next if floors[i][:occupied ]
|
|
2140
2117
|
|
|
2141
2118
|
ceiling = floors[i][:boundary]
|
|
2142
|
-
next
|
|
2143
|
-
next
|
|
2144
|
-
next
|
|
2119
|
+
next unless ceilings.key?(ceiling)
|
|
2120
|
+
next unless ceilings[ceiling][:conditioned]
|
|
2121
|
+
next unless ceilings[ceiling][:occupied ]
|
|
2145
2122
|
|
|
2146
2123
|
other = deratables.first unless deratables.first == id
|
|
2147
2124
|
other = deratables.last unless deratables.last == id
|
|
@@ -40,16 +40,16 @@ require_relative "geo"
|
|
|
40
40
|
require_relative "ua"
|
|
41
41
|
|
|
42
42
|
module TBD
|
|
43
|
-
extend OSut
|
|
44
|
-
|
|
45
|
-
TOL = OSut::TOL
|
|
46
|
-
TOL2 = OSut::TOL2
|
|
47
|
-
DBG = OSut::DEBUG
|
|
48
|
-
INF = OSut::INFO
|
|
49
|
-
WRN = OSut::WARN
|
|
50
|
-
ERR = OSut::ERR
|
|
51
|
-
FTL = OSut::FATAL
|
|
52
|
-
NS =
|
|
43
|
+
extend OSut # OpenStudio utilities
|
|
44
|
+
|
|
45
|
+
TOL = OSut::TOL.dup # default distance tolerance (m)
|
|
46
|
+
TOL2 = OSut::TOL2.dup # default area tolerance (m2)
|
|
47
|
+
DBG = OSut::DEBUG.dup # github.com/rd2/oslg
|
|
48
|
+
INF = OSut::INFO.dup # github.com/rd2/oslg
|
|
49
|
+
WRN = OSut::WARN.dup # github.com/rd2/oslg
|
|
50
|
+
ERR = OSut::ERR.dup # github.com/rd2/oslg
|
|
51
|
+
FTL = OSut::FATAL.dup # github.com/rd2/oslg
|
|
52
|
+
NS = OSut::NS.dup # OpenStudio IdfObject nameString method
|
|
53
53
|
|
|
54
54
|
extend TBD
|
|
55
55
|
end
|
|
@@ -422,8 +422,8 @@ module TBD
|
|
|
422
422
|
# @param [Hash] s TBD surfaces (keys: Openstudio surface names)
|
|
423
423
|
# @option s [Bool] :deratable whether surface is deratable, s[][:deratable]
|
|
424
424
|
# @option s [:wall, :ceiling, :floor] :type TBD surface type
|
|
425
|
-
# @option s [#to_f] :heating applicable heating setpoint temperature in
|
|
426
|
-
# @option s [#to_f] :cooling applicable cooling setpoint temperature in
|
|
425
|
+
# @option s [#to_f] :heating applicable heating setpoint temperature in C
|
|
426
|
+
# @option s [#to_f] :cooling applicable cooling setpoint temperature in C
|
|
427
427
|
# @option s [Hash] :windows TBD surface-specific windows e.g. s[][:windows]
|
|
428
428
|
# @option s [Hash] :doors TBD surface-specific doors
|
|
429
429
|
# @option s [Hash] :skylights TBD surface-specific skylights
|
|
@@ -466,7 +466,7 @@ module TBD
|
|
|
466
466
|
ref = 1 / 5.46
|
|
467
467
|
ref = 1 / 3.60 if surface[:type] == :wall
|
|
468
468
|
|
|
469
|
-
# Adjust for lower heating setpoint (assumes -
|
|
469
|
+
# Adjust for lower heating setpoint (assumes -25C design conditions).
|
|
470
470
|
ref *= 43 / (heating + 25) if heating < 18 && cooling > 40
|
|
471
471
|
|
|
472
472
|
surface[:ref] = ref
|
|
@@ -628,8 +628,8 @@ module TBD
|
|
|
628
628
|
end
|
|
629
629
|
|
|
630
630
|
# Set up 2x heating setpoint (HSTP) "blocks" (or bins):
|
|
631
|
-
# bloc1: spaces/zones with HSTP >=
|
|
632
|
-
# bloc2: spaces/zones with HSTP <
|
|
631
|
+
# bloc1: spaces/zones with HSTP >= 18C
|
|
632
|
+
# bloc2: spaces/zones with HSTP < 18C
|
|
633
633
|
# (ref: 2021 Quebec energy code 3.3. UA' trade-off methodology)
|
|
634
634
|
# (... can be extended in the future to cover other standards)
|
|
635
635
|
#
|
|
@@ -799,8 +799,8 @@ module TBD
|
|
|
799
799
|
blc.each do |b|
|
|
800
800
|
bloc = b1
|
|
801
801
|
bloc = b2 if b == :b2
|
|
802
|
-
pro_sum = bloc[:pro].values.
|
|
803
|
-
ref_sum = bloc[:ref].values.
|
|
802
|
+
pro_sum = bloc[:pro].values.sum
|
|
803
|
+
ref_sum = bloc[:ref].values.sum
|
|
804
804
|
|
|
805
805
|
if pro_sum > TOL || ref_sum > TOL
|
|
806
806
|
ratio = nil
|
|
@@ -1000,7 +1000,7 @@ module TBD
|
|
|
1000
1000
|
model = "* modèle : #{ua[:file]}" if ua.key?(:file) && lang == :fr
|
|
1001
1001
|
model += " (v#{ua[:version]})" if ua.key?(:version)
|
|
1002
1002
|
report << model unless model.empty?
|
|
1003
|
-
report << "* TBD : v3.4.
|
|
1003
|
+
report << "* TBD : v3.4.4"
|
|
1004
1004
|
report << "* date : #{ua[:date]}"
|
|
1005
1005
|
|
|
1006
1006
|
if lang == :en
|