Source code for simdesign.rcmrf.bnsm.cp01.beam

"""This module provides the beam class implementation for the ``CP01`` model in
the BNSM layer.
"""
# Imports from installed packages
from typing import Tuple, List

# Imports from bnsm base library
from ..baselib.beam import BeamBase

# Imports from utils library
from ....utils.misc import round_list


[docs] class Beam(BeamBase): """Beam implementation for the ``CP01`` model. The beam is modeled using a concentrated plasticity approach. Plastic rotations are concentrated at the element ends via ``beamIntegration('ConcentratedPlasticity', ...)`` (end hinge integration points with an elastic interior region), while the element formulation is provided by ``BeamBase``. End-hinge flexural behaviour about the local z-axis (Mz) is defined using a uniaxial ``Hysteretic`` material, expressed in terms of bending moment vs. plastic rotation. See Also -------- :class:`~BeamBase` Base beam definition extended by this class. """ def _get_mz_mat_inputs(self) -> Tuple[List[str | float | int], List[str | float | int]]: """Retrieves the material inputs defining the flexural behaviour around local-z for the plastic hinge. Returns ------- hinge_i_mat_inputs : List[str | float | int] Hysteretic material model inputs for hinge at the start section. hinge_j_mat_inputs : List[str | float | int] Hysteretic material model inputs for hinge at the end section. """ # Plastic hinge properties ( _, My_neg, Mc_neg, Mr_neg, theta_y_neg, theta_cap_pl_neg, theta_pc_neg, _, My_pos, Mc_pos, Mr_pos, theta_y_pos, theta_cap_pl_pos, theta_pc_pos, pinchx, pinchy, damage1, damage2, beta, ) = self._get_rot_hinge_props() # Rotation values theta_1_neg = theta_y_neg theta_2_neg = theta_y_neg + theta_cap_pl_neg theta_3_neg = theta_y_neg + theta_cap_pl_neg + theta_pc_neg theta_1_pos = theta_y_pos theta_2_pos = theta_y_pos + theta_cap_pl_pos theta_3_pos = theta_y_pos + theta_cap_pl_pos + theta_pc_pos # Material inputs hinge_i_mat_inputs = [ 'Hysteretic', self.mz_i_mat_tag, My_pos[0], theta_1_pos[0], Mc_pos[0], theta_2_pos[0], Mr_pos[0], theta_3_pos[0], -My_neg[0], -theta_1_neg[0], -Mc_neg[0], -theta_2_neg[0], -Mr_neg[0], -theta_3_neg[0], pinchx, pinchy, damage1, damage2, beta ] hinge_j_mat_inputs = [ 'Hysteretic', self.mz_j_mat_tag, My_pos[-1], theta_1_pos[-1], Mc_pos[-1], theta_2_pos[-1], Mr_pos[-1], theta_3_pos[-1], -My_neg[-1], -theta_1_neg[-1], -Mc_neg[-1], -theta_2_neg[-1], -Mr_neg[-1], -theta_3_neg[-1], pinchx, pinchy, damage1, damage2, beta ] # Rounding to precision hinge_i_mat_inputs = round_list(hinge_i_mat_inputs) hinge_j_mat_inputs = round_list(hinge_j_mat_inputs) return hinge_i_mat_inputs, hinge_j_mat_inputs def _get_int_inputs(self) -> List[str | float]: """Retrieves beam integration inputs. Returns ------- List[float] List of beam integration inputs. """ int_inputs = [ 'ConcentratedPlasticity', self.int_tag, self.inelastic_sec_i_tag, self.inelastic_sec_j_tag, self.elastic_sec_tag ] return int_inputs