Lelem_Timoshenko 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 Timoshenko flexural behavior of linear elements subjected to loading effects.
Contents
Timoshenko Beam Theory
In Timoshenko flexural behavior, shear deformation is considered in an approximated manner. Bending of a linear structure element is such that its cross-section remains plane but it is not normal to the element longitudinal axis.
Class definition
Definition of sub-class Lelem_Timoshenko derived from super-class Lelem.
classdef Lelem_Timoshenko < Lelem
Constructor method
methods %------------------------------------------------------------------ function load = Lelem_Timoshenko(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) E = load.elem.material.elasticity; G = load.elem.material.shear; As = load.elem.section.area_y; I = load.elem.section.inertia_z; L = load.elem.length; L2 = L^2; GAs = G * As; EI = E * I; % Timoshenko parameters Omega = EI / (GAs * L2); mu = 1 + 12 * Omega; lambda = 1 + 3 * Omega; zeta = 1 + 40 * Omega/3; xi = 1 + 5 * Omega; eta = 1 + 15 * Omega; vartheta = 1 + 4 * Omega; psi = 1 + 12 * Omega/5; varpi = 1 + 20 * Omega/9; epsilon = 1 + 80 * Omega/7; varrho = 1 + 10 * Omega; upsilon = 1 + 5 * Omega/2; varsigma = 1 + 40 * Omega/11; % 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*zeta/(20*mu)); -(qy0*L2/12 + qy1*L2*eta/(30*mu)); -(qy0*L/2 + qy1*7*L*epsilon/(20*mu)); qy0*L2/12 + qy1*L2*varrho/(20*mu) ]; elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == CONTINUOUS_END) fef = [ -(qy0*3*L*vartheta/(8*lambda) + qy1*L*xi/(10*lambda)); 0; -(qy0*5*L*psi/(8*lambda) + qy1*2*L*upsilon/(5*lambda)); qy0*L2/(8*lambda) + qy1*L2/(15*lambda) ]; elseif (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == HINGED_END) fef = [ -(qy0*5*L*psi/(8*lambda) + qy1*9*L*varpi/(40*lambda)); -(qy0*L2/(8*lambda) + qy1*7*L2/(120*lambda)); -(qy0*3*L*vartheta/(8*lambda) + qy1*11*L*varsigma/(40*lambda)); 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) E = load.elem.material.elasticity; G = load.elem.material.shear; As = load.elem.section.area_z; I = load.elem.section.inertia_y; L = load.elem.length; L2 = L^2; GAs = G * As; EI = E * I; % Timoshenko parameters Omega = EI / (GAs * L2); mu = 1 + 12 * Omega; lambda = 1 + 3 * Omega; zeta = 1 + 40 * Omega/3; xi = 1 + 5 * Omega; eta = 1 + 15 * Omega; vartheta = 1 + 4 * Omega; psi = 1 + 12 * Omega/5; varpi = 1 + 20 * Omega/9; epsilon = 1 + 80 * Omega/7; varrho = 1 + 10 * Omega; upsilon = 1 + 5 * Omega/2; varsigma = 1 + 40 * Omega/11; % 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*zeta/(20*mu)); qz0*L2/12 + qz1*L2*eta/(30*mu); -(qz0*L/2 + qz1*7*L*epsilon/(20*mu)); -(qz0*L2/12 + qz1*L2*varrho/(20*mu)) ]; elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == CONTINUOUS_END) fef = [ -(qz0*3*L*vartheta/(8*lambda) + qz1*L*xi/(10*lambda)); 0; -(qz0*5*L*psi/(8*lambda) + qz1*2*L*upsilon/(5*lambda)); -(qz0*L2/(8*lambda) + qz1*L2/(15*lambda)) ]; elseif (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == HINGED_END) fef = [ -(qz0*5*L*psi/(8*lambda) + qz1*9*L*varpi/(40*lambda)); qz0*L2/(8*lambda) + qz1*7*L2/(120*lambda); -(qz0*3*L*vartheta/(8*lambda) + qz1*11*L*varsigma/(40*lambda)); 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; G = load.elem.material.shear; alpha = load.elem.material.thermExp; As = load.elem.section.area_y; I = load.elem.section.inertia_z; h = load.elem.section.height_y; L = load.elem.length; L2 = L^2; GAs = G * As; EI = E * I; % Timoshenko parameters Omega = EI / (GAs * L2); lambda = 1 + 3 * Omega; % Compute 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*lambda)); 0; tg * (3*EI/(2*L*lambda)); tg * (-3*EI/(2*lambda)) ]; elseif (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == HINGED_END) fef = [ tg * (3*EI/(2*L*lambda)); tg * (3*EI/(2*lambda)); tg * (-3*EI/(2*L*lambda)); 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; G = load.elem.material.shear; alpha = load.elem.material.thermExp; As = load.elem.section.area_z; I = load.elem.section.inertia_y; h = load.elem.section.height_z; L = load.elem.length; L2 = L^2; GAs = G * As; EI = E * I; % Timoshenko parameters Omega = EI / (GAs * L2); lambda = 1 + 3 * Omega; % Compute 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*lambda)); 0; tg * (3*EI/(2*L*lambda)); tg * (3*EI/(2*lambda)) ]; elseif (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == HINGED_END) fef = [ tg * (3*EI/(2*L*lambda)); tg * (-3*EI/(2*lambda)); tg * (-3*EI/(2*L*lambda)); 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 value 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; G = load.elem.material.shear; As = load.elem.section.area_y; 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; GAs = G * As; % Timoshenko parameters Omega = EI / (GAs * L2); mu = 1 + 12 * Omega; lambda = 1 + 3 * Omega; zeta = 1 + 40 * Omega/3; xi = 1 + 5 * Omega; eta = 1 + 15 * Omega; vartheta = 1 + 4 * Omega; psi = 1 + 12 * Omega/5; varpi = 1 + 20 * Omega/9; % 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 * (L3*Omega*x/2 + (L2/24 - L2*Omega/2)*x2 - L*x3/12 + x4/24); vq1 = qy1/EI * (3*L3*Omega*zeta*x/(20*mu) + L2*eta*x2/(60*mu) - (L*zeta/(40*mu) + L*Omega/6)*x3 + x5/(120*L)); elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == CONTINUOUS_END) vq0 = qy0/EI * ((L3*mu/(48*lambda) + 3*L3*Omega*vartheta/(8*lambda))*x - L2*Omega*x2/2 - L*vartheta*x3/(16*lambda) + x4/24); vq1 = qy1/EI * ((L3*eta/(120*lambda) + L3*Omega*xi/(10*lambda))*x - (L*xi/(60*lambda) + L*Omega/6)*x3 + x5/(120*L)); elseif (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == HINGED_END) vq0 = qy0/EI * (5*L3*Omega*psi*x/(8*lambda) + (L2/(16*lambda) - L2*Omega/2)*x2 - 5*L*psi*x3/(48*lambda) + x4/24); vq1 = qy1/EI * (9*L3*Omega*varpi*x/(40*lambda) + 7*L2*x2/(240*lambda) - (3*L*varpi/(80*lambda) + L*Omega/6)*x3 + x5/(120*L)); elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == HINGED_END) vq0 = qy0/EI * ((L3/24 + L3*Omega/2)*x - L2*Omega*x2/2 - L*x3/12 + x4/24); vq1 = qy1/EI * ((7*L3/360 + L3*Omega/6)*x - (L/36 + L*Omega/6)*x3 + 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; G = load.elem.material.shear; As = load.elem.section.area_z; 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; GAs = G * As; % Timoshenko parameters Omega = EI / (GAs * L2); mu = 1 + 12 * Omega; lambda = 1 + 3 * Omega; zeta = 1 + 40 * Omega/3; xi = 1 + 5 * Omega; eta = 1 + 15 * Omega; vartheta = 1 + 4 * Omega; psi = 1 + 12 * Omega/5; varpi = 1 + 20 * Omega/9; % 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 * (L3*Omega*x/2 + (L2/24 - L2*Omega/2)*x2 - L*x3/12 + x4/24); wq1 = qz1/EI * (3*L3*Omega*zeta*x/(20*mu) + L2*eta*x2/(60*mu) - (L*zeta/(40*mu) + L*Omega/6)*x3 + x5/(120*L)); elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == CONTINUOUS_END) wq0 = qz0/EI * ((L3*mu/(48*lambda) + 3*L3*Omega*vartheta/(8*lambda))*x - L2*Omega*x2/2 - L*vartheta*x3/(16*lambda) + x4/24); wq1 = qz1/EI * ((L3*eta/(120*lambda) + L3*Omega*xi/(10*lambda))*x - (L*xi/(60*lambda) + L*Omega/6)*x3 + x5/(120*L)); elseif (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == HINGED_END) wq0 = qz0/EI * (5*L3*Omega*psi*x/(8*lambda) + (L2/(16*lambda) - L2*Omega/2)*x2 - 5*L*psi*x3/(48*lambda) + x4/24); wq1 = qz1/EI * (9*L3*Omega*varpi*x/(40*lambda) + 7*L2*x2/(240*lambda) - (3*L*varpi/(80*lambda) + L*Omega/6)*x3 + x5/(120*L)); elseif (load.elem.hingei == HINGED_END) && (load.elem.hingef == HINGED_END) wq0 = qz0/EI * ((L3/24 + L3*Omega/2)*x - L2*Omega*x2/2 - L*x3/12 + x4/24); wq1 = qz1/EI * ((7*L3/360 + L3*Omega/6)*x - (L/36 + L*Omega/6)*x3 + 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 E = load.elem.material.elasticity; G = load.elem.material.shear; alpha = load.elem.material.thermExp; As = load.elem.section.area_y; I = load.elem.section.inertia_z; h = load.elem.section.height_y; L = load.elem.length; x2 = x^2; x3 = x2 * x; L2 = L * L; EI = E * I; GAs = G * As; % Timoshenko parameters Omega = EI / (GAs * L2); mu = 1 + 12 * Omega; lambda = 1 + 3 * Omega; gamma = 1 - 6 * Omega; % 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*mu/(4*lambda) + 3*L*Omega/(2*lambda))*x + x2/2 - x3/(4*L*lambda)); elseif (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == HINGED_END) dv = tg *(-3*L*Omega*x/(2*lambda) - gamma*x2/(4*lambda) + x3/(4*L*lambda)); 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 E = load.elem.material.elasticity; G = load.elem.material.shear; alpha = load.elem.material.thermExp; As = load.elem.section.area_z; I = load.elem.section.inertia_y; h = load.elem.section.height_z; L = load.elem.length; x2 = x^2; x3 = x2 * x; L2 = L * L; EI = E * I; GAs = G * As; % Timoshenko parameters Omega = EI / (GAs * L2); mu = 1 + 12 * Omega; lambda = 1 + 3 * Omega; gamma = 1 - 6 * Omega; % 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*mu/(4*lambda) + 3*L*Omega/(2*lambda))*x + x2/2 - x3/(4*L*lambda)); elseif (load.elem.hingei == CONTINUOUS_END) && (load.elem.hingef == HINGED_END) dw = tg *(-3*L*Omega*x/(2*lambda) - gamma*x2/(4*lambda) + x3/(4*L*lambda)); 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