structuralcodes 0.4.0__py3-none-any.whl → 0.5.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 (26) hide show
  1. structuralcodes/__init__.py +1 -1
  2. structuralcodes/codes/ec2_2004/__init__.py +2 -0
  3. structuralcodes/codes/ec2_2004/shear.py +44 -4
  4. structuralcodes/codes/mc2010/__init__.py +18 -0
  5. structuralcodes/codes/mc2010/_concrete_punching.py +300 -388
  6. structuralcodes/core/base.py +1 -1
  7. structuralcodes/geometry/_circular.py +3 -10
  8. structuralcodes/geometry/_geometry.py +47 -92
  9. structuralcodes/geometry/_rectangular.py +3 -10
  10. structuralcodes/geometry/_reinforcement.py +8 -11
  11. structuralcodes/materials/__init__.py +2 -1
  12. structuralcodes/materials/basic/__init__.py +11 -0
  13. structuralcodes/materials/basic/_elastic.py +52 -0
  14. structuralcodes/materials/basic/_elasticplastic.py +75 -0
  15. structuralcodes/materials/basic/_generic.py +26 -0
  16. structuralcodes/materials/reinforcement/_reinforcementEC2_2004.py +1 -1
  17. structuralcodes/materials/reinforcement/_reinforcementEC2_2023.py +1 -1
  18. structuralcodes/materials/reinforcement/_reinforcementMC2010.py +1 -1
  19. structuralcodes/sections/_generic.py +53 -14
  20. structuralcodes/sections/_rc_utils.py +15 -5
  21. structuralcodes/sections/section_integrators/_fiber_integrator.py +19 -11
  22. structuralcodes/sections/section_integrators/_marin_integrator.py +24 -19
  23. {structuralcodes-0.4.0.dist-info → structuralcodes-0.5.0.dist-info}/METADATA +1 -1
  24. {structuralcodes-0.4.0.dist-info → structuralcodes-0.5.0.dist-info}/RECORD +26 -22
  25. {structuralcodes-0.4.0.dist-info → structuralcodes-0.5.0.dist-info}/WHEEL +0 -0
  26. {structuralcodes-0.4.0.dist-info → structuralcodes-0.5.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,26 @@
1
+ """A generic material that could hold any type of constitutive law."""
2
+
3
+ import typing as t
4
+
5
+ from ...core.base import ConstitutiveLaw, Material
6
+
7
+
8
+ class GenericMaterial(Material):
9
+ """A material class that accepts any constitutive law."""
10
+
11
+ def __init__(
12
+ self,
13
+ density: float,
14
+ constitutive_law: ConstitutiveLaw,
15
+ name: t.Optional[str] = None,
16
+ ):
17
+ """Initialize a material with a constitutive law.
18
+
19
+ Arguments:
20
+ density (float): The density.
21
+ constitutive_law (ConstitutiveLaw): The constitutive law of the
22
+ material.
23
+ name (str, optional): The name of the material, default value None.
24
+ """
25
+ super().__init__(density=density, name=name)
26
+ self._constitutive_law = constitutive_law
@@ -129,7 +129,7 @@ class ReinforcementEC2_2004(Reinforcement): # noqa: N801
129
129
  """Returns kwargs for ElasticPlastic constitutive law with strain
130
130
  hardening.
131
131
  """
132
- Eh = (self.ftd() - self.fyd()) / (self.epsuk - self.epsyd)
132
+ Eh = (self.ftd() - self.fyd()) / (self.epsud() - self.epsyd)
133
133
  return {
134
134
  'E': self.Es,
135
135
  'fy': self.fyd(),
@@ -117,7 +117,7 @@ class ReinforcementEC2_2023(Reinforcement): # noqa: N801
117
117
  """Returns kwargs for ElasticPlastic constitutive law with strain
118
118
  hardening.
119
119
  """
120
- Eh = (self.ftd() - self.fyd()) / (self.epsuk - self.epsyd)
120
+ Eh = (self.ftd() - self.fyd()) / (self.epsud() - self.epsyd)
121
121
  return {
122
122
  'E': self.Es,
123
123
  'fy': self.fyd(),
@@ -125,7 +125,7 @@ class ReinforcementMC2010(Reinforcement):
125
125
  """Returns kwargs for ElasticPlastic constitutive law with strain
126
126
  hardening.
127
127
  """
128
- Eh = (self.ftd() - self.fyd()) / (self.epsuk - self.epsyd)
128
+ Eh = (self.ftd() - self.fyd()) / (self.epsud() - self.epsyd)
129
129
  return {
130
130
  'E': self.Es,
131
131
  'fy': self.fyd(),
@@ -19,7 +19,7 @@ from structuralcodes.geometry import (
19
19
  PointGeometry,
20
20
  SurfaceGeometry,
21
21
  )
22
- from structuralcodes.materials.constitutive_laws import Elastic
22
+ from structuralcodes.materials.basic import ElasticMaterial
23
23
 
24
24
  from .section_integrators import SectionIntegrator, integrator_factory
25
25
 
@@ -42,6 +42,8 @@ class GenericSection(Section):
42
42
  strength, moment curvature, etc.).
43
43
  """
44
44
 
45
+ geometry: CompoundGeometry
46
+
45
47
  def __init__(
46
48
  self,
47
49
  geometry: t.Union[SurfaceGeometry, CompoundGeometry],
@@ -96,6 +98,7 @@ class GenericSectionCalculator(SectionCalculator):
96
98
  """Calculator class implementing analysis algorithms for code checks."""
97
99
 
98
100
  integrator: SectionIntegrator
101
+ section: GenericSection
99
102
 
100
103
  def __init__(
101
104
  self,
@@ -155,13 +158,17 @@ class GenericSectionCalculator(SectionCalculator):
155
158
  # Computation of surface area, reinforcement area, EA (axial rigidity)
156
159
  # and mass: Morten -> problem with units! how do we deal with it?
157
160
  for geo in self.section.geometry.geometries:
158
- gp.ea += geo.area * geo.material.get_tangent(eps=0)
161
+ gp.ea += geo.area * geo.material.constitutive_law.get_tangent(
162
+ eps=0
163
+ )
159
164
  if geo.density is not None:
160
165
  # this assumes area in mm2 and density in kg/m3
161
166
  gp.mass += geo.area * geo.density * 1e-9
162
167
 
163
168
  for geo in self.section.geometry.point_geometries:
164
- gp.ea += geo.area * geo.material.get_tangent(eps=0)
169
+ gp.ea += geo.area * geo.material.constitutive_law.get_tangent(
170
+ eps=0
171
+ )
165
172
  gp.area_reinforcement += geo.area
166
173
  if geo.density is not None:
167
174
  # this assumes area in mm2 and density in kg/m3
@@ -237,7 +244,7 @@ class GenericSectionCalculator(SectionCalculator):
237
244
 
238
245
  # Create a dummy material for integration of area moments
239
246
  # This is used for J, S etc, not for E_J E_S etc
240
- dummy_mat = Elastic(E=1)
247
+ dummy_mat = ElasticMaterial(E=1, density=1)
241
248
  # Computation of moments of area (material-independet)
242
249
  # Note: this could be un-meaningfull when many materials
243
250
  # are combined
@@ -309,15 +316,40 @@ class GenericSectionCalculator(SectionCalculator):
309
316
  chi_min = 1e10
310
317
  for g in geom.geometries + geom.point_geometries:
311
318
  for other_g in geom.geometries + geom.point_geometries:
319
+ # This is left on purpose: even if tempted we should not do
320
+ # this check:
312
321
  # if g != other_g:
313
- eps_p = g.material.get_ultimate_strain(yielding=yielding)[1]
322
+ eps_p = g.material.constitutive_law.get_ultimate_strain(
323
+ yielding=yielding
324
+ )[1]
314
325
  if isinstance(g, SurfaceGeometry):
315
326
  y_p = g.polygon.bounds[1]
316
327
  elif isinstance(g, PointGeometry):
317
328
  y_p = g._point.coords[0][1]
318
- eps_n = other_g.material.get_ultimate_strain(
319
- yielding=yielding
329
+ # Check if the section is a reinforced concrete section:
330
+ # If it is, we need to obtain the "yield" strain of concrete
331
+ # (-0.002 for default parabola-rectangle concrete)
332
+ # If the geometry is not concrete, don't get the yield strain
333
+ # If it is not a reinforced concrete section, return
334
+ # the yield strain if asked.
335
+ is_rc_section = self.section.geometry.reinforced_concrete
336
+ is_concrete_geom = (
337
+ isinstance(other_g, SurfaceGeometry) and other_g.concrete
338
+ )
339
+
340
+ use_yielding = (
341
+ yielding
342
+ if (
343
+ (is_rc_section and is_concrete_geom)
344
+ or (not is_rc_section)
345
+ )
346
+ else False
347
+ )
348
+
349
+ eps_n = other_g.material.constitutive_law.get_ultimate_strain(
350
+ yielding=use_yielding
320
351
  )[0]
352
+
321
353
  if isinstance(other_g, SurfaceGeometry):
322
354
  y_n = other_g.polygon.bounds[3]
323
355
  elif isinstance(other_g, PointGeometry):
@@ -583,14 +615,20 @@ class GenericSectionCalculator(SectionCalculator):
583
615
 
584
616
  @property
585
617
  def n_min(self) -> float:
586
- """Return minimum axial load."""
618
+ """Return minimum axial load.
619
+
620
+ In most situations, this is the capacity in compression.
621
+ """
587
622
  if self._n_min is None:
588
623
  self._n_min, self._n_max = self.calculate_limit_axial_load()
589
624
  return self._n_min
590
625
 
591
626
  @property
592
627
  def n_max(self) -> float:
593
- """Return maximum axial load."""
628
+ """Return maximum axial load.
629
+
630
+ In most situations, this is the capacity in tension.
631
+ """
594
632
  if self._n_max is None:
595
633
  self._n_min, self._n_max = self.calculate_limit_axial_load()
596
634
  return self._n_max
@@ -694,6 +732,9 @@ class GenericSectionCalculator(SectionCalculator):
694
732
  Returns:
695
733
  UltimateBendingMomentResults: The results from the calculation.
696
734
  """
735
+ # Check if the section can carry the axial load
736
+ self.check_axial_load(n=n)
737
+
697
738
  # Compute the bending strength with the bisection algorithm
698
739
  # Rotate the section of angle theta
699
740
  rotated_geom = self.section.geometry.rotate(-theta)
@@ -701,8 +742,6 @@ class GenericSectionCalculator(SectionCalculator):
701
742
  # Rotate also triangulated data!
702
743
  self._rotate_triangulated_data(-theta)
703
744
 
704
- # Check if the section can carry the axial load
705
- self.check_axial_load(n=n)
706
745
  # Find the strain distribution corresponding to failure and equilibrium
707
746
  # with external axial force
708
747
  strain = self.find_equilibrium_fixed_pivot(rotated_geom, n)
@@ -768,6 +807,9 @@ class GenericSectionCalculator(SectionCalculator):
768
807
  Returns:
769
808
  MomentCurvatureResults: The calculation results.
770
809
  """
810
+ # Check if the section can carry the axial load
811
+ self.check_axial_load(n=n)
812
+
771
813
  # Create an empty response object
772
814
  res = s_res.MomentCurvatureResults()
773
815
  res.n = n
@@ -777,9 +819,6 @@ class GenericSectionCalculator(SectionCalculator):
777
819
  # Rotate also triangulated data!
778
820
  self._rotate_triangulated_data(-theta)
779
821
 
780
- # Check if the section can carry the axial load
781
- self.check_axial_load(n=n)
782
-
783
822
  if chi is None:
784
823
  # Find ultimate curvature from the strain distribution
785
824
  # corresponding to failure and equilibrium with external axial
@@ -4,7 +4,8 @@ import typing as t
4
4
 
5
5
  import structuralcodes.core._section_results as s_res
6
6
  from structuralcodes.geometry import CompoundGeometry, SurfaceGeometry
7
- from structuralcodes.materials.constitutive_laws import Elastic, UserDefined
7
+ from structuralcodes.materials.basic import ElasticMaterial, GenericMaterial
8
+ from structuralcodes.materials.constitutive_laws import UserDefined
8
9
  from structuralcodes.sections import GenericSection
9
10
  from structuralcodes.sections.section_integrators import FiberIntegrator
10
11
 
@@ -57,13 +58,22 @@ def calculate_elastic_cracked_properties(
57
58
  rotated_geometry = section.geometry.rotate(-theta)
58
59
 
59
60
  for geo in rotated_geometry.geometries:
60
- Ec = geo.material.get_tangent(eps=0)
61
- elastic_concrete = UserDefined([-100, 0], [-100 * Ec, 0])
61
+ Ec = geo.material.constitutive_law.get_tangent(eps=0)
62
+ density = geo.material.density
63
+ elastic_concrete_law = UserDefined([-100, 0], [-100 * Ec, 0])
64
+ elastic_concrete = GenericMaterial(
65
+ density=density,
66
+ constitutive_law=elastic_concrete_law,
67
+ name='elastic concrete',
68
+ )
62
69
  geo._material = elastic_concrete
63
70
 
64
71
  for pg in rotated_geometry.point_geometries:
65
- Es = pg.material.get_tangent(eps=0)
66
- elastic_steel = Elastic(Es, 'elastic steel')
72
+ Es = pg.material.constitutive_law.get_tangent(eps=0)
73
+ density = pg.material.density
74
+ elastic_steel = ElasticMaterial(
75
+ E=Es, density=density, name='elastic steel'
76
+ )
67
77
  pg._material = elastic_steel
68
78
 
69
79
  curv = -1e-5 # Any curvature should return the same mechanical properties.
@@ -88,7 +88,7 @@ class FiberIntegrator(SectionIntegrator):
88
88
  max_area = g.area * mesh_size
89
89
  # triangulate the geometry getting back the mesh
90
90
  mesh = triangle.triangulate(tri, f'pq{30:.1f}Aa{max_area}o1')
91
- mat = g.material
91
+ constitutive_law = g.material.constitutive_law
92
92
  # Get x and y coordinates (centroid) and area for each fiber
93
93
  x = []
94
94
  y = []
@@ -128,7 +128,7 @@ class FiberIntegrator(SectionIntegrator):
128
128
 
129
129
  # return back the triangulation data
130
130
  triangulated_data.append(
131
- (np.array(x), np.array(y), np.array(area), mat)
131
+ (np.array(x), np.array(y), np.array(area), constitutive_law)
132
132
  )
133
133
  # For the reinforcement
134
134
  # Tentative proposal for managing reinforcement (PointGeometry)
@@ -139,19 +139,27 @@ class FiberIntegrator(SectionIntegrator):
139
139
  x = x[0]
140
140
  y = y[0]
141
141
  area = pg.area
142
- mat = pg.material
143
- if reinf_data.get(mat) is None:
144
- reinf_data[mat] = [
142
+ constitutive_law = pg.material.constitutive_law
143
+ if reinf_data.get(constitutive_law) is None:
144
+ reinf_data[constitutive_law] = [
145
145
  np.array(x),
146
146
  np.array(y),
147
147
  np.array(area),
148
148
  ]
149
149
  else:
150
- reinf_data[mat][0] = np.hstack((reinf_data[mat][0], x))
151
- reinf_data[mat][1] = np.hstack((reinf_data[mat][1], y))
152
- reinf_data[mat][2] = np.hstack((reinf_data[mat][2], area))
153
- for mat, value in reinf_data.items():
154
- triangulated_data.append((value[0], value[1], value[2], mat))
150
+ reinf_data[constitutive_law][0] = np.hstack(
151
+ (reinf_data[constitutive_law][0], x)
152
+ )
153
+ reinf_data[constitutive_law][1] = np.hstack(
154
+ (reinf_data[constitutive_law][1], y)
155
+ )
156
+ reinf_data[constitutive_law][2] = np.hstack(
157
+ (reinf_data[constitutive_law][2], area)
158
+ )
159
+ for constitutive_law, value in reinf_data.items():
160
+ triangulated_data.append(
161
+ (value[0], value[1], value[2], constitutive_law)
162
+ )
155
163
 
156
164
  return triangulated_data
157
165
 
@@ -199,7 +207,7 @@ class FiberIntegrator(SectionIntegrator):
199
207
 
200
208
  prepared_input = []
201
209
 
202
- triangulated_data = kwargs.get('tri', None)
210
+ triangulated_data = kwargs.get('tri')
203
211
  if triangulated_data is None:
204
212
  # No triangulation is provided, triangulate the section
205
213
  # Fiber integrator for generic section uses delaunay triangulation
@@ -71,29 +71,32 @@ class MarinIntegrator(SectionIntegrator):
71
71
  ) -> t.Tuple[t.List[t.Tuple], t.List[t.Tuple]]:
72
72
  """Get Marin coefficients."""
73
73
  if integrate == 'stress':
74
- if hasattr(geo.material, '__marin__'):
75
- strains, coeffs = geo.material.__marin__(strain=strain)
74
+ if hasattr(geo.material.constitutive_law, '__marin__'):
75
+ strains, coeffs = geo.material.constitutive_law.__marin__(
76
+ strain=strain
77
+ )
76
78
  else:
77
79
  raise AttributeError(
78
- f'The material object {geo.material} of geometry {geo} \
79
- does not have implement the __marin__ function. \
80
- Please implement the function or use another integrator,\
81
- like '
82
- 'Fibre'
83
- ''
80
+ 'The constitutive law object '
81
+ f'{geo.material.constitutive_law} of geometry {geo} does '
82
+ 'not have implement the __marin__ function. Please '
83
+ 'implement the function or use another integrator, like '
84
+ 'Fiber.'
84
85
  )
85
86
  elif integrate == 'modulus':
86
- if hasattr(geo.material, '__marin_tangent__'):
87
- strains, coeffs = geo.material.__marin_tangent__(strain=strain)
87
+ if hasattr(geo.material.constitutive_law, '__marin_tangent__'):
88
+ strains, coeffs = (
89
+ geo.material.constitutive_law.__marin_tangent__(
90
+ strain=strain
91
+ )
92
+ )
88
93
  else:
89
94
  raise AttributeError(
90
- f'The material object {geo.material} of geometry {geo} \
91
- does not have implement the __marin_tangent__ function\
92
- . \
93
- Please implement the function or use another integrato\
94
- r, like '
95
- 'Fibre'
96
- ''
95
+ 'The constitutive law object '
96
+ f'{geo.material.constitutive_law} of geometry {geo} does '
97
+ 'not have implement the __marin_tangent__ function. Please'
98
+ ' implement the function or use another integrator, like '
99
+ 'Fibre.'
97
100
  )
98
101
  else:
99
102
  raise ValueError(f'Unknown integrate type: {integrate}')
@@ -159,9 +162,11 @@ class MarinIntegrator(SectionIntegrator):
159
162
  x.append(xp)
160
163
  y.append(yp)
161
164
  if integrate == 'stress':
162
- IA.append(pg.material.get_stress(strain_) * A)
165
+ IA.append(pg.material.constitutive_law.get_stress(strain_) * A)
163
166
  elif integrate == 'modulus':
164
- IA.append(pg.material.get_tangent(strain_) * A)
167
+ IA.append(
168
+ pg.material.constitutive_law.get_tangent(strain_) * A
169
+ )
165
170
  input.append((1, np.array(x), np.array(y), np.array(IA)))
166
171
 
167
172
  def prepare_input(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: structuralcodes
3
- Version: 0.4.0
3
+ Version: 0.5.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,20 +1,20 @@
1
- structuralcodes/__init__.py,sha256=cNO1h58v3gIPEMsX1HiSV14kJbKoDDCaW7Tzdh9ZU9Y,390
1
+ structuralcodes/__init__.py,sha256=Vq8UmTpStvopR5HnfnsUoEB3e53GOoojoXNv-oi6suo,390
2
2
  structuralcodes/codes/__init__.py,sha256=g5xMAJ3jEZHFd0cypvZY6lMCi7XeVEntsO8zHzI2mWc,2803
3
- structuralcodes/codes/ec2_2004/__init__.py,sha256=DljXFNrCGE1lZIOsgyZgJ7Xo-xUidJomDrDKyfOHcH8,2431
3
+ structuralcodes/codes/ec2_2004/__init__.py,sha256=uh_3lllfMJUZMwbG11S5wuv4nFjNMDlDWPg6vejxaeA,2473
4
4
  structuralcodes/codes/ec2_2004/_concrete_creep_and_shrinkage.py,sha256=Vbxxc3g0WZz2qFWDlfrVvC-uxMO2YJpfclnHxRPMuYQ,15301
5
5
  structuralcodes/codes/ec2_2004/_concrete_material_properties.py,sha256=Ol51tzcVOHUvc2Vea24WQJ4FABxXc-9cB5RVu2N1pio,5964
6
6
  structuralcodes/codes/ec2_2004/_reinforcement_material_properties.py,sha256=_ZlvdHcOswu1Ge1XjSvt4j5ue-znDceMOlA0s528IqM,2779
7
7
  structuralcodes/codes/ec2_2004/_section_7_3_crack_control.py,sha256=a91tWQKNTxB2SpSKu0Wtm-P5GdmifRLggNlEHIQ3XMY,31981
8
- structuralcodes/codes/ec2_2004/shear.py,sha256=gzhgIa-EgoD9gLO_Hfa8VeCmjAxuPK0wZ0soDKC7W5w,17095
8
+ structuralcodes/codes/ec2_2004/shear.py,sha256=Y0WpKqZGvfGKgmlYX2L_qHaXWXH_M6en-TbhWxlQCMI,18254
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
- structuralcodes/codes/mc2010/__init__.py,sha256=xuty6-sQAnxGH8NCzvyj_bf-RUg8bTaH0HYWsqOycsk,3165
13
+ structuralcodes/codes/mc2010/__init__.py,sha256=2RmgH19YNKLf5AUZuKuP9z1NOobNEOJ8wk_ADi7IS0Y,3483
14
14
  structuralcodes/codes/mc2010/_concrete_creep_and_shrinkage.py,sha256=lQAj8n0TVhRvttVFF9YLVNzCRo3O3wIqWvBdZRu9vDk,24295
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
- structuralcodes/codes/mc2010/_concrete_punching.py,sha256=ZG2P7WXIRcFh5sGlmHP20BsJbz0o44cFO51FCru2kXw,17431
17
+ structuralcodes/codes/mc2010/_concrete_punching.py,sha256=OOPbltvs-6z7klCZmBurtqLVBARQsKn_ov_gvSz-tUc,13924
18
18
  structuralcodes/codes/mc2010/_concrete_shear.py,sha256=HZhhpzQd-09NPrHpSK5fnPA1epVCQH8JfdSi6bpgiFg,21883
19
19
  structuralcodes/codes/mc2010/_concrete_torsion.py,sha256=QBFnCYTOnP6FjN0MgX9iBrXN1yuELxQVP2TeDXDB7PM,4523
20
20
  structuralcodes/codes/mc2010/_interface_concrete_steel_rebar.py,sha256=bkZN4FYA430Nor3b25Z3ujWL2xbRhdYO5tgqPnUXCnk,9966
@@ -22,14 +22,18 @@ structuralcodes/codes/mc2010/_reinforcement_material_properties.py,sha256=FELmgM
22
22
  structuralcodes/codes/mc2020/__init__.py,sha256=5hrAfBtAeG69N_lroFpG10_ZKB1SuNlKBnuHug2DI3E,174
23
23
  structuralcodes/core/__init__.py,sha256=spnvZIm_w3jX_lV-v3bloDjgHh8lrH6UHpA1Nv1zeAI,55
24
24
  structuralcodes/core/_section_results.py,sha256=MzUGThcxmZvyp0UBwxEiUAx2qz49UTlIo7MqoPEy3xk,7968
25
- structuralcodes/core/base.py,sha256=UyJKocFs_RAhDveIFb69p1ClfA7KfjfTZuqLCx4Bnj4,8661
25
+ structuralcodes/core/base.py,sha256=8vpC3SmlEnhWi7_xgxpoI-seas4uV3VWrYH7Hs1ZvE0,8680
26
26
  structuralcodes/geometry/__init__.py,sha256=STc2chf49NkWlnpcfB8n4mYWmR633VsKtbfyG8ylQ7s,771
27
- structuralcodes/geometry/_circular.py,sha256=vYk5mBY0bh_qqX_RrXn_NTE2iwPBvC-Uku3_AJEIZgQ,3557
28
- structuralcodes/geometry/_geometry.py,sha256=HE2pJaUdjgeFWp7WNA9Rm1Bt7QI6_Bjn-ePt6aO7AcY,31544
29
- structuralcodes/geometry/_rectangular.py,sha256=PLKgz998qDjcn76JjVW08fexN0jAke0K6yNeaOynqOQ,3458
30
- structuralcodes/geometry/_reinforcement.py,sha256=2l4I2tm5YEy9Oeqlzt1GulljSW0k5_4_iG6quvhlSRk,9097
27
+ structuralcodes/geometry/_circular.py,sha256=YzR98Tjk3zJ-k8-MoCMUGEqTLe_VBPmVLWs6TkGpjDY,3130
28
+ structuralcodes/geometry/_geometry.py,sha256=q1wMYxBJl0-GlEcQSnU-Zk0rNUTq8PLexTaKC-XC7q8,29334
29
+ structuralcodes/geometry/_rectangular.py,sha256=CfTdRiovUps-rgFdTpE7lKuuWlN65SLVUtXPjHaA2bI,3031
30
+ structuralcodes/geometry/_reinforcement.py,sha256=CXXKfOb-eNLVqH5hCztNrdzMzbZTreoZaWYxEJXhM1Q,8849
31
31
  structuralcodes/geometry/_steel_sections.py,sha256=UdJmhhnK8r5gEfBzvWsMFHGs5gmuoOhFoduBanlRMQg,60225
32
- structuralcodes/materials/__init__.py,sha256=r5E5vsXVKB-BGZXTnEbsrYJbH6rr6Xlc_b4LlcUPIbc,173
32
+ structuralcodes/materials/__init__.py,sha256=MF2hxtwTcZhHfXGnGfO_ZqyW9z3Dd-B6mB1cKsNztwY,193
33
+ structuralcodes/materials/basic/__init__.py,sha256=SrtMwyHakwJRlrFpzJIvbU0TWF8qsOyFXTfdPeIoCDQ,266
34
+ structuralcodes/materials/basic/_elastic.py,sha256=VdqiTl-chtUQ1scSw2d8QfTX5SxXnAt3-4n9y6wIUnQ,1485
35
+ structuralcodes/materials/basic/_elasticplastic.py,sha256=hSMRStV1pxHAJHVsf47rh4L1ZYsJV6mEqhzBl4vvYe0,1986
36
+ structuralcodes/materials/basic/_generic.py,sha256=jjmOM_nLzldwkoIn2nTFBUknNHWkJGPVMFG02TrBDDw,802
33
37
  structuralcodes/materials/concrete/__init__.py,sha256=GRD5WcbYrnE4iN-L7qVkhVTi7w_PUP7pnbGueOaVeFs,2576
34
38
  structuralcodes/materials/concrete/_concrete.py,sha256=VmdxxSoqKEPADwcQ-LhL1adukZkgigh2zCfp3QqkTAs,1480
35
39
  structuralcodes/materials/concrete/_concreteEC2_2004.py,sha256=waNTw-iiytWHGPML1swW2EQDcb10FOQNMsm2y5ykQPk,18713
@@ -45,19 +49,19 @@ structuralcodes/materials/constitutive_laws/_sargin.py,sha256=WJGw0EtqkPh-d3N6vT
45
49
  structuralcodes/materials/constitutive_laws/_userdefined.py,sha256=vr01SyZTQvDimJLJN3-shvhIevvt9_qRtiy8OjodKQQ,9925
46
50
  structuralcodes/materials/reinforcement/__init__.py,sha256=-UA04GSNN6_xLKqnH_5taiOmgxYwD_wtT6Nw8UbfkJY,2757
47
51
  structuralcodes/materials/reinforcement/_reinforcement.py,sha256=AzVaUe0ULD01dkD1V2-gpzXbKpnXKssmjFkohSHKIZI,2610
48
- structuralcodes/materials/reinforcement/_reinforcementEC2_2004.py,sha256=nx1OTJmqBD6yEtsVk8BlLkrGQgC0UUNIZbR7rxQhPAA,4744
49
- structuralcodes/materials/reinforcement/_reinforcementEC2_2023.py,sha256=XSBJ8hC7ZbPNxXQVdngH16X8v8pBY_vWjsdMVdhJHBA,4257
50
- structuralcodes/materials/reinforcement/_reinforcementMC2010.py,sha256=LPvKm1K59zHxQ_KUBGdqEVOWYGHxqUJDFHj5PeYXniM,4419
52
+ structuralcodes/materials/reinforcement/_reinforcementEC2_2004.py,sha256=V-wnFBhkalZhbEUbSMbmmWlGKr5y8ozVsCCsNy2hzW0,4746
53
+ structuralcodes/materials/reinforcement/_reinforcementEC2_2023.py,sha256=qP-Qeg-x7JWZxghUliToABoz_K5nIF--4_EykmUUJmQ,4259
54
+ structuralcodes/materials/reinforcement/_reinforcementMC2010.py,sha256=tlZq_x3RwMBngev0KUzFCyOYe2rW-JIpVgobXhpshdI,4421
51
55
  structuralcodes/sections/__init__.py,sha256=gUGqiv8zyhiMmxEFme8E9nC2b3aJKs3ieBYz6X2GVFY,545
52
- structuralcodes/sections/_generic.py,sha256=BCMRraICt9-3FY8UXDNLnW31yTM0bPLbw76TB_5XdJA,56415
53
- structuralcodes/sections/_rc_utils.py,sha256=KZGVyQNSsbol7Dcyx7StoN1ybzrXMeKlyIFdXAauJW0,4229
56
+ structuralcodes/sections/_generic.py,sha256=JYVx-8LhT7d2MsGGBcvy4aDF2vJz4XzDy5q5fshDRzA,57798
57
+ structuralcodes/sections/_rc_utils.py,sha256=ri2v7j6YmxZIEBt1GHmjREA0uMbjD7z7piZEsva1tIY,4637
54
58
  structuralcodes/sections/section_integrators/__init__.py,sha256=PK4ixV0XrfHXN-itIrB1r90npoWo3aIJqMcenqcaees,399
55
59
  structuralcodes/sections/section_integrators/_factory.py,sha256=MHp14hfWU-oXTiIutCKLJEC47LirYsHgEAAmHVtnFMY,1242
56
- structuralcodes/sections/section_integrators/_fiber_integrator.py,sha256=7On87ESqRDorV4YdaOTq9h55XaJFC5h6mMN4ys6DYos,12873
60
+ structuralcodes/sections/section_integrators/_fiber_integrator.py,sha256=0n99oNN0fb3RDoktI4qilA5T3ccALYZ4SlxKg1a9AJA,13214
57
61
  structuralcodes/sections/section_integrators/_marin_integration.py,sha256=SZgya6d_Tequ3jez7UEBlYioZepW2IDKaAxn_6WrMbU,1563
58
- structuralcodes/sections/section_integrators/_marin_integrator.py,sha256=wdgscIWTIRfkPPafI77Lk4-FmtQLDNw2kanMkhNkfTc,15392
62
+ structuralcodes/sections/section_integrators/_marin_integrator.py,sha256=MIDHow_BHa5BFs5OVPHAGM2fuFYKgfRQF8-FG2vZ9Jo,15646
59
63
  structuralcodes/sections/section_integrators/_section_integrator.py,sha256=aPYuUpqeQLYauVi3_uJoEtXPSuXn79Aau3GTlISn-sI,2355
60
- structuralcodes-0.4.0.dist-info/licenses/LICENSE,sha256=3pqb3JVOTHCoMlvB4xxKrBlj0KsM_5Tyg5nsaCLJcSY,11372
61
- structuralcodes-0.4.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
62
- structuralcodes-0.4.0.dist-info/METADATA,sha256=SQl0Zk0FbcEyC3bLfcsesntyvDGQBDf5y6oXFhddfrA,2466
63
- structuralcodes-0.4.0.dist-info/RECORD,,
64
+ structuralcodes-0.5.0.dist-info/licenses/LICENSE,sha256=3pqb3JVOTHCoMlvB4xxKrBlj0KsM_5Tyg5nsaCLJcSY,11372
65
+ structuralcodes-0.5.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
66
+ structuralcodes-0.5.0.dist-info/METADATA,sha256=CWL0lKtMb-lw4BSsD9tfuFest8IeBImok9e-0tBlqbU,2466
67
+ structuralcodes-0.5.0.dist-info/RECORD,,