The .exe file found in this section is an executable program and can be run from your computer after download is complete.
The computational scheme for laminated plate calculations outlines in Module 15 has been coded in Fortran as listed below. A PC-executable version is also available.
Fortran Source
c plate - a prompt-driven routine for laminated plate calculations dimension S(3,3),Sbar(3,3),Qbar(3,3),E(6,7),kwa(6), * T(3,3),Tinv(3,3),R(3,3),Rinv(3,3),Et(6,6), * temp1(3,3),temp2(3,3),temp3(3,3), * eps0(3),xkappa(3),sigbar(3),sig(3),vtemp1(3), * vtemp2(3),E1(10),E2(10),Gnu12(10),G12(10),thk(10), * z(21),mat(20),theta(20),Qsave(3,3,20),Tsave(3,3,20) data R/1.,3*0.,1.,3*0.,2./,Rinv/1.,3*0.,1.,3*0.,.5/, * E/42*0./ c———————————————————————- c input material set selections i=1 10 write(6,20) i 20 format (’ assign properties for lamina type ‘,i2,’…’/) write(6,*) ’enter modulus in fiber direction…’ write(6,*) ’ (enter -1 to stop): ' read (5,*) E1(i) if (E1(i) .lt. 0.) go to 30 write(6,*) ’enter modulus in transverse direction: ' read (5,*) E2(i) write(6,*) ’enter principal Poisson ratio: ' read (5,*) Gnu12(i) c check for isotropy check=abs((E1(i)-E2(i))/E1(i)) if (check.lt.0.001) then G12(i)=E1(i)/(2.*(1.+Gnu12(i))) else write(6,*) ’enter shear modulus: ' read (5,*) G12(i) end if write(6,*) ’enter ply thickness: ' read (5,*) thk(i) i=i+1 go to 10 c———————————————————————- c define layup 30 iply=1 z(1)=0. write(6,*) ‘define layup sequence, starting at bottom…’ write(6,*) ’ (use negative material set number to stop)' 40 write (6,50) iply 50 format (/’ enter material set number for ply number’,i3,’: ‘) read (5,*) m if (m.lt.0) go to 60 mat(iply)=m write(6,*) ’enter ply angle: ' read (5,*) theta(iply) z(iply+1)=z(iply)+thk(m) iply=iply+1 go to 40 c compute boundary coordinates (measured from centerline) 60 thick=z(iply) N = iply-1 z0 = thick/2. np1=N+1 do 70 i=1,np1 z(i)=z(i)-z0 70 continue c———————————————————————- c———————————————————————- c loop over plies, form stiffness matrix do 110 iply=1,N m=mat(iply) c form lamina compliance in 1-2 directions (Eqn. 3.55) S(1,1) = 1./E1(m) S(2,1) = -Gnu12(m) / E1(m) S(3,1) = 0. S(1,2) = S(2,1) S(2,2) = 1./E2(m) S(3,2) = 0. S(1,3) = 0. S(2,3) = 0. S(3,3) = 1./G12(m) c———————————————————————- c transform to x-y axes c obtain transformation matrix T (Eqn. 3.27) thet = theta(iply) * 3.14159/180. sc = sin(thet)*cos(thet) s2 = (sin(thet))**2 c2 = (cos(thet))**2 T(1,1) = c2 T(2,1) = s2 T(3,1) = -1.*sc T(1,2) = s2 T(2,2) = c2 T(3,2) = sc T(1,3) = 2.*sc T(2,3) = -2.*sc T(3,3) = c2 - s2 c inverse transformation matrix Tinv(1,1) = c2 Tinv(2,1) = s2 Tinv(3,1) = sc Tinv(1,2) = s2 Tinv(2,2) = c2 Tinv(3,2) = -1.*sc Tinv(1,3) = -2.*sc Tinv(2,3) = 2.*sc Tinv(3,3) = c2 - s2 c transformation [Sbar] = [R][T]-1[R]-1[S][T] (Eqn. 3.56) call matmul (3,3,3,3,3,3,R,Tinv,temp1) call matmul (3,3,3,3,3,3,temp1,Rinv,temp2) call matmul (3,3,3,3,3,3,temp2,S,temp3) call matmul (3,3,3,3,3,3,temp3,T,Sbar) c———————————————————————- c invert Sbar (transformed compliance matrix) to obtain c Qbar (transformed stiffness matrix) c start by setting Qbar = Sbar, then call inversion routine do 80 i=1,3 do 80 j=1,3 Qbar(i,j)=Sbar(i,j) 80 continue call matinv(isol,idsol,3,3,Qbar,3,kwa,det) c save Qbar and Tinv matrices do 90 i=1,3 do 90 j=1,3 Qsave(i,j,iply)=Qbar(i,j) Tsave(i,j,iply)=Tinv(i,j) 90 continue c add to laminate stiffness matrix ip1=iply+1 z1= (z(ip1) -z(iply) ) z2= 0.5*(z(ip1)**2-z(iply)**2) z3=(1./3.)*(z(ip1)**3-z(iply)**3) do 100 i=1,3 do 100 j=1,3 E(i,j) = E(i,j) + Qbar(i,j)*z1 xx = Qbar(i,j)*z2 E(i+3,j) = E(i+3,j) + xx E(i,j+3) = E(i,j+3) + xx E(i+3,j+3)= E(i+3,j+3) + Qbar(i,j)*z3 100 continue c end loop over plies; stiffness matrix now formed 110 continue c———————————————————————- c———————————————————————- c output stiffness matrix write(6,120) 120 format(/’ laminate stiffness matrix:’,/) do 140 i=1,6 write(6,130) (e(i,j),j=1,6) 130 format (4x,3e12.4,2x,3d12.4) if (i.eq.3) write(6,*) 140 continue c———————————————————————- c obtain and print laminate compliance matrix c do 300 i=1,6 c do 300 j=1,6 c Et(i,j)=E(i,j) c300 continue c call matinv(isol,idsol,6,6,Et,6,kwa,det) c write(6,310) c310 format(/’ laminate compliance matrix:’,/) c do 320 i=1,6 c write(6,130) (Et(i,j),j=1,6) c if (i.eq.3) write(6,*) c320 continue c———————————————————————- c obtain traction-moment vector write(6,*) write(6,*) ‘input tractions and moments…’ write(6,*) write(6,*) ’ Nx: ' read (5,*) e(1,7) write(6,*) ’ Ny: ' read (5,*) e(2,7) write(6,*) ’ Nxy: ' read (5,*) e(3,7) write(6,*) ’ Mx: ' read (5,*) e(4,7) write(6,*) ’ My: ' read (5,*) e(5,7) write(6,*) ’ Mxy: ' read (5,*) e(6,7) c———————————————————————- c solve resulting system; print strains and rotations call matinv(isol,idsol,6,7,e,6,kwa,det) write(6,150) (e(i,7),i=1,6) 150 format(/’ midplane strains:’,//3x,’eps-xx =’,e12.4, * /3x,’eps-yy =’,e12.4,/3x,’eps-xy =’,e12.4, * //’ rotations:’,//3x,‘kappa-xx =’,e12.4, * /3x,‘kappa-yy= ‘,e12.4,/3x,‘kappa-xy =’,e12.4//) c———————————————————————- c compute ply stresses write(6,160) 160 format (/’ stresses:’,/2x,‘ply’,5x,‘sigma-1’, * 5x,‘sigma-2’,4x,‘sigma-12’/) do 210 iply=1,N do 180 i=1,3 eps0(i)=e(i,7) xkappa(i)=e(i+3,7) do 170 j=1,3 Qbar(i,j)=Qsave(i,j,iply) Tinv(i,j)=Tsave(i,j,iply) 170 continue 180 continue call matmul (3,3,3,3,3,1,Qbar,eps0,vtemp1) call matmul (3,3,3,3,3,1,Qbar,xkappa,vtemp2) zctr=(z(iply)+z(iply+1))/2. do 190 i=1,3 sigbar(i) = vtemp1(i) + zctr*vtemp2(i) 190 continue call matmul (3,3,3,3,3,1,Tinv,sigbar,sig) write(6,200) iply,sig 200 format (3x,i2,3e12.4) 210 continue stop end c———————————————————————- c———————————————————————- c ——– library routines for matrix operations ———– subroutine matmul(lra,lrb,lrc,i,j,k,a,b,c) c c this subroutine performs the multiplication of two c two-dimensional matrices (a(i,j)*b(j,k) = c(i,k)). c c lra - row dimension of “a” (multiplier) matrix c lrb - row dimension of “b” (multiplicand) matrix c lrc - row dimension of “c” (product) matrix c i - actual number of rows in “a” c j - actual number of columns in “a” c k - actual number of columns in “b” c a - multiplier c b - multiplicand c c - product dimension a(1), b(1), c(1) do 20 l = 1,i nm1 = 0 lm = l do 20 m = 1,k c(lm) = 0.0 nm = nm1 ln = l do 10 n = 1,j nm = nm + 1 c(lm) = c(lm) + a(ln)*b(nm) 10 ln = ln + lra nm1 = nm1 + lrb 20 lm = lm + lrc return end subroutine matinv(isol,idsol,nr,nc,a,mra,kwa,det) c c this subroutine finds the inverse and/or solves c simultaneous equations, or neither, and c calculates a determinant of a real matrix. c c isol - communications flag (output) c 1 - inverse found or equations solved c 2 - unable to solve c 3 - input error c idsol - determinant calculation flag (output) c 1 - did not overflow c 2 - overflow c nr - number of rows in input matrix “a” c nc - number of columns in “a” c a - input matrix, first “nr” columns will be inverted c on output, “a” is converted to a-inverse c mra - row dimension of “a” matrix c kwa - work array c det - value of determinant (if idsol = 1) dimension a(1), kwa(1) ir = nr isol = 1 idsol = 1 if(nr.le.0) go to 330 if((ir-mra).gt.0) go to 330 ic = iabs(nc) if ((ic - ir).lt.0) ic = ir ibmp = 1 jbmp = mra kbmp = jbmp + ibmp nes = ir*jbmp net = ic*jbmp if(nc) 10,330,20 10 mdiv = jbmp + 1 iric = ir - ic go to 30 20 mdiv = 1 30 mad = mdiv mser = 1 kser = ir mz = 1 det = 1.0 40 piv = 0. i = mser 50 if (( i - kser).gt.0) go to 70 if((abs(a(i))-piv).le.0.) go to 60 piv = abs(a(i)) ip = i 60 i = i + ibmp go to 50 70 if(piv.eq.0.) go to 340 if(nc.lt.0) go to 80 i = ip-((ip - 1)/jbmp)*jbmp j = mser - ((mser - 1)/jbmp)*jbmp jj = mser/kbmp + 1 ii = jj + (ip -mser) kwa(jj) = ii go to 90 80 i = ip j = mser 90 if (ip - mser) 330,120,100 100 if ((j - net).gt.0) go to 110 psto = a(i) a(i) = a(j) a(j) = psto i = i + jbmp j = j + jbmp go to 100 110 det = - det 120 psto = a(mser) det = det*psto 130 if (det.eq.0.) goto 150 140 psto = 1./psto go to 160 150 idsol = 1 isol = 2 return 160 continue a(mser) = 1.0 i = mdiv 170 if((i - net).gt.0) go to 180 a(i) = a(i)*psto i = i + jbmp go to 170 180 if((mz - kser).gt.0) go to 210 if((mz-mser).eq.0) go to 200 i = mad j = mdiv psto = a(mz) if(psto.eq.0.) go to 200 a(mz) = 0. 190 if((j-net).gt.0) go to 200 a(i) = a(i) - a(j)*psto j = j + jbmp i = i + jbmp go to 190 200 mad = mad + ibmp mz = mz + ibmp go to 180 210 continue c 210 need a test here…..call overfl(ivf) c go to (350,220),ivf ccccccc need at test here, anyhow 220 kser = kser + jbmp if ((kser-nes).gt.0) go to 260 mser = mser + kbmp if(nc.lt.0) go to 230 mdiv = mdiv + ibmp mz = ((mser - 1)/jbmp)*jbmp + 1 mad = 1 go to 40 230 mdiv = mdiv + kbmp if(iric.ne.0) go to 240 mz = mser + ibmp go to 250 240 mz = ((mser - 1)/jbmp)*jbmp + 1 250 mad = mz + jbmp go to 40 260 if(nc.lt.0) return jr = ir 270 if(jr) 330,360,280 280 if(kwa(jr) - jr) 330,320,290 290 k = (jr - 1)*jbmp j = k + ir l = (kwa(jr) - 1)*jbmp + ir 300 if(j - k) 330,320,310 310 psto = a(l) a(l) = a(j) a(j) = psto j = j - ibmp l = l - ibmp go to 300 320 jr = jr - 1 go to 270 330 isol = 3 return 340 det = 0. isol = 2 idsol = 1 return 350 isol = 2 idsol = 2 360 return end