Lelem_Navier Class

This is a sub-class, in the Object Oriented Programming (OOP) paradigm, of super-class Lelem in the LESM (Linear Elements Structure Model) program. This sub-class implements abstract methods, declared in super-class Lelem, that deal with Navier (Euler-Bernoulli) flexural behavior of linear elements subjected to loading effects.

Contents

Navier (Euler-Bernoulli) Beam Theory

In Euler-Bernoulli flexural behavior, it is assumed that there is no shear deformation. As consequence, bending of a linear element is such that its cross-section remains plane and normal to the element longitudinal axis.

Class definition

Definition of sub-class Lelem_Navier derived from super-class Lelem.

classdef Lelem_Navier < Lelem

Constructor method

    methods
 
        %------------------------------------------------------------------
        function load = Lelem_Navier(elem,unifdir,unifgbl,uniflcl,lindir,lingbl,linlcl,tvx,tvy,tvz)
            load = load@Lelem(elem);

            if (nargin > 1)
                load.uniformDir = unifdir;
                load.uniformGbl = unifgbl;
                load.uniformLcl = uniflcl;
                load.linearDir = lindir;
                load.linearGbl = lingbl;
                load.linearLcl = linlcl;
                load.tempVar_X = tvx;
                load.tempVar_Y = tvy;
                load.tempVar_Z = tvz;
            end
        end
    end

Public methods

Implementation of the abstract methods declared in super-class Lelem.

    methods
 
        %------------------------------------------------------------------
        % Generates element flexural fixed end force (FEF) vector in
        % local xy-plane for an applied linearly distributed load.
        % Output:
        %  fef: 4 position vector with flexural (transversal) FEF's:
        %       fef(1) -> transversal force at initial node
        %       fef(2) -> bending moment at initial node
        %       fef(3) -> transversal force at final node
        %       fef(4) -> bending moment at final node
        function fef = flexuralDistribLoadFEF_XY(load)
            include_constants;

            % Initialize transversal load values at end nodes
            qyi = 0;
            qyf = 0;

            % Add uniform load contribution in local system
            if ~isempty(load.uniformLcl)
                qyi = qyi + load.uniformLcl(2);
                qyf = qyi;
            end

            % Add linear load contribution in local system
            if ~isempty(load.linearLcl)
                qyi = qyi + load.linearLcl(2);
                qyf = qyf + load.linearLcl(5);
            end

            % Check if transversal load is not null over element
            if (qyi ~= 0) || (qyf ~= 0)
                L  = load.elem.length;
                L2 = L^2;

                % Separate uniform portion from linear portion of tranversal load
                qy0 = qyi;
                qy1 = qyf - qyi;

                % Calculate fixed end force vector
                if (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == CONTINUOUS_END)

                    fef = [ -(qy0*L/2   + qy1*3*L/20);
                            -(qy0*L2/12 + qy1*L2/30);
                            -(qy0*L/2   + qy1*7*L/20);
                              qy0*L2/12 + qy1*L2/20 ];

                elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == CONTINUOUS_END)

                    fef = [ -(qy0*3*L/8 + qy1*L/10);
                              0;
                            -(qy0*5*L/8 + qy1*2*L/5);
                              qy0*L2/8  + qy1*L2/15 ];

                elseif (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == HINGED_END)

                    fef = [ -(qy0*5*L/8 + qy1*9*L/40);
                            -(qy0*L2/8  + qy1*7*L2/120);
                            -(qy0*3*L/8 + qy1*11*L/40);
                              0 ];

                elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == HINGED_END)

                    fef = [ -(qy0*L/2 + qy1*L/6);
                              0;
                            -(qy0*L/2 + qy1*L/3);
                              0 ];
                end

            else

                fef = [ 0;
                        0;
                        0;
                        0 ];
            end
        end

 
        %------------------------------------------------------------------
        % Generates element flexural fixed end force (FEF) vector in
        % local xz-plane for an applied linearly distributed load.
        % Output:
        %  fef: 4 position vector with flexural (transversal) FEF's:
        %       fef(1) -> transversal force at initial node
        %       fef(2) -> bending moment at initial node
        %       fef(3) -> transversal force at final node
        %       fef(4) -> bending moment at final node
        function fef = flexuralDistribLoadFEF_XZ(load)
            include_constants;

            % Initialize transversal load values at end nodes
            qzi = 0;
            qzf = 0;

            % Add uniform load contribution in local system
            if ~isempty(load.uniformLcl)
                qzi = qzi + load.uniformLcl(3);
                qzf = qzi;
            end

            % Add linear load contribution in local system
            if ~isempty(load.linearLcl)
                qzi = qzi + load.linearLcl(3);
                qzf = qzf + load.linearLcl(6);
            end

            % Check if transversal load is not null over element
            if (qzi ~= 0) || (qzf ~= 0)
                L  = load.elem.length;
                L2 = L^2;

                % Separate uniform portion from linear portion of tranversal load
                qz0 = qzi;
                qz1 = qzf - qzi;

                % Calculate fixed end force vector
                if (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == CONTINUOUS_END)

                    fef = [ -(qz0*L/2   + qz1*3*L/20);
                              qz0*L2/12 + qz1*L2/30;
                            -(qz0*L/2   + qz1*7*L/20);
                            -(qz0*L2/12 + qz1*L2/20) ];

                elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == CONTINUOUS_END)

                    fef = [ -(qz0*3*L/8 + qz1*L/10);
                              0;
                            -(qz0*5*L/8 + qz1*2*L/5);
                            -(qz0*L2/8  + qz1*L2/15) ];

                elseif (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == HINGED_END)

                    fef = [ -(qz0*5*L/8 + qz1*9*L/40);
                              qz0*L2/8  + qz1*7*L2/120;
                            -(qz0*3*L/8 + qz1*11*L/40);
                              0 ];

                elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == HINGED_END)

                    fef = [ -(qz0*L/2 + qz1*L/6);
                              0;
                            -(qz0*L/2 + qz1*L/3);
                              0 ];
                end

            else

                fef = [ 0;
                        0;
                        0;
                        0 ];
            end
        end

 
        %------------------------------------------------------------------
        % Generates element flexural fixed end force (FEF) vector in
        % local xy-plane for an applied thermal load.
        % Output:
        %  fef: 4 position vector with flexural (transversal) FEF's:
        %       fef(1) -> transversal force at initial node
        %       fef(2) -> bending moment at initial node
        %       fef(3) -> transversal force at final node
        %       fef(4) -> bending moment at final node
        function fef = flexuralThermalLoadFEF_XY(load)
            include_constants;

            % Get temperature gradient relative to element local y-axis
            dty = load.tempVar_Y;

            % Check if temperature gradient is not null
            if dty ~= 0
                E     = load.elem.material.elasticity;
                alpha = load.elem.material.thermExp;
                I     = load.elem.section.inertia_z;
                h     = load.elem.section.height_y;
                L     = load.elem.length;

                EI = E * I;

                % Unitary dimensionless temperature gradient
                tg = (alpha * dty) / h;

                % Calculate fixed end force vector
                if (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == CONTINUOUS_END)

                    fef = [ 0;
                            tg * (EI);
                            0;
                            tg * (-EI) ];

                elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == CONTINUOUS_END)

                    fef = [ tg * (-3*EI/(2*L));
                            0;
                            tg * (3*EI/(2*L));
                            tg * (-3*EI/2) ];

                elseif (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == HINGED_END)

                    fef = [ tg * (3*EI/(2*L));
                            tg * (3*EI/2);
                            tg * (-3*EI/(2*L));
                            0 ];

                elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == HINGED_END)

                    fef = [ 0;
                            0;
                            0;
                            0 ];
                end

            else

                fef = [ 0;
                        0;
                        0;
                        0 ];
            end
        end

 
        %------------------------------------------------------------------
        % Generates element flexural fixed end force (FEF) vector in
        % local xz-plane for an applied thermal load.
        % Output:
        %  fef: 4 position vector with flexural (transversal) FEF's:
        %       fef(1) -> transversal force at initial node
        %       fef(2) -> bending moment at initial node
        %       fef(3) -> transversal force at final node
        %       fef(4) -> bending moment at final node
        function fef = flexuralThermalLoadFEF_XZ(load)
            include_constants;

            % Get temperature gradient relative to element local z-axis
            dtz = load.tempVar_Z;

            % Check if temperature gradient is not null
            if dtz ~= 0
                E     = load.elem.material.elasticity;
                alpha = load.elem.material.thermExp;
                I     = load.elem.section.inertia_y;
                h     = load.elem.section.height_z;
                L     = load.elem.length;

                EI = E * I;

                % Unitary dimensionless temperature gradient
                tg = (alpha * dtz) / h;

                % Calculate fixed end force vector
                if (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == CONTINUOUS_END)

                    fef = [ 0;
                            tg * (-EI);
                            0;
                            tg * (EI) ];

                elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == CONTINUOUS_END)

                    fef = [ tg * (-3*EI/(2*L));
                            0;
                            tg * (3*EI/(2*L));
                            tg * (3*EI/2) ];

                elseif (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == HINGED_END)

                    fef = [ tg * (3*EI/(2*L));
                            tg * (-3*EI/2);
                            tg * (-3*EI/(2*L));
                            0 ];

                elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == HINGED_END)

                    fef = [ 0;
                            0;
                            0;
                            0 ];
                end

            else

                fef = [ 0;
                        0;
                        0;
                        0 ];
            end
        end

 
        %------------------------------------------------------------------
        % Computes element transversal displacement in local xy-plane at
        % given cross-section position for an applied linearly distributed load.
        % Output:
        %  dv: transversal displacement in local y-axis
        % Input arguments:
        %  x: cross-section position in element local x-axis
        function dv = flexuralDistribLoadDispl_XY(load,x)
            include_constants;

            % Initialize transversal load values at end nodes
            qyi = 0;
            qyf = 0;

            % Add uniform load contribution in local system
            if ~isempty(load.uniformLcl)
                qyi = qyi + load.uniformLcl(2);
                qyf = qyi;
            end

            % Add linear load contribution in local system
            if ~isempty(load.linearLcl)
                qyi = qyi + load.linearLcl(2);
                qyf = qyf + load.linearLcl(5);
            end

            % Check if transversal load is not null over element
            if (qyi ~= 0) || (qyf ~= 0)
                E = load.elem.material.elasticity;
                I = load.elem.section.inertia_z;
                L = load.elem.length;

                x2 = x^2;
                x3 = x2 * x;
                x4 = x3 * x;
                x5 = x4 * x;
                L2 = L  * L;
                L3 = L2 * L;
                EI = E  * I;

                % Separate uniform portion from linear portion of tranversal load
                qy0 = qyi;
                qy1 = qyf - qyi;

                % Calculate transversal displacements from uniform load portion (vq0)
                % and from linear load portion (vq1)
                if (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == CONTINUOUS_END)

                    vq0 = qy0/EI * (L2*x2/24 - L*x3/12 + x4/24);
                    vq1 = qy1/EI * (L2*x2/60 - L*x3/40 + x5/(120*L));

                elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == CONTINUOUS_END)

                    vq0 = qy0/EI * (L3*x/48  - L*x3/16 + x4/24);
                    vq1 = qy1/EI * (L3*x/120 - L*x3/60 + x5/(120*L));

                elseif (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == HINGED_END)

                    vq0 = qy0/EI * (L2*x2/16    - 5*L*x3/48 + x4/24);
                    vq1 = qy1/EI * (7*L2*x2/240 - 3*L*x3/80 + x5/(120*L));

                elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == HINGED_END)

                    vq0 = qy0/EI * (L3*x/24    - L*x3/12 + x4/24);
                    vq1 = qy1/EI * (7*L3*x/360 - L*x3/36 + x5/(120*L));

                end

                dv = vq0 + vq1;

            else
                dv = 0;
            end
        end

 
        %------------------------------------------------------------------
        % Computes element transversal displacement in local xz-plane at
        % given cross-section position for an applied linearly distributed load.
        % Output:
        %  dw: transversal displacement in local z-axis
        % Input arguments:
        %  x: cross-section position in element local x-axis
        function dw = flexuralDistribLoadDispl_XZ(load,x)
            include_constants;

            % Initialize transversal load value at end nodes
            qzi = 0;
            qzf = 0;

            % Add uniform load contribution in local system
            if ~isempty(load.uniformLcl)
                qzi = qzi + load.uniformLcl(3);
                qzf = qzi;
            end

            % Add linear load contribution in local system
            if ~isempty(load.linearLcl)
                qzi = qzi + load.linearLcl(3);
                qzf = qzf + load.linearLcl(6);
            end

            % Check if transversal load is not null over element
            if (qzi ~= 0) || (qzf ~= 0)
                E = load.elem.material.elasticity;
                I = load.elem.section.inertia_y;
                L = load.elem.length;

                x2 = x^2;
                x3 = x2 * x;
                x4 = x3 * x;
                x5 = x4 * x;
                L2 = L  * L;
                L3 = L2 * L;
                EI = E  * I;

                % Separate uniform portion from linear portion of tranversal load
                qz0 = qzi;
                qz1 = qzf - qzi;

                % Calculate transversal displacements from uniform load portion (wq0)
                % and from linear load portion (wq1)
                if (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == CONTINUOUS_END)

                    wq0 = qz0/EI * (L2*x2/24 - L*x3/12 + x4/24);
                    wq1 = qz1/EI * (L2*x2/60 - L*x3/40 + x5/(120*L));

                elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == CONTINUOUS_END)

                    wq0 = qz0/EI * (L3*x/48  - L*x3/16 + x4/24);
                    wq1 = qz1/EI * (L3*x/120 - L*x3/60 + x5/(120*L));

                elseif (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == HINGED_END)

                    wq0 = qz0/EI * (L2*x2/16    - 5*L*x3/48 + x4/24);
                    wq1 = qz1/EI * (7*L2*x2/240 - 3*L*x3/80 + x5/(120*L));

                elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == HINGED_END)

                    wq0 = qz0/EI * (L3*x/24    - L*x3/12 + x4/24);
                    wq1 = qz1/EI * (7*L3*x/360 - L*x3/36 + x5/(120*L));

                end

                dw = wq0 + wq1;

            else
                dw = 0;
            end
        end

 
        %------------------------------------------------------------------
        % Computes element transversal displacement in local xy-plane at
        % given cross-section position for an applied thermal load.
        % Output:
        %  dv: transversal displacement in local y-axis
        % Input arguments:
        %  x: cross-section position in element local x-axis
        function dv = flexuralThermalLoadDispl_XY(load,x)
            include_constants;

            % Get temperature gradient relative to element local y-axis
            dty = load.tempVar_Y;

            % Check if temperature gradient is not null
            if dty ~= 0
                alpha = load.elem.material.thermExp;
                h     = load.elem.section.height_y;
                L     = load.elem.length;

                x2 = x^2;
                x3 = x2 * x;

                % Unitary dimensionless temperature gradient
                tg = (alpha * dty) / h;

                % Calculate transversal displacement
                if (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == CONTINUOUS_END)

                    dv = 0;

                elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == CONTINUOUS_END)

                    dv = tg * (-L*x/4 + x2/2 - x3/(4*L));

                elseif (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == HINGED_END)

                    dv = tg * (-x2/4 + x3/(4*L));

                elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == HINGED_END)

                    dv = tg * (-L*x/2 + x2/2);

                end

            else
                dv = 0;
            end
        end

 
        %------------------------------------------------------------------
        % Computes element transversal displacement in local xz-plane at
        % given cross-section position for an applied thermal load.
        % Output:
        %  dw: transversal displacement in local z-axis
        % Input arguments:
        %  x: cross-section position in element local x-axis
        function dw = flexuralThermalLoadDispl_XZ(load,x)
            include_constants;

            % Get temperature gradient relative to element local z-axis
            dtz = load.tempVar_Z;

            % Check if temperature gradient is not null
            if dtz ~= 0
                alpha = load.elem.material.thermExp;
                h     = load.elem.section.height_z;
                L     = load.elem.length;

                x2 = x^2;
                x3 = x2 * x;

                % Unitary dimensionless temperature gradient
                tg = (alpha * dtz) / h;

                % Calculate transversal displacement
                if (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == CONTINUOUS_END)

                    dw = 0;

                elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == CONTINUOUS_END)

                    dw = tg * (-L*x/4 + x2/2 - x3/(4*L));

                elseif (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == HINGED_END)

                    dw = tg * (-x2/4 + x3/(4*L));

                elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == HINGED_END)

                    dw = tg * (-L*x/2 + x2/2);

                end

            else
                dw = 0;
            end
        end
    end
end