c Copyright (C) Stichting Deltares, 2005-2024. 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 VDF2WEL7FM(IGRID) C ****************************************************************** C SUBTRACT Q FROM RHS C--SEAWAT: MODIFIED FOR VARIABLE DENSITY FLOW C ****************************************************************** C C SPECIFICATIONS: C ------------------------------------------------------------------ USE GLOBAL, ONLY:IBOUND,RHS,HCOF USE GWFWELMODULE, ONLY:NWELLS,WELL USE VDFMODULE, ONLY:DENSEREF,PS C--SEAWAT: DIMENSION ADDITIONAL ARRAYS CHARACTER*16 WELAUX COMMON /WELCOM/WELAUX(5) C ------------------------------------------------------------------ CALL SGWF2WEL7PNT(IGRID) C C1------IF NUMBER OF WELLS <= 0 THEN RETURN. IF(NWELLS.LE.0) RETURN C C--SEAWAT: FIND AUX VARIABLE WELDENS IF EXISTS LOCWELDENS=0 DO I=1,5 IF(WELAUX(I).EQ.'WELDENS') LOCWELDENS=I+4 ENDDO C C2------PROCESS EACH WELL IN THE WELL LIST. DO 100 L=1,NWELLS IR=WELL(2,L) IC=WELL(3,L) IL=WELL(1,L) Q=WELL(4,L) C--SEAWAT: MODIFY TO CONSERVE MASS IF(Q.LE.0) DENSE=PS(IC,IR,IL) IF(Q.GT.0) THEN DENSE=DENSEREF IF(LOCWELDENS.GT.0) DENSE=WELL(LOCWELDENS,L) ENDIF C C2A-----IF THE CELL IS INACTIVE THEN BYPASS PROCESSING. IF(IBOUND(IC,IR,IL).LE.0) GO TO 100 C C2B-----IF THE CELL IS VARIABLE HEAD THEN SUBTRACT Q FROM THE RHS C ACCUMULATOR. C--SEAWAT: MULTIPLY Q BY DENSE TO CONSERVE MASS C RHS(IC,IR,IL)=RHS(IC,IR,IL)-Q RHS(IC,IR,IL)=RHS(IC,IR,IL)-DENSE*Q 100 CONTINUE C C3------RETURN RETURN END SUBROUTINE VDF2WEL7BD(KSTP,KPER,IGRID) C ****************************************************************** C CALCULATE VOLUMETRIC BUDGET FOR WELLS C--SEAWAT: MODIFIED TO WORK FOR VARIABLE-DENSITY FLOW C ****************************************************************** C C SPECIFICATIONS: C ------------------------------------------------------------------ USE GLOBAL, ONLY:IOUT,NCOL,NROW,NLAY,IBOUND,BUFF USE GWFBASMODULE,ONLY:MSUM,ICBCFL,IAUXSV,DELT,PERTIM,TOTIM, 1 VBVL,VBNM USE GWFWELMODULE,ONLY:NWELLS,IWELCB,WELL,NWELVL,WELAUX USE VDFMODULE, ONLY: DENSEREF,PS C CHARACTER*16 TEXT DOUBLE PRECISION RATIN,RATOUT,QQ DATA TEXT /' WELLS'/ C ------------------------------------------------------------------ CALL SGWF2WEL7PNT(IGRID) C C1------CLEAR RATIN AND RATOUT ACCUMULATORS, AND SET CELL-BY-CELL C1------BUDGET FLAG. ZERO=0. RATIN=ZERO RATOUT=ZERO IBD=0 IF(IWELCB.LT.0 .AND. ICBCFL.NE.0) IBD=-1 IF(IWELCB.GT.0) IBD=ICBCFL IBDLBL=0 C C2-----IF CELL-BY-CELL FLOWS WILL BE SAVED AS A LIST, WRITE HEADER. IF(IBD.EQ.2) THEN NAUX=NWELVL-5 IF(IAUXSV.EQ.0) NAUX=0 CALL UBDSV4(KSTP,KPER,TEXT,NAUX,WELAUX,IWELCB,NCOL,NROW,NLAY, 1 NWELLS,IOUT,DELT,PERTIM,TOTIM,IBOUND) END IF C 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 C C4------IF THERE ARE NO WELLS, DO NOT ACCUMULATE FLOW. IF(NWELLS.EQ.0) GO TO 200 C C--SEAWAT: FIND AUX VARIABLE WELDENS IF EXISTS LOCWELDENS=0 DO I=1,5 IF(WELAUX(I).EQ.'WELDENS') LOCWELDENS=I+4 ENDDO C C5------LOOP THROUGH EACH WELL CALCULATING FLOW. DO 100 L=1,NWELLS C C5A-----GET LAYER, ROW & COLUMN OF CELL CONTAINING WELL. IR=WELL(2,L) IC=WELL(3,L) IL=WELL(1,L) Q=ZERO C C5B-----IF THE CELL IS NO-FLOW OR CONSTANT_HEAD, IGNORE IT. IF(IBOUND(IC,IR,IL).LE.0)GO TO 99 C C5C-----GET FLOW RATE FROM WELL LIST. Q=WELL(4,L) IF(Q.LE.0) DENSE=PS(IC,IR,IL) IF(Q.GT.0) THEN DENSE=DENSEREF IF(LOCWELDENS.GT.0) DENSE=WELL(LOCWELDENS,L) ENDIF QQ=Q*DENSE C C5D-----PRINT FLOW RATE IF REQUESTED. IF(IBD.LT.0) THEN IF(IBDLBL.EQ.0) WRITE(IOUT,61) TEXT,KPER,KSTP 61 FORMAT(1X,/1X,A,' PERIOD ',I4,' STEP ',I3) WRITE(IOUT,62) L,IL,IR,IC,Q/DENSE 62 FORMAT(1X,'WELL ',I6,' LAYER ',I3,' ROW ',I5,' COL ',I5, 1 ' RATE ',1PG15.6) IBDLBL=1 END IF C C5E-----ADD FLOW RATE TO BUFFER. BUFF(IC,IR,IL)=BUFF(IC,IR,IL)+Q C C5F-----SEE IF FLOW IS POSITIVE OR NEGATIVE. IF(Q.GE.ZERO) THEN C C5G-----FLOW RATE IS POSITIVE (RECHARGE). ADD IT TO RATIN. RATIN=RATIN+QQ ELSE C C5H-----FLOW RATE IS NEGATIVE (DISCHARGE). ADD IT TO RATOUT. RATOUT=RATOUT-QQ END IF C C5I-----IF SAVING CELL-BY-CELL FLOWS IN A LIST, WRITE FLOW. ALSO C5I-----COPY FLOW TO WELL LIST. 99 IF(IBD.EQ.2) CALL UBDSVB(IWELCB,NCOL,NROW,IC,IR,IL,Q, 1 WELL(:,L),NWELVL,NAUX,5,IBOUND,NLAY) WELL(NWELVL,L)=Q 100 CONTINUE C C6------IF CELL-BY-CELL FLOWS WILL BE SAVED AS A 3-D ARRAY, C6------CALL UBUDSV TO SAVE THEM. IF(IBD.EQ.1) CALL UBUDSV(KSTP,KPER,TEXT,IWELCB,BUFF,NCOL,NROW, 1 NLAY,IOUT) C C7------MOVE RATES, VOLUMES & LABELS INTO ARRAYS FOR PRINTING. 200 RIN=RATIN ROUT=RATOUT VBVL(3,MSUM)=RIN VBVL(4,MSUM)=ROUT VBVL(1,MSUM)=VBVL(1,MSUM)+RIN*DELT VBVL(2,MSUM)=VBVL(2,MSUM)+ROUT*DELT VBNM(MSUM)=TEXT C C8------INCREMENT BUDGET TERM COUNTER(MSUM). MSUM=MSUM+1 C C9------RETURN RETURN END SUBROUTINE VDF2WEL7DA(IGRID) C Deallocate WEL MEMORY USE GWFWELMODULE C CALL SGWF2WEL7PNT(IGRID) deallocate(iwelsubsys) ! wsubsys DEALLOCATE(NWELLS) DEALLOCATE(MXWELL) DEALLOCATE(NWELVL) DEALLOCATE(IWELCB) DEALLOCATE(IPRWEL) DEALLOCATE(NPWEL) DEALLOCATE(IWELPB) DEALLOCATE(NNPWEL) DEALLOCATE(WELAUX) DEALLOCATE(WELL) C RETURN END SUBROUTINE SVDF2WEL7PNT(IGRID) C Change WEL data to a different grid. USE GWFWELMODULE C iwelsubsys=>gwfweldat(igrid)%iwelsubsys ! wsubsys NWELLS=>GWFWELDAT(IGRID)%NWELLS MXWELL=>GWFWELDAT(IGRID)%MXWELL NWELVL=>GWFWELDAT(IGRID)%NWELVL IWELCB=>GWFWELDAT(IGRID)%IWELCB IPRWEL=>GWFWELDAT(IGRID)%IPRWEL NPWEL=>GWFWELDAT(IGRID)%NPWEL IWELPB=>GWFWELDAT(IGRID)%IWELPB NNPWEL=>GWFWELDAT(IGRID)%NNPWEL WELAUX=>GWFWELDAT(IGRID)%WELAUX WELL=>GWFWELDAT(IGRID)%WELL C RETURN END SUBROUTINE SVDF2WEL7PSV(IGRID) C Save WEL data for a grid. USE GWFWELMODULE C gwfweldat(igrid)%iwelsubsys=>iwelsubsys ! wsubsys GWFWELDAT(IGRID)%NWELLS=>NWELLS GWFWELDAT(IGRID)%MXWELL=>MXWELL GWFWELDAT(IGRID)%NWELVL=>NWELVL GWFWELDAT(IGRID)%IWELCB=>IWELCB GWFWELDAT(IGRID)%IPRWEL=>IPRWEL GWFWELDAT(IGRID)%NPWEL=>NPWEL GWFWELDAT(IGRID)%IWELPB=>IWELPB GWFWELDAT(IGRID)%NNPWEL=>NNPWEL GWFWELDAT(IGRID)%WELAUX=>WELAUX GWFWELDAT(IGRID)%WELL=>WELL C RETURN END