Numerical Study of the Vibration of a Periodically-supported Beam by
Brandon C. Rush
An Engineering Project Submitted to the Graduate
Faculty of Rensselaer Polytechnic Institute in Partial Fulfillment of the
Requirements for the degree of
MASTER OF MECHANICAL ENGINEERING IN MECHANICAL ENGINEERING
Approved:
_________________________________________
Ernesto Gutierrez-Miravete, Project Adviser
Rensselaer Polytechnic Institute
Hartford, Connecticut
December, 2009
i
© Copyright 2009 by
Brandon C. Rush
All Rights Reserved ii
iii
iv
Figure 4: Dynamic Cantilevered Beam – Multi-element– 55.9 Hz ................................... 8
Figure 5: Frequency Response of Cantilevered Beam – Multi-element– 55.9 Hz ............ 9
Figure 6: Dynamic Cantilevered Beam – Multi-element – 350.8 Hz ................................ 9
Figure 7: Frequency Response of Cantilevered Beam – Multi-element – 350.8 Hz ....... 10
Figure 9: 3-bay Beam – COMSOL – 1 st
Mode................................................................ 12
Mode .................................................................................. 12
Figure 11: 3-bay Beam – COMSOL – 2 nd
Mode ............................................................. 13
Mode ................................................................................. 14
Figure 13: 3-bay Beam – COMSOL – 3 rd
Mode ............................................................. 15
Mode .................................................................................. 15
Figure 15: 3-bay Beam – COMSOL – 4 th
Mode ............................................................. 16
Mode .................................................................................. 17
v
M
E
I y
Bending Moment
Modulus of Elasticity
Area Moment of Inertia
Displacement x
P l k i a
Lengthwise coordinate
Applied load
Overall length
Wavenumber
Transverse bending speed
Density
A Cross-sectional area
Ratio of damping to critical damping vi
I would like to thank my parents for their support and motivation throughout my education. I would like to thank Dr. Ernesto Gutierrez-Miravete for his patience, guidance, and support. vii
This paper develops a finite element analysis code in MATLAB to solve the forced vibration response of one-dimensional beams. The code is validated for simple static and dynamic problems against analytical solutions and a commercial finite element code, COMSOL, before applying it to more complicated structures. Finite element analysis of a disordered periodic beam is used to demonstrate and investigate aspects of periodic structure theory, including passbands and stopbands. The solution is compared to published theoretical and experimental work.
. viii
Periodic structures can be considered a special class of vibrating structures with a macroscopic repeating unit or building block. Examples of periodic structures include train tracks laid over regularly-spaced railroad ties, bridges on evenly-spaced supports, plates or equipment foundations with regularly-spaced stiffeners, or long pipes in a heat exchanger with evenly-spaced supports. Periodic structure theory describes the unique behavior of these structures as they transmit vibration or other waves. Newton considered wave motion of identical mass particles connected by identical springs as early as 1686, and Brillouin’s treatment in 1953 set the foundation for modern analysis
[1].
Application of the theory to free vibration of periodic beams was performed by
Miles [2]. Lin [3] and Bansal [4] studied disordered systems, which depart from strict periodic structure theory. Systems of engineering interest are rarely perfectly periodic; manufacturing tolerances, material property variability, and other perturbations can all destroy the system’s periodicity. Bouzit [5] built several experimental systems and recorded data on symmetric and perturbed periodicity. Bennet [6] extends the analysis to ring stiffened cylindrical shells. Finite element analysis is particularly well-suited to problems involving random disturbances where analytic solutions become less tractable.
A finite element program suitable for the dynamic analysis of periodically supported structures was developed and verified against analytic and other computational solutions.
1
A 2-dimensional finite element analysis code was developed in MATLAB [7] to reduce execution times and easily vary parameters within the model. Element types and connectivity were restricted to the one-dimensional beam being studied, which greatly reduced the amount of bookkeeping and model verification required. The code can be divided into two subsections, static and dynamic. The static portion of the code contains the geometry of the problem and material stiffnesses and will provide static deflections based on the applied load and boundary conditions. The dynamic portion of the code introduces mass and provides the forced response at a given frequency.
The deflection of an end-loaded cantilevered beam was chosen as a validation problem because it can be readily solved from first principles and is very amenable to modeling via the finite element method.
2.1.1
Analytic solution
From elementary beam bending theory, the equation of motion for a beam is
M
EI d
2 y dx
2
Equation 2-1 with M the moment, E the modulus of elasticity, and I the area moment of inertia.
Defining a beam as shown in Figure 1 with length
l and a force –P at the right end, the moment within the beam is then given by the expression
M
P ( l
x ) Equation 2-2
2
P l y x
Figure 1: End-loaded Cantilevered Beam
Two boundary conditions are provided by the cantilevered end of the beam: y
0 x
0 Equation 2-3 and dy dx
0 x
0 Equation 2-4
Substituting Equation 2-2 into Equation 2-1, integrating twice, and applying the boundary conditions yields an equation for the deflection of the beam: y ( x )
P
EI
1
2
Lx
2
1
6 x
3 and the maximum deflection is found at the free end x
L ,
Equation 2-5
Pl
3 y
3 EI
Equation 2-6
This analytical solution will be used in Section 3.1 to verify the stiffness matrix formulation, basic element connectivity, and input deck structure for the code.
2.1.2
Finite element solution
The code implements linear (2-noded) Timoshenko beam elements with 3 degrees of freedom at each node: 2 translations and 1 rotation. Nodes are defined along the line y=0
3
and adjacent nodes are connected with a single beam element. The stiffness matrix uses the formulation developed by Cook in [8]. The correct nodal deflection is expected with a single linear finite element.
Dynamic analyses require information about the system mass. One common solution method is eigenvalue analysis, which identifies resonant frequencies and mode shapes of the system. This approach is used to solve for the natural frequencies of a cantilevered
beam in Section 2.2.1. One of its drawbacks is that the solution at any particular
frequency must be approximated as the sum of the contributions of many modes, although it identifies mode shapes and resonant frequencies with efficiently and good accuracy within the limitations of the modeling process. Another approach, the direct solution, solves for the exact solution by including a frequency-dependent mass matrix into the system equations and simply solving the combined equations. This approach is more computationally intensive and limited to the frequency resolution at which it was run. The code developed in this paper uses the direct method.
2.2.1
Analytic solution
An analytic solution to the transverse vibration of a cantilevered beam is presented by
Timoshenko p. 426 [9]. The frequency equation for the beam is given by cos( k i l ) cosh( k i l )
1 Equation 2-7 where l is the length of the beam and k is the wavenumber, which is related to the natural frequency of the beam in Hertz, f , by f i
ak i
2
2
Equation 2-8
The term a is a measure of the transverse bending speed, given by a
EI
A
Equation 2-9
4
with E the modulus of elasticity, I the moment of inertia,
the density, and A the beam’s cross-sectional area. The first four roots of kl are 1.875, 4.694, 7.855, and
10.996 [9]. This analysis is used to validate that the mass matrix formulation and the
direct solution method provide accurate results for a vibration problem.
2.2.2
Finite element solution
The mass matrix is a combination mass matrix as described by Cook [8]. Combination
mass matrices calculate both the lumped mass and consistent mass representations of the mass matrix and weight them to determine the final matrix. Lumped mass representations place the mass of an element at its nodes and are preferred if many elements are used and rotations or transverse displacements are not significant; otherwise, they distribute the mass too widely and tend to underestimate natural frequencies. Consistent mass representations distribute mass throughout the element and are preferred when few elements are used and transverse displacements are significant; however, they tend to overestimate natural frequencies. Both representations were given equal weight in the code developed here.
Forced vibration responses in this paper are solved via direct solution (timeharmonic analysis) instead of eigenvalue analysis as this provides the complete solution at a given frequency without consideration for how many modes are participating. The penalty is that a new matrix must be factored for each frequency, and the fidelity of the result is limited by the number of frequencies solved. The low matrix bandwidth inherent to the beam problem results in a low wavefront and rapid solutions.
5
The analytical models from Chapter 2 are used to validate the finite element program
before it is applied to additional problems and compared to test data.
Consider a simple end-loaded cantilever beam as shown in Figure 1 with the parameters
shown in Table 1. The terms are as defined in Section 2.1.1 with the addition of
, the density, A , the cross-sectional area, and
, the ratio of damping to critical damping. This small, representative amount of damping is included to prevent large displacements at
a consistent set. Early studies are unitless but the experimental data from [5] uses the
United States customary system. From Equation 2-6, the maximum deflection will be y
= 0.0333. As shown in Figure 2, the exact solution is found using a single finite element.
The element nodal displacements are plotted, effectively using linear interpolation for
displacements within the element. Figure 3 shows a multi-element beam, which again
finds the exact analytical solution. These cases validate basic element formulation, element connectivity, and that material properties are handled correctly.
Property
P
Value
100 l
E
I
1
1E6
1E-3
A
1
0.1
0.01
Table 1: Cantilevered Beam Properties
6
Figure 2: Static Cantilevered Beam – 1 Element
Figure 3: Static Cantilevered Beam – Multi-element
7
Continuing with the cantilever beam example from Section 3.1, Equation 2-8 predicts
the first two natural frequencies of the beam will fall at 55.95 and 350.7 Hz. The code
was executed on a large number of frequencies between 10 and 1500 Hz. Figure 4 shows
the displacement of the beam at the first resonant mode of 55.9 Hz which is simple
bending, as expected. Figure 5 shows the frequency response, with the displacement in
dB on the ordinate. The red vertical line indicates the selected frequency (55.9 Hz) and its proximity to a peak in the displacement indicates that the system is very near a
resonant mode. Figure 6 and Figure 7 show the displacement and frequency response of
the beam at the second mode, 350.8 Hz. The resonant frequencies are in good agreement
and the displaced shapes match those predicted by Cook p. 386 [8].
Figure 4: Dynamic Cantilevered Beam – Multi-element– 55.9 Hz
8
Figure 5: Frequency Response of Cantilevered Beam – Multi-element– 55.9 Hz
Figure 6: Dynamic Cantilevered Beam – Multi-element – 350.8 Hz
9
Figure 7: Frequency Response of Cantilevered Beam – Multi-element – 350.8 Hz
Bouzit [5] has built a beam simply supported by 4 supports evenly spaced 12 inches
apart to analyze the frequency response and vibration localization of a periodic structure.
A 1 inch overhang on the left-hand side provides easy access for a mechanical shaker; a
sketch is provided in Figure 8. Dimensions for this beam are shown in Table 2. This
beam was modeled in COMSOL and the first four mode shapes are compared with the
code developed here in Figure 9 through Figure 16. The mode shapes predicted by the
code agree with the COMSOL results and both the mode shapes and natural frequencies match well with the results demonstrated theoretically and experimentally by Bouzit p.
10
Property
P l
E
I
A
Value
10
37
30E6
8.138E-5
7.246E-4
0.0625
0.01
Table 2: 3-bay Beam Properties
Figure 8: 3-bay Beam – Schematic
11
Figure 9: 3-bay Beam – COMSOL – 1 st Mode
Figure 10: 3-bay Beam – 1 st Mode
At resonance the response of a system is in the process of shifting from the in-phase response during the low frequency stiffness-like behavior to the out-of-phase high
12
frequency mass-like behavior. Both phases are considered correct. Because of this, the mode shapes displayed happen to be out-of-phase with respect to each other. No attempt was made to make the response amplitudes equivalent between models since it can be influenced by subtle differences in implementation or material properties like damping.
The predicted frequency of 80.7 Hz closely matches Bouzit’s theoretical and
experimental results of 80.9 Hz and 79.7 Hz [5].
Figure 11: 3-bay Beam – COMSOL – 2 nd Mode
13
Figure 12: 3-bay Beam – 2 nd Mode
The second mode is also well-represented by both finite element approaches; both responses are well-captured and the influence of the pinned connections is readily apparent as the slope shifts to support the extra bending in the center bay. The predicted frequency of 103.5 Hz closely matches Bouzit’s theoretical and experimental results of
14
Figure 13: 3-bay Beam – COMSOL – 3 rd Mode
Figure 14: 3-bay Beam – 3 rd Mode
15
The third mode is again reversed in phase between finite element codes. The predicted frequency of 151.3 Hz closely matches Bouzit’s theoretical and experimental results of
Figure 15: 3-bay Beam – COMSOL – 4 th Mode
16
Figure 16: 3-bay Beam – 4 th Mode
There is good agreement on the fourth mode and it dominates the response during the
direct solution, even as the inset frequency response plot on Figure 16 shows a modally-
dense region is approaching. The predicted frequency of 323.4 Hz closely matches
Bouzit’s theoretical and experimental results of 323.6 Hz and 305 Hz [5].
Figure 17 provides an isometric view of the displacement as a surface with beam
position and frequency as the X-axis and Y-axis and colored by the beam response in dB re. 1 inch as elevation of the Z-axis.
17
Figure 17: 3-bay Beam – Beam Response – Isometric
The absolute value of the displacements had to be taken before they could be converted to decibel values, necessary to represent such a large range of displacements on a single graph. At the low frequency side (left side) of the graph, the three bays are clearly visible as red displacement peaks as they activate for the first several modes. Higher modes to the right, while lower in amplitude, show that more and more wavelengths of
vibration are fitting within the beam, as expected. Figure 18 contains the same data but is
turned to look along the length of the beam, better highlighting the pass bands (regions with frequent spikes in the displacement, corresponding to modes of the beam) and stop bands (regions with few resonances).
18
Figure 18: 3-bay Beam – Beam Response
19
Finite element analysis of a periodic beam was used to demonstrate and investigate aspects of periodic structure theory. A direct solution static finite element code was developed in MATLAB capable of solving static and dynamic beam flexure problems.
The code was validated for simple static and dynamic problems against analytical solutions and a commercial finite element code, COMSOL, before applying it to more complicated structures. The solutions compare favorably to published theoretical and experimental results .
20
[1] L. Brillouin, Wave Propagation In Periodic Structures , New York: Dover, 1953.
[2] Miles, J. W., Vibration of Beams on Many Supports, Journal of Engineering
Mechanics Division, ASCE (1956) 82(1), 1-9
[3] Lin, Y. K. and J. N. Lang, Free Vibration of a Disordered Periodic Beam , Journal of
Applied Mechanics (1974) 41E, 383-391
[4] Bansal, A. S., Free Waves in Periodically Disordered Systems: Natural and
Bounding Frequencies of Unsymmetric Systems and Normal Mode Localizations ,
Journal of Sound and Vibration (1997) 207(3), 365-382
[5] Bouzit, Djamel and C. Pierre, Wave localization and conversion phenomena in multicoupled multi-span beams, Chaos, Solitons and Fractals 11 (2000) 1575-1596
[6] Bennett, M. S. and M. L. Accorsi, Free Wave Propagation in Periodically Ring
Stiffened Cylindrical Shells, Journal of Sound and Vibration (1994) 171(1), 49-
66
[7] MATLAB 7.4.0 (R2007a), The Mathworks
[8] Cook, Robert D., et al., Concepts and Applications of Finite Element Analysis,
Fourth Edition , New York: John Wiley & Sons, 2002
[9] Timshenko, S., et al., Vibration Problems in Engineering, Fourth Edition , New
York: John Wiley & Sons, 1974.
21
% This script file contains series of commands that create various plots close all ;
% Plot some static results. plotDeck.m is slightly outdated and legend
% entries may be inaccurate. Results and plot figure information are stored
% in the same structure as the input deck, dat.
dat = plotStatic(calcStatic(quickDeck( '1 elem canti' ))); axis([-.3 1.3 -0.05 0.02]); grid on ; title( 'Results - Cantilevered Beam - 1 element' ); dat = plotStatic(calcStatic(quickDeck( 'multi elem canti' )), 'Results -
Cantilevered Beam - Multi-element' ); axis([-.3 1.3 -0.05 0.02]); grid on ; dat = calcDynamic(quickDeck( 'multi elem canti' )); plotStatic(dat,55.9, 'Results - Cantilevered Beam - Multi-element' ); plotStatic(dat,350.7, 'Results - Cantilevered Beam - Multi-element' );
% Plot our response at the frequencies closes to the experimental resonance
% frequencies dat = calcDynamic(quickDeck( 'exper3' )); plotStatic(dat,80.905, 'Results - 3-bay Beam' ); plotStatic(dat,103.681, 'Results - 3-bay Beam' ); plotStatic(dat,151.396, 'Results - 3-bay Beam' ); plotStatic(dat,323.621, 'Results - 3-bay Beam' );
% Repeat for disordered beam dat = calcDynamic(quickDeck( 'exper3-disorder' )); plotStatic(dat,73.9, 'Results - Disordered 3-bay Beam' ); plotStatic(dat,93.66, 'Results - Disordered 3-bay Beam' ); plotStatic(dat,153.40, 'Results - Disordered 3-bay Beam' ); plotStatic(dat,282.5, 'Results - Disordered 3-bay Beam' );
% Plot a 3D surface on a db (log) scale based on the absolute value of
% displacement v = dat.u(2:3:end,:); figure;
[x y] = meshgrid(dat.freq,dat.x); surf(x,y,20*log10(abs(v)), 'linestyle' , 'none' ); colorbar set(gca, 'xscale' , 'log' ) xlabel( 'Frequency (Hz)' ) ylabel( 'Length (in)' ) zlabel( 'Displacement (dB re. 1)' )
% Sweep through the frequency spectrum plotting different mode shapes.
This
% highlights the pass and stop-band phenomena. You can see more and more
% wavelengths fitting within the specimen at higher frequencies and the way
% the displacements are concentrated near the driving end by the disordered
% supports animDynamic(calcDynamic(quickDeck( 'exper12-disorder' )))
22
function dat = quickDeck(name)
% This file contains frequently-used input decks
% Decks are stored as a structure, dat, with the following fields:
%
% == Static and dynamic parameters ==
% .x - x locations of nodes. Nodes are automatically
% numbered sequentially
% .constraint - array containing model constraints. Each constraint is a row in
% the matrix of form [node# constraint#] with
% constraint#: 1 = displacement-x, 2 = displacement-y, 3
= rotation
% .load - array containing loads. Each load is a row with the form
% [node# force moment]
% .Ei - product of the modulus of elasticity E and moment of inertia I
% for beams in this model
%
% == Dynamic parameters ==
% .rhoA - product of the beam density rho and area A for beams in this model
% .freq - vector of frequencies
% .eta - loss factor as a percent of critical damping for the model
% (eta = 0.2 --> 0.2%) experimentalBeam.E = 30E6; experimentalBeam.G = experimentalBeam.E/(2*(1+0.3)); experimentalBeam.I = 0.5*0.125^3/12; % bh^3/12 experimentalBeam.rho = 0.28/386.4; % 0.28 lb/in3 -> slugs experimentalBeam.A = 0.5*0.125; experimentalBeam.freq = logspace(1.6,3.3,300); experimentalBeam.eta = 1; % percent critical damping experimentalBeam.load = [ ...
1 0 -10 0]; % Drive overhanging edge if nargin % If we were handed an argument switch lower(name) case '1 elem canti' % Note: static only
% Theoretical solution for an end-loaded cantilevered beam:
% ymax = -F*L^3/(3*E*I) = -100*1^3/3/1000 = 0.03333
% L=1;
% F1 = 3.533*sqrt(dat.E*dat.I/(dat.A*dat.rho*L^4))/2/pi
dat.x = [0 1]; % 2 nodes, 1 element
dat.constraint = [ ...
% clamp the left end, all DOF
1 1
1 2
1 3];
dat.load = [ ...
2 0 -100 0];
dat.A = 0.1;
dat.E = 1E6;
dat.G = dat.E/(2*(1+0.3));
dat.I = 1E-3;
dat.rho = 1;
dat.freq = logspace(1,3,1500);
dat.eta = 1; case 'multi elem canti' % Note: static only
dat.x = 0:.025:1;
dat.constraint = [ ...
1 1
23
1 2
1 3];
dat.load = [ ...
length(dat.x) 0 -100 0];
dat.A = 0.1;
dat.E = 1E6;
dat.G = dat.E/(2*(1+0.3));
dat.I = 1E-3;
dat.rho = 1;
dat.freq = logspace(1,3,1500);
dat.eta = 1; case 'exper3'
% Small experimental setup from Bouzit and Pierre
% E: 30E6 psi rho: 0.28 lb/in3
% width: 0.5 in thickness: 0.125 in -> I = bh^3/12 = 8.138E-5
% eta = 1%
%
% Force applied at a 1-inch overhang. Span length nominal 12 in
%
% Bernoulli-Euler bending wave
% rho=.28/386.4; omega=2*pi*[1 10 100]; E=30E6; h=0.5;
% c = sqrt(omega)*sqrt(sqrt(E*h^2/12/rho))
% sqrt(omega)*sqrt(sqrt(30E6*0.5^2/12/0.28))
% 135.8 429.6 4296
%
% Timoshenko-Mindlin bending wave
% rho=.28/386.4; omega=2*pi*[.1 1 100]; E=30E6; h=0.5;
% c = sqrt(1./(1.7*rho/E+sqrt(12*rho./(omega.^2*E*h^2)+(0.7*rho/E)^2)))
dat = experimentalBeam;
dat.x = -1:.5:36;
dat.constraint = [ ...
% constraints for -1:.5:36 spacing
3 2
27 2
51 2
75 2
];
% dat.constraint = [5:48:150;2*ones(1,4)]'; % constraints for -1:.25:36 spacing case 'exper3-disorder'
dat = experimentalBeam;
xLen = [12.25 10+15/16 13+5/8];
xPos = [0 cumsum(xLen)];
dat.x = []; for iL = 1:length(xLen)
dat.x = [dat.x linspace(xPos(iL),xPos(iL+1),25)]; end
dat.x = [-1 -.5 unique(dat.x)];
dat.constraint = [ ...
3 2
27 2
51 2
75 2
]; case 'exper12'
dat = experimentalBeam;
dat.x = -1:.5:120;
dat.constraint = [3:20:243;2*ones(1,13)]'; case 'exper12-disorder'
dat = experimentalBeam;
xLen = [9.8 9.35 11.3 10 10.9 9.05 10.3 8.7 9.7 11.1 10.5 9.3];
24
xPos = [0 cumsum(xLen)];
dat.x = []; for iL = 1:length(xLen)
dat.x = [dat.x linspace(xPos(iL),xPos(iL+1),21)]; end
dat.x = [-1 -.5 unique(dat.x)];
dat.constraint = [3:20:243;2*ones(1,13)]'; end else
error( 'No deck defined' ) end
25
function dat = calcStatic(dat)
% Calculate the static deformation given an input deck of the format
% described in quickDeck.m
%
% Functions called:
% quickDeck.m
% trussK.m
if ~nargin % Use a default deck if not provided
close all ; clc
dat = quickDeck(); end
L = diff(dat.x); nE = length(L); % number of elements nN = nE+1; % number of nodes k = zeros(20*nE,1); % preallocate vectors to hold indices into K ky = k; kx = k; for iE = 1:nE
startDof = 3*(iE-1)+1; % Starting degree of freedom...row (or column) of a 2D K
startInd = 20*(iE-1)+1; % Starting index for this section of indices to K
targInd = startInd:(startInd+19); % Where to store the next 20 terms
[lilKx,lilKy,lilK] = trussK(dat.A,dat.E,dat.G,dat.I,L(iE),startDof);
% targDof = startDof:startDof+5;
% K(targDof,targDof) = K(targDof,targDof) + sparse(lilKx,lilKy,lilK);
k(targInd) = lilK;
kx(targInd) = lilKx;
ky(targInd) = lilKy; end
K = sparse(kx,ky,k); % Build the stiffness matrix as a sparse matrix
F = zeros(3*nN,1); loadNode = dat.load(:,1); loadForceX = dat.load(:,2); loadForceY = dat.load(:,3); loadMoment = dat.load(:,4);
F(loadNode*3-2) = loadForceX;
F(loadNode*3-1) = loadForceY;
F(loadNode*3) = loadMoment; consNode = dat.constraint(:,1); consVal = dat.constraint(:,2); consList = zeros(length(consNode),1); for iC = 1:length(consNode)
consList(iC) = 3*(consNode(iC)-1)+consVal(iC); % constraints, by overall DOF number end
K(consList,:) = [];
K(:,consList) = [];
F(consList) = []; reducedU = K\F;
26
% Before saving the final u, include the constrained DOF. They are all zero.
dat.u = zeros(3*nN,1); goodInd = setdiff(1:3*nN,consList); dat.u(goodInd) = reducedU;
27
function [x y s] = trussK(A,E,G,I,L,startInd)
% Build a combination bar-beam (truss) element, [u1 v1 theta1 u2 v2 theta2]
% Calculate k in a syntax appropriate for MATLAB's sparse matrix
% manipulations. Nonzero elements are presented in vectors x,y,s where
% (x(i),y(i)) = s(i).
% Use the Timoshenko beam formulation (Cook p. 27 eq. 2.3-7)
% L=1; E=1; G=1; I=1; A=1; startInd=1; % (debug) set inputs ky = 0; % 1.2 for solid rectangular sections phi = 12*E*I*ky/(A*G*L^2);
X = A*E/L;
Y1 = 12*E*I/((1+phi)*L^3);
Y2 = 6*E*I/((1+phi)*L^2);
Y3 = (4+phi)*E*I/((1+phi)*L);
Y4 = (2-phi)*E*I/((1+phi)*L);
% The code only handles elements connecting adjacent nodes, and we need to know
% the number of DOF (indices) to offset x = (startInd-1)+[1 1 4 4 2 2 2 2 3 3 3 3 5 5 5 5 6
6 6 6]'; y = (startInd-1)+[1 4 1 4 2 3 5 6 2 3 5 6 2 3 5 6 2
3 5 6]'; s = [X -X -X X Y1 Y2 -Y1 Y2 Y2 Y3 -Y2 Y4 -Y1 -Y2 Y1 -Y2 Y2
Y4 -Y2 Y3]';
28
function dat = calcDynamic(dat)
% Calculate the dynamic response given an input deck of the format
% described in quickDeck.m
%
% Functions called:
% quickDeck.m
% trussK.m
% trussM.m
if ~nargin % Use a default deck if not provided
close all ; clc
dat = quickDeck( 'canti' ); end
L = diff(dat.x); nE = length(L); % number of elements nN = nE+1; % number of nodes nf = length(dat.freq); % number of frequencies k = zeros(20*nE,1); % preallocate vectors to hold indices into K ky = k; kx = k; m = k; mx = k; my = k; for iE = 1:nE
startDof = 3*(iE-1)+1; % Starting degree of freedom...row (or column) of a 2D K
startInd = 20*(iE-1)+1; % Starting index for this section of indices to K
targInd = startInd:(startInd+19); % Where to store the next 16 terms
[lilKx,lilKy,lilK] = trussK(dat.A,dat.E,dat.G,dat.I,L(iE),startDof);
k(targInd) = lilK;
kx(targInd) = lilKx;
ky(targInd) = lilKy;
[lilMx,lilMy,lilM] = trussM(dat.rho,dat.A,L(iE),startDof);
m(targInd) = lilM;
mx(targInd) = lilMx;
my(targInd) = lilMy; end
K = sparse(kx,ky,k);
M = sparse(mx,my,m);
F = zeros(3*nN,1); loadNode = dat.load(:,1); loadForceX = dat.load(:,2); loadForceY = dat.load(:,3); loadMoment = dat.load(:,4);
F(loadNode*3-2) = loadForceX;
F(loadNode*3-1) = loadForceY;
F(loadNode*3) = loadMoment; consNode = dat.constraint(:,1); consVal = dat.constraint(:,2); consList = zeros(length(consNode),1); for iC = 1:length(consNode)
consList(iC) = 3*(consNode(iC)-1)+consVal(iC); % constraints, by overall DOF number end
29
K(consList,:) = [];
K(:,consList) = [];
M(consList,:) = [];
M(:,consList) = [];
F(consList) = [];
% Use complex stiffness to allow for damping
K = K * (1+dat.eta/100*i); opt.disp = 0; numEig = min(10,size(K,1)); try
[dat.phi dat.eig] = eigs(K,M,numEig, 'sm' ,opt);
dat.modalFreq = real(sqrt(diag(dat.eig))/2/pi); catch
dat.eig = 'Eigs failed' ;
dat.phi = 'Eigs failed' ; end
% Before saving the final u, include the constrained DOF. They are all zero.
dat.u = zeros(3*nN,nf); goodInd = setdiff(1:3*nN,consList); for iF = 1:nf
G = -(dat.freq(iF)*2*pi)^2*M + K;
reducedU = G\F;
dat.u(goodInd,iF) = reducedU; end
30
function [x y s] = trussM(rho,A,L,startInd)
% Build a combination bar-beam (truss) element, [u1 v1 theta1 u2 v2 theta2]
% Cook p. 377-380
%
% consistent mass matrix:
% m = m/420*[ 156 22*L 54 -13*L
% 22*L 4*L^2 13*L -3*L^2
% 54 13*L 156 -22*L
% -13*L -3*L^2 -22*L 4*L^2];
%
% lumped mass matrix:
% m = m*[0.5 L^2/24 0.5 L^2/24];
% where mass terms are applied at each node and thus lie on the diagonal
%
% Implementing a combination mass matrix, 0.5*lumped + 0.5*consistent,
% calculate m in a syntax appropriate for MATLAB's sparse matrix
% manipulations. Nonzero elements are presented in vectors x,y,s where
% (x(i),y(i)) = s(i).
% L=1; rho=1; A=1; startInd=1;
% The code only handles elements connecting adjacent nodes, and we need to know
% the number of DOF (indices) to offset x = (startInd-1)+[2 2 2 2 3 3 3 3 5 5 5 5 6 6 6 6]'; y = (startInd-1)+[2 3 5 6 2 3 5 6 2 3 5 6 2 3 5 6]';
% 1 2 3 4 5 6 7 8 raw = rho*A*L/840*[366 22*L 54 -13*L 21.5*L^2 13*L -3*L^2 -
22*L]'; % Calculate each number only once s = raw([1 2 3 4 2 5 6 7 3 6 1 8 4 7 8 5]); % Index our calculated list repeatedly
% 4 terms to handle extension x = [x; (startInd-1)+[1 1 4 4]']; y = [y; (startInd-1)+[1 4 1 4]']; raw = rho*A*L/12*[5 1]; s = [s; raw([1 2 2 1])'];
31
function dat = plotStatic(dat,freq,titleStr)
% Plots the results of a single deformation. For dynamic runs, optional argument
% freq plots the result at the nearest solved frequency and includes a
% small frequency response plot makeInternalFigure = true; % True to display the frequency plot within this figure; false to create a second figure if ~nargin
close all ; clc;
dat = calcDynamic(quickDeck( 'multi elem canti' )); % default deck end if size(dat.u,2) == 1 || nargin < 2 % If a static analysis
freqInd = 1;
freq = 0; else
freqInd = interp1(dat.freq,1:length(dat.freq),freq, 'nearest' ); if freq<dat.freq(1);freqInd=1; end ; if freq>dat.freq(end);freqInd=length(dat.freq); end ; end globalU = dat.u(1:3:end,freqInd); globalV = dat.u(2:3:end,freqInd); globalAlpha = dat.u(3:3:end,freqInd); if ~isfield(dat, 'hFig' ) % Plot deck if nargin<3; titleStr = '' ; end ;
dat = plotDeck(dat,max(abs(real([globalU(:); globalV(:)]))),titleStr); end nN = length(dat.x); % number of nodes nE = nN-1; % number of elements nDiv = 10; % number of points per element (omits first point in model) dat.h(5) = plot(dat.x'+globalU,real(globalV), 'b:' ); if size(dat.u,2) > 1 % If a dynamic analysis
newTitleStr = sprintf( '%s %.1f Hz' ,titleStr,dat.freq(freqInd));
title(newTitleStr) if makeInternalFigure
dat.ax(2) = axes( 'position' ,[0.55 0.2 0.3 0.25]);
box on else
dat.ax(2) = figure;
title(newTitleStr);
set(gca, 'xscale' , 'log' ); hold on ; end
semilogx(dat.freq,max(20*log10(abs(dat.u(1:2:end,:))),[],1)); hold on ;
xlabel( 'Frequency (Hz)' )
ylabel( 'Displacement (dB re. 1)' )
ax = axis;
plot([freq freq],ax(3:4), 'r-' ); grid on ; if ~makeInternalFigure
legend( 'Response' , 'Selected Frequency' ); end end dat.legendStr{5} = 'Displaced' ; legend(dat.h(dat.h~=0),dat.legendStr(dat.h~=0));
32
function dat = plotDeck(dat,maxVal,titleStr)
% Plots the input geometry and boundary conditions for a deck. Y-axis is
% scaled based on the maximum displacement in the model, thus, the input
% structure must contain a solution if ~nargin
close all ;
dat = calcStatic(quickDeck( 'multi elem canti' )); end if nargin < 2
globalV = dat.u(2:3:end,:);
maxVal = max(abs(globalV(:))); end
% Plot an input deck nN = length(dat.x); % number of nodes hFig = figure; axis([min(dat.x)-1 max(dat.x)+1 -3*maxVal 3*maxVal]); hold on ; dat.ax = gca; dat.h(1) = plot(dat.x,zeros(size(dat.x)), 'k.-' ); dat.constraint = sortrows(dat.constraint); consNode = dat.constraint(:,1); consVal = dat.constraint(:,2);
% For plotting purposes, when constraining both DOF use a unique symbol repeats = ~logical(diff(consNode));
% deltas will be 1 at repeated nodes since we sorted, and 1 element shorter
% than consNode. Delete one value and set the other to '3' consVal([false; repeats]) = 3; consVal([repeats; false]) = []; consNode = unique(consNode); if any(consVal==1)
temp = plot(dat.x(consNode(consVal==1)),0, 'r^' );
dat.h(2) = temp(1); % Save one handle only end if any(consVal==2)
temp = plot(dat.x(consNode(consVal==2)),0, 'ro' );
dat.h(3) = temp(1); end if any(consVal==3) % We have a clamped node
temp = plot(dat.x(consNode(consVal==3)),0, 'rx' , 'markersize' ,12);
dat.h(4) = temp(1); end dat.legendStr = { 'Elements' , 'Pinned' , 'Roller' , 'Clamped' }; legend(dat.h(dat.h~=0),dat.legendStr(dat.h~=0)); xlabel( 'Length' ) ylabel( 'Displacement' ) if nargin==3
title(titleStr); end dat.load = sortrows(dat.load); loadNode = dat.load(:,1); loadForce = dat.load(:,2); loadMoment = dat.load(:,3); blank = zeros(size(loadNode)); if any(loadForce)
quiver(dat.x(loadNode),blank,blank,0.2*sign(loadForce)) end
33
function dat = animDynamic(dat)
% Sweep through the displaced shapes of a dynamic run if ~nargin
close all ; clc;
dat = calcDynamic(quickDeck( 'exper12' )); % default deck end if ~isfield(dat, 'hFig' ) % Plot deck if
dat = plotDeck(dat,eps); end nN = length(dat.x); % number of nodes nE = nN-1; % number of elements nDiv = 10; % number of points per element (omits first point in model) globalU = dat.u(1:3:end,:); globalV = dat.u(2:3:end,:); globalAlpha = dat.u(3:3:end,:); dat.h(5) = plot(dat.x'+real(globalU(:,1)),real(globalV(:,1)), 'b:' ); ax = axis; yLim = ax(4); dat.legendStr{5} = 'Displaced' ; legend(dat.h(dat.h~=0),dat.legendStr(dat.h~=0)); hTitle = title(sprintf( '%g Hz' ,dat.freq(1))); axis auto
% pauseLen = 0.01; for iF = 1:size(globalU,2);
newV = real(globalV(:,iF)); if yLim < 1.1*max(abs(newV))
yLim = 2*max(abs(newV));
axis([ax(1:2) -yLim yLim]); end if yLim > 4*max(abs(newV)) && yLim > 0.05
yLim = max([0.05 1.5*max(abs(newV))]);
axis([ax(1:2) -yLim yLim]); end
set(dat.h(5), 'yData' ,newV);
set(hTitle, 'string' ,sprintf( '%g Hz' ,round(10*dat.freq(iF))/10));
drawnow;
% pause(pauseLen); end
34