PROGRAM BUCKLE1B
C======================================================================
C --------- NON-LINEAR DIFFERENTIAL EQUATION ---------
C AN FEM SOLVER FOR BUCKLING PROBLEM WITH MOMENT AT BOTH ENDS OF BEAM
C EQUATION: D2U/DXDX + ALPHA*U=0;
C ALPHA = P/(EI)*(1+(DU/DX)**2)**1.5
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 ****** SYMMETRIC TRI-DIAGONAL MATRIX SOLVER******************
C DECEMBER 25, 1998 EIJI FUKUMORI
C======================================================================
IMPLICIT REAL*8 ( A-H , O-Z )
PARAMETER ( ND=2, MXE=100, MXN=MXE+1,NBW=ND )
PARAMETER ( MXITERA=80,ERRMAX=1.D-6 )
DIMENSION NODEX(MXE,ND),EI(MXE),X(MXN),A(MXN,NBW),RHS(MXN),
* IBTYPE(2), BV(2), U(MXN)
C======================================================================
CALL INPUT ( MXE,MXN,ND,P,NE,NNODE,NODEX,EI,X,IBTYPE,BV )
CALL INITIAL (MXN, NNODE, U,X,IBTYPE,BV )
C======================================================================
OPEN ( 1,FILE='ITERATIN.FEM', STATUS='UNKNOWN')
WRITE(1,*) ' ITERATION MAXIMUM-%-ERROR'
ITERA = 0
UMAXERR = 2.*ERRMAX
DO WHILE ( ITERA .LE. MXITERA .AND. UMAXERR .GT. ERRMAX )
ITERA = ITERA + 1
CALL MATRIX ( MXE,MXN,ND,NBW,P,NE,NNODE,NODEX,EI,X,A,RHS,U )
CALL FORM ( MXN, NBW, NNODE, A, RHS, IBTYPE, BV )
CALL SYSTEM ( MXN, NBW, NNODE, A, RHS )
CALL NEWU ( MXN,NNODE,RHS ,U, UMAXERR )
WRITE (1,*) ITERA , UMAXERR
END DO
CLOSE (1)
C======================================================================
C (5) PRINTING RESULTS
OPEN ( 1,FILE='SOLUTION.FEM', STATUS='UNKNOWN')
DO I = 1 , NNODE
WRITE(1,100) I, X(I), RHS(I)
100 FORMAT ( ' NODAL #=', I3, ' X=',F13.6, ' DISPLACEMENT=',G20.11 )
END DO
CLOSE (1)
STOP' NORMAL TERMINATION'
END
C
C
SUBROUTINE NEWU ( MXN,NNODE,RHS ,U, UMAXERR )
C------- COMPUTES RADIUS AT TX INFINITE STRENGTH.-------
IMPLICIT REAL*8 ( A-H , O-Z )
DIMENSION U(MXN), RHS(MXN)
C------- MIN AND MAX OF RHS
RHSMAX = RHS(1)
RHSMIN = RHS(1)
DO I = 2 , NNODE
RHSMAX = DMAX1 ( RHSMAX , RHS(I) )
RHSMIN = DMIN1 ( RHSMIN , RHS(I) )
END DO
C------- MAXIMUM DIFFERENCE IN RHS
BASE = RHSMAX - RHSMIN
IF ( BASE .EQ. 0.) BASE = 1.
C------- FIND MAX DIFFRENCE BETWEEN RHS(I) AND U(I)
UMAXERR = 0.
DO I = 1 , NNODE
UMAXERR = DMAX1 ( UMAXERR , DABS ( RHS(I) - U(I) ) )
U(I) = RHS(I)
END DO
C-------- PERCENT ERROR IN U(I)
UMAXERR = UMAXERR / BASE * 100.
RETURN
END
C
C
SUBROUTINE INITIAL (MXN, NNODE, U,X,IBTYPE,BV )
IMPLICIT REAL*8 ( A-H , O-Z )
DIMENSION U(MXN),X(MXN),IBTYPE(2), BV(2)
C--------FIND MAX X AND MIN X
XMAX = X(1)
XMIN = X(1)
DO I = 2 , NNODE
XMAX = DMAX1 ( XMAX , X(I) )
XMIN = DMIN1 ( XMIN , X(I) )
END DO
C--------LENGTH OF DOMAIN
DL = XMAX - XMIN
C--------CASE OF DIRICHILET - DIRICHILET
IF ( IBTYPE(1) .EQ. 1 .AND. IBTYPE(2).EQ.1 ) THEN
SLOPE = (BV(2)-BV(1))/DL
DO I = 1 , NNODE
U(I) = SLOPE*(X(I)-XMIN) + BV(1)
END DO
END IF
C--------CASE OF DIRICHILET - NEUMANN
IF ( IBTYPE(1) .EQ. 1 .AND. IBTYPE(2).EQ.2 ) THEN
DO I = 1 , NNODE
U(I) = BV(1)
END DO
END IF
C--------CASE OF NEUMANN - DIRICHILET
IF ( IBTYPE(1) .EQ. 2 .AND. IBTYPE(2).EQ.1 ) THEN
DO I = 1 , NNODE
U(I) = BV(2)
END DO
END IF
RETURN
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='BUCKLE.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 + 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,ND,NBW,P,NE,NNODE,NODEX,EI,X,A,RHS,U)
IMPLICIT REAL*8 ( A-H , O-Z )
DIMENSION NODEX(MXE,ND),EI(MXE),X(MXN),A(MXN,NBW),RHS(MXN),U(MXN)
DO I = 1 , NNODE
A(I,1) = 0.
A(I,2) = 0.
RHS(I) = 0.
END DO
DO IEL = 1 , NE
I = NODEX(IEL,1)
J = NODEX(IEL,2)
DX = X(J) - X(I)
DUDX = (U(J)-U(I))/DX
ALPHA = P/EI(IEL)*(1.+DUDX*DUDX)**1.5
A(I,1) = A(I,1) - 1./DX + ALPHA*DX/3.
A(I,2) = A(I,2) + 1./DX + ALPHA*DX/6.
A(J,1) = A(J,1) - 1./DX + ALPHA*DX/3.
END DO
RETURN
END
C
C
SUBROUTINE FORM ( 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
A(1,1) = 1.
RHS(1) = BV(1)
RHS(2) = RHS(2) - BV(1)*A(1,2)
A(1,2) = 0.
ELSE
RHS(1) = RHS(1) - BV(1)
END IF
IF ( IBTYPE(2) .EQ. 1 ) THEN
A(NNODE,1) = 1.
RHS(NNODE) = BV(2)
RHS(NNODE-1) = RHS(NNODE-1) - BV(2)*A(NNODE-1,2)
A(NNODE-1,2) = 0.
ELSE
RHS(NNODE) = RHS(NNODE) - BV(2)
END IF
RETURN
END
C
C
SUBROUTINE SYSTEM ( MXN, NBW, NNODE, A , B )
IMPLICIT REAL*8 ( A-H , O-Z )
DIMENSION A(MXN,NBW) , B(MXN)
B(1) = B(1) / A(1,1)
A(1,1) = A(1,2) / A(1,1)
DO I = 2 , NNODE
P = A(I,1) - A(I-1,2) * A(I-1,1)
A(I,1) = A(I,2) / P
B(I) = ( B(I) - A(I-1,2)*B(I-1) ) / P
END DO
C------ BACK SUBSTITUTION ----
DO I = NNODE-1, 1,-1
B(I) = B(I) - A(I,1) * B(I+1)
END DO
RETURN
END