PROGRAM WAVEPLOT
C=======================================================================
C                      FINITE ELEMENT GRAPHICS FOR
C                  TWO-DIMENSIONAL POTENTIAL PROBLEMS
C            ELEMENT TYPE: FOUR-NODED ELEMENT FOR DOMAIN
C                          TWO-NODED ELEMENT FOR BOUNDARY
C             CREATE FILES CONTAINING XY-COORDINTE VALUES
C         ORIGINAL CODE: NSEQ8GRA.FOR, EIJI FUKUMORI, JULY 1985
C=======================================================================
      IMPLICIT REAL*8 ( A-H , O-Z )
      PARAMETER ( MXE=30000,MXN=33000,MXB=10000,ND=4)
C                                ARRAYS
      DIMENSION NODEX(MXE,ND),ISEG(MXE,ND),IB(MXE,ND)
      DIMENSION IBND(MXB), BV(MXB), ITYPE(MXB)
      DIMENSION XCOORD(MXN),YCOORD(MXN),POTEN(MXN)
      DIMENSION S(ND), BX(2,ND), NODEXB(MXE,ND)
      DIMENSION XB(MXN), YB(MXN), PP(MXN)
C=======================================================================
      WRITE(*,*)' POTENTIAL GRAPHICS PROGRAM'
      WRITE (*,*)' READING IN DATA FILES'
C
      CALL INPUT ( MXE,MXN,MXB,ND,NE,NNODE,NB,NODEX,XCOORD,YCOORD,
     *             POTEN,XB,YB,PP,NEB,NNODEB,NODEXB )
C=======================================================================
      CALL PLTEL4 (ND,MXE,MXN,NODEX,NE,XCOORD,YCOORD,NNODE,IB,
     * NEB,NODEXB,XB,YB )
C=====================================================================
      WRITE(*,*)' TYPE IN NUMBER OF CONTOUR LINES(N=20 ABOUT RIGHT)'
      NSTEP = 20
      WRITE(*,*)' N=', NSTEP
C=====================================================================
      CALL POTENTL (MXE,MXN,ND,NE,NNODE,NODEX,XCOORD,YCOORD,POTEN,
     * S,BX,IB, NEB,NODEXB,XB,YB, NSTEP )
      STOP 'TERMINATION'
      END
C
C
      SUBROUTINE INPUT ( MXE,MXN,MXB,ND,NE,NNODE,NB,NODEX,XCOORD,
     * YCOORD,POTEN,XB,YB,PP,NEB,NNODEB,NODEXB )
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION NODEX(MXE,ND),XCOORD(MXN),YCOORD(MXN),IBND(MXB),
     * POTEN(MXN),ITYPE(MXB),BV(MXB),NODEXB(MXE,ND)
      DIMENSION XB(MXN),YB(MXN),PP(MXN)
C
      OPEN (1,FILE='DOMAIN.BIN',STATUS='UNKNOWN',FORM='UNFORMATTED')
      READ(1) NE
      READ(1) NNODE
      DO I = 1 , NE
      READ(1) (NODEX(I,J),J=1,ND)
      END DO
      READ(1) ( XB(I) , I=1 , NNODE )
      READ(1) ( YB(I) , I=1 , NNODE )
      READ(1) ( PP(I) , I=1 , NNODE )
      CLOSE (1)
      DO I = 1 , NNODE
      XCOORD(I) = XB(I)
      YCOORD(I) = YB(I)
      POTEN (I) = PP(I)
      END DO
      WRITE(*,*) 'NUMBER OF DOMAIN ELEMENTS =',NE
      WRITE(*,*) 'NUMBER OF DOMAIN NODAL POINTS =',NNODE
C
      OPEN ( 1, FILE='BEM1.DAT', STATUS='UNKNOWN' )
      READ (1,*) OMEGA
      READ (1,*) NEB
      DO IEL = 1 , NEB
      READ (1,*) I,(NODEXB(I,J),J=1,2)
      END DO
      READ(1,*) NNODEB
      DO I = 1 , NNODEB
      READ (1,*) NODE, XB(NODE), YB(NODE)
      END DO
      CLOSE (1)
C
      RETURN
      END
C
C
      SUBROUTINE POTENTL ( MXE,MXN,ND,NE,NNODE,NODEX, XCOORD,YCOORD,
     *   POTEN,S,B,IB,NEB,NODEXB,XB,YB, NSTEP )
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION S(ND),NODEX(MXE,ND),XCOORD(MXN),YCOORD(MXN),IB(MXE,ND),
     * B(2,ND),POTEN(MXN),NODEXB(MXE,ND), XB(MXN),YB(MXN)
      CHARACTER FILENAME*12
      COMMON / PLOTTING / FILENAME
      COMMON / PORT / TMIN, TMAX  / INCREM / DT
      FILENAME = 'POTENTAL.OUT'
      CALL MINMAX ( MXN, NNODE, POTEN, TMIN, TMAX )
      CALL CONTOUR (MXE,MXN,ND,NE,NNODE,NODEX,XCOORD,YCOORD,
     * S,B,IB,POTEN, NSTEP)
      CALL BOUNDB ( MXE,MXN,ND,NEB,NODEXB,XB,YB )
      CALL PLTEXT
      RETURN 
      END
C
C
      SUBROUTINE BOUNDB ( MXE,MXN,ND,NEB,NODEXB,XB,YB )
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION NODEXB(MXE,ND), XB(MXN),YB(MXN)
      DO I = 1 , NEB
      X1 = XB(NODEXB(I,1))
      Y1 = YB(NODEXB(I,1))
      X2 = XB(NODEXB(I,2))
      Y2 = YB(NODEXB(I,2))
      CALL XMOVE ( X1 , Y1 )
      CALL XDRAW ( X2 , Y2 )
      END DO
      RETURN
      END
C
C
      SUBROUTINE CONTOUR (MXE,MXN,ND,NE,NNODE,NODEX,XCOORD,YCOORD,
     *                    S, B, IB, P, NSTEP )
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION NODEX(MXE,ND), XCOORD(MXN),YCOORD(MXN), P(MXN),
     *          S(ND), B(2,ND), IB(MXE,ND)
      COMMON / PORT / PPMIN, PPMAX, / INCREM / DS
      IF ( PPMAX .EQ. PPMIN ) RETURN
      NSTEP = NSTEP/2*2
      DS = ( PPMAX - PPMIN ) / NSTEP
C
      IF ( (PPMIN .LT. 0.) .AND. (PPMAX.GT.0.) ) THEN
      DS = AMAX1(PPMAX, -PPMIN)/NSTEP
      END IF
      WRITE(*,*) 'NSTEP =',NSTEP, '  DS = ',DS 
      WRITE(*,*)'  PPMAX=',PPMAX,'   PPMIN=',PPMIN
C
      CALL PLTLGO
      IC = 0
      CALL BOUND ( MXE,MXN,ND,NE,NNODE,NODEX,XCOORD,YCOORD,IB,IC )
      DO IEL = 1 , NE
      DO I   = 1 , ND
      B(1,I) = XCOORD(NODEX(IEL,I))
      B(2,I) = YCOORD(NODEX(IEL,I))
      S(I)   =      P(NODEX(IEL,I))
      END DO
      IF ( (PPMIN .LT. 0.) .AND. (PPMAX.GT.0.) ) THEN
      CALL PLTSAI ( DS, NSTEP/2, -NSTEP*DS/2, B, S )
C      CALL PLTSAI ( DS,     1,        0., B, S )
      CALL PLTSAI ( DS, NSTEP/2,        DS, B, S )
      ELSE
      CALL PLTSAI ( DS, NSTEP, PPMIN, B, S )
      END IF
      END DO
      RETURN
      END
C
C
      SUBROUTINE PLTSAI ( DS, NSTEP, START, CRD, SS )
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION CRD(2,4), SS(4), X(4), Y(4), S(4)
      IF ( NSTEP .EQ. 0 ) RETURN
      X(3) = ( CRD(1,1) + CRD(1,2) + CRD(1,3) + CRD(1,4) ) / 4.
      Y(3) = ( CRD(2,1) + CRD(2,2) + CRD(2,3) + CRD(2,4) ) / 4.
      S(3) = ( SS(1) + SS(2) + SS(3) + SS(4) ) / 4.
      SMAX = AMAX1 ( SS(1), SS(2), SS(3), SS(4) )
      SMIN = AMIN1 ( SS(1), SS(2), SS(3), SS(4) )
      IF ( START .GT. SMAX ) RETURN
      DO 52 LEVEL = 1 , NSTEP
      SXY = START + (LEVEL-1) * DS
      IF ( (SMAX-SXY)*(SMIN-SXY) .LT. 0 ) THEN
      DO 60 IEL = 1 , 4
      X(1) = CRD(1,IEL)
      Y(1) = CRD(2,IEL)
      S(1) = SS(IEL)
      IF ( IEL .EQ. 4 ) THEN
      X(2) = CRD(1,1)
      Y(2) = CRD(2,1)
      S(2) = SS(1)
      ELSE
      X(2) = CRD(1,IEL+1)
      Y(2) = CRD(2,IEL+1)
      S(2) = SS   (IEL+1)
      ENDIF
      X(4) = X(1)
      Y(4) = Y(1)
      S(4) = S(1)
      K = 0
      DO 70 ISG = 1 , 3
      IF ( S(ISG  ) .LT. SXY ) GO TO 30
      IF ( S(ISG+1) .LT. SXY ) GO TO 40
      GO TO 70
   30 IF ( S(ISG+1) .LT. SXY ) GO TO 70
   40 T = ( SXY - S(ISG) ) / ( S(ISG+1) - S(ISG) )
      X0 = X(ISG+1)*T + (1.- T)*X(ISG)
      Y0 = Y(ISG+1)*T + (1.- T)*Y(ISG)
      IF ( K .EQ. 0 ) GO TO 71
      CALL XDRAW ( X0, Y0 )
      GO TO 60
   71 CALL XMOVE ( X0, Y0 )
      K = 1
   70 CONTINUE
   60 CONTINUE
      ENDIF
   52 CONTINUE
      RETURN
      END
C
C
      SUBROUTINE BOUND (MXE,MXN,ND,NE,NNODE,NODEX,XCOORD,YCOORD,IB,IC)
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION XCOORD(MXN),YCOORD(MXN),NODEX(MXE,ND),IB(MXE,ND)
C---------- IF IC=0, BOUNDARY LINE ONLY
C---------- IF IC=1, ELEMENTS
C--------- INITIALIZATION
      IF ( IC .EQ. 1 ) THEN
      DO IEL = 1 , NE
      DO J = 1 , ND
      IS = J
      IE = J + 1
      IF ( IS .EQ. ND ) IE = 1
      NDIS = NODEX(IEL,IS)
      NDIE = NODEX(IEL,IE)
      CALL XMOVE ( XCOORD(NDIS) , YCOORD(NDIS) )
      CALL XDRAW ( XCOORD(NDIE) , YCOORD(NDIE) )
      END DO
      END DO
      RETURN
      END IF
C=============== FOR A CASE OF IC=0 ==================
      DO I = 1 , NE
      DO J = 1 , ND
      IB(I,J) = 0
      END DO
      END DO
C
      DO IEL = 1 , NE-1
      DO ISEG = 1 , ND
              IS = ISEG
              IE = ISEG+1
              IF ( IS .EQ. ND ) IE = 1
              NDI1 = NODEX(IEL,IS)
              NDI2 = NODEX(IEL,IE)
        IF ( IB(IEL,ISEG) .EQ. 0 ) THEN
          DO JEL = IEL+1 , NE
          DO JSEG = 1 , ND
                JS = JSEG
                JE = JSEG+1
                IF ( JS .EQ. ND ) JE = 1
                NDJ1 = NODEX(JEL,JS)
                NDJ2 = NODEX(JEL,JE)
            IF ( (NDI1 .EQ. NDJ2) .AND. (NDI2 .EQ. NDJ1) ) THEN
                  IB(JEL,JSEG) = 1
                  IB(IEL,ISEG) = 1
            END IF
          END DO
          END DO
        END IF
      END DO
      END DO
C
      DO IEL = 1 , NE
      DO ISEG = 1 , ND
      IF ( IB(IEL,ISEG) .EQ. 0 ) THEN
      IS = ISEG
      IE = ISEG+1
      IF ( IS .EQ. ND ) IE = 1
      IS = NODEX(IEL,IS)
      IE = NODEX(IEL,IE)
      CALL XMOVE ( XCOORD(IS) , YCOORD(IS) )
      CALL XDRAW ( XCOORD(IE) , YCOORD(IE) )
      END IF
      END DO
      END DO
      RETURN
      END
C
C
      SUBROUTINE MINMAX ( MXN, NNODE, Q, QMIN, QMAX )
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION Q(MXN)
      QMIN = Q(1)
      QMAX = Q(1)
      DO I = 1 , NNODE
      QMIN = AMIN1 ( QMIN , Q(I) )
      QMAX = AMAX1 ( QMAX , Q(I) )
      END DO
      RETURN
      END
C
C
      SUBROUTINE PLTEL4 (ND,MXE,MXN,NODEX,NE,XCOORD,YCOORD,NNODE,IB,
     * NEB,NODEXB,XB,YB )                
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION NODEX(MXE,ND),XCOORD(MXN),YCOORD(MXN),IB(MXE,ND),
     * NODEXB(MXE,ND), XB(MXN),YB(MXN)
      CHARACTER FILENAME*12
      COMMON / PLOTTING / FILENAME
      FILENAME = "ELEMENT.OUT"
      CALL PLTLGO
      CALL BOUNDB ( MXE,MXN,ND,NEB,NODEXB,XB,YB )
      IC = 1
      CALL BOUND ( MXE,MXN,ND,NE,NNODE,NODEX,XCOORD,YCOORD,IB,IC )
      CALL PLTEXT
      RETURN
      END
C
C
      SUBROUTINE SEGCHK ( ND,MXE,NODEX,NE,ISEG,II,JJ )
      IMPLICIT REAL*8 ( A-H , O-Z )
      DIMENSION  NODEX(MXE,ND), ISEG(MXE,ND)
      DO IEL = 1 , NE
      DO I = 1 , ND
      IF ( NODEX(IEL,I) .EQ.JJ  ) THEN
      J = I + 1
      IF ( I .EQ. ND ) J = 1
      IF ( NODEX(IEL,J).EQ.II ) THEN
      ISEG (IEL,I) = 0
      RETURN
      ENDIF
      ENDIF
      END DO
      END DO
      RETURN
      END
C
C======================== GRAPHICS RUTINES =============================
      SUBROUTINE PLTLGO
      IMPLICIT REAL*8 ( A-H , O-Z )
      CHARACTER FILENAME*12
      COMMON / PLOTTING / FILENAME
      OPEN ( 1, FILE=FILENAME, STATUS='UNKNOWN' )
      RETURN
      END
C
C
      SUBROUTINE PLTEXT
      IMPLICIT REAL*8 ( A-H , O-Z )
      CLOSE (1)
      RETURN
      END
C
C
      SUBROUTINE XMOVE ( X , Y )
      IMPLICIT REAL*8 ( A-H , O-Z )
      WRITE(1,*) X, Y
      RETURN
      END
C
C
      SUBROUTINE XDRAW ( X , Y )
      IMPLICIT REAL*8 ( A-H , O-Z )
      WRITE(1,*) X, Y
      WRITE(1,*)
      RETURN
      END