bluemira.structural.crosssection ================================ .. py:module:: bluemira.structural.crosssection .. autoapi-nested-parse:: Objects and tools for calculating cross-sectional properties Classes ------- .. autoapisummary:: bluemira.structural.crosssection.CrossSection bluemira.structural.crosssection.RectangularBeam bluemira.structural.crosssection.CircularBeam bluemira.structural.crosssection.CircularHollowBeam bluemira.structural.crosssection.IBeam bluemira.structural.crosssection.AnalyticalCrossSection bluemira.structural.crosssection.AnalyticalCompositeCrossSection Functions --------- .. autoapisummary:: bluemira.structural.crosssection._calculate_properties bluemira.structural.crosssection._transform_properties Module Contents --------------- .. py:function:: _calculate_properties(y, z) Calculate cross-sectional properties for arbitrary polygons. .. py:function:: _transform_properties(izz, iyy, izy, alpha) Transform second moments of area for a rotation about the centroid. :math:`I_{uu}=(I_{xx}+I_{yy})/2+[(I_{xx}-I_{yy})/2]cos(2\alpha)-I_{xy}sin(2\alpha)` :math:`I_{vv}=(I_{xx}+I_{yy})/2-[(I_{xx}-I_{yy})/2]cos(2\alpha)+I_{xy}sin(2\alpha)` :math:`I_{uv}=[(I_{xx}-I_{yy})/2]sin(2\alpha)+I_{xy}cos(2\alpha)` .. py:class:: CrossSection Base class for a structural cross-section of a 1-D beam. .. py:attribute:: __slots__ :value: ('area', 'area_sy', 'area_sz', 'centroid_geom', 'ei_yy', 'ei_zy', 'ei_zz', 'geometry', 'i_yy',... .. py:method:: make_geometry(*args, **kwargs) :abstractmethod: Make a BluemiraFace object for the CrossSection. .. py:method:: plot(ax=None) Plot the CrossSection .. py:method:: rotate(angle: float) Rotate the CrossSection about its centroid. :param angle: The angle to rotate the CrossSection by [degrees] .. py:method:: translate(vector: numpy.ndarray) Translate the CrossSection. Should not affect its properties. Note that CrossSections are defined in the y-z plane. :param vector: The translation vector. .. py:property:: centroid Centroid of the cross-section geometry .. py:class:: RectangularBeam(width: float, height: float) Bases: :py:obj:`CrossSection` .. autoapi-inheritance-diagram:: bluemira.structural.crosssection.RectangularBeam :parts: 1 :private-bases: Rectangular beam cross-section. :param width: The width of the beam :param height: The height of the beam .. py:attribute:: __slots__ :value: () .. py:attribute:: area .. py:attribute:: i_zz .. py:attribute:: i_yy .. py:attribute:: i_zy :value: 0.0 .. py:attribute:: j .. py:attribute:: ry .. py:attribute:: rz .. py:attribute:: qyy :value: 0 .. py:attribute:: qzz :value: 0 .. py:method:: calc_torsion(width: float, height: float) -> float :staticmethod: Estimate the torsional constant of the rectangular beam. .. rubric:: Notes Young, W and Budynas, R: Roark's Formulas for Stress and Strain :math:`J\approx ab^3(\dfrac{16}{3}-3.36\dfrac{b}{a}(1-\dfrac{b^4}{12a^4}))` .. py:method:: make_geometry(width: float, height: float) Make a BluemiraFace for the RectangularBeam cross-section. .. py:class:: CircularBeam(radius: float, n_discr: int = 30) Bases: :py:obj:`CrossSection` .. autoapi-inheritance-diagram:: bluemira.structural.crosssection.CircularBeam :parts: 1 :private-bases: Circular beam cross-section :param radius: The radius of the circular cross-section :param n_discr: Number of points to discretise to when plotting .. py:attribute:: __slots__ :value: () .. py:attribute:: area .. py:attribute:: i_zz .. py:attribute:: i_yy .. py:attribute:: i_zy :value: 0.0 .. py:attribute:: j .. py:attribute:: ry .. py:attribute:: rz .. py:attribute:: qyy :value: 0 .. py:attribute:: qzz :value: 0 .. py:attribute:: geometry .. py:class:: CircularHollowBeam(r_inner: float, r_outer: float, n_discr: int = 30) Bases: :py:obj:`CrossSection` .. autoapi-inheritance-diagram:: bluemira.structural.crosssection.CircularHollowBeam :parts: 1 :private-bases: Circular hollow beam cross-section :param r_inner: The inner radius of the hollow circular cross-section :param r_outer: The outer radius of the hollow circular cross-section :param n_discr: Number of points to discretise to when plotting .. py:attribute:: __slots__ :value: () .. py:attribute:: area .. py:attribute:: i_zz .. py:attribute:: i_yy .. py:attribute:: i_zy :value: 0.0 .. py:attribute:: j .. py:attribute:: ry .. py:attribute:: rz .. py:attribute:: qyy :value: 0 .. py:attribute:: qzz :value: 0 .. py:attribute:: geometry .. py:class:: IBeam(base: float, depth: float, flange: float, web: float) Bases: :py:obj:`CrossSection` .. autoapi-inheritance-diagram:: bluemira.structural.crosssection.IBeam :parts: 1 :private-bases: Generic, symmetric I-beam cross-section :param base: I-beam base width :param depth: I-beam depth :param web: I-beam web thickness :param flange: I-beam flange thickness .. py:attribute:: __slots__ :value: () .. py:attribute:: area .. py:attribute:: i_yy .. py:attribute:: i_zz .. py:attribute:: i_zy :value: 0.0 .. py:attribute:: j .. py:attribute:: ry .. py:attribute:: rz .. py:attribute:: qyy :value: 0 .. py:attribute:: qzz :value: 0 .. py:method:: check_dimensions(base: float, depth: float, flange: float, web: float) :staticmethod: Edge case eradication :raises StructuralError: Inputs not consistent with I-Beam .. py:method:: make_geometry(base: float, depth: float, flange: float, web: float) Make a BluemiraFace for the IBeam cross-section. .. py:class:: AnalyticalCrossSection(geometry: bluemira.geometry.face.BluemiraFace, n_discr: int = 100, j_opt_var: float = 14.123) Bases: :py:obj:`CrossSection` .. autoapi-inheritance-diagram:: bluemira.structural.crosssection.AnalyticalCrossSection :parts: 1 :private-bases: Analytical formulation for a polygonal cross-section. Torsional properties less accurate. Faster as based on analytical calculation of cross-sectional properties, as opposed to FE. :param geometry: The geometry for the polygonal cross-section :param n_discr: Number of points to discretise to when plotting :param j_opt_var: Torsional constant estimation parameter from optimisation .. rubric:: Notes All cross-section properties calculated exactly (within reason), except for the torsional constant J, which is approximated using St Venant's approach. The j_opt_var for fitting the J value must be determined based on suitable finite element analyses. If the geometry has any holes in it, they will be treated as holes. .. py:attribute:: __slots__ :value: () .. py:attribute:: geometry .. py:attribute:: centroid_geom .. py:attribute:: i_yy .. py:attribute:: i_zz .. py:attribute:: i_zy .. py:attribute:: qyy .. py:attribute:: qzz :value: 0.0 .. py:attribute:: ry .. py:attribute:: rz .. py:attribute:: j .. py:class:: AnalyticalCompositeCrossSection(geometry: bluemira.geometry.face.BluemiraFace, materials: list[matproplib.material.Material], op_cond: matproplib.conditions.OperationalConditions) Bases: :py:obj:`CrossSection` .. autoapi-inheritance-diagram:: bluemira.structural.crosssection.AnalyticalCompositeCrossSection :parts: 1 :private-bases: A cross-section object for composite structural beam. When making a composite cross-section, we need to add material properties in order to effectively weight the cross-sectional properties. Cross-sectional properties are calculated analytical relations, and are therefore much faster than an FE approach. For simple cross-sections, the properties are all identical except for J, where a fitting on similar shapes must be carried out, following St. Venant's method. This somewhat modifies the API when getting properties... :param geometry: The ordered list of geometries making up the cross-section :param materials: The ordered list of Materials to use for the geometry .. py:attribute:: __slots__ :value: ('ea', 'gj', 'nu', 'rho') .. py:attribute:: geometry .. py:attribute:: area .. py:attribute:: ea .. py:attribute:: ei_yy .. py:attribute:: ei_zz .. py:attribute:: ei_zy .. py:attribute:: nu .. py:attribute:: ry .. py:attribute:: rz .. py:attribute:: gj .. py:attribute:: rho