A.2 Codes of Groundwater Flow

 

 

!****************************************!  HEADS.f90

!  By Samuel Sangwon Lee, 1999

!****************************************  

   IMPLICIT NONE

   INTEGER*4 MPX,MPY,MPX1,MPY1 

! Number of pixels in x and y directions

   REAL*8 DX,DY  ! Pixel size

   PARAMETER (MPX=90,MPY=56,MPX1=MPX+1,MPY1=MPY+1,DX=10.0,DY=1.0)

   REAL*8 H(-1:MPX1,0:MPY1),X(-1:MPX1),Y(0:MPY1),DEPTH1(0:MPX),DEPTH2(0:MPX) &,HBEDI,ERMAX,OLDH,ERR

   INTEGER*4 NDEP(0:MPX),NDEPI,I,J,NUMIT

   CHARACTER DUMMY*1

! INITIALIZE ALL H(I,J) VALUES TO BE 0

   DO J=0,MPY1                DO I=-1,MPX1

   H(I,J) = 0.0    END DO       END DO

! WATER TABLE BOUNDARY

   OPEN(1,FILE='S600.tbl',STATUS='OLD')

   READ(1,'(A)')DUMMY 

! Reading variable labels (x, h, DEPTH)

   DO I=0,MPX

READ(1,*)X(I),H(I,0),DEPTH1(I),DEPTH2(I)

   END DO               CLOSE(1)

   X(-1) = X(0) - DX 

! Defining x and y values

   X(MPX1) = X(MPX) + DX

   DO J=0,MPY1

Y(J) = -DY*J     END DO

   DO I=0,MPX

  NDEP(I) = -DEPTH2(I)/DY

   END DO

! KEEP TRACK OF NUMBER OF ITERATIONS AND !OF LARGEST ERROR NO-FLOW BOUNDARIES NEED !TO BE RESET WITHIN EACH ITERATION LOOP

   NUMIT = 0

10 ERMAX = 0.0

   NUMIT = NUMIT + 1

! KEEPING NO-FLOW BOUNDARY CONDITION

   DO J=0,MPY  ! Left & right boundaries

   H(-1,J) = H(1,J)

   H(MPX1,J) = H(MPX-1,J)     END DO

   DO I=0,MPX 

! Bottom boundary at bedrock

     NDEPI = NDEP(I)

     H(I,NDEPI+1) = H(I,NDEPI-1)

     HBEDI = H(I,NDEPI+1)

     DO J=NDEPI+2,MPY1

       H(I,J) = HBEDI

     END DO             END DO

! SWEEP INTERIOR POINTS WITH 5-POINT !OPERATOR

   DO J=1,MPY           DO I=0,MPX

     IF (J.LE.NDEP(I)) THEN 

! Stop at the bedrock surface

    OLDH = H(I,J)

    H(I,J) = (H(I-1,J) + H(I+1,J) + H(I,J-1) + H(I,J+1))/4.0

    ERR = ABS(H(I,J) - OLDH)

    IF (ERR.GT.ERMAX) ERMAX=ERR

  END IF       END DO        END DO

! DO ANOTHER ITERATION IF LARGEST ERROR !AFFECTS 7TH DECIMAL PLACE

   IF(ERMAX.GT.0.000001) GO TO 10

! WE ARE DONE.  WRITE ONTO THE OUTPUT !FILE

   OPEN (1,FILE='S600.hed')

   WRITE (1,100)NUMIT

100 FORMAT(' NUMBER OF ITERATIONS: ',I5/'  X(ft)'4X'Y(ft)'6X'H(ft)')

   DO I=-1,MPX1   DO J=0,MPY1

     WRITE(1,110)X(I),Y(J),H(I,J)

   END DO               END DO

110 FORMAT(1X,F7.1,2X,F7.1,2X,F9.6)

   CLOSE(1)      STOP             END

!****************************************!       FLOWS.f90

!**************************************** 

   IMPLICIT NONE

   INTEGER*4 MPX,MPY,MPX1,MPY1 

! Number of pixels in x and y directions

   REAL*8 DX,DY  ! Pixel size

   PARAMETER (MPX=90,MPY=56,MPX1=MPX+1,MPY1=MPY+1,DX=10.0,DY=1.0)

   REAL*8 H(-1:MPX1,0:MPY1),X(-1:MPX1),Y(0:MPY1),DEPTH1(0:MPX),DEPTH2(0:MPX) & ,FX(-1:MPX,0:MPY),FY(-1:MPX,0:MPY),K(-1:MPX,0:MPY) &,K1,K2,HX1, HX2,HY1,HY2

   INTEGER*4 NDEP1,NDEP2,I,J

 CHARACTER FTBL*40,FIN*40,FOUT*40,DUMMY*1

! READ DATA FILE NAMES

   FTBL = 'S600.tbl'

   WRITE(*,'(A$)')' Input head value (H) file: '

   READ(*,'(A)')FIN

   FIN = 'S600.hed'

   WRITE(*,'(A$)')' Output flow rate (F) file: '

   READ(*,'(A)')FOUT

   FOUT = 'S600.flw'

! READ HYDRAULIC CONDUCTIVITY

   WRITE(*,'(A$)')' Hydraulic conductivity (1st layer) : '

   READ(*,*)K1

   WRITE(*,'(A$)')' Hydraulic conductivity (2nd layer) : '

   READ(*,*)K2

! READ WATER TABLE & LAYER DEPTH DATA

   OPEN(1,FILE=FTBL,STATUS='OLD')

   READ(1,'(A)')DUMMY 

! Reading variable labels (x, h, DEPTH1, !DEPTH2)

   DO I=0,MPX

 READ(1,*)X(I),H(I,0),DEPTH1(I),DEPTH2(I)

   END DO               CLOSE(1)

! READ H(I,J) VALUES FROM EXISTING FILE

   OPEN(1,FILE=FIN)

   READ(1,100)DUMMY  ! Skip two lines

   READ(1,100)DUMMY

100 FORMAT(A1)

   DO I=-1,MPX1 DO J=0,MPY1

     READ(1,*)X(I),Y(J),H(I,J)

   END DO       END DO    CLOSE(1)

! DEFINE THE FLOW RATE PIXELS SHIFTED BY !HALF A PIXEL

   DO I=-1,MPX

     X(I) = (X(I) + X(I+1))/2

   END DO

   DO J=0,MPY

     Y(J) = (Y(J) + Y(J+1))/2

   END DO

! SET HYDRAULIC CONDUCTIVITY K(I,J) !VALUES

   DEPTH1(-1) = DEPTH1(0)

   DEPTH2(-1) = DEPTH2(0)

   DO I=-1,MPX

     NDEP1 = -DEPTH1(I)/DY

     NDEP2 = -DEPTH2(I)/DY

     DO J=0,NDEP1-1

       K(I,J) = K1  ! First layer

     END DO

     DO J=NDEP1,NDEP2-1

       K(I,J) = K2  ! Second layer

     END DO

     DO J=NDEP2,MPY

       K(I,J) = 0   ! Bedrock

     END DO             END DO

! CALCULATE THE FLOW RATES

   DO J=0,MPY           DO I=-1,MPX

   HX1 = (H(I,J) + H(I,J+1)) / 2.0

   HX2 = (H(I+1,J) + H(I+1,J+1)) / 2.0

   FX(I,J) = -K(I,J) * (HX2 - HX1) / DX

   HY1 = (H(I,J) + H(I+1,J)) / 2.0

   HY2 = (H(I,J+1) + H(I+1,J+1)) / 2.0

   FY(I,J) = -K(I,J) * (HY1 - HY2) / DY

   END DO               END DO

! WRITE ONTO A FILE

   OPEN (1,FILE=FOUT)

   WRITE (1,110)K1, K2

110 FORMAT(' Hydraulic conductivity: 'F7.1' (1st Layer), 'F7.1' (2nd Layer)')

   WRITE(1,115)

115FORMAT('X(ft)'4X'Y(ft)'9X'Fx'11X' Fy')

   DO J=0,MPY           DO I=-1,MPX

   WRITE(1,120)X(I),Y(J),FX(I,J),FY(I,J)

   END DO               END DO

120 FORMAT(1X,F7.1,2X,F7.1,1X,F12.7, 1X,F12.6)

   CLOSE(1)      STOP             END

!***************************************

!       VFLOW.f90

!***************************************

   IMPLICIT NONE

   INTEGER*4 MPX,MPY,MPX1,MPY1 

! Number of pixels in x and y directions

   REAL*8 DX,DY  ! Pixel size

   PARAMETER (MPX=90,MPY=56,MPX1=MPX+1,MPY1=MPY+1,DX=10.0,DY=1.0)

   REAL*8 X(-1:MPX),Y(0:MPY), V(0:MPX,0:MPY),FX(-1:MPX,0:MPY),FY(-1:MPX,0:MPY) &  ,VIJ1,VIJ2,VIJ3,VIJ4, VOLD,ERR,ERMAX

   INTEGER*4 I,J,NUMIT

   CHARACTER FIN*40,FOUT*40,DUMMY*1

! READ FILE NAMES

   WRITE(*,'(A$)')' Input flow rate (F) file : '

   READ(*,'(A)')FIN

   FIN = 'S600.flw'

   WRITE(*,'(A$)')' Output flow function (V) file : '

   READ(*,'(A)')FOUT

   FOUT = 'S600.vxy'

! READ FX(I,J) & FY(I,J) VALUES FROM !EXISTING FILE

   OPEN(1,FILE=FIN)

   READ(1,100)DUMMY  ! Skip labels

   READ(1,100)DUMMY

100 FORMAT(A1)

   DO J=0,MPY           DO I=-1,MPX

   READ(1,*)X(I),Y(J),FX(I,J),FY(I,J)

   END DO      END DO        CLOSE(1)

! DEFINE THE FLOW FUNCTION PIXELS SHIFTED !BY HALF A PIXEL

   DO I=MPX,0,-1

     X(I) = ( X(I) + X(I-1) ) / 2

   END DO

      DO J=MPY,1,-1

     Y(J) = ( Y(J) + Y(J-1) ) / 2

   END DO

   Y(0) = 0

! REDEFINE FX & FY

   DO I=-1,MPX            DO J=MPY,1,-1

   FY(I,J) = ( FY(I,J) + FY(I,J-1) ) / 2

   END DO               END DO

   DO J=0,MPY           DO I=0,MPX

     FX(I,J)= ( FX(I,J) + FX(I-1,J) ) / 2

   END DO               END DO

! INITIALIZE THE FLOW FUNCTION V(X,Y)

   DO I=0,MPX           DO J=0,MPY

     V(I,J) = 0

   END DO              END DO

! CALCULATE THE FLOW FUNCTION V(X,Y)

! V(X,Y)=0 AT THE RIGHT, LEFT, BOTTOM !BOUNDARIES

  NUMIT = 0  ! Number of iterations set 0

10  ERMAX = 0 

! Initialize error maximum to 0

  NUMIT = NUMIT + 1

  DO I=1,MPX-1

    VOLD = V(I,0)

    V(I,0) = V(I,1) + FX(I,0)*DY

    ERR = ABS( V(I,0) - VOLD )

    IF (ERR.GT.ERMAX) ERMAX = ERR

  DO J=1,MPY-1

    VOLD = V(I,J)

    VIJ1 = V(I,J+1) + FX(I,J)*DY

    VIJ2 = V(I,J-1) + FX(I,J-1)*(-DY)

    VIJ3 = V(I-1,J) - FY(I-1,J)*DX

    VIJ4 = V(I+1,J) - FY(I,J)*(-DX)

    V(I,J)=(VIJ1 + VIJ2 + VIJ3 + VIJ4)/4

       ERR = ABS( V(I,J) - VOLD )

       IF (ERR.GT.ERMAX) ERMAX = ERR

     END DO             END DO

   IF (ERMAX .GT. 0.001) GOTO 10 

! Repeat until error < 0.001

! WRITE ONTO A FILE

   OPEN (1,FILE=FOUT)

   WRITE(1,105)'Number of iterations : ',NUMIT

105 FORMAT(1X,A,I5)

   WRITE(1,110)'X(ft)','Y(ft)','V(X,Y)'

110 FORMAT(1X,2X,A,6X,A,7X,A)

   DO J=0,MPY           DO I=0,MPX

     WRITE(1,120)X(I),Y(J),V(I,J)

   END DO               END DO

120 FORMAT(1X,F7.1,2X,F7.1,2X,F12.3)

   CLOSE(1)       STOP      END





Last modified: Oct 15, 1999
VG Model / Samuel Lee / VADOSE.NET