structuralcodes 0.1.0__py3-none-any.whl → 0.2.0__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 (24) hide show
  1. structuralcodes/__init__.py +1 -1
  2. structuralcodes/codes/ec2_2004/__init__.py +43 -11
  3. structuralcodes/codes/ec2_2004/_concrete_creep_and_shrinkage.py +529 -0
  4. structuralcodes/codes/ec2_2004/shear.py +5 -1
  5. structuralcodes/codes/mc2010/_concrete_creep_and_shrinkage.py +3 -1
  6. structuralcodes/core/base.py +16 -4
  7. structuralcodes/geometry/_geometry.py +4 -2
  8. structuralcodes/geometry/_reinforcement.py +14 -2
  9. structuralcodes/materials/constitutive_laws/__init__.py +84 -0
  10. structuralcodes/materials/constitutive_laws/_bilinearcompression.py +138 -0
  11. structuralcodes/materials/constitutive_laws/_elastic.py +114 -0
  12. structuralcodes/materials/constitutive_laws/_elasticplastic.py +172 -0
  13. structuralcodes/materials/constitutive_laws/_parabolarectangle.py +198 -0
  14. structuralcodes/materials/constitutive_laws/_popovics.py +133 -0
  15. structuralcodes/materials/constitutive_laws/_sargin.py +115 -0
  16. structuralcodes/materials/constitutive_laws/_userdefined.py +218 -0
  17. structuralcodes/sections/_generic.py +39 -9
  18. structuralcodes/sections/section_integrators/_fiber_integrator.py +1 -3
  19. structuralcodes/sections/section_integrators/_marin_integrator.py +1 -1
  20. {structuralcodes-0.1.0.dist-info → structuralcodes-0.2.0.dist-info}/METADATA +1 -1
  21. {structuralcodes-0.1.0.dist-info → structuralcodes-0.2.0.dist-info}/RECORD +22 -15
  22. structuralcodes/codes/ec2_2004/annex_b_shrink_and_creep.py +0 -257
  23. structuralcodes/materials/constitutive_laws.py +0 -981
  24. {structuralcodes-0.1.0.dist-info → structuralcodes-0.2.0.dist-info}/WHEEL +0 -0
@@ -2,9 +2,9 @@
2
2
 
3
3
  from __future__ import annotations # To have clean hints of ArrayLike in docs
4
4
 
5
+ import math
5
6
  import typing as t
6
7
  import warnings
7
- from math import cos, sin
8
8
 
9
9
  import numpy as np
10
10
  from numpy.typing import ArrayLike
@@ -55,6 +55,16 @@ class GenericSection(Section):
55
55
  of the section.
56
56
  name (str): The name of the section.
57
57
  integrator (str): The name of the SectionIntegrator to use.
58
+ kwargs (dict): A collection of keyword arguments to pass on to the
59
+ section calculator.
60
+
61
+ Note:
62
+ The GenericSection uses a GenericSectionCalculator for all
63
+ calculations. The GenericSectionCalculator uses a SectionIntegrator
64
+ for integrating over the section. Any additional keyword arguments
65
+ used when creating the GenericSection are passed on to the
66
+ SectionCalculator to customize the behaviour. See
67
+ GenericSectionCalculator for available keyword arguments.
58
68
  """
59
69
  if name is None:
60
70
  name = 'GenericSection'
@@ -98,7 +108,7 @@ class GenericSectionCalculator(SectionCalculator):
98
108
  (default = 'marin').
99
109
 
100
110
  Note:
101
- When using 'fiber' integrator the kwarg 'mesh_size' can be used to
111
+ When using `fiber` integrator the kwarg `mesh_size` can be used to
102
112
  specify a dimensionless number (between 0 and 1) specifying the
103
113
  size of the resulting mesh.
104
114
  """
@@ -142,13 +152,13 @@ class GenericSectionCalculator(SectionCalculator):
142
152
  # Computation of surface area, reinforcement area, EA (axial rigidity)
143
153
  # and mass: Morten -> problem with units! how do we deal with it?
144
154
  for geo in self.section.geometry.geometries:
145
- gp.ea += geo.area * geo.material.get_tangent(eps=0)[0]
155
+ gp.ea += geo.area * geo.material.get_tangent(eps=0)
146
156
  if geo.density is not None:
147
157
  # this assumes area in mm2 and density in kg/m3
148
158
  gp.mass += geo.area * geo.density * 1e-9
149
159
 
150
160
  for geo in self.section.geometry.point_geometries:
151
- gp.ea += geo.area * geo.material.get_tangent(eps=0)[0]
161
+ gp.ea += geo.area * geo.material.get_tangent(eps=0)
152
162
  gp.area_reinforcement += geo.area
153
163
  if geo.density is not None:
154
164
  # this assumes area in mm2 and density in kg/m3
@@ -208,7 +218,13 @@ class GenericSectionCalculator(SectionCalculator):
208
218
  )
209
219
  # Change sign due to moment sign convention
210
220
  izz *= -1
211
- if abs(abs(izy) - abs(iyz)) > 10:
221
+
222
+ # Compute reasonable value for absolute tolerance for checking iyz
223
+ rel_tol = 1e-9
224
+ abs_tol = 0.5 * (iyy + izz) * rel_tol
225
+
226
+ # Check calculated cross moment
227
+ if not math.isclose(iyz, izy, rel_tol=rel_tol, abs_tol=abs_tol):
212
228
  error_str = 'Something went wrong with computation of '
213
229
  error_str += f'moments of area: iyz = {iyz}, izy = {izy}.\n'
214
230
  error_str += 'They should be equal but are not!'
@@ -574,7 +590,12 @@ class GenericSectionCalculator(SectionCalculator):
574
590
  """Rotate triangulated data of angle theta."""
575
591
  rotated_triangulated_data = []
576
592
  for tr in self.triangulated_data:
577
- T = np.array([[cos(theta), -sin(theta)], [sin(theta), cos(theta)]])
593
+ T = np.array(
594
+ [
595
+ [np.cos(theta), -np.sin(theta)],
596
+ [np.sin(theta), np.cos(theta)],
597
+ ]
598
+ )
578
599
  coords = np.vstack((tr[0], tr[1]))
579
600
  coords_r = T @ coords
580
601
  rotated_triangulated_data.append(
@@ -636,7 +657,9 @@ class GenericSectionCalculator(SectionCalculator):
636
657
  )
637
658
 
638
659
  # Rotate back to section CRS TODO Check
639
- T = np.array([[cos(theta), -sin(theta)], [sin(theta), cos(theta)]])
660
+ T = np.array(
661
+ [[np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)]]
662
+ )
640
663
  M = T @ np.array([[My], [Mz]])
641
664
  if self.triangulated_data is not None:
642
665
  # Rotate back also triangulated data!
@@ -771,7 +794,12 @@ class GenericSectionCalculator(SectionCalculator):
771
794
  geo=rotated_geom, strain=strain, tri=self.triangulated_data
772
795
  )
773
796
  # Rotate back to section CRS
774
- T = np.array([[cos(theta), -sin(theta)], [sin(theta), cos(theta)]])
797
+ T = np.array(
798
+ [
799
+ [np.cos(theta), -np.sin(theta)],
800
+ [np.sin(theta), np.cos(theta)],
801
+ ]
802
+ )
775
803
  M = T @ np.array([[My], [Mz]])
776
804
  eps_a[i] = strain[0]
777
805
  my[i] = M[0, 0]
@@ -1106,7 +1134,9 @@ class GenericSectionCalculator(SectionCalculator):
1106
1134
  eps_a = eps_n - kappa_y * y_n
1107
1135
 
1108
1136
  # rotate back components to work in section CRS
1109
- T = np.array([[cos(theta), -sin(theta)], [sin(theta), cos(theta)]])
1137
+ T = np.array(
1138
+ [[np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)]]
1139
+ )
1110
1140
  components = np.vstack((kappa_y, np.zeros_like(kappa_y)))
1111
1141
  rotated_components = T @ components
1112
1142
  return np.column_stack((eps_a, rotated_components.T)), field_num
@@ -103,9 +103,7 @@ class FiberIntegrator(SectionIntegrator):
103
103
  # define the maximum area of the triangles
104
104
  max_area = g.area * mesh_size
105
105
  # triangulate the geometry getting back the mesh
106
- mesh = triangle.triangulate(
107
- tri, f'pq{30:.1f}Aa{max_area:.1f}o1'
108
- )
106
+ mesh = triangle.triangulate(tri, f'pq{30:.1f}Aa{max_area}o1')
109
107
  mat = g.material
110
108
  # Get x and y coordinates (centroid) and area for each fiber
111
109
  x = []
@@ -143,7 +143,7 @@ class MarinIntegrator(SectionIntegrator):
143
143
  strain = strain_rotated[0] + strain_rotated[1] * yp
144
144
  x.append(xp)
145
145
  y.append(yp)
146
- F.append(pg.material.get_stress(strain)[0] * A)
146
+ F.append(pg.material.get_stress(strain) * A)
147
147
  prepared_input.append((1, np.array(x), np.array(y), np.array(F)))
148
148
 
149
149
  return angle, prepared_input
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: structuralcodes
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: A Python package that contains models from structural design codes.
5
5
  Author-email: fib - International Federation for Structural Concrete <info@fib-international.org>
6
6
  Requires-Python: >=3.8
@@ -1,17 +1,17 @@
1
- structuralcodes/__init__.py,sha256=opNmFZxtV5QKx38kj-eHuoZX-JPLuLojIGDH7au31WE,390
1
+ structuralcodes/__init__.py,sha256=pxmTgFCzRRSx9OPXM_I5KbP045gFiNqoR_v6N1Ni7as,390
2
2
  structuralcodes/codes/__init__.py,sha256=g5xMAJ3jEZHFd0cypvZY6lMCi7XeVEntsO8zHzI2mWc,2803
3
- structuralcodes/codes/ec2_2004/__init__.py,sha256=_PdL9kX7qlfn9VBfqUCJQy6V9fWmIyugzIiSZczjNAA,1986
3
+ structuralcodes/codes/ec2_2004/__init__.py,sha256=DljXFNrCGE1lZIOsgyZgJ7Xo-xUidJomDrDKyfOHcH8,2431
4
+ structuralcodes/codes/ec2_2004/_concrete_creep_and_shrinkage.py,sha256=y4HhOpaXwNMCHh4wu4LSn14oD1ylpPNvVJOJXLxStzQ,15284
4
5
  structuralcodes/codes/ec2_2004/_concrete_material_properties.py,sha256=Ol51tzcVOHUvc2Vea24WQJ4FABxXc-9cB5RVu2N1pio,5964
5
6
  structuralcodes/codes/ec2_2004/_reinforcement_material_properties.py,sha256=_ZlvdHcOswu1Ge1XjSvt4j5ue-znDceMOlA0s528IqM,2779
6
7
  structuralcodes/codes/ec2_2004/_section_7_3_crack_control.py,sha256=a91tWQKNTxB2SpSKu0Wtm-P5GdmifRLggNlEHIQ3XMY,31981
7
- structuralcodes/codes/ec2_2004/annex_b_shrink_and_creep.py,sha256=Vht8VjmpHNRl7-AirTm2buJl1RzL76AbW6-XgdDK6Kg,7348
8
- structuralcodes/codes/ec2_2004/shear.py,sha256=uA9a5Po5X4ysp5pDI8HB0pBjI9Z9txxhPD_joLTM8O0,16910
8
+ structuralcodes/codes/ec2_2004/shear.py,sha256=gzhgIa-EgoD9gLO_Hfa8VeCmjAxuPK0wZ0soDKC7W5w,17095
9
9
  structuralcodes/codes/ec2_2023/__init__.py,sha256=UohRxikCUqPAUpHj4uSWHw5drICjZm3zvJJw7clljo0,1618
10
10
  structuralcodes/codes/ec2_2023/_annexB_time_dependent.py,sha256=ykRAHBHzqtMSErkVA-rwTHBdUq8-L7q2AOaEd2YW5wc,472
11
11
  structuralcodes/codes/ec2_2023/_section5_materials.py,sha256=-vYowBVcebyPyuGvX3wLfxiePdM0OrBgRrYil71Vd88,32384
12
12
  structuralcodes/codes/ec2_2023/_section9_sls.py,sha256=l1d3xcALAweU9jAAf1d91TJaGB_0p-eMzbRGuhfKydQ,11252
13
13
  structuralcodes/codes/mc2010/__init__.py,sha256=g2J2GTIy9jbLTVq_yF4DXau4WLmAkpmMTgnD4QmW2vI,2844
14
- structuralcodes/codes/mc2010/_concrete_creep_and_shrinkage.py,sha256=7VRzXGjGAM7JkfMcgWvntq4PC2n7VVtSS7CHQuxZaHM,23193
14
+ structuralcodes/codes/mc2010/_concrete_creep_and_shrinkage.py,sha256=wFTVHfJKIyt0jUGthd1gWKfr4JfoFo9YN6d3nL6Ouq4,23277
15
15
  structuralcodes/codes/mc2010/_concrete_interface_different_casting_times.py,sha256=x_n9Z9WEPY6DFf8Og5UIERPivNh-O_3RM4ZnGBy64cs,3570
16
16
  structuralcodes/codes/mc2010/_concrete_material_properties.py,sha256=MTz70-9iaN_s0Z8gJksCEzP0Yza4pPfZ-vOI30pzbw4,12362
17
17
  structuralcodes/codes/mc2010/_concrete_punching.py,sha256=ZG2P7WXIRcFh5sGlmHP20BsJbz0o44cFO51FCru2kXw,17431
@@ -21,31 +21,38 @@ structuralcodes/codes/mc2010/_reinforcement_material_properties.py,sha256=FELmgM
21
21
  structuralcodes/codes/mc2020/__init__.py,sha256=5hrAfBtAeG69N_lroFpG10_ZKB1SuNlKBnuHug2DI3E,174
22
22
  structuralcodes/core/__init__.py,sha256=spnvZIm_w3jX_lV-v3bloDjgHh8lrH6UHpA1Nv1zeAI,55
23
23
  structuralcodes/core/_section_results.py,sha256=hHXoS71TpSmWqw276pBeLiLrEEiMEWclOd28ArRW_Kk,8280
24
- structuralcodes/core/base.py,sha256=TqgsXzIXITQmER3tKNjzjPrbSN5uT_PqCpG3PVMd3Yw,8562
24
+ structuralcodes/core/base.py,sha256=7cpDM2hvBZp9nyU714XRiMzDPNdydJqLtIHHvcXZctE,8935
25
25
  structuralcodes/geometry/__init__.py,sha256=FwzywfyGKOk6v96ZyOfyBo5iVeuK_W0TQVz5llAkYW4,559
26
- structuralcodes/geometry/_geometry.py,sha256=kmY7TER5yS-TVw0XY4EuwNviLuEhExtLoon8oO2TJbA,31175
27
- structuralcodes/geometry/_reinforcement.py,sha256=8Xes3N8zm85bJVu_bgVNzMs4zo2zPv17xadw2I9CnE0,3739
26
+ structuralcodes/geometry/_geometry.py,sha256=8usT5UfDlT-A8sMwM6Bh4YKIB9QuyAU5tGgsujeACEA,31240
27
+ structuralcodes/geometry/_reinforcement.py,sha256=N2wTH-NoZ1fG-_vRT9gGX2Kk3zlW7CbDtl1oqS_lMv0,4144
28
28
  structuralcodes/geometry/_steel_sections.py,sha256=UdJmhhnK8r5gEfBzvWsMFHGs5gmuoOhFoduBanlRMQg,60225
29
29
  structuralcodes/materials/__init__.py,sha256=r5E5vsXVKB-BGZXTnEbsrYJbH6rr6Xlc_b4LlcUPIbc,173
30
- structuralcodes/materials/constitutive_laws.py,sha256=DX_yuC4OpgDCl_g3sl0Hi2ee7lFD2fy3yO4PTINKBzE,34455
31
30
  structuralcodes/materials/concrete/__init__.py,sha256=GRD5WcbYrnE4iN-L7qVkhVTi7w_PUP7pnbGueOaVeFs,2576
32
31
  structuralcodes/materials/concrete/_concrete.py,sha256=3zMTFtaqFeUl7ne7-pe9wF4LryzqvGpUwThnHTidCZU,3774
33
32
  structuralcodes/materials/concrete/_concreteEC2_2004.py,sha256=gWG3O9yeGw3UeftCjYTajZco_XYDmBxPGqhAEpH3nY0,14666
34
33
  structuralcodes/materials/concrete/_concreteEC2_2023.py,sha256=vguNzlfoPuaieTVw9T3xWU0wb230WvER4Vy1jswcdlo,14017
35
34
  structuralcodes/materials/concrete/_concreteMC2010.py,sha256=lHy-WYiVpXPwiNAyjUBxuGWuGFd0-Uirh6KiolMH4MY,15313
35
+ structuralcodes/materials/constitutive_laws/__init__.py,sha256=r817qyeimqZyyan2mU8cVwjwMkiB--f-BOIBSzXKiZo,2954
36
+ structuralcodes/materials/constitutive_laws/_bilinearcompression.py,sha256=mkuMSiKpfZv-meIvHedrlILfRBdOsR46QCiaiyxPxVs,4528
37
+ structuralcodes/materials/constitutive_laws/_elastic.py,sha256=Kl-A_3W2qoJUEPE3meWABSqUlNChMExiq2LdRehbqrI,3722
38
+ structuralcodes/materials/constitutive_laws/_elasticplastic.py,sha256=GDIIXJ93nqV-G8-o6HxXGUTd3TgNWiHQqXbULFcCGUI,6096
39
+ structuralcodes/materials/constitutive_laws/_parabolarectangle.py,sha256=CvjmiGCmNTqxY6d5jNqCo6MAh_BUkypvv_-ZJB9JyQE,6489
40
+ structuralcodes/materials/constitutive_laws/_popovics.py,sha256=dpXFQ9KHE245C9dgOLz9KXYHZiAYrRan5exgj0j_JxM,4322
41
+ structuralcodes/materials/constitutive_laws/_sargin.py,sha256=WJGw0EtqkPh-d3N6vTPRIfhE1Ypyc16JpGcoi-0U1A8,3495
42
+ structuralcodes/materials/constitutive_laws/_userdefined.py,sha256=urt0yuJicO51jnQ2S8bfmrgVTyYh09Olnzy9_tISGK4,8292
36
43
  structuralcodes/materials/reinforcement/__init__.py,sha256=-UA04GSNN6_xLKqnH_5taiOmgxYwD_wtT6Nw8UbfkJY,2757
37
44
  structuralcodes/materials/reinforcement/_reinforcement.py,sha256=zrSdBvHKTYqOHpkJzxit8w_b2JG2pggviOvgZyH246Q,5029
38
45
  structuralcodes/materials/reinforcement/_reinforcementEC2_2004.py,sha256=svLpubjaTH_DepwY68TQIA8fRwadoAE3Y3KsyViGQHk,3265
39
46
  structuralcodes/materials/reinforcement/_reinforcementEC2_2023.py,sha256=3tKpFcMNYK52s5K2K_PctRcuSgwZTe-QXX3xziHPUno,2887
40
47
  structuralcodes/materials/reinforcement/_reinforcementMC2010.py,sha256=az_IAQJNKSF6Vv9KMoXjWTdYkWI6xcEm7s8i8GETn3A,2939
41
48
  structuralcodes/sections/__init__.py,sha256=qPoD5eS31at-uveYtxtVkXGLNHPrIMRrxGYY3wOLQ4s,441
42
- structuralcodes/sections/_generic.py,sha256=UHbj7r2fsBvT4DVDWkxpaQck82cQiV0XFkY8N-g_eYI,49479
49
+ structuralcodes/sections/_generic.py,sha256=I_YQNeK9ww3wDtkSBlhF7u6gXVAj2I5Sttv9i-uk8UI,50525
43
50
  structuralcodes/sections/section_integrators/__init__.py,sha256=PK4ixV0XrfHXN-itIrB1r90npoWo3aIJqMcenqcaees,399
44
51
  structuralcodes/sections/section_integrators/_factory.py,sha256=MHp14hfWU-oXTiIutCKLJEC47LirYsHgEAAmHVtnFMY,1242
45
- structuralcodes/sections/section_integrators/_fiber_integrator.py,sha256=5sxcfbmxMJfy45Pfd84I4sAh6HpPc5B4r6ab0WpjSNI,9305
52
+ structuralcodes/sections/section_integrators/_fiber_integrator.py,sha256=Ucas8nA9BB4ILfFPplJp3WkgLc9ntf9UN7AmcUwqA_A,9263
46
53
  structuralcodes/sections/section_integrators/_marin_integration.py,sha256=SZgya6d_Tequ3jez7UEBlYioZepW2IDKaAxn_6WrMbU,1563
47
- structuralcodes/sections/section_integrators/_marin_integrator.py,sha256=rtEtd1X0QYAWNcaH7Pjd_b6LEzVjHqD_fbIrX64p7fg,9121
54
+ structuralcodes/sections/section_integrators/_marin_integrator.py,sha256=DHAJwurHhVp68K9fozw0MbmxZvk_NAKnNVi5abp65sY,9118
48
55
  structuralcodes/sections/section_integrators/_section_integrator.py,sha256=O-jsG1Pu_doovgRJsFG1Sf0KlkN2wNfQdmgkJiSHNN0,1590
49
- structuralcodes-0.1.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
50
- structuralcodes-0.1.0.dist-info/METADATA,sha256=z10AmhI6UDYF_wu-kJTNvLYcmSu_nhn1WBNiodbrm8M,2444
51
- structuralcodes-0.1.0.dist-info/RECORD,,
56
+ structuralcodes-0.2.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
57
+ structuralcodes-0.2.0.dist-info/METADATA,sha256=7RAyKNKlQYjXC3sFiVRWTwp3HUMAhN5SvJAvcF2LTZ0,2444
58
+ structuralcodes-0.2.0.dist-info/RECORD,,
@@ -1,257 +0,0 @@
1
- """Calculation routine for shrinkage and creep from EUROCODE 1992-1-1:2004
2
- Annex B.
3
- """
4
-
5
- import math
6
- import typing as t
7
-
8
- import numpy as np
9
-
10
- ALPHA_CEMENT_DICT = {'R': 1, 'N': 0, 'S': -1}
11
- ALPHA_DS_DICT = {
12
- 'R': {'alpha_ds1': 6, 'alpha_ds2': 0.11},
13
- 'N': {'alpha_ds1': 4, 'alpha_ds2': 0.12},
14
- 'S': {'alpha_ds1': 3, 'alpha_ds2': 0.13},
15
- }
16
-
17
-
18
- def phi(
19
- h_0: float,
20
- f_cm: float,
21
- RH: int = 50,
22
- cement_class: t.Literal['R', 'N', 'S'] = 'R',
23
- t0: int = 7,
24
- t: int = 18263,
25
- ) -> float:
26
- """Calculates the creep number.
27
-
28
- EN 1992-1-1:2004, Eq. (B.1).
29
-
30
- Args:
31
- h_0 (float): The product of 2 times the cross-sectional area divided by
32
- the exposed circumference according to (B.6).
33
- f_cm (float): The mean concrete strength,
34
- RH (int): The relative humidity in percent, defaults to 50%.
35
-
36
- Keyword Args:
37
- cement_class (str): The cement class, defaults to 'R'. Possible values:
38
- 'R', 'N', 'S',
39
- t0: The age of the concrete at the time (in days) of loading.
40
- t: The age of the concrete at the time (in days) of evaluation (50
41
- years default).
42
-
43
- Returns:
44
- float: The creep value for the load, phi(t, t0).
45
-
46
- Raises:
47
- ValueError: checks if the cement class equals R, N or S.
48
- """
49
- # The cement class will decide the value of alpha_cement, ds1 and ds2.
50
- # The values are given in (B.9) and (B.12)
51
-
52
- _cement_class = cement_class.upper().strip()
53
- alpha_cement = ALPHA_CEMENT_DICT.get(_cement_class)
54
- if alpha_cement is None:
55
- raise ValueError(f'cement_class={cement_class}, expected R, N or S')
56
-
57
- _beta_H = beta_H(h_0, f_cm, RH)
58
- _phi_RH = phi_RH(h_0, f_cm, RH)
59
- _beta_fcm = beta_fcm(f_cm)
60
- _t0_adj = t0_adj(t0, alpha_cement)
61
- beta_t0 = 1 / (0.1 + _t0_adj**0.20) # (B.5)
62
- _beta_c = beta_c(t0, t, _beta_H)
63
-
64
- phi_0 = _phi_RH * _beta_fcm * beta_t0 # (B.2)
65
- return phi_0 * _beta_c
66
-
67
-
68
- def beta_c(t0: float, t: float, beta_H: float) -> float:
69
- """Calculates the factor beta_c.
70
-
71
- EN 1992-1-1:2004, Eq. (B.7).
72
-
73
- Args:
74
- t0 (float): The concrete age in days a the time of loading.
75
- t (float): The concrete age at the evaluated time.
76
- beta_H: Parameter defined in (B.8).
77
-
78
- Returns:
79
- float: Parameter defined by Equation (B.7), beta_c.
80
- """
81
- return ((t - t0) / (beta_H + t - t0)) ** 0.3
82
-
83
-
84
- def t0_adj(t0: float, alpha_cement: float) -> float:
85
- """Calculates the adjusted age of the concrete.
86
-
87
- EN 1992-1-1:2004, Eq. (B.9).
88
-
89
- Args:
90
- t0 (float): The concrete age in days at the time of loading.
91
- alpha_cement (float): Exponent derived from the sement type.
92
-
93
- Returns:
94
- float: The adjusted age of the concrete.
95
- """
96
- return max(t0 * (9 / (2 + t0**1.2) + 1) ** alpha_cement, 0.5)
97
-
98
-
99
- def beta_fcm(f_cm: float) -> float:
100
- """Calculates beta_f_cm.
101
-
102
- EN 1992-1-1:2004, Eq. (B.4).
103
-
104
- Args:
105
- f_cm (float): The mean concrete strength.
106
-
107
- Returns:
108
- float: The factor defined in Equation (B.4).
109
- """
110
- return 16.8 / f_cm**0.5
111
-
112
-
113
- def phi_RH(h_0: float, f_cm: float, RH: int) -> float:
114
- """Calculates phi_RH.
115
-
116
- EN 1992-1-1:2004, Eq. (B.3).
117
-
118
- Args:
119
- h_0 (float): The effective cross sectional thickness, Equation (B.6).
120
- f_cm (float): The mean concrete strength.
121
- RH (int): The relative humidity in percent.
122
-
123
- Returns:
124
- float: The calculation parameter (B.3).
125
- """
126
- # (B.8c) Alpha 1 to 2 is a constant where the only variable is f_cm
127
- alpha_1, alpha_2 = (
128
- (35 / f_cm) ** 0.7,
129
- (35 / f_cm) ** 0.2,
130
- )
131
-
132
- if f_cm <= 35:
133
- return 1 + (1 - RH / 100) / (0.1 * h_0 ** (1 / 3))
134
- return (1 + (1 - RH / 100) / (0.1 * h_0 ** (1 / 3)) * alpha_1) * alpha_2
135
-
136
-
137
- def beta_H(h_0: float, f_cm: float, RH: int) -> float:
138
- """Calculates beta_H.
139
-
140
- EN 1992-1-1:2004, Eq. (B.8a and b).
141
-
142
- Args:
143
- h_0 (float): The effective cross sectional thickness, Equation (B.6).
144
- f_cm (float): The mean concrete strength.
145
- RH (int): The relative humidity in percent.
146
-
147
- Returns:
148
- float: The calculation parameter defined in (B.8).
149
- """
150
- # (B.8c) Alpha 3 is a constant where f_cm is the only variable
151
- alpha_3 = (35 / f_cm) ** 0.5
152
-
153
- if f_cm <= 35:
154
- # (B.8a) and (B.3a) applies
155
- return min(1.5 * (1 + (0.012 * RH) ** 18) * h_0 + 250, 1500)
156
- # (B.8b) and (B.3b) applies
157
- return min(
158
- 1.5 * (1 + (0.012 * RH) ** 18) * h_0 + 250 * alpha_3,
159
- 1500 * alpha_3,
160
- )
161
-
162
-
163
- def eps_cs(
164
- h_0: float,
165
- f_cm: float,
166
- cement_class: t.Literal['R', 'N', 'S'] = 'R',
167
- RH: int = 50,
168
- t_S: int = 28,
169
- t: int = 18263,
170
- ) -> float:
171
- """Calculates the shrinkage strain.
172
-
173
- EN 1992-1-1:2004, Eq. (3.8).
174
-
175
- Args:
176
- h_0 (float): The effective cross sectional thickness, Equation (B.6).
177
- f_cm (float): The mean concrete strength.
178
- cement_class (str): The cement class, defaults to 'R'. Possible values:
179
- 'R', 'N', 'S'.
180
-
181
- Keyword Args:
182
- RH (int): The relative humidity in percent, defaults to 50.
183
- t_S (int): the number of days when shrinkage begins, default: 28 days.
184
- t (int): the concrete age at the time (in days) of evaluation, default:
185
- 50 years.
186
-
187
- Returns:
188
- float: The shrinkage. Given as absolute, not in percent or ppm.
189
-
190
- Raises:
191
- ValueError: Checks if the cement class equals R, N or S.
192
- """
193
- _cement_class = cement_class.upper().strip()
194
- beta_ds = (t - t_S) / (t - t_S + 0.04 * h_0 ** (1 / 3)) # (3.10)
195
- beta_as = 1 - math.exp(-0.2 * t**0.5) # (3.13)
196
-
197
- # k_h is defined in Table 3.3 under (3.9)
198
- if h_0 >= 500:
199
- k_h = 0.70
200
- elif h_0 <= 100:
201
- k_h = 1.0
202
- else:
203
- k_h = np.interp(h_0, [100, 200, 300, 500], [1.0, 0.85, 0.75, 0.7])
204
-
205
- eps_ca_infinite = 2.5 * (f_cm - 18) * 1e-6 # (3.12)
206
- eps_ca = beta_as * eps_ca_infinite # (3.11)
207
- eps_cd = beta_ds * k_h * eps_cd_0(_cement_class, f_cm, RH) # (3.9)
208
- return eps_cd + eps_ca # (3.8)
209
-
210
-
211
- def beta_RH(RH: int, RH_0: int = 100) -> float:
212
- """Calculates beta_RH.
213
-
214
- EN 1992-1-1:2004, Eq. (B.12).
215
-
216
- Args:
217
- RH (int): The relative humidity in percent.
218
-
219
- Keyword Args:
220
- RH_0 (int): The reference relative humidity, default: 100%.
221
-
222
- Returns:
223
- float: Calculation parameter from Equation (B.12).
224
- """
225
- return 1.55 * (1 - (RH / RH_0) ** 3)
226
-
227
-
228
- def eps_cd_0(cement_class: str, f_cm: float, RH: int) -> float:
229
- """Calculates eps_cd_0.
230
-
231
- EN 1992-1-1:2004, Eq. (B.11).
232
-
233
- Args:
234
- cement_class (str): The cement class, defaults to 'R'. Possible values:
235
- 'R', 'N', 'S'.
236
- f_cm (float): The mean concrete strength.
237
- RH (int): The relative humidity in percent.
238
-
239
- Returns:
240
- float: The nominal value for shrinkage.
241
-
242
- Raises:
243
- ValueError: Checks if the cement class equals R, N or S.
244
- """
245
- _cement_class = cement_class.upper().strip()
246
- alpha = ALPHA_DS_DICT.get(_cement_class)
247
- if alpha is None:
248
- raise ValueError(f'cement_class={cement_class}, expected R, N or S')
249
- alpha_ds1 = alpha['alpha_ds1']
250
- alpha_ds2 = alpha['alpha_ds2']
251
-
252
- return (
253
- 0.85
254
- * ((220 + 110 * alpha_ds1) * math.exp(-alpha_ds2 * f_cm / 10))
255
- * 1e-6
256
- * beta_RH(RH)
257
- ) # (B.11)