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

CONTENTS

LIST OF TABLES ............................................................................................................ iv

LIST OF FIGURES ........................................................................................................... v

LIST OF SYMBOLS ........................................................................................................ vi

ACKNOWLEDGMENT ................................................................................................. vii

ABSTRACT ................................................................................................................... viii

1. Introduction .................................................................................................................. 1

2. Theory and Methodology ............................................................................................ 2

2.1 Static analysis – cantilevered beam.................................................................... 2

2.1.1 Analytic solution .................................................................................... 2

2.1.2 Finite element solution ........................................................................... 3

2.2 Dynamic analysis – cantilevered beam .............................................................. 4

2.2.1 Analytic solution .................................................................................... 4

2.2.2 Finite element solution ........................................................................... 5

3. Results.......................................................................................................................... 6

3.1 Static analysis – cantilevered beam.................................................................... 6

3.2 Dynamic analysis – cantilevered beam .............................................................. 8

3.3 Dynamic analysis – 3-bay beam ...................................................................... 10

4. Conclusion ................................................................................................................. 20

5. References .................................................................................................................. 21

Appendix A MATLAB Scripts ........................................................................................ 22

iii

LIST OF TABLES

Table 1: Cantilevered Beam Properties ............................................................................. 6

Table 2: 3-bay Beam Properties ...................................................................................... 11

iv

LIST OF FIGURES

Figure 1: End-loaded Cantilevered Beam .......................................................................... 3

Figure 2: Static Cantilevered Beam – 1 Element ............................................................... 7

Figure 3: Static Cantilevered Beam – Multi-element ........................................................ 7

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 8: 3-bay Beam – Schematic .................................................................................. 11

Figure 9: 3-bay Beam – COMSOL – 1 st

Mode................................................................ 12

Figure 10: 3-bay Beam – 1 st

Mode .................................................................................. 12

Figure 11: 3-bay Beam – COMSOL – 2 nd

Mode ............................................................. 13

Figure 12: 3-bay Beam – 2 nd

Mode ................................................................................. 14

Figure 13: 3-bay Beam – COMSOL – 3 rd

Mode ............................................................. 15

Figure 14: 3-bay Beam – 3 rd

Mode .................................................................................. 15

Figure 15: 3-bay Beam – COMSOL – 4 th

Mode ............................................................. 16

Figure 16: 3-bay Beam – 4 th

Mode .................................................................................. 17

Figure 17: 3-bay Beam – Beam Response – Isometric .................................................... 18

Figure 18: 3-bay Beam – Beam Response ....................................................................... 19

v

LIST OF SYMBOLS

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

ACKNOWLEDGMENT

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

ABSTRACT

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

1.

Introduction

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

2.

Theory and Methodology

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.

2.1

Static analysis – cantilevered beam

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.

2.2

Dynamic analysis – cantilevered beam

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

3.

Results

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.

3.1

Static analysis – cantilevered beam

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

3.2

Dynamic analysis – cantilevered beam

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

3.3

Dynamic analysis – 3-bay beam

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.

657 [5].

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

103.6 Hz and 99.8 Hz [5].

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

151.4 Hz and 143.2 Hz [5].

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

4.

Conclusion

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

5.

References

[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

Appendix A MATLAB Scripts

% 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