Wind load hitting skyscrapers
by Thomas Stoll and Klaus Thni,
Students at Technical University Graz, Austria,
skyscraper_2001@hotmail.com ,
2001 Stoll, Thni
NOTE: This worksheet demonstrates the use of Maple for calculating and animating uniform wind loads hitting skyscrapers of arbitrary height. The authors expect that this worksheet will only be used for teaching and educational purposes, for instance in civil engineering.
Introduction
Consider the case of a skyscraper being affected by a uniform wind load. We assume that the ceilings of the floors are rigid and the corresponding columns have no mass, so that the vibration is just caused by inner elastic reaction forces of the columns. Further, we suppose that all ceilings have the same mass and are homogeneous.
> restart;
Initialisation
Loading of the packages
> with(linalg): with(plots): with(plottools):
Warning, the protected names norm and trace have been redefined and unprotected
Warning, the name changecoords has been redefined
Warning, the name arrow has been redefined
Setting the parameters
Number of levels:
> n:=7:
Number of single pictures in animation sequence:
> numpict:=50:
Period of time between two single pictures:
> dtime:=2.6/numpict:
Initial conditions
> iq:=vector(n-1,[seq(1,i=2..n)]): iqv:=vector(n-1,[seq(0,i=2..n)]):
Description of the mechanical system
Involved matrices
Mass matix:
> M:=diag(seq(10^6,i=2..n)):
Stiffness matrix:
> S:=matrix(n-1,n-1,0): S[n-1,n-1]:=10^7: for i from 1 to n-2 do S[i,i]:=2*10^7; S[i,i+1]:=-10^7; S[i+1,i]:=-10^7; od:
Eigenvalues and Eigenvectors
Frequencies of the free vibrations:
> invM:=diag(seq(1/10^5,i=2..n)): A:=evalm(invM&*S): lambda:=evalf(Eigenvals(A,vecs)): omega:=sort([seq(abs(lambda[i])^(1/2),i=1..n-1)],`<`);
Modal matrix (matrix of Eigenvects):
> Ubar:=convert(vecs,matrix):
Explicit solution of displacement functions
> const:=linsolve(Ubar,iq):
Displacement functions x[i] (i=1..n):
> x[1]:=0: for i from 1 to n-1 do for j from 1 to n-1 do ampl[i,j]:=Ubar[i,j]*const[j]; od; x[i+1]:=sum(ampl[i,k]*cos(omega[k]*t),k=1..n-1); od:
Visualization of the n solutions x[i] (i=1..n):
> plot([seq(x[i],i=1..n)],t=0..6);
Animation
Components
Coloring functions: Great stress of a column is expressed by a darker color of the neighbouring ceilings:
> cfnc_b := x->.21*x+0.5:
Calculating the position of the solutions on equidistant time intervals:
> for i from 1 to n do yact[i]:=3*(i-1); for j from 0 to numpict-1 do xact[i,j]:=evalf(subs(t=dtime*j,x[i])); od; od:
Calculating the relative displacement of two ceilings:
> for j from 0 to numpict-1 do for i from 2 to n-1 do rel[i,j]:=max(abs(xact[i-1,j]-xact[i,j]), abs(xact[i+1,j]-xact[i,j])); od: rel[1,j]:=abs(xact[1,j]); rel[n,j]:=abs(xact[n,j]-xact[n-1,j]); od:
Axis of the building:
> ax:=line([0,-3],[0,3*n-1.5],linestyle=4,color=red):
Ground:
> xpl:=1.1*Ubar[n-1,1]/Ubar[1,1]+5: P0:=[xpl,0]: P1:=[-xpl,0]: P2:=[-xpl,-1.5]: P3:=[xpl,-1.5]: ground:=POLYGONS([P0,P1,P2,P3], COLOR(HUE,0.13), STYLE(PATCHNOGRID)): groundline:=line(P0,P1,thickness=2,color=black):
Calculating the coordinates of the column deflection splines, the antenna, the ceilings and of the windows, respectively:
> for j from 0 to numpict-1 do # column splines: for i from 1 to n-1 do unassign('a','b','c','d'); sols1:= solve({xact[i,j]=a*yact[i]^3+b*yact[i]^2+c*yact[i]+d, xact[i+1,j]=a*(yact[i+1]-0.5)^3+b*(yact[i+1]-0.5)^2+c*(yact[i+1]-0.5)+d, 0=3*a*yact[i]^2+2*b*yact[i]+c, 0=3*a*(yact[i+1]-0.5)^2+2*b*(yact[i+1]-0.5)+c},{a,b,c,d}); assign(sols1); stplot[i,j]:= plot([a*y^3+b*y^2+c*y+d-5,y,y=yact[i]..yact[i+1]-0.5],color=black,thickness=1), plot([a*y^3+b*y^2+c*y+d-4.7,y,y=yact[i]..yact[i+1]-0.5],color=black,thickness=1), plot([a*y^3+b*y^2+c*y+d+5,y,y=yact[i]..yact[i+1]-0.5],color=black,thickness=1), plot([a*y^3+b*y^2+c*y+d+4.7,y,y=yact[i]..yact[i+1]-0.5],color=black,thickness=1): od; # antenna: if (j+1)*dtime>=0.88 then antenna[j]:=line([xact[n,j]+4,yact[n]], [xact[n,j]+4,yact[n]+0.65],thickness=2), line([xact[n,j]+3.1,yact[n]+0.55], [xact[n,j]+4,yact[n]+0.65],thickness=2), line([xact[n,j]+3.6,yact[n]+0.1], [xact[n,j]+4.1,yact[n]+1.1]), line([xact[n,j]+3.45,yact[n]+0.3], [xact[n,j]+3.5,yact[n]+0.9]), line([xact[n,j]+3.2,yact[n]+0.1], [xact[n,j]+3.0,yact[n]+1.1]); else antenna[j]:=line([xact[n,j]+4,yact[n]], [xact[n,j]+4,yact[n]+1.5],thickness=2), line([xact[n,j]+3.5,yact[n]+0.75], [xact[n,j]+4.5,yact[n]+0.75]), line([xact[n,j]+3.7,yact[n]+1.125], [xact[n,j]+4.3,yact[n]+1.125]), line([xact[n,j]+3.5,yact[n]+1.5], [xact[n,j]+4.5,yact[n]+1.5]); fi; # ceilings, window: for i from 1 to n do PLSt[i,j]:=POLYGONS([[xact[i,j]-5,yact[i]-0.5], [xact[i,j]+5,yact[i]-0.5], [xact[i,j]+5,yact[i]], [xact[i,j]-5,yact[i]]], COLOR(HUE,cfnc_b(rel[i,j])), THICKNESS(1)); PLStw[i,j]:=seq(POLYGONS([[xact[i,j]+k*2.5-0.8,yact[i]-0.75], [xact[i,j]+2.5*k+0.8,yact[i]-0.75], [xact[i-1,j]+2.5*k+0.8,yact[i]-1.95], [xact[i-1,j]+2.5*k-0.8,yact[i]-1.95]], THICKNESS(2)), k=-1..1); od; od:
Display animation
> display([seq(display([ ax, seq(PLSt[i,j],i=1..n), seq(PLStw[i,j],i=2..n), seq(stplot[i,j],i=1..n-1), antenna[j], groundline, ground]), j=0..numpict-1)], axes=none, scaling=constrained, view=[-xpl..xpl,-1.5..3*n-1.5], insequence=true, title=`Wind load hitting Skyscraper`);
>
References
[1] Gasch/Knothe: Strukturdynamik, Diskrete Systeme, Band 1, Springer, 1987 [2] Flesch: Baudynamik, praxisgerecht, Band 1. Bauverlag, 1993 [3] Greimel/Bauer: Lectures notes, TU Graz, 2001
Disclaimer: While every effort has been made to validate the solutions in this worksheet, Waterloo Maple Inc. and the contributors are not responsible for any errors contained and are not liable for any damages resulting from the use of this material.