|
| 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