!! Copyright (C) Stichting Deltares, 2005-2019.
!!
!! 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 .Q*
!!
!! 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 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
CONTAINS
!###======================================================================
SUBROUTINE PMANAGER_GENERATEMFNETWORKS(GENFNAME,OUTFOLDER,NSUBMODEL)
!###======================================================================
IMPLICIT NONE
CHARACTER(LEN=*),INTENT(IN) :: GENFNAME,OUTFOLDER
INTEGER,INTENT(OUT) :: NSUBMODEL
INTEGER,ALLOCATABLE,DIMENSION(:) :: ISORT,IPOL
INTEGER(KIND=1),ALLOCATABLE,DIMENSION(:,:,:) :: IPC
TYPE(IDFOBJ),ALLOCATABLE,DIMENSION(:) :: IDF
INTEGER :: I,J,IU,JU,II,JJ
CALL POLYGON1SAVELOADSHAPE(ID_LOADSHAPE,TRIM(GENFNAME),'GEN')
IF(SHP%NPOL.LE.0)THEN; WRITE(*,'(/A/)') 'No polygons found in GEN file'; RETURN; ENDIF
CALL UTL_CREATEDIR(OUTFOLDER); IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(OUTFOLDER)//'\BND.GEN',ACTION='WRITE',STATUS='UNKNOWN',FORM='FORMATTED')
IF(IU.EQ.0)THEN; WRITE(*,'(A)') 'Error opening '//TRIM(OUTFOLDER)//'\BND.GEN'; RETURN; ENDIF
JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=TRIM(OUTFOLDER)//'\BND.XY',ACTION='WRITE',STATUS='UNKNOWN',FORM='FORMATTED')
IF(JU.EQ.0)THEN; WRITE(*,'(A)') 'Error opening '//TRIM(OUTFOLDER)//'\BND.XY'; RETURN; ENDIF
ALLOCATE(ISORT(SHP%NPOL),IPOL(SHP%NPOL)); DO I=1,SHP%NPOL; ISORT(I)=I; IPOL(I)=0; ENDDO
CALL PMANAGER_GENERATEMFNETWORKS_SORT(SHP%NPOL,ISORT,IPOL)
ALLOCATE(IDF(SHP%NPOL)); DO I=1,SHP%NPOL; CALL IDFNULLIFY(IDF(I)); ENDDO
!## get dimensions of the idf files - read them from large cellsizes up to small cell sizes
!## idf(1) is biggest; idf(n) is smallest
CALL PMANAGER_GENERATEMFNETWORKS_DIMIDF(IDF,ISORT,IPOL)
!## process from big to small ... determine in what polygon the selected polygon is and take that cellsize to generate the boundary polygon
DO I=1,SIZE(IDF)
!## current idf/polygon in sort list
J =ISORT(I)
!## use cellsize of idf which overlays the current idf
II=IPOL(J)
CALL ASC2IDF_INT_NULLIFY(); ALLOCATE(XP(100),YP(100),ZP(100),WP(100),FP(100))
ALLOCATE(IPC(IDF(II)%NCOL,IDF(II)%NROW,2)); IPC=INT(0,1)
!## intersect line and determine ipc()
CALL ASC2IDF_HFB(IDF(II),IDF(II)%NROW,IDF(II)%NCOL,IPC,(/GENFNAME/),-1,IPOL=J)
!## write genfiles
CALL PMANAGER_GENERATEMFNETWORKS_WRITEGEN(IDF(II),IPC,IU,JU,J)
CALL ASC2IDF_INT_DEALLOCATE(); DEALLOCATE(IPC)
ENDDO
WRITE(IU,'(A)') 'END'; CLOSE(IU); CLOSE(JU)
!## sortgen files to be a polygon, blank out regions in the idf files
CALL PMANAGER_GENERATEMFNETWORKS_CREATEPOLYGONS(OUTFOLDER,IDF,ISORT)
!## write idf files
DO I=1,SHP%NPOL
J=ISORT(I)
!## first model was a bit too big for the hfb simulations
IF(J.EQ.1)THEN
IDF(I)%XMIN=IDF(I)%XMIN+IDF(I)%DX; IDF(I)%XMAX=IDF(I)%XMAX-IDF(I)%DX
IDF(I)%YMIN=IDF(I)%YMIN+IDF(I)%DY; IDF(I)%YMAX=IDF(I)%YMAX-IDF(I)%DY
IDF(I)%NCOL=IDF(I)%NCOL-2; IDF(I)%NROW=IDF(I)%NROW-2
DO II=1,IDF(I)%NROW; DO JJ=1,IDF(I)%NCOL
IDF(I)%X(JJ,II)=IDF(I)%X(JJ+1,II+1)
ENDDO; ENDDO
ENDIF
IDF(I)%FNAME=TRIM(OUTFOLDER)//'\SUBMODEL_'//TRIM(ITOS(I))//'.IDF'
IF(.NOT.IDFWRITE(IDF(I),IDF(I)%FNAME,1))STOP
ENDDO
CALL IDFDEALLOCATE(IDF,SIZE(IDF)); DEALLOCATE(IDF)
DEALLOCATE(ISORT,IPOL)
NSUBMODEL=SHP%NPOL
END SUBROUTINE PMANAGER_GENERATEMFNETWORKS
!###======================================================================
SUBROUTINE PMANAGER_GENERATEMFNETWORKS_CREATEPOLYGONS(OUTFOLDER,IDF,ISORT)
!###======================================================================
IMPLICIT NONE
CHARACTER(LEN=*),INTENT(IN) :: OUTFOLDER
TYPE(IDFOBJ),INTENT(INOUT),DIMENSION(:) :: IDF
INTEGER,INTENT(IN),DIMENSION(:) :: ISORT
CHARACTER(LEN=256) :: FNAME
INTEGER :: IOS,I,J,N,II,JJ,IU,JU,IROW,ICOL,JROW,JCOL
REAL(KIND=DP_KIND) :: X1,Y1,X2,Y2
REAL(KIND=DP_KIND),DIMENSION(:,:),POINTER :: XC,YC,XC_TMP,YC_TMP
INTEGER,ALLOCATABLE,DIMENSION(:) :: IS,JS
IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(OUTFOLDER)//'\BND.XY' ,ACTION='READ' ,STATUS='OLD' ,FORM='FORMATTED')
JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=TRIM(OUTFOLDER)//'\SUBMODELS_ASCII.GEN',ACTION='WRITE',STATUS='UNKNOWN',FORM='FORMATTED')
ALLOCATE(XC(100,2),YC(100,2))
J=1; N=0; DO
READ(IU,*,IOSTAT=IOS) I,X1,Y1,X2,Y2
IF(IOS.NE.0)I=I+1
IF(I.NE.J)THEN
ALLOCATE(IS(N),JS(N))
CALL PMANAGER_GENERATEMFNETWORKS_PUZZLE(XC,YC,IS,JS,N)
WRITE(JU,'(I10)') J
JJ=0; DO II=1,N
IF(JS(II).LT.0)CYCLE
WRITE(JU,'(2(F15.3,A1))') XC(IS(II),1),',',YC(IS(II),1)
JJ=II
ENDDO
WRITE(JU,'(2(F15.3,A1))') XC(IS(JJ),2),',',YC(IS(JJ),2)
! WRITE(JU,'(2(F15.3,A1))') XC(IS(N),2),',',YC(IS(N),2)
WRITE(JU,'(A3)') 'END'; DEALLOCATE(IS,JS)
IF(IOS.NE.0)EXIT; J=I; N=0
ENDIF
IF(N+1.GT.SIZE(XC,1))THEN
ALLOCATE(XC_TMP(N+100,2),YC_TMP(N+100,2))
DO II=1,N; DO JJ=1,2; XC_TMP(II,JJ)=XC(II,JJ); YC_TMP(II,JJ)=YC(II,JJ); ENDDO; ENDDO
DEALLOCATE(XC,YC); XC=>XC_TMP; YC=>YC_TMP
ENDIF
N=N+1; XC(N,1)=X1; YC(N,1)=Y1; XC(N,2)=X2; YC(N,2)=Y2
ENDDO
WRITE(JU,'(A3)') 'END'; CLOSE(IU,STATUS='DELETE'); CLOSE(JU)
!## convert ascii to binary genfile
FNAME=TRIM(OUTFOLDER)//'\SUBMODELS_ASCII.GEN'
CALL POLYGON_UTL_CONVERTGEN(FNAME=FNAME,OFNAME=TRIM(OUTFOLDER)//'\SUBMODELS_BINAIR.GEN')
!## read binary genfile
CALL POLYGON1SAVELOADSHAPE(ID_LOADSHAPE,TRIM(OUTFOLDER)//'\SUBMODELS_BINAIR.GEN','GEN')
DO I=SHP%NPOL,1,-1
IF(SHP%POL(I)%ITYPE.NE.ID_POLYGON)THEN
WRITE(*,'(/1X,A/)') 'The generated shape need to be a POLYGON'
SELECT CASE (SHP%POL(I)%ITYPE)
CASE (ID_LINE); WRITE(*,'(1X,A)') 'iMOD found a LINE now'
CASE (ID_POINT); WRITE(*,'(1X,A)') 'iMOD found a POINT now'
CASE (ID_CIRCLE); WRITE(*,'(1X,A)') 'iMOD found a CIRCLE now'
CASE (ID_RECTANGLE); WRITE(*,'(1X,A)') 'iMOD found a RECTANGLE now'
END SELECT
STOP
ENDIF
ENDDO
!## start with smallest
DO I=1,SIZE(IDF); IDF(I)%X=1.0D0; ENDDO
DO I=SHP%NPOL,1,-1
J=ISORT(I)
DO IROW=1,IDF(J)%NROW; DO ICOL=1,IDF(J)%NCOL
!## skip blanked out areas
IF(IDF(J)%X(ICOL,IROW).EQ.IDF(J)%NODATA)CYCLE
CALL IDFGETLOC(IDF(J),IROW,ICOL,X1,Y1)
IF(DBL_IGRINSIDESHAPE(X1,Y1,SHP%POL(I)).EQ.1)THEN
IDF(J)%X(ICOL,IROW)=1.0D0
!## deactivate others on this location
DO II=I-1,1,-1
JJ=ISORT(II)
IF(DBL_IGRINSIDESHAPE(X1,Y1,SHP%POL(II)).EQ.1)THEN
CALL IDFIROWICOL(IDF(JJ),JROW,JCOL,X1,Y1)
IDF(JJ)%X(JCOL,JROW)=IDF(JJ)%NODATA
ENDIF
ENDDO
ELSE
IDF(J)%X(ICOL,IROW)=IDF(J)%NODATA
ENDIF
ENDDO; ENDDO
ENDDO
END SUBROUTINE PMANAGER_GENERATEMFNETWORKS_CREATEPOLYGONS
!###======================================================================
SUBROUTINE PMANAGER_GENERATEMFNETWORKS_PUZZLE(XC,YC,IS,JS,N)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: N
INTEGER,DIMENSION(:),INTENT(OUT) :: IS,JS
REAL(KIND=DP_KIND),DIMENSION(:,:),INTENT(INOUT) :: XC,YC
INTEGER :: NS,M,I,J,IPOS
DO I=1,N; JS(I)=I; ENDDO
!## find dangles
DO I=1,N
DO IPOS=1,2
M=0; DO J=1,N
IF(I.EQ.J)CYCLE
IF(PMANAGER_GENERATEMFNETWORKS_PUZZLEFIT(XC,YC,IPOS,I,J))M=M+1
ENDDO
IF(M.EQ.0)THEN
!## skip this one
JS(I)=-1
ENDIF
! WRITE(*,*) I,IPOS,M
ENDDO
ENDDO
!## start at first non-dangle
!JS(1)=0; IS(1)=1; NS=1
DO I=1,N; IF(JS(I).NE.-1)THEN; IS(1)=I; EXIT; ENDIF; ENDDO
NS=1
DO
DO I=1,N
!## already used
IF(JS(I).LE.0)CYCLE
IF(PMANAGER_GENERATEMFNETWORKS_PUZZLEFIT(XC,YC,2,IS(NS),JS(I)))THEN
NS=NS+1; IS(NS)=JS(I); JS(I)=0; EXIT
ENDIF
ENDDO
DO I=1,N; IF(JS(I).GT.0)EXIT; ENDDO
IF(I.GT.N)EXIT
!SUM(JS).EQ.0)EXIT
ENDDO
END SUBROUTINE PMANAGER_GENERATEMFNETWORKS_PUZZLE
!###======================================================================
LOGICAL FUNCTION PMANAGER_GENERATEMFNETWORKS_PUZZLEFIT(XC,YC,IPOS,IS,JS)
!###======================================================================
IMPLICIT NONE
REAL(KIND=DP_KIND),DIMENSION(:,:),INTENT(INOUT) :: XC,YC
INTEGER,INTENT(IN) :: IS,JS,IPOS
REAL(KIND=DP_KIND) :: X0,Y0,X1,Y1,X2,Y2
PMANAGER_GENERATEMFNETWORKS_PUZZLEFIT=.FALSE.
X0=XC(IS,IPOS); Y0=YC(IS,IPOS)
X1=XC(JS,1); Y1=YC(JS,1)
X2=XC(JS,2); Y2=YC(JS,2)
IF(UTL_DIST(X0,Y0,X1,Y1).LE.1.0D-3)THEN
PMANAGER_GENERATEMFNETWORKS_PUZZLEFIT=.TRUE.; RETURN
!## connected inversely - switch coordinates
ELSEIF(UTL_DIST(X0,Y0,X2,Y2).LE.1.0D-3)THEN
XC(JS,1)=X2; YC(JS,1)=Y2; XC(JS,2)=X1; YC(JS,2)=Y1
PMANAGER_GENERATEMFNETWORKS_PUZZLEFIT=.TRUE.; RETURN
ENDIF
END FUNCTION PMANAGER_GENERATEMFNETWORKS_PUZZLEFIT
!###======================================================================
SUBROUTINE PMANAGER_GENERATEMFNETWORKS_DIMIDF(IDF,ISORT,IPOL)
!###======================================================================
IMPLICIT NONE
TYPE(IDFOBJ),INTENT(INOUT),DIMENSION(:) :: IDF
INTEGER,INTENT(IN),DIMENSION(:) :: ISORT,IPOL
INTEGER :: I,II,JJ,MAXCOL,IOS
REAL(KIND=DP_KIND) :: CS
TYPE STROBJ
CHARACTER(LEN=52) :: STRING
END TYPE
TYPE(STROBJ),ALLOCATABLE,DIMENSION(:) :: STR
MAXCOL=0; IF(ASSOCIATED(SHP%COLNAMES))MAXCOL=SIZE(SHP%COLNAMES); ALLOCATE(STR(MAXCOL))
DO I=1,SHP%NPOL
IDF(I)%XMIN=SHP%POL(I)%XMIN; IDF(I)%YMIN=SHP%POL(I)%YMIN
IDF(I)%XMAX=SHP%POL(I)%XMAX; IDF(I)%YMAX=SHP%POL(I)%YMAX
DO II=1,MAXCOL
STR(II)%STRING=''; DO JJ=1,SHP%LWIDTH(II); STR(II)%STRING(JJ:JJ)=SHP%POL(I)%LBL(II)%STRING(JJ); ENDDO
ENDDO
!## read cellsize in polygon
READ(STR(2)%STRING,*,IOSTAT=IOS) IDF(I)%DX
IF(IOS.NE.0)THEN; WRITE(*,'(/A/)') 'Cannot read cellsize for polygon #',I; STOP; ENDIF
IDF(I)%DY=IDF(I)%DX
ENDDO
!## set cell sizes to rasterize along
DO I=1,SHP%NPOL
CS=IDF(IPOL(I))%DX
!## find nice coordinates
CALL UTL_IDFSNAPTONICEGRID(IDF(I)%XMIN,IDF(I)%XMAX,IDF(I)%YMIN,IDF(I)%YMAX,CS,IDF(I)%NCOL,IDF(I)%NROW)
!## increase biggest model as "faults" won't capture the area
IF(ISORT(I).EQ.1)THEN
IDF(I)%XMIN=IDF(I)%XMIN-IDF(I)%DX; IDF(I)%XMAX=IDF(I)%XMAX+IDF(I)%DX
IDF(I)%YMIN=IDF(I)%YMIN-IDF(I)%DY; IDF(I)%YMAX=IDF(I)%YMAX+IDF(I)%DY
ENDIF
!## get the right dimensions
IDF(I)%NCOL=INT((IDF(I)%XMAX-IDF(I)%XMIN)/IDF(I)%DX)
IDF(I)%NROW=INT((IDF(I)%YMAX-IDF(I)%YMIN)/IDF(I)%DY)
IF(.NOT.IDFALLOCATEX(IDF(I)))THEN; WRITE(*,'(/A/)') 'Cannot allocate memory idf%x() #',I; STOP; ENDIF
IF(.NOT.IDFFILLSXSY(IDF(I)))THEN; WRITE(*,'(/A/)') 'Cannot allocate memory for idf%sx()/idf%sy() #',I; STOP; ENDIF
ENDDO
DEALLOCATE(STR)
END SUBROUTINE PMANAGER_GENERATEMFNETWORKS_DIMIDF
!###======================================================================
SUBROUTINE PMANAGER_GENERATEMFNETWORKS_WRITEGEN(IDF,IPC,IU,JU,N)
!###======================================================================
IMPLICIT NONE
TYPE(IDFOBJ),INTENT(IN) :: IDF
INTEGER(KIND=1),DIMENSION(:,:,:),INTENT(IN) :: IPC
INTEGER,INTENT(IN) :: IU,JU,N
INTEGER :: IROW,ICOL
DO IROW=1,IDF%NROW; DO ICOL=1,IDF%NCOL
!## place vertical wall
IF(IPC(ICOL,IROW,1).EQ.INT(1,1))THEN
CALL PMANAGER_GENERATEMFNETWORKS_WRITEXY(1,IU,JU,IPC,IDF,IROW,ICOL,N)
ENDIF
!## place horizontal wall
IF(IPC(ICOL,IROW,2).EQ.INT(1,1))THEN
!## write line in genfile
CALL PMANAGER_GENERATEMFNETWORKS_WRITEXY(2,IU,JU,IPC,IDF,IROW,ICOL,N)
ENDIF
ENDDO; ENDDO
END SUBROUTINE PMANAGER_GENERATEMFNETWORKS_WRITEGEN
!###====================================================================
SUBROUTINE PMANAGER_GENERATEMFNETWORKS_WRITEXY(IT,IU,JU,IPC,IDF,IROW,ICOL,N)
!###====================================================================
IMPLICIT NONE
TYPE(IDFOBJ),INTENT(IN) :: IDF
INTEGER,INTENT(IN) :: IROW,ICOL,IU,JU,N,IT
INTEGER(KIND=1),INTENT(IN),DIMENSION(:,:,:) :: IPC
!## place vertical wall
IF(IT.EQ.1)THEN
IF(IPC(ICOL,IROW,1).EQ.INT(1,1))THEN
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'
IF(JU.GT.0)WRITE(JU,'(I10,4(A1,F15.3))') N,',',IDF%SX(ICOL),',',IDF%SY(IROW-1),',',IDF%SX(ICOL),',',IDF%SY(IROW)
ENDIF
ENDIF
!## place horizontal wall
IF(IT.EQ.2)THEN
IF(IPC(ICOL,IROW,2).EQ.INT(1,1))THEN
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'
IF(JU.GT.0)WRITE(JU,'(I10,4(A1,F15.3))') N,',',IDF%SX(ICOL-1),',',IDF%SY(IROW),',',IDF%SX(ICOL ),',',IDF%SY(IROW)
ENDIF
ENDIF
END SUBROUTINE PMANAGER_GENERATEMFNETWORKS_WRITEXY
!###======================================================================
SUBROUTINE PMANAGER_GENERATEMFNETWORKS_SORT(N,ISORT,IPOL)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: N
INTEGER,INTENT(OUT),DIMENSION(N) :: ISORT,IPOL
INTEGER :: I,J
REAL(KIND=DP_KIND) :: X,Y,AREA
REAL(KIND=DP_KIND),ALLOCATABLE,DIMENSION(:) :: POLAREA
ALLOCATE(POLAREA(SHP%NPOL)); POLAREA=0.0D0
DO I=1,SHP%NPOL
IF(SHP%POL(I)%N.GT.0)THEN
SELECT CASE (SHP%POL(I)%ITYPE)
CASE (ID_RECTANGLE)
POLAREA(I)=ABS(SHP%POL(I)%X(1)-SHP%POL(I)%X(2))*ABS(SHP%POL(I)%Y(1)-SHP%POL(I)%Y(2))
CASE (ID_POLYGON)
POLAREA(I)=ABS(UTL_POLYGON1AREA(SHP%POL(I)%X,SHP%POL(I)%Y,SHP%POL(I)%N))
CASE (ID_CIRCLE)
POLAREA(I)=2.0D0*UTL_DIST(SHP%POL(I)%X(1),SHP%POL(I)%Y(1),SHP%POL(I)%X(2),SHP%POL(I)%Y(2))
POLAREA(I)=PI*POLAREA(I)**2.0D0
CASE DEFAULT
POLAREA(SHPI)=0.0D0
END SELECT
ENDIF
END DO
CALL WSORT(POLAREA,1,SHP%NPOL,IFLAGS=SORTDESCEND,IORDER=ISORT)
!## define for each what shape will be the that captures them - smallest area
DO J=1,SHP%NPOL
IPOL(J)=J; AREA=HUGE(1.0D0); X=SHP%POL(J)%X(1); Y=SHP%POL(J)%Y(1)
DO I=1,SHP%NPOL
IF(I.EQ.J)CYCLE
IF(DBL_IGRINSIDESHAPE(X,Y,SHP%POL(I)).EQ.1)THEN
IF(POLAREA(I).LE.AREA)THEN
AREA=POLAREA(I)
IPOL(J)=I
ENDIF
ENDIF
ENDDO
ENDDO
DEALLOCATE(POLAREA)
END SUBROUTINE PMANAGER_GENERATEMFNETWORKS_SORT
!###======================================================================
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
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))
WRITE(IU,'(A)') TRIM(LINE)
ENDDO
ELSE
LINE=TRIM(ITOS(0))
WRITE(IU,'(A)') TRIM(LINE)
ENDIF
ENDIF
IF(IOPTION.EQ.2)THEN
LINE=TRIM(ITOS(SIZE(PEST%PARAM))); 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-1)) //','// &
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))//','//TRIM(RTOS(PEST%PE_REGFACTOR,'G',7))
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))
WRITE(IU,'(A)') TRIM(LINE)
ENDDO
ENDIF
IF(ASSOCIATED(PEST%IDFFILES))THEN
LINE=TRIM(ITOS(SIZE(PEST%IDFFILES)))
WRITE(IU,'(A)') TRIM(LINE)
DO I=1,SIZE(PEST%IDFFILES)
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
!## 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)') TRIM(LINE)
ENDIF
ENDIF
ELSE
WRITE(IU,'(A)') TRIM(LINE)
ENDIF
ENDDO
ENDIF
PMANAGER_SAVEPST=.TRUE.
END FUNCTION PMANAGER_SAVEPST
!###======================================================================
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.
!## overrule ipst if not as keyword given
IF(IBATCH.EQ.1.AND.PBMAN%IPEST.EQ.0)TOPICS(20)%IACT_MODEL=0
!## get active packages
IF(.NOT.PMANAGER_GETPACKAGES(IBATCH))RETURN
DO I=1,MAXTOPICS
SELECT CASE (I)
CASE (12,18,19,30,31,32)
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
PRJNLAY=PRJMXNLAY
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
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(PREFVAL(1))//'\MODELS\'//TRIM(MODELNAME)//CHAR(39)
ENDIF
N=0; IF(ASSOCIATED(PEST%MEASURES))THEN
N=SIZE(PEST%MEASURES); IF(PEST%IIPF.EQ.1)N=-1*N
ENDIF
!## metaswap
IARMWP=0
IF(TOPICS(1)%IACT_MODEL.EQ.1)THEN
IF(ASSOCIATED(TOPICS(1)%STRESS))THEN
LINE=TOPICS(1)%STRESS(1)%FILES(8,1)%FNAME
IF(INDEX(UTL_CAP(LINE,'U'),'IPF').GT.0)IARMWP=1
ENDIF
ENDIF
NSCL=1
IF(PBMAN%IWINDOW.EQ.2)NSCL=0
IF(PBMAN%IWINDOW.EQ.1)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,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))
WRITE(IU,'(A)') TRIM(LINE)
ENDDO
ENDIF
IF(PBMAN%IWINDOW.EQ.2)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)
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
!## non-equistantial network
IF(PBMAN%IWINDOW.EQ.2)THEN
BNDFNAME=PBMAN%BNDFILE
ELSE
ALLOCATE(IDF(1)); CALL IDFNULLIFY(IDF(1))
IF(.NOT.PMANAGER_INIT_SIMAREA(IDF(1),IBATCH))RETURN
BNDFNAME=IDF(1)%FNAME
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))') SUBMODEL(1),',',SUBMODEL(2),',',SUBMODEL(3),',',SUBMODEL(4),',',SUBMODEL(5),',',SUBMODEL(7),',',SUBMODEL(6)
ELSE
WRITE(IU,'(6(F15.3,A1))') SUBMODEL(1),',',SUBMODEL(2),',',SUBMODEL(3),',',SUBMODEL(4),',',SUBMODEL(5),',',SUBMODEL(6)
ENDIF
ENDIF
CALL IDFDEALLOCATE(IDF,SIZE(IDF)); DEALLOCATE(IDF)
ENDIF
WRITE(IU,'(A)') 'ACTIVE MODULES'
DO I=1,MAXTOPICS
IF(TOPICS(I)%IACT_MODEL.EQ.0)CYCLE
!## skip pcg
IF(I.EQ.33)CYCLE
!## pst module is exception
IF(I.EQ.20)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
SELECT CASE (I)
CASE (5)
CALL PMANAGER_SAVEMF2005_RUN_ISAVE(PBMAN%SAVESHD,TOPICS(I)%TNAME(1:5),IU)
CASE (4,6,7,9,10,11)
CALL PMANAGER_SAVEMF2005_RUN_ISAVE(PBMAN%SAVEFLX,TOPICS(I)%TNAME(1:5),IU)
CASE (21) !## wel
CALL PMANAGER_SAVEMF2005_RUN_ISAVE(PBMAN%SAVEWEL,TOPICS(I)%TNAME(1:5),IU)
CASE (22) !## drn
CALL PMANAGER_SAVEMF2005_RUN_ISAVE(PBMAN%SAVEDRN,TOPICS(I)%TNAME(1:5),IU)
CASE (23) !## riv
CALL PMANAGER_SAVEMF2005_RUN_ISAVE(PBMAN%SAVERIV,TOPICS(I)%TNAME(1:5),IU)
CASE (24) !## evt
CALL PMANAGER_SAVEMF2005_RUN_ISAVE(PBMAN%SAVEEVT,TOPICS(I)%TNAME(1:5),IU)
CASE (25) !## ghb
CALL PMANAGER_SAVEMF2005_RUN_ISAVE(PBMAN%SAVEGHB,TOPICS(I)%TNAME(1:5),IU)
CASE (26) !## rch
CALL PMANAGER_SAVEMF2005_RUN_ISAVE(PBMAN%SAVERCH,TOPICS(I)%TNAME(1:5),IU)
CASE (27) !## olf
CALL PMANAGER_SAVEMF2005_RUN_ISAVE(PBMAN%SAVEDRN,TOPICS(I)%TNAME(1:5),IU)
CASE (29) !## isg
CALL PMANAGER_SAVEMF2005_RUN_ISAVE(PBMAN%SAVERIV,TOPICS(I)%TNAME(1:5),IU)
CASE DEFAULT
WRITE(IU,'(A)') '1,0 '//TRIM(TOPICS(I)%TNAME)
END SELECT
ENDDO
!## write bndfile
WRITE(IU,'(A)') CHAR(39)//TRIM(BNDFNAME)//CHAR(39)
WRITE(IU,'(A)') 'MODULES FOR EACH LAYER'
!## write modules
DO I=1,MAXTOPICS
IF(TOPICS(I)%IACT_MODEL.EQ.0)CYCLE
IF(TOPICS(I)%TIMDEP)CYCLE
!## skip pcg
IF(I.EQ.33)CYCLE
!## pst module is exception
IF(I.EQ.20)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(.NOT.ASSOCIATED(TOPICS(I)%STRESS))CYCLE
IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS(1)%FILES))CYCLE
!## check the number of active packages
IF(I.EQ.1)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.1.OR.I.EQ.13)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.1)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.7,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.7,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 (21); IF(PBMAN%DWEL.EQ.1)IPER=ABS(IPER)
CASE (29); IF(PBMAN%DISG.EQ.1)IPER=ABS(IPER)
CASE (30); 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)
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 :: IULAK,ISTEADY,IPER,INIPER,LPER,KPER,IINI,IPRT,I,J
LOGICAL :: LTB
PMANAGER_SAVEMF2005=.FALSE.; LYESNO=.FALSE.
!## 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 is used
IF(IBATCH.EQ.1)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
!## get active packages
IF(.NOT.PMANAGER_GETPACKAGES(IBATCH))RETURN
!## organise groups
CALL IPEST_GLM_SETGROUPS()
!## 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(ISS,IBATCH))RETURN
!## 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
!##================
!## 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
!## 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)
!## get lak position and conductances
IF(.NOT.PMANAGER_SAVEMF2005_LAK_CONFIG())RETURN
!##================
!## writing section
!##================
!## write pst-file
IF(.NOT.PMANAGER_SAVEMF2005_PST_READWRITE(DIR,DIRMNAME,IBATCH,ISS))RETURN
!## write metaswap
IF(.NOT.PMANAGER_SAVEMF2005_MSP(DIR,DIRMNAME,IBATCH,IPRT))RETURN
!## save bas file
IF(.NOT.PMANAGER_SAVEMF2005_BAS_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 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 hfb file
IF(.NOT.PMANAGER_SAVEMF2005_HFB(IBATCH,DIRMNAME,IPRT,LTB))RETURN
!## save pcg file
IF(.NOT.PMANAGER_SAVEMF2005_IMS(TRIM(MAINDIR)//'\MFSIM'))RETURN
!## save pcg file
IF(.NOT.PMANAGER_SAVEMF2005_PCG(DIRMNAME))RETURN
!## save pks file
IF(.NOT.PMANAGER_SAVEMF2005_PKS(DIRMNAME))RETURN
!## save oc file
IF(.NOT.PMANAGER_SAVEMF2005_OCD(DIRMNAME,MAINDIR))RETURN
!## save uzf package
IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,LUZF,18,IUZFCB1,'UZF',(/1,2,3,4,5,6,7,8/),IPRT))RETURN
!## save mnw package
IF(.NOT.PMANAGER_SAVEMF2005_MNW(DIRMNAME,IBATCH,LMNW,19,IWL2CB,'MNW',IPRT))RETURN
!## save wel package
IF(.NOT.PMANAGER_SAVEMF2005_WEL(DIR,DIRMNAME,IBATCH,LWEL,21,IWELCB,'WEL',IPRT))RETURN
!## save drn package
IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,LDRN,22,IDRNCB,'DRN',(/2,1/),IPRT))RETURN
!## save isg package (always before riv in case of dmm-files)
IF(.NOT.LRIV)THEN
IF(.NOT.PMANAGER_SAVEMF2005_ISG(DIR,DIRMNAME,IBATCH,LISG,29,IRIVCB,'RIV',IPRT))RETURN
ELSE
IF(.NOT.PMANAGER_SAVEMF2005_ISG(DIR,DIRMNAME,IBATCH,LISG,29,IRIVCB,'ISG',IPRT))RETURN
ENDIF
!## save riv package
IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,LRIV,23,IRIVCB,'RIV',(/2,1,3,4/),IPRT))RETURN
!## save evt package
IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,LEVT,24,IEVTCB,'EVT',(/2,1,3/),IPRT))RETURN
!## save ghb package
IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,LGHB,25,IGHBCB,'GHB',(/2,1/),IPRT))RETURN
!## save rch package
IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,LRCH,26,IRCHCB,'RCH',(/1/),IPRT))RETURN
!## save olf package
IF(.NOT.LDRN)THEN
IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,LOLF,27,IDRNCB,'DRN',(/1/),IPRT))RETURN
ELSE
IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,LOLF,27,IDRNCB,'OLF',(/1/),IPRT))RETURN
ENDIF
!## save chd package
IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,LCHD,28,ICHDCB,'CHD',(/1/),IPRT))RETURN
!## save sfr package
IF(.NOT.PMANAGER_SAVEMF2005_ISG(DIR,DIRMNAME,IBATCH,LSFR,30,ISFRCB,'SFR',IPRT))RETURN
!## save fhb package
IF(.NOT.PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,LFHB,31,IFHBCB,'FHB',(/1,2/),IPRT))RETURN
IF(LLAK)THEN
!## save rest of lak package
LPER=0; DO IPER=1,PRJNPER
!## get appropriate stress-period to store in runfile
KPER=PMANAGER_GETCURRENTIPER(IPER,32,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
!## combine olf/drn and isg/riv
IF(LOLF.AND.LDRN)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
IF(LISG.AND.LRIV)THEN
IF(.NOT.PMANAGER_SAVEMF2005_COMBINE(DIR,DIRMNAME,(/'ISG','RIV','RIV_'/),IRIVCB,'AUX RFCT AUX ISUB RFACT RFCT RSUBSYS ISUB NOPRINT'))RETURN
ENDIF
!## 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
DO I=1,PBMAN%NSUBMODEL
DO J=I+1,PBMAN%NSUBMODEL
CALL PMANAGER_SAVEMF6_EXG(MAINDIR,I,J)
ENDDO
ENDDO
!## remove from nam if no packages exists anymore
DO I=1,PBMAN%NSUBMODEL
CALL PMANAGER_SAVEMF6_CLEANNAM(MAINDIR,I)
ENDDO
ENDIF
PMANAGER_SAVEMF2005=.TRUE.
END FUNCTION PMANAGER_SAVEMF2005
!###======================================================================
SUBROUTINE PMANAGER_SAVEMF6_CLEANNAM(DIR,M)
!###======================================================================
IMPLICIT NONE
CHARACTER(LEN=*),INTENT(IN) :: DIR
INTEGER,INTENT(IN) :: M
INTEGER :: IU,JU,KU,IOS,N
CHARACTER(LEN=256) :: FNAME,LINE,STRING
CHARACTER(LEN=52) :: MDLNAME
CHARACTER(LEN=4),DIMENSION(6) :: PCK
LOGICAL :: LEX
DATA PCK/'CHD6','WEL6','DRN6','RCH6','RIV6','HFB6'/
MDLNAME=DIR(INDEX(DIR,'\',.TRUE.)+1:)
FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(M))//'\'//TRIM(MDLNAME)//'.NAM'
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 I=1,SIZE(PCK)
IF(INDEX(LINE,PCK(I)).GT.0)THEN
!## check whether there are packages defined
FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(M))//'\MODELINPUT\'//TRIM(MDLNAME)//'.'//TRIM(PCK(I))
KU=UTL_GETUNIT(); CALL OSD_OPEN(KU,FILE=FNAME,STATUS='OLD',ACTION='READ',FORM='FORMATTED'); IF(IU.EQ.0)RETURN
LEX=.TRUE.
DO
READ(KU,'(A256)') STRING
IF(INDEX(STRING,'MAXBOUND').GT.0)THEN
READ(STRING(9:),*) N
IF(N.GT.0)WRITE(JU,'(A)') TRIM(LINE)
EXIT
ENDIF
IF(INDEX(STRING,'MAXHFB').GT.0)THEN
READ(STRING(7:),*) 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)
FNAME=TRIM(DIR)//'\GWF_'//TRIM(ITOS(M))//'\'//TRIM(MDLNAME)//'.NAM'
CALL IOSRENAMEFILE(TRIM(FNAME)//'_',FNAME)
END SUBROUTINE PMANAGER_SAVEMF6_CLEANNAM
!###======================================================================
SUBROUTINE PMANAGER_SAVEMF6_EXG(DIR,M1,M2)
!###======================================================================
IMPLICIT NONE
CHARACTER(LEN=*),INTENT(IN) :: DIR
INTEGER,INTENT(IN) :: M1,M2
REAL(KIND=DP_KIND) :: XP,YP,T,B,Z1,Z2
INTEGER :: IU,JU,I,J,K,IM,N,IOS,II,ILAY,MAXNLAY,IROW,ICOL,IMDL1,IMDL2,JROW,JCOL
TYPE(IDFOBJ),ALLOCATABLE,DIMENSION(:,:) :: BND,TOP,BOT
INTEGER,DIMENSION(2) :: MNLAY,IMDL
CHARACTER(LEN=256) :: FNAME,LINE
CHARACTER(LEN=52) :: TXT,MDLNAME
CHARACTER(LEN=1) :: TLAYMODEL
LOGICAL :: LSUBMODEL,LEX
MDLNAME=DIR(INDEX(DIR,'\',.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'
WRITE(IU,'(1X,A)') 'PRINT_INPUT'
WRITE(IU,'(1X,A)') 'PRINT_FLOWS'
WRITE(IU,'(1X,A)') 'SAVE_FLOWS'
! WRITE(IU,'(1X,A)') 'HARMONIC'
! WRITE(IU,'(A)') '[VARIABLECV [DEWATERED]]'
! WRITE(IU,'(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 + top/bottom = summary file with bnd/top/bot
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(II.EQ.2)THEN
IF(IM.EQ.1)THEN
DO I=1,1; IF(.NOT.IDFREAD(TOP(1,I),TRIM(DIR)//'\GWF_'//TRIM(ITOS(M1))//'\MODELINPUT\DIS6\TOP_L'//TRIM(ITOS(I ))//'.IDF',1))RETURN; ENDDO
DO I=2,MNLAY(IM); IF(.NOT.IDFREAD(TOP(1,I),TRIM(DIR)//'\GWF_'//TRIM(ITOS(M1))//'\MODELINPUT\DIS6\BOT_L'//TRIM(ITOS(I-1))//'.IDF',1))RETURN; ENDDO
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
DO I=1,MNLAY(IM); IF(.NOT.IDFREAD(BOT(1,I),TRIM(DIR)//'\GWF_'//TRIM(ITOS(M1))//'\MODELINPUT\DIS6\BOT_L'//TRIM(ITOS(I ))//'.IDF',1))RETURN; ENDDO
ELSE
DO I=1,1; IF(.NOT.IDFREAD(TOP(2,I),TRIM(DIR)//'\GWF_'//TRIM(ITOS(M2))//'\MODELINPUT\DIS6\TOP_L'//TRIM(ITOS(I ))//'.IDF',1))RETURN; ENDDO
DO I=2,MNLAY(IM); IF(.NOT.IDFREAD(TOP(2,I),TRIM(DIR)//'\GWF_'//TRIM(ITOS(M2))//'\MODELINPUT\DIS6\BOT_L'//TRIM(ITOS(I-1))//'.IDF',1))RETURN; ENDDO
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
DO I=1,MNLAY(IM); IF(.NOT.IDFREAD(BOT(2,I),TRIM(DIR)//'\GWF_'//TRIM(ITOS(M2))//'\MODELINPUT\DIS6\BOT_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),TOP(2,MAXNLAY),BOT(2,MAXNLAY))
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
DO I=1,SIZE(BND,1); DO J=1,SIZE(BND,2); CALL IDFNULLIFY(BND(I,J)); ENDDO; ENDDO
ENDIF
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
!## who is smallest in cellsize and/or dimension
IMDL1=1; IMDL2=2; LSUBMODEL=.FALSE.; TLAYMODEL=''; IMDL(IMDL1)=M1; IMDL(IMDL2)=M2
!## check size first
IF(BND(2,1)%XMIN.GT.BND(1,1)%XMIN.AND. &
BND(2,1)%XMAX.LT.BND(1,1)%XMAX.AND. &
BND(2,1)%YMIN.GT.BND(1,1)%YMIN.AND. &
BND(2,1)%YMAX.LT.BND(1,1)%YMAX)THEN
!## throw an error in the case a submodel, is coarser - not supported
IF(BND(2,1)%DX.GT.BND(1,1)%DX)THEN
WRITE(*,'(/A/)') 'A submodel need to have at least a cellsize which is equal or smaller than the overlapping model'; STOP
ENDIF
IMDL1=2; IMDL2=1; IMDL(IMDL1)=M2; IMDL(IMDL2)=M1; LSUBMODEL=.TRUE.
!## check size second
ELSEIF(BND(1,1)%XMIN.GT.BND(2,1)%XMIN.AND. &
BND(1,1)%XMAX.LT.BND(2,1)%XMAX.AND. &
BND(1,1)%YMIN.GT.BND(2,1)%YMIN.AND. &
BND(1,1)%YMAX.LT.BND(2,1)%YMAX)THEN
!## throw an error in the case a submodel, is coarser - not supported
IF(BND(1,1)%DX.GT.BND(2,1)%DX)THEN
WRITE(*,'(/A/)') 'A submodel need to have at least a cellsize which is equal or smaller than the overlapping model'; STOP
ENDIF
LSUBMODEL=.TRUE.
!## if not, equal model size but different layers
ELSEIF(BND(2,1)%XMIN.EQ.BND(1,1)%XMIN.AND. &
BND(2,1)%XMAX.EQ.BND(1,1)%XMAX.AND. &
BND(2,1)%YMIN.EQ.BND(1,1)%YMIN.AND. &
BND(2,1)%YMAX.EQ.BND(1,1)%YMAX)THEN
IF(BND(2,1)%DX.LT.BND(1,1)%DX)THEN
IMDL1=2; IMDL2=1; IMDL(IMDL1)=M2; IMDL(IMDL2)=M1
ENDIF
!## determine whether submodel is on top or bottom
DO IROW=1,BND(IMDL1,1)%NROW; DO ICOL=1,BND(IMDL1,1)%NCOL
IF(BND(IMDL1,1)%X(ICOL,IROW).EQ.1)THEN
T=TOP(IMDL1,1)%X(ICOL,IROW)
B=BOT(IMDL1,1)%X(ICOL,IROW)
Z1=B+0.5D0*(T-B)
!## get z from other model
CALL IDFGETLOC(BND(IMDL1,1),IROW,ICOL,XP,YP)
CALL IDFIROWICOL(BND(IMDL2,1),JROW,JCOL,XP,YP)
!## outside parent model
IF(JROW.LE.0.OR.JCOL.LE.0)RETURN
T=TOP(IMDL2,1)%X(JCOL,JROW)
B=BOT(IMDL2,1)%X(JCOL,JROW)
Z2=B+0.5D0*(T-B)
IF(Z2.GT.Z1)THEN
IF(TLAYMODEL.EQ.'')THEN
TLAYMODEL='T' !## other model is on top
ELSEIF(TLAYMODEL.NE.'T')THEN
WRITE(*,'(/1X,A/)') 'Vertical TOP inconsistency between two submodels'; STOP
ENDIF
ELSEIF(Z2.LT.Z1)THEN
IF(TLAYMODEL.EQ.'')THEN
TLAYMODEL='B' !## other model is at bottom
ELSEIF(TLAYMODEL.NE.'B')THEN
WRITE(*,'(/1X,A/)') 'Vertical BOT inconsistency between two submodels'; STOP
ENDIF
ENDIF
ENDIF
ENDDO; ENDDO
IF(TLAYMODEL.EQ.'')THEN
WRITE(*,'(/1X,A/)') 'Cannot position model horizontally or vertically'; STOP
ENDIF
ENDIF
DO I=1,2
N=0
DO ILAY=1,MNLAY(IMDL1)
IF(LSUBMODEL)THEN
!## isubmodel 1 en isubmodel 2 komen uit grid
!## north connection
IF(I.EQ.2)WRITE(IU,'(/A)') '# North Cell Connections'
DO IROW=1,BND(IMDL1,ILAY)%NROW; DO ICOL=1,BND(IMDL1,ILAY)%NCOL
!## skip inactive cells
IF(BND(IMDL1,ILAY)%X(ICOL,IROW).EQ.BND(IMDL1,ILAY)%NODATA)CYCLE
!## found boundary cell
LEX=.FALSE.; IF(IROW.EQ.1)LEX=.TRUE.
IF(IROW.GT.1)THEN; LEX=BND(IMDL1,ILAY)%X(ICOL,IROW-1).EQ.BND(IMDL1,ILAY)%NODATA; ENDIF
IF(LEX)THEN
IF(PMANAGER_SAVEMF6_EXG_CONNECTIONS('N',IU,ILAY,IROW,ICOL,IMDL1,IMDL2,MNLAY(IMDL1),MNLAY(IMDL2), &
BND(IMDL1,ILAY),BND(IMDL2,ILAY),TOP(IMDL1,ILAY),BOT(IMDL1,ILAY),TOP(IMDL2,ILAY),BOT(IMDL2,ILAY),I))N=N+1
ENDIF
ENDDO; ENDDO
!## south connection
IF(I.EQ.2)WRITE(IU,'(/A)') '# South Cell Connections'
DO IROW=1,BND(IMDL1,ILAY)%NROW; DO ICOL=1,BND(IMDL1,ILAY)%NCOL
!## skip inactive cells
IF(BND(IMDL1,ILAY)%X(ICOL,IROW).EQ.BND(IMDL1,ILAY)%NODATA)CYCLE
!## found boundary cell
LEX=.FALSE.; IF(IROW.EQ.BND(IMDL1,ILAY)%NROW)LEX=.TRUE.
IF(IROW.LT.BND(IMDL1,ILAY)%NROW)THEN; LEX=BND(IMDL1,ILAY)%X(ICOL,IROW+1).EQ.BND(IMDL1,ILAY)%NODATA; ENDIF
IF(LEX)THEN
IF(PMANAGER_SAVEMF6_EXG_CONNECTIONS('S',IU,ILAY,IROW,ICOL,IMDL1,IMDL2,MNLAY(IMDL1),MNLAY(IMDL2), &
BND(IMDL1,ILAY),BND(IMDL2,ILAY),TOP(IMDL1,ILAY),BOT(IMDL1,ILAY),TOP(IMDL2,ILAY),BOT(IMDL2,ILAY),I))N=N+1
ENDIF
ENDDO; ENDDO
!## west connection
IF(I.EQ.2)WRITE(IU,'(/A)') '# West Cell Connections'
DO IROW=1,BND(IMDL1,ILAY)%NROW; DO ICOL=1,BND(IMDL1,ILAY)%NCOL
!## skip inactive cells
IF(BND(IMDL1,ILAY)%X(ICOL,IROW).EQ.BND(IMDL1,ILAY)%NODATA)CYCLE
!## found boundary cell
LEX=.FALSE.; IF(ICOL.EQ.1)LEX=.TRUE.
IF(ICOL.GT.1)THEN; LEX=BND(IMDL1,ILAY)%X(ICOL-1,IROW).EQ.BND(IMDL1,ILAY)%NODATA; ENDIF
IF(LEX)THEN
IF(PMANAGER_SAVEMF6_EXG_CONNECTIONS('W',IU,ILAY,IROW,ICOL,IMDL1,IMDL2,MNLAY(IMDL1),MNLAY(IMDL2), &
BND(IMDL1,ILAY),BND(IMDL2,ILAY),TOP(IMDL1,ILAY),BOT(IMDL1,ILAY),TOP(IMDL2,ILAY),BOT(IMDL2,ILAY),I))N=N+1
ENDIF
ENDDO; ENDDO
!## east connection
IF(I.EQ.2)WRITE(IU,'(/A)') '# East Cell Connections'
DO IROW=1,BND(IMDL1,ILAY)%NROW; DO ICOL=1,BND(IMDL1,ILAY)%NCOL
!## skip inactive cells
IF(BND(IMDL1,ILAY)%X(ICOL,IROW).EQ.BND(IMDL1,ILAY)%NODATA)CYCLE
!## found boundary cell
LEX=.FALSE.; IF(ICOL.EQ.BND(IMDL1,ILAY)%NCOL)LEX=.TRUE.
IF(ICOL.LT.BND(IMDL1,ILAY)%NCOL)THEN; LEX=BND(IMDL1,ILAY)%X(ICOL+1,IROW).EQ.BND(IMDL1,ILAY)%NODATA; ENDIF
IF(LEX)THEN
IF(PMANAGER_SAVEMF6_EXG_CONNECTIONS('E',IU,ILAY,IROW,ICOL,IMDL1,IMDL2,MNLAY(IMDL1),MNLAY(IMDL2), &
BND(IMDL1,ILAY),BND(IMDL2,ILAY),TOP(IMDL1,ILAY),BOT(IMDL1,ILAY),TOP(IMDL2,ILAY),BOT(IMDL2,ILAY),I))N=N+1
ENDIF
ENDDO; ENDDO
ENDIF
ENDDO
!## define connection from top-bottom
IF(TRIM(TLAYMODEL).NE.'')THEN
DO IROW=1,BND(IMDL1,1)%NROW; DO ICOL=1,BND(IMDL1,1)%NCOL
IF(TLAYMODEL.EQ.'T')THEN
IF(PMANAGER_SAVEMF6_EXG_CONNECTIONS(TLAYMODEL,IU,1,IROW,ICOL,IMDL1,IMDL2,MNLAY(IMDL1),MNLAY(IMDL2), &
BND(IMDL1,1),BND(IMDL2,MNLAY(IMDL2)),TOP(IMDL1,1),BOT(IMDL1,1),TOP(IMDL2,MNLAY(IMDL2)),BOT(IMDL2,MNLAY(IMDL2)),I))N=N+1
ELSEIF(TLAYMODEL.EQ.'B')THEN
IF(PMANAGER_SAVEMF6_EXG_CONNECTIONS(TLAYMODEL,IU,MNLAY(IMDL1),IROW,ICOL,IMDL1,IMDL2,MNLAY(IMDL1),MNLAY(IMDL2), &
BND(IMDL1,MNLAY(IMDL1)),BND(IMDL2,1),TOP(IMDL1,MNLAY(IMDL1)),BOT(IMDL1,MNLAY(IMDL1)),TOP(IMDL2,1),BOT(IMDL2,1),I))N=N+1
ENDIF
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))
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)
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)
END SUBROUTINE PMANAGER_SAVEMF6_EXG
!###======================================================================
LOGICAL FUNCTION PMANAGER_SAVEMF6_EXG_CONNECTIONS(CDIR,IU,ILAY,IROW,ICOL,IMDL1,IMDL2,NLAY1,NLAY2,BND1,BND2,TOP1,BOT1,TOP2,BOT2,IIU)
!###======================================================================
IMPLICIT NONE
CHARACTER(LEN=*),INTENT(IN) :: CDIR
TYPE(IDFOBJ),INTENT(IN) :: BND1,BND2,TOP1,BOT1,TOP2,BOT2
INTEGER,INTENT(IN) :: ILAY,IROW,ICOL,IMDL1,IMDL2,IU,IIU,NLAY1,NLAY2
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
REAL(KIND=DP_KIND),DIMENSION(2) :: CL
PMANAGER_SAVEMF6_EXG_CONNECTIONS=.FALSE.
!## current centre location of fine model
CALL IDFGETLOC( BND1,IROW,ICOL,XP1,YP1)
CALL IDFGETEDGE(BND1,IROW,ICOL,X1 ,Y1 ,X2 ,Y2)
!## get vertical position of node
Z2=TOP1%X(ICOL,IROW); Z1=BOT1%X(ICOL,IROW)
DZ1=Z2-Z1; ZP1=Z1+0.5D0*DZ1
!## get cellsize of fine model
CALL IDFGETDXDY(BND1,IROW,ICOL,DX1,DY1)
!## get location of nearest course model
SELECT CASE (CDIR)
CASE ('N'); CALL IDFGETLOC( BND1,IROW-1,ICOL,XP,YP); IHC=1; JLAY=ILAY
CASE ('S'); CALL IDFGETLOC( BND1,IROW+1,ICOL,XP,YP); IHC=1; JLAY=ILAY
CASE ('W'); CALL IDFGETLOC( BND1,IROW,ICOL-1,XP,YP); IHC=1; JLAY=ILAY
CASE ('E'); CALL IDFGETLOC( BND1,IROW,ICOL+1,XP,YP); IHC=1; JLAY=ILAY
CASE ('T'); CALL IDFGETLOC( BND1,IROW,ICOL ,XP,YP); IHC=0; JLAY=NLAY2
CASE ('B'); CALL IDFGETLOC( BND1,IROW,ICOL ,XP,YP); IHC=0; JLAY=1
END SELECT
CALL IDFIROWICOL(BND2,JROW,JCOL,XP,YP)
!## outside parent model
IF(JROW.LE.0.OR.JCOL.LE.0)RETURN
!## active cell?
IF(BND2%X(JCOL,JROW).EQ.BND2%NODATA)RETURN
!## get location of cell outside submodel
CALL IDFGETLOC(BND2,JROW,JCOL,XP2,YP2)
!## get vertical position of node
DZ2=TOP2%X(JCOL,JROW)-BOT2%X(JCOL,JROW)
ZP2=BOT2%X(JCOL,JROW)+0.5D0*DZ2
!## get cellsize of course model
CALL IDFGETDXDY(BND2,JROW,JCOL,DX2,DY2)
CELLID(IMDL1,1)=ILAY
CELLID(IMDL1,2)=IROW
CELLID(IMDL1,3)=ICOL
CELLID(IMDL2,1)=JLAY
CELLID(IMDL2,2)=JROW
CELLID(IMDL2,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(IMDL1)=UTL_DIST(XP1,YP1,XINT1,YINT1)
CL(IMDL2)=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(IMDL1)=UTL_DIST_3D(XP1,YP1,ZP1,XINT1,YINT1,ZINT1)
CL(IMDL2)=UTL_DIST_3D(XP2,YP2,ZP2,XINT2,YINT2,ZINT2)
HWVA=(X2-X1)*(Y2-Y1)
ENDIF
IF(IIU.EQ.2)WRITE(IU,'(7I10,4G15.7)') (CELLID(1,I),I=1,3),(CELLID(2,I),I=1,3),IHC,CL(1),CL(2),HWVA
PMANAGER_SAVEMF6_EXG_CONNECTIONS=.TRUE.
END FUNCTION PMANAGER_SAVEMF6_EXG_CONNECTIONS
!###======================================================================
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=SP_KIND) :: ST,SB
!## make sure nodata for anisotropy factors is 1.0D0
IF(LANI)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
ENDIF
!## clean from bottom to top inactive layers with zero conductance
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
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
SB=REAL(BOT(ILAY)%X(ICOL,IROW),4)
ST=REAL(TOP(ILAY)%X(ICOL,IROW),4)
SB=MIN(ST,SB)
BOT(ILAY)%X(ICOL,IROW)=DBLE(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)=DBLE(ST)
ENDIF
!## store last active layer
JLAY=ILAY
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-1) ,VA(PRJNLAY) ,IB(PRJNLAY),TH(PRJNLAY,2), &
TP_BU(PRJNLAY),BT_BU(PRJNLAY),HK_BU(PRJNLAY),VK_BU(PRJNLAY-1),VA_BU(PRJNLAY))
DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL
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
DO ILAY=1,PRJNLAY-1; VK(ILAY)=KVV(ILAY)%X(ICOL,IROW); ENDDO
CALL UTL_MINTHICKNESS(TP,BT,HK,VK,VA,TP_BU,BT_BU,HK_BU,VK_BU,VA_BU,IB,TH,PBMAN%MINTHICKNESS)
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
BOT(ILAY)%X(ICOL,IROW)=BOT(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
ENDIF
ENDDO
ENDDO; ENDDO
DEALLOCATE(TP,BT,HK,VK,VA,IB,TH,TP_BU,BT_BU,HK_BU,VK_BU,VA_BU)
ENDIF
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
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
END SUBROUTINE PMANAGER_SAVEMF2005_CONSISTENCY
!###======================================================================
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,N1,N2
CHARACTER(LEN=52) :: MNAME
CHARACTER(LEN=256) :: NAME
PMANAGER_SAVEMF2005_NAM=.FALSE.
!## result main folder
IF(LEN_TRIM(PBMAN%OUTPUT).EQ.0)THEN
MAINDIR=FNAME(:INDEX(FNAME,'\',.TRUE.)-1)
ELSE
MAINDIR=TRIM(PBMAN%OUTPUT)
ENDIF
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')
!## write *.nam file for modflow 6
IF(PBMAN%IFORMAT.EQ.3.AND.PBMAN%ISUBMODEL.EQ.1)THEN
IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(MAINDIR)//'\MFSIM.NAM',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'
![CONTINUE]
![NOCHECK]
![MEMORY_PRINT_OPTION ]
WRITE(IU,'(A)') 'END OPTIONS'
WRITE(IU,'(/A/)') '#Timing Options'
WRITE(IU,'(A)') 'BEGIN TIMING'
WRITE(IU,'(A)') ' TDIS6 .\MFSIM.TDIS6'
WRITE(IU,'(A)') 'END TIMING'
WRITE(IU,'(/A/)') '#List of Models'
WRITE(IU,'(A)') 'BEGIN MODELS'
!## multiply models
DO I=1,PBMAN%NSUBMODEL
WRITE(IU,'(A)') ' GWF6 .\GWF_'//TRIM(ITOS(I))//'\'//TRIM(MNAME)//'.NAM GWF_'//TRIM(ITOS(I))
ENDDO
WRITE(IU,'(A)') 'END MODELS'
WRITE(IU,'(/A/)') '#List of Exchanges'
WRITE(IU,'(A)') 'BEGIN EXCHANGES'
DO I=1,PBMAN%NSUBMODEL
DO J=I+1,PBMAN%NSUBMODEL
WRITE(IU,'(A)') ' GWF6-GWF6 .\MFSIM_M'//TRIM(ITOS(I))//'_M'//TRIM(ITOS(J))//'.EXG GWF_'//TRIM(ITOS(I))//' 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 .\MFSIM.IMS6',(' GWF_'//TRIM(ITOS(I)),I=1,PBMAN%NSUBMODEL)
WRITE(IU,'(A)') 'END SOLUTIONGROUP'
CLOSE(IU)
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(LMSP)CALL UTL_CREATEDIR(TRIM(DIR)//'\MSWAPINPUT')
IF(PBMAN%IFORMAT.EQ.3)THEN
DIRMNAME='GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL))//'\'//TRIM(DIRMNAME)
DIRMNAME='.\'//TRIM(DIRMNAME)
!## write *.nam file
IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIR)//'\'//TRIM(MNAME)//'.NAM',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'
WRITE(IU,'(A)') ' LIST .\GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL))//'\'//TRIM(MNAME)//'.LST'
!## debug option
! IF()WRITE(IU,'(A)') 'PRINT_INPUT'
!## print budgets
! IF()WRITE(IU,'(A)') 'PRINT_FLOWS'
!SAVE FLOWS—keyword to indicate that all model package flow terms will be written to the file specified
!with “BUDGET FILEOUT” in Output Control.
! IF()WRITE(IU,'(A)') 'SAVE_FLOWS'
!NEWTON—keyword that activates the Newton-Raphson formulation for groundwater flow between connected,
!convertible groundwater cells and stress packages that support calculation of Newton-
!Raphson terms for groundwater exchanges. Cells will not dry when this option is used. By default,
!the Newton-Raphson formulation is not applied.
!UNDER RELAXATION—keyword that indicates whether the groundwater head in a cell will be underrelaxed
!when water levels fall below the bottom of the model below any given cell. By default,
!Newton-Raphson UNDER RELAXATION is not applied.
! IF()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'
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'
IF(LCHD) WRITE(IU,'(A)') ' CHD6 '//TRIM(DIRMNAME)//'.CHD6'
IF(LWEL) WRITE(IU,'(A)') ' WEL6 '//TRIM(DIRMNAME)//'.WEL6'
IF(LDRN) WRITE(IU,'(A)') ' DRN6 '//TRIM(DIRMNAME)//'.DRN6'
IF(LRCH) WRITE(IU,'(A)') ' RCH6 '//TRIM(DIRMNAME)//'.RCH6'
IF(LRIV) WRITE(IU,'(A)') ' RIV6 '//TRIM(DIRMNAME)//'.RIV6'
IF(LISG) WRITE(IU,'(A)') ' RIV6 '//TRIM(DIRMNAME)//'.RIV6'
IF(LGHB) WRITE(IU,'(A)') ' GHB6 '//TRIM(DIRMNAME)//'.GHB6'
IF(LHFB) WRITE(IU,'(A)') ' HFB6 '//TRIM(DIRMNAME)//'.HFB6'
WRITE(IU,'(A)') 'END PACKAGES'
CLOSE(IU)
ELSE
DIRMNAME='.\'//TRIM(DIRMNAME)
!## write *.nam file(s)
N1=1; N2=1; IF(PBMAN%IPESTP.EQ.1)THEN; N1=-PBMAN%NLINESEARCH; N2=SIZE(PEST%PARAM); ENDIF
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(FNAME),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
NAME=FNAME(:INDEX(FNAME,'.',.TRUE.)-1)//'_P#'//TRIM(ITOS(I))//'.NAM'
ELSE
NAME=FNAME(:INDEX(FNAME,'.',.TRUE.)-1)//'_L#'//TRIM(ITOS(ABS(I)))//'.NAM'
ENDIF
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.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
IF(I.GT.0)THEN
WRITE(IU,'(A)') 'LIST 10 '//CHAR(39)//'.\'//TRIM(MNAME)//'_P#'//TRIM(ITOS(I))//'.LIST'//CHAR(39)
WRITE(IU,'(A)') 'MET 11 '//CHAR(39)//TRIM(DIRMNAME)//'_P#'//TRIM(ITOS(I))//'.MET7'//CHAR(39)
ELSE
WRITE(IU,'(A)') 'LIST 10 '//CHAR(39)//'.\'//TRIM(MNAME)//'_L#'//TRIM(ITOS(ABS(I)))//'.LIST'//CHAR(39)
WRITE(IU,'(A)') 'MET 11 '//CHAR(39)//TRIM(DIRMNAME)//'_L#'//TRIM(ITOS(ABS(I)))//'.MET7'//CHAR(39)
ENDIF
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) WRITE(IU,'(A)') 'LPF 14 '//CHAR(39)//TRIM(DIRMNAME)//'.LPF7'//CHAR(39)
IF(LPCG) WRITE(IU,'(A)') 'PCG 15 '//CHAR(39)//TRIM(DIRMNAME)//'.PCG7'//CHAR(39)
IF(LPKS) WRITE(IU,'(A)') 'PKS 15 '//CHAR(39)//TRIM(DIRMNAME)//'.PKS'//CHAR(39)
WRITE(IU,'(A)') 'OC 16 '//CHAR(39)//TRIM(DIRMNAME)//'.OC'//CHAR(39)
IF(LRCH) WRITE(IU,'(A)') 'RCH 17 '//CHAR(39)//TRIM(DIRMNAME)//'.RCH7'//CHAR(39)
IF(LEVT) WRITE(IU,'(A)') 'EVT 18 '//CHAR(39)//TRIM(DIRMNAME)//'.EVT7'//CHAR(39)
IF(LDRN.OR.LOLF) WRITE(IU,'(A)') 'DRN 19 '//CHAR(39)//TRIM(DIRMNAME)//'.DRN7'//CHAR(39)
IF(LRIV.OR.LISG) WRITE(IU,'(A)') 'RIV 20 '//CHAR(39)//TRIM(DIRMNAME)//'.RIV7'//CHAR(39)
IF(LGHB) WRITE(IU,'(A)') 'GHB 21 '//CHAR(39)//TRIM(DIRMNAME)//'.GHB7'//CHAR(39)
IF(LCHD) WRITE(IU,'(A)') 'CHD 22 '//CHAR(39)//TRIM(DIRMNAME)//'.CHD7'//CHAR(39)
IF(LWEL) WRITE(IU,'(A)') 'WEL 23 '//CHAR(39)//TRIM(DIRMNAME)//'.WEL7'//CHAR(39)
IF(LHFB) WRITE(IU,'(A)') 'HFB6 24 '//CHAR(39)//TRIM(DIRMNAME)//'.HFB7'//CHAR(39)
IF(LSFR) WRITE(IU,'(A)') 'SFR 25 '//CHAR(39)//TRIM(DIRMNAME)//'.SFR7'//CHAR(39)
IF(LFHB)THEN; WRITE(IU,'(A)') 'FHB 26 '//CHAR(39)//TRIM(DIRMNAME)//'.FHB7'//CHAR(39); IFHBUN=26; ENDIF
IF(LLAK) WRITE(IU,'(A)') 'LAK 27 '//CHAR(39)//TRIM(DIRMNAME)//'.LAK7'//CHAR(39)
IF(LUZF) WRITE(IU,'(A)') 'UZF 28 '//CHAR(39)//TRIM(DIRMNAME)//'.UZF7'//CHAR(39)
IF(LMNW) WRITE(IU,'(A)') 'MNW2 29 '//CHAR(39)//TRIM(DIRMNAME)//'.MNW7'//CHAR(39)
IF(LANI) WRITE(IU,'(A)') 'ANI 30 '//CHAR(39)//TRIM(DIRMNAME)//'.ANI1'//CHAR(39)
IF(LMSP) WRITE(IU,'(A)') 'DXC 31 '//CHAR(39)//TRIM(DIRMNAME)//'.DXC'//CHAR(39)
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(LRCH)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IRCHCB,' '//CHAR(39)//'BDGRCH'//CHAR(39)
IF(LEVT)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IEVTCB,' '//CHAR(39)//'BDGEVT'//CHAR(39)
IF(LDRN.OR.LOLF)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IDRNCB,' '//CHAR(39)//'BDGDRN'//CHAR(39)
IF(LRIV.OR.LISG)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IRIVCB,' '//CHAR(39)//'BDGRIV'//CHAR(39)
IF(LGHB)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IGHBCB,' '//CHAR(39)//'BDGGHB'//CHAR(39)
IF(LCHD)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',ICHDCB,' '//CHAR(39)//'BDGCHD'//CHAR(39)
IF(LWEL)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IWELCB,' '//CHAR(39)//'BDGWEL'//CHAR(39)
IF(LSFR)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(LFHB)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IFHBCB ,' '//CHAR(39)//'BDGFHB'//CHAR(39)
IF(LLAK)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',ILAKCB ,' '//CHAR(39)//'BDGLAK'//CHAR(39)
IF(LUZF)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IUZFCB1,' '//CHAR(39)//'UZFINF BDGGRC BDGGET UZFRUN UZFET UZFSFR'//CHAR(39)
IF(LMNW)WRITE(IU,'(A,I3,A)') 'DATA(BINARYIDF) ',IWL2CB ,' '//CHAR(39)//'BDGMNW'//CHAR(39)
IF(LUZF)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
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')
PMANAGER_SAVEMF2005_NAM=.TRUE.
END FUNCTION PMANAGER_SAVEMF2005_NAM
!###======================================================================
LOGICAL FUNCTION PMANAGER_SAVEMF2005_SIM(ISS,IBATCH)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: ISS,IBATCH
INTEGER :: ILAY
REAL(KIND=DP_KIND) :: X1,Y1,X2,Y2
PMANAGER_SAVEMF2005_SIM=.FALSE.
!## read idf for dimensions
CALL IDFNULLIFY(PRJIDF); IFULL=0
IF(.NOT.PMANAGER_INIT_SIMAREA(PRJIDF,IBATCH))RETURN
IF(ISUBMODEL.EQ.1)THEN
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)
!## see what boundary (submodel?)
IF(SUBMODEL(1).GT.PRJIDF%XMIN)IFULL(1)=1; IF(SUBMODEL(2).GT.PRJIDF%YMIN)IFULL(2)=1
IF(SUBMODEL(3).LT.PRJIDF%XMAX)IFULL(3)=1; IF(SUBMODEL(4).LT.PRJIDF%YMAX)IFULL(4)=1
!## 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
IF(.NOT.IDFALLOCATEX(PRJIDF))RETURN
ENDIF
!## fill sx/sy variable in idf
IF(.NOT.IDFFILLSXSY(PRJIDF))RETURN
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(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(LANI)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(LLAK)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(LSFT)THEN
ALLOCATE(SFT(2)); DO ILAY=1,SIZE(SFT); CALL IDFNULLIFY(SFT(ILAY)); ENDDO
! ENDIF
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(LANI)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(LLAK)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(LSFT)THEN
DO ILAY=1,SIZE(SFT); CALL IDFCOPY(PRJIDF,SFT(ILAY)); ENDDO
ENDIF
PMANAGER_SAVEMF2005_SIM=.TRUE.
END FUNCTION PMANAGER_SAVEMF2005_SIM
!####====================================================================
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(.NOT.LPST)RETURN
!## overrule is by imod batch
IF(IBATCH.EQ.1.AND.PBMAN%IPEST+PBMAN%IPESTP.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
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; N1=-PBMAN%NLINESEARCH; N2=SIZE(PEST%PARAM); 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
PMANAGER_SAVEMF2005_PST_READWRITE=.TRUE.
END FUNCTION PMANAGER_SAVEMF2005_PST_READWRITE
!####====================================================================
LOGICAL FUNCTION PMANAGER_SAVEMF2005_BAS_READ(IPRT)
!####====================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: IPRT
INTEGER :: ITOPIC,SCL_D,SCL_U,ILAY
PMANAGER_SAVEMF2005_BAS_READ=.FALSE.
ALLOCATE(FNAMES(PRJNLAY),PRJILIST(1))
!## bnd settings
ITOPIC=4; 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))RETURN
!## adjust boundary for submodel()
CALL PMANAGER_SAVEMF2005_BND(ILAY)
ENDDO
!## shd settings
ITOPIC=5; SCL_D=PBMAN%INTSHD; 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)
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
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)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%INTTOP; 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=2; 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=3; 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,ITOPIC,ICOL,IROW,N,I
INTEGER,ALLOCATABLE,DIMENSION(:) :: LCBD
REAL(KIND=DP_KIND) :: T
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)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=2
!## 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,ITOPIC))RETURN
ENDIF
ITOPIC=3
IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\DIS6\BOTM_L'//TRIM(ITOS(ILAY))//'.ARR', &
BOT(ILAY),0,IU,ILAY,ITOPIC))RETURN
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'
LINE=TRIM(LINE)//' ['//TRIM(SIM(KPER)%CDATE)//']'
WRITE(IU,'(A)') TRIM(LINE)
ENDDO
ELSE
WRITE(IU,'(/A/)') 'General Options'
WRITE(IU,'(A)') 'BEGIN OPTIONS'
WRITE(IU,'(A)') ' LENGTH_UNITS METERS'
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)) !PRJNLAY))
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
WRITE(IU,'(/A/)') '#Vertical Configuration'
WRITE(IU,'(A)') 'TOP'
ITOPIC=2
!## get first model layer
DO I=1,SIZE(PBMAN%ILAY); IF(PBMAN%ILAY(I).EQ.1)EXIT; ENDDO
!## quasi-3d scheme add top aquifer modellayer
IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\DIS6\TOP_L'//TRIM(ITOS(1))//'.ARR', &
TOP(I),0,IU,1,ITOPIC))RETURN
!## write idf for connection-purposes
IF(.NOT.IDFWRITE(TOP(I),TRIM(DIR)//'\DIS6\TOP_L'//TRIM(ITOS(1))//'.IDF',1))RETURN
WRITE(IU,'(A)') 'BOTM LAYERED'
ITOPIC=3
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)//'\DIS6\BOTM_L'//TRIM(ITOS(JLAY))//'.ARR', &
BOT(ILAY),0,IU,ILAY,ITOPIC))RETURN
!## write idf for connection-purposes
IF(.NOT.IDFWRITE(BOT(ILAY),TRIM(DIR)//'\DIS6\BOT_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
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
! BND(ILAY)%X=PRJIDF%X
!## 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_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=11; SCL_D=PBMAN%INTSF1; 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=6; SCL_D=PBMAN%INTKDW; 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
ITOPIC=9; SCL_D=PBMAN%INTVCW; 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.0D0' !## 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
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
REAL(KIND=DP_KIND) :: T,T1,T2,T3
PMANAGER_SAVEMF2005_LPF_READ=.TRUE.
!## use lpf6
IF(.NOT.LLPF.AND..NOT.LNPF)RETURN
ALLOCATE(FNAMES(1),PRJILIST(1))
PMANAGER_SAVEMF2005_LPF_READ=.FALSE.
DO ILAY=1,PRJNLAY
WRITE(6,'(A)') '+Reading LPF-files ('//TRIM(RTOS(REAL(100*ILAY,8)/REAL(PRJNLAY,8),'F',2))//'%) '
!## hkv
ITOPIC=7; SCL_D=PBMAN%INTKHV; 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=8; SCL_D=PBMAN%INTKVA; 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)
!## transient simulation
IF(ISS.EQ.1)THEN
!## sf1 - specific storage
ITOPIC=11; SCL_D=PBMAN%INTSF1; 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=12; SCL_D=PBMAN%INTSF2; 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
ENDIF
!## quasi-3d scheme add vertical hydraulic conductivity of interbed
IF(LQBD.AND.ILAY.NE.PRJNLAY)THEN
!## kvv
ITOPIC=10; SCL_D=PBMAN%INTKVV; 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
!## 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).NE.0)THEN
T=TOP(ILAY)%X(ICOL,IROW)-BOT(ILAY)%X(ICOL,IROW)
KDW(ILAY)%X(ICOL,IROW)=T*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(KHV(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)=0.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))
T3=0.0D0; IF(KHV(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
DEALLOCATE(FNAMES,PRJILIST)
PMANAGER_SAVEMF2005_LPF_READ=.TRUE.
END FUNCTION PMANAGER_SAVEMF2005_LPF_READ
!####====================================================================
LOGICAL FUNCTION PMANAGER_SAVEMF2005_LPF_SAVE(DIR,DIRMNAME,IBATCH,ISS)
!####====================================================================
IMPLICIT NONE
REAL(KIND=DP_KIND),PARAMETER :: WETDRYTHRESS=0.1D0
CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME
INTEGER,INTENT(IN) :: IBATCH,ISS
REAL(KIND=DP_KIND) :: WETFCT,T,KD,D
INTEGER :: IU,ILAY,IFBND,IHDWET,IWETIT,IROW,ICOL
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
LINE=TRIM(ITOS(IBCFCB))//','//TRIM(RTOS(HNOFLOW,'G',7))//',0,STORAGECOEFFICIENT,THICKSTRT,CONSTANTCV'
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
LINE=''; DO ILAY=1,PRJNLAY; LINE=TRIM(LINE)//'1.0D0,'
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)
!## 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
WETFCT=0.1 !## multiplication to determine head in dry cell
IHDWET=0 !## option to compute rewetted model layers; h = BOT + WETFCT (hn - BOT)
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
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
!## hk
IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\LPF7\HK_L'//TRIM(ITOS(ILAY))//'.ARR', &
KHV(ILAY),0,IU,ILAY,IFBND))RETURN
!## 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).NE.1)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).NE.1.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=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
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 !1.0D0 <- converges
CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME
INTEGER,INTENT(IN) :: IBATCH
REAL(KIND=DP_KIND) :: WETFCT,T,KDMIN,KD,THICK
INTEGER :: IU,ILAY,JLAY,IFBND,IHDWET,IWETIT,IROW,ICOL
PMANAGER_SAVEMF2005_NPF_SAVE=.TRUE.; IF(PBMAN%IFORMAT.EQ.2)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'
WRITE(IU,'(A)') ' SAVE_FLOWS'
WRITE(IU,'(A)') ' ALTERNATIVE_CELL_AVERAGING AMT-HMK'
WRITE(IU,'(A)') ' THICKSTRT'
!THICKSTRT—indicates that cells having a negative ICELLTYPE are confined, and their cell thickness
! WRITE(IU,'(A)') ' [VARIABLECV [DEWATERED]]'
!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.1 !## 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
IF(LAYCON(ILAY).EQ.2)EXIT
ENDDO
IF(ILAY.LE.PRJNLAY)THEN
IWETIT=1
WRITE(IU,'(A)') ' REWET WETFCT '//TRIM(RTOS(WETFCT,'F',3))// &
' IWETIT '//TRIM(ITOS(IWETIT))//' IHDWET '//TRIM(ITOS(IHDWET))
ENDIF
! WRITE(IU,'(A)') ' [XT3D [RHS]]'
! 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) !PRJNLAY
IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE
IF(LAYCON(ILAY).EQ.1)WRITE(IU,'(A)') ' CONSTANT 0' !## confined
IF(LAYCON(ILAY).EQ.2)WRITE(IU,'(A)') ' CONSTANT 1' !## convertible head-bot
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
KDMIN=MAX(0.01D0,PBMAN%MINKD)
DO ILAY=1,SIZE(PBMAN%ILAY)
IF(KDMIN.GT.0.0D0)THEN
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.GT.0.0D0)THEN
KD=THICK*KHV(ILAY)%X(ICOL,IROW)
IF(KD.LT.KDMIN)KHV(ILAY)%X(ICOL,IROW)=KDMIN/THICK
ENDIF
ENDDO; ENDDO
ENDIF
ENDDO
WRITE(IU,'(A)') ' K LAYERED'
JLAY=0; DO ILAY=1,SIZE(PBMAN%ILAY)
IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE
JLAY=JLAY+1
!## hk
IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\NPF\K_L'//TRIM(ITOS(JLAY))//'.ARR', &
KHV(ILAY),0,IU,ILAY,IFBND))RETURN
ENDDO
! WRITE(IU,'(A)') ' K22 LAYERED'
! -- READARRAY]
!## 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)=KHV(ILAY)%X(ICOL,IROW)/KVA(ILAY)%X(ICOL,IROW)
ENDIF
ENDDO; ENDDO
IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\NPF\K33_L'//TRIM(ITOS(JLAY))//'.ARR', &
PRJIDF,0,IU,ILAY,IFBND))RETURN
ENDDO
! WRITE(IU,'(A)') ' ANGLE1 LAYERED'
! WRITE(IU,'(A)') ' ANGLE2 LAYERED'
! WRITE(IU,'(A)') ' ANGLE3 LAYERED'
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
IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\NPF\WETDRY_L'//TRIM(ITOS(JLAY))//'.ARR', &
PRJIDF,0,IU,ILAY,0))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_STO_SAVE(DIR,DIRMNAME,IBATCH,ISS)
!####====================================================================
IMPLICIT NONE
CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME
INTEGER,INTENT(IN) :: IBATCH,ISS
INTEGER :: IU,ILAY,ISY,KPER
PMANAGER_SAVEMF2005_STO_SAVE=.TRUE.; IF(PBMAN%IFORMAT.EQ.2)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'
WRITE(IU,'(A)') ' SAVE_FLOWS'
WRITE(IU,'(A)') ' STORAGECOEFFICIENT' !## specific coefficient given if NOT mentioned
WRITE(IU,'(A)') 'END OPTIONS'
WRITE(IU,'(/A/)') '#Geology Options'
WRITE(IU,'(A)') 'BEGIN GRIDDATA'
WRITE(IU,'(A)') ' ICONVERT LAYERED'
ISY=0
DO ILAY=1,PRJNLAY
IF(LAYCON(ILAY).EQ.2)THEN
WRITE(IU,'(A)') ' CONSTANT 1' !## confined storage
ELSE
WRITE(IU,'(A)') ' CONSTANT 0' !## convertible storage
ISY=1
ENDIF
ENDDO
WRITE(IU,'(A)') ' SS LAYERED'
DO ILAY=1,PRJNLAY
!## hk
IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\STO\SS_L'//TRIM(ITOS(ILAY))//'.ARR', &
STO(ILAY),0,IU,ILAY,1))RETURN
ENDDO
IF(ISY.EQ.1)THEN
WRITE(IU,'(A)') ' SY LAYERED'
DO ILAY=1,PRJNLAY
!## hk
IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\STO\SY_L'//TRIM(ITOS(ILAY))//'.ARR', &
SPY(ILAY),0,IU,ILAY,1))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(.NOT.LANI)RETURN
WRITE(*,'(/A)') 'Reading ANI-files ...'
PMANAGER_SAVEMF2005_ANI_READ=.FALSE.
!## ani angle
IINV=0; ITOPIC=14
!## allocate memory for packages
NTOP=SIZE(TOPICS(ITOPIC)%STRESS(1)%FILES,1); NSYS=SIZE(TOPICS(ITOPIC)%STRESS(1)%FILES,2)
!## 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
WRITE(6,'(A)') '+Reading ANI-files ('//TRIM(RTOS(REAL(100*ISYS,8)/REAL(NSYS,8),'F',2))//'%)'
!## 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
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)
!## average factor
IF(KTOP.EQ.1)THEN
!## constant value
IF(ICNST.EQ.1)THEN
ANF(ILAY)%X=CNST
!## read/clip/scale idf file
ELSEIF(TOPICS(ITOPIC)%STRESS(1)%FILES(KTOP,ISYS)%ICNST.EQ.2)THEN
ANF(ILAY)%FNAME=SFNAME
SCL_U=2
SCL_D=PBMAN%INTANF !## factors can be interpolated
IF(.NOT.IDFREADSCALE(ANF(ILAY)%FNAME,ANF(ILAY),SCL_U,SCL_D,1.0D0,0))RETURN
ENDIF
CALL PMANAGER_SAVEMF2005_FCTIMP(0,ICNST,ANF(ILAY),FCT,IMP,SCL_D)
CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,ANF(ILAY),0,ITOPIC)
!## most frequent occurence for angles
ELSEIF(KTOP.EQ.2)THEN
!## constant value
IF(ICNST.EQ.1)THEN
ANA(ILAY)%X=CNST
!## read/clip/scale idf file
ELSEIF(TOPICS(ITOPIC)%STRESS(1)%FILES(KTOP,ISYS)%ICNST.EQ.2)THEN
ANA(ILAY)%FNAME=SFNAME
SCL_U=7
SCL_D=0 !## no interpolation of angles
IF(.NOT.IDFREADSCALE(ANA(ILAY)%FNAME,ANA(ILAY),SCL_U,SCL_D,1.0D0,0))RETURN
ENDIF
CALL PMANAGER_SAVEMF2005_FCTIMP(0,ICNST,ANA(ILAY),FCT,IMP,SCL_D)
CALL PMANAGER_SAVEMF2005_CORRECT(ILAY,BND,ANA(ILAY),0,ITOPIC)
ENDIF
ENDDO
ENDDO
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,IFBND
PMANAGER_SAVEMF2005_ANI_SAVE=.TRUE.
!## use ani1
IF(.NOT.LANI)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
DO ILAY=1,PRJNLAY
!## anisotropy factors
IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\ANI1\ANF_L'//TRIM(ITOS(ILAY))//'.ARR', &
ANF(ILAY),0,IU,ILAY,IFBND))RETURN
!## anisotropy angle
IF(.NOT.PMANAGER_SAVEMF2005_MOD_U2DREL(TRIM(DIR)//'\ANI1\ANA_L'//TRIM(ITOS(ILAY))//'.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,LEX,ITOPIC,ICB,CPCK,IPRT)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: IBATCH,ICB,ITOPIC,IPRT
CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME,CPCK
LOGICAL,INTENT(IN) :: LEX
REAL(KIND=DP_KIND) :: X,Y,Q,Z1,Z2,FCT,IMP,CNST,NCOUNT
CHARACTER(LEN=256) :: SFNAME,EXFNAME,ID,CDIR
CHARACTER(LEN=5) :: EXT
CHARACTER(LEN=30) :: FRM
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
REAL(KIND=DP_KIND),ALLOCATABLE,DIMENSION(:) :: TLP,KH,TP,BT
INTEGER(KIND=8) :: ITIME,JTIME
REAL(KIND=DP_KIND),PARAMETER :: MINKHT=0.0D0
INTEGER,PARAMETER :: ICLAY=1 !## shift to nearest aquifer
CHARACTER(LEN=1) :: VTXT
IF(.NOT.LEX)THEN; PMANAGER_SAVEMF2005_WEL=.TRUE.; RETURN; ENDIF
PMANAGER_SAVEMF2005_WEL=.FALSE.
VTXT='7'; IF(PBMAN%IFORMAT.EQ.3)VTXT='6'
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'
WRITE(IU,'(1X,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,'(1X,A)') ' MAXBOUND NaN1#'
WRITE(IU,'(A)') 'END DIMENSIONS'
ENDIF
! IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.'//CPCK//'7...')
! IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.'//CPCK//'7...'
! IU=UTL_GETUNIT()
! CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.'//CPCK//'7_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED')
! IF(IU.EQ.0)RETURN
!## header
LINE='NaN1#,'//TRIM(ITOS(ICB))//' AUX ISUB WSUBSYS ISUB NOPRINT'
IF(PBMAN%IFORMAT.EQ.2)WRITE(IU,'(A)') TRIM(LINE)
!## fill tlp for each modellayer
ALLOCATE(TLP(PRJNLAY),KH(PRJNLAY),TP(PRJNLAY),BT(PRJNLAY))
WRITE(FRM,'(A9,I2.2,A15)') '(3(I5,1X),',1,'(G15.7,1X),I10)'
!## create subfolders
IF(PBMAN%IFORMAT.EQ.2)CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//'7')
!## maximum number of well in simulation
MP=0
IOS=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)THEN
IF(IPER.EQ.1)THEN; WRITE(IU,'(I10)') 0
ELSE; WRITE(IU,'(I10)') -1; ENDIF
ENDIF
!## goto next timestep
CYCLE
ENDIF
IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(/A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER))
JU=0
!## create subfolders
IF(PBMAN%IFORMAT.EQ.2)THEN
CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//'7')
EXFNAME=TRIM(DIR)//'\'//CPCK//'7'//'\'//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
! ELSE
! JU=IU
! ENDIF
! !## create subfolders
! CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//'7')
! EXFNAME=TRIM(DIR)//'\'//CPCK//'7'//'\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR'
! 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)
DO ISYS=1,NSYS
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)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=MAX(3,IEXT); IF(ILAY.EQ.0)N=MAX(5,IEXT)
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'); EXIT
ENDIF
ALLOCATE(STRING(N)); STRING=''
!## steady-state/transient timestep
ISS=1; IF(SIM(IPER)%DELT.GT.0.0D0)ISS=2
!## overrule in case of steady-state
IF(ISS.EQ.1)IEXT=0
DO I=1,NROWIPF
!## start with current given layer number
ILAY=TOPICS(ITOPIC)%STRESS(KPER)%FILES(1,ISYS)%ILAY
READ(KU,*,IOSTAT=IOS) (STRING(J),J=1,N); IF(IOS.NE.0)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
!## 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
ENDIF
!## assign to several layer
IF(ILAY.EQ.0)THEN
READ(STRING(4),*,IOSTAT=IOS) Z1; IF(IOS.NE.0)EXIT
READ(STRING(5),*,IOSTAT=IOS) Z2; IF(IOS.NE.0)EXIT
!## get filter fractions
CALL PMANAGER_SAVEMF2005_PCK_ULSTRD_PARAM(PRJNLAY,ICOL,IROW,BND,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; 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(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(BND(ILAY)%X(ICOL,IROW).LE.0.0D0)TLP(ILAY)=0.0D0
ENDDO
!## normalize tlp() again
IF(SUM(TLP).GT.0.0D0)TLP=(1.0D0/SUM(TLP))*TLP
DO ILAY=1,PRJNLAY
IF(TLP(ILAY).GT.0.0D0)THEN
WRITE(JU,FRM) ILAY,IROW,ICOL,Q*TLP(ILAY),ISYS
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))//CHAR(13)//'iMOD Probably cannot read values for top and bot in combination with ilay=0','Error'); EXIT
ENDIF
ENDDO
IF(NP.GT.0)THEN
IF(PBMAN%IFORMAT.EQ.2)CALL IDFWRITEFREE_HEADER(JU,PRJIDF)
CLOSE(JU)
ELSE
! IF(PBMAN%IFORMAT.EQ.2)THEN
CLOSE(JU,STATUS='DELETE')
! ELSE
! !## do not delete for MF6
! CLOSE(JU)
! ENDIF
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)THEN
LINE=TRIM(ITOS(NP)); WRITE(IU,'(A)') TRIM(LINE)
ENDIF
IF(NP.GT.0)THEN
SFNAME=EXFNAME
N=3; IF(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:)
WRITE(IU,'(A)') 'OPEN/CLOSE '//TRIM(SFNAME)//' 1.0D0 (FREE) -1'
IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(A)') 'END PERIOD '//TRIM(ITOS(IPER))
ENDIF
ENDIF
ENDDO
CLOSE(IU); DEALLOCATE(TLP,TP,BT,KH)
IF(IOS.EQ.0)THEN
CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',(/MP/))
PMANAGER_SAVEMF2005_WEL=.TRUE.
ENDIF
END FUNCTION PMANAGER_SAVEMF2005_WEL
!###======================================================================
LOGICAL FUNCTION PMANAGER_SAVEMF2005_MNW(DIRMNAME,IBATCH,LEX,ITOPIC,ICB,CPCK,IPRT)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: IBATCH,ICB,ITOPIC,IPRT
CHARACTER(LEN=*),INTENT(IN) :: DIRMNAME,CPCK
LOGICAL,INTENT(IN) :: LEX
REAL(KIND=DP_KIND) :: X,Y,Q,Z1,Z2,FCT,IMP,CNST,RW,RSKIN,KSKIN,NCOUNT
CHARACTER(LEN=256) :: SFNAME,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, &
MNWPRINT,NNODES,ILOSSTYPE,QLIMIT,PPFLAG,PUMPLOC,PUMPCAP,ILOSS,IEQUAL
INTEGER(KIND=8) :: ITIME,JTIME
IF(.NOT.LEX)THEN; PMANAGER_SAVEMF2005_MNW=.TRUE.; RETURN; ENDIF
PMANAGER_SAVEMF2005_MNW=.FALSE.
IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.'//CPCK//'7...')
IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.'//CPCK//'7...'
IU=UTL_GETUNIT()
CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.'//CPCK//'7_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED')
IF(IU.EQ.0)RETURN
!## maximal output information
MNWPRINT=2
!## header
LINE='NaN1#,'//TRIM(ITOS(ICB))//','//TRIM(ITOS(MNWPRINT))//' NOPRINT'; WRITE(IU,'(A)') TRIM(LINE)
!## 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
DO IPER=0,PRJNPER
IF(IPER.GT.0)THEN
!## output
WRITE(IPRT,'(1X,A,I10)') 'Exporting timestep ',IPER
!## get appropriate stress-period to store in runfile
KPER=PMANAGER_GETCURRENTIPER(IPER,ITOPIC,ITIME,JTIME)
!## always export extraction values
KPER=ABS(KPER)
ENDIF
IF(IPER.GT.0)THEN; LINE='NaN'//TRIM(ITOS(IPER+1))//'#'; WRITE(IU,'(A)') TRIM(LINE); ENDIF
!## get number of mnw-systems
NSYS=SIZE(TOPICS(ITOPIC)%STRESS(KPER)%FILES,2)
DO ISYS=1,NSYS
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(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; EXIT
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)
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
DO I=1,NROWIPF
!## start with current given layer number
ILAY=TOPICS(ITOPIC)%STRESS(KPER)%FILES(1,ISYS)%ILAY
READ(KU,*,IOSTAT=IOS) (STRING(J),J=1,N); IF(IOS.NE.0)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
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
LINE='WELLID_'//TRIM(ITOS(NP_IPER(IPER)))//','//TRIM(ITOS(NNODES))
!## identification
WRITE(IU,'(A)') TRIM(LINE)
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; EXIT
! '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; EXIT
ENDIF
PUMPLOC=0 !## no location of pump intake or injection
QLIMIT=0 !## pumpage not by constraints
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
LINE=TRIM(LOSSTYPE)//','//TRIM(ITOS(PUMPLOC))//','//TRIM(ITOS(QLIMIT))//','//TRIM(ITOS(PPFLAG))//','//TRIM(ITOS(PUMPCAP))
WRITE(IU,'(A)') TRIM(LINE)
SELECT CASE (ILOSSTYPE)
!## thiem
CASE(1)
READ(STRING(ILOSS+1),*,IOSTAT=IOS) RW; IF(IOS.NE.0)EXIT
LINE=TRIM(RTOS(RW,'F',2)); WRITE(IU,'(A)') TRIM(LINE)
!## 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
LINE=TRIM(RTOS(RW,'F',2))//','//TRIM(RTOS(RSKIN,'F',2))//','//TRIM(RTOS(KSKIN,'F',2)); WRITE(IU,'(A)') TRIM(LINE)
END SELECT
IF(NNODES.GT.0)THEN
LINE=TRIM(ITOS(ILAY))//','//TRIM(ITOS(IROW))//','//TRIM(ITOS(ICOL))
WRITE(IU,'(A)') TRIM(LINE)
ELSE
READ(STRING(4),*,IOSTAT=IOS) Z1; IF(IOS.NE.0)EXIT
READ(STRING(5),*,IOSTAT=IOS) Z2; IF(IOS.NE.0)EXIT
LINE=TRIM(RTOS(Z1,'F',2))//','//TRIM(RTOS(Z2,'F',2))//','//TRIM(ITOS(IROW))//','//TRIM(ITOS(ICOL))
WRITE(IU,'(A)') TRIM(LINE)
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
LINE='WELLID_'//TRIM(ITOS(NP_IPER(IPER)))//','//TRIM(RTOS(Q,'G',7))
WRITE(IU,'(A)') TRIM(LINE)
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)),'Error'); EXIT
ENDIF
ENDDO
IF(IOS.NE.0)EXIT
!## 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
CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.'//CPCK//'7_',NP_IPER)
PMANAGER_SAVEMF2005_MNW=.TRUE.
ENDIF
DEALLOCATE(NP_IPER)
END FUNCTION PMANAGER_SAVEMF2005_MNW
!###======================================================================
LOGICAL FUNCTION PMANAGER_SAVEMF2005_ISG(DIR,DIRMNAME,IBATCH,LEX,ITOPIC,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,ITOPIC,IPRT
CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME,CPCK
LOGICAL,INTENT(IN) :: LEX
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
IF(.NOT.LEX)THEN; PMANAGER_SAVEMF2005_ISG=.TRUE.; RETURN; ENDIF
PMANAGER_SAVEMF2005_ISG=.FALSE.
VTXT='7'; IF(PBMAN%IFORMAT.EQ.3)VTXT='6'
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(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(DIRMNAME)//'.'//CPCK//'7...')
!IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing '//TRIM(DIRMNAME)//'.'//CPCK//'7...'
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'
WRITE(IU,'(1X,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,'(1X,A)') ' MAXBOUND NaN1#'
WRITE(IU,'(A)') 'END DIMENSIONS'
ENDIF
! IU=UTL_GETUNIT()
! CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.'//CPCK//'7_',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED')
! IF(IU.EQ.0)RETURN
IF(PBMAN%IFORMAT.EQ.2)THEN
SELECT CASE (ITOPIC)
!## isg
CASE (29)
LINE='NaN1#,'//TRIM(ITOS(ICB))//' AUX RFCT AUX ISUB RFACT RFCT RSUBSYS ISUB NOPRINT'
!## sfr
CASE (30)
LINE='NaN2#,NaN1#,0,0,'//TRIM(RTOS(CONST,'G',7))//','//TRIM(RTOS(DLEAK,'E',4))//','// &
TRIM(ITOS(ICB))//','//TRIM(ITOS(ISFRCB2))//' NOPRINT'
END SELECT
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)
NP=0
DO IPER=1,PRJNPER
!## reset only for isg to riv conversion
IF(ITOPIC.EQ.29)NP(1)=0
!## get appropriate stress-period to store in runfile
KPER=PMANAGER_GETCURRENTIPER(IPER,ITOPIC,ITIME,JTIME)
!## always export rivers per stress-period
IF(ITOPIC.EQ.29)THEN; IF(PBMAN%DISG.EQ.1)KPER=ABS(KPER); ENDIF
!## always export streamflow routing per stress-period
IF(ITOPIC.EQ.30)THEN; IF(PBMAN%DSFR.EQ.1)KPER=ABS(KPER); ENDIF
!## 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
IF(ITOPIC.EQ.29)WRITE(IU,'(A)') '-1'
IF(ITOPIC.EQ.30)WRITE(IU,'(A)') '-1,-1,0,0'
ENDIF
!## process next timestep
CYCLE
ENDIF
IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(/A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER))
!## default isg
IF(ITOPIC.EQ.29)THEN
EXFNAME=TRIM(DIR)//'\'//CPCK//VTXT//'\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR'
JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=EXFNAME,STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(JU.EQ.0)RETURN
!## sfr isg
ELSE
EXFNAME=TRIM(DIR)//'\'//CPCK//VTXT//'\'//CPCK//'.ARR'
JU=IU
ENDIF
!## 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))
GRIDISG%XMIN=BND(1)%XMIN; GRIDISG%YMIN=BND(1)%YMIN
GRIDISG%XMAX=BND(1)%XMAX; GRIDISG%YMAX=BND(1)%YMAX
!## transient (2) or steady-state (1)
GRIDISG%ISTEADY=2; IF(SIM(IPER)%DELT.EQ.0.0D0)GRIDISG%ISTEADY=1
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
!## output folder
GRIDISG%ROOT=EXFNAME(1:INDEX(EXFNAME,'\',.TRUE.)-1)
GRIDISG%POSTFIX=''
GRIDISG%NODATA=-999.99D0
GRIDISG%ISAVE=1
GRIDISG%MAXWIDTH=1000.0D0
GRIDISG%IAVERAGE=1
!## allocate memory for packages
NTOP=SIZE(TOPICS(ITOPIC)%STRESS(KPER)%FILES,1); NSYS=SIZE(TOPICS(ITOPIC)%STRESS(KPER)%FILES,2)
!## number of systems
DO ISYS=1,NSYS
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
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(ITOPIC)%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
SELECT CASE (ITOPIC)
!## open isg file
CASE (29)
IF(.NOT.ISG2GRID(GRIDISG%POSTFIX,BND(1)%NROW,BND(1)%NCOL,PRJNLAY,ILAY,TOP,BOT,KHV,BND,VCW,IBATCH,NP,JU,GRIDISG,SFT,LSFT,JSYS))EXIT
!## open sfr file
CASE (30)
IF(.NOT.ISG2SFR(BND(1)%NROW,BND(1)%NCOL,PRJNLAY,ILAY,IPER,PRJNPER,NP,JU,GRIDISG,EXFNAME,TOP,BOT))EXIT
END SELECT
CALL ISGDEAL(1); CALL ISGCLOSEFILES()
ELSE
!## stop processing
CLOSE(IU); CALL PMANAGER_SAVEMF2005_DEALLOCATEPCK(); RETURN
ENDIF
ENDDO
!## not for sfr
IF(PBMAN%IFORMAT.EQ.2.AND.ITOPIC.EQ.29)CALL IDFWRITEFREE_HEADER(JU,BND(1))
!## error occured
IF(ISYS.LE.NSYS)EXIT
!## only for river package usage of external filename
IF(ITOPIC.EQ.29)THEN
IF(PBMAN%IFORMAT.GE.2)THEN
IF(PBMAN%IFORMAT.EQ.2)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%IFORMAT.EQ.3)N=4; DO I=1,N; SFNAME=SFNAME(:INDEX(SFNAME,'\',.TRUE.)-1); ENDDO
I=LEN_TRIM(SFNAME); SFNAME='.'//EXFNAME(I+1:)
WRITE(IU,'(A)') 'OPEN/CLOSE '//TRIM(SFNAME)//' 1.0 (FREE) -1'
ENDIF
IF(IU.NE.JU)CLOSE(JU)
IF(PBMAN%IFORMAT.EQ.3)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
IF(ITOPIC.EQ.29)THEN
CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',(/NP(2)/))
ELSE
CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',NP)
ENDIF
PMANAGER_SAVEMF2005_ISG=.TRUE.
ENDIF
END FUNCTION PMANAGER_SAVEMF2005_ISG
!###======================================================================
LOGICAL FUNCTION PMANAGER_SAVEMF2005_PCK(DIR,DIRMNAME,IBATCH,LEX,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
LOGICAL,INTENT(IN) :: LEX
CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME,CPCKIN
REAL(KIND=DP_KIND) :: Z1,Z2,FCT,IMP,CNST,OLFCOND
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
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,PARAMETER :: ICLAY=1 !## shift to nearest aquifer
INTEGER :: JD0,JD1,ISEC0,ISEC1,NUZGAG,IRUNFLG,IEQUAL,ICHECK
INTEGER,ALLOCATABLE,DIMENSION(:,:) :: JEQUAL
REAL(KIND=DP_KIND) :: DDAY,DSEC
CHARACTER(LEN=1) :: VTXT
LOGICAL :: LCHKCHD
IF(.NOT.LEX)THEN; PMANAGER_SAVEMF2005_PCK=.TRUE.; RETURN; ENDIF
PMANAGER_SAVEMF2005_PCK=.FALSE.
CPCK=CPCKIN
VTXT='7'; IF(PBMAN%IFORMAT.EQ.3)VTXT='6'
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'
WRITE(IU,'(1X,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,'(1X,A)') ' MAXBOUND NaN1#'
WRITE(IU,'(A)') 'END DIMENSIONS'
ENDIF
!## write header of file
SELECT CASE (ITOPIC)
!## uzf
!NUZTOP=1 !## recharge specified to top cell
CASE (18); NUZGAG=PBMAN%NLOGLOC; IRUNFLG=0; NUZTOP=1
!## 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)WRITE(IU,'(A)') TRIM(LINE)
!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 (22)
IF(PBMAN%ICONCHK.EQ.0)THEN
LINE='NaN1#,'//TRIM(ITOS(ICB))//' AUX ISUB DSUBSYS ISUB NOPRINT'
ELSE
LINE='NaN1#,'//TRIM(ITOS(ICB))//' AUX ISUB DSUBSYS ISUB ICONCHK NOPRINT'
ENDIF
IF(PBMAN%IFORMAT.EQ.2)WRITE(IU,'(A)') TRIM(LINE)
!## AUX IC ICHONCHK IC
!## riv
CASE (23)
LINE='NaN1#,'//TRIM(ITOS(ICB))//' AUX RFCT AUX ISUB RFACT RFCT RSUBSYS ISUB NOPRINT'
IF(PBMAN%IFORMAT.EQ.2)WRITE(IU,'(A)') TRIM(LINE)
!## IFVDL SFT RCNC
!## evt
CASE (24); NEVTOP=1; LINE='NaN1#,'//TRIM(ITOS(ICB))
IF(PBMAN%IFORMAT.EQ.2)WRITE(IU,'(A)') TRIM(LINE)
!## NEVTOP moet twee worden voor optie laag = -1
!## ghb
CASE (25)
LINE='NaN1#,'//TRIM(ITOS(ICB))//' AUX ISUB GSUBSYS ISUB NOPRINT'
IF(PBMAN%IFORMAT.EQ.2)WRITE(IU,'(A)') TRIM(LINE)
!## rch
CASE (26); NRCHOP=1; LINE='NaN1#,'//TRIM(ITOS(ICB))
IF(PBMAN%IFORMAT.EQ.2)WRITE(IU,'(A)') TRIM(LINE)
!## NaN1 moet 3 worden voor optie laag = -1
!## olf
CASE (27)
CPCK='OLF'; IF(.NOT.LDRN)CPCK='DRN';
IF(PBMAN%ICONCHK.EQ.0)THEN
LINE='NaN1#,'//TRIM(ITOS(ICB))//' AUX ISUB DSUBSYS ISUB NOPRINT'
ELSE
LINE='NaN1#,'//TRIM(ITOS(ICB))//' AUX ISUB DSUBSYS ISUB ICONCHK NOPRINT'
ENDIF
IF(PBMAN%IFORMAT.EQ.2)WRITE(IU,'(A)') TRIM(LINE)
!## chd
CASE (28)
LINE='NaN1# NOPRINT NEGBND'
IF(PBMAN%IFORMAT.EQ.2)WRITE(IU,'(A)') TRIM(LINE)
!## fhb package
CASE(31)
!## 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
!## look for number of stress-periods for boundary package
ALLOCATE(FHBNBDTIM(PRJNPER)); 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
!## get first start-date
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 J=1,SIZE(TOPICS(ITOPIC)%STRESS)
IF(.NOT.ASSOCIATED(TOPICS(ITOPIC)%STRESS(J)%FILES))CYCLE
!## 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)/86400.0D0
ENDDO
ENDIF
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,1'
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 (18)
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
DO I=1,4; WRITE(IU,'(A)') '-1'; ENDDO
ENDIF
!## evt
CASE (24)
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
!## rch
CASE (26)
IF(PBMAN%IFORMAT.EQ.2)THEN
IF(IPER.EQ.1)THEN; WRITE(IU,'(I10)') 0; WRITE(IU,'(A)') 'CONSTANT 0.000000E+00'
ELSE; WRITE(IU,'(I10)') -1; ENDIF
ENDIF
!## wel,drn,riv,ghb,chd,olf
CASE (21, 22, 23, 25, 27, 28,29)
IF(PBMAN%IFORMAT.EQ.2)THEN
IF(IPER.EQ.1)THEN; WRITE(IU,'(I10)') 0
ELSE; WRITE(IU,'(I10)') -1; ENDIF
ENDIF
!## fhb- skip
CASE (31)
CASE DEFAULT
WRITE(*,*) 'Cannot come here: ERROR PMANAGER_SAVEMF2005_PCK'; PAUSE
END SELECT
!## goto next timestep
CYCLE
ENDIF
! DATA CMOD/'CAP','TOP','BOT','BND','SHD','KDW','KHV','KVA','VCW','KVV', & ! 1-10
! 'STO','SPY','PWT','ANI','HFB','IBS','SFT','UZF','MNW','PST', & !11-20
! 'WEL','DRN','RIV','EVT','GHB','RCH','OLF','CHD','ISG','SFR', & !21-30
! 'FHB','LAK','PCG'/ !31-40
! !## open external file (not for rch/evt)
! JU=0
! SELECT CASE (ITOPIC)
! CASE (22:23,25,27:29)
! !## create subfolders
! CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//'7')
! EXFNAME=TRIM(DIR)//'\'//CPCK//'7\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR'
! JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=EXFNAME,STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(JU.EQ.0)RETURN
! END SELECT
!## allocate memory for packages
NTOP=SIZE(TOPICS(ITOPIC)%STRESS(KPER)%FILES,1); NSYS=SIZE(TOPICS(ITOPIC)%STRESS(KPER)%FILES,2)
!## used for writing and including the tlp-vector
IF(ALLOCATED(XTMP))DEALLOCATE(XTMP); ALLOCATE(XTMP(NTOP)); XTMP=0.0D0
SELECT CASE (ITOPIC)
CASE (24,26)
IF(NSYS.GT.1)THEN
CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'You cannot apply more than a single layer to the package '// &
TRIM(TOPICS(ITOPIC)%TNAME)//'.','Information')
RETURN
ENDIF
END SELECT
SELECT CASE (ITOPIC)
CASE(27,28); N=NTOP+1
CASE DEFAULT; N=NTOP
END SELECT
WRITE(FRM,'(A10,I2.2,A14)') '(3(I5,1X),',N,'(G15.7,1X),I5)'
CALL PMANAGER_SAVEMF2005_ALLOCATEPCK(NTOP)
NHED=0; NFLW=0; NBDTIM=NBDTIM+1
!## see whether duplicate of definitions happened with current systems, not for wel/isg
SELECT CASE (ITOPIC)
!## drn,riv,ghb,chd,olf
CASE (22,23,25,27,28)
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
!## number of systems
DO ISYS=1,NSYS
!## 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
EXFNAME=TRIM(DIR)//'\'//CPCK//'7\'//CPCK//'_T'//TRIM(ITOS(IIPER))//'.ARR'
SFNAME=EXFNAME; DO I=1,3; SFNAME=SFNAME(:INDEX(SFNAME,'\',.TRUE.)-1); ENDDO
I=LEN_TRIM(SFNAME); SFNAME='.'//EXFNAME(I+1:)
LINE=TRIM(ITOS(NP_IPER(IIPER))); WRITE(IU,'(A)') TRIM(LINE)
WRITE(IU,'(A)') 'OPEN/CLOSE '//TRIM(SFNAME)//' 1.0D0 (FREE) -1'
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 (22:23,25,27:29)
!## create subfolders
CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//VTXT)
EXFNAME=TRIM(DIR)//'\'//CPCK//VTXT//'\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR'
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 (24,26)
IF(PBMAN%IFORMAT.EQ.3)THEN
!## create subfolders
CALL UTL_CREATEDIR(TRIM(DIR)//'\'//CPCK//VTXT)
EXFNAME=TRIM(DIR)//'\'//CPCK//VTXT//'\'//CPCK//'_T'//TRIM(ITOS(IPER))//'.ARR'
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=1,NSYS
!## 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
!## ilay equal zero not possible for rch and evt
IF(ITOPIC.EQ.24.OR.ITOPIC.EQ.26)THEN
IF(ILAY.EQ.0)THEN
CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'You cannot apply a layer code of zero for RCH or EVT','Error')
RETURN
ENDIF
ENDIF
!## check to see whether equal to previous timestep
IEQUAL=1
SELECT CASE (ITOPIC)
!## uzf(18),evt(24),rch(26)
CASE (18,24,26)
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 (18)
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
CASE (6); SCL_D=0; SCL_U=2; NUZF2=IEQUAL
CASE (7); SCL_D=0; SCL_U=2; NUZF3=IEQUAL
CASE (8); SCL_D=0; SCL_U=2; NUZF4=IEQUAL
END SELECT
!## skip uzf package info for coming stress-periods
IF(KTOP.LE.4.AND.IPER.GT.1)CYCLE
!## evt
CASE (24)
SCL_D=1
!## check to see whether equal to previous timestep
SELECT CASE (KTOP)
CASE (1); INSURF=IEQUAL; SCL_U=2
CASE (2); INEVTR=IEQUAL; SCL_U=16
CASE (3); INEXDP=IEQUAL; SCL_U=2
END SELECT
!## rch
CASE (26)
SCL_D=1; SCL_U=16 !## average
!## equal from previous timestep
INRECH=IEQUAL
!## drn,riv,ghb
CASE (22,23,25) !## drn,riv,ghb
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 (27,28)
SCL_D=1; SCL_U=2
!## fhb
CASE (31)
SCL_D=1
IF(KTOP.EQ.1)SCL_U=5 !## q - sum (divide if cell is smaller)
IF(KTOP.EQ.2)SCL_U=2 !## h - average
CASE DEFAULT
STOP 'Cannot come here: ERROR PMANAGER_SAVEMF2005_PCK'
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 (18)
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 (24)
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 (26)
IF(KTOP.EQ.1)THEN
FCT=FCT*0.001D0
IMP=IMP*0.001D0
ENDIF
IF(ILAY.LT.0)NRCHOP=3
!## checking for inactive cells
ICHECK=1; IF(ILAY.GT.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 (18)
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
!## 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
!## 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
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
!## rch
CASE (26)
IF(PBMAN%IFORMAT.EQ.2)THEN
LINE=TRIM(ITOS(INRECH)); WRITE(IU,'(A)') TRIM(LINE); 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
ELSEIF(PBMAN%IFORMAT.EQ.3)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
DO ILAY=1,SIZE(PBMAN%ILAY)
IF(PBMAN%ILAY(ILAY).EQ.0)CYCLE
!## 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
WRITE(JU,'(3I10,G15.7)') ILAY,IROW,ICOL,PCK(1)%X(ICOL,IROW)
NP_IPER(IPER)=NP_IPER(IPER)+1
ENDDO
ENDDO; ENDDO
ENDIF
!## evt
CASE (24)
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
CASE DEFAULT
DO IROW=1,PCK(1)%NROW; DO ICOL=1,PCK(1)%NCOL
!## skip inactive/constant head cells
IF(PCK(1)%ILAY.GT.0.AND.ITOPIC.NE.28)THEN
IF(BND(PCK(1)%ILAY)%X(ICOL,IROW).LE.0.0D0)CYCLE
ENDIF
IF(ITOPIC.EQ.31)THEN
!## check whether one of the two is not equal to nodata
DO I=1,NTOP; IF(PCK(JTOP(I))%X(ICOL,IROW).NE.HNOFLOW)EXIT; ENDDO
!## found no data in either dataset - skip data point
IF(I.GT.NTOP)CYCLE
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
!## check bottom river if that is higher than river stage
IF(ITOPIC.EQ.23)PCK(3)%X(ICOL,IROW)=MIN(PCK(2)%X(ICOL,IROW),PCK(3)%X(ICOL,IROW))
!## 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,BND,TOP,BOT,KDW,TP,BT,KH,.FALSE.)
SELECT CASE (ITOPIC)
CASE (22) !## drn - drainagelevel
Z1=PCK(2)%X(ICOL,IROW); Z2=Z1
CASE (23) !## riv - waterlevel and bottom
Z1=PCK(2)%X(ICOL,IROW); Z2=PCK(3)%X(ICOL,IROW)
CASE (27) !## olf drainagelevel
Z1=PCK(1)%X(ICOL,IROW); Z2=Z1
CASE (25) !## ghb drainagelevel
Z1=PCK(2)%X(ICOL,IROW); Z2=Z1
CASE DEFAULT
WRITE(*,*) 'Cannot come here: ERROR PMANAGER_SAVEMF2005_PCK'; PAUSE
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.28)THEN
IF(BND(PCK(1)%ILAY)%X(ICOL,IROW).LT.0)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
DO ILAY=1,PRJNLAY
!## 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 (28)
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) ILAY,IROW,ICOL,PCK(JTOP(1))%X(ICOL,IROW),PCK(JTOP(1))%X(ICOL,IROW),ISYS
ELSE
WRITE(JU,FRM) ILAY,IROW,ICOL,PCK(JTOP(1))%X(ICOL,IROW),PCK(JTOP(1))%X(ICOL,IROW),1
ENDIF
NP_IPER(IPER)=NP_IPER(IPER)+1
ENDIF
ENDIF
!## olf
CASE (27)
OLFCOND=(IDFGETAREA(PCK(JTOP(1)),ICOL,IROW)/COLF) !## drainage conductance
IF(PBMAN%SSYSTEM.EQ.0)THEN
WRITE(JU,FRM) ILAY,IROW,ICOL,PCK(JTOP(1))%X(ICOL,IROW),OLFCOND,ISYS
ELSE
WRITE(JU,FRM) ILAY,IROW,ICOL,PCK(JTOP(1))%X(ICOL,IROW),OLFCOND,1
ENDIF
NP_IPER(IPER)=NP_IPER(IPER)+1
!## fhb
CASE (31)
IF(BND(ILAY)%X(ICOL,IROW).EQ. 2.0)THEN; NFLW=NFLW+1; FHBFLW(NFLW,NBDTIM)=PCK(JTOP(1))%X(ICOL,IROW); ENDIF
IF(BND(ILAY)%X(ICOL,IROW).EQ.-2.0)THEN; NHED=NHED+1; FHBHED(NHED,NBDTIM)=PCK(JTOP(2))%X(ICOL,IROW); ENDIF
CASE DEFAULT
IF(PCK(JTOP(2))%X(ICOL,IROW).GT.0.0D0)THEN
DO I=1,NTOP; XTMP(I)=PCK(I)%X(ICOL,IROW); ENDDO
XTMP(1)=XTMP(1)*TLP(ILAY)
!## in current model (layers)
IF(PBMAN%ILAY(ILAY).EQ.1)THEN
JSYS=1; IF(PBMAN%SSYSTEM.EQ.0)JSYS=ISYS
WRITE(JU,FRM) ILAY,IROW,ICOL,(XTMP(JTOP(I)),I=1,NTOP),JSYS
NP_IPER(IPER)=NP_IPER(IPER)+1
ENDIF
ENDIF
END SELECT
ENDDO
ENDDO; ENDDO
END SELECT
ENDDO
IF(ITOPIC.NE.31.AND. &
ITOPIC.NE.18.AND. &
ITOPIC.NE.24.AND. &
ITOPIC.NE.26)THEN
LINE=TRIM(ITOS(NP_IPER(IPER))); IF(PBMAN%IFORMAT.EQ.2)WRITE(IU,'(A)') TRIM(LINE)
ENDIF
!## maximum input per simulation
MP=MAX(MP,NP_IPER(IPER))
IF(PBMAN%IFORMAT.EQ.2)THEN
SELECT CASE (ITOPIC)
CASE (22,23,25,27,28)
CALL IDFWRITEFREE_HEADER(JU,PRJIDF)
END SELECT
ENDIF
CLOSE(JU)
IF(PBMAN%IFORMAT.GE.2)THEN
IF(NP_IPER(IPER).GT.0)THEN
SFNAME=EXFNAME
N=3; IF(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:)
WRITE(IU,'(A)') 'OPEN/CLOSE '//TRIM(SFNAME)//' 1.0 (FREE) -1'
ENDIF
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.31)THEN
IF(ALLOCATED(FHBFLW))THEN
LINE=TRIM(ITOS(IFHBUN))//',1.0,1'; 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)THEN
I=I+1; WRITE(IU,'(3(I10,1X),F10.1,99(1X,G15.7))') ILAY,IROW,ICOL,1.0,(FHBFLW(I,J),J=1,NBDTIM)
ENDIF
ENDDO; ENDDO; ENDDO
ENDIF
IF(ALLOCATED(FHBHED))THEN
LINE=TRIM(ITOS(IFHBUN))//',1.0,1'; 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)THEN
I=I+1; WRITE(IU,'(3(I10,1X),F10.1,99(1X,G15.7))') ILAY,IROW,ICOL,1.0,(FHBHED(I,J),J=1,NBDTIM)
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 (18); NP_IPER(0)=NUZTOP
CASE (24); NP_IPER(0)=NEVTOP
CASE (26)
IF(PBMAN%IFORMAT.EQ.2)NP_IPER(0)=NRCHOP
IF(PBMAN%IFORMAT.EQ.3)NP_IPER(0)=NP_IPER(1)
CASE DEFAULT; NP_IPER(0)=MP
END SELECT
IF(ITOPIC.EQ.24.OR.ITOPIC.EQ.26)THEN
IF(LLAK.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))
CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.'//CPCK//VTXT//'_',(/NP_IPER(0)/))
IF(ALLOCATED(NP_IPER))DEALLOCATE(NP_IPER)
PMANAGER_SAVEMF2005_PCK=.TRUE.
END FUNCTION PMANAGER_SAVEMF2005_PCK
!####====================================================================
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(.NOT.LLAK)RETURN
PMANAGER_SAVEMF2005_LAK_READ=.FALSE.
!## lak settings - use most frequent
ITOPIC=32
!## 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(.NOT.LLAK)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(.NOT.LSFT)RETURN
PMANAGER_SAVEMF2005_SFT_READ=.FALSE.
!## sft settings
ITOPIC=17; 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
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)
!## most frequent occurence for angles
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
PMANAGER_SAVEMF2005_TDIS=.TRUE.; IF(PBMAN%IFORMAT.EQ.2)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 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
LINE=TRIM(LINE)//' ['//TRIM(SIM(KPER)%CDATE)//']'
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(DIR,DIRMNAME)
!####====================================================================
IMPLICIT NONE
CHARACTER(LEN=*),INTENT(IN) :: DIR,DIRMNAME
INTEGER :: IU,KPER,I,N1,N2
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; N1=-PBMAN%NLINESEARCH; N2=SIZE(PEST%PARAM); ENDIF
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)//'.MET7',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
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
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(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
LINE='IDATE_SAVE '//TRIM(ITOS(PBMAN%ISAVEENDDATE))
WRITE(IU,'(A)') TRIM(LINE)
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
IF(PBMAN%IPESTP.EQ.0)THEN
LINE='RESULTDIR "'//TRIM(DIR(:INDEX(DIR,'\',.TRUE.)-1))//'"'; WRITE(IU,'(A)') TRIM(LINE)
ELSE
IF(I.GT.0)THEN
LINE='RESULTDIR "'//TRIM(DIR(:INDEX(DIR,'\',.TRUE.)-1))//'\IPEST_P#'//TRIM(ITOS(I))//'"'; WRITE(IU,'(A)') TRIM(LINE)
ELSE
LINE='RESULTDIR "'//TRIM(DIR(:INDEX(DIR,'\',.TRUE.)-1))//'\IPEST_L#'//TRIM(ITOS(ABS(I)))//'"'; WRITE(IU,'(A)') TRIM(LINE)
ENDIF
ENDIF
LINE='SAVEDOUBLE '//TRIM(ITOS(PBMAN%IDOUBLE)); WRITE(IU,'(A)') TRIM(LINE)
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
INTEGER,ALLOCATABLE,DIMENSION(:) :: IUGEN,IUDAT,NHFBNP
CHARACTER(LEN=1) :: VTXT
PMANAGER_SAVEMF2005_HFB=.TRUE.
IF(.NOT.LHFB)RETURN
PMANAGER_SAVEMF2005_HFB=.FALSE.
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//'...'
!## creating and collect all faults
JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=TRIM(DIRMNAME)//'_HFB.TXT',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED')
ITOPIC=15; IF(.NOT.PMANAGER_SAVEMF2005_HFB_COMPUTE(PRJIDF,ITOPIC,JU,BND,TOP,BOT,IPRT,IBATCH))RETURN
!## 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'
WRITE(IU,'(/A)') 'BEGIN PERIOD 1'
ENDIF
!## 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)); NHFBNP=0
!## apply resistances
IF(PBMAN%IFORMAT.EQ.2)THEN
IF(LTB)THEN
WRITE(IU,'(2I10,A)') NPHFB,MXFB,',NaN1# NOPRINT HFBRESIS SYSTEM'
ELSE
WRITE(IU,'(2I10,A)') NPHFB,MXFB,',NaN1# NOPRINT HFBFACT SYSTEM'
ENDIF
ENDIF
ALLOCATE(IUGEN(PRJNLAY),IUDAT(PRJNLAY)); IUGEN=0; IUDAT=0
DO ILAY=1,PRJNLAY
IUGEN(ILAY)=UTL_GETUNIT(); CALL OSD_OPEN(IUGEN(ILAY),FILE=TRIM(DIRMNAME)//'_HFB_L'//TRIM(ITOS(ILAY))//'.GEN', &
STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED')
IF(IUGEN(ILAY).EQ.0)RETURN
IUDAT(ILAY)=UTL_GETUNIT(); CALL OSD_OPEN(IUDAT(ILAY),FILE=TRIM(DIRMNAME)//'_HFB_L'//TRIM(ITOS(ILAY))//'.DAT', &
STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED')
IF(IUDAT(ILAY).EQ.0)RETURN
IF(LTB)THEN
WRITE(IUDAT(ILAY),'(A10,3(1X,A15),A10)') 'NO','CONF_RESIS','UNCONF_RESIS','FRACTION','SYSTEM'
ELSE
WRITE(IUDAT(ILAY),'(A10,1X,A15,A10)') 'NO','FRACTION','SYSTEM'
ENDIF
ENDDO
!## collect all faults
JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=TRIM(DIRMNAME)//'_HFB.TXT',STATUS='OLD',ACTION='READ',FORM='FORMATTED')
CALL PMANAGER_SAVEMF2005_HFB_EXPORT(NHFBNP,IU,JU,IUGEN,IUDAT,PRJIDF,LTB)
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 hfb file
CLOSE(IU); CLOSE(JU,STATUS='DELETE')
CALL UTL_MF2005_MAXNO(TRIM(DIRMNAME)//'.HFB'//VTXT//'_',(/SUM(NHFBNP)/))
DEALLOCATE(NHFBNP)
PMANAGER_SAVEMF2005_HFB=.TRUE.
END FUNCTION PMANAGER_SAVEMF2005_HFB
!####====================================================================
LOGICAL FUNCTION PMANAGER_SAVEMF2005_OCD(DIRMNAME,MAINDIR)
!####====================================================================
IMPLICIT NONE
CHARACTER(LEN=*),INTENT(IN) :: DIRMNAME,MAINDIR
INTEGER :: IU,ILAY,IPER
PMANAGER_SAVEMF2005_OCD=.FALSE.
IF(PBMAN%IFORMAT.EQ.2)THEN
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())
ELSE
IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=TRIM(DIRMNAME)//'.OC6',STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(IU.EQ.0)RETURN
WRITE(IU,'(A)') '# OC6 File Generated by '//TRIM(UTL_IMODVERSION())
ENDIF
IF(PBMAN%IFORMAT.EQ.3)THEN
WRITE(IU,'(/A/)') '#General Options'
WRITE(IU,'(A)') 'BEGIN OPTIONS'
WRITE(IU,'(1X,A)') 'BUDGET FILEOUT .\GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL))//'\MODELOUTPUT\BUDGET\BUDGET.CBC'
WRITE(IU,'(1X,A)') 'HEAD FILEOUT .\GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL))//'\MODELOUTPUT\HEAD\HEAD.HED'
CALL UTL_CREATEDIR(TRIM(MAINDIR)//'\GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL))//'\MODELOUTPUT\BUDGET')
CALL UTL_CREATEDIR(TRIM(MAINDIR)//'\GWF_'//TRIM(ITOS(PBMAN%ISUBMODEL))//'\MODELOUTPUT\HEAD')
! WRITE(IU,'(A)') ' HEAD PRINT_FORMAT COLUMNS WIDTH DIGITS ]'
WRITE(IU,'(A)') 'END OPTIONS'
ENDIF
LINE='HEAD SAVE UNIT '//TRIM(ITOS(IHEDUN)); WRITE(IU,'(A)') TRIM(LINE)
DO IPER=1,PRJNPER
IF(PBMAN%IFORMAT.EQ.2)THEN
LINE='PERIOD '//TRIM(ITOS(IPER))//' STEP '//TRIM(ITOS(SIM(IPER)%NSTP)); WRITE(IU,'(A)') TRIM(LINE)
LINE='PRINT BUDGET'; WRITE(IU,'(A)') TRIM(LINE)
IF(ASSOCIATED(PBMAN%SAVESHD))THEN
IF(PBMAN%SAVESHD(1).EQ.-1)THEN
LINE='SAVE HEAD'; DO ILAY=1,PRJNLAY; LINE=TRIM(LINE)//' '//TRIM(ITOS(ILAY)); ENDDO; WRITE(IU,'(A)') TRIM(LINE)
ELSE
LINE='SAVE HEAD'; DO ILAY=1,SIZE(PBMAN%SAVESHD); LINE=TRIM(LINE)//' '//TRIM(ITOS(PBMAN%SAVESHD(ILAY))); ENDDO; WRITE(IU,'(A)') TRIM(LINE)
ENDIF
ENDIF
CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%SAVEFLX,IBCFCB,IU)
IF(LUZF)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%SAVEUZF,IUZFCB1,IU)
IF(LSFR)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%SAVESFR,ISFRCB,IU)
IF(LFHB)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%SAVEFHB,IFHBCB,IU)
IF(LDRN.OR.LOLF)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%SAVEDRN,IDRNCB,IU)
IF(LRIV.OR.LISG)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%SAVERIV,IRIVCB,IU)
IF(LGHB)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%SAVEGHB,IGHBCB,IU)
IF(LWEL)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%SAVEWEL,IWELCB,IU)
IF(LRCH)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%SAVERCH,IRCHCB,IU)
IF(LEVT)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%SAVEEVT,IEVTCB,IU)
IF(LMNW)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%SAVEMNW,IWL2CB,IU)
IF(LLAK)CALL PMANAGER_SAVEMF2005_OCD_ISAVE(PBMAN%SAVELAK,ILAKCB,IU)
ELSE
WRITE(IU,'(/A/)') '#Stressperiod Save Options'
WRITE(IU,'(A)') 'BEGIN PERIOD '//TRIM(ITOS(IPER))
WRITE(IU,'(A)') ' SAVE HEAD ALL'
WRITE(IU,'(A)') ' SAVE BUDGET ALL'
WRITE(IU,'(A)') 'END PERIOD'
ENDIF
ENDDO
CLOSE(IU)
PMANAGER_SAVEMF2005_OCD=.TRUE.
END FUNCTION PMANAGER_SAVEMF2005_OCD
!####====================================================================
SUBROUTINE PMANAGER_SAVEMF2005_OCD_ISAVE(ISAVE,ID,IU)
!####====================================================================
IMPLICIT NONE
INTEGER,INTENT(IN),POINTER,DIMENSION(:) :: ISAVE
INTEGER,INTENT(IN) :: ID,IU
INTEGER :: I
IF(ASSOCIATED(ISAVE))THEN
IF(ISAVE(1).EQ.-1)THEN
LINE='SAVE BUDGET '//TRIM(ITOS(ID)); DO I=1,PRJNLAY; LINE=TRIM(LINE)//' '//TRIM(ITOS(I)); ENDDO
ELSE
LINE='SAVE BUDGET '//TRIM(ITOS(ID)); DO I=1,SIZE(ISAVE); LINE=TRIM(LINE)//' '//TRIM(ITOS(ISAVE(I))); ENDDO
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
!####====================================================================
LOGICAL FUNCTION PMANAGER_SAVEMF2005_PCG(DIRMNAME)
!####====================================================================
IMPLICIT NONE
CHARACTER(LEN=*),INTENT(IN) :: DIRMNAME
INTEGER :: IU
PMANAGER_SAVEMF2005_PCG=.TRUE.
IF(.NOT.LPCG)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_IMS(DIRMNAME)
!####====================================================================
IMPLICIT NONE
CHARACTER(LEN=*),INTENT(IN) :: DIRMNAME
INTEGER :: IU
PMANAGER_SAVEMF2005_IMS=.TRUE.; IF(PBMAN%IFORMAT.EQ.2)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'
! WRITE(IU,'(A)') ' COMPLEXITY MODERATE' !## simple complex
WRITE(IU,'(A)') ' CSV_OUTPUT FILEOUT '//TRIM(DIRMNAME(INDEX(DIRMNAME,'\',.TRUE.)+1:))//'.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_HCLOSE ',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_HCLOSE ',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
! 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
LINE=TRIM(ITOS(PCG%NOUTER)) //','// &
TRIM(ITOS(PCG%NINNER)) //','// &
TRIM(RTOS(PCG%HCLOSE,'G',5)) //','// &
TRIM(RTOS(PCG%RCLOSE,'G',5)) //','// &
TRIM(RTOS(PCG%RELAX ,'G',5)) //','// &
TRIM(ITOS(PCG%NPCOND)) //','// &
TRIM(ITOS(PCG%IPRPCG)) //','// &
TRIM(ITOS(PCG%MUTPCG)) //','// &
TRIM(RTOS(PCG%DAMPPCG ,'G',5)) //','// &
TRIM(RTOS(PCG%DAMPPCGT ,'G',5))//','// &
TRIM(ITOS(PCG%IQERROR)) //','// &
TRIM(RTOS(PCG%QERROR,'G',5))
WRITE(IU,'(A)') TRIM(LINE)
!## run file
ELSEIF(IOPTION.EQ.1)THEN
! LINE=TRIM(ITOS(PCG%NOUTER)) //','// &
! TRIM(ITOS(PCG%NINNER)) //','// &
! TRIM(ITOS(PCG%NPCOND))
! WRITE(IU,'(A)') TRIM(LINE)
!## 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_SAVEMF2005_PKS(DIRMNAME)
!####====================================================================
IMPLICIT NONE
CHARACTER(LEN=*),INTENT(IN) :: DIRMNAME
INTEGER :: IU,NP
PMANAGER_SAVEMF2005_PKS=.TRUE.; IF(PBMAN%IFORMAT.EQ.3)RETURN; IF(.NOT.LPKS)RETURN
!## Parallel Krylov Solver Package
!isolver 1
!npc 2
!hclosepks 9.9999997E-05
!rclosepks 100.000
!mxiter 500
!innerit 30
!relax 0.9800000
!end
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)
WRITE(IU,'(A)') 'END'
CLOSE(IU)
PMANAGER_SAVEMF2005_PKS=.TRUE.
END FUNCTION PMANAGER_SAVEMF2005_PKS
!####====================================================================
SUBROUTINE PMANAGER_SAVEMF2005_DEALLOCATE()
!####====================================================================
IMPLICIT NONE
IF(ALLOCATED(NP_IPER))DEALLOCATE(NP_IPER)
CALL IDFDEALLOCATEX(PRJIDF)
IF(ALLOCATED(BND))THEN
CALL IDFDEALLOCATE(BND,SIZE(BND)); DEALLOCATE(BND)
ENDIF
IF(ALLOCATED(SHD))THEN
CALL IDFDEALLOCATE(SHD,SIZE(SHD)); DEALLOCATE(SHD)
ENDIF
IF(ALLOCATED(KDW))THEN
CALL IDFDEALLOCATE(KDW,SIZE(KDW)); DEALLOCATE(KDW)
ENDIF
IF(ALLOCATED(VCW))THEN
CALL IDFDEALLOCATE(VCW,SIZE(VCW)); DEALLOCATE(VCW)
ENDIF
IF(ALLOCATED(TOP))THEN
CALL IDFDEALLOCATE(TOP,SIZE(TOP)); DEALLOCATE(TOP)
ENDIF
IF(ALLOCATED(BOT))THEN
CALL IDFDEALLOCATE(BOT,SIZE(BOT)); DEALLOCATE(BOT)
ENDIF
IF(ALLOCATED(ANA))THEN
CALL IDFDEALLOCATE(ANA,SIZE(ANA)); DEALLOCATE(ANA)
ENDIF
IF(ALLOCATED(ANF))THEN
CALL IDFDEALLOCATE(ANF,SIZE(ANF)); DEALLOCATE(ANF)
ENDIF
IF(ALLOCATED(KHV))THEN
CALL IDFDEALLOCATE(KHV,SIZE(KHV)); DEALLOCATE(KHV)
ENDIF
IF(ALLOCATED(KVV))THEN
CALL IDFDEALLOCATE(KVV,SIZE(KVV)); DEALLOCATE(KVV)
ENDIF
IF(ALLOCATED(KVA))THEN
CALL IDFDEALLOCATE(KVA,SIZE(KVA)); DEALLOCATE(KVA)
ENDIF
IF(ALLOCATED(STO))THEN
CALL IDFDEALLOCATE(STO,SIZE(STO)); DEALLOCATE(STO)
ENDIF
IF(ALLOCATED(SPY))THEN
CALL IDFDEALLOCATE(SPY,SIZE(SPY)); DEALLOCATE(SPY)
ENDIF
IF(ALLOCATED(LAK))THEN
CALL IDFDEALLOCATE(LAK,SIZE(LAK)); DEALLOCATE(LAK)
ENDIF
IF(ALLOCATED(LBD))THEN
CALL IDFDEALLOCATE(LBD,SIZE(LBD)); DEALLOCATE(LBD)
ENDIF
IF(ALLOCATED(LCD))THEN
CALL IDFDEALLOCATE(LCD,SIZE(LCD)); DEALLOCATE(LCD)
ENDIF
IF(ALLOCATED(SFT))THEN
CALL IDFDEALLOCATE(SFT,SIZE(SFT)); DEALLOCATE(SFT)
ENDIF
IF(ALLOCATED(ULAKES)) DEALLOCATE(ULAKES)
IF(ALLOCATED(FHBHED)) DEALLOCATE(FHBHED)
IF(ALLOCATED(FHBFLW)) DEALLOCATE(FHBFLW)
IF(ALLOCATED(FHBNBDTIM))DEALLOCATE(FHBNBDTIM)
IF(ASSOCIATED(FNAMES)) DEALLOCATE(FNAMES)
IF(ALLOCATED(PRJILIST)) DEALLOCATE(PRJILIST)
IF(ASSOCIATED(PBMAN%SAVESHD))DEALLOCATE(PBMAN%SAVESHD)
IF(ASSOCIATED(PBMAN%SAVEFLX))DEALLOCATE(PBMAN%SAVEFLX)
IF(ASSOCIATED(PBMAN%SAVEUZF))DEALLOCATE(PBMAN%SAVEUZF)
IF(ASSOCIATED(PBMAN%SAVELAK))DEALLOCATE(PBMAN%SAVELAK)
IF(ASSOCIATED(PBMAN%SAVESFR))DEALLOCATE(PBMAN%SAVESFR)
IF(ASSOCIATED(PBMAN%SAVEWEL))DEALLOCATE(PBMAN%SAVEWEL)
IF(ASSOCIATED(PBMAN%SAVEDRN))DEALLOCATE(PBMAN%SAVEDRN)
IF(ASSOCIATED(PBMAN%SAVERIV))DEALLOCATE(PBMAN%SAVERIV)
IF(ASSOCIATED(PBMAN%SAVEGHB))DEALLOCATE(PBMAN%SAVEGHB)
IF(ASSOCIATED(PBMAN%SAVERCH))DEALLOCATE(PBMAN%SAVERCH)
IF(ASSOCIATED(PBMAN%SAVEEVT))DEALLOCATE(PBMAN%SAVEEVT)
IF(ASSOCIATED(PBMAN%SAVEMNW))DEALLOCATE(PBMAN%SAVEMNW)
IF(ASSOCIATED(PBMAN%SAVEFHB))DEALLOCATE(PBMAN%SAVEFHB)
IF(ASSOCIATED(PBMAN%UNCONFINED))DEALLOCATE(PBMAN%UNCONFINED)
IF(ASSOCIATED(PBMAN%ILAY))DEALLOCATE(PBMAN%ILAY)
IF(ASSOCIATED(PBMAN%ILOC))DEALLOCATE(PBMAN%ILOC)
END SUBROUTINE PMANAGER_SAVEMF2005_DEALLOCATE
!####====================================================================
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
INTEGER :: I,J,NIDF
REAL(KIND=DP_KIND),DIMENSION(:),ALLOCATABLE :: NODATA
CHARACTER(LEN=256) :: FFNAME,DIRMSP,FNNAME
PMANAGER_SAVEMF2005_MSP=.TRUE.
IF(.NOT.LMSP)RETURN
PMANAGER_SAVEMF2005_MSP=.FALSE.
IF(IBATCH.EQ.0)CALL WINDOWOUTSTATUSBAR(4,'Writing MetaSwap files ...')
IF(IBATCH.EQ.1)WRITE(*,'(/1X,A)') 'Writing MetaSwap files ...'
NIDF=22; ALLOCATE(NODATA(NIDF))
!## 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_DFM=0
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='UNKNOWN',ACTION='WRITE')
!## OPEN IAREA
FFNAME=TRIM(DIRMSP)//'\AREA_SVAT.INP'; IAREA=UTL_GETUNIT(); CALL OSD_OPEN(IAREA,FILE=FFNAME,STATUS='UNKNOWN',ACTION='WRITE')
!## OPEN ISCAP
FFNAME=TRIM(DIRMSP)//'\SCAP_SVAT.INP'; ISCAP=UTL_GETUNIT(); CALL OSD_OPEN(ISCAP,FILE=FFNAME,STATUS='UNKNOWN',ACTION='WRITE')
!## OPEN IGWMP
FFNAME=TRIM(DIRMSP)//'\MOD2SVAT.INP'; IGWMP=UTL_GETUNIT(); CALL OSD_OPEN(IGWMP,FILE=FFNAME,STATUS='UNKNOWN',ACTION='WRITE')
!## open MODFLOW dxc file
FFNAME=TRIM(DIRMNAME)//'.DXC'; IDXC=UTL_GETUNIT(); CALL OSD_OPEN(IDXC,FILE=FFNAME,STATUS='UNKNOWN',ACTION='WRITE')
!## OPEN MOD-SIM.TXT
FFNAME=TRIM(DIRMSP)//'\MOD-SIM.TXT'; IMODSIM=UTL_GETUNIT(); CALL OSD_OPEN(IMODSIM,FILE=FFNAME,STATUS='UNKNOWN',ACTION='WRITE')
!## OPEN ISELSVAT
FFNAME=TRIM(DIRMSP)//'\SEL_SVAT_BDA.INP'; ISELSVAT=UTL_GETUNIT(); CALL OSD_OPEN(ISELSVAT,FILE=FFNAME,STATUS='UNKNOWN',ACTION='WRITE')
!## OPEN INFI_SVAT.INP
FFNAME=TRIM(DIRMSP)//'\INFI_SVAT.INP'; IINFI=UTL_GETUNIT(); OPEN(IINFI,FILE=FFNAME,STATUS='UNKNOWN',CARRIAGECONTROL='LIST',ACTION='WRITE')
!## OPEN IDF_SVAT.INP
FFNAME=TRIM(DIRMSP)//'\IDF_SVAT.INP'; IIDF=UTL_GETUNIT(); CALL OSD_OPEN(IIDF,FILE=FFNAME,STATUS='UNKNOWN',ACTION='WRITE')
!## OPEN USCL_SVAT.INP
FFNAME=TRIM(DIRMSP)//'\USCL_SVAT.INP'; IUSCL=UTL_GETUNIT(); CALL OSD_OPEN(IUSCL,FILE=FFNAME,STATUS='UNKNOWN',ACTION='WRITE')
!## OPEN Dfm2dToMsw_WL.DMM
FFNAME=TRIM(DIRMSP)//'\DFM2DTOMSW_WL.DMM_'; IDFM_MSWP=UTL_GETUNIT(); CALL OSD_OPEN(IDFM_MSWP,FILE=FFNAME,STATUS='UNKNOWN',ACTION='WRITE')
!## OPEN Dfm2dToMsw_WL.DMM
FFNAME=TRIM(DIRMSP)//'\MSWTODFM2D_DPV.DMM_'; IMSWP_DFM=UTL_GETUNIT(); CALL OSD_OPEN(IMSWP_DFM,FILE=FFNAME,STATUS='UNKNOWN',ACTION='WRITE')
!## metaswap
IARMWP=0
IF(TOPICS(1)%IACT_MODEL.EQ.1)THEN
IF(ASSOCIATED(TOPICS(1)%STRESS))THEN
FFNAME=TOPICS(1)%STRESS(1)%FILES(8,1)%FNAME
IF(INDEX(UTL_CAP(FFNAME,'U'),'IPF').GT.0)IARMWP=1
ENDIF
ENDIF
ISYS=0; ILAY=1; ITOPIC=1; 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(IARMWP.EQ.1.AND.ISYS.EQ.8)CYCLE
SELECT CASE (ISYS)
!## bnd
CASE (1); NODATA(ISYS)=-999.99D0; SCL_U=1; SCL_D=0
!## lgn,root,soil,meteo
CASE (2:5,7:9); NODATA(ISYS)=-999.99D0; SCL_U=7; SCL_D=0
!## surf,ponding,ponding,pwtlevel
CASE (6,12,13,20); 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 !6; SCL_D=0
!## runoff,runoff,runon,runon
CASE (14:17); NODATA(ISYS)=-999.99D0; SCL_U=7; SCL_D=0 !6; SCL_D=0
!## wetted area/urban area
CASE (10,11); NODATA(ISYS)=-999.99D0; SCL_U=5; SCL_D=0
END SELECT
!## read in data
IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(PRJIDF,ITOPIC,ISYS,SCL_D,SCL_U,IINV,IPRT))RETURN
SELECT CASE (ISYS)
CASE (1); SIMGRO%IBOUND=INT(PRJIDF%X)
CASE (2); SIMGRO%LGN=INT(PRJIDF%X)
CASE (3); SIMGRO%RZ=PRJIDF%X
CASE (4); SIMGRO%BODEM=INT(PRJIDF%X)
CASE (5); SIMGRO%METEO=INT(PRJIDF%X)
CASE (6); SIMGRO%MV=PRJIDF%X
CASE (7); SIMGRO%BEREGEN=INT(PRJIDF%X)
CASE (8); SIMGRO%BER_LAAG=INT(PRJIDF%X)
CASE (9); SIMGRO%BEREGEN_Q=PRJIDF%X
CASE (10); SIMGRO%NOPP=PRJIDF%X
CASE (11); SIMGRO%SOPP=PRJIDF%X
CASE (12); SIMGRO%VXMU_SOPP=PRJIDF%X
CASE (13); SIMGRO%VXMU_ROPP=PRJIDF%X
CASE (14); SIMGRO%CRUNOFF_SOPP=PRJIDF%X
CASE (15); SIMGRO%CRUNOFF_ROPP=PRJIDF%X
CASE (16); SIMGRO%CRUNON_SOPP=PRJIDF%X
CASE (17); SIMGRO%CRUNON_ROPP=PRJIDF%X
CASE (18); SIMGRO%QINFBASIC_SOPP=PRJIDF%X
CASE (19); SIMGRO%QINFBASIC_ROPP=PRJIDF%X
CASE (20); SIMGRO%PWT_LEVEL=PRJIDF%X
CASE (21); SIMGRO%MOISTURE=PRJIDF%X
CASE (22); SIMGRO%COND=PRJIDF%X
END SELECT
ENDDO
IF(.NOT.LPWT)SIMGRO%PWT_LEVEL=NODATA(20)
!## check input parameters
CALL PMANAGER_SAVEMF2005_MSP_CHECK(NODATA)
ISYS=8
CALL PMANAGER_SAVEMF2005_MSP_INPFILES(NODATA(20),TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISYS,ILAY)%FNAME,LPWT,DIRMSP)
!## 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
REAL(KIND=DP_KIND) :: X1,Y1,TINY
CHARACTER(LEN=256) :: S,S1,S2,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')
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)WRITE(JU,'(A)') TRIM(LINE)
ENDDO
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)
CLOSE(JU)
END SUBROUTINE PMANAGER_SAVEMF2005_MSP_PARASIM
!###====================================================================
SUBROUTINE PMANAGER_SAVEMF2005_MSP_INPFILES(NODATA_PWT,IPFFILE,LPWT,DIRMSP)
!###====================================================================
IMPLICIT NONE
LOGICAL :: LPWT
REAL(KIND=DP_KIND),INTENT(IN) :: NODATA_PWT
CHARACTER(LEN=*),INTENT(IN) :: IPFFILE,DIRMSP
INTEGER,PARAMETER :: AEND=0 !## no surfacewater units
INTEGER :: NUND,MDND,IROW,ICOL,LYBE,TYBE,BEREGENID,JROW,JCOL,N,M,I,J,JU,IC1,IC2,IR1,IR2
REAL(KIND=DP_KIND) :: XC,YC,ARND,QBER,FLBE,TINY
TYPE IPFOBJ
INTEGER :: ILAY
REAL(KIND=DP_KIND) :: X,Y,CAP
END TYPE IPFOBJ
TYPE(IPFOBJ),ALLOCATABLE,DIMENSION(:) :: IPF
LOGICAL :: LURBAN
INTEGER :: NDXC, UNID, IACT
INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: DXCID
! INTEGER, DIMENSION(:,:), ALLOCATABLE :: RURALSVATID
IF (ALLOCATED(DXCID)) DEALLOCATE(DXCID)
ALLOCATE(DXCID(PRJIDF%NCOL,PRJIDF%NROW,PRJNLAY))
! ALLOCATE(RURALSVATID(PRJIDF%NCOL,PRJIDF%NROW))
DXCID = 0
NDXC = 0
! RURALSVATID=0
IF(IARMWP.EQ.1)THEN
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(IPF(MDND)); IPF%ILAY=0; IPF%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; IPF(NUND)%X=XC; IPF(NUND)%Y=YC; IPF(NUND)%ILAY=LYBE; IPF(NUND)%CAP=QBER; ENDIF
ENDDO
CLOSE(JU)
ENDDO
ENDIF
!## get window of interest
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)
WRITE(IDFM_MSWP,'(A)') 'NaN1#'
WRITE(IMSWP_DFM,'(A)') 'NaN1#'
DO IACT=1,2
NUND=0; UNID=0
DO IROW=1,PRJIDF%NROW
DO ICOL=1,PRJIDF%NCOL
LURBAN=.FALSE.
IF(SIMGRO(ICOL,IROW)%IBOUND.LE.0)CYCLE
MDND=(IROW-1)*PRJIDF%NCOL+ICOL
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
! IF(IACT.EQ.1)RURALSVATID(ICOL,IROW)=NUND
CALL IDFGETLOC(PRJIDF,IROW,ICOL,XC,YC)
!## write idf_svat.inp - inside area of interest
IF(ICOL.GE.IC1.AND.ICOL.LE.IC2.AND.IROW.GE.IR1.AND.IROW.LE.IR2)THEN
IF(IACT.EQ.2)WRITE(IIDF,'(3I10,2F15.3)') NUND,IROW-IR1+1,ICOL-IC1+1,XC,YC
ENDIF
!## write sel_svat_bda.inp
IF(IACT.EQ.2)THEN
WRITE(ISELSVAT,'(I10)') NUND
WRITE(IDFM_MSWP,'(2(F10.3,1X),I10)') XC,YC,NUND
WRITE(IMSWP_DFM,'(I10,2(1X,F10.3))') NUND,XC,YC
!## 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,1,IROW,ICOL,UNID,IACT)
IF(IACT.EQ.2)THEN
WRITE(IGWMP,'(I10,2X,I10,I5)') UNID,NUND,1
WRITE(IMODSIM,'(I10,2X,I10,I5)') UNID,NUND,1
ENDIF
!## BEGIN scap_svat.inp - grondwater + ow
IF(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(IPF))THEN
QBER=IPF(BEREGENID)%CAP
LYBE=IPF(BEREGENID)%ILAY
TYBE=1 !## groundwater
CALL IDFIROWICOL(PRJIDF,JROW,JCOL,IPF(BEREGENID)%X,IPF(BEREGENID)%Y)
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
! MDND2=RURALSVATID(JCOL,JROW)
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
!## sprinkling from other than modellayer 1 or other location
IF(TYBE.EQ.1.AND.LYBE.GT.1)THEN
!## add couple location modflow
CALL STOREDXC(DXCID,PRJIDF%NCOL,PRJIDF%NROW,PRJNLAY,LYBE,JROW,JCOL,UNID,IACT)
IF(IACT.EQ.2)THEN
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(.NOT.LPWT)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_PWT)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 - inside area of interest
IF(ICOL.GE.IC1.AND.ICOL.LE.IC2.AND.IROW.GE.IR1.AND.IROW.LE.IR2) THEN
IF(IACT.EQ.2)WRITE(IIDF,'(3I10,2F15.3)') NUND,IROW-IR1+1,ICOL-IC1+1,XC,YC
ENDIF
!## write sel_svat_bda.inp
IF(IACT.EQ.2)THEN
WRITE(ISELSVAT,'(I10)') NUND
CALL IDFGETLOC(PRJIDF,IROW,ICOL,XC,YC)
WRITE(IDFM_MSWP,'(2(F10.3,1X),I10)') XC,YC,NUND
WRITE(IMSWP_DFM,'(I10,2(1X,F10.3))') NUND,XC,YC
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,1,IROW,ICOL,UNID,IACT)
IF(IACT.EQ.2)THEN
WRITE(IGWMP,'(I10,2X,I10,I5)') UNID,NUND,1
WRITE(IMODSIM,'(I10,2X,I10,I5)') UNID,NUND,1
ENDIF
IF(.NOT.LPWT)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_PWT)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
CALL WRITEDXC(IDXC,DXCID,PRJIDF%NCOL,PRJIDF%NROW,PRJNLAY,NDXC)
DEALLOCATE(DXCID) !,RURALSVATID)
IF(IARMWP.EQ.1)DEALLOCATE(IPF)
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(IDFM_MSWP.GT.0)CLOSE(IDFM_MSWP)
IF(IMSWP_DFM.GT.0)CLOSE(IMSWP_DFM)
CALL UTL_MF2005_MAXNO(TRIM(DIRMSP)//'\DFM2DTOMSW_WL.DMM_',(/NUND/))
CALL UTL_MF2005_MAXNO(TRIM(DIRMSP)//'\MSWTODFM2D_DPV.DMM_',(/NUND/))
END SUBROUTINE PMANAGER_SAVEMF2005_MSP_INPFILES
!###====================================================================
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
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
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 :: LUNCB,ICOL,IROW,ILAY,ID
LUNCB=0
WRITE(IDXC,'(2I10)') NDXC,LUNCB
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
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
!###====================================================================
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
!###====================================================================
SUBROUTINE PMANAGER_SAVEMF2005_MSP_CHECK(NODATA)
!###====================================================================
IMPLICIT NONE
REAL(KIND=DP_KIND),DIMENSION(:),INTENT(IN) :: NODATA
INTEGER,DIMENSION(:),ALLOCATABLE :: IERROR
INTEGER :: IROW,ICOL,STRLEN
REAL(KIND=DP_KIND) :: DXY,ARND
CHARACTER(LEN=:),ALLOCATABLE :: STR
!## inactivate constant head boundaries and inactive nodes
DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL
IF(BND(1)%X(ICOL,IROW).LE.0.0D0)SIMGRO(ICOL,IROW)%IBOUND=0
ENDDO; ENDDO
!## skip corners irt anisotropy package
SIMGRO(1 ,1 )%IBOUND=0
SIMGRO(1 ,PRJIDF%NROW )%IBOUND=0
SIMGRO(PRJIDF%NCOL,1 )%IBOUND=0
SIMGRO(PRJIDF%NCOL,PRJIDF%NROW)%IBOUND=0
!## 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(22)); 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(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(LPWT)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
ENDDO; ENDDO
!## error in data
IF(SUM(IERROR).GT.0)THEN
STRLEN=22*30; 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)))//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(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)
END SUBROUTINE 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(3) :: PCK
INTEGER,DIMENSION(3) :: IU
INTEGER,DIMENSION(3) :: JU,NO,NO_PREV
CHARACTER(LEN=256),DIMENSION(3) :: FNAME,FNAME_PREV
INTEGER :: I,J,IPER
LOGICAL :: LEX
PMANAGER_SAVEMF2005_COMBINE=.FALSE.
!## read from files
IU=0
DO I=1,SIZE(PCK)
LINE=TRIM(DIRNAME)//'.'//TRIM(PCK(I))//'7'
IF(I.LE.2)THEN
IU(I)=UTL_GETUNIT(); CALL OSD_OPEN(IU(I),FILE=LINE,STATUS='OLD',ACTION='READ')
ELSE
!## write to file
IU(I)=UTL_GETUNIT(); CALL OSD_OPEN(IU(I),FILE=LINE,STATUS='UNKNOWN',ACTION='WRITE')
ENDIF
ENDDO
IF(MINVAL(IU).EQ.0)RETURN
NO=0; DO I=1,2; READ(IU(I),*) NO(I); ENDDO
LINE=TRIM(ITOS(SUM(NO)))//','//TRIM(ITOS(CB))//' '//TRIM(CAUX)
WRITE(IU(3),'(A)') TRIM(LINE)
DO IPER=1,PRJNPER
NO=0; DO I=1,2; READ(IU(I),*) NO(I); ENDDO
!## use previous timestep for both
IF(NO(1).EQ.-1.AND.NO(2).EQ.-1)THEN
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
LINE=TRIM(ITOS(SUM(NO)))
WRITE(IU(3),'(A)') TRIM(LINE)
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
FNAME(3)=TRIM(DIR)//'\'// TRIM(PCK(2))//'7\'//TRIM(PCK(2))//'_T'//TRIM(ITOS(IPER))//'.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 OSD_OPEN(JU(3),FILE=FNAME(3),STATUS='UNKNOWN',ACTION='WRITE')
IF(JU(1).GT.0)THEN; DO I=1,NO(1); READ(JU(1),'(A256)') LINE; WRITE(JU(3),'(A)') TRIM(LINE); ENDDO; CLOSE(JU(1)); ENDIF
IF(JU(2).GT.0)THEN; DO I=1,NO(2); READ(JU(2),'(A256)') LINE; WRITE(JU(3),'(A)') TRIM(LINE); ENDDO; CLOSE(JU(2)); ENDIF
!## add iMOD header at the bottom
IF(PBMAN%IFORMAT.EQ.2)CALL IDFWRITEFREE_HEADER(JU(3),BND(1))
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
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'
DO I=1,2; NO_PREV(I)=NO(I); FNAME_PREV(I)=FNAME(I); ENDDO
ENDDO
CLOSE(IU(1),STATUS='DELETE'); CLOSE(IU(2),STATUS='DELETE'); CLOSE(IU(3))
!## rename file
FNAME(1)=TRIM(DIRNAME)//'.'//TRIM(PCK(3))//'7'
FNAME(2)=TRIM(DIRNAME)//'.'//TRIM(PCK(2))//'7'
CALL IOSRENAMEFILE(FNAME(1),FNAME(2))
PMANAGER_SAVEMF2005_COMBINE=.TRUE.
END FUNCTION PMANAGER_SAVEMF2005_COMBINE
!###======================================================================
SUBROUTINE PMANAGER_SAVEMF2005_PCK_ULSTRD_PARAM(PRJNLAY,ICOL,IROW,BND,TOP,BOT,KD,TP,BT,KH,LKHV)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: PRJNLAY,ICOL,IROW
TYPE(IDFOBJ),INTENT(IN),DIMENSION(PRJNLAY) :: BND,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
!## do not put any in constant or inactive cells
IF(BND(ILAY)%X(ICOL,IROW).GT.0.AND.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.
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.0D0 (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
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)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: ITOPIC,IU,IPRT,IBATCH
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),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(1)%FILES,2)
IPC=INT(0,1)
ICNST =TOPICS(ITOPIC)%STRESS(1)%FILES(1,ISYS)%ICNST
CNST =TOPICS(ITOPIC)%STRESS(1)%FILES(1,ISYS)%CNST
ILAY =TOPICS(ITOPIC)%STRESS(1)%FILES(1,ISYS)%ILAY
FCT =TOPICS(ITOPIC)%STRESS(1)%FILES(1,ISYS)%FCT
IMP =TOPICS(ITOPIC)%STRESS(1)%FILES(1,ISYS)%IMP
IDF%FNAME=TOPICS(ITOPIC)%STRESS(1)%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.'
EXIT
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(1)%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
REAL(KIND=DP_KIND) :: C,C1,C2,Z,ZZ,TPV,BTV,TFV,BFV
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
DO ILAY=1,PRJNLAY
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), c=resistance
READ(JU,'(5I10,2G15.7,I10,4G15.7)',IOSTAT=IOS) JLAY,IR1,IC1,IR2,IC2,C,Z,ISYS,TPV,BTV,TFV,BFV
IF(IOS.NE.0)EXIT
IF(JLAY.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/or towards inactive cell
IF(BND(ILAY)%X(ICOL,IROW).EQ.0.0D0.OR. &
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)
!## add fault
NHFBNP(ILAY)=NHFBNP(ILAY)+1
IF(PBMAN%IFORMAT.EQ.2)THEN
WRITE(IU,'(5(I10,1X),G15.7,1X,I10)') ILAY,IROW,ICOL, IROW,ICOL+1, C2,ISYS !## y-direction
ELSE
WRITE(IU,'(6(I10,1X),G15.7,1X,I10)') ILAY,IROW,ICOL,ILAY,IROW,ICOL+1, C2,ISYS !## y-direction
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)
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.OR. &
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)
!## add fault
NHFBNP(ILAY)=NHFBNP(ILAY)+1
IF(PBMAN%IFORMAT.EQ.2)THEN
WRITE(IU,'(5(I10,1X),G15.7,1X,I10)') ILAY,IROW,ICOL, IROW+1,ICOL, C2,ISYS !## x-direction
ELSE
WRITE(IU,'(6(I10,1X),G15.7,1X,I10)') ILAY,IROW,ICOL,ILAY,IROW+1,ICOL, C2,ISYS !## x-direction
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)
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)
ELSE
TFV=TF(IC2,IR2)
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)
ELSE
BFV=BF(IC2,IR2)
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
TPV=(TOP(ILAY)%X(IC1,IR1)+TOP(ILAY)%X(IC2,IR2))/2.0D0
BTV=(BOT(ILAY)%X(IC1,IR1)+BOT(ILAY)%X(IC2,IR2))/2.0D0
!## 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)
!###====================================================================
IMPLICIT NONE
TYPE(IDFOBJ),INTENT(IN) :: IDF
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
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
IF(LTB)THEN
IF(TFV.GE.BFV)WRITE(JU,'(I10,3(1X,E15.7),I10)') N,C,RES,FDZ,ISYS
ELSE
WRITE(JU,'(I10,1X ,E15.7 ,I10)') N,C,ISYS
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
IF(LTB)THEN
IF(TFV.GE.BFV)WRITE(JU,'(I10,3(1X,E15.7),I10)') N,C,RES,FDZ,ISYS
ELSE
WRITE(JU,'(I10,1X ,E15.7 ,I10)') N,C,ISYS
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_MOD_READ(IDF,ITOPIC,IFILE,SCL_D,SCL_U,IINV,IPRT)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: ITOPIC,IFILE,SCL_D,SCL_U,IINV,IPRT
CHARACTER(LEN=256) :: FNAME
TYPE(IDFOBJ),INTENT(INOUT) :: IDF
INTEGER :: ICNST,ILAY
REAL(KIND=DP_KIND) :: FCT,IMP,CNST
PMANAGER_SAVEMF2005_MOD_READ=.TRUE.
FCT =FNAMES(IFILE)%FCT
IMP =FNAMES(IFILE)%IMP
ILAY =FNAMES(IFILE)%ILAY
ICNST=FNAMES(IFILE)%ICNST
CNST =FNAMES(IFILE)%CNST
FNAME=FNAMES(IFILE)%FNAME
IF(IPRT.GT.0)THEN
WRITE(IPRT,'(1X,A,I3,A1,I1,A1,I4.3,3(A1,G15.7),A1,A)') TOPICS(ITOPIC)%TNAME(1:5)//',', &
IFILE,',',ICNST,',',ILAY,',',FCT,',',IMP,',',CNST,',',CHAR(39)//TRIM(FNAME)//CHAR(39)
ENDIF
IF(ICNST.EQ.1)THEN
IDF%X=CNST
ELSEIF(ICNST.EQ.2.OR.ICNST.EQ.3)THEN
IDF%FNAME=FNAME
!## read/clip/scale idf file
PMANAGER_SAVEMF2005_MOD_READ=IDFREADSCALE(IDF%FNAME,IDF,SCL_U,SCL_D,1.0D0,0)
ENDIF
!## apply factors if no errors occured
IF(PMANAGER_SAVEMF2005_MOD_READ)CALL PMANAGER_SAVEMF2005_FCTIMP(IINV,ICNST,IDF,FCT,IMP,SCL_U)
END FUNCTION PMANAGER_SAVEMF2005_MOD_READ
!###======================================================================
LOGICAL FUNCTION PMANAGER_SAVEMF2005_MOD_U2DREL(EXFNAME,IDF,IINT,IU,ILAY,IFBND)
!###======================================================================
IMPLICIT NONE
CHARACTER(LEN=*),INTENT(IN) :: EXFNAME
TYPE(IDFOBJ),INTENT(INOUT) :: IDF
CHARACTER(LEN=256) :: SFNAME
INTEGER,INTENT(IN) :: IINT,IU,ILAY,IFBND
INTEGER :: JU,IROW,ICOL,I,N
REAL(KIND=DP_KIND) :: MINV,MAXV
PMANAGER_SAVEMF2005_MOD_U2DREL=.FALSE.
!## correct for boundary conditions
IF(.NOT.PMANAGER_SAVEMF2005_PCK_GETMINMAX(IDF%X,IDF%NCOL,IDF%NROW,BND(ILAY)%X,MINV,MAXV,IFBND))RETURN
!## constant value
IF(MAXV.EQ.MINV)THEN
IF(IINT.EQ.0)THEN
IF(MAXV.EQ.IDF%NODATA)THEN
LINE='CONSTANT '//TRIM(RTOS(HNOFLOW,'E',7))
ELSE
LINE='CONSTANT '//TRIM(RTOS(MAXV,'E',7))
ENDIF
ELSEIF(IINT.EQ.1)THEN
IF(MAXV.EQ.IDF%NODATA)THEN
LINE='CONSTANT '//TRIM(ITOS(0))
ELSE
LINE='CONSTANT '//TRIM(ITOS(INT(MAXV)))
ENDIF
ENDIF
IF(PBMAN%IFORMAT.EQ.2)WRITE(IU,'(A)') TRIM(LINE)
IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(A)') ' '//TRIM(LINE)
ELSE
CALL UTL_CREATEDIR(EXFNAME(:INDEX(EXFNAME,'\',.TRUE.)-1))
IF(PBMAN%IFORMAT.EQ.3)THEN; N=4; ELSE; N=3; ENDIF
SFNAME=EXFNAME; DO I=1,N; SFNAME=SFNAME(:INDEX(SFNAME,'\',.TRUE.)-1); ENDDO
I=LEN_TRIM(SFNAME); SFNAME='.'//EXFNAME(I+1:)
IF(PBMAN%IFORMAT.EQ.2)THEN
IF(IINT.EQ.0)WRITE(IU,'(A)') 'OPEN/CLOSE '//TRIM(SFNAME)//' 1.0D0 (FREE) -1'
IF(IINT.EQ.1)WRITE(IU,'(A)') 'OPEN/CLOSE '//TRIM(SFNAME)//' 1 (FREE) -1'
ELSE
IF(IINT.EQ.0)WRITE(IU,'(A)') ' OPEN/CLOSE '//TRIM(SFNAME)//' FACTOR 1.0D0 IPRN -1'
IF(IINT.EQ.1)WRITE(IU,'(A)') ' OPEN/CLOSE '//TRIM(SFNAME)//' FACTOR 1 IPRN -1'
ENDIF
IF(TRIM(EXFNAME(INDEX(EXFNAME,'.',.TRUE.)+1:)).EQ.'ASC')THEN
JU=UTL_GETUNIT(); CALL OSD_OPEN(JU,FILE=EXFNAME,STATUS='UNKNOWN',ACTION='WRITE',FORM='FORMATTED'); IF(JU.EQ.0)RETURN
WRITE(JU,'(A14,I10)') 'NCOLS' ,IDF%NCOL
WRITE(JU,'(A14,I10)') 'NROWS' ,IDF%NROW
WRITE(JU,'(A14,G15.7)') 'XLLCORNER' ,IDF%XMIN
WRITE(JU,'(A14,G15.7)') 'YLLCORNER' ,IDF%YMIN
WRITE(JU,'(A14,G15.7)') 'CELLSIZE' ,IDF%DX
WRITE(JU,'(A14,G15.7)') 'NODATA_VALUE ',IDF%NODATA
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
CLOSE(JU)
ELSEIF(TRIM(EXFNAME(INDEX(EXFNAME,'.',.TRUE.)+1:)).EQ.'IDF')THEN
IF(.NOT.IDFWRITE(IDF,EXFNAME,1))RETURN
ELSE
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
ENDIF
PMANAGER_SAVEMF2005_MOD_U2DREL=.TRUE.
END FUNCTION PMANAGER_SAVEMF2005_MOD_U2DREL
!###======================================================================
SUBROUTINE PMANAGER_SAVEMF2005_FCTIMP(IINV,ICNST,IDF,FCT,IMP,SCL_U)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: IINV,ICNST,SCL_U
REAL(KIND=DP_KIND),INTENT(IN) :: FCT,IMP
TYPE(IDFOBJ),INTENT(INOUT) :: IDF
INTEGER :: IROW,ICOL
!## replace nodata for hnoflow-value
DO IROW=1,IDF%NROW; DO ICOL=1,IDF%NCOL
!## not constant value and equal to nodata - skip it
IF(ICNST.EQ.2.AND.IDF%X(ICOL,IROW).EQ.IDF%NODATA)THEN
!## geometric will otherwise ignore zero as entry which is allowed
IF(SCL_U.EQ.3)THEN
IDF%X(ICOL,IROW)=0.0D0
ELSE
IDF%X(ICOL,IROW)=HNOFLOW
ENDIF
ELSE
IDF%X(ICOL,IROW)=IDF%X(ICOL,IROW)*FCT+IMP
ENDIF
!## translate from resistance into reciprocal conductance
!## translate from vka into reciprocal vka
IF(IINV.EQ.1)THEN
IF(IDF%X(ICOL,IROW).NE.0.0D0.AND.IDF%X(ICOL,IROW).NE.HNOFLOW)IDF%X(ICOL,IROW)=1.0D0/IDF%X(ICOL,IROW)
ENDIF
ENDDO; ENDDO
IDF%NODATA=HNOFLOW
END SUBROUTINE PMANAGER_SAVEMF2005_FCTIMP
!###======================================================================
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(.NOT.LLAK)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(ILAY)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: ILAY
INTEGER :: IROW,ICOL,NN,NE,NS,NW
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)))
!## correct for boundary values from mf6
IF(PBMAN%NSUBMODEL.GT.1.AND.PBMAN%IFORMAT.EQ.3)THEN
IF(PRJIDF%X(ICOL,IROW).EQ.PRJIDF%NODATA)BND(ILAY)%X(ICOL,IROW)=0.0D0
ENDIF
ENDDO
ENDDO
NN=0; NW=0; NS=0; NE=0
!## no applicable with submodel via mf6
IF(PBMAN%NSUBMODEL.GT.1.AND.PBMAN%IFORMAT.EQ.3)RETURN
!## replace ibound for boundaries
DO IROW=1,BND(ILAY)%NROW
IF(IFULL(1).EQ.1)THEN; ICOL=1; IF(BND(ILAY)%X(ICOL,IROW).GT.0)THEN; NW=NW+1; BND(ILAY)%X(ICOL,IROW)=-1; ENDIF; ENDIF
IF(IFULL(3).EQ.1)THEN; ICOL=BND(ILAY)%NCOL; IF(BND(ILAY)%X(ICOL,IROW).GT.0)THEN; NE=NE+1; BND(ILAY)%X(ICOL,IROW)=-1; ENDIF; ENDIF
ENDDO
DO ICOL=1,BND(ILAY)%NCOL
IF(IFULL(4).EQ.1)THEN; IROW=1; IF(BND(ILAY)%X(ICOL,IROW).GT.0)THEN; NN=NN+1; BND(ILAY)%X(ICOL,IROW)=-1; ENDIF; ENDIF
IF(IFULL(2).EQ.1)THEN; IROW=BND(ILAY)%NROW; IF(BND(ILAY)%X(ICOL,IROW).GT.0)THEN; NS=NS+1; BND(ILAY)%X(ICOL,IROW)=-1; 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
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
!## blank out inactive cells
IF(BND(ILAY)%X(ICOL,IROW).EQ.0)THEN
IDF%X(ICOL,IROW)=IDF%NODATA
ELSE
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.9.OR.ITOPIC.EQ.10)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)') CMOD(ITOPIC),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
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.9.OR.ITOPIC.EQ.10)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)') CMOD(ITOPIC),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 (6:12)
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.31.AND.ITOPIC.NE.28)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