Moment-Curvature-Curve#

Units: Millimeter [mm], Newton [N]

Introducing the cross-section#

Our cross_section is a composite beam with a HEB 200 steel girder and a 2000x100 concrete slab. The concrete is of type C30/35 with \(f_\mathrm{cm} = 38\) N/mm². The steel is of type S355 (\(f_\mathrm{y} = 355\) N/mm²) A top- and a bottom-layer of reinforcement is introduced into the concrete slab with concrete cover \(c_\mathrm{nom}\) on each side. All reinforcement bars have diameter 10 and a strength \(f_\mathrm{s} = 500\) N/mm².

You can build this cross-section in m_n_kappa as follows.

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

Moment-Curvature-Curve with positive values shows how to compute the relationship of moments and curvatures assuming positive curvature and positive moments. Negative curvature and negative moments are given in Moment-Curvature-Curve with negative values. Full Moment-Curvature-Curve shows positive and negative moment-curvature values.

The following method reduces the process of putting the moment-curvature values into a moment-curvature-curve diagram to a minimum. The expected results-dictionary must have the keys 'Moment' and 'Curvature' with the corresponding values as lists tied to these keywords. Other keys will appear in the tooltip.

import pandas as pd
import altair as alt
def m_kappa_diagram(results: dict) -> alt.Chart:
    """create moment-curvature diagram by passing moments and curvatures"""
    df = pd.DataFrame(results)

    line_chart = alt.Chart(df).mark_line().encode(
        y=alt.Y('Moment', title='Moment [kNm]'),
        x=alt.X('Curvature', title='Curvature [-]'),
    )

    circle_chart = alt.Chart(df).mark_point().encode(
        y=alt.Y('Moment'),
        x=alt.X('Curvature'),
        tooltip=list(results.keys()),
    )

    return alt.layer(line_chart, circle_chart, background='#00000000')

Moment-Curvature-Curve with positive values#

The moment-curvature curve is computed in m_n_kappa while initializing MKappaCurve. The computation of the positive values is set as the default, therefore only cross_section must be passed to MKappaCurve.

The not_successful() returns those StrainPosition points that have not lead to an equilibrium in horizontal forces. The StrainPosition is given with a message that gives us information why equilibrium has not been found.

from m_n_kappa import MKappaCurve
positive_m_kappa_curve_computation = MKappaCurve(cross_section=cross_section)
positive_m_kappa_curve_computation.not_successful

The Moment-Curvature points may be extracted calling m_kappa_points().

positive_m_kappa_curve = positive_m_kappa_curve_computation.m_kappa_points

m_kappa_points() returns an MKappaCurvePoints object that has the method results_as_dict(). It provides the moment-curvature-curve points as dictionary with keys 'Moment', 'Curvature', 'Strain', 'Position' and 'Material'. These allow us to easily create the corresponding Moment-Curvature diagram with descriptive tooltips.

m_kappa_diagram(results=positive_m_kappa_curve.results_as_dict(moment_factor=0.001*0.001))

The diagram shows a maximum moment of \(M_\mathrm{max} \approx 550\) kNm.

Moment-Curvature-Curve with negative values#

Computing the Moment-Curvature curve with negative values is similar to the Moment-Curvature-Curve with positive values, but include_positive_curvature=False (default: True) and include_negative_curvature=True (default: False) must be passed to MKappaCurve.

negative_m_kappa_curve_computation = MKappaCurve(
    cross_section=cross_section,
    include_positive_curvature=False,
    include_negative_curvature=True,
)
negative_m_kappa_curve = negative_m_kappa_curve_computation.m_kappa_points

The corresponding Moment-Curvature-curve diagram is given hereafter.

m_kappa_diagram(results=negative_m_kappa_curve.results_as_dict(moment_factor=0.001*0.001))

The diagram shows in absolute values a smaller maximum moment than the cross-section under positive curvature. But the maximum curvatures are in absolute values much higher. This is related to the higher strains the reinforcement and the steel-material can bear as the concrete in compression.

Full Moment-Curvature-Curve#

In case you want to compute all values at once you only have to pass your cross_section and include_negative_curvature=True to MKappaCurve().

full_m_kappa_curve_computation = MKappaCurve(
    cross_section=cross_section,
    include_negative_curvature=True,
)
full_m_kappa_curve = full_m_kappa_curve_computation.m_kappa_points

m_kappa_diagram(results=full_m_kappa_curve.results_as_dict(moment_factor=0.001*0.001))

As shown the moment-curvature curve is easily computed using m_n_kappa. The classes and methods shown here, are building the basis to compute the deformation of a beam.