c Copyright (C) Stichting Deltares, 2005-2017.
c
c This file is part of iMOD.
c
c This program is free software: you can redistribute it and/or modify
c it under the terms of the GNU General Public License as published by
c the Free Software Foundation, either version 3 of the License, or
c (at your option) any later version.
c
c This program is distributed in the hope that it will be useful,
c but WITHOUT ANY WARRANTY; without even the implied warranty of
c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c GNU General Public License for more details.
c
c You should have received a copy of the GNU General Public License
c along with this program. If not, see .
c
c Contact: imod.support@deltares.nl
c Stichting Deltares
c P.O. Box 177
c 2600 MH Delft, The Netherlands.
c
c iMod is partly based on the USGS MODFLOW2005 source code;
c for iMOD the USGS MODFLOW2005 source code has been expanded
c and extensively modified by Stichting Deltares.
c The original USGS MODFLOW2005 source code can be downloaded from the USGS
c website http://www.usgs.gov/. The original MODFLOW2005 code incorporated
c in this file is covered by the USGS Software User Rights Notice;
c you should have received a copy of this notice along with this program.
c If not, see .
SUBROUTINE VDF2DRN7FM(IGRID)
C ******************************************************************
C ADD DRAIN FLOW TO SOURCE TERM
C--SEAWAT: MODIFIED FOR VD FLOW
C ******************************************************************
C
C SPECIFICATIONS:
C ------------------------------------------------------------------
USE VDFMODULE, ONLY:DENSEREF,PS,ELEV
USE GLOBAL, ONLY:IBOUND,HNEW,RHS,HCOF
USE GWFDRNMODULE, ONLY:NDRAIN,DRAI,
1 iiconchk
USE GWFRIVMODULE, ONLY:NRIVER,RIVR
C
DOUBLE PRECISION EEL
C--SEAWAT: ADD EL
DOUBLE PRECISION EL,HHNEW
C--SEAWAT: INCLUDE AUXILIARY VARIABLES
COMMON /DRNCOM/DRNAUX(5)
CHARACTER*16 DRNAUX
C ------------------------------------------------------------------
CALL SGWF2DRN7PNT(IGRID)
C
C1------IF NDRAIN<=0 THERE ARE NO DRAINS. RETURN.
IF(NDRAIN.LE.0) RETURN
C
C--SEAWAT: GET ZDRN IF AUX IS SPECIFIED
LOCZDRN=0
DO I=1,5
IF(DRNAUX(I).EQ.'DRNBELEV') LOCZDRN=I+5
ENDDO
C2------PROCESS EACH CELL IN THE DRAIN LIST.
DO 100 L=1,NDRAIN
C
C3------GET COLUMN, ROW AND LAYER OF CELL CONTAINING DRAIN.
IL=DRAI(1,L)
IR=DRAI(2,L)
IC=DRAI(3,L)
C
if (iiconchk.gt.0) then ! iconchk
if(drai(5,l).le.0.0)goto 100
end if ! iconchk
C
C4-------IF THE CELL IS EXTERNAL SKIP IT.
IF(IBOUND(IC,IR,IL).LE.0) GO TO 100
C
C5-------IF THE CELL IS INTERNAL GET THE DRAIN DATA.
EL=DRAI(4,L)
ZDRN=ELEV(IC,IR,IL)
IF(LOCZDRN.GT.0) ZDRN=DRAI(LOCZDRN,L)
C--SEAWAT: MAKE EEL EQUIVALENT FRESHWATER
EEL=FEHEAD(EL,PS(IC,IR,IL),ZDRN)
C
C6------IF HEAD IS LOWER THAN DRAIN THEN SKIP THIS CELL.
C--SEAWAT:USE SALTHEAD COMPARISONS
IF(SALTHEAD(HNEW(IC,IR,IL),PS(IC,IR,IL),ELEV(IC,IR,IL))
+ .LE.EL) GO TO 100
C
C7------HEAD IS HIGHER THAN DRAIN. ADD TERMS TO RHS AND HCOF.
C--SEAWAT: USE VD FORM,CONSERVE MASS
C=DRAI(5,L)
HCOF(IC,IR,IL)=HCOF(IC,IR,IL)-C*PS(IC,IR,IL)
RHS(IC,IR,IL)=RHS(IC,IR,IL)-C*PS(IC,IR,IL)*
& (EEL-(PS(IC,IR,IL)-DENSEREF)/DENSEREF*
& (ELEV(IC,IR,IL)-ZDRN))
100 CONTINUE
C
C8------RETURN.
RETURN
END
SUBROUTINE VDF2DRN7BD(KSTP,KPER,IGRID)
C ******************************************************************
C CALCULATE VOLUMETRIC BUDGET FOR DRAINS
C-----SEAWAT: ADJUSTED FOR DENSITY
C ******************************************************************
C
C SPECIFICATIONS:
C ------------------------------------------------------------------
USE GLOBAL, ONLY:IOUT,NCOL,NROW,NLAY,IBOUND,HNEW,BUFF
USE GWFBASMODULE,ONLY:MSUM,ICBCFL,IAUXSV,DELT,PERTIM,TOTIM,
1 VBVL,VBNM
USE GWFDRNMODULE,ONLY:NDRAIN,IDRNCB,DRAI,NDRNVL,DRNAUX
1 ,ndrnsubsys,drnsubsidx,idrnsubsys, ! dsubsys
1 iiconchk
USE VDFMODULE, ONLY: DENSEREF,PS,ELEV
C
CHARACTER*16 TEXT
character*16 htxt ! dsubsys
C--SEAWAT: ADD EL
DOUBLE PRECISION HHNEW,EEL,CCDRN,CEL,RATOUT,QQ,EL
C
DATA TEXT /' DRAINS'/
DATA htxt /' DRAINS '/ ! dsubsys
integer isub,lbeg,lend ! dsubsys
C ------------------------------------------------------------------
CALL SGWF2DRN7PNT(IGRID)
C1------INITIALIZE CELL-BY-CELL FLOW TERM FLAG (IBD) AND
C1------ACCUMULATOR (RATOUT).
ZERO=0.
RATOUT=ZERO
IBD=0
IF(IDRNCB.LT.0 .AND. ICBCFL.NE.0) IBD=-1
IF(IDRNCB.GT.0) IBD=ICBCFL
IBDLBL=0
C
C4------IF THERE ARE NO DRAINS THEN DO NOT ACCUMULATE DRAIN FLOW.
IF(NDRAIN.LE.0) GO TO 200
C
C
c loop for subsystems
lend=0 ! dsubsys
do isub=1,ndrnsubsys ! dsubsys
C3------CLEAR THE BUFFER.
DO 50 IL=1,NLAY
DO 50 IR=1,NROW
DO 50 IC=1,NCOL
BUFF(IC,IR,IL)=ZERO
50 CONTINUE
lbeg=drnsubsidx(isub,1) ! dsubsys
lend=drnsubsidx(isub,2) ! dsubsys
! create text
if (idrnsubsys.gt.0) then ! dsubsys
! add number of subsystem to text
write(htxt(15:16),'(i2)') int(drai(idrnsubsys,lbeg)) ! dsubsys
else ! dsubsys
! use standard text
htxt=text ! dsubsys
endif ! dsubsys
C2------IF CELL-BY-CELL FLOWS WILL BE SAVED AS A LIST, WRITE HEADER.
IF(IBD.EQ.2) THEN
NAUX=NDRNVL-6
IF(IAUXSV.EQ.0) NAUX=0
CALL UBDSV4(KSTP,KPER,htxt,NAUX,DRNAUX,IDRNCB,NCOL,NROW,NLAY,
1 NDRAIN,IOUT,DELT,PERTIM,TOTIM,IBOUND)
END IF
C
C5------LOOP THROUGH EACH DRAIN CALCULATING FLOW.
c DO 100 L=1,NDRAIN
DO 100 L=lbeg,lend ! dsubsys
C
C5A-----GET LAYER, ROW & COLUMN OF CELL CONTAINING REACH.
IL=DRAI(1,L)
IR=DRAI(2,L)
IC=DRAI(3,L)
C
if (iiconchk.gt.0) then ! iconchk
if(drai(5,l).le.0.0)goto 100
end if ! iconchk
C
Q=ZERO
C
C5B-----IF CELL IS NO-FLOW OR CONSTANT-HEAD, IGNORE IT.
IF(IBOUND(IC,IR,IL).LE.0) GO TO 99
C
C5C-----GET DRAIN PARAMETERS FROM DRAIN LIST.
EL=DRAI(4,L)
ZDRN=ELEV(IC,IR,IL)
EEL=FEHEAD(EL,PS(IC,IR,IL),ZDRN)
C=DRAI(5,L)
C HHNEW=HNEW(IC,IR,IL)
C--SEAWAT: USE SALTWATER HEAD FOR TURNING DRAIN ON
C5D-----IF SALTHEAD HIGHER THAN DRAIN, CALCULATE Q=C*(EL-HHNEW).
C5D-----SUBTRACT Q FROM RATOUT.
IF(SALTHEAD(HNEW(IC,IR,IL),PS(IC,IR,IL),ELEV(IC,IR,IL))
+ .GT.EL) THEN
CCDRN=C
C--SEAWAT: VD FORM, CONSERVE MASS
QQ=PS(IC,IR,IL)*CCDRN*(EEL-HNEW(IC,IR,IL)-
& (PS(IC,IR,IL)-DENSEREF)/DENSEREF*(ELEV(IC,IR,IL)-ZDRN))
Q=QQ
RATOUT=RATOUT-QQ
END IF
C
C5E-----PRINT THE INDIVIDUAL RATES IF REQUESTED(IDRNCB<0).
IF(IBD.LT.0) THEN
IF(IBDLBL.EQ.0) WRITE(IOUT,61) TEXT,KPER,KSTP
61 FORMAT(1X,/1X,A,' PERIOD ',I4,' STEP ',I3)
C--SEAWAT: WRITE VOLUMETRIC FLUX
WRITE(IOUT,62) L,IL,IR,IC,Q/PS(IC,IR,IL)
62 FORMAT(1X,'DRAIN',I4,' LAYER',I3,' ROW',I5,' COL',
1 I5,' RATE',1PG15.6)
IBDLBL=1
END IF
C
C5F-----ADD Q TO BUFFER.
C--SEAWAT: SAVE AS VOLUMETRIC FLUX
Q=Q/PS(IC,IR,IL)
BUFF(IC,IR,IL)=BUFF(IC,IR,IL)+Q
C
C5G-----IF SAVING CELL-BY-CELL FLOWS IN A LIST, WRITE FLOW. ALSO
C5G-----COPY FLOW TO DRAI.
99 IF(IBD.EQ.2) CALL UBDSVB(IDRNCB,NCOL,NROW,IC,IR,IL,Q,
1 DRAI(:,L),NDRNVL,NAUX,6,IBOUND,NLAY)
DRAI(NDRNVL,L)=Q
100 CONTINUE
C
C6------IF CELL-BY-CELL FLOW WILL BE SAVED AS A 3-D ARRAY,
C6------CALL UBUDSV TO SAVE THEM.
IF(IBD.EQ.1) CALL UBUDSV(KSTP,KPER,htxt,IDRNCB,BUFF,NCOL,NROW,
1 NLAY,IOUT)
C
enddo ! isub-loop ! rsubsys
C7------MOVE RATES,VOLUMES & LABELS INTO ARRAYS FOR PRINTING.
200 ROUT=RATOUT
VBVL(3,MSUM)=ZERO
VBVL(4,MSUM)=ROUT
VBVL(2,MSUM)=VBVL(2,MSUM)+ROUT*DELT
VBNM(MSUM)=TEXT
C VBVL(:,MSUM)
C8------INCREMENT BUDGET TERM COUNTER.
MSUM=MSUM+1
C
C9------RETURN.
RETURN
END
SUBROUTINE VDF2DRN7DA(IGRID)
C Deallocate DRN MEMORY
USE GWFDRNMODULE
C
CALL SGWF2DRN7PNT(IGRID)
DEALLOCATE(NDRAIN)
DEALLOCATE(MXDRN)
DEALLOCATE(NDRNVL)
DEALLOCATE(IDRNCB)
DEALLOCATE(IPRDRN)
DEALLOCATE(NPDRN)
DEALLOCATE(IDRNPB)
DEALLOCATE(NNPDRN)
DEALLOCATE(DRNAUX)
DEALLOCATE(DRAI)
if (associated(drnlev)) deallocate(drnlev) ! NHI
deallocate(idrnsubsys) ! dsubsys
if (associated(ndrnsubsys)) deallocate(ndrnsubsys) ! dsubsys
if (associated(drnsubsidx)) deallocate(drnsubsidx) ! dsubsys
deallocate(iiconchk) ! iconchk
C
RETURN
END
SUBROUTINE SVDF2DRN7PNT(IGRID)
C Change DRN data to a different grid.
USE GWFDRNMODULE
C
NDRAIN=>GWFDRNDAT(IGRID)%NDRAIN
MXDRN=>GWFDRNDAT(IGRID)%MXDRN
NDRNVL=>GWFDRNDAT(IGRID)%NDRNVL
IDRNCB=>GWFDRNDAT(IGRID)%IDRNCB
IPRDRN=>GWFDRNDAT(IGRID)%IPRDRN
NPDRN=>GWFDRNDAT(IGRID)%NPDRN
IDRNPB=>GWFDRNDAT(IGRID)%IDRNPB
NNPDRN=>GWFDRNDAT(IGRID)%NNPDRN
DRNAUX=>GWFDRNDAT(IGRID)%DRNAUX
DRAI=>GWFDRNDAT(IGRID)%DRAI
drnlev=>gwfdrndat(igrid)%drnlev ! NHI
idrnsubsys=>gwfdrndat(igrid)%idrnsubsys ! dsubsys
ndrnsubsys=>gwfdrndat(igrid)%ndrnsubsys ! dsubsys
drnsubsidx=>gwfdrndat(igrid)%drnsubsidx ! dsubsys
iiconchk=>gwfdrndat(igrid)%iiconchk ! iconchk
C
RETURN
END
SUBROUTINE SVDF2DRN7PSV(IGRID)
C Save DRN data for a grid.
USE GWFDRNMODULE
C
GWFDRNDAT(IGRID)%NDRAIN=>NDRAIN
GWFDRNDAT(IGRID)%MXDRN=>MXDRN
GWFDRNDAT(IGRID)%NDRNVL=>NDRNVL
GWFDRNDAT(IGRID)%IDRNCB=>IDRNCB
GWFDRNDAT(IGRID)%IPRDRN=>IPRDRN
GWFDRNDAT(IGRID)%NPDRN=>NPDRN
GWFDRNDAT(IGRID)%IDRNPB=>IDRNPB
GWFDRNDAT(IGRID)%NNPDRN=>NNPDRN
GWFDRNDAT(IGRID)%DRNAUX=>DRNAUX
GWFDRNDAT(IGRID)%DRAI=>DRAI
gwfdrndat(igrid)%drnlev=>drnlev ! NHI
gwfdrndat(igrid)%idrnsubsys=>idrnsubsys ! dsubsys
gwfdrndat(igrid)%ndrnsubsys=>ndrnsubsys ! dsubsys
gwfdrndat(igrid)%drnsubsidx=>drnsubsidx ! dsubsys
gwfdrndat(igrid)%iiconchk=>iiconchk ! iconchk
C
RETURN
END