You are on page 1of 7

C*********************************************************************

C
C
C
PROGRAM POT2TRID
C
PARAMETER (NELEX=2500, NPOIX=1500)
C
REAL*4 COORD(3,NPOIX),K(NPOIX,NPOIX),KA(NPOIX,NPOIX),PHIT(NPOIX),
. PHI(NPOIX),PHIA(NPOIX),FVECT(NPOIX),FVECTA(NPOIX),
. LOWER(NPOIX,NPOIX),VBC(NPOIX),DFUNG(2,3,NELEX),
. AREAG(NPOIX),XJ(3),YJ(3),DFUN(2,3)
INTEGER*2 INTMAT(8,NELEX),IBL(NPOIX),IBGCON(NPOIX)
INTEGER*2 NINT,NPOIN,NELEM,NBC,LNODE,NX
C
LNODE = 3
NX = 2
C
CALL INPUT(NELEX,NPOIX,NELEM,NPOIN,COORD,INTMAT,IBL,VBC,NBC)
CALL GEOM(NELEX,NELEM,NPOIX,INTMAT,DFUNG,COORD,K,AREAG,XJ,YJ,
. DFUN,LNODE,NX)
CALL BOUN(NPOIX,NPOIN,NBC,K,KA,FVECT,FVECTA,IBL,VBC,IBGCON,PHI,
. PHIA,NINT)
CALL SOLVER(NPOIX,NINT,KA,PHIA,FVECTA,LOWER,PHIT)
CALL OUTPUT(NELEX,NELEM,NPOIX,NPOIN,COORD,INTMAT,PHIA,PHI,NINT,
. IBGCON)
C
STOP
END
C
C THIS PROGRAM READS "*.GEO" FILE OF THE LAST VERSION V3.1
C "*.GEO" FILES ARE GEOMETRY FILES OF THE FASTTABS SOFTWARE
C
C
SUBROUTINE INPUT(NELEX,NPOIX,NELEM,NPOIN,COORD,INTMAT,IBL,VBC,
. NBC )
C
REAL*4 COORD(3,NPOIX), VBC(NPOIX)
INTEGER*2 INTMAT(8,NELEX),IBL(NPOIX), NBC,NPOIN,NELEM
CHARACTER ICH(3)*1, ICHR*3, FNAME*30
C
C OPEN FILES
C
PRINT*,' Read A Geo File '
PRINT*,' '
PRINT*,' *.geo file name : '
C FNAME = 'LAT1.GEO'
READ(*,1) FNAME
OPEN(1,FILE=FNAME)
PRINT*,' '
PRINT*,' Read A Potential Solution File '
PRINT*,' '
PRINT*,' *.geo file name : '
C FNAME = 'LAT1O.GEO'
READ(*,1) FNAME
1 FORMAT(A)
OPEN(2,FILE=FNAME)
PRINT*,' '
C
C IDENTIFY AND COLLECT BCL, BCV, GNN AND GE CARDS
C
NELEM = 0
NPOIN = 0
C
10 CONTINUE
READ(1,1,END=99) ICHR
ICH(1)=ICHR(:1)
ICH(2)=ICHR(2:2)
ICH(3)=ICHR(3:)
SELECT CASE (ICH(1))
CASE ('G')
SELECT CASE (ICH(2))
CASE ('E')
NELEM=NELEM+1
CALL GETELEM(NELEX,INTMAT)
CASE ('N')
NPOIN=NPOIN+1
CALL GETNODE(NPOIX,COORD)
END SELECT
CASE ('B')
SELECT CASE (ICH(2))
CASE ('C')
SELECT CASE (ICH(3))
CASE ('L')
CALL GETBCL(NPOIX,NBC,IBL)
CASE ('V')
CALL GETBCV(NPOIX,NBC,VBC)
END SELECT
END SELECT
END SELECT
GO TO 10
99 CONTINUE
C
CLOSE(1)
C
RETURN
END
C
C CONTRUCT THE "STIFFNESS" MATRIX
C
SUBROUTINE GEOM(NELEX,NELEM,NPOIX,INTMAT,DFUNG,
. COORD,K,AREAG,XJ,YJ,DFUN,LNODE,NX)
REAL*4 COORD(3,NPOIX),K(NPOIX,NPOIX),DFUNG(2,3,NELEX),
. AREAG(NELEX)
REAL*4 XJ(LNODE), YJ(LNODE), DFUN(NX,LNODE)
INTEGER*2 INTMAT(8,NELEX),NELEM,LNODE,NX
C
C CALCULATE DERIVATIVES OF SHAPE FUNCTIONS AND ELEMENT AREAS
C
DO 10 IE = 1,NELEM
C
DO 5 IN = 1,LNODE
IGL = INTMAT(IN,IE)
XJ(IN) = COORD(1,IGL)
YJ(IN) = COORD(2,IGL)
5 CONTINUE
CALL DFTRLIN3(XJ,YJ,DFUN,LNODE,AREA,NX)
DO 15 IN = 1,LNODE
DO 15 JN = 1,NX
DFUNG(JN,IN,IE) = DFUN(JN,IN)
15 CONTINUE
AREAG(IE)=AREA
C
10 CONTINUE
C
C MAKE Kij IN ELEMENT PUT IN GLOBAL Kij
C
DO 20 IE = 1,NELEM
DO 30 IN = 1,LNODE
IGL = INTMAT(IN,IE)
DO 40 JN = 1,LNODE
JGL = INTMAT(JN,IE)
AINTEG = 0.0
DO 50 IX = 1,NX
AINTEG = AINTEG + DFUNG(IX,IN,IE)*DFUNG(IX,JN,IE)
50 CONTINUE
AINTEG = AINTEG * AREAG(IE)
K(IGL,JGL) = K(IGL,JGL) + AINTEG
40 CONTINUE
30 CONTINUE
20 CONTINUE
C
RETURN
END
C
C MODIFY Kij DUE TO BOUNDARY CONDITION
C
SUBROUTINE BOUN(NPOIX,NPOIN,NBC,K,KA,FVECT,FVECTA,IBL,VBC,
. IBGCON,PHI,PHIA,NINT)
REAL*4 K(NPOIX,NPOIX), KA(NPOIX,NPOIX), FVECT(NPOIX),
. VBC(NBC), PHI(NPOIX), PHIA(NPOIX),
. FVECTA(NPOIX)
INTEGER*2 IBL(NBC),IBGCON(NPOIX),NINT,NPOIN,NBC,IGL,JGL,IBC,JBC,
. IINT,JINT
LOGICAL FOUND
C
NINT = NPOIN - NBC
IINT = 0
DO 10 IGL = 1,NPOIN
FOUND = .FALSE.
DO 20 IBC = 1,NBC
IF (IBL(IBC).EQ.IGL) THEN
FOUND = .TRUE.
GO TO 21
ENDIF
20 CONTINUE
21 CONTINUE
IF (.NOT.(FOUND)) THEN
IINT = IINT + 1
IBGCON(IINT) = IGL
ENDIF
10 CONTINUE
DO 40 IINT = 1, NINT
IGL = IBGCON(IINT)
DO 30 JINT = 1,NINT
JGL = IBGCON(JINT)
KA(IINT,JINT) = K(IGL,JGL)
30 CONTINUE
FVECTA(IINT) = FVECT(IGL)
PHIA(IINT) = 0.0
40 CONTINUE
C
C ADD (SUBSTRACT) THE KNOWN BC CONTRIBUTION TO THE RHS VECTOR
C
DO 50 IINT = 1,NINT
IGL = IBGCON(IINT)
DO 50 JBC = 1,NBC
JGL = IBL(JBC)
PHI(JGL) = VBC(JBC)
FVECTA(IINT) = FVECTA(IINT) - K(IGL,JGL)*PHI(JGL)
50 CONTINUE
C
RETURN
END
C
C SOLVER, CHOLESKI'S ALGORITHM, FORWARD AND BACKWARD SUBSTITUTION
C
SUBROUTINE SOLVER(NPOIX,NINT,KA,PHIA,FVECTA,LOWER,PHIT)
REAL*4 KA(NPOIX,NPOIX),PHIA(NPOIX),FVECTA(NPOIX)
REAL*4 LOWER(NPOIX,NPOIX),PHIT(NPOIX)
INTEGER*2 NINT
C
C L transpose L DECOMPOSITION
C
LOWER(1,1) = SQRT(KA(1,1))
DO 10 J =2,NINT
LOWER(J,1) = KA(J,1)/LOWER(1,1)
10 CONTINUE
DO 20 I = 2,NINT-1
SUM = 0.0
DO 30 J = 1, I-1
SUM = SUM + LOWER(I,J)*LOWER(I,J)
30 CONTINUE
LOWER(I,I) = SQRT(KA(I,I)-SUM)
DO 40 J = I+1,NINT
SUM = 0.0
DO 50 K = 1, I-1
SUM = SUM + LOWER(J,K)*LOWER(I,K)
50 CONTINUE
LOWER(J,I) = (KA(J,I)-SUM)/LOWER(I,I)
40 CONTINUE
20 CONTINUE
SUM = 0.0
DO 60 I = 1, NINT-1
SUM = SUM + LOWER(NINT,I)*LOWER(NINT,I)
60 CONTINUE
LOWER(NINT,NINT) = SQRT(KA(NINT,NINT)-SUM)
C
C FORWARD SUBSTITUTION
C
PHIT(1) = FVECTA(1)/LOWER(1,1)
DO 110 I = 2,NINT
SUM = 0.0
DO 120 J = 1,I-1
SUM = SUM + LOWER(I,J)*PHIT(J)
120 CONTINUE
PHIT(I) = (FVECTA(I) - SUM)/LOWER(I,I)
110 CONTINUE
C
C BACKWARD SUBSTITUTION
C
PHIA(NINT) = PHIT(NINT)/LOWER(NINT,NINT)
DO 130 I = NINT-1,1,-1
SUM = 0.0
DO 140 J = I+1,NINT
SUM = SUM + LOWER(J,I)*PHIA(J)
140 CONTINUE
PHIA(I) = (PHIT(I) - SUM)/LOWER(I,I)
130 CONTINUE
C
RETURN
END
C
C
C
SUBROUTINE OUTPUT(NELEX,NELEM,NPOIX,NPOIN,COORD,INTMAT,PHIA,PHI,
. NINT,IBGCON)
REAL*4 COORD(3,NPOIX), PHIA(NPOIX), PHI(NPOIX)
INTEGER*2 INTMAT(8,NELEX), IBGCON(NPOIX),NPOIN,NINT,NELEM
CHARACTER GE*4, GNN*4
C
GE = 'GE '
GNN = 'GNN '
1 FORMAT(A4,10I6,F4.1)
DO 10 IE = 1,NELEM
WRITE(2,1) GE,IE,(INTMAT(J,IE),J=1,3),0,0,0,0,0,1,0.0
10 CONTINUE
C GOTO 39
DO 30 IINT = 1,NINT
IGL = IBGCON(IINT)
PHI(IGL) = PHIA(IINT)
30 CONTINUE
2 FORMAT(A4,I6,3F14.5)
DO 20 IGL = 1,NPOIN
WRITE(2,2) GNN,IGL,(COORD(J,IGL),J=1,2),PHI(IGL)
20 CONTINUE
39 CLOSE(2)
C
RETURN
END
C
C PUT IN ELEM. CONN. ARRAY
C
SUBROUTINE GETELEM(NELEX,INTMT)
INTEGER*2 INTMT(8,NELEX),IE,J,IMAT
REAL*4 RTENS
CHARACTER ICHR*2
BACKSPACE(1)
READ(1,1) ICHR,IE,(INTMT(J,IE),J=1,8),IMAT,RTENS
1 FORMAT(A2,10I6,F7.1)
RETURN
END
C
C PUT IN COORD. ARRAY
C
SUBROUTINE GETNODE(NPOIX,COORD)
REAL*4 COORD(3,NPOIX)*4
CHARACTER ICHR*3
BACKSPACE(1)
READ(1,1) ICHR,IN,(COORD(J,IN),J=1,3)
1 FORMAT(A3,I6,3(E15.7,2X))
RETURN
END
C
C BOUNDARY NODES
C
SUBROUTINE GETBCL(NBX,NBC,IBL)
INTEGER*2 IBL(NBX),NBC
CHARACTER ICHR*3
BACKSPACE(1)
READ(1,1) ICHR,NBC,(IBL(J),J=1,NBC)
1 FORMAT(A3,31I6)
RETURN
END
C
C BOUNDARY VALUES
C
SUBROUTINE GETBCV(NBX,NBC,VBL)
REAL*4 VBL(NBX)
INTEGER*2 NBC
CHARACTER ICHR*3
BACKSPACE(1)
READ(1,1) ICHR,IN,(VBL(J),J=1,NBC)
1 FORMAT(A3,I6,30F6.1)
RETURN
END
C
C SHAPE FUNCTIONS FOR LINEAR TRIANGLE ELEMENT IN GLOBAL COORDINATE
C
SUBROUTINE FTRILIN2(X,Y,XJ,YJ,FUN,IDIM)
REAL*4 FUN(IDIM), XJ(IDIM), YJ(IDIM), X, Y, AREAX2
INTEGER*2 IDIM
AREAX2 = (XJ(1)*YJ(2)-XJ(2)*YJ(1)+XJ(2)*YJ(3)-XJ(3)*YJ(2)+
. XJ(3)*YJ(1)-XJ(1)*YJ(3))
DO 10 J = 1,3
J1 = J+1
IF(J1.GT.3) J1=J1-3
J2 = J+2
IF(J2.GT.3) J2=J2-3
ALF = XJ(J1)*YJ(J2) - XJ(J2)*YJ(J1)
BET = YJ(J1) - YJ(J2)
GAM = XJ(J2) - XJ(J1)
FUN(J) = (ALF + BET*X + GAM*Y)/AREAX2
10 CONTINUE
RETURN
END
C
C SHAPE FUNCTION DERIVATIVES FOR LINEAR TRIANGLE ELEMENT IN GLOBAL COORDINATE
C
SUBROUTINE DFTRLIN3(XJ,YJ,DFUN,IDIM,AREA,NX)
REAL*4 DFUN(NX,IDIM), XJ(IDIM), YJ(IDIM), AREA, AREAX2
INTEGER*2 IDIM,NX
AREAX2 = (XJ(1)*YJ(2)-XJ(2)*YJ(1)+XJ(2)*YJ(3)-XJ(3)*YJ(2)+
. XJ(3)*YJ(1)-XJ(1)*YJ(3))
AREA = AREAX2/2.
DO 10 J = 1,IDIM
J1 = J+1
IF(J1.GT.3) J1=J1-3
J2 = J+2
IF(J2.GT.3) J2=J2-3
ALF = XJ(J1)*YJ(J2) - XJ(J2)*YJ(J1)
BET = YJ(J1) - YJ(J2)
GAM = XJ(J2) - XJ(J1)
DFUN(1,J) = BET/AREAX2
DFUN(2,J) = GAM/AREAX2
10 CONTINUE
RETURN
END
C

You might also like