PROGRAM HELM1DIM
C********************************************************************
C EXACT SOLUTION TO 1DIM HELMHOLTZ EQUATION
C D2U/DXDX + ALPHASQ*U = 0
C -- VARIABLE DEFINITION --
C IBC1 = BOUNDARY CONDITION AT X=0
C BVALUE1 = BOUNDARY VALUE AT X=0
C IBC2 = BOUNDARY CONDITION AT X=L
C BVALUE2 = BOUDARY VALUE AT X=L
C EIJI FUKUMORI AT AICHI JAPAN 21 DEC 1998
C********************************************************************
PARAMETER ( NSEG=20 )
COMPLEX R1,R2,A11,A12,A21,A22, Z1,Z2
C------- A*R**2 + B*R + C = 0
CALL INPUT ( IBC1,BVALUE1,IBC2,BVALUE2,DL,ALPHASQ )
A = 1.
B = 0.
C = ALPHASQ
D = B*B-4.*A*C
R1 = ( -B-CSQRT(CMPLX(D,0.)) ) / (2.*A)
R2 = ( -B+CSQRT(CMPLX(D,0.)) ) / (2.*A)
C
C-------- IMPLEMENTATION OF BOUNDARY CONDITIONS
C-- AT X=0.
CALL BCIMPLE ( 0.,IBC1,R1,R2,A11,A12 )
C-- AT X=DL
CALL BCIMPLE ( DL,IBC2,R1,R2,A21,A22 )
C
C------- DETERMINATION OF Z1 AND Z2
Z1 = ( BVALUE1*A22 - A12*BVALUE2 ) / ( A11*A22 - A12*A21 )
Z2 = ( BVALUE2*A11 - A21*BVALUE1 ) / ( A11*A22 - A12*A21 )
C
CALL OUTPUT ( NSEG,DL,Z1,Z2,R1,R2 )
STOP
END
C
C
SUBROUTINE BCIMPLE ( X,IBC,R1,R2,A1,A2 )
COMPLEX R1,R2,A1,A2
C-------DIRICHLET
IF ( IBC .EQ. 1 ) THEN
A1 = CEXP(R1*X)
A2 = CEXP(R2*X)
ENDIF
IF ( IBC .EQ. 2 ) THEN
C-------NEUMANN
A1 = R1*CEXP(R1*X)
A2 = R2*CEXP(R2*X)
END IF
RETURN
END
C
C
SUBROUTINE INPUT ( IBC1,BVALUE1,IBC2,BVALUE2,DL,ALPHASQ )
WRITE (*,110)
110 FORMAT( ' TYPE IN LENGTH OF DOMAIN = ' $ )
READ (*,*) DL
IF ( DL .LE. 0. ) STOP 'EXECUTION TERMINATED'
C
WRITE (*,120)
120 FORMAT( ' TYPE IN SQUARE OF ALPHA = ' $ )
READ (*,*) ALPHASQ
IF (ALPHASQ .LE. 0. ) STOP 'EXECUTION TERMINATED'
C
WRITE (*,130)
130 FORMAT( ' TYPE IN BOUNDARY CONDITION AT X=0 = ' $ )
READ (*,*) IBC1
WRITE (*,140)
140 FORMAT( ' TYPE IN BOUNDARY VALUE AT X=0 = ' $ )
READ (*,*) BVALUE1
C
WRITE (*,150)
150 FORMAT( ' TYPE IN BOUNDARY CONDITION AT X=L = ' $ )
READ (*,*) IBC2
WRITE (*,160)
160 FORMAT( ' TYPE IN BOUNDARY VALUE AT X=L = ' $ )
READ (*,*) BVALUE2
RETURN
END
C
C
SUBROUTINE OUTPUT ( NSEG,DL,Z1,Z2,R1,R2 )
COMPLEX R1,R2, Z1,Z2, U
OPEN ( 1, FILE='EXACT.DAT', STATUS='UNKNOWN')
WRITE(1,*)'X U(REAL) U(IMAGINARY)'
DO I = 1 , NSEG+1
X = (I-1)*DL/NSEG
U = Z1*CEXP(R1*X) + Z2*CEXP(R2*X)
WRITE(1,'(3F13.8)') X, U
END DO
CLOSE (1)
RETURN
END