Creating materials#
The definition of an appropriate material-model is - beside the geometry - another basic component
for building a cross-section in m_n_kappa
.
In succession it is crucial for a successful computation.
For steel-concrete composite structures Concrete, Steel and Reinforcement are pre-defined materials you can use right away. If these materials do not fit your needs. No problem! You can create your own material.
Concrete#
For creating Concrete
you can choose between different material-models
under compression and under tension.
In any case you have to pass the mean concrete compressive strength f_cm
to Concrete
Under compression you may decide if the stress-strain-relationship is Nonlinear
,
Parabola
-Rectangle or Bilinear
shaped.
This is controlled by argument compression_stress_strain_type
.
The default-value is compression_stress_strain_type='Nonlinear'
.
>>> from m_n_kappa import Concrete
>>> nonlinear_no_tension = Concrete(f_cm=30.0, use_tension=False)
>>> parabola_no_tension = Concrete(f_cm=30.0, use_tension=False,
... compression_stress_strain_type='Parabola')
>>> bilinear_no_tension = Concrete(f_cm=30.0, use_tension=False,
... compression_stress_strain_type='Bilinear')
The behaviour under tension is first controlled by argument use_tension
.
In case use_tension
is set to False
no tensile capacity is defined, but a single stress-strain-point
(0.0 | 10.0) is applied.
>>> nonlinear_no_tension.tension.stress_strain()
[[0.0, 10.0]]
This value makes sure, that m_n_kappa
does not stop computing if the concrete starts cracking
due exceeding the maximum tensile strain under tensile loading.
If you want to apply concrete tensile behaviour set use_tension=True
.
The tensile strength may be controlled by argument f_ctm
.
If not provided it may be computed using the given mean concrete compressive strength.
The tensile behaviour is controlled by argument tension_stress_strain_type
.
By default tension_stress_strain_type='Default'
is set, that leads to an immediate drop of the stresses
after the maximum tensile stress has been reached.
In contrary tension_stress_strain_type='consider opening behaviour'
leads to a post-breaking behaviour
as indicated in the following figure.
See also
Concrete: Background how stress-strain relationships are computed
Steel#
The stress-strain behaviour of Steel
is defined to be
isotropic.
In consequence it behaves under compression exactly like under tension.
In Steel
is initialized without arguments pure elastic behaviour with modulus
of elasticity \(E_\mathrm{a}\) defined as E_a=210000.0 [N/mm²] utilizing
Hooke’s law <https://en.wikipedia.org/wiki/Hooke%27s_law>_.
The maximum strain in this case is set to 1.0
.
>>> from m_n_kappa import Steel
>>> elastic_steel = Steel()
>>> for point in elastic_steel.stress_strain:
... print(point.stress, point.strain)
-210000.0 -1.0
-0.0 -0.0
210000.0 1.0
If you want to apply bi-linear ideal-plastic stress-strain behaviour of steel you must pass the yield strength
f_y
as well as the failure_strain
to Steel
.
>>> bilinear_steel = Steel(f_y=355, failure_strain=0.15)
>>> for point in bilinear_steel.stress_strain:
... print(point.stress, round(point.strain, 4))
-355.0 -0.15
-355.0 -0.0017
-0.0 -0.0
355.0 0.0017
355.0 0.15
If additional harding shall be applied you only have to pass the tensile stress f_u
to the
Steel
.
>>> bilinear_hardening_steel = Steel(f_y=355, f_u=400, failure_strain=0.15)
Reinforcement#
Reinforcement
works similar as Steel
, but the arguments switch as follows:
f_s
: yield strengthf_su
: tensile strengthE_s
: modulus of elasticity
The following code therefore describes bi-linear behaviour of the reinforcement with hardening.
Linear-elastic and ideal-plastic behaviour are of course also possible.
Isotropy applies similarly to Steel
.
>>> from m_n_kappa import Reinforcement
>>> reinforcement = Reinforcement(f_s=500.0, f_su=550.0, failure_strain=0.25)
Nothing found for your needs? Create your own material!#
Note
You should have a basic understanding of python classes to create your own material.
All materials you create must fulfil the following requirements to have the full functionality for computation
in m_n_kappa
:
inherit from
Material
feeding the
_stress_strain
-Attribute with a list ofStressStrain
.
Beside its functionality for computation the inheritance from Material
is also needed to merge
your material with geometric instances to a Section
(see Build a section).
The following example creates a new material called Arbitrary
.
from m_n_kappa.material import Material, StressStrain
class Arbitrary(Material):
"""arbitrary material"""
def __init__(self):
self._stress_strain = [
StressStrain(stress=-10.0, strain=-0.001),
StressStrain(stress=0.0, strain=0.0),
StressStrain(stress=10.0, strain=0.001),
StressStrain(stress=10.0, strain=0.01),
]
@property
def section_type(self):
return "girder"
Of course, you can produce the stress-strain-relationship programmatically i.e. by using models from literature.
Important
Please be aware that m_n_kappa
is not able to compute strains that exceed the maximum strain
or fall below the minium strain of a material model. See also Concrete.
If you implemented your Material
successfully, please consider
Contributing it to help others.