Slim-floor beam with large hat profile#
Units: Millimeter [mm], Newton [N]
Geometries and materials#
The code below creates the cross_section
of a slim-floor beam with the following parts:
large hat steel profile with \(f_\mathrm{y}\) = 355 N/mm² and \(f_\mathrm{u}\) = 500 N/mm²
bottom steel flange with 400x12 mm with \(f_\mathrm{y}\) = 460 N/mm² and \(f_\mathrm{u}\) = 500 N/mm²
concrete slab with concrete compressive strength \(f_\mathrm{cm} = 38\) N/mm²
top-rebar-layer 10/100, \(c_\mathrm{nom}\) = 10 mm, with \(c_\mathrm{nom} = 10\) mm from the top-edge of the concrete-slab
bottom-rebar-layer 12/100, \(c_\mathrm{nom}\) = 12 mm, with \(c_\mathrm{nom} = 10\) mm from the bottom-edge of the concrete-slab
The hat profile is positioned on top of the bottom-flange forming the steel girder. The steel girder is integrated into the concrete slab. Therefore, the concrete slab is situated around the steel-beam, what is done by splitting the concrete slab in appropriate pieces.
Slim-Floor cross-section#
>>> from m_n_kappa import Rectangle, Steel, UPEProfile, Concrete, RebarLayer, Reinforcement
>>> plate_geometry = Rectangle(top_edge=220.0, bottom_edge=220.0+12., width=400.0)
>>> bottom_flange_material = Steel(f_y=355, f_u=500, failure_strain=0.15)
>>> bottom_flange = plate_geometry + bottom_flange_material
>>> hat_geometry = UPEProfile(
... top_edge=50, t_f=5.2, b_f=plate_geometry.top_edge, t_w=9.0, h=300)
>>> hat_material = Steel(f_y=460, f_u=500, failure_strain=0.15)
>>> hat = hat_geometry + hat_material
>>> concrete_left = Rectangle(
... top_edge=0.0, bottom_edge=plate_geometry.top_edge, width=1600.0,
... left_edge=-1750.0, right_edge=-150.0)
>>> concrete_middle = Rectangle(
... top_edge=0.0, bottom_edge=hat_geometry.top_edge, width=hat_geometry.h,
... left_edge=-150.0, right_edge=150.0)
>>> concrete_right = Rectangle(
... top_edge=0.00, bottom_edge=plate_geometry.top_edge, width=1600.00,
... left_edge=150.0, right_edge=1750.00)
>>> concrete_geometry = concrete_left + concrete_middle + concrete_right
>>> concrete_material = Concrete(
... f_cm=38.9,
... compression_stress_strain_type='Nonlinear')
>>> concrete_slab = concrete_geometry + concrete_material
>>> rebar_top_layer_geometry = RebarLayer(
... rebar_diameter=12., centroid_z=10.0, width=3500, rebar_horizontal_distance=100.)
>>> rebar_bottom_layer_left_geometry = RebarLayer(
... rebar_diameter=10., centroid_z=220-10, width=1600.0,
... rebar_horizontal_distance=100., left_edge=-1740.,)
>>> rebar_bottom_layer_right_geometry = RebarLayer(
... rebar_diameter=10., centroid_z=220-10, width=1600.0,
... rebar_horizontal_distance=100., right_edge=1740.,)
>>> rebar10_material = Reinforcement(f_s=500, f_su=550, failure_strain=0.25, E_s=200000)
>>> rebar12_material = Reinforcement(f_s=500, f_su=550, failure_strain=0.25, E_s=200000)
>>> rebar_top_layer = rebar_top_layer_geometry + rebar12_material
>>> rebar_bottom_layer_left = rebar_bottom_layer_left_geometry + rebar10_material
>>> rebar_bottom_layer_right = rebar_bottom_layer_right_geometry + rebar10_material
>>> rebar_layer = rebar_top_layer + rebar_bottom_layer_left + rebar_bottom_layer_right
>>> cross_section = bottom_flange + hat + concrete_slab + rebar_layer
Computation#
The cross_section
you created above is the basis to do a variety of computations:
In case you want to compute a single curvature-value from a given strain at a given position, you
first have to define strain and its position using StrainPosition
strain_position
is the boundary-condition, that is passed to MKappaByStrainPosition
that is computing the curvature.
>>> from m_n_kappa import StrainPosition, MKappaByStrainPosition
>>> strain_position = StrainPosition(strain=-0.002, position=0.0, material="")
>>> computation = MKappaByStrainPosition(
... cross_section=cross_section,
... strain_position = strain_position,
... positive_curvature=True)
After computation you can extract the results as follows:
m_n_kappa.MKappaByStrainPosition.successful
: ifTrue
equilibrium of horizontal forces has been achieved during computationm_n_kappa.MKappaByStrainPosition.axial_force
: computed axial forces that should be near zero as this is what the computation is aimed atm_n_kappa.MKappaByStrainPosition.moment
: computed momentm_n_kappa.MKappaByStrainPosition.curvature
: computed curvaturem_n_kappa.MKappaByStrainPosition.neutral_axis
: vertical position of the neutral axis (strain \(\varepsilon=0\))
See also
Moment-Curvature-Curve: further explanations regarding computation of a single moment-curvature-point
The \(M\)-\(\kappa\)-curve is easily computed by passing the created cross_section
to
MKappaCurve
.
You only have to decide if you want only the positive moment-curvature-points,
the negative moment-curvature-points or both.
>>> from m_n_kappa import MKappaCurve
>>> positive_m_kappa = MKappaCurve(cross_section=cross_section)
>>> negative_m_kappa = MKappaCurve(
... cross_section=cross_section,
... include_positive_curvature=False,
... include_negative_curvature=True)
>>> full_m_kappa = MKappaCurve(
... cross_section=cross_section,
... include_positive_curvature=True,
... include_negative_curvature=True)
The computed points are then stored in the attribute m_kappa_points
that returns
MKappaCurvePoints
-object.
See also
Moment-Curvature-Curve : further explanation regarding computation of the Moment- Curvature-Curve
For computation of the \(M\)-\(\kappa\)-curves in a beam you need the loading-scenario
beside your cross_section
.
And you should decide in how many elements the beam shall be split into (see element_number
).
In case you also want to consider the effective widths you may set consider_widths=True
.
>>> from m_n_kappa import SingleSpanUniformLoad, Beam
>>> loading = SingleSpanUniformLoad(length=8000, load=1.0)
>>> beam = Beam(cross_section=cross_section, element_number=10, load=loading)
>>> beam_consider_widths = Beam(
... cross_section=cross_section,
... element_number=10,
... load=loading,
... consider_widths=True)
The computed beams allow you to do a number of analysis, like:
m_n_kappa.Beam.deformation_over_beam_length()
: computes the deformation at each node along the beam under the given loadm_n_kappa.Beam.deformations()
: computes the deformation at the given position for the relevant load-stepsm_n_kappa.Beam.deformations_at_maximum_deformation_position()
: same likem_n_kappa.Beam.deformations()
but at the position of the beam where the maximum deformation occurred under the givenloading
.
See also
Loading: further explanation of loading scenarios
Deformation : further explanation regarding computation of beam-deformation