!! Copyright (C) Stichting Deltares, 2005-2022. !! !! This file is part of iMOD. !! !! This program is free software: you can redistribute it and/or modify !! it under the terms of the GNU General Public License as published by !! the Free Software Foundation, either version 3 of the License, or !! (at your option) any later version. !! !! This program is distributed in the hope that it will be useful, !! but WITHOUT ANY WARRANTY; without even the implied warranty of !! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the !! GNU General Public License for more details. !! !! You should have received a copy of the GNU General Public License !! along with this program. If not, see . !! !! Contact: imod.support@deltares.nl !! Stichting Deltares !! P.O. Box 177 !! 2600 MH Delft, The Netherlands. !! MODULE MOD_PMANAGER_MF2005 USE WINTERACTER USE RESOURCE USE MOD_PMANAGER_PAR USE MOD_PMANAGER_UTL USE MOD_IPEST_GLM, ONLY : IPEST_GLM_READ_ARRFILE USE IMODVAR USE MOD_IDF USE MOD_UTL USE MOD_IDF_PAR USE MOD_ISG_PAR USE MOD_ISG_GRID USE MOD_ISG_UTL USE MOD_POLINT USE MOD_QKSORT USE MOD_ASC2IDF_HFB USE MOD_ASC2IDF_PAR USE MOD_ASC2IDF_UTL USE MOD_OSD USE MOD_IPEST_GLM, ONLY : IPEST_GLM_SETGROUPS,IPEST_GLM_READ_ZONES_OPENFILE USE MOD_PKS, ONLY : PKS_INIT TYPE DFFMGRIDOBJ INTEGER,POINTER,DIMENSION(:) :: ID INTEGER :: NID END TYPE DFFMGRIDOBJ TYPE DFFMOBJ REAL(KIND=DP_KIND) :: X,Y INTEGER :: ISEG,INODE,IZONE END TYPE DFFMOBJ TYPE(DFFMOBJ),ALLOCATABLE,DIMENSION(:),PRIVATE :: DFFM TYPE(DFFMGRIDOBJ),ALLOCATABLE,DIMENSION(:,:) :: DFFMGRID TYPE IPFMSPOBJ INTEGER :: ILAY REAL(KIND=DP_KIND) :: X,Y,CAP END TYPE IPFMSPOBJ TYPE(IPFMSPOBJ),ALLOCATABLE,DIMENSION(:) :: IPFMSP TYPE IPFFLXOBJ INTEGER :: IL REAL(KIND=DP_KIND) :: XS,YS,CAP,HTL,LTL,XE,YE,ZE END TYPE IPFFLXOBJ TYPE(IPFFLXOBJ),ALLOCATABLE,DIMENSION(:) :: IPFFLX CONTAINS !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEPST(IU,IOPTION,DIR,ISS,IITER) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IU,IOPTION,ISS,IITER CHARACTER(LEN=*),INTENT(IN) :: DIR INTEGER :: I,N,M,SCL_UP,SCL_D,IOS,ICOL,IROW REAL(KIND=DP_KIND) :: Z ! REAL(KIND=DP_KIND),DIMENSION(:,:,:),ALLOCATABLE :: CNT PMANAGER_SAVEPST=.FALSE. !## write model dimensions into pst file IF(IOPTION.EQ.2)THEN WRITE(IU,*) PRJIDF%NCOL,PRJIDF%NROW,PRJNLAY,PRJNPER,ISS WRITE(IU,*) PRJIDF%XMIN,PRJIDF%YMIN,PRJIDF%XMAX,PRJIDF%YMAX,PRJIDF%IEQ IF(PRJIDF%IEQ.EQ.0)THEN WRITE(IU,*) PRJIDF%DX ELSE WRITE(IU,*) (PRJIDF%SX(ICOL),ICOL=0,PRJIDF%NCOL) WRITE(IU,*) (PRJIDF%SY(IROW),IROW=0,PRJIDF%NROW) ENDIF ENDIF IF(IOPTION.NE.1)THEN IF(ASSOCIATED(PEST%MEASURES))THEN I=SIZE(PEST%MEASURES) IF(PEST%IIPF.EQ.1)I=-1*I LINE=TRIM(ITOS(I)) WRITE(IU,'(A)') TRIM(LINE) DO I=1,SIZE(PEST%MEASURES) LINE=CHAR(39)//TRIM(PEST%MEASURES(I)%IPFNAME)//CHAR(39)//','// & TRIM(ITOS(PEST%MEASURES(I)%IPFTYPE))//','// & TRIM(ITOS(PEST%MEASURES(I)%IXCOL)) //','// & TRIM(ITOS(PEST%MEASURES(I)%IYCOL)) //','// & TRIM(ITOS(PEST%MEASURES(I)%ILCOL)) //','// & TRIM(ITOS(PEST%MEASURES(I)%IMCOL)) //','// & TRIM(ITOS(PEST%MEASURES(I)%IVCOL)) //','// & TRIM(ITOS(PEST%MEASURES(I)%IZ1CL)) //','// & TRIM(ITOS(PEST%MEASURES(I)%IZ2CL)) IF(PEST%MEASURES(I)%IDCOL.GT.0)LINE=TRIM(LINE)//','//TRIM(ITOS(PEST%MEASURES(I)%IDCOL)) WRITE(IU,'(A)') TRIM(LINE) ENDDO ELSE LINE=TRIM(ITOS(0)) WRITE(IU,'(A)') TRIM(LINE) ENDIF ENDIF IF(IOPTION.EQ.2)THEN IF(PBMAN%IIES.EQ.0)THEN LINE=TRIM(ITOS(SIZE(PEST%PARAM))) ELSE LINE='0' ENDIF WRITE(IU,'(A)') TRIM(LINE) ENDIF N=0; IF(ASSOCIATED(PEST%S_PERIOD)) N=SIZE(PEST%S_PERIOD) M=0; IF(ASSOCIATED(PEST%B_FRACTION))M=SIZE(PEST%B_FRACTION) I=PEST%PE_MXITER; IF(IITER.EQ.-1.AND.PBMAN%IPESTP.EQ.1)I=-1 LINE=TRIM(ITOS(I)) //','//TRIM(RTOS(PEST%PE_STOP,'G',7)) //','// & TRIM(RTOS(PEST%PE_SENS,'G',7)) //','//TRIM(ITOS(N)) //','// & TRIM(ITOS(M)) //','//TRIM(RTOS(PEST%PE_TARGET(1),'G',7))//','// & TRIM(RTOS(PEST%PE_TARGET(2),'G',7))//','//TRIM(ITOS(PEST%PE_SCALING)) //','// & TRIM(RTOS(PEST%PE_PADJ,'G',7)) //','//TRIM(RTOS(PEST%PE_DRES,'G',7)) //','// & TRIM(ITOS(PEST%PE_KTYPE)) //','//TRIM(RTOS(PEST%PE_KRANGE,'G',7)) //','// & TRIM(ITOS(PEST%PE_REGULARISATION)) WRITE(IU,'(A)') TRIM(LINE) !## write blankout idf IF(PEST%PE_KTYPE.LT.0)THEN IF(IOPTION.EQ.1)THEN WRITE(IU,'(A)') TRIM(PEST%PPBNDIDF) ELSEIF(IOPTION.EQ.2)THEN !## upscale is using number 7 most frequent SCL_UP=7; SCL_D=0 !## read/clip/scale idf file IF(.NOT.IDFREADSCALE(PEST%PPBNDIDF,PRJIDF,SCL_UP,SCL_D,1.0D0,0))RETURN !## save array, do not correct for boundary condition as we not yet know for what layer the zone will apply IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\PST1\PPBNDIDF.ARR',PRJIDF,0,IU,1,0))RETURN ENDIF ENDIF IF(N.GT.0)THEN DO I=1,SIZE(PEST%S_PERIOD) LINE=TRIM(PEST%S_PERIOD(I))//','//TRIM(PEST%E_PERIOD(I)) WRITE(IU,'(A)') TRIM(LINE) ENDDO ENDIF IF(M.GT.0)THEN DO I=1,SIZE(PEST%B_FRACTION) LINE=TRIM(RTOS(PEST%B_FRACTION(I),'G',7))//','//CHAR(39)//TRIM(PEST%B_BATCHFILE(I))//CHAR(39)//','//CHAR(39)//TRIM(PEST%B_OUTFILE(I))//CHAR(39) WRITE(IU,'(A)') TRIM(LINE) ENDDO ENDIF IF(ASSOCIATED(PEST%PARAM))THEN DO I=1,SIZE(PEST%PARAM) LINE=TRIM(ITOS(PEST%PARAM(I)%PACT)) //','// & TRIM(PEST%PARAM(I)%PPARAM) //','// & TRIM(ITOS(PEST%PARAM(I)%PILS)) //','// & TRIM(ITOS(PEST%PARAM(I)%PIZONE)) //','// & TRIM(RTOS(PEST%PARAM(I)%PINI,'G',7)) //','// & TRIM(RTOS(PEST%PARAM(I)%PDELTA,'G',7)) //','// & TRIM(RTOS(PEST%PARAM(I)%PMIN,'G',7)) //','// & TRIM(RTOS(PEST%PARAM(I)%PMAX,'G',7)) //','// & TRIM(RTOS(PEST%PARAM(I)%PINCREASE,'G',7))//','// & TRIM(ITOS(ABS(PEST%PARAM(I)%PIGROUP))) //','// & TRIM(ITOS(PEST%PARAM(I)%PLOG)) //','// & '"'//TRIM(PEST%PARAM(I)%ACRONYM) //'",'// & TRIM(RTOS(PEST%PARAM(I)%PPRIOR,'G',7)) IF(PEST%PARAM(I)%PARSTD.EQ.0.0)THEN SELECT CASE (PEST%PARAM(I)%PLOG) CASE (0) PEST%PARAM(I)%PARSTD=PEST%PARAM(I)%PMAX-PEST%PARAM(I)%PMIN CASE (1) PEST%PARAM(I)%PARSTD=LOG(PEST%PARAM(I)%PMAX)-LOG(PEST%PARAM(I)%PMIN) CASE (2) PEST%PARAM(I)%PARSTD=LOG10(PEST%PARAM(I)%PMAX)-LOG10(PEST%PARAM(I)%PMIN) END SELECT ENDIF PEST%PARAM(I)%PARSTD=PEST%PARAM(I)%PARSTD/4.0 LINE=TRIM(LINE)//','//TRIM(RTOS(PEST%PARAM(I)%PARSTD,'G',7)) IF(PEST%PARAM(I)%SDATE.NE.'')LINE=TRIM(LINE)//','//TRIM(PEST%PARAM(I)%SDATE)//','// & TRIM(PEST%PARAM(I)%EDATE) IF(PBMAN%IIES.EQ.0)WRITE(IU,'(A)') TRIM(LINE) ENDDO ENDIF WRITE(6,'(A)') '+Reading/writing PST-files ...' IF(ASSOCIATED(PEST%IDFFILES))THEN LINE=TRIM(ITOS(SIZE(PEST%IDFFILES))) WRITE(IU,'(A)') TRIM(LINE) ! !## track zone defition not to succeed 100% per cell ! ALLOCATE(CNT(PRJIDF%NCOL,PRJIDF%NROW,PRJNLAY)); CNT=0.0D0 DO I=1,SIZE(PEST%IDFFILES) WRITE(6,'(A)') '+Reading/writing PST-files ('//TRIM(RTOS(REAL(100*I,8)/REAL(SIZE(PEST%IDFFILES),8),'F',2))//'%)' LINE=TRIM(PEST%IDFFILES(I)) IF(IOPTION.EQ.2)THEN Z=INT(UTL_GETREAL(LINE,IOS)) IF(IOS.EQ.0)THEN PRJIDF%X=Z !## save array, do not correct for boundary condition as we not yet know for what layer the zone will apply IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\PST1\ZONE_IZ'//TRIM(ITOS(I))//'.ARR',PRJIDF,0,IU,1,0))RETURN ELSE !## read idf IF(INDEX(UTL_CAP(LINE,'U'),'.IDF',.TRUE.).GT.0)THEN !## upscale is using number 15 is not completely correct but for reasons of backward compatibility. Undesired results can be overcome through additional file PRJIDF%FNAME=LINE; SCL_UP=15; SCL_D=0 !## read/clip/scale idf file IF(.NOT.IDFREADSCALE(PRJIDF%FNAME,PRJIDF,SCL_UP,SCL_D,1.0D0,0))RETURN !## replace nodata for zero DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(PRJIDF%X(ICOL,IROW).EQ.PRJIDF%NODATA)PRJIDF%X(ICOL,IROW)=0.0D0 ! CNT(ICOL,IROW,ILAY) ENDDO; ENDDO !## save array, do not correct for boundary condition as we not yet know for what layer the zone will apply IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\PST1\ZONE_IZ'//TRIM(ITOS(I))//'.ARR',PRJIDF,0,IU,1,0))RETURN ELSE WRITE(IU,'(A)') CHAR(39)//TRIM(LINE)//CHAR(39) ENDIF ENDIF ELSE WRITE(IU,'(A)') CHAR(39)//TRIM(LINE)//CHAR(39) ENDIF ENDDO ! DEALLOCATE(CNT) ELSE WRITE(IU,'(A)') '0' ENDIF PMANAGER_SAVEPST=.TRUE. END FUNCTION PMANAGER_SAVEPST !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEPST_MF6_SEAWAT(DIR,IBATCH) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR INTEGER,INTENT(IN) :: IBATCH TYPE ZONEOBJ REAL(KIND=4),POINTER,DIMENSION(:,:) :: X REAL(KIND=8),POINTER,DIMENSION(:,:) :: XY INTEGER,POINTER,DIMENSION(:) :: IZ INTEGER :: ZTYPE !## ztype=0 idf, ztype=1 ipf (ppoint) END TYPE ZONEOBJ LOGICAL :: LREUSEDAT REAL(KIND=DP_KIND) :: Z,F INTEGER :: SCL_D,SCL_UP,IOS,IROW,ICOL,JU,I,J,K,NIPF,MIPF,NUZONE,IZ,ND INTEGER,ALLOCATABLE,DIMENSION(:,:) :: NLOCS INTEGER,ALLOCATABLE,DIMENSION(:) :: NUZ,ILOCS TYPE(ZONEOBJ),ALLOCATABLE,DIMENSION(:) :: ZONE PMANAGER_SAVEPST_MF6_SEAWAT=.FALSE. ! INQUIRE(FILE=NAMFILE(:INDEX(NAMFILE,'\',.TRUE.)-1)//'\PARAM_DUMP_IPEST.DAT',EXIST=LEX) ! IF(LEX)CALL IOSDELETEFILE(NAMFILE(:INDEX(NAMFILE,'\',.TRUE.)-1)//'\PARAM_DUMP_IPEST.DAT') !## compute zone distribution INQUIRE(FILE=TRIM(DIR)//'\PARAM_DUMP_IPEST.DAT',EXIST=LREUSEDAT) LREUSEDAT=.FALSE. IF(LREUSEDAT)THEN IF(IBATCH.EQ.1)THEN !## try to open them and check them IF(IPEST_GLM_READ_ZONES_OPENFILE(DIR,JU,ICOL,IROW))THEN WRITE(*,'(/A)') 'Read zones assigned to parameters from the file:' WRITE(*,'(A/)') TRIM(DIR)//'\PARAM_DUMP_IPEST.DAT' PMANAGER_SAVEPST_MF6_SEAWAT=.TRUE.; RETURN ENDIF ENDIF ENDIF IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'(re)Writing '//TRIM(DIR)//'\PARAM_DUMP_IPEST.DAT'//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A/)') '(re)Writing '//TRIM(DIR)//'\PARAM_DUMP_IPEST.DAT'//'...' WRITE(6,'(A)') '+Reading Zones' IF(ASSOCIATED(PEST%IDFFILES))THEN ALLOCATE(ZONE(SIZE(PEST%IDFFILES))) LINE=TRIM(ITOS(SIZE(PEST%IDFFILES))) DO I=1,SIZE(PEST%IDFFILES) NULLIFY(ZONE(I)%X,ZONE(I)%XY,ZONE(I)%IZ) WRITE(6,'(A)') '+Reading Zones ('//TRIM(RTOS(REAL(100*I,8)/REAL(SIZE(PEST%IDFFILES),8),'F',2))//'%) ' LINE=TRIM(PEST%IDFFILES(I)) Z=UTL_GETREAL(LINE,IOS) IF(IOS.EQ.0)THEN ALLOCATE(ZONE(I)%X(PRJIDF%NCOL,PRJIDF%NROW)) ZONE(I)%ZTYPE=0; ZONE(I)%X=Z ELSE !## read idf IF(INDEX(UTL_CAP(LINE,'U'),'.IDF',.TRUE.).GT.0)THEN !## upscale is using number 15 is not completely correct but for reasons of backward compatibility. Undesired results can be overcome through additional file PRJIDF%FNAME=LINE; SCL_UP=15; SCL_D=0 !## read/clip/scale idf file IF(.NOT.IDFREADSCALE(PRJIDF%FNAME,PRJIDF,SCL_UP,SCL_D,1.0D0,0))RETURN !## replace nodata for zero DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(PRJIDF%X(ICOL,IROW).EQ.PRJIDF%NODATA)PRJIDF%X(ICOL,IROW)=0.0D0 ENDDO; ENDDO ALLOCATE(ZONE(I)%X(PRJIDF%NCOL,PRJIDF%NROW)) ZONE(I)%ZTYPE=0; ZONE(I)%X=PRJIDF%X ELSEIF(INDEX(UTL_CAP(LINE,'U'),'.IPF').GT.0)THEN ZONE(I)%ZTYPE=1 !## read in ipf JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=LINE,STATUS='OLD',ACTION='READ',FORM='FORMATTED') READ(JU,*) NIPF; READ(JU,*) MIPF; DO K=1,MIPF+1; READ(JU,*); ENDDO ALLOCATE(ZONE(I)%XY(NIPF,2),ZONE(I)%IZ(NIPF)) DO K=1,NIPF; READ(JU,*) ZONE(I)%XY(K,1),ZONE(I)%XY(K,2),ZONE(I)%IZ(K); ENDDO CLOSE(JU) ELSE WRITE(*,'(/A/)') 'No supported file format found'; RETURN ENDIF ENDIF ENDDO ELSE IF(IBATCH.EQ.0)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You need to insert minimal a single zone','Error') IF(IBATCH.EQ.1)WRITE(*,'(/A)') 'You need to insert minimal a single zone' RETURN ENDIF !## get number of unique zones ALLOCATE(NUZ(SIZE(PEST%PARAM))); NUZ=0 DO I=1,SIZE(PEST%PARAM); NUZ(I)=PEST%PARAM(I)%PIZONE; ENDDO CALL UTL_GETUNIQUE_INT(NUZ,SIZE(PEST%PARAM),NUZONE,0) IF(IBATCH.EQ.1)WRITE(*,'(A)') 'Found '//TRIM(ITOS(NUZONE))//' unique zones, getting number of location per zone ...' ALLOCATE(ILOCS(NUZ(NUZONE))); ILOCS=0 ALLOCATE(NLOCS(NUZONE,SIZE(ZONE))); NLOCS=0 !## set reference to zones DO I=1,NUZONE; ILOCS(NUZ(I))=I; ENDDO !## see how many locations per unique zone DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL; DO J=1,SIZE(ZONE) !## zones IF(ASSOCIATED(ZONE(J)%X))THEN IZ=INT(ZONE(J)%X(ICOL,IROW)) IF(IZ.LE.0)CYCLE !## zone in files but not used by current set of parameters IF(IZ.GT.SIZE(ILOCS))CYCLE IP=ILOCS(IZ) IF(IP.GT.0)NLOCS(IP,J)=NLOCS(IP,J)+1 !## pilot points ELSE DO K=1,SIZE(ZONE(J)%IZ) IZ=ZONE(J)%IZ(K) IP=0; IF(IZ.GT.0.AND.IZ.LE.SIZE(ILOCS))IP=ILOCS(IZ) IF(IP.GT.0)NLOCS(IP,J)=1 ENDDO ENDIF ENDDO; ENDDO; ENDDO !## check number of zones and missing zone (if any) DO I=1,SIZE(PEST%PARAM) !## parameter active and main of group IZ=PEST%PARAM(I)%PIZONE IP=ILOCS(IZ) ND=0; DO J=1,SIZE(ZONE) ND=ND+NLOCS(IP,J) IF(NLOCS(IP,J).GT.0)PEST%PARAM(I)%ZTYPE=ZONE(J)%ZTYPE ENDDO PEST%PARAM(I)%NODES=ND !## not applicable for pilotpoints IF(PEST%PARAM(I)%ZTYPE.EQ.1)THEN SELECT CASE (TRIM(PEST%PARAM(I)%PPARAM)) CASE ('KD','KH','KV','VC','SC','VA','RE','SY') CASE DEFAULT IF(IBATCH.EQ.1)WRITE(*,'(A)') 'Cannot use PilotPoints for other than KD,KH,KV,VC,SC,SY and VA'; RETURN END SELECT ENDIF IF(PEST%PARAM(I)%PPARAM.EQ.'HF')THEN PEST%PARAM(I)%NODES=0 !## one single cell used as zone for horizontal barrier module ELSE IF(PEST%PARAM(I)%NODES.EQ.0)PEST%PARAM(I)%PACT=0 ENDIF ENDDO N=0; DO I=1,SIZE(PEST%PARAM) IF(PEST%PARAM(I)%PACT.EQ.0)CYCLE SELECT CASE (PEST%PARAM(I)%PPARAM) CASE ('HF'); N=N+1 CASE DEFAULT; N=N+PEST%PARAM(I)%NODES END SELECT ENDDO !## fill array zone and set appropriate pointers in type DO I=1,SIZE(PEST%PARAM) IF(PEST%PARAM(I)%NODES.GT.0)THEN IF(IBATCH.EQ.1)WRITE(*,'(A)') 'Parameter '//TRIM(ITOS(I))//' number of locations '//TRIM(ITOS(PEST%PARAM(I)%NODES))// & ' assigned to ptype= '//TRIM(PEST%PARAM(I)%PPARAM) !## get number of zone in list of unique zone numbers IZ=PEST%PARAM(I)%PIZONE IP=ILOCS(IZ) IF(PEST%PARAM(I)%ZTYPE.EQ.0)THEN ALLOCATE(PEST%PARAM(I)%IROW(PEST%PARAM(I)%NODES),PEST%PARAM(I)%ICOL(PEST%PARAM(I)%NODES)) ALLOCATE(PEST%PARAM(I)%F(PEST%PARAM(I)%NODES)) !## loop to see zones N=0; DO J=1,SIZE(ZONE) !## particular zone not in this file IF(NLOCS(IP,J).EQ.0)CYCLE DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(ZONE(J)%ZTYPE.EQ.0)THEN IF(PEST%PARAM(I)%PIZONE.EQ.INT(ZONE(J)%X(ICOL,IROW)))THEN SELECT CASE (TRIM(PEST%PARAM(I)%PPARAM)) CASE ('KD','KH','KV','VC','SC','AF','AA','MS','MC','VA','HF','EX','SY') F=MOD(ZONE(J)%X(ICOL,IROW),1.0D0); IF(F.EQ.0.0D0)F=1.0D0 CASE DEFAULT F=1.0D0 END SELECT N=N+1; PEST%PARAM(I)%IROW(N)=INT(IROW,2); PEST%PARAM(I)%ICOL(N)=INT(ICOL,2); PEST%PARAM(I)%F(N)=F ENDIF ENDIF ENDDO; ENDDO ENDDO IF(N.NE.PEST%PARAM(I)%NODES)THEN IF(IBATCH.EQ.1)THEN WRITE(*,'(/A,I10,A,I10)') 'SOMETHING GOES WRONG NUMBER OF PARAMETER INITIAL ARE ',PEST%PARAM(I)%NODES WRITE(*,'(A,I10/)') 'PARAMETERS ACTUALLY FOUND ARE ',N ENDIF ENDIF ELSEIF(PEST%PARAM(I)%ZTYPE.EQ.1)THEN ALLOCATE(PEST%PARAM(I)%XY(PEST%PARAM(I)%NODES,2)) !## check pilotpoints N=0; DO J=1,SIZE(ZONE) !## particular zone not in this file IF(NLOCS(IP,J).EQ.0)CYCLE IF(ZONE(J)%ZTYPE.EQ.1)THEN DO K=1,SIZE(ZONE(J)%IZ) !## check whether it's integer value is equal to param(i)%izone IF(PEST%PARAM(I)%PIZONE.EQ.INT(ZONE(J)%IZ(K)))THEN N=N+1 PEST%PARAM(I)%XY(N,1)=ZONE(J)%XY(K,1) PEST%PARAM(I)%XY(N,2)=ZONE(J)%XY(K,2) ENDIF ENDDO ENDIF ENDDO ENDIF ELSE IF(PEST%PARAM(I)%PPARAM.NE.'HF')PEST%PARAM(I)%PACT=0 ENDIF ENDDO DO I=1,SIZE(ZONE) IF(ZONE(I)%ZTYPE.EQ.0)THEN DEALLOCATE(ZONE(I)%X) ELSEIF(ZONE(I)%ZTYPE.EQ.1)THEN DEALLOCATE(ZONE(I)%XY,ZONE(I)%IZ) ENDIF ENDDO DEALLOCATE(ZONE,NLOCS,NUZ,ILOCS) !## dump everything JU=UTL_GETUNIT() OPEN(JU,FILE=TRIM(DIR)//'\PARAM_DUMP_IPEST.DAT',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED',IOSTAT=IOS) IF(IOS.NE.0)THEN IF(IBATCH.EQ.1)THEN WRITE(*,'(/A)') 'Cannot save the dumpfile for iPESTP in the following folder:' WRITE(*,'(A/)') '['//TRIM(DIR)//'\PARAM_DUMP_IPEST.DAT]' STOP ENDIF ENDIF !## write header WRITE(JU,'(/A)') 'PARAMETER-DUMP-FILE' WRITE(JU,'(A22,I10)') 'NUMBER-OF-COLUMNS: ',PRJIDF%NCOL WRITE(JU,'(A22,I10)') 'NUMBER-OF-ROWS: ',PRJIDF%NROW WRITE(JU,'(A22,I10)') 'NUMBER-OF-PARAMETERS: ',SIZE(PEST%PARAM) DO I=1,SIZE(PEST%PARAM) WRITE(JU,'(/6A10,1X,A15)') 'NODES','PAR.-TYPE','PARAMETER','ILS','IZONE','GROUP','ACRONYM' WRITE(JU,'(2I10,A10,3I10,1X,A15)') PEST%PARAM(I)%NODES,PEST%PARAM(I)%ZTYPE,PEST%PARAM(I)%PPARAM,PEST%PARAM(I)%PILS, & PEST%PARAM(I)%PIZONE,PEST%PARAM(I)%PIGROUP,ADJUSTR(PEST%PARAM(I)%ACRONYM) IF(PEST%PARAM(I)%ZTYPE.EQ.0)THEN WRITE(JU,'(3A10)') 'IROW','ICOL','FACTOR' DO J=1,PEST%PARAM(I)%NODES IF(PEST%PARAM(I)%IROW(J).LE.0.OR.PEST%PARAM(I)%IROW(J).GT.PRJIDF%NROW)THEN WRITE(*,'(/A/)') 'Error row ='//TRIM(ITOS(PEST%PARAM(I)%IROW(J))); STOP ENDIF IF(PEST%PARAM(I)%ICOL(J).LE.0.OR.PEST%PARAM(I)%ICOL(J).GT.PRJIDF%NCOL)THEN WRITE(*,'(/A/)') 'Error column ='//TRIM(ITOS(PEST%PARAM(I)%ICOL(J))); STOP ENDIF WRITE(JU,'(2I10,F10.4)') PEST%PARAM(I)%IROW(J),PEST%PARAM(I)%ICOL(J),PEST%PARAM(I)%F(J) ENDDO ELSE WRITE(JU,'(3A10)') 'X-CORD','Y-CRD','FACTOR' DO J=1,PEST%PARAM(I)%NODES WRITE(JU,'(2F15.3,F10.4)') PEST%PARAM(I)%XY(J,1),PEST%PARAM(I)%XY(J,2) ENDDO ENDIF ENDDO CLOSE(JU) DO I=1,SIZE(PEST%PARAM) IF(ASSOCIATED(PEST%PARAM(I)%IROW))DEALLOCATE(PEST%PARAM(I)%IROW) IF(ASSOCIATED(PEST%PARAM(I)%ICOL))DEALLOCATE(PEST%PARAM(I)%ICOL) IF(ASSOCIATED(PEST%PARAM(I)%F)) DEALLOCATE(PEST%PARAM(I)%F) IF(ASSOCIATED(PEST%PARAM(I)%XY)) DEALLOCATE(PEST%PARAM(I)%XY) ENDDO PMANAGER_SAVEPST_MF6_SEAWAT=.TRUE. END FUNCTION PMANAGER_SAVEPST_MF6_SEAWAT !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVERUN(FNAME,IBATCH) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: FNAME INTEGER,INTENT(IN) :: IBATCH CHARACTER(LEN=52) :: CDATE1,CDATE2 CHARACTER(LEN=256) :: BNDFNAME INTEGER(KIND=8) :: ITIME,JTIME INTEGER :: IU,I,J,K,IPER,KPER,N,NSCL LOGICAL :: LDAYS,LEX TYPE(IDFOBJ),ALLOCATABLE,DIMENSION(:) :: IDF CHARACTER(LEN=256) :: LINE PMANAGER_SAVERUN=.FALSE. !## get active packages, set default values IF(.NOT.PMANAGER_GETPACKAGES(1,IBATCH))RETURN !## overrule ipst if not as keyword given IF(IBATCH.EQ.1.AND.PBMAN%IPEST.EQ.0)TOPICS(TPST)%IACT_MODEL=0 IF(IBATCH.EQ.1.AND.PBMAN%IIES.EQ.0) TOPICS(TIES)%IACT_MODEL=0 DO I=1,MAXTOPICS SELECT CASE (I) CASE (TFHB,TUZF,TMNW,TSFR,TLAK) IF(TOPICS(I)%IACT_MODEL.EQ.1)THEN CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'You cannot use the package '//TRIM(TOPICS(I)%TNAME)//CHAR(13)// & 'to save for a RUN-file. Select the option MODFLOW2005 instead','Information') RETURN ENDIF END SELECT ENDDO !## remove last timestep sinces it is the final date IF(PRJNPER.GT.1)PRJNPER=PRJNPER-1 IF(PBMAN%NLAY.GT.0)THEN PRJMXNLAY=MIN(PBMAN%NLAY,PRJMXNLAY) ENDIF PRJNLAY=PRJMXNLAY !## check on RUN file CALL UTL_CREATEDIR(FNAME(1:INDEX(FNAME,'\',.TRUE.)-1)) IF(IBATCH.EQ.0)THEN INQUIRE(FILE=FNAME,EXIST=LEX) IF(LEX)THEN CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to overwrite'//CHAR(13)//TRIM(FNAME),'Question') IF(WINFODIALOG(4).NE.1)RETURN ENDIF ENDIF IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=FNAME,STATUS='REPLACE',ACTION='WRITE,DENYREAD',FORM='FORMATTED') IF(IU.EQ.0)RETURN !## write Data set 1 IF(IBATCH.EQ.1)THEN IF(TRIM(PBMAN%OUTPUT).EQ.'')THEN WRITE(IU,'(A)') CHAR(39)//FNAME(1:INDEX(FNAME,'\',.TRUE.)-1)//CHAR(39) ELSE WRITE(IU,'(A)') CHAR(39)//TRIM(PBMAN%OUTPUT)//CHAR(39) ENDIF ELSE WRITE(IU,'(A)') CHAR(39)//TRIM(PBMAN%OUTPUT)//CHAR(39) ENDIF N=0; IF(ASSOCIATED(PEST%MEASURES))THEN N=SIZE(PEST%MEASURES); IF(PEST%IIPF.EQ.1)N=-1*N ENDIF !## metaswap PBMAN%IARMWP=0 IF(TOPICS(TCAP)%IACT_MODEL.EQ.1)THEN IF(ASSOCIATED(TOPICS(TCAP)%STRESS))THEN LINE=TOPICS(TCAP)%STRESS(1)%FILES(8,1)%FNAME IF(INDEX(UTL_CAP(LINE,'U'),'IPF').GT.0)PBMAN%IARMWP=1 ENDIF ENDIF NSCL=1 IF(PBMAN%IWINDOW.EQ.3)NSCL=0 IF(PBMAN%IWINDOW.EQ.2)THEN IF(SUBMODEL(7).GT.0.0D0)NSCL=2 ENDIF WRITE(IU,'(12(I10,1X))') PRJNLAY,PRJMXNLAY,PRJNPER,PBMAN%ISAVEENDDATE,NSCL,0,PBMAN%ICONCHK,N,0,PBMAN%IFVDL,PBMAN%IARMWP !## write measures IF(N.NE.0)THEN DO I=1,SIZE(PEST%MEASURES) LINE=TRIM(PEST%MEASURES(I)%IPFNAME) //','// & TRIM(ITOS(PEST%MEASURES(I)%IPFTYPE))//','// & TRIM(ITOS(PEST%MEASURES(I)%IXCOL)) //','// & TRIM(ITOS(PEST%MEASURES(I)%IYCOL)) //','// & TRIM(ITOS(PEST%MEASURES(I)%ILCOL)) //','// & TRIM(ITOS(PEST%MEASURES(I)%IMCOL)) //','// & TRIM(ITOS(PEST%MEASURES(I)%IVCOL)) //','// & TRIM(ITOS(PEST%MEASURES(I)%IZ1CL)) //','// & TRIM(ITOS(PEST%MEASURES(I)%IZ2CL)) WRITE(IU,'(A)') TRIM(LINE) ENDDO ENDIF !## data set 4 IF(PBMAN%IWINDOW.EQ.3)THEN LINE='0' ELSE LINE='1' ENDIF LINE=TRIM(LINE)//',0,'//TRIM(ITOS(PBMAN%IDOUBLE))//',0,0,'//TRIM(ITOS(PBMAN%SSYSTEM)) IF(PBMAN%MINKD.NE.0.0D0.OR.PBMAN%MINC.NE.0.0D0)THEN LINE=TRIM(LINE)//','//TRIM(RTOS(PBMAN%MINKD,'G',5))//','//TRIM(RTOS(PBMAN%MINC ,'G',5)) ENDIF WRITE(IU,'(A)') TRIM(LINE) !## Data set 5 IF(PCG%PARTOPT.GT.1)PCG%NOUTER=-ABS(PCG%NOUTER) LINE=TRIM(ITOS(PCG%NOUTER))//','//TRIM(ITOS(PCG%NINNER))//','// & TRIM(RTOS(PCG%HCLOSE,'E',7))//','//TRIM(RTOS(PCG%RCLOSE,'E',7))//','// & TRIM(RTOS(PCG%RELAX,'E',7)) IF(PCG%PARTOPT.GT.1)THEN !## PKS options LINE=TRIM(LINE)//','//TRIM(ITOS(PCG%PARTOPT-2))//','//TRIM(ITOS(PCG%IMERGE)) ELSE !## PCG option LINE=TRIM(LINE)//','//TRIM(ITOS(PCG%NPCOND)) ENDIF WRITE(IU,'(A)') TRIM(LINE) IF(PCG%PARTOPT.EQ.3.AND.TRIM(PCG%MRGFNAME).EQ.'')THEN CLOSE(IU); CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You need to specify a pointer IDF-file when selecting the RCB partition method.','Error') RETURN ENDIF IF(PCG%PARTOPT.EQ.3)THEN WRITE(IU,'(A)') '"'//TRIM(PCG%MRGFNAME)//'"' ENDIF !## Data set 6 BNDFNAME='' IF(PBMAN%IWINDOW.EQ.3)THEN !## user defined IDF BNDFNAME=PBMAN%BNDFILE ELSE !## full extent or submodel ALLOCATE(IDF(1)); CALL IDFNULLIFY(IDF(1)) !## get first idf IF(.NOT.PMANAGER_INIT_GETFIRSTIDF(IDF(1),IBATCH))RETURN IF(.NOT.PMANAGER_INIT_SIMAREA(IDF(1),IBATCH))RETURN IF(LEN_TRIM(IDF(1)%FNAME).GT.0)THEN BNDFNAME=IDF(1)%FNAME !## 1st IDF in list ELSE WRITE(IDF(1)%FNAME,'(4(F15.3,A1))') IDF(1)%XMIN,',',IDF(1)%YMIN,',',IDF(1)%XMAX,',',IDF(1)%YMAX ENDIF IF(ISUBMODEL.EQ.0)THEN WRITE(IU,'(6(F15.3,A1))') IDF(1)%XMIN,',',IDF(1)%YMIN,',',IDF(1)%XMAX,',',IDF(1)%YMAX,',',IDF(1)%DX,',',0.0D0 ELSE IF(SUBMODEL(6).GT.0.0D0.AND.SUBMODEL(7).GT.0.0D0)THEN WRITE(IU,'(7(F15.3,A1))') IDF(1)%XMIN,',',IDF(1)%YMIN,',',IDF(1)%XMAX,',',IDF(1)%YMAX,',',IDF(1)%DX,',',SUBMODEL(7),',',SUBMODEL(6) ELSE WRITE(IU,'(6(F15.3,A1))') IDF(1)%XMIN,',',IDF(1)%YMIN,',',IDF(1)%XMAX,',',IDF(1)%YMAX,',',IDF(1)%DX,',',SUBMODEL(6) ENDIF ENDIF CALL IDFDEALLOCATE(IDF,SIZE(IDF)); DEALLOCATE(IDF) ENDIF WRITE(IU,'(A)') 'ACTIVE MODULES' !## Data set 8 DO I=1,MAXTOPICS IF(TOPICS(I)%IACT_MODEL.EQ.0)CYCLE !## skip pcg IF(I.EQ.TPCG)CYCLE !## pst module is exception IF(I.EQ.TPST)THEN; WRITE(IU,'(A)') '1,0 '//TRIM(TOPICS(I)%TNAME); CYCLE; ENDIF ! IF(I.EQ.TIES)THEN; WRITE(IU,'(A)') '1,0 '//TRIM(TOPICS(I)%TNAME); CYCLE; ENDIF IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS))CYCLE IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS(1)%FILES))CYCLE CALL PMANAGER_SAVEMF2005_RUN_ISAVE(PBMAN%ISAVE(I)%ILAY,TOPICS(I)%TNAME(1:5),IU) ENDDO !## write bndfile, Data set 9 IF(LEN_TRIM(BNDFNAME).GT.0)THEN WRITE(IU,'(A)') CHAR(39)//TRIM(BNDFNAME)//CHAR(39) ELSE WRITE(IU,'(4(F15.3,A1))') PRJIDF%XMIN,',',PRJIDF%YMIN,',',PRJIDF%XMAX,',',PRJIDF%YMAX ENDIF WRITE(IU,'(A)') 'MODULES FOR EACH LAYER' !## write modules not timedependent DO I=1,MAXTOPICS IF(TOPICS(I)%IACT_MODEL.EQ.0)CYCLE !## only active IF(TOPICS(I)%TIMDEP)CYCLE !## only time independent !## skip pcg IF(I.EQ.TPCG)CYCLE !## pst module is exception IF(I.EQ.TPST)THEN LINE=TRIM(ITOS(SIZE(PEST%PARAM)))//',(PST)'; WRITE(IU,'(A)') TRIM(LINE) IF(.NOT.PMANAGER_SAVEPST(IU,1,'',0,0))THEN; ENDIF; CYCLE ENDIF ! IF(I.EQ.TIES)THEN ! LINE=TRIM(ITOS(SIZE(PEST%PARAM)))//',(IES)'; WRITE(IU,'(A)') TRIM(LINE) ! IF(.NOT.PMANAGER_SAVEPST(IU,1,'',0,0))THEN; ENDIF; CYCLE ! ENDIF IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS))CYCLE IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS(1)%FILES))CYCLE !## check the number of active packages IF(I.EQ.TCAP)THEN N=SIZE(TOPICS(I)%STRESS(1)%FILES,1) IF(ASSOCIATED(TOPICS(I)%STRESS(1)%INPFILES))THEN N=N+SIZE(TOPICS(I)%STRESS(1)%INPFILES) ENDIF ELSE K=1; N=0 DO J=1,SIZE(TOPICS(I)%STRESS(1)%FILES,2) IF(TOPICS(I)%STRESS(1)%FILES(K,J)%IACT.EQ.1)N=N+1 ENDDO ENDIF WRITE(IU,'(I3.3,A)') N,','//TRIM(TOPICS(I)%TNAME) IF(N.GT.0)THEN !## number of subtopics DO K=1,SIZE(TOPICS(I)%STRESS(1)%FILES,1) !## number of systems DO J=1,SIZE(TOPICS(I)%STRESS(1)%FILES,2) !## skip temporary deactivated packages IF(TOPICS(I)%STRESS(1)%FILES(K,J)%IACT.EQ.0)CYCLE !## msp/pwt - skip ilay IF(I.EQ.TCAP.OR.I.EQ.TPWT)THEN WRITE(LINE,'(5X, 2(G15.7,A1))') & TOPICS(I)%STRESS(1)%FILES(K,J)%FCT ,',', & TOPICS(I)%STRESS(1)%FILES(K,J)%IMP ,',' ELSE WRITE(LINE,'(1X,I5,2(A1,G15.7),A1)') & TOPICS(I)%STRESS(1)%FILES(K,J)%ILAY,',', & TOPICS(I)%STRESS(1)%FILES(K,J)%FCT ,',', & TOPICS(I)%STRESS(1)%FILES(K,J)%IMP ,',' ENDIF IF(TOPICS(I)%STRESS(1)%FILES(K,J)%ICNST.EQ.1)THEN LINE=TRIM(LINE)//TRIM(RTOS(TOPICS(I)%STRESS(1)%FILES(K,J)%CNST,'G',7)) ELSEIF(TOPICS(I)%STRESS(1)%FILES(K,J)%ICNST.EQ.2)THEN LINE=TRIM(LINE)//CHAR(39)//TRIM(TOPICS(I)%STRESS(1)%FILES(K,J)%FNAME)//CHAR(39) ENDIF WRITE(IU,'(A)') TRIM(LINE) ENDDO ENDDO !## write extra files only for MetaSWAP IF(I.EQ.TCAP)THEN IF(ASSOCIATED(TOPICS(I)%STRESS(1)%INPFILES))THEN K=SIZE(TOPICS(I)%STRESS(1)%INPFILES) DO J=1,K; WRITE(IU,'(1X,A)') TRIM(TOPICS(I)%STRESS(1)%INPFILES(J)); ENDDO ENDIF ENDIF ENDIF ENDDO WRITE(IU,'(A)') 'PACKAGES FOR EACH LAYER AND STRESS-PERIOD ' !## only days available LDAYS=.TRUE. DO KPER=1,PRJNPER IF(SIM(KPER)%IHR+SIM(KPER)%IMT+SIM(KPER)%ISC.GT.0)THEN; LDAYS=.FALSE.; EXIT; ENDIF ENDDO !## write packages - incl./excl. steady-state DO KPER=1,PRJNPER !## steady-state IF(SIM(KPER)%DELT.EQ.0.0D0)THEN WRITE(IU,'(I5.5,A1,F15.3,A1,A,2(A1,I1))') KPER,',',SIM(KPER)%DELT,',',TRIM(SIM(KPER)%CDATE),',',SIM(KPER)%ISAVE,',',SIM(KPER)%ISUM !## transient (use final date as well, used for labeling file-names!) ELSE IF(LDAYS)THEN WRITE(CDATE1,'(I4.4,2I2.2)') SIM(KPER)%IYR ,SIM(KPER)%IMH ,SIM(KPER)%IDY ELSE WRITE(CDATE1,'(I4.4,5I2.2)') SIM(KPER)%IYR ,SIM(KPER)%IMH ,SIM(KPER)%IDY ,SIM(KPER)%IHR ,SIM(KPER)%IMT ,SIM(KPER)%ISC ENDIF IF(LDAYS)THEN WRITE(CDATE2,'(I4.4,2I2.2)') SIM(KPER+1)%IYR,SIM(KPER+1)%IMH,SIM(KPER+1)%IDY ELSE WRITE(CDATE2,'(I4.4,5I2.2)') SIM(KPER+1)%IYR,SIM(KPER+1)%IMH,SIM(KPER+1)%IDY,SIM(KPER+1)%IHR,SIM(KPER+1)%IMT,SIM(KPER+1)%ISC ENDIF WRITE(IU,'(I5.5,A1,F15.3,A1,A,2(A1,I1),A)') KPER,',',SIM(KPER)%DELT,',',TRIM(CDATE1),',',SIM(KPER)%ISAVE,',',SIM(KPER)%ISUM,','//TRIM(CDATE2) ENDIF DO I=1,MAXTOPICS IF(TOPICS(I)%IACT_MODEL.EQ.0)CYCLE IF(.NOT.TOPICS(I)%TIMDEP)CYCLE IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS))CYCLE IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS(1)%FILES))CYCLE IPER=PMANAGER_GETCURRENTIPER(KPER,I,ITIME,JTIME) !## overrule wel/isg packages per stress-period SELECT CASE (I) CASE (TWEL); IF(PBMAN%DWEL.EQ.1)IPER=ABS(IPER) CASE (TISG); IF(PBMAN%DISG.EQ.1)IPER=ABS(IPER) CASE (TSFR); IF(PBMAN%DSFR.EQ.1)IPER=ABS(IPER) END SELECT !## reuse previous timestep IF(IPER.LE.0)THEN N=MAX(IPER,-1) WRITE(IU,'(I3,A)') N,','//TRIM(TOPICS(I)%TNAME) ELSE !## check the number of active packages K=1; N=0 DO J=1,SIZE(TOPICS(I)%STRESS(IPER)%FILES,2) IF(TOPICS(I)%STRESS(IPER)%FILES(K,J)%IACT.EQ.1)N=N+1 ENDDO WRITE(IU,'(I3,A)') N,','//TRIM(TOPICS(I)%TNAME) IF(N.GT.0)THEN !## number of subtopics DO K=1,SIZE(TOPICS(I)%STRESS(IPER)%FILES,1) !## number of systems DO J=1,SIZE(TOPICS(I)%STRESS(IPER)%FILES,2) !## skip temporary deactivated packages IF(TOPICS(I)%STRESS(IPER)%FILES(K,J)%IACT.EQ.0)CYCLE IF(TOPICS(I)%STRESS(IPER)%FILES(K,J)%ICNST.EQ.1)THEN WRITE(IU,'(1X,I5,3(A1,G15.7))') & TOPICS(I)%STRESS(IPER)%FILES(K,J)%ILAY,',', & TOPICS(I)%STRESS(IPER)%FILES(K,J)%FCT ,',', & TOPICS(I)%STRESS(IPER)%FILES(K,J)%IMP ,',', & TOPICS(I)%STRESS(IPER)%FILES(K,J)%CNST ELSEIF(TOPICS(I)%STRESS(IPER)%FILES(K,J)%ICNST.EQ.2)THEN WRITE(IU,'(1X,I5,2(A1,G15.7),A1,A)') & TOPICS(I)%STRESS(IPER)%FILES(K,J)%ILAY,',', & TOPICS(I)%STRESS(IPER)%FILES(K,J)%FCT ,',', & TOPICS(I)%STRESS(IPER)%FILES(K,J)%IMP ,',', & CHAR(39)//TRIM(TOPICS(I)%STRESS(IPER)%FILES(K,J)%FNAME)//CHAR(39) ENDIF ENDDO ENDDO ENDIF ENDIF ENDDO ENDDO CLOSE(IU) !## copy RUN file to RUNFILES folder CALL IOSCOPYFILE(TRIM(PBMAN%RUNFILE),TRIM(PREFVAL(1))//'\RUNFILES\'//TRIM(PBMAN%MODELNAME)//'.RUN') PMANAGER_SAVERUN=.TRUE. END FUNCTION PMANAGER_SAVERUN !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005(FNAME,IBATCH) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: FNAME INTEGER,INTENT(IN) :: IBATCH CHARACTER(LEN=512) :: DIRMNAME,DIR,MAINDIR INTEGER(KIND=8) :: ITIME,JTIME INTEGER,ALLOCATABLE,DIMENSION(:,:) :: NEX INTEGER,ALLOCATABLE,DIMENSION(:) :: SUBNLAY INTEGER :: IULAK,ISTEADY,IPER,INIPER,LPER,KPER,IINI,IPRT,I,J,N,NSYSFHB,NSYSGHB,NSYSRIV LOGICAL :: LTB PMANAGER_SAVEMF2005=.FALSE.; LYESNO=.FALSE. IF(PBMAN%NSUBMODEL.GT.1.AND.TOPICS(TCAP)%IACT_MODEL.EQ.1)THEN IF(IBATCH.EQ.0)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'It is not allowed to use Metaswap with MODFLOW6 with nested models.','Error') IF(IBATCH.EQ.1)WRITE(*,'(/A/)') '>>> It is not allowed to use Metaswap with MODFLOW6 with nested models. <<<' RETURN ENDIF !## check usage of kvv in com ination with modflow6, which is wrong IF(PBMAN%IFORMAT.EQ.3.AND.TOPICS(TKVV)%IACT_MODEL.EQ.1)THEN IF(IBATCH.EQ.0)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'It is not allowed to use KVV for MODFLOW6; 3D models are supported, only.','Error') IF(IBATCH.EQ.1)WRITE(*,'(/A/)') '>>> It is not allowed to use KVV for MODFLOW6; 3D models are supported, only. <<<' RETURN ENDIF IF(TOPICS(TCAP)%IACT_MODEL.EQ.1.AND.PBMAN%IFORMAT.EQ.3.AND.PBMAN%IPESTP+PBMAN%IIES.GT.0)THEN IF(IBATCH.EQ.0)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'It is not allowed to use iPESTP for MODFLOW6 in combination with MetaSWAP.','Error') IF(IBATCH.EQ.1)WRITE(*,'(/A/)') '>>> It is not allowed to use iPESTP for MODFLOW6 in combination with MetaSWAP. <<<' RETURN ENDIF !## remove final stress as it is the final timestep IF(PRJNPER.GT.1)PRJNPER=PRJNPER-1 ISTEADY=0; IF(SIM(1)%DELT.EQ.0.0D0)ISTEADY=1 !## time information ISS=0; DO KPER=1,PRJNPER; IF(SIM(KPER)%DELT.NE.0.0D0)ISS=1; ENDDO !## overwrite nstep/nmult in case imodbatch and not tim-files are used IF(IBATCH.EQ.1.AND.PBMAN%TIMFNAME.EQ.'')THEN DO KPER=1,PRJNPER; SIM(KPER)%TMULT=PBMAN%NMULT; SIM(KPER)%NSTP=PBMAN%NSTEP; ENDDO ENDIF !## output unit numbers IHEDUN =51; IBCFCB =52; IRCHCB =53; IEVTCB =54; IDRNCB =55 IRIVCB =56; IGHBCB =57; ICHDCB =58; IWELCB =59 ISFRCB =60 !## output unit numbers for sfr package ISFRCB2=61 !## detailed output for sfr package IFHBCB =62 !## output fhb package ILAKCB =63 !## output lak package IUZFCB1=64 !## output uzg package IWL2CB =65 !## output mnw package ISCRCB =66 !## output scr package ICAPCB =67 !## output cap package !## get active packages IF(.NOT.PMANAGER_GETPACKAGES(1,IBATCH))RETURN !## overrule ipst if not as keyword given IF(IBATCH.EQ.1.AND.(PBMAN%IPEST+PBMAN%IPESTP+PBMAN%IIES).EQ.0)TOPICS(TPST)%IACT_MODEL=0 !## turn off certain packages as not needed for seawat without simulation IF(PBMAN%IFORMAT.EQ.6)THEN IF(WQ%VDF%MTDNCONC.EQ.0)THEN ! TOPICS(TADV)%IACT_MODEL=0 TOPICS(TDSP)%IACT_MODEL=0 TOPICS(TSCO)%IACT_MODEL=0 TOPICS(TCBI)%IACT_MODEL=0 TOPICS(TPOR)%IACT_MODEL=0 TOPICS(TGCG)%IACT_MODEL=0 ELSE IF(TOPICS(TCON)%IACT_MODEL.EQ.0)THEN IF(IBATCH.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'>>> CON package to be active in conjunction with VDF and MTDNCONC=1 <<<','Error'); STOP ENDIF IF(IBATCH.EQ.1)WRITE(*,'(/1X,A/)') '>>> CON package to be active in conjunction with VDF and MTDNCONC=1 <<<'; STOP ENDIF ENDIF ENDIF !## turn off metaswap whenever a steady-state model is concerned IF(ISS.EQ.0)TOPICS(TCAP)%IACT_MODEL=0 !## flexdrainage active, need to be known here as DRN package needs information from it PBMAN%FLEXD=0; IF(TOPICS(TCAP)%NSUBTOPICS.EQ.26)THEN PBMAN%FLEXD=1; IF(IBATCH.EQ.1)WRITE(*,'(/1X,A/)') '>>> Flexible Drainage is Active <<<' !## check whether DRN package is active too? IF(PMANAGER_GETNSYS(TDRN,2).EQ.0)THEN IF(IBATCH.EQ.1)WRITE(*,'(/1X,A/)') '>>> Conventional DRN needs to be active with at least one system <<<'; STOP ENDIF ENDIF ! !## organise groups ! IF(.NOT.IPEST_GLM_SETGROUPS(IBATCH))RETURN !## write nam file IF(.NOT.PMANAGER_SAVEMF2005_NAM(FNAME,MAINDIR,DIR,DIRMNAME,IPRT,ISS))RETURN !## get area of simulation / allocate arrays IF(.NOT.PMANAGER_SAVEMF2005_SIM(IBATCH))RETURN !## allocate memory IF(.NOT.PMANAGER_SAVEMF2005_SIM_ALLOC(ISS))RETURN !##================ !## reading section !##================ !## read bnd/shd files IF(.NOT.PMANAGER_SAVEMF2005_BAS_READ(IPRT))RETURN !## read top/bot information IF(.NOT.PMANAGER_SAVEMF2005_DIS_READ(LTB,IPRT))RETURN !## read bcf IF(.NOT.PMANAGER_SAVEMF2005_BCF_READ(ISS,IPRT))RETURN !## read lpf IF(.NOT.PMANAGER_SAVEMF2005_LPF_READ(ISS,IPRT))RETURN !## merge layer in case modflow6 IF(.NOT.PMANAGER_MERGELAYERS())RETURN !## read for vdf IF(.NOT.PMANAGER_SAVEMF2005_CON_READ(IPRT))RETURN !## read dsp IF(.NOT.PMANAGER_SAVEMF2005_DSP_READSAVE(DIR,DIRMNAME,IBATCH,IPRT))RETURN !## read por IF(.NOT.PMANAGER_SAVEMF2005_POR_READ(IPRT))RETURN !## read cbi IF(.NOT.PMANAGER_SAVEMF2005_CBI_READ(IPRT))RETURN !## read sco IF(.NOT.PMANAGER_SAVEMF2005_SCO_READ(IPRT))RETURN !## read scr IF(.NOT.PMANAGER_SAVEMF2005_SCR_READ(IPRT))RETURN !## compute kdw/vcw CALL PMANAGER_SAVEMF2005_COMPUTE_KDW_VCW() !## read ani IF(.NOT.PMANAGER_SAVEMF2005_ANI_READ(IPRT))RETURN !## read top/bot information IF(.NOT.PMANAGER_SAVEMF2005_LAK_READ(0,IPRT,INIPER))RETURN !## read top/kh information IF(.NOT.PMANAGER_SAVEMF2005_SFT_READ(IPRT))RETURN !##================ !## checking section !##================ !## apply consistency checks CALL PMANAGER_SAVEMF2005_CONSISTENCY(LTB) !## recompute kdw/vcw CALL PMANAGER_SAVEMF2005_COMPUTE_KDW_VCW() !## get lak position and conductances IF(.NOT.PMANAGER_SAVEMF2005_LAK_CONFIG())RETURN !##================ !## read/write pst section !##================ !## write pst-file IF(.NOT.PMANAGER_SAVEMF2005_PST_READWRITE(DIR,DIRMNAME,IBATCH,ISS))RETURN !## organise groups IF(.NOT.IPEST_GLM_SETGROUPS(IBATCH))RETURN !##================ !## writing section !##================ !## write meta-data file IF(.NOT.PMANAGER_SAVEMF2005_MET(DIR,DIRMNAME))RETURN !## write time-discretisation file IF(.NOT.PMANAGER_SAVEMF2005_TDIS(TRIM(MAINDIR)//'\MFSIM'))RETURN !## save ims file IF(.NOT.PMANAGER_SAVEMF2005_IMS(TRIM(MAINDIR)//'\MFSIM'))RETURN !## save pcg file IF(.NOT.PMANAGER_SAVEMF2005_PCG(DIRMNAME))RETURN !## save gcg file IF(.NOT.PMANAGER_SAVEMF2005_GCG(DIRMNAME))RETURN !## save pks file IF(.NOT.PMANAGER_SAVEMF2005_PKS(DIRMNAME))RETURN !## save oc file IF(.NOT.PMANAGER_SAVEMF2005_OCD(DIRMNAME,MAINDIR))RETURN !## save bas file IF(.NOT.PMANAGER_SAVEMF2005_BAS_SAVE(DIR,DIRMNAME,IBATCH))RETURN !## save btn file IF(.NOT.PMANAGER_SAVEMF2005_BTN_SAVE(DIR,DIRMNAME,IBATCH))RETURN !## save ic file IF(.NOT.PMANAGER_SAVEMF2005_IC_SAVE(DIR,DIRMNAME,IBATCH))RETURN !## save dis file IF(.NOT.PMANAGER_SAVEMF2005_DIS_SAVE(DIR,DIRMNAME,IBATCH))RETURN !## save bcf file IF(.NOT.PMANAGER_SAVEMF2005_BCF_SAVE(DIR,DIRMNAME,IBATCH,ISS))RETURN !## save lpf file IF(.NOT.PMANAGER_SAVEMF2005_LPF_SAVE(DIR,DIRMNAME,IBATCH,ISS))RETURN !## save adv file IF(.NOT.PMANAGER_SAVEMF2005_ADV_SAVE(DIR,DIRMNAME,IBATCH))RETURN !## save vdf file IF(.NOT.PMANAGER_SAVEMF2005_VDF_SAVE(DIR,DIRMNAME,IBATCH))RETURN !## save npf file IF(.NOT.PMANAGER_SAVEMF2005_NPF_SAVE(DIR,DIRMNAME,IBATCH))RETURN !## save sto file IF(.NOT.PMANAGER_SAVEMF2005_STO_SAVE(DIR,DIRMNAME,IBATCH,ISS))RETURN !## save ani file IF(.NOT.PMANAGER_SAVEMF2005_ANI_SAVE(DIR,DIRMNAME,IBATCH))RETURN !## save scr file IF(.NOT.PMANAGER_SAVEMF2005_SCR_SAVE(DIR,DIRMNAME,IBATCH))RETURN !## save hfb file IF(.NOT.PMANAGER_SAVEMF2005_HFB(IBATCH,DIRMNAME,IPRT,LTB))RETURN !## save uzf package IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,TOPICS(TUZF)%IACT_MODEL,TUZF,IUZFCB1,'UZF',(/1,2,3,4,5,6,7,8/),IPRT))RETURN !## save mnw package IF(PBMAN%IFORMAT.EQ.3)THEN IF(.NOT.PMANAGER_SAVEMF2005_MNW2(DIR,DIRMNAME,IBATCH,TOPICS(TMNW)%IACT_MODEL,TMNW,IWL2CB,'MAW',IPRT))RETURN ELSE IF(.NOT.PMANAGER_SAVEMF2005_MNW2(DIR,DIRMNAME,IBATCH,TOPICS(TMNW)%IACT_MODEL,TMNW,IWL2CB,'MNW',IPRT))RETURN ENDIF !## save wel package IF(.NOT.PMANAGER_SAVEMF2005_WEL(DIR,DIRMNAME,IBATCH,TOPICS(TWEL)%IACT_MODEL,TWEL,IWELCB,'WEL',IPRT))RETURN !## save drn package IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,TOPICS(TDRN)%IACT_MODEL,TDRN,IDRNCB,'DRN',(/2,1/),IPRT))RETURN !## save isg package (always before riv in case of dmm-files) IF(.NOT.PMANAGER_SAVEMF2005_ISG(DIR,DIRMNAME,IBATCH,TOPICS(TISG)%IACT_MODEL,IRIVCB,'ISG',IPRT))RETURN !## save riv package NSYSRIV=PMANAGER_GETNSYS(TRIV,1) IF(NSYSRIV.EQ.5.AND.TOPICS(TVDF)%IACT_MODEL.EQ.1)THEN IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,TOPICS(TRIV)%IACT_MODEL,TRIV,IRIVCB,'RIV',(/2,1,3,4,5/),IPRT))RETURN ELSE IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,TOPICS(TRIV)%IACT_MODEL,TRIV,IRIVCB,'RIV',(/2,1,3,4/),IPRT))RETURN ENDIF !## save evt package IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,TOPICS(TEVT)%IACT_MODEL,TEVT,IEVTCB,'EVT',(/2,1,3/),IPRT))RETURN !## save ghb package NSYSGHB=PMANAGER_GETNSYS(TGHB,1) IF(NSYSGHB.EQ.3.AND.TOPICS(TVDF)%IACT_MODEL.EQ.1)THEN IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,TOPICS(TGHB)%IACT_MODEL,TGHB,IGHBCB,'GHB',(/2,1,3/),IPRT))RETURN ELSE IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,TOPICS(TGHB)%IACT_MODEL,TGHB,IGHBCB,'GHB',(/2,1/),IPRT))RETURN ENDIF !## save rch package IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,TOPICS(TRCH)%IACT_MODEL,TRCH,IRCHCB,'RCH',(/1/),IPRT))RETURN !## save olf package IF(TOPICS(TDRN)%IACT_MODEL.EQ.0)THEN IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,TOPICS(TOLF)%IACT_MODEL,TOLF,IDRNCB,'DRN',(/1/),IPRT))RETURN ELSE IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,TOPICS(TOLF)%IACT_MODEL,TOLF,IDRNCB,'OLF',(/1/),IPRT))RETURN ENDIF IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,TOPICS(TCHD)%IACT_MODEL,TCHD,ICHDCB,'CHD',(/1/),IPRT))RETURN !## save sfr package IF(.NOT.PMANAGER_SAVEMF2005_SFR(DIR,DIRMNAME,IBATCH,TOPICS(TSFR)%IACT_MODEL,ISFRCB,'SFR',IPRT))RETURN !## save fhb package NSYSFHB=PMANAGER_GETNSYS(TFHB,1) IF(NSYSFHB.EQ.2)THEN IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,TOPICS(TFHB)%IACT_MODEL,TFHB,IFHBCB,'FHB',(/1,2/),IPRT))RETURN ELSEIF(NSYSFHB.EQ.3)THEN IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,TOPICS(TFHB)%IACT_MODEL,TFHB,IFHBCB,'FHB',(/1,2,3/),IPRT))RETURN ENDIF IF(TOPICS(TLAK)%IACT_MODEL)THEN !## save rest of lak package LPER=0; DO IPER=1,PRJNPER !## get appropriate stress-period to store in runfile KPER=PMANAGER_GETCURRENTIPER(IPER,TLAK,ITIME,JTIME) !## kper is stress period for which lakes are firstly defined IINI=0; IF(KPER.EQ.INIPER)IINI=1 !## read in new values in case not previous one can be used IF(ABS(KPER).NE.LPER)THEN KPER=ABS(KPER) IF(.NOT.PMANAGER_SAVEMF2005_LAK_READ(IPER,IPRT,KPER))RETURN ENDIF IF(.NOT.PMANAGER_SAVEMF2005_LAK_SAVE(IULAK,IINI,IBATCH,DIR,KPER=IPER,DIRMNAME=DIRMNAME))RETURN !## store previous stress-period information for this timestep LPER=ABS(KPER) ENDDO CLOSE(IULAK) ENDIF !## save obs package with mf6 IF(PBMAN%IFORMAT.EQ.3)THEN IF(.NOT.PMANAGER_SAVEMF2005_OBS(DIR,DIRMNAME,IBATCH,TOPICS(TOBS)%IACT_MODEL,TOBS,'OBS',1))RETURN ELSE !## combine olf/drn (if not MF6) IF(PBMAN%DMMFILE.EQ.1.OR.(TOPICS(TOLF)%IACT_MODEL.AND.TOPICS(TDRN)%IACT_MODEL))THEN IF(PBMAN%ICONCHK.EQ.0)THEN IF(.NOT.PMANAGER_SAVEMF2005_COMBINE(DIR,DIRMNAME,(/'OLF','DRN','DRN_'/),IDRNCB,'AUX ISUB DSUBSYS ISUB NOPRINT'))RETURN ELSE IF(.NOT.PMANAGER_SAVEMF2005_COMBINE(DIR,DIRMNAME,(/'OLF','DRN','DRN_'/),IDRNCB,'AUX ISUB DSUBSYS ISUB ICONCHK IC NOPRINT'))RETURN ENDIF ENDIF !## combine isg/riv (if not MF6) IF(TOPICS(TISG)%IACT_MODEL.OR.TOPICS(TRIV)%IACT_MODEL)THEN IF(PBMAN%INFFCT.EQ.1)THEN IF(.NOT.PMANAGER_SAVEMF2005_COMBINE(DIR,DIRMNAME,(/'ISG','RIV','RIV_'/),IRIVCB,'AUX ISUB RSUBSYS ISUB NOPRINT'))RETURN ELSE IF(.NOT.PMANAGER_SAVEMF2005_COMBINE(DIR,DIRMNAME,(/'ISG','RIV','RIV_'/),IRIVCB,'AUX RFCT AUX ISUB RFACT RFCT RSUBSYS ISUB NOPRINT'))RETURN ENDIF ENDIF ENDIF !## save ssm file IF(.NOT.PMANAGER_SAVEMF2005_SSM_READSAVE(MAINDIR,DIR,DIRMNAME,IBATCH,IPRT))RETURN !## write metaswap at last --- uses info from river export IF(.NOT.PMANAGER_SAVEMF2005_MSP(DIR,DIRMNAME,IBATCH,IPRT))RETURN !## recompute icell-type DO I=1,PBMAN%NSUBMODEL IF(.NOT.PMANAGER_SAVEMF2005_SETICELLTYPE(MAINDIR,DIRMNAME,I,(/'RIV6','GHB6'/)))RETURN !,'DRN6' ENDDO !## create connections IF(PBMAN%IFORMAT.EQ.3.AND.PBMAN%ISUBMODEL.EQ.PBMAN%NSUBMODEL)THEN DO; I=LEN_TRIM(MAINDIR); IF(MAINDIR(I:I).NE.'\')EXIT; MAINDIR(I:I)=' '; ENDDO ALLOCATE(NEX(PBMAN%NSUBMODEL,PBMAN%NSUBMODEL)); NEX=0 !## associated via imodbatch or submodel with variable layering IF(.NOT.ASSOCIATED(PBMAN%SM))THEN ALLOCATE(PBMAN%SM(PBMAN%NSUBMODEL)) DO I=1,PBMAN%NSUBMODEL ALLOCATE(PBMAN%SM(I)%ILAY(PRJNLAY)); DO J=1,PRJNLAY; PBMAN%SM(I)%ILAY(J)=J; ENDDO ENDDO ENDIF DO I=1,PBMAN%NSUBMODEL; ALLOCATE(PBMAN%SM(I)%CON(3)); ENDDO; ALLOCATE(SUBNLAY(PBMAN%NSUBMODEL)); SUBNLAY=0 DO I=1,PBMAN%NSUBMODEL; DO J=1,PBMAN%NSUBMODEL IF(I.EQ.J)CYCLE; N=NEX(J,I) CALL PMANAGER_SAVEMF6_EXG(MAINDIR,DIRMNAME,I,J,N,SUBNLAY(I)); NEX(I,J)=N ENDDO; ENDDO DEALLOCATE(NEX) !## exchange connections might be changed due to the HFB package IF(TOPICS(THFB)%IACT_MODEL.EQ.1)THEN DO I=1,PBMAN%NSUBMODEL CALL PMANAGER_SAVEMF6_EXG_MODIFYHFB(MAINDIR,DIRMNAME,I,SUBNLAY) ENDDO ENDIF DEALLOCATE(SUBNLAY) DO I=1,PBMAN%NSUBMODEL IF(ASSOCIATED(PBMAN%SM(I)%CON(1)%X))THEN PBMAN%SM(I)%CON(1)%FNAME=TRIM(MAINDIR)//'\GWF_'//TRIM(ITOS(I))//'\CON_TOP.IDF' IF(.NOT.IDFWRITE(PBMAN%SM(I)%CON(1),PBMAN%SM(I)%CON(1)%FNAME,1))THEN; ENDIF CALL IDFDEALLOCATEX(PBMAN%SM(I)%CON(1)) ENDIF IF(ASSOCIATED(PBMAN%SM(I)%CON(2)%X))THEN PBMAN%SM(I)%CON(2)%FNAME=TRIM(MAINDIR)//'\GWF_'//TRIM(ITOS(I))//'\CON_BOT.IDF' IF(.NOT.IDFWRITE(PBMAN%SM(I)%CON(2),PBMAN%SM(I)%CON(2)%FNAME,1))THEN; ENDIF CALL IDFDEALLOCATEX(PBMAN%SM(I)%CON(2)) ENDIF IF(ASSOCIATED(PBMAN%SM(I)%CON(3)%X))THEN PBMAN%SM(I)%CON(3)%FNAME=TRIM(MAINDIR)//'\GWF_'//TRIM(ITOS(I))//'\CON_LAT.IDF' IF(.NOT.IDFWRITE(PBMAN%SM(I)%CON(3),PBMAN%SM(I)%CON(3)%FNAME,1))THEN; ENDIF CALL IDFDEALLOCATEX(PBMAN%SM(I)%CON(3)) ENDIF DEALLOCATE(PBMAN%SM(I)%CON) ENDDO ! !## remove from nam if no packages exists anymore ! DO I=1,PBMAN%NSUBMODEL ! CALL PMANAGER_SAVEMF6_CLEANNAM(MAINDIR,DIRMNAME,I) ! ENDDO ENDIF !## modify files if needed for ies and/or modflow6 IF(.NOT.PMANAGER_SAVEMF2005_IES_READWRITE(DIRMNAME,IBATCH))RETURN !## modify files if needed for ipestp/ies and modflow6/seawat IF(.NOT.PMANAGER_SAVEMF2005_GLM_MF6_SEAWAT_READWRITE(MAINDIR,DIRMNAME,IBATCH))RETURN IF(PBMAN%IFORMAT.EQ.3.AND.PBMAN%ISUBMODEL.EQ.PBMAN%NSUBMODEL)THEN !## remove from nam if no packages exists anymore DO I=1,PBMAN%NSUBMODEL CALL PMANAGER_SAVEMF6_CLEANNAM(MAINDIR,DIRMNAME,I) ENDDO ENDIF PMANAGER_SAVEMF2005=.TRUE. END FUNCTION PMANAGER_SAVEMF2005 !###====================================================================== SUBROUTINE PMANAGER_SAVEMF6_CLEANNAM(DIR,DIRMNAME,M) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: M INTEGER :: I,J,IU,JU,KU,IOS,N,N1,N2 CHARACTER(LEN=256) :: FNAME,PCKFNAME,LINE,STRING CHARACTER(LEN=52) :: MDLNAME,CTXT CHARACTER(LEN=4),DIMENSION(6) :: PCK CHARACTER(LEN=24) :: CTMP LOGICAL :: LEX DATA PCK/'CHD6','WEL6','DRN6','RCH6','RIV6','HFB6'/ !## write *.nam file(s) N1=1; N2=1 IF(PBMAN%IPESTP.EQ.1)THEN IF(PEST%PE_MXITER.LT.0)THEN N1=-1; N2=N1 ELSE N1=-PBMAN%NLAMBDASEARCH; N2=SIZE(PEST%PARAM) ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN N1=1; N2=PEST%NREALS ENDIF MDLNAME=DIRMNAME(INDEX(DIRMNAME,'\',.TRUE.)+1:); MDLNAME=UTL_CAP(MDLNAME,'U') DO I=N1,N2 !## skip zero IF(I.EQ.0)CYCLE IU=UTL_GETUNIT() IF(PBMAN%IPESTP+PBMAN%IIES.EQ.0)THEN FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(M))//'\'//TRIM(MDLNAME)//'.NAM' ELSEIF(PBMAN%IPESTP.EQ.1)THEN IF(I.GT.0)THEN IF(PEST%PARAM(I)%PACT.EQ.0.OR.PEST%PARAM(I)%PIGROUP.LT.0)CYCLE FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(M))//'\'//TRIM(MDLNAME)//'_P#'//TRIM(ITOS(I))//'.NAM' ELSE FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(M))//'\'//TRIM(MDLNAME)//'_L#'//TRIM(ITOS(ABS(I)))//'.NAM' ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(M))//'\'//TRIM(MDLNAME)//'_R#'//TRIM(ITOS(ABS(I)))//'.NAM' ENDIF IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',ACTION='READ',FORM='FORMATTED'); IF(IU.EQ.0)RETURN JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=TRIM(FNAME)//'_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(JU.EQ.0)THEN; CLOSE(IU); RETURN; ENDIF DO READ(IU,'(A256)',IOSTAT=IOS) LINE IF(IOS.NE.0)EXIT WRITE(JU,'(A)') TRIM(LINE) IF(TRIM(LINE).EQ.'BEGIN PACKAGES')THEN DO READ(IU,'(A256)',IOSTAT=IOS) LINE IF(IOS.NE.0)EXIT LEX=.FALSE.; DO J=1,SIZE(PCK) IF(INDEX(LINE,PCK(J)).GT.0)THEN READ(LINE,*) CTXT,PCKFNAME !## remove '..\' DO IF(INDEX(PCKFNAME,'..\').EQ.0)EXIT PCKFNAME=UTL_SUBST(PCKFNAME,'..\','\') ENDDO !## check whether there are packages defined KU=UTL_GETUNIT(); CALL OSD_OPEN(KU,FILE=TRIM(DIR)//'\'//TRIM(PCKFNAME),STATUS='OLD', & ACTION='READ',FORM='FORMATTED'); IF(KU.EQ.0)RETURN LEX=.TRUE. DO READ(KU,'(A256)') STRING IF(INDEX(STRING,'MAXBOUND').GT.0)THEN READ(STRING,*) CTMP,N IF(N.GT.0)WRITE(JU,'(A)') TRIM(LINE) EXIT ENDIF IF(INDEX(STRING,'MAXHFB').GT.0)THEN READ(STRING,*) CTMP,N IF(N.GT.0)WRITE(JU,'(A)') TRIM(LINE) EXIT ENDIF ENDDO CLOSE(KU) ENDIF ENDDO IF(.NOT.LEX)WRITE(JU,'(A)') TRIM(LINE) ENDDO ENDIF ENDDO CLOSE(IU,STATUS='DELETE'); CLOSE(JU) CALL IOSRENAMEFILE(TRIM(FNAME)//'_',FNAME) ENDDO END SUBROUTINE PMANAGER_SAVEMF6_CLEANNAM !###====================================================================== SUBROUTINE PMANAGER_SAVEMF6_EXG(DIR,MNAME,M1,M2,NEX,NLAY) !###====================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),PARAMETER :: CDISTANCE=0.0D0 CHARACTER(LEN=*),INTENT(IN) :: DIR,MNAME INTEGER,INTENT(IN) :: M1,M2 INTEGER,INTENT(INOUT) :: NEX INTEGER,INTENT(OUT) :: NLAY REAL(KIND=DP_KIND) :: XP,YP,T,B,Z1,Z2 INTEGER :: IU,JU,I,J,K,IM,N,IOS,II,ILAY,JLAY,MAXNLAY,IROW,ICOL,JROW,JCOL,ID TYPE(IDFOBJ),ALLOCATABLE,DIMENSION(:,:) :: BND,TOP,BOT TYPE(IDFOBJ),ALLOCATABLE,DIMENSION(:) :: ICON1,ICON2 INTEGER,DIMENSION(2) :: MNLAY CHARACTER(LEN=256) :: FNAME,LINE CHARACTER(LEN=52) :: TXT,MDLNAME CHARACTER(LEN=1),DIMENSION(6) :: CID=['N','S','W','E','T','B'] LOGICAL :: LEX,LTOP,LBOT,LLAT MDLNAME=MNAME(INDEX(MNAME,'\',.TRUE.)+1:) FNAME=TRIM(DIR)//'\MFSIM_M'//TRIM(ITOS(M1))//'_M'//TRIM(ITOS(M2))//'.EXG' IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# '//TRIM(FNAME(INDEX(FNAME,'\',.TRUE.)+1:))//' File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(/A/)') '#General Options' WRITE(IU,'(A)') 'BEGIN OPTIONS' IF(TOPICS(TANI)%IACT_MODEL.EQ.1)WRITE(IU,'(A)') 'AUXILIARY ANGLDEGX' !## only output of one of the flowfluxes is active DO I=1,SIZE(TFLX) IF(ASSOCIATED(PBMAN%ISAVE(TFLX(I))%ILAY))THEN WRITE(IU,'(1X,A)') 'SAVE_FLOWS'; EXIT ENDIF ENDDO ! WRITE(IU,'(1X,A)') 'PRINT_INPUT' - no geprint in file ! WRITE(IU,'(1X,A)') 'PRINT_FLOWS' - no geprint in file ! WRITE(IU,'(1X,A)') 'HARMONIC' ! WRITE(IU,'(A)') '[VARIABLECV [DEWATERED]]' IF(PBMAN%NEWTON.EQ.1)WRITE(IU,'(1X,A)') 'NEWTON' ! WRITE(IU,'(A)') '[GNC6 FILEIN ]' !## ghost-node correction ! WRITE(IU,'(A)') '[MVR6 FILEIN ]' !## water mover ! WRITE(IU,'(A)') '[OBS6 FILEIN ]' !## observation WRITE(IU,'(A)') 'END OPTIONS' !## read boundary-files DO II=1,2 MAXNLAY=0 DO IM=1,2 JU=UTL_GETUNIT() IF(IM.EQ.1)OPEN(JU,FILE=TRIM(DIR)//'\GWF_'//TRIM(ITOS(M1))//'\MODELINPUT\'//TRIM(MDLNAME)//'.DIS6',STATUS='OLD',ACTION='READ') IF(IM.EQ.2)OPEN(JU,FILE=TRIM(DIR)//'\GWF_'//TRIM(ITOS(M2))//'\MODELINPUT\'//TRIM(MDLNAME)//'.DIS6',STATUS='OLD',ACTION='READ') DO READ(JU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT IF(INDEX(LINE,'BEGIN DIMENSIONS').GT.0)THEN READ(JU,*) TXT,MNLAY(IM); MAXNLAY=MAX(MAXNLAY,MNLAY(IM)); IF(IM.EQ.1)NLAY=MNLAY(IM) IF(II.EQ.2)THEN IF(IM.EQ.1)THEN !## read bnd as is DO I=1,MNLAY(IM); IF(.NOT.IDFREAD(BND(1,I),TRIM(DIR)//'\GWF_'//TRIM(ITOS(M1))//'\MODELINPUT\DIS6\BND_L'//TRIM(ITOS(I))//'.IDF',1))RETURN; ENDDO ELSE DO I=1,MNLAY(IM); IF(.NOT.IDFREAD(BND(2,I),TRIM(DIR)//'\GWF_'//TRIM(ITOS(M2))//'\MODELINPUT\DIS6\BND_L'//TRIM(ITOS(I))//'.IDF',1))RETURN; ENDDO ENDIF EXIT ENDIF ENDIF ENDDO CLOSE(JU) ENDDO IF(II.EQ.1)THEN ALLOCATE(BND(2,MAXNLAY)); DO I=1,SIZE(BND,1); DO J=1,SIZE(BND,2); CALL IDFNULLIFY(BND(I,J)); ENDDO; ENDDO ENDIF ENDDO !## check whether the first is smaller than the second first - return otherwise, it will come along later IF(BND(2,1)%DX.LT.BND(1,1)%DX.OR.NEX.GT.0)THEN DO I=1,SIZE(BND,1); DO J=1,SIZE(BND,2); CALL IDFDEALLOCATEX(BND(I,J)); ENDDO; ENDDO WRITE(IU,'(/A/)') '#Dimensions' WRITE(IU,'(A)') 'BEGIN DIMENSIONS' WRITE(IU,'(1X,A)') 'NEXG '//TRIM(ITOS(0)) WRITE(IU,'(A)') 'END DIMENSIONS' WRITE(IU,'(/A/)') '#Exchange Data' WRITE(IU,'(A)') 'BEGIN EXCHANGEDATA' WRITE(IU,'(/A)') 'END EXCHANGEDATA' DEALLOCATE(BND); CLOSE(IU); RETURN ENDIF ALLOCATE(TOP(2,MAXNLAY),BOT(2,MAXNLAY),ICON1(MNLAY(1)),ICON2(MNLAY(2))) DO I=1,SIZE(TOP,1); DO J=1,SIZE(TOP,2); CALL IDFNULLIFY(TOP(I,J)); ENDDO; ENDDO DO I=1,SIZE(BOT,1); DO J=1,SIZE(BOT,2); CALL IDFNULLIFY(BOT(I,J)); ENDDO; ENDDO !## correct the idomain DO K=1,2; DO ILAY=1,MNLAY(K); DO IROW=1,BND(K,1)%NROW; DO ICOL=1,BND(K,1)%NCOL BND(K,ILAY)%X(ICOL,IROW)=MIN(1.0D0,BND(K,ILAY)%X(ICOL,IROW)) !## inactive IF(BND(K,ILAY)%X(ICOL,IROW).EQ.0.0D0)BND(K,ILAY)%X(ICOL,IROW)=BND(K,ILAY)%NODATA !## vertically inactive idomain.le.0 IF(BND(K,ILAY)%X(ICOL,IROW).LT.0.0D0)BND(K,ILAY)%X(ICOL,IROW)=BND(K,ILAY)%NODATA ENDDO; ENDDO; ENDDO; ENDDO !## save connections DO ILAY=1,MNLAY(1); CALL IDFCOPY(BND(1,1),ICON1(ILAY)); ENDDO DO ILAY=1,MNLAY(2); CALL IDFCOPY(BND(2,1),ICON2(ILAY)); ENDDO LTOP=.FALSE.; LBOT=.FALSE.; LLAT=.FALSE. !## determine whether layers are onm top,bottom or next to eachother ILAY=PBMAN%SM(M1)%ILAY(1) JLAY=PBMAN%SM(M2)%ILAY(1) IF(ILAY.LT.JLAY)THEN LBOT=.TRUE. ELSEIF(ILAY.GT.JLAY)THEN LTOP=.TRUE. ELSE LLAT=.TRUE. ENDIF !## coarse model is on top of fine model IF(LTOP)THEN IF(.NOT.ASSOCIATED(PBMAN%SM(M1)%CON(1)%X))THEN CALL IDFCOPY(BND(1,1),PBMAN%SM(M1)%CON(1)) IF(.NOT.IDFALLOCATEX(PBMAN%SM(M1)%CON(1)))RETURN PBMAN%SM(M1)%CON(1)%X=0.0D0 ENDIF !## coarse model is on the bottom of fine model ELSEIF(LBOT)THEN IF(.NOT.ASSOCIATED(PBMAN%SM(M1)%CON(2)%X))THEN CALL IDFCOPY(BND(1,1),PBMAN%SM(M1)%CON(2)) IF(.NOT.IDFALLOCATEX(PBMAN%SM(M1)%CON(2)))RETURN PBMAN%SM(M1)%CON(2)%X=0.0D0 ENDIF !## coarse model is lateral of fine model ELSEIF(LLAT)THEN IF(.NOT.ASSOCIATED(PBMAN%SM(M1)%CON(3)%X))THEN CALL IDFCOPY(BND(1,1),PBMAN%SM(M1)%CON(3)) IF(.NOT.IDFALLOCATEX(PBMAN%SM(M1)%CON(3)))RETURN PBMAN%SM(M1)%CON(3)%X=0.0D0 ENDIF ENDIF !## read top/bottom in coarse-resolution DO IM=1,2 JU=UTL_GETUNIT() IF(IM.EQ.1)THEN DO I=1,MNLAY(IM); IF(.NOT.IDFREAD(TOP(1,I),TRIM(DIR)//'\GWF_'//TRIM(ITOS(M1))//'\MODELINPUT\DIS6\TOPM_L'//TRIM(ITOS(I))//'.IDF',1))RETURN; ENDDO DO I=1,MNLAY(IM); IF(.NOT.IDFREAD(BOT(1,I),TRIM(DIR)//'\GWF_'//TRIM(ITOS(M1))//'\MODELINPUT\DIS6\BOTM_L'//TRIM(ITOS(I))//'.IDF',1))RETURN; ENDDO ELSE DO I=1,MNLAY(IM); IF(.NOT.IDFREAD(TOP(2,I),TRIM(DIR)//'\GWF_'//TRIM(ITOS(M2))//'\MODELINPUT\DIS6\TOPM_L'//TRIM(ITOS(I))//'.IDF',1))RETURN; ENDDO DO I=1,MNLAY(IM); IF(.NOT.IDFREAD(BOT(2,I),TRIM(DIR)//'\GWF_'//TRIM(ITOS(M2))//'\MODELINPUT\DIS6\BOTM_L'//TRIM(ITOS(I))//'.IDF',1))RETURN; ENDDO ENDIF ENDDO DO I=1,2 N=0 !## keep track of type of connections DO ILAY=1,MNLAY(1); ICON1(ILAY)%X=0.0D0; ENDDO DO ILAY=1,MNLAY(2); ICON2(ILAY)%X=0.0D0; ENDDO !## vertical connections IF(LTOP)THEN DO IROW=1,BND(1,1)%NROW; DO ICOL=1,BND(1,1)%NCOL !## already created a link upwards IF(PBMAN%SM(M1)%CON(1)%X(ICOL,IROW).NE.0.0D0)CYCLE !## find first top-layer to be potential connected to an upper layer ILAYLOOP1: DO ILAY=1,MNLAY(1) !## skip inactive cells IF(BND(1,ILAY)%X(ICOL,IROW).EQ.BND(1,ILAY)%NODATA)CYCLE !## if active in other model - probably vertical connection to the top/bottom CALL IDFGETLOC(BND(1,1),IROW,ICOL,XP,YP); CALL IDFIROWICOL(BND(2,1),JROW,JCOL,XP,YP) Z1=TOP(1,ILAY)%X(JCOL,JROW); Z2=BOT(1,ILAY)%X(JCOL,JROW) !## try top connection LEX=.FALSE.; DO JLAY=MNLAY(2),1,-1 !## only try active layer on top T=TOP(2,JLAY)%X(JCOL,JROW); B=BOT(2,JLAY)%X(JCOL,JROW) IF(T-B.GT.0.0D0)THEN IF(PMANAGER_SAVEMF6_EXG_CONNECTIONS('T',IU,ILAY,IROW,ICOL,JLAY,BND,TOP,BOT,I))THEN IF(I.EQ.2)PBMAN%SM(M1)%CON(1)%X(ICOL,IROW)=M2 N=N+1 !## id number of cell to be connected to ICON1(ILAY)%X(ICOL,IROW)=N ICON2(JLAY)%X(JCOL,JROW)=N !## stop looking EXIT ILAYLOOP1 ENDIF ENDIF ENDDO ENDDO ILAYLOOP1 ENDDO; ENDDO ENDIF !## vertical connections IF(LBOT)THEN DO IROW=1,BND(1,1)%NROW; DO ICOL=1,BND(1,1)%NCOL !## already created a link downwards IF(PBMAN%SM(M1)%CON(2)%X(ICOL,IROW).NE.0.0D0)CYCLE !## find first bottom-layer to be potential connected to a lower layer ILAYLOOP2: DO ILAY=MNLAY(1),1,-1 !## skip inactive cells IF(BND(1,ILAY)%X(ICOL,IROW).EQ.BND(1,ILAY)%NODATA)CYCLE !## if active in other model - probably vertical connection to the top/bottom CALL IDFGETLOC(BND(1,1),IROW,ICOL,XP,YP); CALL IDFIROWICOL(BND(2,1),JROW,JCOL,XP,YP) Z1=TOP(1,ILAY)%X(JCOL,JROW); Z2=BOT(1,ILAY)%X(JCOL,JROW) !## try bot connection LEX=.FALSE.; DO JLAY=1,MNLAY(2) !## only try active layer on top T=TOP(2,JLAY)%X(JCOL,JROW); B=BOT(2,JLAY)%X(JCOL,JROW) IF(T-B.GT.0.0D0)THEN IF(PMANAGER_SAVEMF6_EXG_CONNECTIONS('B',IU,ILAY,IROW,ICOL,JLAY,BND,TOP,BOT,I))THEN IF(I.EQ.2)PBMAN%SM(M1)%CON(2)%X(ICOL,IROW)=M2 N=N+1 !## id number of cell to be connected to ICON1(ILAY)%X(ICOL,IROW)=N ICON2(JLAY)%X(JCOL,JROW)=N !## stop looking EXIT ILAYLOOP2 ENDIF ENDIF ENDDO ENDDO ILAYLOOP2 ENDDO; ENDDO ENDIF IF(LLAT)THEN DO ILAY=1,MNLAY(1) !## connections DO IROW=1,BND(1,ILAY)%NROW; DO ICOL=1,BND(1,ILAY)%NCOL !## skip inactive cells IF(BND(1,ILAY)%X(ICOL,IROW).EQ.BND(1,ILAY)%NODATA)CYCLE !## found boundary cell DO ID=1,4 LEX=.FALSE. SELECT CASE (CID(ID)) !## north CASE ('N') IF(IROW.EQ.1)LEX=.TRUE. IF(IROW.GT.1)THEN; LEX=BND(1,ILAY)%X(ICOL,IROW-1).EQ.BND(1,ILAY)%NODATA; ENDIF !## south CASE ('S') IF(IROW.EQ.BND(1,ILAY)%NROW)LEX=.TRUE. IF(IROW.LT.BND(1,ILAY)%NROW)THEN; LEX=BND(1,ILAY)%X(ICOL,IROW+1).EQ.BND(1,ILAY)%NODATA; ENDIF !## west CASE ('W') IF(ICOL.EQ.1)LEX=.TRUE. IF(ICOL.GT.1)THEN; LEX=BND(1,ILAY)%X(ICOL-1,IROW).EQ.BND(1,ILAY)%NODATA; ENDIF !## east CASE ('E') IF(ICOL.EQ.BND(1,ILAY)%NCOL)LEX=.TRUE. IF(ICOL.LT.BND(1,ILAY)%NCOL)THEN; LEX=BND(1,ILAY)%X(ICOL+1,IROW).EQ.BND(1,ILAY)%NODATA; ENDIF END SELECT IF(.NOT.LEX)CYCLE IF(PMANAGER_SAVEMF6_EXG_CONNECTIONS(CID(ID),IU,ILAY,IROW,ICOL,0,BND,TOP,BOT,I))THEN IF(I.EQ.2)PBMAN%SM(M1)%CON(3)%X(ICOL,IROW)=M2 N=N+1 !## id number of cell to be connected to ICON1(ILAY)%X(ICOL,IROW)=N CALL IDFGETLOC(BND(1,1),IROW,ICOL,XP,YP); CALL IDFIROWICOL(BND(2,1),JROW,JCOL,XP,YP) IF(JROW.NE.0.AND.JCOL.NE.0)ICON2(ILAY)%X(JCOL,JROW)=N ENDIF ENDDO ENDDO; ENDDO ENDDO ENDIF IF(I.EQ.1)THEN WRITE(IU,'(/A/)') '#Dimensions' WRITE(IU,'(A)') 'BEGIN DIMENSIONS' WRITE(IU,'(1X,A)') 'NEXG '//TRIM(ITOS(N)); NEX=N WRITE(IU,'(A)') 'END DIMENSIONS' WRITE(IU,'(/A/)') '#Exchange Data' WRITE(IU,'(A)') 'BEGIN EXCHANGEDATA' ELSE WRITE(IU,'(A)') 'END EXCHANGEDATA' ENDIF ENDDO CLOSE(IU) !## write connections DO I=1,MNLAY(1) ICON1(I)%FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(M1))//'\GWF_EXCHANGE\GWF_'//TRIM(ITOS(M1))//'_L'//TRIM(ITOS(I))//'_GWF_'//TRIM(ITOS(M2))//'.IDF' IF(MAXVAL(ICON1(I)%X).EQ.0.0D0)CYCLE IF(.NOT.IDFWRITE(ICON1(I),ICON1(I)%FNAME,1))THEN; ENDIF ENDDO DO I=1,MNLAY(2) ICON2(I)%FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(M2))//'\GWF_EXCHANGE\GWF_'//TRIM(ITOS(M2))//'_L'//TRIM(ITOS(I))//'_GWF_'//TRIM(ITOS(M1))//'.IDF' IF(MAXVAL(ICON2(I)%X).EQ.0.0D0)CYCLE IF(.NOT.IDFWRITE(ICON2(I),ICON2(I)%FNAME,1))THEN; ENDIF ENDDO DO I=1,SIZE(BND,1); DO J=1,SIZE(BND,2); CALL IDFDEALLOCATEX(BND(I,J)); ENDDO; ENDDO DO I=1,SIZE(TOP,1); DO J=1,SIZE(TOP,2); CALL IDFDEALLOCATEX(TOP(I,J)); ENDDO; ENDDO DO I=1,SIZE(BOT,1); DO J=1,SIZE(BOT,2); CALL IDFDEALLOCATEX(BOT(I,J)); ENDDO; ENDDO DEALLOCATE(BND,TOP,BOT) DO I=1,SIZE(ICON1); CALL IDFDEALLOCATEX(ICON1(I)); ENDDO DO I=1,SIZE(ICON2); CALL IDFDEALLOCATEX(ICON2(I)); ENDDO DEALLOCATE(ICON1,ICON2) END SUBROUTINE PMANAGER_SAVEMF6_EXG !###====================================================================== SUBROUTINE PMANAGER_SAVEMF6_EXG_MODIFYHFB(MAINDIR,MNAME,M1,SUBNLAY) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: MNAME,MAINDIR INTEGER,INTENT(IN),DIMENSION(:) :: SUBNLAY INTEGER,INTENT(IN) :: M1 CHARACTER(LEN=256) :: FNAME,STRING,MDLNAME CHARACTER(LEN=52) :: TXT CHARACTER(LEN=1) :: CDIR,CHV INTEGER :: IU,JU,KU,IOS,ILAY,IROW,ICOL,N,IHC,M,M2,IHFB,NEXG,MM,II REAL(KIND=DP_KIND) :: HWVA,AREA,F REAL(KIND=DP_KIND),DIMENSION(2) :: CL TYPE HFBOBJ INTEGER,DIMENSION(2) :: ICOL,IROW INTEGER :: ILAY,IBND CHARACTER(LEN=1) :: CHV REAL(KIND=DP_KIND) :: C,F END TYPE HFBOBJ TYPE(HFBOBJ),ALLOCATABLE,DIMENSION(:,:) :: HFB INTEGER,DIMENSION(2,3) :: CELLID INTEGER,DIMENSION(2) :: NHFB MDLNAME=MNAME(INDEX(MNAME,'\',.TRUE.)+1:) !## correct any exchange, if needed, for this submodel DO M2=1,PBMAN%NSUBMODEL IF(M2.EQ.M1)CYCLE FNAME=TRIM(MAINDIR)//'\MFSIM_M'//TRIM(ITOS(M1))//'_M'//TRIM(ITOS(M2))//'.EXG' IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',ACTION='READ',FORM='FORMATTED'); IF(IU.EQ.0)RETURN FNAME=TRIM(MAINDIR)//'\MFSIM_M'//TRIM(ITOS(M1))//'_M'//TRIM(ITOS(M2))//'.EXG_' KU=UTL_GETUNIT(); CALL OSD_OPEN(KU,FILE=FNAME,STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(KU.EQ.0)RETURN DO READ(IU,'(A256)',IOSTAT=IOS) STRING !## file probably empty IF(IOS.NE.0)EXIT IF(TRIM(STRING).EQ.'BEGIN DIMENSIONS')THEN WRITE(KU,'(A)') TRIM(STRING) READ(IU,'(A256)',IOSTAT=IOS) STRING READ(STRING,*) TXT,NEXG ENDIF IF(TRIM(STRING).EQ.'BEGIN EXCHANGEDATA')THEN WRITE(KU,'(A)') TRIM(STRING) !## load all hfbs on boundaries for both sub models ALLOCATE(HFB(2,1)); NHFB=0 !## exchange existing IF(NEXG.GT.0)THEN DO I=1,2 M=0; DO IHFB=1,2 IF(IHFB.EQ.1)MM=M1; IF(IHFB.EQ.2)MM=M2 N=0; DO ILAY=1,SUBNLAY(MM) FNAME=TRIM(MAINDIR)//'\GWF_'//TRIM(ITOS(MM))//'\MODELINPUT\'//TRIM(MDLNAME)//'_HFB_L'//TRIM(ITOS(ILAY))//'.DAT' JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=FNAME,STATUS='OLD',ACTION='READ',FORM='FORMATTED',IQUESTION=0) IF(JU.GT.0)THEN READ(JU,*) DO N=N+1 IF(I.EQ.1)THEN M=M+1; IF(I.EQ.1)N=1 ELSE IF(N.GT.NHFB(IHFB))EXIT ENDIF READ(JU,'(11X,F15.0,17X,F15.0,10X,5I10)',IOSTAT=IOS) HFB(IHFB,N)%C, HFB(IHFB,N)%F, HFB(IHFB,N)%ICOL(1), & HFB(IHFB,N)%IROW(1),HFB(IHFB,N)%ICOL(2),HFB(IHFB,N)%IROW(2), & HFB(IHFB,N)%IBND IF(IOS.NE.0)EXIT HFB(IHFB,N)%ILAY=ILAY !## horizontal IF(HFB(IHFB,N)%ICOL(1).LT.HFB(IHFB,N)%ICOL(2))HFB(IHFB,N)%CHV='H' IF(HFB(IHFB,N)%ICOL(1).GT.HFB(IHFB,N)%ICOL(2))HFB(IHFB,N)%CHV='H' !## vertical IF(HFB(IHFB,N)%IROW(1).LT.HFB(IHFB,N)%IROW(2))HFB(IHFB,N)%CHV='V' IF(HFB(IHFB,N)%IROW(1).GT.HFB(IHFB,N)%IROW(2))HFB(IHFB,N)%CHV='V' ENDDO M=M-1; IF(I.EQ.1)NHFB(IHFB)=M; CLOSE(JU) ENDIF ENDDO ENDDO IF(MAXVAL(NHFB).GT.0)THEN IF(I.EQ.1)THEN DEALLOCATE(HFB); ALLOCATE(HFB(2,MAXVAL(NHFB))) ENDIF ELSE !## nothing found - continue EXIT ENDIF ENDDO ENDIF !## check whether hfb urges to modify exchange DO READ(IU,'(A256)',IOSTAT=IOS) STRING; IF(IOS.NE.0)EXIT; IF(LEN_TRIM(STRING).EQ.0)EXIT IF(TRIM(STRING).EQ.'END EXCHANGEDATA')EXIT READ(STRING,'(7I10,5G15.7,3X,A1)') (CELLID(1,I),I=1,3),(CELLID(2,I),I=1,3),IHC,CL(1),CL(2),HWVA,AREA,CDIR SELECT CASE (CDIR); CASE ('E','W'); CHV='H'; CASE DEFAULT; CHV='V'; END SELECT DO IHFB=1,2 !## look for fault ILAY=CELLID(IHFB,1) IROW=CELLID(IHFB,2) ICOL=CELLID(IHFB,3) IILOOP: DO I=1,NHFB(IHFB) !## skip if not on a potential boundary IF(HFB(IHFB,I)%IBND.EQ.0)CYCLE DO II=1,2 IF(HFB(IHFB,I)%ILAY .EQ.ILAY.AND. & HFB(IHFB,I)%IROW(II).EQ.IROW.AND. & HFB(IHFB,I)%ICOL(II).EQ.ICOL.AND. & HFB(IHFB,I)%CHV .EQ.CHV)THEN !## no flow at all - remove exchange --- this need to be solved by the USGS F=HUGE(1.0) !## found hfb location in between current sub model - apply factor CL=CL*F; EXIT IILOOP ENDIF ENDDO ENDDO IILOOP IF(IHFB.EQ.2.OR.I.LE.NHFB(IHFB))THEN WRITE(KU,'(7I10,5G15.7,1X,A3)') (CELLID(1,I),I=1,3),(CELLID(2,I),I=1,3),IHC,CL(1),CL(2),HWVA,AREA,CDIR EXIT ENDIF ENDDO ENDDO DEALLOCATE(HFB) WRITE(KU,'(A)') TRIM(STRING) ELSE WRITE(KU,'(A)') TRIM(STRING) ENDIF ENDDO CLOSE(IU,STATUS='DELETE'); CLOSE(KU) CALL IOSRENAMEFILE(TRIM(MAINDIR)//'\MFSIM_M'//TRIM(ITOS(M1))//'_M'//TRIM(ITOS(M2))//'.EXG_', & TRIM(MAINDIR)//'\MFSIM_M'//TRIM(ITOS(M1))//'_M'//TRIM(ITOS(M2))//'.EXG') ENDDO END SUBROUTINE PMANAGER_SAVEMF6_EXG_MODIFYHFB !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF6_EXG_CONNECTIONS(CDIR,IU,ILAY,IROW,ICOL,KLAY,BND,TOP,BOT,IIU) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: CDIR INTEGER,INTENT(IN) :: ILAY,IROW,ICOL,IU,IIU,KLAY TYPE(IDFOBJ),INTENT(IN),DIMENSION(:,:) :: BND,TOP,BOT INTEGER,DIMENSION(2,3) :: CELLID INTEGER :: JROW,JCOL,JLAY,IHC,I REAL(KIND=DP_KIND) :: HWVA,XP1,YP1,XP2,YP2,X1,X2,Y1,Y2,Z1,Z2,XP,YP,ZP1,ZP2,DX1,DX2,DY1,DY2,DZ1,DZ2, & XINT1,YINT1,ZINT1,XINT2,YINT2,ZINT2,ANGLDEGX,DX,DY REAL(KIND=DP_KIND),DIMENSION(2) :: CL PMANAGER_SAVEMF6_EXG_CONNECTIONS=.FALSE. !## active cell? IF(BND(1,ILAY)%X(ICOL,IROW).EQ.BND(1,ILAY)%NODATA)RETURN !## current centre location of fine model CALL IDFGETLOC (BND(1,ILAY),IROW,ICOL,XP1,YP1) !## get location in coarse-model use ilay=1 CALL IDFGETEDGE (BND(1,ILAY),IROW,ICOL,X1 ,Y1 ,X2 ,Y2) !## get vertical position of node Z2=TOP(1,ILAY)%X(ICOL,IROW); Z1=BOT(1,ILAY)%X(ICOL,IROW) DZ1=Z2-Z1; ZP1=Z1+0.5D0*DZ1 !## get cellsize of fine model CALL IDFGETDXDY(BND(1,ILAY),IROW,ICOL,DX1,DY1) !## get location of nearest course model SELECT CASE (CDIR) CASE ('N'); CALL IDFGETLOC(BND(1,ILAY),IROW-1,ICOL,XP,YP); IHC=1; JLAY=ILAY CASE ('S'); CALL IDFGETLOC(BND(1,ILAY),IROW+1,ICOL,XP,YP); IHC=1; JLAY=ILAY CASE ('W'); CALL IDFGETLOC(BND(1,ILAY),IROW,ICOL-1,XP,YP); IHC=1; JLAY=ILAY CASE ('E'); CALL IDFGETLOC(BND(1,ILAY),IROW,ICOL+1,XP,YP); IHC=1; JLAY=ILAY CASE ('T'); CALL IDFGETLOC(BND(1,ILAY),IROW,ICOL ,XP,YP); IHC=0; JLAY=KLAY CASE ('B'); CALL IDFGETLOC(BND(1,ILAY),IROW,ICOL ,XP,YP); IHC=0; JLAY=KLAY END SELECT !## outside parent model CALL IDFIROWICOL(BND(2,JLAY),JROW,JCOL,XP,YP); IF(JROW.LE.0.OR.JCOL.LE.0)RETURN !## check if location is active IF(BND(2,JLAY)%X(JCOL,JROW).EQ.BND(2,JLAY)%NODATA)RETURN !## get location of cell outside submodel CALL IDFGETLOC(BND(2,JLAY),JROW,JCOL,XP2,YP2) !## get vertical position of node DZ2=TOP(2,JLAY)%X(JCOL,JROW)-BOT(2,JLAY)%X(JCOL,JROW) ZP2=BOT(2,JLAY)%X(JCOL,JROW)+0.5D0*DZ2 !## get cellsize of course model CALL IDFGETDXDY(BND(2,JLAY),JROW,JCOL,DX2,DY2) DX=XP2-XP1 DY=YP2-YP1 ANGLDEGX=ATAN2(DY,DX) ANGLDEGX=(ANGLDEGX*360.0D0)/(2.0D0*PI) IF(ANGLDEGX.LT.0.0D0)ANGLDEGX=ANGLDEGX+360.0D0 CELLID(1,1)=ILAY CELLID(1,2)=IROW CELLID(1,3)=ICOL CELLID(2,1)=JLAY CELLID(2,2)=JROW CELLID(2,3)=JCOL !## find point on shared interface SELECT CASE (CDIR) CASE ('W') XINT1=X1; YINT1=YP1 XINT2=X1; YINT2=YP2 CASE ('E') XINT1=X2; YINT1=YP1 XINT2=X2; YINT2=YP2 CASE ('N') XINT1=XP1; YINT1=Y2 XINT2=XP2; YINT2=Y2 CASE ('S') XINT1=XP1; YINT1=Y1 XINT2=XP2; YINT2=Y1 CASE ('T') ZINT1=Z2; XINT1=XP1; YINT1=YP1 ZINT2=Z2; XINT2=XP2; YINT2=YP2 CASE ('B') ZINT1=Z1; XINT1=XP1; YINT1=YP1 ZINT2=Z1; XINT2=XP2; YINT2=YP2 END SELECT !## area of connection in vertical HWVA=0.0D0 !## width of connection IF(IHC.EQ.1)THEN !## distance to shared interface CL(1)=UTL_DIST(XP1,YP1,XINT1,YINT1) CL(2)=UTL_DIST(XP2,YP2,XINT2,YINT2) HWVA=X2-X1 !## area of connection ELSEIF(IHC.EQ.0)THEN !## ook 2d denk ik ... gewoon recht naar het vlak toe CL(1)=UTL_DIST_3D(XP1,YP1,ZP1,XINT1,YINT1,ZINT1) CL(2)=UTL_DIST_3D(XP2,YP2,ZP2,XINT2,YINT2,ZINT2) HWVA=(X2-X1)*(Y2-Y1) ENDIF IF(IIU.EQ.2)THEN IF(TOPICS(TANI)%IACT_MODEL.EQ.1)THEN WRITE(IU,'(7I10,5G15.7,1X,A3)') (CELLID(1,I),I=1,3),(CELLID(2,I),I=1,3),IHC,CL(1),CL(2),HWVA,ANGLDEGX,CDIR ELSE WRITE(IU,'(7I10,5G15.7,1X,A3)') (CELLID(1,I),I=1,3),(CELLID(2,I),I=1,3),IHC,CL(1),CL(2),HWVA,0.0D0,CDIR ENDIF ENDIF PMANAGER_SAVEMF6_EXG_CONNECTIONS=.TRUE. END FUNCTION PMANAGER_SAVEMF6_EXG_CONNECTIONS !###====================================================================== LOGICAL FUNCTION PMANAGER_MERGELAYERS() !###====================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),DIMENSION(:),ALLOCATABLE :: TP,BT,HK,VA,KD,C,TK INTEGER,DIMENSION(:),ALLOCATABLE :: IB INTEGER :: IROW,ICOL,ILAY,IL,IL1,IL2,TB1,TB2,TA1,TA2 REAL(KIND=DP_KIND) :: CT,DK,MAXC,CT1,CT2,DK1,DK2,TT1,TT2,TC1,TC2,C1,VA1 REAL(KIND=DP_KIND),PARAMETER :: MAXK=1.0D0 PMANAGER_MERGELAYERS=.TRUE.; IF(PBMAN%MERGELAYERS.EQ.0.0D0)RETURN MAXC=PBMAN%MERGELAYERS PMANAGER_MERGELAYERS=.FALSE. ALLOCATE(TP(PRJNLAY),BT(PRJNLAY),HK(PRJNLAY),VA(PRJNLAY),IB(PRJNLAY),KD(PRJNLAY),C(PRJNLAY),TK(PRJNLAY)) !## total number of active cells TA1=0; TA2=0 DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(IROW.EQ.2.AND.ICOL.EQ.2)THEN WRITE(*,*) ENDIF DO ILAY=1,PRJNLAY IB(ILAY)=BND(ILAY)%X(ICOL,IROW) TP(ILAY)=TOP(ILAY)%X(ICOL,IROW) BT(ILAY)=BOT(ILAY)%X(ICOL,IROW) TK(ILAY)=TP(ILAY)-BT(ILAY) !## correct thickness in case ibound=0 IF(IB(ILAY).EQ.0)TK(ILAY)=0.0D0 HK(ILAY)=KHV(ILAY)%X(ICOL,IROW) VA(ILAY)=KVA(ILAY)%X(ICOL,IROW) ENDDO !## merge layers if possible !## a resistance is less then 10 days !## b transmissivity is in class of diff log10(k).lt.1.0 KD=0.0D0; C=0.0D0 DO ILAY=1,PRJNLAY IF(TK(ILAY).GT.0.0D0)THEN KD(ILAY)=(TK(ILAY))* HK(ILAY) C(ILAY)=(TK(ILAY))/(HK(ILAY)/VA(ILAY)) TA1 = TA1+1 ENDIF ENDDO !## totals TB1=SUM(ABS(IB)); TT1=SUM(KD); TC1=SUM(C) C1=0.0D0; CT=0.0D0 !## find first on-zero thickness layer DO IL1=1,PRJNLAY-1; IF(TK(IL1).GT.0.0D0)EXIT; ENDDO; IL2=IL1 !## merge layers DO ILAY=IL1,PRJNLAY-1 ! DO ILAY=1,PRJNLAY-1 CT1=0.0D0; CT2=0.0D0; DK1=0.0D0; DK2=0.0D0 IF(TK(ILAY ).NE.0)CT1=C(ILAY) /2.0D0 IF(TK(ILAY+1).NE.0)CT2=C(ILAY+1)/2.0D0 !## total vertical resistance CT=CT+(CT1+CT2) ! !## determine log10(material) - subsequently ! IF(TK(IL1 ).GT.0.0D0)DK1= LOG10(HK(IL1 )) ! IF(TK(ILAY+1).GT.0.0D0)DK2=DK1-LOG10(HK(ILAY+1)) ! DK=ABS(DK2-DK1) !## still less vertical resistance and subsequent material within log10(1) IF(CT.GT.MAXC)THEN !.OR.DK.GT.MAXK)THEN BT(IL1)=BT(IL2) TK(IL1)=TP(IL1)-BT(IL1) DO IL=IL1+1,IL2 !## take boundary setting IF(IB(IL1).GE.0.AND.IB(IL).NE.0)IB(IL1)=IB(IL) KD(IL1)=KD(IL1)+KD(IL) C(IL1)= C(IL1)+ C(IL) !## reset to default values KD(IL) =1.0D0 HK(IL) =1.0D0 VA(IL) =1.0D0 C(IL) =1.0D0 !## thickness of merges layer is 0.0 TP(IL)=BT(IL2) BT(IL)=BT(IL2) TK(IL)=0.0D0 ENDDO !## recompute hk and va IF(TK(IL1).GT.0.0D0)THEN HK(IL1)=KD(IL1)/(TP(IL1)-BT(IL1)) !## vertical k-value VA(IL1)=(TP(IL1)-BT(IL1))/C(IL1) VA(IL1)= HK(IL1) /VA(IL1) !## correct c value for first modellayer only, to be applied after checking column resistance IF(IL1.EQ.1)THEN !## resistance need to be this C1 =(CT-CT2)*2.0D0 VA1=(TP(IL1)-BT(IL1))/C1 VA1= HK(IL1) /VA1 ENDIF ENDIF IL1=ILAY+1; IL2=IL1; CT=0.0D0 ELSE IL2=IL2+1 ENDIF ENDDO !10 continue KD=0.0D0; C=0.0D0 DO ILAY=1,PRJNLAY IF(TK(ILAY).GT.0.0D0)THEN KD(ILAY)=(TK(ILAY))* HK(ILAY) C(ILAY) =(TK(ILAY))/(HK(ILAY)/VA(ILAY)) TA2 = TA2+1 ENDIF ENDDO !## totals TB2=SUM(ABS(IB)); TT2=SUM(KD); TC2=SUM(C) IF(ABS(TT1-TT2).GT.0.1D0.OR.ABS(TC1-TC2).GT.0.1D0)THEN WRITE(*,'(2I5,4F10.2)') TB1,TB2,TT1,TT2,TC1,TC2 pause ENDIF !## correct vertical resistance for layer 1 IF(C1.NE.0.0D0)C(1)=C1 !## no constant head in zero-thickness layer ! DO ILAY=1,PRJNLAY ! IF(TP(ILAY)-BT(ILAY).EQ.0.0D0)IB(ILAY)=ABS(IB(ILAY)) ! ENDDO !## copy new configuration DO ILAY=1,PRJNLAY if(BND(ILAY)%X(ICOL,IROW).ne.ib(ilay).AND.MAXC.LE.0.01)then write(*,*) 'bnd ',BND(ILAY)%X(ICOL,IROW),ib(ilay) endif BND(ILAY)%X(ICOL,IROW)=IB(ILAY) if(abs(TOP(ILAY)%X(ICOL,IROW)-TP(ilay)).gt.0.0001d0.AND.MAXC.LE.0.01)then write(*,*) 'top ',TOP(ILAY)%X(ICOL,IROW),tp(ilay) ENDIF TOP(ILAY)%X(ICOL,IROW)=TP(ILAY) if(abs(BOT(ILAY)%X(ICOL,IROW)-BT(ilay)).gt.0.0001d0.AND.MAXC.LE.0.01)then write(*,*) 'bot ',bot(ILAY)%X(ICOL,IROW),bt(ilay) ENDIF BOT(ILAY)%X(ICOL,IROW)=BT(ILAY) IF(TK(ILAY).GT.0.0D0)THEN if(abs(KHV(ILAY)%X(ICOL,IROW)-HK(ilay)).gt.0.0001d0.AND.MAXC.LE.0.01)then write(*,*) 'khv ',khv(ILAY)%X(ICOL,IROW),hk(ILAY) ENDIF ENDIF KHV(ILAY)%X(ICOL,IROW)=HK(ILAY) IF(TK(ILAY).GT.0.0D0)THEN if(abs(KVA(ILAY)%X(ICOL,IROW)-VA(ilay)).gt.0.000001d0.AND.MAXC.LE.0.01)then write(*,*) 'kva ',KVA(ILAY)%X(ICOL,IROW),VA(ILAY) ENDIF ENDIF KVA(ILAY)%X(ICOL,IROW)=VA(ILAY) ENDDO ENDDO; ENDDO !## make sure there is a uppermost layer available WRITE(*,'(/2(A,I10),A,F10.2,A/)') 'AGGREGATE DECREASES NUMBER OF ACTIVE CELLS FROM ',TA1,' TO ',TA2,' (',REAL(TA1,8)/REAL(TA2,8),'% REDUCTION)' DEALLOCATE(TP,BT,HK,VA,IB,KD,C,TK) PMANAGER_MERGELAYERS=.TRUE. END FUNCTION PMANAGER_MERGELAYERS !###====================================================================== SUBROUTINE PMANAGER_SAVEMF2005_CONSISTENCY(LTB) !###====================================================================== IMPLICIT NONE LOGICAL,INTENT(IN) :: LTB INTEGER :: IROW,ICOL,ILAY,JLAY,N REAL(KIND=DP_KIND),DIMENSION(:),ALLOCATABLE :: TP,BT,HK,VK,VA,TP_BU,BT_BU,HK_BU,VK_BU,VA_BU REAL(KIND=DP_KIND),DIMENSION(:,:),ALLOCATABLE :: TH INTEGER,DIMENSION(:),ALLOCATABLE :: IB REAL(KIND=DP_KIND) :: ST,SB !## make sure nodata for anisotropy factors is 1.0D0 IF(TOPICS(TANI)%IACT_MODEL.EQ.1)THEN !## apply consistency check anisotropy factor to be in between 0.0D0-1.0D0 DO ILAY=1,PRJNLAY; DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL ANF(ILAY)%X(ICOL,IROW)=MAX(0.0D0,MIN(1.0D0,ANF(ILAY)%X(ICOL,IROW))) ENDDO; ENDDO; ENDDO !## set boundary corners =0 DO ILAY=1,PRJNLAY BND(ILAY)%X(1 ,1 )=0.0D0 BND(ILAY)%X(PRJIDF%NCOL,1 )=0.0D0 BND(ILAY)%X(1 ,PRJIDF%NROW)=0.0D0 BND(ILAY)%X(PRJIDF%NCOL,PRJIDF%NROW)=0.0D0 ENDDO ENDIF !## in case of modflow6 overrule consistency check to option 1 IF(PBMAN%IFORMAT.EQ.3)THEN PBMAN%ICONSISTENCY=1; PBMAN%MINTHICKNESS=0.0D0 ENDIF IF(TOPICS(TKHV)%IACT_MODEL.EQ.0)THEN; PBMAN%ICONSISTENCY=0; ENDIF !## clean from bottom to top inactive layers with zero conductance - in case of iconsistency.eq.1 IF(PBMAN%ICONSISTENCY.NE.2)THEN DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL DO ILAY=PRJNLAY,1,-1 IF(KDW(ILAY)%X(ICOL,IROW).LE.0.0D0)THEN IF(ILAY.GT.1)VCW(ILAY-1)%X(ICOL,IROW)=0.0D0 KDW(ILAY)%X(ICOL,IROW)=0.0D0 BND(ILAY)%X(ICOL,IROW)=0.0D0 ELSE !## stop search for this location EXIT ENDIF ENDDO ENDDO; ENDDO ENDIF IF(.NOT.LTB)RETURN !## apply consistency check top/bot IF(PBMAN%ICONSISTENCY.EQ.1)THEN DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL; JLAY=0; DO ILAY=1,PRJNLAY IF(BND(ILAY)%X(ICOL,IROW).EQ.0)CYCLE ST=TOP(ILAY)%X(ICOL,IROW) SB=BOT(ILAY)%X(ICOL,IROW) SB=MIN(ST,SB) BOT(ILAY)%X(ICOL,IROW)=SB IF(JLAY.GT.0)THEN !## minimal aquifer thickness SB=BOT(JLAY)%X(ICOL,IROW) ST=TOP(ILAY)%X(ICOL,IROW) ST=MIN(SB,ST) TOP(ILAY)%X(ICOL,IROW)=ST ENDIF !## store last active layer JLAY=ILAY ENDDO; ENDDO; ENDDO !## in case laye thickness are zero from the top and bottom, remove them DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL !## clean from the top downwards DO ILAY=1,PRJNLAY IF(BND(ILAY)%X(ICOL,IROW).EQ.0.0D0)CYCLE ST=TOP(ILAY)%X(ICOL,IROW); SB=BOT(ILAY)%X(ICOL,IROW); IF(ST-SB.GT.0.0D0)EXIT ENDDO DO JLAY=1,ILAY-1; BND(JLAY)%X(ICOL,IROW)=0.0D0; ENDDO !## clean from the bottom upwards DO ILAY=PRJNLAY,1,-1 IF(BND(ILAY)%X(ICOL,IROW).EQ.0.0D0)CYCLE ST=TOP(ILAY)%X(ICOL,IROW); SB=BOT(ILAY)%X(ICOL,IROW); IF(ST-SB.GT.0.0D0)EXIT ENDDO DO JLAY=PRJNLAY,ILAY+1,-1; BND(JLAY)%X(ICOL,IROW)=0.0D0; ENDDO ENDDO; ENDDO ELSEIF(PBMAN%ICONSISTENCY.EQ.2)THEN IF(ALLOCATED(KHV).AND.ALLOCATED(KVA).AND.ALLOCATED(KVV))THEN ALLOCATE(TP(PRJNLAY) ,BT(PRJNLAY) ,HK(PRJNLAY) ,VK(PRJNLAY) ,VA(PRJNLAY) ,IB(PRJNLAY),TH(PRJNLAY,2), & TP_BU(PRJNLAY),BT_BU(PRJNLAY),HK_BU(PRJNLAY),VK_BU(PRJNLAY),VA_BU(PRJNLAY)) DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL ! IF(IROW.EQ.38.AND.ICOL.EQ.39)THEN ! WRITE(*,*) ! ENDIF DO ILAY=1,PRJNLAY ; IB(ILAY)=BND(ILAY)%X(ICOL,IROW); ENDDO DO ILAY=1,PRJNLAY ; TP(ILAY)=TOP(ILAY)%X(ICOL,IROW); ENDDO DO ILAY=1,PRJNLAY ; BT(ILAY)=BOT(ILAY)%X(ICOL,IROW); ENDDO DO ILAY=1,PRJNLAY ; HK(ILAY)=KHV(ILAY)%X(ICOL,IROW); ENDDO DO ILAY=1,PRJNLAY ; VA(ILAY)=KVA(ILAY)%X(ICOL,IROW); ENDDO VK=0.0D0; DO ILAY=1,PRJNLAY-1; VK(ILAY)=KVV(ILAY)%X(ICOL,IROW); ENDDO ! ib=1; tp=0.0d0 ! do ilay=2,prjnlay; tp(ilay)=tp(ilay-1)-1.0d0; enddo ! do ilay=1,prjnlay; bt(ilay)=tp(ilay) -1.0d0; enddo ! IB(1)=0; IB(2)=0 ! BT(3)=-2.05D0 ! hk=1.0d0 ! vk=1.0d0 ! va=1.0d0 CALL UTL_MINTHICKNESS(TP,BT,HK,VK,VA,TP_BU,BT_BU,HK_BU,VK_BU,VA_BU,IB,TH,PBMAN%MINTHICKNESS,PRJNLAY,ICOL,IROW) DO ILAY=1,PRJNLAY ; BND(ILAY)%X(ICOL,IROW)=IB(ILAY); ENDDO ! DO ILAY=1,PRJNLAY ; IB(ILAY)=BND(ILAY)%X(ICOL,IROW); ENDDO DO ILAY=1,PRJNLAY ; TOP(ILAY)%X(ICOL,IROW)=TP(ILAY); ENDDO DO ILAY=1,PRJNLAY ; BOT(ILAY)%X(ICOL,IROW)=BT(ILAY); ENDDO DO ILAY=1,PRJNLAY ; KHV(ILAY)%X(ICOL,IROW)=HK(ILAY); ENDDO DO ILAY=1,PRJNLAY ; KVA(ILAY)%X(ICOL,IROW)=VA(ILAY); ENDDO DO ILAY=1,PRJNLAY-1; KVV(ILAY)%X(ICOL,IROW)=VK(ILAY); ENDDO !## clean DO ILAY=1,PRJNLAY IF(IB(ILAY).EQ.0)THEN TOP(ILAY)%X(ICOL,IROW)=TOP(ILAY)%NODATA KHV(ILAY)%X(ICOL,IROW)=KHV(ILAY)%NODATA KVA(ILAY)%X(ICOL,IROW)=KVA(ILAY)%NODATA IF(ILAY.LT.PRJNLAY)KVV(ILAY)%X(ICOL,IROW)=KVV(ILAY)%NODATA !## skip bottom as well as layer below is nodata IF(ILAY.LT.PRJNLAY)THEN IF(IB(ILAY+1).EQ.0)BOT(ILAY)%X(ICOL,IROW)=BOT(ILAY)%NODATA ENDIF ENDIF ENDDO ENDDO; ENDDO DEALLOCATE(TP,BT,HK,VK,VA,IB,TH,TP_BU,BT_BU,HK_BU,VK_BU,VA_BU) ENDIF ENDIF !## constant head is not allowed in cell with thickness of 0.0 - this is not neccessary for BCF-models IF(TOPICS(TKHV)%IACT_MODEL.EQ.1)THEN DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL; DO ILAY=1,PRJNLAY IF(BND(ILAY)%X(ICOL,IROW).LT.0)THEN IF(TOP(ILAY)%X(ICOL,IROW)-BOT(ILAY)%X(ICOL,IROW).LE.0.0)BND(ILAY)%X(ICOL,IROW)=ABS(BND(ILAY)%X(ICOL,IROW)) ENDIF ENDDO; ENDDO; ENDDO ENDIF !## apply consistency check constant head and top/bot - only whenever CHD is not active IF(PBMAN%ICHKCHD.EQ.1)THEN N=0 DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL; DO ILAY=1,PRJNLAY IF(BND(ILAY)%X(ICOL,IROW).LT.0)THEN !## head is in within current layer IF(SHD(ILAY)%X(ICOL,IROW).GT.BOT(ILAY)%X(ICOL,IROW))CYCLE N=N+1 !## constant head cell dry - becomes active node - shift to an appropriate model layer where the head is actually in DO JLAY=ILAY,PRJNLAY IF(SHD(ILAY)%X(ICOL,IROW).LE.BOT(JLAY)%X(ICOL,IROW))THEN BND(JLAY)%X(ICOL,IROW)=1.0D0 SHD(JLAY)%X(ICOL,IROW)=SHD(ILAY)%X(ICOL,IROW) ELSE BND(JLAY)%X(ICOL,IROW)=-99.0D0 SHD(JLAY)%X(ICOL,IROW)=SHD(ILAY)%X(ICOL,IROW) !## exit EXIT ENDIF ENDDO ENDIF ENDDO; ENDDO; ENDDO WRITE(*,'(/A/)') 'iMOD corrected '//TRIM(ITOS(N))//' constant heads cell which were inappropriate regarding there levels.' ENDIF !## if unconfined modify (nodata) head for dry cells, check from bottom to top DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL; DO ILAY=PRJNLAY-1,1,-1 IF(LAYCON(ILAY).NE.2)CYCLE IF(SHD(ILAY)%X(ICOL,IROW).EQ.HNOFLOW.AND.BND(ILAY)%X(ICOL,IROW).GT.0)THEN SHD(ILAY)%X(ICOL,IROW)=SHD(ILAY+1)%X(ICOL,IROW) ENDIF ENDDO; ENDDO; ENDDO !## clean from bottom to top inactive layers with zero conductance IF(PBMAN%ICONSISTENCY.NE.2)THEN DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL DO ILAY=PRJNLAY,1,-1 IF(KDW(ILAY)%X(ICOL,IROW).LE.0.0D0)THEN IF(ILAY.GT.1)VCW(ILAY-1)%X(ICOL,IROW)=0.0D0 KDW(ILAY)%X(ICOL,IROW)=0.0D0 BND(ILAY)%X(ICOL,IROW)=0.0D0 ELSE !## stop search for this location EXIT ENDIF ENDDO ENDDO; ENDDO ENDIF END SUBROUTINE PMANAGER_SAVEMF2005_CONSISTENCY !###====================================================================== SUBROUTINE PMANAGER_SAVEMF2005_MF6_GETPARAM(LNPF,LSTO,LDRN,LRIV,LGHB,LRCH,LWEL,LEVT,LUZF,LISG,LMNW) !###====================================================================== IMPLICIT NONE LOGICAL,INTENT(OUT) :: LNPF,LSTO,LDRN,LRIV,LGHB,LRCH,LWEL,LEVT,LUZF,LISG,LMNW INTEGER :: I LNPF=.FALSE.; DO I=1,SIZE(PEST%PARAM) IF((PEST%PARAM(I)%PPARAM.EQ.'KH'.OR.PEST%PARAM(I)%PPARAM.EQ.'VA'))THEN IF(PEST%PARAM(I)%PACT.EQ.1)THEN; LNPF=.TRUE.; EXIT; ENDIF IF(PEST%PARAM(I)%PACT.EQ.0.AND.PEST%PARAM(I)%PINI.NE.1.0D0)THEN; LNPF=.TRUE.; EXIT; ENDIF ENDIF ENDDO LSTO=.FALSE.; DO I=1,SIZE(PEST%PARAM) IF((PEST%PARAM(I)%PPARAM.EQ.'SC'.OR.PEST%PARAM(I)%PPARAM.EQ.'SY'))THEN IF(PEST%PARAM(I)%PACT.EQ.1)THEN; LSTO=.TRUE.; EXIT; ENDIF IF(PEST%PARAM(I)%PACT.EQ.0.AND.PEST%PARAM(I)%PINI.NE.1.0D0)THEN; LSTO=.TRUE.; EXIT; ENDIF ENDIF ENDDO LDRN=.FALSE.; DO I=1,SIZE(PEST%PARAM) IF(PEST%PARAM(I)%PPARAM.EQ.'DC'.OR.PEST%PARAM(I)%PPARAM.EQ.'DL')THEN IF(PEST%PARAM(I)%PACT.EQ.1)THEN; LDRN=.TRUE.; EXIT; ENDIF IF(PEST%PARAM(I)%PACT.EQ.0.AND.PEST%PARAM(I)%PINI.NE.1.0D0)THEN; LDRN=.TRUE.; EXIT; ENDIF ENDIF ENDDO LRIV=.FALSE.; DO I=1,SIZE(PEST%PARAM) IF(PEST%PARAM(I)%PPARAM.EQ.'RC'.OR.PEST%PARAM(I)%PPARAM.EQ.'RL'.OR. & PEST%PARAM(I)%PPARAM.EQ.'RB'.OR.PEST%PARAM(I)%PPARAM.EQ.'RI')THEN IF(PEST%PARAM(I)%PACT.EQ.1)THEN; LRIV=.TRUE.; EXIT; ENDIF IF(PEST%PARAM(I)%PACT.EQ.0.AND.PEST%PARAM(I)%PINI.NE.1.0D0)THEN; LRIV=.TRUE.; EXIT; ENDIF ENDIF ENDDO LISG=.FALSE.; DO I=1,SIZE(PEST%PARAM) IF(PEST%PARAM(I)%PPARAM.EQ.'IC'.OR.PEST%PARAM(I)%PPARAM.EQ.'IL'.OR. & PEST%PARAM(I)%PPARAM.EQ.'IB'.OR.PEST%PARAM(I)%PPARAM.EQ.'II')THEN IF(PEST%PARAM(I)%PACT.EQ.1)THEN; LISG=.TRUE.; EXIT; ENDIF IF(PEST%PARAM(I)%PACT.EQ.0.AND.PEST%PARAM(I)%PINI.NE.1.0D0)THEN; LISG=.TRUE.; EXIT; ENDIF ENDIF ENDDO LGHB=.FALSE.; DO I=1,SIZE(PEST%PARAM) IF(PEST%PARAM(I)%PPARAM.EQ.'GC')THEN IF(PEST%PARAM(I)%PACT.EQ.1)THEN; LGHB=.TRUE.; EXIT; ENDIF IF(PEST%PARAM(I)%PACT.EQ.0.AND.PEST%PARAM(I)%PINI.NE.1.0D0)THEN; LGHB=.TRUE.; EXIT; ENDIF ENDIF ENDDO LRCH=.FALSE.; DO I=1,SIZE(PEST%PARAM) IF(PEST%PARAM(I)%PPARAM.EQ.'RE')THEN IF(PEST%PARAM(I)%PACT.EQ.1)THEN; LRCH=.TRUE.; EXIT; ENDIF IF(PEST%PARAM(I)%PACT.EQ.0.AND.PEST%PARAM(I)%PINI.NE.1.0D0)THEN; LRCH=.TRUE.; EXIT; ENDIF ENDIF ENDDO LEVT=.FALSE.; DO I=1,SIZE(PEST%PARAM) IF(PEST%PARAM(I)%PPARAM.EQ.'ET'.OR.PEST%PARAM(I)%PPARAM.EQ.'ED')THEN IF(PEST%PARAM(I)%PACT.EQ.1)THEN; LEVT=.TRUE.; EXIT; ENDIF IF(PEST%PARAM(I)%PACT.EQ.0.AND.PEST%PARAM(I)%PINI.NE.1.0D0)THEN; LEVT=.TRUE.; EXIT; ENDIF ENDIF ENDDO LUZF=.FALSE.; DO I=1,SIZE(PEST%PARAM) IF(PEST%PARAM(I)%PPARAM.EQ.'EP')THEN IF(PEST%PARAM(I)%PACT.EQ.1)THEN; LUZF=.TRUE.; EXIT; ENDIF IF(PEST%PARAM(I)%PACT.EQ.0.AND.PEST%PARAM(I)%PINI.NE.1.0D0)THEN; LUZF=.TRUE.; EXIT; ENDIF ENDIF ENDDO LWEL=.FALSE.; DO I=1,SIZE(PEST%PARAM) IF(PEST%PARAM(I)%PPARAM.EQ.'QR')THEN IF(PEST%PARAM(I)%PACT.EQ.1)THEN; LWEL=.TRUE.; EXIT; ENDIF IF(PEST%PARAM(I)%PACT.EQ.0.AND.PEST%PARAM(I)%PINI.NE.1.0D0)THEN; LWEL=.TRUE.; EXIT; ENDIF ENDIF ENDDO LMNW=.FALSE.; DO I=1,SIZE(PEST%PARAM) IF(PEST%PARAM(I)%PPARAM.EQ.'MQ')THEN IF(PEST%PARAM(I)%PACT.EQ.1)THEN; LMNW=.TRUE.; EXIT; ENDIF IF(PEST%PARAM(I)%PACT.EQ.0.AND.PEST%PARAM(I)%PINI.NE.1.0D0)THEN; LMNW=.TRUE.; EXIT; ENDIF ENDIF ENDDO END SUBROUTINE PMANAGER_SAVEMF2005_MF6_GETPARAM !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_NAM(FNAME,MAINDIR,DIR,DIRMNAME,IPRT,ISS) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ISS INTEGER,INTENT(OUT) :: IPRT CHARACTER(LEN=*),INTENT(IN) :: FNAME CHARACTER(LEN=*),INTENT(OUT) :: DIR,DIRMNAME,MAINDIR INTEGER :: IU,I,J,K,N1,N2,ISYS CHARACTER(LEN=52) :: MNAME CHARACTER(LEN=256) :: NAME CHARACTER(LEN=3) :: CRELDIR CHARACTER(LEN=1) :: CT LOGICAL :: LNPF,LSTO,LDRN,LRIV,LGHB,LRCH,LWEL,LEVT,LUZF,LISG,LMNW PMANAGER_SAVEMF2005_NAM=.FALSE. IF(TOPICS(TUZF)%IACT_MODEL.EQ.1)THEN IF(LAYCON(1).NE.2)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'It is compulsory to use an unconfined first model layer for the UZF package','Error') RETURN ENDIF ENDIF !## result main folder MAINDIR=FNAME(:INDEX(FNAME,'\',.TRUE.)-1) MAINDIR=UTL_CAP(MAINDIR,'U'); CALL UTL_CREATEDIR(MAINDIR) !## modelname MNAME=FNAME(INDEX(FNAME,'\',.TRUE.)+1:INDEX(FNAME,'.',.TRUE.)-1); MNAME=UTL_CAP(MNAME,'U') IF(PBMAN%IPESTP.EQ.1)CALL PMANAGER_SAVEMF2005_MF6_GETPARAM(LNPF,LSTO,LDRN,LRIV,LGHB,LRCH,LWEL,LEVT,LUZF,LISG,LMNW) !## write *.nam file for modflow 6 IF(PBMAN%IFORMAT.EQ.3.AND.PBMAN%ISUBMODEL.EQ.1)THEN CRELDIR='.\'; IF(TOPICS(TPST)%IACT_MODEL.EQ.1.OR.TOPICS(TIES)%IACT_MODEL.EQ.1)CRELDIR='..\' !## write *.nam file(s) N1=1; N2=1 IF(PBMAN%IPESTP.EQ.1)THEN IF(PEST%PE_MXITER.LT.0)THEN N1=-1; N2=N1 ELSE N1=-PBMAN%NLAMBDASEARCH; N2=SIZE(PEST%PARAM) ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN N1=1; N2=PEST%NREALS ENDIF DO I=N1,N2 !## skip zero IF(I.EQ.0)CYCLE IF(PBMAN%IPESTP.EQ.1)THEN CT='L'; IF(I.GT.0)CT='P' ELSEIF(PBMAN%IIES.EQ.1)THEN CT='R' ENDIF IU=UTL_GETUNIT() IF(PBMAN%IPESTP+PBMAN%IIES.EQ.0)THEN NAME=TRIM(MAINDIR) ELSEIF(PBMAN%IPESTP.EQ.1)THEN IF(I.GT.0)THEN IF(PEST%PARAM(I)%PACT.EQ.0.OR.PEST%PARAM(I)%PIGROUP.LT.0)CYCLE ENDIF NAME=TRIM(MAINDIR)//'\IPEST_'//CT//'#'//TRIM(ITOS(ABS(I))); CALL UTL_CREATEDIR(NAME) ENDIF NAME=TRIM(NAME)//'\MFSIM.NAM' CALL OSD_OPEN(IU,FILE=TRIM(NAME),STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# MFSIM.NAM File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(/A/)') '#General Options' WRITE(IU,'(A)') 'BEGIN OPTIONS' IF(PCG%IQERROR.EQ.1)WRITE(IU,'(A)') ' CONTINUE' ![NOCHECK] ![MEMORY_PRINT_OPTION ] WRITE(IU,'(A)') 'END OPTIONS' WRITE(IU,'(/A/)') '#Timing Options' WRITE(IU,'(A)') 'BEGIN TIMING' WRITE(IU,'(A)') ' TDIS6 '//TRIM(CRELDIR)//'MFSIM.TDIS6' WRITE(IU,'(A)') 'END TIMING' WRITE(IU,'(/A/)') '#List of Models' WRITE(IU,'(A)') 'BEGIN MODELS' !## multiply models DO K=1,PBMAN%NSUBMODEL IF(PBMAN%IPESTP+PBMAN%IIES.EQ.0)THEN NAME='' ELSEIF(PBMAN%IPESTP.EQ.1)THEN IF(I.GT.0)THEN IF(PEST%PARAM(I)%PIGROUP.LT.0)CYCLE ENDIF NAME='_'//CT//'#'//TRIM(ITOS(ABS(I))) ENDIF WRITE(IU,'(A)') ' GWF6 '//TRIM(CRELDIR)//'GWF_'//TRIM(ITOS(K))//'\'//TRIM(MNAME)//TRIM(NAME)//'.NAM GWF_'//TRIM(ITOS(K)) ENDDO WRITE(IU,'(A)') 'END MODELS' WRITE(IU,'(/A/)') '#List of Exchanges' WRITE(IU,'(A)') 'BEGIN EXCHANGES' DO K=1,PBMAN%NSUBMODEL DO J=1,PBMAN%NSUBMODEL IF(K.EQ.J)CYCLE WRITE(IU,'(A)') ' GWF6-GWF6 '//TRIM(CRELDIR)//'MFSIM_M'//TRIM(ITOS(K))//'_M'//TRIM(ITOS(J))//'.EXG GWF_'//TRIM(ITOS(K))//' GWF_'//TRIM(ITOS(J)) ENDDO ENDDO WRITE(IU,'(A)') 'END EXCHANGES' WRITE(IU,'(/A/)') '#Definition of Numerical Solution' WRITE(IU,'(A)') 'BEGIN SOLUTIONGROUP 1' WRITE(IU,'(A)') ' MXITER 1' WRITE(IU,'(A,99A)') ' IMS6 '//TRIM(CRELDIR)//'MFSIM.IMS6',(' GWF_'//TRIM(ITOS(K)),K=1,PBMAN%NSUBMODEL) WRITE(IU,'(A)') 'END SOLUTIONGROUP' CLOSE(IU) ENDDO ENDIF !## loop over multiply models DIR=MAINDIR; IF(PBMAN%IFORMAT.EQ.3)DIR=TRIM(MAINDIR)//'\GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL)) !## result folder including the modelname DIRMNAME='MODELINPUT\'//TRIM(MNAME) CALL UTL_CREATEDIR(TRIM(DIR)//'\MODELINPUT') IF(TOPICS(TCAP)%IACT_MODEL.EQ.1)CALL UTL_CREATEDIR(TRIM(DIR)//'\MSWAPINPUT') IF(PBMAN%IFORMAT.EQ.3)THEN DIRMNAME='GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL))//'\'//TRIM(DIRMNAME) DIRMNAME=TRIM(CRELDIR)//TRIM(DIRMNAME) !## write *.nam file(s) N1=1; N2=1 IF(PBMAN%IPESTP.EQ.1)THEN IF(PEST%PE_MXITER.LT.0)THEN N1=-1; N2=N1 ELSE N1=-PBMAN%NLAMBDASEARCH; N2=SIZE(PEST%PARAM) ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN N1=1; N2=PEST%NREALS ENDIF DO I=N1,N2 !## skip zero IF(I.EQ.0)CYCLE IF(PBMAN%IPESTP.EQ.1)THEN CT='L'; IF(I.GT.0)CT='P' ELSEIF(PBMAN%IIES.EQ.1)THEN CT='R' ENDIF IU=UTL_GETUNIT() IF(PBMAN%IPESTP+PBMAN%IIES.EQ.0)THEN NAME=TRIM(DIR)//'\'//TRIM(MNAME)//'.NAM' ELSEIF(PBMAN%IPESTP.EQ.1)THEN IF(I.GT.0)THEN IF(PEST%PARAM(I)%PACT.EQ.0.OR.PEST%PARAM(I)%PIGROUP.LT.0)CYCLE ENDIF NAME=TRIM(DIR)//'\'//TRIM(MNAME)//'_'//CT//'#'//TRIM(ITOS(ABS(I)))//'.NAM' ENDIF CALL OSD_OPEN(IU,FILE=TRIM(NAME),STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# '//TRIM(MNAME)//'.NAM File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(/A/)') '#General Options' WRITE(IU,'(A)') 'BEGIN OPTIONS' IF(PBMAN%IPESTP+PBMAN%IIES.EQ.0)THEN WRITE(IU,'(A)') ' LIST '//TRIM(CRELDIR)//'GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL))//'\'//TRIM(MNAME)//'.LST' ELSE WRITE(IU,'(A)') ' LIST '//TRIM(CRELDIR)//'GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL))//'\'//TRIM(MNAME)//'_'//CT//'#'//TRIM(ITOS(ABS(I)))//'.LST' ENDIF IF(PBMAN%NEWTON.EQ.1)WRITE(IU,'(A)') ' NEWTON UNDER_RELAXATION' WRITE(IU,'(A)') 'END OPTIONS' WRITE(IU,'(/A/)') '#List of Packages' WRITE(IU,'(A)') 'BEGIN PACKAGES' WRITE(IU,'(A)') ' DIS6 '//TRIM(DIRMNAME)//'.DIS6' WRITE(IU,'(A)') ' IC6 '//TRIM(DIRMNAME)//'.IC6' IF(PBMAN%IIES+PBMAN%IPESTP.EQ.0)THEN WRITE(IU,'(A)') ' NPF6 '//TRIM(DIRMNAME)//'.NPF6' WRITE(IU,'(A)') ' OC6 '//TRIM(DIRMNAME)//'.OC6' IF(ISS.EQ.1)WRITE(IU,'(A)') ' STO6 '//TRIM(DIRMNAME)//'.STO6' ELSE IF(LNPF)THEN WRITE(IU,'(A)') ' NPF6 '//TRIM(DIRMNAME)//'_'//TRIM(CT)//'#'//TRIM(ITOS(ABS(I)))//'.NPF6' ELSE WRITE(IU,'(A)') ' NPF6 '//TRIM(DIRMNAME)//'.NPF6' ENDIF IF(ISS.EQ.1)THEN IF(LSTO)THEN WRITE(IU,'(A)') ' STO6 '//TRIM(DIRMNAME)//'_'//TRIM(CT)//'#'//TRIM(ITOS(ABS(I)))//'.STO6' ELSE WRITE(IU,'(A)') ' STO6 '//TRIM(DIRMNAME)//'.STO6' ENDIF ENDIF WRITE(IU,'(A)') ' OC6 '//TRIM(DIRMNAME)//'_'//TRIM(CT)//'#'//TRIM(ITOS(ABS(I)))//'.OC6' ENDIF IF(TOPICS(TCHD)%IACT_MODEL.NE.0)THEN IF(PBMAN%SSYSTEM.EQ.0)THEN DO ISYS=1,PMANAGER_GETNSYS(TCHD,2) WRITE(IU,'(A)') ' CHD6 '//TRIM(DIRMNAME)//'_SYS'//TRIM(ITOS(ISYS))//'.CHD6 CHD_SYS'//TRIM(ITOS(ISYS)) ENDDO ELSE IF(PMANAGER_GETNSYS(TCHD,2).GT.0)WRITE(IU,'(A)') ' CHD6 '//TRIM(DIRMNAME)//'.CHD6 CHD' ENDIF ENDIF CALL PMANAGER_SAVEMF2005_NAMIPESTPCK(IU,DIRMNAME,TWEL,'WEL',LWEL,CT,I) CALL PMANAGER_SAVEMF2005_NAMIPESTPCK(IU,DIRMNAME,TDRN,'DRN',LDRN,CT,I) CALL PMANAGER_SAVEMF2005_NAMIPESTPCK(IU,DIRMNAME,TRCH,'RCH',LRCH,CT,I) CALL PMANAGER_SAVEMF2005_NAMIPESTPCK(IU,DIRMNAME,TEVT,'EVT',LEVT,CT,I) CALL PMANAGER_SAVEMF2005_NAMIPESTPCK(IU,DIRMNAME,TUZF,'UZF',LUZF,CT,I) CALL PMANAGER_SAVEMF2005_NAMIPESTPCK(IU,DIRMNAME,TRIV,'RIV',LRIV,CT,I) CALL PMANAGER_SAVEMF2005_NAMIPESTPCK(IU,DIRMNAME,TISG,'ISG',LISG,CT,I) CALL PMANAGER_SAVEMF2005_NAMIPESTPCK(IU,DIRMNAME,TGHB,'GHB',LGHB,CT,I) CALL PMANAGER_SAVEMF2005_NAMIPESTPCK(IU,DIRMNAME,TMNW,'MAW',LMNW,CT,I) IF(TOPICS(THFB)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') ' HFB6 '//TRIM(DIRMNAME)//'.HFB6' IF(TOPICS(TPST)%IACT_MODEL.EQ.1.OR.TOPICS(TIES)%IACT_MODEL.EQ.1)THEN IF(PBMAN%IPESTP.EQ.1)THEN WRITE(IU,'(A)') ' OBS6 '//TRIM(DIRMNAME)//'_'//CT//'#'//TRIM(ITOS(ABS(I)))//'.OBS6' ENDIF ELSE IF(TOPICS(TOBS)%IACT_MODEL.NE.0) WRITE(IU,'(A)') ' OBS6 '//TRIM(DIRMNAME)//'.OBS6' ENDIF !## check whether metaswap is turned on if so, add a well package which is filled at the processing of msw-files IF(TOPICS(TCAP)%IACT_MODEL.EQ.1)THEN WRITE(IU,'(A)') ' WEL6 '//TRIM(CRELDIR)//'GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL))//'\MODELINPUT\MSW.WEL6 WELLS_MSW' WRITE(IU,'(A)') ' RCH6 '//TRIM(CRELDIR)//'GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL))//'\MODELINPUT\MSW.RCH6 RCH_MSW' ENDIF WRITE(IU,'(A)') 'END PACKAGES' CLOSE(IU) ENDDO ELSE DIRMNAME='.\'//TRIM(DIRMNAME) !## write *.nam file(s) N1=1; N2=1 IF(PBMAN%IPESTP.EQ.1)THEN IF(PEST%PE_MXITER.LT.0)THEN N1=-1; N2=N1 ELSE N1=-PBMAN%NLAMBDASEARCH; N2=SIZE(PEST%PARAM) ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN N1=1; N2=PEST%NREALS ENDIF DO I=N1,N2 !## skip zero IF(I.EQ.0)CYCLE IF(PBMAN%IPESTP.EQ.1)THEN CT='L'; IF(I.GT.0)CT='P' ELSEIF(PBMAN%IIES.EQ.1)THEN CT='R' ENDIF IU=UTL_GETUNIT() IF(PBMAN%IPESTP+PBMAN%IIES.EQ.0)THEN CALL OSD_OPEN(IU,FILE=TRIM(FNAME),STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ELSE IF(PBMAN%IPESTP.EQ.1)THEN IF(I.GT.0)THEN IF(PEST%PARAM(I)%PACT.EQ.0)CYCLE IF(PEST%PARAM(I)%PIGROUP.LT.0)CYCLE ENDIF ENDIF NAME=FNAME(:INDEX(FNAME,'.',.TRUE.)-1)//'_'//CT//'#'//TRIM(ITOS(ABS(I)))//'.NAM' CALL OSD_OPEN(IU,FILE=TRIM(NAME),STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ENDIF IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# Nam File Generated by '//TRIM(UTL_IMODVERSION()) IF(PBMAN%IPESTP+PBMAN%IIES.EQ.0)THEN WRITE(IU,'(A)') 'LIST 10 '//CHAR(39)//'.\'//TRIM(MNAME)//'.LIST'//CHAR(39) WRITE(IU,'(A)') 'MET 11 '//CHAR(39)//TRIM(DIRMNAME)//'.MET7'//CHAR(39) ELSE WRITE(IU,'(A)') 'LIST 10 '//CHAR(39)//'.\'//TRIM(MNAME)//'_'//CT//'#'//TRIM(ITOS(ABS(I)))//'.LIST'//CHAR(39) WRITE(IU,'(A)') 'MET 11 '//CHAR(39)//TRIM(DIRMNAME)//'_'//CT//'#'//TRIM(ITOS(ABS(I)))//'.MET7'//CHAR(39) ENDIF WRITE(IU,'(A)') 'BAS6 12 '//CHAR(39)//TRIM(DIRMNAME)//'.BAS6'//CHAR(39) WRITE(IU,'(A)') 'DIS 13 '//CHAR(39)//TRIM(DIRMNAME)//'.DIS6'//CHAR(39) IF(LBCF) WRITE(IU,'(A)') 'BCF6 14 '//CHAR(39)//TRIM(DIRMNAME)//'.BCF6'//CHAR(39) IF(LLPF)THEN IF(PBMAN%IIES.EQ.0.AND.PBMAN%IFORMAT.NE.6)THEN WRITE(IU,'(A)') 'LPF 14 '//CHAR(39)//TRIM(DIRMNAME)//'.LPF7'//CHAR(39) ELSE IF(PBMAN%IPESTP.EQ.1)THEN WRITE(IU,'(A)') 'LPF 14 '//CHAR(39)//TRIM(DIRMNAME)//'_'//CT//'#'//TRIM(ITOS(ABS(I)))//'.LPF7'//CHAR(39) ELSE WRITE(IU,'(A)') 'LPF 14 '//CHAR(39)//TRIM(DIRMNAME)//'.LPF7'//CHAR(39) ENDIF ENDIF ENDIF IF(LPKS)THEN WRITE(IU,'(A)') 'PKS 15 '//CHAR(39)//TRIM(DIRMNAME)//'.PKS'//CHAR(39) ELSE IF(TOPICS(TPCG)%IACT_MODEL.EQ.1)WRITE(IU,'(A)') 'PCG 15 '//CHAR(39)//TRIM(DIRMNAME)//'.PCG7'//CHAR(39) ENDIF IF(PBMAN%IPESTP.EQ.1)THEN ! IF(I.GT.0)THEN WRITE(IU,'(A)') 'OC 16 '//CHAR(39)//TRIM(DIRMNAME)//'_'//CT//'.OC'//CHAR(39) ! ELSE ! WRITE(IU,'(A)') 'OC 16 '//CHAR(39)//TRIM(DIRMNAME)//'_L.OC'//CHAR(39) ! ENDIF ELSE WRITE(IU,'(A)') 'OC 16 '//CHAR(39)//TRIM(DIRMNAME)//'.OC'//CHAR(39) ENDIF IF(TOPICS(TRCH)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'RCH 17 '//CHAR(39)//TRIM(DIRMNAME)//'.RCH7'//CHAR(39) IF(TOPICS(TEVT)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'EVT 18 '//CHAR(39)//TRIM(DIRMNAME)//'.EVT7'//CHAR(39) IF(TOPICS(TDRN)%IACT_MODEL.EQ.1.OR.TOPICS(TOLF)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'DRN 19 '//CHAR(39)//TRIM(DIRMNAME)//'.DRN7'//CHAR(39) IF(TOPICS(TRIV)%IACT_MODEL.EQ.1.OR.TOPICS(TISG)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'RIV 20 '//CHAR(39)//TRIM(DIRMNAME)//'.RIV7'//CHAR(39) IF(TOPICS(TGHB)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'GHB 21 '//CHAR(39)//TRIM(DIRMNAME)//'.GHB7'//CHAR(39) IF(TOPICS(TCHD)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'CHD 22 '//CHAR(39)//TRIM(DIRMNAME)//'.CHD7'//CHAR(39) IF(TOPICS(TWEL)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'WEL 23 '//CHAR(39)//TRIM(DIRMNAME)//'.WEL7'//CHAR(39) IF(TOPICS(THFB)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'HFB6 24 '//CHAR(39)//TRIM(DIRMNAME)//'.HFB7'//CHAR(39) IF(TOPICS(TSFR)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'SFR 25 '//CHAR(39)//TRIM(DIRMNAME)//'.SFR7'//CHAR(39) IF(TOPICS(TFHB)%IACT_MODEL.EQ.1)THEN; WRITE(IU,'(A)') 'FHB 26 '//CHAR(39)//TRIM(DIRMNAME)//'.FHB7'//CHAR(39); IFHBUN=26; ENDIF IF(TOPICS(TLAK)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'LAK 27 '//CHAR(39)//TRIM(DIRMNAME)//'.LAK7'//CHAR(39) IF(TOPICS(TUZF)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'UZF 28 '//CHAR(39)//TRIM(DIRMNAME)//'.UZF7'//CHAR(39) IF(TOPICS(TMNW)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'MNW2 29 '//CHAR(39)//TRIM(DIRMNAME)//'.MNW7'//CHAR(39) IF(TOPICS(TANI)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'ANI 30 '//CHAR(39)//TRIM(DIRMNAME)//'.ANI1'//CHAR(39) IF(TOPICS(TCAP)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'DXC 31 '//CHAR(39)//TRIM(DIRMNAME)//'.DXC'//CHAR(39) IF(TOPICS(TVDF)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'VDF 32 '//CHAR(39)//TRIM(DIRMNAME)//'.VDF1'//CHAR(39) IF(TOPICS(TSCR)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'SCR 33 '//CHAR(39)//TRIM(DIRMNAME)//'.SCR1'//CHAR(39) IF(TOPICS(TDSP)%IACT_MODEL.EQ.1) WRITE(IU,'(A)') 'DSP 34 '//CHAR(39)//TRIM(DIRMNAME)//'.DSP1'//CHAR(39) IF(TOPICS(TSCO)%IACT_MODEL.EQ.1)THEN WRITE(IU,'(A)') 'BTN 35 '//CHAR(39)//TRIM(DIRMNAME)//'.BTN1'//CHAR(39) WRITE(IU,'(A)') 'ADV 36 '//CHAR(39)//TRIM(DIRMNAME)//'.ADV1'//CHAR(39) WRITE(IU,'(A)') 'SSM 37 '//CHAR(39)//TRIM(DIRMNAME)//'.SSM1'//CHAR(39) IF(TOPICS(TGCG)%IACT_MODEL.EQ.1)WRITE(IU,'(A)') 'GCG 38 '//CHAR(39)//TRIM(DIRMNAME)//'.GCG1'//CHAR(39) ENDIF IF(PBMAN%IFORMAT.EQ.6.AND.TOPICS(TPST)%IACT_MODEL.EQ.1)THEN WRITE(IU,'(A)') 'OBS 39 '//CHAR(39)//TRIM(DIRMNAME)//'_'//CT//'#'//TRIM(ITOS(ABS(I)))//'.OBS7'//CHAR(39) WRITE(IU,'(A)') 'HOB 40 '//CHAR(39)//TRIM(DIRMNAME)//'.HOB7'//CHAR(39) ENDIF WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IHEDUN,' '//CHAR(39)//'HEAD'//CHAR(39) WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IBCFCB,' '//CHAR(39)//'BDGSTO BDGBND BDGFRF BDGFFF BDGFLF'//CHAR(39) IF(TOPICS(TRCH)%IACT_MODEL.EQ.1)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IRCHCB,' '//CHAR(39)//'BDGRCH'//CHAR(39) IF(TOPICS(TEVT)%IACT_MODEL.EQ.1)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IEVTCB,' '//CHAR(39)//'BDGEVT'//CHAR(39) IF(TOPICS(TDRN)%IACT_MODEL.EQ.1.OR.TOPICS(TOLF)%IACT_MODEL.EQ.1)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IDRNCB,' '//CHAR(39)//'BDGDRN'//CHAR(39) IF(TOPICS(TRIV)%IACT_MODEL.EQ.1.OR.TOPICS(TISG)%IACT_MODEL.EQ.1)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IRIVCB,' '//CHAR(39)//'BDGRIV'//CHAR(39) IF(TOPICS(TGHB)%IACT_MODEL.EQ.1)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IGHBCB,' '//CHAR(39)//'BDGGHB'//CHAR(39) IF(TOPICS(TCHD)%IACT_MODEL.EQ.1)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',ICHDCB,' '//CHAR(39)//'BDGCHD'//CHAR(39) IF(TOPICS(TWEL)%IACT_MODEL.EQ.1)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IWELCB,' '//CHAR(39)//'BDGWEL'//CHAR(39) IF(TOPICS(TSFR)%IACT_MODEL.EQ.1)THEN WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',ISFRCB,' '//CHAR(39)//'BDGSFR'//CHAR(39) IF(ISFRCB2.GT.0)WRITE(IU,'(A,I3,A)') 'DATA ',ISFRCB2,' '//CHAR(39)//'.\'//TRIM(MNAME)//'_FSFR.TXT'//CHAR(39) ENDIF IF(TOPICS(TFHB)%IACT_MODEL.EQ.1)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IFHBCB ,' '//CHAR(39)//'BDGFHB'//CHAR(39) IF(TOPICS(TLAK)%IACT_MODEL.EQ.1)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',ILAKCB ,' '//CHAR(39)//'BDGLAK'//CHAR(39) IF(TOPICS(TUZF)%IACT_MODEL.EQ.1)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IUZFCB1,' '//CHAR(39)//'UZFINF BDGGRC BDGGET UZFRUN UZFET UZFSFR'//CHAR(39) ! IF(TOPICS(TUZF)%IACT_MODEL.EQ.1)THEN ! DO J=1,PBMAN%NLOGLOC ! WRITE(IU,'(A,I3,A)') 'DATA ',99+J ,' '//CHAR(39)//'UZF_LOG_ROW'//TRIM(ITOS(PBMAN%ILOC(J,1)))//'-COL'//TRIM(ITOS(PBMAN%ILOC(J,2)))//'.TXT'//CHAR(39) ! ENDDO ! ENDIF IF(TOPICS(TMNW)%IACT_MODEL.EQ.1)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IWL2CB ,' '//CHAR(39)//'BDGMNW'//CHAR(39) IF(TOPICS(TSCR)%IACT_MODEL.EQ.1)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',ISCRCB ,' '//CHAR(39)//'BDGSCR'//CHAR(39) IF(TOPICS(TCAP)%IACT_MODEL.EQ.1)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',ICAPCB ,' '//CHAR(39)//'BDGCAP'//CHAR(39) ENDDO ENDIF CLOSE(IU) !## result folder including the modelname DIRMNAME=TRIM(DIR)//'\MODELINPUT\'//TRIM(MNAME) DIR =TRIM(DIR)//'\MODELINPUT' !## echo used files from the prj-file IPRT=UTL_GETUNIT(); CALL OSD_OPEN(IPRT ,FILE=TRIM(DIR)//'\USED_FILES.TXT',STATUS='UNKNOWN',ACTION='WRITE') IUEXAMINE=0; IF(SUM(PBMAN%EXAMINE).NE.0.0D0)THEN IUEXAMINE=UTL_GETUNIT(); CALL OSD_OPEN(IUEXAMINE,FILE=TRIM(MAINDIR)//'\EXAMINE.TXT' ,STATUS='UNKNOWN',ACTION='WRITE') ENDIF PMANAGER_SAVEMF2005_NAM=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_NAM !###====================================================================== SUBROUTINE PMANAGER_SAVEMF2005_NAMIPESTPCK(IU,DIRMNAME,ITOPIC,CPCK,LPEST,CT,I) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: CPCK,DIRMNAME,CT INTEGER,INTENT(IN) :: ITOPIC,IU,I LOGICAL,INTENT(IN) :: LPEST INTEGER :: ISYS CHARACTER(LEN=3) :: CCPCK IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)RETURN !## apply riv system for ISG CCPCK=CPCK; IF(ITOPIC.EQ.TISG)CCPCK='RIV' DO ISYS=1,PMANAGER_GETNSYS(ITOPIC,2) IF(PBMAN%IIES+PBMAN%IPESTP.EQ.0.OR..NOT.LPEST)THEN IF(PBMAN%SSYSTEM.EQ.0)THEN WRITE(IU,'(A)') ' '//TRIM(CCPCK)//'6 '//TRIM(DIRMNAME)//'_SYS'//TRIM(ITOS(ISYS))//'.'//TRIM(CPCK)//'6 '//TRIM(CPCK)//'_SYS'//TRIM(ITOS(ISYS)) ELSE WRITE(IU,'(A)') ' '//TRIM(CCPCK)//'6 '//TRIM(DIRMNAME)//'.'//TRIM(CPCK)//'6 '//TRIM(CPCK); EXIT ENDIF ELSE IF(PBMAN%SSYSTEM.EQ.0)THEN WRITE(IU,'(A)') ' '//TRIM(CCPCK)//'6 '//TRIM(DIRMNAME)//'_SYS'//TRIM(ITOS(ISYS))//'_'//TRIM(CT)//'#'//TRIM(ITOS(ABS(I)))//'.'//TRIM(CPCK)//'6 '//TRIM(CPCK)//'_SYS'//TRIM(ITOS(ISYS)) ELSE WRITE(IU,'(A)') ' '//TRIM(CCPCK)//'6 '//TRIM(DIRMNAME)//'_'//TRIM(CT)//'#'//TRIM(ITOS(ABS(I)))//'.'//TRIM(CPCK)//'6'; EXIT ENDIF ENDIF ENDDO END SUBROUTINE PMANAGER_SAVEMF2005_NAMIPESTPCK !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_SIM(IBATCH) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IBATCH REAL(KIND=DP_KIND) :: X1,Y1,X2,Y2 INTEGER :: IWINDOW,IR,IC !## IBATCH flag only for messsage management !## reads idf for model dimensions !## creates IDF objects to store parameter values PMANAGER_SAVEMF2005_SIM=.FALSE. !## read idf for dimensions CALL IDFNULLIFY(PRJIDF) IF(.NOT.PMANAGER_INIT_SIMAREA(PRJIDF,IBATCH))RETURN IF(PBMAN%IWINDOW.EQ.1)THEN IF(SUBMODEL(5).NE.0.0D0)THEN PRJIDF%DX=SUBMODEL(5) PRJIDF%DY=SUBMODEL(5) CALL UTL_IDFSNAPTOGRID_LLC(PRJIDF%XMIN,PRJIDF%XMAX,PRJIDF%YMIN,PRJIDF%YMAX,PRJIDF%DX,PRJIDF%DY,PRJIDF%NCOL,PRJIDF%NROW,LLC=.TRUE.) ENDIF ENDIF IF(ISUBMODEL.EQ.1)THEN !# get total maximal dimensions IWINDOW=PBMAN%IWINDOW; PBMAN%IWINDOW=0 IF(.NOT.PMANAGER_INIT_SIMAREA(PRJIDF,IBATCH))RETURN PBMAN%IWINDOW=IWINDOW X1=SUBMODEL(1); Y1=SUBMODEL(2); X2=SUBMODEL(3); Y2=SUBMODEL(4) !## include buffer to simulation window SUBMODEL(1)=SUBMODEL(1)-SUBMODEL(6); SUBMODEL(2)=SUBMODEL(2)-SUBMODEL(6) SUBMODEL(3)=SUBMODEL(3)+SUBMODEL(6); SUBMODEL(4)=SUBMODEL(4)+SUBMODEL(6) !## make sure size of model (including buffer) does not exceed total model domain SUBMODEL(1)=MAX(SUBMODEL(1),PRJIDF%XMIN); SUBMODEL(2)=MAX(SUBMODEL(2),PRJIDF%YMIN) SUBMODEL(3)=MIN(SUBMODEL(3),PRJIDF%XMAX); SUBMODEL(4)=MIN(SUBMODEL(4),PRJIDF%YMAX) !## compute dimensions of submodel CALL UTL_IDFSNAPTOGRID_LLC(SUBMODEL(1),SUBMODEL(3),SUBMODEL(2),SUBMODEL(4),SUBMODEL(5),SUBMODEL(5),PRJIDF%NCOL,PRJIDF%NROW,LLC=.TRUE.) IF(PRJIDF%NCOL.LE.0.OR.PRJIDF%NROW.LE.0)THEN IF(IBATCH.EQ.0)WRITE(*,'(A)') 'Model dimensions are outside maximal modeling domain' IF(IBATCH.EQ.1)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Model dimensions are outside maximal modeling domain','Error') RETURN ENDIF PRJIDF%XMIN=SUBMODEL(1); PRJIDF%YMIN=SUBMODEL(2); PRJIDF%XMAX=SUBMODEL(3); PRJIDF%YMAX=SUBMODEL(4) PRJIDF%DX=SUBMODEL(5); PRJIDF%DY=SUBMODEL(5); IF(SUBMODEL(7).EQ.0.0D0)THEN PRJIDF%IEQ=0 ELSE !## create non-equidistantial network IF(.NOT.PMANAGER_SAVEMF2005_COARSEGRID(PRJIDF,X1,Y1,X2,Y2,SUBMODEL(7)))RETURN ENDIF ENDIF IF(.NOT.ASSOCIATED(PRJIDF%X))THEN !## overrule nodata value IF(.NOT.IDFALLOCATEX(PRJIDF))RETURN; PRJIDF%X=0.0D0; PRJIDF%NODATA=HUGE(1.0) ENDIF !## fill sx/sy variable in idf IF(.NOT.IDFFILLSXSY(PRJIDF))RETURN IF(SUM(PBMAN%EXAMINE).NE.0.0D0)THEN IF(PBMAN%EXAMINE(1).GT.0.0D0.AND.PBMAN%EXAMINE(2).GT.0.0D0)THEN CALL IDFIROWICOL(PRJIDF,IR,IC,PBMAN%EXAMINE(1),PBMAN%EXAMINE(2)) IF(IR.EQ.0.OR.IC.EQ.0)THEN WRITE(*,'(/A,2F15.3,A/)') 'EXAMINE LOCATION ',PBMAN%EXAMINE(1),PBMAN%EXAMINE(2),' OUTSIDE MODEL DOMAIN'; STOP ENDIF PBMAN%EXAMINE(1)=IR; PBMAN%EXAMINE(2)=IC ELSE PBMAN%EXAMINE=ABS(PBMAN%EXAMINE) ENDIF IR=INT(PBMAN%EXAMINE(1)); IC=INT(PBMAN%EXAMINE(2)) WRITE(IUEXAMINE,'(A,2I10)') 'EXAMING LOCATION (ROW,COL): ',IR,IC ENDIF PMANAGER_SAVEMF2005_SIM=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_SIM !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_SIM_ALLOC(ISS) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ISS INTEGER :: ILAY ALLOCATE(BND(PRJNLAY)); DO ILAY=1,SIZE(BND); CALL IDFNULLIFY(BND(ILAY)); ENDDO ALLOCATE(SHD(PRJNLAY)); DO ILAY=1,SIZE(SHD); CALL IDFNULLIFY(SHD(ILAY)); ENDDO ALLOCATE(TOP(PRJNLAY)); DO ILAY=1,SIZE(TOP); CALL IDFNULLIFY(TOP(ILAY)); ENDDO ALLOCATE(BOT(PRJNLAY)); DO ILAY=1,SIZE(BOT); CALL IDFNULLIFY(BOT(ILAY)); ENDDO ALLOCATE(KDW(PRJNLAY)); DO ILAY=1,SIZE(KDW); CALL IDFNULLIFY(KDW(ILAY)); ENDDO ALLOCATE(VCW(PRJNLAY-1)); DO ILAY=1,SIZE(VCW); CALL IDFNULLIFY(VCW(ILAY)); ENDDO ALLOCATE(KHV(PRJNLAY)); DO ILAY=1,SIZE(KHV); CALL IDFNULLIFY(KHV(ILAY)); ENDDO IF(PBMAN%APPLYTC.EQ.1)THEN ALLOCATE(KHA(PRJNLAY)); DO ILAY=1,SIZE(KHA); CALL IDFNULLIFY(KHA(ILAY)); ENDDO ENDIF IF(ISS.EQ.1)THEN ALLOCATE(STO(PRJNLAY)); DO ILAY=1,SIZE(STO); CALL IDFNULLIFY(STO(ILAY)); ENDDO ALLOCATE(SPY(PRJNLAY)); DO ILAY=1,SIZE(SPY); CALL IDFNULLIFY(SPY(ILAY)); ENDDO ENDIF IF(LLPF.OR.LNPF)THEN ALLOCATE(KVV(PRJNLAY-1)); DO ILAY=1,SIZE(KVV); CALL IDFNULLIFY(KVV(ILAY)); ENDDO ALLOCATE(KVA(PRJNLAY)); DO ILAY=1,SIZE(KVA); CALL IDFNULLIFY(KVA(ILAY)); ENDDO ENDIF IF(TOPICS(TANI)%IACT_MODEL.EQ.1)THEN ALLOCATE(ANA(PRJNLAY)); DO ILAY=1,SIZE(ANA); CALL IDFNULLIFY(ANA(ILAY)); ENDDO ALLOCATE(ANF(PRJNLAY)); DO ILAY=1,SIZE(ANF); CALL IDFNULLIFY(ANF(ILAY)); ENDDO ENDIF IF(TOPICS(TSCR)%IACT_MODEL.EQ.1)THEN ALLOCATE(THK(PRJNLAY)); DO ILAY=1,SIZE(THK); CALL IDFNULLIFY(THK(ILAY)); ENDDO ALLOCATE(ARR(PRJNLAY)); DO ILAY=1,SIZE(ARR); CALL IDFNULLIFY(ARR(ILAY)); ENDDO ALLOCATE(BCR(PRJNLAY)); DO ILAY=1,SIZE(BCR); CALL IDFNULLIFY(BCR(ILAY)); ENDDO ALLOCATE(CCA(PRJNLAY)); DO ILAY=1,SIZE(CCA); CALL IDFNULLIFY(CCA(ILAY)); ENDDO ALLOCATE(VOI(PRJNLAY)); DO ILAY=1,SIZE(VOI); CALL IDFNULLIFY(VOI(ILAY)); ENDDO ALLOCATE(SUB(PRJNLAY)); DO ILAY=1,SIZE(SUB); CALL IDFNULLIFY(SUB(ILAY)); ENDDO SELECT CASE (PBMAN%SCR_ISTPCS) CASE (0); ALLOCATE(PCS(PRJNLAY)); DO ILAY=1,SIZE(PCS); CALL IDFNULLIFY(PCS(ILAY)); ENDDO CASE (1); ALLOCATE(PC0(PRJNLAY)); DO ILAY=1,SIZE(PC0); CALL IDFNULLIFY(PC0(ILAY)); ENDDO CASE (2); ALLOCATE(OCR(PRJNLAY)); DO ILAY=1,SIZE(OCR); CALL IDFNULLIFY(OCR(ILAY)); ENDDO CASE (3) ALLOCATE(PCS(PRJNLAY)); DO ILAY=1,SIZE(PCS); CALL IDFNULLIFY(PCS(ILAY)); ENDDO ALLOCATE(PC0(PRJNLAY)); DO ILAY=1,SIZE(PC0); CALL IDFNULLIFY(PC0(ILAY)); ENDDO ALLOCATE(OCR(PRJNLAY)); DO ILAY=1,SIZE(OCR); CALL IDFNULLIFY(OCR(ILAY)); ENDDO ALLOCATE(TH0(PRJNLAY)); DO ILAY=1,SIZE(TH0); CALL IDFNULLIFY(TH0(ILAY)); ENDDO END SELECT ALLOCATE(GL0(PRJNLAY)); DO ILAY=1,SIZE(GL0); CALL IDFNULLIFY(GL0(ILAY)); ENDDO ALLOCATE(SGS(PRJNLAY)); DO ILAY=1,SIZE(SGS); CALL IDFNULLIFY(SGS(ILAY)); ENDDO ALLOCATE(SGM(PRJNLAY)); DO ILAY=1,SIZE(SGM); CALL IDFNULLIFY(SGM(ILAY)); ENDDO ENDIF IF(TOPICS(TLAK)%IACT_MODEL.EQ.1)THEN ALLOCATE(LAK(10)); DO ILAY=1,SIZE(LAK); CALL IDFNULLIFY(LAK(ILAY)); ENDDO ALLOCATE(LBD(PRJNLAY)); DO ILAY=1,SIZE(LBD); CALL IDFNULLIFY(LBD(ILAY)); ENDDO ALLOCATE(LCD(PRJNLAY)); DO ILAY=1,SIZE(LCD); CALL IDFNULLIFY(LCD(ILAY)); ENDDO ENDIF IF(TOPICS(TCON)%IACT_MODEL.EQ.1)THEN ALLOCATE(CON(PRJNLAY)); DO ILAY=1,SIZE(CON); CALL IDFNULLIFY(CON(ILAY)); ENDDO ENDIF IF(TOPICS(TDSP)%IACT_MODEL.EQ.1)THEN ALLOCATE(LON(PRJNLAY)); DO ILAY=1,SIZE(LON); CALL IDFNULLIFY(LON(ILAY)); ENDDO ALLOCATE(RHD(PRJNLAY)); DO ILAY=1,SIZE(RHD); CALL IDFNULLIFY(RHD(ILAY)); ENDDO ALLOCATE(RVD(PRJNLAY)); DO ILAY=1,SIZE(RVD); CALL IDFNULLIFY(RVD(ILAY)); ENDDO ALLOCATE(MDC(PRJNLAY)); DO ILAY=1,SIZE(MDC); CALL IDFNULLIFY(MDC(ILAY)); ENDDO ENDIF IF(TOPICS(TPOR)%IACT_MODEL.EQ.1)THEN ALLOCATE(POR(PRJNLAY)); DO ILAY=1,SIZE(POR); CALL IDFNULLIFY(POR(ILAY)); ENDDO ENDIF IF(TOPICS(TCBI)%IACT_MODEL.EQ.1)THEN ALLOCATE(CBI(PRJNLAY)); DO ILAY=1,SIZE(CBI); CALL IDFNULLIFY(CBI(ILAY)); ENDDO ENDIF IF(TOPICS(TSCO)%IACT_MODEL.EQ.1)THEN ALLOCATE(SCO(PRJNLAY)); DO ILAY=1,SIZE(SCO); CALL IDFNULLIFY(SCO(ILAY)); ENDDO ENDIF ALLOCATE(SFT(2)); DO ILAY=1,SIZE(SFT); CALL IDFNULLIFY(SFT(ILAY)); ENDDO DO ILAY=1,SIZE(TOP); CALL IDFCOPY(PRJIDF,TOP(ILAY)); ENDDO DO ILAY=1,SIZE(BOT); CALL IDFCOPY(PRJIDF,BOT(ILAY)); ENDDO DO ILAY=1,SIZE(KDW); CALL IDFCOPY(PRJIDF,KDW(ILAY)); ENDDO DO ILAY=1,SIZE(VCW); CALL IDFCOPY(PRJIDF,VCW(ILAY)); ENDDO DO ILAY=1,SIZE(KHV); CALL IDFCOPY(PRJIDF,KHV(ILAY)); ENDDO IF(LLPF.OR.LNPF)THEN DO ILAY=1,SIZE(KVV); CALL IDFCOPY(PRJIDF,KVV(ILAY)); ENDDO DO ILAY=1,SIZE(KVA); CALL IDFCOPY(PRJIDF,KVA(ILAY)); ENDDO ENDIF IF(ISS.EQ.1)THEN DO ILAY=1,SIZE(STO); CALL IDFCOPY(PRJIDF,STO(ILAY)); ENDDO DO ILAY=1,SIZE(SPY); CALL IDFCOPY(PRJIDF,SPY(ILAY)); ENDDO ENDIF IF(TOPICS(TANI)%IACT_MODEL.EQ.1)THEN DO ILAY=1,SIZE(ANF); CALL IDFCOPY(PRJIDF,ANF(ILAY)); ENDDO DO ILAY=1,SIZE(ANA); CALL IDFCOPY(PRJIDF,ANA(ILAY)); ENDDO ENDIF IF(TOPICS(TSCR)%IACT_MODEL.EQ.1)THEN DO ILAY=1,SIZE(GL0); CALL IDFCOPY(PRJIDF,GL0(ILAY)); ENDDO DO ILAY=1,SIZE(SGM); CALL IDFCOPY(PRJIDF,SGM(ILAY)); ENDDO DO ILAY=1,SIZE(SGS); CALL IDFCOPY(PRJIDF,SGS(ILAY)); ENDDO DO ILAY=1,SIZE(THK); CALL IDFCOPY(PRJIDF,THK(ILAY)); ENDDO DO ILAY=1,SIZE(ARR); CALL IDFCOPY(PRJIDF,ARR(ILAY)); ENDDO DO ILAY=1,SIZE(BCR); CALL IDFCOPY(PRJIDF,BCR(ILAY)); ENDDO DO ILAY=1,SIZE(CCA); CALL IDFCOPY(PRJIDF,CCA(ILAY)); ENDDO DO ILAY=1,SIZE(VOI); CALL IDFCOPY(PRJIDF,VOI(ILAY)); ENDDO DO ILAY=1,SIZE(SUB); CALL IDFCOPY(PRJIDF,SUB(ILAY)); ENDDO SELECT CASE (PBMAN%SCR_ISTPCS) CASE (0); DO ILAY=1,SIZE(PCS); CALL IDFCOPY(PRJIDF,PCS(ILAY)); ENDDO CASE (1); DO ILAY=1,SIZE(PC0); CALL IDFCOPY(PRJIDF,PC0(ILAY)); ENDDO CASE (2); DO ILAY=1,SIZE(OCR); CALL IDFCOPY(PRJIDF,OCR(ILAY)); ENDDO CASE (3) DO ILAY=1,SIZE(PCS); CALL IDFCOPY(PRJIDF,PCS(ILAY)); ENDDO DO ILAY=1,SIZE(PC0); CALL IDFCOPY(PRJIDF,PC0(ILAY)); ENDDO DO ILAY=1,SIZE(OCR); CALL IDFCOPY(PRJIDF,OCR(ILAY)); ENDDO DO ILAY=1,SIZE(TH0); CALL IDFCOPY(PRJIDF,TH0(ILAY)); ENDDO END SELECT DO ILAY=1,SIZE(GL0); CALL IDFCOPY(PRJIDF,GL0(ILAY)); ENDDO DO ILAY=1,SIZE(SGS); CALL IDFCOPY(PRJIDF,SGS(ILAY)); ENDDO DO ILAY=1,SIZE(SGM); CALL IDFCOPY(PRJIDF,SGM(ILAY)); ENDDO ENDIF IF(TOPICS(TLAK)%IACT_MODEL.EQ.1)THEN DO ILAY=1,SIZE(LBD); CALL IDFCOPY(PRJIDF,LBD(ILAY)); ENDDO DO ILAY=1,SIZE(LCD); CALL IDFCOPY(PRJIDF,LCD(ILAY)); ENDDO ENDIF IF(TOPICS(TSFT)%IACT_MODEL.EQ.1)THEN DO ILAY=1,SIZE(SFT); CALL IDFCOPY(PRJIDF,SFT(ILAY)); ENDDO ENDIF IF(TOPICS(TCON)%IACT_MODEL.EQ.1)THEN DO ILAY=1,SIZE(CON); CALL IDFCOPY(PRJIDF,CON(ILAY)); ENDDO ENDIF IF(TOPICS(TPOR)%IACT_MODEL.EQ.1)THEN DO ILAY=1,SIZE(POR); CALL IDFCOPY(PRJIDF,POR(ILAY)); ENDDO ENDIF IF(TOPICS(TCBI)%IACT_MODEL.EQ.1)THEN DO ILAY=1,SIZE(CBI); CALL IDFCOPY(PRJIDF,CBI(ILAY)); ENDDO ENDIF IF(TOPICS(TSCO)%IACT_MODEL.EQ.1)THEN DO ILAY=1,SIZE(SCO); CALL IDFCOPY(PRJIDF,SCO(ILAY)); ENDDO ENDIF IF(TOPICS(TDSP)%IACT_MODEL.EQ.1)THEN DO ILAY=1,SIZE(LON); CALL IDFCOPY(PRJIDF,LON(ILAY)); ENDDO ! DO ILAY=1,SIZE(RHD); CALL IDFCOPY(PRJIDF,RHD(ILAY)); ENDDO ! DO ILAY=1,SIZE(RVD); CALL IDFCOPY(PRJIDF,RVD(ILAY)); ENDDO ! DO ILAY=1,SIZE(MDC); CALL IDFCOPY(PRJIDF,MDC(ILAY)); ENDDO ENDIF PMANAGER_SAVEMF2005_SIM_ALLOC=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_SIM_ALLOC !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_PST_READWRITE(DIR,DIRMNAME,IBATCH,ISS) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: IBATCH,ISS INTEGER :: I,J,N,N1,N2,IU CHARACTER(LEN=256) :: CFNAME PMANAGER_SAVEMF2005_PST_READWRITE=.TRUE. IF(TOPICS(TPST)%IACT_MODEL.EQ.0.AND.TOPICS(TIES)%IACT_MODEL.EQ.0)RETURN !## overrule is by imod batch IF(IBATCH.EQ.1.AND.PBMAN%IPEST+PBMAN%IPESTP+PBMAN%IIES.EQ.0)RETURN PMANAGER_SAVEMF2005_PST_READWRITE=.FALSE. N=0; IF(ASSOCIATED(PEST%MEASURES))THEN; N=SIZE(PEST%MEASURES); ENDIF IF(N.EQ.0.AND.PEST%PE_MXITER.GT.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You need to specify measurements to use the PST module.','Error'); RETURN ENDIF !## modflow6/seawat IF(PBMAN%IFORMAT.EQ.3.OR.PBMAN%IFORMAT.EQ.6)THEN IF(.NOT.PMANAGER_SAVEPST_MF6_SEAWAT(DIR,IBATCH))RETURN TOPICS(TPST)%IACT_MODEL=1; TOPICS(TOBS)%IACT_MODEL=1 IF(.NOT.PMANAGER_SAVEMF2005_OBS(DIR,DIRMNAME,IBATCH,TOPICS(TOBS)%IACT_MODEL,TOBS,'OBS',2))RETURN !## do not export the obs again TOPICS(TOBS)%IACT_MODEL=0 !## write blankout idf IF(PEST%PE_KTYPE.LT.0)THEN !## read/clip/scale idf file IF(.NOT.IDFREADSCALE(PEST%PPBNDIDF,PRJIDF,7,0,1.0D0,0))RETURN !## save array, do not correct for boundary condition as we not yet know for what layer the zone will apply IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\PST1\PPBNDIDF.ARR',PRJIDF,0,IU,1,0))RETURN ENDIF ELSE IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.PST1'//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.PST1'//'...' N1=1; N2=1; J=0 IF(PBMAN%IPESTP.EQ.1)THEN IF(PEST%PE_MXITER.LT.0)THEN N1=-1; N2=N1 ELSE N1=-PBMAN%NLAMBDASEARCH; N2=SIZE(PEST%PARAM) ENDIF ENDIF; CFNAME='' DO I=N1,N2 !## skip zero IF(I.EQ.0)CYCLE IU=UTL_GETUNIT() IF(PBMAN%IPESTP.EQ.0)THEN CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.PST1',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ELSE IF(I.GT.0)THEN IF(PEST%PARAM(I)%PACT.EQ.0.OR.PEST%PARAM(I)%PIGROUP.LT.0)CYCLE IF(J.EQ.0)THEN CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'_P#'//TRIM(ITOS(I))//'.PST1',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') CFNAME=TRIM(DIRMNAME)//'_P#'//TRIM(ITOS(I))//'.PST1' ELSE CALL IOSCOPYFILE(CFNAME,TRIM(DIRMNAME)//'_P#'//TRIM(ITOS(I))//'.PST1') ENDIF ELSE IF(J.EQ.0)THEN CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'_L#'//TRIM(ITOS(ABS(I)))//'.PST1',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') CFNAME=TRIM(DIRMNAME)//'_L#'//TRIM(ITOS(ABS(I)))//'.PST1' ELSE CALL IOSCOPYFILE(CFNAME,TRIM(DIRMNAME)//'_L#'//TRIM(ITOS(ABS(I)))//'.PST1') ENDIF ENDIF ENDIF IF(J.EQ.0)THEN IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# PST1 File Generated by '//TRIM(UTL_IMODVERSION()) !## pst module is exception IF(.NOT.PMANAGER_SAVEPST(IU,2,DIR,ISS,-1))RETURN CLOSE(IU) ENDIF J=1 ENDDO ENDIF PMANAGER_SAVEMF2005_PST_READWRITE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_PST_READWRITE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_IES_READWRITE(DIRMNAME,IBATCH) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIRMNAME INTEGER,INTENT(IN) :: IBATCH INTEGER :: I,J,K,N,IU,JU,IOS,ILAY PMANAGER_SAVEMF2005_IES_READWRITE=.TRUE. IF(TOPICS(TIES)%IACT_MODEL.EQ.0)RETURN !## overrule is by imod batch IF(IBATCH.EQ.1.AND.PBMAN%IIES.EQ.0)RETURN PMANAGER_SAVEMF2005_IES_READWRITE=.FALSE. N=0; IF(ASSOCIATED(PEST%MEASURES))THEN; N=SIZE(PEST%MEASURES); ENDIF IF(N.EQ.0.OR.PEST%PE_MXITER.LE.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You need to specify measurements to use the IES module.','Error'); RETURN ENDIF !## change lpf (copy) for now into an #.lpf DO I=1,PEST%NREALS IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.LPF7' ,STATUS='OLD' ,ACTION='READ' ,FORM='FORMATTED') JU=UTL_GETUNIT() CALL OSD_OPEN(JU,FILE=TRIM(DIRMNAME)//'_R#'//TRIM(ITOS(I))//'.LPF7',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') DO READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT DO J=1,SIZE(PEST%PARAM) DO K=1,SIZE(PEST%PARAM(J)%ILS) ILAY=PEST%PARAM(J)%ILS(K) SELECT CASE (PEST%PARAM(J)%PPARAM) CASE ('KH') LINE=UTL_SUBST(LINE,'HK_L'//TRIM(ITOS(ILAY))//'.ARR','HK_L'//TRIM(ITOS(ILAY))//'_R#'//TRIM(ITOS(I))//'.ARR') END SELECT ENDDO ENDDO WRITE(JU,'(A)') TRIM(LINE) ENDDO CLOSE(IU); CLOSE(JU) ENDDO PMANAGER_SAVEMF2005_IES_READWRITE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_IES_READWRITE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_GLM_MF6_SEAWAT_READWRITE(DIR,DIRMNAME,IBATCH) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIRMNAME,DIR CHARACTER(LEN=256) :: FNAME CHARACTER(LEN=52) :: MDLNAME,FTYPE CHARACTER(LEN=4) :: FEXT CHARACTER(LEN=3) :: CPCK INTEGER,INTENT(IN) :: IBATCH INTEGER :: I,II,J,N,IU,JU,IOS,ILAY,N1,N2,ISUB,IPER,ISYS LOGICAL :: LNPF,LSTO,LDRN,LRIV,LGHB,LRCH,LWEL,LEVT,LUZF,LISG,LMNW,LEX LOGICAL,DIMENSION(2) :: LMOD LOGICAL,DIMENSION(7) :: LPCK PMANAGER_SAVEMF2005_GLM_MF6_SEAWAT_READWRITE=.TRUE. !## not modflow6/seawat IF(PBMAN%IFORMAT.NE.3.AND.PBMAN%IFORMAT.NE.6)RETURN !## not ipest defined IF(TOPICS(TPST)%IACT_MODEL.EQ.0)RETURN !## not ipestp defined IF(PBMAN%IPESTP.EQ.0)RETURN PMANAGER_SAVEMF2005_GLM_MF6_SEAWAT_READWRITE=.FALSE. N=0; IF(ASSOCIATED(PEST%MEASURES))THEN; N=SIZE(PEST%MEASURES); ENDIF IF(N.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You need to specify measurements to use the GLM module.','Error'); RETURN ENDIF CALL PMANAGER_SAVEMF2005_MF6_GETPARAM(LNPF,LSTO,LDRN,LRIV,LGHB,LRCH,LWEL,LEVT,LUZF,LISG,LMNW) LMOD(1)=LNPF; LMOD(2)=LSTO LPCK(1)=LDRN; LPCK(2)=LRIV; LPCK(3)=LGHB; LPCK(4)=LRCH; LPCK(5)=LWEL; LPCK(6)=LISG; LPCK(7)=LMNW !## write *.nam file(s) N1=1; N2=1 IF(PBMAN%IPESTP.EQ.1)THEN IF(PEST%PE_MXITER.LT.0)then N1=-1; N2=N1 ELSE N1=-PBMAN%NLAMBDASEARCH; N2=SIZE(PEST%PARAM) ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN N1=1; N2=SIZE(PEST%PARAM) ENDIF MDLNAME=DIRMNAME(INDEX(DIRMNAME,'\',.TRUE.)+1:); MDLNAME=UTL_CAP(MDLNAME,'U') ISUB=PBMAN%ISUBMODEL DO I=N1,N2 !## skip zero IF(I.EQ.0)CYCLE IF(PBMAN%IPESTP.EQ.1)THEN IF(I.GT.0)THEN IF(PEST%PARAM(I)%PACT.EQ.0.OR.PEST%PARAM(I)%PIGROUP.LT.0)CYCLE FTYPE='P#'//TRIM(ITOS(I)) ELSE FTYPE='L#'//TRIM(ITOS(ABS(I))) ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN FTYPE='R#'//TRIM(ITOS(I)) ENDIF !## copy npf in case a parameters effect this file DO J=1,SIZE(LMOD) IF(.NOT.LMOD(J))CYCLE IF(PBMAN%IFORMAT.EQ.3)THEN IF(J.EQ.1)FEXT='NPF6' IF(J.EQ.2)FEXT='STO6' !## original model FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(ISUB))//'\MODELINPUT\'//TRIM(MDLNAME)//'.'//TRIM(FEXT) IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',ACTION='READ' ,FORM='FORMATTED') FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(ISUB))//'\MODELINPUT\'//TRIM(MDLNAME)//'_'//TRIM(FTYPE)//'.'//TRIM(FEXT) JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=TRIM(FNAME),STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ELSE FEXT='LPF7' !## original model FNAME=TRIM(DIR)//'\MODELINPUT\'//TRIM(MDLNAME)//'.'//TRIM(FEXT) IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',ACTION='READ' ,FORM='FORMATTED') FNAME=TRIM(DIR)//'\MODELINPUT\'//TRIM(MDLNAME)//'_'//TRIM(FTYPE)//'.'//TRIM(FEXT) JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=TRIM(FNAME),STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ENDIF DO READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT IF(INDEX(LINE,'.ARR').LE.0)THEN; WRITE(JU,'(A)') TRIM(LINE); CYCLE; ENDIF DO II=1,SIZE(PEST%PARAM) ILAY=PEST%PARAM(II)%PILS !## modflow6 IF(PBMAN%IFORMAT.EQ.3)THEN SELECT CASE (PEST%PARAM(II)%PPARAM) CASE ('KH') LINE=UTL_SUBST(LINE,TRIM(FEXT)//'\K_L'//TRIM(ITOS(ILAY))//'.ARR' ,TRIM(FEXT)//'\'//TRIM(FTYPE)//'\K_L'//TRIM(ITOS(ILAY))//'_'//TRIM(FTYPE)//'.ARR') CASE ('VA') LINE=UTL_SUBST(LINE,TRIM(FEXT)//'\K33_L'//TRIM(ITOS(ILAY))//'.ARR',TRIM(FEXT)//'\'//TRIM(FTYPE)//'\K33_L'//TRIM(ITOS(ILAY))//'_'//TRIM(FTYPE)//'.ARR') CASE ('SC') LINE=UTL_SUBST(LINE,TRIM(FEXT)//'\SS_L'//TRIM(ITOS(ILAY))//'.ARR' ,TRIM(FEXT)//'\'//TRIM(FTYPE)//'\SS_L'//TRIM(ITOS(ILAY))//'_'//TRIM(FTYPE)//'.ARR') CASE ('SY') LINE=UTL_SUBST(LINE,TRIM(FEXT)//'\SY_L'//TRIM(ITOS(ILAY))//'.ARR' ,TRIM(FEXT)//'\'//TRIM(FTYPE)//'\SY_L'//TRIM(ITOS(ILAY))//'_'//TRIM(FTYPE)//'.ARR') END SELECT ELSE SELECT CASE (PEST%PARAM(II)%PPARAM) CASE ('KH') LINE=UTL_SUBST(LINE,TRIM(FEXT)//'\HK_L'//TRIM(ITOS(ILAY))//'.ARR' ,TRIM(FEXT)//'\'//TRIM(FTYPE)//'\HK_L'//TRIM(ITOS(ILAY))//'_'//TRIM(FTYPE)//'.ARR') CASE ('VA') LINE=UTL_SUBST(LINE,TRIM(FEXT)//'\KVA_L'//TRIM(ITOS(ILAY))//'.ARR',TRIM(FEXT)//'\'//TRIM(FTYPE)//'\KVA_L'//TRIM(ITOS(ILAY))//'_'//TRIM(FTYPE)//'.ARR') CASE ('SC') LINE=UTL_SUBST(LINE,TRIM(FEXT)//'\SF1_L'//TRIM(ITOS(ILAY))//'.ARR' ,TRIM(FEXT)//'\'//TRIM(FTYPE)//'\SF1_L'//TRIM(ITOS(ILAY))//'_'//TRIM(FTYPE)//'.ARR') CASE ('SY') LINE=UTL_SUBST(LINE,TRIM(FEXT)//'\SF2_L'//TRIM(ITOS(ILAY))//'.ARR' ,TRIM(FEXT)//'\'//TRIM(FTYPE)//'\SF2_L'//TRIM(ITOS(ILAY))//'_'//TRIM(FTYPE)//'.ARR') END SELECT ENDIF ENDDO WRITE(JU,'(A)') TRIM(LINE) ENDDO CLOSE(IU); CLOSE(JU) ENDDO !## copy drn in case a parameters effect this file DO J=1,SIZE(LPCK) IF(.NOT.LPCK(J))CYCLE IF(PBMAN%IFORMAT.EQ.3)THEN IF(J.EQ.1)FEXT='DRN6' IF(J.EQ.2)FEXT='RIV6' IF(J.EQ.3)FEXT='GHB6' IF(J.EQ.4)FEXT='RCH6' IF(J.EQ.5)FEXT='WEL6' !IF(J.EQ.6)FEXT='WEL6' isg IF(J.EQ.7)FEXT='MNW6' ELSE IF(J.EQ.1)FEXT='DRN7' IF(J.EQ.2)FEXT='RIV7' IF(J.EQ.3)FEXT='GHB7' IF(J.EQ.4)FEXT='RCH7' IF(J.EQ.5)FEXT='WEL7' !IF(J.EQ.6)FEXT='WEL6' isg IF(J.EQ.7)FEXT='MNW7' ENDIF !## try all systems ISYS=0 DO ISYS=ISYS+1 IF(PBMAN%IFORMAT.EQ.3)THEN !## original model FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(ISUB))//'\MODELINPUT\'//TRIM(MDLNAME)//'_SYS'//TRIM(ITOS(ISYS))//'.'//TRIM(FEXT) INQUIRE(FILE=FNAME,EXIST=LEX); IF(.NOT.LEX)EXIT IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',ACTION='READ' ,FORM='FORMATTED') FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(ISUB))//'\MODELINPUT\'//TRIM(MDLNAME)//'_SYS'//TRIM(ITOS(ISYS))//'_'//TRIM(FTYPE)//'.'//TRIM(FEXT) JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=TRIM(FNAME),STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ELSE !## original model FNAME=TRIM(DIR)//'\MODELINPUT\'//TRIM(MDLNAME)//'_SYS'//TRIM(ITOS(ISYS))//'.'//TRIM(FEXT) INQUIRE(FILE=FNAME,EXIST=LEX); IF(.NOT.LEX)EXIT IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',ACTION='READ' ,FORM='FORMATTED') FNAME=TRIM(DIR)//'\MODELINPUT\'//TRIM(MDLNAME)//'_SYS'//TRIM(ITOS(ISYS))//'_'//TRIM(FTYPE)//'.'//TRIM(FEXT) JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=TRIM(FNAME),STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ENDIF DO READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT IF(INDEX(LINE,'.ARR').LE.0)THEN; WRITE(JU,'(A)') TRIM(LINE); CYCLE; ENDIF DO II=1,SIZE(PEST%PARAM) !## skip this parameter IF(PEST%PARAM(II)%PILS.NE.ISYS)CYCLE DO IPER=1,PRJNPER SELECT CASE (PEST%PARAM(II)%PPARAM) CASE ('DC'); CPCK='DRN' CASE ('RC'); CPCK='RIV' CASE ('GC'); CPCK='GHB' CASE ('RE'); CPCK='RCH' CASE ('QR'); CPCK='WEL' CASE ('MQ'); CPCK='MAW' END SELECT LINE=UTL_SUBST(LINE,TRIM(FEXT)//'\SYS'//TRIM(ITOS(ISYS))//'\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR', & TRIM(FEXT)//'\SYS'//TRIM(ITOS(ISYS))//'\'//TRIM(FTYPE)//'\'//CPCK//'_T'//TRIM(ITOS(IPER))//'_'//TRIM(FTYPE)//'.ARR') ENDDO ENDDO WRITE(JU,'(A)') TRIM(LINE) ENDDO CLOSE(IU); CLOSE(JU) ENDDO ENDDO ENDDO !## copy obs files DO I=N1,N2 !## skip zero IF(I.EQ.0)CYCLE IF(PBMAN%IPESTP.EQ.1)THEN IF(I.GT.0)THEN IF(PEST%PARAM(I)%PACT.EQ.0.OR.PEST%PARAM(I)%PIGROUP.LT.0)CYCLE FTYPE='P#'//TRIM(ITOS(I)) ELSE FTYPE='L#'//TRIM(ITOS(ABS(I))) ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN FTYPE='R#'//TRIM(ITOS(I)) ENDIF IF(PBMAN%IFORMAT.EQ.3)THEN !## original model FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(ISUB))//'\MODELINPUT\'//TRIM(MDLNAME)//'.OBS6' IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',ACTION='READ' ,FORM='FORMATTED') FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(ISUB))//'\MODELINPUT\'//TRIM(MDLNAME)//'_'//TRIM(FTYPE)//'.OBS6' JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=TRIM(FNAME),STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ELSE !## original model FNAME=TRIM(DIR)//'\MODELINPUT\'//TRIM(MDLNAME)//'.OBS7' IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',ACTION='READ' ,FORM='FORMATTED') FNAME=TRIM(DIR)//'\MODELINPUT\'//TRIM(MDLNAME)//'_'//TRIM(FTYPE)//'.OBS7' JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=TRIM(FNAME),STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ENDIF DO READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT IF(PBMAN%IFORMAT.EQ.3)THEN LINE=UTL_SUBST(LINE,'\OUTPUT_OBS.TXT','\IPEST_'//TRIM(FTYPE)//'\OUTPUT_OBS_'//TRIM(FTYPE)//'.TXT') ELSE LINE=UTL_SUBST(LINE,'\OBS\OBS','\IPEST_'//TRIM(FTYPE)//'\OUTPUT_OBS_'//TRIM(FTYPE)) !## create folder as seawat is not doing that CALL UTL_CREATEDIR(TRIM(DIR)//'\IPEST_'//TRIM(FTYPE)) ENDIF WRITE(JU,'(A)') TRIM(LINE) ENDDO CLOSE(IU); CLOSE(JU) ENDDO PMANAGER_SAVEMF2005_GLM_MF6_SEAWAT_READWRITE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_GLM_MF6_SEAWAT_READWRITE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_BAS_READ(IPRT) !####==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IPRT INTEGER :: ITOPIC,SCL_D,SCL_U,ILAY INTEGER,DIMENSION(:,:),ALLOCATABLE :: ISIZE PMANAGER_SAVEMF2005_BAS_READ=.FALSE. ALLOCATE(FNAMES(PRJNLAY),PRJILIST(1),ISIZE(4,PRJNLAY)) !## bnd settings ITOPIC=TBND; SCL_D=0; SCL_U=1; PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(1,PRJNLAY,0,1,0).LE.0)RETURN DO ILAY=1,PRJNLAY WRITE(6,'(A)') '+Reading BND-files ('//TRIM(RTOS(REAL(100*ILAY,8)/REAL(PRJNLAY,8),'F',2))//'%) ' CALL IDFCOPY(PRJIDF,BND(ILAY)) IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(BND(ILAY),ITOPIC,ILAY,SCL_D,SCL_U,0,IPRT,ISIZE=ISIZE(:,ILAY)))RETURN ENDDO !## adjust boundary for submodel() CALL PMANAGER_SAVEMF2005_BND(ISIZE,BND,-1) !## shd settings ITOPIC=TSHD; SCL_D=PBMAN%INT(TSHD); SCL_U=2; PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(1,PRJNLAY,0,1,0).LE.0)RETURN DO ILAY=1,PRJNLAY WRITE(6,'(A)') '+Reading SHD-files ('//TRIM(RTOS(REAL(100*ILAY,8)/REAL(PRJNLAY,8),'F',2))//'%) ' CALL IDFCOPY(PRJIDF,SHD(ILAY)) IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(SHD(ILAY),ITOPIC,ILAY,SCL_D,SCL_U,0,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,SHD(ILAY),0,ITOPIC) ENDDO DEALLOCATE(FNAMES,PRJILIST,ISIZE) PMANAGER_SAVEMF2005_BAS_READ=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_BAS_READ !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_BAS_SAVE(DIR,DIRMNAME,IBATCH) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: IBATCH INTEGER :: IU,ILAY,IFBND PMANAGER_SAVEMF2005_BAS_SAVE=.TRUE.; IF(PBMAN%IFORMAT.EQ.3)RETURN PMANAGER_SAVEMF2005_BAS_SAVE=.FALSE. IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.BAS6'//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.BAS6'//'...' IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.BAS6',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# BAS6 File Generated by '//TRIM(UTL_IMODVERSION()) LINE='FREE' IF(PCG%IQERROR.EQ.0)THEN WRITE(IU,'(A)') 'FREE' ELSE WRITE(IU,'(A,G12.5)') 'FREE STOPERROR ',PCG%QERROR ENDIF IFBND=0 DO ILAY=1,PRJNLAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\BAS6\IBOUND_L'//TRIM(ITOS(ILAY))//'.ARR', & BND(ILAY),1,IU,ILAY,IFBND))RETURN ENDDO WRITE(IU,'(A)') TRIM(RTOS(HNOFLOW,'G',7)) IFBND=1 !## include a minor modification to ensure a save in ARR files IF(PBMAN%IPESTP.EQ.1)IFBND=-1 DO ILAY=1,PRJNLAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\BAS6\STRT_L'//TRIM(ITOS(ILAY))//'.ARR', & SHD(ILAY),0,IU,ILAY,IFBND))RETURN ENDDO CLOSE(IU) PMANAGER_SAVEMF2005_BAS_SAVE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_BAS_SAVE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_IC_SAVE(DIR,DIRMNAME,IBATCH) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: IBATCH INTEGER :: IU,ILAY,JLAY,IFBND PMANAGER_SAVEMF2005_IC_SAVE=.TRUE.; IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)RETURN PMANAGER_SAVEMF2005_IC_SAVE=.FALSE. IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.IC6'//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.IC6'//'...' IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.IC6',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# IC6 File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(/A/)') '#General Options' WRITE(IU,'(A)') 'BEGIN OPTIONS' WRITE(IU,'(A)') 'END OPTIONS' WRITE(IU,'(/A/)') '#Initial Head Data' WRITE(IU,'(A)') 'BEGIN GRIDDATA' WRITE(IU,'(A)') ' STRT LAYERED' JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1 IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\IC6\IC_L'//TRIM(ITOS(JLAY))//'.ARR', & SHD(ILAY),0,IU,ILAY,IFBND))RETURN ENDDO WRITE(IU,'(A)') 'END GRIDDATA' CLOSE(IU) PMANAGER_SAVEMF2005_IC_SAVE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_IC_SAVE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_DIS_READ(LTB,IPRT) !####==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IPRT LOGICAL,INTENT(OUT) :: LTB INTEGER :: ILAY,IINV,SCL_D,SCL_U,ITOPIC LOGICAL :: LEX PMANAGER_SAVEMF2005_DIS_READ=.FALSE. ALLOCATE(FNAMES(1),PRJILIST(1)) !## check top/bottom LTB=.TRUE.; IINV=0 !## top settings SCL_D=PBMAN%INT(TTOP); SCL_U=2 DO ILAY=1,PRJNLAY WRITE(6,'(A)') '+Reading TOP/BOT-files ('//TRIM(RTOS(REAL(100*ILAY,8)/REAL(PRJNLAY,8),'F',2))//'%) ' !## top data ITOPIC=TTOP; LEX=.FALSE. IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))THEN PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(TOP(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN LEX=.TRUE. ENDIF ENDIF IF(.NOT.LEX)THEN; TOP(ILAY)%X=0.0D0; LTB=.FALSE.; ENDIF !## bot data ITOPIC=TBOT; LEX=.FALSE. IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))THEN PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(BOT(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN LEX=.TRUE. ENDIF ENDIF IF(.NOT.LEX)THEN; BOT(ILAY)%X=0.0D0; LTB=.FALSE.; ENDIF ENDDO DEALLOCATE(FNAMES,PRJILIST) PMANAGER_SAVEMF2005_DIS_READ=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_DIS_READ !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_DIS_SAVE(DIR,DIRMNAME,IBATCH) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: IBATCH INTEGER :: IU,ILAY,JLAY,KPER,KKPER,ITOPIC,ICOL,IROW,N,I,LHMS,IFBND INTEGER,ALLOCATABLE,DIMENSION(:) :: LCBD REAL(KIND=DP_KIND) :: T,DELT CHARACTER(LEN=256) :: CLINE PMANAGER_SAVEMF2005_DIS_SAVE=.FALSE. IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.DIS6'//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.DIS6'//'...' !## construct dis-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.DIS6',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# DIS6 File Generated by '//TRIM(UTL_IMODVERSION()) IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN LINE=TRIM(ITOS(PRJNLAY))//','//TRIM(ITOS(PRJIDF%NROW))//','//TRIM(ITOS(PRJIDF%NCOL))//','//TRIM(ITOS(PRJNPER))//',4,2 TBCHECK' WRITE(IU,'(A)') TRIM(LINE) ALLOCATE(LCBD(PRJNLAY)) !## laycbd code LINE='' DO ILAY=1,PRJNLAY IF(ILAY.LT.PRJNLAY)THEN !## quasi-3d scheme IF(LQBD)THEN LCBD(ILAY)=1 !## 3d no quasi confining bed ELSE LCBD(ILAY)=0 ENDIF ELSE !## lowest layer has never a quasi-confining bed LCBD(ILAY)=0 ENDIF ENDDO WRITE(IU,'(999I2)') LCBD DEALLOCATE(LCBD) IF(PRJIDF%IEQ.EQ.0)THEN WRITE(IU,'(A)') 'CONSTANT '//TRIM(RTOS(PRJIDF%DX,'E',7)); WRITE(IU,'(A)') 'CONSTANT '//TRIM(RTOS(PRJIDF%DY,'E',7)) ELSE WRITE(IU,'(A)') 'INTERNAL,1.0D0,(FREE),-1' WRITE(IU,*) (PRJIDF%SX(ICOL)-PRJIDF%SX(ICOL-1),ICOL=1,PRJIDF%NCOL) WRITE(IU,'(A)') 'INTERNAL,1.0D0,(FREE),-1' WRITE(IU,*) (PRJIDF%SY(IROW-1)-PRJIDF%SY(IROW),IROW=1,PRJIDF%NROW) ENDIF DO ILAY=1,PRJNLAY ITOPIC=TTOP !## no check with bnd IFBND=0 !## quasi-3d scheme add top aquifer modellayer IF(LQBD.OR.ILAY.EQ.1)THEN IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\DIS6\TOP_L'//TRIM(ITOS(ILAY))//'.ARR', & TOP(ILAY),0,IU,ILAY,IFBND))RETURN ENDIF ITOPIC=TBOT IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\DIS6\BOTM_L'//TRIM(ITOS(ILAY))//'.ARR', & BOT(ILAY),0,IU,ILAY,IFBND))RETURN ENDDO !## time information LHMS=0; DO KPER=1,PRJNPER !## set delt.eq.1 otherwise crash in UZF package IF(SIM(KPER)%DELT.GT.0.0D0)THEN IF(SIM(KPER)%IHR+SIM(KPER)%IMT+SIM(KPER)%ISC.NE.0)THEN; LHMS=1; EXIT; ENDIF ENDIF ENDDO !## time information DO KPER=1,PRJNPER !## set delt.eq.1 otherwise crash in UZF package <<< DELT MOET 0.0 ZIJN VOOR ??? IF(SIM(KPER)%DELT.EQ.0.0D0)THEN LINE=TRIM(RTOS(0.0D0,'G',7))//','// & TRIM(ITOS(1)) //','// & TRIM(RTOS(1.0D0,'G',7)) ELSE LINE=TRIM(RTOS(SIM(KPER)%DELT,'G',7))//','// & TRIM(ITOS(SIM(KPER)%NSTP)) //','// & TRIM(RTOS(SIM(KPER)%TMULT,'G',7)) ENDIF IF(SIM(KPER)%DELT.EQ.0.0D0)LINE=TRIM(LINE)//',SS' IF(SIM(KPER)%DELT.NE.0.0D0)LINE=TRIM(LINE)//',TR' IF(SIM(KPER)%DELT.EQ.0.0D0)THEN CLINE='STEADY-STATE' ELSE KKPER=KPER; IF(PBMAN%ISAVEENDDATE.EQ.1)KKPER=KKPER+1 ! DELT=0.0D0 ;IF(PBMAN%ISAVEENDDATE.EQ.1)DELT=SIM(KPER)%DELT ! CLINE=TRIM(ITOS_DBL(ADD_DT_TO_IDATE(SIM(KPER)%IYR,SIM(KPER)%IMH,SIM(KPER)%IDY,SIM(KPER)%IHR,SIM(KPER)%IMT,SIM(KPER)%ISC,DELT,ABS(LHMS-1)))) IF(LHMS.EQ.0)THEN WRITE(CLINE,'(I4.4,2I2.2)') SIM(KKPER)%IYR,SIM(KKPER)%IMH,SIM(KKPER)%IDY ELSE WRITE(CLINE,'(I4.4,5I2.2)') SIM(KKPER)%IYR,SIM(KKPER)%IMH,SIM(KKPER)%IDY,SIM(KKPER)%IHR,SIM(KKPER)%IMT,SIM(KKPER)%ISC ENDIF ENDIF LINE=TRIM(LINE)//' ['//TRIM(CLINE)//']' IF(SIM(KPER)%DELT.EQ.0.0D0)THEN LINE=TRIM(LINE)//' [STEADY-STATE] [STEADY-STATE]' ELSE !## add begin- and end-timestamps WRITE(CLINE,'(I4.4,5I2.2)') SIM(KPER)%IYR ,SIM(KPER)%IMH ,SIM(KPER)%IDY ,SIM(KPER)%IHR ,SIM(KPER)%IMT ,SIM(KPER)%ISC LINE=TRIM(LINE)//' ['//TRIM(CLINE)//']' WRITE(CLINE,'(I4.4,5I2.2)') SIM(KPER+1)%IYR,SIM(KPER+1)%IMH,SIM(KPER+1)%IDY,SIM(KPER+1)%IHR,SIM(KPER+1)%IMT,SIM(KPER+1)%ISC LINE=TRIM(LINE)//' ['//TRIM(CLINE)//']' ENDIF WRITE(IU,'(A)') TRIM(LINE) ENDDO ELSE WRITE(IU,'(/A/)') 'General Options' WRITE(IU,'(A)') 'BEGIN OPTIONS' WRITE(IU,'(A)') ' LENGTH_UNITS METERS' !## in case no output is desired, skip grb saving DO I=1,SIZE(PBMAN%ISAVE); IF(ASSOCIATED(PBMAN%ISAVE(I)%ILAY))EXIT; ENDDO IF(I.GT.SIZE(PBMAN%ISAVE))WRITE(IU,'(A)') ' NOGRB' ! !## in case of ipestp - do not write a GRB file - mf6toidf can be performed via IDF-option ! IF(PBMAN%IPESTP.EQ.1.AND.PEST%PE_MXITER.GE.0)WRITE(IU,'(A)') ' NOGRB' WRITE(IU,'(A)') ' XORIGIN '//TRIM(RTOS(PRJIDF%SX(0),'F',3)) WRITE(IU,'(A)') ' YORIGIN '//TRIM(RTOS(PRJIDF%SY(PRJIDF%NROW),'F',3)) WRITE(IU,'(A)') ' ANGROT 0.0' WRITE(IU,'(A)') 'END OPTIONS' WRITE(IU,'(/A/)') '#Model Dimensions' WRITE(IU,'(A)') 'BEGIN DIMENSIONS' N=0; DO I=1,SIZE(PBMAN%ILAY); IF(PBMAN%ILAY(I).EQ.1)N=N+1; ENDDO WRITE(IU,'(A)') ' NLAY '//TRIM(ITOS(N)) WRITE(IU,'(A)') ' NROW '//TRIM(ITOS(PRJIDF%NROW)) WRITE(IU,'(A)') ' NCOL '//TRIM(ITOS(PRJIDF%NCOL)) WRITE(IU,'(A)') 'END DIMENSIONS' WRITE(IU,'(/A/)') '#Cell Sizes' WRITE(IU,'(A)') 'BEGIN GRIDDATA' WRITE(IU,'(A)') ' DELR' IF(PRJIDF%IEQ.EQ.0)THEN WRITE(IU,'(A)') ' CONSTANT '//TRIM(RTOS(PRJIDF%DX,'E',7)) ELSE WRITE(IU,'(A)') ' INTERNAL FACTOR 1.0' WRITE(IU,*) (PRJIDF%SX(ICOL)-PRJIDF%SX(ICOL-1),ICOL=1,PRJIDF%NCOL) ENDIF WRITE(IU,'(A)') ' DELC' IF(PRJIDF%IEQ.EQ.0)THEN WRITE(IU,'(A)') ' CONSTANT '//TRIM(RTOS(PRJIDF%DY,'E',7)) ELSE WRITE(IU,'(A)') ' INTERNAL FACTOR 1.0' WRITE(IU,*) (PRJIDF%SY(IROW-1)-PRJIDF%SY(IROW),IROW=1,PRJIDF%NROW) ENDIF !## Only 3d model WRITE(IU,'(/A/)') '#Vertical Configuration' ITOPIC=TTOP !## check by boundary IFBND=0 !## get first model layer DO I=1,SIZE(PBMAN%ILAY); IF(PBMAN%ILAY(I).EQ.1)EXIT; ENDDO ITOPIC=TBOT JLAY=0; DO ILAY=I,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1 IF(JLAY.EQ.1)WRITE(IU,'(A)') 'TOP' IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\DIS6\TOPM_L'//TRIM(ITOS(JLAY))//'.ARR', & TOP(ILAY),0,IU,ILAY,IFBND))RETURN IF(JLAY.EQ.1.OR.N.EQ.1)WRITE(IU,'(A)') 'BOTM LAYERED' !## write idf for connection-purposes IF(.NOT.IDFWRITE(TOP(ILAY),TRIM(DIR)//'\DIS6\TOPM_L'//TRIM(ITOS(JLAY))//'.IDF',1))RETURN IF(JLAY.EQ.N)THEN IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\DIS6\BOTM_L'//TRIM(ITOS(JLAY))//'.ARR', & BOT(ILAY),0,IU,ILAY,IFBND))RETURN ENDIF !## write idf for connection-purposes IF(.NOT.IDFWRITE(BOT(ILAY),TRIM(DIR)//'\DIS6\BOTM_L'//TRIM(ITOS(JLAY))//'.IDF',1))RETURN ENDDO WRITE(IU,'(/A/)') '#Boundary Settings' WRITE(IU,'(A)') 'IDOMAIN LAYERED' JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1 !## modify bnd for idomain parameter PRJIDF%X=BND(ILAY)%X; PRJIDF%NODATA=BND(ILAY)%NODATA !## clean idomain which was the boundary condition DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(PRJIDF%X(ICOL,IROW).EQ.PRJIDF%NODATA)PRJIDF%X(ICOL,IROW)=0.0D0 IF(PRJIDF%X(ICOL,IROW).LT.0.0) PRJIDF%X(ICOL,IROW)=1.0D0 IF(PRJIDF%X(ICOL,IROW).GT.1.0) PRJIDF%X(ICOL,IROW)=1.0D0 ENDDO; ENDDO !### bovenste of onderste lagen niet -1 als er toch niks boven of onder zit. DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(BND(ILAY)%X(ICOL,IROW).EQ.0.0D0)CYCLE T=TOP(ILAY)%X(ICOL,IROW)-BOT(ILAY)%X(ICOL,IROW) IF(T.LE.0.0D0)THEN PRJIDF%X(ICOL,IROW)=-1.0D0 !## make sure an active cells are not allowed on thickness of zero BND(ILAY)%X(ICOL,IROW)=0.0 ENDIF ENDDO; ENDDO !## modify idomain a bit in case MF6 is used to force an export to an ARR-file IRLOOP: DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(PRJIDF%X(ICOL,IROW).GT.0)THEN PRJIDF%X(ICOL,IROW)=2.0D0 EXIT IRLOOP ENDIF ENDDO; ENDDO IRLOOP IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\DIS6\IBOUND_L'//TRIM(ITOS(JLAY))//'.ARR', & PRJIDF,1,IU,ILAY,0))RETURN !## write idf for connection-purposes IF(.NOT.IDFWRITE(PRJIDF,TRIM(DIR)//'\DIS6\BND_L'//TRIM(ITOS(JLAY))//'.IDF',1))RETURN !idomain—is an optional array that characterizes the existence status of a cell. If the IDOMAIN array !is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, !the cell does not exist in the simulation. Input and output values will be read and written for the cell, !but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell !is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in !the simulation. Furthermore, the first existing cell above will be connected to the first existing cell !below. This type of cell is referred to as a “vertical pass through” cell. ENDDO WRITE(IU,'(A)') 'END GRIDDATA' ENDIF CLOSE(IU) PMANAGER_SAVEMF2005_DIS_SAVE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_DIS_SAVE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_BTN_SAVE(DIR,DIRMNAME,IBATCH) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: IBATCH INTEGER :: IU,ILAY,JLAY,KPER,KKPER,ITOPIC,ICOL,IROW,N,I,LHMS,IFBND INTEGER,ALLOCATABLE,DIMENSION(:) :: LCBD REAL(KIND=DP_KIND) :: T CHARACTER(LEN=52) :: CLINE PMANAGER_SAVEMF2005_BTN_SAVE=.TRUE. IF(TOPICS(TPOR)%IACT_MODEL.EQ.0)RETURN IF(TOPICS(TCBI)%IACT_MODEL.EQ.0)RETURN IF(TOPICS(TSCO)%IACT_MODEL.EQ.0)RETURN PMANAGER_SAVEMF2005_BTN_SAVE=.FALSE. !## export only for seawat IF(PBMAN%IFORMAT.NE.6.OR.WQ%VDF%MTDNCONC.EQ.0)THEN; PMANAGER_SAVEMF2005_BTN_SAVE=.TRUE.; RETURN; ENDIF IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.BTN1'//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.BTN1'//'...' !## construct dis-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.BTN1',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(A/)') '# BTN1 File Generated by '//TRIM(UTL_IMODVERSION()) LINE=TRIM(ITOS(PRJNLAY))//','//TRIM(ITOS(PRJIDF%NROW))//','//TRIM(ITOS(PRJIDF%NCOL))//','// & TRIM(ITOS(PRJNPER))//',1,1' WRITE(IU,'(A)') TRIM(LINE) !## time-, length and mass units WRITE(IU,'(3A4)') 'D','M','K' WRITE(IU,'(A)') ' T T T F F F F F F F' ! LINE='' ! DO I=1, ! IF(LINE=TRIM(LINE)' T' ! IF(LINE=TRIM(LINE)' F' ! ENDDO ! WRITE(IU,'(A)') TRIM(LINE) ALLOCATE(LCBD(PRJNLAY)) !## laycbd code LINE='' DO ILAY=1,PRJNLAY IF(ILAY.LT.PRJNLAY)THEN !## quasi-3d scheme IF(LQBD)THEN LCBD(ILAY)=1 !## 3d no quasi confining bed ELSE LCBD(ILAY)=0 ENDIF ELSE !## lowest layer has never a quasi-confining bed LCBD(ILAY)=0 ENDIF ENDDO WRITE(IU,'(999I2)') LCBD DEALLOCATE(LCBD) IF(PRJIDF%IEQ.EQ.0)THEN WRITE(IU,'(A)') 'CONSTANT '//TRIM(RTOS(PRJIDF%DX,'E',7)); WRITE(IU,'(A)') 'CONSTANT '//TRIM(RTOS(PRJIDF%DY,'E',7)) ELSE WRITE(IU,'(A)') 'INTERNAL,1.0D0,(FREE),-1' WRITE(IU,*) (PRJIDF%SX(ICOL)-PRJIDF%SX(ICOL-1),ICOL=1,PRJIDF%NCOL) WRITE(IU,'(A)') 'INTERNAL,1.0D0,(FREE),-1' WRITE(IU,*) (PRJIDF%SY(IROW-1)-PRJIDF%SY(IROW),IROW=1,PRJIDF%NROW) ENDIF !## no check with bnd IFBND=0 !## quasi-3d scheme add top aquifer modellayer - find uppermost top PRJIDF%X=PRJIDF%NODATA DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL DO ILAY=1,PRJNLAY IF(BND(ILAY)%X(ICOL,IROW).NE.0)THEN PRJIDF%X(ICOL,IROW)=TOP(ILAY)%X(ICOL,IROW) EXIT ENDIF ENDDO ENDDO; ENDDO IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\BTN1\TOP_L'//TRIM(ITOS(1))//'.ARR', & PRJIDF,0,IU,1,IFBND))RETURN !## save thickness DO ILAY=1,PRJNLAY PRJIDF%X=0.0D0 DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(BND(ILAY)%X(ICOL,IROW).NE.0)PRJIDF%X(ICOL,IROW)=TOP(ILAY)%X(ICOL,IROW)-BOT(ILAY)%X(ICOL,IROW) ENDDO; ENDDO IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\BTN1\THK_L'//TRIM(ITOS(ILAY))//'.ARR', & PRJIDF,0,IU,1,IFBND))RETURN ENDDO !## save porosity DO ILAY=1,PRJNLAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\BTN1\POR_L'//TRIM(ITOS(ILAY))//'.ARR', & POR(ILAY),0,IU,1,IFBND))RETURN ENDDO !## save boundary condition DO ILAY=1,PRJNLAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\BTN1\CBI_L'//TRIM(ITOS(ILAY))//'.ARR', & CBI(ILAY),1,IU,1,IFBND))RETURN ENDDO !## save starting concentration DO ILAY=1,PRJNLAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\BTN1\SCO_L'//TRIM(ITOS(ILAY))//'.ARR', & SCO(ILAY),0,IU,1,IFBND))RETURN ENDDO WRITE(IU,'(2F10.2)') -9999.,0.01 !## cinact,minthickness WRITE(IU,'(4I10,L10)') 0,0,0,0,.TRUE. !## ifmtcn, ifmtnp, ifmtrf, ifmtdp, savucn WRITE(IU,'(I10)') 0 !## nprs WRITE(IU,'(2I10)') 0,1 !## nobs,nprobs WRITE(IU,'(L10,I10)') .TRUE.,1 !## chkmax,nprmas !## time information LHMS=0; DO KPER=1,PRJNPER !## set delt.eq.1 otherwise crash in UZF package IF(SIM(KPER)%DELT.GT.0.0D0)THEN IF(SIM(KPER)%IHR+SIM(KPER)%IMT+SIM(KPER)%ISC.NE.0)THEN; LHMS=1; EXIT; ENDIF ENDIF ENDDO !## time information DO KPER=1,PRJNPER !## set delt.eq.1 otherwise crash in UZF package IF(SIM(KPER)%DELT.EQ.0.0D0)THEN LINE=TRIM(RTOS(1.0D0,'G',7))//','// & TRIM(ITOS(SIM(KPER)%NSTP)) //','// & TRIM(RTOS(SIM(KPER)%TMULT,'G',7)) ELSE LINE=TRIM(RTOS(SIM(KPER)%DELT,'G',7))//','// & TRIM(ITOS(SIM(KPER)%NSTP)) //','// & TRIM(RTOS(SIM(KPER)%TMULT,'G',7)) ENDIF IF(SIM(KPER)%DELT.EQ.0.0D0)LINE=TRIM(LINE)//',SS' IF(SIM(KPER)%DELT.NE.0.0D0)LINE=TRIM(LINE)//',TR' IF(SIM(KPER)%DELT.EQ.0.0D0)THEN CLINE='STEADY-STATE' ELSE KKPER=KPER; IF(PBMAN%ISAVEENDDATE.EQ.1)KKPER=KKPER+1 IF(LHMS.EQ.0)THEN WRITE(CLINE,'(I4.4,2I2.2)') SIM(KKPER)%IYR,SIM(KKPER)%IMH,SIM(KKPER)%IDY ELSE WRITE(CLINE,'(I4.4,5I2.2)') SIM(KKPER)%IYR,SIM(KKPER)%IMH,SIM(KKPER)%IDY,SIM(KKPER)%IHR,SIM(KKPER)%IMT,SIM(KKPER)%ISC ENDIF ENDIF LINE=TRIM(LINE)//' ['//TRIM(CLINE)//']' WRITE(IU,'(A)') TRIM(LINE) WRITE(IU,'(F10.2,I10,2F10.2)') 0.0E+00,50000,1.0,0.0E+00 !DT0, MXSTRN, TTSMULT, TTSMAX ENDDO CLOSE(IU) PMANAGER_SAVEMF2005_BTN_SAVE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_BTN_SAVE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_BCF_READ(ISS,IPRT) !####==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ISS,IPRT INTEGER :: ILAY,SCL_D,SCL_U,IINV,ITOPIC PMANAGER_SAVEMF2005_BCF_READ=.TRUE. !## use bcf6 IF(.NOT.LBCF)RETURN PMANAGER_SAVEMF2005_BCF_READ=.FALSE. ALLOCATE(FNAMES(1),PRJILIST(1)) DO ILAY=1,PRJNLAY WRITE(6,'(A)') '+Reading BCF-files ('//TRIM(RTOS(REAL(100*ILAY,8)/REAL(PRJNLAY,8),'F',2))//'%) ' !## transient simulation IF(ISS.EQ.1)THEN !## sf1 ITOPIC=TSTO; SCL_D=PBMAN%INT(TSTO); SCL_U=2; IINV=0 PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(STO(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,STO(ILAY),0,ITOPIC) ENDIF !## kdw ITOPIC=TKDW; SCL_D=PBMAN%INT(TKDW); SCL_U=3; IINV=0 PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(KDW(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,KDW(ILAY),0,ITOPIC) IF(ILAY.NE.PRJNLAY)THEN !## vcont=1/resistance ITOPIC=TVCW; SCL_D=PBMAN%INT(TVCW); SCL_U=6; IINV=1 PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(VCW(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,VCW(ILAY),0,ITOPIC) ENDIF ENDDO DEALLOCATE(FNAMES,PRJILIST) PMANAGER_SAVEMF2005_BCF_READ=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_BCF_READ !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_BCF_SAVE(DIR,DIRMNAME,IBATCH,ISS) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: IBATCH,ISS INTEGER :: IU,ILAY,IFBND PMANAGER_SAVEMF2005_BCF_SAVE=.TRUE. !## use bcf6 IF(.NOT.LBCF)RETURN; IF(PBMAN%IFORMAT.EQ.3)RETURN PMANAGER_SAVEMF2005_BCF_SAVE=.FALSE. IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.BCF6'//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.BCF6'//'...' !## construct bcf6-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.BCF6',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN LINE=TRIM(ITOS(IBCFCB))//','//TRIM(RTOS(HNOFLOW,'G',7))//',0,1.0D0,1,0' IF(PBMAN%MINKD.NE.0.0D0)LINE=TRIM(LINE)//',MINKD '//TRIM(RTOS(PBMAN%MINKD,'G',5)) IF(PBMAN%MINC .NE.0.0D0)LINE=TRIM(LINE)//',MINC ' //TRIM(RTOS(PBMAN%MINC ,'G',5)) WRITE(IU,'(A)') TRIM(LINE) !## ltype code LINE=''; DO ILAY=1,PRJNLAY; LINE=TRIM(LINE)//'00,' IF(MOD(ILAY,40).EQ.0)THEN; WRITE(IU,'(A)') TRIM(LINE); LINE=''; ENDIF ENDDO IF(LEN_TRIM(LINE).NE.0)WRITE(IU,'(A)') TRIM(LINE) WRITE(IU,'(A)') 'CONSTANT 1.0' !## trpy IFBND=1 DO ILAY=1,PRJNLAY !## transient simulation IF(ISS.EQ.1)THEN !## sf1 IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\BCF6\SF1_L'//TRIM(ITOS(ILAY))//'.ARR', & STO(ILAY),0,IU,ILAY,IFBND))RETURN ENDIF !## kdw IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\BCF6\TRAN_L'//TRIM(ITOS(ILAY))//'.ARR', & KDW(ILAY),0,IU,ILAY,IFBND))RETURN IF(ILAY.NE.PRJNLAY)THEN !## vcont=1/resistance IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\BCF6\VCONT_L'//TRIM(ITOS(ILAY))//'.ARR', & VCW(ILAY),0,IU,ILAY,IFBND))RETURN ENDIF ENDDO CLOSE(IU) PMANAGER_SAVEMF2005_BCF_SAVE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_BCF_SAVE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_LPF_READ(ISS,IPRT) !####==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ISS,IPRT INTEGER :: ILAY,SCL_D,SCL_U,IINV,ITOPIC,IROW,ICOL,J,IILAY REAL(KIND=DP_KIND) :: T1,B1,T2,B2,KH,KV,KD,VC,MINDX,VA,HA TYPE(IDFOBJ),DIMENSION(4) :: IDFT PMANAGER_SAVEMF2005_LPF_READ=.TRUE. !## use lpf6 IF(.NOT.LLPF.AND..NOT.LNPF)RETURN ALLOCATE(FNAMES(1),PRJILIST(1)) PMANAGER_SAVEMF2005_LPF_READ=.FALSE. IF(PBMAN%APPLYTC.EQ.1)THEN; DO I=1,SIZE(IDFT); CALL IDFNULLIFY(IDFT(I)); ENDDO; ENDIF DO ILAY=1,PRJNLAY WRITE(6,'(A)') '+Reading LPF-files Permeability components ('//TRIM(RTOS(REAL(100*ILAY,8)/REAL(PRJNLAY,8),'F',2))//'%) ' !## compute kh/va/ha on basis of 1/c and kd=darcian(kd) instead of geom(kh) yielding hor.ani. IF(PBMAN%APPLYTC.EQ.1)THEN IINV=0 !## get smallest cellsize of members of kd, and c computation, set tmpidf and read all files at that resolution DO J=1,SIZE(IDFT); CALL IDFDEALLOCATEX(IDFT(J)); CALL IDFDEALLOCATESX(IDFT(J)); ENDDO DO I=1,2 !## top data ITOPIC=TTOP; PRJILIST=ITOPIC; SCL_D=PBMAN%INT(TTOP); SCL_U=2; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(I.EQ.1)THEN IF(FNAMES(I)%ICNST.EQ.2)THEN; IF(.NOT.IDFREAD(TOP(ILAY),FNAMES(1)%FNAME,0))RETURN; ENDIF ELSE CALL IDFCOPY(IDFT(1),TOP(ILAY)) IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(TOP(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN ENDIF !## bot data ITOPIC=TBOT; PRJILIST=ITOPIC; SCL_D=PBMAN%INT(TBOT); SCL_U=2; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(I.EQ.1)THEN IF(FNAMES(I)%ICNST.EQ.2)THEN; IF(.NOT.IDFREAD(BOT(ILAY),FNAMES(1)%FNAME,0))RETURN; ENDIF ELSE CALL IDFCOPY(IDFT(1),BOT(ILAY)) IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(BOT(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN ENDIF !## hkv ITOPIC=TKHV; PRJILIST=ITOPIC; SCL_D=PBMAN%INT(TKHV); SCL_U=3; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(I.EQ.1)THEN IF(FNAMES(I)%ICNST.EQ.2)THEN; IF(.NOT.IDFREAD(KHV(ILAY),FNAMES(1)%FNAME,0))RETURN; ENDIF ELSE CALL IDFCOPY(IDFT(1),KHV(ILAY)) IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(KHV(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN ENDIF !## vka ITOPIC=TKVA; PRJILIST=ITOPIC; SCL_D=PBMAN%INT(TKVA); SCL_U=2; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(I.EQ.1)THEN IF(FNAMES(I)%ICNST.EQ.2)THEN; IF(.NOT.IDFREAD(KVA(ILAY),FNAMES(1)%FNAME,0))RETURN; ENDIF ELSE CALL IDFCOPY(IDFT(1),KVA(ILAY)) IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(KVA(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN ENDIF IF(I.EQ.1)THEN MINDX=MIN(TOP(ILAY)%DX,BOT(ILAY)%DX,KHV(ILAY)%DX,KVA(ILAY)%DX) CALL IDFCOPY(PRJIDF,IDFT(1)); IDFT(1)%DX=MINDX; IDFT(1)%DY=IDFT(1)%DX; IDFT(1)%IEQ=0 CALL UTL_IDFSNAPTOGRID(IDFT(1)%XMIN,IDFT(1)%XMAX,IDFT(1)%YMIN,IDFT(1)%YMAX,IDFT(1)%DX,IDFT(1)%NCOL,IDFT(1)%NROW) IF(.NOT.IDFALLOCATEX(IDFT(1)))STOP 'CANNOT ALLOCATE MEMORY FOR IDFT(1)' IF(.NOT.IDFALLOCATESXY(IDFT(1)))STOP 'CANNOT ALLOCATE MEMORY FOR IDFT(1)' !## compute transmissivity/total vertical resistance in node ELSE DO J=1,SIZE(IDFT); CALL IDFCOPY(TOP(ILAY),IDFT(J)); ENDDO DO IROW=1,TOP(ILAY)%NROW; DO ICOL=1,TOP(ILAY)%NCOL T1=TOP(ILAY)%X(ICOL,IROW); IDFT(1)%X(ICOL,IROW)=T1 B1=BOT(ILAY)%X(ICOL,IROW); IDFT(2)%X(ICOL,IROW)=B1 DO J=3,SIZE(IDFT); IDFT(J)%X(ICOL,IROW)=IDFT(J)%NODATA; ENDDO IF(T1.EQ.TOP(ILAY)%NODATA.OR.B1.EQ.BOT(ILAY)%NODATA)CYCLE !## make sure there is no negative thickness IF(B1.GT.T1)B1=T1 IF(T1-B1.GT.0.0D0)THEN KH=KHV(ILAY)%X(ICOL,IROW); VA=KVA(ILAY)%X(ICOL,IROW) IF(VA.LE.0.0D0)VA=1.0D0 KD=(T1-B1)* KH; VC=(T1-B1)/(KH*VA) ELSE KD=0.0D0 VC=0.0D0 ENDIF IDFT(3)%X(ICOL,IROW)=KD IDFT(4)%X(ICOL,IROW)=0.5D0*VC ENDDO; ENDDO CALL IDFDEALLOCATEX(KHV(ILAY)); CALL IDFDEALLOCATEX(KVA(ILAY)) !## scale top to modelnetwork CALL IDFCOPY(PRJIDF,TOP(ILAY)) IF(.NOT.IDFREADSCALE_GETX(IDFT(1),TOP(ILAY),2,1,0.0D0))RETURN !## scale bottom to modelnetwork CALL IDFCOPY(PRJIDF,BOT(ILAY)) IF(.NOT.IDFREADSCALE_GETX(IDFT(2),BOT(ILAY),2,1,0.0D0))RETURN !## scale transmissivity to modelnetwork in x-direction CALL IDFCOPY(PRJIDF,KHV(ILAY)) IF(.NOT.IDFREADSCALE_GETX(IDFT(3),KHV(ILAY),19,1,0.0D0))RETURN !## scale transmissivity to modelnetwork in y-direction CALL IDFCOPY(PRJIDF,KHA(ILAY)) IF(.NOT.IDFREADSCALE_GETX(IDFT(3),KHA(ILAY),20,1,0.0D0))RETURN !## scale resistance to modelnetwork in z-direction CALL IDFCOPY(PRJIDF,KVA(ILAY)) IF(.NOT.IDFREADSCALE_GETX(IDFT(4),KVA(ILAY),6,1,0.0D0))RETURN !## compute permeability/vertical anisotropy from transmissivity/vertical resistance DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL !## top T1=TOP(ILAY)%X(ICOL,IROW) !## bottom B1=BOT(ILAY)%X(ICOL,IROW) IF(T1.EQ.TOP(ILAY)%NODATA.OR.B1.EQ.BOT(ILAY)%NODATA)CYCLE !## horizontal transmissivity x direction KD=KHV(ILAY)%X(ICOL,IROW) !## horizontal transmissivity y direction HA=KHA(ILAY)%X(ICOL,IROW) !## vertical resistance z direction VC=KVA(ILAY)%X(ICOL,IROW) IF(T1-B1.GT.0.0D0)THEN !## horizontal permeability KH=KD/(T1-B1) !## vertical permeability KV=(T1-B1)/VC ELSE KH=1.0D0 HA=1.0D0 KD=1.0D0 ENDIF KHV(ILAY)%X(ICOL,IROW)=KH !## horizontal anisotropy ratio KHA(ILAY)%X(ICOL,IROW)=HA/KD !## vertical anisotropy (kh/kv as modflow needs it) KVA(ILAY)%X(ICOL,IROW)=KH/KV ENDDO; ENDDO ITOPIC=TKHV; CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,KHV(ILAY),0,ITOPIC) ITOPIC=TKVA; CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,KVA(ILAY),0,ITOPIC) ENDIF ENDDO CALL IDFDEALLOCATE(IDFT,SIZE(IDFT)) ELSE !## hkv ITOPIC=TKHV; SCL_D=PBMAN%INT(TKHV); SCL_U=3; IINV=0; PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(KHV(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,KHV(ILAY),0,ITOPIC) !## vka ITOPIC=TKVA; SCL_D=PBMAN%INT(TKVA); SCL_U=2; IINV=1; PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(KVA(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,KVA(ILAY),0,ITOPIC) ENDIF ENDDO DO ILAY=1,PRJNLAY !## quasi-3d scheme add vertical hydraulic conductivity of interbed IF(LQBD.AND.ILAY.NE.PRJNLAY)THEN !## kvv ITOPIC=TKVV; SCL_D=PBMAN%INT(TKVV); SCL_U=3; IINV=0; PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(KVV(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,KVV(ILAY),0,ITOPIC) ENDIF ENDDO !## transient simulation IF(ISS.EQ.1)THEN DO ILAY=1,PRJNLAY WRITE(6,'(A)') '+Reading LPF-files Storage components ('//TRIM(RTOS(REAL(100*ILAY,8)/REAL(PRJNLAY,8),'F',2))//'%) ' !## sf1 - specific storage ITOPIC=TSTO; SCL_D=PBMAN%INT(TSTO); SCL_U=2; IINV=0 PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(STO(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,STO(ILAY),0,ITOPIC) !## sf2 - specific yield in case not confined IF(LAYCON(ILAY).NE.1)THEN ITOPIC=TSPY; SCL_D=PBMAN%INT(TSPY); SCL_U=2; IINV=0 PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(SPY(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,SPY(ILAY),0,ITOPIC) ENDIF ENDDO ENDIF DEALLOCATE(FNAMES,PRJILIST) PMANAGER_SAVEMF2005_LPF_READ=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_LPF_READ !####==================================================================== SUBROUTINE PMANAGER_SAVEMF2005_COMPUTE_KDW_VCW() !####==================================================================== IMPLICIT NONE INTEGER :: ILAY,IROW,ICOL REAL(KIND=DP_KIND) :: T,B,K,T1,T2,T3,KD !## skip if bcf6 is used IF(LBCF)RETURN !## make sure no negative-thicknesses in original set DO ILAY=1,PRJNLAY; DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(BND(ILAY)%X(ICOL,IROW).EQ.0)CYCLE IF(ILAY.GT.1)TOP(ILAY)%X(ICOL,IROW)=MIN(TOP(ILAY)%X(ICOL,IROW),BOT(ILAY-1)%X(ICOL,IROW)) BOT(ILAY)%X(ICOL,IROW)=MIN(TOP(ILAY)%X(ICOL,IROW),BOT(ILAY)%X(ICOL,IROW)) ENDDO; ENDDO; ENDDO !## compute transmissivity - could be used by packages to assign to modellayers DO ILAY=1,PRJNLAY; DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(BND(ILAY)%X(ICOL,IROW).EQ.0)THEN KDW(ILAY)%X(ICOL,IROW)=0.0D0 CYCLE ENDIF T=TOP(ILAY)%X(ICOL,IROW); B=BOT(ILAY)%X(ICOL,IROW); K=KHV(ILAY)%X(ICOL,IROW) KD=(T-B)*K; KD=MAX(PBMAN%MINKD,KD) IF(T-B.GT.0.0D0)THEN KHV(ILAY)%X(ICOL,IROW)=KD/(T-B) ELSE KHV(ILAY)%X(ICOL,IROW)=1.0D0 ENDIF IF(T.NE.TOP(ILAY)%NODATA.AND.B.NE.BOT(ILAY)%NODATA.AND.K.NE.KHV(ILAY)%NODATA)THEN KDW(ILAY)%X(ICOL,IROW)=(T-B)*KHV(ILAY)%X(ICOL,IROW) ELSE KDW(ILAY)%X(ICOL,IROW)=HNOFLOW ENDIF ENDDO; ENDDO; ENDDO DO ILAY=1,PRJNLAY-1; DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(BND(ILAY)%X(ICOL,IROW).NE.0.AND.BND(ILAY+1)%X(ICOL,IROW).NE.0)THEN !## top aquifer T =0.5D0*(TOP(ILAY)%X(ICOL,IROW)-BOT(ILAY)%X(ICOL,IROW)) T1=0.0D0; IF(T.GT.0.0D0.AND. & KHV(ILAY)%X(ICOL,IROW).GT.0.0D0.AND. & KVA(ILAY)%X(ICOL,IROW).GT.0.0D0)T1=T/(KHV(ILAY)%X(ICOL,IROW)/KVA(ILAY)%X(ICOL,IROW)) !## intermediate aquitard T =BOT(ILAY)%X(ICOL,IROW)-TOP(ILAY+1)%X(ICOL,IROW) T2=0.0D0 !## zero permeability - make sure resistance is equal to minc IF(KVV(ILAY)%X(ICOL,IROW).LE.0.0D0)THEN IF(T.GT.0.0D0)THEN IF(PBMAN%MINC.GT.0.0D0)THEN KVV(ILAY)%X(ICOL,IROW)=T/PBMAN%MINC ELSE KVV(ILAY)%X(ICOL,IROW)=1.0D0 ENDIF ELSE !## irrelevant but need to have some value otherwise MF turns it into inactive nodes KVV(ILAY)%X(ICOL,IROW)=1.0D0 ENDIF ENDIF T2=T/KVV(ILAY)%X(ICOL,IROW) !## bottom aquifer T =0.5D0*(TOP(ILAY+1)%X(ICOL,IROW)-BOT(ILAY+1)%X(ICOL,IROW)) ! IF(T.GT.0.0D0.AND.KHV(ILAY+1)%X(ICOL,IROW).LE.0.0D0)THEN ! WRITE(*,'(/3G15.7,2I5/)') T,KHV(ILAY+1)%X(ICOL,IROW),KVA(ILAY+1)%X(ICOL,IROW),ILAY,IROW,ICOL ! ENDIF ! T3=0.0D0; IF(T.GT.0.0D0)T3=T/(KHV(ILAY+1)%X(ICOL,IROW)/KVA(ILAY+1)%X(ICOL,IROW)) T3=0.0D0; IF(T.GT.0.0D0.AND. & KHV(ILAY+1)%X(ICOL,IROW).GT.0.0D0.AND. & KVA(ILAY+1)%X(ICOL,IROW).GT.0.0D0)T3=T/(KHV(ILAY+1)%X(ICOL,IROW)/KVA(ILAY+1)%X(ICOL,IROW)) !## total resistance VCW(ILAY)%X(ICOL,IROW)=T1+T2+T3 ELSE VCW(ILAY)%X(ICOL,IROW)=HNOFLOW ENDIF ENDDO; ENDDO; ENDDO END SUBROUTINE PMANAGER_SAVEMF2005_COMPUTE_KDW_VCW !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_LPF_SAVE(DIR,DIRMNAME,IBATCH,ISS) !####==================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),PARAMETER :: WETDRYTHRESS=0.1D0 !## percentage of aquifer CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: IBATCH,ISS REAL(KIND=DP_KIND) :: WETFCT,T,KD,D,NT INTEGER :: IU,ILAY,IFBND,IHDWET,IWETIT,IROW,ICOL,JR,JC LOGICAL :: LEX PMANAGER_SAVEMF2005_LPF_SAVE=.TRUE.; IF(PBMAN%IFORMAT.EQ.3)RETURN; IF(.NOT.LLPF)RETURN !## use lpf6 PMANAGER_SAVEMF2005_LPF_SAVE=.FALSE. IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.LPF7'//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.LPF7'//'...' !## construct lpf7-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.LPF7',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# LPF7 File Generated by '//TRIM(UTL_IMODVERSION()) !## dry cells negative for restart IF(PBMAN%SPECIFICSTORAGE.EQ.0)THEN LINE=TRIM(ITOS(IBCFCB))//','//TRIM(RTOS(HNOFLOW,'G',7))//',0,STORAGECOEFFICIENT,THICKSTRT,CONSTANTCV,NOCVCORRECTION' ELSE LINE=TRIM(ITOS(IBCFCB))//','//TRIM(RTOS(HNOFLOW,'G',7))//',0,THICKSTRT,CONSTANTCV,NOCVCORRECTION' ENDIF IF(PBMAN%MINKD.NE.0.0D0)LINE=TRIM(LINE)//',MINKD '//TRIM(RTOS(PBMAN%MINKD,'G',5)) IF(PBMAN%MINC .NE.0.0D0)LINE=TRIM(LINE)//',MINC ' //TRIM(RTOS(PBMAN%MINC ,'G',5)) WRITE(IU,'(A)') TRIM(LINE) !## laycon=1: 0 !## laycon=2: 1 !## laycon=3:-1 !## laycon=4: constant head !## laytyp code LINE=''; DO ILAY=1,PRJNLAY SELECT CASE (LAYCON(ILAY)) CASE (1); LINE=TRIM(LINE)//' 0,' !## confined CASE (2); LINE=TRIM(LINE)//' 1,' !## convertible head-bot CASE (3); LINE=TRIM(LINE)//'-1,' !## convertible shd/top-bot CASE (4); LINE=TRIM(LINE)//' 0,' !## constant head END SELECT IF(MOD(ILAY,40).EQ.0)THEN; WRITE(IU,'(A)') LINE(:LEN_TRIM(LINE)-1); LINE=''; ENDIF ENDDO; IF(LEN_TRIM(LINE).NE.0)WRITE(IU,'(A)') LINE(:LEN_TRIM(LINE)-1) !## layavg code LINE=''; DO ILAY=1,PRJNLAY; LINE=TRIM(LINE)//'0,' IF(MOD(ILAY,40).EQ.0)THEN; WRITE(IU,'(A)') LINE(:LEN_TRIM(LINE)-1); LINE=''; ENDIF ENDDO; IF(LEN_TRIM(LINE).NE.0)WRITE(IU,'(A)') LINE(:LEN_TRIM(LINE)-1) !## chani code IF(PBMAN%APPLYTC.EQ.0)THEN LINE=''; DO ILAY=1,PRJNLAY; LINE=TRIM(LINE)//'1.0,' IF(MOD(ILAY,20).EQ.0)THEN; WRITE(IU,'(A)') LINE(:LEN_TRIM(LINE)-1); LINE=''; ENDIF ENDDO; IF(LEN_TRIM(LINE).NE.0)WRITE(IU,'(A)') LINE(:LEN_TRIM(LINE)-1) ELSE LINE=''; DO ILAY=1,PRJNLAY; LINE=TRIM(LINE)//'0.0,' IF(MOD(ILAY,20).EQ.0)THEN; WRITE(IU,'(A)') LINE(:LEN_TRIM(LINE)-1); LINE=''; ENDIF ENDDO; IF(LEN_TRIM(LINE).NE.0)WRITE(IU,'(A)') LINE(:LEN_TRIM(LINE)-1) ENDIF !## lvka code LINE=''; DO ILAY=1,PRJNLAY; LINE=TRIM(LINE)//'1,' IF(MOD(ILAY,20).EQ.0)THEN; WRITE(IU,'(A)') LINE(:LEN_TRIM(LINE)-1); LINE=''; ENDIF ENDDO; IF(LEN_TRIM(LINE).NE.0)WRITE(IU,'(A)') LINE(:LEN_TRIM(LINE)-1) !## laywet code - if unconfined always use wetdry LINE=''; IWETIT=0 DO ILAY=1,PRJNLAY !## not unconfined IF(LAYCON(ILAY).NE.2)LINE=TRIM(LINE)//'0,' !## unconfined IF(LAYCON(ILAY).EQ.2)THEN; LINE=TRIM(LINE)//'1,'; IWETIT=1; ENDIF IF(MOD(ILAY,20).EQ.0)THEN; WRITE(IU,'(A)') LINE(:LEN_TRIM(LINE)-1); LINE=''; ENDIF ENDDO; IF(LEN_TRIM(LINE).NE.0)WRITE(IU,'(A)') LINE(:LEN_TRIM(LINE)-1) !## include wetdry options IF(IWETIT.EQ.1)THEN !## At iterations for which no wetting is allowed, cells may still convert to dry WETFCT=0.5D0 !## multiplication to determine head in dry cell IHDWET=0 !## option to compute rewetted model layers; h = BOT + WETFCT (hn - BOT) (most stable) !## see McDonald and other: A method of converting no-flow cells to variable-head cell ! IHDWET=1 !## option to compute rewetted head as h + BOT + WETFCT(THRESS) LINE=TRIM(RTOS(WETFCT,'F',2))//','//TRIM(ITOS(IWETIT))//','//TRIM(ITOS(IHDWET)) WRITE(IU,'(A)') TRIM(LINE) ENDIF !## check all on active cells, except wetdry IFBND=1 !## if ipestp and storage is optimized LEX=.FALSE.; IF(PBMAN%IPESTP.EQ.1.OR.PBMAN%IIES.EQ.1)THEN DO I=1,SIZE(PEST%PARAM); IF(PEST%PARAM(I)%PPARAM.EQ.'KH')THEN; LEX=.TRUE.; EXIT; ENDIF; ENDDO ENDIF DO ILAY=1,PRJNLAY IF(PBMAN%MINKD.GT.0.0D0)THEN DO IROW=1,KHV(ILAY)%NROW; DO ICOL=1,KHV(ILAY)%NCOL D=TOP(ILAY)%X(ICOL,IROW)-BOT(ILAY)%X(ICOL,IROW) IF(D.GT.0.0D0)THEN KD=D*KHV(ILAY)%X(ICOL,IROW) IF(KD.LT.PBMAN%MINKD)KHV(ILAY)%X(ICOL,IROW)=PBMAN%MINKD/D ENDIF ENDDO; ENDDO ENDIF !## include a minor modification to ensure a save in ARR files IFBND=1; IF(LEX)IFBND=-1 !## hk IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\LPF7\HK_L'//TRIM(ITOS(ILAY))//'.ARR', & KHV(ILAY),0,IU,ILAY,IFBND))RETURN IF(PBMAN%APPLYTC.EQ.1)THEN !## include a minor modification to ensure a save in ARR files IFBND=1; IF(LEX)IFBND=-1 !## hk IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\LPF7\HA_L'//TRIM(ITOS(ILAY))//'.ARR', & KHA(ILAY),0,IU,ILAY,IFBND))RETURN ENDIF !## include a minor modification to ensure a save in ARR files IFBND=1; IF(LEX)IFBND=-1 !## vka IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\LPF7\VKA_L'//TRIM(ITOS(ILAY))//'.ARR', & KVA(ILAY),0,IU,ILAY,IFBND))RETURN !## transient simulation IF(ISS.EQ.1)THEN !## sf1 - specific storage IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\LPF7\SF1_L'//TRIM(ITOS(ILAY))//'.ARR', & STO(ILAY),0,IU,ILAY,IFBND))RETURN !## sf2 - specific yield in case not confined IF(LAYCON(ILAY).EQ.2)THEN IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\LPF7\SF2_L'//TRIM(ITOS(ILAY))//'.ARR', & SPY(ILAY),0,IU,ILAY,IFBND))RETURN ENDIF ENDIF !## quasi-3d scheme add vertical hydraulic conductivity of interbed IF(LQBD.AND.ILAY.NE.PRJNLAY)THEN !## kvv IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\LPF7\VKCB_L'//TRIM(ITOS(ILAY))//'.ARR', & KVV(ILAY),0,IU,ILAY,IFBND))RETURN ENDIF !## add wetdry options - lakes/inactive cells cannot be rewetted) IF(LAYCON(ILAY).EQ.2.AND.IWETIT.EQ.1)THEN !## fill wetdry thresholds PRJIDF%X=0.0D0 DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(BND(ILAY)%X(ICOL,IROW).GT.0)THEN ! T=0.0D0; NT=0.0D0; DO JR=MAX(1,IROW-1),MIN(PRJIDF%NROW,IROW+1) ! DO JC=MAX(1,ICOL-1),MIN(PRJIDF%NCOL,ICOL+1) ! IF(BND(ILAY)%X(JC,JR).GT.0)THEN ! T =T+ TOP(ILAY)%X(JC,JR)-BOT(ILAY)%X(JC,JR) ! NT=NT+1.0D0 ! ENDIF ! ENDDO ! ENDDO ! IF(NT.GT.0.0D0)THEN ! T=T/NT T=TOP(ILAY)%X(ICOL,IROW)-BOT(ILAY)%X(ICOL,IROW) ! !## only cells below can rewet - more stable ! T=WETDRYTHRESS*T IF(ILAY.LT.PRJNLAY)THEN ! PRJIDF%X(ICOL,IROW)=-T !MIN(WETDRYTHRESS,MAX(0.0D0,T)) PRJIDF%X(ICOL,IROW)=-MIN(WETDRYTHRESS,MAX(0.0D0,T)) !## lowest layer cannot become dry ELSE PRJIDF%X(ICOL,IROW)= MIN(WETDRYTHRESS,MAX(0.0,T)) ! PRJIDF%X(ICOL,IROW)= T !MIN(WETDRYTHRESS,MAX(0.0,T)) ENDIF ! ELSE ! PRJIDF%X(ICOL,IROW)= 0.0D0 ! ENDIF ENDIF ENDDO; ENDDO IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\LPF7\WETDRY_L'//TRIM(ITOS(ILAY))//'.ARR', & PRJIDF,0,IU,ILAY,0))RETURN ENDIF !The two most important variables that affect stability are the wetting !threshold and which neighboring cells are checked to determine if a cell !should be wetted. Both of these are controlled through WETDRY. It is !often useful to look at the output file and identify cells that convert !repeatedly from wet to dry. Try raising the wetting threshold for those !cells. It may also be worthwhile looking at the boundary conditions !associated with dry cells. ENDDO CLOSE(IU) PMANAGER_SAVEMF2005_LPF_SAVE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_LPF_SAVE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_NPF_SAVE(DIR,DIRMNAME,IBATCH) !####==================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),PARAMETER :: WETDRYTHRESS=0.1D0 CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: IBATCH REAL(KIND=DP_KIND) :: WETFCT,T,B,THICK,ROT,H INTEGER :: IU,ILAY,JLAY,IFBND,IHDWET,IWETIT,IROW,ICOL LOGICAL :: LEX PMANAGER_SAVEMF2005_NPF_SAVE=.TRUE.; IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)RETURN; IF(.NOT.LNPF)RETURN !## use npf6 PMANAGER_SAVEMF2005_NPF_SAVE=.FALSE. IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.NPF6'//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.NPF6'//'...' !## construct npf6-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.NPF6',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# NPF6 File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(/A/)') '#General Options' WRITE(IU,'(A)') 'BEGIN OPTIONS' IF(PRJNLAY.GT.1)WRITE(IU,'(A)') ' K33OVERK' LEX=.FALSE. IF(ASSOCIATED(PBMAN%ISAVE(TBND)%ILAY))LEX=.TRUE. IF(ASSOCIATED(PBMAN%ISAVE(TSTO)%ILAY))LEX=.TRUE. IF(ASSOCIATED(PBMAN%ISAVE(TSPY)%ILAY))LEX=.TRUE. IF(ASSOCIATED(PBMAN%ISAVE(TKHV)%ILAY))LEX=.TRUE. IF(ASSOCIATED(PBMAN%ISAVE(TKVV)%ILAY))LEX=.TRUE. IF(ASSOCIATED(PBMAN%ISAVE(TKVA)%ILAY))LEX=.TRUE. IF(LEX)WRITE(IU,'(A)') ' SAVE_FLOWS' IF(TOPICS(TANI)%IACT_MODEL.EQ.0)THEN !## arithmetic mean thickness and harmonic-mean k WRITE(IU,'(A)') ' ALTERNATIVE_CELL_AVERAGING AMT-HMK' ENDIF ! CASE (1); LINE=TRIM(LINE)//' 0,' !## confined ! CASE (2); LINE=TRIM(LINE)//' 1,' !## convertible head-bot ! CASE (3); LINE=TRIM(LINE)//'-1,' !## convertible shd/top-bot ! CASE (4); LINE=TRIM(LINE)//' 0,' !## constant head DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE !## convertible shd/top-bot IF(LAYCON(ILAY).EQ.3)THEN !THICKSTRT—indicates that cells having a negative ICELLTYPE are confined, and their cell thickness WRITE(IU,'(A)') ' THICKSTRT'; EXIT ENDIF ENDDO !If these keywords are not specified, then the default condition is to calculate the !vertical conductance at the start of the simulation using the initial head and the cell properties. The !vertical conductance remains constant for the entire simulation. WRITE(IU,'(A)') ' [PERCHED]' !## see if layer is unconfined and wettable WETFCT=0.1D0 !## multiplication to determine head in dry cell IHDWET=0 !## is a keyword and integer flag that determines which equation is used to define the initial head at cells that become wet. IWETIT=0 !## is a keyword and iteration interval for attempting to wet cells DO ILAY=1,PRJNLAY !## unconfined IF(LAYCON(ILAY).EQ.2)THEN !## issue above seems to be incorrect as resistance is removed if no water exists !WRITE(IU,'(A)') ' VARIABLECV DEWATERED' !## vertical flux dampens as thickness of saturation declines, correct approach IF(PBMAN%NEWTON.EQ.0)THEN IWETIT=1 !## is a keyword and iteration interval for attempting to wet cells !## optie perched laat laagje water staan WRITE(IU,'(A)') ' PERCHED' WRITE(IU,'(A)') ' REWET WETFCT '//TRIM(RTOS(WETFCT,'F',3))// & ' IWETIT '//TRIM(ITOS(IWETIT))//' IHDWET '//TRIM(ITOS(IHDWET)) ENDIF ENDIF IF(LAYCON(ILAY).EQ.2.OR.LAYCON(ILAY).EQ.3)THEN WRITE(IU,'(A)') ' SAVE_SATURATION' EXIT ENDIF ENDDO IF(TOPICS(TANI)%IACT_MODEL.NE.0)THEN WRITE(IU,'(A)') ' XT3D'! [RHS]]' ENDIF ! WRITE(IU,'(A)') ' [SAVE_SPECIFIC_DISCHARGE]' WRITE(IU,'(A)') 'END OPTIONS' WRITE(IU,'(/A/)') '#Geology Options' WRITE(IU,'(A)') 'BEGIN GRIDDATA' WRITE(IU,'(A)') ' ICELLTYPE LAYERED' DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE IF(LAYCON(ILAY).EQ.1)WRITE(IU,'(A)') ' CONSTANT 0' !## confined !## write array, might be overwritten by riv/ghb-package IF(LAYCON(ILAY).NE.1)THEN IF(LAYCON(ILAY).EQ.2)PRJIDF%X= 1.0D0 IF(LAYCON(ILAY).EQ.3)PRJIDF%X=-1.0D0 DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL !## make sure an inactive cells/cells that are skipped cannot be rewetted IF(BND(ILAY)%X(ICOL,IROW).EQ.0.0D0)PRJIDF%X(ICOL,IROW)=0.0D0 T=TOP(ILAY)%X(ICOL,IROW); B=BOT(ILAY)%X(ICOL,IROW) IF(T-B.LE.0.0D0)PRJIDF%X(ICOL,IROW)=0.0D0 ! !## thickness of unsaturated zone significant enough to apply unconfinedness? ! T=TOP(1)%X(ICOL,IROW); H=SHD(ILAY)%X(ICOL,IROW) ! IF(PRJIDF%X(ICOL,IROW).NE.0.0D0.AND.T-H.LT.50.0D0)THEN ! IF(H.GT.BOT(ILAY)%X(ICOL,IROW))THEN ! PRJIDF%X(ICOL,IROW)=0.0D0 ! ENDIF ! ENDIF ENDDO; ENDDO IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\NPF6\ICELLTYPE_L'//TRIM(ITOS(ILAY))//'.ARR', & PRJIDF,1,IU,ILAY,-1))RETURN ENDIF ! IF(LAYCON(ILAY).EQ.3)WRITE(IU,'(A)') ' CONSTANT -1' !## convertible shd/top-bot ENDDO !## mf6 needs minimal k for layers with thickness of zero DO ILAY=1,SIZE(PBMAN%ILAY) DO IROW=1,KHV(ILAY)%NROW; DO ICOL=1,KHV(ILAY)%NCOL THICK=TOP(ILAY)%X(ICOL,IROW)-BOT(ILAY)%X(ICOL,IROW) IF(THICK.LE.0.0D0)THEN KHV(ILAY)%X(ICOL,IROW)=1.0D0 ENDIF ENDDO; ENDDO ENDDO !## if ipestp and permeability is optimized LEX=.FALSE.; IF(PBMAN%IPESTP.EQ.1)THEN DO I=1,SIZE(PEST%PARAM); IF(PEST%PARAM(I)%PPARAM.EQ.'KH')THEN; LEX=.TRUE.; EXIT; ENDIF; ENDDO ENDIF WRITE(IU,'(A)') ' K LAYERED' JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1 !## do not check with boundary for mf6; include a minor modification to ensure a save in ARR files IFBND=0; IF(LEX)IFBND=-1 !## hk IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\NPF6\K_L'//TRIM(ITOS(JLAY))//'.ARR', & KHV(ILAY),0,IU,ILAY,IFBND))RETURN ENDDO !## vertical k-value WRITE(IU,'(A)') ' K33 LAYERED' JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1 PRJIDF%X=0.0D0 DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(BND(ILAY)%X(ICOL,IROW).NE.0)THEN PRJIDF%X(ICOL,IROW)=1.0D0/KVA(ILAY)%X(ICOL,IROW) ! PRJIDF%X(ICOL,IROW)=KHV(ILAY)%X(ICOL,IROW)/KVA(ILAY)%X(ICOL,IROW) ELSE PRJIDF%X(ICOL,IROW)=1.0D0 ENDIF ENDDO; ENDDO !## do not check with boundary for mf6; include a minor modification to ensure a save in ARR files IFBND=0; IF(LEX)IFBND=-1 IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\NPF6\K33_L'//TRIM(ITOS(JLAY))//'.ARR', & PRJIDF,0,IU,ILAY,IFBND))RETURN ENDDO !## use ani - compute k-minor IF(TOPICS(TANI)%IACT_MODEL.NE.0)THEN WRITE(IU,'(A)') ' K22 LAYERED' JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1 PRJIDF%X=0.0D0 DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(BND(ILAY)%X(ICOL,IROW).NE.0)THEN PRJIDF%X(ICOL,IROW)=KHV(ILAY)%X(ICOL,IROW)*ANF(ILAY)%X(ICOL,IROW) ELSE PRJIDF%X(ICOL,IROW)=1.0D0 ENDIF ENDDO; ENDDO !## do not check with boundary for mf6; include a minor modification to ensure a save in ARR files IFBND=0; IF(PBMAN%IPESTP.EQ.1)IFBND=-1 IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\NPF6\K22_L'//TRIM(ITOS(JLAY))//'.ARR', & PRJIDF,0,IU,ILAY,IFBND))RETURN ENDDO WRITE(IU,'(A)') ' ANGLE1 LAYERED' JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1 PRJIDF%X=0.0D0 DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(BND(ILAY)%X(ICOL,IROW).NE.0)THEN !## angle ROT=(360.0D0-ANA(ILAY)%X(ICOL,IROW))+90.0D0 IF(ROT.GT.360.0D0)ROT=ROT-360.0D0 PRJIDF%X(ICOL,IROW)=ROT ELSE PRJIDF%X(ICOL,IROW)=0.0D0 ENDIF ENDDO; ENDDO IFBND=0 IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\NPF6\ANGLE1_L'//TRIM(ITOS(JLAY))//'.ARR', & PRJIDF,0,IU,ILAY,IFBND))RETURN ENDDO ! WRITE(IU,'(A)') ' ANGLE2 LAYERED' ! WRITE(IU,'(A)') ' ANGLE3 LAYERED' ENDIF IF(IWETIT.EQ.1)THEN WRITE(IU,'(A)') ' WETDRY LAYERED' JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1 ! !## add wetdry options - lakes/inactive cells cannot be rewetted) ! IF(LAYCON(ILAY).NE.1)THEN !## fill wetdry thresholds PRJIDF%X=0.0D0 DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(BND(ILAY)%X(ICOL,IROW).GT.0)THEN T=TOP(ILAY)%X(ICOL,IROW)-BOT(ILAY)%X(ICOL,IROW) !## only cells below can rewet - more stable IF(ILAY.LT.PRJNLAY)THEN PRJIDF%X(ICOL,IROW)=-MIN(WETDRYTHRESS,T) ELSE PRJIDF%X(ICOL,IROW)= MIN(WETDRYTHRESS,T) ENDIF ENDIF ENDDO; ENDDO IFBND=0 IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\NPF6\WETDRY_L'//TRIM(ITOS(JLAY))//'.ARR', & PRJIDF,0,IU,ILAY,IFBND))RETURN ! ENDIF ENDDO ENDIF WRITE(IU,'(A)') 'END GRIDDATA' CLOSE(IU) PMANAGER_SAVEMF2005_NPF_SAVE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_NPF_SAVE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_SCR_READ(IPRT) !####==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IPRT INTEGER :: ILAY,SCL_D,SCL_U,IINV,ITOPIC,NSYS,NTOP,ISYS,KTOP PMANAGER_SAVEMF2005_SCR_READ=.TRUE. IF(TOPICS(TSCR)%IACT_MODEL.EQ.0)RETURN IF(PBMAN%IFORMAT.EQ.3)RETURN ITOPIC=TSCR ALLOCATE(FNAMES(TOPICS(ITOPIC)%NSUBTOPICS),PRJILIST(1)); PRJILIST=ITOPIC PMANAGER_SAVEMF2005_SCR_READ=.FALSE. !## allocate memory for packages NTOP=SIZE(TOPICS(ITOPIC)%STRESS(1)%FILES,1); NSYS=SIZE(TOPICS(ITOPIC)%STRESS(1)%FILES,2) !## number of systems DO ISYS=1,NSYS IF(PMANAGER_GETFNAMES(0,0,ISYS,0,0).LE.0)RETURN !## thickness for scr-package SCL_D=PBMAN%INT(ITOPIC); SCL_U=2; IINV=0 WRITE(6,'(A)') '+Reading SCR-files ('//TRIM(RTOS(REAL(100*ISYS,8)/REAL(NSYS,8),'F',2))//'%)' !## thickness ILAY=FNAMES(1)%ILAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(THK(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,THK(ILAY),0,ITOPIC) !## arr ILAY=FNAMES(2)%ILAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(ARR(ILAY),ITOPIC,2,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,ARR(ILAY),0,ITOPIC) !## bcr ILAY=FNAMES(3)%ILAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(BCR(ILAY),ITOPIC,3,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,BCR(ILAY),0,ITOPIC) !## cca ILAY=FNAMES(4)%ILAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(CCA(ILAY),ITOPIC,4,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,CCA(ILAY),0,ITOPIC) !## voi ILAY=FNAMES(5)%ILAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(VOI(ILAY),ITOPIC,5,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,VOI(ILAY),0,ITOPIC) !## sub ILAY=FNAMES(6)%ILAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(SUB(ILAY),ITOPIC,6,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,SUB(ILAY),0,ITOPIC) IF(PBMAN%SCR_ISTPCS.EQ.0.OR.PBMAN%SCR_ISTPCS.EQ.3)THEN ILAY=FNAMES(7)%ILAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(PCS(ILAY),ITOPIC,7,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,PCS(ILAY),0,ITOPIC) ELSEIF(PBMAN%SCR_ISTPCS.EQ.1.OR.PBMAN%SCR_ISTPCS.EQ.3)THEN ILAY=FNAMES(8)%ILAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(PC0(ILAY),ITOPIC,8,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,PC0(ILAY),0,ITOPIC) ELSEIF(PBMAN%SCR_ISTPCS.EQ.2.OR.PBMAN%SCR_ISTPCS.EQ.3)THEN ILAY=FNAMES(9)%ILAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(OCR(ILAY),ITOPIC,9,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,OCR(ILAY),0,ITOPIC) ENDIF IF(PBMAN%SCR_ISTPCS.EQ.3)THEN ILAY=FNAMES(10)%ILAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(TH0(ILAY),ITOPIC,10,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,TH0(ILAY),0,ITOPIC) ENDIF ILAY=FNAMES(11)%ILAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(GL0(ILAY),ITOPIC,11,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,GL0(ILAY),0,ITOPIC) ILAY=FNAMES(12)%ILAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(SGS(ILAY),ITOPIC,12,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,SGS(ILAY),0,ITOPIC) ILAY=FNAMES(13)%ILAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(SGM(ILAY),ITOPIC,13,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,SGM(ILAY),0,ITOPIC) ENDDO DEALLOCATE(FNAMES,PRJILIST) PMANAGER_SAVEMF2005_SCR_READ=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_SCR_READ !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_SCR_SAVE(DIR,DIRMNAME,IBATCH) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: IBATCH INTEGER :: I,IU,ILAY,JLAY,IFBND,IROW,ICOL,NSYSTEM,NOBSSUB INTEGER,DIMENSION(:),ALLOCATABLE :: ISCRLAY !## return if modflow6 export PMANAGER_SAVEMF2005_SCR_SAVE=.TRUE.; IF(TOPICS(TSCR)%IACT_MODEL.EQ.0)RETURN IF(PBMAN%IFORMAT.EQ.3)RETURN !## use scr IF(TOPICS(TSCR)%IACT_MODEL.EQ.0)RETURN PMANAGER_SAVEMF2005_SCR_SAVE=.FALSE. IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.SCR1'//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.SCR1'//'...' !## construct scr-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.SCR1',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN !prjnlay is aantla lagen met boeomdaing ALLOCATE(ISCRLAY(PRJNLAY)); ISCRLAY=0 !## determine how many layers with interbeds JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1; I=0 DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(BND(ILAY)%X(ICOL,IROW).LE.0.0)THK(ILAY)%X(ICOL,IROW)=0.0D0 IF(THK(ILAY)%X(ICOL,IROW).GT.0.0)ISCRLAY(JLAY)=1 ENDDO; ENDDO ENDDO NSYSTEM=0; DO ILAY=1,PRJNLAY; IF(ISCRLAY(ILAY).EQ.1)NSYSTEM=NSYSTEM+1; ENDDO !## number of observations NOBSSUB=0 WRITE(IU,'(6I10)') ISCRCB,PBMAN%SCR_ISCROC,NSYSTEM,NOBSSUB,PBMAN%SCR_IMETHOD,PBMAN%SCR_ISTPCS LINE=''; DO I=1,PRJNLAY; IF(ISCRLAY(I).EQ.0)CYCLE; LINE=TRIM(LINE)//' '//TRIM(ITOS(I)); ENDDO WRITE(IU,'(A)') TRIM(LINE) JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1 !## gl0 IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\SCR1\GL0_L'//TRIM(ITOS(JLAY))//'.ARR', & GL0(ILAY),0,IU,ILAY,IFBND))RETURN !## sgs IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\SCR1\SGS_L'//TRIM(ITOS(JLAY))//'.ARR', & SGS(ILAY),0,IU,ILAY,IFBND))RETURN !## sgm IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\SCR1\SGM_L'//TRIM(ITOS(JLAY))//'.ARR', & SGM(ILAY),0,IU,ILAY,IFBND))RETURN ENDDO ! WRITE(IU,'(A)') 'CONSTANT 0.0 GL0' ! WRITE(IU,'(A)') 'CONSTANT 1.6 SGM' ! WRITE(IU,'(A)') 'CONSTANT 1.8 SGS' JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1 !## skip none-available interbed IF(ISCRLAY(ILAY).EQ.0)CYCLE !## thickness IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\SCR1\THK_L'//TRIM(ITOS(JLAY))//'.ARR', & THK(ILAY),0,IU,ILAY,IFBND))RETURN IF(PBMAN%SCR_ISTPCS.EQ.3)THEN IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\SCR1\TH0_L'//TRIM(ITOS(JLAY))//'.ARR', & TH0(ILAY),0,IU,ILAY,IFBND))RETURN ENDIF !## arr IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\SCR1\ARR_L'//TRIM(ITOS(JLAY))//'.ARR', & ARR(ILAY),0,IU,ILAY,IFBND))RETURN !## bcr IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\SCR1\BCR_L'//TRIM(ITOS(JLAY))//'.ARR', & BCR(ILAY),0,IU,ILAY,IFBND))RETURN !## cca IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\SCR1\CCA_L'//TRIM(ITOS(JLAY))//'.ARR', & CCA(ILAY),0,IU,ILAY,IFBND))RETURN !## voi IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\SCR1\VOI_L'//TRIM(ITOS(JLAY))//'.ARR', & VOI(ILAY),0,IU,ILAY,IFBND))RETURN !## sub IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\SCR1\SUB_L'//TRIM(ITOS(JLAY))//'.ARR', & SUB(ILAY),0,IU,ILAY,IFBND))RETURN ENDDO DEALLOCATE(ISCRLAY) JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1 IF(PBMAN%SCR_ISTPCS.EQ.0.OR.PBMAN%SCR_ISTPCS.EQ.3)THEN IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\SCR1\PCS_L'//TRIM(ITOS(JLAY))//'.ARR', & PCS(ILAY),0,IU,ILAY,IFBND))RETURN ENDIF IF(PBMAN%SCR_ISTPCS.EQ.1)THEN !.OR.PBMAN%SCR_ISTPCS.EQ.3)THEN IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\SCR1\PC0_L'//TRIM(ITOS(JLAY))//'.ARR', & PC0(ILAY),0,IU,ILAY,IFBND))RETURN ENDIF IF(PBMAN%SCR_ISTPCS.EQ.2)THEN !.OR.PBMAN%SCR_ISTPCS.EQ.3)THEN IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\SCR1\OCR'//TRIM(ITOS(JLAY))//'.ARR', & OCR(ILAY),0,IU,ILAY,IFBND))RETURN ENDIF ENDDO CLOSE(IU) PMANAGER_SAVEMF2005_SCR_SAVE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_SCR_SAVE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_CON_READ(IPRT) !####==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IPRT INTEGER :: ILAY,SCL_D,SCL_U,IINV,ITOPIC,NCON,IROW,ICOL PMANAGER_SAVEMF2005_CON_READ=.TRUE. IF(TOPICS(TCON)%IACT_MODEL.EQ.0)RETURN IF(PBMAN%IFORMAT.EQ.3.OR.WQ%VDF%MTDNCONC.EQ.1)RETURN IF(TOPICS(TVDF)%IACT_MODEL.EQ.0.OR.WQ%VDF%MTDNCONC.EQ.1)RETURN ALLOCATE(FNAMES(1),PRJILIST(1)) PMANAGER_SAVEMF2005_CON_READ=.FALSE. NCON=0; DO ILAY=1,PRJNLAY WRITE(6,'(A)') '+Reading CON-files ('//TRIM(RTOS(REAL(100*ILAY,8)/REAL(PRJNLAY,8),'F',2))//'%) ' !## concentration for vdf-package ITOPIC=TCON; SCL_D=PBMAN%INT(TCON); SCL_U=2; IINV=0 PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(CON(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,CON(ILAY),0,ITOPIC) DO IROW=1,CON(ILAY)%NROW; DO ICOL=1,CON(ILAY)%NCOL IF(BND(ILAY)%X(ICOL,IROW).NE.0)THEN IF(CON(ILAY)%X(ICOL,IROW).LT.0.0D0)THEN NCON=NCON+1; CON(ILAY)%X(ICOL,IROW)=0.0D0 ENDIF CON(ILAY)%X(ICOL,IROW)=(CON(ILAY)%X(ICOL,IROW)/WQ%VDF%DENSESLP)+WQ%VDF%DENSEREF ENDIF ENDDO; ENDDO ENDDO IF(NCON.GT.0)WRITE(*,'(/A,I10,A/)') 'Set ',NCON,' cells with concentration < 0 to 0.0' DEALLOCATE(FNAMES,PRJILIST) PMANAGER_SAVEMF2005_CON_READ=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_CON_READ !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_POR_READ(IPRT) !####==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IPRT INTEGER :: ILAY,SCL_D,SCL_U,IINV,ITOPIC PMANAGER_SAVEMF2005_POR_READ=.TRUE. IF(TOPICS(TPOR)%IACT_MODEL.EQ.0)RETURN IF(PBMAN%IFORMAT.EQ.3)RETURN ALLOCATE(FNAMES(1),PRJILIST(1)) PMANAGER_SAVEMF2005_POR_READ=.FALSE. DO ILAY=1,PRJNLAY WRITE(6,'(A)') '+Reading POR-files ('//TRIM(RTOS(REAL(100*ILAY,8)/REAL(PRJNLAY,8),'F',2))//'%) ' !## concentration for vdf-package ITOPIC=TPOR; SCL_D=PBMAN%INT(TPOR); SCL_U=2; IINV=0 PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(POR(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,POR(ILAY),0,ITOPIC) ENDDO DEALLOCATE(FNAMES,PRJILIST) PMANAGER_SAVEMF2005_POR_READ=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_POR_READ !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_CBI_READ(IPRT) !####==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IPRT INTEGER :: ILAY,SCL_D,SCL_U,IINV,ITOPIC PMANAGER_SAVEMF2005_CBI_READ=.TRUE. IF(TOPICS(TCBI)%IACT_MODEL.EQ.0)RETURN IF(PBMAN%IFORMAT.EQ.3)RETURN ALLOCATE(FNAMES(1),PRJILIST(1)) PMANAGER_SAVEMF2005_CBI_READ=.FALSE. DO ILAY=1,PRJNLAY WRITE(6,'(A)') '+Reading CBI-files ('//TRIM(RTOS(REAL(100*ILAY,8)/REAL(PRJNLAY,8),'F',2))//'%) ' !## boundary condition for concentrations (<0 constant conc. >0 variable conc =0 inactive for all conc.) !## cbi is not perse equal to ibound as it is the status of concentration ITOPIC=TCBI; SCL_D=PBMAN%INT(TCBI); SCL_U=2; IINV=0 PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(CBI(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,CBI(ILAY),0,ITOPIC) ENDDO DEALLOCATE(FNAMES,PRJILIST) PMANAGER_SAVEMF2005_CBI_READ=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_CBI_READ !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_SCO_READ(IPRT) !####==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IPRT INTEGER :: ILAY,SCL_D,SCL_U,IINV,ITOPIC PMANAGER_SAVEMF2005_SCO_READ=.TRUE. IF(TOPICS(TSCO)%IACT_MODEL.EQ.0)RETURN IF(PBMAN%IFORMAT.EQ.3)RETURN ALLOCATE(FNAMES(1),PRJILIST(1)) PMANAGER_SAVEMF2005_SCO_READ=.FALSE. DO ILAY=1,PRJNLAY WRITE(6,'(A)') '+Reading SCO-files ('//TRIM(RTOS(REAL(100*ILAY,8)/REAL(PRJNLAY,8),'F',2))//'%) ' !## concentration for vdf-package ITOPIC=TSCO; SCL_D=PBMAN%INT(TSCO); SCL_U=2; IINV=0 PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(SCO(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,SCO(ILAY),0,ITOPIC) ENDDO DEALLOCATE(FNAMES,PRJILIST) PMANAGER_SAVEMF2005_SCO_READ=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_SCO_READ !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_DSP_READSAVE(DIR,DIRMNAME,IBATCH,IPRT) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: IBATCH,IPRT INTEGER :: ILAY,SCL_D,SCL_U,IINV,ITOPIC,NTOP,NSYS,ISYS,KTOP,ICNST,IU,JLAY,IFBND REAL(KIND=DP_KIND) :: CNST,IMP,FCT REAL(KIND=DP_KIND),ALLOCATABLE, DIMENSION(:,:) :: XVAL PMANAGER_SAVEMF2005_DSP_READSAVE=.TRUE. IF(TOPICS(TDSP)%IACT_MODEL.EQ.0)RETURN IF(PBMAN%IFORMAT.EQ.3.OR.WQ%VDF%MTDNCONC.EQ.0)RETURN PMANAGER_SAVEMF2005_DSP_READSAVE=.FALSE. IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.DSP1'//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.DSP1'//'...' !## construct con1-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.DSP1',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN !## dispersion parameters IINV=0; ITOPIC=TDSP !## allocate memory for packages NTOP=SIZE(TOPICS(ITOPIC)%STRESS(1)%FILES,1); NSYS=SIZE(TOPICS(ITOPIC)%STRESS(1)%FILES,2) ALLOCATE(XVAL(NSYS,NTOP)); XVAL=0.0D0 ALLOCATE(FNAMES(TOPICS(ITOPIC)%NSUBTOPICS),PRJILIST(1)); PRJILIST=ITOPIC !## concentration for vdf-package ITOPIC=TDSP; SCL_D=PBMAN%INT(TDSP); SCL_U=2; IINV=0 PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(0,0,0,1,0).LE.0)RETURN DO ILAY=1,PRJNLAY WRITE(6,'(A)') '+Reading DSP-files ('//TRIM(RTOS(REAL(100*ILAY,8)/REAL(PRJNLAY,8),'F',2))//'%) ' IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(LON(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,LON(ILAY),0,ITOPIC) !## longutidual dispersion IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\DSP1\LON_L'//TRIM(ITOS(ILAY))//'.ARR', & LON(ILAY),0,IU,ILAY,IFBND))RETURN ENDDO !## number of systems DO ISYS=1,NSYS IF(PMANAGER_GETFNAMES(0,0,ISYS,0,0).LE.0)RETURN !## number of subtopics - skip first is array DO KTOP=2,NTOP ILAY =FNAMES(KTOP)%ILAY ICNST=FNAMES(KTOP)%ICNST IF(ICNST.NE.1)STOP 'ICNST NE 1' CNST =FNAMES(KTOP)%CNST FCT =FNAMES(KTOP)%FCT IMP =FNAMES(KTOP)%IMP XVAL(ISYS,KTOP)=CNST*FCT+IMP ENDDO ENDDO WRITE(IU,'(A)') 'INTERNAL,1.0D0,(FREE),-1' WRITE(IU,'(999E15.7)') (XVAL(ISYS,2),ISYS=1,NSYS) WRITE(IU,'(A)') 'INTERNAL,1.0D0,(FREE),-1' WRITE(IU,'(999E15.7)') (XVAL(ISYS,3),ISYS=1,NSYS) WRITE(IU,'(A)') 'INTERNAL,1.0D0,(FREE),-1' WRITE(IU,'(999E15.7)') (XVAL(ISYS,4),ISYS=1,NSYS) CLOSE(IU) DEALLOCATE(FNAMES,PRJILIST,XVAL) PMANAGER_SAVEMF2005_DSP_READSAVE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_DSP_READSAVE !!####==================================================================== !LOGICAL FUNCTION PMANAGER_SAVEMF2005_CON_SAVE(DIR,DIRMNAME,IBATCH) !!####==================================================================== !IMPLICIT NONE !CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME !INTEGER,INTENT(IN) :: IBATCH !INTEGER :: IU,ILAY,JLAY,IFBND ! !PMANAGER_SAVEMF2005_CON_SAVE=.TRUE. ! !IF(TOPICS(TCON)%IACT_MODEL.EQ.0)RETURN !IF(PBMAN%IFORMAT.EQ.3)RETURN ! !!## use vdf6 !PMANAGER_SAVEMF2005_CON_SAVE=.FALSE. ! !IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.VDF1'//'...') !IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.VDF1'//'...' ! !!## construct con1-file !IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.VDF1',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN ! !JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) ! IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE ! JLAY=JLAY+1 ! ! !## con ! IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\VDF1\VDF_L'//TRIM(ITOS(JLAY))//'.ARR', & ! CON(ILAY),0,IU,ILAY,IFBND))RETURN ! !ENDDO ! !CLOSE(IU) ! !PMANAGER_SAVEMF2005_CON_SAVE=.TRUE. ! !END FUNCTION PMANAGER_SAVEMF2005_CON_SAVE !!####==================================================================== !LOGICAL FUNCTION PMANAGER_SAVEMF2005_DSP_SAVE(DIR,DIRMNAME,IBATCH) !!####==================================================================== !IMPLICIT NONE !CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME !INTEGER,INTENT(IN) :: IBATCH !INTEGER :: IU,ILAY,JLAY,IFBND ! !PMANAGER_SAVEMF2005_DSP_SAVE=.TRUE. ! !IF(TOPICS(TDSP)%IACT_MODEL.EQ.0)RETURN !IF(PBMAN%IFORMAT.EQ.3)RETURN ! !!## use dsp !PMANAGER_SAVEMF2005_DSP_SAVE=.FALSE. ! !IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.DSP1'//'...') !IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.DSP1'//'...' ! !!## construct dsp1-file !IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.DSP1',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN ! !JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) ! IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE ! JLAY=JLAY+1 ! ! !## longutidual dispersion ! IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\DSP1\LON_L'//TRIM(ITOS(JLAY))//'.ARR', & ! LON(ILAY),0,IU,ILAY,IFBND))RETURN ! !## ratio horizontal dispersion ! IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\DSP1\RHD_L'//TRIM(ITOS(JLAY))//'.ARR', & ! RHD(ILAY),0,IU,ILAY,IFBND))RETURN ! !## ratio vertical dispersion ! IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\DSP1\RVD_L'//TRIM(ITOS(JLAY))//'.ARR', & ! RVD(ILAY),0,IU,ILAY,IFBND))RETURN ! !## add effective molecular diffusion coefficient ! IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\DSP1\MDC_L'//TRIM(ITOS(JLAY))//'.ARR', & ! MDC(ILAY),0,IU,ILAY,IFBND))RETURN ! !ENDDO ! !CLOSE(IU) ! !PMANAGER_SAVEMF2005_DSP_SAVE=.TRUE. ! !END FUNCTION PMANAGER_SAVEMF2005_DSP_SAVE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_ADV_SAVE(DIR,DIRMNAME,IBATCH) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: IBATCH INTEGER :: IU PMANAGER_SAVEMF2005_ADV_SAVE=.TRUE. IF(PBMAN%IFORMAT.NE.6.OR.WQ%VDF%MTDNCONC.EQ.0)RETURN !## use dsp PMANAGER_SAVEMF2005_ADV_SAVE=.FALSE. IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.ADV1'//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.ADV1'//'...' !## construct dsp1-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.ADV1',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(I10,F10.2,2I10)') PBMAN%ADV%MIXELM, PBMAN%ADV%PERCEL, 0, PBMAN%ADV%NADVFD ! WRITE(IU,'(/A)') '#-------------------------------------------' ! WRITE(IU,'(A)') '[ADV] # MT3DMS ADVection package' ! WRITE(IU,'(1X,A)') 'MIXELM = '//TRIM(ITOS(PBMAN%ADV%MIXELM)) ! WRITE(IU,'(1X,A)') 'PERCEL = '//TRIM(RTOS(PBMAN%ADV%PERCEL,'G',7)) !! WRITE(IU,'(1X,A)') '#MXPART = '//TRIM(ITOS(PBMAN%ADV%MXPART)) ! WRITE(IU,'(1X,A)') 'NADVFD = '//TRIM(ITOS(PBMAN%ADV%NADVFD)) ! -1 1. 0 0 !#MIXELM integer -1 Advection solution option (= 0: Finite-Difference; !#= 1: MOC; = 2: MMOC; = 3: HMOC; = -1: TVD) !#ADV PERCEL real 1 Number of cells that advection is allowed !#to move in one transport step (Courant number) !#ADV MXPART integer 0 Maximum number of moving particles allowed !#ADV NADVFD integer 0 Weighting scheme for the Finite-difference !#method CLOSE(IU) PMANAGER_SAVEMF2005_ADV_SAVE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_ADV_SAVE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_VDF_SAVE(DIR,DIRMNAME,IBATCH) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: IBATCH INTEGER :: IU,ILAY,JLAY,IFBND,KPER PMANAGER_SAVEMF2005_VDF_SAVE=.TRUE.; IF(TOPICS(TVDF)%IACT_MODEL.EQ.0)RETURN IF(PBMAN%IFORMAT.NE.6)RETURN !## use vdf PMANAGER_SAVEMF2005_VDF_SAVE=.FALSE. IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.VDF1'//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.VDF1'//'...' !## construct vdf1-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.VDF1',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(4I10)') WQ%VDF%MTDNCONC,WQ%VDF%MFNADVFD,WQ%VDF%NSWTCPL,WQ%VDF%IWTABLE WRITE(IU,'(2F15.7)') WQ%VDF%DENSEMIN,WQ%VDF%DENSEMAX WRITE(IU,'(2F15.7)') WQ%VDF%DENSEREF,WQ%VDF%DENSESLP WRITE(IU,'( F15.7)') WQ%VDF%FIRSTDT IF(WQ%VDF%MTDNCONC.EQ.0)THEN WRITE(IU,'(I10)') 1 JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1 !## con IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\VDF1\VDF_L'//TRIM(ITOS(JLAY))//'.ARR', & CON(ILAY),0,IU,ILAY,IFBND))RETURN ENDDO !## fill for remaining stress-periods (concentration remains constant in time) DO KPER=2,PRJNPER; WRITE(IU,'(I10)') -1; ENDDO ENDIF PMANAGER_SAVEMF2005_VDF_SAVE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_VDF_SAVE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_STO_SAVE(DIR,DIRMNAME,IBATCH,ISS) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: IBATCH,ISS INTEGER :: IU,ILAY,ISY,KPER,JLAY,IFBND LOGICAL :: LEX PMANAGER_SAVEMF2005_STO_SAVE=.TRUE.; IF(TOPICS(TSTO)%IACT_MODEL.EQ.0)RETURN ISY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE IF(LAYCON(ILAY).NE.1)ISY=1 ENDDO IF(ISY.EQ.1)THEN; IF(TOPICS(TSPY)%IACT_MODEL.EQ.0)RETURN; ENDIF IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)RETURN; IF(ISS.EQ.0)RETURN !## use sto6 PMANAGER_SAVEMF2005_STO_SAVE=.FALSE. IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.STO6'//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.STO6'//'...' !## construct npf6-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.STO6',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# STO6 File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(/A/)') '#General Options' WRITE(IU,'(A)') 'BEGIN OPTIONS' LEX=.FALSE. IF(ASSOCIATED(PBMAN%ISAVE(TSTO)%ILAY))LEX=.TRUE. IF(ASSOCIATED(PBMAN%ISAVE(TSPY)%ILAY))LEX=.TRUE. IF(LEX)WRITE(IU,'(A)') ' SAVE_FLOWS' IF(PBMAN%SPECIFICSTORAGE.EQ.0)WRITE(IU,'(A)') ' STORAGECOEFFICIENT' !## specific coefficient given if NOT mentioned ! IF(ISY.EQ.1)WRITE(IU,'(A)') ' SS_CONFINED_ONLY' !## usage of ss and sy as in MF2005 - why? WRITE(IU,'(A)') 'END OPTIONS' WRITE(IU,'(/A/)') '#Geology Options' WRITE(IU,'(A)') 'BEGIN GRIDDATA' WRITE(IU,'(A)') ' ICONVERT LAYERED' ! ISY=0 JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1 IF(LAYCON(ILAY).EQ.1)THEN WRITE(IU,'(A)') ' CONSTANT 0' !## confined storage ELSE WRITE(IU,'(A)') ' CONSTANT 1' !## convertible storage ! ISY=1 ENDIF ENDDO !## if ipestp and storage is optimized LEX=.FALSE.; IF(PBMAN%IPESTP.EQ.1)THEN DO I=1,SIZE(PEST%PARAM); IF(PEST%PARAM(I)%PPARAM.EQ.'SC')THEN; LEX=.TRUE.; EXIT; ENDIF; ENDDO ENDIF WRITE(IU,'(A)') ' SS LAYERED' JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1 !## include a minor modification to ensure a save in ARR files IFBND=1; IF(LEX)IFBND=-1 IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\STO6\SS_L'//TRIM(ITOS(JLAY))//'.ARR', & STO(ILAY),0,IU,ILAY,IFBND))RETURN ENDDO IF(ISY.EQ.1)THEN !## if ipestp and storage is optimized LEX=.FALSE.; IF(PBMAN%IPESTP.EQ.1)THEN DO I=1,SIZE(PEST%PARAM); IF(PEST%PARAM(I)%PPARAM.EQ.'SY')THEN; LEX=.TRUE.; EXIT; ENDIF; ENDDO ENDIF WRITE(IU,'(A)') ' SY LAYERED' JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1 !## include a minor modification to ensure a save in ARR files IFBND=1; IF(LEX)IFBND=-1 !## spy IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\STO6\SY_L'//TRIM(ITOS(JLAY))//'.ARR', & SPY(ILAY),0,IU,ILAY,IFBND))RETURN ENDDO ENDIF WRITE(IU,'(A)') 'END GRIDDATA' WRITE(IU,'(/A/)') '#Time Storage Options' DO KPER=1,PRJNPER WRITE(IU,'(A)') 'BEGIN PERIOD '//TRIM(ITOS(KPER)) IF(SIM(KPER)%DELT.EQ.0.0D0)WRITE(IU,'(A)') ' STEADY-STATE' IF(SIM(KPER)%DELT.NE.0.0D0)WRITE(IU,'(A)') ' TRANSIENT' WRITE(IU,'(A)') 'END PERIOD' ENDDO CLOSE(IU) PMANAGER_SAVEMF2005_STO_SAVE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_STO_SAVE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_ANI_READ(IPRT) !####==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IPRT INTEGER :: ILAY,SCL_D,SCL_U,IINV,ITOPIC,NTOP,NSYS,ISYS,KTOP,ICNST REAL(KIND=DP_KIND) :: FCT,CNST,IMP CHARACTER(LEN=256) :: SFNAME PMANAGER_SAVEMF2005_ANI_READ=.TRUE. !## use ani1 IF(TOPICS(TANI)%IACT_MODEL.EQ.0)RETURN WRITE(6,'(A)') '+Reading ANI-files ...' PMANAGER_SAVEMF2005_ANI_READ=.FALSE. !## ani angle IINV=0; ITOPIC=TANI !## allocate memory for packages NTOP=SIZE(TOPICS(ITOPIC)%STRESS(1)%FILES,1); NSYS=SIZE(TOPICS(ITOPIC)%STRESS(1)%FILES,2) ALLOCATE(FNAMES(TOPICS(ITOPIC)%NSUBTOPICS),PRJILIST(1)); PRJILIST=ITOPIC !## fill with default values DO ILAY=1,PRJNLAY; ANF(ILAY)%X=1.0D0; ANA(ILAY)%X=0.0D0; ANF(ILAY)%NODATA=HUGE(1.0); ANA(ILAY)%NODATA=HUGE(1.0); ENDDO !## number of systems DO ISYS=1,NSYS IF(PMANAGER_GETFNAMES(0,0,ISYS,0,0).LE.0)RETURN SCL_D=PBMAN%INT(ITOPIC); SCL_U=2; IINV=0 WRITE(6,'(A)') '+Reading ANI-files ('//TRIM(RTOS(REAL(100*ISYS,8)/REAL(NSYS,8),'F',2))//'%)' ILAY=FNAMES(1)%ILAY SCL_U=2; SCL_D=PBMAN%INT(TANI) IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(ANF(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,ANF(ILAY),0,ITOPIC) ILAY=FNAMES(1)%ILAY SCL_U=7; SCL_D=0 IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(ANA(ILAY),ITOPIC,2,SCL_D,SCL_U,IINV,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,ANA(ILAY),0,ITOPIC) ENDDO DEALLOCATE(FNAMES,PRJILIST) PMANAGER_SAVEMF2005_ANI_READ=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_ANI_READ !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_ANI_SAVE(DIR,DIRMNAME,IBATCH) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: IBATCH INTEGER :: IU,ILAY,JLAY,IFBND !## return if modflow6 export PMANAGER_SAVEMF2005_ANI_SAVE=.TRUE.; IF(PBMAN%IFORMAT.EQ.3)RETURN !## use ani IF(TOPICS(TANI)%IACT_MODEL.EQ.0)RETURN PMANAGER_SAVEMF2005_ANI_SAVE=.FALSE. IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.ANI1'//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.ANI1'//'...' !## construct ani1-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.ANI1',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE JLAY=JLAY+1 !## anisotropy factors IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\ANI1\ANF_L'//TRIM(ITOS(JLAY))//'.ARR', & ANF(ILAY),0,IU,ILAY,IFBND))RETURN !## anisotropy angle IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\ANI1\ANA_L'//TRIM(ITOS(JLAY))//'.ARR', & ANA(ILAY),0,IU,ILAY,IFBND))RETURN ENDDO CLOSE(IU) PMANAGER_SAVEMF2005_ANI_SAVE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_ANI_SAVE !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_WEL(DIR,DIRMNAME,IBATCH,IACT,ITOPIC,ICB,CPCK,IPRT) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IBATCH,ICB,ITOPIC,IPRT,IACT CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME,CPCK REAL(KIND=DP_KIND) :: X,Y,Q,Z1,Z2,FCT,IMP,CNST,NCOUNT,CONC CHARACTER(LEN=256) :: SFNAME,EXFNAME,ID,CDIR CHARACTER(LEN=5) :: EXT CHARACTER(LEN=30) :: FRM CHARACTER(LEN=126) :: ERRORMSG CHARACTER(LEN=52),ALLOCATABLE,DIMENSION(:) :: STRING INTEGER :: IU,JU,KU,ILAY,IROW,ICOL,I,J,NROWIPF,NCOLIPF,IEXT,IOS,N,KPER,IPER,NP,MP,ICNST,ISYS,& NSYS,ISS,JLAY,ISYSMF6,NSYSMF6,IS1,IS2,NINACTIVE REAL(KIND=DP_KIND),ALLOCATABLE,DIMENSION(:) :: TLP,KH,TP,BT INTEGER(KIND=8) :: ITIME,JTIME REAL(KIND=DP_KIND),PARAMETER :: MINKHT=0.0D0 CHARACTER(LEN=1) :: VTXT LOGICAL :: LEX IF(IACT.EQ.0)THEN; PMANAGER_SAVEMF2005_WEL=.TRUE.; RETURN; ENDIF PMANAGER_SAVEMF2005_WEL=.FALSE. VTXT='7'; IF(PBMAN%IFORMAT.EQ.3)VTXT='6' !## only export if not existing currently IF(PBMAN%IEXPORTMF2005.EQ.-1)THEN INQUIRE(FILE=TRIM(DIRMNAME)//'.'//CPCK//VTXT,EXIST=LEX) IF(LEX)THEN; PMANAGER_SAVEMF2005_WEL=.TRUE.; RETURN; ENDIF ENDIF !## in case MF6 is used, apply systems per package IF(PBMAN%SSYSTEM.EQ.0.AND.PBMAN%IFORMAT.EQ.3)THEN NSYSMF6=PMANAGER_GETNSYS(TWEL,2) ELSE NSYSMF6=1 ENDIF DO ISYSMF6=1,NSYSMF6 IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.'//CPCK//VTXT//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.'//CPCK//VTXT//'...' IU=UTL_GETUNIT() IF(PBMAN%SSYSTEM.EQ.0.AND.PBMAN%IFORMAT.EQ.3)THEN IF(PBMAN%SSYSTEM.EQ.0)THEN CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'_SYS'//TRIM(ITOS(ISYSMF6))//'.'//CPCK//VTXT//'_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ELSE CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ENDIF ELSE CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ENDIF IF(IU.EQ.0)RETURN IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IU,'(A)') '# '//CPCK//VTXT//' File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(/A/)') '#General Options' WRITE(IU,'(A)') 'BEGIN OPTIONS' ! WRITE(IU,'(A)') ' AUXILIARY ' ! WRITE(IU,'(A)') ' AUXMULTNAME ' IF(PBMAN%QWEL.GT.0.0D0)WRITE(IU,'(A)') ' AUTO_FLOW_REDUCE '//TRIM(RTOS(PBMAN%QWEL,'F',2)) ! WRITE(IU,'(A)') ' BOUNDNAMES' ! WRITE(IU,'(A)') ' PRINT_INPUT' ! WRITE(IU,'(A)') ' PRINT_FLOWS' IF(ASSOCIATED(PBMAN%ISAVE(TWEL)%ILAY))WRITE(IU,'(A)') ' SAVE_FLOWS' ! WRITE(IU,'(A)') ' TS6 FILEIN ' ! WRITE(IU,'(A)') ' OBS6 FILEIN ' ! WRITE(IU,'(A)') ' MOVER' WRITE(IU,'(A)') 'END OPTIONS' WRITE(IU,'(/A/)') '#General Dimensions' WRITE(IU,'(A)') 'BEGIN DIMENSIONS' WRITE(IU,'(A)') 'MAXBOUND NaN1#' WRITE(IU,'(A)') 'END DIMENSIONS' ENDIF !## header LINE='NaN1#,'//TRIM(ITOS(ICB))//' NOPRINT' IF(PBMAN%IFORMAT.EQ.6.AND.TOPICS(TVDF)%IACT_MODEL.EQ.1)THEN IF(WQ%VDF%MTDNCONC.EQ.0)LINE=TRIM(LINE)//' AUX WELDEN' IF(WQ%VDF%MTDNCONC.EQ.1)LINE=TRIM(LINE)//' WELSSMDENSE AUX WELDEN' ENDIF LINE=TRIM(LINE)//' AUX ISUB WSUBSYS ISUB' IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)WRITE(IU,'(A)') TRIM(LINE) !## fill tlp for each modellayer IF(ALLOCATED(TLP))DEALLOCATE(TLP); IF(ALLOCATED(KH)) DEALLOCATE(KH) IF(ALLOCATED(TP)) DEALLOCATE(TP); IF(ALLOCATED(BT)) DEALLOCATE(BT) ALLOCATE(TLP(PRJNLAY),KH(PRJNLAY),TP(PRJNLAY),BT(PRJNLAY)) IF(PBMAN%IFORMAT.EQ.6)THEN WRITE(FRM,'(A9,I2.2,A15)') '(3(I5,1X),',2,'(G15.7,1X),I10)' ELSE WRITE(FRM,'(A9,I2.2,A15)') '(3(I5,1X),',1,'(G15.7,1X),I10)' ENDIF !## create subfolders IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//'7') !## maximum number of well in simulation MP=0 IOS=0 NINACTIVE=0 DO IPER=1,PRJNPER !## number of wells per stressperiod NP=0 !## get appropriate stress-period to store in runfile KPER=PMANAGER_GETCURRENTIPER(IPER,ITOPIC,ITIME,JTIME) !## always export wells per stress-period IF(PBMAN%DWEL.EQ.1)KPER=ABS(KPER) !## output WRITE(IPRT,'(1X,A,2I10,2(1X,I14))') 'Exporting timestep ',IPER,KPER,ITIME,JTIME IF(IBATCH.EQ.1)WRITE(6,'(A,3I6,2(1X,I14))') '+Exporting timestep ',IPER,PRJNPER,KPER,ITIME,JTIME !## reuse previous timestep IF(KPER.LE.0)THEN IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN IF(IPER.EQ.1)THEN; WRITE(IU,'(I10)') 0 ELSE; WRITE(IU,'(I10)') -1; ENDIF ENDIF !## goto next timestep CYCLE ENDIF JU=0 !## create subfolders IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//'7') EXFNAME=TRIM(DIR)//'\'//CPCK//'7'//'\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR' ELSE IF(PBMAN%SSYSTEM.EQ.0)THEN CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//'6\SYS'//TRIM(ITOS(ISYSMF6))) EXFNAME=TRIM(DIR)//'\'//CPCK//'6\SYS'//TRIM(ITOS(ISYSMF6))//'\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR' ELSE CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//'6') EXFNAME=TRIM(DIR)//'\'//CPCK//'6\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR' ENDIF ENDIF JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=EXFNAME,STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IOS=0; IF(JU.EQ.0)THEN; IOS=-1; EXIT; ENDIF !## number of systems NSYS=SIZE(TOPICS(ITOPIC)%STRESS(KPER)%FILES,2) IF(PBMAN%SSYSTEM.EQ.0.AND.PBMAN%IFORMAT.EQ.3)THEN !## skip system if IS1=ISYSMF6; IS2=IS1; IF(ISYSMF6.GT.NSYS)THEN; IS1=0; IS2=-1; ENDIF ELSE !## export all systems IS1=1; IS2=NSYS ENDIF DO ISYS=IS1,IS2 ICNST =TOPICS(ITOPIC)%STRESS(KPER)%FILES(1,ISYS)%ICNST CNST =TOPICS(ITOPIC)%STRESS(KPER)%FILES(1,ISYS)%CNST FCT =TOPICS(ITOPIC)%STRESS(KPER)%FILES(1,ISYS)%FCT IMP =TOPICS(ITOPIC)%STRESS(KPER)%FILES(1,ISYS)%IMP ILAY =TOPICS(ITOPIC)%STRESS(KPER)%FILES(1,ISYS)%ILAY SFNAME=TOPICS(ITOPIC)%STRESS(KPER)%FILES(1,ISYS)%FNAME WRITE(IPRT,'(1X,A,I3,A1,I1,A1,I4.3,3(A1,G15.7),A1,A)') TOPICS(ITOPIC)%TNAME(1:5)//',', & ISYS,',',ICNST,',',ILAY,',',FCT,',',IMP,',',CNST,',',CHAR(39)//TRIM(SFNAME)//CHAR(39) CDIR=SFNAME(:INDEX(SFNAME,'\',.TRUE.)-1) KU=UTL_GETUNIT(); CALL OSD_OPEN(KU,SFNAME,STATUS='OLD',ACTION='READ',FORM='FORMATTED'); IF(KU.EQ.0)RETURN READ(KU,*,IOSTAT=IOS) NROWIPF; IF(IOS.NE.0)THEN; ERRORMSG="reading NRECORDS from the header." ; EXIT; ENDIF READ(KU,*,IOSTAT=IOS) NCOLIPF; IF(IOS.NE.0)THEN; ERRORMSG="reading NFIELDS from the header." ; EXIT; ENDIF DO I=1,NCOLIPF READ(KU,*,IOSTAT=IOS); IF(IOS.NE.0)THEN; ERRORMSG="reading FIELDNAME from the header." ; EXIT; ENDIF ENDDO READ(KU,*,IOSTAT=IOS) IEXT,EXT; IF(IOS.NE.0)THEN; ERRORMSG="reading INDEXCOLUMN,EXTENT from the header." ; EXIT; ENDIF N=NCOLIPF; ALLOCATE(STRING(N)); STRING='' !## steady-state/transient timestep !## NB different use of local variable ISS for Steady state (ISS=1, not 0) and Transient (ISS=2, not 1) ISS=1; IF(SIM(IPER)%DELT.GT.0.0D0)ISS=2 !## compute average in case model is STEADY STATE but IPF is transient and uses column 3 as reference to associated files IF(ISS.EQ.1.AND.IEXT.GT.0)THEN WRITE(*,'(/A)') 'IMOD COMPUTES AVERAGE EXTRACTION VOLUMES FOR:' WRITE(*,'(A)') ' >>> '//TRIM(SFNAME)//' <<<' ENDIF DO I=1,NROWIPF !## start with current given layer number ILAY=TOPICS(ITOPIC)%STRESS(KPER)%FILES(1,ISYS)%ILAY !## read csv entry IF(.NOT.UTL_READCSVENTRY(KU,STRING))THEN; ERRORMSG="reading "//TRIM(ITOS(N))//" columns." ; EXIT; ENDIF READ(STRING(1),*,IOSTAT=IOS) X; IF(IOS.NE.0)THEN; ERRORMSG="reading the X coordinate in column 1." ; EXIT; ENDIF READ(STRING(2),*,IOSTAT=IOS) Y; IF(IOS.NE.0)THEN; ERRORMSG="reading the Y coordinate in column 2." ; EXIT; ENDIF !## get correct cell-indices CALL IDFIROWICOL(BND(1),IROW,ICOL,X,Y) !## outside current model IF(IROW.EQ.0.OR.ICOL.EQ.0)CYCLE !## get discharge - always on position 3 IF(IEXT.EQ.0)THEN READ(STRING(3),*,IOSTAT=IOS) Q; IF(IOS.NE.0)THEN; ERRORMSG="reading discharge (value) in column 3." ; EXIT ; ENDIF ELSE !## get id number - can be any column READ(STRING(IEXT),'(A)',IOSTAT=IOS) ID; IF(IOS.NE.0)THEN; ERRORMSG="reading the ID name in column "//TRIM(ITOS(IEXT))//"." ; EXIT; ENDIF ENDIF !## assign to several layer IF(ILAY.EQ.0)THEN READ(STRING(4),*,IOSTAT=IOS) Z1; IF(IOS.NE.0)THEN; ERRORMSG="reading Z1 in column 4." ; EXIT; ENDIF READ(STRING(5),*,IOSTAT=IOS) Z2; IF(IOS.NE.0)THEN; ERRORMSG="reading Z2 in column 5." ; EXIT; ENDIF !## get filter fractions CALL PMANAGER_SAVEMF2005_PCK_ULSTRD_PARAM(PRJNLAY,ICOL,IROW,TOP,BOT,KDW,TP,BT,KH,.TRUE.) CALL UTL_PCK_GETTLP(PRJNLAY,TLP,KH,TP,BT,Z1,Z2,MINKHT) !## find uppermost layer ELSE IF(ILAY.EQ.-1)THEN DO ILAY=1,PRJNLAY IF(BND(ILAY)%X(ICOL,IROW).GT.0)EXIT !## no active BND cell found in the vertical ENDDO ENDIF !## outside current model dimensions, set ilay=0 IF(ILAY.GT.PRJNLAY)ILAY=0; TLP=0.0D0; IF(ILAY.NE.0)TLP(ILAY)=1.0D0 !## read concentration (injection wells only) CONC=0.0D0 IF(PBMAN%IFORMAT.EQ.6.AND.TOPICS(TVDF)%IACT_MODEL.EQ.1.AND.Q.GT.0.0D0)THEN READ(STRING(4),*,IOSTAT=IOS) CONC; IF(IOS.NE.0)THEN; ERRORMSG="reading CONC in column 4." ; EXIT; ENDIF ENDIF ENDIF IF(IEXT.GT.0)THEN IF(.NOT.UTL_PCK_READTXT(2,ITIME,JTIME,Q,TRIM(CDIR)//'\'//TRIM(ID)//'.'//TRIM(EXT),0,'',ISS,NCOUNT))THEN IOS=-1; EXIT ENDIF IF(NCOUNT.LE.0.0D0)Q=0.0D0 ENDIF !## use factor/impulse Q=Q*FCT; Q=Q+IMP IF(Q.NE.0.0D0)THEN !## only active cells DO ILAY=1,PRJNLAY IF(TLP(ILAY).EQ.0.0)CYCLE IF(BND(ILAY)%X(ICOL,IROW).LE.0.0D0)THEN NINACTIVE=NINACTIVE+1 ! IF(NINACTIVE.EQ.1)THEN ! WRITE(*,'(/A)') 'Number of removed wells that are in inactive/constant heads.' ! WRITE(*,'(3A10,A15)') 'Nr_inactive','icol','irow','volume' ! ENDIF ! WRITE(*,'(3I10,F15.7)') NINACTIVE,ICOL,IROW,TLP(ILAY)*Q !## normalize tlp() again TLP(ILAY)=0.0D0; IF(SUM(TLP).GT.0.0D0)TLP=(1.0D0/SUM(TLP))*TLP ENDIF ENDDO JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE; JLAY=JLAY+1 IF(TLP(ILAY).GT.0.0D0)THEN IF(PBMAN%IFORMAT.EQ.6)THEN WRITE(JU,FRM) JLAY,IROW,ICOL,Q*TLP(ILAY),CONC,ISYS ELSE WRITE(JU,FRM) JLAY,IROW,ICOL,Q*TLP(ILAY),ISYS ENDIF NP=NP+1 ENDIF ENDDO ENDIF ENDDO DEALLOCATE(STRING) CLOSE(KU) IF(IOS.NE.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error reading IPF file:'//CHAR(13)//TRIM(SFNAME)//CHAR(13)// & 'Linenumber '//TRIM(ITOS(I))//': '//TRIM(ERRORMSG),'Error'); RETURN ENDIF ENDDO IF(NP.GT.0)THEN IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)CALL IDFWRITEFREE_HEADER(JU,PRJIDF) CLOSE(JU) ELSE CLOSE(JU,STATUS='DELETE') ENDIF IF(IOS.NE.0)EXIT !## store maximum number of well in simulation MP=MAX(MP,NP) IF(PBMAN%IFORMAT.GE.2)THEN IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN LINE=TRIM(ITOS(NP)); WRITE(IU,'(A)') TRIM(LINE) ENDIF IF(NP.GT.0)THEN SFNAME=EXFNAME N=3 IF(PBMAN%SSYSTEM.EQ.0.AND.PBMAN%IFORMAT.EQ.3)N=5 IF(PBMAN%SSYSTEM.EQ.1.AND.PBMAN%IFORMAT.EQ.3)N=4 DO I=1,N; SFNAME=SFNAME(:INDEX(SFNAME,'\',.TRUE.)-1); ENDDO I=LEN_TRIM(SFNAME); SFNAME='.'//EXFNAME(I+1:) IF(PBMAN%IFORMAT.EQ.3.AND.PBMAN%IPESTP.EQ.1)SFNAME='.'//TRIM(SFNAME) IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(/A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER)) WRITE(IU,'(A)') 'OPEN/CLOSE '//TRIM(SFNAME)//' 1.0D0 (FREE) -1' IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(A)') 'END PERIOD' ELSE !## write period-block to make sure new information is contained IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IU,'(/A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER)) WRITE(IU,'(A)') 'END PERIOD' ENDIF ENDIF ENDIF ENDDO CLOSE(IU); DEALLOCATE(TLP,TP,BT,KH) IF(IOS.EQ.0)THEN !## mf6 does not accept zero boundaries IF(PBMAN%IFORMAT.EQ.3)THEN MP=MAX(1,MP) IF(PBMAN%SSYSTEM.EQ.0)THEN CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'_SYS'//TRIM(ITOS(ISYSMF6))//'.'//CPCK//VTXT//'_',(/MP/)) ELSE CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',(/MP/)) ENDIF ELSE CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',(/MP/)) ENDIF PMANAGER_SAVEMF2005_WEL=.TRUE. ENDIF ENDDO IF(NINACTIVE.GT.0)THEN WRITE(*,'(/A)') 'Number of removed wells that are in inactive/constant heads is '//TRIM(ITOS(NINACTIVE)) ENDIF END FUNCTION PMANAGER_SAVEMF2005_WEL !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_OBS(DIR,DIRMNAME,IBATCH,IACT,ITOPIC,CPCK,IOPTION) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IBATCH,ITOPIC,IACT,IOPTION CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME,CPCK REAL(KIND=DP_KIND) :: X,Y,Z1,Z2,FCT,IMP,CNST,H,NCOUNT,W,ROFF,COFF,X1,Y1,X2,Y2 CHARACTER(LEN=256) :: SFNAME,EXFNAME,OBSNAME,CID,CDIR CHARACTER(LEN=5) :: EXT CHARACTER(LEN=126) :: ERRORMSG CHARACTER(LEN=52),ALLOCATABLE,DIMENSION(:) :: STRING INTEGER :: IU,JU,KU,ILAY,IROW,ICOL,I,J,II,NROWIPF,NCOLIPF,IEXT,IOS,N,NP,ICNST,ISYS,NSYS,IPER,KPER,IP, & IXCOL,IYCOL,ILCOL,IMCOL,IVCOL,IZ1CL,IZ2CL INTEGER(KIND=8) :: ITIME,JTIME REAL(KIND=DP_KIND),ALLOCATABLE,DIMENSION(:) :: TLP,KH,TP,BT CHARACTER(LEN=1) :: VTXT IF(IACT.EQ.0)THEN; PMANAGER_SAVEMF2005_OBS=.TRUE.; RETURN; ENDIF PMANAGER_SAVEMF2005_OBS=.FALSE. IF(PBMAN%IFORMAT.EQ.3)VTXT='6' !## mf5 IF(PBMAN%IFORMAT.EQ.6)VTXT='7' !## seawat IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.'//CPCK//VTXT//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.'//CPCK//VTXT//'...' IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.'//CPCK//VTXT,STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') IF(IU.EQ.0)RETURN JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=TRIM(DIRMNAME)//'.MES'//VTXT//'_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') IF(JU.EQ.0)THEN; CLOSE(IU); RETURN; ENDIF IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IU,'(A)') '# '//CPCK//VTXT//' File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(/A/)') '#General Options' WRITE(IU,'(A)') 'BEGIN OPTIONS' WRITE(IU,'(A)') ' DIGITS 7' WRITE(IU,'(A)') ' PRINT_INPUT' WRITE(IU,'(A)') 'END OPTIONS' ELSEIF(PBMAN%IFORMAT.EQ.6)THEN WRITE(IU,'(A)') '# '//CPCK//VTXT//' File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(A)') DIR(:INDEX(DIR,'\',.TRUE.)-1)//'\OBS\OBS -1'; CLOSE(IU) IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.HOB'//VTXT//'_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') WRITE(IU,'(A,2I10)') 'NaN1#',0,1 WRITE(IU,'(2F15.3)') 1.0,1.0 ENDIF WRITE(JU,'(A)') '# MES'//VTXT//' File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(JU,'(/A)') 'TIMESTEPS '//TRIM(ITOS(PRJNPER)) WRITE(JU,'(A/)') 'MAXOBS NaN1#' !## fill tlp for each modellayer ALLOCATE(TLP(PRJNLAY),KH(PRJNLAY),TP(PRJNLAY),BT(PRJNLAY)) !## maximum number of well in simulation IOS=0 IF(PBMAN%IFORMAT.EQ.3)THEN EXFNAME='.\GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL))//'\MODELOUTPUT\OUTPUT_OBS.TXT' IF(PBMAN%IPESTP.EQ.1)EXFNAME='.'//TRIM(EXFNAME) WRITE(IU,'(/A)') 'BEGIN CONTINUOUS FILEOUT '//TRIM(EXFNAME) ENDIF NSYS=0 IF(IOPTION.EQ.1)THEN NSYS=SIZE(TOPICS(ITOPIC)%STRESS(1)%FILES,2) ELSEIF(IOPTION.EQ.2)THEN IF(ASSOCIATED(PEST%MEASURES))NSYS=SIZE(PEST%MEASURES) ENDIF NP=0; DO ISYS=1,NSYS !## obs-package IF(IOPTION.EQ.1)THEN ICNST =TOPICS(ITOPIC)%STRESS(1)%FILES(1,ISYS)%ICNST CNST =TOPICS(ITOPIC)%STRESS(1)%FILES(1,ISYS)%CNST FCT =TOPICS(ITOPIC)%STRESS(1)%FILES(1,ISYS)%FCT IMP =TOPICS(ITOPIC)%STRESS(1)%FILES(1,ISYS)%IMP ILAY =TOPICS(ITOPIC)%STRESS(1)%FILES(1,ISYS)%ILAY SFNAME=TOPICS(ITOPIC)%STRESS(1)%FILES(1,ISYS)%FNAME IXCOL =1 IYCOL =2 ILCOL=0; IF(ILAY.LT.0)ILCOL=ABS(ILAY) IMCOL =4 IVCOL =5 IZ1CL =6 IZ2CL =7 !## pst-package ELSEIF(IOPTION.EQ.2)THEN SFNAME=PEST%MEASURES(ISYS)%IPFNAME IXCOL=PEST%MEASURES(ISYS)%IXCOL IYCOL=PEST%MEASURES(ISYS)%IYCOL ILCOL=PEST%MEASURES(ISYS)%ILCOL IMCOL=PEST%MEASURES(ISYS)%IMCOL IVCOL=PEST%MEASURES(ISYS)%IVCOL IZ1CL=PEST%MEASURES(ISYS)%IZ1CL IZ2CL=PEST%MEASURES(ISYS)%IZ2CL FCT=1.0D0 IMP=0.0D0 ENDIF CDIR=SFNAME(:INDEX(SFNAME,'\',.TRUE.)-1) KU=UTL_GETUNIT(); CALL OSD_OPEN(KU,SFNAME,STATUS='OLD',ACTION='READ',FORM='FORMATTED'); IF(KU.EQ.0)RETURN READ(KU,*,IOSTAT=IOS) NROWIPF; IF(IOS.NE.0)THEN; ERRORMSG="reading NRECORDS from the header." ; EXIT; ENDIF READ(KU,*,IOSTAT=IOS) NCOLIPF; IF(IOS.NE.0)THEN; ERRORMSG="reading NFIELDS from the header." ; EXIT; ENDIF DO I=1,NCOLIPF READ(KU,*,IOSTAT=IOS); IF(IOS.NE.0)THEN; ERRORMSG="reading FIELDNAME from the header." ; EXIT; ENDIF ENDDO READ(KU,*,IOSTAT=IOS) IEXT,EXT; IF(IOS.NE.0)THEN; ERRORMSG="reading INDEXCOLUMN,EXTENT from the header." ; EXIT; ENDIF IF(IOPTION.EQ.1)THEN N=MAX(5,IEXT); IF(ILAY.EQ.0)N=MAX(6,IEXT) ELSEIF(IOPTION.EQ.2)THEN N=MAX(IXCOL,IYCOL,ILCOL,IMCOL,ABS(IVCOL)) ENDIF IF(N.GT.NCOLIPF)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD need at least '//TRIM(ITOS(N))//' columns however it reads only '//TRIM(ITOS(NCOLIPF))//' from:'//CHAR(13)// & TRIM(SFNAME),'Error'); RETURN ENDIF ALLOCATE(STRING(N)); STRING='' DO I=1,NROWIPF READ(KU,*,IOSTAT=IOS) (STRING(J),J=1,N); IF(IOS.NE.0)THEN; ERRORMSG="reading "//TRIM(ITOS(N))//" columns." ; EXIT; ENDIF IF(IOPTION.EQ.1)THEN !## start with current given layer number IF(ILCOL.EQ.0)THEN ILAY=TOPICS(ITOPIC)%STRESS(1)%FILES(1,ISYS)%ILAY ELSE READ(STRING(ILCOL),*,IOSTAT=IOS) ILAY; IF(IOS.NE.0)THEN; ERRORMSG="reading value in ILCOL." ; EXIT; ENDIF ENDIF ELSEIF(IOPTION.EQ.2)THEN IF(ILCOL.GT.0)THEN READ(STRING(ILCOL),*,IOSTAT=IOS) ILAY; IF(IOS.NE.0)THEN; ERRORMSG="reading value in ILCOL." ; EXIT; ENDIF ELSE ILAY=ABS(ILCOL) ENDIF ENDIF READ(STRING(IXCOL),*,IOSTAT=IOS) X; IF(IOS.NE.0)THEN; ERRORMSG="reading the X coordinate." ; EXIT; ENDIF READ(STRING(IYCOL),*,IOSTAT=IOS) Y; IF(IOS.NE.0)THEN; ERRORMSG="reading the Y coordinate." ; EXIT; ENDIF !## get correct cell-indices CALL IDFIROWICOL(BND(1),IROW,ICOL,X,Y) !## outside current model (do something with buffer) IF(IROW.EQ.0.OR.ICOL.EQ.0)CYCLE SELECT CASE (ILAY) CASE (0 ); IP=5 CASE (:-1); IP=3 CASE (1: ); IP=4 END SELECT !## assign to several layers only for standard obs package IF(ILAY.EQ.0)THEN READ(STRING(IZ1CL),*,IOSTAT=IOS) Z1; IF(IOS.NE.0)THEN; ERRORMSG="reading Z1 in column IZ1COL." ; EXIT; ENDIF READ(STRING(IZ2CL),*,IOSTAT=IOS) Z2; IF(IOS.NE.0)THEN; ERRORMSG="reading Z2 in column IZ2COL." ; EXIT; ENDIF !## only one layer per measurement Z1=(Z1+Z2)/2.0D0; Z2=Z1 !## get filter fractions CALL PMANAGER_SAVEMF2005_PCK_ULSTRD_PARAM(PRJNLAY,ICOL,IROW,TOP,BOT,KDW,TP,BT,KH,.TRUE.) CALL UTL_PCK_GETTLP(PRJNLAY,TLP,KH,TP,BT,Z1,Z2,0.0D0) !## find uppermost layer ELSE IF(ILAY.EQ.-1)THEN DO ILAY=1,PRJNLAY IF(BND(ILAY)%X(ICOL,IROW).GT.0)EXIT ENDDO ENDIF !## outside current model dimensions, set ilay=0 IF(ILAY.GT.PRJNLAY)ILAY=0; TLP=0.0D0; IF(ILAY.NE.0)TLP(ILAY)=1.0D0 ENDIF IF(IOPTION.EQ.1)THEN READ(STRING(IP+1),*,IOSTAT=IOS) W; IF(IOS.NE.0)THEN; ERRORMSG="reading weight." ; EXIT; ENDIF ELSEIF(IOPTION.EQ.2)THEN READ(STRING(ABS(IVCOL)),*,IOSTAT=IOS) W; IF(IOS.NE.0)THEN; ERRORMSG="reading weight." ; EXIT; ENDIF !## convert weight to stdev (in obs and hob weigths are represented by stdev values) IF(IVCOL.LT.0)THEN; IF(W.LE.0.0D0)THEN; W=0.0D0; ELSE; W=SQRT(1.0D0/W); ENDIF; ENDIF ENDIF !## skip this one as weight is zero IF(W.LE.0.0D0)CYCLE !## only active cells DO ILAY=1,PRJNLAY IF(BND(ILAY)%X(ICOL,IROW).LE.0.0D0)TLP(ILAY)=0.0D0 ENDDO !## get head IF(IOPTION.EQ.1)THEN IF(IEXT.EQ.0)THEN READ(STRING(IP),*,IOSTAT=IOS) H; IF(IOS.NE.0)THEN; ERRORMSG="reading Head." ; EXIT; ENDIF ELSE !## get id number - can be any column READ(STRING(IEXT),'(A)',IOSTAT=IOS) CID; IF(IOS.NE.0)THEN; ERRORMSG="reading ID." ; EXIT; ENDIF ENDIF ELSEIF(IOPTION.EQ.2)THEN IF(IEXT.EQ.IMCOL.AND.IEXT.GT.0)THEN !## get id number - can be any column READ(STRING(IEXT),'(A)',IOSTAT=IOS) CID; IF(IOS.NE.0)THEN; ERRORMSG="reading ID." ; EXIT; ENDIF ELSE READ(STRING(IMCOL),*,IOSTAT=IOS) H; IF(IOS.NE.0)THEN; ERRORMSG="reading Head." ; EXIT; ENDIF ENDIF ENDIF !## how many entries II=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE IF(TLP(ILAY).GT.0.0D0)II=II+1 ENDDO II=II*PRJNPER !## skip this one IF(II.EQ.0)CYCLE WRITE(OBSNAME,'(A)') 'IPF'//TRIM(ITOS(ISYS))//'_NO'//TRIM(ITOS(I)) WRITE(JU,'(A)') TRIM(OBSNAME)//','//TRIM(ITOS(II))//','//TRIM(RTOS(X,'F',3))//','//TRIM(RTOS(Y,'F',3)) WRITE(JU,'(A)') 'TIME,HEAD,STDEV,ILAY' CALL IDFGETEDGE(BND(1),IROW,ICOL,X1,Y1,X2,Y2) ROFF=((Y-Y1)/(Y2-Y1))-0.5D0 COFF=((X-X1)/(X2-X1))-0.5D0 !## get measurements for this observation for comparision DO IPER=1,PRJNPER !## write steady state dummy values IF(IEXT.GT.0.AND.SIM(IPER)%DELT.EQ.0.0D0)THEN DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE IF(TLP(ILAY).GT.0.0D0)THEN WRITE(JU,'(A)') '00000000000000,'//TRIM(RTOS(HNOFLOW,'G',7))//','//TRIM(RTOS(W,'F',3))//','//TRIM(ITOS(ILAY)) ENDIF ENDDO CYCLE ENDIF !## get appropriate stress-period to store in runfile IF(IOPTION.EQ.1)THEN KPER=PMANAGER_GETCURRENTIPER(IPER,ITOPIC,ITIME,JTIME) ELSEIF(IOPTION.EQ.2)THEN KPER=PMANAGER_GETCURRENTIPER(IPER,TPST,ITIME,JTIME) ENDIF !## get value from txt-files IF(IEXT.GT.0)THEN IF(.NOT.UTL_PCK_READTXT(2,ITIME,JTIME,H,TRIM(CDIR)//'\'//TRIM(CID)//'.'//TRIM(EXT),0,'',2,NCOUNT,IEXT=0))THEN IOS=-1; EXIT ENDIF IF(NCOUNT.LE.0.0D0)H=HNOFLOW ENDIF !## get time-label (represented by start- or end of stress-period) IF(PBMAN%ISAVEENDDATE.EQ.1)ITIME=JTIME !## use factor/impulse H=H*FCT; H=H+IMP DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE IF(TLP(ILAY).GT.0.0D0)THEN !## write in mes files WRITE(JU,'(A)') TRIM(ITOS_DBL(ITIME))//','//TRIM(RTOS(H,'G',7))//','//TRIM(RTOS(W,'F',3))//','//TRIM(ITOS(ILAY)) !## write in hob(seawat) files IF(PBMAN%IFORMAT.EQ.6)THEN WRITE(IU,'(A15,4I10,5F15.3,2I10)') TRIM(OBSNAME),ILAY,IROW,ICOL,IPER,SIM(IPER)%DELT,ROFF,COFF,H,W,1,1 NP=NP+1 ENDIF ENDIF ENDDO ENDDO !## add measurement DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE IF(TLP(ILAY).GT.0.0D0)THEN !## write in obs(mf6) IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IU,'(A)') TRIM(OBSNAME)//',HEAD,'//TRIM(ITOS(ILAY))//','//TRIM(ITOS(IROW))//','//TRIM(ITOS(ICOL)) NP=NP+1 ENDIF ENDIF ENDDO ENDDO DEALLOCATE(STRING) CLOSE(KU) IF(IOS.NE.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error reading IPF file:'//CHAR(13)//TRIM(SFNAME)//CHAR(13)// & 'Linenumber '//TRIM(ITOS(I))//': '//TRIM(ERRORMSG),'Error'); RETURN ENDIF ENDDO ! !## store maximum number of well in simulation ! MP=MAX(MP,NP) IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(A)') 'END CONTINUOUS' CLOSE(IU); CLOSE(JU); DEALLOCATE(TLP,TP,BT,KH) IF(PBMAN%IFORMAT.EQ.6)CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.HOB'//VTXT//'_',(/NP/)) IF(PBMAN%IFORMAT.EQ.6)NP=NP/PRJNPER; CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.MES'//VTXT//'_',(/NP/)) IF(IOS.EQ.0)PMANAGER_SAVEMF2005_OBS=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_OBS !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_MNW2(DIR,DIRMNAME,IBATCH,IACT,ITOPIC,ICB,CPCK,IPRT) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IBATCH,ICB,ITOPIC,IPRT,IACT CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME,CPCK REAL(KIND=DP_KIND) :: X,Y,Q,Z1,Z2,FCT,IMP,CNST,RW,RSKIN,KSKIN,NCOUNT,F CHARACTER(LEN=256) :: SFNAME,EXFNAME,ID,CDIR CHARACTER(LEN=5) :: EXT CHARACTER(LEN=30) :: LOSSTYPE CHARACTER(LEN=52),ALLOCATABLE,DIMENSION(:) :: STRING INTEGER :: IU,KU,ILAY,IROW,ICOL,I,J,ISYS,NROWIPF,NCOLIPF,IEXT,IOS,N,KPER,IPER,LPER,NSYS,ICNST,IDIM,NDIM, & MNWPRINT,NNODES,ILOSSTYPE,QLIMIT,PPFLAG,PUMPLOC,PUMPCAP,ILOSS,IEQUAL,JLAY,NSYSMF6,ISYSMF6,IS1,IS2,JU, & NGWFNODES,ICON,MP INTEGER(KIND=8) :: ITIME,JTIME LOGICAL :: LEX CHARACTER(LEN=1) :: VTXT REAL(KIND=DP_KIND),ALLOCATABLE,DIMENSION(:) :: TLP,KH,TP,BT IF(IACT.EQ.0)THEN; PMANAGER_SAVEMF2005_MNW2=.TRUE.; RETURN; ENDIF PMANAGER_SAVEMF2005_MNW2=.FALSE. VTXT='7'; IF(PBMAN%IFORMAT.EQ.3)VTXT='6' !## only export if not existing currently IF(PBMAN%IEXPORTMF2005.EQ.-1)THEN INQUIRE(FILE=TRIM(DIRMNAME)//'.'//CPCK//VTXT,EXIST=LEX) IF(LEX)THEN; PMANAGER_SAVEMF2005_MNW2=.TRUE.; RETURN; ENDIF ENDIF !## in case MF6 is used, apply systems per package IF(PBMAN%SSYSTEM.EQ.0.AND.PBMAN%IFORMAT.EQ.3)THEN NSYSMF6=PMANAGER_GETNSYS(TMNW,2) ELSE NSYSMF6=1 ENDIF DO ISYSMF6=1,NSYSMF6 IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.'//CPCK//VTXT//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.'//CPCK//VTXT//'...' IU=UTL_GETUNIT() IF(PBMAN%SSYSTEM.EQ.0.AND.PBMAN%IFORMAT.EQ.3)THEN IF(PBMAN%SSYSTEM.EQ.0)THEN CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'_SYS'//TRIM(ITOS(ISYSMF6))//'.'//CPCK//VTXT//'_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ELSE CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ENDIF ELSE CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ENDIF IF(IU.EQ.0)RETURN IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IU,'(A)') '# '//CPCK//VTXT//' File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(/A/)') '#General Options' WRITE(IU,'(A)') 'BEGIN OPTIONS' ! WRITE(IU,'(A)') ' AUXILIARY ' ! WRITE(IU,'(A)') ' AUXMULTNAME ' ! WRITE(IU,'(A)') ' BOUNDNAMES' ! WRITE(IU,'(A)') ' PRINT_INPUT' ! WRITE(IU,'(A)') ' PRINT_FLOWS' IF(ASSOCIATED(PBMAN%ISAVE(TMNW)%ILAY))WRITE(IU,'(A)') ' SAVE_FLOWS' ![PRINT_HEAD] ![HEAD FILEOUT ] ![BUDGET FILEOUT ] ![BUDGETCSV FILEOUT ] ![NO_WELL_STORAGE] ![FLOW_CORRECTION] ![FLOWING_WELLS] ![SHUTDOWN_THETA ] ![SHUTDOWN_KAPPA ] ![TS6 FILEIN ] ![OBS6 FILEIN ] ![MOVER] WRITE(IU,'(A)') 'END OPTIONS' WRITE(IU,'(/A/)') '#General Dimensions' WRITE(IU,'(A)') 'BEGIN DIMENSIONS' WRITE(IU,'(A)') ' NMAWWELLS NaN1#' WRITE(IU,'(A)') 'END DIMENSIONS' ENDIF !## no output information, use 2 for maximal output MNWPRINT=0 !2 !## header LINE='NaN1#,'//TRIM(ITOS(ICB))//','//TRIM(ITOS(MNWPRINT)) IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)WRITE(IU,'(A)') TRIM(LINE) !## fill tlp for each modellayer IF(ALLOCATED(TLP))DEALLOCATE(TLP); IF(ALLOCATED(KH)) DEALLOCATE(KH) IF(ALLOCATED(TP)) DEALLOCATE(TP); IF(ALLOCATED(BT)) DEALLOCATE(BT) ALLOCATE(TLP(PRJNLAY),KH(PRJNLAY),TP(PRJNLAY),BT(PRJNLAY)) !## search for first mnw definition in time - can be one only !!! DO IPER=1,PRJNPER !## get appropriate input file for first stress-period KPER=PMANAGER_GETCURRENTIPER(IPER,ITOPIC,ITIME,JTIME) !## found appropriate stress-period IF(KPER.GT.0)EXIT ENDDO !## nothing found IF(IPER.GT.PRJNPER)KPER=0 !## store maximum number of well in simulation ALLOCATE(NP_IPER(0:PRJNPER)); NP_IPER=0; LPER=0 !## fill static-time independent information IOS=0; DO IPER=0,PRJNPER IF(IPER.GT.0)THEN !## get appropriate stress-period to store in runfile KPER=PMANAGER_GETCURRENTIPER(IPER,ITOPIC,ITIME,JTIME) !## output WRITE(IPRT,'(1X,A,2I10,2(1X,I14))') 'Exporting timestep ',IPER,KPER,ITIME,JTIME IF(IBATCH.EQ.1)WRITE(6,'(A,3I6,2(1X,I14))') '+Exporting timestep ',IPER,PRJNPER,KPER,ITIME,JTIME !## always export wells per stress-period IF(PBMAN%DWEL.EQ.1)KPER=ABS(KPER) ENDIF !## reuse previous timestep IF(KPER.LE.0)THEN IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN IF(IPER.EQ.1)THEN; WRITE(IU,'(I10)') 0 ELSE; WRITE(IU,'(I10)') -1; ENDIF ENDIF !## goto next timestep CYCLE ENDIF JU=0 !## create subfolders IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN JU=IU ELSE IF(PBMAN%SSYSTEM.EQ.0)THEN CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//'6\SYS'//TRIM(ITOS(ISYSMF6))) EXFNAME=TRIM(DIR)//'\'//CPCK//'6\SYS'//TRIM(ITOS(ISYSMF6))//'\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR' ELSE CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//'6') EXFNAME=TRIM(DIR)//'\'//CPCK//'6\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR' ENDIF JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=EXFNAME,STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IOS=0; IF(JU.EQ.0)THEN; IOS=-1; EXIT; ENDIF ENDIF IF(PBMAN%IFORMAT.NE.3)THEN IF(IPER.GT.0)THEN; LINE='NaN'//TRIM(ITOS(IPER+1))//'#'; WRITE(IU,'(A)') TRIM(LINE); ENDIF ENDIF !## get number of mnw-systems NSYS=SIZE(TOPICS(ITOPIC)%STRESS(KPER)%FILES,2) IF(PBMAN%SSYSTEM.EQ.0.AND.PBMAN%IFORMAT.EQ.3)THEN !## export current system only IS1=MIN(NSYS,ISYSMF6); IS2=IS1 ELSE !## export all systems IS1=1; IS2=NSYS ENDIF DO ISYS=IS1,IS2 ICNST =TOPICS(ITOPIC)%STRESS(KPER)%FILES(1,ISYS)%ICNST CNST =TOPICS(ITOPIC)%STRESS(KPER)%FILES(1,ISYS)%CNST FCT =TOPICS(ITOPIC)%STRESS(KPER)%FILES(1,ISYS)%FCT IMP =TOPICS(ITOPIC)%STRESS(KPER)%FILES(1,ISYS)%IMP ILAY =TOPICS(ITOPIC)%STRESS(KPER)%FILES(1,ISYS)%ILAY SFNAME=TOPICS(ITOPIC)%STRESS(KPER)%FILES(1,ISYS)%FNAME !## check to see whether equal to previous timestep IEQUAL=1 IF(LPER.GT.0)THEN IEQUAL=1 IF(ICNST.EQ. TOPICS(ITOPIC)%STRESS(LPER)%FILES(1,ISYS)%ICNST.AND. & CNST .EQ. TOPICS(ITOPIC)%STRESS(LPER)%FILES(1,ISYS)%CNST.AND. & ! FCT.EQ. TOPICS(ITOPIC)%STRESS(LPER)%FILES(1,ISYS)%FCT.AND. & ! IMP .EQ. TOPICS(ITOPIC)%STRESS(LPER)%FILES(1,ISYS)%IMP.AND. & ILAY.EQ. TOPICS(ITOPIC)%STRESS(LPER)%FILES(1,ISYS)%ILAY.AND. & SFNAME.EQ.TOPICS(ITOPIC)%STRESS(LPER)%FILES(1,ISYS)%FNAME)IEQUAL=-1 ENDIF !## for MNW it is essential that the number of files are similar during simulation IF(LPER.GT.1.AND.IEQUAL.EQ.1)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'For the MNW package it is NOT allowed to specify different input files'//CHAR(13)// & 'among different stress-periods','Error'); IOS=-1; RETURN ENDIF IF(IPER.GT.0)THEN WRITE(IPRT,'(1X,A,I3,A1,I1,A1,I4.3,3(A1,G15.7),A1,A)') TOPICS(ITOPIC)%TNAME(1:5)//',', & ISYS,',',ICNST,',',ILAY,',',FCT,',',IMP,',',CNST,',',CHAR(39)//TRIM(SFNAME)//CHAR(39) ENDIF CDIR=SFNAME(:INDEX(SFNAME,'\',.TRUE.)-1) NDIM=1; IF(PBMAN%IFORMAT.EQ.3)NDIM=2 DO IDIM=1,NDIM NP_IPER(IPER)=0 KU=UTL_GETUNIT(); CALL OSD_OPEN(KU,SFNAME,STATUS='OLD',ACTION='READ',FORM='FORMATTED'); IF(KU.EQ.0)THEN; IOS=-1; EXIT; ENDIF READ(KU,*,IOSTAT=IOS) NROWIPF; IF(IOS.NE.0)EXIT READ(KU,*,IOSTAT=IOS) NCOLIPF; IF(IOS.NE.0)EXIT DO I=1,NCOLIPF; READ(KU,*,IOSTAT=IOS); IF(IOS.NE.0)EXIT; ENDDO READ(KU,*,IOSTAT=IOS) IEXT,EXT; IF(IOS.NE.0)EXIT N=NCOLIPF; ALLOCATE(STRING(N)); STRING='' IF(ILAY.GT.0)ILOSS=4; IF(ILAY.EQ.0)ILOSS=6 IF(IPER.EQ.0.AND.PBMAN%IFORMAT.EQ.3)THEN IF(IDIM.EQ.1)THEN WRITE(IU,'(/A/)') '#Package Data' WRITE(IU,'(A)') 'BEGIN PACKAGEDATA' WRITE(IU,'(A)') '# wellno radius bottom strt condeqn ngwnodes name' ELSE WRITE(IU,'(/A/)') '#Connection Data' WRITE(IU,'(A)') 'BEGIN CONNECTIONDATA' WRITE(IU,'(A)') '# wellno conn l r c stop sbot k rskin' ENDIF ENDIF DO I=1,NROWIPF !## start with current given layer number ILAY=TOPICS(ITOPIC)%STRESS(KPER)%FILES(1,ISYS)%ILAY IF(.NOT.UTL_READCSVENTRY(KU,STRING))EXIT READ(STRING(1),*,IOSTAT=IOS) X; IF(IOS.NE.0)EXIT READ(STRING(2),*,IOSTAT=IOS) Y; IF(IOS.NE.0)EXIT !## get correct cell-indices CALL IDFIROWICOL(BND(1),IROW,ICOL,X,Y) !## outside current model IF(IROW.EQ.0.OR.ICOL.EQ.0)CYCLE IF(ILAY.LE.0)THEN READ(STRING(4),*,IOSTAT=IOS) Z1; IF(IOS.NE.0)EXIT READ(STRING(5),*,IOSTAT=IOS) Z2; IF(IOS.NE.0)EXIT !## see whether there is an MNW at all present CALL PMANAGER_SAVEMF2005_PCK_ULSTRD_PARAM(PRJNLAY,ICOL,IROW,TOP,BOT,KDW,TP,BT,KH,.TRUE.) CALL UTL_PCK_GETTLP(PRJNLAY,TLP,KH,TP,BT,Z1,Z2,0.0D0) ELSE TLP(ILAY)=1.0D0 ! !# not present in current model ! IF(BND(ILAY)%X(ICOL,IROW).LE.0.0D0)CYCLE ENDIF !## make sure mnw not constant head cell DO JLAY=1,PRJNLAY; IF(BND(JLAY)%X(ICOL,IROW).LE.0.0D0)TLP(JLAY)=0.0D0; ENDDO !# not present in current model IF(SUM(TLP).EQ.0.0D0)CYCLE NP_IPER(IPER)=NP_IPER(IPER)+1 !## write alphanumerical identification of well IF(IPER.EQ.0)THEN IF(ILAY.GT.0)NNODES= 1 !## single well screen layer given IF(ILAY.LE.0)NNODES=-1 !## single well screen layer determined IF(PBMAN%IFORMAT.NE.3)THEN LINE='WELLID_'//TRIM(ITOS(NP_IPER(IPER)))//','//TRIM(ITOS(NNODES)) !## identification WRITE(IU,'(A)') TRIM(LINE) ENDIF READ(STRING(ILOSS),*,IOSTAT=IOS) LOSSTYPE; IF(IOS.NE.0)EXIT !## losstype LOSSTYPE=UTL_CAP(LOSSTYPE,'U') SELECT CASE (TRIM(LOSSTYPE)) CASE ('NONE'); ILOSSTYPE=0 CASE ('THIEM'); ILOSSTYPE=1 CASE ('SKIN'); ILOSSTYPE=2 ! CASE ('GENERAL'); ILOSSTYPE=3 ! CASE ('SPECIFYCWC'); ILOSSTYPE=4 CASE DEFAULT CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Specified model ('//TRIM(LOSSTYPE)//') for well loss unknown'//CHAR(13)// & 'Select one of the following:'//CHAR(13)//'NONE, THIEM, SKIN','Error'); IOS=-1; RETURN ! 'Select one of the following:'//CHAR(13)//'NONE, THIEM, SKIN, GENERAL, SPECIFYCWC','Error'); IOS=-1; EXIT END SELECT IF(ILOSSTYPE.EQ.0.AND.NNODES.LT.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Specified model ('//TRIM(LOSSTYPE)//') for well cannot be'//CHAR(13)// & 'used in combination with ILAY=0','Error'); IOS=-1; RETURN ENDIF PUMPLOC=0 !## no location of pump intake or injection QLIMIT=0 !## pumpage not by constraints PPFLAG=0 !## head not adjusted for partial penetration of well - error in case ibound is zero !IF(NNODES.EQ. 1)PPFLAG=0 !## head not adjusted for partial penetration of well !IF(NNODES.EQ.-1)PPFLAG=1 !## head adjusted for partial penetration of well PUMPCAP=0 !## discharge not defined by head-capacity relation IF(PBMAN%IFORMAT.NE.3)THEN LINE=TRIM(LOSSTYPE)//','//TRIM(ITOS(PUMPLOC))//','//TRIM(ITOS(QLIMIT))//','//TRIM(ITOS(PPFLAG))//','//TRIM(ITOS(PUMPCAP)) WRITE(IU,'(A)') TRIM(LINE) ENDIF SELECT CASE (ILOSSTYPE) !## thiem CASE(1) READ(STRING(ILOSS+1),*,IOSTAT=IOS) RW; IF(IOS.NE.0)EXIT IF(PBMAN%IFORMAT.NE.3)THEN LINE=TRIM(RTOS(RW,'F',2)); WRITE(IU,'(A)') TRIM(LINE) ENDIF !## skin CASE(2) READ(STRING(ILOSS+1),*,IOSTAT=IOS) RW; IF(IOS.NE.0)EXIT READ(STRING(ILOSS+2),*,IOSTAT=IOS) RSKIN; IF(IOS.NE.0)EXIT READ(STRING(ILOSS+3),*,IOSTAT=IOS) KSKIN; IF(IOS.NE.0)EXIT IF(PBMAN%IFORMAT.NE.3)THEN LINE=TRIM(RTOS(RW,'F',2))//','//TRIM(RTOS(RSKIN,'F',2))//','//TRIM(RTOS(KSKIN,'F',2)); WRITE(IU,'(A)') TRIM(LINE) ENDIF END SELECT IF(PBMAN%IFORMAT.NE.3)THEN IF(NNODES.GT.0)THEN LINE=TRIM(ITOS(ILAY))//','//TRIM(ITOS(IROW))//','//TRIM(ITOS(ICOL)) WRITE(IU,'(A)') TRIM(LINE) ELSE LINE=TRIM(RTOS(Z1,'F',2))//','//TRIM(RTOS(Z2,'F',2))//','//TRIM(ITOS(IROW))//','//TRIM(ITOS(ICOL)) WRITE(IU,'(A)') TRIM(LINE) ENDIF ELSE IF(IDIM.EQ.1)THEN NGWFNODES=0; DO JLAY=1,PRJNLAY; IF(TLP(JLAY).NE.0.0D0)NGWFNODES=NGWFNODES+1; ENDDO LINE=TRIM(ITOS(NP_IPER(IPER)))//','//TRIM(RTOS(RW,'F',2))//','//TRIM(RTOS(Z2,'F',2))//','//TRIM(RTOS(Z1,'F',2))//',THIEM,'//TRIM(ITOS(NGWFNODES)) WRITE(IU,'(A)') TRIM(LINE) ELSE ICON=0; DO JLAY=1,PRJNLAY IF(TLP(JLAY).EQ.0.0D0)CYCLE ICON=ICON+1 LINE=TRIM(ITOS(NP_IPER(IPER)))//','//TRIM(ITOS(ICON))//','//TRIM(ITOS(JLAY))//','//TRIM(ITOS(IROW))//','//TRIM(ITOS(ICOL))// & ','//TRIM(RTOS(TOP(JLAY)%X(ICOL,IROW),'F',2))//','//TRIM(RTOS(BOT(JLAY)%X(ICOL,IROW),'F',2))//',0.0,0.0' WRITE(IU,'(A)') TRIM(LINE) ENDDO ENDIF ENDIF ELSE !## get discharge - always on position 3 IF(IEXT.EQ.0)THEN READ(STRING(3),*,IOSTAT=IOS) Q; IF(IOS.NE.0)EXIT ELSE !## get id number - can be any column READ(STRING(IEXT),*,IOSTAT=IOS) ID; IF(IOS.NE.0)EXIT IF(.NOT.UTL_PCK_READTXT(2,ITIME,JTIME,Q,TRIM(CDIR)//'\'//TRIM(ID)//'.'//TRIM(EXT),0,'',2,NCOUNT))THEN IOS=-1; EXIT ENDIF IF(NCOUNT.LE.0.0D0)Q=0.0D0 ENDIF !## use factor/impulse Q=Q*FCT; Q=Q+IMP IF(PBMAN%IFORMAT.NE.3)THEN LINE='WELLID_'//TRIM(ITOS(NP_IPER(IPER)))//','//TRIM(RTOS(Q,'G',7)) WRITE(JU,'(A)') TRIM(LINE) ELSE LINE=TRIM(ITOS(NP_IPER(IPER)))//' STATUS ACTIVE' WRITE(JU,'(A)') TRIM(LINE) LINE=TRIM(ITOS(NP_IPER(IPER)))//' RATE '//TRIM(RTOS(Q,'G',7)) WRITE(JU,'(A)') TRIM(LINE) !## reduction in qwel-fraction of filter-screen size F=(Z1-Z2)*PBMAN%QWEL LINE=TRIM(ITOS(NP_IPER(IPER)))//' RATE_SCALING '//TRIM(RTOS(Z2,'G',7))//' '//TRIM(RTOS(F,'G',7)) WRITE(JU,'(A)') TRIM(LINE) ENDIF ENDIF ENDDO IF(IOS.NE.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error reading IPF file'//CHAR(13)//TRIM(SFNAME)//CHAR(13)// & 'Linenumber '//TRIM(ITOS(I)),'Error'); RETURN ENDIF IF(IPER.EQ.0.AND.PBMAN%IFORMAT.EQ.3)THEN IF(IDIM.EQ.1)THEN WRITE(IU,'(A)') 'END PACKAGEDATA' ELSE WRITE(IU,'(A)') 'END CONNECTIONDATA' ENDIF ENDIF DEALLOCATE(STRING); CLOSE(KU) ENDDO ENDDO IF(IOS.NE.0)EXIT IF(PBMAN%IFORMAT.EQ.3)THEN ! IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN ! LINE=TRIM(ITOS(NP)); WRITE(IU,'(A)') TRIM(LINE) ! ENDIF IF(IPER.GT.0)THEN IF(NP_IPER(IPER).GT.0)THEN SFNAME=EXFNAME N=3 IF(PBMAN%SSYSTEM.EQ.0.AND.PBMAN%IFORMAT.EQ.3)N=5 IF(PBMAN%SSYSTEM.EQ.1.AND.PBMAN%IFORMAT.EQ.3)N=4 DO I=1,N; SFNAME=SFNAME(:INDEX(SFNAME,'\',.TRUE.)-1); ENDDO I=LEN_TRIM(SFNAME); SFNAME='.'//EXFNAME(I+1:) IF(PBMAN%IPESTP.EQ.1)SFNAME='.'//TRIM(SFNAME) WRITE(IU,'(/A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER)) WRITE(IU,'(A)') 'OPEN/CLOSE '//TRIM(SFNAME)//' 1.0D0 (FREE) -1' WRITE(IU,'(A)') 'END PERIOD' ELSE !## write period-block to make sure new information is contained IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IU,'(/A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER)) WRITE(IU,'(A)') 'END PERIOD' ENDIF ENDIF ENDIF ENDIF !## store previous stress-period information for this timestep IF(IPER.GT.0)LPER=KPER ENDDO CLOSE(IU) !## store maximum number of well in simulation NP_IPER(0)=MAXVAL(NP_IPER(1:PRJNPER)) IF(IOS.EQ.0)THEN !## mf6 does not accept zero boundaries IF(PBMAN%IFORMAT.EQ.3)THEN MP=MAX(1,NP_IPER(0)) IF(PBMAN%SSYSTEM.EQ.0)THEN CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'_SYS'//TRIM(ITOS(ISYSMF6))//'.'//CPCK//VTXT//'_',(/MP/)) ELSE CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',(/MP/)) ENDIF ELSE CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',NP_IPER) ENDIF PMANAGER_SAVEMF2005_MNW2=.TRUE. ENDIF ! IF(IOS.EQ.0)THEN ! CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.'//CPCK//TRIM(VTXT)//'_',NP_IPER) ! PMANAGER_SAVEMF2005_MNW2=.TRUE. ! ENDIF ENDDO DEALLOCATE(TLP,KH,TP,BT,NP_IPER) END FUNCTION PMANAGER_SAVEMF2005_MNW2 !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_ISG(DIR,DIRMNAME,IBATCH,IACT,ICB,CPCK,IPRT) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IBATCH,ICB,IPRT,IACT CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME,CPCK REAL(KIND=DP_KIND) :: FCT,IMP,CNST CHARACTER(LEN=256) :: SFNAME,EXFNAME CHARACTER(LEN=30) :: FRM INTEGER :: IU,JU,ILAY,I,ISYS,KPER,IPER,NTOP,NSYS,ICNST,ICOL,IROW,JSYS,ISYSMF6,NSYSMF6,IS1,IS2 INTEGER,DIMENSION(2) :: NP INTEGER(KIND=8) :: ITIME,JTIME TYPE(GRIDISGOBJ) :: GRIDISG CHARACTER(LEN=1) :: VTXT LOGICAL :: LEX IF(IACT.EQ.0)THEN; PMANAGER_SAVEMF2005_ISG=.TRUE.; RETURN; ENDIF PMANAGER_SAVEMF2005_ISG=.FALSE. VTXT='7'; IF(PBMAN%IFORMAT.EQ.3)VTXT='6' !## only export if not existing currently IF(PBMAN%IEXPORTMF2005.EQ.-1)THEN INQUIRE(FILE=TRIM(DIRMNAME)//'.'//CPCK//VTXT,EXIST=LEX) IF(LEX)THEN; PMANAGER_SAVEMF2005_ISG=.TRUE.; RETURN; ENDIF ENDIF !## in case MF6 is used, apply systems per package IF(PBMAN%SSYSTEM.EQ.0.AND.PBMAN%IFORMAT.EQ.3)THEN NSYSMF6=PMANAGER_GETNSYS(TISG,2) ELSE NSYSMF6=1 ENDIF DO ISYSMF6=1,NSYSMF6 IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.'//CPCK//VTXT//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.'//CPCK//VTXT//'...' IU=UTL_GETUNIT() IF(PBMAN%SSYSTEM.EQ.0.AND.PBMAN%IFORMAT.EQ.3)THEN CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'_SYS'//TRIM(ITOS(ISYSMF6))//'.'//CPCK//VTXT//'_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ELSE CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ENDIF IF(IU.EQ.0)RETURN IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IU,'(A)') '# '//CPCK//VTXT//' File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(/A/)') '#General Options' WRITE(IU,'(A)') 'BEGIN OPTIONS' ! WRITE(IU,'(A)') ' AUXILIARY ' ! WRITE(IU,'(A)') ' AUXMULTNAME ' ! WRITE(IU,'(A)') ' BOUNDNAMES' ! WRITE(IU,'(A)') ' PRINT_INPUT' ! WRITE(IU,'(A)') ' PRINT_FLOWS' IF(ASSOCIATED(PBMAN%ISAVE(TRIV)%ILAY))WRITE(IU,'(A)') ' SAVE_FLOWS' ! WRITE(IU,'(A)') ' TS6 FILEIN ' ! WRITE(IU,'(A)') ' OBS6 FILEIN ' ! WRITE(IU,'(A)') ' MOVER' WRITE(IU,'(A)') 'END OPTIONS' WRITE(IU,'(/A/)') '#General Dimensions' WRITE(IU,'(A)') 'BEGIN DIMENSIONS' WRITE(IU,'(A)') 'MAXBOUND NaN1#' WRITE(IU,'(A)') 'END DIMENSIONS' ENDIF IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN IF(PBMAN%INFFCT.EQ.1)THEN LINE='NaN1#,'//TRIM(ITOS(ICB))//' AUX ISUB RSUBSYS ISUB NOPRINT' ELSE LINE='NaN1#,'//TRIM(ITOS(ICB))//' AUX RFCT AUX ISUB RFACT RFCT RSUBSYS ISUB NOPRINT' ENDIF WRITE(IU,'(A)') TRIM(LINE) ENDIF WRITE(FRM,'(A9,I2.2,A14)') '(3(I5,1X),',1,'(G15.7,1X),I5)' !## create subfolders CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//VTXT) CALL PMANAGER_SAVEMF2005_ALLOCATEPCK(PRJNLAY,TISG) NP=0 GRIDISG%XMIN=BND(1)%XMIN; GRIDISG%YMIN=BND(1)%YMIN GRIDISG%XMAX=BND(1)%XMAX; GRIDISG%YMAX=BND(1)%YMAX GRIDISG%IDIM=0 GRIDISG%CS=BND(1)%DX !## cellsize GRIDISG%MINDEPTH=0.1 GRIDISG%WDEPTH=0.0D0 GRIDISG%ICDIST=1 !## compute influence of structures GRIDISG%ISIMGRO=0 !## no simgro GRIDISG%IEXPORT=1 !## modflow river files GRIDISG%POSTFIX='' GRIDISG%NODATA=-999.99D0 GRIDISG%ISAVE=1 GRIDISG%MAXWIDTH=1000.0D0 GRIDISG%IAVERAGE=1 IF(BND(1)%IEQ.EQ.1)THEN GRIDISG%NCOL=BND(1)%NCOL; GRIDISG%NROW=BND(1)%NROW ALLOCATE(GRIDISG%DELR(0:BND(1)%NCOL)) DO ICOL=0,GRIDISG%NCOL; GRIDISG%DELR(ICOL)=BND(1)%SX(ICOL); ENDDO ALLOCATE(GRIDISG%DELC(0:BND(1)%NROW)) DO IROW=0,GRIDISG%NROW; GRIDISG%DELC(IROW)=BND(1)%SY(IROW); ENDDO ELSE GRIDISG%NCOL=0; GRIDISG%NROW=0 ENDIF DO IPER=1,PRJNPER !## reset only for isg to riv conversion NP(1)=0 !## get appropriate stress-period to store in runfile KPER=PMANAGER_GETCURRENTIPER(IPER,TISG,ITIME,JTIME) !## always export rivers per stress-period IF(PBMAN%DISG.EQ.1)KPER=ABS(KPER) !## output WRITE(IPRT,'(1X,A,2I10,2(1X,I14))') 'Exporting timestep ',IPER,KPER,ITIME,JTIME IF(IBATCH.EQ.1)WRITE(6,'(A,3I6,2(1X,I14))') '+Exporting timestep ',IPER,PRJNPER,KPER,ITIME,JTIME !## reuse previous timestep IF(KPER.LE.0)THEN IF(IPER.EQ.1)THEN WRITE(IU,'(I10)') 0 ELSE WRITE(IU,'(A)') '-1' ENDIF !## process next timestep CYCLE ENDIF ! IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(/A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER)) !## create subfolders IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//VTXT) EXFNAME=TRIM(DIR)//'\'//CPCK//VTXT//'\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR' ELSE IF(PBMAN%SSYSTEM.EQ.0)THEN CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//'6\SYS'//TRIM(ITOS(ISYSMF6))) EXFNAME=TRIM(DIR)//'\'//CPCK//'6\SYS'//TRIM(ITOS(ISYSMF6))//'\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR' ELSE CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//'6') EXFNAME=TRIM(DIR)//'\'//CPCK//'6\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR' ENDIF ENDIF JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=EXFNAME,STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(JU.EQ.0)RETURN !## ISG not yet supports timescales less than 1 day GRIDISG%SDATE=SIM(IPER)%IYR*10000+SIM(IPER)%IMH*100+SIM(IPER)%IDY GRIDISG%SDATE=UTL_IDATETOJDATE(GRIDISG%SDATE) GRIDISG%EDATE=GRIDISG%SDATE+MAX(1,INT(SIM(IPER)%DELT)) !## transient (2) or steady-state (1) GRIDISG%ISTEADY=2; IF(SIM(IPER)%DELT.EQ.0.0D0)GRIDISG%ISTEADY=1 !## output folder GRIDISG%ROOT=EXFNAME(1:INDEX(EXFNAME,'\',.TRUE.)-1) !## allocate memory for packages NTOP=SIZE(TOPICS(TISG)%STRESS(KPER)%FILES,1); NSYS=SIZE(TOPICS(TISG)%STRESS(KPER)%FILES,2) IF(PBMAN%SSYSTEM.EQ.0.AND.PBMAN%IFORMAT.EQ.3)THEN !## export current system only IS1=ISYSMF6; IS2=IS1 ELSE !## export all systems IS1=1; IS2=NSYS ENDIF !## number of systems DO ISYS=IS1,IS2 ICNST =TOPICS(TISG)%STRESS(KPER)%FILES(1,ISYS)%ICNST CNST =TOPICS(TISG)%STRESS(KPER)%FILES(1,ISYS)%CNST FCT =TOPICS(TISG)%STRESS(KPER)%FILES(1,ISYS)%FCT IMP =TOPICS(TISG)%STRESS(KPER)%FILES(1,ISYS)%IMP ILAY =TOPICS(TISG)%STRESS(KPER)%FILES(1,ISYS)%ILAY SFNAME=TOPICS(TISG)%STRESS(KPER)%FILES(1,ISYS)%FNAME !## save header only after last export GRIDISG%IEXPORTHDR=0; IF(ISYS.EQ.IS2)GRIDISG%IEXPORTHDR=1 IF(PBMAN%SSYSTEM.EQ.0)THEN JSYS=ISYS ELSE JSYS=1 ENDIF WRITE(IPRT,'(1X,A,I3,A1,I1,A1,I4.3,3(A1,G15.7),A1,A)') TOPICS(TISG)%TNAME(1:5)//',', & ISYS,',',ICNST,',',ILAY,',',FCT,',',IMP,',',CNST,',',CHAR(39)//TRIM(SFNAME)//CHAR(39) IF(ISGREAD((/SFNAME/),IBATCH))THEN !## translate again to idate as it will be convered to jdate in next subroutine GRIDISG%SDATE=UTL_JDATETOIDATE(GRIDISG%SDATE) GRIDISG%EDATE=UTL_JDATETOIDATE(GRIDISG%EDATE)-1 !<- edate is equal to sdate if one day is meant IF(.NOT.ISG2GRID(GRIDISG%POSTFIX,BND(1)%NROW,BND(1)%NCOL,PRJNLAY,ILAY,TOP,BOT,KHV,BND,VCW,IBATCH,NP,JU, & GRIDISG,SFT,TOPICS(TSFT)%IACT_MODEL,JSYS,FCT,IMP))EXIT CALL ISGDEAL(1); CALL ISGCLOSEFILES() ELSE !## stop processing CLOSE(IU); CALL PMANAGER_SAVEMF2005_DEALLOCATEPCK(); RETURN ENDIF ENDDO !## only for river package usage of external filename IF(PBMAN%IFORMAT.GE.2)THEN IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN LINE=TRIM(ITOS(NP(1))); WRITE(IU,'(A)') TRIM(LINE) ENDIF NP(2)=MAXVAL(NP) IF(NP(1).GT.0)THEN SFNAME=EXFNAME N=3 IF(PBMAN%SSYSTEM.EQ.0.AND.PBMAN%IFORMAT.EQ.3)N=5 IF(PBMAN%SSYSTEM.EQ.1.AND.PBMAN%IFORMAT.EQ.3)N=4 DO I=1,N; SFNAME=SFNAME(:INDEX(SFNAME,'\',.TRUE.)-1); ENDDO I=LEN_TRIM(SFNAME); SFNAME='.'//EXFNAME(I+1:) IF(PBMAN%IFORMAT.EQ.3.AND.PBMAN%IPESTP.EQ.1)SFNAME='.'//TRIM(SFNAME) IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(/A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER)) WRITE(IU,'(A)') 'OPEN/CLOSE '//TRIM(SFNAME)//' 1.0 (FREE) -1' IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(A)') 'END PERIOD' ENDIF IF(IU.NE.JU)CLOSE(JU) ELSE IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IU,'(/A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER)) WRITE(IU,'(A)') 'END PERIOD' ENDIF ENDIF ENDDO CLOSE(IU); CALL PMANAGER_SAVEMF2005_DEALLOCATEPCK() IF(ASSOCIATED(GRIDISG%DELR))DEALLOCATE(GRIDISG%DELR) IF(ASSOCIATED(GRIDISG%DELC))DEALLOCATE(GRIDISG%DELC) !## no error occured IF(IPER.GT.NPER)THEN !## mf6 does not accept zero boundaries IF(PBMAN%IFORMAT.EQ.3)THEN IF(PBMAN%SSYSTEM.EQ.0)THEN CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'_SYS'//TRIM(ITOS(ISYSMF6))//'.'//CPCK//VTXT//'_',(/NP(2)/)) ELSE CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',(/NP(2)/)) ENDIF ELSE CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',(/NP(2)/)) ENDIF PMANAGER_SAVEMF2005_ISG=.TRUE. ENDIF ENDDO END FUNCTION PMANAGER_SAVEMF2005_ISG !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_SFR(DIR,DIRMNAME,IBATCH,IACT,ICB,CPCK,IPRT) !###====================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),PARAMETER :: CONST=86400.0D0 !## conversion to m3/day REAL(KIND=DP_KIND),PARAMETER :: DLEAK=0.001D0 INTEGER,INTENT(IN) :: IBATCH,ICB,IPRT,IACT CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME,CPCK REAL(KIND=DP_KIND) :: FCT,IMP,CNST CHARACTER(LEN=256) :: SFNAME,EXFNAME CHARACTER(LEN=30) :: FRM INTEGER :: IU,JU,ILAY,I,ISYS,KPER,IPER,NTOP,NSYS,ICNST,ICOL,IROW,JSYS INTEGER,DIMENSION(2) :: NP INTEGER(KIND=8) :: ITIME,JTIME TYPE(GRIDISGOBJ) :: GRIDISG CHARACTER(LEN=1) :: VTXT LOGICAL :: LEX IF(IACT.EQ.0)THEN; PMANAGER_SAVEMF2005_SFR=.TRUE.; RETURN; ENDIF PMANAGER_SAVEMF2005_SFR=.FALSE. VTXT='7'; IF(PBMAN%IFORMAT.EQ.3)VTXT='6' !## only export if not existing currently IF(PBMAN%IEXPORTMF2005.EQ.-1)THEN INQUIRE(FILE=TRIM(DIRMNAME)//'.'//CPCK//VTXT,EXIST=LEX) IF(LEX)THEN; PMANAGER_SAVEMF2005_SFR=.TRUE.; RETURN; ENDIF ENDIF !## check number of systems NSYS=PMANAGER_GETNSYS(TSFR,2) IF(NSYS.NE.1)THEN IF(IBATCH.EQ.0)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You cannot use more than 1 SFR entry in the PRJ-file','Error') IF(IBATCH.EQ.1)WRITE(*,'(/A/)') 'You cannot use more than 1 SFR entry in the PRJ-file' RETURN ENDIF IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.'//CPCK//VTXT//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.'//CPCK//VTXT//'...' IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') IF(IU.EQ.0)RETURN IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IU,'(A)') '# '//CPCK//VTXT//' File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(/A/)') '#General Options' WRITE(IU,'(A)') 'BEGIN OPTIONS' ! WRITE(IU,'(A)') ' AUXILIARY ' ! WRITE(IU,'(A)') ' AUXMULTNAME ' ! WRITE(IU,'(A)') ' BOUNDNAMES' ! WRITE(IU,'(A)') ' PRINT_INPUT' ! WRITE(IU,'(A)') ' PRINT_FLOWS' IF(ASSOCIATED(PBMAN%ISAVE(TRIV)%ILAY))WRITE(IU,'(A)') ' SAVE_FLOWS' ! WRITE(IU,'(A)') ' TS6 FILEIN ' ! WRITE(IU,'(A)') ' OBS6 FILEIN ' ! WRITE(IU,'(A)') ' MOVER' WRITE(IU,'(A)') 'END OPTIONS' WRITE(IU,'(/A/)') '#General Dimensions' WRITE(IU,'(A)') 'BEGIN DIMENSIONS' WRITE(IU,'(A)') 'MAXBOUND NaN1#' WRITE(IU,'(A)') 'END DIMENSIONS' ENDIF IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN LINE='NaN2#,NaN1#,0,0,'//TRIM(RTOS(CONST,'G',7))//','//TRIM(RTOS(DLEAK,'E',4))//','// & TRIM(ITOS(ICB))//','//TRIM(ITOS(ISFRCB2))//' NOPRINT' WRITE(IU,'(A)') TRIM(LINE) ENDIF WRITE(FRM,'(A9,I2.2,A14)') '(3(I5,1X),',1,'(G15.7,1X),I5)' !## create subfolders CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//VTXT) CALL PMANAGER_SAVEMF2005_ALLOCATEPCK(PRJNLAY,TSFR) NP=0 GRIDISG%XMIN=BND(1)%XMIN; GRIDISG%YMIN=BND(1)%YMIN GRIDISG%XMAX=BND(1)%XMAX; GRIDISG%YMAX=BND(1)%YMAX GRIDISG%IDIM=0 GRIDISG%CS=BND(1)%DX !## cellsize GRIDISG%MINDEPTH=0.1 GRIDISG%WDEPTH=0.0D0 GRIDISG%ICDIST=1 !## compute influence of structures GRIDISG%ISIMGRO=0 !## no simgro GRIDISG%IEXPORT=1 !## modflow river files IF(BND(1)%IEQ.EQ.1)THEN GRIDISG%NCOL=BND(1)%NCOL; GRIDISG%NROW=BND(1)%NROW ALLOCATE(GRIDISG%DELR(0:BND(1)%NCOL)) DO ICOL=0,GRIDISG%NCOL; GRIDISG%DELR(ICOL)=BND(1)%SX(ICOL); ENDDO ALLOCATE(GRIDISG%DELC(0:BND(1)%NROW)) DO IROW=0,GRIDISG%NROW; GRIDISG%DELC(IROW)=BND(1)%SY(IROW); ENDDO ELSE GRIDISG%NCOL=0; GRIDISG%NROW=0 ENDIF GRIDISG%POSTFIX='' GRIDISG%NODATA=-999.99D0 GRIDISG%ISAVE=1 GRIDISG%MAXWIDTH=1000.0D0 GRIDISG%IAVERAGE=1 DO IPER=1,PRJNPER !## get appropriate stress-period to store in runfile KPER=PMANAGER_GETCURRENTIPER(IPER,TSFR,ITIME,JTIME) !## always export streamflow routing per stress-period IF(PBMAN%DSFR.EQ.1)KPER=ABS(KPER) !## output WRITE(IPRT,'(1X,A,2I10,2(1X,I14))') 'Exporting timestep ',IPER,KPER,ITIME,JTIME IF(IBATCH.EQ.1)WRITE(6,'(A,3I6,2(1X,I14))') '+Exporting timestep ',IPER,PRJNPER,KPER,ITIME,JTIME !## reuse previous timestep IF(KPER.LE.0)THEN IF(IPER.EQ.1)THEN WRITE(IU,'(I10)') 0 ELSE !## do not print input data WRITE(IU,'(A)') '-1,'//TRIM(ITOS(IRDFLG))//',0,0' ENDIF !## process next timestep CYCLE ENDIF ! IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(/A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER)) JU=IU !## ISG not yet supports timescales less than 1 day GRIDISG%SDATE=SIM(IPER)%IYR*10000+SIM(IPER)%IMH*100+SIM(IPER)%IDY GRIDISG%SDATE=UTL_IDATETOJDATE(GRIDISG%SDATE) GRIDISG%EDATE=GRIDISG%SDATE+MAX(1,INT(SIM(IPER)%DELT)) !## transient (2) or steady-state (1) GRIDISG%ISTEADY=2; IF(SIM(IPER)%DELT.EQ.0.0D0)GRIDISG%ISTEADY=1 EXFNAME=TRIM(DIR)//'\'//CPCK//VTXT//'\'//CPCK//'.ISG' GRIDISG%ROOT=EXFNAME(1:INDEX(EXFNAME,'\',.TRUE.)-1) !## allocate memory for packages NTOP=SIZE(TOPICS(TSFR)%STRESS(KPER)%FILES,1); NSYS=SIZE(TOPICS(TSFR)%STRESS(KPER)%FILES,2) !## number of systems ISYS=1 ICNST =TOPICS(TSFR)%STRESS(KPER)%FILES(1,ISYS)%ICNST CNST =TOPICS(TSFR)%STRESS(KPER)%FILES(1,ISYS)%CNST FCT =TOPICS(TSFR)%STRESS(KPER)%FILES(1,ISYS)%FCT IMP =TOPICS(TSFR)%STRESS(KPER)%FILES(1,ISYS)%IMP ILAY =TOPICS(TSFR)%STRESS(KPER)%FILES(1,ISYS)%ILAY SFNAME=TOPICS(TSFR)%STRESS(KPER)%FILES(1,ISYS)%FNAME WRITE(IPRT,'(1X,A,I3,A1,I1,A1,I4.3,3(A1,G15.7),A1,A)') TOPICS(TSFR)%TNAME(1:5)//',', & ISYS,',',ICNST,',',ILAY,',',FCT,',',IMP,',',CNST,',',CHAR(39)//TRIM(SFNAME)//CHAR(39) !## read the isg-file - once IF(IPER.EQ.1)THEN IF(.NOT.ISGREAD((/SFNAME/),IBATCH))THEN !## stop processing CLOSE(IU); CALL PMANAGER_SAVEMF2005_DEALLOCATEPCK(); RETURN ENDIF ENDIF !## translate again to idate as it will be convered to jdate in next subroutine GRIDISG%SDATE=UTL_JDATETOIDATE(GRIDISG%SDATE) GRIDISG%EDATE=UTL_JDATETOIDATE(GRIDISG%EDATE)-1 !<- edate is equal to sdate if one day is meant IF(.NOT.ISG2SFR(BND(1)%NROW,BND(1)%NCOL,PRJNLAY,ILAY,IPER,PRJNPER,NP,JU,GRIDISG,EXFNAME,TOP,BOT,FCT,IMP))EXIT ENDDO CALL ISGDEAL(1); CALL ISGCLOSEFILES() CLOSE(IU); CALL PMANAGER_SAVEMF2005_DEALLOCATEPCK() IF(ASSOCIATED(GRIDISG%DELR))DEALLOCATE(GRIDISG%DELR) IF(ASSOCIATED(GRIDISG%DELC))DEALLOCATE(GRIDISG%DELC) !## no error occured IF(IPER.GT.NPER)THEN CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',NP) PMANAGER_SAVEMF2005_SFR=.TRUE. ENDIF END FUNCTION PMANAGER_SAVEMF2005_SFR !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,IACT,ITOPIC,ICB,CPCKIN,JTOP,IPRT) !###====================================================================== IMPLICIT NONE INTEGER,PARAMETER :: IFHBSS=0,NFHBX1=0,NFHBX2=0 INTEGER,INTENT(IN) :: IBATCH,ITOPIC,ICB,IPRT INTEGER,INTENT(IN),DIMENSION(:) :: JTOP INTEGER,INTENT(IN) :: IACT CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME,CPCKIN REAL(KIND=DP_KIND) :: Z1,Z2,FCT,IMP,CNST,OLFCOND,FHBDATE,F CHARACTER(LEN=256) :: SFNAME,EXFNAME CHARACTER(LEN=3) :: CPCK CHARACTER(LEN=40) :: FRM INTEGER :: IU,JU,ILAY,IROW,ICOL,I,J,KTOP,KPER,IPER,NTOP,SCL_D,SCL_U,ICNST,NSYS,ISYS,JSYS,MP,N,IIPER,KKPER, & NBDTIM,NHED,NFLW,IFBND,NRCHOP,NEVTOP,NUZTOP,INRECH,INSURF,INEVTR,INEXDP,LPER,NUZF1,NUZF2,NUZF3,NUZF4, & ISYSMF6,NSYSMF6,JLAY,IS1,IS2,NINACTIVE,LANDFLAG,IVERTCON,IINV !,INRLYR REAL(KIND=DP_KIND),ALLOCATABLE,DIMENSION(:) :: TLP,KH,TP,BT,XTMP INTEGER(KIND=8) :: ITIME,JTIME REAL(KIND=DP_KIND),PARAMETER :: MINKHT=0.0D0 INTEGER :: JD0,JD1,ISEC0,ISEC1,NUZGAG,IRUNFLG,IEQUAL,ICHECK INTEGER,ALLOCATABLE,DIMENSION(:,:) :: JEQUAL,ITMP REAL(KIND=DP_KIND) :: DDAY,DSEC,VKS,WP,CD,BH,FC,QFHB,CONC CHARACTER(LEN=1) :: VTXT CHARACTER(LEN=20) :: COMMENT LOGICAL :: LCHKCHD,LEX TYPE(IDFOBJ) :: FLXDRL,FLXDRR,FLXPLN,FLXNOPP,FLXSOPP IF(IACT.EQ.0)THEN; PMANAGER_SAVEMF2005_PCK=.TRUE.; RETURN; ENDIF PMANAGER_SAVEMF2005_PCK=.FALSE. CPCK=CPCKIN VTXT='7'; IF(PBMAN%IFORMAT.EQ.3)VTXT='6' !## only export if not existing currently IF(PBMAN%IEXPORTMF2005.EQ.-1)THEN INQUIRE(FILE=TRIM(DIRMNAME)//'.'//CPCK//VTXT,EXIST=LEX) IF(LEX)THEN; PMANAGER_SAVEMF2005_PCK=.TRUE.; RETURN; ENDIF ENDIF IF(PBMAN%FLEXD.EQ.1)THEN CALL IDFNULLIFY(FLXDRL); CALL IDFNULLIFY(FLXDRR); CALL IDFNULLIFY(FLXPLN) CALL IDFCOPY(PRJIDF,FLXDRL); CALL IDFCOPY(PRJIDF,FLXDRR); CALL IDFCOPY(PRJIDF,FLXPLN) CALL IDFNULLIFY(FLXNOPP); CALL IDFNULLIFY(FLXSOPP) CALL IDFCOPY(PRJIDF,FLXNOPP); CALL IDFCOPY(PRJIDF,FLXSOPP) !## read nopp SCL_U=5; SCL_D=0; IINV=0; FCT=TOPICS(TCAP)%STRESS(1)%FILES(10,1)%FCT; IMP=TOPICS(TCAP)%STRESS(1)%FILES(10,1)%IMP ICNST=TOPICS(TCAP)%STRESS(1)%FILES(10,1)%ICNST IF(ICNST.EQ.1)THEN FLXNOPP%X=TOPICS(TCAP)%STRESS(1)%FILES(10,1)%CNST ELSE IF(.NOT.IDFREADSCALE(TOPICS(TCAP)%STRESS(1)%FILES(10,1)%FNAME,FLXNOPP,SCL_U,SCL_D,1.0D0,0))RETURN ENDIF CALL PMANAGER_SAVEMF2005_FCTIMP(IINV,ICNST,FLXNOPP,FCT,IMP,SCL_U) !## read sopp SCL_U=5; SCL_D=0; IINV=0; FCT=TOPICS(TCAP)%STRESS(1)%FILES(11,1)%FCT; IMP=TOPICS(TCAP)%STRESS(1)%FILES(11,1)%IMP ICNST=TOPICS(TCAP)%STRESS(1)%FILES(11,1)%ICNST IF(ICNST.EQ.1)THEN FLXSOPP%X=TOPICS(TCAP)%STRESS(1)%FILES(11,1)%CNST ELSE IF(.NOT.IDFREADSCALE(TOPICS(TCAP)%STRESS(1)%FILES(11,1)%FNAME,FLXSOPP,SCL_U,SCL_D,1.0D0,0))RETURN ENDIF CALL PMANAGER_SAVEMF2005_FCTIMP(IINV,ICNST,FLXSOPP,FCT,IMP,SCL_U) !## read plot number SCL_U=7; SCL_D=0; IINV=0; FCT=TOPICS(TCAP)%STRESS(1)%FILES(23,1)%FCT; IMP=TOPICS(TCAP)%STRESS(1)%FILES(23,1)%IMP ICNST=TOPICS(TCAP)%STRESS(1)%FILES(23,1)%ICNST IF(ICNST.EQ.1)THEN FLXPLN%X=TOPICS(TCAP)%STRESS(1)%FILES(23,1)%CNST ELSE IF(.NOT.IDFREADSCALE(TOPICS(TCAP)%STRESS(1)%FILES(23,1)%FNAME,FLXPLN,SCL_U,SCL_D,1.0D0,0))RETURN ENDIF CALL PMANAGER_SAVEMF2005_FCTIMP(IINV,ICNST,FLXPLN,FCT,IMP,SCL_U) !## read metaswap level-controlled drainage IPF file (if needed) ALLOCATE(ITMP(PRJIDF%NCOL,PRJIDF%NROW)) DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(FLXPLN%X(ICOL,IROW).EQ.FLXPLN%NODATA)THEN ITMP(ICOL,IROW)=0 ELSE ITMP(ICOL,IROW)=INT(FLXPLN%X(ICOL,IROW)) ENDIF ENDDO; ENDDO IF(.NOT.PMANAGER_SAVEMF2005_MSP_READIPF_FLEXD(TOPICS(TCAP)%STRESS(1)%FILES(24,1)%FNAME,IBATCH,ITMP,0))RETURN DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL FLXPLN%X(ICOL,IROW)=REAL(ITMP(ICOL,IROW),8) ENDDO; ENDDO DEALLOCATE(ITMP) !# read drainage files SCL_U=2; SCL_D=1; IINV=0; FCT=TOPICS(TCAP)%STRESS(1)%FILES(25,1)%FCT; IMP=TOPICS(TCAP)%STRESS(1)%FILES(25,1)%IMP ICNST=TOPICS(TCAP)%STRESS(1)%FILES(25,1)%ICNST IF(ICNST.EQ.1)THEN FLXDRL%X=TOPICS(TCAP)%STRESS(1)%FILES(25,1)%CNST ELSE IF(.NOT.IDFREADSCALE(TOPICS(TCAP)%STRESS(1)%FILES(25,1)%FNAME,FLXDRL,SCL_U,SCL_D,1.0D0,0))RETURN ENDIF CALL PMANAGER_SAVEMF2005_FCTIMP(IINV,ICNST,FLXDRL,FCT,IMP,SCL_U) SCL_U=6; SCL_D=1; IINV=0; FCT=TOPICS(TCAP)%STRESS(1)%FILES(26,1)%FCT; IMP=TOPICS(TCAP)%STRESS(1)%FILES(26,1)%IMP ICNST=TOPICS(TCAP)%STRESS(1)%FILES(26,1)%ICNST IF(ICNST.EQ.1)THEN FLXDRR%X=TOPICS(TCAP)%STRESS(1)%FILES(26,1)%CNST ELSE IF(.NOT.IDFREADSCALE(TOPICS(TCAP)%STRESS(1)%FILES(26,1)%FNAME,FLXDRR,SCL_U,SCL_D,1.0D0,0))RETURN ENDIF CALL PMANAGER_SAVEMF2005_FCTIMP(IINV,ICNST,FLXDRR,FCT,IMP,SCL_U) !## clean drainage based upon plot number DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL !## no steering location present for this plotnumber IF(FLXPLN%X(ICOL,IROW).NE.FLXPLN%NODATA)THEN IF(FLXPLN%X(ICOL,IROW).GT.SIZE(IPFFLX))FLXPLN%X(ICOL,IROW)=FLXPLN%NODATA ENDIF IF(FLXPLN%X(ICOL,IROW).EQ.FLXPLN%NODATA.OR.FLXPLN%X(ICOL,IROW).EQ.0.0D0)THEN FLXDRL%X(ICOL,IROW)=FLXDRL%NODATA; FLXDRR%X(ICOL,IROW)=FLXDRR%NODATA ENDIF IF(FLXDRL%X(ICOL,IROW).EQ.FLXDRL%NODATA)FLXDRR%X(ICOL,IROW)=FLXDRR%NODATA IF(FLXDRR%X(ICOL,IROW).EQ.FLXDRR%NODATA)FLXDRL%X(ICOL,IROW)=FLXDRL%NODATA ENDDO; ENDDO IF(ALLOCATED(IPFFLX))DEALLOCATE(IPFFLX) ENDIF !## in case MF6 is used, apply systems per package IF(PBMAN%SSYSTEM.EQ.0.AND.PBMAN%IFORMAT.EQ.3)THEN NSYSMF6=PMANAGER_GETNSYS(ITOPIC,2) ELSE NSYSMF6=1 ENDIF NINACTIVE=0 DO ISYSMF6=1,NSYSMF6 IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.'//CPCK//VTXT//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.'//CPCK//VTXT//'...' IU=UTL_GETUNIT() IF(PBMAN%SSYSTEM.EQ.0.AND.PBMAN%IFORMAT.EQ.3)THEN CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'_SYS'//TRIM(ITOS(ISYSMF6))//'.'//CPCK//VTXT//'_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ELSE CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ENDIF IF(IU.EQ.0)RETURN IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IU,'(A)') '# '//CPCK//VTXT//' File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(/A/)') '#General Options' WRITE(IU,'(A)') 'BEGIN OPTIONS' ! WRITE(IU,'(A)') ' AUXMULTNAME ' !## use numerical decline of drainage in case of unconfinedness IF(ITOPIC.EQ.TDRN.AND.PBMAN%DDRN.NE.0.0)THEN WRITE(IU,'(A)') ' AUXILIARY DDRN' WRITE(IU,'(A)') ' AUXDEPTHNAME DDRN' ENDIF ! IF(ITOPIC.EQ.TRCH)THEN ! WRITE(IU,'(A)') ' FIXED_CELL' ! (EVT/RCH NIET VERPLAATSEN NAAR ACTIVE CEL) ! ENDIF ! WRITE(IU,'(A)') ' BOUNDNAMES' ! WRITE(IU,'(A)') ' PRINT_INPUT' ! WRITE(IU,'(A)') ' PRINT_FLOWS' IF(ASSOCIATED(PBMAN%ISAVE(ITOPIC)%ILAY))WRITE(IU,'(1X,A)') 'SAVE_FLOWS' ! WRITE(IU,'(A)') ' TS6 FILEIN ' ! WRITE(IU,'(A)') ' OBS6 FILEIN ' ! WRITE(IU,'(A)') ' MOVER' ! WRITE(IU,'(A)') SURF_RATE_SPECIFIED (EVT) IF(ITOPIC.EQ.TUZF)THEN WRITE(IU,'(A)') ' UNSAT_ETWC' !## simulate ET from unsaturated zone WRITE(IU,'(A)') ' SIMULATE_ET' !## simluate ET from groundwater WRITE(IU,'(A)') ' LINEAR_GWET' !## apply linear ET similar to MF2005 ENDIF WRITE(IU,'(A)') 'END OPTIONS' WRITE(IU,'(/A/)') '#General Dimensions' WRITE(IU,'(A)') 'BEGIN DIMENSIONS' IF(ITOPIC.EQ.TUZF)THEN WRITE(IU,'(A)') 'NUZFCELLS NaN1#' WRITE(IU,'(A)') 'NTRAILWAVES 7' WRITE(IU,'(A)') 'NWAVESETS 40' ELSE WRITE(IU,'(A)') 'MAXBOUND NaN1#' ENDIF WRITE(IU,'(A)') 'END DIMENSIONS' ENDIF !## write header of file SELECT CASE (ITOPIC) !## uzf !NUZTOP=1 !## recharge specified to top cell CASE (TUZF); NUZGAG=0; IRUNFLG=0; NUZTOP=1 !PBMAN%NLOGLOC IF(PBMAN%IFORMAT.NE.3)THEN !## define initial water content IF(SIM(1)%DELT.GT.0.0D0)WRITE(IU,'(A)') 'SPECIFYTHTI' LINE='NaN1#,2,'//TRIM(ITOS(IRUNFLG))//',1,'//TRIM(ITOS(-IUZFCB1))//',0,20,50,'//TRIM(ITOS(NUZGAG))//',0.5' IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)WRITE(IU,'(A)') TRIM(LINE) ENDIF !IUZFOPT=2 !## permeabiliy specified in lpf !irunflg=0 !## water discharge from top removed form the model (usage of SFR/LAK needed) !ietflg=1 !## et simulated !iuzfcb1=59 !## writing groundwater recharge (see nam-file) !iuzfcb2=0 !## alternative output format !NTRAIL2=10 !## trailing waves !nsets2=20 !## number of wave sets !nuzgag=1 !## number of cells to gage !surfdep=0.5 !## average undulation depth (is stabieler om iets meer te pakken) !WRITE(iu,'(9I3,f5.1)') NUZTOP,IUZFOPT,irunflg,ietflg,iuzfcb1,iuzfcb2,NTRAIL2,nsets2,nuzgag,surfdep !## drn CASE (TDRN) IF(PBMAN%ICONCHK.EQ.0)THEN IF(PBMAN%IFORMAT.EQ.6)THEN LINE='NaN1#,'//TRIM(ITOS(ICB))//' NOPRINT AUX ISUB' ELSE LINE='NaN1#,'//TRIM(ITOS(ICB))//' NOPRINT AUX ISUB DSUBSYS ISUB' ENDIF ELSE LINE='NaN1#,'//TRIM(ITOS(ICB))//' NOPRINT AUX ISUB DSUBSYS ISUB ICONCHK' ENDIF IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)WRITE(IU,'(A)') TRIM(LINE) !## AUX IC ICHONCHK IC !## riv CASE (TRIV) IF(PBMAN%INFFCT.EQ.1)THEN LINE='NaN1#,'//TRIM(ITOS(ICB))//' NOPRINT' ELSE LINE='NaN1#,'//TRIM(ITOS(ICB))//' NOPRINT AUX RFCT' ENDIF IF(SIZE(JTOP).EQ.5)THEN IF(WQ%VDF%MTDNCONC.EQ.0)LINE=TRIM(LINE)//' AUX RIVDEN' IF(WQ%VDF%MTDNCONC.EQ.1)LINE=TRIM(LINE)//' RIVSSMDENS AUX RIVDEN' ENDIF IF(PBMAN%INFFCT.EQ.1)THEN IF(PBMAN%IFORMAT.EQ.6)THEN LINE=TRIM(LINE)//' AUX ISUB' ELSE LINE=TRIM(LINE)//' AUX ISUB RSUBSYS ISUB' ENDIF ELSE LINE=TRIM(LINE)//' AUX ISUB RFACT RFCT RSUBSYS ISUB' ENDIF IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)WRITE(IU,'(A)') TRIM(LINE) !## IFVDL SFT RCNC !## evt CASE (TEVT); NEVTOP=1; LINE='NaN1#,'//TRIM(ITOS(ICB)) IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)WRITE(IU,'(A)') TRIM(LINE) !## NEVTOP moet twee worden voor optie laag = -1 !## ghb CASE (TGHB) LINE='NaN1#,'//TRIM(ITOS(ICB)) IF(SIZE(JTOP).EQ.3)THEN IF(WQ%VDF%MTDNCONC.EQ.0)LINE=TRIM(LINE)//' NOPRINT AUX GHBDENS' IF(WQ%VDF%MTDNCONC.EQ.1)LINE=TRIM(LINE)//' NOPRINT GHBSSMDENS AUX GHBDEN' ENDIF IF(PBMAN%IFORMAT.EQ.6)THEN LINE=TRIM(LINE)//' AUX ISUB' ELSE LINE=TRIM(LINE)//' AUX ISUB GSUBSYS ISUB' ENDIF IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)WRITE(IU,'(A)') TRIM(LINE) !## rch CASE (TRCH); NRCHOP=1; LINE='NaN1#,'//TRIM(ITOS(ICB)) IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)WRITE(IU,'(A)') TRIM(LINE) !## NaN1 moet 3 worden voor optie laag = -1 !## olf CASE (TOLF) CPCK='OLF'; IF(TOPICS(TDRN)%IACT_MODEL.EQ.0)CPCK='DRN'; IF(PBMAN%ICONCHK.EQ.0)THEN LINE='NaN1#,'//TRIM(ITOS(ICB))//' NOPRINT AUX ISUB DSUBSYS ISUB' ELSE LINE='NaN1#,'//TRIM(ITOS(ICB))//' AUX ISUB DSUBSYS ISUB ICONCHK' ENDIF IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)WRITE(IU,'(A)') TRIM(LINE) !## chd CASE (TCHD) LINE='NaN1#' ! IF(SIZE(JTOP).EQ.2)LINE=TRIM(LINE)//' CHDSSMDENS' LINE=TRIM(LINE)//' NOPRINT NEGBND' IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)WRITE(IU,'(A)') TRIM(LINE) !## fhb package CASE(TFHB) !## check number of boundary type conditions - for fhb package NHED=0; NFLW=0 DO ILAY=1,PRJNLAY DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(BND(ILAY)%X(ICOL,IROW).EQ.-2.0)NHED=NHED+1 IF(BND(ILAY)%X(ICOL,IROW).EQ. 2.0)NFLW=NFLW+1 ENDDO; ENDDO ENDDO NBDTIM=PRJNPER !## look for number of stress-periods for boundary package ALLOCATE(FHBNBDTIM(NBDTIM)); FHBNBDTIM=0.0D0 !## get first stress-period NBDTIM=0; DO I=1,PRJNPER; IF(SIM(I)%DELT.NE.0.0D0)EXIT; ENDDO !## add steady-state IF(I.NE.1)NBDTIM=1 !## transient periods still available IF(I.LE.PRJNPER)THEN JD0 =JD(SIM(I)%IYR,SIM(I)%IMH,SIM(I)%IDY) ISEC0= SIM(I)%IHR*3600+SIM(I)%IMT*60+SIM(I)%ISC ISEC0= 86400-ISEC0 DO IPER=1,PRJNPER !## get appropriate stress-period to store in runfile KPER=PMANAGER_GETCURRENTIPER(IPER,ITOPIC,ITIME,JTIME) IF(KPER.LE.0)CYCLE J=KPER !## not transient definition IF(TOPICS(ITOPIC)%STRESS(J)%IYR+TOPICS(ITOPIC)%STRESS(J)%IMH+TOPICS(ITOPIC)%STRESS(J)%IDY+ & TOPICS(ITOPIC)%STRESS(J)%IHR+TOPICS(ITOPIC)%STRESS(J)%IMT+TOPICS(ITOPIC)%STRESS(J)%ISC.LE.0)CYCLE !## get date for current period JD1 =JD(TOPICS(ITOPIC)%STRESS(J)%IYR,TOPICS(ITOPIC)%STRESS(J)%IMH,TOPICS(ITOPIC)%STRESS(J)%IDY) ISEC1 =TOPICS(ITOPIC)%STRESS(J)%IHR*3600+TOPICS(ITOPIC)%STRESS(J)%IMT*60+TOPICS(ITOPIC)%STRESS(J)%ISC DDAY =JD1-JD0 IF(DDAY.EQ.0.0D0)THEN DSEC=ISEC1 ELSE DSEC=ISEC0+ISEC1 ENDIF NBDTIM=NBDTIM+1 FHBNBDTIM(NBDTIM)=DDAY+REAL(DSEC,8)/86400.0D0+SIM(IPER)%DELT ENDDO ENDIF !## make sure there are no negative dates DO I=1,NBDTIM; FHBNBDTIM(I)=MAX(FHBNBDTIM(I),0.0D0); ENDDO !## if first timestep is a steady-state set fhbnbdtim(2)=1.0d0, if not modflow can not cope with that ! !## is start of transient period ! IF(SIM(1)%DELT.EQ.0.0D0.AND.SIZE(FHBNBDTIM).GE.2)FHBNBDTIM(2)=1.0D0 LINE=TRIM(ITOS(NBDTIM))//','//TRIM(ITOS(NFLW)) //','//TRIM(ITOS(NHED))//','//TRIM(ITOS(IFHBSS))//','// & TRIM(ITOS(IFHBCB))//','//TRIM(ITOS(NFHBX1))//','//TRIM(ITOS(NFHBX2)) WRITE(IU,'(A)') TRIM(LINE) LINE=TRIM(ITOS(IFHBUN))//',1.0,0' WRITE(IU,'(A)') TRIM(LINE) WRITE(IU,*) (FHBNBDTIM(I),I=1,NBDTIM) !## allocate for fhb package IF(NHED.GT.0)ALLOCATE(FHBHED(NHED,NBDTIM)) IF(NFLW.GT.0)ALLOCATE(FHBFLW(NFLW,NBDTIM)) END SELECT !## fill tlp for each modellayer ALLOCATE(TLP(PRJNLAY),KH(PRJNLAY),TP(PRJNLAY),BT(PRJNLAY)) !## see whether information is equal to previous timestep - only for rch and evt LPER=0 ALLOCATE(NP_IPER(0:PRJNPER)); NP_IPER=0 !## maximum number of input per simulation MP=0; NBDTIM=0 DO IPER=1,PRJNPER !## number of input per stressperiod NP_IPER(IPER)=0 !## get appropriate stress-period to store in runfile KPER=PMANAGER_GETCURRENTIPER(IPER,ITOPIC,ITIME,JTIME) !## output WRITE(IPRT,'(1X,A,2I10,2(1X,I14))') 'Exporting timestep ',IPER,KPER,ITIME,JTIME IF(IBATCH.EQ.1)WRITE(6,'(A,3I6,2(1X,I14))') '+Exporting timestep ',IPER,PRJNPER,KPER,ITIME,JTIME !## reuse previous timestep IF(KPER.LE.0)THEN SELECT CASE (ITOPIC) !## uzf CASE (TUZF) IF(IPER.EQ.1)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You need to start the first stress-period with'//CHAR(13)// & 'a definition for the UZF package','Error'); RETURN ELSE IF(PBMAN%IFORMAT.NE.3)THEN DO I=1,4; WRITE(IU,'(A)') '-1'; ENDDO ENDIF ENDIF !## evt CASE (TEVT) IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN IF(IPER.EQ.1)THEN WRITE(IU,'(A)') '0,0,0' DO I=1,3; WRITE(IU,'(A)') 'CONSTANT 0.000000E+00'; ENDDO ELSE; WRITE(IU,'(A)') '-1,-1,-1'; ENDIF ENDIF !## rch CASE (TRCH) IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN IF(IPER.EQ.1)THEN ! IF(NRCHOP.EQ.2)THEN ! WRITE(IU,'(2I10)') 0,0; WRITE(IU,'(A)') 'CONSTANT 0.000000E+00'; WRITE(IU,'(A)') 'CONSTANT 1' ! ELSE WRITE(IU,'(I10)') 0; WRITE(IU,'(A)') 'CONSTANT 0.000000E+00' ! ENDIF ELSE ! IF(NRCHOP.EQ.2)THEN ! WRITE(IU,'(2I10)') -1,-1 ! ELSE WRITE(IU,'(I10)') -1 ! ENDIF ENDIF ENDIF !## wel,drn,riv,ghb,chd,olf CASE (TDRN,TRIV,TGHB,TCHD,TOLF,TISG) IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN IF(IPER.EQ.1)THEN; WRITE(IU,'(I10)') 0 ELSE; WRITE(IU,'(I10)') -1; ENDIF ENDIF !## fhb- skip CASE (TFHB) CASE DEFAULT WRITE(*,'(/A)') 'CANNOT COME HERE: ERROR PMANAGER_SAVEMF2005_PCK - WRITING HEADER' WRITE(*,'(A,I10)') 'ITOPIC=',ITOPIC WRITE(*,'(A)') TRIM(TOPICS(ITOPIC)%TNAME) PAUSE; STOP END SELECT !## goto next timestep CYCLE ENDIF !## allocate memory for packages NTOP=SIZE(TOPICS(ITOPIC)%STRESS(KPER)%FILES,1); NSYS=SIZE(TOPICS(ITOPIC)%STRESS(KPER)%FILES,2) SELECT CASE (ITOPIC) CASE (TRIV,TDRN,TGHB,TCHD,TFHB) IF(NTOP.NE.SIZE(JTOP))THEN IF(PBMAN%IFORMAT.NE.6)THEN IF(IBATCH.EQ.0)CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'The number of entries '//TRIM(ITOS(NTOP))//' is not equal to the number of entries allowed ('//TRIM(ITOS(SIZE(JTOP)))//').'//CHAR(13)// & 'You might remove these additional entries from the current package '//TRIM(TOPICS(ITOPIC)%TNAME),'Information') IF(IBATCH.EQ.1)WRITE(*,'(/A/)') 'The number of entries '//TRIM(ITOS(NTOP))//' is not equal to the number of entries allowed ('//TRIM(ITOS(SIZE(JTOP)))//'). '// & 'You might remove these additional entries from the current package '//TRIM(TOPICS(ITOPIC)%TNAME) RETURN ELSE NTOP=SIZE(JTOP) ENDIF ENDIF END SELECT !## used for writing and including the tlp-vector IF(ALLOCATED(XTMP))DEALLOCATE(XTMP); ALLOCATE(XTMP(NTOP)); XTMP=0.0D0 SELECT CASE (ITOPIC) CASE (TEVT,TRCH) !## no restrictions for MF6 IF(NSYS.GT.1.AND.PBMAN%IFORMAT.NE.3)THEN IF(IBATCH.EQ.0)CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'You cannot apply more than a single layer to the package '// & TRIM(TOPICS(ITOPIC)%TNAME)//'.','Information') IF(IBATCH.EQ.1)WRITE(*,'(/A/)') 'You cannot apply more than a single layer to the package '//TRIM(TOPICS(ITOPIC)%TNAME)//'.' RETURN ENDIF END SELECT SELECT CASE (ITOPIC) CASE (TOLF,TCHD); N=NTOP+1 CASE (TRIV) N=NTOP; IF(PBMAN%INFFCT.EQ.1)N=N-1 CASE DEFAULT; N=NTOP END SELECT IF(ITOPIC.EQ.TDRN.AND.PBMAN%IFORMAT.EQ.3.AND.PBMAN%DDRN.NE.0.0)THEN WRITE(FRM,'(A10,I2.2,A14)') '(3(I5,1X),',N+1,'(G15.7,1X),I5)' ELSE WRITE(FRM,'(A10,I2.2,A14)') '(3(I5,1X),',N,'(G15.7,1X),I5)' ENDIF IF(.NOT.ALLOCATED(PCK))THEN CALL PMANAGER_SAVEMF2005_ALLOCATEPCK(NTOP,ITOPIC) ENDIF NHED=0; NFLW=0; NBDTIM=NBDTIM+1 IF(PBMAN%SSYSTEM.EQ.0.AND.PBMAN%IFORMAT.EQ.3)THEN !## export current system only IS1=MIN(NSYS,ISYSMF6); IS2=IS1 ELSE !## export all systems IS1=1; IS2=NSYS ENDIF !## see whether duplicate of definitions happened with current systems, not for wel/isg SELECT CASE (ITOPIC) !## drn,riv,ghb,chd,olf CASE (TDRN,TRIV,TGHB,TCHD,TOLF) ALLOCATE(JEQUAL(NSYS,NTOP)) !## search previous entries DO IIPER=1,IPER-1 JEQUAL=0 !## get appropriate stress-period to store in runfile KKPER=PMANAGER_GETCURRENTIPER(IIPER,ITOPIC,ITIME,JTIME) IF(KKPER.LE.0)CYCLE DO ISYS=IS1,IS2 !## number of subtopics DO KTOP=1,NTOP ICNST =TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%ICNST CNST =TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%CNST FCT =TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%FCT IMP =TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%IMP ILAY =TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%ILAY SFNAME=TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%FNAME !## only whenever number of systems are equal IF(NSYS.EQ.SIZE(TOPICS(ITOPIC)%STRESS(KKPER)%FILES,2))THEN IF(ICNST.EQ. TOPICS(ITOPIC)%STRESS(KKPER)%FILES(KTOP,ISYS)%ICNST.AND. & CNST .EQ. TOPICS(ITOPIC)%STRESS(KKPER)%FILES(KTOP,ISYS)%CNST.AND. & FCT.EQ. TOPICS(ITOPIC)%STRESS(KKPER)%FILES(KTOP,ISYS)%FCT.AND. & IMP .EQ. TOPICS(ITOPIC)%STRESS(KKPER)%FILES(KTOP,ISYS)%IMP.AND. & ILAY.EQ. TOPICS(ITOPIC)%STRESS(KKPER)%FILES(KTOP,ISYS)%ILAY.AND. & SFNAME.EQ.TOPICS(ITOPIC)%STRESS(KKPER)%FILES(KTOP,ISYS)%FNAME)THEN JEQUAL(ISYS,KTOP)=IIPER ENDIF ENDIF ENDDO ENDDO !## there is a previous definition of this package exported allready and can be reused IF(MINVAL(JEQUAL).EQ.MAXVAL(JEQUAL).AND.MINVAL(JEQUAL).NE.0)THEN IF(NP_IPER(IIPER).GT.0)THEN !## create subfolders IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN EXFNAME=TRIM(DIR)//'\'//CPCK//'7'//'\'//CPCK//'_T'//TRIM(ITOS(IIPER))//'.ARR' ELSE IF(PBMAN%SSYSTEM.EQ.0)THEN EXFNAME=TRIM(DIR)//'\'//CPCK//'6\SYS'//TRIM(ITOS(ISYSMF6))//'\'//CPCK//'_T'//TRIM(ITOS(IIPER))//'.ARR' ELSE EXFNAME=TRIM(DIR)//'\'//CPCK//'6'//'\'//CPCK//'_T'//TRIM(ITOS(IIPER))//'.ARR' ENDIF ENDIF SFNAME=EXFNAME; DO I=1,3; SFNAME=SFNAME(:INDEX(SFNAME,'\',.TRUE.)-1); ENDDO I=LEN_TRIM(SFNAME); SFNAME='.'//EXFNAME(I+1:) IF(PBMAN%IFORMAT.NE.3)THEN LINE=TRIM(ITOS(NP_IPER(IIPER))); WRITE(IU,'(A)') TRIM(LINE) WRITE(IU,'(A)') 'OPEN/CLOSE '//TRIM(SFNAME)//' 1.0D0 (FREE) -1' ENDIF NP_IPER(IPER)=NP_IPER(IIPER) ENDIF EXIT ENDIF ENDDO IF(ALLOCATED(JEQUAL))DEALLOCATE(JEQUAL) END SELECT !## next timestep IF(NP_IPER(IPER).GT.0)CYCLE !## open external file (not for rch/evt) IF(PBMAN%IFORMAT.GE.2)THEN JU=0 SELECT CASE (ITOPIC) CASE (TDRN,TRIV,TGHB,TOLF,TCHD,TISG) !## create subfolders IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//VTXT) EXFNAME=TRIM(DIR)//'\'//CPCK//VTXT//'\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR' ELSE IF(PBMAN%SSYSTEM.EQ.0)THEN CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//'6\SYS'//TRIM(ITOS(ISYSMF6))) EXFNAME=TRIM(DIR)//'\'//CPCK//'6\SYS'//TRIM(ITOS(ISYSMF6))//'\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR' ELSE CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//'6') EXFNAME=TRIM(DIR)//'\'//CPCK//'6\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR' ENDIF ENDIF JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=EXFNAME,STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(JU.EQ.0)RETURN !## rch/evt for mf6 CASE (TEVT,TRCH) IF(PBMAN%IFORMAT.EQ.3)THEN !## create subfolders IF(PBMAN%SSYSTEM.EQ.0)THEN CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//'6\SYS'//TRIM(ITOS(ISYSMF6))) EXFNAME=TRIM(DIR)//'\'//CPCK//'6\SYS'//TRIM(ITOS(ISYSMF6))//'\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR' ELSE CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//'6') EXFNAME=TRIM(DIR)//'\'//CPCK//'6\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR' ENDIF JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=EXFNAME,STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(JU.EQ.0)RETURN ENDIF END SELECT ! IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(/A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER)) ELSE JU=IU ENDIF !## number of systems DO ISYS=IS1,IS2 !## number of subtopics DO KTOP=1,NTOP ICNST =TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%ICNST CNST =TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%CNST FCT =TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%FCT IMP =TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%IMP ILAY =TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%ILAY SFNAME=TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%FNAME !## quit with this system as it is outside the current set of nlay IF(ILAY.GT.PRJNLAY)EXIT !## ilay equal zero not possible for rch and evt IF(ITOPIC.EQ.TEVT.OR.(ITOPIC.EQ.TRCH.AND.NTOP.EQ.1))THEN IF(ILAY.EQ.0)THEN IF(IBATCH.EQ.0)CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'You cannot apply a layer code of zero for RCH or EVT','Error') IF(IBATCH.EQ.1)WRITE(*,'(/A/)') 'You cannot apply a layer code of zero for RCH or EVT' RETURN ENDIF ENDIF !## check to see whether equal to previous timestep IEQUAL=1 SELECT CASE (ITOPIC) !## uzf,evt,rch CASE (TUZF,TEVT,TRCH) IF(LPER.GT.0)THEN !## only whenever number of systems are equal IF(NSYS.EQ.SIZE(TOPICS(ITOPIC)%STRESS(LPER)%FILES,2))THEN IF(ICNST.EQ. TOPICS(ITOPIC)%STRESS(LPER)%FILES(KTOP,ISYS)%ICNST.AND. & CNST .EQ. TOPICS(ITOPIC)%STRESS(LPER)%FILES(KTOP,ISYS)%CNST.AND. & FCT.EQ. TOPICS(ITOPIC)%STRESS(LPER)%FILES(KTOP,ISYS)%FCT.AND. & IMP .EQ. TOPICS(ITOPIC)%STRESS(LPER)%FILES(KTOP,ISYS)%IMP.AND. & ILAY.EQ. TOPICS(ITOPIC)%STRESS(LPER)%FILES(KTOP,ISYS)%ILAY.AND. & SFNAME.EQ.TOPICS(ITOPIC)%STRESS(LPER)%FILES(KTOP,ISYS)%FNAME)IEQUAL=-1 ENDIF ENDIF END SELECT WRITE(IPRT,'(1X,A,I3,A1,I1,A1,I4.3,3(A1,G15.7),A1,A)') TOPICS(ITOPIC)%TNAME(1:5)//',', & ISYS,',',ICNST,',',ILAY,',',FCT,',',IMP,',',CNST,',',CHAR(39)//TRIM(SFNAME)//CHAR(39) SELECT CASE (ITOPIC) !## uzf CASE (TUZF) SELECT CASE (KTOP) CASE (1); SCL_D=0; SCL_U=7 !## boundary CASE (2); SCL_D=0; SCL_U=7 !## brook-corey CASE (3:4); SCL_D=0; SCL_U=2 !## thts/thhi CASE (5); SCL_D=0; SCL_U=2; NUZF1=IEQUAL !## inf. CASE (6); SCL_D=0; SCL_U=2; NUZF2=IEQUAL !## eva CASE (7); SCL_D=0; SCL_U=2; NUZF3=IEQUAL !## exd CASE (8); SCL_D=0; SCL_U=2; NUZF4=IEQUAL !## ewc END SELECT !## skip uzf package info for coming stress-periods IF(KTOP.LE.4.AND.IPER.GT.1)CYCLE !## evt CASE (TEVT) SCL_D=1 !## check to see whether equal to previous timestep SELECT CASE (KTOP) CASE (1); INEVTR=IEQUAL; SCL_U=16 !## artithmetic mean (rch/evt) discarding nodata CASE (2); INSURF=IEQUAL; SCL_U=2 CASE (3); INEXDP=IEQUAL; SCL_U=2 END SELECT !## rch CASE (TRCH) INRECH=0 !; INRLYR=0 SELECT CASE (KTOP) CASE (1); SCL_D=1; SCL_U=16; INRECH=IEQUAL !## arithmetic mean (rch/evt) discarding nodata ! CASE (2); SCL_D=0; SCL_U=7; INRLYR=IEQUAL !## no interpolation in downscaling and take majority in upscaling CASE DEFAULT; SCL_D=1; SCL_U=2 END SELECT ! !## equal from previous timestep ! INRECH=IEQUAL !## drn,riv,ghb CASE (TDRN,TRIV,TGHB) IF(KTOP.EQ.1)THEN; SCL_D=0; SCL_U=5; ENDIF IF(KTOP.NE.1)THEN; SCL_D=0; SCL_U=2; ENDIF !## chd,olf CASE (TCHD,TOLF) SCL_D=1; SCL_U=2 !## fhb CASE (TFHB) SCL_D=1 IF(NTOP.EQ.2)THEN IF(KTOP.EQ.1)SCL_U=5 !## q - sum (divide if cell is smaller) IF(KTOP.EQ.2)SCL_U=2 !## h - average ELSEIF(NTOP.EQ.3)THEN IF(KTOP.LE.2)SCL_U=5 !## q - sum (divide if cell is smaller) IF(KTOP.EQ.3)SCL_U=2 !## h - average ENDIF CASE DEFAULT WRITE(*,'(/A)') 'CANNOT COME HERE: ERROR PMANAGER_SAVEMF2005_PCK - SETTING SCALING FACTORS' WRITE(*,'(A,I10)') 'ITOPIC=',ITOPIC WRITE(*,'(A)') TRIM(TOPICS(ITOPIC)%TNAME) PAUSE; STOP END SELECT PCK(KTOP)%ILAY=ILAY !## skip this one - no to be read IF(IEQUAL.EQ.-1)CYCLE !## constant value IF(ICNST.EQ.1)THEN PCK(KTOP)%X=CNST !## read/clip/scale idf file ELSEIF(TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%ICNST.EQ.2)THEN PCK(KTOP)%FNAME=SFNAME IF(.NOT.IDFREADSCALE(PCK(KTOP)%FNAME,PCK(KTOP),SCL_U,SCL_D,1.0D0,0))RETURN ENDIF !## no checking for inactive cells ICHECK=1 !## rch/evt mm/day -> m/day SELECT CASE (ITOPIC) !## uzf CASE (TUZF) IF(KTOP.EQ.5.OR.KTOP.EQ.6)FCT=FCT*0.001D0 IF(ILAY.LE.0)NUZTOP=3 !## not checking for inactive cells ICHECK=0 !## evt CASE (TEVT) IF(KTOP.EQ.1)THEN FCT=FCT*0.001D0 IMP=IMP*0.001D0 ENDIF IF(ILAY.LT.0)NEVTOP=3 !## checking for inactive cells ICHECK=1; IF(ILAY.GT.0)ICHECK=0 !## rch CASE (TRCH) IF(KTOP.EQ.1)THEN FCT=FCT*0.001D0 IMP=IMP*0.001D0 ENDIF ! IF(ILAY.EQ.0)NRCHOP=2 !## assigned to predefined cell IF(ILAY.LT.0)NRCHOP=3 !## assigned to first active cell !## checking for inactive cells for nrchop=1 and nrchop=2 ICHECK=1; IF(ILAY.GE.0)ICHECK=0 END SELECT CALL PMANAGER_SAVEMF2005_FCTIMP(0,ICNST,PCK(KTOP),FCT,IMP,SCL_D) CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,PCK(KTOP),ICHECK,ITOPIC) ENDDO SELECT CASE (ITOPIC) !## uzf CASE (TUZF) IF(IPER.EQ.1)THEN !## make sure value for uzbnd is zero for constant head and inactive cells - only if NUZTOP.eq.1 IF(NUZTOP.EQ.1)THEN DO IROW=1,PCK(1)%NROW; DO ICOL=1,PCK(1)%NCOL IF(BND(1)%X(ICOL,IROW).LE.0)PCK(1)%X(ICOL,IROW)=0.0D0 ENDDO; ENDDO !## make sure entered uzbnd with top layer is equal to the top elevation - otherwise solve the conflict ELSEIF(NUZTOP.EQ.3)THEN DO IROW=1,PCK(1)%NROW; DO ICOL=1,PCK(1)%NCOL !## assigned layer I=PCK(1)%X(ICOL,IROW) !## skip this one as it is an inactive cell IF(I.LE.0)CYCLE !## search first active layer DO ILAY=1,PRJNLAY; IF(BND(ILAY)%X(ICOL,IROW).GT.0)EXIT; ENDDO !## overrule for the first active layer IF(ILAY.LE.PRJNLAY)THEN IF(PCK(1)%X(ICOL,IROW).LT.0)PCK(1)%X(ICOL,IROW)=SIGN(ILAY,I) IF(ILAY.EQ.1)PCK(1)%X(ICOL,IROW)=1.0D0 ENDIF ENDDO; ENDDO ENDIF IF(PBMAN%IFORMAT.NE.3)THEN !## areal extent of uz flow IF(.NOT.PMANAGER_SAVEMF2005_PCK_U2DREL(TRIM(DIR)//'\'//CPCK//'7\'//CPCK//'_UZBND_T'//TRIM(ITOS(IPER))//'.ARR',PCK(1),IU, 0,1))RETURN !## brooks-corey epsilon IF(.NOT.PMANAGER_SAVEMF2005_PCK_U2DREL(TRIM(DIR)//'\'//CPCK//'7\'//CPCK//'_EPS_T'//TRIM(ITOS(IPER))// '.ARR',PCK(2),IU,IFBND,0))RETURN !## thts saturated water content IF(.NOT.PMANAGER_SAVEMF2005_PCK_U2DREL(TRIM(DIR)//'\'//CPCK//'7\'//CPCK//'_THTS_T'//TRIM(ITOS(IPER))// '.ARR',PCK(3),IU,IFBND,0))RETURN !## skip initial water content if steady-state IF(SIM(IPER)%DELT.GT.0.0D0)THEN IF(.NOT.PMANAGER_SAVEMF2005_PCK_U2DREL(TRIM(DIR)//'\'//CPCK//'7\'//CPCK//'_THTI_T'//TRIM(ITOS(IPER))// '.ARR',PCK(4),IU,IFBND,0))RETURN ENDIF ELSE LANDFLAG=1; IVERTCON=0 !!! IVERTCON KUN JE DUS UZF DELEN AAN ELKAAR KOPPELEN .... WRITE(IU,'(/A)') 'BEGIN PACKAGEDATA' NP_IPER(0)=0; DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(PCK(1)%X(ICOL,IROW).GT.0)THEN !KHV(1)%X(ICOL,IROW) VKS=(KDW(1)%X(ICOL,IROW)/KVA(1)%X(ICOL,IROW))/(TOP(1)%X(ICOL,IROW)-BOT(1)%X(ICOL,IROW)) NP_IPER(0)=NP_IPER(0)+1 !## thtr !## THTS !## THTI !## EPS WRITE(IU,'(6I5,6F15.7)') NP_IPER(0),1,IROW,ICOL,LANDFLAG,IVERTCON,0.5,VKS,PCK(8)%X(ICOL,IROW),PCK(3)%X(ICOL,IROW),PCK(4)%X(ICOL,IROW),PCK(2)%X(ICOL,IROW) ENDIF ENDDO; ENDDO WRITE(IU,'(A)') 'END PACKAGEDATA' CALL PMANAGER_SAVEEXAMINE(PCK(1),'UZBND_L',1); CALL PMANAGER_SAVEEXAMINE(PCK(2),'EPS_L',1) CALL PMANAGER_SAVEEXAMINE(PCK(3),'THTS_L',1); CALL PMANAGER_SAVEEXAMINE(PCK(4),'THTI_L',1) CALL PMANAGER_SAVEEXAMINE(PCK(8),'THTR_L',1) ENDIF ! !## log uzf locations ! DO I=1,PBMAN%NLOGLOC ! WRITE(IU,'(4(I10,1X))') PBMAN%ILOC(I,1),PBMAN%ILOC(I,2),99+I,1 ! ENDDO ENDIF IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IU,'(/A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER)) NP_IPER(IPER)=0; DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(PCK(1)%X(ICOL,IROW).GT.0)THEN NP_IPER(IPER)=NP_IPER(IPER)+1 !## finf !## pet !## exdp !## extwc !## ha,root,rootact WRITE(IU,'(I5,7F15.7)') NP_IPER(IPER),PCK(5)%X(ICOL,IROW),PCK(6)%X(ICOL,IROW),PCK(7)%X(ICOL,IROW),PCK(8)%X(ICOL,IROW),0.0,0.0,0.0 ENDIF ENDDO; ENDDO CALL PMANAGER_SAVEEXAMINE(PCK(5),'FINF_S',IPER); CALL PMANAGER_SAVEEXAMINE(PCK(6),'PER_S',IPER) CALL PMANAGER_SAVEEXAMINE(PCK(7),'EXDP_S',IPER); CALL PMANAGER_SAVEEXAMINE(PCK(8),'EXTWC_S',IPER) WRITE(IU,'(A)') 'END PERIOD' ELSE LINE=TRIM(ITOS(NUZF1)); WRITE(IU,'(A)') TRIM(LINE) IF(NUZF1.EQ.1)THEN IF(.NOT.PMANAGER_SAVEMF2005_PCK_U2DREL(TRIM(DIR)//'\'//CPCK//'7\'//CPCK//'_FINF_T'//TRIM(ITOS(IPER))// '.ARR',PCK(5),IU,IFBND,0))RETURN ENDIF LINE=TRIM(ITOS(NUZF2)); WRITE(IU,'(A)') TRIM(LINE) IF(NUZF2.EQ.1)THEN IF(.NOT.PMANAGER_SAVEMF2005_PCK_U2DREL(TRIM(DIR)//'\'//CPCK//'7\'//CPCK//'_PET_T'//TRIM(ITOS(IPER))// '.ARR',PCK(6),IU,IFBND,0))RETURN ENDIF LINE=TRIM(ITOS(NUZF3)); WRITE(IU,'(A)') TRIM(LINE) IF(NUZF3.EQ.1)THEN IF(.NOT.PMANAGER_SAVEMF2005_PCK_U2DREL(TRIM(DIR)//'\'//CPCK//'7\'//CPCK//'_EXDP_T'//TRIM(ITOS(IPER))// '.ARR',PCK(7),IU,IFBND,0))RETURN ENDIF LINE=TRIM(ITOS(NUZF4)); WRITE(IU,'(A)') TRIM(LINE) IF(NUZF4.EQ.1)THEN !## make sure this is always larger than residual water content IF(.NOT.PMANAGER_SAVEMF2005_PCK_U2DREL(TRIM(DIR)//'\'//CPCK//'7\'//CPCK//'_EXTWC_T'//TRIM(ITOS(IPER))//'.ARR',PCK(8),IU,IFBND,0))RETURN ENDIF ENDIF !## rch CASE (TRCH) IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN LINE=TRIM(ITOS(INRECH)) !IF(NRCHOP.EQ.2)LINE=TRIM(LINE)//' '//TRIM(ITOS(ABS(INRLYR))); WRITE(IU,'(A)') TRIM(LINE) !## do not check with ibound IFBND=0; IF(ILAY.GT.0)IFBND=1 IF(INRECH.EQ.1)THEN IF(.NOT.PMANAGER_SAVEMF2005_PCK_U2DREL(TRIM(DIR)//'\'//CPCK//'7\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR',PCK(1),IU,IFBND,0))RETURN ENDIF ! IF(NRCHOP.EQ.2)THEN ! IF(ABS(INRLYR).EQ.1)THEN ! IF(.NOT.PMANAGER_SAVEMF2005_PCK_U2DREL(TRIM(DIR)//'\'//CPCK//'7\'//CPCK//'_LAYER_T'//TRIM(ITOS(IPER))//'.ARR',PCK(2),IU,IFBND,1))RETURN ! ENDIF ! ENDIF !## modflow6 ELSEIF(PBMAN%IFORMAT.EQ.3)THEN IF(INRECH.EQ.1)THEN DO IROW=1,PCK(1)%NROW; DO ICOL=1,PCK(1)%NCOL ! IF(ABS(INRLYR).EQ.1)THEN ! ILAY=PCK(2)%X(ICOL,IROW); TLP(ILAY)=1.0D0 ! ELSE !## find uppermost layer (aquifer k>1) TLP=0.0D0 IF(PCK(1)%ILAY.EQ.-1)THEN DO ILAY=1,SIZE(PBMAN%ILAY); IF(PBMAN%ILAY(ILAY).EQ.1.AND.BND(ILAY)%X(ICOL,IROW).GT.0)EXIT; ENDDO !## assign to uppermost active layer IF(ILAY.LE.PRJNLAY)TLP(ILAY)=1.0D0 ELSE !## assign to predefined layer TLP(PCK(1)%ILAY)=1.0D0 ENDIF JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE; JLAY=JLAY+1 !## skip inactive cells IF(BND(ILAY)%X(ICOL,IROW).EQ.0.0D0)CYCLE !## not put into this model layer IF(TLP(ILAY).LE.0.0D0)CYCLE IF(PCK(1)%X(ICOL,IROW).NE.0.0D0)THEN WRITE(JU,'(3I10,G15.7,I10)') JLAY,IROW,ICOL,PCK(1)%X(ICOL,IROW),ISYS CALL PMANAGER_SAVEEXAMINE(PCK(1),'RCH_L'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL) NP_IPER(IPER)=NP_IPER(IPER)+1 ENDIF ENDDO ENDDO; ENDDO ENDIF ENDIF !## evt CASE (TEVT) IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN LINE=TRIM(ITOS(INSURF))//','//TRIM(ITOS(INEVTR))//','//TRIM(ITOS(INEXDP)); WRITE(IU,'(A)') TRIM(LINE); IFBND=0; IF(ILAY.GT.0)IFBND=1 IF(INSURF.EQ.1)THEN IF(.NOT.PMANAGER_SAVEMF2005_PCK_U2DREL(TRIM(DIR)//'\'//CPCK//'7\'//CPCK//'_SURF_T'//TRIM(ITOS(IPER))//'.ARR',PCK(2),IU,IFBND,0))RETURN ENDIF IF(INEVTR.EQ.1)THEN IF(.NOT.PMANAGER_SAVEMF2005_PCK_U2DREL(TRIM(DIR)//'\'//CPCK//'7\'//CPCK//'_EVTR_T'//TRIM(ITOS(IPER))//'.ARR',PCK(1),IU,IFBND,0))RETURN ENDIF IF(INEXDP.EQ.1)THEN IF(.NOT.PMANAGER_SAVEMF2005_PCK_U2DREL(TRIM(DIR)//'\'//CPCK//'7\'//CPCK//'_EXDP_T'//TRIM(ITOS(IPER))//'.ARR',PCK(3),IU,IFBND,0))RETURN ENDIF ELSEIF(PBMAN%IFORMAT.EQ.3)THEN IF(INEVTR.EQ.1.OR.INSURF.EQ.1.OR.INEXDP.EQ.1)THEN DO IROW=1,PCK(1)%NROW; DO ICOL=1,PCK(1)%NCOL !## find uppermost layer TLP=0.0D0 IF(PCK(1)%ILAY.EQ.-1)THEN DO ILAY=1,SIZE(PBMAN%ILAY); IF(PBMAN%ILAY(ILAY).EQ.1.AND.BND(ILAY)%X(ICOL,IROW).GT.0)EXIT; ENDDO !## assign to uppermost active layer IF(ILAY.LE.PRJNLAY)TLP(ILAY)=1.0D0 ELSE !## assign to predefined layer TLP(PCK(1)%ILAY)=1.0D0 ENDIF JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE; JLAY=JLAY+1 !## skip inactive cells IF(BND(ILAY)%X(ICOL,IROW).EQ.0.0D0)CYCLE !## not put into this model layer IF(TLP(ILAY).LE.0.0D0)CYCLE IF(PCK(1)%X(ICOL,IROW).NE.0.0D0)THEN WRITE(JU,'(3I10,3G15.7,I10)') JLAY,IROW,ICOL,PCK(2)%X(ICOL,IROW),PCK(1)%X(ICOL,IROW),PCK(3)%X(ICOL,IROW),ISYS CALL PMANAGER_SAVEEXAMINE(PCK(1),'EVTR_L'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL) CALL PMANAGER_SAVEEXAMINE(PCK(2),'ESRF_L'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL) CALL PMANAGER_SAVEEXAMINE(PCK(3),'EXDP_L'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL) NP_IPER(IPER)=NP_IPER(IPER)+1 ENDIF ENDDO ENDDO; ENDDO ENDIF ENDIF CASE DEFAULT DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL !## skip inactive/constant head cells IF(PCK(1)%ILAY.GT.0.AND.(ITOPIC.NE.TCHD.AND.ITOPIC.NE.TFHB))THEN IF(BND(PCK(1)%ILAY)%X(ICOL,IROW).LE.0.0D0)CYCLE ENDIF IF(ITOPIC.EQ.TFHB)THEN !## check whether one of the two is not equal to nodata IF(BND(PCK(1)%ILAY)%X(ICOL,IROW).EQ.2.0D0)THEN QFHB=PMANAGER_SAVE2005_FHBGETQ(BND(PCK(1)%ILAY)%X,PCK,JTOP,NTOP,ICOL,IROW) !## flow IF(QFHB.EQ.HNOFLOW)THEN WRITE(*,'(/1X,A,3I10,A)') '>>> FOUND NODATA FOR FLOW VALUES FOR FHB PACKAGE FOR (',PCK(1)%ILAY,IROW,ICOL,') <<<' RETURN ENDIF !## head ELSEIF(BND(PCK(1)%ILAY)%X(ICOL,IROW).EQ.-2.0)THEN IF(PCK(JTOP(NTOP))%X(ICOL,IROW).EQ.HNOFLOW)THEN WRITE(*,'(/1X,A,3I10,A)') '>>> FOUND NODATA FOR HEAD VALUES FOR FHB PACKAGE FOR (',PCK(1)%ILAY,IROW,ICOL,') <<<' RETURN ENDIF ELSE CYCLE ENDIF ELSE !## check nodata in dataset DO I=1,NTOP; IF(PCK(JTOP(I))%X(ICOL,IROW).EQ.HNOFLOW)EXIT; ENDDO !## found any nodata in dataset - skip data point IF(I.LE.NTOP)CYCLE ENDIF IF(ITOPIC.EQ.TRIV)THEN !## check bottom river if that is higher than river stage PCK(3)%X(ICOL,IROW)=MIN(PCK(2)%X(ICOL,IROW),PCK(3)%X(ICOL,IROW)) ENDIF SELECT CASE (ITOPIC) CASE (TRIV,TDRN,TGHB) PCK(JTOP(2))%X(ICOL,IROW)=MAX(0.0D0,PCK(JTOP(2))%X(ICOL,IROW)) END SELECT !## initially not assigned to any model layer TLP=0.0D0 !## assign to several layer based upon top/bot IF(PCK(1)%ILAY.EQ.0)THEN !## get filter fractions CALL PMANAGER_SAVEMF2005_PCK_ULSTRD_PARAM(PRJNLAY,ICOL,IROW,TOP,BOT,KDW,TP,BT,KH,.FALSE.) SELECT CASE (ITOPIC) CASE (TDRN) !## drn - drainagelevel Z1=PCK(2)%X(ICOL,IROW); Z2=Z1 CASE (TRIV) !## riv - waterlevel and bottom !## assign layers in between waterlevel and bottom elevation IF(PBMAN%IDEFLAYER.EQ.0)THEN Z1=PCK(2)%X(ICOL,IROW); Z2=PCK(3)%X(ICOL,IROW) ELSE !## assign layers in between top modellayer 1 and bottom elevation Z1=TOP(1)%X(ICOL,IROW); Z2=PCK(3)%X(ICOL,IROW) ENDIF CASE (TOLF) !## olf drainagelevel Z1=PCK(1)%X(ICOL,IROW); Z2=Z1 CASE (TGHB) !## ghb drainagelevel Z1=PCK(2)%X(ICOL,IROW); Z2=Z1 CASE DEFAULT WRITE(*,'(/A)') 'CANNOT COME HERE: ERROR PMANAGER_SAVEMF2005_PCK - AUTOM. LAYER ASSIGNMENT' WRITE(*,'(A,I10)') 'ITOPIC=',ITOPIC WRITE(*,'(A)') TRIM(TOPICS(ITOPIC)%TNAME) PAUSE; STOP END SELECT !## get fraction per model layer CALL UTL_PCK_GETTLP(PRJNLAY,TLP,KH,TP,BT,Z1,Z2,MINKHT) !## find uppermost active layer ELSEIF(PCK(1)%ILAY.EQ.-1)THEN DO ILAY=1,PRJNLAY; IF(BND(ILAY)%X(ICOL,IROW).NE.0)EXIT; ENDDO !## assign to uppermost active layer IF(ILAY.LE.PRJNLAY)THEN; IF(BND(ILAY)%X(ICOL,IROW).GT.0)TLP(ILAY)=1.0D0; ENDIF ELSE !## chd package IF(ITOPIC.EQ.TCHD)THEN IF(BND(PCK(1)%ILAY)%X(ICOL,IROW).LT.0)TLP(PCK(1)%ILAY)=1.0D0 !## fhb package ELSEIF(ITOPIC.EQ.TFHB)THEN IF(ABS(BND(PCK(1)%ILAY)%X(ICOL,IROW)).EQ.2.0D0)TLP(PCK(1)%ILAY)=1.0D0 !## assign to predefined layer - if not constant or inactive ELSE IF(BND(PCK(1)%ILAY)%X(ICOL,IROW).GT.0)TLP(PCK(1)%ILAY)=1.0D0 ENDIF ENDIF !## only active cells DO ILAY=1,SIZE(PBMAN%ILAY) IF(TLP(ILAY).EQ.0.0D0)CYCLE IF(BND(ILAY)%X(ICOL,IROW).EQ.0.0D0)THEN NINACTIVE=NINACTIVE+1 !## normalize tlp() again TLP(ILAY)=0.0D0; IF(SUM(TLP).GT.0.0D0)TLP=(1.0D0/SUM(TLP))*TLP ENDIF ENDDO JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE; JLAY=JLAY+1 !## not put into model layer IF(TLP(ILAY).LE.0.0D0)CYCLE ! !## skip inactive cells - this can happen whenever ilay=0 and stage is above top_l1 or ilay>0 and layer is inactive ! IF(BND(ILAY)%X(ICOL,IROW).EQ.0)CYCLE !## write specific packages SELECT CASE (ITOPIC) !## chd CASE (TCHD) IF(BND(ILAY)%X(ICOL,IROW).LT.0)THEN !## check whether constant head is in appropriate cell - if not - skip it. LCHKCHD=.TRUE. !## head is in within current layer pck(jtop(1))%x(1,1:50) IF(PBMAN%ICHKCHD.EQ.1)LCHKCHD=PCK(JTOP(1))%X(ICOL,IROW).GT.BOT(ILAY)%X(ICOL,IROW) IF(LCHKCHD)THEN IF(PBMAN%SSYSTEM.EQ.0)THEN WRITE(JU,FRM) JLAY,IROW,ICOL,PCK(JTOP(1))%X(ICOL,IROW),PCK(JTOP(1))%X(ICOL,IROW),ISYS CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'CHD_L'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL) ELSE WRITE(JU,FRM) JLAY,IROW,ICOL,PCK(JTOP(1))%X(ICOL,IROW),PCK(JTOP(1))%X(ICOL,IROW),1 CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'CHD_L'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL) ENDIF NP_IPER(IPER)=NP_IPER(IPER)+1 ENDIF ENDIF !## olf CASE (TOLF) OLFCOND=(IDFGETAREA(PCK(JTOP(1)),ICOL,IROW)/COLF) !## drainage conductance IF(PBMAN%SSYSTEM.EQ.0)THEN WRITE(JU,FRM) JLAY,IROW,ICOL,PCK(JTOP(1))%X(ICOL,IROW),OLFCOND,ISYS CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'OLFL_L'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL) CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'OLFC_L'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL,X=OLFCOND) ELSE WRITE(JU,FRM) JLAY,IROW,ICOL,PCK(JTOP(1))%X(ICOL,IROW),OLFCOND,1 CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'OLFL_L'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL) CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'OLFC_L'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL,X=OLFCOND) ENDIF NP_IPER(IPER)=NP_IPER(IPER)+1 !## fhb CASE (TFHB) IF(BND(ILAY)%X(ICOL,IROW).EQ. 2.0D0)THEN; NFLW=NFLW+1; FHBFLW(NFLW,NBDTIM)=QFHB; ENDIF IF(BND(ILAY)%X(ICOL,IROW).EQ.-2.0D0)THEN; NHED=NHED+1; FHBHED(NHED,NBDTIM)=PCK(JTOP(NTOP))%X(ICOL,IROW); ENDIF !## drn CASE (TDRN) DO I=1,NTOP; XTMP(I)=PCK(I)%X(ICOL,IROW); ENDDO XTMP(1)=XTMP(1)*TLP(ILAY) !## correct if present by level-controlled drainage, only for the first DRN system IF(PBMAN%FLEXD.EQ.1)THEN COMMENT='' IF(ISYS.EQ.1)THEN IF(FLXDRL%X(ICOL,IROW).NE.FLXDRL%NODATA)THEN XTMP(1)=0.0D0; COMMENT=' >>> removed by flexd <<<' ENDIF ENDIF ENDIF !## in current model (layers) JSYS=1; IF(PBMAN%SSYSTEM.EQ.0)JSYS=ISYS CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'DRNLEVEL_'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL,X=XTMP(JTOP(1))) CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'DRNCOND_'//TRIM(ITOS(JLAY)) ,-IPER,IR=IROW,IC=ICOL,X=XTMP(JTOP(2))) IF(PBMAN%IFORMAT.EQ.3.AND.PBMAN%DDRN.NE.0.0D0)THEN !## include depth level for numerical improvement drn-package, no drainage at ELEV and maximal drainage at ELEV+DDRN WRITE(JU,FRM) JLAY,IROW,ICOL,(XTMP(JTOP(I)),I=1,NTOP),PBMAN%DDRN,JSYS CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'DRNDDRN_'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL,X=PBMAN%DDRN) !auxdepthname—name of a variable listed in AUXILIARY that defines the depth at which drainage !discharge will be scaled. If a positive value is specified for the AUXDEPTHNAME AUXILIARY !variable, then ELEV is the elevation at which the drain starts to discharge and ELEV + DDRN !(assuming DDRN is the AUXDEPTHNAME variable) is the elevation when the drain conductance !(COND) scaling factor is 1. If a negative drainage depth value is specified for DDRN, then ELEV !+ DDRN is the elevation at which the drain starts to discharge and ELEV is the elevation when the !conductance (COND) scaling factor is 1. A linear- or cubic-scaling is used to scale the drain con- !ductance (COND) when the Standard or Newton-Raphson Formulation is used, respectively. ELSE IF(PBMAN%FLEXD.EQ.1)THEN WRITE(JU,'(3I10,2G15.7,I10,A)') JLAY,IROW,ICOL,(XTMP(JTOP(I)),I=1,NTOP),JSYS,TRIM(COMMENT) ELSE WRITE(JU,FRM) JLAY,IROW,ICOL,(XTMP(JTOP(I)),I=1,NTOP),JSYS ENDIF ENDIF NP_IPER(IPER)=NP_IPER(IPER)+1 CASE DEFAULT DO I=1,NTOP; XTMP(I)=PCK(I)%X(ICOL,IROW); ENDDO XTMP(1)=XTMP(1)*TLP(ILAY) !## in current model (layers) JSYS=1; IF(PBMAN%SSYSTEM.EQ.0)JSYS=ISYS !## generate riv package without inf-factor IF(ITOPIC.EQ.TRIV)THEN WP=XTMP(JTOP(1)); CD=XTMP(JTOP(2)); BH=XTMP(JTOP(3)); FC=XTMP(JTOP(4)) CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'RIVLEVEL_'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL,X=WP) !## make sure for unconfinedness bottom river is not lower than bottom of model layer IF(LAYCON(JLAY).EQ.2)THEN BH=MAX(BOT(JLAY)%X(ICOL,IROW),BH) ENDIF IF(PBMAN%INFFCT.EQ.1)THEN IF(CD*(1.0D0-FC).GT.0.0D0)THEN IF(PBMAN%IFORMAT.EQ.6)THEN !## convert concentration to density CONC=XTMP(5); IF(WQ%VDF%MTDNCONC.EQ.0)CONC=(CONC/WQ%VDF%DENSESLP)+WQ%VDF%DENSEREF WRITE(JU,'(3(I5,1X),4(G15.7,1X),I5,A)') JLAY,IROW,ICOL,WP,CD*(1.0D0-FC),WP,CONC,JSYS,' D' CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'RIVCONC_'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL,X=CONC) ELSE WRITE(JU,'(3(I5,1X),3(G15.7,1X),I5,A)') JLAY,IROW,ICOL,WP,CD*(1.0D0-FC),WP,JSYS,' D' ENDIF CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'RIVCOND_'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL,X=CD*(1.0D0-FC)) CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'RIVBOTTOM_'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL,X=WP) NP_IPER(IPER)=NP_IPER(IPER)+1 ENDIF IF(WP.GE.BH.AND.CD*FC.GT.0.0D0)THEN IF(PBMAN%IFORMAT.EQ.6.AND.TOPICS(TVDF)%IACT_MODEL.EQ.1)THEN CONC=XTMP(5); IF(WQ%VDF%MTDNCONC.EQ.0)CONC=(CONC/WQ%VDF%DENSESLP)+WQ%VDF%DENSEREF WRITE(JU,'(3(I5,1X),4(G15.7,1X),I5,A)') JLAY,IROW,ICOL,WP,CD*FC,BH,CONC,JSYS,' I' CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'RIVCONC_'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL,X=CONC) ELSE WRITE(JU,'(3(I5,1X),3(G15.7,1X),I5,A)') JLAY,IROW,ICOL,WP,CD*FC,BH,JSYS,' I' ENDIF CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'RIVCOND_'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL,X=CD*FC) CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'RIVBOTTOM_'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL,X=BH) NP_IPER(IPER)=NP_IPER(IPER)+1 ENDIF ELSE WRITE(JU,'(3(I5,1X),4(G15.7,1X),I5)') JLAY,IROW,ICOL,WP,CD,BH,FC,JSYS CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'RIVCOND_'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL,X=CD) CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'RIVBOTTOM_'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL,X=BH) NP_IPER(IPER)=NP_IPER(IPER)+1 ENDIF ELSE IF(PBMAN%IFORMAT.EQ.6.AND.TOPICS(TVDF)%IACT_MODEL.EQ.1)THEN CONC=XTMP(NTOP); IF(WQ%VDF%MTDNCONC.EQ.0)CONC=(CONC/WQ%VDF%DENSESLP)+WQ%VDF%DENSEREF; XTMP(NTOP)=CONC ENDIF WRITE(JU,FRM) JLAY,IROW,ICOL,(XTMP(JTOP(I)),I=1,NTOP),JSYS IF(ITOPIC.EQ.TGHB)THEN CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'GHBLEVEL_'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL,X=XTMP(JTOP(1))) CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'GHBCOND_'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL,X=XTMP(JTOP(2))) ENDIF NP_IPER(IPER)=NP_IPER(IPER)+1 ENDIF END SELECT ENDDO ENDDO; ENDDO !## add drainage from level-controlled drainage IF(PBMAN%FLEXD.EQ.1.AND.ITOPIC.EQ.TDRN.AND.ISYS.EQ.1)THEN DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(FLXDRL%X(ICOL,IROW).EQ.FLXDRL%NODATA)CYCLE !## cell area XTMP(1)=IDFGETAREA(PRJIDF,ICOL,IROW) !## correct for nopp/sopp area F=1.0D0-((FLXSOPP%X(ICOL,IROW)+FLXNOPP%X(ICOL,IROW))/XTMP(1)) WRITE(JU,'(3I10,2G15.7,I10,A)') 1,IROW,ICOL,FLXDRL%X(ICOL,IROW),(XTMP(1)*F)/FLXDRR%X(ICOL,IROW),1,' >>> added by flexd fraction='//TRIM(RTOS(F,'F',2))//' <<<' CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'FLXDRNCOND_'//TRIM(ITOS(JLAY)), -IPER,IR=IROW,IC=ICOL,X=(XTMP(1)*F)/FLXDRR%X(ICOL,IROW)) CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'FLXDRNLEVEL_'//TRIM(ITOS(JLAY)),-IPER,IR=IROW,IC=ICOL,X=FLXDRL%X(ICOL,IROW) ) NP_IPER(IPER)=NP_IPER(IPER)+1 ENDDO; ENDDO ENDIF END SELECT ENDDO IF(ITOPIC.NE.TFHB.AND. & ITOPIC.NE.TUZF.AND. & ITOPIC.NE.TEVT.AND. & ITOPIC.NE.TRCH)THEN LINE=TRIM(ITOS(NP_IPER(IPER))); IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)WRITE(IU,'(A)') TRIM(LINE) ENDIF !## maximum input per simulation MP=MAX(MP,NP_IPER(IPER)) IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN SELECT CASE (ITOPIC) CASE (TDRN,TRIV,TGHB,TOLF,TCHD) CALL IDFWRITEFREE_HEADER(JU,PRJIDF) END SELECT ENDIF CLOSE(JU) IF(PBMAN%IFORMAT.GE.2)THEN IF(PBMAN%IFORMAT.EQ.3)THEN SELECT CASE (ITOPIC) CASE (TEVT) IF(INEVTR.EQ.1.OR.INSURF.EQ.1.OR.INEXDP.EQ.1)WRITE(IU,'(/A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER)) CASE (TRCH) IF(INRECH.EQ.1)WRITE(IU,'(/A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER)) CASE (TUZF) CASE DEFAULT ! IF(NP_IPER(IPER).GT.0) WRITE(IU,'(/A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER)) END SELECT ENDIF IF(NP_IPER(IPER).GT.0)THEN SFNAME=EXFNAME N=3 IF(PBMAN%SSYSTEM.EQ.0.AND.PBMAN%IFORMAT.EQ.3)N=5 IF(PBMAN%SSYSTEM.EQ.1.AND.PBMAN%IFORMAT.EQ.3)N=4 DO I=1,N; SFNAME=SFNAME(:INDEX(SFNAME,'\',.TRUE.)-1); ENDDO I=LEN_TRIM(SFNAME) IF(PBMAN%IFORMAT.EQ.3.AND.PBMAN%IPESTP.EQ.1)THEN SFNAME='..'//EXFNAME(I+1:) ELSE SFNAME='.'//EXFNAME(I+1:) ENDIF IF(ITOPIC.NE.TUZF)WRITE(IU,'(A)') 'OPEN/CLOSE '//TRIM(SFNAME)//' 1.0 (FREE) -1' ENDIF IF(PBMAN%IFORMAT.EQ.3)THEN SELECT CASE (ITOPIC) CASE (TEVT) IF(INEVTR.EQ.1.OR.INSURF.EQ.1.OR.INEXDP.EQ.1)WRITE(IU,'(A)') 'END PERIOD' CASE (TRCH) IF(INRECH.EQ.1)WRITE(IU,'(A)') 'END PERIOD' CASE (TUZF) CASE DEFAULT ! IF(NP_IPER(IPER).GT.0) WRITE(IU,'(A)') 'END PERIOD' END SELECT ENDIF ! IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(A)') 'END PERIOD ' ENDIF ! IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(A)') 'END PERIOD ' !## store previous stress-period information for this timestep LPER=KPER ENDDO !## write fhb package IF(ITOPIC.EQ.TFHB)THEN IF(ALLOCATED(FHBFLW))THEN LINE=TRIM(ITOS(IFHBUN))//',1.0,0'; WRITE(IU,'(A)') TRIM(LINE) !## store values in fhb package I=0; DO ILAY=1,PRJNLAY; DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(BND(ILAY)%X(ICOL,IROW).EQ. 2.0D0)THEN !## to be sure that volumes are rectangles and not triangles modify I=I+1 DO J=2,NBDTIM FHBFLW(I,J)=FHBFLW(I,J)+(FHBFLW(I,J)-FHBFLW(I,J-1)) ENDDO WRITE(IU,'(4(I10,1X),999(1X,G15.7))') ILAY,IROW,ICOL,1,(FHBFLW(I,J),J=1,NBDTIM) DO J=1,NBDTIM CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'FHBFLW_'//TRIM(ITOS(ILAY)),-J,IR=IROW,IC=ICOL,X=FHBFLW(I,J)) ENDDO ENDIF ENDDO; ENDDO; ENDDO ENDIF IF(ALLOCATED(FHBHED))THEN LINE=TRIM(ITOS(IFHBUN))//',1.0,0'; WRITE(IU,'(A)') TRIM(LINE) !## store values in fhb package I=0; DO ILAY=1,PRJNLAY; DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(BND(ILAY)%X(ICOL,IROW).EQ.-2.0D0)THEN I=I+1; WRITE(IU,'(4(I10,1X),999(1X,G15.7))') ILAY,IROW,ICOL,1,(FHBHED(I,J),J=1,NBDTIM) DO J=1,NBDTIM CALL PMANAGER_SAVEEXAMINE(PCK(JTOP(1)),'FHBHED_'//TRIM(ITOS(ILAY)),-J,IR=IROW,IC=ICOL,X=FHBHED(I,J)) ENDDO ENDIF ENDDO; ENDDO; ENDDO ENDIF ENDIF CLOSE(IU) IF(ALLOCATED(TLP)) DEALLOCATE(TLP) IF(ALLOCATED(TP)) DEALLOCATE(TP) IF(ALLOCATED(BT)) DEALLOCATE(BT) IF(ALLOCATED(KH)) DEALLOCATE(KH) IF(ALLOCATED(XTMP)) DEALLOCATE(XTMP) ! CALL PMANAGER_SAVEMF2005_DEALLOCATEPCK() !## apply nevtop/nrchop options SELECT CASE(ITOPIC) CASE (TUZF) IF(PBMAN%IFORMAT.NE.3)NP_IPER(0)=NUZTOP CASE (TEVT) IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)NP_IPER(0)=NEVTOP IF(PBMAN%IFORMAT.EQ.3)NP_IPER(0)=MAXVAL(NP_IPER) CASE (TRCH) IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)NP_IPER(0)=NRCHOP IF(PBMAN%IFORMAT.EQ.3)NP_IPER(0)=MAXVAL(NP_IPER) CASE DEFAULT; NP_IPER(0)=MP END SELECT IF(ITOPIC.EQ.TEVT.OR.ITOPIC.EQ.TRCH)THEN IF(TOPICS(TLAK)%IACT_MODEL.EQ.1.AND.NP_IPER(0).EQ.1)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'It is compulsory to apply the '//TRIM(TOPICS(ITOPIC)%TNAME)//' package to the'//CHAR(13)// & 'first active modellayer in combination with the LAK package.'//CHAR(13)// & 'Assign zero (0) as a model layer for the package','Error') RETURN ENDIF ENDIF !## mf6 does not allow max dimensions to be zero IF(PBMAN%IFORMAT.EQ.3)NP_IPER(0)=MAX(1,NP_IPER(0)) IF(PBMAN%IFORMAT.EQ.3)THEN MP=MAX(1,MP) IF(PBMAN%SSYSTEM.EQ.0)THEN CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'_SYS'//TRIM(ITOS(ISYSMF6))//'.'//CPCK//VTXT//'_',(/NP_IPER(0)/)) ELSE CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',(/NP_IPER(0)/)) ENDIF ELSE CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',(/NP_IPER(0)/)) ENDIF IF(ALLOCATED(NP_IPER))DEALLOCATE(NP_IPER) ENDDO IF(PBMAN%FLEXD.EQ.1)THEN CALL IDFDEALLOCATEX(FLXDRL); CALL IDFDEALLOCATEX(FLXDRR); CALL IDFDEALLOCATEX(FLXPLN) CALL IDFDEALLOCATEX(FLXNOPP); CALL IDFDEALLOCATEX(FLXSOPP) ENDIF IF(NINACTIVE.EQ.1)THEN WRITE(*,'(/A)') 'Number of removed '//TRIM(CPCKIN)//' that are in inactive/constant heads is '//TRIM(ITOS(NINACTIVE)) ENDIF CALL PMANAGER_SAVEMF2005_DEALLOCATEPCK() PMANAGER_SAVEMF2005_PCK=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_PCK !####==================================================================== REAL(KIND=DP_KIND) FUNCTION PMANAGER_SAVE2005_FHBGETQ(XBND,PCK,JTOP,NTOP,ICOL,IROW) !####==================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),DIMENSION(:,:) :: XBND INTEGER,INTENT(IN) :: ICOL,IROW,NTOP INTEGER,INTENT(IN),DIMENSION(NTOP) :: JTOP INTEGER :: JCOL,JROW TYPE(IDFOBJ),INTENT(IN),DIMENSION(NTOP) :: PCK REAL(KIND=DP_KIND) :: QN,QW,QE,QS LOGICAL :: LEX !## single flux file given IF(NTOP.EQ.2)THEN; PMANAGER_SAVE2005_FHBGETQ=PCK(JTOP(1))%X(ICOL,IROW); RETURN; ENDIF !## usage of frf and fff flux terms !## apply offset JCOL=ICOL+1; JROW=IROW+1 !## north if available QN=0.0D0; LEX=.FALSE. IF(IROW.EQ.1)THEN LEX=.TRUE. ELSE IF(XBND(ICOL,IROW-1).EQ.0.0D0)LEX=.TRUE. ENDIF IF(LEX)THEN QN=PCK(JTOP(2))%X(JCOL,JROW-1); IF(QN.EQ.PCK(JTOP(2))%NODATA)QN=0.0D0; QN=-1.0D0*QN ENDIF !## west if available QW=0.0D0; LEX=.FALSE. IF(ICOL.EQ.1)THEN LEX=.TRUE. ELSE IF(XBND(ICOL-1,IROW).EQ.0.0D0)LEX=.TRUE. ENDIF IF(LEX)THEN QW=PCK(JTOP(1))%X(JCOL-1,JROW); IF(QW.EQ.PCK(JTOP(1))%NODATA)QW=0.0D0; QW=-1.0D0*QW ENDIF !## south if available QS=0.0D0; LEX=.FALSE. IF(IROW.EQ.PRJIDF%NROW)THEN LEX=.TRUE. ELSE IF(XBND(ICOL,IROW+1).EQ.0.0D0)LEX=.TRUE. ENDIF IF(LEX)THEN QS=PCK(JTOP(2))%X(JCOL,JROW); IF(QS.EQ.PCK(JTOP(2))%NODATA)QS=0.0D0 ENDIF !## east if available QE=0.0D0; LEX=.FALSE. IF(ICOL.EQ.PRJIDF%NCOL)THEN LEX=.TRUE. ELSE IF(XBND(ICOL+1,IROW).EQ.0.0D0)LEX=.TRUE. ENDIF IF(LEX)THEN QE=PCK(JTOP(1))%X(JCOL,JROW); IF(QE.EQ.PCK(JTOP(1))%NODATA)QE=0.0D0 ENDIF PMANAGER_SAVE2005_FHBGETQ=QN+QW+QS+QE END FUNCTION PMANAGER_SAVE2005_FHBGETQ !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_SSM_READSAVE(MAINDIR,DIR,DIRMNAME,IBATCH,IPRT) !####==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IBATCH,IPRT CHARACTER(LEN=*),INTENT(IN) :: MAINDIR,DIR,DIRMNAME INTEGER :: I,ITOPIC,SCL_D,SCL_U,IROW,ICOL,IPER,KPER,IU,ILAY,J,K,IFBND,ISYS,NSYS,KTOP,NTOP, & NCOLIPF,NROWIPF,IOS,N,IL1,IL2,KU REAL(KIND=DP_KIND) :: Q,C,X,Y,CONC INTEGER(KIND=8) :: ITIME,JTIME INTEGER,DIMENSION(6) :: IPREV INTEGER,ALLOCATABLE,DIMENSION(:) :: NSS,JU INTEGER,DIMENSION(6) :: SSMTOPIC,SSMTYPE,COLUMN LOGICAL :: LSSM REAL(KIND=DP_KIND),ALLOCATABLE,DIMENSION(:,:,:) :: CONCACT INTEGER(KIND=1),ALLOCATABLE,DIMENSION(:,:,:) :: CONCCNT CHARACTER(LEN=52),DIMENSION(4) :: STRING CHARACTER(LEN=11) :: TXT CHARACTER(LEN=256) :: ARRFNAME PMANAGER_SAVEMF2005_SSM_READSAVE=.TRUE.; IF(PBMAN%IFORMAT.NE.6.OR.WQ%VDF%MTDNCONC.EQ.0)RETURN SSMTOPIC=[TWEL,TDRN,TRCH,TEVT,TRIV,TGHB] PMANAGER_SAVEMF2005_SSM_READSAVE=.FALSE. !## read lake package (also adjust ibound for lakes) IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.SSM1_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') IF(IU.EQ.0)RETURN LINE=''; DO I=1,SIZE(SSMTOPIC) ITOPIC=SSMTOPIC(I) IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.1)THEN; LINE=TRIM(LINE)//' T'; ELSE; LINE=TRIM(LINE)//' F'; ENDIF ENDDO WRITE(IU,'(A)') TRIM(LINE)//' F F F F' SSMTOPIC=[TRCH,TEVT,TWEL,TDRN,TRIV,TGHB]; ALLOCATE(NSS(PRJNPER+1)); NSS=0 !## ssm types SSMTYPE =[0,0,2,3,4,5]; COLUMN=[0,0,5,6,7,6] SCL_D=1; SCL_U=2; ALLOCATE(FNAMES(1)) !## mxss WRITE(IU,'(A)') 'NaN1#' !## allocate pck-information ALLOCATE(CONCACT(PRJIDF%NCOL,PRJIDF%NROW,PRJNLAY)) ALLOCATE(CONCCNT(PRJIDF%NCOL,PRJIDF%NROW,PRJNLAY)) N=SIZE(SSMTOPIC); ALLOCATE(PCKSSM(N)) DO I=1,N NULLIFY(PCKSSM(I)%ILAY); NULLIFY(PCKSSM(I)%IROW) NULLIFY(PCKSSM(I)%ICOL); NULLIFY(PCKSSM(I)%CONC) ENDDO !## get maximal packages available NSS(1)=0; ALLOCATE(JU(N)); JU=0; DO I=1,N ITOPIC=SSMTOPIC(I); IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)CYCLE SELECT CASE (ITOPIC) CASE (TRCH,TEVT); NSS(1)=NSS(1)+PRJIDF%NROW*PRJIDF%NCOL; CYCLE CASE DEFAULT JU(I)=UTL_GETUNIT(); OPEN(JU(I),FILE=TRIM(DIRMNAME)//'.'//TOPICS(ITOPIC)%CMOD//'7',STATUS='OLD',ACTION='READ') READ(JU(I),*) N; NSS(1)=NSS(1)+N END SELECT ENDDO !## add constant head to nss(1) DO ILAY=1,PRJNLAY; DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(BND(ILAY)%X(ICOL,IROW).LT.0.0D0)NSS(1)=NSS(1)+1 ENDDO; ENDDO; ENDDO !## define per stressperiod DO IPER=1,PRJNPER DO I=1,2 !## process recharge/evapotranspiration ITOPIC=SSMTOPIC(I) IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.1)THEN !## get appropriate stress-period to store in runfile KPER=PMANAGER_GETCURRENTIPER(IPER,ITOPIC,ITIME,JTIME) !## reuse previous timestep IF(KPER.LE.0)THEN WRITE(IU,'(I10,10X,A)') -1,TRIM(TOPICS(ITOPIC)%TNAME) CYCLE ENDIF NTOP=SIZE(TOPICS(ITOPIC)%STRESS(1)%FILES,1); NSYS=SIZE(TOPICS(ITOPIC)%STRESS(1)%FILES,2) DO ISYS=1,NSYS !## read last subtopic KTOP=NTOP FNAMES(1)%ICNST=TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%ICNST FNAMES(1)%CNST =TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%CNST FNAMES(1)%FCT =TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%FCT FNAMES(1)%IMP =TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%IMP FNAMES(1)%ILAY =TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%ILAY FNAMES(1)%FNAME=TOPICS(ITOPIC)%STRESS(KPER)%FILES(KTOP,ISYS)%FNAME !## read concentrations IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(PRJIDF,ITOPIC,1,SCL_D,SCL_U,0,IPRT))RETURN CALL PMANAGER_SAVEMF2005_CORRECT(1,BND,PRJIDF,0,ITOPIC) WRITE(IU,'(A)') '1' IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\SSM\'//TRIM(TOPICS(ITOPIC)%CMOD)//'_CONC.ARR',PRJIDF,0,IU,1,IFBND))RETURN ENDDO ENDIF ENDDO !## read locations for package IPREV=0; DO I=1,SIZE(JU) IF(JU(I).EQ.0)CYCLE READ(JU(I),*) IPREV(I) IF(IPREV(I).GT.0)THEN READ(JU(I),'(2A)') TXT,ARRFNAME; READ(ARRFNAME,*) ARRFNAME ARRFNAME=TRIM(MAINDIR)//'\'//TRIM(ARRFNAME(3:)) IF(.NOT.PMANAGER_SAVEMF2005_MOD_READLSTFILE(ARRFNAME,IPREV(I),I,COLUMN(I)))THEN RETURN ENDIF ELSE IPREV(I)=0; IF(ASSOCIATED(PCKSSM(I)%CONC))IPREV(I)=SIZE(PCKSSM(I)%CONC) ENDIF ENDDO LSSM=.FALSE.; DO I=3,SIZE(SSMTOPIC); IF(IPREV(I).GT.0)LSSM=.TRUE.; ENDDO IF(LSSM)THEN WRITE(IU,'(A10,10X,A)') 'NaN'//TRIM(ITOS(IPER+1))//'#',' SSM FOR PACKAGES '//TRIM(SIM(IPER)%CDATE) DO I=3,SIZE(SSMTOPIC) !## skip drn package IF(SSMTYPE(I).EQ.3)CYCLE !## get current topic ITOPIC=SSMTOPIC(I); IF(TOPICS(ITOPIC)%IACT_MODEL.NE.1)CYCLE; CONCACT=0.0D0; CONCCNT=INT(0,1) DO J=1,IPREV(I) ILAY=PCKSSM(I)%ILAY(J) IROW=PCKSSM(I)%IROW(J) ICOL=PCKSSM(I)%ICOL(J) CONC=PCKSSM(I)%CONC(J) CONCACT(ICOL,IROW,ILAY)=CONCACT(ICOL,IROW,ILAY)+CONC CONCCNT(ICOL,IROW,ILAY)=CONCCNT(ICOL,IROW,ILAY)+INT(1,1) ENDDO DO J=1,IPREV(I) ILAY=PCKSSM(I)%ILAY(J) IROW=PCKSSM(I)%IROW(J) ICOL=PCKSSM(I)%ICOL(J) IF(CONCCNT(ICOL,IROW,ILAY).GT.INT(0,1))THEN CONC=CONCACT(ICOL,IROW,ILAY)/REAL(CONCCNT(ICOL,IROW,ILAY),8) WRITE(IU,'(3I10,F10.2,I10)') ILAY,IROW,ICOL,CONC,SSMTYPE(I) NSS(IPER+1)=NSS(IPER+1)+1 CONCCNT(ICOL,IROW,ILAY)=INT(0,1) ENDIF ENDDO ENDDO ELSE WRITE(IU,'(A)') '-1 RE-USE ALL EXISTING SSM PACKAGES '//TRIM(SIM(IPER)%CDATE) ENDIF ENDDO DEALLOCATE(FNAMES,JU,CONCACT,CONCCNT) CLOSE(IU) CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.SSM1_',NSS) PMANAGER_SAVEMF2005_SSM_READSAVE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_SSM_READSAVE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_LAK_READ(IPER,IPRT,KPER) !####==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IPER,IPRT INTEGER,INTENT(INOUT) :: KPER INTEGER :: I,ITOPIC,SCL_D,SCL_U,IROW,ICOL,JPER INTEGER(KIND=8) :: ITIME,JTIME PMANAGER_SAVEMF2005_LAK_READ=.TRUE. IF(TOPICS(TLAK)%IACT_MODEL.EQ.0)RETURN PMANAGER_SAVEMF2005_LAK_READ=.FALSE. !## lak settings - use most frequent ITOPIC=TLAK !## initialisation of lake package IF(IPER.EQ.0)THEN !## search for first lake definition in time DO JPER=1,PRJNPER !## get appropriate input file for first stress-period KPER=PMANAGER_GETCURRENTIPER(JPER,ITOPIC,ITIME,JTIME) IF(KPER.GT.0)EXIT ENDDO !## nothing found IF(JPER.GT.PRJNPER)KPER=0 ! ELSE ! !## get appropriate input file for first stress-period ! KPER=PMANAGER_GETCURRENTIPER(IPER,ITOPIC,ITIME,JTIME) ! !## nothing found ! IF(IPER.EQ.1.AND.KPER.LE.0)KPER=0 ENDIF ! IF(KPER.LT.0)THEN; PMANAGER_SAVEMF2005_LAK_READ=.TRUE.; RETURN; ENDIF !## get appropriate filename for first system and i-th subsystem for kper-th period ALLOCATE(FNAMES(TOPICS(ITOPIC)%NSUBTOPICS),PRJILIST(1)); PRJILIST=ITOPIC IF(PMANAGER_GETFNAMES(1,1,1,0,KPER).LE.0)RETURN DO I=1,SIZE(LAK) SELECT CASE (I) CASE (1); SCL_D=0; SCL_U=7 CASE DEFAULT; SCL_D=1; SCL_U=2 END SELECT CALL IDFCOPY(PRJIDF,LAK(I)) IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(LAK(I),ITOPIC,I,SCL_D,SCL_U,0,IPRT))RETURN IF(I.EQ.1)THEN !## remove negative lake-numbers and nodata cells DO IROW=1,BND(1)%NROW; DO ICOL=1,BND(1)%NCOL IF(LAK(1)%X(ICOL,IROW).LT.0.0D0)LAK(1)%X(ICOL,IROW)=0.0D0 IF(LAK(1)%X(ICOL,IROW).EQ.LAK(1)%NODATA)LAK(1)%X(ICOL,IROW)=0.0D0 ENDDO; ENDDO ELSE !## clean rest of input CALL PMANAGER_SAVEMF2005_CORRECT(1,LAK,LAK(I),0,ITOPIC) ENDIF ENDDO DEALLOCATE(FNAMES,PRJILIST) PMANAGER_SAVEMF2005_LAK_READ=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_LAK_READ !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_LAK_SAVE(IULAK,IINI,IBATCH,DIR,KPER,DIRMNAME) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR CHARACTER(LEN=*),INTENT(IN),OPTIONAL :: DIRMNAME INTEGER,INTENT(IN),OPTIONAL :: KPER INTEGER,INTENT(IN) :: IBATCH,IINI INTEGER,INTENT(INOUT) :: IULAK INTEGER :: NSSITR,I,J,IOP,ILAY,ITMP1,IFBND REAL(KIND=DP_KIND) :: THETA,SSCNCR,LVL,FCT,SURFDEPTH PMANAGER_SAVEMF2005_LAK_SAVE=.TRUE. IF(TOPICS(TLAK)%IACT_MODEL.EQ.0)RETURN PMANAGER_SAVEMF2005_LAK_SAVE=.FALSE. !## initial timestep - open file and write header IF(KPER.EQ.1)THEN !## a THETA is automatically set to a value of 1.0D0 for all steady-state stress periods !## a THETA of 0.5 represents the average lake stage during a time step. !## a THETA of 1.0D0 represents the lake stage at the end of the time step. !## a negative THETA of applies for a SURFDEPTH decreases the lakebed conductance for vertical flow across a horizontal lakebed !## caused both by a groundwater head that is between the lakebed and the lakebed plus SURFDEPTH and a lake stage that is also !## between the lakebed and the lakebed plus SURFDEPTH. This method provides a smooth transition from a condition of no groundwater !## discharge to a lake, when groundwater head is below the lakebed, to a condition of increasing groundwater discharge to a lake as !## groundwater head becomes greater than the elevation of the dry lakebed. The method also allows for the transition of seepage from !## a lake to groundwater when the lake stage decreases to the lakebed elevation. Values of SURFDEPTH ranging from 0.01D0 to 0.5 have !## been used successfully in test simulations. SURFDEP is read only if THETA is specified as a negative value. THETA=-1.0D0; SSCNCR=0.01D0; NSSITR=100; SURFDEPTH=0.25D0 !## read lake package (also adjust ibound for lakes) IULAK=UTL_GETUNIT(); CALL OSD_OPEN(IULAK,FILE=TRIM(DIRMNAME)//'.LAK7',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IULAK.EQ.0)RETURN !## set number of lakes LINE=TRIM(ITOS(NLAKES))//','//TRIM(ITOS(ILAKCB)) WRITE(IULAK,'(A)') TRIM(LINE) !## set global settings LINE=TRIM(RTOS(THETA,'G',5))//','//TRIM(ITOS(NSSITR))//','//TRIM(RTOS(SSCNCR,'G',5))//','//TRIM(RTOS(SURFDEPTH,'G',5)) WRITE(IULAK,'(A)') TRIM(LINE) ENDIF !## initial timestep IF(IINI.EQ.1)THEN !## get initial, minimal and maximal stages per lake DO I=1,NLAKES DO J=3,5 SELECT CASE (J) CASE (3); IOP=1 !## initial (take average value) CASE (4); IOP=2 !## minimal CASE (5); IOP=3 !## maximal END SELECT IF(.NOT.PMANAGER_SAVEMF2005_LAKE_GETMEANVALUE(LAK(1)%X,LAK(J)%X,ULAKES(I),LVL,IBATCH,IOP))RETURN IF(J.EQ.3)THEN LINE=TRIM(RTOS(LVL,'G',5)) ELSE LINE=TRIM(LINE)//','//TRIM(RTOS(LVL,'G',5)) ENDIF ENDDO WRITE(IULAK,'(A)') TRIM(LINE)//' ORIGINAL LAKE IDENTIFICATION: '//TRIM(ITOS(ULAKES(I))) ENDDO ITMP1=1; LINE='1,'//TRIM(ITOS(ITMP1))//',0'; WRITE(IULAK,'(A)') TRIM(LINE) !## save lake identification IFBND=0 DO ILAY=1,PRJNLAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\LAK7\LKARR_L'//TRIM(ITOS(ILAY))//'.ARR', & LBD(ILAY),1,IULAK,ILAY,IFBND))RETURN ENDDO !## get lakebed leakance IFBND=0 DO ILAY=1,PRJNLAY IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\LAK7\BDLKNC_L'//TRIM(ITOS(ILAY))//'.ARR', & LCD(ILAY),0,IULAK,ILAY,IFBND))RETURN ENDDO !## no connected lakes LINE=TRIM(ITOS(0)) WRITE(IULAK,'(A)') TRIM(LINE) ELSE ! ITMP1=1; IF(KPER.EQ.0)ITMP1=0; IF(KPER.LT.0)ITMP1=-1 !## iini=-1 to previous usage of lak settings but renewed read in rch/evt IF(KPER.GT.0)ITMP1= 1 !SIGN(KPER) !IINI !ABS(IINI) IF(KPER.LT.0)ITMP1=-1 !SIGN(KPER) !IINI !ABS(IINI) !## HIER MOET IINI OOK DE WAARDE 1 KUNNEN KRIJGEN ALS ER WEL RCH.EVT MOET WORDEN INGELZEN LINE='-1,'//TRIM(ITOS(ITMP1))//',0'; WRITE(IULAK,'(A)') TRIM(LINE) ENDIF !## get average prcplk,evaplk sum of rnf,wthdrw IF(ITMP1.GT.0)THEN IOP=1 DO I=1,NLAKES DO J=7,10 SELECT CASE (J) CASE (7,8); IOP=1; FCT=0.01D0 !## prcplk,evaplk CASE (9); IOP=1; FCT=1.00D0 !## rnf CASE (10); IOP=1; FCT=1.00D0 !## wthdrw END SELECT IF(.NOT.PMANAGER_SAVEMF2005_LAKE_GETMEANVALUE(LAK(1)%X,LAK(J)%X,ULAKES(I),LVL,IBATCH,IOP))RETURN IF(J.EQ.7)THEN LINE=TRIM(RTOS(LVL*FCT,'G',5)) ELSE LINE=TRIM(LINE)//','//TRIM(RTOS(LVL*FCT,'G',5)) ENDIF ENDDO WRITE(IULAK,'(A)') TRIM(LINE) ENDDO ENDIF PMANAGER_SAVEMF2005_LAK_SAVE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_LAK_SAVE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_SFT_READ(IPRT) !####==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IPRT INTEGER :: ITOPIC,SCL_D,SCL_U,I,IINV,NTOP,NSYS,ISYS,KTOP,ICNST,ILAY REAL(KIND=DP_KIND) :: FCT,CNST,IMP CHARACTER(LEN=256) :: SFNAME PMANAGER_SAVEMF2005_SFT_READ=.TRUE. !## use sft1 IF(TOPICS(TSFT)%IACT_MODEL.EQ.0)RETURN PMANAGER_SAVEMF2005_SFT_READ=.FALSE. !## sft settings ITOPIC=TSFT; IINV=0; SCL_D=1 DO I=1,SIZE(SFT); CALL IDFCOPY(PRJIDF,SFT(I)); ENDDO !## allocate memory for packages NTOP=SIZE(TOPICS(ITOPIC)%STRESS(1)%FILES,1); NSYS=SIZE(TOPICS(ITOPIC)%STRESS(1)%FILES,2) !## number of systems DO ISYS=1,NSYS !## number of subtopics DO KTOP=1,NTOP ICNST =TOPICS(ITOPIC)%STRESS(1)%FILES(KTOP,ISYS)%ICNST CNST =TOPICS(ITOPIC)%STRESS(1)%FILES(KTOP,ISYS)%CNST FCT =TOPICS(ITOPIC)%STRESS(1)%FILES(KTOP,ISYS)%FCT IMP =TOPICS(ITOPIC)%STRESS(1)%FILES(KTOP,ISYS)%IMP ILAY =TOPICS(ITOPIC)%STRESS(1)%FILES(KTOP,ISYS)%ILAY !## always layer ILAY =1 SFNAME=TOPICS(ITOPIC)%STRESS(1)%FILES(KTOP,ISYS)%FNAME WRITE(IPRT,'(1X,A,I3,A1,I1,A1,I4.3,3(A1,G15.7),A1,A)') TOPICS(ITOPIC)%TNAME(1:5)//',', & ISYS,',',ICNST,',',ILAY,',',FCT,',',IMP,',',CNST,',',CHAR(39)//TRIM(SFNAME)//CHAR(39) !## thickness in meters IF(KTOP.EQ.1)THEN !## constant value IF(ICNST.EQ.1)THEN SFT(1)%X=CNST !## read/clip/scale idf file ELSEIF(TOPICS(ITOPIC)%STRESS(1)%FILES(KTOP,ISYS)%ICNST.EQ.2)THEN SFT(1)%FNAME=SFNAME SCL_U=2 IF(.NOT.IDFREADSCALE(SFT(1)%FNAME,SFT(1),SCL_U,SCL_D,1.0D0,0))RETURN ENDIF CALL PMANAGER_SAVEMF2005_FCTIMP(0,ICNST,SFT(1),FCT,IMP,SCL_D) CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,SFT(1),0,ITOPIC) !## geometric for permeability ELSEIF(KTOP.EQ.2)THEN !## constant value IF(ICNST.EQ.1)THEN SFT(2)%X=CNST !## read/clip/scale idf file ELSEIF(TOPICS(ITOPIC)%STRESS(1)%FILES(KTOP,ISYS)%ICNST.EQ.2)THEN SFT(2)%FNAME=SFNAME SCL_U=3 IF(.NOT.IDFREADSCALE(SFT(ILAY)%FNAME,SFT(2),SCL_U,SCL_D,1.0D0,0))RETURN ENDIF CALL PMANAGER_SAVEMF2005_FCTIMP(0,ICNST,SFT(2),FCT,IMP,SCL_D) CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,SFT(2),0,ITOPIC) ENDIF ENDDO ENDDO PMANAGER_SAVEMF2005_SFT_READ=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_SFT_READ !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_TDIS(DIRMNAME) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIRMNAME INTEGER :: IU,KPER CHARACTER(LEN=52) :: CLINE PMANAGER_SAVEMF2005_TDIS=.TRUE.; IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)RETURN !## file already written IF(PBMAN%ISUBMODEL.GT.1)RETURN PMANAGER_SAVEMF2005_TDIS=.FALSE. !## construct pcg-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.TDIS6',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# TDIS6 File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(/A/)') '#General Options' WRITE(IU,'(A)') 'BEGIN OPTIONS' WRITE(IU,'(A)') ' TIME_UNITS DAYS' DO KPER=1,PRJNPER; IF(SIM(KPER)%DELT.GT.0.0D0)EXIT; ENDDO IF(KPER.LE.PRJNPER)THEN WRITE(IU,'(A)') ' START_DATE_TIME '//TRIM(ITOS(SIM(KPER)%IYR))//'-'//TRIM(ITOS(SIM(KPER)%IMH))//'-'//TRIM(ITOS(SIM(KPER)%IDY))// & 'T00:00:00TZD+01:00' ENDIF WRITE(IU,'(A)') 'END OPTIONS' WRITE(IU,'(/A/)') '#Time Dimensions' WRITE(IU,'(A)') 'BEGIN DIMENSIONS' WRITE(IU,'(A)') ' NPER '//TRIM(ITOS(PRJNPER)) WRITE(IU,'(A)') 'END DIMENSIONS' WRITE(IU,'(/A/)') '#Stress periods' WRITE(IU,'(A)') 'BEGIN PERIODDATA' !## time information DO KPER=1,PRJNPER !## set delt.eq.1 otherwise MF6 won't work IF(SIM(KPER)%DELT.EQ.0.0D0)THEN IF(PRJNPER.EQ.1)THEN LINE=TRIM(RTOS(1.0D0,'G',7))//','// & TRIM(ITOS(SIM(KPER)%NSTP)) //','// & TRIM(RTOS(SIM(KPER)%TMULT,'G',7)) ELSE LINE=TRIM(RTOS(0.0D0,'G',7))//','// & TRIM(ITOS(SIM(KPER)%NSTP)) //','// & TRIM(RTOS(SIM(KPER)%TMULT,'G',7)) ENDIF ELSE ! KKPER=KPER; IF(PBMAN%ISAVEENDDATE.EQ.1)KKPER=KKPER+1 LINE=TRIM(RTOS(SIM(KPER)%DELT,'G',7))//','// & TRIM(ITOS(SIM(KPER)%NSTP)) //','// & TRIM(RTOS(SIM(KPER)%TMULT,'G',7)) ENDIF IF(SIM(KPER)%DELT.EQ.0.0D0)THEN LINE=TRIM(LINE)//' ['//TRIM(SIM(KPER)%CDATE)//'] ['//TRIM(SIM(KPER)%CDATE)//']' ELSE CLINE=TRIM(SIM(KPER+1)%CDATE) !TRIM(ITOS_DBL(ADD_DT_TO_IDATE(SIM(KPER)%IYR,SIM(KPER)%IMH,SIM(KPER)%IDY,SIM(KPER)%IHR,SIM(KPER)%IMT,SIM(KPER)%ISC,SIM(KPER)%DELT,0))) LINE =TRIM(LINE)//' ['//TRIM(SIM(KPER)%CDATE)//'] ['//TRIM(CLINE)//']' ENDIF WRITE(IU,'(A)') ' '//TRIM(LINE) ENDDO WRITE(IU,'(A)') 'END PERIODDATA' CLOSE(IU) PMANAGER_SAVEMF2005_TDIS=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_TDIS !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_MET(DIRIN,DIRMNAME) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIRIN,DIRMNAME INTEGER :: IU,KPER,I,N1,N2 CHARACTER(LEN=256) :: DIR,KEYWORD IF(PBMAN%OUTPUT.NE.'')THEN DIR=PBMAN%OUTPUT ELSE DIR=TRIM(DIRIN(:INDEX(DIRIN,'\',.TRUE.)-1)) ENDIF PMANAGER_SAVEMF2005_MET=.TRUE.; IF(PBMAN%IFORMAT.EQ.3)RETURN PMANAGER_SAVEMF2005_MET=.FALSE. !## write *.nam file(s) N1=1; N2=1 IF(PBMAN%IPESTP.EQ.1)THEN IF(PEST%PE_MXITER.LT.0)THEN N1=-1; N2=N1 ELSE N1=-PBMAN%NLAMBDASEARCH; N2=SIZE(PEST%PARAM) ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN N1=1; N2=PEST%NREALS ENDIF DO I=N1,N2 !## skip zero IF(I.EQ.0)CYCLE IU=UTL_GETUNIT() IF(PBMAN%IPESTP+PBMAN%IIES.EQ.0)THEN CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.MET7',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ELSEIF(PBMAN%IPESTP.EQ.1)THEN IF(I.GT.0)THEN IF(PEST%PARAM(I)%PACT.EQ.0.OR.PEST%PARAM(I)%PIGROUP.LT.0)CYCLE CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'_P#'//TRIM(ITOS(I))//'.MET7',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ELSE CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'_L#'//TRIM(ITOS(ABS(I)))//'.MET7',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'_R#'//TRIM(ITOS(I))//'.MET7',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') ENDIF IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# MET7 File Generated by '//TRIM(UTL_IMODVERSION()) LINE='COORD_XLL '//TRIM(RTOS(PRJIDF%XMIN,'F',3)) ; WRITE(IU,'(A)') TRIM(LINE) LINE='COORD_YLL '//TRIM(RTOS(PRJIDF%YMIN,'F',3)) ; WRITE(IU,'(A)') TRIM(LINE) LINE='COORD_XLL_NB '//TRIM(RTOS(PBMAN%XMIN,'F',3)); WRITE(IU,'(A)') TRIM(LINE) LINE='COORD_YLL_NB '//TRIM(RTOS(PBMAN%YMIN,'F',3)); WRITE(IU,'(A)') TRIM(LINE) LINE='COORD_XUR_NB '//TRIM(RTOS(PBMAN%XMAX,'F',3)); WRITE(IU,'(A)') TRIM(LINE) LINE='COORD_YUR_NB '//TRIM(RTOS(PBMAN%YMAX,'F',3)); WRITE(IU,'(A)') TRIM(LINE) ! LINE='COORD_XLL_NB '//TRIM(RTOS(PRJIDF%XMIN,'F',3)); WRITE(IU,'(A)') TRIM(LINE) ! LINE='COORD_YLL_NB '//TRIM(RTOS(PRJIDF%YMIN,'F',3)); WRITE(IU,'(A)') TRIM(LINE) ! LINE='COORD_XUR_NB '//TRIM(RTOS(PRJIDF%XMAX,'F',3)); WRITE(IU,'(A)') TRIM(LINE) ! LINE='COORD_YUR_NB '//TRIM(RTOS(PRJIDF%YMAX,'F',3)); WRITE(IU,'(A)') TRIM(LINE) !## look for first DO KPER=1,PRJNPER; IF(SIM(KPER)%DELT.GT.0.0D0)EXIT; ENDDO IF(KPER.LE.PRJNPER)THEN IF(PBMAN%IFORMAT.EQ.6)THEN LINE='START_YEAR '//TRIM(ITOS(SIM(KPER)%IYR)); WRITE(IU,'(A)') TRIM(LINE) LINE='START_MONTH '//TRIM(ITOS(SIM(KPER)%IMH)); WRITE(IU,'(A)') TRIM(LINE) LINE='START_DAY '//TRIM(ITOS(SIM(KPER)%IDY)); WRITE(IU,'(A)') TRIM(LINE) ELSE LINE='STARTTIME YEAR '//TRIM(ITOS(SIM(KPER)%IYR))//' MONTH '//TRIM(ITOS(SIM(KPER)%IMH))//' DAY '//TRIM(ITOS(SIM(KPER)%IDY)) WRITE(IU,'(A)') TRIM(LINE) ENDIF ENDIF KEYWORD='RESULTDIR'; IF(PBMAN%IFORMAT.EQ.6)KEYWORD='RESULT_DIR' IF(PBMAN%IPESTP+PBMAN%IIES.EQ.0)THEN LINE=TRIM(KEYWORD)//' "'//TRIM(DIR)//'"'; WRITE(IU,'(A)') TRIM(LINE) ELSEIF(PBMAN%IPESTP.EQ.1)THEN IF(I.GT.0)THEN LINE=TRIM(KEYWORD)//' "'//TRIM(DIR)//'\IPEST_P#'//TRIM(ITOS(I))//'"'; WRITE(IU,'(A)') TRIM(LINE) ELSE LINE=TRIM(KEYWORD)//' "'//TRIM(DIR)//'\IPEST_L#'//TRIM(ITOS(ABS(I)))//'"'; WRITE(IU,'(A)') TRIM(LINE) ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN IF(I.GT.0)THEN LINE=TRIM(KEYWORD)//' "'//TRIM(DIR)//'\IIES_R#'//TRIM(ITOS(I))//'"'; WRITE(IU,'(A)') TRIM(LINE) ELSE LINE=TRIM(KEYWORD)//' "'//TRIM(DIR)//'\IIES_L#'//TRIM(ITOS(ABS(I)))//'"'; WRITE(IU,'(A)') TRIM(LINE) ENDIF ENDIF IF(PBMAN%IPEST+PBMAN%IPESTP.GT.0.AND.PBMAN%IFORMAT.NE.6)THEN LINE='IPESTPDIR "'//TRIM(DIR)//'"'; WRITE(IU,'(A)') TRIM(LINE) ENDIF LINE='SAVEDOUBLE '//TRIM(ITOS(PBMAN%IDOUBLE)); WRITE(IU,'(A)') TRIM(LINE) IF(PBMAN%IFORMAT.NE.6)THEN; LINE='SAVEDATE 1'; WRITE(IU,'(A)') TRIM(LINE); ENDIF CLOSE(IU) ENDDO PMANAGER_SAVEMF2005_MET=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_MET !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_HFB(IBATCH,DIRMNAME,IPRT,LTB) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIRMNAME INTEGER,INTENT(IN) :: IBATCH,IPRT LOGICAL,INTENT(IN) :: LTB INTEGER :: IU,JU,ILAY,ITOPIC,NPHFB,MXFB,HFBNPER,IPER,KPER,INAN INTEGER(KIND=DP_KIND) :: ITIME,JTIME INTEGER,ALLOCATABLE,DIMENSION(:) :: IUGEN,IUDAT,NHFBNP CHARACTER(LEN=1) :: VTXT CHARACTER(LEN=12) :: CHFBTRAN CHARACTER(LEN=256) :: FNAME INTEGER,ALLOCATABLE,DIMENSION(:) :: NNAN PMANAGER_SAVEMF2005_HFB=.TRUE.; IF(TOPICS(THFB)%IACT_MODEL.EQ.0)RETURN PMANAGER_SAVEMF2005_HFB=.FALSE. ITOPIC=THFB; VTXT='7'; IF(PBMAN%IFORMAT.EQ.3)VTXT='6' IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.HFB'//VTXT//'...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.HFB'//VTXT//'...' HFBNPER=1; IF(TOPICS(THFB)%TIMDEP)HFBNPER=PRJNPER; ALLOCATE(NNAN(HFBNPER)) CHFBTRAN=''; IF(TOPICS(THFB)%TIMDEP)CHFBTRAN='HFBTRAN' !## construct hfb-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.HFB'//VTXT//'_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# HFB'//VTXT//' File Generated by '//TRIM(UTL_IMODVERSION()) IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IU,'(/A/)') '#General Options' WRITE(IU,'(A)') 'BEGIN OPTIONS' ! WRITE(IU,'(A)') ' PRINT_INPUT' WRITE(IU,'(A)') 'END OPTIONS' WRITE(IU,'(/A/)') '#General Dimensions' WRITE(IU,'(A)') 'BEGIN DIMENSIONS' WRITE(IU,'(1X,A)') ' MAXHFB NaN1#' WRITE(IU,'(A)') 'END DIMENSIONS' ENDIF CALL UTL_CREATEDIR(DIRMNAME(:INDEX(DIRMNAME,'\',.TRUE.)-1)//'\GEN') !## is the number of horizontal-flow barrier parameters NPHFB=0 !## is the number of HFB barriers not defined by parameters MXFB=0 !## number of faults ALLOCATE(NHFBNP(PRJNLAY)) !## apply resistances IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN IF(LTB)THEN WRITE(IU,'(2I10,A)') NPHFB,MXFB,',NaN1# NOPRINT HFBRESIS SYSTEM '//TRIM(CHFBTRAN) ELSE WRITE(IU,'(2I10,A)') NPHFB,MXFB,',NaN1# NOPRINT HFBFACT SYSTEM '//TRIM(CHFBTRAN) ENDIF ENDIF INAN=0; NNAN=0; DO IPER=1,HFBNPER IF(TOPICS(THFB)%TIMDEP)THEN !## get appropriate stress-period to store in runfile KPER=PMANAGER_GETCURRENTIPER(IPER,ITOPIC,ITIME,JTIME) !## output WRITE(IPRT,'(1X,A,2I10,2(1X,I14))') 'Exporting timestep ',IPER,KPER,ITIME,JTIME IF(IBATCH.EQ.1)WRITE(6,'(A,3I6,2(1X,I14))') '+Exporting timestep ',IPER,PRJNPER,KPER,ITIME,JTIME !## reuse previous timestep IF(KPER.LE.0)THEN IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN IF(IPER.EQ.1)THEN; WRITE(IU,'(I10)') 0 ELSE; WRITE(IU,'(I10)') -1; ENDIF ENDIF !## goto next timestep CYCLE ENDIF ELSE KPER=1 ENDIF IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(/A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER)) !## creating and collect all faults FNAME=DIRMNAME(:INDEX(DIRMNAME,'\',.TRUE.)-1)//'\GEN\'//TRIM(DIRMNAME(INDEX(DIRMNAME,'\',.TRUE.)+1:))//'_HFB.TXT' JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=FNAME,STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') IF(.NOT.PMANAGER_SAVEMF2005_HFB_COMPUTE(PRJIDF,ITOPIC,JU,BND,TOP,BOT,IPRT,IBATCH,KPER))RETURN ALLOCATE(IUGEN(PRJNLAY),IUDAT(PRJNLAY)); IUGEN=0; IUDAT=0 DO ILAY=1,PRJNLAY IF(.NOT.TOPICS(THFB)%TIMDEP)THEN FNAME=DIRMNAME(:INDEX(DIRMNAME,'\',.TRUE.)-1)//'\GEN\'//TRIM(DIRMNAME(INDEX(DIRMNAME,'\',.TRUE.)+1:))//'_HFB_L'//TRIM(ITOS(ILAY))//'.GEN' ELSE IF(ITIME.EQ.0D0)THEN FNAME=DIRMNAME(:INDEX(DIRMNAME,'\',.TRUE.)-1)//'\GEN\'//TRIM(DIRMNAME(INDEX(DIRMNAME,'\',.TRUE.)+1:))//'_STEADY-STATE_HFB_L'//TRIM(ITOS(ILAY))//'.GEN' ELSE FNAME=DIRMNAME(:INDEX(DIRMNAME,'\',.TRUE.)-1)//'\GEN\'//TRIM(DIRMNAME(INDEX(DIRMNAME,'\',.TRUE.)+1:))//'_'//TRIM(ITOS_DBL(ITIME))//'_HFB_L'//TRIM(ITOS(ILAY))//'.GEN' ENDIF ENDIF IUGEN(ILAY)=UTL_GETUNIT(); CALL OSD_OPEN(IUGEN(ILAY),FILE=FNAME,STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') IF(IUGEN(ILAY).EQ.0)RETURN IF(.NOT.TOPICS(THFB)%TIMDEP)THEN FNAME=DIRMNAME(:INDEX(DIRMNAME,'\',.TRUE.)-1)//'\GEN\'//TRIM(DIRMNAME(INDEX(DIRMNAME,'\',.TRUE.)+1:))//'_HFB_L'//TRIM(ITOS(ILAY))//'.DAT' ELSE IF(ITIME.EQ.0D0)THEN FNAME=DIRMNAME(:INDEX(DIRMNAME,'\',.TRUE.)-1)//'\GEN\'//TRIM(DIRMNAME(INDEX(DIRMNAME,'\',.TRUE.)+1:))//'_STEADY-STATE_HFB_L'//TRIM(ITOS(ILAY))//'.DAT' ELSE FNAME=DIRMNAME(:INDEX(DIRMNAME,'\',.TRUE.)-1)//'\GEN\'//TRIM(DIRMNAME(INDEX(DIRMNAME,'\',.TRUE.)+1:))//'_'//TRIM(ITOS_DBL(ITIME))//'_HFB_L'//TRIM(ITOS(ILAY))//'.DAT' ENDIF ENDIF IUDAT(ILAY)=UTL_GETUNIT(); CALL OSD_OPEN(IUDAT(ILAY),FILE=FNAME,STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED') IF(IUDAT(ILAY).EQ.0)RETURN IF(LTB)THEN WRITE(IUDAT(ILAY),'(A10,3(1X,A15),6A10)') 'NO','CONF_RESIS','UNCONF_RESIS','FRACTION','SYSTEM','ICOL1','IROW1','ICOL2','IROW2','IBND' ELSE WRITE(IUDAT(ILAY),'(A10,1X,A15,6A10)') 'NO','FRACTION','SYSTEM','ICOL1','IROW1','ICOL2','IROW2','IBND' ENDIF ENDDO !## collect all faults FNAME=DIRMNAME(:INDEX(DIRMNAME,'\',.TRUE.)-1)//'\GEN\'//TRIM(DIRMNAME(INDEX(DIRMNAME,'\',.TRUE.)+1:))//'_HFB.TXT' JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=FNAME,STATUS='OLD',ACTION='READ',FORM='FORMATTED') INAN=INAN+1; IF(TOPICS(THFB)%TIMDEP)WRITE(IU,'(A)') 'NaN'//TRIM(ITOS(INAN))//'#' NHFBNP=0; CALL PMANAGER_SAVEMF2005_HFB_EXPORT(NHFBNP,IU,JU,IUGEN,IUDAT,PRJIDF,LTB); NNAN(INAN)=SUM(NHFBNP) DO ILAY=1,PRJNLAY IF(NHFBNP(ILAY).GT.0)THEN CLOSE(IUGEN(ILAY)); CLOSE(IUDAT(ILAY)) ELSE CLOSE(IUGEN(ILAY),STATUS='DELETE'); CLOSE(IUDAT(ILAY),STATUS='DELETE') ENDIF ENDDO DEALLOCATE(IUGEN,IUDAT) IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(A)') 'END PERIOD' CLOSE(JU,STATUS='DELETE') ENDDO !## close hfb file CLOSE(IU) CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.HFB'//VTXT//'_',NNAN) !(/SUM(NHFBNP)/)) DEALLOCATE(NHFBNP,NNAN) PMANAGER_SAVEMF2005_HFB=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_HFB !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_OCD(DIRMNAME,MAINDIR) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIRMNAME,MAINDIR CHARACTER(LEN=256) :: NAME INTEGER :: IU,JU,ILAY,IPER,I,J,K,IFLX,N1,N2 LOGICAL :: LEX PMANAGER_SAVEMF2005_OCD=.FALSE. JU=0 IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN IF(PBMAN%IPESTP.EQ.1)THEN IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'_L.OC',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# OC File Generated by '//TRIM(UTL_IMODVERSION()) JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=TRIM(DIRMNAME)//'_P.OC',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(JU.EQ.0)RETURN WRITE(JU,'(A)') '# OC File Generated by '//TRIM(UTL_IMODVERSION()) ELSE IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.OC',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# OC File Generated by '//TRIM(UTL_IMODVERSION()) ENDIF IF(TOPICS(TSCO)%IACT_MODEL.EQ.1)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TSCO)%ILAY,'SAVECONCLAYER',0,IU) LINE='HEAD SAVE UNIT '//TRIM(ITOS(IHEDUN)); WRITE(IU,'(A)') TRIM(LINE) IF(JU.GT.0)WRITE(JU,'(A)') TRIM(LINE) DO IFLX=1,SIZE(TFLX) IF(ASSOCIATED(PBMAN%ISAVE(TFLX(IFLX))%ILAY))EXIT ENDDO; IF(IFLX.GT.SIZE(TFLX))IFLX=0 LEX=.FALSE.; IF(PBMAN%IPESTP.EQ.1)LEX=.TRUE. IF(PBMAN%ISS.EQ.1.AND.PBMAN%ISTEADY.EQ.0)LEX=.FALSE. DO IPER=1,PRJNPER LINE='PERIOD '//TRIM(ITOS(IPER))//' STEP '//TRIM(ITOS(SIM(IPER)%NSTP)); WRITE(IU,'(A)') TRIM(LINE) IF(JU.GT.0)WRITE(JU,'(A)') TRIM(LINE) LINE='PRINT BUDGET'; WRITE(IU,'(A)') TRIM(LINE) IF(JU.GT.0)WRITE(JU,'(A)') TRIM(LINE) !## save all head for l-versions (overwrite given settings), only in case steady-state or transient/isteady=1 and in case mxiter>0 IF(PBMAN%IPESTP.EQ.1)THEN LINE='SAVE HEAD' IF(LEX.AND.PEST%PE_MXITER.GT.0)THEN ! DO ILAY=1,PRJNLAY; LINE=TRIM(LINE)//' '//TRIM(ITOS(ILAY)); ENDDO ELSE IF(ASSOCIATED(PBMAN%ISAVE(TSHD)%ILAY))THEN IF(PBMAN%ISAVE(TSHD)%ILAY(1).EQ.-1)THEN DO ILAY=1,PRJNLAY; LINE=TRIM(LINE)//' '//TRIM(ITOS(ILAY)); ENDDO ELSE DO ILAY=1,SIZE(PBMAN%ISAVE(TSHD)%ILAY); LINE=TRIM(LINE)//' '//TRIM(ITOS(PBMAN%ISAVE(TSHD)%ILAY(ILAY))); ENDDO ENDIF ENDIF ENDIF WRITE(IU,'(A)') TRIM(LINE) ENDIF IF(ASSOCIATED(PBMAN%ISAVE(TSHD)%ILAY))THEN IF(PBMAN%ISAVE(TSHD)%ILAY(1).EQ.-1)THEN LINE='SAVE HEAD'; DO ILAY=1,PRJNLAY; LINE=TRIM(LINE)//' '//TRIM(ITOS(ILAY)); ENDDO IF(JU.EQ.0)WRITE(IU,'(A)') TRIM(LINE); IF(JU.GT.0)WRITE(JU,'(A)') TRIM(LINE) ELSE LINE='SAVE HEAD'; DO ILAY=1,SIZE(PBMAN%ISAVE(TSHD)%ILAY); LINE=TRIM(LINE)//' '//TRIM(ITOS(PBMAN%ISAVE(TSHD)%ILAY(ILAY))); ENDDO IF(JU.EQ.0)WRITE(IU,'(A)') TRIM(LINE); IF(JU.GT.0)WRITE(JU,'(A)') TRIM(LINE) ENDIF ENDIF !## write output fluxes IF(IFLX.GT.0)THEN IF(ASSOCIATED(PBMAN%ISAVE(TFLX(IFLX))%ILAY))THEN CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TFLX(IFLX))%ILAY,'BUDGET',IBCFCB,IU) ENDIF ENDIF IF(TOPICS(TCAP)%IACT_MODEL.EQ.1)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TCAP)%ILAY,'BUDGET',ICAPCB,IU) IF(TOPICS(TUZF)%IACT_MODEL.EQ.1)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TUZF)%ILAY,'BUDGET',IUZFCB1,IU) IF(TOPICS(TSFR)%IACT_MODEL.EQ.1)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TSFR)%ILAY,'BUDGET',ISFRCB,IU) IF(TOPICS(TFHB)%IACT_MODEL.EQ.1)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TFHB)%ILAY,'BUDGET',IFHBCB,IU) IF(TOPICS(TDRN)%IACT_MODEL.EQ.1)THEN CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TDRN)%ILAY,'BUDGET',IDRNCB,IU) ELSE IF(TOPICS(TOLF)%IACT_MODEL.EQ.1)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TOLF)%ILAY,'BUDGET',IDRNCB,IU) ENDIF IF(TOPICS(TRIV)%IACT_MODEL.EQ.1)THEN CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TRIV)%ILAY,'BUDGET',IRIVCB,IU) ELSE IF(TOPICS(TISG)%IACT_MODEL.EQ.1)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TISG)%ILAY,'BUDGET',IRIVCB,IU) ENDIF IF(TOPICS(TGHB)%IACT_MODEL.EQ.1)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TGHB)%ILAY,'BUDGET',IGHBCB,IU) IF(TOPICS(TWEL)%IACT_MODEL.EQ.1)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TWEL)%ILAY,'BUDGET',IWELCB,IU) IF(TOPICS(TRCH)%IACT_MODEL.EQ.1)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TRCH)%ILAY,'BUDGET',IRCHCB,IU) IF(TOPICS(TEVT)%IACT_MODEL.EQ.1)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TEVT)%ILAY,'BUDGET',IEVTCB,IU) IF(TOPICS(TMNW)%IACT_MODEL.EQ.1)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TMNW)%ILAY,'BUDGET',IWL2CB,IU) IF(TOPICS(TLAK)%IACT_MODEL.EQ.1)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TLAK)%ILAY,'BUDGET',ILAKCB,IU) IF(TOPICS(TSCR)%IACT_MODEL.EQ.1)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%ISAVE(TSCR)%ILAY,'SUBCR' ,ISCRCB,IU) ENDDO CLOSE(IU); IF(JU.GT.0)CLOSE(JU) ELSEIF(PBMAN%IFORMAT.EQ.3)THEN !## write *.ocd file(s) N1=1; N2=1 IF(PBMAN%IPESTP.EQ.1)THEN IF(PEST%PE_MXITER.LT.0)THEN N1=-1; N2=N1 ELSE N1=-PBMAN%NLAMBDASEARCH; N2=SIZE(PEST%PARAM) ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN N1=1; N2=PEST%NREALS ENDIF DO I=N1,N2 !## skip zero IF(I.EQ.0)CYCLE IU=UTL_GETUNIT() IF(PBMAN%IPESTP+PBMAN%IIES.EQ.0)THEN NAME=TRIM(DIRMNAME)//'.OC6' ELSEIF(PBMAN%IPESTP.EQ.1)THEN IF(I.GT.0)THEN IF(PEST%PARAM(I)%PACT.EQ.0.OR.PEST%PARAM(I)%PIGROUP.LT.0)CYCLE NAME=TRIM(DIRMNAME)//'_P#'//TRIM(ITOS(I))//'.OC6' ELSE NAME=TRIM(DIRMNAME)//'_L#'//TRIM(ITOS(ABS(I)))//'.OC6' ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN NAME=TRIM(DIRMNAME)//'_R#'//TRIM(ITOS(I))//'.OC6' ENDIF IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=NAME,STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN IF(PBMAN%IPESTP+PBMAN%IIES.EQ.0)THEN NAME='GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL))//'\MODELOUTPUT' ELSEIF(PBMAN%IPESTP.EQ.1)THEN IF(I.GT.0)THEN IF(PEST%PARAM(I)%PACT.EQ.0.OR.PEST%PARAM(I)%PIGROUP.LT.0)CYCLE NAME='GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL))//'\MODELOUTPUT'//'\IPEST_P#'//TRIM(ITOS(I)) ELSE NAME='GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL))//'\MODELOUTPUT'//'\IPEST_L#'//TRIM(ITOS(ABS(I))) ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN NAME='GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL))//'\MODELOUTPUT'//'\IPEST_R#'//TRIM(ITOS(ABS(I))) ENDIF WRITE(IU,'(A)') '# OC6 File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(/A/)') '#General Options' WRITE(IU,'(A)') 'BEGIN OPTIONS' LSHD=.FALSE.; LBDG=.FALSE. DO J=1,SIZE(MC(3)%T) K=MC(3)%T(J) SELECT CASE (K) CASE (TCHD,TSHD) IF(ASSOCIATED(PBMAN%ISAVE(K)%ILAY).AND..NOT.LSHD)THEN LSHD=.TRUE. IF(PBMAN%IPESTP.EQ.1)THEN WRITE(IU,'(1X,A)') 'HEAD FILEOUT ..\'//TRIM(NAME)//'\HEAD\HEAD.HED' ELSE WRITE(IU,'(1X,A)') 'HEAD FILEOUT .\'//TRIM(NAME)//'\HEAD\HEAD.HED' ENDIF ENDIF CASE DEFAULT IF(ASSOCIATED(PBMAN%ISAVE(K)%ILAY).AND..NOT.LBDG)THEN LBDG=.TRUE. IF(PBMAN%IPESTP.EQ.1)THEN WRITE(IU,'(1X,A)') 'BUDGET FILEOUT ..\'//TRIM(NAME)//'\BUDGET\BUDGET.CBC' ELSE WRITE(IU,'(1X,A)') 'BUDGET FILEOUT .\'//TRIM(NAME)//'\BUDGET\BUDGET.CBC' ENDIF ENDIF END SELECT ENDDO CALL UTL_CREATEDIR(TRIM(MAINDIR)//'\'//TRIM(NAME)) IF(LSHD)CALL UTL_CREATEDIR(TRIM(MAINDIR)//'\'//TRIM(NAME)//'\HEAD') IF(LBDG)CALL UTL_CREATEDIR(TRIM(MAINDIR)//'\'//TRIM(NAME)//'\BUDGET') WRITE(IU,'(A)') 'END OPTIONS' DO IPER=1,PRJNPER WRITE(IU,'(/A/)') '#Stressperiod Save Options' WRITE(IU,'(A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER)) IF(LSHD)WRITE(IU,'(A)') ' SAVE HEAD ALL' IF(LBDG)WRITE(IU,'(A)') ' SAVE BUDGET ALL' WRITE(IU,'(A)') 'END PERIOD' ENDDO CLOSE(IU); IF(JU.GT.0)CLOSE(JU) ENDDO ENDIF ! CLOSE(IU); IF(JU.GT.0)CLOSE(JU) PMANAGER_SAVEMF2005_OCD=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_OCD !####==================================================================== SUBROUTINE PMANAGER_SAVEMF2005_OCD_ISAVE(ISAVE,SWHAT,ID,IU) !####==================================================================== IMPLICIT NONE INTEGER,INTENT(IN),POINTER,DIMENSION(:) :: ISAVE CHARACTER(LEN=*),INTENT(IN) :: SWHAT INTEGER,INTENT(IN) :: ID,IU INTEGER :: I IF(ASSOCIATED(ISAVE))THEN IF(ISAVE(1).EQ.-1)THEN IF(ID.EQ.0)THEN LINE=TRIM(SWHAT); DO I=1,PRJNLAY; LINE=TRIM(LINE)//' '//TRIM(ITOS(I)); ENDDO ELSE LINE='SAVE '//TRIM(SWHAT)//' '//TRIM(ITOS(ID)); DO I=1,PRJNLAY; LINE=TRIM(LINE)//' '//TRIM(ITOS(I)); ENDDO ENDIF ELSE IF(ID.EQ.0)THEN LINE=TRIM(SWHAT); DO I=1,SIZE(ISAVE); LINE=TRIM(LINE)//' '//TRIM(ITOS(ISAVE(I))); ENDDO ELSE LINE='SAVE '//TRIM(SWHAT)//' '//TRIM(ITOS(ID)); DO I=1,SIZE(ISAVE); LINE=TRIM(LINE)//' '//TRIM(ITOS(ISAVE(I))); ENDDO ENDIF ENDIF WRITE(IU,'(A)') TRIM(LINE) ENDIF END SUBROUTINE PMANAGER_SAVEMF2005_OCD_ISAVE !####==================================================================== SUBROUTINE PMANAGER_SAVEMF2005_RUN_ISAVE(ISAVE,CID,IU) !####==================================================================== IMPLICIT NONE INTEGER,INTENT(IN),POINTER,DIMENSION(:) :: ISAVE CHARACTER(LEN=*),INTENT(IN) :: CID INTEGER,INTENT(IN) :: IU INTEGER :: I,N IF(ASSOCIATED(ISAVE))THEN IF(ISAVE(1).EQ.-1)THEN LINE='1,1,0' ELSE N=SIZE(ISAVE) LINE='1,'//TRIM(ITOS(N)); DO I=1,SIZE(ISAVE); LINE=TRIM(LINE)//','//TRIM(ITOS(ISAVE(I))); ENDDO ENDIF ELSE LINE='1,0' ENDIF LINE=TRIM(LINE)//' '//TRIM(CID) WRITE(IU,'(A)') TRIM(LINE) END SUBROUTINE PMANAGER_SAVEMF2005_RUN_ISAVE !####==================================================================== SUBROUTINE PMANAGER_SAVEMF2005_MF6TOIDF_ISAVE(ISAVE,CID,IU) !####==================================================================== IMPLICIT NONE INTEGER,INTENT(IN),POINTER,DIMENSION(:) :: ISAVE CHARACTER(LEN=*),INTENT(IN) :: CID INTEGER,INTENT(IN) :: IU IF(ASSOCIATED(ISAVE))THEN LINE=ITOS(ISAVE(1)); DO I=2,SIZE(ISAVE); LINE=TRIM(LINE)//','//TRIM(ITOS(ISAVE(I))); ENDDO LINE=TRIM(CID)//'='//TRIM(LINE) WRITE(IU,'(A)') 'ECHO '//TRIM(LINE)//' >> MF6TOIDF.INI' ENDIF END SUBROUTINE PMANAGER_SAVEMF2005_MF6TOIDF_ISAVE !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_PCG(DIRMNAME) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIRMNAME INTEGER :: IU PMANAGER_SAVEMF2005_PCG=.TRUE. IF(TOPICS(TPCG)%IACT_MODEL.EQ.0)RETURN; IF(PBMAN%IFORMAT.EQ.3)RETURN PMANAGER_SAVEMF2005_PCG=.FALSE. !## construct pcg-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.PCG7',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# PCG7 File Generated by '//TRIM(UTL_IMODVERSION()) CALL PMANAGER_SAVEPCG(IU,2) CLOSE(IU) PMANAGER_SAVEMF2005_PCG=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_PCG !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_GCG(DIRMNAME) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIRMNAME INTEGER :: IU,ISOLVE,NCRS PMANAGER_SAVEMF2005_GCG=.TRUE. IF(TOPICS(TGCG)%IACT_MODEL.EQ.0)RETURN; IF(PBMAN%IFORMAT.NE.6.OR.WQ%VDF%MTDNCONC.EQ.0)RETURN PMANAGER_SAVEMF2005_GCG=.FALSE. !## construct pcg-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.GCG1',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN !## use Jacob; dispersion tensor crossterm WRITE(IU,'(4I10)') WQ%GCG%MXITER,WQ%GCG%ITER1,WQ%GCG%ISOLVE,WQ%GCG%NCRS WRITE(IU,'(F10.2,F15.7,I10)') WQ%GCG%ACCL,WQ%GCG%CCLOSE,WQ%GCG%IPRGCG CLOSE(IU) PMANAGER_SAVEMF2005_GCG=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_GCG !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_IMS(DIRMNAME) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIRMNAME INTEGER :: IU,ILAY PMANAGER_SAVEMF2005_IMS=.TRUE.; IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)RETURN PMANAGER_SAVEMF2005_IMS=.FALSE. !## construct pcg-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.IMS6',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# IMS6 File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(/A/)') '#General options' WRITE(IU,'(A)') 'BEGIN OPTIONS' WRITE(IU,'(A)') ' PRINT_OPTION SUMMARY' IF(TOPICS(TANI)%IACT_MODEL.EQ.1)THEN WRITE(IU,'(A)') ' COMPLEXITY COMPLEX' !## complex ELSE WRITE(IU,'(A)') ' COMPLEXITY '//PBMAN%COMPLEXITY ENDIF ! WRITE(IU,'(A)') ' COMPLEXITY '//TRIM(PBMAN%TCOMPLEX) !MODERATE' !## simple complex ! DO ILAY=1,PRJNLAY ! IF(LAYCON(ILAY).EQ.2)THEN ! WRITE(IU,'(A)') ' COMPLEXITY COMPLEX'; EXIT ! ENDIF ! ENDDO ! IF(ILAY.GT.PRJNLAY)THEN ! ELSE ! WRITE(IU,'(A)') ' COMPLEXITY MODERATE' !## moderate ! ENDIF ! ENDIF WRITE(IU,'(A)') ' CSV_OUTER_OUTPUT FILEOUT '//TRIM(DIRMNAME(INDEX(DIRMNAME,'\',.TRUE.)+1:))//'_OUTER.CSV' WRITE(IU,'(A)') ' CSV_INNER_OUTPUT FILEOUT '//TRIM(DIRMNAME(INDEX(DIRMNAME,'\',.TRUE.)+1:))//'_INNER.CSV' WRITE(IU,'(A)') 'END OPTIONS' !## set by complexity WRITE(IU,'(/A/)') '#Nonlinear options' WRITE(IU,'(A)') 'BEGIN NONLINEAR' WRITE(IU,'(A,G15.7)') ' OUTER_DVCLOSE ',PCG%HCLOSE WRITE(IU,'(A,I10)') ' OUTER_MAXIMUM ',PCG%NOUTER ! WRITE(IU,'(A)') ' [UNDER_RELAXATION ]' ! WRITE(IU,'(A)') ' [UNDER_RELAXATION_THETA ]' ! WRITE(IU,'(A)') ' [UNDER_RELAXATION_KAPPA ]' ! WRITE(IU,'(A)') ' [UNDER_RELAXATION_GAMMA ]' ! WRITE(IU,'(A)') ' [UNDER_RELAXATION_MOMENTUM ]' ! WRITE(IU,'(A)') ' [BACKTRACKING_NUMBER ]' ! WRITE(IU,'(A)') ' [BACKTRACKING_TOLERANCE ]' ! WRITE(IU,'(A)') ' [BACKTRACKING_REDUCTION_FACTOR ]' ! WRITE(IU,'(A)') ' [BACKTRACKING_RESIDUAL_LIMIT ]' WRITE(IU,'(A)') 'END NONLINEAR' WRITE(IU,'(/A/)') '#Linear options' WRITE(IU,'(A)') 'BEGIN LINEAR' WRITE(IU,'(A,I10)') ' INNER_MAXIMUM ',PCG%NINNER WRITE(IU,'(A,G15.7)') ' INNER_DVCLOSE ',PCG%HCLOSE WRITE(IU,'(A,G15.7)') ' INNER_RCLOSE ',PCG%RCLOSE ! WRITE(IU,'(A)') ' LINEAR_ACCELERATION CG' ! WRITE(IU,'(A,G15.7)') ' RELAXATION_FACTOR ',PCG%RELAX <--- deze niet gebruiken, default values hanteren ! WRITE(IU,'(A)') ' [PRECONDITIONER_LEVELS ]' ! WRITE(IU,'(A)') ' [PRECONDITIONER_DROP_TOLERANCE ]' ! WRITE(IU,'(A)') ' [NUMBER_ORTHOGONALIZATIONS ]' ! WRITE(IU,'(A)') ' [SCALING_METHOD ]' ! WRITE(IU,'(A)') ' [REORDERING_METHOD ]' WRITE(IU,'(A)') 'END LINEAR' CLOSE(IU) PMANAGER_SAVEMF2005_IMS=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_IMS !###====================================================================== SUBROUTINE PMANAGER_SAVEPCG(IU,IOPTION) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IU,IOPTION !## prj file IF(IOPTION.EQ.0)THEN WRITE(IU,'(1X,A)') 'MXITER= '//TRIM(ITOS(PCG%NOUTER)) WRITE(IU,'(1X,A)') 'ITER1= '//TRIM(ITOS(PCG%NINNER)) WRITE(IU,'(1X,A)') 'HCLOSE= '//TRIM(RTOS(PCG%HCLOSE,'G',7)) WRITE(IU,'(1X,A)') 'RCLOSE= '//TRIM(RTOS(PCG%RCLOSE,'G',7)) WRITE(IU,'(1X,A)') 'RELAX= '//TRIM(RTOS(PCG%RELAX,'G',7)) WRITE(IU,'(1X,A)') 'NPCOND= '//TRIM(ITOS(PCG%NPCOND)) WRITE(IU,'(1X,A)') 'IPRPCG= '//TRIM(ITOS(PCG%IPRPCG)) WRITE(IU,'(1X,A)') 'MUTPCG= '//TRIM(ITOS(PCG%MUTPCG)) WRITE(IU,'(1X,A)') 'DAMPPCG= '//TRIM(RTOS(PCG%DAMPPCG,'G',7)) WRITE(IU,'(1X,A)') 'DAMPPCGT='//TRIM(RTOS(PCG%DAMPPCGT,'G',7)) WRITE(IU,'(1X,A)') 'IQERROR= '//TRIM(ITOS(PCG%IQERROR)) WRITE(IU,'(1X,A)') 'QERROR= '//TRIM(RTOS(PCG%QERROR,'G',7)) !## run file ELSEIF(IOPTION.EQ.1)THEN !## mf2005 file ELSEIF(IOPTION.EQ.2)THEN LINE=TRIM(ITOS(PCG%NOUTER)) //','// & TRIM(ITOS(PCG%NINNER)) //','// & TRIM(ITOS(PCG%NPCOND)) WRITE(IU,'(A)') TRIM(LINE) LINE=TRIM(RTOS(PCG%HCLOSE,'G',5)) //','// & TRIM(RTOS(PCG%RCLOSE,'G',5)) //','// & TRIM(RTOS(PCG%RELAX ,'G',5)) //','// & TRIM(RTOS(1.0D0,'G',5)) //','// & TRIM(ITOS(PCG%IPRPCG)) //','// & TRIM(ITOS(PCG%MUTPCG)) //','// & TRIM(RTOS(PCG%DAMPPCG ,'G',5)) //','// & TRIM(RTOS(PCG%DAMPPCGT ,'G',5)) WRITE(IU,'(A)') TRIM(LINE) ENDIF END SUBROUTINE PMANAGER_SAVEPCG !###====================================================================== LOGICAL FUNCTION PMANAGER_LOADPCG(IU) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IU INTEGER :: IOS PMANAGER_LOADPCG=.FALSE. !## prj file READ(IU,'(A256)') LINE READ(LINE,*,IOSTAT=IOS) PCG%NOUTER,PCG%NINNER,PCG%HCLOSE,PCG%RCLOSE,PCG%RELAX,PCG%NPCOND, & PCG%IPRPCG,PCG%MUTPCG,PCG%DAMPPCG,PCG%DAMPPCGT,PCG%IQERROR,PCG%QERROR IF(IOS.NE.0)THEN PCG%IQERROR=0; PCG%QERROR=0.0D0 READ(LINE,*,IOSTAT=IOS) PCG%NOUTER,PCG%NINNER,PCG%HCLOSE,PCG%RCLOSE,PCG%RELAX,PCG%NPCOND, & PCG%IPRPCG,PCG%MUTPCG,PCG%DAMPPCG,PCG%DAMPPCGT ENDIF !## try new style IF(IOS.NE.0)THEN BACKSPACE(IU) IF(.NOT.UTL_READINITFILE('MXITER',LINE,IU,0))RETURN; READ(LINE,*) PCG%NOUTER IF(.NOT.UTL_READINITFILE('ITER1',LINE,IU,0))RETURN; READ(LINE,*) PCG%NINNER IF(.NOT.UTL_READINITFILE('HCLOSE',LINE,IU,0))RETURN; READ(LINE,*) PCG%HCLOSE IF(.NOT.UTL_READINITFILE('RCLOSE',LINE,IU,0))RETURN; READ(LINE,*) PCG%RCLOSE IF(.NOT.UTL_READINITFILE('RELAX',LINE,IU,0))RETURN; READ(LINE,*) PCG%RELAX IF(.NOT.UTL_READINITFILE('NPCOND',LINE,IU,0))RETURN; READ(LINE,*) PCG%NPCOND IF(.NOT.UTL_READINITFILE('IPRPCG',LINE,IU,0))RETURN; READ(LINE,*) PCG%IPRPCG IF(.NOT.UTL_READINITFILE('MUTPCG',LINE,IU,0))RETURN; READ(LINE,*) PCG%MUTPCG IF(.NOT.UTL_READINITFILE('DAMPPCG',LINE,IU,0))RETURN; READ(LINE,*) PCG%DAMPPCG IF(.NOT.UTL_READINITFILE('DAMPPCGT',LINE,IU,0))RETURN; READ(LINE,*) PCG%DAMPPCGT IF(.NOT.UTL_READINITFILE('IQERROR',LINE,IU,0))RETURN; READ(LINE,*) PCG%IQERROR IF(.NOT.UTL_READINITFILE('QERROR',LINE,IU,0))RETURN; READ(LINE,*) PCG%QERROR ENDIF PMANAGER_LOADPCG=.TRUE. END FUNCTION PMANAGER_LOADPCG !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_PKS(DIRMNAME) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIRMNAME INTEGER :: IU,NP,ICOL,IROW PMANAGER_SAVEMF2005_PKS=.TRUE.; IF(PBMAN%IFORMAT.EQ.3)RETURN; IF(.NOT.LPKS)RETURN PMANAGER_SAVEMF2005_PKS=.FALSE. !## a single processor used NP=1 !## construct pcg-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.PKS',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# PKS File Generated by '//TRIM(UTL_IMODVERSION()) !## number of processors LINE='ISOLVER '//TRIM(ITOS(NP)); WRITE(IU,'(A)') TRIM(LINE) !## preconditioner LINE='NPC '//TRIM(ITOS(2)); WRITE(IU,'(A)') TRIM(LINE) LINE='HCLOSEPKS '//TRIM(RTOS(PCG%HCLOSE,'E',7)); WRITE(IU,'(A)') TRIM(LINE) LINE='RCLOSEPKS '//TRIM(RTOS(PCG%RCLOSE,'E',7)); WRITE(IU,'(A)') TRIM(LINE) LINE='MXITER '//TRIM(ITOS(PCG%NOUTER)); WRITE(IU,'(A)') TRIM(LINE) LINE='INNERIT '//TRIM(ITOS(PCG%NINNER)); WRITE(IU,'(A)') TRIM(LINE) LINE='RELAX '//TRIM(RTOS(PCG%RELAX,'E',7)); WRITE(IU,'(A)') TRIM(LINE) IF(PBMAN%NRPROC.GT.1)THEN LINE='PARTOPT 3'; WRITE(IU,'(A)') TRIM(LINE) LINE='PARTDATA'; WRITE(IU,'(A)') TRIM(LINE) LINE=TRIM(ITOS(PBMAN%NRPROC)); WRITE(IU,'(A)') TRIM(LINE) !## construct submodels CALL PKS_INIT(IU,PRJIDF) !,PRJNLAY) !## save network LINE='GNCOL '//TRIM(ITOS(PRJIDF%NCOL)); WRITE(IU,'(A)') TRIM(LINE) LINE='GNROW '//TRIM(ITOS(PRJIDF%NROW)); WRITE(IU,'(A)') TRIM(LINE) IF(PRJIDF%IEQ.EQ.0)THEN LINE='GDELR '; WRITE(IU,'(A)') TRIM(LINE) WRITE(IU,'(A)') TRIM(RTOS(PRJIDF%DX,'E',7)) ELSE LINE='GDELRS'; WRITE(IU,'(A)') TRIM(LINE) WRITE(IU,*) (PRJIDF%SX(ICOL)-PRJIDF%SX(ICOL-1),ICOL=1,PRJIDF%NCOL) ENDIF IF(PRJIDF%IEQ.EQ.0)THEN LINE='GDELC '; WRITE(IU,'(A)') TRIM(LINE) WRITE(IU,'(A)') TRIM(RTOS(PRJIDF%DY,'E',7)) ELSE LINE='GDELCS'; WRITE(IU,'(A)') TRIM(LINE) WRITE(IU,*) (PRJIDF%SY(IROW-1)-PRJIDF%SY(IROW),IROW=1,PRJIDF%NROW) ENDIF !NOVLAPADV 2 ENDIF WRITE(IU,'(A)') 'END' CLOSE(IU) IF(PBMAN%IFORMAT.EQ.6)THEN !## construct pcg-file IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.PKST',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN WRITE(IU,'(A)') '# PKS File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(IU,'(A)') 'ISOLVER 1' WRITE(IU,'(A)') 'NPC 2' WRITE(IU,'(A)') 'NPCDEF 0' LINE='MXITER '//TRIM(ITOS(PCG%NOUTER)); WRITE(IU,'(A)') TRIM(LINE) LINE='INNERIT '//TRIM(ITOS(PCG%NINNER)); WRITE(IU,'(A)') TRIM(LINE) LINE='RELAX '//TRIM(RTOS(PCG%RELAX,'E',7)); WRITE(IU,'(A)') TRIM(LINE) LINE='HCLOSEPKS '//TRIM(RTOS(PCG%HCLOSE,'E',7)); WRITE(IU,'(A)') TRIM(LINE) WRITE(IU,'(A)') 'RCLOSEPKS 2000.' WRITE(IU,'(A)') 'H_FSTRICTPKS 1.' WRITE(IU,'(A)') 'R_FSTRICTPKS 1.' WRITE(IU,'(A)') 'PARTOPT 5' WRITE(IU,'(A)') 'PARTDATA' WRITE(IU,'(A)') 'external 265 1. (free) -1' WRITE(IU,'(A)') 'GNCOL 800' WRITE(IU,'(A)') 'GNROW 600' WRITE(IU,'(A)') 'GDELR' WRITE(IU,'(A)') '25.' WRITE(IU,'(A)') 'GDELC' WRITE(IU,'(A)') '25.' WRITE(IU,'(A)') 'NOVLAPADV 2' WRITE(IU,'(A)') 'END' CLOSE(IU) ENDIF PMANAGER_SAVEMF2005_PKS=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_PKS !####==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_MSP(DIR,DIRMNAME,IBATCH,IPRT) !####==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: IBATCH,IPRT INTEGER :: ISYS,ILAY,ITOPIC,IPER,IINV,SCL_U,SCL_D,IROW,ICOL INTEGER :: I,J,NIDF REAL(KIND=DP_KIND),DIMENSION(:),ALLOCATABLE :: NODATA CHARACTER(LEN=256) :: FFNAME,DIRMSP,FNNAME PMANAGER_SAVEMF2005_MSP=.TRUE. IF(TOPICS(TCAP)%IACT_MODEL.EQ.0)RETURN PMANAGER_SAVEMF2005_MSP=.FALSE. !## determine number of idf to be read NIDF=TOPICS(TCAP)%NSUBTOPICS; ALLOCATE(NODATA(NIDF)) IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing MetaSwap files ...') IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing MetaSwap files ...' !## allocate memory IF(ALLOCATED(SIMGRO))DEALLOCATE(SIMGRO); ALLOCATE(SIMGRO(PRJIDF%NCOL,PRJIDF%NROW)) !## initialize unit numbers INDSB=0; IAREA=0; ISELSVAT=0; IGWMP=0; IMODSIM=0; ISCAP=0; IINFI=0; IIDF=0; IDFM_MSWP=0; IMSWP_PDFM=0; IUNOD=0; WINDEX_MSWP=0; RINDEX_MSWP=0; WMF6_MSWP=0; RMF6_MSWP=0; IMSWP_SDFM=0; IMSWP_RDFM=0; IFLEXD=0 !; IDQSAT=0 DIRMSP=DIR(:INDEX(DIR,'\',.TRUE.)-1) IF(PBMAN%IFORMAT.EQ.3)THEN DIRMSP=DIRMSP(:INDEX(DIRMSP,'\',.TRUE.)-1) !## OPEN NODENR2SVAT.INP FFNAME=TRIM(DIRMSP)//'\NODENR2SVAT.DXC'; IUNOD=UTL_GETUNIT(); CALL OSD_OPEN(IUNOD,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') !## OPEN WELLINDEX2SVAT.DXC FFNAME=TRIM(DIRMSP)//'\WELLINDEX2SVAT.DXC'; WINDEX_MSWP=UTL_GETUNIT(); CALL OSD_OPEN(WINDEX_MSWP,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') !## OPEN RCHINDEX2SVAT.DXC FFNAME=TRIM(DIRMSP)//'\RCHINDEX2SVAT.DXC'; RINDEX_MSWP=UTL_GETUNIT(); CALL OSD_OPEN(RINDEX_MSWP,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') ENDIF IF(PBMAN%IFORMAT.EQ.3)THEN !## OPEN MSW.WEL6 DIRMSP=DIR(:INDEX(DIR,'\',.TRUE.)-1)//'\MODELINPUT' FFNAME=TRIM(DIRMSP)//'\MSW.WEL6_'; WMF6_MSWP=UTL_GETUNIT(); CALL OSD_OPEN(WMF6_MSWP,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') !## OPEN MSW.RCH6 FFNAME=TRIM(DIRMSP)//'\MSW.RCH6_'; RMF6_MSWP=UTL_GETUNIT(); CALL OSD_OPEN(RMF6_MSWP,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') ENDIF DIRMSP=DIR(:INDEX(DIR,'\',.TRUE.)-1)//'\MSWAPINPUT' !## open indsb FFNAME=TRIM(DIRMSP)//'\SVAT2SWNR_ROFF.INP'; INDSB=UTL_GETUNIT(); CALL OSD_OPEN(INDSB,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') !## OPEN IAREA FFNAME=TRIM(DIRMSP)//'\AREA_SVAT.INP'; IAREA=UTL_GETUNIT(); CALL OSD_OPEN(IAREA,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') !## OPEN ISCAP FFNAME=TRIM(DIRMSP)//'\SCAP_SVAT.INP'; ISCAP=UTL_GETUNIT(); CALL OSD_OPEN(ISCAP,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') !## OPEN IGWMP FFNAME=TRIM(DIRMSP)//'\MOD2SVAT.INP'; IGWMP=UTL_GETUNIT(); CALL OSD_OPEN(IGWMP,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') IF(PBMAN%IFORMAT.NE.3)THEN !## open MODFLOW dxc file (not for MF6) FFNAME=TRIM(DIRMNAME)//'.DXC'; IDXC=UTL_GETUNIT(); CALL OSD_OPEN(IDXC,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') ENDIF !## OPEN MOD-SIM.TXT FFNAME=TRIM(DIRMSP)//'\MOD-SIM.TXT'; IMODSIM=UTL_GETUNIT(); CALL OSD_OPEN(IMODSIM,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') !## OPEN ISELSVAT FFNAME=TRIM(DIRMSP)//'\SEL_SVAT_BDA.INP'; ISELSVAT=UTL_GETUNIT(); CALL OSD_OPEN(ISELSVAT,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') !## OPEN INFI_SVAT.INP FFNAME=TRIM(DIRMSP)//'\INFI_SVAT.INP'; IINFI=UTL_GETUNIT(); OPEN(IINFI,FILE=FFNAME,STATUS='REPLACE',CARRIAGECONTROL='LIST',ACTION='WRITE') !## OPEN IDF_SVAT.INP FFNAME=TRIM(DIRMSP)//'\IDF_SVAT.INP'; IIDF=UTL_GETUNIT(); CALL OSD_OPEN(IIDF,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') !## OPEN USCL_SVAT.INP FFNAME=TRIM(DIRMSP)//'\USCL_SVAT.INP'; IUSCL=UTL_GETUNIT(); CALL OSD_OPEN(IUSCL,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') IF(PBMAN%DMMFILE.EQ.1)THEN !## OPEN DFM2DTOMSW_WL.DMM FFNAME=DIR(:INDEX(DIR,'\',.TRUE.)-1)//'\DFM2DWATLEVTOMSW_H.DMM'; IDFM_MSWP=UTL_GETUNIT(); CALL OSD_OPEN(IDFM_MSWP,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') !## OPEN DFM2DTOMSW_WL.DMM FFNAME=DIR(:INDEX(DIR,'\',.TRUE.)-1)//'\MSWPONDINGTODFM2D_DV.DMM'; IMSWP_PDFM=UTL_GETUNIT(); CALL OSD_OPEN(IMSWP_PDFM,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') !## OPEN DFM2DTOMSW_WL.DMM FFNAME=DIR(:INDEX(DIR,'\',.TRUE.)-1)//'\MSWSPRINKTODFM1D_Q.DMM'; IMSWP_SDFM=UTL_GETUNIT(); CALL OSD_OPEN(IMSWP_SDFM,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') !## OPEN DFM2DTOMSW_WL.DMM FFNAME=DIR(:INDEX(DIR,'\',.TRUE.)-1)//'\MSWRUNOFFTODFM1D_Q.DMM'; IMSWP_RDFM=UTL_GETUNIT(); CALL OSD_OPEN(IMSWP_RDFM,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') ENDIF IF(PBMAN%FLEXD.EQ.1)THEN !## OPEN MODSUB_SVAT.INP FFNAME=TRIM(DIRMSP)//'\MODSUB_SVAT.INP'; IFLEXD=UTL_GETUNIT(); CALL OSD_OPEN(IFLEXD,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') ENDIF ! !## OPEN DQSAT_SVAT.INP ! FFNAME=TRIM(DIRMSP)//'\DQSAT_SVAT.INP'; IDQSAT=UTL_GETUNIT(); CALL OSD_OPEN(IDQSAT,FILE=FFNAME,STATUS='REPLACE',ACTION='WRITE') !## metaswap PBMAN%IARMWP=0 IF(TOPICS(TCAP)%IACT_MODEL.EQ.1)THEN IF(ASSOCIATED(TOPICS(TCAP)%STRESS))THEN FFNAME=TOPICS(TCAP)%STRESS(1)%FILES(8,1)%FNAME IF(INDEX(UTL_CAP(FFNAME,'U'),'IPF').GT.0)PBMAN%IARMWP=1 ENDIF ENDIF ISYS=0; ILAY=1; ITOPIC=TCAP; IPER=1; IINV=0 ALLOCATE(FNAMES(TOPICS(ITOPIC)%NSUBTOPICS),PRJILIST(1)); PRJILIST=ITOPIC IF(PMANAGER_GETFNAMES(1,1,1,0,1).LE.0)RETURN !## open all files DO ISYS=1,NIDF !## skip ipf for artificial recharge IF(PBMAN%IARMWP.EQ.1.AND.ISYS.EQ.8)CYCLE !## skip ipf for level-controlled drainage IF(PBMAN%FLEXD.EQ.1.AND.ISYS.EQ.24)CYCLE SELECT CASE (ISYS) !## bnd CASE (1); NODATA(ISYS)=-999.0D0; SCL_U=1; SCL_D=0 !## lgn,root,soil,meteo CASE (2:5,7:9); NODATA(ISYS)=-999.0D0; SCL_U=7; SCL_D=0 !## surf,ponding,ponding,pwtlevel,drainagelevel CASE (6,12,13,20,25); NODATA(ISYS)=-999.99D0; SCL_U=2; SCL_D=1 !## soilfactor,cond.factor CASE (21,22); NODATA(ISYS)=-999.99D0; SCL_U=2; SCL_D=0 !## qinfub,qinfru CASE (18,19); NODATA(ISYS)=-999.99D0; SCL_U=7; SCL_D=0 !## plot number CASE (23); NODATA(ISYS)= 0.0D0; SCL_U=7; SCL_D=0 !## runoff,runoff,runon,runon CASE (14:17); NODATA(ISYS)=-999.99D0; SCL_U=7; SCL_D=0 !## wetted area/urban area CASE (10,11); NODATA(ISYS)=-999.99D0; SCL_U=5; SCL_D=0 !## drainage resistance CASE (26); NODATA(ISYS)=-999.99D0; SCL_U=6; SCL_D=1 END SELECT !## read in data IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(PRJIDF,ITOPIC,ISYS,SCL_D,SCL_U,IINV,IPRT))RETURN DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(PRJIDF%X(ICOL,IROW).EQ.PRJIDF%NODATA)PRJIDF%X(ICOL,IROW)=NODATA(ISYS) SELECT CASE (ISYS) CASE (1); SIMGRO(ICOL,IROW)%IBOUND=INT(PRJIDF%X(ICOL,IROW)) CASE (2); SIMGRO(ICOL,IROW)%LGN=INT(PRJIDF%X(ICOL,IROW)) CASE (3); SIMGRO(ICOL,IROW)%RZ=PRJIDF%X(ICOL,IROW) CASE (4); SIMGRO(ICOL,IROW)%BODEM=INT(PRJIDF%X(ICOL,IROW)) CASE (5); SIMGRO(ICOL,IROW)%METEO=INT(PRJIDF%X(ICOL,IROW)) CASE (6); SIMGRO(ICOL,IROW)%MV=PRJIDF%X(ICOL,IROW) CASE (7); SIMGRO(ICOL,IROW)%BEREGEN=INT(PRJIDF%X(ICOL,IROW)) CASE (8); SIMGRO(ICOL,IROW)%BER_LAAG=INT(PRJIDF%X(ICOL,IROW)) CASE (9); SIMGRO(ICOL,IROW)%BEREGEN_Q=PRJIDF%X(ICOL,IROW) CASE (10); SIMGRO(ICOL,IROW)%NOPP=PRJIDF%X(ICOL,IROW) CASE (11); SIMGRO(ICOL,IROW)%SOPP=PRJIDF%X(ICOL,IROW) CASE (12); SIMGRO(ICOL,IROW)%VXMU_SOPP=PRJIDF%X(ICOL,IROW) CASE (13); SIMGRO(ICOL,IROW)%VXMU_ROPP=PRJIDF%X(ICOL,IROW) CASE (14); SIMGRO(ICOL,IROW)%CRUNOFF_SOPP=PRJIDF%X(ICOL,IROW) CASE (15); SIMGRO(ICOL,IROW)%CRUNOFF_ROPP=PRJIDF%X(ICOL,IROW) CASE (16); SIMGRO(ICOL,IROW)%CRUNON_SOPP=PRJIDF%X(ICOL,IROW) CASE (17); SIMGRO(ICOL,IROW)%CRUNON_ROPP=PRJIDF%X(ICOL,IROW) CASE (18); SIMGRO(ICOL,IROW)%QINFBASIC_SOPP=PRJIDF%X(ICOL,IROW) CASE (19); SIMGRO(ICOL,IROW)%QINFBASIC_ROPP=PRJIDF%X(ICOL,IROW) CASE (20); SIMGRO(ICOL,IROW)%PWT_LEVEL=PRJIDF%X(ICOL,IROW) CASE (21); SIMGRO(ICOL,IROW)%MOISTURE=PRJIDF%X(ICOL,IROW) CASE (22); SIMGRO(ICOL,IROW)%COND=PRJIDF%X(ICOL,IROW) CASE (23); SIMGRO(ICOL,IROW)%PLN=PRJIDF%X(ICOL,IROW) CASE (24); !## ipf CASE (25); SIMGRO(ICOL,IROW)%PDL=PRJIDF%X(ICOL,IROW) CASE (26); SIMGRO(ICOL,IROW)%PDR=PRJIDF%X(ICOL,IROW) END SELECT ENDDO; ENDDO ENDDO !## read metaswap beregening IPF if needed IF(.NOT.PMANAGER_SAVEMF2005_MSP_READIPF(TOPICS(ITOPIC)%STRESS(IPER)%FILES(8,ILAY)%FNAME,IBATCH))RETURN !## read metaswap level-controlled drainage IPF file (if needed) IF(PBMAN%FLEXD.EQ.1)THEN IF(.NOT.PMANAGER_SAVEMF2005_MSP_READIPF_FLEXD(TOPICS(ITOPIC)%STRESS(IPER)%FILES(24,ILAY)%FNAME,IBATCH,SIMGRO%PLN,1))RETURN ENDIF IF(TOPICS(TPWT)%IACT_MODEL.EQ.0)SIMGRO%PWT_LEVEL=NODATA(20) !## check input parameters IF(.NOT.PMANAGER_SAVEMF2005_MSP_CHECK(NODATA,IBATCH))RETURN CALL PMANAGER_SAVEMF2005_MSP_INPFILES(NODATA,TOPICS(TPWT)%IACT_MODEL,DIRMSP,IBATCH) IF(PBMAN%IARMWP.EQ.1)DEALLOCATE(IPFMSP) IF(PBMAN%FLEXD.EQ.1 )DEALLOCATE(IPFFLX) !## write extra files IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%INPFILES))THEN J=SIZE(TOPICS(ITOPIC)%STRESS(1)%INPFILES) DO I=1,J FFNAME=UTL_CAP(TOPICS(ITOPIC)%STRESS(1)%INPFILES(I),'U') IF(INDEX(FFNAME,'METE_GRID.INP').GT.0)THEN CALL METASWAP_METEGRID1(FFNAME,TRIM(DIRMSP)//'\METE_GRID.INP') ELSEIF(INDEX(FFNAME,'PARA_SIM.INP').GT.0)THEN CALL PMANAGER_SAVEMF2005_MSP_PARASIM(FFNAME,DIRMSP) ELSE FNNAME=TRIM(DIRMSP)//'\'//TRIM(FFNAME(INDEX(FFNAME,'\',.TRUE.)+1:)) CALL SYSTEM('COPY "'//TRIM(FFNAME)//'" "'//TRIM(FNNAME)//'" /Y ') ENDIF ENDDO ENDIF !## metaswap 727 computing with recharge (possibility) if mete_grid.inp exists CALL METASWAP_METEGRID2(TRIM(DIRMSP)) DEALLOCATE(SIMGRO,NODATA) PMANAGER_SAVEMF2005_MSP=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_MSP !###==================================================================== SUBROUTINE PMANAGER_SAVEMF2005_MSP_PARASIM(FNAME,DIRMSP) !###==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: FNAME,DIRMSP INTEGER :: IU,JU,I,IOS,IC1,IC2,IR1,IR2,SNCOL,SNROW,IFLEXD REAL(KIND=DP_KIND) :: X1,Y1,TINY CHARACTER(LEN=256) :: S,S1,RUNDIR I=INDEX(FNAME,'\',.TRUE.) !## get working director CALL IOSDIRNAME(RUNDIR) IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',ACTION='READ') JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=TRIM(DIRMSP)//'\PARA_SIM.INP',STATUS='REPLACE',ACTION='WRITE') IFLEXD=0; DO READ(IU,'(A256)',IOSTAT=IOS) LINE IF(IOS.NE.0)EXIT S=TRIM(ADJUSTL(LINE)); S=UTL_CAP(S,'L') ! IF(S(1:14).EQ.'unsa_svat_path')THEN ! I=INDEX(LINE,'=') ! S1=ADJUSTL(LINE(I+1:LEN_TRIM(LINE))) ! READ(S1,*) S2 ! CALL UTL_REL_TO_ABS(RUNDIR,S2) ! LINE=LINE(1:I)//' "'//TRIM(S2)//'"' ! END IF !## do not copy simgro_opt settings if existing IF(INDEX(TRIM(S),'simgro_opt').EQ.0)THEN IF(INDEX(TRIM(S),'subirrigation_mdl').GT.0)THEN !## add string if flexible drainage is active IF(PBMAN%FLEXD.EQ.1)THEN; WRITE(JU,'(A)') TRIM(LINE); IFLEXD=1; ENDIF ELSE WRITE(JU,'(A)') TRIM(LINE) ENDIF ENDIF ENDDO IF(IFLEXD.EQ.0.AND.PBMAN%FLEXD.EQ.1)WRITE(JU,'(4A,A)') 'subirrigation_mdl = 1' CLOSE(IU) TINY=0.001D0 CALL POL1LOCATE(PRJIDF%SX,PRJIDF%NCOL+1,PRJIDF%XMIN+TINY,IC1) CALL POL1LOCATE(PRJIDF%SX,PRJIDF%NCOL+1,PRJIDF%XMAX-TINY,IC2) CALL POL1LOCATE(PRJIDF%SY,PRJIDF%NROW+1,PRJIDF%YMAX-TINY,IR1) CALL POL1LOCATE(PRJIDF%SY,PRJIDF%NROW+1,PRJIDF%YMIN+TINY,IR2) !## check to make sure dimensions are within bounds! IC1 = MAX(1,IC1); IC2 = MIN(IC2,PRJIDF%NCOL) IR1 = MAX(1,IR1); IR2 = MIN(IR2,PRJIDF%NROW) SNCOL=(IC2-IC1)+1; SNROW=(IR2-IR1)+1 X1=PRJIDF%XMIN Y1=PRJIDF%YMIN WRITE(JU,'(A)') '*' WRITE(JU,'(A)') '* Parameters for IDF output' WRITE(JU,'(A)') '*' WRITE(JU,'(A)') ' simgro_opt = -1 ! simgro output file' WRITE(JU,'(A)') ' idf_per = 1 ! Writing IDF files' LINE=' idf_xmin = '//TRIM(RTOS(X1,'G',7)) WRITE(JU,'(A)') TRIM(LINE) LINE=' idf_ymin = '//TRIM(RTOS(Y1,'G',7)) WRITE(JU,'(A)') TRIM(LINE) LINE=' idf_dx = '//TRIM(RTOS(PRJIDF%DX,'G',7)) WRITE(JU,'(A)') TRIM(LINE) LINE=' idf_dy = '//TRIM(RTOS(PRJIDF%DY,'G',7)) WRITE(JU,'(A)') TRIM(LINE) LINE=' idf_ncol = '//TRIM(ITOS(SNCOL)) WRITE(JU,'(A)') TRIM(LINE) LINE=' idf_nrow = '//TRIM(ITOS(SNROW)) WRITE(JU,'(A)') TRIM(LINE) LINE=' idf_nodata = '//TRIM(RTOS(-9999.00D0,'F',2)) WRITE(JU,'(A)') TRIM(LINE) IF(PRJIDF%IEQ.EQ.0)THEN LINE=' idf_sx = 0' WRITE(JU,'(A)') TRIM(LINE) ELSE LINE=' idf_sx = 1' WRITE(JU,'(A)') TRIM(LINE) DO IC1=1,PRJIDF%NCOL WRITE(JU,'(A,F15.3)') ' idf_dx'//trim(itos(ic1))//'=',PRJIDF%SX(IC1)-PRJIDF%SX(IC1-1) ENDDO ENDIF IF(PRJIDF%IEQ.EQ.0)THEN LINE=' idf_sy = 0' WRITE(JU,'(A)') TRIM(LINE) ELSE LINE=' idf_sy = 1' WRITE(JU,'(A)') TRIM(LINE) DO IR1=1,PRJIDF%NROW WRITE(JU,'(A,F15.3)') ' idf_dy'//trim(itos(ir1))//'=',PRJIDF%SY(IR1-1)-PRJIDF%SY(IR1) ENDDO ENDIF CLOSE(JU) END SUBROUTINE PMANAGER_SAVEMF2005_MSP_PARASIM !###==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_MSP_READIPF(IPFFILE,IBATCH) !###==================================================================== IMPLICIT NONE LOGICAL :: LPWT INTEGER,INTENT(IN) :: IBATCH CHARACTER(LEN=*),INTENT(IN) :: IPFFILE INTEGER :: I,J,JU,M,N,LYBE,NUND,MDND REAL(KIND=DP_KIND) :: XC,YC,QBER PMANAGER_SAVEMF2005_MSP_READIPF=.TRUE. IF(PBMAN%IARMWP.EQ.0)RETURN PMANAGER_SAVEMF2005_MSP_READIPF=.FALSE. JU=UTL_GETUNIT(); MDND=0 DO J=1,2 CALL OSD_OPEN(JU,FILE=IPFFILE,ACTION='READ',STATUS='OLD') READ(JU,*) N; READ(JU,*) M IF(M.LT.5)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'IPF for artificial recharge should be at least 5 column, x,y,ilay,id,capacity','Error') RETURN ENDIF DO I=1,M+1; READ(JU,*) ; ENDDO IF(J.EQ.2)THEN; ALLOCATE(IPFMSP(MDND)); IPFMSP%ILAY=0; IPFMSP%CAP=0.0D0; ENDIF DO I=1,N READ(JU,*) XC,YC,LYBE,NUND,QBER IF(J.EQ.1)MDND=MAX(MDND,NUND) IF(J.EQ.2)THEN; IPFMSP(NUND)%X=XC; IPFMSP(NUND)%Y=YC; IPFMSP(NUND)%ILAY=LYBE; IPFMSP(NUND)%CAP=QBER; ENDIF ENDDO CLOSE(JU) ENDDO PMANAGER_SAVEMF2005_MSP_READIPF=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_MSP_READIPF !###==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_MSP_READIPF_FLEXD(IPFFILE,IBATCH,PLN,ICHECK) !###==================================================================== IMPLICIT NONE LOGICAL :: LPWT INTEGER,INTENT(IN) :: IBATCH,ICHECK INTEGER,DIMENSION(:,:),INTENT(INOUT) :: PLN CHARACTER(LEN=*),INTENT(IN) :: IPFFILE INTEGER :: I,J,K,JU,M,N,MXID,ICOL,IROW,ID REAL(KIND=DP_KIND) :: XS,YS,CAP,HTL,LTL,XE,YE,ZE REAL(KIND=DP_KIND),ALLOCATABLE,DIMENSION(:) :: TLP,KH,TP,BT INTEGER,ALLOCATABLE,DIMENSION(:) :: CNT LOGICAL :: LEX PMANAGER_SAVEMF2005_MSP_READIPF_FLEXD=.FALSE. IF(ALLOCATED(IPFFLX))DEALLOCATE(IPFFLX) ALLOCATE(TLP(PRJNLAY),KH(PRJNLAY),TP(PRJNLAY),BT(PRJNLAY)) JU=UTL_GETUNIT(); MXID=0 DO J=1,2 CALL OSD_OPEN(JU,FILE=IPFFILE,ACTION='READ',STATUS='OLD') READ(JU,*) N; READ(JU,*) M IF(M.LT.8)THEN IF(IBATCH.EQ.0)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'IPF for controlled-level drainage should be at least 8 column for x,y,capacity,lowtargetlevel,hightargetlevel,x_extraction,y_extraction,z_extraction','Error') IF(IBATCH.EQ.1)WRITE(*,'(/A/)') 'IPF for controlled-level drainag should be at least 8 column for x,y,capacity,lowtargetlevel,hightargetlevel,x_extraction,y_extraction,z_extraction' RETURN ENDIF DO I=1,M+1; READ(JU,*) ; ENDDO IF(J.EQ.2)THEN !## capacity is tricker whether an extraction exists for a plotnumber ALLOCATE(IPFFLX(MXID)); IPFFLX%CAP=-9999.0D0; IPFFLX%XS=-9999.0D0 ENDIF DO I=1,N READ(JU,*) XS,YS,CAP,LTL,HTL,XE,YE,ZE !## get screening number from simgro()%pln CALL IDFIROWICOL(PRJIDF,IROW,ICOL,XS,YS) ID=PLN(ICOL,IROW) !## skip this incorrect plotnumber IF(ID.LE.0)CYCLE IF(J.EQ.1)THEN MXID=MAX(MXID,ID) ELSE IF(IPFFLX(ID)%CAP.NE.-9999.0D0)THEN CLOSE(JU) IF(IBATCH.EQ.0)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Multiple screening locations specified for plot number: '//TRIM(ITOS(ID)),'Error') IF(IBATCH.EQ.1)WRITE(*,'(/A/)') 'Multiple screening locations specified for plot number: '//TRIM(ITOS(ID)) RETURN ENDIF IPFFLX(ID)%XS =XS IPFFLX(ID)%YS =YS IPFFLX(ID)%CAP=CAP IPFFLX(ID)%LTL=LTL IPFFLX(ID)%HTL=HTL IF(XE.EQ.-9999.0D0.OR.YE.EQ.-9999.0D0.OR.ZE.EQ.-9999.0D0)THEN XE=-9999.0D0; YE=-9999.0D0; ZE=-9999.0D0; IPFFLX(ID)%IL=0 ELSE !## determine layer number for the extraction CALL PMANAGER_SAVEMF2005_PCK_ULSTRD_PARAM(PRJNLAY,ICOL,IROW,TOP,BOT,KDW,TP,BT,KH,.TRUE.) CALL UTL_PCK_GETTLP(PRJNLAY,TLP,KH,TP,BT,ZE,ZE,0.0D0) DO K=1,PRJNLAY; IF(TLP(K).GT.0.0D0)THEN; IPFFLX(ID)%IL=K; EXIT; ENDIF; ENDDO !## if not assigned to a proper layer, turn the extraction off IF(IPFFLX(ID)%IL.EQ.0)IPFFLX(ID)%CAP=0.0D0 ENDIF IPFFLX(ID)%YE=YE IPFFLX(ID)%XE=XE IPFFLX(ID)%ZE=ZE ENDIF ENDDO CLOSE(JU) ENDDO !## set nodata of CAP to zero IPFFLX%CAP=MAX(IPFFLX%CAP,0.0D0) MXID=MAXVAL(PLN); ALLOCATE(CNT(MXID)); CNT=0 !## check whether all plot numbers have a steering point K=0; DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL ID=PLN(ICOL,IROW) IF(ID.LE.0)THEN; PLN(ICOL,IROW)=0; CYCLE; ENDIF IF(CNT(ID).NE.0)CYCLE LEX=.FALSE. IF(ID.GT.SIZE(IPFFLX))THEN LEX=.TRUE. ELSE IF(IPFFLX(ID)%XS.EQ.-9999.0D0)LEX=.TRUE. ENDIF IF(LEX)THEN !## id is not okay CNT(ID)=-1 IF(ICHECK.EQ.1)THEN K=K+1 IF(K.EQ.1)THEN WRITE(*,'(/1X,A)') 'Missing Steering Points for plotnumber:' WRITE(*,'(A10)') 'ID'; WRITE(*,'(A10)') '----------' ENDIF WRITE(*,'(I10)') ID ENDIF !## id is okay ELSE CNT(ID)=1 ENDIF ENDDO; ENDDO !## clean pln array for not existing plotnumbers DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL ID=PLN(ICOL,IROW); IF(ID.EQ.0)CYCLE; IF(CNT(ID).EQ.-1)PLN(ICOL,IROW)=0 ENDDO; ENDDO DEALLOCATE(CNT) IF(ICHECK.EQ.1)THEN IF(K.GT.0)WRITE(*,'(/1X,A/)') '>>> Above mentioned plot numbers are discarded <<<' ENDIF DEALLOCATE(TLP,KH,TP,BT) PMANAGER_SAVEMF2005_MSP_READIPF_FLEXD=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_MSP_READIPF_FLEXD !###==================================================================== SUBROUTINE PMANAGER_SAVEMF2005_MSP_INPFILES(NODATA,IPWT,DIRMSP,IBATCH) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IBATCH,IPWT REAL(KIND=DP_KIND),DIMENSION(:),INTENT(IN) :: NODATA CHARACTER(LEN=*),INTENT(IN) :: DIRMSP CHARACTER(LEN=256) :: DIR INTEGER,PARAMETER :: AEND=0 !## no surfacewater units INTEGER :: NUND,IROW,ICOL,LYBE,TYBE,BEREGENID,JROW,JCOL,N,M,I,J,JU,IOS,INEAREST, & !MDND NDFM_MSWP,NMSWP_PDFM,NMSWP_RDFM,NMSWP_SDFM,DRC,L,L1,L2,IL,LFLX,PLN,FLXID,SVATID,ILAY REAL(KIND=DP_KIND) :: XC,YC,ARND,QBER,FLBE,TINY,LTL,HTL,CAP,DRL,DRR,DRI TYPE IPFOBJ INTEGER :: ILAY REAL(KIND=DP_KIND) :: X,Y,CAP END TYPE IPFOBJ TYPE(IPFOBJ),ALLOCATABLE,DIMENSION(:) :: IPF LOGICAL :: LURBAN,LEX INTEGER :: NDXC,UNID,IACT,NWEL,NRCH,NUFLXID INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: DXCID TYPE(IDFOBJ) :: ACTPLN,SVATRURAL,SVATURBAN INTEGER,ALLOCATABLE,DIMENSION(:) :: FLXUD,FLXUID IF (ALLOCATED(DXCID)) DEALLOCATE(DXCID) ALLOCATE(DXCID(PRJIDF%NCOL,PRJIDF%NROW,PRJNLAY)) DXCID = 0 NDXC = 0 IF(PBMAN%FLEXD.EQ.1)THEN N=PRJIDF%NROW*PRJIDF%NCOL; ALLOCATE(FLXUD(N)) N=0; DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(SIMGRO(ICOL,IROW)%IBOUND.LE.0)CYCLE !## plotnumber FLXID=INT(SIMGRO(ICOL,IROW)%PLN) IF(FLXID.GT.0)THEN N=N+1; FLXUD(N)=FLXID ENDIF ENDDO; ENDDO CALL UTL_GETUNIQUE_INT(FLXUD,N,NUFLXID,0) ALLOCATE(FLXUID(FLXUD(NUFLXID))); FLXUID=0 DO I=1,NUFLXID; FLXUID(FLXUD(I))=I; ENDDO DEALLOCATE(FLXUD) ENDIF !## write wel-package IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(WMF6_MSWP,'(A)') '# WEL6 File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(WMF6_MSWP,'(/A)') '#General Options' WRITE(WMF6_MSWP,'(/A)') 'BEGIN OPTIONS' WRITE(WMF6_MSWP,'(A )') 'END OPTIONS' WRITE(WMF6_MSWP,'(/A)') '#General Dimensions' WRITE(WMF6_MSWP,'(A)') 'BEGIN DIMENSIONS' WRITE(WMF6_MSWP,'(A)') 'MAXBOUND NaN1#' WRITE(WMF6_MSWP,'(A)') 'END DIMENSIONS' WRITE(WMF6_MSWP,'(/A)') 'BEGIN PERIOD 1' WRITE(RMF6_MSWP,'(A)') '# RCH6 File Generated by '//TRIM(UTL_IMODVERSION()) WRITE(RMF6_MSWP,'(/A)') '#General Options' WRITE(RMF6_MSWP,'(/A)') 'BEGIN OPTIONS' WRITE(RMF6_MSWP,'(A )') 'END OPTIONS' WRITE(RMF6_MSWP,'(/A)') '#General Dimensions' WRITE(RMF6_MSWP,'(A)') 'BEGIN DIMENSIONS' WRITE(RMF6_MSWP,'(A)') 'MAXBOUND NaN1#' WRITE(RMF6_MSWP,'(A)') 'END DIMENSIONS' WRITE(RMF6_MSWP,'(/A)') 'BEGIN PERIOD 1' ENDIF IF(PBMAN%DMMFILE.EQ.1)THEN DIR=DIRMSP(:INDEX(DIRMSP,'\',.TRUE.)-1) CALL PMANAGER_SAVEMF2005_READ_DFFMPOINTS(DIR) WRITE(IDFM_MSWP,'(4A15)') 'SVAT','FM-X','FM-Y','WEIGHT'; NDFM_MSWP=0 WRITE(IMSWP_PDFM,'(3A15)') 'FM-X','FM-Y','SVAT'; NMSWP_PDFM=0 WRITE(IMSWP_RDFM,'(3A15)') 'FM-X','FM-Y','SVAT'; NMSWP_RDFM=0 WRITE(IMSWP_SDFM,'(3A15)') 'FM-X','FM-Y','SVAT'; NMSWP_SDFM=0 ENDIF IF(PBMAN%FLEXD.EQ.1)THEN CALL IDFNULLIFY(ACTPLN); CALL IDFCOPY(PRJIDF,ACTPLN); ACTPLN%X=ACTPLN%NODATA ENDIF CALL IDFNULLIFY(SVATRURAL); CALL IDFCOPY(PRJIDF,SVATRURAL); SVATRURAL%X=SVATRURAL%NODATA CALL IDFNULLIFY(SVATURBAN); CALL IDFCOPY(PRJIDF,SVATURBAN); SVATURBAN%X=SVATURBAN%NODATA DO IACT=1,2 NWEL=0; NRCH=0; NUND=0; UNID=0 DO IROW=1,PRJIDF%NROW DO ICOL=1,PRJIDF%NCOL LURBAN=.FALSE. IF(SIMGRO(ICOL,IROW)%IBOUND.LE.0)CYCLE ILAY=SIMGRO(ICOL,IROW)%IBOUND ARND=IDFGETAREA(PRJIDF,ICOL,IROW) ARND= ARND-SIMGRO(ICOL,IROW)%NOPP-SIMGRO(ICOL,IROW)%SOPP !## rural area > 0 IF(ARND.GT.0.0D0)THEN LURBAN=.TRUE. NUND=NUND+1 CALL IDFGETLOC(PRJIDF,IROW,ICOL,XC,YC) IF(IACT.EQ.2)THEN WRITE(IIDF,'(3I10,2F15.3)') NUND,IROW,ICOL,XC,YC SVATRURAL%X(ICOL,IROW)=NUND ENDIF !## write sel_svat_bda.inp IF(IACT.EQ.2)THEN WRITE(ISELSVAT,'(I10)') NUND IF(PBMAN%DMMFILE.EQ.1)THEN !## coupling to 2d network WRITE(IDFM_MSWP,'(I15,3F15.3)') NUND,XC,YC,1.0D0; NDFM_MSWP =NDFM_MSWP +1 !## coupling for ponding WRITE(IMSWP_PDFM,'(2F15.3,I15)') XC,YC,NUND; NMSWP_PDFM=NMSWP_PDFM+1 !## coupling for rural runoff - nearest DFMFM-point in same afwat-unit INEAREST=PMANAGER_SAVEMF2005_DMM_GETXY(XC,YC,.TRUE.,DRC) IF(INEAREST.GT.0)THEN WRITE(IMSWP_RDFM,'(2F15.3,I15)') DFFM(INEAREST)%X,DFFM(INEAREST)%Y,NUND NMSWP_RDFM=NMSWP_RDFM+1 ENDIF ENDIF !## write area_svat.inp WRITE(IAREA,'(I10,F10.1,F8.3,8X,I6,8X,8X,I6,F8.3,I10,2F8.3)') NUND,ARND,SIMGRO(ICOL,IROW)%MV, & SIMGRO(ICOL,IROW)%BODEM,SIMGRO(ICOL,IROW)%LGN,SIMGRO(ICOL,IROW)%RZ/100.0D0, & SIMGRO(ICOL,IROW)%METEO,1.0,1.0 !## write svat2swnr_roff.inp ------------------ WRITE(INDSB,'(I10,I10,F8.3,2F8.1)') NUND,AEND,SIMGRO(ICOL,IROW)%VXMU_ROPP,SIMGRO(ICOL,IROW)%CRUNOFF_ROPP, & SIMGRO(ICOL,IROW)%CRUNON_ROPP !## write infi_svat.inp, infiltratiecapaciteit per cel, de rest -9999. WRITE(IINFI,'(I10,F8.3,4F8.1)') NUND,SIMGRO(ICOL,IROW)%QINFBASIC_ROPP,-9999.0,-9999.0,-9999.0,-9999.0 ENDIF !## add couple location modflow CALL STOREDXC(DXCID,PRJIDF%NCOL,PRJIDF%NROW,PRJNLAY,ILAY,IROW,ICOL,UNID,IACT) IF(IACT.EQ.2)THEN IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IUNOD,'(3I10)') UNID,NUND,1 NRCH=NRCH+1 WRITE(RINDEX_MSWP,'(3I10)') NRCH,NUND,1 WRITE(RMF6_MSWP,'(3I10,F10.2)') ILAY,IROW,ICOL,0.0D0 ENDIF WRITE(IGWMP,'(I10,2X,I10,I5)') UNID,NUND,1 WRITE(IMODSIM,'(I10,2X,I10,I5)') UNID,NUND,1 ENDIF !## begin modsub_svat.inp IF(PBMAN%FLEXD.EQ.1)THEN !## perceelsnumber CAP=0.0D0; SVATID=0; FLXID=INT(SIMGRO(ICOL,IROW)%PLN) !## no steering location present for this plotnumber IF(FLXID.GT.SIZE(IPFFLX))FLXID=0 IF(FLXID.GT.0)THEN !## steering location CALL IDFIROWICOL(PRJIDF,JROW,JCOL,IPFFLX(FLXID)%XS,IPFFLX(FLXID)%YS) !## this is the steering location and the extraction need to be assigned to this one IF(ICOL.EQ.JCOL.AND.IROW.EQ.JROW)CAP=IPFFLX(FLXID)%CAP IF(CAP.EQ.0.0D0)THEN SVATID=-9999 LFLX =-9999 ELSE !## extraction location CALL IDFIROWICOL(PRJIDF,JROW,JCOL,IPFFLX(FLXID)%XE,IPFFLX(FLXID)%YE) !## extraction outside model IF(JCOL.EQ.0.OR.JROW.EQ.0)THEN SVATID=-9999 LFLX =-9999 ELSE LFLX=IPFFLX(FLXID)%IL ENDIF CAP=IPFFLX(FLXID)%CAP !## add couple location for extraction to modflow, always use layer number 1 for the svat unit and only if position of extraction is in current model IF(SVATID.NE.-9999)CALL STOREDXC(DXCID,PRJIDF%NCOL,PRJIDF%NROW,PRJNLAY,ILAY,JROW,JCOL,SVATID,IACT) ENDIF IF(IACT.EQ.2)THEN LTL=IPFFLX(FLXID )%LTL HTL=IPFFLX(FLXID )%HTL PLN=SIMGRO(ICOL,IROW)%PLN !## renumbered plotnumber PLN=FLXUID(PLN) DRI=1.0D0 DRL=SIMGRO(ICOL,IROW)%PDL; IF(DRL.EQ.NODATA(25))THEN; DRL=-9999.0D0; DRI=-9999.0D0; ENDIF DRR=SIMGRO(ICOL,IROW)%PDR; IF(DRR.EQ.NODATA(25))THEN; DRR=-9999.0D0; DRI=-9999.0D0; ENDIF !## nund is svat of current position, unid is svat of extraction location IF(CAP.EQ.0.0D0)THEN ACTPLN%X(ICOL,IROW)= PLN WRITE(IFLEXD,'(2I10,G10.3,2I10,12F10.3)') NUND,PLN,-9999.0,SVATID,LFLX,LTL,HTL,DRL,DRR,DRI,(-9999.0D0,I=1,7) ELSE ACTPLN%X(ICOL,IROW)=-PLN WRITE(IFLEXD,'(2I10,G10.3,2I10,12F10.3)') NUND,PLN,CAP,SVATID,LFLX,LTL,HTL,DRL,DRR,DRI,(-9999.0D0,I=1,7) ENDIF ENDIF ENDIF !## add this to the svat list only for the extraction as the svat itself is already present in the list. IF(CAP.NE.0.0D0.AND.SVATID.NE.-9999)THEN NWEL=NWEL+1 IF(IACT.EQ.1)THEN !## store modflow id, if extraction is in model (or active) CALL STOREDXC(DXCID,PRJIDF%NCOL,PRJIDF%NROW,PRJNLAY,LFLX,JROW,JCOL,UNID,IACT) ELSE !## get correct modflow id CALL STOREDXC(DXCID,PRJIDF%NCOL,PRJIDF%NROW,PRJNLAY,LFLX,JROW,JCOL,UNID,IACT) IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IUNOD,'(3I10)') UNID,SVATID,LFLX WRITE(WMF6_MSWP,'(3I10,F10.2)') LFLX,JROW,JCOL,0.0D0 WRITE(WINDEX_MSWP,'(3I10)') NWEL,SVATID,LFLX ENDIF WRITE(IGWMP,'(I10,2X,I10,I5)') UNID,SVATID,LFLX WRITE(IMODSIM,'(I10,2X,I10,I5)') UNID,SVATID,LFLX ENDIF ENDIF ENDIF !## BEGIN scap_svat.inp - grondwater + ow IF(PBMAN%IARMWP.EQ.0)THEN LYBE=SIMGRO(ICOL,IROW)%BER_LAAG TYBE=SIMGRO(ICOL,IROW)%BEREGEN QBER=SIMGRO(ICOL,IROW)%BEREGEN_Q JCOL=ICOL; JROW=IROW ELSE JCOL=0; JROW=0 BEREGENID=INT(SIMGRO(ICOL,IROW)%BEREGEN) IF(BEREGENID.GT.0.AND.BEREGENID.LE.SIZE(IPFMSP))THEN LYBE=IPFMSP(BEREGENID)%ILAY IF(LYBE.GT.0.AND.LYBE.LE.PRJNLAY)THEN QBER=IPFMSP(BEREGENID)%CAP TYBE=1 !## groundwater CALL IDFIROWICOL(PRJIDF,JROW,JCOL,IPFMSP(BEREGENID)%X,IPFMSP(BEREGENID)%Y) ENDIF ENDIF ENDIF IF(JROW.NE.0.AND.JCOL.NE.0)THEN FLBE=0.0D0 IF(TYBE.EQ.1)THEN !## maximum groundwater abstraction mm/day fmmxabgw FLBE=QBER ELSEIF(TYBE.EQ.2)THEN !## maximum surface water abstraction mm/day fmmxabsw FLBE=QBER ENDIF !## maximum groundwater abstraction mm/day fmmxabgw IF(FLBE.GT.0.0D0)THEN IF(TYBE.EQ.1)THEN IF(IACT.EQ.2)THEN WRITE(ISCAP,'(I10,F8.2,24X,I10,I6)') NUND,QBER,NUND,LYBE ENDIF ELSEIF(TYBE.EQ.2)THEN IF(IACT.EQ.2)WRITE(ISCAP,'(I10,8X,F8.2,32X,I10)') NUND,QBER,AEND ENDIF ENDIF !## coupling to surface water IF(IACT.EQ.2.AND.PBMAN%DMMFILE.EQ.1.AND.TYBE.EQ.2)THEN !## coupling for sprinklink - nearest DFMFM-point no matter what afwat-unit CALL IDFGETLOC(PRJIDF,JROW,JCOL,XC,YC) INEAREST=PMANAGER_SAVEMF2005_DMM_GETXY(XC,YC,.FALSE.,DRC) IF(INEAREST.GT.0)THEN WRITE(IMSWP_SDFM,'(2F15.3,I15)') DFFM(INEAREST)%X,DFFM(INEAREST)%Y,NUND NMSWP_SDFM=NMSWP_SDFM+1 ENDIF ENDIF !## sprinkling from other than modellayer 1 or other location IF(TYBE.EQ.1.AND.LYBE.GT.1)THEN NWEL=NWEL+1 !## add couple location modflow CALL STOREDXC(DXCID,PRJIDF%NCOL,PRJIDF%NROW,PRJNLAY,LYBE,JROW,JCOL,UNID,IACT) IF(IACT.EQ.2)THEN IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(WMF6_MSWP,'(3I10,F10.2)') LYBE,JROW,JCOL,0.0D0 WRITE(WINDEX_MSWP,'(3I10)') NWEL,NUND,LYBE ENDIF WRITE(IGWMP,'(I10,2X,I10,I5)') UNID,NUND,LYBE WRITE(IMODSIM,'(I10,2X,I10,I5)') UNID,NUND,LYBE ENDIF ENDIF ENDIF !## END scap_svat.inp - grondwater + ow !## BEGIN mod2svat.inp; NB: als opp. water of glas dan laag = 0 IF(IPWT.EQ.0)THEN IF(IACT.EQ.2)WRITE(IUSCL,'(I10,3F8.3,8X,2I10)') NUND,SIMGRO(ICOL,IROW)%MOISTURE,SIMGRO(ICOL,IROW)%COND,1.0,ICOL,IROW ELSE IF(SIMGRO(ICOL,IROW)%PWT_LEVEL.NE.NODATA(20))THEN IF(IACT.EQ.2)WRITE(IUSCL,'(I10,4F8.3,2I10)') NUND,SIMGRO(ICOL,IROW)%MOISTURE,SIMGRO(ICOL,IROW)%COND,1.0D0, & SIMGRO(ICOL,IROW)%MV-SIMGRO(ICOL,IROW)%PWT_LEVEL,ICOL,IROW ELSE IF(IACT.EQ.2)WRITE(IUSCL,'(I10,3F8.3,8X,2I10)') NUND,SIMGRO(ICOL,IROW)%MOISTURE,SIMGRO(ICOL,IROW)%COND,1.0D0,ICOL,IROW ENDIF ENDIF !## END mod2svat.inp; NB: als opp. water of glas dan laag = 0 !## end rural area ENDIF !## urban area (verhard) ARND =IDFGETAREA(PRJIDF,ICOL,IROW) ARND =MIN(ARND,SIMGRO(ICOL,IROW)%SOPP) !< dit komt niet meer terug? IF(ARND.GT.0.0D0)THEN NUND=NUND+1 !## write idf_svat.inp IF(IACT.EQ.2)THEN WRITE(IIDF,'(3I10,2F15.3)') NUND,IROW,ICOL,XC,YC SVATURBAN%X(ICOL,IROW)=NUND ENDIF !## write sel_svat_bda.inp IF(IACT.EQ.2)THEN WRITE(ISELSVAT,'(I10)') NUND CALL IDFGETLOC(PRJIDF,IROW,ICOL,XC,YC) IF(PBMAN%DMMFILE.EQ.1)THEN WRITE(IDFM_MSWP,'(I15,3F15.3)') NUND,XC,YC,1.0D0; NDFM_MSWP =NDFM_MSWP +1 WRITE(IMSWP_PDFM,'(2F15.3,I15)') XC,YC,NUND; NMSWP_PDFM=NMSWP_PDFM+1 !## coupling for urban runoff - nearest DFMFM-point in same afwat-unit INEAREST=PMANAGER_SAVEMF2005_DMM_GETXY(XC,YC,.TRUE.,DRC) IF(INEAREST.GT.0)THEN WRITE(IMSWP_SDFM,'(2F15.3,I15)') DFFM(INEAREST)%X,DFFM(INEAREST)%Y,NUND NMSWP_SDFM=NMSWP_SDFM+1 ENDIF ENDIF WRITE(IAREA,'(I10,F10.1,F8.3,8X,I6,16X,I6,F8.3,I10,2F8.2)') & NUND,ARND,SIMGRO(ICOL,IROW)%MV,SIMGRO(ICOL,IROW)%BODEM,18,0.1,SIMGRO(ICOL,IROW)%METEO,1.0D0,1.0D0 WRITE(INDSB,'(2I10,F8.3,2F8.1)') NUND,0,SIMGRO(ICOL,IROW)%VXMU_SOPP,SIMGRO(ICOL,IROW)%CRUNOFF_SOPP,SIMGRO(ICOL,IROW)%CRUNON_SOPP ENDIF !## add couple location modflow CALL STOREDXC(DXCID,PRJIDF%NCOL,PRJIDF%NROW,PRJNLAY,ILAY,IROW,ICOL,UNID,IACT) IF(IACT.EQ.2)THEN IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IUNOD,'(3I10)') UNID,NUND,1 IF(.NOT.LURBAN)THEN !## new recharge point NRCH=NRCH+1 WRITE(RMF6_MSWP,'(3I10,F10.2)') ILAY,IROW,ICOL,0.0D0 ! WRITE(RMF6_MSWP,'(3I10,F10.2)') 1,IROW,ICOL,0.0D0 ENDIF WRITE(RINDEX_MSWP,'(3I10)') NRCH,NUND,1 ENDIF WRITE(IGWMP,'(I10,2X,I10,I5)') UNID,NUND,1 WRITE(IMODSIM,'(I10,2X,I10,I5)') UNID,NUND,1 ENDIF IF(IPWT.EQ.0)THEN IF(IACT.EQ.2)WRITE(IUSCL,'(I10,3F8.3,8X,2I10)') NUND,SIMGRO(ICOL,IROW)%MOISTURE,SIMGRO(ICOL,IROW)%COND,1.0D0,ICOL,IROW ELSE IF(SIMGRO(ICOL,IROW)%PWT_LEVEL.NE.NODATA(20))THEN IF(IACT.EQ.2)WRITE(IUSCL,'(I10,4F8.3,2I10)') NUND,SIMGRO(ICOL,IROW)%MOISTURE,SIMGRO(ICOL,IROW)%COND,1.0D0, & SIMGRO(ICOL,IROW)%MV-SIMGRO(ICOL,IROW)%PWT_LEVEL,ICOL,IROW ELSE IF(IACT.EQ.2)WRITE(IUSCL,'(I10,3F8.3,8X,2I10)') NUND,SIMGRO(ICOL,IROW)%MOISTURE,SIMGRO(ICOL,IROW)%COND,1.0D0,ICOL,IROW ENDIF ENDIF !## write infi_svat.inp, infiltratiecapaciteit per cel, de rest -9999. IF(IACT.EQ.2)WRITE(IINFI,'(I10,F8.3,4F8.1)') NUND,SIMGRO(ICOL,IROW)%QINFBASIC_SOPP,-9999.0,-9999.0,-9999.0,-9999.0 ENDIF ENDDO ENDDO IF(IACT.EQ.1)CALL GENIDDXC(DXCID,PRJIDF%NCOL,PRJIDF%NROW,PRJNLAY,NDXC) ENDDO ! IF(PBMAN%FLEXD.EQ.1)THEN ! DO I=1,NUND; WRITE(IDQSAT,'(I10,F8.3)') I,6.0; ENDDO ! ENDIF !## write *.dxc (not for MF6) IF(PBMAN%IFORMAT.NE.3)CALL WRITEDXC(IDXC,DXCID,PRJIDF%NCOL,PRJIDF%NROW,PRJNLAY,NDXC) DEALLOCATE(DXCID) IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(WMF6_MSWP,'(A)') 'END PERIOD' WRITE(RMF6_MSWP,'(A)') 'END PERIOD' ENDIF IF(IAREA.GT.0) CLOSE(IAREA) IF(ISELSVAT.GT.0) CLOSE(ISELSVAT) IF(INDSB.GT.0) CLOSE(INDSB) IF(ISCAP.GT.0) CLOSE(ISCAP) IF(IGWMP.GT.0) CLOSE(IGWMP) IF(IMODSIM.GT.0) CLOSE(IMODSIM) IF(IINFI.GT.0) CLOSE(IINFI) IF(IIDF.GT.0) CLOSE(IIDF) IF(IUSCL.GT.0) CLOSE(IUSCL) IF(IUNOD.GT.0) CLOSE(IUNOD) IF(IFLEXD.GT.0) CLOSE(IFLEXD) ! IF(IDQSAT.GT.0) CLOSE(IDQSAT) IF(WINDEX_MSWP.GT.0)CLOSE(WINDEX_MSWP) IF(RINDEX_MSWP.GT.0)CLOSE(RINDEX_MSWP) IF(WMF6_MSWP.GT.0) CLOSE(WMF6_MSWP) IF(RMF6_MSWP.GT.0) CLOSE(RMF6_MSWP) IF(ALLOCATED(FLXUID))DEALLOCATE(FLXUID) IF(PBMAN%DMMFILE.EQ.1)THEN IF(IDFM_MSWP.GT.0)THEN IF(NDFM_MSWP.GT.0)THEN; CLOSE(IDFM_MSWP); ELSE; CLOSE(IDFM_MSWP,STATUS='DELETE'); ENDIF ENDIF IF(IMSWP_PDFM.GT.0)THEN IF(NMSWP_PDFM.GT.0)THEN; CLOSE(IMSWP_PDFM); ELSE; CLOSE(IMSWP_PDFM,STATUS='DELETE'); ENDIF ENDIF IF(IMSWP_SDFM.GT.0)THEN IF(NMSWP_SDFM.GT.0)THEN; CLOSE(IMSWP_SDFM); ELSE; CLOSE(IMSWP_SDFM,STATUS='DELETE'); ENDIF ENDIF IF(IMSWP_RDFM.GT.0)THEN IF(NMSWP_RDFM.GT.0)THEN; CLOSE(IMSWP_RDFM); ELSE; CLOSE(IMSWP_RDFM,STATUS='DELETE'); ENDIF ENDIF CALL PMANAGER_SAVEMF2005_DEALL_DFFMGRID() DEALLOCATE(DFFM) ENDIF IF(PBMAN%FLEXD.EQ.1)THEN ACTPLN%FNAME=DIRMSP(:INDEX(DIRMSP,'\',.TRUE.)-1)//'\MSWAPINPUT\ACTPLN.IDF' IF(.NOT.IDFWRITE(ACTPLN,ACTPLN%FNAME,1))THEN ENDIF CALL IDFDEALLOCATEX(ACTPLN) ENDIF SVATRURAL%FNAME=DIRMSP(:INDEX(DIRMSP,'\',.TRUE.)-1)//'\MSWAPINPUT\SVATRURAL.IDF' IF(.NOT.IDFWRITE(SVATRURAL,SVATRURAL%FNAME,1))THEN; ENDIF; CALL IDFDEALLOCATEX(SVATRURAL) SVATURBAN%FNAME=DIRMSP(:INDEX(DIRMSP,'\',.TRUE.)-1)//'\MSWAPINPUT\SVATURBAN.IDF' IF(.NOT.IDFWRITE(SVATURBAN,SVATURBAN%FNAME,1))THEN; ENDIF; CALL IDFDEALLOCATEX(SVATURBAN) IF(PBMAN%IFORMAT.EQ.3)THEN DIR=DIRMSP(:INDEX(DIRMSP,'\',.TRUE.)-1)//'\MODELINPUT' CALL UTL_MF2005_MAXNO(TRIM(DIR)//'\MSW.WEL6_',(/NWEL/)) CALL UTL_MF2005_MAXNO(TRIM(DIR)//'\MSW.RCH6_',(/NRCH/)) ENDIF END SUBROUTINE PMANAGER_SAVEMF2005_MSP_INPFILES !###==================================================================== SUBROUTINE PMANAGER_SAVEMF2005_DEALL_DFFMGRID() !###==================================================================== IMPLICIT NONE INTEGER :: IROW,ICOL !## deallocate any tree memory IF(ALLOCATED(DFFMGRID))THEN DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(ASSOCIATED(DFFMGRID(ICOL,IROW)%ID))THEN DEALLOCATE(DFFMGRID(ICOL,IROW)%ID) ENDIF ENDDO; ENDDO DEALLOCATE(DFFMGRID) ENDIF END SUBROUTINE PMANAGER_SAVEMF2005_DEALL_DFFMGRID !###==================================================================== SUBROUTINE PMANAGER_SAVEMF2005_READ_DFFMPOINTS(DIR) !###==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR INTEGER :: JU,I,J,N,IOS,IZ,IROW,ICOL LOGICAL :: LEX JU=UTL_GETUNIT() INQUIRE(FILE=TRIM(DIR)//'\DFLOWFM_POINTS.DAT',EXIST=LEX) IF(LEX)THEN CALL OSD_OPEN(JU,FILE=TRIM(DIR)//'\DFLOWFM_POINTS.DAT',STATUS='OLD', & FORM='FORMATTED',ACTION='READ,DENYWRITE',ACCESS='SEQUENTIAL') ALLOCATE(DFFM(1)) N=0; DO I=1,2 READ(JU,*,IOSTAT=IOS); IF(IOS.NE.0)THEN; DEALLOCATE(DFFM); EXIT; ENDIF J=1; DO READ(JU,*,IOSTAT=IOS) DFFM(J)%ISEG,DFFM(J)%INODE,DFFM(J)%IZONE,DFFM(J)%X,DFFM(J)%Y IF(IOS.NE.0)EXIT; IF(I.EQ.1)N=N+1 J=J+1; IF(I.EQ.1)J=1; IF(I.EQ.2.AND.J.GT.N)EXIT ENDDO IF(I.EQ.1)THEN DEALLOCATE(DFFM); IF(N.GT.0)ALLOCATE(DFFM(N)) ENDIF REWIND(JU) ENDDO ENDIF !## create raster with id's ALLOCATE(DFFMGRID(PRJIDF%NCOL,PRJIDF%NROW)) DO I=1,2 DFFMGRID%NID=0 DO J=1,SIZE(DFFM) CALL IDFIROWICOL(PRJIDF,IROW,ICOL,DFFM(J)%X,DFFM(J)%Y) DFFMGRID(ICOL,IROW)%NID=DFFMGRID(ICOL,IROW)%NID+1 IF(I.EQ.2)THEN DFFMGRID(ICOL,IROW)%ID(DFFMGRID(ICOL,IROW)%NID)=J ENDIF ENDDO IF(I.EQ.1)THEN DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL NULLIFY(DFFMGRID(ICOL,IROW)%ID) IF(DFFMGRID(ICOL,IROW)%NID.GT.0)THEN ALLOCATE(DFFMGRID(ICOL,IROW)%ID(DFFMGRID(ICOL,IROW)%NID)) ENDIF ENDDO; ENDDO ENDIF ENDDO !## read afwatidf IF(AFWATIDF%FNAME.NE.'')THEN CALL IDFCOPY(BND(1),AFWATIDF) IF(.NOT.IDFREADSCALE(AFWATIDF%FNAME,AFWATIDF,7,0,0.0D0,0))THEN WRITE(*,'(/1X,A/)') 'CANNOT READ '//TRIM(AFWATIDF%FNAME); STOP ENDIF ENDIF ! afwatidf%x=dffmgrid%nid ! if(.not.idfwrite(afwatidf,'d:\tmp.idf',0))then; endif ! IF(MINVAL(DFFM%IZONE).EQ.MAXVAL(DFFM%IZONE))THEN ! ALLOCATE(XY(N,2)); XY(:,1)=DFFM%X; XY(:,2)=DFFM%Y ! TREE=>CREATE_TREE(XY) ! DEALLOCATE(XY) ! ENDIF END SUBROUTINE PMANAGER_SAVEMF2005_READ_DFFMPOINTS !###==================================================================== INTEGER FUNCTION PMANAGER_SAVEMF2005_DMM_GETXY(XC,YC,LZONE,DRC) !###==================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),INTENT(IN) :: XC,YC INTEGER,INTENT(INOUT) :: DRC LOGICAL,INTENT(IN) :: LZONE INTEGER :: I,II,J,N,IZONE,ICOL,IROW,JROW,JCOL REAL(KIND=DP_KIND) :: D,TD LOGICAL :: LEX PMANAGER_SAVEMF2005_DMM_GETXY=0 !## get zone number for dfflow-fm node IZONE=0; IF(AFWATIDF%FNAME.NE.''.AND.LZONE)THEN CALL IDFIROWICOL(AFWATIDF,IROW,ICOL,XC,YC) IF(AFWATIDF%X(ICOL,IROW).EQ.AFWATIDF%NODATA)THEN IZONE=0 ELSE IZONE=AFWATIDF%X(ICOL,IROW) ENDIF !## not to be assigned IF(IZONE.EQ.0)RETURN ENDIF CALL IDFIROWICOL(PRJIDF,IROW,ICOL,XC,YC) TD=HUGE(1.0); J=0; DRC=0; DO !## nothing found IF(MAX(1,IROW-DRC).EQ.1.AND.MIN(PRJIDF%NROW,IROW+DRC).EQ.PRJIDF%NROW.AND. & MAX(1,ICOL-DRC).EQ.1.AND.MIN(PRJIDF%NCOL,ICOL+DRC).EQ.PRJIDF%NCOL)THEN !## reset drc and search again without zone-checking DRC=0; IZONE=0 ENDIF DO JROW=MAX(1,IROW-DRC),MIN(PRJIDF%NROW,IROW+DRC) DO JCOL=MAX(1,ICOL-DRC),MIN(PRJIDF%NCOL,ICOL+DRC) N=DFFMGRID(JCOL,JROW)%NID DO II=1,N I=DFFMGRID(JCOL,JROW)%ID(II) LEX=.TRUE.; IF(IZONE.NE.0)THEN IF(IZONE.NE.DFFM(I)%IZONE)LEX=.FALSE. ENDIF IF(LEX)THEN D=UTL_DIST(XC,YC,DFFM(I)%X,DFFM(I)%Y) IF(D.LT.TD)THEN TD=D; J=I ENDIF ENDIF ENDDO ENDDO ENDDO !## found something, if not increase search-box IF(J.NE.0)EXIT DRC=DRC+1 ENDDO !## reduce with one for next time DRC=DRC-1 PMANAGER_SAVEMF2005_DMM_GETXY=J END FUNCTION PMANAGER_SAVEMF2005_DMM_GETXY !###==================================================================== SUBROUTINE STOREDXC(DXCID,NCOL,NROW,NLAY,ILAY,IROW,ICOL,ID,IACT) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: NCOL,NROW,NLAY INTEGER,INTENT(INOUT) :: ID INTEGER,INTENT(IN) :: IACT INTEGER,INTENT(INOUT), DIMENSION(NCOL,NROW,NLAY) :: DXCID INTEGER,INTENT(IN) :: ILAY, IROW, ICOL IF(IACT.EQ.2) THEN ID=DXCID(ICOL,IROW,ILAY) RETURN END IF IF(DXCID(ICOL,IROW,ILAY).EQ.0) THEN DXCID(ICOL,IROW,ILAY)=1 ENDIF END SUBROUTINE STOREDXC !###==================================================================== SUBROUTINE GENIDDXC(DXCID,NCOL,NROW,NLAY,ID) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: NCOL,NROW,NLAY INTEGER,INTENT(OUT) :: ID INTEGER,INTENT(INOUT), DIMENSION(NCOL,NROW,NLAY) :: DXCID INTEGER :: ILAY, ICOL, IROW !## generate id's IF(PBMAN%IFORMAT.EQ.3)THEN !## use modflow-cell id for mf6 ID=0; DO ILAY=1,NLAY; DO IROW=1,NROW; DO ICOL=1,NCOL !## increase for ibound <> 0, modflow number is excluding inactive cells IF(BND(ILAY)%X(ICOL,IROW).NE.0.0D0)ID=ID+1 IF(DXCID(ICOL,IROW,ILAY).NE.0)THEN ! ID=(ILAY-1)*NROW*NCOL+(IROW-1)*NCOL+ICOL DXCID(ICOL,IROW,ILAY)=ID ENDIF ENDDO; ENDDO; ENDDO ELSE !## use unique id's ID=0 DO ILAY=1,NLAY; DO IROW=1,NROW; DO ICOL=1,NCOL IF(DXCID(ICOL,IROW,ILAY).NE.0)THEN ID=ID+1; DXCID(ICOL,IROW,ILAY)=ID ENDIF ENDDO; ENDDO; ENDDO ENDIF END SUBROUTINE !###==================================================================== SUBROUTINE WRITEDXC(IDXC,DXCID,NCOL,NROW,NLAY,NDXC) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IDXC,NCOL,NROW,NLAY,NDXC INTEGER,INTENT(IN), DIMENSION(NCOL,NROW,NLAY) :: DXCID INTEGER :: ICOL,IROW,ILAY,ID WRITE(IDXC,'(2I10)') NDXC,ICAPCB WRITE(IDXC,'(I10)') NDXC DO ILAY=1,NLAY; DO IROW=1,NROW; DO ICOL=1,NCOL ID=DXCID(ICOL,IROW,ILAY) IF(ID.NE.0)THEN IF(ID.LT.0)THEN WRITE(IDXC,*) -ILAY,IROW,ICOL,ABS(DXCID(ICOL,IROW,ILAY)) ELSE WRITE(IDXC,*) ILAY,IROW,ICOL,ABS(DXCID(ICOL,IROW,ILAY)) ENDIF ENDIF ENDDO; ENDDO; ENDDO IF(PBMAN%DMMFILE.EQ.1)THEN WRITE(IDXC,'(A)') 'DFLOWFM' ! WRITE(IDXC,'(A)') TRIM(ITOS(NDFLOWFMRIV1+NDFLOWFMRIV2))//','// & ! TRIM(ITOS(NDFLOWFMRIV1+NDFLOWFMRIV2))//','// & ! TRIM(ITOS(NDFLOWFMDRN1)) ENDIF IF(IDXC.GT.0)CLOSE(IDXC) END SUBROUTINE WRITEDXC !###==================================================================== SUBROUTINE METASWAP_METEGRID1(FNAME,FNAME2) !###==================================================================== IMPLICIT NONE INTEGER,PARAMETER :: NA=11 CHARACTER(LEN=1024) :: S CHARACTER(LEN=*),INTENT(IN) :: FNAME CHARACTER(LEN=*),INTENT(IN) :: FNAME2 INTEGER :: IU,JU,I,IOS CHARACTER(LEN=256), DIMENSION(11) :: SA CHARACTER(LEN=256) :: RUNDIR CHARACTER(LEN=8) :: FRM WRITE(FRM,'(A1,I2.2,A2)') '(',NA,'A)' CALL IOSDIRNAME(RUNDIR) IU=UTL_GETUNIT(); OPEN(IU,FILE=FNAME,STATUS='OLD',ACTION='READ') JU=UTL_GETUNIT(); OPEN(JU,FILE=FNAME2,STATUS='REPLACE',ACTION='WRITE') DO READ(IU,'(A1024)',IOSTAT=IOS) S; IF(IOS.NE.0)EXIT IF(LEN_TRIM(S).EQ.0)CYCLE !## initial value SA='NoValue' READ(S,*,IOSTAT=IOS)(SA(I),I=1,NA) CALL UTL_REL_TO_ABS(RUNDIR,SA(3)) CALL UTL_REL_TO_ABS(RUNDIR,SA(4)) DO I=3,NA; SA(I)='"'//TRIM(ADJUSTL(SA(I)))//'"'; END DO DO I=1,NA-1; SA(I)=TRIM(SA(I))//',' ; END DO WRITE(S,FRM)(TRIM(SA(I)),I=1,NA) WRITE(JU,'(A)') TRIM(S) ENDDO CLOSE(IU) CLOSE(JU) END SUBROUTINE METASWAP_METEGRID1 !###==================================================================== SUBROUTINE METASWAP_METEGRID2(DIRMSP) !###==================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIRMSP LOGICAL :: LEX REAL(KIND=DP_KIND) :: TD INTEGER :: IU,IY CHARACTER(LEN=256) :: PRECFNAME,ETFNAME !## inquire the existence of mete_grid.inp INQUIRE(FILE=TRIM(DIRMSP)//'\METE_GRID.INP',EXIST=LEX); IF(.NOT.LEX)RETURN !## open mete_grid.inp IU=UTL_GETUNIT() OPEN(IU,FILE=TRIM(DIRMSP)//'\METE_GRID.INP',STATUS='OLD',ACTION='READ') READ(IU,*) TD,IY,PRECFNAME,ETFNAME CLOSE(IU) !## create coupling tables CALL METASWAP_METEGRID_INP(PRECFNAME,TRIM(DIRMSP)//'\SVAT2PRECGRID.INP') CALL METASWAP_METEGRID_INP(ETFNAME, TRIM(DIRMSP)//'\SVAT2ETREFGRID.INP') END SUBROUTINE METASWAP_METEGRID2 !###==================================================================== SUBROUTINE METASWAP_METEGRID_INP(ASCIIFNAME,INPFNAME) !###==================================================================== IMPLICIT NONE INTEGER :: IU,A_NROW,A_NCOL,IROW,ICOL,IR1,IR2,IC1,IC2,NUND CHARACTER(LEN=*),INTENT(IN) :: ASCIIFNAME,INPFNAME REAL(KIND=DP_KIND) :: A_XLLC,A_YLLC,A_NODATA,A_CELLSIZE,IX,IY,ARND CHARACTER(LEN=52) :: TXT INTEGER,ALLOCATABLE,DIMENSION(:,:) :: PDELR,PDELC IF(ALLOCATED(PDELR))DEALLOCATE(PDELR) IF(ALLOCATED(PDELC))DEALLOCATE(PDELC) ALLOCATE(PDELR(2,PRJIDF%NCOL),PDELC(2,PRJIDF%NROW)) !## read header of ascii file IU=UTL_GETUNIT(); OPEN(IU,FILE=ASCIIFNAME,ACTION='READ',STATUS='OLD') READ(IU,*) TXT,A_NCOL READ(IU,*) TXT,A_NROW READ(IU,*) TXT,A_XLLC TXT=UTL_CAP(TXT,'U');IX=0.0D0; IF(TRIM(TXT).EQ.'XLLCENTER')IX=1.0D0 READ(IU,*) TXT,A_YLLC TXT=UTL_CAP(TXT,'U'); IY=0.0D0; IF(TRIM(TXT).EQ.'YLLCENTER')IY=1.0D0 READ(IU,*) TXT,A_CELLSIZE READ(IU,*) TXT,A_NODATA A_XLLC=A_XLLC-(IX*(A_CELLSIZE/2.0D0)); A_YLLC=A_YLLC-(IY*(A_CELLSIZE/2.0D0)) CLOSE(IU) CALL IMOD_UTL_SCALE1PDELRC(A_XLLC,A_YLLC,A_XLLC+(A_NCOL*A_CELLSIZE),A_YLLC+(A_NROW*A_CELLSIZE), & PRJIDF%SX,PRJIDF%SY,PDELR,PDELC,PRJIDF%NROW,PRJIDF%NCOL,A_CELLSIZE,A_NROW,A_NCOL,0,0,0) !## write koppeltabel IU=UTL_GETUNIT(); OPEN(IU,FILE=INPFNAME,ACTION='WRITE',STATUS='UNKNOWN') !## fill svat connection to recharge/et based upon svat-units NUND=0 DO IROW=1,PRJIDF%NROW DO ICOL=1,PRJIDF%NCOL !## rural area ARND=IDFGETAREA(PRJIDF,ICOL,IROW) ARND=ARND-SIMGRO(ICOL,IROW)%NOPP-SIMGRO(ICOL,IROW)%SOPP IF(SIMGRO(ICOL,IROW)%IBOUND.GT.0.AND.ARND.GT.0.0)THEN NUND =NUND+1 IR1=PDELC(1,IROW); IF(IR1.LT.0)IR1=PDELC(1,ABS(IR1)) IR2=PDELC(2,IROW); IF(IR2.LT.0)IR2=PDELC(2,ABS(IR2)) IC1=PDELR(1,ICOL); IF(IC1.LT.0)IC1=PDELR(1,ABS(IC1)) IC2=PDELR(2,ICOL); IF(IC2.LT.0)IC2=PDELR(2,ABS(IC2)) WRITE(IU,'(3I10,10X,2I10)') NUND,IR1,IC1,IR2,IC2 ENDIF !## urban area ARND=IDFGETAREA(PRJIDF,ICOL,IROW) ARND=MIN(ARND,SIMGRO(ICOL,IROW)%SOPP) IF(SIMGRO(ICOL,IROW)%IBOUND.GT.0.AND.ARND.GT.0.0)THEN NUND=NUND+1 IR1=PDELC(1,IROW); IF(IR1.LT.0)IR1=PDELC(1,ABS(IR1)) IR2=PDELC(2,IROW); IF(IR2.LT.0)IR2=PDELC(2,ABS(IR2)) IC1=PDELR(1,ICOL); IF(IC1.LT.0)IC1=PDELR(1,ABS(IC1)) IC2=PDELR(2,ICOL); IF(IC2.LT.0)IC2=PDELR(2,ABS(IC2)) WRITE(IU,'(3I10,10X,2I10)') NUND,IR1,IC1,IR2,IC2 ENDIF ENDDO ENDDO CLOSE(IU) IF(ALLOCATED(PDELR))DEALLOCATE(PDELR) IF(ALLOCATED(PDELC))DEALLOCATE(PDELC) END SUBROUTINE METASWAP_METEGRID_INP !###==================================================================== SUBROUTINE IMOD_UTL_SCALE1PDELRC(XMIN,YMIN,XMAX,YMAX,SXX,SYY,PDELR,PDELC,NROW,NCOL,CS,NROWIDF,NCOLIDF,IU,IEQ,ITB) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: NROW,NCOL,NROWIDF,NCOLIDF,IU,IEQ,ITB REAL(KIND=8),INTENT(IN) :: CS,XMIN,YMIN,XMAX,YMAX REAL(KIND=8),INTENT(IN),DIMENSION(0:NCOL) :: SXX REAL(KIND=8),INTENT(IN),DIMENSION(0:NROW) :: SYY REAL(KIND=8) :: DX,DY INTEGER,INTENT(OUT),DIMENSION(2,NCOL) :: PDELR INTEGER,INTENT(OUT),DIMENSION(2,NROW) :: PDELC INTEGER :: I,J,IREC CHARACTER(LEN=256) :: IDFNAME REAL(KIND=8),ALLOCATABLE,DIMENSION(:) :: DELRIDF,DELCIDF IF(XMIN.GT.SXX(0).OR.XMAX.LT.SXX(NCOL).OR.YMIN.GT.SYY(NROW).OR.YMAX.LT.SYY(0))THEN INQUIRE(UNIT=IU,NAME=IDFNAME) WRITE(*,'(A)') '=======================================' WRITE(*,'(A)') 'Warning!' WRITE(*,'(A)') 'File: '//TRIM(IDFNAME) WRITE(*,'(A)') 'Undersizes current model dimensions!' IF(XMIN.GT.SXX(0))THEN WRITE(*,'(A)') 'XMIN IDF '//TRIM(RTOS(XMIN,'F',2))//' > XMIN MODEL '//TRIM(RTOS(SXX(0),'F',2)) ENDIF IF(XMAX.LT.SXX(NCOL))THEN WRITE(*,'(A)') 'XMAX IDF '//TRIM(RTOS(XMAX,'F',2))//' < XMAX MODEL '//TRIM(RTOS(SXX(NCOL),'F',2)) ENDIF IF(YMIN.GT.SYY(NROW))THEN WRITE(*,'(A)') 'YMIN IDF '//TRIM(RTOS(YMIN,'F',2))//' > YMIN MODEL '//TRIM(RTOS(SYY(NROW),'F',2)) ENDIF IF(YMAX.LT.SYY(0))THEN WRITE(*,'(A)') 'YMAX IDF '//TRIM(RTOS(YMAX,'F',2))//' < YMAX MODEL '//TRIM(RTOS(SYY(0),'F',2)) ENDIF WRITE(*,'(A)') '=======================================' WRITE(*,'(A)') 'Error' ENDIF IF(ALLOCATED(DELRIDF))DEALLOCATE(DELRIDF) IF(ALLOCATED(DELCIDF))DEALLOCATE(DELCIDF) ALLOCATE(DELRIDF(0:NCOLIDF),DELCIDF(0:NROWIDF)) DELRIDF(0)=XMIN DELCIDF(0)=YMAX IF(IEQ.EQ.0)THEN DO I=1,NCOLIDF; DELRIDF(I)=XMIN+REAL(I)*CS; ENDDO DO I=1,NROWIDF; DELCIDF(I)=YMAX-REAL(I)*CS; ENDDO ELSEIF(IEQ.EQ.1)THEN IREC =10+ITB*2 DO I=1,NCOLIDF IREC=IREC+1 READ(IU,REC=IREC+ICF) DELRIDF(I) DELRIDF(I)=DELRIDF(I-1)+DELRIDF(I) END DO DO I=1,NROWIDF IREC=IREC+1 READ(IU,REC=IREC+ICF) DELCIDF(I) DELCIDF(I)=DELCIDF(I-1)-DELCIDF(I) END DO ENDIF !## start/end column direction DO I=1,NCOL CALL POL1LOCATE(DELRIDF,NCOLIDF+1,SXX(I-1),PDELR(1,I)) !## check whether position is exact equally J=PDELR(1,I) IF(J.LE.NCOLIDF)THEN IF(DELRIDF(J).EQ.SXX(I-1))PDELR(1,I)=PDELR(1,I)+1 ENDIF CALL POL1LOCATE(DELRIDF,NCOLIDF+1,SXX(I),PDELR(2,I)) PDELR(1,I)=MIN(PDELR(1,I),NCOLIDF) PDELR(2,I)=MIN(PDELR(2,I),NCOLIDF) ENDDO DO I=1,NROW CALL POL1LOCATE(DELCIDF,NROWIDF+1,SYY(I-1),PDELC(1,I)) CALL POL1LOCATE(DELCIDF,NROWIDF+1,SYY(I),PDELC(2,I)) !## check whether position is exact equally J=PDELC(2,I) IF(J.LE.NROWIDF)THEN IF(DELCIDF(J-1).EQ.SYY(I))PDELC(2,I)=PDELC(2,I)-1 ENDIF PDELC(1,I)=MIN(PDELC(1,I),NROWIDF) PDELC(2,I)=MIN(PDELC(2,I),NROWIDF) ENDDO IF(ALLOCATED(DELRIDF))DEALLOCATE(DELRIDF) IF(ALLOCATED(DELCIDF))DEALLOCATE(DELCIDF) DO I=1,NCOL IF(PDELR(2,I).LT.PDELR(1,I))then DX =(SXX(I-1)-XMIN)/CS PDELR(1,I)=INT(DX)+1 DX =(SXX(I)-XMIN)/CS PDELR(2,I)=INT(DX)+1 DX=SXX(I)-XMIN IF(MOD(DX,CS).EQ.0.0)PDELR(2,I)=PDELR(2,I)-1 WRITE(*,'(A)') 'PDELR(2,I).LT.PDELR(1,I)' ENDIF ENDDO DO I=1,NROW IF(PDELC(2,I).LT.PDELC(1,I))THEN DY=(YMAX-SYY(I-1))/CS PDELC(1,I)=INT(DY)+1 DY=(YMAX-SYY(I)) PDELC(2,I)=INT(DY)+1 DY=YMAX-SYY(I) IF(MOD(DY,CS).EQ.0.0)PDELC(2,I)=PDELC(2,I)-1 WRITE(*,'(A)') 'PDELC(2,I).LT.PDELC(1,I)' ENDIF ENDDO !## adjust pdelr/pdelc in case reading idf is coarser, then you don't need to read it in again, values will be copied in READCOPYVALUES_R() J=1 DO I=2,NCOL IF(PDELR(1,I).EQ.PDELR(1,J).AND. & PDELR(2,I).EQ.PDELR(2,J))THEN PDELR(1,I)=-J PDELR(2,I)=-J ELSE J=I ENDIF END DO J=1 DO I=2,NROW IF(PDELC(1,I).EQ.PDELC(1,J).AND. & PDELC(2,I).EQ.PDELC(2,J))THEN PDELC(1,I)=-J PDELC(2,I)=-J ELSE J=I ENDIF END DO END SUBROUTINE IMOD_UTL_SCALE1PDELRC !###==================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_MSP_CHECK(NODATA,IBATCH) !###==================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),DIMENSION(:),INTENT(IN) :: NODATA INTEGER,INTENT(IN) :: IBATCH INTEGER,DIMENSION(:),ALLOCATABLE :: IERROR INTEGER :: IROW,ICOL,STRLEN,JROW,JCOL,LYBE,TYBE,BEREGENID,L,L1,L2,IL,ILAY,N LOGICAL :: LYESNO REAL(KIND=DP_KIND) :: DXY,ARND,X,Y,KDCRIT CHARACTER(LEN=:),ALLOCATABLE :: STR CHARACTER(LEN=1) :: CYESNO PMANAGER_SAVEMF2005_MSP_CHECK=.FALSE. !## inactivate constant head boundaries and inactive nodes DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL !## skip this location anyhow if simgro-ibound = 0 IF(SIMGRO(ICOL,IROW)%IBOUND.EQ.0)CYCLE !## loop for appropriate modellayer DO ILAY=1,PRJNLAY IF(BND(ILAY)%X(ICOL,IROW).GT.0.0D0)THEN SIMGRO(ICOL,IROW)%IBOUND=ILAY; EXIT ENDIF ENDDO IF(ILAY.GT.PRJNLAY)SIMGRO(ICOL,IROW)%IBOUND=0 ! IF(BND(1)%X(ICOL,IROW).LE.0.0D0)SIMGRO(ICOL,IROW)%IBOUND=0 ENDDO; ENDDO IF(PBMAN%FLEXD.EQ.1)THEN DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(SIMGRO(ICOL,IROW)%PDL.EQ.NODATA(25))SIMGRO(ICOL,IROW)%PDR=NODATA(26) IF(SIMGRO(ICOL,IROW)%PDR.EQ.NODATA(26))SIMGRO(ICOL,IROW)%PDL=NODATA(25) ENDDO; ENDDO ENDIF !## make sure that for sopp>0 there is a vxmu value, turn nopp otherwise off DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(SIMGRO(ICOL,IROW)%VXMU_SOPP.EQ.NODATA(12))SIMGRO(ICOL,IROW)%SOPP=0.0D0 IF(SIMGRO(ICOL,IROW)%SOPP.GT.0.0D0)THEN IF(SIMGRO(ICOL,IROW)%VXMU_SOPP .EQ.NODATA(12))SIMGRO(ICOL,IROW)%SOPP=0.0D0 IF(SIMGRO(ICOL,IROW)%CRUNOFF_SOPP .EQ.NODATA(14))SIMGRO(ICOL,IROW)%SOPP=0.0D0 IF(SIMGRO(ICOL,IROW)%CRUNON_SOPP .EQ.NODATA(16))SIMGRO(ICOL,IROW)%SOPP=0.0D0 IF(SIMGRO(ICOL,IROW)%QINFBASIC_SOPP.EQ.NODATA(18))SIMGRO(ICOL,IROW)%SOPP=0.0D0 ENDIF DXY=IDFGETAREA(PRJIDF,ICOL,IROW) IF(SIMGRO(ICOL,IROW)%VXMU_ROPP.EQ.NODATA(13))SIMGRO(ICOL,IROW)%NOPP=DXY !## surface water, no metaswap ARND=DXY-SIMGRO(ICOL,IROW)%NOPP-SIMGRO(ICOL,IROW)%SOPP !## rural area IF(ARND.GT.0.0D0)THEN IF(SIMGRO(ICOL,IROW)%VXMU_ROPP .EQ.NODATA(13))SIMGRO(ICOL,IROW)%NOPP=ARND !## surface water, no metaswap IF(SIMGRO(ICOL,IROW)%CRUNOFF_ROPP .EQ.NODATA(15))SIMGRO(ICOL,IROW)%NOPP=ARND !## surface water, no metaswap IF(SIMGRO(ICOL,IROW)%CRUNON_ROPP .EQ.NODATA(17))SIMGRO(ICOL,IROW)%NOPP=ARND !## surface water, no metaswap IF(SIMGRO(ICOL,IROW)%QINFBASIC_ROPP.EQ.NODATA(19))SIMGRO(ICOL,IROW)%NOPP=ARND !## surface water, no metaswap ENDIF ENDDO; ENDDO !## check input ALLOCATE(IERROR(26)); IERROR=0 DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(SIMGRO(ICOL,IROW)%IBOUND.GT.0)THEN IF(SIMGRO(ICOL,IROW)%LGN.EQ.NODATA(2)) IERROR(2) =IERROR(2)+1 IF(SIMGRO(ICOL,IROW)%RZ.EQ.NODATA(3)) IERROR(3) =IERROR(3)+1 IF(SIMGRO(ICOL,IROW)%BODEM.EQ.NODATA(4)) IERROR(4) =IERROR(4)+1 IF(SIMGRO(ICOL,IROW)%METEO.EQ.NODATA(5)) IERROR(5) =IERROR(5)+1 IF(SIMGRO(ICOL,IROW)%MV.EQ.NODATA(6)) IERROR(6) =IERROR(6)+1 IF(SIMGRO(ICOL,IROW)%BEREGEN.EQ.NODATA(7)) IERROR(7) =IERROR(7)+1 IF(PBMAN%IARMWP.EQ.0)THEN IF(SIMGRO(ICOL,IROW)%BER_LAAG.EQ.NODATA(8)) IERROR(8) =IERROR(8)+1 IF(SIMGRO(ICOL,IROW)%BEREGEN_Q.EQ.NODATA(9)) IERROR(9) =IERROR(9)+1 ENDIF IF(SIMGRO(ICOL,IROW)%NOPP.EQ.NODATA(10)) IERROR(10)=IERROR(10)+1 IF(SIMGRO(ICOL,IROW)%SOPP.EQ.NODATA(11)) IERROR(11)=IERROR(11)+1 IF(SIMGRO(ICOL,IROW)%VXMU_ROPP.EQ.NODATA(13)) IERROR(13)=IERROR(13)+1 IF(SIMGRO(ICOL,IROW)%CRUNOFF_SOPP.EQ.NODATA(14)) IERROR(14)=IERROR(14)+1 IF(SIMGRO(ICOL,IROW)%SOPP.GT.0)THEN IF(SIMGRO(ICOL,IROW)%VXMU_SOPP.EQ.NODATA(12)) IERROR(12)=IERROR(12)+1 IF(SIMGRO(ICOL,IROW)%CRUNON_SOPP.EQ.NODATA(16)) IERROR(16)=IERROR(16)+1 IF(SIMGRO(ICOL,IROW)%QINFBASIC_SOPP.EQ.NODATA(18))IERROR(18)=IERROR(18)+1 ENDIF IF(SIMGRO(ICOL,IROW)%CRUNOFF_ROPP.EQ.NODATA(15)) IERROR(15)=IERROR(15)+1 IF(SIMGRO(ICOL,IROW)%CRUNON_ROPP.EQ.NODATA(17)) IERROR(17)=IERROR(17)+1 IF(SIMGRO(ICOL,IROW)%QINFBASIC_ROPP.EQ.NODATA(19))IERROR(19)=IERROR(19)+1 IF(TOPICS(TPWT)%IACT_MODEL.EQ.1)THEN ! IF(SIMGRO(ICOL,IROW)%PWT_LEVEL.EQ.NODATA(20)) IERROR(20)=IERROR(20)+1 <--- nodata is niet erg, is er geen PWT aanwezig ENDIF IF(SIMGRO(ICOL,IROW)%MOISTURE.EQ.NODATA(21)) IERROR(21)=IERROR(21)+1 IF(SIMGRO(ICOL,IROW)%COND.EQ.NODATA(22)) IERROR(22)=IERROR(22)+1 ENDIF ! !## check whether drainageinformation is given for level-controlled drainage ! IF(PBMAN%FLEXD.EQ.1)THEN ! IF(SIMGRO(ICOL,IROW)%PLN.NE.NODATA(23))THEN ! IF(SIMGRO(ICOL,IROW)%PDL.EQ.NODATA(25)) IERROR(25)=IERROR(25)+1 ! IF(SIMGRO(ICOL,IROW)%PDR.EQ.NODATA(26)) IERROR(26)=IERROR(26)+1 ! ELSE ! SIMGRO(ICOL,IROW)%PLN=0 ! ENDIF ! ENDIF ENDDO; ENDDO !## error in data IF(SUM(IERROR).GT.0)THEN IF(PBMAN%FLEXD.EQ.1)THEN; STRLEN=22*30; ELSE; STRLEN=26*30; ENDIF ALLOCATE(CHARACTER(LEN=STRLEN) :: STR) STR='NodataValues on active modelcells found in :'//NEWLINE// & '- Landuse '//TRIM(ITOS(IERROR(2)))//NEWLINE// & '- Rootzone '//TRIM(ITOS(IERROR(3)))//NEWLINE// & '- Soil Types '//TRIM(ITOS(IERROR(4)))//NEWLINE// & '- Meteo Stations '//TRIM(ITOS(IERROR(5)))//NEWLINE// & '- Surface Level '//TRIM(ITOS(IERROR(6)))//NEWLINE// & '- Art. Recharge '//TRIM(ITOS(IERROR(7)))//NEWLINE// & '- Art. Rch. Layer '//TRIM(ITOS(IERROR(8)))//NEWLINE// & '- Art. Rch. Strength'//TRIM(ITOS(IERROR(9)))//NEWLINE// & '- Wetted Area '//TRIM(ITOS(IERROR(10)))//NEWLINE// & '- Surf. Urban Area '//TRIM(ITOS(IERROR(11)))//NEWLINE// & '- VXMU SOPP '//TRIM(ITOS(IERROR(12)))//NEWLINE// & '- VXMU ROPP '//TRIM(ITOS(IERROR(13)))//NEWLINE// & '- CRUNOFF SOPP '//TRIM(ITOS(IERROR(14)))//NEWLINE// & '- CRUNOFF ROPP '//TRIM(ITOS(IERROR(15)))//NEWLINE// & '- CRUNON SOPP '//TRIM(ITOS(IERROR(16)))//NEWLINE// & '- CRUNON ROPP '//TRIM(ITOS(IERROR(17)))//NEWLINE// & '- QINFBASIS SOPP '//TRIM(ITOS(IERROR(18)))//NEWLINE// & '- QINFBASIS ROPP '//TRIM(ITOS(IERROR(19)))//NEWLINE// & ! '- Pondingdepth '//TRIM(ITOS(IERROR(12))),1) !! IF(LPWT)CALL PRINTTEXT('- PWT Level '//TRIM(ITOS(IERROR(20))),1) '- Moisture Factor '//TRIM(ITOS(IERROR(21)))//NEWLINE// & '- Conductivity '//TRIM(ITOS(IERROR(22))) IF(PBMAN%FLEXD.EQ.1)THEN STR=TRIM(STR)//NEWLINE// & '- Plot Number '//TRIM(ITOS(IERROR(23)))//NEWLINE// & '- Drainage Level '//TRIM(ITOS(IERROR(25)))//NEWLINE// & '- Drainage Resist.'//TRIM(ITOS(IERROR(26))) ENDIF STR=TRIM(STR)//NEWLINE//'Process stopped!' CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,TRIM(STR),'Error') DEALLOCATE(STR,IERROR); RETURN ENDIF ! !## change surface water into gras; change urban into gras ! DO IROW=1,PRJIDF%NROW ! DO ICOL=1,PRJIDF%NCOL ! SELECT CASE (SIMGRO(ICOL,IROW)%LGN) ! CASE (8,18:21,23:26) ! SIMGRO(ICOL,IROW)%LGN=1 ! CASE (22) ! SIMGRO(ICOL,IROW)%LGN=12 ! CASE (:0,45:) ! SIMGRO(ICOL,IROW)%LGN=1 ! END SELECT ! ENDDO ! ENDDO !## minimale beworteling DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(SIMGRO(ICOL,IROW)%RZ.LT.10.0D0)SIMGRO(ICOL,IROW)%RZ=10.0D0 ENDDO; ENDDO !## minimal nopp-value DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL SIMGRO(ICOL,IROW)%NOPP=MAX(0.0D0,SIMGRO(ICOL,IROW)%NOPP) !## minimal sopp-value SIMGRO(ICOL,IROW)%SOPP=MAX(0.0D0,SIMGRO(ICOL,IROW)%SOPP) ENDDO; ENDDO ! !## bodem 22/23 vertalen naar 9 -> 22 (stedelijk zand?)/23(geen bodem; stad) -> zand ! DO IROW=1,PRJIDF%NROW ! DO ICOL=1,PRJIDF%NCOL ! SELECT CASE (SIMGRO(ICOL,IROW)%BODEM) ! CASE (23,22) ! SIMGRO(ICOL,IROW)%BODEM=9 ! END SELECT ! !## kies bodem 22 for lgn stedelijk gebied ! SELECT CASE (SIMGRO(ICOL,IROW)%LGN) ! CASE (18,25) !! SIMGRO(ICOL,IROW)%BODEM=22 ! END SELECT ! ENDDO ! ENDDO IF(PBMAN%IFORMAT.EQ.3)THEN !## search for correct layer for artificial recharge, if this one is removed due to zero thickness N=0; LYESNO=.FALSE. DO IROW=1,PRJIDF%NROW DO ICOL=1,PRJIDF%NCOL IF(SIMGRO(ICOL,IROW)%IBOUND.EQ.0)CYCLE !## BEGIN scap_svat.inp - grondwater + ow TYBE=0 IF(PBMAN%IARMWP.EQ.0)THEN LYBE=SIMGRO(ICOL,IROW)%BER_LAAG TYBE=SIMGRO(ICOL,IROW)%BEREGEN JCOL=ICOL; JROW=IROW ELSE JCOL=0; JROW=0 BEREGENID=INT(SIMGRO(ICOL,IROW)%BEREGEN) IF(BEREGENID.GT.0.AND.BEREGENID.LE.SIZE(IPFMSP))THEN LYBE=IPFMSP(BEREGENID)%ILAY IF(LYBE.GT.0.AND.LYBE.LE.PRJNLAY)THEN TYBE=1 !## groundwater CALL IDFIROWICOL(PRJIDF,JROW,JCOL,IPFMSP(BEREGENID)%X,IPFMSP(BEREGENID)%Y) ENDIF ENDIF ENDIF !## not from groundwater, skip checking IF(TYBE.NE.1)CYCLE IF(BND(LYBE)%X(JCOL,JROW).EQ.0)THEN IF(.NOT.LYESNO)THEN IF(IBATCH.EQ.0)THEN CALL WMESSAGEBOX(YESNO,COMMONNO,QUESTIONICON,'iMOD found inactive cell (icol='//TRIM(ITOS(JCOL))//',irow='//TRIM(ITOS(JROW))//') '// & 'for MetaSWAP well, would you like to continue and let iMOD put the well in an appropriate modellayer (1st layer with k>0.1m/d) ?', & 'Question') CYESNO='N'; IF(WINFODIALOG(4).EQ.1)CYESNO='Y' ELSE WRITE(*,'(/A$)') 'iMOD found inactive cell (icol='//TRIM(ITOS(JCOL))//',irow='//TRIM(ITOS(JROW))//') for MetaSWAP well, would '// & 'you like to continue and let iMOD put the well in an appropriate modellayer (1st layer with k>0.1m/d) (Y/N) ?' READ(*,'(A1)') CYESNO ENDIF IF(UTL_CAP(CYESNO,'U').EQ.'N')THEN IF(IBATCH.EQ.0)RETURN; IF(IBATCH.EQ.1)STOP ENDIF LYESNO=.TRUE. ENDIF !## skip permeability < 0.1 L1=MIN(PRJNLAY,LYBE+1); L2=PRJNLAY; IL=1; KDCRIT=0.1D0 DO I=1,4 DO L=L1,L2,IL IF(BND(L)%X(JCOL,JROW).NE.0.0D0.AND.KDW(L)%X(JCOL,JROW).GT.KDCRIT)EXIT ENDDO SELECT CASE (I) CASE (1) !## found layer beneath IF(L.LE.PRJNLAY)EXIT; L1=MAX(1,LYBE-1) ; L2=1 ; IL=-1 CASE (2) !## find layer above IF(L.GE.1)EXIT; L1=MIN(PRJNLAY,LYBE+1); L2=PRJNLAY; IL=1; KDCRIT=0.0D0 CASE (3) !## found layer beneath IF(L.LE.PRJNLAY)EXIT; L1=MAX(1,LYBE-1) ; L2=1 ; IL=-1 CASE DEFAULT !## find layer above IF(L.GE.1)EXIT ! IF(IBATCH.EQ.0)THEN ! CALL WMESSAGEBOX(YESNO,COMMONNO,QUESTIONICON,'iMOD cannot position MetaSWAP well appropriately for location'//CHAR(13)// & ! 'icol='//TRIM(ITOS(JCOL))//' and irow='//TRIM(ITOS(JROW)),'Error'); RETURN ! ELSE WRITE(*,'(/A)') 'iMOD cannot position MetaSWAP well appropriately for location' WRITE(*,'(A/)') 'icol='//TRIM(ITOS(JCOL))//' and irow='//TRIM(ITOS(JROW)) ! STOP ! ENDIF END SELECT ENDDO !## found new modellayer N=N+1; IF(N.EQ.1)THEN WRITE(*,'(/A)') 'Re-positioning of MetaSWAP Artificial Wells' WRITE(*,'(5A10)') 'Number','Old Layer','New Layer','Column','Row' ENDIF WRITE(*,'(5I10)') N,LYBE,L,JCOL,JROW LYBE=L !## store corrected layers IF(PBMAN%IARMWP.EQ.0)THEN SIMGRO(ICOL,IROW)%BER_LAAG=LYBE ELSE IPFMSP(BEREGENID)%ILAY=LYBE ENDIF ENDIF ENDDO ENDDO ENDIF IF(PBMAN%IARMWP.EQ.0)THEN !## turn off beregening whenever layer is zero! DO IROW=1,PRJIDF%NROW DO ICOL=1,PRJIDF%NCOL !## maximal artificial recharge layer is PRJNLAY SIMGRO(ICOL,IROW)%BER_LAAG=MIN(SIMGRO(ICOL,IROW)%BER_LAAG,PRJNLAY) IF(SIMGRO(ICOL,IROW)%BEREGEN.NE.0.AND.SIMGRO(ICOL,IROW)%BER_LAAG.EQ.0)SIMGRO(ICOL,IROW)%BEREGEN=0 ENDDO ENDDO ENDIF DEALLOCATE(IERROR) PMANAGER_SAVEMF2005_MSP_CHECK=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_MSP_CHECK !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_COMBINE(DIR,DIRNAME,PCK,CB,CAUX) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRNAME,CAUX INTEGER,INTENT(IN) :: CB CHARACTER(LEN=*),INTENT(IN),DIMENSION(:) :: PCK INTEGER,DIMENSION(4) :: IU INTEGER,DIMENSION(3) :: JU,NO,NO_PREV CHARACTER(LEN=256),DIMENSION(3) :: FNAME,FNAME_PREV CHARACTER(LEN=1) :: TXT INTEGER :: I,J,IPER,IROW,ICOL,ILAY,INEAREST,N,DRC,MSYS,ISYS,IOS REAL(KIND=DP_KIND) :: XC,YC,X1,X2,X3,X4 LOGICAL :: LEX PMANAGER_SAVEMF2005_COMBINE=.FALSE. DRC=1 IU=0 ! IF(PBMAN%DMMFILE.EQ.1)THEN ! IF(TRIM(PCK(2)).EQ.'RIV')THEN ! NDFLOWFMRIV1=0; NDFLOWFMRIV2=0 ! ENDIF ! IF(TRIM(PCK(2)).EQ.'DRN')NDFLOWFMDRN1=0 ! ENDIF !## create coupling table IF(PBMAN%DMMFILE.EQ.1)THEN !## read existing dflowfm points CALL PMANAGER_SAVEMF2005_READ_DFFMPOINTS(DIR(:INDEX(DIR,'\',.TRUE.)-1)) !## for river en drain IF(TRIM(PCK(2)).EQ.'RIV')LINE=DIR(:INDEX(DIR,'\',.TRUE.)-1)//'\MFRIV2TODFM1D_Q.DMM' IF(TRIM(PCK(2)).EQ.'DRN')LINE=DIR(:INDEX(DIR,'\',.TRUE.)-1)//'\MFDRNTODFM1D_Q.DMM' IU(4)=UTL_GETUNIT(); CALL OSD_OPEN(IU(4),FILE=LINE,STATUS='UNKNOWN',ACTION='WRITE') WRITE(IU(4),'(3A15)') 'FM-X','FM-Y',TRIM(PCK(2)) ENDIF !## read from files (if existing) DO I=1,SIZE(PCK) LINE=TRIM(DIRNAME)//'.'//TRIM(PCK(I))//'7' IF(I.LE.2)THEN INQUIRE(FILE=LINE,EXIST=LEX) IF(TRIM(PCK(2)).EQ.'DRN')THEN IF(I.EQ.1.AND.TOPICS(TOLF)%IACT_MODEL.EQ.0)LEX=.FALSE. IF(I.EQ.2.AND.TOPICS(TDRN)%IACT_MODEL.EQ.0)LEX=.FALSE. ELSE IF(I.EQ.1.AND.TOPICS(TISG)%IACT_MODEL.EQ.0)LEX=.FALSE. IF(I.EQ.2.AND.TOPICS(TRIV)%IACT_MODEL.EQ.0)LEX=.FALSE. ENDIF IF(LEX)THEN IU(I)=UTL_GETUNIT(); CALL OSD_OPEN(IU(I),FILE=LINE,STATUS='OLD',ACTION='READ') ENDIF ELSE !## write to file IF(IU(1).GT.0)THEN IU(I)=UTL_GETUNIT(); CALL OSD_OPEN(IU(I),FILE=LINE,STATUS='UNKNOWN',ACTION='WRITE') ENDIF ENDIF ENDDO NO=0; DO I=1,2; IF(IU(I).GT.0)READ(IU(I),*) NO(I); ENDDO IF(IU(3).GT.0)THEN LINE=TRIM(ITOS(SUM(NO)))//','//TRIM(ITOS(CB))//' '//TRIM(CAUX) WRITE(IU(3),'(A)') TRIM(LINE) ENDIF N=0; NO_PREV=0; DO IPER=1,PRJNPER MSYS=0 NO=0; DO I=1,2 IF(IU(I).GT.0)THEN READ(IU(I),*) NO(I) ELSE NO(I)=-1 ENDIF ENDDO !## use previous timestep for both IF(NO(1).EQ.-1.AND.NO(2).EQ.-1)THEN IF(IU(3).GT.0)WRITE(IU(3),'(I2)') -1; CYCLE ENDIF FNAME='' !## reuse previous values DO I=1,2 IF(NO(I).LT.0)THEN; NO(I)=NO_PREV(I); FNAME(I)=FNAME_PREV(I); ENDIF ENDDO ! IF(PBMAN%DMMFILE.EQ.1)THEN ! IF(TRIM(PCK(1)).EQ.'ISG')THEN ! NDFLOWFMRIV1=MAX(NDFLOWFMRIV1,NO(1)) ! NDFLOWFMRIV2=MAX(NDFLOWFMRIV2,NO(2)) ! ELSE ! NDFLOWFMDRN1=MAX(NDFLOWFMDRN1,SUM(NO)) ! ENDIF ! ENDIF IF(IU(3).GT.0)THEN LINE=TRIM(ITOS(SUM(NO))) WRITE(IU(3),'(A)') TRIM(LINE) ENDIF JU=0 DO I=1,2 !## refresh external filename IF(NO(I).GT.0)THEN IF(LEN_TRIM(FNAME(I)).EQ.0)THEN READ(IU(I),'(11X,A)') FNAME(I) FNAME(I)=UTL_CAP(FNAME(I),'U') J=INDEX(FNAME(I),'.ARR',.TRUE.)-1 FNAME(I)=DIR(:INDEX(DIR,'\',.TRUE.)-1)//TRIM(FNAME(I)(2:J))//'.ARR' FNAME(I)=UTL_CAP(FNAME(I),'U') ENDIF JU(I)=UTL_GETUNIT(); CALL OSD_OPEN(JU(I),FILE=FNAME(I),STATUS='OLD',ACTION='READ') ENDIF ENDDO !## create (new) output file IF(IU(3).GT.0)THEN FNAME(3)=TRIM(DIR)//'\'// TRIM(PCK(2))//'7\'//TRIM(PCK(2))//'_T'//TRIM(ITOS(IPER))//'_NEW.ARR' FNAME(3)=UTL_CAP(FNAME(3),'U') !## append to existing file, create new file otherwise JU(3)=UTL_GETUNIT() IF(FNAME(3).EQ.FNAME(2))THEN; FNAME(3)=TRIM(FNAME(3))//'_'; ENDIF CALL UTL_CREATEDIR(FNAME(3)(:INDEX(FNAME(3),'\',.TRUE.)-1)) CALL OSD_OPEN(JU(3),FILE=FNAME(3),STATUS='UNKNOWN',ACTION='WRITE') ENDIF !## copy ISG / SOF part IF(JU(1).GT.0)THEN DO I=1,NO(1) READ(JU(1),'(A256)') LINE IF(JU(3).GT.0)WRITE(JU(3),'(A)') TRIM(LINE) IF(TRIM(PCK(2)).EQ.'DRN')READ(LINE,*,IOSTAT=IOS) ILAY,IROW,ICOL,X1,X2,ISYS IF(TRIM(PCK(2)).EQ.'RIV')THEN IF(PBMAN%INFFCT.EQ.1)THEN READ(LINE,*,IOSTAT=IOS) ILAY,IROW,ICOL,X1,X2,X3,ISYS,TXT ELSE READ(LINE,*,IOSTAT=IOS) ILAY,IROW,ICOL,X1,X2,X3,X4,ISYS ENDIF ENDIF IF(IOS.NE.0)THEN WRITE(*,'(/A)') 'ERROR READING LINE '//TRIM(ITOS(I))//' OUT OF '//TRIM(ITOS(NO(2))) WRITE(*,'(A)') 'FROM FILE '//TRIM(FNAME(1)) WRITE(*,'(A)') '>>> '//TRIM(LINE)//' <<<' STOP ENDIF MSYS=MAX(MSYS,ISYS) IF(IPER.EQ.1.AND.PBMAN%DMMFILE.EQ.1.AND.TRIM(PCK(2)).EQ.'DRN')THEN ! READ(LINE,*) ILAY,IROW,ICOL CALL IDFGETLOC(PRJIDF,IROW,ICOL,XC,YC) INEAREST=PMANAGER_SAVEMF2005_DMM_GETXY(XC,YC,.TRUE.,DRC) !## write nearest coupling location IF(INEAREST.NE.0)THEN WRITE(IU(4),'(2F15.3,I15)') DFFM(INEAREST)%X,DFFM(INEAREST)%Y,I; N=N+1 WRITE(*,'(3I10)') I,NO(1),DRC ENDIF ENDIF ENDDO !## remove olf/isg stuff CLOSE(JU(1)) !,STATUS='DELETE') ENDIF !## copy RIV / DRN part IF(JU(2).GT.0)THEN DO I=1,NO(2) READ(JU(2),'(A256)') LINE IF(TRIM(PCK(2)).EQ.'DRN')READ(LINE,*,IOSTAT=IOS) ILAY,IROW,ICOL,X1,X2,ISYS IF(TRIM(PCK(2)).EQ.'RIV')THEN IF(PBMAN%INFFCT.EQ.1)THEN READ(LINE,*,IOSTAT=IOS) ILAY,IROW,ICOL,X1,X2,X3,ISYS,TXT ELSE READ(LINE,*,IOSTAT=IOS) ILAY,IROW,ICOL,X1,X2,X3,X4,ISYS ENDIF ENDIF IF(IOS.NE.0)THEN WRITE(*,'(/A)') 'ERROR READING LINE '//TRIM(ITOS(I))//' OUT OF '//TRIM(ITOS(NO(2))) WRITE(*,'(A)') 'FROM FILE '//TRIM(FNAME(2)) WRITE(*,'(A)') '>>> '//TRIM(LINE)//' <<<' STOP ENDIF !## increase system numbers ISYS=ISYS+MSYS; IF(PBMAN%SSYSTEM.EQ.1)ISYS=1 IF(JU(3).GT.0)THEN IF(TRIM(PCK(2)).EQ.'DRN')WRITE(JU(3),'(3(I5,1X),2(G15.7,1X),I5)') ILAY,IROW,ICOL,X1,X2,ISYS IF(TRIM(PCK(2)).EQ.'RIV')THEN IF(PBMAN%INFFCT.EQ.1)THEN WRITE(JU(3),'(3(I5,1X),3(G15.7,1X),I5,1X,A)') ILAY,IROW,ICOL,X1,X2,X3,ISYS,TXT ELSE WRITE(JU(3),'(3(I5,1X),4(G15.7,1X),I5)') ILAY,IROW,ICOL,X1,X2,X3,X4,ISYS ENDIF ENDIF ENDIF IF(IPER.EQ.1.AND.PBMAN%DMMFILE.EQ.1)THEN CALL IDFGETLOC(PRJIDF,IROW,ICOL,XC,YC) INEAREST=PMANAGER_SAVEMF2005_DMM_GETXY(XC,YC,.TRUE.,DRC) !## write nearest coupling location IF(INEAREST.GT.0)THEN WRITE(IU(4),'(2F15.3,I15)') DFFM(INEAREST)%X,DFFM(INEAREST)%Y,NO(1)+I; N=N+1 ENDIF ENDIF ENDDO CLOSE(JU(2)) ENDIF !## add iMOD header at the bottom IF(PBMAN%IFORMAT.EQ.2.AND.JU(3).GT.0)CALL IDFWRITEFREE_HEADER(JU(3),BND(1)) IF(JU(3).GT.0)THEN CLOSE(JU(3)) J=LEN_TRIM(FNAME(3)) IF(FNAME(3)(J:J).EQ.'_')THEN FNAME(3)(J:J)=' ' INQUIRE(FILE=FNAME(3),EXIST=LEX); IF(LEX)CALL IOSDELETEFILE(FNAME(3)) CALL IOSRENAMEFILE(TRIM(FNAME(3))//'_',FNAME(3)) ENDIF ENDIF IF(IU(3).GT.0)THEN LINE=FNAME(3); DO J=1,3; LINE=LINE(:INDEX(LINE,'\',.TRUE.)-1); ENDDO J=LEN_TRIM(LINE); LINE='.'//FNAME(3)(J+1:) IF(SUM(NO).GT.0)WRITE(IU(3),'(A)') 'OPEN/CLOSE '//TRIM(LINE)//' 1.0D0 (FREE) -1' ENDIF DO I=1,2; NO_PREV(I)=NO(I); FNAME_PREV(I)=FNAME(I); ENDDO ENDDO IF(IU(3).GT.0)THEN IF(IU(1).GT.0)CLOSE(IU(1)) IF(IU(2).GT.0)CLOSE(IU(2)) CLOSE(IU(3)) !## rename file FNAME(1)=TRIM(DIRNAME)//'.'//TRIM(PCK(3))//'7' FNAME(2)=TRIM(DIRNAME)//'.'//TRIM(PCK(2))//'7' INQUIRE(FILE=FNAME(2),EXIST=LEX) IF(LEX)CALL IOSDELETEFILE(FNAME(2)) CALL IOSRENAMEFILE(FNAME(1),FNAME(2)) ELSE IF(IU(1).GT.0)CLOSE(IU(1)) IF(IU(2).GT.0)CLOSE(IU(2)) ENDIF IF(IU(4).GT.0)THEN IF(N.EQ.0)THEN; CLOSE(IU(4)) ELSE; CLOSE(IU(4)); ENDIF ENDIF IF(PBMAN%DMMFILE.EQ.1)THEN CALL PMANAGER_SAVEMF2005_DEALL_DFFMGRID() DEALLOCATE(DFFM) ENDIF PMANAGER_SAVEMF2005_COMBINE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_COMBINE !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_SETICELLTYPE(DIR,DIRMNAME,M,PCK) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME INTEGER,INTENT(IN) :: M CHARACTER(LEN=*),INTENT(IN),DIMENSION(:) :: PCK INTEGER :: I,II,IU,JU,KU,IOS,ILAY,JLAY,IROW,ICOL,N1,N2 REAL(KIND=DP_KIND) :: WP,COND,BH CHARACTER(LEN=256) :: FNAME,MDLNAME CHARACTER(LEN=12) :: TXT PMANAGER_SAVEMF2005_SETICELLTYPE=.TRUE.; IF(PBMAN%IFORMAT.NE.3)RETURN DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE IF(LAYCON(ILAY).NE.1)EXIT ENDDO IF(ILAY.GT.SIZE(PBMAN%ILAY))RETURN PMANAGER_SAVEMF2005_SETICELLTYPE=.FALSE. !## write *.nam file(s) N1=1; N2=1 IF(PBMAN%IPESTP.EQ.1)THEN IF(PEST%PE_MXITER.LT.0)THEN N1=-1; N2=N1 ELSE N1=-PBMAN%NLAMBDASEARCH; N2=SIZE(PEST%PARAM) ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN N1=1; N2=PEST%NREALS ENDIF MDLNAME=DIRMNAME(INDEX(DIRMNAME,'\',.TRUE.)+1:); MDLNAME=UTL_CAP(MDLNAME,'U') !## read nam-file(s) DO II=N1,N2 !## skip zero IF(II.EQ.0)CYCLE KU=UTL_GETUNIT() IF(PBMAN%IPESTP+PBMAN%IIES.EQ.0)THEN FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(M))//'\'//TRIM(MDLNAME)//'.NAM' ELSEIF(PBMAN%IPESTP.EQ.1)THEN IF(II.GT.0)THEN IF(PEST%PARAM(II)%PACT.EQ.0.OR.PEST%PARAM(II)%PIGROUP.LT.0)CYCLE FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(M))//'\'//TRIM(MDLNAME)//'_P#'//TRIM(ITOS(II))//'.NAM' ELSE FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(M))//'\'//TRIM(MDLNAME)//'_L#'//TRIM(ITOS(ABS(II)))//'.NAM' ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(M))//'\'//TRIM(MDLNAME)//'_R#'//TRIM(ITOS(ABS(II)))//'.NAM' ENDIF !## read from ARR-files if existing KU=UTL_GETUNIT(); CALL OSD_OPEN(KU,FILE=FNAME,STATUS='OLD',ACTION='READ',FORM='FORMATTED'); IF(KU.EQ.0)RETURN !## read arr files with icell-types DO ILAY=1,PRJNLAY IF(LAYCON(ILAY).NE.1)THEN IF(.NOT.IPEST_GLM_READ_ARRFILE(TRIM(DIR)//'\GWF_'//TRIM(ITOS(M))//'\MODELINPUT\NPF6\ICELLTYPE_L'//TRIM(ITOS(ILAY))//'.ARR',BND(ILAY)%X))RETURN ENDIF ENDDO DO READ(KU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT !## next line DO I=1,SIZE(PCK); IF(INDEX(LINE,PCK(I)).GT.0)EXIT; ENDDO; IF(I.GT.SIZE(PCK))CYCLE READ(LINE,*) TXT,FNAME,TXT FNAME=TRIM(DIR)//FNAME(2:) IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',ACTION='READ'); IF(IU.EQ.0)RETURN DO READ(IU,'(A)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT IF(INDEX(LINE,'OPEN/CLOSE').GT.0)THEN READ(LINE(INDEX(LINE,'OPEN/CLOSE')+LEN('OPEN/CLOSE')+1:),*) FNAME !## read arr file FNAME=TRIM(DIR)//FNAME(2:) JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=FNAME,STATUS='OLD',ACTION='READ'); IF(JU.EQ.0)RETURN DO IF(PCK(I).EQ.'RIV6')THEN READ(JU,*,IOSTAT=IOS) ILAY,IROW,ICOL,WP,COND,BH IF(WP.LE.BH.OR.COND.LE.0.0D0)ILAY=0 ELSEIF(PCK(I).EQ.'GHB6'.OR.PCK(I).EQ.'DRN6')THEN READ(JU,*,IOSTAT=IOS) ILAY,IROW,ICOL ENDIF IF(IOS.NE.0)EXIT; IF(ILAY.EQ.0)CYCLE JLAY=ILAY ! DO JLAY=ILAY,PRJNLAY ! !## set boundary condition to confined for all subsequent layers IF(LAYCON(JLAY).NE.1)BND(JLAY)%X(ICOL,IROW)=0.0D0 ! ENDDO ENDDO CLOSE(JU) ENDIF ENDDO CLOSE(IU) ENDDO CLOSE(KU) ENDDO DO ILAY=1,PRJNLAY IF(LAYCON(ILAY).NE.1)THEN IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\GWF_'//TRIM(ITOS(M))//'\MODELINPUT\NPF6\ICELLTYPE_L'//TRIM(ITOS(ILAY))//'.ARR', & BND(ILAY),1,0,ILAY,-1))RETURN ENDIF ENDDO PMANAGER_SAVEMF2005_SETICELLTYPE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_SETICELLTYPE !###====================================================================== SUBROUTINE PMANAGER_SAVEMF2005_PCK_ULSTRD_PARAM(PRJNLAY,ICOL,IROW,TOP,BOT,KD,TP,BT,KH,LKHV) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: PRJNLAY,ICOL,IROW TYPE(IDFOBJ),INTENT(IN),DIMENSION(PRJNLAY) :: TOP,BOT,KD REAL(KIND=DP_KIND),INTENT(OUT),DIMENSION(PRJNLAY) :: KH,TP,BT LOGICAL,INTENT(IN) :: LKHV INTEGER :: ILAY !## get filter fractions DO ILAY=1,PRJNLAY TP(ILAY)=TOP(ILAY)%X(ICOL,IROW) BT(ILAY)=BOT(ILAY)%X(ICOL,IROW) KH(ILAY)=KD (ILAY)%X(ICOL,IROW) ENDDO DO ILAY=1,PRJNLAY !## put in cells with thickness only, also include inactive cells as they could be formed for mf6 IF(TP(ILAY)-BT(ILAY).GT.0.0D0)THEN KH(ILAY)=KH(ILAY)/(TP(ILAY)-BT(ILAY)) !## uniform disctribution IF(.NOT.LKHV)KH(ILAY)=1.0D0 ELSE KH(ILAY)=0.0D0 ENDIF ENDDO END SUBROUTINE PMANAGER_SAVEMF2005_PCK_ULSTRD_PARAM !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_PCK_U2DREL(EXFNAME,IDF,IU,IFBND,IINT) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IFBND,IINT CHARACTER(LEN=*),INTENT(IN) :: EXFNAME TYPE(IDFOBJ),INTENT(INOUT) :: IDF CHARACTER(LEN=256) :: SFNAME INTEGER,INTENT(IN) :: IU INTEGER :: JU,IROW,ICOL,I REAL(KIND=DP_KIND) :: MINV,MAXV PMANAGER_SAVEMF2005_PCK_U2DREL=.FALSE. ! hoezo wordt laag 1 als bnd gebruikt voor min/max? IF(.NOT.PMANAGER_SAVEMF2005_PCK_GETMINMAX(IDF%X,IDF%NCOL,IDF%NROW,BND(1)%X,MINV,MAXV,IFBND))RETURN !## constant value IF(MAXV.EQ.MINV)THEN IF(IINT.EQ.0)WRITE(IU,'(A)') 'CONSTANT '//TRIM(RTOS(MAXV,'E',7)) IF(IINT.EQ.1)THEN LINE='CONSTANT '//TRIM(ITOS(INT(MAXV))) WRITE(IU,'(A)') TRIM(LINE) ENDIF ELSE CALL UTL_CREATEDIR(EXFNAME(:INDEX(EXFNAME,'\',.TRUE.)-1)) SFNAME=EXFNAME; DO I=1,3; SFNAME=SFNAME(:INDEX(SFNAME,'\',.TRUE.)-1); ENDDO I=LEN_TRIM(SFNAME); SFNAME='.'//EXFNAME(I+1:) IF(IINT.EQ.0)WRITE(IU,'(A)') 'OPEN/CLOSE '//TRIM(SFNAME)//' 1.0 (FREE) -1' IF(IINT.EQ.1)WRITE(IU,'(A)') 'OPEN/CLOSE '//TRIM(SFNAME)//' 1 (FREE) -1' JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=EXFNAME,STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(JU.EQ.0)RETURN IF(LFREEFORMAT)THEN CALL IDFWRITEFREE(JU,IDF,IINT,'B','*') ELSE IF(IINT.EQ.1)THEN DO IROW=1,IDF%NROW; WRITE(JU,*) (INT(IDF%X(ICOL,IROW)),ICOL=1,IDF%NCOL); ENDDO ELSE DO IROW=1,IDF%NROW; WRITE(JU,*) (IDF%X(ICOL,IROW) ,ICOL=1,IDF%NCOL); ENDDO ENDIF ENDIF CLOSE(JU) ENDIF IF(IUEXAMINE.NE.0)THEN IROW=INT(PBMAN%EXAMINE(1)); ICOL=INT(PBMAN%EXAMINE(2)) IF(IDF%X(ICOL,IROW).EQ.IDF%NODATA)THEN WRITE(IUEXAMINE,'(A20,A15 )') TRIM(EXFNAME(INDEX(EXFNAME,'\',.TRUE.)+1:)),'NodataValue' ELSE WRITE(IUEXAMINE,'(A20,F15.7)') TRIM(EXFNAME(INDEX(EXFNAME,'\',.TRUE.)+1:)),IDF%X(ICOL,IROW) ENDIF ENDIF PMANAGER_SAVEMF2005_PCK_U2DREL=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_PCK_U2DREL !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_HFB_COMPUTE(IDF,ITOPIC,IU,BND,TOP,BOT,IPRT,IBATCH,IPER) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ITOPIC,IU,IPRT,IBATCH,IPER TYPE(IDFOBJ),INTENT(INOUT) :: IDF TYPE(IDFOBJ),DIMENSION(PRJNLAY),INTENT(INOUT) :: TOP,BOT,BND REAL(KIND=DP_KIND) :: FCT,IMP,CNST INTEGER :: ILAY,ISYS,ICNST INTEGER(KIND=1),ALLOCATABLE,DIMENSION(:,:,:) :: IPC TYPE(IDFOBJ) :: TIDF,BIDF PMANAGER_SAVEMF2005_HFB_COMPUTE=.FALSE. CALL ASC2IDF_INT_NULLIFY(); ALLOCATE(XP(100),YP(100),ZP(100),FP(100),PP(100),WP(100)) !## compute block-faces ALLOCATE(IPC(IDF%NCOL,IDF%NROW,2)) CALL IDFNULLIFY(TIDF); CALL IDFNULLIFY(BIDF) CALL IDFCOPY(IDF,TIDF); CALL IDFCOPY(IDF,BIDF) WRITE(IU,'(5A10,2A15,A10,4A15)') 'ILAY','IROW1','ICOL1','IROW2','ICOL2','RESISTANCE','FRACTION','SYSTEM', & 'TOP_LAYER','BOT_LAYER','TOP_FAULT','BOT_FAULT' !## process per system DO ISYS=1,SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,2) IPC=INT(0,1) ICNST =TOPICS(ITOPIC)%STRESS(IPER)%FILES(1,ISYS)%ICNST CNST =TOPICS(ITOPIC)%STRESS(IPER)%FILES(1,ISYS)%CNST ILAY =TOPICS(ITOPIC)%STRESS(IPER)%FILES(1,ISYS)%ILAY FCT =TOPICS(ITOPIC)%STRESS(IPER)%FILES(1,ISYS)%FCT IMP =TOPICS(ITOPIC)%STRESS(IPER)%FILES(1,ISYS)%IMP IDF%FNAME=TOPICS(ITOPIC)%STRESS(IPER)%FILES(1,ISYS)%FNAME IF(ICNST.EQ.1)THEN IF(IBATCH.EQ.0)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'HFB cannot be parameterized via a constant value.','Error') WRITE(*,'(A)') 'HFB cannot be parameterized via a constant value.' RETURN ENDIF WRITE(IPRT,'(1X,A,I3,A1,I1,A1,I4.3,3(A1,G15.7),A1,A)') TOPICS(ITOPIC)%TNAME(1:5)//',', & ISYS,',',ICNST,',',ILAY,',',FCT,',',IMP,',',CNST,',',CHAR(39)//TRIM(IDF%FNAME)//CHAR(39) IF(LEN_TRIM(PRJIDF%FNAME).GT.0)THEN !## rasterize genfile CALL ASC2IDF_HFB(IDF,IDF%NROW,IDF%NCOL,IPC,(/IDF%FNAME/),ILAY,TIDF,BIDF) !## collect all fault in a single file with resistances and layer fractions CALL PMANAGER_SAVEMF2005_HFB_COLLECT(IPC,IDF%NROW,IDF%NCOL,FCT*IMP,IU,BND,TOP,BOT,ILAY,TIDF,BIDF,ISYS) ENDIF ENDDO CALL ASC2IDF_INT_DEALLOCATE(); CLOSE(IU) DEALLOCATE(IPC); CALL IDFDEALLOCATEX(TIDF); CALL IDFDEALLOCATEX(BIDF) IF(ISYS.GT.SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,2))PMANAGER_SAVEMF2005_HFB_COMPUTE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_HFB_COMPUTE !###==================================================================== SUBROUTINE PMANAGER_SAVEMF2005_HFB_COLLECT(IPC,NROW,NCOL,HFBRESIS, & IU,BND,TOP,BOT,ITB,TIDF,BIDF,ISYS) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: NROW,NCOL,IU,ITB,ISYS TYPE(IDFOBJ),INTENT(INOUT) :: TIDF,BIDF TYPE(IDFOBJ),DIMENSION(PRJNLAY),INTENT(INOUT) :: TOP,BOT,BND REAL(KIND=DP_KIND),INTENT(IN) :: HFBRESIS INTEGER(KIND=1),INTENT(IN),DIMENSION(NCOL,NROW,2) :: IPC INTEGER :: IROW,ICOL,IL1,IL2,ILAY REAL(KIND=DP_KIND) :: NODATA,FDZ,TPV,BTV,TFV,BFV NODATA=HUGE(1.0D0) !## determine what layer(s) IF(ITB.EQ.0)THEN IL1=1; IL2=PRJNLAY ELSE IL1=ITB; IL2=IL1 ENDIF DO IROW=1,NROW; DO ICOL=1,NCOL; DO ILAY=IL1,IL2 !## place vertical wall IF(IPC(ICOL,IROW,1).EQ.INT(1,1))THEN IF(ICOL.LT.NCOL)THEN !## fraction is minus 1 for given layers FDZ=-1.0D0 IF(ITB.EQ.0)FDZ=PMANAGER_SAVEMF2005_HFB_GETFDZ(BND,TOP,BOT,TIDF%X,BIDF%X,ICOL,IROW,ICOL+1,IROW,NODATA,ILAY,TFV,BFV) !## enter fault if occupation > 0.0D0% IF(ITB.EQ.0.AND.FDZ.LE.0.0D0)CYCLE IF(ITB.NE.0)THEN TPV=0.0D0 BTV=0.0D0 TFV=0.0D0 BFV=0.0D0 ELSE TPV=(TOP(ILAY)%X(ICOL,IROW)+TOP(ILAY)%X(ICOL+1,IROW))/2.0D0 BTV=(BOT(ILAY)%X(ICOL,IROW)+BOT(ILAY)%X(ICOL+1,IROW))/2.0D0 ENDIF !## write fault always, as it becomes confused WRITE(IU,'(5I10,2G15.7,I10,4G15.7)') ILAY,IROW,ICOL,IROW,ICOL+1,HFBRESIS,FDZ,ISYS,TPV,BTV,TFV,BFV !## x-direction ENDIF ENDIF !## place horizontal wall IF(IPC(ICOL,IROW,2).EQ.INT(1,1))THEN IF(IROW.LT.NROW)THEN !## fraction is minus 1 for given layers FDZ=-1.0D0 IF(ITB.EQ.0)FDZ=PMANAGER_SAVEMF2005_HFB_GETFDZ(BND,TOP,BOT,TIDF%X,BIDF%X,ICOL,IROW,ICOL,IROW+1,NODATA,ILAY,TFV,BFV) !## enter fault if occupation > 0.0D0% IF(ITB.EQ.0.AND.FDZ.LE.0.0D0)CYCLE IF(ITB.NE.0)THEN TPV=0.0D0 BTV=0.0D0 TFV=0.0D0 BFV=0.0D0 ELSE TPV=(TOP(ILAY)%X(ICOL,IROW)+TOP(ILAY)%X(ICOL,IROW+1))/2.0D0 BTV=(BOT(ILAY)%X(ICOL,IROW)+BOT(ILAY)%X(ICOL,IROW+1))/2.0D0 ENDIF !## write fault always, as it becomes confused WRITE(IU,'(5I10,2G15.7,I10,4G15.7)') ILAY,IROW,ICOL,IROW+1,ICOL,HFBRESIS,FDZ,ISYS,TPV,BTV,TFV,BFV !## y-direction ENDIF ENDIF ENDDO; ENDDO; ENDDO END SUBROUTINE PMANAGER_SAVEMF2005_HFB_COLLECT !###==================================================================== SUBROUTINE PMANAGER_SAVEMF2005_HFB_EXPORT(NHFBNP,IU,JU,IUGEN,IUDAT,IDF,LTB) !###==================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),PARAMETER :: THICKNESS=0.5D0 LOGICAL,INTENT(IN) :: LTB INTEGER,INTENT(IN) :: IU,JU INTEGER,INTENT(IN),DIMENSION(:) :: IUGEN,IUDAT INTEGER,INTENT(INOUT),DIMENSION(:) :: NHFBNP TYPE(IDFOBJ),INTENT(INOUT) :: IDF INTEGER :: IROW,ICOL,ILAY,IOS,JLAY,IC1,IC2,IR1,IR2,ISYS,NC,NR,KLAY REAL(KIND=DP_KIND) :: C,C1,C2,Z,ZZ,TPV,BTV,TFV,BFV,F INTEGER(KIND=1),ALLOCATABLE,DIMENSION(:,:,:) :: IPC INTEGER(KIND=1),ALLOCATABLE,DIMENSION(:,:) :: SYS REAL(KIND=DP_KIND),ALLOCATABLE,DIMENSION(:,:) :: RES,FDZ,TF,BF LOGICAL :: LINV !## compute block-faces ALLOCATE(IPC(IDF%NCOL,IDF%NROW,2)) ALLOCATE(RES(IDF%NCOL,IDF%NROW)) ALLOCATE(FDZ(IDF%NCOL,IDF%NROW)) ALLOCATE(SYS(IDF%NCOL,IDF%NROW)) ALLOCATE(TF(IDF%NCOL,IDF%NROW)) ALLOCATE(BF(IDF%NCOL,IDF%NROW)) !## process each layer JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY) IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE; JLAY=JLAY+1 NC=BND(ILAY)%NCOL NR=BND(ILAY)%NROW IPC=INT(0,1) RES=0.0D0 FDZ=0.0D0 SYS=INT(0,1) TF=-10.0D10 BF= 10.0D10 LINV=.FALSE. READ(JU,*) DO !## z=fraction (-1=confined system; used as conductance), c=resistance READ(JU,'(5I10,2G15.7,I10,4G15.7)',IOSTAT=IOS) KLAY,IR1,IC1,IR2,IC2,C,Z,ISYS,TPV,BTV,TFV,BFV IF(IOS.NE.0)EXIT IF(KLAY.NE.ILAY)CYCLE !## skip c.lt.zero IF(C.LT.0.0D0)CYCLE IF(IC1.EQ.IC2)THEN IPC(IC1,IR1,2)=INT(1,1) ELSE IPC(IC1,IR1,1)=INT(1,1) ENDIF IF(Z.GT.0.0D0)LINV=.TRUE. !## still some space left in modellayer for an additional fault IF(Z.LT.0.0D0.OR.FDZ(IC1,IR1).LT.1.0D0)THEN !## available space ZZ=1.0D0-FDZ(IC1,IR1) !## net available space ZZ=MIN(ZZ,Z) !## confined system IF(Z.LT.0.0D0)ZZ=1.0D0 !## take system number of largest contribution to c IF(RES(IC1,IR1).GT.0.0D0)THEN IF(Z.GT.0.0D0)THEN !## currently available resistance C2=1.0D0/RES(IC1,IR1)*FDZ(IC1,IR1) IF(C.GT.C2)SYS(IC1,IR1)=INT(ISYS,1) ELSE IF(C.GT.RES(IC1,IR1))SYS(IC1,IR1)=INT(ISYS,1) ENDIF ELSE SYS(IC1,IR1)=INT(ISYS,1) ENDIF !## resistance, sum conductances - ignore resistance of zero days IF(Z.GT.0.0D0)THEN !## add small fault using arithmetic mean IF(TPV-BTV.LE.THICKNESS)THEN C1=0.0D0; IF(RES(IC1,IR1).GT.0.0D0)C1=1.0D0/RES(IC1,IR1)*FDZ(IC1,IR2) C2=C*ZZ !## set conductance RES(IC1,IR1)=1.0D0/((C1+C2)/(ZZ+FDZ(IC1,IR2))) !## add large fault using harmonic mean ELSE !## set conductance RES(IC1,IR1)=RES(IC1,IR1)+(1.0D0/C)*ZZ ENDIF ELSE !## get largest resistance RES(IC1,IR1)=MAX(RES(IC1,IR1),C) ENDIF !## occupation fraction FDZ(IC1,IR1)=MIN(1.0D0,FDZ(IC1,IR1)+ABS(Z)) !## maximum top fault for display TF(IC1,IR1)=MAX(TF(IC1,IR1),TF(IC2,IR2),TFV) !## minimum bot fault for display BF(IC1,IR1)=MIN(BF(IC1,IR1),BF(IC2,IR2),BFV) ENDIF ENDDO DO IROW=1,IDF%NROW; DO ICOL=1,IDF%NCOL !## place vertical wall (block in y-direction) IF(IPC(ICOL,IROW,1).EQ.INT(1,1))THEN IF(ICOL.LT.IDF%NCOL)THEN !## skip faults from and to inactive cell IF(BND(ILAY)%X(ICOL,IROW).EQ.0.0D0.AND. & BND(ILAY)%X(ICOL+1,IROW).EQ.0.0D0)CYCLE !## transform conductances to resistance - take into account the occupation fraction IF(LINV)THEN C1=1.0D0/RES(ICOL,IROW)*FDZ(ICOL,IROW) ELSE C1=RES(ICOL,IROW) ENDIF !## get total resistance related to thickness of model layer IF(FDZ(ICOL,IROW).LT.1.0D0)THEN !## take harmonic mean in case of unsaturated thickness of fault C2=1.0D0/((1.0D0/C1*FDZ(ICOL,IROW))+(1.0D0-FDZ(ICOL,IROW))) ELSE C2=C1 ENDIF !## get systemnumber ISYS=SYS(ICOL,IROW) !## top fault for display purposes TFV=TF(ICOL,IROW) !## bottom fault for display purposes BFV=BF(ICOL,IROW) !## modflow2005 IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN IF(BND(ILAY)%X(ICOL,IROW).NE.0.0D0.AND. & BND(ILAY)%X(ICOL+1,IROW).NE.0.0D0)THEN !## add fault NHFBNP(ILAY)=NHFBNP(ILAY)+1 WRITE(IU,'(5(I10,1X),G15.7,1X,I10)') JLAY,IROW,ICOL, IROW,ICOL+1, C2,ISYS !## y-direction ENDIF !## modflow6 ELSE IF(BND(ILAY)%X(ICOL ,IROW).NE.0.0D0.AND. & BND(ILAY)%X(ICOL+1,IROW).NE.0.0D0)THEN !## add fault NHFBNP(ILAY)=NHFBNP(ILAY)+1 !## get hydrch as 1/d IF(C2.NE.0.0D0)C2=1.0D0/C2 F=MAX(0.0D0,C2) WRITE(IU,'(6(I10,1X),G15.7,1X,I10)') JLAY,IROW,ICOL,JLAY,IROW,ICOL+1,F,ISYS !## y-direction ENDIF ENDIF !## write line in genfile CALL PMANAGER_SAVEMF2005_HFB_GENFILES(IUGEN(ILAY),IUDAT(ILAY),IPC,IDF,IDF%NROW,IDF%NCOL,IROW,ICOL, & NHFBNP(ILAY),C1,C2,FDZ(ICOL,IROW),ISYS,1,LTB,TFV,BFV,BND(ILAY)) ENDIF ENDIF !## place horizontal wall (block in x-direction) IF(IPC(ICOL,IROW,2).EQ.INT(1,1))THEN IF(IROW.LT.IDF%NROW)THEN !## skip faults from and/or towards inactive cell IF(BND(ILAY)%X(ICOL,IROW).EQ.0.0D0.AND. & BND(ILAY)%X(ICOL,IROW+1).EQ.0.0D0)CYCLE !## transform conductances to resistance IF(LINV)THEN C1=1.0D0/RES(ICOL,IROW)*FDZ(ICOL,IROW) ELSE C1=RES(ICOL,IROW) ENDIF !## get total resistance related to thickness of model layer IF(FDZ(ICOL,IROW).LT.1.0D0)THEN !## take harmonic mean in case of unsaturated thickness of fault C2=1.0D0/((1.0D0/C1*FDZ(ICOL,IROW))+(1.0D0-FDZ(ICOL,IROW))) ELSE C2=C1 ENDIF !## get systemnumber ISYS=SYS(ICOL,IROW) !## top fault for display purposes TFV=TF(ICOL,IROW) !## bottom fault for display purposes BFV=BF(ICOL,IROW) !## modflow2005 IF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.6)THEN IF(BND(ILAY)%X(ICOL,IROW).NE.0.0D0.AND. & BND(ILAY)%X(ICOL,IROW+1).NE.0.0D0)THEN !## add fault NHFBNP(ILAY)=NHFBNP(ILAY)+1 WRITE(IU,'(5(I10,1X),G15.7,1X,I10)') JLAY,IROW,ICOL, IROW+1,ICOL, C2,ISYS !## x-direction ENDIF !## modflow6 ELSE IF(BND(ILAY)%X(ICOL,IROW) .NE.0.0D0.AND. & BND(ILAY)%X(ICOL,IROW+1).NE.0.0D0)THEN !## add fault NHFBNP(ILAY)=NHFBNP(ILAY)+1 IF(C2.NE.0.0D0)C2=1.0D0/C2 F=MAX(0.0D0,C2) WRITE(IU,'(6(I10,1X),G15.7,1X,I10)') JLAY,IROW,ICOL,JLAY,IROW+1,ICOL,F,ISYS !## x-direction ENDIF ENDIF !## write line in genfile CALL PMANAGER_SAVEMF2005_HFB_GENFILES(IUGEN(ILAY),IUDAT(ILAY),IPC,IDF,IDF%NROW,IDF%NCOL,IROW,ICOL, & NHFBNP(ILAY),C1,C2,FDZ(ICOL,IROW),ISYS,2,LTB,TFV,BFV,BND(ILAY)) ENDIF ENDIF ENDDO; ENDDO WRITE(IUGEN(ILAY),'(A)') 'END' REWIND(JU) ENDDO DEALLOCATE(IPC,RES,FDZ,SYS,TF,BF) END SUBROUTINE PMANAGER_SAVEMF2005_HFB_EXPORT !###==================================================================== REAL(KIND=DP_KIND) FUNCTION PMANAGER_SAVEMF2005_HFB_GETFDZ(BND,TOP,BOT,TF,BF,IC1,IR1,IC2,IR2,NODATA,ILAY,TFV,BFV) !###==================================================================== IMPLICIT NONE TYPE(IDFOBJ),DIMENSION(PRJNLAY),INTENT(INOUT) :: TOP,BOT,BND REAL(KIND=DP_KIND),INTENT(IN) :: NODATA REAL(KIND=DP_KIND),INTENT(IN),DIMENSION(:,:) :: TF,BF REAL(KIND=DP_KIND),INTENT(OUT) :: TFV,BFV INTEGER,INTENT(IN) :: IC1,IR1,IC2,IR2,ILAY REAL(KIND=DP_KIND) :: TPV,BTV,FDZ PMANAGER_SAVEMF2005_HFB_GETFDZ=0.0D0 !## determine values IF(TF(IC1,IR1).NE.NODATA.AND.TF(IC2,IR2).NE.NODATA)THEN TFV=(TF(IC1,IR1)+TF(IC2,IR2))/2.0D0 ELSEIF(TF(IC1,IR1).NE.NODATA)THEN TFV=TF(IC1,IR1) ELSEIF(TF(IC2,IR2).NE.NODATA)THEN TFV=TF(IC2,IR2) ELSE TFV=-999.99D0 ENDIF IF(BF(IC1,IR1).NE.NODATA.AND.BF(IC2,IR2).NE.NODATA)THEN BFV=(BF(IC1,IR1)+BF(IC2,IR2))/2.0D0 ELSEIF(BF(IC1,IR1).NE.NODATA)THEN BFV=BF(IC1,IR1) ELSEIF(BF(IC2,IR2).NE.NODATA)THEN BFV=BF(IC2,IR2) ELSE BFV=-999.99D0 ENDIF !## skip this fault as it enteres nodata IF(BND(ILAY)%X(IC1,IR1).EQ.0.OR.BND(ILAY)%X(IC2,IR2).EQ.0)RETURN IF(TOP(ILAY)%X(IC1,IR1).NE.TOP(ILAY)%NODATA.AND. & TOP(ILAY)%X(IC2,IR2).NE.TOP(ILAY)%NODATA)THEN TPV=(TOP(ILAY)%X(IC1,IR1)+TOP(ILAY)%X(IC2,IR2))/2.0D0 ELSE TPV=-999.99D0 ENDIF IF(BOT(ILAY)%X(IC1,IR1).NE.BOT(ILAY)%NODATA.AND. & BOT(ILAY)%X(IC1,IR1).NE.BOT(ILAY)%NODATA)THEN BTV=(BOT(ILAY)%X(IC1,IR1)+BOT(ILAY)%X(IC2,IR2))/2.0D0 ELSE BTV=-999.99D0 ENDIF !## nett appearance of fault in modellayer FDZ=MIN(TFV,TPV)-MAX(BFV,BTV) !## not in current modellayer IF(FDZ.LT.0.0D0)RETURN IF(TPV-BTV.GT.0.0D0)THEN !## fraction of fault in modellayer FDZ=FDZ/(TPV-BTV) ELSE !## completely filled in model layer with thickness of zero FDZ=1.0D0 ENDIF !## fraction of layer occupation PMANAGER_SAVEMF2005_HFB_GETFDZ=FDZ END FUNCTION PMANAGER_SAVEMF2005_HFB_GETFDZ !###==================================================================== SUBROUTINE PMANAGER_SAVEMF2005_HFB_GENFILES(IU,JU,IPC,IDF,NROW,NCOL,IROW,ICOL,N, & C,RES,FDZ,ISYS,IT,LTB,TFV,BFV,BND) !###==================================================================== IMPLICIT NONE TYPE(IDFOBJ),INTENT(IN) :: IDF,BND REAL(KIND=DP_KIND),INTENT(IN) :: C,RES,FDZ,TFV,BFV LOGICAL,INTENT(IN) :: LTB INTEGER,INTENT(IN) :: NROW,NCOL,IROW,ICOL,IU,JU,N,ISYS,IT INTEGER(KIND=1),INTENT(IN),DIMENSION(NCOL,NROW,2) :: IPC INTEGER :: IBND REAL(KIND=DP_KIND) :: T1,B1 !## place vertical wall IF(IT.EQ.1)THEN IF(IPC(ICOL,IROW,1).EQ.INT(1,1).AND.ICOL.LT.NCOL)THEN IF(JU.GT.0)THEN IBND=0; IF(BND%X(ICOL,IROW).EQ.0.OR.BND%X(ICOL+1,IROW).EQ.0)IBND=1 IF(LTB)THEN !## write location of fault for m6f and submodel IF(TFV.GE.BFV)WRITE(JU,'(I10,3(1X,E15.7),6I10)') N,C,RES,FDZ,ISYS,ICOL,IROW,ICOL+1,IROW,IBND ELSE !## write location of fault for m6f and submodel WRITE(JU,'(I10,1X ,E15.7 ,6I10)') N,C,ISYS,ICOL,IROW,ICOL+1,IROW,IBND ENDIF ENDIF IF(ICOL.LT.PRJIDF%NCOL)THEN IF(LTB)THEN IF(TFV.GE.BFV)THEN T1=TFV; B1=BFV WRITE(IU,'(I10)') N WRITE(IU,'(3(F15.3,A1))') IDF%SX(ICOL),',',IDF%SY(IROW-1),',',T1 WRITE(IU,'(3(F15.3,A1))') IDF%SX(ICOL),',',IDF%SY(IROW) ,',',T1 WRITE(IU,'(3(F15.3,A1))') IDF%SX(ICOL),',',IDF%SY(IROW) ,',',B1 WRITE(IU,'(3(F15.3,A1))') IDF%SX(ICOL),',',IDF%SY(IROW-1),',',B1 WRITE(IU,'(3(F15.3,A1))') IDF%SX(ICOL),',',IDF%SY(IROW-1),',',T1 WRITE(IU,'(A)') 'END' ENDIF ELSE WRITE(IU,'(I10)') N WRITE(IU,'(2(F15.3,A1))') IDF%SX(ICOL),',',IDF%SY(IROW-1) WRITE(IU,'(2(F15.3,A1))') IDF%SX(ICOL),',',IDF%SY(IROW) WRITE(IU,'(A)') 'END' ENDIF ENDIF ENDIF ENDIF !## place horizontal wall IF(IT.EQ.2)THEN IF(IPC(ICOL,IROW,2).EQ.INT(1,1).AND.IROW.LT.NROW)THEN IF(JU.GT.0)THEN IBND=0; IF(BND%X(ICOL,IROW).EQ.0.OR.BND%X(ICOL,IROW+1).EQ.0)IBND=1 IF(LTB)THEN !## write location of fault for m6f and submodel IF(TFV.GE.BFV)WRITE(JU,'(I10,3(1X,E15.7),6I10)') N,C,RES,FDZ,ISYS,ICOL,IROW,ICOL,IROW+1,IBND ELSE !## write location of fault for m6f and submodel WRITE(JU,'(I10,1X ,E15.7 ,6I10)') N,C,ISYS,ICOL,IROW,ICOL,IROW+1,IBND ENDIF ENDIF IF(IROW.LT.PRJIDF%NROW)THEN IF(LTB)THEN IF(TFV.GE.BFV)THEN T1=TFV; B1=BFV WRITE(IU,'(I10)') N WRITE(IU,'(3(F15.3,A1))') IDF%SX(ICOL-1),',',IDF%SY(IROW),',',T1 WRITE(IU,'(3(F15.3,A1))') IDF%SX(ICOL ),',',IDF%SY(IROW),',',T1 WRITE(IU,'(3(F15.3,A1))') IDF%SX(ICOL ),',',IDF%SY(IROW),',',B1 WRITE(IU,'(3(F15.3,A1))') IDF%SX(ICOL-1),',',IDF%SY(IROW),',',B1 WRITE(IU,'(3(F15.3,A1))') IDF%SX(ICOL-1),',',IDF%SY(IROW),',',T1 WRITE(IU,'(A)') 'END' ENDIF ELSE WRITE(IU,'(I10)') N WRITE(IU,'(2(F15.3,A1))') IDF%SX(ICOL-1),',',IDF%SY(IROW) WRITE(IU,'(2(F15.3,A1))') IDF%SX(ICOL ),',',IDF%SY(IROW) WRITE(IU,'(A)') 'END' ENDIF ENDIF ENDIF ENDIF END SUBROUTINE PMANAGER_SAVEMF2005_HFB_GENFILES !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_LAK_CONFIG() !###====================================================================== IMPLICIT NONE INTEGER :: IROW,ICOL,ILAY,I,JROW,JCOL REAL(KIND=DP_KIND) :: C,ZT,ZB,X1,X2,Y1,Y2,L,TIB,F,KD1,KD2,OT1,OT2 INTEGER,DIMENSION(4) :: IR,IC DATA IR/-1, 0,0,1/ DATA IC/ 0,-1,1,0/ PMANAGER_SAVEMF2005_LAK_CONFIG=.TRUE. IF(TOPICS(TLAK)%IACT_MODEL.EQ.0)RETURN PMANAGER_SAVEMF2005_LAK_CONFIG=.FALSE. !## lake numbers are integer values only DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL LAK(1)%X(ICOL,IROW)=INT(LAK(1)%X(ICOL,IROW)) ENDDO; ENDDO !## get unique number of lakes ALLOCATE(DULAKES(PRJIDF%NCOL*PRJIDF%NROW)) I=0; DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL; I=I+1; DULAKES(I)=INT(LAK(1)%X(ICOL,IROW)); ENDDO; ENDDO CALL UTL_GETUNIQUE_INT(DULAKES,PRJIDF%NROW*PRJIDF%NCOL,NLAKES,0) ALLOCATE(ULAKES(NLAKES)); DO I=1,NLAKES; ULAKES(I)=DULAKES(I); ENDDO; DEALLOCATE(DULAKES) !## reset array lbd - boundary settings, layer becomes lakes as bathymetry of over half of cell DO ILAY=1,PRJNLAY; DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL; LBD(ILAY)%X(ICOL,IROW)=0.0D0; ENDDO; ENDDO; ENDDO !## reset array lcd - sum of conductance vertically/horizontally DO ILAY=1,PRJNLAY; DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL; LCD(ILAY)%X(ICOL,IROW)=0.0D0; ENDDO; ENDDO; ENDDO !## get lakebed leakance - combination of resistance and model resistance of depth AROUND lake DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL !## skip non lake cells IF(LAK(1)%X(ICOL,IROW).LE.0)CYCLE !## find appropriate modellayer underneath bathymetry of lake DO ILAY=1,PRJNLAY !## apply lakes only for active cells (>0) IF(BND(ILAY)%X(ICOL,IROW).LE.0)CYCLE ZT=TOP(ILAY)%X(ICOL,IROW) !## found appropriate modellayer IF(ZT.GT.LAK(2)%X(ICOL,IROW))THEN !## cannot have a lake in the lowest model layer IF(ILAY.EQ.PRJNLAY)THEN ! CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You cannot put a lake in the lowest model layer'//CHAR(13)// & ! 'Make sure the bathymetry is always higher than the top of'//CHAR(13)// & ! 'your lowest model layer in order to avoid this error message.','Error') ! RETURN ENDIF !## lake number is equal to internal number in the sort-list DO I=1,NLAKES IF(INT(LAK(1)%X(ICOL,IROW)).EQ.ULAKES(I))THEN; LBD(ILAY)%X(ICOL,IROW)=I; EXIT; ENDIF ENDDO BND(ILAY)%X(ICOL,IROW)=0.0D0 !## modify existing aquitard due to this displacement - can be removed partly by lake IF(ILAY.LT.PRJNLAY)THEN !## bottom of current model layer ZB=TOP(ILAY+1)%X(ICOL,IROW) ELSE ZB=BOT(ILAY)%X(ICOL,IROW) ENDIF !## thickness original interbed TIB=BOT(ILAY)%X(ICOL,IROW)-ZB !top =10 !lak = 4 !bot = 2 !zb = 0 !tib = 2 !## compute fraction for leakance in case lake bathymetry is higher IF(ZB.LT.LAK(2)%X(ICOL,IROW))THEN !## add extra resistance to leakance of part of aquifer IF(BOT(ILAY)%X(ICOL,IROW).LT.LAK(2)%X(ICOL,IROW))THEN C=(LAK(2)%X(ICOL,IROW)-BOT(ILAY)%X(ICOL,IROW))/(KHV(ILAY)%X(ICOL,IROW)/KVA(ILAY)%X(ICOL,IROW)) ENDIF OT1=0.0D0; OT2=0.0D0 IF(ILAY.LT.PRJNLAY)THEN OT1=BOT(ILAY )%X(ICOL,IROW)-TOP(ILAY+1)%X(ICOL,IROW) OT2=TOP(ILAY+1)%X(ICOL,IROW)-BOT(ILAY+1)%X(ICOL,IROW) ENDIF !## adjust bot as the LAK package uses this to create the table input BOT(ILAY)%X(ICOL,IROW)=LAK(2)%X(ICOL,IROW) !## make sure thickness of interbed remains the same IF(TIB.EQ.0.0D0)THEN !## increase permeability in ratio in case no interbed and interface is shifted upwards IF(ILAY.LT.PRJNLAY)THEN TOP(ILAY+1)%X(ICOL,IROW)=BOT(ILAY)%X(ICOL,IROW) KD1=KHV(ILAY )%X(ICOL,IROW)*OT1 KD2=KHV(ILAY+1)%X(ICOL,IROW)*OT2 KD1=KD1+KD2; KD2=KD1/OT2 KHV(ILAY+1)%X(ICOL,IROW)=KHV(ILAY+1)%X(ICOL,IROW)*KD2 ENDIF ELSE !## top remains the same but thickness can be enlarged of the interbed, correct with permeability F=(BOT(ILAY)%X(ICOL,IROW)-TOP(ILAY+1)%X(ICOL,IROW))/TIB KVV(ILAY)%X(ICOL,IROW)=KVV(ILAY)%X(ICOL,IROW)*F ENDIF ELSE C=0.0D0 ENDIF !## lake leakance for vertical conductances - excl. the effect of vertical shift, this is taken care of by MF2005 LCD(ILAY)%X(ICOL,IROW)=1.0D0/LAK(6)%X(ICOL,IROW) ENDIF ENDDO ENDDO; ENDDO !## get lakebed lateral leakances DO ILAY=1,PRJNLAY; DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL !## found lake cell IF(LBD(ILAY)%X(ICOL,IROW).NE.0)THEN !## compute lateral leakances DO I=1,SIZE(IC) JROW=IR(I)+IROW; JCOL=IC(I)+ICOL IF(JROW.GT.PRJIDF%NROW.OR.JROW.LT.1)CYCLE IF(JCOL.GT.PRJIDF%NCOL.OR.JCOL.LT.1)CYCLE !## not equal a lake, thus next to the lake and not inactive cell IF(LBD(ILAY)%X(JCOL,JROW).EQ.0.AND. & BND(ILAY)%X(JCOL,JROW).NE.0)THEN CALL IDFGETEDGE(PRJIDF,JROW,JCOL,X1,Y1,X2,Y2) IF(JROW.EQ.IROW)THEN; L=X2-X1 ; ENDIF IF(JCOL.EQ.ICOL)THEN; L=Y2-Y1 ; ENDIF !## resistance along lake C=L/KHV(ILAY)%X(ICOL,IROW) !## lake leakance for vertical conductances - excl. the effect of vertical shift, this is taken care of by MF2005 LCD(ILAY)%X(JCOL,JROW)=1.0D0/LAK(6)%X(ICOL,IROW) ENDIF ENDDO ENDIF ENDDO; ENDDO; ENDDO PMANAGER_SAVEMF2005_LAK_CONFIG=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_LAK_CONFIG !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEMF2005_LAKE_GETMEANVALUE(X,Y,ULAKE,LVL,IBATCH,IOP) !###====================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),DIMENSION(:,:),INTENT(IN) :: X,Y INTEGER,INTENT(IN) :: ULAKE INTEGER,INTENT(IN) :: IBATCH,IOP REAL(KIND=DP_KIND),INTENT(OUT) :: LVL REAL(KIND=DP_KIND) :: ILVL INTEGER :: IROW,ICOL PMANAGER_SAVEMF2005_LAKE_GETMEANVALUE=.FALSE. LVL=0.0D0; ILVL=0.0D0 DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL IF(INT(X(ICOL,IROW)).EQ.ULAKE)THEN SELECT CASE (IOP) !## average/sum CASE (1,4); LVL=LVL+Y(ICOL,IROW); ILVL=ILVL+1.0D0 !## min CASE (2); IF(ILVL.EQ.0)THEN; LVL=Y(ICOL,IROW); ELSE; LVL=MIN(LVL,Y(ICOL,IROW)); ENDIF; ILVL=ILVL+1.0D0 !## max CASE (3); IF(ILVL.EQ.0)THEN; LVL=Y(ICOL,IROW); ELSE; LVL=MAX(LVL,Y(ICOL,IROW)); ENDIF; ILVL=ILVL+1.0D0 END SELECT ENDIF ENDDO; ENDDO IF(ILVL.LE.0.0D0)THEN IF(IBATCH.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD cannot assign a lakelevel for lake '//TRIM(ITOS(ULAKE)),'Error') RETURN ELSE WRITE(*,'(A)') 'iMOD cannot assign a lakelevel for lake '//TRIM(ITOS(ULAKE)); STOP ENDIF ENDIF IF(IOP.EQ.1)LVL=LVL/ILVL PMANAGER_SAVEMF2005_LAKE_GETMEANVALUE=.TRUE. END FUNCTION PMANAGER_SAVEMF2005_LAKE_GETMEANVALUE !###====================================================================== SUBROUTINE PMANAGER_SAVEMF2005_BND(ISIZE,BND,IBNDVALUE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN),DIMENSION(:,:) :: ISIZE INTEGER,INTENT(IN) :: IBNDVALUE TYPE(IDFOBJ),INTENT(INOUT),DIMENSION(:) :: BND INTEGER :: IROW,ICOL,NN,NE,NS,NW,ILAY,I,J,ISUB LOGICAL :: LEX ILAY=0; DO I=1,SIZE(PBMAN%ILAY) !## turn all boundaries on zero for this layer IF(PBMAN%ILAY(I).EQ.0)THEN BND(I)%X=0.0D0; CYCLE ENDIF ILAY=ILAY+1 DO IROW=1,BND(ILAY)%NROW DO ICOL=1,BND(ILAY)%NCOL IF(BND(ILAY)%X(ICOL,IROW).EQ.HNOFLOW)BND(ILAY)%X(ICOL,IROW)=0.0D0 !## snap to integer BND(ILAY)%X(ICOL,IROW)=DBLE(INT(BND(ILAY)%X(ICOL,IROW))) !## turn into constant head if pbman%nlayibnd.eq.1 IF(PBMAN%NLAYIBND.EQ.1.AND.ILAY.EQ.PRJNLAY)THEN IF(BND(ILAY)%X(ICOL,IROW).GT.0)BND(ILAY)%X(ICOL,IROW)=IBNDVALUE ENDIF !## correct for boundary values from mf6 IF(PBMAN%IFORMAT.EQ.3)THEN !## assign mf6 blocking per layer IF(PBMAN%SMTYPE.EQ.1)THEN ISUB=PBMAN%ISUBMODEL IF(PBMAN%SM(ISUB)%IDF(ILAY)%X(ICOL,IROW).EQ.PBMAN%SM(ISUB)%IDF(ILAY)%NODATA)BND(ILAY)%X(ICOL,IROW)=0.0D0 ELSE IF(PRJIDF%X(ICOL,IROW).EQ.PRJIDF%NODATA)THEN BND(ILAY)%X(ICOL,IROW)=0.0D0 ELSE !## set a fixed head around the border of the sub model (only for the first) IF(PBMAN%ISUBMODEL.EQ.1)THEN !## submodel is smaller than extent of ibound, change boundary IF(SUM(ISIZE(:,ILAY)).GT.0)THEN IF(BND(ILAY)%X(ICOL,IROW).GT.0.0D0.AND.PRJIDF%X(ICOL,IROW).LT.0.0D0)BND(ILAY)%X(ICOL,IROW)=PRJIDF%X(ICOL,IROW) ENDIF ENDIF ENDIF ENDIF ENDIF ENDDO ENDDO NN=0; NW=0; NS=0; NE=0 !## only apply this to mf6 LEX=.FALSE. IF(PBMAN%IFORMAT.NE.3)LEX=.TRUE. !## only apply to first submodel of mf6 IF(PBMAN%IFORMAT.EQ.3.AND.PBMAN%ISUBMODEL.EQ.1)LEX=.TRUE. IF(LEX)THEN !## replace ibound for boundaries - ignore input for the FHB package DO IROW=1,BND(ILAY)%NROW IF(ISIZE(1,ILAY).EQ.1)THEN ICOL=1 IF(BND(ILAY)%X(ICOL,IROW).GT.0)THEN IF(TOPICS(TFHB)%IACT_MODEL.EQ.1)THEN IF(BND(ILAY)%X(ICOL,IROW).NE.2)THEN; NW=NW+1; BND(ILAY)%X(ICOL,IROW)=IBNDVALUE; ENDIF ELSE NW=NW+1; BND(ILAY)%X(ICOL,IROW)=IBNDVALUE ENDIF ENDIF ENDIF IF(ISIZE(3,ILAY).EQ.1)THEN ICOL=BND(ILAY)%NCOL IF(BND(ILAY)%X(ICOL,IROW).GT.0)THEN IF(TOPICS(TFHB)%IACT_MODEL.EQ.1)THEN IF(BND(ILAY)%X(ICOL,IROW).NE.2)THEN; NE=NE+1; BND(ILAY)%X(ICOL,IROW)=IBNDVALUE; ENDIF ELSE NE=NE+1; BND(ILAY)%X(ICOL,IROW)=IBNDVALUE ENDIF ENDIF ENDIF ENDDO DO ICOL=1,BND(ILAY)%NCOL IF(ISIZE(4,ILAY).EQ.1)THEN IROW=1 IF(BND(ILAY)%X(ICOL,IROW).GT.0)THEN IF(TOPICS(TFHB)%IACT_MODEL.EQ.1)THEN IF(BND(ILAY)%X(ICOL,IROW).NE.2)THEN; NN=NN+1; BND(ILAY)%X(ICOL,IROW)=IBNDVALUE; ENDIF ELSE NN=NN+1; BND(ILAY)%X(ICOL,IROW)=IBNDVALUE ENDIF ENDIF ENDIF IF(ISIZE(2,ILAY).EQ.1)THEN IROW=BND(ILAY)%NROW IF(BND(ILAY)%X(ICOL,IROW).GT.0)THEN IF(TOPICS(TFHB)%IACT_MODEL.EQ.1)THEN IF(BND(ILAY)%X(ICOL,IROW).NE.2)THEN; NS=NS+1; BND(ILAY)%X(ICOL,IROW)=IBNDVALUE; ENDIF ELSE NS=NS+1; BND(ILAY)%X(ICOL,IROW)=IBNDVALUE ENDIF ENDIF ENDIF ENDDO IF(NN+NS+NW+NE.GT.0)THEN WRITE(*,'(A)') 'Modified boundary layer '//TRIM(ITOS(ILAY))//' due to submodelling N/S/W/E: ' // & TRIM(ITOS(NN))//'/'//TRIM(ITOS(NS))//'/'//TRIM(ITOS(NW))//'/'//TRIM(ITOS(NE)) ENDIF ENDIF ENDDO END SUBROUTINE PMANAGER_SAVEMF2005_BND !###====================================================================== SUBROUTINE PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,IDF,ITYPE,ITOPIC) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ITOPIC,ILAY,ITYPE TYPE(IDFOBJ),INTENT(INOUT) :: IDF TYPE(IDFOBJ),INTENT(INOUT),DIMENSION(:) :: BND INTEGER :: IROW,ICOL,JLAY LOGICAL :: LEX CHARACTER(LEN=1) :: YESNO IF(ILAY.GT.0)THEN DO IROW=1,IDF%NROW; DO ICOL=1,IDF%NCOL LEX=.TRUE. IF(ITOPIC.NE.TFHB)THEN !## blank out inactive cells IF(BND(ILAY)%X(ICOL,IROW).EQ.0)LEX=.FALSE. !THEN ! IDF%X(ICOL,IROW)=IDF%NODATA ENDIF !ELSE IF(LEX)THEN IF(ITYPE.EQ.0)THEN !## check whether nodata for active location IF(IDF%X(ICOL,IROW).EQ.IDF%NODATA)THEN LEX=.TRUE. !## vcw/kvv might be inactive though boundary underneath is zero IF(ITOPIC.EQ.TVCW.OR.ITOPIC.EQ.TKVV)THEN IF(BND(ILAY+1)%X(ICOL,IROW).EQ.0)LEX=.FALSE. ENDIF IF(LEX)THEN IF(.NOT.LYESNO)THEN WRITE(*,'(/1X,A)') 'Error NodataValue found for active cell' WRITE(*,'(A3,3A4,3A15 )') 'VAR','COL','ROW','LAY','IBOUND','X','NODATAVALUE' WRITE(*,'(A3,3I4,F15.1,2E15.7)') TOPICS(ITOPIC)%CMOD,ICOL,IROW,ILAY,BND(ILAY)%X(ICOL,IROW),IDF%X(ICOL,IROW),IDF%NODATA WRITE(*,'(A$)') 'Continue yes (default value of 1.0D0 is set) / no ?' READ(*,'(A1)') YESNO IF(UTL_CAP(YESNO,'U').EQ.'N')STOP IDF%X(ICOL,IROW)=1.0D0; LYESNO=.TRUE. ELSE !## set dummy value IDF%X(ICOL,IROW)=1.0D0 ENDIF ENDIF ENDIF ENDIF ENDIF !## blank out layer below in case of vertical conductance IF(ITOPIC.EQ.TVCW.OR.ITOPIC.EQ.TKVV)THEN IF(BND(ILAY+1)%X(ICOL,IROW).EQ.0)IDF%X(ICOL,IROW)=IDF%NODATA ENDIF ENDDO; ENDDO !## find uppermost active cell ELSEIF(ILAY.EQ.0)THEN DO IROW=1,IDF%NROW; DO ICOL=1,IDF%NCOL DO JLAY=1,PRJNLAY; IF(BND(JLAY)%X(ICOL,IROW).GT.0)EXIT; ENDDO !## skip if location is equal to nodata, completely IF(JLAY.GT.PRJNLAY)CYCLE IF(ITYPE.EQ.0)THEN !## check whether nodata for active location IF(IDF%X(ICOL,IROW).EQ.IDF%NODATA)THEN WRITE(*,'(/1X,A)') 'Error NodataValue found for active cell' WRITE(*,'(A3,3A4,3A15 )') 'VAR','COL','ROW','LAY','IBOUND','X','NODATAVALUE' WRITE(*,'(A3,3I4,F15.1,2E15.7)') TOPICS(ITOPIC)%CMOD,ICOL,IROW,JLAY,BND(JLAY)%X(ICOL,IROW),IDF%X(ICOL,IROW),IDF%NODATA PAUSE; STOP ENDIF ENDIF ENDDO; ENDDO ENDIF !## blank out negative values for 'KDW','KHV','KVA','VCW','KVV','STO','SSC' SELECT CASE (ITOPIC) CASE (TKDW,TKHV,TKVA,TVCW,TKVV,TSTO,TSPY) DO IROW=1,IDF%NROW; DO ICOL=1,IDF%NCOL IF(IDF%X(ICOL,IROW).EQ.IDF%NODATA)CYCLE IF(IDF%X(ICOL,IROW).LT.0.0D0)IDF%X(ICOL,IROW)=0.0D0 ENDDO; ENDDO END SELECT ! !## remove input for inactive cells ! IF(ILAY.GT.0)THEN ! DO IROW=1,IDF%NROW; DO ICOL=1,IDF%NCOL ! IF(BND(ILAY)%X(ICOL,IROW).EQ.0)IDF%X(ICOL,IROW)=IDF%NODATA ! ENDDO; ENDDO ! ENDIF !## skip fhb(31) / chd(28) package IF(ITOPIC.NE.TFHB.AND.ITOPIC.NE.TCHD)THEN !## remove packages on constant head cells IF(ITYPE.EQ.1.AND.ILAY.GT.0)THEN DO IROW=1,IDF%NROW; DO ICOL=1,IDF%NCOL !## blank out constant head cells IF(BND(ILAY)%X(ICOL,IROW).LT.0)IDF%X(ICOL,IROW)=IDF%NODATA ENDDO; ENDDO ENDIF ENDIF END SUBROUTINE PMANAGER_SAVEMF2005_CORRECT END MODULE MOD_PMANAGER_MF2005