Deformation#

Units: Millimeter [mm], Newton [N]

To compute deformations we first create a Crosssection. Our cross_section is a composite beam composed of a rectangular concrete-slab with two reinforcement-layers and concrete of type C30/35. A HEB 200 steel profile is positioned at the bottom of the concrete slab. For more details regarding the cross-section see here.

from m_n_kappa import IProfile, Steel, Rectangle, Concrete, RebarLayer, Reinforcement
concrete_slab = Rectangle(top_edge=0.0, bottom_edge=100, width=2000)
concrete = Concrete(f_cm=30+8, )
concrete_section = concrete_slab + concrete
reinforcement = Reinforcement(f_s=500, f_su=550, failure_strain=0.15)
top_layer = RebarLayer(
   centroid_z=25, width=2000, rebar_horizontal_distance=200, rebar_diameter=10)
top_rebar_layer = reinforcement + top_layer
bottom_layer = RebarLayer(
   centroid_z=75, width=2000, rebar_horizontal_distance=100, rebar_diameter=10)
bottom_rebar_layer = reinforcement + bottom_layer
i_profile = IProfile(
   top_edge=100.0, b_fo=200, t_fo=15, h_w=200-2*15, t_w=15, centroid_y=0.0)
steel = Steel(f_y=355.0, f_u=400, failure_strain=0.15)
steel_section = i_profile + steel
cross_section = concrete_section + top_rebar_layer + bottom_rebar_layer + steel_section

As deformations depend on the type of loading we create a SingleSpanUniformLoad-instance that represents a uniform loading of our beam. The length-parameter describes the length of our single-span beam and applies here to 8000 mm = 8 m.

from m_n_kappa import SingleSpanUniformLoad
loading = SingleSpanUniformLoad(length=8000)

The beam is computed by the Beam class. Beam takes the cross_section, the number of elements the beam shall be at least split into and the loading as arguments. The consider_width-argument is optional and leads to a consideration of the effective widths, if set to True.

from m_n_kappa import Beam
beam = Beam(
    cross_section=cross_section, element_number=10, load=loading, consider_widths=False)

The deformation()-method gives you the deformation at the given position (at_position) under the given load loading_for_deformation.

loading_for_deformation = SingleSpanUniformLoad(length=8000, load=10)
beam.deformation(at_position=4000, load=loading_for_deformation)
    10.864460714669683

With deformations_at_maximum_deformation_position() you get the maximum deformation per loading. In case of a single-span girder the corresponding position is in the middle of the beam (4000 mm).

maximum_deformation = beam.deformations_at_maximum_deformation_position()

import pandas as pd
df = pd.DataFrame(
     {'loadings': maximum_deformation.loadings(factor=0.001),
      'deformations': maximum_deformation.values()})

import altair as alt
alt.Chart(df, background='#00000000').mark_line().encode(
   x=alt.X('deformations', title='Deformation [mm]'),
   y=alt.Y('loadings', title='Loading [kN]'))

deformation_over_beam_length() computes the deformation by the given loading. Plotted the computed values look as follows:

deformations_over_length = beam.deformation_over_beam_length(load_step=loading_for_deformation)

df = pd.DataFrame(
     {'positions': deformations_over_length.positions(),
      'deformations': deformations_over_length.values()})

alt.Chart(df, height=100.0, background='#00000000').mark_line().encode(
    x=alt.X('positions', title='Beam position [mm]'),
    y=alt.Y('deformations', title='Deformation [mm]', scale=alt.Scale(reverse=True)))