

C ---******************************************************************
C ---*                                                                *
C ---*                         PROGRAM DAFI                           *
C ---*               (Diaphragm and Frame Interaction)                *
C ---*                                                                *
C ---*      Written By Dave Bohnhoff          November 14, 1989       *
C ---*                                                                *
C ---******************************************************************
C --- Description of Program Arrays
C ---  SD = Diaphragm Stiffnesses
C ---  SF = Frame Stiffnesses
C ---  RF = Concentrated Loads Applied to Frames
C ---  FL = Loads Resisted By Frames
C ---  FFRAC = Fraction of Load Applied to Frame that is Resisted
C ---          by the Frame
C ---  DD = Shear Displacement of Diaphragms
C ---  DL = Shear Loads in Diaphragms
C ---  S  = Stiffness Matrix (prior to reduction)
C ---  R  = Load Vector (prior to reduction)
C ---     = Displacements (after back-substitutuion)
C ---  NEQ= Degree of Freedom Number Associated with Frame (frames with
C ---          infinite stiffness have no displacement DOF)
C ---     
C --- Description of Some Program Variables
C ---  NB = Number of Bays
C ---  NF = Number of Frames
C ---  NDF= Number of Displacement Degrees of Freedom
C ---     

      DIMENSION SD(80),SF(81),RF(81),FL(81),FFRAC(81),DD(80),DL(80),
     *      R(81),S(81,2),NEQ(81)
      CHARACTER OUTFLE*12,INFILE*12
      OUTFLE='            '
      INFILE ='            '
      NDF=0
      WRITE(*,2000)
      READ(*,'(A12)') OUTFLE
      IF(OUTFLE.EQ.'            ')THEN
           IFLAG=0
      ELSE
           IFLAG=1
           IOUT=6
           OPEN(IOUT,FILE=OUTFLE,STATUS='NEW')
      ENDIF
      WRITE(*,2002)
      READ(*,'(A12)') INFILE
      IF(INFILE.EQ.'            ')THEN
           KFLAG=0
      ELSE
           KFLAG=1
           IIN=5
           OPEN(IIN,FILE=INFILE)
      ENDIF
      IF(KFLAG.EQ.1)THEN
           READ(IIN,*)NB
           DO 10 J=1,NB
                READ(IIN,*)SD(J)
   10      CONTINUE
           NF=NB+1
           DO 15 J=1,NF
                READ(IIN,*)SF(J)
                IF(SF(J).LT.0)THEN
                     NEQ(J)=0
                ELSE
                     NDF=NDF+1
                     NEQ(J)=NDF
                ENDIF
   15      CONTINUE
           DO 25 J=1,NF
                READ(IIN,*)RF(J)
   25      CONTINUE
      ELSE
           WRITE(*,2005)
           READ(*,*)NB
           DO 30 J=1,NB
                WRITE(*,2010)J
                READ(*,*)SD(J)
   30      CONTINUE
           NF=NB+1
           DO 40 J=1,NF
                WRITE(*,2015)J
                READ(*,*)SF(J)
                IF(SF(J).LT.0)THEN
                     NEQ(J)=0
                ELSE
                     NDF=NDF+1
                     NEQ(J)=NDF
                ENDIF
   40      CONTINUE
           DO 50 J=1,NF
                WRITE(*,2020)J
                READ(*,*)RF(J)
   50      CONTINUE
      ENDIF
C --- Load Frame Stiffnesses into Banded Stiffness Matrix and Loads
C --- into Load Vector.
      DO 60 N=1,NF
          R(N)=RF(N)
          S(N,1)=SF(N)
   60 CONTINUE
C --- Load Diaphragm Stiffnesses into Banded Stiffness Matrix.
      DO 70 N=1,NB
          S(N,1)=S(N,1)+SD(N)
          S(N,2)=-SD(N)
          S(N+1,1)=S(N+1,1)+SD(N)
   70 CONTINUE
      S(NF,2)=0.0D0
C --- Reduce Stiffness Matrix and Load Vector for Infinitely Stiff
C --- Frames.
      IF(NDF.LT.NF)THEN
          DO 71 K=1,NF
               J=NEQ(K)
               IF(J.EQ.0.AND.K.NE.1) S(K-1,2)=0
   71     CONTINUE
          DO 72 K=1,NF
               J=NEQ(K)
               IF(J.EQ.0)THEN
                    GOTO 72
               ELSE
                    S(J,1)=S(K,1)
                    S(J,2)=S(K,2)
                    R(J)=R(K)
               ENDIF
   72     CONTINUE
      ENDIF
C --- Forward Reduction of the NDF-by-2 Stiffness Matrix.
      DO 80 N=1,NDF
          IF(S(N,2).EQ.0) GOTO 80
          I=N+1
          C=S(N,2)/S(N,1)
          S(I,1)=S(I,1)-C*S(N,2)
          S(N,2)=C
   80 CONTINUE
C --- Forward Reduction of the Load Vector.
      DO 90 N=1,NDF
          IF (S(N,2).EQ.0) GOTO 89
          I=N+1
          R(I)=R(I)-S(N,2)*R(N)
   89     R(N)=R(N)/S(N,1)
   90 CONTINUE
C --- Solve for Unknowns by Back-Substitution.
      DO 100 M=2,NDF
          N=NDF+1-M
          IF(S(N,2).EQ.0) GOTO 100
          K=N+1
          R(N)=R(N)-S(N,2)*R(K)
  100 CONTINUE
C --- Expand Displacement Array R to Include Zero Displacements of
C --- Infinitely Stiff Frames.
      IF(NDF.LT.NF)THEN
      DO 105 K=1,NF
            KK=NF-K+1
            J=NEQ(KK)
            IF(J.EQ.0)THEN
                 R(KK)=0.0D0
            ELSE
                 R(KK)=R(J)
            ENDIF
  105 CONTINUE
      ENDIF
C --- Calculate Shear Deformation of & Force in Each Diaphragm.
      DO 110 N=1,NB
          DD(N)=ABS(R(N)-R(N+1))
          DL(N)=DD(N)*SD(N)
  110 CONTINUE
C --- Calculate Frame Loads & Fraction of Load Taken By Frame.
      DO 120 N=1,NF
          IF(NEQ(N).NE.0)THEN
               FL(N)=R(N)*SF(N)
          ELSEIF(NEQ(N).EQ.0.AND.N.EQ.1)THEN
               FL(N)=RF(N)+(R(2)-R(1))*SD(1)
          ELSEIF(NEQ(N).EQ.0.AND.N.EQ.NF)THEN
               FL(N)=RF(N)+(R(N-1)-R(N))*SD(N-1)
          ELSE
               FL(N)=RF(N)+(R(N-1)-R(N))*SD(N-1)+(R(N+1)-R(N))*SD(N)
          ENDIF
          IF(RF(N).EQ.0.0D0)THEN
               FFRAC(N)=-1
          ELSE
               FFRAC(N)=FL(N)/RF(N)
          ENDIF
  120 CONTINUE
C --- Output Results.
      WRITE(*,2025)
      IF(IFLAG.EQ.1) WRITE(IOUT,2025)
      DO 130 N=1,NF
           IF(FFRAC(N).LE.0.0D0.AND.NEQ(N).NE.0) THEN
              WRITE(*,2028)N,SF(N),RF(N),R(N),FL(N)
              IF(IFLAG.EQ.1) WRITE(IOUT,2028)N,SF(N),RF(N),R(N),FL(N)
           ELSEIF(FFRAC(N).GT.0.0D0.AND.NEQ(N).NE.0) THEN
              WRITE(*,2030)N,SF(N),RF(N),R(N),FL(N),FFRAC(N)
              IF(IFLAG.EQ.1) WRITE(IOUT,2030)N,SF(N),RF(N),R(N),
     *                         FL(N),FFRAC(N)
           ELSEIF(FFRAC(N).LE.0.0D0.AND.NEQ(N).EQ.0) THEN
              WRITE(*,2032)N,RF(N),R(N),FL(N)
              IF(IFLAG.EQ.1) WRITE(IOUT,2032)N,RF(N),R(N),FL(N)
           ELSEIF(FFRAC(N).GT.0.0D0.AND.NEQ(N).EQ.0) THEN
              WRITE(*,2034)N,RF(N),R(N),FL(N),FFRAC(N)
              IF(IFLAG.EQ.1) WRITE(IOUT,2034)N,RF(N),R(N),
     *                         FL(N),FFRAC(N)
           ENDIF
  130 CONTINUE
      WRITE(*,2035)
      IF(IFLAG.EQ.1) WRITE(IOUT,2035)
      DO 140 N=1,NB
          WRITE(*,2040)N,SD(N),DD(N),DL(N)
          IF(IFLAG.EQ.1) WRITE(IOUT,2040)N,SD(N),DD(N),DL(N)
  140 CONTINUE
      STOP
 2000 FORMAT(5X,'OUTPUT FILE NAME ? (IF OUTPUT ONLY TO SCREEN HIT',
     *      ' RETURN)  ',\)
 2002 FORMAT(5X,'INPUT FILE NAME ? (IF INPUT FROM KEYBOARD HIT',
     *      ' RETURN)  ',\)
 2005 FORMAT(5X,'NUMBER OF BUILDING BAYS ? ',\)
 2010 FORMAT(5X,'STIFFNESS OF THE ROOF DIAPHRAGM FOR BAY ',I2,' ? ',\)
 2015 FORMAT(5X,'STIFFNESS OF BUILDING FRAME ',I2,' ?',/,5X,
     *      '  (IF INFINITELY STIFF ENTER A NEGATIVE NUMBER)  ',\)
 2020 FORMAT(5X,'LOAD ON BUILDING FRAME ',I2,' ? ',\)
 2025 FORMAT(//,5X,' FRAME    FRAME     APPLIED   HORIZONTAL  LOAD',
     *    ' RESISTED  FRACTION OF',/,5X,'NUMBER  STIFFNESS    LOAD ',
     *    '   DISPLACEMENT    BY FRAME    APPLIED LOAD',/,5X,69(1H-))
 2028 FORMAT(7X,I2,3X,F10.2,1X,F9.1,2X,F10.7,6X,F7.1)
 2030 FORMAT(7X,I2,3X,F10.2,1X,F9.1,2X,F10.7,6X,F7.1,6X,F8.4)
 2032 FORMAT(7X,I2,3X,' Infinite ',1X,F9.1,2X,F10.7,6X,F7.1)
 2034 FORMAT(7X,I2,3X,' Infinite ',1X,F9.1,2X,F10.7,6X,F7.1,6X,F8.4)
 2035 FORMAT(//,5X,'DIAPHRAGM   DIAPHRAGM       SHEAR      SHEAR',/,5X,
     *    ' NUMBER     STIFFNESS   DISPLACEMENT   LOAD',/,5X,44(1H-))
 2040 FORMAT(7X,I2,6X,F10.2,4X,F10.7,3X,F7.1)
      END
