Skip to content

Commit 1071301

Browse files
authored
Add files via upload
1 parent 7506c8a commit 1071301

File tree

5 files changed

+569
-0
lines changed

5 files changed

+569
-0
lines changed

Validation.mlx

55.6 KB
Binary file not shown.

Verificatin.mlx

147 KB
Binary file not shown.

eigBridge_Verification.m

+173
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
function [w_a,w_s,phi_a,phi_s] = eigBridge_Verification(mu,lambda,Nmodes,x)
2+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4+
5+
% GOAL: Compute the non-dimensional eigen frequencies and mode shapes
6+
% following [1], as a verification procedure
7+
8+
% [1] Luco, J. E., & Turmo, J. (2010).
9+
% Linear vertical vibrations of suspension bridges:
10+
% A review of continuum models and some new results.
11+
% Soil Dynamics and Earthquake Engineering,
12+
% 30(9), 769-781.
13+
14+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15+
16+
% INPUTS:
17+
18+
% mu: positive scalar: relative bending stifness of the girder
19+
% lambda: positive scalar: Irvine-Caughy vable parameter
20+
% Nmodes: positive natural: Number of modes to be computed (< 6 )
21+
% x: vector [1 x Nyy] Non-dimensional bridge span discretized in Nyy points
22+
23+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
24+
25+
% OUTPUTS
26+
27+
28+
% w_s: non dimensional symmetric eigen frequencies
29+
% w_a: non dimensional asymmetric eigen frequencies
30+
% phi_s: normalized symmetric mode shapes
31+
% phi_a: normalized asymmetric mode shapes
32+
33+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34+
% Author: Etienne Cheynet -- last modified: 26/12/2015
35+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
36+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37+
38+
%% INITIALISATION
39+
% Number of integration points
40+
Nyy = numel(x);
41+
% non-dimensionla pulsation
42+
CST = (2*pi*[1:1:Nmodes]);
43+
44+
%% Antisymmetric eigen frequencies and mode shapes
45+
% egien-frequencies
46+
w_a = CST.*sqrt(1+(CST.*mu).^2);
47+
% mode shapes
48+
phi_a = sin(2*pi.*[1:1:Nmodes]'*x);
49+
50+
%% Symmetric eigen frequencies and mode shapes
51+
52+
% Here there are 2 steps:
53+
% 1) Solve a characteristic equation to find w
54+
% 2) Report omega into the analytical expression of the mode shape
55+
56+
% 1) Solve the characteristic equation
57+
% Nmber of solutions Nsol: be careful not to choose too many modes !
58+
Nsol = max(200,Nmodes^3);
59+
dummy = zeros(1,Nsol);
60+
% check matlab version
61+
checkMatlabVersion = version;
62+
63+
% First, we need too check if lambda is not too close to zero,
64+
% i.e. below 0.1. Otherwise it is assumed to be an inelastic cable.
65+
if lambda >0.1,
66+
if str2double(checkMatlabVersion(end-5:end-2))<=2012, % R2012b or earlier
67+
for ii=1:Nsol,
68+
dummy(ii) =fsolve(@(w) charFun(w,mu,lambda),ii,...
69+
optimset('Display','off','TolFun', 1e-8, 'TolX', 1e-8));
70+
end
71+
elseif str2double(checkMatlabVersion(end-5:end-2))>=2013, % R2013a or later
72+
for ii=1:Nsol,
73+
dummy(ii) =fsolve(@(w) charFun(w,mu,lambda),ii,...
74+
optimoptions('fsolve','Display','off',...
75+
'TolFun', 1e-8, 'TolX', 1e-8));
76+
end
77+
end
78+
79+
% Analytically, many solutions are identical to each other,
80+
% but numerically, it is not the case.
81+
% Therefore I need to limit the prceision of the solutions to 1e-3.
82+
dummy = unique(round(dummy*1e3).*1e-3);
83+
% remove the first solution that is found to be meaningless
84+
dummy(dummy<1e-1)=[];
85+
% Check if any issues:
86+
if isempty(dummy), % no solutions found
87+
warning('no mode shapes found');
88+
w_a =NaN(1,Nmodes);
89+
w_s =NaN(1,Nmodes);
90+
phi_a=NaN(Nmodes,Nyy);
91+
phi_s=NaN(Nmodes,Nyy);
92+
return
93+
elseif numel(dummy)<Nmodes, % less solutions than Nmodes found
94+
warning('not enough mode shapes found');
95+
w_a =NaN(1,Nmodes);
96+
w_s =NaN(1,Nmodes);
97+
phi_a=NaN(Nmodes,Nyy);
98+
phi_s=NaN(Nmodes,Nyy);
99+
return
100+
end
101+
% Limit the number of solutions to Nmodes
102+
w_s=dummy(1:Nmodes);
103+
% Get the mode shapes
104+
phi_s = zeros(Nmodes,Nyy);
105+
for ii=1:Nmodes
106+
[phi_s(ii,:)] = modeShapeFun(x,mu,lambda,w_s(ii));
107+
end
108+
else % case of an inelastic cable, i.e. lambda = 0
109+
N = 2.*[1:1:Nmodes]-1;
110+
dummy = N.*pi.*sqrt(1+(N.*pi.*mu).^2);
111+
w_s=dummy(1:Nmodes); % eigen-frequencies
112+
phi_s = sin(N'*x.*pi); % mode shapes
113+
end
114+
115+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
116+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
117+
%% Nested functions
118+
function H = charFun(w,mu,lambda)
119+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
120+
% GOAL: choose the corresponding characteristic equation
121+
% INPUT
122+
% w: Non dimensional eigen frequency (unknown)
123+
% mu: positive scalar: relative bending stifness of the girder
124+
% lambda: positive scalar: Irvine-Caughy vable parameter
125+
% OUTPUT: H: Characteristic equation to be solved for w
126+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
127+
if mu<=1e-6, % case of a perfectly flexible deck (limit case)
128+
H = 1-(w/lambda).^2-tan(w/2)/(w/2);
129+
elseif mu>=1e6, % very stiff deck ( limit case)
130+
A = sqrt((sqrt(1+(2*mu*w).^2)-1)/(2*mu^2));
131+
H = 1-(A*mu/lambda).^2-(1/2)*tan(A/2)/(A/2)-...
132+
(1/2)*tanh(A/2)/(A/2);
133+
else % case of deck usually met
134+
A = sqrt((sqrt(1+(2*mu*w).^2)-1)/(2*mu^2));
135+
B = sqrt((sqrt(1+(2*mu*w).^2)+1)/(2*mu^2));
136+
H = 1-(w/lambda).^2-(B^2/(A^2+B^2))*tan(A/2)/(A/2)-...
137+
(A^2/(A^2+B^2))*tanh(B/2)/(B/2);
138+
end
139+
end
140+
141+
function [phi] = modeShapeFun(x,mu,lambda,omega)
142+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
143+
% GOAL: calculate the mode shapes
144+
% INPUT
145+
% x: [1 x Nyy] vector of non-dimensional deck span
146+
% mu: positive scalar: relative bending stifness of the girder
147+
% lambda: positive scalar: Irvine-Caughy vable parameter
148+
% omega: Non dimensional eigen frequency (it is now known)
149+
% OUTPUT: phi: [1 x Nyy] vector of mode shape
150+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
151+
if mu<=1e-6, % case of a perfectly flexible deck (limit case)
152+
dummyPhi = (lambda.*omega).^2.*(1-cos(omega*(x-1/2))/cos(omega/2));
153+
phi = dummyPhi./max(abs(dummyPhi));% normalization
154+
elseif mu>=1e6, % very stiff deck ( limit case)
155+
A = sqrt((sqrt(1+(2*mu*omega).^2)-1)/(2*mu^2));
156+
dummyPhi = (1-0.5*cos(A*(x-1/2))/cos(A/2)-...
157+
0.5*cosh(A*(x-1/2))/cosh(A/2));
158+
phi = dummyPhi./max(abs(dummyPhi));% normalization
159+
else % case of deck usually met
160+
A = sqrt((sqrt(1+(2*mu*omega).^2)-1)/(2*mu^2));
161+
B = sqrt((sqrt(1+(2*mu*omega).^2)+1)/(2*mu^2));
162+
dummyPhi = (lambda.*omega).^2.*(1-(B.^2/(A.^2+B.^2))*cos(A*(x-1/2))/cos(A/2)-...
163+
(A.^2/(A.^2+B.^2))*cosh(B*(x-1/2))/cosh(B/2));
164+
phi = dummyPhi./max(abs(dummyPhi)); % normalization
165+
end
166+
if abs(min(phi))>max(phi),
167+
phi=-phi; % positiv maximum
168+
end
169+
end
170+
171+
172+
end
173+

eigenBridge.m

+223
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
function [wn,phi,phi_cables] = eigenBridge(Bridge,Nmodes)
2+
% function [wn,phi,phi_cables] = eigenBridge(Bridge) computes
3+
% the mode shape and eigen-frequency of a single-span suspension bridge.
4+
% It is designed to be fast and straitghforward, although it might slightly
5+
% less accurate than a Finite element model.
6+
%
7+
% INPUT:
8+
% Bridge: type: structure (see file studyCase.m)
9+
% Nyy: type: float [1 x 1] : number of "nodes" consituting the deck
10+
% Nmodes: type: float [1 x 1] : number of "modes" to be computed
11+
%
12+
% OUTPUT
13+
% wn: type: 2D matrix [3 x Nmodes] : eigen-modes of the suspension bridge
14+
% wn(1,:) --> all the eigen-frequencies for the lateral displacement (x axis)
15+
% wn(2,:) --> all the eigen-frequencies for the vertical displacement (z axis)
16+
% wn(3,:) --> all the eigen-frequencies for the torsional angle (around y axis)
17+
%
18+
% phi: type: 3D matrix [3 x Nmodes x Nyy] : modes shapes of the bridge girder ( =deck)
19+
% phi(1,i,:) --> mode shape for the i-th eigen frequency for the lateral
20+
% bridge displacement ( x axis)
21+
% phi(2,i,:) --> mode shape for the i-th eigen frequency for the vertical
22+
% bridge displacement ( z axis)
23+
% phi(3,i,:) --> mode shape for the i-th eigen frequency for the torsional
24+
% bridge angle (around y axis)
25+
%
26+
% phi_cables: type: 2D matrix [Nmodes x Nyy]:
27+
% modes shapes of the bridge main cables along x axis. No mode
28+
% shapes for vertical and torsional motion of the cable are calculated.
29+
%
30+
% Author info:
31+
% E. Cheynet , University of Stavanger. last modified: 31/12/2016
32+
%
33+
% see also LysefjordBridge hardangerBridge
34+
%
35+
36+
%%
37+
% preallocation
38+
if isfield(Bridge,'Nyy')
39+
Nyy = Bridge.Nyy;
40+
else
41+
error(' ''Nyy'' is not a field of the structure ''Bridge'' ')
42+
end
43+
44+
if isfield(Bridge,'ec') && isfield(Bridge,'sag')
45+
Bridge.sag = Bridge.ec;
46+
end
47+
48+
wn = zeros(3,Nmodes); % eigen frequency matrix
49+
phi = zeros(3,Nmodes,Nyy); % mode shapes of bridge girder
50+
phi_cables = zeros(Nmodes,Nyy); % mode shapes of cables
51+
52+
% discretisation of bridge span
53+
x = linspace(0,Bridge.L,Nyy); % vector bridge span
54+
x = x./Bridge.L ;% reduced length
55+
56+
57+
%% LATERAL MOTION
58+
% preallocation
59+
alpha = zeros(2*Nmodes,2*Nmodes); % reduced variable
60+
beta = zeros(2*Nmodes,2*Nmodes); % reduced variable
61+
gamma = zeros(2*Nmodes,2*Nmodes); % reduced variable
62+
63+
m_tilt= Bridge.m;
64+
mc_tilt = 2.*Bridge.mc;
65+
66+
% calculation of alpha, beta and gamma
67+
% alpha and beta
68+
% cf E.N. Strømmen "STRUCTURAL DYNAMICS" for explanations
69+
for nn=1:2*Nmodes,
70+
alpha(nn,nn) = (Bridge.E.*Bridge.Iz).*(nn*pi./Bridge.L).^4;
71+
beta(nn,nn) = 2*Bridge.H_cable.*(nn*pi./Bridge.L).^2;
72+
end
73+
74+
% gamma
75+
% cf E.N. Strømmen "STRUCTURAL DYNAMICS" for explanations
76+
for pp=1:2*Nmodes,
77+
for nn=1:2*Nmodes,
78+
if and(rem(pp,2)==1,rem(nn,2)==0)||and(rem(pp,2)==0,rem(nn,2)==1)
79+
gamma(pp,nn)=0;
80+
else
81+
gamma(pp,nn)= 2*Bridge.m*Bridge.g/(Bridge.L*Bridge.sag).*trapz(x.*Bridge.L,sin(pp.*pi.*x).*sin(nn.*pi.*x)./...
82+
(1+Bridge.hm/Bridge.sag-4.*(x).*(1-x)));
83+
end
84+
end
85+
end
86+
87+
% matrix mass
88+
M = diag(repmat([m_tilt;mc_tilt],[Nmodes,1]));
89+
90+
% Matrix stiwness K
91+
for p=1:2:2*Nmodes,
92+
for nn=1:2:2*Nmodes,
93+
if p==nn,
94+
clear Omega
95+
Omega(1,1) = alpha((p+1)/2,(nn+1)/2)+gamma((p+1)/2,(nn+1)/2);
96+
Omega(1,2) = -gamma((p+1)/2,(nn+1)/2);
97+
Omega(2,1) = -gamma((p+1)/2,(nn+1)/2);
98+
Omega(2,2) = beta((p+1)/2,(nn+1)/2)+gamma((p+1)/2,(nn+1)/2);
99+
K(p:p+1,nn:nn+1) = Omega;
100+
else
101+
clear V
102+
V = gamma((p+1)/2,(nn+1)/2).*[1,-1;-1,1];
103+
K(p:p+1,nn:nn+1) = V;
104+
end
105+
end
106+
end
107+
108+
% eigen-value problem solved for non-trivial solutions
109+
[vector,lambda]=eig(K,M,'chol');
110+
111+
wn(1,:) = sqrt(diag(lambda(1:Nmodes,1:Nmodes))); % filling the matrix wn
112+
113+
% Normalization
114+
for ii=1:Nmodes,
115+
% deck mode shape construction using series expansion
116+
phi(1,ii,:) = vector(1:2:end,ii)'*sin([1:1:Nmodes]'.*pi*x);
117+
% cables mode shape construction using series expansion
118+
phi_cables(ii,:) = vector(2:2:end,ii)'*sin([1:1:Nmodes]'.*pi*x);
119+
120+
modeMax = max([max(abs(phi_cables(ii,:))),max(abs(phi(1,ii,:)))]);
121+
phi(1,ii,:) = phi(1,ii,:)./modeMax; % normalisation
122+
phi_cables(ii,:) = phi_cables(ii,:)./modeMax; % normalisation
123+
end
124+
125+
126+
%% VERTICAL MOTION
127+
128+
clear K M
129+
% INITIALISATION
130+
kappa = zeros(Nmodes,Nmodes); %reduced variable
131+
lambda = zeros(Nmodes,Nmodes); %reduced variable
132+
mu = zeros(Nmodes,Nmodes); %reduced variable
133+
134+
le = Bridge.L*(1+8*(Bridge.sag/Bridge.L)^2); % effective length
135+
% cf page 124 "STRUCTURAL DYNAMICS" of E.N. Strømmen
136+
137+
for nn=1:Nmodes,
138+
kappa(nn,nn) = Bridge.E*Bridge.Iy.*(nn*pi./Bridge.L).^4;
139+
lambda(nn,nn) = 2*Bridge.H_cable.*(nn*pi./Bridge.L).^2;
140+
end
141+
142+
for p=1:Nmodes,
143+
for nn=1:Nmodes,
144+
if and(rem(p,2)==1,rem(nn,2)==1) % sont impaires
145+
mu(p,nn)=(32*Bridge.sag/(pi*Bridge.L)).^2*(Bridge.Ec*Bridge.Ac)/(Bridge.L*le)/(p*nn);
146+
else
147+
mu(p,nn)= 0;
148+
end
149+
end
150+
end
151+
152+
M = (2*Bridge.mc+Bridge.m).*eye(Nmodes); % mass matrix
153+
K= kappa+lambda +mu; % stiwness matrix
154+
155+
156+
% eigen-value problem solved for non-trivial solutions
157+
[vector,lambda]=eig(K,M,'chol');
158+
159+
wn(2,:) = sqrt(diag(lambda(1:Nmodes,1:Nmodes))); % filling of matrix wn
160+
161+
for ii=1:Nmodes,
162+
phi(2,ii,:) = vector(1:Nmodes,ii)'*sin([1:Nmodes]'.*pi*x); % mode shape construction using series expansion
163+
phi(2,ii,:) = phi(2,ii,:)./max(abs(phi(2,ii,:))); % normalisation
164+
end
165+
166+
%% TORSIONAL MOTION
167+
168+
clear K M
169+
omega = zeros(Nmodes,Nmodes);
170+
v = zeros(Nmodes,Nmodes);
171+
V = zeros(Nmodes,Nmodes);
172+
xi = zeros(Nmodes,Nmodes);
173+
m_tilt_theta_tot = zeros(Nmodes,Nmodes);
174+
m_tilt = 2*Bridge.mc+Bridge.m;
175+
176+
177+
m_theta_tot = Bridge.m_theta + Bridge.mc*(Bridge.bc^2/2);
178+
179+
for nn=1:Nmodes,
180+
omega(nn,nn) = (nn*pi./Bridge.L).^2.*(Bridge.GIt+(nn*pi/Bridge.L)^2*(Bridge.E*Bridge.Iw));
181+
V(nn,nn) = Bridge.H_cable * (Bridge.bc^2/2)*(nn*pi./Bridge.L).^2;
182+
v(nn,nn) = (m_tilt)*Bridge.g*Bridge.hr;
183+
m_tilt_theta_tot(nn,nn) = m_theta_tot;
184+
end
185+
186+
for p=1:Nmodes,
187+
for nn=1:Nmodes,
188+
if and(rem(p,2)==1,rem(nn,2)==1) % sont impaires
189+
xi(p,nn)=(16*Bridge.sag*Bridge.bc/(pi*Bridge.L)).^2*Bridge.Ec*Bridge.Ac/(Bridge.L*le)*1/(p*nn);
190+
else
191+
xi(p,nn)= 0;
192+
end
193+
end
194+
end
195+
196+
197+
K= omega+V+v+xi; % stiwness matrix
198+
M = diag(diag(m_tilt_theta_tot)); % mass matrix
199+
200+
% eigen-value problem solved for non-trivial solutions
201+
[vector,lambda]=eig(K,M,'chol');
202+
wn(3,:) = sqrt(diag(lambda(1:Nmodes,1:Nmodes))); % filling the wn matrix
203+
204+
for ii=1:Nmodes,
205+
phi(3,ii,:) = vector(1:Nmodes,ii)'*sin([1:Nmodes]'.*pi*x); % mode shape construction using series expansion
206+
phi(3,ii,:) = phi(3,ii,:)./max(abs(phi(3,ii,:))); % normalisation
207+
end
208+
209+
210+
% positiv max value
211+
for ii=1:3,
212+
for jj=1:Nmodes,
213+
if abs(min(squeeze(phi(ii,jj,:))))> abs(max(squeeze(phi(ii,jj,:)))),
214+
phi(ii,jj,:)=-phi(ii,jj,:);
215+
end
216+
end
217+
end
218+
219+
220+
221+
222+
end
223+

0 commit comments

Comments
 (0)