PROGRAM FEM3
C=======================================================================
C A BASIC FEM 2-DIM PROGRAM USING 3-NODED TRIANGULAR LINEAR ELEMENT
C TO SOLVE LAPLACE EQUATION
C SPRING, 1980 EIJI FUKUMORI
C FEBRUARY 12, 2013
C=======================================================================
INCLUDE 'PARAM.DAT'
IMPLICIT REAL*8 ( A-H , O-Z )
CCCCCCCCCCCCCCCCCCCC PARAMETER ( ND=3, MXE=1000, MXN=500, MXB=80 )
DIMENSION SK(ND,ND),X(ND),Y(ND),A(ND),B(ND),IBND(MXB),ITYPE(MXB),
* BVALUE(MXB),NODEX(MXE,ND), XCOORD(MXN),YCOORD(MXN), RK(MXN,MXN),
* RHS(MXN)
CHARACTER INPFILE*14
C=======================================================================
CALL INPUT ( INPFILE, ND, MXE,MXN,MXB, NE,NNODE,NB, EXX,EXY,EYY,
* NODEX, XCOORD, YCOORD, IBND, ITYPE, BVALUE )
C=======================================================================
CALL GSM ( ND, MXE, MXN, NE, NNODE, EXX,EXY,EYY,
* X,Y,A, B, SK,NODEX, XCOORD,YCOORD, RK )
C=======================================================================
CALL FORM ( MXN, MXB, NNODE, NB,IBND,ITYPE,BVALUE, RK, RHS )
C=======================================================================
CALL SYSTEM ( MXN, NNODE, RK, RHS )
C=======================================================================
CALL RESULT ( INPFILE, ND,MXE,MXN,MXB,NE,NNODE,NB,EXX,EXY,EYY,
* NODEX, XCOORD, YCOORD, IBND, ITYPE, BVALUE, RHS )
C=======================================================================
CALL SOL ( MXN,NNODE,RHS )
STOP
END
C
C
SUBROUTINE SOL ( MXN,NNODE,U )
IMPLICIT REAL*8 ( A-H , O-Z )
DIMENSION U(MXN)
CHARACTER OUTFILE*12, EXFILE*3
LOGICAL YES
C========> FILENAME SOLUTION.BIN
OUTFILE = 'SOLUTION.BIN'
OPEN ( 1, FILE=OUTFILE,STATUS='UNKNOWN',FORM='UNFORMATTED' )
WRITE (1) ( U(I) , I = 1 , NNODE )
CLOSE (1)
RETURN
END
C
C
SUBROUTINE GSM ( ND, MXE, MXN, NE, NNODE, EXX,EXY,EYY,
* X,Y,A, B, SK,NODEX, XCOORD,YCOORD, RK )
IMPLICIT REAL*8 ( A-H , O-Z )
DIMENSION NODEX(MXE,ND),XCOORD(MXN),YCOORD(MXN), RK(MXN,MXN),
* SK(ND,ND), X(ND), Y(ND), A(ND), B(ND)
C COMPUTATION OF LOCAL STIFFNESS MATRICES AND THE ASSEMBLY
C OF THE GLOBAL STIFFNESS MATRIX,RK.
C---- RESET
DO I = 1 , NNODE
DO J = 1 , NNODE
RK(I,J) = 0.D0
END DO
END DO
C
DO IEL = 1 ,NE
DO I = 1 , ND
X (I) = XCOORD (NODEX(IEL,I))
Y (I) = YCOORD (NODEX(IEL,I))
END DO
C-------COMPUTATION OF 2*AREA*DN/DX
B(1) = Y(2) - Y(3)
B(2) = Y(3) - Y(1)
B(3) = Y(1) - Y(2)
C-------COMPUTATION OF 2*AREA*DN/DY
A(1) = X(3) - X(2)
A(2) = X(1) - X(3)
A(3) = X(2) - X(1)
C-------COMPUTATION OF AREA
AREA = ( A(3)*B(2) - B(3)*A(2) ) / 2.D0
C-------- DN/DX AND DN/DY
DO I = 1 , ND
B(I) = B(I) / (2.D0*AREA)
A(I) = A(I) / (2.D0*AREA)
END DO
C COMPUTATION OF LOCAL STIFFNESS MATRIX
DO I = 1 , ND
DO J = 1 , ND
SK(I,J) = ( (B(I)*EXX+A(I)*EXY) * B(J)
* + (B(I)*EXY+A(I)*EYY) * A(J) )*AREA
END DO
END DO
C----ASSEMBLY
DO K = 1 , ND
I = NODEX(IEL,K)
DO L = 1 , ND
J = NODEX(IEL,L)
RK (I,J) = RK(I,J) + SK(K,L)
END DO
END DO
END DO
RETURN
END
C
C
SUBROUTINE FORM ( MXN, MXB, NNODE, NB,IBND,ITYPE,BVALUE, RK, RHS )
IMPLICIT REAL*8 ( A-H , O-Z )
DIMENSION RHS(MXN),RK(MXN,MXN),IBND(MXB),ITYPE(MXB),BVALUE(MXB)
C------ CLEAR RIGHT HAND SIDE --------
DO I = 1 , NNODE
RHS (I) = 0.D0
END DO
C BOUNDARY CONDITION IMPLEMENTATION
C ITYPE(I) = 1 ---> DIRICHLET, ITYPE(I) = 2 ---> NEUMANN
C
DO K = 1 , NB
L = IBND (K)
IF ( ITYPE (K) .EQ. 1 ) THEN
DO J = 1 , NNODE
RK (L,J) = 0.D0
END DO
RK (L,L) = 1.D0
RHS (L) = BVALUE (K)
ELSE
RHS (L) = -BVALUE (K)
ENDIF
END DO
RETURN
END
C
C
SUBROUTINE SYSTEM ( MXN, N , A , C )
IMPLICIT REAL*8 ( A-H , O-Z )
DIMENSION A (MXN,MXN) , C (MXN)
N1 = N - 1
DO K = 1, N1
L = K + 1
DO I = L , N
P = A (I,K) / A (K,K)
IF ( P .NE. 0. ) THEN
DO J = L , N
A (I,J) = A (I,J) - P * A ( K , J )
END DO
C ( I ) = C ( I ) - P * C ( K )
END IF
END DO
END DO
C---- BACK SUBSTITUTION
C (N) = C (N) / A (N,N)
DO K = 1 , N1
I = N - K
L = I + 1
P = C ( I )
DO J = L , N
P = P - C (J) * A (I,J)
END DO
C ( I ) = P / A (I,I)
END DO
RETURN
END
C
C
SUBROUTINE INPUT ( INPFILE,ND,MXE,MXN,MXB, NE,NNODE,NB,
* EXX,EXY,EYY,NODEX, XCOORD, YCOORD, IBND, ITYPE, BVALUE )
IMPLICIT REAL*8 ( A-H , O-Z )
DIMENSION NODEX(MXE,ND),XCOORD(MXN),YCOORD(MXN),IBND(MXB),
* ITYPE(MXB), BVALUE(MXB)
LOGICAL YES
CHARACTER INPFILE*14
IR = 1
IF ( ND .LE. 2 ) STOP 'NOT ACCEPTABLE ND'
IF ( ND .EQ. 3 ) INPFILE = 'FEM03INPUT.DAT'
IF ( ND .EQ. 4 ) INPFILE = 'FEM04INPUT.DAT'
IF ( ND .EQ. 8 ) INPFILE = 'FEM08INPUT.DAT'
IF ( ND .EQ. 9 ) INPFILE = 'FEM09INPUT.DAT'
IF ( ND .EQ. 12 ) INPFILE = 'FEM12INPUT.DAT'
INQUIRE ( FILE=INPFILE, EXIST=YES )
IF ( .NOT.YES ) STOP' INPUT FILE DOES NOT EXIST'
OPEN ( IR, FILE = INPFILE, STATUS = 'OLD' )
READ (IR,*) EXX, EXY, EYY
READ (IR,*) NE
IF ( NE .GT. MXE ) STOP 'NE > MXE'
READ (IR,*) (IEL,(NODEX(IEL,J),J=1,ND), I=1,NE)
READ (IR,*) NNODE
IF ( NNODE .GT. MXN ) STOP 'NNODE > MXN'
READ (IR,*) (NODE,XCOORD(NODE),YCOORD(NODE),J=1,NNODE)
READ (IR,*) NB
IF ( NB .GT. MXB ) STOP 'NB > MXB'
READ (IR,*) (IBND(I), ITYPE(I), BVALUE(I),I=1,NB)
RETURN
END
C
C
SUBROUTINE RESULT ( INPFILE, ND,MXE,MXN,MXB,NE,NNODE,NB,
* EXX,EXY,EYY,NODEX, XCOORD, YCOORD, IBND, ITYPE, BVALUE, RHS )
IMPLICIT REAL*8 ( A-H , O-Z )
DIMENSION NODEX(MXE,ND), XCOORD(MXN), YCOORD(MXN), RHS(MXN)
DIMENSION ITYPE (MXB), IBND(MXB), BVALUE(MXB)
CHARACTER OUTFILE*12, EXFILE*3, INPFILE*14
LOGICAL YES
C=================== ECHO AND RESULT PRINTS ======================
C--------- FILE INQUIRERY --------
OUTFILE = 'SOLUTION.FEM'
IW = 1
INQUIRE ( FILE=OUTFILE, EXIST=YES )
IF ( YES ) EXFILE = 'OLD'
IF ( .NOT. YES ) EXFILE = 'NEW'
OPEN ( IW, FILE = OUTFILE, STATUS = EXFILE )
C--------- CRT DUMP ------------
WRITE (*,*) ' INPUT FILE: ', INPFILE
WRITE (*,*) ' OUTPUT FILE: ', OUTFILE
C--------- ECHO PRINT ------------
WRITE (IW,*) ' NAME OF INPUT FILE: ', INPFILE
WRITE (IW,'(1X,78(1H-))')
WRITE (IW,*) ' PROPERTY OF DOMAIN:'
WRITE (IW,*) ' EXX =',EXX
WRITE (IW,*) ' EXY =',EXY
WRITE (IW,*) ' EYY =',EYY
C--------- ELEMENT ---------------
WRITE (IW,'(1X,78(1H-))')
WRITE (IW,*) ' TYPE OF ELEMENT:'
WRITE (IW,*) ' NUMBER OF NODES AT EACH ELEMENT =', ND
C--------- DISCRETIZATION ---------------
WRITE (IW,'(1X,78(1H-))')
WRITE (IW,*) ' DISCRETIZATION OF DOMAIN INTO ELEMENTS:'
WRITE (IW,*) ' NUMBER OF ELEMENTS(NE) =', NE
WRITE (IW,'(10X,11HELEMENT NO ,9(2X,1H(,I1,1H)))') (I,I=1,ND)
DO I = 1 , NE
WRITE (IW, '(10X ,I10, 9I5)') I,(NODEX(I,J),J=1,ND)
END DO
C--------- NODAL POINT COORDINATS -----
WRITE (IW,'(1X,78(1H-))')
WRITE (IW,*) ' COORDINATES OF NODAL POINTS:'
WRITE (IW,*) ' NUMBER OF NODAL POINTS(NNODE) =', NNODE
WRITE (IW,*) ' (I=NODAL POINT, X & Y = X- & Y-COORDINATES)'
DO I = 1 , NNODE
WRITE (IW,*) ' (I,X,Y)=',I,XCOORD(I), YCOORD(I)
END DO
C--------- BOUNDARY CONDITIONS AND VALUES -------
WRITE (IW,'(1X,78(1H-))')
WRITE (IW,*) ' BOUNDARY CONDITIONS:'
WRITE (IW,*) ' NUMBER OF BOUNDARY NODES =',NB
WRITE (IW,*) ' (I=NODAL POINT, T=B.C. B=B.V.)'
WRITE (IW,*) ' (DIRICHLET IF B.C.=1, NUEMANN IF B.C.=2)'
DO I = 1 , NB
WRITE (IW,*) ' (I,T,B)=',IBND(I),ITYPE(I),BVALUE(I)
END DO
C-------- PRINT RESULT ---------
WRITE (IW,'(1X,78(1H-))')
WRITE (IW,*) ' RESULTS:'
WRITE (IW,*) ' UNKNOWN VALUES AT NODEL POINTS'
WRITE (IW,*) ' (I=NODAL POINTS, U=UNKNOWN VALUE)'
DO I = 1 , NNODE
WRITE (IW,*) ' (I,U)=', I,RHS(I)
END DO
C-------- FORMATS --------------
RETURN
END