PROGRAM INTEFG C====================================================================== C BOUNDARY ELEMENT METHOD C APPLIED TO C LAPLACE EQUATION (STEADY HEAT EQUATION ) C THIS PROGRAM COMPUTES G AND F FUNCTIONS FOR A GIVEN SET OF DATA C PROGRAMMED BY EIJI FUKUMORI // SUNY AT BUFFALO // 1984 SPRING C====================================================================== IMPLICIT REAL*8 ( A-H , O-Z ) PARAMETER (MXE=60,INTEPT=4, ND=2) DIMENSION XE(ND),YE(ND),SAI(INTEPT),W(INTEPT),X(MXE),Y(MXE), * NODEX(MXE,ND) C========================= INITIAL SET-UPS ============================ C1 = - 1./ ( 8.* DATAN( 1.D0) ) CALL GRULE ( INTEPT, SAI, W ) C========================= READING IN DATA ============================ CALL INPUT (ND, MXE, MXI, NE, NODEX, X, Y ) C=============== COMPUTATION OF F AND G FUNCTIONS ============== C OPEN ( 1, FILE='FUNCTION.FG', STATUS='UNKNOWN' ) WRITE (1,*) ' SOURCE-ELEMENT CURRENT-ELEMENT F G' DO ISOURCE = 1 , NE DO ICURREN = 1 , NE CALL MATRIX ( ND,MXE,C1,INTEPT,SAI,W,NE,NODEX,X,Y,XE,YE, * ISOURCE, ICURREN ) END DO END DO CLOSE (1) STOP 'NORMAL TERMINATION' END C C SUBROUTINE MATRIX (ND,MXE,C1,INTEPT,SAI,W,NE,NODEX, X,Y,XE,YE, * ISOURCE, ICURREN ) IMPLICIT REAL*8 ( A-H , O-Z ) DIMENSION X(MXE),Y(MXE), NODEX(MXE,ND),XE(ND),YE(ND), * SAI(INTEPT),W(INTEPT) C ....... (XP,YP) = COORDINATES OF SOURCE POINT. XP = ( X(NODEX(ISOURCE,1)) + X(NODEX(ISOURCE,2)) ) / 2. YP = ( Y(NODEX(ISOURCE,1)) + Y(NODEX(ISOURCE,2)) ) / 2. C ------ CURRENT ELEMENT DO I = 1 , ND XE(I) = X(NODEX(ICURREN,I)) YE(I) = Y(NODEX(ICURREN,I)) END DO C-------- INTEGRATION OF f AND G ON A GIVEN ELEMENT IF ( ISOURCE .EQ. ICURREN ) THEN CALL FINE ( ND, C1, XE, YE, GE, FE ) ELSE CALL INTE ( INTEPT,ND, XP, YP, C1, XE, YE, SAI, W, GE, FE ) END IF WRITE (1,*) ISOURCE, ICURREN , FE, GE RETURN END C C SUBROUTINE INPUT (ND,MXE,MXI,NE,NODEX, X,Y ) IMPLICIT REAL*8 ( A-H , O-Z ) DIMENSION X(MXE),Y(MXE),NODEX(MXE,ND) OPEN ( 1, FILE='BEMFG.DAT', STATUS='OLD' ) READ (1,*) NE DO IEL = 1 , NE READ (1,*) I,(NODEX(I,J),J=1,ND) END DO DO I = 1 , NE READ (1,*) NODE, X(NODE), Y(NODE) END DO CLOSE (1) RETURN END C C SUBROUTINE FINE ( ND, C1, XE, YE, GE, FE ) IMPLICIT REAL*8 ( A-H , O-Z ) DIMENSION XE(ND), YE(ND) FE = 0.D0 DX = XE(2) - XE(1) DY = YE(2) - YE(1) DS = DSQRT ( DX*DX + DY*DY ) GE = DS*C1 * ( DLOG(DS/2.D0) - 1.D0 ) RETURN END C C SUBROUTINE INTE (INTEPT, ND, XP, YP, C1, XE, YE, SAI,W, GE,FE ) IMPLICIT REAL*8 ( A-H , O-Z ) DIMENSION XE(ND), YE(ND), SAI(INTEPT), W(INTEPT) GE = 0.D0 FE = 0.D0 DX = XE(2) - XE(1) DY = YE(2) - YE(1) DS = DSQRT ( DX*DX + DY*DY ) C-------(RNX, RNY) REPRESENTS NORMAL VECTOR RNX = DY/DS RNY = -DX/DS C------- DETJ STANDS FOR DETERMINANT OF JACOBIAN MATORIX DETJ = DS/2.D0 XM = ( XE(2) + XE(1) ) /2.D0 YM = ( YE(2) + YE(1) ) /2.D0 C DO IGAUSS = 1 , INTEPT XGAUSS = DX/2.D0*SAI(IGAUSS) + XM YGAUSS = DY/2.D0*SAI(IGAUSS) + YM RX = XGAUSS - XP RY = YGAUSS - YP R = DSQRT ( RX*RX + RY*RY ) C-------- INTEGRATION OF G(R) GE = GE + DLOG(R) * W(IGAUSS) C-------- INTEGRATION OF F(R) FE = FE + ( RX*RNX + RY*RNY ) / (R*R) * W(IGAUSS) END DO GE = C1 * DETJ * GE FE = -C1 * DETJ * FE RETURN END C C SUBROUTINE GRULE ( N , SAI , W ) IMPLICIT REAL*8 ( A-H , O-Z ) DIMENSION SAI(N) , W(N) IF ( N .LT. 2 ) STOP'N<2' IF ( N .GT. 4 ) STOP'N>4' IF ( N .EQ. 2 ) THEN SAI(1) = DSQRT(3.D0)/3.D0 W(1) = 1.D0 SAI(2) = - SAI(1) W(2) = W(1) RETURN END IF IF ( N .EQ. 3 ) THEN SAI(1) = DSQRT(15.D0)/5.D0 SAI(2) = 0.D0 W(1) = 5.D0/ 9.D0 W(2) = 8.D0/ 9.D0 SAI(3) = - SAI(1) W(3) = W(1) RETURN END IF IF ( N .EQ. 4 ) THEN SAI(1) = 0.33998104358485D0 SAI(2) = 0.86113631159405D0 W(1) = 0.65214515486254D0 W(2) = 0.34785484513745D0 SAI(3) = -SAI(2) SAI(4) = -SAI(1) W(3) = W(2) W(4) = W(1) RETURN END IF RETURN END