PROGRAM SETLINQ16OV
C======================================================================
C                      INPUT DATA SET-UP PROGRAM
C                                 FOR
C                       BOUNDARY ELEMENT METHOD
C                              APPLIED TO
C              HELMHOLTZ EQUATION (HAMONIC WAVE EQUATION )
C                 ELEMENT TYPE: LINEAR ELEMENT
C                             DOMAIN: OVAL
C      ********** WAVE AROUND OVAL IN INIFINITE DOMAIN *********
C                PROGRAMMED BY EIJI FUKUMORI 2025 JAN 9
C======================================================================
      IMPLICIT REAL*8 ( A-H , O-Z )
      PARAMETER (MXE=1000, MXN=MXE, MXI=20, ND=2)
      DIMENSION NODEX(MXE,ND),IELTYPE(MXE),X(MXN),Y(MXN),
     *          XI(MXI),YI(MXI)
      COMPLEX*16 BV(MXE,ND)
C-------  RL = WAVE LENGTH,  DIAMETER = DIAMETER OF CYLINDER 
C------- NDIV = NUMBER OF ELEMENTS ON THE CYLINDER
C
C------- BASIC PARAMETERS
      NDIV=32
      RL = 1.D0
      DIAMETER = 1.6D0
C------- CONSTANTS
      PI = 4.D0*DATAN ( 1.D0 )
      OMEGA = 2.D0*PI/RL
      NE = NDIV
      NNODE = NE
C---------- NODAL COORDINATES ( CLOCKWISE ) ---------------
      DTHETA = -2.D0*PI/NDIV
      R = DIAMETER/2.D0
C
      I = 1
      THETA = DTHETA*(I-1)
      UNITR = SQRT ( 1.D0/(1.D0-DSIN(THETA)*DCOS(THETA)))
      X(I) = R*UNITR*COS(THETA)
      Y(I) = R*UNITR*SIN(THETA)
      XMIN = X(I)
      XMAX = X(I)
      DO I = 2 , NDIV
      THETA = DTHETA*(I-1)
      UNITR = SQRT ( 1.D0/(1.D0-DSIN(THETA)*DCOS(THETA)))
      X(I) = R*UNITR*COS(THETA)
      Y(I) = R*UNITR*SIN(THETA)
      XMIN = DMIN1(XMIN, X(I) )
      XMAX = DMAX1(XMAX, X(I) )
      END DO
C-------------------- OMEGA ----------------------
      XL = XMAX - XMIN
      OMEGA = 2.D0*PI/XL
      WRITE(*,*) 'XL =', XL
C---------  NODEX(I,J)
      DO I = 1 , NE
      NODE1 = I
      NODE2 = I + 1
      IF ( I .EQ. NE ) NODE2 = 1
      NODEX(I,1) = NODE1
      NODEX(I,2) = NODE2
      END DO
C--------- BOUNDARY VALUES OF U AND V
      DO I = 1 , NE
      NODE1 = I
      NODE2 = I + 1
      IF ( I .EQ. NE ) NODE2 = 1
      DX = X(NODE2) - X(NODE1)
      DY = Y(NODE2) - Y(NODE1)
      DS = SQRT ( DX*DX + DY*DY )
      U1 =  OMEGA * (DY/DS) * SIN(OMEGA*X(NODE1))
      U2 =  OMEGA * (DY/DS) * SIN(OMEGA*X(NODE2))
      V1 = -OMEGA * (DY/DS) * COS(OMEGA*X(NODE1))
      V2 = -OMEGA * (DY/DS) * COS(OMEGA*X(NODE2))
      BV(I,1) = CMPLX( U1 , V1 )
      BV(I,2) = CMPLX( U2 , V2 )
      IELTYPE(I) = 2
      END DO
C-------- INTERNAL POINTS
      NIPT = 5
      DO I = 1 , 5
      XI(I) = I
      YI(I) = 0.D0
      END DO
C-------------- FILE CREATION -----------------------
      OPEN ( 1, FILE='BEM1.DAT', STATUS='UNKNOWN' )
      WRITE (1,*) OMEGA
      WRITE (1,*) NE
      DO I = 1 , NE
      WRITE (1,*) I,(NODEX(I,J),J=1,ND),IELTYPE(I), 
     * ( DREAL(BV(I,J)), DIMAG(BV(I,J)), J=1,ND )
      END DO
      WRITE (1,*) NNODE
      DO I = 1 , NNODE
      WRITE (1,*) I, X(I), Y(I)
      END DO
      WRITE (1,*) NIPT
      IF ( NIPT .GE. 1 ) THEN
      DO I = 1  , NIPT
      WRITE (1,*) I, XI(I), YI(I)
      END DO
      END IF
      CLOSE (1)
C------------------ BOUNDARY ELEMENTS ---------------
      OPEN ( 1, FILE='BOUNDARYELEMENTS.OUT', STATUS='UNKNOWN' )
      DO I = 1 , NE
      WRITE (1,*) X(NODEX(I,1)), Y(NODEX(I,1))
      WRITE (1,*) X(NODEX(I,2)), Y(NODEX(I,2))
      WRITE (1,*)
      END DO
      CLOSE (1)
      STOP
      END