structuralcodes 0.0.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 (50) hide show
  1. structuralcodes/__init__.py +17 -0
  2. structuralcodes/codes/__init__.py +79 -0
  3. structuralcodes/codes/ec2_2004/__init__.py +133 -0
  4. structuralcodes/codes/ec2_2004/_concrete_material_properties.py +239 -0
  5. structuralcodes/codes/ec2_2004/_reinforcement_material_properties.py +104 -0
  6. structuralcodes/codes/ec2_2004/_section_7_3_crack_control.py +941 -0
  7. structuralcodes/codes/ec2_2004/annex_b_shrink_and_creep.py +257 -0
  8. structuralcodes/codes/ec2_2004/shear.py +506 -0
  9. structuralcodes/codes/ec2_2023/__init__.py +104 -0
  10. structuralcodes/codes/ec2_2023/_annexB_time_dependent.py +17 -0
  11. structuralcodes/codes/ec2_2023/_section5_materials.py +1160 -0
  12. structuralcodes/codes/ec2_2023/_section9_sls.py +325 -0
  13. structuralcodes/codes/mc2010/__init__.py +169 -0
  14. structuralcodes/codes/mc2010/_concrete_creep_and_shrinkage.py +704 -0
  15. structuralcodes/codes/mc2010/_concrete_interface_different_casting_times.py +104 -0
  16. structuralcodes/codes/mc2010/_concrete_material_properties.py +463 -0
  17. structuralcodes/codes/mc2010/_concrete_punching.py +543 -0
  18. structuralcodes/codes/mc2010/_concrete_shear.py +749 -0
  19. structuralcodes/codes/mc2010/_concrete_torsion.py +164 -0
  20. structuralcodes/codes/mc2010/_reinforcement_material_properties.py +105 -0
  21. structuralcodes/core/__init__.py +1 -0
  22. structuralcodes/core/_section_results.py +211 -0
  23. structuralcodes/core/base.py +260 -0
  24. structuralcodes/geometry/__init__.py +25 -0
  25. structuralcodes/geometry/_geometry.py +875 -0
  26. structuralcodes/geometry/_steel_sections.py +2155 -0
  27. structuralcodes/materials/__init__.py +9 -0
  28. structuralcodes/materials/concrete/__init__.py +82 -0
  29. structuralcodes/materials/concrete/_concrete.py +114 -0
  30. structuralcodes/materials/concrete/_concreteEC2_2004.py +477 -0
  31. structuralcodes/materials/concrete/_concreteEC2_2023.py +435 -0
  32. structuralcodes/materials/concrete/_concreteMC2010.py +494 -0
  33. structuralcodes/materials/constitutive_laws.py +979 -0
  34. structuralcodes/materials/reinforcement/__init__.py +84 -0
  35. structuralcodes/materials/reinforcement/_reinforcement.py +172 -0
  36. structuralcodes/materials/reinforcement/_reinforcementEC2_2004.py +103 -0
  37. structuralcodes/materials/reinforcement/_reinforcementEC2_2023.py +93 -0
  38. structuralcodes/materials/reinforcement/_reinforcementMC2010.py +98 -0
  39. structuralcodes/sections/__init__.py +23 -0
  40. structuralcodes/sections/_generic.py +1249 -0
  41. structuralcodes/sections/_reinforcement.py +115 -0
  42. structuralcodes/sections/section_integrators/__init__.py +14 -0
  43. structuralcodes/sections/section_integrators/_factory.py +41 -0
  44. structuralcodes/sections/section_integrators/_fiber_integrator.py +238 -0
  45. structuralcodes/sections/section_integrators/_marin_integration.py +47 -0
  46. structuralcodes/sections/section_integrators/_marin_integrator.py +222 -0
  47. structuralcodes/sections/section_integrators/_section_integrator.py +49 -0
  48. structuralcodes-0.0.1.dist-info/METADATA +40 -0
  49. structuralcodes-0.0.1.dist-info/RECORD +50 -0
  50. structuralcodes-0.0.1.dist-info/WHEEL +4 -0
@@ -0,0 +1,494 @@
1
+ """The concrete class for Model Code 2020 Concrete Material."""
2
+
3
+ import typing as t
4
+ import warnings
5
+
6
+ from structuralcodes.codes import mc2010
7
+
8
+ from ._concrete import Concrete
9
+
10
+
11
+ class ConcreteMC2010(Concrete):
12
+ """Concrete implementation for MC 2010."""
13
+
14
+ # computed values
15
+ _fcm: t.Optional[float] = None
16
+ _fctm: t.Optional[float] = None
17
+ _Eci: t.Optional[float] = None
18
+ _fctkmin: t.Optional[float] = None
19
+ _fctkmax: t.Optional[float] = None
20
+ _Gf: t.Optional[float] = None
21
+ _Eci: t.Optional[float] = None
22
+ _alpha_cc: t.Optional[float] = None
23
+ _eps_c1: t.Optional[float] = None
24
+ _eps_cu1: t.Optional[float] = None
25
+ _k_sargin: t.Optional[float] = None
26
+ _eps_c2: t.Optional[float] = None
27
+ _eps_cu2: t.Optional[float] = None
28
+ _n_parabolic_rectangular: t.Optional[float] = None
29
+ _eps_c3: t.Optional[float] = None
30
+ _eps_cu3: t.Optional[float] = None
31
+
32
+ def __init__(
33
+ self,
34
+ fck: float,
35
+ name: t.Optional[str] = None,
36
+ density: float = 2400.0,
37
+ gamma_c: t.Optional[float] = None,
38
+ existing: bool = False,
39
+ alpha_cc: t.Optional[float] = None,
40
+ **kwargs,
41
+ ):
42
+ """Initializes a new instance of Concrete for MC 2010.
43
+
44
+ Arguments:
45
+ fck (float): Characteristic strength in MPa if concrete is not
46
+ existing.
47
+
48
+ Keyword Arguments:
49
+ name (Optional(str)): A descriptive name for concrete.
50
+ density (float): Density of material in kg/m3 (default: 2400).
51
+ gamma_c (Optional(float)): The partial factor for concrete.
52
+ existing (bool): The material is of an existing structure
53
+ (default: False).
54
+ alpha_cc (float, optional): A factor for considering long-term
55
+ effects on the strength, and effects that arise from the way
56
+ the load is applied.
57
+ """
58
+ del kwargs
59
+ if name is None:
60
+ name = f'C{round(fck):d}'
61
+ super().__init__(
62
+ fck=fck,
63
+ name=name,
64
+ density=density,
65
+ existing=existing,
66
+ gamma_c=gamma_c,
67
+ )
68
+ self._alpha_cc = alpha_cc
69
+
70
+ def _reset_attributes(self):
71
+ self._fcm = None
72
+ self._fctm = None
73
+ self._fctkmin = None
74
+ self._fctkmax = None
75
+ self._Gf = None
76
+ self._Eci = None
77
+ self._eps_c1 = None
78
+ self._eps_cu1 = None
79
+ self._k_sargin = None
80
+ self._eps_c2 = None
81
+ self._eps_cu2 = None
82
+ self._n_parabolic_rectangular = None
83
+ self._eps_c3 = None
84
+ self._eps_cu3 = None
85
+
86
+ @property
87
+ def fcm(self) -> float:
88
+ """Returns fcm in MPa.
89
+
90
+ Returns:
91
+ float: The mean compressive strength in MPa.
92
+ """
93
+ self._fcm = self._fcm or mc2010.fcm(self._fck)
94
+ return self._fcm
95
+
96
+ @fcm.setter
97
+ def fcm(self, value: float):
98
+ """Sets a user defined value for fcm.
99
+
100
+ Arguments:
101
+ value (float): The value of fcm in MPa.
102
+
103
+ Raises:
104
+ ValueError: If value is lower than fck.
105
+ """
106
+ if abs(value) <= self._fck:
107
+ raise ValueError(
108
+ (
109
+ 'Mean compressive strength cannot be lower than',
110
+ 'characteristic strength.\n',
111
+ 'Current characteristing strength: ',
112
+ f'fck = {self._fck}.',
113
+ f'Current value: value = {value}',
114
+ )
115
+ )
116
+ self._fcm = abs(value)
117
+
118
+ @property
119
+ def Eci(self) -> float:
120
+ """Returns the modulus of elasticity in MPa at the concrete age of 28
121
+ days.
122
+
123
+ It is assumed a normal concrete with quartzite aggregates (alfa_e = 1)
124
+ """
125
+ self._Eci = self._Eci or mc2010.Eci(self.fcm)
126
+ return self._Eci
127
+
128
+ @Eci.setter
129
+ def Eci(self, value: float):
130
+ """Sets a user defined value for modulus of elasticity at the concrete
131
+ age of 28 days, Eci.
132
+
133
+ Arguments:
134
+ value (float): The value of Eci in MPa.
135
+ """
136
+ if value < 1e4 or value > 1e5:
137
+ warnings.warn(
138
+ 'A suspect value of Eci has been input.\n'
139
+ 'Please check Eci that should be in MPa ({value} given).'
140
+ )
141
+ self._Eci = abs(value)
142
+
143
+ @property
144
+ def fctm(self) -> float:
145
+ """Returns fctm in MPa.
146
+
147
+ Returns:
148
+ float: The mean tensile strength in MPa.
149
+ """
150
+ self._fctm = self._fctm or mc2010.fctm(self._fck)
151
+ return self._fctm
152
+
153
+ @fctm.setter
154
+ def fctm(self, value: float):
155
+ """Sets a user defined value for fctm.
156
+
157
+ Arguments:
158
+ value (float): The value of fctm in MPa.
159
+ """
160
+ if value > 0.5 * self._fck:
161
+ warnings.warn(
162
+ 'A suspect value of fctm has been input. Please check.'
163
+ )
164
+ self._fctm = abs(value)
165
+
166
+ @property
167
+ def fctkmin(self) -> float:
168
+ """Returns fctkmin in MPa.
169
+
170
+ Returns:
171
+ float: The lower bound tensile strength in MPa.
172
+ """
173
+ self._fctkmin = self._fctkmin or mc2010.fctkmin(self.fctm)
174
+ return self._fctkmin
175
+
176
+ @fctkmin.setter
177
+ def fctkmin(self, value: float):
178
+ """Sets a user defined value for fctkmin.
179
+
180
+ Arguments:
181
+ value (float): The value of fctkmin in MPa.
182
+ """
183
+ self._fctkmin = abs(value)
184
+
185
+ @property
186
+ def fctkmax(self) -> float:
187
+ """Returns fctkmax in MPa.
188
+
189
+ Returns:
190
+ float: The upper bound tensile strength in MPa.
191
+ """
192
+ self._fctkmax = self._fctkmax or mc2010.fctkmax(self.fctm)
193
+ return self._fctkmax
194
+
195
+ @fctkmax.setter
196
+ def fctkmax(self, value: float):
197
+ """Sets a user defined value for fctkmax.
198
+
199
+ Arguments:
200
+ value (float): The value of fctkmax in MPa.
201
+ """
202
+ self._fctkmax = abs(value)
203
+
204
+ @property
205
+ def Gf(self) -> float:
206
+ """Fracture energy of concrete.
207
+
208
+ Returns:
209
+ float: The fracture energy in N/m.
210
+ """
211
+ self._Gf = self._Gf or mc2010.Gf(self._fck)
212
+ return self._Gf
213
+
214
+ @Gf.setter
215
+ def Gf(self, value: float):
216
+ """Sets a user defined value for fracture energy Gf.
217
+
218
+ Arguments:
219
+ value (float): The value of Gf in N/m.
220
+ """
221
+ self._Gf = abs(value)
222
+
223
+ @property
224
+ def gamma_c(self) -> float:
225
+ """The partial factor for concrete."""
226
+ return self._gamma_c or 1.5
227
+
228
+ def fcd(self) -> float:
229
+ """Return the design compressive strength in MPa.
230
+
231
+ Returns:
232
+ float: The design compressive strength of concrete in MPa.
233
+ """
234
+ # This method should perhaps become a property, but is left as a method
235
+ # for now, to be consistent with other concretes.
236
+ return mc2010.fcd(
237
+ self.fck, alpha_cc=self.alpha_cc, gamma_c=self.gamma_c
238
+ )
239
+
240
+ @property
241
+ def alpha_cc(self) -> float:
242
+ """The alpha_cc factor."""
243
+ # Here we should implement the interaction with the globally set
244
+ # national annex. For now, we simply return the default value.
245
+ return self._alpha_cc or 1.0
246
+
247
+ @property
248
+ def eps_c1(self) -> float:
249
+ """Returns the strain at maximum compressive strength of concrete (fcm)
250
+ for the Sargin constitutive law.
251
+
252
+ Returns:
253
+ float: The strain at maximum compressive strength of concrete.
254
+ """
255
+ self._eps_c1 = self._eps_c1 or mc2010.eps_c1(self._fck)
256
+ return self._eps_c1
257
+
258
+ @eps_c1.setter
259
+ def eps_c1(self, value: float):
260
+ """Sets a user defined value for strain at peak strenght for Sargin
261
+ constitutive law.
262
+
263
+ Arguments:
264
+ value (float): The new value for eps_c1, no units.
265
+ """
266
+ if abs(value) >= 0.1:
267
+ warnings.warn(
268
+ 'A suspect value is input for eps_c1 that should be a pure'
269
+ ' number without units. Plase check ({value} given).'
270
+ )
271
+ self._eps_c1 = value
272
+
273
+ @property
274
+ def eps_cu1(self) -> float:
275
+ """Returns the strain at concrete failure of concrete.
276
+
277
+ Returns:
278
+ float: The maximum strength at failure of concrete.
279
+ """
280
+ self._eps_cu1 = self._eps_cu1 or mc2010.eps_cu1(self._fck)
281
+ return self._eps_cu1
282
+
283
+ @eps_cu1.setter
284
+ def eps_cu1(self, value: float):
285
+ """Sets the nominal ultimate strain for Sargin constitutive law.
286
+
287
+ Arguments:
288
+ value (float): The new value for eps_cu1, no units.
289
+ """
290
+ if abs(value) >= 0.1:
291
+ warnings.warn(
292
+ 'A suspect value is input for eps_cu1 that should be a pure'
293
+ ' number without units. Plase check ({value} given).'
294
+ )
295
+ self._eps_cu1 = value
296
+
297
+ @property
298
+ def k_sargin(self) -> float:
299
+ """Returns the coefficient for Sargin constitutive law.
300
+
301
+ Returns:
302
+ float: The plastic coefficient for Sargin law.
303
+ """
304
+ self._k_sargin = self._k_sargin or mc2010.k_sargin(self._fck)
305
+ return self._k_sargin
306
+
307
+ @k_sargin.setter
308
+ def k_sargin(self, value: float):
309
+ """Sets the the coefficient for Sargin constitutive law.
310
+
311
+ Arguments:
312
+ value (float): The new value for k, no units.
313
+
314
+ Raises:
315
+ ValueError: If value < 0.
316
+ """
317
+ if value < 0:
318
+ raise ValueError(f'n should be a positive value ({value} given)')
319
+ self._k_sargin = value
320
+
321
+ @property
322
+ def eps_c2(self) -> float:
323
+ """Returns the strain at maximum compressive strength of concrete (fcd)
324
+ for the Parabola-rectangle constitutive law.
325
+
326
+ Returns:
327
+ float: The strain at maximum compressive strength of concrete.
328
+ """
329
+ self._eps_c2 = self._eps_c2 or mc2010.eps_c2(self.fck)
330
+ return self._eps_c2
331
+
332
+ @eps_c2.setter
333
+ def eps_c2(self, value: float):
334
+ """Sets the strain at maximum compressive strength of concrete (fcd)
335
+ for the Parabola-rectangle constitutive law.
336
+
337
+ Arguments:
338
+ value (float): The new value for eps_c2, no units.
339
+ """
340
+ if abs(value) >= 0.1:
341
+ warnings.warn(
342
+ 'A suspect value is input for eps_c2 that should be a pure'
343
+ ' number without units. Plase check ({value} given).'
344
+ )
345
+ self._eps_c2 = value
346
+
347
+ @property
348
+ def eps_cu2(self) -> float:
349
+ """Returns the strain at concrete failure of concrete for the
350
+ Parabola-rectangle constitutive law.
351
+
352
+ Returns:
353
+ float: The maximum strain at failure of concrete.
354
+ """
355
+ self._eps_cu2 = self._eps_cu2 or mc2010.eps_cu2(self.fck)
356
+ return self._eps_cu2
357
+
358
+ @eps_cu2.setter
359
+ def eps_cu2(self, value: float):
360
+ """Sets the strain at concrete failure of concrete for the
361
+ Parabola-rectangle constitutive law.
362
+
363
+ Arguments:
364
+ value (float): The new value for eps_cu2, no units.
365
+ """
366
+ if abs(value) >= 0.1:
367
+ warnings.warn(
368
+ 'A suspect value is input for eps_cu2 that should be a pure'
369
+ ' number without units. Plase check ({value} given).'
370
+ )
371
+ self._eps_cu2 = value
372
+
373
+ @property
374
+ def n_parabolic_rectangular(self) -> float:
375
+ """Returns the coefficient for Parabola-rectangle constitutive law.
376
+
377
+ Returns:
378
+ float: The exponent for Parabola-recangle law.
379
+ """
380
+ self._n_parabolic_rectangular = (
381
+ self._n_parabolic_rectangular
382
+ or mc2010.n_parabolic_rectangular(self.fck)
383
+ )
384
+ return self._n_parabolic_rectangular
385
+
386
+ @n_parabolic_rectangular.setter
387
+ def n_parabolic_rectangular(self, value: float):
388
+ """Sets the coefficient for Parabola-rectangle constitutive law.
389
+
390
+ Arguments:
391
+ value (float): The new value for n, no units.
392
+
393
+ Raises:
394
+ ValueError: If value < 0.
395
+ """
396
+ if value < 0:
397
+ raise ValueError(f'n should be a positive value ({value} given)')
398
+ if value >= 5:
399
+ warnings.warn(
400
+ 'A suspect value is input for eps_cu2 that should be a pure'
401
+ ' number without units. Plase check ({value} given).'
402
+ )
403
+ self._n_parabolic_rectangular = value
404
+
405
+ @property
406
+ def eps_c3(self) -> float:
407
+ """Returns the strain at maximum compressive strength of concrete (fcd)
408
+ for the Bi-linear constitutive law.
409
+
410
+ Returns:
411
+ float: The strain at maximum compressive strength of concrete.
412
+ """
413
+ self._eps_c3 = self._eps_c3 or mc2010.eps_c3(self.fck)
414
+ return self._eps_c3
415
+
416
+ @eps_c3.setter
417
+ def eps_c3(self, value: float):
418
+ """Sets the strain at maximum compressive strength of concrete (fcd)
419
+ for the Bi-linear constitutive law.
420
+
421
+ Arguments:
422
+ value (float): The new value for eps_c3, no units.
423
+ """
424
+ if abs(value) >= 0.1:
425
+ warnings.warn(
426
+ 'A suspect value is input for eps_c3 that should be a pure'
427
+ ' number without units. Plase check ({value} given).'
428
+ )
429
+ self._eps_c3 = value
430
+
431
+ @property
432
+ def eps_cu3(self) -> float:
433
+ """Returns the strain at concrete failure of concrete for the Bi-linear
434
+ constitutive law.
435
+
436
+ Returns:
437
+ float: The maximum strain at failure of concrete.
438
+ """
439
+ self._eps_cu3 = self._eps_cu3 or mc2010.eps_cu3(self.fck)
440
+ return self._eps_cu3
441
+
442
+ @eps_cu3.setter
443
+ def eps_cu3(self, value: float):
444
+ """Sets the strain at concrete failure of concrete for the Bi-linear
445
+ constitutive law.
446
+
447
+ Arguments:
448
+ value (float): The new value for eps_cu3, no units.
449
+ """
450
+ if abs(value) >= 0.1:
451
+ warnings.warn(
452
+ 'A suspect value is input for eps_cu3 that should be a pure'
453
+ ' number without units. Plase check ({value} given).'
454
+ )
455
+ self._eps_cu3 = value
456
+
457
+ def __elastic__(self) -> dict:
458
+ """Returns kwargs for creating an elastic constitutive law."""
459
+ return {'E': self.Eci}
460
+
461
+ def __bilinearcompression__(self) -> dict:
462
+ """Returns kwargs for Bi-linear constitutive law."""
463
+ return {
464
+ 'fc': self.fcd(),
465
+ 'eps_c': self.eps_c3,
466
+ 'eps_cu': self.eps_cu3,
467
+ }
468
+
469
+ def __parabolarectangle__(self) -> dict:
470
+ """Returns kwargs for creating a parabola rectangle const law."""
471
+ return {
472
+ 'fc': self.fcd(),
473
+ 'eps_0': self.eps_c2,
474
+ 'eps_u': self.eps_cu2,
475
+ 'n': self.n_parabolic_rectangular,
476
+ }
477
+
478
+ def __sargin__(self) -> dict:
479
+ """Returns kwargs for creating a Sargin const law."""
480
+ return {
481
+ 'fc': self.fcd(),
482
+ 'eps_c1': self.eps_c1,
483
+ 'eps_cu1': self.eps_cu1,
484
+ 'k': self.k_sargin,
485
+ }
486
+
487
+ def __popovics__(self) -> dict:
488
+ """Returns kwargs for creating a Sargin const law."""
489
+ return {
490
+ 'fc': self.fcd(),
491
+ 'eps_c': self.eps_c1,
492
+ 'eps_cu': self.eps_cu1,
493
+ 'Ec': self.Eci,
494
+ }