PROGRAM BUCKLE2
C======================================================================
C AN FEM SOLVER FOR BUCKLING PROBLEM WITH MOMENT AT BOTH ENDS OF BEAM
C        EQUATION: D2U/DXDX + ALPHA*U=0; ALPHA = P/(EI)
C P=APPLIED FORCE AT ENDS OF BEAM, E=YOUNG MODULUS, I=2ND MOMENT OF
C INERTIA. RL=LENGTH OF ELEMENT, IBTYPE(1)=BOUNDARY CONDITION AT THE
C LEFT END OF BEAM, IBTYPE(2)=BC AT RIGHT END. IBTYPE(I)=1 FOR FIXED 
C DISPLACEMENT, IBTYPE(I)=2 FOR PRESCRIBED SLOPE AT THE END.
C    ************* PENTA-DIAGONAL MATRIX SOLVER******************
C    **************** 3-NODED PARABOLIC ELEMENT USED ***************
C MAY1994   EIJI FUKUMORI RETOUCHED
C======================================================================
      IMPLICIT REAL*8 ( A-H , O-Z )
      PARAMETER (ND=3,MXE=10,MXN=MXE*(ND-1)+1,NBW=2*(ND-1)+1,INTEPT=2)
      DIMENSION NODEX(MXE,ND),EI(MXE),X(MXN),A(MXN,NBW),RHS(MXN),
     * IBTYPE(2), BV(2), STIFF(ND,ND),SAI(INTEPT),W(INTEPT),
     * F0(ND), F1(ND), SF(ND,INTEPT), BP(ND,INTEPT), B(ND),SX(ND)
C======================================================================
      DATA SAI / -0.5773502691896D0, 0.5773502691896D0 /
      DATA W   /  1.D0             , 1.D0              /
C======================================================================
      CALL DERIV ( ND, INTEPT, F0, F1, SAI, BP )
      CALL SHAPEF( ND, INTEPT, F0, SAI, SF )
C======================================================================
C (1) READING OF DATA
      CALL INPUT ( MXE,MXN,ND,P,NE,NNODE,NODEX,EI,X,IBTYPE,BV )
C======================================================================
C (2) CONSTRUCTION OF FEM-MATRIX EQUATION
      CALL MATRIX ( MXE,MXN,INTEPT,ND,NBW,P,NE,NNODE,STIFF,
     *                    NODEX,EI,X,A,RHS, BP,W,SX,B,SF )
C======================================================================
C (3) IMPLEMENTATION OF BOUNDARY CONDITION
      CALL FORM ( ND, MXN, NBW, NNODE, A, RHS, IBTYPE, BV )
C======================================================================
C (4) SOLVE FOR UNKNOWN VARIABLES
      IPD = ND - 1
      CALL SYSTEMA ( MXN , NBW , NNODE , IPD , A , RHS )
C======================================================================
C (5) PRINTING RESULTS
      DO I = 1 , NNODE
      WRITE(*,*)' NODAL # =',I, '     DISPLACEMENT =', RHS(I)
      END DO
      STOP' NORMAL TERMINATION'
      END
C
C
      SUBROUTINE INPUT ( MXE,MXN,ND,P,NE,NNODE,NODEX,EI,X,IBTYPE,BV )
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION NODEX(MXE,ND),EI(MXE),X(MXN),IBTYPE(2), BV(2)
      OPEN ( 1,FILE='BUCKLE2.DAT', STATUS='OLD')
      READ(1,*) P
      READ(1,*) NE
      DO I = 1 , NE
      READ(1,*) IEL, (NODEX(IEL,J),J=1,ND),EI(IEL)
      END DO
      NNODE = NE*(ND-1) + 1
      DO I = 1 , NNODE
      READ(1,*) NODE, X(NODE)
      END DO
      READ(1,*) IBTYPE(1), BV(1)
      READ(1,*) IBTYPE(2), BV(2)
      CLOSE (1)
      RETURN
      END
C
C
      SUBROUTINE MATRIX ( MXE,MXN,INTEPT,ND,NBW,P,NE,NNODE,STIFF,
     *                    NODEX,EI,X,A,RHS, BP,W,SX,B,SF )
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION NODEX(MXE,ND),EI(MXE),X(MXN),A(MXN,NBW),RHS(MXN),
     * STIFF(ND,ND),BP(ND,INTEPT),W(INTEPT),SX(ND),B(ND),SF(ND,INTEPT)
      DO I = 1 , NNODE
      DO J = 1 , NBW
      A(I,J) = 0.
      END DO
      RHS(I) = 0.
      END DO
      DO IEL = 1 , NE
      SX(1) = X(NODEX(IEL,1))
      SX(2) = X(NODEX(IEL,2))
      SX(3) = X(NODEX(IEL,3))
      ALPHA = P / EI(IEL)
      CALL SGSM ( INTEPT,ND,BP,W,SX,B,SF,ALPHA, STIFF )
      DO I = 1 , ND
      DO J = 1 , ND
      II = NODEX(IEL,I)
      JJ = ND - I + J
      A(II,JJ) = A(II,JJ) + STIFF(I,J)
      END DO
      END DO
      END DO
      RETURN
      END
C
C
      SUBROUTINE FORM ( ND, MXN, NBW, NNODE, A, RHS, IBTYPE, BV )
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION IBTYPE(2),BV(2),A(MXN,NBW), RHS(MXN)
      IF ( IBTYPE(1) .EQ. 1 ) THEN
      DO J = ND+1, NBW
      A(1,J) = 0.
      END DO
      A(1,ND) = 1.
      RHS(1) = BV(1)
      ELSE
      RHS(1) = RHS(1) - BV(1)
      END IF
      IF ( IBTYPE(2) .EQ. 1 ) THEN
      DO J = 1 , ND-1
      A(NNODE,J) = 0.
      END DO
      A(NNODE,ND) = 1.
      RHS(NNODE) = BV(2)
      ELSE
      RHS(NNODE) = RHS(NNODE) - BV(2)
      END IF
      RETURN
      END
C
C
      SUBROUTINE DERIV ( ND, INTEPT, F0, F1, SAI, BPP )
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION SAI(INTEPT),BPP(ND,INTEPT), F0(ND),F1(ND)
C------- COMPUTATION OF BP(J) = D N(J) / D ETA
      DO K = 1 , INTEPT
      CALL ISOPARA ( ND , SAI(K)+0.5 , F1 )
      CALL ISOPARA ( ND , SAI(K)-0.5 , F0 )
      DO I = 1 , ND
      BPP(I,K) = F1(I) - F0(I)
      END DO
      END DO
      RETURN
      END
C
C
      SUBROUTINE SHAPEF ( ND , INTEPT , F , SAI , SF )
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION F(ND) , SAI(INTEPT) , SF(ND,INTEPT)
      DO K = 1 , INTEPT
      CALL ISOPARA ( ND , SAI(K), F )
      DO I = 1 , ND
      SF(I,K) = F(I)
      END DO
      END DO
      RETURN
      END
C
C
      SUBROUTINE ISOPARA ( ND , SAI , F )
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION F(ND)
      F(1) =   0.5 * SAI * ( SAI - 1.)
      F(2) = ( 1.- SAI ) * ( 1.+ SAI )
      F(3) =   0.5 * SAI * ( SAI + 1.)
      RETURN
      END
C
C
      SUBROUTINE SGSM ( INTEPT,ND,BP,W,X,B,SF,ALPHA, STIFF ) 
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION X(ND),W(INTEPT),STIFF(ND,ND),B(ND),BP(ND,INTEPT),
     *          SF(ND,INTEPT)
C-------- RESET
      DO I = 1 , ND
      DO J = 1 , ND
      STIFF(I,J) = 0.
      END DO
      END DO
C------- GAUSS INTEGRATION
      DO K = 1 , INTEPT
      YACOB = 0.
      DO I = 1 , ND
      YACOB = YACOB + BP(I,K)*X(I)
      END DO
      DO J = 1 , ND
      B(J) = BP(J,K) / YACOB
      END DO
      DO I = 1 , ND
      DO J = 1 , ND
      STIFF(I,J) = STIFF(I,J) + W(K)*YACOB *
     *            ( -B(I)*B(J) + ALPHA*SF(I,K)*SF(J,K) )
      END DO
      END DO
      END DO
      RETURN
      END
C
C
      SUBROUTINE SYSTEMA ( MXN , MXW , N , IPD , A , C )
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION A(MXN,MXW), C(MXN)
C------- FULL BANDWIDTH = 2 * IPD + 1
      N1 = N - 1
      IPU = IPD + 1
      NIP = N - IPD
      DO K = 1 , N1
      IP = IPD
      IF ( K .GT. NIP ) IP = N - K
      IS = K + 1
      IE = K + IP
      DO I = IS , IE
      JS = IPD - ( I - IS )
      JE = JS + IP
      P = A(I,JS) / A(K,IPU)
      IF ( P .NE. 0. ) THEN
      DO J = JS , JE
      L = J - JS + IPU
      A(I,J) = A(I,J) - P * A(K,L)
      END DO
      C(I) = C(I) - P * C(K)
      END IF
      END DO
      END DO
C------- SOLUTION OF X(N)
      C(N) = C(N) / A(N,IPU)
C------- BACK SUBSTITUTION
      JS = IPU + 1
      DO K = 1 , N1
      I = N1 - K + 1
      NI = N - I
      IF ( NI .GT. IPD ) NI = IPD
      JE = IPU + NI
      T = 0.
      DO J = JS , JE
      L = J - JS + I + 1
      T = T + A(I,J) * C(L)
      END DO
      C(I) = ( C(I) - T ) / A(I,IPU)
      END DO
      RETURN
      END