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.
- structuralcodes/__init__.py +1 -1
- structuralcodes/codes/ec2_2004/__init__.py +43 -11
- structuralcodes/codes/ec2_2004/_concrete_creep_and_shrinkage.py +529 -0
- structuralcodes/codes/ec2_2004/shear.py +5 -1
- structuralcodes/codes/mc2010/_concrete_creep_and_shrinkage.py +3 -1
- structuralcodes/core/base.py +16 -4
- structuralcodes/geometry/_geometry.py +4 -2
- structuralcodes/geometry/_reinforcement.py +14 -2
- structuralcodes/materials/constitutive_laws/__init__.py +84 -0
- structuralcodes/materials/constitutive_laws/_bilinearcompression.py +138 -0
- structuralcodes/materials/constitutive_laws/_elastic.py +114 -0
- structuralcodes/materials/constitutive_laws/_elasticplastic.py +172 -0
- structuralcodes/materials/constitutive_laws/_parabolarectangle.py +198 -0
- structuralcodes/materials/constitutive_laws/_popovics.py +133 -0
- structuralcodes/materials/constitutive_laws/_sargin.py +115 -0
- structuralcodes/materials/constitutive_laws/_userdefined.py +218 -0
- structuralcodes/sections/_generic.py +39 -9
- structuralcodes/sections/section_integrators/_fiber_integrator.py +1 -3
- structuralcodes/sections/section_integrators/_marin_integrator.py +1 -1
- {structuralcodes-0.1.0.dist-info → structuralcodes-0.2.0.dist-info}/METADATA +1 -1
- {structuralcodes-0.1.0.dist-info → structuralcodes-0.2.0.dist-info}/RECORD +22 -15
- structuralcodes/codes/ec2_2004/annex_b_shrink_and_creep.py +0 -257
- structuralcodes/materials/constitutive_laws.py +0 -981
- {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
|
|
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)
|
|
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)
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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)
|
|
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.
|
|
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=
|
|
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=
|
|
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/
|
|
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=
|
|
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=
|
|
24
|
+
structuralcodes/core/base.py,sha256=7cpDM2hvBZp9nyU714XRiMzDPNdydJqLtIHHvcXZctE,8935
|
|
25
25
|
structuralcodes/geometry/__init__.py,sha256=FwzywfyGKOk6v96ZyOfyBo5iVeuK_W0TQVz5llAkYW4,559
|
|
26
|
-
structuralcodes/geometry/_geometry.py,sha256=
|
|
27
|
-
structuralcodes/geometry/_reinforcement.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
50
|
-
structuralcodes-0.
|
|
51
|
-
structuralcodes-0.
|
|
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)
|