Materials#
concreteproperties
requires material properties to be defined for the concrete and
steel components of the reinforced concrete section. Any number of different material
properties can be used for a single cross-section. For example, higher strength precast
sections can be topped with lower grade in-situ slabs, and high tensile steel can be
used in combination with normal grade reinforcing steel.
The structural behaviour of materials is described by Stress-Strain Profiles.
Note
In concreteproperties
, a positive sign is given to compressive forces, stresses
and strains, while a negative sign is given to tensile forces, stresses and strains.
Material Classes#
concreteproperties
ships with material objects describing the structural behaviour
of both concrete and steel. The generic Material
class can be used to describe the behaviour of any other material.
By default, all geometries in concreteproperties
are meshed to capture strain
variation across the section. However, for smaller geometries (such as reinforcement),
concreteproperties
can treat the area as having a constant strain with a lumped
mass, which increases the performance of the analysis with almost no loss in fidelity.
The meshing can be switched off by setting the attribute meshed=False
.
The SteelBar
class has meshing disabled by default
and should be used when defining steel reinforcement. On the other hand, the
Steel
class is meshed by default so should be used
when defining larger sections such as strucutral steel sections used in composite
sections. The SteelStrand
class also has meshing
disabled by default and should be used when defining prestressing strands.
Material#
- class concreteproperties.material.Material(name: str, density: float, stress_strain_profile: StressStrainProfile, colour: str, meshed: bool)[source]
Generic class for a
concreteproperties
material.- Parameters:
name (str) – Material name
density (float) – Material density (mass per unit volume)
stress_strain_profile (StressStrainProfile) – Material stress-strain profile
colour (str) – Colour of the material for rendering, see https://matplotlib.org/stable/gallery/color/named_colors.html for a list of named colours
meshed (bool) – If set to True, the entire material region is meshed; if set to False, the material region is treated as a lumped circular mass at its centroid
Concrete#
- class concreteproperties.material.Concrete(name: str, density: float, stress_strain_profile: ConcreteServiceProfile, colour: str, ultimate_stress_strain_profile: ConcreteUltimateProfile, flexural_tensile_strength: float)[source]
Class for a concrete material.
- Parameters:
name (str) – Concrete material name
density (float) – Concrete density (mass per unit volume)
stress_strain_profile (ConcreteServiceProfile) – Service concrete stress-strain profile
ultimate_stress_strain_profile (ConcreteUltimateProfile) – Ultimate concrete stress-strain profile
flexural_tensile_strength (float) – Absolute value of the concrete flexural tensile strength
colour (str) – Colour of the material for rendering, see https://matplotlib.org/stable/gallery/color/named_colors.html for a list of named colours
- Raises:
ValueError – If concrete stress_strain_profile is not a ConcreteServiceProfile object
ValueError – If concrete ultimate_stress_strain_profile is not a ConcreteUltimateProfile object
Steel#
- class concreteproperties.material.Steel(name: str, density: float, stress_strain_profile: StressStrainProfile, colour: str)[source]
Class for a steel material.
This steel material has the entire region meshed to allow for strain variation across the section, e.g. structural steel profiles in composite sections.
- Parameters:
name (str) – Steel material name
density (float) – Steel density (mass per unit volume)
stress_strain_profile (StressStrainProfile) – Steel stress-strain profile
colour (str) – Colour of the material for rendering, see https://matplotlib.org/stable/gallery/color/named_colors.html for a list of named colours
SteelBar#
- class concreteproperties.material.SteelBar(name: str, density: float, stress_strain_profile: StressStrainProfile, colour: str)[source]
Class for a steel bar material.
This steel material is treated as a lumped circular mass with a constant strain.
- Parameters:
name (str) – Steel bar material name
density (float) – Steel bar density (mass per unit volume)
stress_strain_profile (StressStrainProfile) – Steel bar stress-strain profile
rendering (Colour of the material for) – https://matplotlib.org/stable/gallery/color/named_colors.html for a list of named colours
see – https://matplotlib.org/stable/gallery/color/named_colors.html for a list of named colours
SteelStrand#
- class concreteproperties.material.SteelStrand(name: str, density: float, stress_strain_profile: StrandProfile, colour: str, prestress_stress: float = 0)[source]
Class for a steel strand material.
This steel strand material is treated as a lumped circular mass with a constant strain.
Note
A
StrandProfile
must be used if using aSteelStrand
object.Note
The strand is assumed to be bonded to the concrete.
- Parameters:
name (str) – Steel strand material name
density (float) – Steel strand density (mass per unit volume)
stress_strain_profile (StrandProfile) – Steel strand stress-strain profile
rendering (Colour of the material for) – https://matplotlib.org/stable/gallery/color/named_colors.html for a list of named colours
see – https://matplotlib.org/stable/gallery/color/named_colors.html for a list of named colours
prestress_stress (float) – Prestressing stress applied to the strand
Stress-Strain Profiles#
concreteproperties
uses stress-strain profiles to define material behaviour for both
service and ultimate analyses. A Concrete
object
requires both a service stress-strain profile (calculation of area properties,
moment-curvature analysis, elastic and service stress analysis) and an ultimate
stress-strain profile (ultimate bending capacity, moment interaction diagram, biaxial
bending diagram, ultimate stress analysis). All other material objects only requires one
stress-strain profile which is used for both service and ultimate analyses.
Note
Stress values are interpolated from stresses and strains supplied to the profile. If the strain is outside of the range of the stress-strain profile, the stress is extrapolated based off the closest two points of the stress-strain profile.
- class concreteproperties.stress_strain_profile.StressStrainProfile(strains: list[float], stresses: list[float])[source]
Abstract base class for a material stress-strain profile.
Implements a piecewise linear stress-strain profile. Positive stresses & strains are compression.
- Parameters:
- Raises:
ValueError – If length of strains is not equal to length of stresses
ValueError – If length of strains/stresses is not greater than 1
ValueError – If strains do not contain increasing or equal values
- print_properties(fmt: str = '8.6e') None [source]
Prints the stress-strain profile properties to the terminal.
- Parameters:
fmt (str) – Number format
- plot_stress_strain(title: str = 'Stress-Strain Profile', fmt: str = 'o-', **kwargs) matplotlib.axes.Axes [source]
Plots the stress-strain profile.
- Parameters:
title (str) – Plot title
fmt (str) – Plot format string
kwargs – Passed to
plotting_context()
- Returns:
Matplotlib axes object
- Return type:
Concrete Service Stress-Strain Profiles#
Note
Unless assigned in the class constructor, the elastic_modulus
of the concrete is
determined by the initial compressive slope of the stress-strain profile. This
elastic_modulus
is used in the calculation of area properties and elastic stress
analysis.
Generic Concrete Service Profile#
- class concreteproperties.stress_strain_profile.ConcreteServiceProfile(strains: list[float], stresses: list[float], ultimate_strain: float)[source]
Bases:
StressStrainProfile
Abstract class for a concrete service stress-strain profile.
from concreteproperties import ConcreteServiceProfile
ConcreteServiceProfile(
strains=[-5 / 35e3, -4 / 35e3, -3 / 35e3, 0, 40 / 35e3, 0.003],
stresses=[0, 0, -3, 0, 40, 40],
ultimate_strain=0.003,
).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)
Linear Concrete Service Profile#
- class concreteproperties.stress_strain_profile.ConcreteLinear(elastic_modulus: float, ultimate_strain: float = 1)[source]
Bases:
ConcreteServiceProfile
Class for a symmetric linear stress-strain profile.
Warning
This profile is not intended to be used in conjunction with a
moment_curvature_analysis()
as the concrete can resist large tensile stresses without fracture.
from concreteproperties import ConcreteLinear
ConcreteLinear(elastic_modulus=35e3).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)
Linear Concrete (No Tension) Service Profile#
- class concreteproperties.stress_strain_profile.ConcreteLinearNoTension(elastic_modulus: float, ultimate_strain: float = 1, compressive_strength: float | None = None)[source]
Bases:
ConcreteServiceProfile
Class for a linear stress-strain profile with no tensile strength.
from concreteproperties import ConcreteLinearNoTension
ConcreteLinearNoTension(elastic_modulus=35e3).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)
from concreteproperties import ConcreteLinearNoTension
ConcreteLinearNoTension(
elastic_modulus=35e3,
ultimate_strain=0.003,
compressive_strength=40,
).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)
Eurocode Non-Linear Concrete Service Profile#
- class concreteproperties.stress_strain_profile.EurocodeNonLinear(elastic_modulus: float, ultimate_strain: float, compressive_strength: float, compressive_strain: float, tensile_strength: float, tension_softening_stiffness: float, n_points_1: int = 10, n_points_2: int = 3)[source]
Bases:
ConcreteServiceProfile
Class for a non-linear stress-strain relationship to EC2.
Tension is modelled with a symmetric
elastic_modulus
until failure attensile_strength
, after which the tensile stress reduces according to thetension_softening_stiffness
.- Parameters:
elastic_modulus (float) – Concrete elastic modulus (\(E_{cm}\))
ultimate_strain (float) – Concrete strain at failure (\(\epsilon_{cu1}\))
compressive_strength (float) – Concrete compressive strength (\(f_{cm}\))
compressive_strain (float) – Strain at which the concrete stress equals the compressive strength (\(\epsilon_{c1}\))
tensile_strength (float) – Concrete tensile strength
tension_softening_stiffness (float) – Slope of the linear tension softening branch
n_points_1 (int) – Number of points to discretise the curve prior to the peak stress
n_points_2 (int) – Number of points to discretise the curve after the peak stress
from concreteproperties import EurocodeNonLinear
EurocodeNonLinear(
elastic_modulus=35e3,
ultimate_strain=0.0035,
compressive_strength=40,
compressive_strain=0.0023,
tensile_strength=3.5,
tension_softening_stiffness=7e3,
).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)
Modified Mander Non-Linear Unconfined & Confined Concrete Service Profile#
- class concreteproperties.stress_strain_profile.ModifiedMander(elastic_modulus: float, compressive_strength: float, tensile_strength: float, sect_type: str | None = None, conc_confined: bool = False, conc_tension: bool = False, conc_spalling: bool = False, eps_co: float = 0.002, eps_c_max_unconfined: float = 0.004, eps_sp: float = 0.006, d: float | None = None, b: float | None = None, long_reinf_area: float | None = None, w_dash: list[float] | None = None, cvr: float | None = None, trans_spacing: float | None = None, trans_d_b: float | None = None, trans_num_d: int | None = None, trans_num_b: int | None = None, trans_f_y: float | None = None, eps_su: float | None = None, n_points: int = 50, n_steel_strain: float = 0.6, n_confinement: float = 0.75)[source]
Bases:
ConcreteServiceProfile
Modified Mander stress-strain profile.
Class for a non-linear stress-strain relationship based on the Mander stress-strain model for confined & unconfined concrete for a rectangular cross section. Intended for use with moment-curvature analyses with rectangular or circular cross sections.
Refer to references [1] [2] [3] for further information on the Mander stress-strain models for confined and unconfined concrete.
This stress strain relationship has been specifically modified for use as per the modified implementation documented within the NZSEE C5 assessment guidelines. However input parameters can also be customised to suit other implementations if desired.
Tip
Optional input variables are only required for defining a confined concrete stress-strain relationship. Note if any variables are missed when attempting to define a confined concrete stress-strain relationship (using
conc_confined=True
), then the material will default to being defined as an unconfined concrete stress-strain relationship with a warning given.Modifications to Mander confined concrete model:
The original formulation of the expression for confined concrete presented by Mander et al. [1] can predict high levels of confined concrete strain dependant on the assumed value for the ultimate steel strain for the transverse reinforcement. The modified expression given the NZSEE C5 assesment guidelines [3] provides a correction and is directly implemented in the
ModifiedMander
material class.These corrections to avoid overestimating the confined concrete limiting strain consist of three allowances:
Modifying the maximum steel strain by a factor of 0.6:
\(\varepsilon_{s,max}= 0.6\varepsilon_{su} \leq 0.06\)
Note this 0.6 modifier can be altered via the
n_steel_strain
parameter.Note the steel material used for reinforcement is also required to be defined with this same limiting fracture strain for a moment-curvature analysis.
Modifying the volumetric ratio of confinement reinforcement by a factor of 0.75. i.e.:
For rectangular sections
\(\displaystyle{\rho_{st}=\frac{0.75}{s}\left[\frac{A_{v,d}} {b_{core}}+\frac{A_{v,b}}{d_{core}}\right]}\)
For circular sections
\(\displaystyle{\rho_{st}=\frac{0.75}{s}\frac{4A_v}{d_s}}\)
Note this 0.75 modifier can be altered via the
n_confinement
parameter.
For confined concrete utilising a maximum concrete compressive strain of:
\(\displaystyle{\varepsilon_{c,max}=0.004+\frac{0.6\rho_{st}f_{yh} \varepsilon_{su}}{f'_{cc}}\leq0.05}\)
Note that the 0.6 factor applied to the ultimate tensile failure strain can be modified as noted above.
(
Source code
,png
,hires.png
,pdf
)(
Source code
,png
,hires.png
,pdf
)- Parameters:
elastic_modulus (float) – Concrete elastic modulus (\(E_c\))
compressive_strength (float) – Concrete compressive strength (\(f'_c\))
tensile_strength (float) – Concrete tensile strength (\(f_t\))
sect_type (str | None) –
The type of concrete cross section for which to create a confined concrete stress-strain relationship for:
rect = Rectangular section with closed stirrup/tie transverse reinforcement
circ_hoop = Circular section with closed hoop transverse reinforcement
circ_spiral = Circular section with spiral transverse reinforcement
conc_confined (bool) – True to return a confined concrete stress-strain relationship based on provided reinforcing parameters, False to return an unconfined concrete stress-strain relationship
conc_tension (bool) – True to include tension in the concrete within the stress-strain relationship (up to the tensile strength of the concrete is reached), False to not consider any tension behaviour in the concrete
conc_spalling (bool) – True to consider the spalling effect for unconfined concrete, False to not consider the spalling branch and truncate the unconfined concrete curve at min(\(2 \varepsilon_{co},\varepsilon_{c,max}\))
eps_co (float) – Strain at which the maximum concrete stress is obtained for an unconfined concrete material (\(\varepsilon_{co}\))
eps_c_max_unconfined (float) – Maximum strain that is able to be supported within unconfined concrete (\(\varepsilon_{c,max}\))
eps_sp (float) – Spalling strain, the strain at which the stress returns to zero for unconfined concrete (\(\varepsilon_{sp}\))
d (float | None) – Depth of a rectangular concrete cross section, or diameter of circular concrete cross section (\(d\))
b (float | None) – Breadth of a rectangular concrete cross section (\(b\))
long_reinf_area (float | None) – Total area of the longitudinal reinforcement in the concrete cross section (\(A_{st}\))
w_dash (list[float] | None) – List of clear spacing between longitudinal reinforcement around the full perimeter of a rectangular concrete cross section (\(w'\))
cvr (float | None) – Concrete cover (to confining reinforcement)
trans_spacing (float | None) – Spacing of transverse confining reinforcement (\(s\))
trans_d_b (float | None) – Diameter of the transverse confining reinforcement (\(d_b\))
trans_num_d (int | None) – Number of legs/cross links parallel to the depth of a rectangular concrete cross section
trans_num_b (int | None) – Number of legs/cross links parallel to the breadth of a rectangular concrete cross section
trans_f_y (float | None) – Yield strength of the transverse confining reinforcement (\(f_{yh}\))
eps_su (float | None) – Strain at the ultimate tensile strength of the reinforcement (\(\varepsilon_{su}\))
n_points (int) – Number of points to discretise the compression part of the stress-strain curve between \(\varepsilon_{c}=0\) & \(\varepsilon_{c} =2\varepsilon_{co}\) for an unconfined concrete, or between \(\varepsilon_{c}=0\) & \(\varepsilon_{c}=\varepsilon_{cu}\) for a confined concrete
n_steel_strain (float) – Modifier for maximum steel reinforcement strain. Steel reinforcement material within the concrete cross section should also be defined with the same limit for the fracture strain
n_confinement (float) – Modifier for volumetric ratio of confinement reinforcement
- Raises:
ValueError – If specified section type is not rect, circ_hoop or circ_spiral
from concreteproperties import ModifiedMander
ModifiedMander(elastic_modulus=30e3,
compressive_strength=30,
tensile_strength=4.5,
sect_type="rect",
conc_tension=True,
conc_spalling=True,
n_points=25
).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)
from concreteproperties import ModifiedMander
ModifiedMander(
elastic_modulus=30e3,
compressive_strength=30,
tensile_strength=4.5,
sect_type="rect",
conc_confined=True,
conc_tension=True,
d=800,
b=500,
long_reinf_area=12 * 314,
w_dash=[150] * 12,
cvr=30 + 10,
trans_spacing=125,
trans_d_b=10,
trans_num_d=4,
trans_num_b=4,
trans_f_y=500,
eps_su=0.15,
n_points=25,
).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)
Concrete Ultimate Stress-Strain Profiles#
Note
Unless assigned in the class constructor, the ultimate_strain
of the concrete is
taken as the largest compressive strain in the stress-strain profile. This
ultimate_strain
defines the curvature and strain profile used in ultimate
analyses.
Warning
concreteproperties
currently only supports a single unique ultimate_strain
to
be used for a given ConcreteSection
.
While multiple concrete materials, with differing stress-strain profiles, can be
used within a given ConcreteSection
, the
ultimate analysis will use the smallest value of the ultimate_strain
amongst the
various concrete materials to define the strain profile at ultimate.
Generic Concrete Ultimate Profile#
- class concreteproperties.stress_strain_profile.ConcreteUltimateProfile(strains: list[float], stresses: list[float], compressive_strength: float)[source]
Bases:
StressStrainProfile
Abstract class for a concrete ultimate stress-strain profile.
from concreteproperties import ConcreteUltimateProfile
ConcreteUltimateProfile(
strains=[-20 / 30e3, 0, 20 / 30e3, 30 / 25e3, 40 / 20e3, 0.003],
stresses=[0, 0, 20, 30, 40, 40],
compressive_strength=32,
).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)
Rectangular Stress Block#
- class concreteproperties.stress_strain_profile.RectangularStressBlock(compressive_strength: float, alpha: float, gamma: float, ultimate_strain: float)[source]
Bases:
ConcreteUltimateProfile
Class for a rectangular stress block.
from concreteproperties import RectangularStressBlock
RectangularStressBlock(
compressive_strength=40,
alpha=0.85,
gamma=0.77,
ultimate_strain=0.003,
).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)
Bilinear Ultimate Profile#
- class concreteproperties.stress_strain_profile.BilinearStressStrain(compressive_strength: float, compressive_strain: float, ultimate_strain: float)[source]
Bases:
ConcreteUltimateProfile
Class for a bilinear stress-strain relationship.
from concreteproperties import BilinearStressStrain
BilinearStressStrain(
compressive_strength=40,
compressive_strain=0.00175,
ultimate_strain=0.0035,
).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)
Eurocode Parabolic Ultimate Profile#
- class concreteproperties.stress_strain_profile.EurocodeParabolicUltimate(compressive_strength: float, compressive_strain: float, ultimate_strain: float, n: float, n_points: int = 10)[source]
Bases:
ConcreteUltimateProfile
Class for an ultimate parabolic stress-strain relationship to EC2.
- Parameters:
compressive_strength (float) – Concrete compressive strength
compressive_strain (float) – Strain at which the concrete stress equals the compressive strength
ultimate_strain (float) – Concrete strain at failure
n (float) – Parabolic curve exponent
n_points (int) – Number of points to discretise the parabolic segment of the curve
from concreteproperties import EurocodeParabolicUltimate
EurocodeParabolicUltimate(
compressive_strength=40,
compressive_strain=0.00175,
ultimate_strain=0.0035,
n=2,
).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)
Steel Stress-Strain Profiles#
Generic Steel Profile#
- class concreteproperties.stress_strain_profile.SteelProfile(strains: list[float], stresses: list[float], yield_strength: float, elastic_modulus: float, fracture_strain: float)[source]
Bases:
StressStrainProfile
Abstract class for a steel stress-strain profile.
from concreteproperties import SteelProfile
SteelProfile(
strains=[-0.05, -0.03, -0.02, -500 / 200e3, 0, 500 / 200e3, 0.02, 0.03, 0.05],
stresses=[-600, -600, -500, -500, 0, 500, 500, 600, 600],
yield_strength=500,
elastic_modulus=200e3,
fracture_strain=0.05,
).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)
Elastic-Plastic Steel Profile#
- class concreteproperties.stress_strain_profile.SteelElasticPlastic(yield_strength: float, elastic_modulus: float, fracture_strain: float)[source]
Bases:
SteelProfile
Class for a perfectly elastic-plastic steel stress-strain profile.
from concreteproperties import SteelElasticPlastic
SteelElasticPlastic(
yield_strength=500,
elastic_modulus=200e3,
fracture_strain=0.05,
).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)
Elastic-Plastic Hardening Steel Profile#
- class concreteproperties.stress_strain_profile.SteelHardening(yield_strength: float, elastic_modulus: float, fracture_strain: float, ultimate_strength: float)[source]
Bases:
SteelProfile
Class for a steel stress-strain profile with strain hardening.
from concreteproperties import SteelHardening
SteelHardening(
yield_strength=500,
elastic_modulus=200e3,
fracture_strain=0.05,
ultimate_strength=600,
).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)
Strand Stress-Strain Profiles#
Generic Strand Profile#
- class concreteproperties.stress_strain_profile.StrandProfile(strains: list[float], stresses: list[float], yield_strength: float)[source]
Bases:
StressStrainProfile
Abstract class for a steel strand stress-strain profile.
Implements a piecewise linear stress-strain profile. Positive stresses & strains are compression.
from concreteproperties import StrandProfile
StrandProfile(
strains=[-0.03, -0.01, -1400 / 195e3, 0, 1400 / 195e3, 0.01, 0.03],
stresses=[-1800, -1600, -1400, 0, 1400, 1600, 1800],
yield_strength=500,
).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)
Elastic-Plastic Hardening Strand Profile#
- class concreteproperties.stress_strain_profile.StrandHardening(yield_strength: float, elastic_modulus: float, fracture_strain: float, breaking_strength: float)[source]
Bases:
StrandProfile
Class for a strand stress-strain profile with strain hardening.
from concreteproperties import StrandHardening
StrandHardening(
yield_strength=1500,
elastic_modulus=195e3,
fracture_strain=0.035,
breaking_strength=1830,
).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)
PCI Journal (1992) Strand Profile#
- class concreteproperties.stress_strain_profile.StrandPCI1992(yield_strength: float, elastic_modulus: float, fracture_strain: float, breaking_strength: float, bilinear_yield_ratio: float = 1.04, strain_cps: list[float] = <factory>, n_points: list[int] = <factory>)[source]
Bases:
StrandProfile
Class for a PCI Strand (1992).
Class for a strand stress-strain profile by R. Devalapura and M. Tadros from the March-April issue of the PCI Journal.
- Parameters:
yield_strength (float) – Strand yield strength
elastic_modulus (float) – Strand elastic modulus
fracture_strain (float) – Strand fracture strain
breaking_strength (float) – Strand breaking strength
bilinear_yield_ratio (float) – Ratio between the stress at the intersection of a bilinear profile, and the yield strength
strain_cps (list[float]) – Strain control points, generates the following strain segments:
[0, strain_cps[0], strain_cps[1], fracture_strain]
. Length must be equal to 2.n_points (list[int]) – Number of points to discretise within each strain segment. Length must be equal to 3.
from concreteproperties import StrandPCI1992
StrandPCI1992(
yield_strength=1500,
elastic_modulus=195e3,
fracture_strain=0.035,
breaking_strength=1830,
).plot_stress_strain()
(Source code
, png
, hires.png
, pdf
)