structuralcodes 0.5.0__py3-none-any.whl → 0.6.1__py3-none-any.whl

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.

Potentially problematic release.


This version of structuralcodes might be problematic. Click here for more details.

Files changed (48) hide show
  1. structuralcodes/__init__.py +1 -1
  2. structuralcodes/codes/ec2_2004/shear.py +3 -2
  3. structuralcodes/codes/mc2010/_concrete_creep_and_shrinkage.py +2 -2
  4. structuralcodes/core/base.py +138 -12
  5. structuralcodes/geometry/__init__.py +2 -8
  6. structuralcodes/geometry/_geometry.py +103 -19
  7. structuralcodes/geometry/_reinforcement.py +1 -3
  8. structuralcodes/geometry/profiles/__init__.py +33 -0
  9. structuralcodes/geometry/profiles/_base_profile.py +305 -0
  10. structuralcodes/geometry/profiles/_common_functions.py +307 -0
  11. structuralcodes/geometry/profiles/_hd.py +374 -0
  12. structuralcodes/geometry/profiles/_he.py +192 -0
  13. structuralcodes/geometry/profiles/_hp.py +319 -0
  14. structuralcodes/geometry/profiles/_ipe.py +130 -0
  15. structuralcodes/geometry/profiles/_ipn.py +329 -0
  16. structuralcodes/geometry/profiles/_l.py +528 -0
  17. structuralcodes/geometry/profiles/_li.py +217 -0
  18. structuralcodes/geometry/profiles/_u.py +173 -0
  19. structuralcodes/geometry/profiles/_ub.py +1356 -0
  20. structuralcodes/geometry/profiles/_ubp.py +227 -0
  21. structuralcodes/geometry/profiles/_uc.py +276 -0
  22. structuralcodes/geometry/profiles/_upe.py +133 -0
  23. structuralcodes/geometry/profiles/_upn.py +315 -0
  24. structuralcodes/geometry/profiles/_w.py +2157 -0
  25. structuralcodes/materials/basic/_elastic.py +18 -1
  26. structuralcodes/materials/basic/_elasticplastic.py +18 -1
  27. structuralcodes/materials/basic/_generic.py +18 -1
  28. structuralcodes/materials/concrete/__init__.py +3 -0
  29. structuralcodes/materials/concrete/_concrete.py +10 -1
  30. structuralcodes/materials/concrete/_concreteEC2_2004.py +15 -1
  31. structuralcodes/materials/concrete/_concreteEC2_2023.py +15 -1
  32. structuralcodes/materials/concrete/_concreteMC2010.py +20 -1
  33. structuralcodes/materials/constitutive_laws/__init__.py +3 -0
  34. structuralcodes/materials/constitutive_laws/_elasticplastic.py +2 -2
  35. structuralcodes/materials/constitutive_laws/_initial_strain.py +130 -0
  36. structuralcodes/materials/reinforcement/__init__.py +6 -0
  37. structuralcodes/materials/reinforcement/_reinforcement.py +10 -1
  38. structuralcodes/materials/reinforcement/_reinforcementEC2_2004.py +14 -0
  39. structuralcodes/materials/reinforcement/_reinforcementEC2_2023.py +14 -0
  40. structuralcodes/materials/reinforcement/_reinforcementMC2010.py +14 -0
  41. structuralcodes/sections/section_integrators/__init__.py +3 -1
  42. structuralcodes/sections/section_integrators/_marin_integrator.py +1 -1
  43. {structuralcodes-0.5.0.dist-info → structuralcodes-0.6.1.dist-info}/METADATA +2 -2
  44. {structuralcodes-0.5.0.dist-info → structuralcodes-0.6.1.dist-info}/RECORD +47 -30
  45. structuralcodes/geometry/_steel_sections.py +0 -2155
  46. /structuralcodes/{sections/section_integrators → core}/_marin_integration.py +0 -0
  47. {structuralcodes-0.5.0.dist-info → structuralcodes-0.6.1.dist-info}/WHEEL +0 -0
  48. {structuralcodes-0.5.0.dist-info → structuralcodes-0.6.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,227 @@
1
+ """UBP profiles."""
2
+
3
+ from shapely import (
4
+ Polygon,
5
+ )
6
+
7
+ from ._base_profile import BaseProfile
8
+ from ._common_functions import (
9
+ _create_I_section,
10
+ )
11
+
12
+
13
+ class UBP(BaseProfile):
14
+ """Simple class for representing a UBP profile.
15
+
16
+ Universal Bearing Pile.
17
+ """
18
+
19
+ parameters = {
20
+ 'UBP203x203x45': {
21
+ 'h': 200.0,
22
+ 'b': 206.0,
23
+ 'tw': 9.5,
24
+ 'tf': 9.5,
25
+ 'r': 10.0,
26
+ },
27
+ 'UBP203x203x54': {
28
+ 'h': 204.0,
29
+ 'b': 208.0,
30
+ 'tw': 11.3,
31
+ 'tf': 11.4,
32
+ 'r': 10.0,
33
+ },
34
+ 'UBP254x254x63': {
35
+ 'h': 247.0,
36
+ 'b': 257.0,
37
+ 'tw': 10.6,
38
+ 'tf': 10.7,
39
+ 'r': 20.0,
40
+ },
41
+ 'UBP254x254x71': {
42
+ 'h': 250.0,
43
+ 'b': 258.0,
44
+ 'tw': 12.0,
45
+ 'tf': 12.0,
46
+ 'r': 20.0,
47
+ },
48
+ 'UBP254x254x85': {
49
+ 'h': 254.0,
50
+ 'b': 260.0,
51
+ 'tw': 14.4,
52
+ 'tf': 14.3,
53
+ 'r': 20.0,
54
+ },
55
+ 'UBP305x305x79': {
56
+ 'h': 299.0,
57
+ 'b': 306.0,
58
+ 'tw': 11.0,
59
+ 'tf': 11.1,
60
+ 'r': 20.0,
61
+ },
62
+ 'UBP305x305x88': {
63
+ 'h': 302.0,
64
+ 'b': 308.0,
65
+ 'tw': 12.4,
66
+ 'tf': 12.3,
67
+ 'r': 20.0,
68
+ },
69
+ 'UBP305x305x95': {
70
+ 'h': 304.0,
71
+ 'b': 309.0,
72
+ 'tw': 13.3,
73
+ 'tf': 13.3,
74
+ 'r': 20.0,
75
+ },
76
+ 'UBP305x305x110': {
77
+ 'h': 308.0,
78
+ 'b': 311.0,
79
+ 'tw': 15.3,
80
+ 'tf': 15.4,
81
+ 'r': 20.0,
82
+ },
83
+ 'UBP305x305x126': {
84
+ 'h': 312.0,
85
+ 'b': 313.0,
86
+ 'tw': 17.5,
87
+ 'tf': 17.6,
88
+ 'r': 20.0,
89
+ },
90
+ 'UBP305x305x149': {
91
+ 'h': 318.0,
92
+ 'b': 316.0,
93
+ 'tw': 20.6,
94
+ 'tf': 20.7,
95
+ 'r': 20.0,
96
+ },
97
+ 'UBP305x305x186': {
98
+ 'h': 328.0,
99
+ 'b': 321.0,
100
+ 'tw': 25.5,
101
+ 'tf': 25.6,
102
+ 'r': 2.0,
103
+ },
104
+ 'UBP305x305x223': {
105
+ 'h': 338.0,
106
+ 'b': 326.0,
107
+ 'tw': 30.3,
108
+ 'tf': 30.4,
109
+ 'r': 20.0,
110
+ },
111
+ 'UBP356x368x109': {
112
+ 'h': 346.0,
113
+ 'b': 371.0,
114
+ 'tw': 12.8,
115
+ 'tf': 12.9,
116
+ 'r': 20.0,
117
+ },
118
+ 'UBP356x368x133': {
119
+ 'h': 352.0,
120
+ 'b': 374.0,
121
+ 'tw': 15.6,
122
+ 'tf': 15.7,
123
+ 'r': 20.0,
124
+ },
125
+ 'UBP356x368x152': {
126
+ 'h': 356.0,
127
+ 'b': 376.0,
128
+ 'tw': 17.8,
129
+ 'tf': 17.9,
130
+ 'r': 20.0,
131
+ },
132
+ 'UBP356x368x174': {
133
+ 'h': 361.0,
134
+ 'b': 378.0,
135
+ 'tw': 20.3,
136
+ 'tf': 20.4,
137
+ 'r': 20.0,
138
+ },
139
+ }
140
+
141
+ @classmethod
142
+ def get_polygon(cls, name: str) -> Polygon:
143
+ """Returns a shapely polygon representing a UBP section."""
144
+ parameters = cls.parameters.get(name)
145
+ if parameters is None:
146
+ raise ValueError(
147
+ f"Profile '{name}' not found in UBP sections. "
148
+ "Select a valid profile (available ones: "
149
+ f"{cls.profiles()})"
150
+ )
151
+ return _create_I_section(**parameters)
152
+
153
+ @classmethod
154
+ def profiles(cls) -> list:
155
+ """Returns a list containing all available profiles."""
156
+ return list(cls.parameters.keys())
157
+
158
+ def __init__(self, name: str) -> None:
159
+ """Creates a new UBP object."""
160
+ parameters = self.parameters.get(name)
161
+ if parameters is None:
162
+ raise ValueError(
163
+ f"Profile '{name}' not found in UBP sections. "
164
+ "Select a valid profile (available ones: "
165
+ f"{self.profiles()})"
166
+ )
167
+ super().__init__()
168
+ self._h = parameters.get('h')
169
+ self._b = parameters.get('b')
170
+ self._tw = parameters.get('tw')
171
+ self._tf = parameters.get('tf')
172
+ self._r = parameters.get('r')
173
+ self._polygon = _create_I_section(**parameters)
174
+
175
+ @property
176
+ def polygon(self) -> Polygon:
177
+ """Returns shapely Polygon of section.
178
+
179
+ Returns:
180
+ Polygon: The represention of the UBP section.
181
+ """
182
+ return self._polygon
183
+
184
+ @property
185
+ def h(self) -> float:
186
+ """Returns height of UBP section.
187
+
188
+ Returns:
189
+ float: Height h of UBP section.
190
+ """
191
+ return self._h
192
+
193
+ @property
194
+ def b(self) -> float:
195
+ """Returns width of UBP section.
196
+
197
+ Returns:
198
+ float: Width b of UBP section.
199
+ """
200
+ return self._b
201
+
202
+ @property
203
+ def tw(self) -> float:
204
+ """Returns thickness of web of UBP section.
205
+
206
+ Returns:
207
+ float: Web thickness tw of UBP section.
208
+ """
209
+ return self._tw
210
+
211
+ @property
212
+ def tf(self) -> float:
213
+ """Returns thickness of flange of UBP section.
214
+
215
+ Returns:
216
+ float: Flange thickness tw of UBP section.
217
+ """
218
+ return self._tf
219
+
220
+ @property
221
+ def r(self) -> float:
222
+ """Returns fillet radius of UBP section.
223
+
224
+ Returns:
225
+ float: Fillet radius r of UBP section.
226
+ """
227
+ return self._r
@@ -0,0 +1,276 @@
1
+ """UC profiles."""
2
+
3
+ from shapely import (
4
+ Polygon,
5
+ )
6
+
7
+ from ._base_profile import BaseProfile
8
+ from ._common_functions import (
9
+ _create_I_section,
10
+ )
11
+
12
+
13
+ class UC(BaseProfile):
14
+ """Simple class for representing a UC profile.
15
+
16
+ Universal Columns.
17
+ """
18
+
19
+ parameters = {
20
+ 'UC152x152x23': {
21
+ 'h': 152.0,
22
+ 'b': 152.0,
23
+ 'tw': 5.8,
24
+ 'tf': 6.8,
25
+ 'r': 8.0,
26
+ },
27
+ 'UC152x152x30': {
28
+ 'h': 158.0,
29
+ 'b': 153.0,
30
+ 'tw': 6.5,
31
+ 'tf': 9.4,
32
+ 'r': 8.0,
33
+ },
34
+ 'UC152x152x37': {
35
+ 'h': 162.0,
36
+ 'b': 154.0,
37
+ 'tw': 8.0,
38
+ 'tf': 11.5,
39
+ 'r': 8.0,
40
+ },
41
+ 'UC152x152x44': {
42
+ 'h': 166.0,
43
+ 'b': 156.0,
44
+ 'tw': 9.5,
45
+ 'tf': 13.6,
46
+ 'r': 8.0,
47
+ },
48
+ 'UC152x152x51': {
49
+ 'h': 170.0,
50
+ 'b': 157.0,
51
+ 'tw': 11.0,
52
+ 'tf': 15.7,
53
+ 'r': 8.0,
54
+ },
55
+ 'UC203x203x46': {
56
+ 'h': 203.0,
57
+ 'b': 204.0,
58
+ 'tw': 7.2,
59
+ 'tf': 11.0,
60
+ 'r': 13.0,
61
+ },
62
+ 'UC203x203x52': {
63
+ 'h': 206.0,
64
+ 'b': 204.0,
65
+ 'tw': 7.9,
66
+ 'tf': 12.5,
67
+ 'r': 13.0,
68
+ },
69
+ 'UC203x203x60': {
70
+ 'h': 210.0,
71
+ 'b': 206.0,
72
+ 'tw': 9.4,
73
+ 'tf': 14.2,
74
+ 'r': 13.0,
75
+ },
76
+ 'UC203x203x71': {
77
+ 'h': 216.0,
78
+ 'b': 206.0,
79
+ 'tw': 10.0,
80
+ 'tf': 17.3,
81
+ 'r': 13.0,
82
+ },
83
+ 'UC203x203x86': {
84
+ 'h': 222.0,
85
+ 'b': 209.0,
86
+ 'tw': 12.7,
87
+ 'tf': 20.5,
88
+ 'r': 13.0,
89
+ },
90
+ 'UC203x203x100': {
91
+ 'h': 229.0,
92
+ 'b': 210.0,
93
+ 'tw': 14.5,
94
+ 'tf': 23.7,
95
+ 'r': 13.0,
96
+ },
97
+ 'UC203x203x113': {
98
+ 'h': 235.0,
99
+ 'b': 212.0,
100
+ 'tw': 16.3,
101
+ 'tf': 26.9,
102
+ 'r': 13.0,
103
+ },
104
+ 'UC203x203x127': {
105
+ 'h': 241.0,
106
+ 'b': 214.0,
107
+ 'tw': 18.1,
108
+ 'tf': 30.1,
109
+ 'r': 13.0,
110
+ },
111
+ 'UC254x254x73': {
112
+ 'h': 254.0,
113
+ 'b': 255.0,
114
+ 'tw': 8.6,
115
+ 'tf': 14.2,
116
+ 'r': 20.0,
117
+ },
118
+ 'UC254x254x81': {
119
+ 'h': 256.0,
120
+ 'b': 255.0,
121
+ 'tw': 9.4,
122
+ 'tf': 15.6,
123
+ 'r': 20.0,
124
+ },
125
+ 'UC254x254x89': {
126
+ 'h': 260.0,
127
+ 'b': 256.0,
128
+ 'tw': 10.3,
129
+ 'tf': 17.3,
130
+ 'r': 20.0,
131
+ },
132
+ 'UC254x254x101': {
133
+ 'h': 264.0,
134
+ 'b': 257.0,
135
+ 'tw': 11.9,
136
+ 'tf': 19.6,
137
+ 'r': 20.0,
138
+ },
139
+ 'UC254x254x107': {
140
+ 'h': 267.0,
141
+ 'b': 259.0,
142
+ 'tw': 12.8,
143
+ 'tf': 20.5,
144
+ 'r': 20.0,
145
+ },
146
+ 'UC254x254x115': {
147
+ 'h': 269.0,
148
+ 'b': 259.0,
149
+ 'tw': 13.5,
150
+ 'tf': 22.1,
151
+ 'r': 20.0,
152
+ },
153
+ 'UC254x254x132': {
154
+ 'h': 276.0,
155
+ 'b': 261.0,
156
+ 'tw': 15.3,
157
+ 'tf': 25.3,
158
+ 'r': 20.0,
159
+ },
160
+ 'UC254x254x149': {
161
+ 'h': 282.0,
162
+ 'b': 263.0,
163
+ 'tw': 17.3,
164
+ 'tf': 28.4,
165
+ 'r': 20.0,
166
+ },
167
+ 'UC254x254x167': {
168
+ 'h': 289.0,
169
+ 'b': 265.0,
170
+ 'tw': 19.2,
171
+ 'tf': 31.7,
172
+ 'r': 20.0,
173
+ },
174
+ 'UC305x305x97': {
175
+ 'h': 308.0,
176
+ 'b': 305.0,
177
+ 'tw': 9.9,
178
+ 'tf': 15.4,
179
+ 'r': 20.0,
180
+ },
181
+ 'UC305x305x107': {
182
+ 'h': 311.0,
183
+ 'b': 306.0,
184
+ 'tw': 10.9,
185
+ 'tf': 17.0,
186
+ 'r': 20.0,
187
+ },
188
+ }
189
+
190
+ @classmethod
191
+ def get_polygon(cls, name: str) -> Polygon:
192
+ """Returns a shapely polygon representing a UC section."""
193
+ parameters = cls.parameters.get(name)
194
+ if parameters is None:
195
+ raise ValueError(
196
+ f"Profile '{name}' not found in UC sections. "
197
+ "Select a valid profile (available ones: "
198
+ f"{cls.profiles()})"
199
+ )
200
+ return _create_I_section(**parameters)
201
+
202
+ @classmethod
203
+ def profiles(cls) -> list:
204
+ """Returns a list containing all available profiles."""
205
+ return list(cls.parameters.keys())
206
+
207
+ def __init__(self, name: str) -> None:
208
+ """Creates a new UC object."""
209
+ parameters = self.parameters.get(name)
210
+ if parameters is None:
211
+ raise ValueError(
212
+ f"Profile '{name}' not found in UC sections. "
213
+ "Select a valid profile (available ones: "
214
+ f"{self.profiles()})"
215
+ )
216
+ super().__init__()
217
+ self._h = parameters.get('h')
218
+ self._b = parameters.get('b')
219
+ self._tw = parameters.get('tw')
220
+ self._tf = parameters.get('tf')
221
+ self._r = parameters.get('r')
222
+ self._polygon = _create_I_section(**parameters)
223
+
224
+ @property
225
+ def polygon(self) -> Polygon:
226
+ """Returns shapely Polygon of section.
227
+
228
+ Returns:
229
+ Polygon: The represention of the UC section.
230
+ """
231
+ return self._polygon
232
+
233
+ @property
234
+ def h(self) -> float:
235
+ """Returns height of UC section.
236
+
237
+ Returns:
238
+ float: Height h of UC section.
239
+ """
240
+ return self._h
241
+
242
+ @property
243
+ def b(self) -> float:
244
+ """Returns width of UC section.
245
+
246
+ Returns:
247
+ float: Width b of UC section.
248
+ """
249
+ return self._b
250
+
251
+ @property
252
+ def tw(self) -> float:
253
+ """Returns thickness of web of UC section.
254
+
255
+ Returns:
256
+ float: Web thickness tw of UC section.
257
+ """
258
+ return self._tw
259
+
260
+ @property
261
+ def tf(self) -> float:
262
+ """Returns thickness of flange of UC section.
263
+
264
+ Returns:
265
+ float: Flange thickness tw of UC section.
266
+ """
267
+ return self._tf
268
+
269
+ @property
270
+ def r(self) -> float:
271
+ """Returns fillet radius of UC section.
272
+
273
+ Returns:
274
+ float: Fillet radius r of UC section.
275
+ """
276
+ return self._r
@@ -0,0 +1,133 @@
1
+ """UPE profiles."""
2
+
3
+ from shapely import (
4
+ Polygon,
5
+ )
6
+
7
+ from ._base_profile import BaseProfile
8
+ from ._common_functions import _create_parallel_U_section
9
+
10
+
11
+ class UPE(BaseProfile):
12
+ """Simple class for representing an UPE profile.
13
+
14
+ European Parallel flange channels UPE 80 - 400.
15
+
16
+ Dimensions: EN 10 365:2017
17
+ """
18
+
19
+ parameters = {
20
+ 'UPE80': {'h': 80.0, 'b': 50.0, 'tw': 4.0, 'tf': 7.0, 'r': 10.0},
21
+ 'UPE100': {'h': 100.0, 'b': 55.0, 'tw': 4.5, 'tf': 7.5, 'r': 10.0},
22
+ 'UPE120': {'h': 120.0, 'b': 60.0, 'tw': 5.0, 'tf': 8.0, 'r': 12.0},
23
+ 'UPE140': {'h': 140.0, 'b': 65.0, 'tw': 5.0, 'tf': 9.0, 'r': 12.0},
24
+ 'UPE160': {'h': 160.0, 'b': 70.0, 'tw': 5.5, 'tf': 9.5, 'r': 12.0},
25
+ 'UPE180': {'h': 180.0, 'b': 75.0, 'tw': 5.5, 'tf': 10.5, 'r': 12.0},
26
+ 'UPE200': {'h': 200.0, 'b': 80.0, 'tw': 6.0, 'tf': 11.0, 'r': 13.0},
27
+ 'UPE220': {'h': 220.0, 'b': 85.0, 'tw': 6.5, 'tf': 12.0, 'r': 13.0},
28
+ 'UPE240': {'h': 240.0, 'b': 90.0, 'tw': 7.0, 'tf': 12.5, 'r': 15.0},
29
+ 'UPE270': {'h': 270.0, 'b': 95.0, 'tw': 7.5, 'tf': 13.5, 'r': 15.0},
30
+ 'UPE300': {'h': 300.0, 'b': 100.0, 'tw': 9.5, 'tf': 15.0, 'r': 15.0},
31
+ 'UPE330': {'h': 330.0, 'b': 105.0, 'tw': 11.0, 'tf': 16.0, 'r': 18.0},
32
+ 'UPE360': {'h': 360.0, 'b': 110.0, 'tw': 12.0, 'tf': 17.0, 'r': 18.0},
33
+ 'UPE400': {'h': 400.0, 'b': 115.0, 'tw': 13.5, 'tf': 18.0, 'r': 18.0},
34
+ }
35
+
36
+ @classmethod
37
+ def get_polygon(cls, name: str) -> Polygon:
38
+ """Returns a shapely polygon representing an UPE section."""
39
+ if isinstance(name, (float, int)):
40
+ name = f'UPE{int(name):0d}'
41
+ parameters = cls.parameters.get(name)
42
+ if parameters is None:
43
+ raise ValueError(
44
+ f"Profile '{name}' not found in UPE sections. "
45
+ "Select a valid profile (available ones: "
46
+ f"{cls.profiles()})"
47
+ )
48
+ return _create_parallel_U_section(**parameters)
49
+
50
+ @classmethod
51
+ def profiles(cls) -> list:
52
+ """Returns a list containing all available profiles."""
53
+ return list(cls.parameters.keys())
54
+
55
+ def __init__(self, name: str) -> None:
56
+ """Creates a new UPE object."""
57
+ if isinstance(name, (float, int)):
58
+ name = f'UPE{int(name):0d}'
59
+ parameters = self.parameters.get(name)
60
+ if parameters is None:
61
+ raise ValueError(
62
+ f"Profile '{name}' not found in UPE sections. "
63
+ "Select a valid profile (available ones: "
64
+ f"{self.profiles()})"
65
+ )
66
+ super().__init__()
67
+ self._h = parameters.get('h')
68
+ self._b = parameters.get('b')
69
+ self._tw = parameters.get('tw')
70
+ self._tf = parameters.get('tf')
71
+ self._r = parameters.get('r')
72
+
73
+ self._polygon = _create_parallel_U_section(
74
+ h=self._h,
75
+ b=self._b,
76
+ tw=self._tw,
77
+ tf=self._tf,
78
+ r=self._r,
79
+ )
80
+
81
+ @property
82
+ def polygon(self) -> Polygon:
83
+ """Returns shapely Polygon of section.
84
+
85
+ Returns:
86
+ Polygon: The represention of the UPE section.
87
+ """
88
+ return self._polygon
89
+
90
+ @property
91
+ def h(self) -> float:
92
+ """Returns height of UPE section.
93
+
94
+ Returns:
95
+ float: Height h of UPE section.
96
+ """
97
+ return self._h
98
+
99
+ @property
100
+ def b(self) -> float:
101
+ """Returns width of UPE section.
102
+
103
+ Returns:
104
+ float: Width b of UPE section.
105
+ """
106
+ return self._b
107
+
108
+ @property
109
+ def tw(self) -> float:
110
+ """Returns thickness of web of UPE section.
111
+
112
+ Returns:
113
+ float: Web thickness tw of UPE section.
114
+ """
115
+ return self._tw
116
+
117
+ @property
118
+ def tf(self) -> float:
119
+ """Returns thickness of flange of UPE section.
120
+
121
+ Returns:
122
+ float: Flange thickness tw of UPE section.
123
+ """
124
+ return self._tf
125
+
126
+ @property
127
+ def r(self) -> float:
128
+ """Returns fillet radius of UPE section.
129
+
130
+ Returns:
131
+ float: Fillet radius r1 of UPE section.
132
+ """
133
+ return self._r