!! 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 .
!!
!! Contact: imod.support@deltares.nl
!! Stichting Deltares
!! P.O. Box 177
!! 2600 MH Delft, The Netherlands.
!!
MODULE MOD_PMANAGER_UTL
USE WINTERACTER
USE RESOURCE
USE MOD_MODEL_PAR
USE MOD_PMANAGER_PAR
USE MOD_PMANAGER_TIME
USE IMODVAR
USE MOD_IDF
USE MOD_UTL
USE MOD_OSD
USE MOD_PREF_PAR
USE DATEVAR
USE MODPLOT
USE MOD_ABOUT
USE MOD_IPEST_GLM, ONLY : IPEST_GLM_MAIN,IPEST_GLM_RESET_PARAMETER
CONTAINS
!###======================================================================
SUBROUTINE PMANAGER_SORTTOPIC(ITOPIC,IPER)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: ITOPIC,IPER
INTEGER :: I,J,II,K,N,M,JJ,IYR,IMH,IDY,IHR,IMT,ISC
INTEGER,ALLOCATABLE,DIMENSION(:) :: ILAY,ISORT
REAL(KIND=DP_KIND),ALLOCATABLE,DIMENSION(:) :: RTIME
!## sort selected systems in layer
N=SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,2)
IF(N.GT.1)THEN
ALLOCATE(ILAY(N),ISORT(N)); ILAY=0; ISORT=0
DO I=1,N; ILAY(I)=TOPICS(ITOPIC)%STRESS(IPER)%FILES(1,I)%ILAY; ENDDO
CALL WSORT(ILAY,1,N,IORDER=ISORT)
J =SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,1)
K =SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,2)
NULLIFY(TOPICS(ITOPIC)%STRESS(IPER)%FILES_TMP)
ALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%FILES_TMP(J,K))
DO I=1,N
J=ISORT(I)
DO II=1,SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,1)
TOPICS(ITOPIC)%STRESS(IPER)%FILES_TMP(II,I)=TOPICS(ITOPIC)%STRESS(IPER)%FILES(II,J)
ENDDO
ENDDO
DEALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%FILES)
TOPICS(ITOPIC)%STRESS(IPER)%FILES=>TOPICS(ITOPIC)%STRESS(IPER)%FILES_TMP
DEALLOCATE(ILAY,ISORT)
ENDIF
!## sort selected systems in time
IF(TOPICS(ITOPIC)%TIMDEP)THEN
N=SIZE(TOPICS(ITOPIC)%STRESS)
IF(N.GT.1)THEN
ALLOCATE(RTIME(N),ISORT(N)); RTIME=0.0D0; ISORT=0
DO I=1,N
IYR=TOPICS(ITOPIC)%STRESS(I)%IYR; IMH=TOPICS(ITOPIC)%STRESS(I)%IMH
IDY=TOPICS(ITOPIC)%STRESS(I)%IDY; IHR=TOPICS(ITOPIC)%STRESS(I)%IHR
IMT=TOPICS(ITOPIC)%STRESS(I)%IMT; ISC=TOPICS(ITOPIC)%STRESS(I)%ISC
RTIME(I)=IYR*10000000000+IMH*100000000+IDY*1000000+IHR*10000+IMT*100+ISC
ENDDO
CALL WSORT(RTIME,1,N,IORDER=ISORT)
N=SIZE(TOPICS(ITOPIC)%STRESS); ALLOCATE(TOPICS(ITOPIC)%STRESS_TMP(N))
DO I=1,N
J=ISORT(I)
!## create items for j
N =SIZE(TOPICS(ITOPIC)%STRESS(J)%FILES,1)
M =SIZE(TOPICS(ITOPIC)%STRESS(J)%FILES,2)
NULLIFY(TOPICS(ITOPIC)%STRESS_TMP(I)%FILES); ALLOCATE(TOPICS(ITOPIC)%STRESS_TMP(I)%FILES(N,M))
TOPICS(ITOPIC)%STRESS_TMP(I)%CDATE=TOPICS(ITOPIC)%STRESS(J)%CDATE
TOPICS(ITOPIC)%STRESS_TMP(I)%IYR =TOPICS(ITOPIC)%STRESS(J)%IYR
TOPICS(ITOPIC)%STRESS_TMP(I)%IMH =TOPICS(ITOPIC)%STRESS(J)%IMH
TOPICS(ITOPIC)%STRESS_TMP(I)%IDY =TOPICS(ITOPIC)%STRESS(J)%IDY
TOPICS(ITOPIC)%STRESS_TMP(I)%IHR =TOPICS(ITOPIC)%STRESS(J)%IHR
TOPICS(ITOPIC)%STRESS_TMP(I)%IMT =TOPICS(ITOPIC)%STRESS(J)%IMT
TOPICS(ITOPIC)%STRESS_TMP(I)%ISC =TOPICS(ITOPIC)%STRESS(J)%ISC
DO II=1,SIZE(TOPICS(ITOPIC)%STRESS_TMP(I)%FILES,1)
DO JJ=1,SIZE(TOPICS(ITOPIC)%STRESS_TMP(I)%FILES,2)
TOPICS(ITOPIC)%STRESS_TMP(I)%FILES(II,JJ)=TOPICS(ITOPIC)%STRESS(J)%FILES(II,JJ)
ENDDO
ENDDO
ENDDO
DEALLOCATE(TOPICS(ITOPIC)%STRESS)
TOPICS(ITOPIC)%STRESS=>TOPICS(ITOPIC)%STRESS_TMP
DEALLOCATE(RTIME,ISORT)
ENDIF
ENDIF
END SUBROUTINE PMANAGER_SORTTOPIC
!###======================================================================
INTEGER FUNCTION PMANAGER_GETFNAMES(IL1,IL2,JSYS,JSUB,JPER)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: IL1,IL2,JSYS,JSUB,JPER
INTEGER :: KK,I,J,JJ,ISYS,ISUB,IPER,IL
LOGICAL :: LEX
PMANAGER_GETFNAMES=0
KK=0
!## find fnames for model layers
DO IL=IL1,IL2
!## find topics
DO J=1,SIZE(PRJILIST)
JJ=PRJILIST(J)
!## skip last - if that is vcw/kvv
IF(IL1.NE.IL2.AND.IL.EQ.IL2)THEN
IF(JJ.EQ.9.OR.JJ.EQ.10)CYCLE
ENDIF
IF(.NOT.ASSOCIATED(TOPICS(JJ)%STRESS))CYCLE
DO IPER=1,SIZE(TOPICS(JJ)%STRESS)
!## not appropriate system
IF(IPER.NE.JPER.AND.JPER.NE.0)CYCLE
IF(.NOT.ASSOCIATED(TOPICS(JJ)%STRESS(IPER)%FILES))CYCLE
!## number of subtopics
DO ISUB=1,SIZE(TOPICS(JJ)%STRESS(IPER)%FILES,1)
!## not appropriate system
IF(ISUB.NE.JSUB.AND.JSUB.NE.0)CYCLE
!## number of systems
DO ISYS=1,SIZE(TOPICS(JJ)%STRESS(IPER)%FILES,2)
!## not appropriate system
IF(ISYS.NE.JSYS.AND.JSYS.NE.0)CYCLE
!## not appropriate layer
IF(IL.NE.0)THEN
IF(TOPICS(JJ)%STRESS(IPER)%FILES(ISUB,ISYS)%ILAY.NE.IL)CYCLE
ENDIF
KK=KK+1; CALL PMAMAGER_INCREASEFNAMES(KK)
FNAMES(KK)%ILAY =TOPICS(JJ)%STRESS(IPER)%FILES(ISUB,ISYS)%ILAY
FNAMES(KK)%ICNST=TOPICS(JJ)%STRESS(IPER)%FILES(ISUB,ISYS)%ICNST
FNAMES(KK)%CNST =TOPICS(JJ)%STRESS(IPER)%FILES(ISUB,ISYS)%CNST
FNAMES(KK)%FCT =TOPICS(JJ)%STRESS(IPER)%FILES(ISUB,ISYS)%FCT
FNAMES(KK)%IMP =TOPICS(JJ)%STRESS(IPER)%FILES(ISUB,ISYS)%IMP
FNAMES(KK)%FNAME=TOPICS(JJ)%STRESS(IPER)%FILES(ISUB,ISYS)%FNAME
!## read only the first appropriate file
EXIT
ENDDO
ENDDO
ENDDO
ENDDO
ENDDO
!## actual found files
PMANAGER_GETFNAMES=KK
LINE=TOPICS(PRJILIST(1))%TNAME(1:5)
DO J=2,SIZE(PRJILIST); LINE=TRIM(LINE)//','//TOPICS(PRJILIST(J))%TNAME(1:5); ENDDO
IF(PMANAGER_GETFNAMES.EQ.0)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'No compulsory files found for package(s):'//CHAR(13)//TRIM(LINE),'Warning')
!## check whether file(s) exist
DO I=1,KK
!## filename read
IF(FNAMES(I)%ICNST.GT.1)THEN
INQUIRE(FILE=FNAMES(I)%FNAME,EXIST=LEX)
IF(.NOT.LEX)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD cannot find the following file:'//CHAR(13)// &
TRIM(FNAMES(I)%FNAME),'Warning'); PMANAGER_GETFNAMES=0
ENDIF
ENDIF
ENDDO
END FUNCTION PMANAGER_GETFNAMES
!###======================================================================
SUBROUTINE PMAMAGER_INCREASEFNAMES(K)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: K
INTEGER :: I,N
IF(.NOT.ASSOCIATED(FNAMES))THEN; ALLOCATE(FNAMES(1)); RETURN; ENDIF
N=SIZE(FNAMES); IF(K.LE.N)RETURN
ALLOCATE(FNAMES_BU(N+10)); DO I=1,N; FNAMES_BU(I)=FNAMES(I); ENDDO
DEALLOCATE(FNAMES); FNAMES=>FNAMES_BU
END SUBROUTINE PMAMAGER_INCREASEFNAMES
!###======================================================================
LOGICAL FUNCTION PMANAGER_GETPACKAGES(IBATCH)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: IBATCH
INTEGER :: ITOPIC,I
PMANAGER_GETPACKAGES=.FALSE.
! LPCGN=.FALSE. !## option ?
LPWT =.FALSE.
!## cap
LMSP=.FALSE.; ITOPIC=1; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LMSP=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LMSP=.FALSE.
!## turn off for steady-state simulations
IF(ISS.EQ.0)LMSP=.FALSE.
!## ani
LANI=.FALSE.; ITOPIC=14; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LANI=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LANI=.FALSE.
!## hfb
LHFB=.FALSE.; ITOPIC=15; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LHFB=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LHFB=.FALSE.
!## wel
LWEL=.FALSE.; ITOPIC=21; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LWEL=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LWEL=.FALSE.
!## drn
LDRN=.FALSE.; ITOPIC=22; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LDRN=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LDRN=.FALSE.
!## riv
LRIV=.FALSE.; ITOPIC=23; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LRIV=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LRIV=.FALSE.
!## evt
LEVT=.FALSE.; ITOPIC=24; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LEVT=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LEVT=.FALSE.
!## ghb
LGHB=.FALSE.; ITOPIC=25; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LGHB=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LGHB=.FALSE.
!## rch
LRCH=.FALSE.; ITOPIC=26; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LRCH=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LRCH=.FALSE.
!## sof
LOLF=.FALSE.; ITOPIC=27; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LOLF=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LOLF=.FALSE.
!## chd
LCHD=.FALSE.; ITOPIC=28; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LCHD=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LCHD=.FALSE.
!## isg
LISG=.FALSE.; ITOPIC=29; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LISG=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LISG=.FALSE.
!## sfr
LSFR=.FALSE.; ITOPIC=30; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LSFR=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LSFR=.FALSE.
!## fhb
LFHB=.FALSE.; ITOPIC=31; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LFHB=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LFHB=.FALSE.
!## lak
LLAK=.FALSE.; ITOPIC=32; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LLAK=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LLAK=.FALSE.
!## pcg
LPCG=.FALSE.; ITOPIC=33; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LPCG=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LPCG=.FALSE.
IF(.NOT.LPCG)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'It is compulsory to add a solver, e.g. PCG','Error')
RETURN
ENDIF
IF(LPCG.AND.PBMAN%IPKS.EQ.1)THEN
LPCG=.FALSE.; LPKS=.TRUE.
ENDIF
!## uzf
LUZF=.FALSE.; ITOPIC=18; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LUZF=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LUZF=.FALSE.
IF(LUZF)THEN
IF(LAYCON(1).NE.2)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'It is compulsory to use an unconfined first model layer for the UZF package','Error')
RETURN
ENDIF
ENDIF
!## mnw
LMNW=.FALSE.; ITOPIC=19; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LMNW=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LMNW=.FALSE.
!## sft
LSFT=.FALSE.; ITOPIC=17; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LSFT=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LSFT=.FALSE.
!## pst
LPST=.FALSE.; ITOPIC=20; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))LPST=.TRUE.; ENDIF
IF(TOPICS(ITOPIC)%IACT_MODEL.EQ.0)LPST=.FALSE.
!## save settings for iMOD GUI
IF(IBATCH.EQ.0)THEN
!## use as unconfined
ALLOCATE(PBMAN%UNCONFINED(1)); PBMAN%UNCONFINED(1)=0
!## save all heads
ALLOCATE(PBMAN%SAVESHD(1)); PBMAN%SAVESHD(1)=-1
!## save all fluxes
ALLOCATE(PBMAN%SAVEFLX(1)); PBMAN%SAVEFLX(1)=-1
IF(LUZF)THEN
ALLOCATE(PBMAN%SAVEUZF(1)); PBMAN%SAVEUZF(1)=1
ENDIF
IF(LSFR)THEN
ALLOCATE(PBMAN%SAVESFR(1)); PBMAN%SAVESFR(1)=1
ENDIF
IF(LWEL)THEN
ALLOCATE(PBMAN%SAVEWEL(1)); PBMAN%SAVEWEL(1)=-1
ENDIF
IF(LDRN.OR.LOLF)THEN
ALLOCATE(PBMAN%SAVEDRN(1)); PBMAN%SAVEDRN(1)=-1
ENDIF
IF(LRIV.OR.LISG)THEN
ALLOCATE(PBMAN%SAVERIV(1)); PBMAN%SAVERIV(1)=-1
ENDIF
IF(LGHB)THEN
ALLOCATE(PBMAN%SAVEGHB(1)); PBMAN%SAVEGHB(1)=-1
ENDIF
IF(LRCH)THEN
ALLOCATE(PBMAN%SAVERCH(1)); PBMAN%SAVERCH(1)=1
ENDIF
IF(LEVT)THEN
ALLOCATE(PBMAN%SAVEEVT(1)); PBMAN%SAVEEVT(1)=1
ENDIF
IF(LMNW)THEN
ALLOCATE(PBMAN%SAVEMNW(1)); PBMAN%SAVEMNW(1)=-1
ENDIF
IF(LLAK)THEN
ALLOCATE(PBMAN%SAVELAK(1)); PBMAN%SAVELAK(1)=-1
ENDIF
IF(LFHB)THEN
ALLOCATE(PBMAN%SAVEFHB(1)); PBMAN%SAVEFHB(1)=-1
ENDIF
PBMAN%MINKD=0.0D0
PBMAN%MINC =0.0D0
PBMAN%IFVDL=0
PBMAN%IPKS=0
PBMAN%ICONCHK=0
PBMAN%ICHKCHD=0
PBMAN%OUTPUT=''
PBMAN%NSUBMODEL=1
PBMAN%ISUBMODEL=1
PBMAN%SSYSTEM=0
PBMAN%DWEL=1
PBMAN%DISG=1
PBMAN%DSFR=0
PBMAN%ISAVEENDDATE=0
PBMAN%IPEST=0; IF(LPST.AND.PBMAN%IPESTP.EQ.0)PBMAN%IPEST=1
PBMAN%NLOGLOC=0
PBMAN%INTSHD=1; PBMAN%INTKHV=1; PBMAN%INTKDW=1; PBMAN%INTKVV=1; PBMAN%INTKVA=1
PBMAN%INTVCW=1; PBMAN%INTTOP=1; PBMAN%INTBOT=1; PBMAN%INTSF1=1; PBMAN%INTSF2=1
PBMAN%INTANF=1
ENDIF
IF(.NOT.ASSOCIATED(PBMAN%ILAY))THEN
ALLOCATE(PBMAN%ILAY(PRJNLAY))
DO I=1,SIZE(PBMAN%ILAY); PBMAN%ILAY(I)=1; ENDDO
ENDIF
PMANAGER_GETPACKAGES=.TRUE.
END FUNCTION PMANAGER_GETPACKAGES
!###======================================================================
LOGICAL FUNCTION PMANAGER_INIT_SIMAREA(IDF,IBATCH)
!###======================================================================
IMPLICIT NONE
TYPE(IDFOBJ),INTENT(INOUT) :: IDF
INTEGER,INTENT(IN) :: IBATCH
INTEGER :: I,J,K,II
PMANAGER_INIT_SIMAREA=.FALSE.
IF(PBMAN%IWINDOW.EQ.2)THEN
IF(IDFREAD(IDF,PBMAN%BNDFILE,1))THEN
PMANAGER_INIT_SIMAREA=.TRUE.; RETURN
ENDIF
ENDIF
!## get estimated of the current modeldomain
JLOOP: DO K=1,SIZE(TOPICS)
!## skip wel,mnw,hfb,isg,sfr
SELECT CASE (K)
CASE (15,19:21,29,30,33); CYCLE
END SELECT
IF(.NOT.ASSOCIATED(TOPICS(K)%STRESS))CYCLE
DO J=1,SIZE(TOPICS(K)%STRESS)
IF(.NOT.ASSOCIATED(TOPICS(K)%STRESS(J)%FILES))CYCLE
!## number of systems
DO I=1,SIZE(TOPICS(K)%STRESS(J)%FILES,1)
!## number of layers
DO II=1,SIZE(TOPICS(K)%STRESS(J)%FILES,2)
IF(TOPICS(K)%STRESS(J)%FILES(I,II)%ICNST.EQ.2)THEN
IF(.NOT.IDFREAD(IDF,TOPICS(K)%STRESS(J)%FILES(I,II)%FNAME,0))THEN
RETURN
ENDIF
EXIT JLOOP
ENDIF
ENDDO
ENDDO
ENDDO
ENDDO JLOOP
IF(K.GT.SIZE(TOPICS))THEN
IF(IBATCH.EQ.0)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD cannot determine the size of the model.'//CHAR(13)// &
'Please specify at least ONE IDF file in the PRJ file or'//CHAR(13)// &
'specify a simulation window beforehand','Error')
ELSE
WRITE(*,'(/A/)') 'iMOD cannot determine the size of the model. Please specify at least ONE IDF file in the PRJ file or '// &
'specify a simulation window beforehand'
ENDIF
RETURN
ENDIF
!## in case non-equi network is read, et rid of the ieq settings
CALL IDFDEALLOCATESX(IDF); IDF%IEQ=0
PMANAGER_INIT_SIMAREA=.TRUE.
END FUNCTION PMANAGER_INIT_SIMAREA
!###======================================================================
LOGICAL FUNCTION PMANAGER_INITSIM(FNAME,IBATCH,IRUN)
!###======================================================================
IMPLICIT NONE
CHARACTER(LEN=*),INTENT(OUT) :: FNAME
INTEGER,INTENT(OUT) :: IRUN
INTEGER,INTENT(IN) :: IBATCH
INTEGER :: ITYPE
TYPE(WIN_MESSAGE) :: MESSAGE
INTEGER :: IDY,IYR,IMH,ITOPIC,IPER,I,J,K,MINJD,MAXJD,IDATE,IHR,IMT,ISC,IHMS,MINHMS,MAXHMS,ISTEADY,ISTEP,ITRANSIENT
TYPE(IDFOBJ),ALLOCATABLE,DIMENSION(:) :: IDF
LOGICAL :: LEX,LBAS
PMANAGER_INITSIM=.FALSE.; IRUN=0
!## put maximum number of layer in dialog
CALL WDIALOGLOAD(ID_DPMANAGER_SIM,ID_DPMANAGER_SIM)
CALL WDIALOGLOAD(ID_DPMANAGERLAYERTYPES,ID_DPMANAGERLAYERTYPES)
CALL PMANAGER_GETNFILES((/2,3,4,5,6,7,8,9,10,11,12/),PRJMXNLAY)
IF(PRJMXNLAY.LE.0)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'No layers found for the current configuration','Error')
RETURN
ENDIF
!## number of active layers equal to maximum allowable layers
CALL WDIALOGRANGEINTEGER(IDF_INTEGER1,1,PRJMXNLAY)
CALL WDIALOGPUTINTEGER(IDF_INTEGER1,PRJMXNLAY); PRJNLAY=PRJMXNLAY
IF(PRJMXNLAY.GT.WINFOGRID(IDF_GRID1,GRIDROWSMAX))THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'For this iMOD version, there is a maximum number of layers is '// &
TRIM(ITOS(WINFOGRID(IDF_GRID1,GRIDROWSMAX))),'Error')
RETURN
ENDIF
CALL WGRIDROWS(IDF_GRID1,PRJMXNLAY)
IF(ALLOCATED(LAYCON))THEN
IF(SIZE(LAYCON).LT.PRJMXNLAY)DEALLOCATE(LAYCON)
ENDIF
IF(.NOT.ALLOCATED(LAYCON))THEN
ALLOCATE(LAYCON(PRJMXNLAY))
IF(IBATCH.EQ.0)THEN
LAYCON=1
ELSE
J=0
DO I=1,PRJMXNLAY
IF(I.LE.SIZE(PBMAN%UNCONFINED))J=J+1
LAYCON(I)=PBMAN%UNCONFINED(J)+1 !## 1/2 value for unconfinedness
ENDDO
ENDIF
ENDIF
!## laycon=1: 0
!## laycon=2: 1
!## laycon=3:-1
!## laycon=4: constant head
ISTEADY=0; ITRANSIENT=0; MINJD=10.0D07; MAXJD=-10.0D07; MINHMS=246060; MAXHMS=0.0D0
DO ITOPIC=1,MAXTOPICS
IF(.NOT.ASSOCIATED(TOPICS(ITOPIC)%STRESS))CYCLE
IF(.NOT.TOPICS(ITOPIC)%TIMDEP)CYCLE
DO IPER=1,SIZE(TOPICS(ITOPIC)%STRESS)
IF(TRIM(UTL_CAP(TOPICS(ITOPIC)%STRESS(IPER)%CDATE,'U')).EQ.'STEADY-STATE')THEN
ISTEADY=1
ELSE
IYR=TOPICS(ITOPIC)%STRESS(IPER)%IYR; IMH=TOPICS(ITOPIC)%STRESS(IPER)%IMH; IDY=TOPICS(ITOPIC)%STRESS(IPER)%IDY
IHR=TOPICS(ITOPIC)%STRESS(IPER)%IHR; IMT=TOPICS(ITOPIC)%STRESS(IPER)%IMT; ISC=TOPICS(ITOPIC)%STRESS(IPER)%ISC
!## date entered
IF(IYR+IMH+IDY+IHR+IMT+ISC.GT.0)THEN
ITRANSIENT=1
IDATE=JD(IYR,IMH,IDY); IHMS=HMSTOITIME(IHR,IMT,ISC)
IF(IDATE.LE.MINJD)THEN
MINJD=MIN(MINJD,IDATE); IF(IHMS.LT.MINHMS)MINHMS=IHMS
ENDIF
IF(IDATE.GE.MAXJD)THEN
MAXJD=MAX(MAXJD,IDATE); IF(IHMS.GT.MAXHMS)MAXHMS=IHMS
ENDIF
ELSE
!## probably period definition?
DO J=1,NPERIOD
IF(TRIM(UTL_CAP(TOPICS(ITOPIC)%STRESS(IPER)%CDATE,'U')).EQ.TRIM(UTL_CAP(PERIOD(J)%NAME,'U')))EXIT
ENDDO
!## see whether the current stress is within mentioned period
IF(J.LE.NPERIOD)THEN
ITRANSIENT=1
DO K=1,2
IYR=PERIOD(J)%IYR; IMH=PERIOD(J)%IMH; IDY=PERIOD(J)%IDY
IHR=PERIOD(J)%IHR; IMT=PERIOD(J)%IMT; ISC=PERIOD(J)%ISC
IDATE=JD(IYR,IMH,IDY); IHMS=HMSTOITIME(IHR,IMT,ISC)
IF(IDATE.LE.MINJD)THEN
MINJD=MIN(MINJD,IDATE); IF(IHMS.LT.MINHMS)MINHMS=IHMS
ENDIF
IF(IDATE.GE.MAXJD)THEN
MAXJD=MAX(MAXJD,IDATE); IF(IHMS.GT.MAXHMS)MAXHMS=IHMS
ENDIF
ENDDO
ELSE
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Cannot convert date ['//TRIM(TOPICS(ITOPIC)%STRESS(IPER)%CDATE)//'] for'//CHAR(13)// &
'Topic '//TRIM(TOPICS(ITOPIC)%TNAME),'Warning')
RETURN
ENDIF
ENDIF
ENDIF
ENDDO
ENDDO
!## transient data found - see whether storage has been defined
IF(ITRANSIENT.EQ.1)THEN
I=0
IF(ASSOCIATED(TOPICS(11)%STRESS))THEN
IF(ASSOCIATED(TOPICS(11)%STRESS(1)%FILES))I=1
ENDIF
IF(I.EQ.0)THEN
IF(ISTEADY.EQ.0)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Missing data to convert to a transient model.'//CHAR(13)// &
'You need to specify the package (STO).','Warning'); RETURN
ELSE
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Missing data to convert to a transient model.'//CHAR(13)// &
'You need to specify the package (STO).'//CHAR(13)//'You can only select the STEADY-STATE model.','Warning'); ITRANSIENT=0
ENDIF
ENDIF
ENDIF
!## default packages
CALL WDIALOGSELECT(ID_DPMANAGER_SIM)
CALL WDIALOGPUTMENU(IDF_MENU4,TMENU1,SIZE(TMENU1),9)
CALL WDIALOGPUTIMAGE(ID_DRAW,ID_ICONDRAW,1)
CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPENIDF,1)
CALL WDIALOGPUTSTRING(ID_LAYERTYPES,'Define '//TRIM(ITOS(PRJNLAY))//' Layer Types ...')
!## no transient data found
IF(ITRANSIENT.EQ.0)THEN
IMH=3; IYR=1970; IDY=8; IHR=0; IMT=0; ISC=0
CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO1)
CALL WDIALOGFIELDSTATE(IDF_RADIO2,0)
CALL WDIALOGPUTMENU(IDF_MENU2,CDATE,12,IMH)
CALL WDIALOGPUTINTEGER(IDF_INTEGER2,IDY)
CALL WDIALOGPUTINTEGER(IDF_INTEGER3,IYR)
CALL WDIALOGPUTINTEGER(IDF_INTEGER6,IHR)
CALL WDIALOGPUTINTEGER(IDF_INTEGER7,IMT)
CALL WDIALOGPUTINTEGER(IDF_INTEGER8,ISC)
CALL WDIALOGPUTMENU(IDF_MENU3,CDATE,12,IMH)
CALL WDIALOGPUTINTEGER(IDF_INTEGER4,IDY)
CALL WDIALOGPUTINTEGER(IDF_INTEGER5,IYR)
CALL WDIALOGPUTINTEGER(IDF_INTEGER9,IHR)
CALL WDIALOGPUTINTEGER(IDF_INTEGER10,IMT)
CALL WDIALOGPUTINTEGER(IDF_INTEGER11,ISC)
!## transient data found
ELSE
CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO2)
IF(ISTEADY.EQ.0)THEN
CALL WDIALOGFIELDSTATE(IDF_RADIO1,0)
CALL WDIALOGFIELDSTATE(IDF_CHECK2,0)
ELSE
CALL WDIALOGPUTCHECKBOX(IDF_CHECK2,1)
ENDIF
CALL UTL_GDATE(MINJD,IYR,IMH,IDY)
CALL WDIALOGPUTMENU(IDF_MENU2,CDATE,12,IMH)
CALL WDIALOGPUTINTEGER(IDF_INTEGER2,IDY)
CALL WDIALOGPUTINTEGER(IDF_INTEGER3,IYR)
CALL ITIMETOHMS(MINHMS,IHR,IMT,ISC)
CALL WDIALOGPUTINTEGER(IDF_INTEGER6,IHR)
CALL WDIALOGPUTINTEGER(IDF_INTEGER7,IMT)
CALL WDIALOGPUTINTEGER(IDF_INTEGER8,ISC)
CALL UTL_GDATE(MAXJD,IYR,IMH,IDY)
CALL WDIALOGPUTMENU(IDF_MENU3,CDATE,12,IMH)
CALL WDIALOGPUTINTEGER(IDF_INTEGER4,IDY)
CALL WDIALOGPUTINTEGER(IDF_INTEGER5,IYR)
CALL ITIMETOHMS(MAXHMS,IHR,IMT,ISC)
CALL WDIALOGPUTINTEGER(IDF_INTEGER9,IHR)
CALL WDIALOGPUTINTEGER(IDF_INTEGER10,IMT)
CALL WDIALOGPUTINTEGER(IDF_INTEGER11,ISC)
ENDIF
LBAS=.FALSE.
IF(ASSOCIATED(TOPICS(4)%STRESS).AND. & !## bas
ASSOCIATED(TOPICS(5)%STRESS))THEN !## shd
IF(ASSOCIATED(TOPICS(4)%STRESS(1)%FILES).AND. & !## bas
ASSOCIATED(TOPICS(5)%STRESS(1)%FILES))THEN !## shd
LBAS=.TRUE.
ENDIF
ENDIF
IF(.NOT.LBAS)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Missing data to convert to BAS package'//CHAR(13)// &
'You need at least BND and SHD parameters','Warning')
RETURN
ENDIF
LBCF=.FALSE.
IF(ASSOCIATED(TOPICS(6)%STRESS))THEN
IF(ASSOCIATED(TOPICS(6)%STRESS(1)%FILES))THEN !## kdw
LBCF=.TRUE.
IF(PRJNLAY.GT.1)THEN
IF(ASSOCIATED(TOPICS(9)%STRESS))THEN
IF(.NOT.ASSOCIATED(TOPICS(9)%STRESS(1)%FILES))I=0 !## vcw
ELSE
LBCF=.FALSE.
ENDIF
ENDIF
ENDIF
ENDIF
I=0; IF(LBCF)I=1; CALL WDIALOGFIELDSTATE(IDF_RADIO5,I) !## bcf
IF(LBCF)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO5)
LLPF=.FALSE.; LNPF=.FALSE.
IF(ASSOCIATED(TOPICS(2)%STRESS).AND. &
ASSOCIATED(TOPICS(3)%STRESS).AND. &
ASSOCIATED(TOPICS(7)%STRESS))THEN
IF(ASSOCIATED(TOPICS(2)%STRESS(1)%FILES).AND. & !## top
ASSOCIATED(TOPICS(3)%STRESS(1)%FILES).AND. & !## bot
ASSOCIATED(TOPICS(7)%STRESS(1)%FILES))THEN !## hkv
LLPF=.TRUE.; LNPF=.TRUE.
IF(ASSOCIATED(TOPICS(8)%STRESS))THEN
IF(.NOT.ASSOCIATED(TOPICS(8)%STRESS(1)%FILES))I=0 !## kva
ELSE
LLPF=.FALSE.; LNPF=.FALSE.
ENDIF
ENDIF
ENDIF
J=0; IF(LLPF)J=1; CALL WDIALOGFIELDSTATE(IDF_RADIO6,J) !## lpf
IF(LLPF)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO6)
IF(.NOT.LBCF.AND..NOT.LLPF.AND..NOT.LNPF)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Missing data to convert to BCF6, LPF or NPF package'//CHAR(13)// &
'For BCF you need at least KDW and VCW parameters'//CHAR(13)// &
'For LPF/NPF you need at least TOP, BOT, KHV and KVA parameters','Warning')
RETURN
ENDIF
!## if lake or uzf package activated, make sure top/bot are active too
IF(ASSOCIATED(TOPICS(32)%STRESS).OR.ASSOCIATED(TOPICS(18)%STRESS))THEN
J=0
IF(ASSOCIATED(TOPICS(2)%STRESS).AND.ASSOCIATED(TOPICS(3)%STRESS))J=1
IF(J.EQ.0)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'For usage of the LAK or UZF package you need to'//CHAR(13)// &
'specify TOP and BOT packages as well','Warning'); RETURN
ENDIF
ENDIF
!## look for any boundary file (first) not equal to constant values
ALLOCATE(IDF(1)); CALL IDFNULLIFY(IDF(1))
IF(.NOT.PMANAGER_INIT_SIMAREA(IDF(1),IBATCH))THEN
CALL IDFDEALLOCATE(IDF,SIZE(IDF)); DEALLOCATE(IDF); RETURN
ENDIF
IF(IBATCH.EQ.0)PBMAN%BNDFILE=''
IF(TRIM(PBMAN%BNDFILE).NE.'')THEN
CALL WDIALOGPUTSTRING(IDF_STRING2,PBMAN%BNDFILE)
CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO16)
ELSE
CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO17)
CALL WDIALOGPUTSTRING(IDF_STRING2,'Enter NETWORKIDF')
ENDIF
!## found any of the given IDF-files that could serve as simulation window
IF(IDF(1)%DX.GT.0.0D0)THEN
CALL WDIALOGPUTDOUBLE(IDF_REAL5,IDF(1)%DX,'(G12.7)')
ELSE
CALL WDIALOGPUTDOUBLE(IDF_REAL5,25.0D0,'(G12.7)')
ENDIF
CALL IDFDEALLOCATE(IDF,SIZE(IDF)); DEALLOCATE(IDF)
!## set output precision
IF(PBMAN%IDOUBLE.EQ.0)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO18)
IF(PBMAN%IDOUBLE.EQ.1)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO19)
!## modflow2005 does not allow thickness of zero
CALL WDIALOGPUTDOUBLE(IDF_REAL6,PBMAN%MINTHICKNESS,'(F15.3)')
CALL WDIALOGPUTDOUBLE(IDF_REAL1,MPW%XMIN,'(F15.3)')
CALL WDIALOGPUTDOUBLE(IDF_REAL2,MPW%YMIN,'(F15.3)')
CALL WDIALOGPUTDOUBLE(IDF_REAL3,MPW%XMAX,'(F15.3)')
CALL WDIALOGPUTDOUBLE(IDF_REAL4,MPW%YMAX,'(F15.3)')
CALL PMANAGER_INITSIM_FIELDS()
CALL WDIALOGGETMENU(IDF_MENU4,I)
CALL PMANAGER_TIMESTEPS_GETISTEP(I,J,ISTEP)
CALL WDIALOGPUTINTEGER(IDF_INTEGER12,ISTEP)
CALL WDIALOGFIELDSTATE(IDF_INTEGER12,J)
!## blank out MF6 option ...
CALL WDIALOGFIELDSTATE(IDF_RADIO20,3)
!## start dialog
IF(IBATCH.EQ.0)THEN
CALL WDIALOGSHOW(-1,-1,0,3)
DO
CALL WMESSAGE(ITYPE,MESSAGE)
SELECT CASE (ITYPE)
CASE(FIELDCHANGED)
SELECT CASE (MESSAGE%VALUE2)
CASE (IDF_MENU4)
CALL WDIALOGGETMENU(IDF_MENU4,I)
CALL PMANAGER_TIMESTEPS_GETISTEP(I,J,ISTEP)
CALL WDIALOGPUTINTEGER(IDF_INTEGER12,ISTEP)
CALL WDIALOGFIELDSTATE(IDF_INTEGER12,J)
CASE (IDF_RADIO1,IDF_RADIO2,IDF_RADIO3,IDF_RADIO4,IDF_RADIO20,IDF_INTEGER1,IDF_RADIO15,IDF_RADIO16,IDF_RADIO17) !IDF_CHECK1
CALL PMANAGER_INITSIM_FIELDS()
CASE (IDF_INTEGER2,IDF_INTEGER3,IDF_MENU2)
CALL UTL_FILLDATES(IDF_INTEGER3,IDF_MENU2,IDF_INTEGER2)
CASE (IDF_INTEGER4,IDF_INTEGER5,IDF_MENU3)
CALL UTL_FILLDATES(IDF_INTEGER5,IDF_MENU3,IDF_INTEGER4)
END SELECT
SELECT CASE (MESSAGE%VALUE1)
END SELECT
CASE(PUSHBUTTON)
SELECT CASE (MESSAGE%VALUE1)
CASE (ID_OPEN)
FNAME=TRIM(PREFVAL(1))//'*.idf'
LEX=UTL_WSELECTFILE('Select (network) IDF File (*.idf)|*.idf|', &
LOADDIALOG+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,'Select (network) IDF File')
IF(LEX)CALL WDIALOGPUTSTRING(IDF_STRING2,FNAME)
CASE (ID_LAYERTYPES)
CALL PMANAGERLAYERTYPES()
CALL PMANAGER_INITSIM_FIELDS()
CASE (ID_SIMCUSTOMIZE)
CALL PMANAGER_TIMESTEPS()
CALL WDIALOGPUTOPTION(IDF_MENU4,10)
CASE (ID_PACKAGE)
CALL PMANAGER_INITSIM_PACKAGES()
CALL PMANAGER_INITSIM_FIELDS()
CASE (IDOK,IDSIMULATE1,IDSIMULATE2)
!## fill timesteps - if not yet done
LEX=.TRUE.; IF(.NOT.ASSOCIATED(SIM))LEX=PMANAGER_FILLTIMESTEPS()
IF(LEX)THEN
!## get file format
CALL WDIALOGGETRADIOBUTTON(IDF_RADIO3,PBMAN%IFORMAT)
CALL WDIALOGGETMENU(IDF_MENU5,I,MODELNAME)
I=INDEX(MODELNAME,'.',.TRUE.); IF(I.GT.0)MODELNAME=MODELNAME(:I-1)
IF(PBMAN%IFORMAT.EQ.1)THEN
FNAME=TRIM(PREFVAL(1))//'\RUNFILES\'//TRIM(MODELNAME)//'.RUN'
ELSEIF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.3)THEN
CALL UTL_CREATEDIR(TRIM(PREFVAL(1))//'\MODELS') !\'//TRIM(MODELNAME))
FNAME=TRIM(PREFVAL(1))//'\MODELS\'//TRIM(MODELNAME)//'\'//TRIM(MODELNAME)//'.NAM'
ENDIF
CALL WMESSAGEBOX(YESNO,COMMONNO,QUESTIONICON,'Are you sure to continue. iMOD will create:'//CHAR(13)// &
TRIM(FNAME),'Question')
IF(WINFODIALOG(4).EQ.1)EXIT
ENDIF
CASE (IDCANCEL)
EXIT
END SELECT
END SELECT
ENDDO
ELSE
!## take care of setting from imod-batch
IF(PBMAN%ISS.EQ.0)THEN
CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO1) !## steady-state
ELSE
CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO2) !## transient
IF(LEN_TRIM(PBMAN%TIMFNAME).EQ.0)THEN
!## start date
CALL ITIMETOGDATE(PBMAN%SDATE,IYR,IMH,IDY,IHR,IMT,ISC)
CALL WDIALOGPUTINTEGER(IDF_INTEGER2 ,IDY)
CALL WDIALOGPUTOPTION(IDF_MENU2 ,IMH)
CALL WDIALOGPUTINTEGER(IDF_INTEGER3 ,IYR)
CALL WDIALOGPUTINTEGER(IDF_INTEGER6 ,IHR)
CALL WDIALOGPUTINTEGER(IDF_INTEGER7 ,IMT)
CALL WDIALOGPUTINTEGER(IDF_INTEGER8 ,ISC)
!## end date
CALL ITIMETOGDATE(PBMAN%EDATE,IYR,IMH,IDY,IHR,IMT,ISC)
CALL WDIALOGPUTINTEGER(IDF_INTEGER4 ,IDY)
CALL WDIALOGPUTOPTION(IDF_MENU3 ,IMH)
CALL WDIALOGPUTINTEGER(IDF_INTEGER5 ,IYR)
CALL WDIALOGPUTINTEGER(IDF_INTEGER9 ,IHR)
CALL WDIALOGPUTINTEGER(IDF_INTEGER10,IMT)
CALL WDIALOGPUTINTEGER(IDF_INTEGER11,ISC)
CALL WDIALOGPUTINTEGER(IDF_INTEGER12,PBMAN%IDT)
CALL WDIALOGPUTOPTION(IDF_MENU4 ,PBMAN%ITT)
ENDIF
ENDIF
!## first idf
IF(PBMAN%IWINDOW.EQ.0)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO17)
!## window
IF(PBMAN%IWINDOW.EQ.1)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO15)
!## network idf
IF(PBMAN%IWINDOW.EQ.2)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO16)
CALL WDIALOGPUTDOUBLE(IDF_REAL1,PBMAN%XMIN) !## xmin
CALL WDIALOGPUTDOUBLE(IDF_REAL2,PBMAN%YMIN) !## ymin
CALL WDIALOGPUTDOUBLE(IDF_REAL3,PBMAN%XMAX) !## xmax
CALL WDIALOGPUTDOUBLE(IDF_REAL4,PBMAN%YMAX) !## ymax
CALL WDIALOGPUTDOUBLE(IDF_REAL5,PBMAN%CELLSIZE) !## cellsize
CALL WDIALOGPUTDOUBLE(IDF_REAL7,PBMAN%BUFFER) !## buffer
IF(PBMAN%BUFFER.LE.0.0D0)PBMAN%BUFFERCS=0.0D0
CALL WDIALOGPUTDOUBLE(IDF_REAL8,PBMAN%BUFFERCS) !## buffer-cellsize
IF(PBMAN%IFORMAT.EQ.1)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO3) !## runfile
IF(PBMAN%IFORMAT.EQ.2)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO4) !## modflow2005
IF(PBMAN%IFORMAT.EQ.3)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO20) !## modflow6
!## initial steady-state stress-period
CALL WDIALOGPUTCHECKBOX(IDF_CHECK2,PBMAN%ISTEADY)
IF(LEN_TRIM(PBMAN%TIMFNAME).NE.0)THEN
CALL PMANAGER_SAVETIMESTEPS(ID_OPEN,1,PBMAN%TIMFNAME)
ELSE
LEX=.TRUE.; IF(.NOT.ASSOCIATED(SIM))LEX=PMANAGER_FILLTIMESTEPS()
ENDIF
!## set modflow executable
PREFVAL(8)=PBMAN%MODFLOW
!## save only, or start model as well
MESSAGE%VALUE1=IDOK; IF(PBMAN%ISOLVE.EQ.1)MESSAGE%VALUE1=IDSIMULATE1
ENDIF
IF(ASSOCIATED(SIM))SIM%ISUM=PBMAN%SSYSTEM
!## get file format of export
CALL WDIALOGGETRADIOBUTTON(IDF_RADIO3,PBMAN%IFORMAT)
CALL WDIALOGGETRADIOBUTTON(IDF_RADIO17,I)
PBMAN%IWINDOW=0
IF(I.EQ.3)THEN
CALL WDIALOGGETSTRING(IDF_STRING2,PBMAN%BNDFILE)
ISUBMODEL=0; PBMAN%IWINDOW=2
ELSE
!## apply submodelling
IF(I.EQ.2)THEN; ISUBMODEL=1; PBMAN%IWINDOW=1; ENDIF
SUBMODEL=0.0D0; IF(ISUBMODEL.EQ.1)THEN
CALL WDIALOGGETDOUBLE(IDF_REAL1,SUBMODEL(1)) !## xmin
CALL WDIALOGGETDOUBLE(IDF_REAL2,SUBMODEL(2)) !## ymin
CALL WDIALOGGETDOUBLE(IDF_REAL3,SUBMODEL(3)) !## xmax
CALL WDIALOGGETDOUBLE(IDF_REAL4,SUBMODEL(4)) !## ymax
CALL WDIALOGGETDOUBLE(IDF_REAL5,SUBMODEL(5)) !## cellsize
CALL WDIALOGGETDOUBLE(IDF_REAL7,SUBMODEL(6)) !## buffer
CALL WDIALOGGETDOUBLE(IDF_REAL8,SUBMODEL(7)) !## buffercs
ENDIF
ENDIF
IF(IBATCH.EQ.0)THEN
PBMAN%ICONSISTENCY=1
IF(LLPF)PBMAN%ICONSISTENCY=2
ENDIF
CALL WDIALOGGETDOUBLE(IDF_REAL6,PBMAN%MINTHICKNESS)
IF(PBMAN%IFORMAT.EQ.3)THEN
LBCF=.FALSE.
LLPF=.FALSE.
LNPF=.TRUE.
!## check for top/bot consistencies only
PBMAN%ICONSISTENCY=1
ELSE
!## get subsoil format
CALL WDIALOGGETRADIOBUTTON(IDF_RADIO5,I)
LBCF=.FALSE.; IF(I.EQ.1)LBCF=.TRUE. !## bcf
LLPF=.FALSE.; IF(I.EQ.2)LLPF=.TRUE. !## lpf
ENDIF
!## output precision
CALL WDIALOGGETRADIOBUTTON(IDF_RADIO18,PBMAN%IDOUBLE)
PBMAN%IDOUBLE=PBMAN%IDOUBLE-1
!## output folder for a runfile
CALL WDIALOGGETMENU(IDF_MENU5,I,MODELNAME)
IF(MESSAGE%VALUE1.EQ.IDCANCEL)RETURN
!## start the model as well
IF(MESSAGE%VALUE1.EQ.IDSIMULATE1)IRUN=1
IF(MESSAGE%VALUE1.EQ.IDSIMULATE2)IRUN=-1
!## final check
IF((ITRANSIENT.EQ.1.AND.ISTEADY.EQ.0).AND.SIZE(SIM).EQ.1)THEN
IF(SIM(1)%DELT.EQ.0.0D0)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD cannot start this model as you have defined a timestep length'//CHAR(13)// &
'of zero (steady-state), and all your packages are assigned'//CHAR(13)//'to a transient period.','Warning')
RETURN
ENDIF
ENDIF
PMANAGER_INITSIM=.TRUE.
END FUNCTION PMANAGER_INITSIM
!###======================================================================
SUBROUTINE PMANAGER_GETNFILES(ITOPICS,MAXPRJNLAY)
!###======================================================================
IMPLICIT NONE
INTEGER,DIMENSION(:),INTENT(IN) :: ITOPICS
INTEGER,INTENT(OUT) :: MAXPRJNLAY
INTEGER :: II,I,J,IPER,ITOPIC,ILAY
INTEGER,POINTER,DIMENSION(:) :: ALAY
!## get maximal number of layers
MAXPRJNLAY=999; ALLOCATE(ALAY(MAXPRJNLAY)); ALAY=0
DO II=1,SIZE(ITOPICS)
ITOPIC=ITOPICS(II)
IF(.NOT.ASSOCIATED(TOPICS(ITOPIC)%STRESS))CYCLE
IF(.NOT.ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))CYCLE
DO IPER=1,SIZE(TOPICS(ITOPIC)%STRESS)
DO I=1,SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,1)
DO J=1,SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,2)
ILAY=TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,J)%ILAY
IF(ILAY.GT.0)ALAY(ILAY)=1
ENDDO
ENDDO
ENDDO
! SELECT CASE (ITOPIC)
! !## kvv or vcw
! CASE (9,10)
! PRJNLAY=PRJNLAY+1
! END SELECT
! PRJMXNLAY=MIN(PRJMXNLAY,PRJNLAY)
ENDDO
!## how many connected layers are defined
MAXPRJNLAY=0; DO ILAY=1,SIZE(ALAY); IF(ALAY(ILAY).EQ.0)EXIT; MAXPRJNLAY=MAXPRJNLAY+1; ENDDO
IF(ASSOCIATED(ALAY))DEALLOCATE(ALAY)
END SUBROUTINE PMANAGER_GETNFILES
!###======================================================================
SUBROUTINE PMANAGER_INITSIM_PACKAGES()
!###======================================================================
IMPLICIT NONE
INTEGER :: ITYPE
TYPE(WIN_MESSAGE) :: MESSAGE
INTEGER :: DID,I,N
CHARACTER(LEN=MAXLENPRJ),ALLOCATABLE,DIMENSION(:) :: PLIST
INTEGER,ALLOCATABLE,DIMENSION(:) :: IPLIST,JPLIST
DID=WINFODIALOG(CURRENTDIALOG)
CALL WDIALOGLOAD(ID_DPMANAGER_PACKAGES,ID_DPMANAGER_PACKAGES)
ALLOCATE(PLIST(SIZE(TOPICS)),IPLIST(SIZE(TOPICS)),JPLIST(SIZE(TOPICS)))
PLIST=''; IPLIST=0; JPLIST=0
N=0; DO I=1,SIZE(TOPICS)
IF(ASSOCIATED(TOPICS(I)%STRESS))THEN
N=N+1; PLIST(N)=TOPICS(I)%TNAME; IPLIST(N)=TOPICS(I)%IACT_MODEL; JPLIST(N)=I
ENDIF
ENDDO
CALL WDIALOGPUTMENU(IDF_MENU1,PLIST,N,IPLIST)
CALL WDIALOGSHOW(-1,-1,0,3)
DO
CALL WMESSAGE(ITYPE,MESSAGE)
SELECT CASE (ITYPE)
CASE(FIELDCHANGED)
!## previous field
SELECT CASE (MESSAGE%VALUE1)
CASE (IDF_MENU1)
END SELECT
!## next field
SELECT CASE (MESSAGE%VALUE2)
CASE (IDF_MENU1)
END SELECT
CASE(PUSHBUTTON)
SELECT CASE (MESSAGE%VALUE1)
CASE (IDOK)
CALL WDIALOGGETMENU(IDF_MENU1,IPLIST)
DO I=1,N; TOPICS(JPLIST(I))%IACT_MODEL=IPLIST(I); ENDDO
EXIT
CASE (IDHELP)
CASE (IDCANCEL)
EXIT
END SELECT
END SELECT
ENDDO
CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(DID)
DEALLOCATE(PLIST,IPLIST,JPLIST)
END SUBROUTINE PMANAGER_INITSIM_PACKAGES
!###======================================================================
SUBROUTINE PMANAGERLAYERTYPES()
!###======================================================================
IMPLICIT NONE
INTEGER :: ITYPE
TYPE(WIN_MESSAGE) :: MESSAGE
INTEGER,ALLOCATABLE,DIMENSION(:) :: BLAYCON
INTEGER :: BPRJNLAY
CALL WDIALOGSELECT(ID_DPMANAGERLAYERTYPES)
!## backup in case cancel is pressed
CALL WDIALOGPUTINTEGER(IDF_INTEGER1,PRJNLAY)
ALLOCATE(BLAYCON(PRJMXNLAY)); BLAYCON=LAYCON; BPRJNLAY=PRJNLAY
CALL PMANAGERLAYERTYPES_PRJNLAY()
CALL WDIALOGSHOW(-1,-1,0,3)
DO
CALL WMESSAGE(ITYPE,MESSAGE)
SELECT CASE (ITYPE)
CASE (FIELDCHANGED)
SELECT CASE (MESSAGE%VALUE1)
END SELECT
CASE (PUSHBUTTON)
SELECT CASE (MESSAGE%VALUE1)
CASE (ID_APPLY)
CALL PMANAGERLAYERTYPES_PRJNLAY()
CASE (IDOK)
CALL WGRIDGETMENU(IDF_GRID1,2,LAYCON,PRJNLAY)
EXIT
CASE (IDCANCEL)
PRJNLAY=BPRJNLAY; LAYCON=BLAYCON
EXIT
CASE (IDHELP)
! CALL UTL_GETHELP('3.3.6','VMO.iMODProjMan')
END SELECT
END SELECT
ENDDO
DEALLOCATE(BLAYCON)
CALL WDIALOGHIDE(); CALL WDIALOGSELECT(ID_DPMANAGER_SIM)
CALL WDIALOGPUTSTRING(ID_LAYERTYPES,'Define '//TRIM(ITOS(PRJNLAY))//' Layer Types ...')
END SUBROUTINE PMANAGERLAYERTYPES
!###======================================================================
SUBROUTINE PMANAGERLAYERTYPES_PRJNLAY()
!###======================================================================
IMPLICIT NONE
INTEGER :: I
CALL WDIALOGGETINTEGER(IDF_INTEGER1,PRJNLAY)
CALL WGRIDROWS(IDF_GRID1,PRJNLAY)
DO I=1,PRJNLAY; CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,I,'Layer '//TRIM(ITOS(I))); ENDDO
!## write boundary string lower layer
CALL WGRIDPUTOPTION(IDF_GRID1,2,LAYCON,PRJNLAY)
IF(PRJNLAY.LT.PRJMXNLAY)CALL WGRIDPUTCELLOPTION(IDF_GRID1,2,PRJNLAY,4)
END SUBROUTINE PMANAGERLAYERTYPES_PRJNLAY
!###======================================================================
SUBROUTINE PMANAGER_INITSIM_FIELDS()
!###======================================================================
IMPLICIT NONE
INTEGER :: I,J,K,N
!## window or bndfile
CALL WDIALOGGETRADIOBUTTON(IDF_RADIO17,K)
IF(K.EQ.1)THEN
I=0; J=0
ELSEIF(K.EQ.2)THEN
I=0; J=1
ELSEIF(K.EQ.3)THEN
I=1; J=0
ENDIF
CALL WDIALOGFIELDSTATE(IDF_STRING2,I)
CALL WDIALOGFIELDSTATE(ID_OPEN,I)
CALL WDIALOGFIELDSTATE(IDF_REAL1,J)
CALL WDIALOGFIELDSTATE(IDF_REAL2,J)
CALL WDIALOGFIELDSTATE(IDF_REAL3,J)
CALL WDIALOGFIELDSTATE(IDF_REAL4,J)
CALL WDIALOGFIELDSTATE(IDF_REAL5,J)
CALL WDIALOGFIELDSTATE(IDF_REAL7,J)
CALL WDIALOGFIELDSTATE(IDF_REAL8,J)
CALL WDIALOGFIELDSTATE(IDF_LABEL9,J)
CALL WDIALOGFIELDSTATE(IDF_LABEL10,J)
CALL WDIALOGFIELDSTATE(IDF_LABEL11,J)
CALL WDIALOGFIELDSTATE(IDF_LABEL12,J)
CALL WDIALOGFIELDSTATE(IDF_LABEL19,J)
CALL WDIALOGFIELDSTATE(ID_DRAW,J)
CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,I)
CALL WDIALOGFIELDSTATE(IDF_LABEL4,I-1)
CALL WDIALOGFIELDSTATE(IDF_LABEL6,I-1)
CALL WDIALOGFIELDSTATE(IDF_LABEL7,I-1)
CALL WDIALOGFIELDSTATE(IDF_INTEGER2,I-1)
CALL WDIALOGFIELDSTATE(IDF_INTEGER3,I-1)
CALL WDIALOGFIELDSTATE(IDF_INTEGER4,I-1)
CALL WDIALOGFIELDSTATE(IDF_INTEGER5,I-1)
CALL WDIALOGFIELDSTATE(IDF_INTEGER6 ,I-1)
CALL WDIALOGFIELDSTATE(IDF_INTEGER7 ,I-1)
CALL WDIALOGFIELDSTATE(IDF_INTEGER8 ,I-1)
CALL WDIALOGFIELDSTATE(IDF_INTEGER9 ,I-1)
CALL WDIALOGFIELDSTATE(IDF_INTEGER10,I-1)
CALL WDIALOGFIELDSTATE(IDF_INTEGER11,I-1)
CALL WDIALOGFIELDSTATE(IDF_MENU2,I-1)
CALL WDIALOGFIELDSTATE(IDF_MENU3,I-1)
CALL WDIALOGFIELDSTATE(IDF_MENU4,I-1)
CALL WDIALOGFIELDSTATE(IDF_CHECK2,I-1)
CALL WDIALOGFIELDSTATE(ID_SIMCUSTOMIZE,I-1)
CALL WDIALOGGETRADIOBUTTON(IDF_RADIO3,J)
!## fill in dropdown menu
IF(J.EQ.1)THEN
CALL UTL_IMODFILLMENU(IDF_MENU5,TRIM(PREFVAL(1))//'\RUNFILES','*.RUN','F',N,0,0)
CALL WDIALOGPUTSTRING(IDF_LABEL25,'Output Name:')
ELSE
CALL UTL_IMODFILLMENU(IDF_MENU5,TRIM(PREFVAL(1))//'\MODELS','*','D',N,0,0)
CALL WDIALOGPUTSTRING(IDF_LABEL25,'Output Folder:')
ENDIF
CALL WDIALOGFIELDSTATE(IDF_MENU5,1)
!## creating a runfile cannot start that one - will be start the modeltool instead
I=0; IF(J.NE.1)I=1
CALL WDIALOGFIELDSTATE(IDSIMULATE1,I)
CALL WDIALOGFIELDSTATE(IDSIMULATE2,I)
!## minimal thickness
I=0; IF(J.EQ.2)I=1
CALL WDIALOGFIELDSTATE(IDF_REAL6 ,I)
CALL WDIALOGFIELDSTATE(IDF_LABEL14,I)
!## initially always 3d
LQBD=.FALSE.
!## single layer model - usage of interbeds
IF(PRJNLAY.GT.1)THEN
!## if kvv specified use quasi-3d discretisation
IF(PRJNLAY.GT.1)THEN
IF(ASSOCIATED(TOPICS(9)%STRESS))THEN
IF(ASSOCIATED(TOPICS(9)%STRESS(1)%FILES))LQBD=.TRUE. !## vcw
ENDIF
IF(ASSOCIATED(TOPICS(10)%STRESS))THEN
IF(ASSOCIATED(TOPICS(10)%STRESS(1)%FILES))LQBD=.TRUE. !## kvv
ENDIF
ENDIF
ENDIF
!## subsoil package
IF(J.EQ.2)THEN
I=0; IF(LBCF)I=1; CALL WDIALOGFIELDSTATE(IDF_RADIO5,I)
I=0; IF(LLPF)I=1; CALL WDIALOGFIELDSTATE(IDF_RADIO6,I)
ELSE
CALL WDIALOGFIELDSTATE(IDF_RADIO5,0)
CALL WDIALOGFIELDSTATE(IDF_RADIO6,0)
ENDIF
END SUBROUTINE PMANAGER_INITSIM_FIELDS
!###======================================================================
INTEGER FUNCTION PMANAGER_GETCURRENTIPER(IPER,ITOPIC,ITIME,JTIME)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: IPER,ITOPIC
INTEGER(KIND=8),INTENT(OUT) :: ITIME,JTIME
INTEGER(KIND=8) :: KTIME
INTEGER :: KPER
PMANAGER_GETCURRENTIPER=0
KTIME=INT(0,8); JTIME=INT(0,8); ITIME=INT(0,8)
!## get appropriate stress-period to store in runfile
IF(SIM(IPER)%DELT.GT.0.0D0)THEN !## transient
!## previous timestep
IF(IPER.GT.1)THEN
IF(SIM(IPER-1)%DELT.GT.0.0D0)THEN
KTIME=SIM(IPER-1)%IYR*10000000000+SIM(IPER-1)%IMH*100000000+SIM(IPER-1)%IDY*1000000+ &
SIM(IPER-1)%IHR*10000 +SIM(IPER-1)%IMT*100 +SIM(IPER-1)%ISC
ENDIF
ENDIF
!## current timestep
ITIME=SIM(IPER )%IYR*10000000000+SIM(IPER )%IMH*100000000+SIM(IPER )%IDY*1000000+ &
SIM(IPER )%IHR*10000 +SIM(IPER )%IMT*100 +SIM(IPER )%ISC
!## next timestep
JTIME=SIM(IPER+1)%IYR*10000000000+SIM(IPER+1)%IMH*100000000+SIM(IPER+1)%IDY*1000000+ &
SIM(IPER+1)%IHR*10000 +SIM(IPER+1)%IMT*100 +SIM(IPER+1)%ISC
ENDIF
KPER=PMANAGER_GETIPER(IPER,KTIME,ITIME,JTIME,TOPICS(ITOPIC)%STRESS)
PMANAGER_GETCURRENTIPER=KPER
END FUNCTION PMANAGER_GETCURRENTIPER
!###======================================================================
INTEGER FUNCTION PMANAGER_GETIPER(IPER,PTIME,STIME,ETIME,STRESS)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: IPER
INTEGER(KIND=8),INTENT(IN) :: STIME,ETIME,PTIME
TYPE(STRESSOBJ),INTENT(IN),DIMENSION(:) :: STRESS
INTEGER :: I,J,ID,IYR
INTEGER(KIND=8) :: PCKTIME,MD
!## initially nothing found
PMANAGER_GETIPER=0
!## look for steady-state
IF(STIME.EQ.INT(0,8))THEN
DO I=1,SIZE(STRESS)
IF(TRIM(UTL_CAP(STRESS(I)%CDATE,'U')).EQ.'STEADY-STATE')THEN
PMANAGER_GETIPER=I; RETURN
ENDIF
ENDDO
ID=0 !## nothing found
!## transient
ELSE
!## get time-interval window
!## look for nearest package to current timestep
MD=10D14; ID=0
DO I=1,SIZE(STRESS)
!## skip steady-state
IF(TRIM(UTL_CAP(STRESS(I)%CDATE,'U')).EQ.'STEADY-STATE')CYCLE
!## check whether a period is available
DO J=1,NPERIOD
IF(TRIM(UTL_CAP(STRESS(I)%CDATE,'U')).EQ.TRIM(UTL_CAP(PERIOD(J)%NAME,'U')))EXIT
ENDDO
!## see whether the current stress is within mentioned period
IF(J.LE.NPERIOD)THEN
!## check each subsequent period for years to be closed to current time step
IYR=PERIOD(J)%IYR
DO
!## package time
PCKTIME=IYR*10000000000+ PERIOD(J)%IMH*100000000+PERIOD(J)%IDY*1000000+ &
PERIOD(J)%IHR*10000+PERIOD(J)%IMT*100+ PERIOD(J)%ISC
!## outside (appears to be later) current time-window
IF(PCKTIME.GE.ETIME)EXIT
!## defined at the same period as the current timestep - better than this it will not become, stop search
IF(STIME.EQ.PCKTIME)THEN; ID=I; EXIT; ENDIF
!## get closest defined before current timestep
IF(STIME.GT.PCKTIME)THEN
!## closer than what we had already
IF(STIME-PCKTIME.LE.MD)THEN; MD=STIME-PCKTIME; ID=-I; ENDIF
ENDIF
!## insert period next year
IYR=IYR+1
ENDDO
!## defined at the same period as the current timestep - better than this it will not become, stop search
IF(STIME.EQ.PCKTIME)EXIT
ELSE
!## package time
PCKTIME=STRESS(I)%IYR*10000000000+STRESS(I)%IMH*100000000+STRESS(I)%IDY*1000000+ &
STRESS(I)%IHR*10000 +STRESS(I)%IMT*100 +STRESS(I)%ISC
!## outside (appears to be later) current time-window - try next
IF(PCKTIME.GE.ETIME)CYCLE
!## defined at the same period as the current timestep - better than this it will not become, stop search
IF(STIME.EQ.PCKTIME)THEN; ID=I; EXIT; ENDIF
!## get closest defined before current timestep
IF(STIME.GT.PCKTIME)THEN
!## closer than what we had already
IF(STIME-PCKTIME.LE.MD)THEN; MD=STIME-PCKTIME; ID=-I; ENDIF
ENDIF
ENDIF
ENDDO
ENDIF
!## nothing found
IF(ID.EQ.0)THEN
!## check steady-state period
DO I=1,SIZE(STRESS)
!## skip steady-state
IF(TRIM(UTL_CAP(STRESS(I)%CDATE,'U')).EQ.'STEADY-STATE')ID=I
ENDDO
!## apply minus 1
IF(IPER.GT.1)ID=-1*ID
PMANAGER_GETIPER=ID !0
!## use previous input
ELSEIF(ID.LT.0)THEN
!## no matter what; cannot use -1 for first timestep
IF(IPER.EQ.1)THEN
PMANAGER_GETIPER=ABS(ID)
ELSE
!## no matter what; cannot use -1 for first timestep after steady-state
IF(SIM(IPER-1)%DELT.EQ.0.0D0)THEN
PMANAGER_GETIPER=ABS(ID)
ELSE
!## check whether date is after last time-step (ktime)
IF(STIME-MD.GT.PTIME)THEN
PMANAGER_GETIPER=ABS(ID)
ELSE
PMANAGER_GETIPER=ID
ENDIF
ENDIF
ENDIF
!## number of systems for current stress period
ELSE
PMANAGER_GETIPER=ID
ENDIF
END FUNCTION PMANAGER_GETIPER
!#####=================================================================
INTEGER FUNCTION PMANAGER_FIND_KEYWORD(KEYLINE)
!#####=================================================================
IMPLICIT NONE
CHARACTER(LEN=*),INTENT(IN) :: KEYLINE
INTEGER :: I,J
CHARACTER(LEN=3) :: CKEY
PMANAGER_FIND_KEYWORD=0
I=INDEX(KEYLINE,'('); J=INDEX(KEYLINE,')')
IF(I.EQ.0.OR.J.EQ.0)RETURN; IF(J-I.NE.4)RETURN
CKEY=KEYLINE(I+1:J-1); CKEY=UTL_CAP(CKEY,'U')
DO I=1,SIZE(CMOD)
IF(CKEY.EQ.CMOD(I))THEN; PMANAGER_FIND_KEYWORD=I; RETURN; ENDIF
END DO
END FUNCTION PMANAGER_FIND_KEYWORD
!###======================================================================
LOGICAL FUNCTION PMANAGER_GETKEYS(IU)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: IU
INTEGER :: I,J,IOS
PMANAGER_GETKEYS=.FALSE.
DO I=1,SIZE(TOPICS); CALL PMANAGER_DEALLOCATE(I); ENDDO; CALL PMANAGER_DEALLOCATE_PEST()
READ(IU,*,IOSTAT=IOS); IF(IOS.NE.0)RETURN
READ(IU,*,IOSTAT=IOS) PRJNLAY,PRJNLAY,PRJNPER,I,I,I,I,PEST%IIPF; IF(IOS.NE.0)RETURN
IF(PEST%IIPF.NE.0)THEN
ALLOCATE(PEST%MEASURES(ABS(PEST%IIPF)))
PEST%IIPF=MIN(PEST%IIPF,0); IF(PEST%IIPF.LT.0)PEST%IIPF=1
DO I=1,SIZE(PEST%MEASURES)
READ(IU,'(A256)') LINE
READ(LINE,*) PEST%MEASURES(I)%IPFNAME,PEST%MEASURES(I)%IPFTYPE,PEST%MEASURES(I)%IXCOL, &
PEST%MEASURES(I)%IYCOL ,PEST%MEASURES(I)%ILCOL ,PEST%MEASURES(I)%IMCOL,PEST%MEASURES(I)%IVCOL
ENDDO
ENDIF
!## skip common settings
READ(IU,*)
!## read pcg solvers settings
READ(IU,*) PCG%NOUTER,PCG%NINNER,PCG%HCLOSE,PCG%RCLOSE,PCG%RELAX
ALLOCATE(TOPICS(33)%STRESS(1)); ALLOCATE(TOPICS(33)%STRESS(1)%FILES(1,1))
TOPICS(33)%IACT=1; TOPICS(33)%IACT_MODEL=1
PCG%NPCOND=1
PCG%IPRPCG=1
PCG%MUTPCG=0
PCG%DAMPPCG=1.0D0
PCG%DAMPPCGT=1.0D0
!PCG%IMERGE=0
!PCG%PARTOPT=0
!PCG%NCORES=1
!## find available keys
J=0; DO
READ(IU,'(A256)') LINE; LINE=UTL_CAP(LINE,'U')
I=PMANAGER_FIND_KEYWORD(LINE)
IF(I.GT.0)THEN
TOPICS(I)%IACT=1; TOPICS(I)%IACT_MODEL=1; J=J+1
ELSE
IF(UTL_CAP(LINE,'U').EQ.'MODULES FOR EACH LAYER')EXIT
! IF(J.GT.0)EXIT
ENDIF
ENDDO
PMANAGER_GETKEYS=.TRUE.
END FUNCTION PMANAGER_GETKEYS
!###======================================================================
LOGICAL FUNCTION PMANAGER_GETFILES(IU,ITOPIC)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: IU
INTEGER,INTENT(OUT) :: ITOPIC
INTEGER :: I,II,IOS,IPER,KPER,NSYS,ISYS,MSYS
CHARACTER(LEN=52) :: CDATE,C
REAL(KIND=DP_KIND) :: DELT,CNST
PMANAGER_GETFILES=.FALSE.
!## find available files for different keys
CDATE=''; IARMWP=0
DO
READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT; LINE=UTL_CAP(LINE,'U')
!## try to read timestamp
READ(LINE,*,IOSTAT=IOS) KPER,DELT,C,I; IF(IOS.EQ.0)CDATE=C
ITOPIC=PMANAGER_FIND_KEYWORD(LINE)
IF(ITOPIC.GT.0)THEN
IF(TOPICS(ITOPIC)%IACT.EQ.1)THEN
READ(LINE,*,IOSTAT=IOS) NSYS; IF(IOS.NE.0)RETURN; IF(NSYS.LE.0)CYCLE
!## reduce number of system to 1 for metaswap
IF(ITOPIC.EQ.1)THEN
MSYS=NSYS; NSYS=1
ENDIF
!## pst module
IF(ITOPIC.EQ.20)THEN
!## create new system
IPER=0; CALL PMANAGER_STRESSES(ITOPIC,IPER)
ISYS=0; CALL PMANAGER_SYSTEMS(ITOPIC,IPER,ISYS)
CALL PMANAGER_LOADPST(IU,NSYS,1); TOPICS(ITOPIC)%IACT_MODEL=1; CYCLE
ENDIF
!## create stress-period
IPER=0; CALL PMANAGER_STRESSES(ITOPIC,IPER)
!## create systems
ALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%FILES(TOPICS(ITOPIC)%NSUBTOPICS,NSYS))
TOPICS(ITOPIC)%STRESS(IPER)%IYR=0; TOPICS(ITOPIC)%STRESS(IPER)%IMH=0; TOPICS(ITOPIC)%STRESS(IPER)%IDY=0
TOPICS(ITOPIC)%STRESS(IPER)%IHR=0; TOPICS(ITOPIC)%STRESS(IPER)%IMT=0; TOPICS(ITOPIC)%STRESS(IPER)%ISC=0
IF(TOPICS(ITOPIC)%TIMDEP)THEN
TOPICS(ITOPIC)%STRESS(IPER)%CDATE=CDATE
READ(CDATE,'(I4,5I2)',IOSTAT=IOS) TOPICS(ITOPIC)%STRESS(IPER)%IYR,TOPICS(ITOPIC)%STRESS(IPER)%IMH,TOPICS(ITOPIC)%STRESS(IPER)%IDY, &
TOPICS(ITOPIC)%STRESS(IPER)%IHR,TOPICS(ITOPIC)%STRESS(IPER)%IMT,TOPICS(ITOPIC)%STRESS(IPER)%ISC
ENDIF
I=0; DO II=1,TOPICS(ITOPIC)%NSUBTOPICS
I=I+1
!## stop reading
IF(I.NE.II.AND.II.EQ.TOPICS(ITOPIC)%NSUBTOPICS)EXIT
DO ISYS=1,NSYS
SELECT CASE (ITOPIC)
CASE (1,13) !## msp,pwt
READ(IU,*,IOSTAT=IOS) TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FCT, &
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%IMP, &
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FNAME
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%ILAY=1
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%IACT=1
READ(TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FNAME,*,IOSTAT=IOS) CNST
IF(IOS.EQ.0)THEN
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%ICNST=1
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%CNST =CNST
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FNAME=''
ELSE
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%ICNST=2
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%CNST =-999.99
ENDIF
!## found ipf for artificial recharge
IF(ITOPIC.EQ.1.AND.I.EQ.8.AND.TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%ICNST.EQ.2)THEN
IF(INDEX(UTL_CAP(TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FNAME,'U'),'.IPF').GT.0)THEN
TOPICS(1)%SNAME(7) ='Recharge-ID (IDF)'
TOPICS(1)%SNAME(8) ='Extraction (IPF)'
TOPICS(1)%SNAME(9) =''
I=I+1; IARMWP=1
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FNAME=''
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FCT=1.0D0
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%IMP=0.0D0
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%ICNST=1
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%CNST=-999.99
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%ILAY=1
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%IACT=1
ELSE
TOPICS(1)%SNAME(7) ='Artificial discharge (IDF)'
TOPICS(1)%SNAME(8) ='Artificial layer (IDF)'
TOPICS(1)%SNAME(9) ='Artificial location (IDF)'
ENDIF
ENDIF
CASE (29) !## isg
READ(IU,*,IOSTAT=IOS) TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%ILAY, &
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FCT, &
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%IMP, &
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FNAME
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%ICNST=2
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%CNST =-999.99
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%IACT =1
CASE DEFAULT
READ(IU,*,IOSTAT=IOS) TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%ILAY, &
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FCT, &
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%IMP, &
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FNAME
IF(IOS.NE.0)RETURN
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%IACT=1
READ(TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FNAME,*,IOSTAT=IOS) CNST
IF(IOS.EQ.0)THEN
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%ICNST=1
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%CNST =CNST
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FNAME=''
ELSE
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%ICNST=2
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%CNST =-999.99
ENDIF
END SELECT
IF(TRIM(PREFVAL(5)).NE.'')THEN
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FNAME=UTL_SUBST(TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FNAME,TRIM(REPLACESTRING),PREFVAL(5))
ENDIF
TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%ALIAS= &
UTL_CAP(TRIM(TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FNAME(INDEX(TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,ISYS)%FNAME,'\',.TRUE.)+1:)),'L')
ENDDO
ENDDO
!## read in the inp files
IF(ITOPIC.EQ.1)THEN
MSYS=MSYS-TOPICS(ITOPIC)%NSUBTOPICS+IARMWP
ALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%INPFILES(MSYS))
DO ISYS=1,MSYS
READ(IU,'(A)',IOSTAT=IOS) TOPICS(ITOPIC)%STRESS(IPER)%INPFILES(ISYS)
TOPICS(ITOPIC)%STRESS(IPER)%INPFILES(ISYS)=ADJUSTL(TOPICS(ITOPIC)%STRESS(IPER)%INPFILES(ISYS))
ENDDO
ENDIF
ENDIF
ENDIF
ENDDO
PMANAGER_GETFILES=.TRUE.
END FUNCTION PMANAGER_GETFILES
!###======================================================================
SUBROUTINE PMANAGER_LOADPST(IU,NPARAM,IOPTION)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: IU,NPARAM,IOPTION
INTEGER :: I,J,IOS,N,M
IF(IOPTION.EQ.0)THEN
READ(IU,*) PEST%IIPF
IF(PEST%IIPF.NE.0)THEN
ALLOCATE(PEST%MEASURES(ABS(PEST%IIPF)))
PEST%IIPF=MIN(PEST%IIPF,0); IF(PEST%IIPF.LT.0)PEST%IIPF=1
DO I=1,SIZE(PEST%MEASURES)
READ(IU,'(A256)') LINE
READ(LINE,*) PEST%MEASURES(I)%IPFNAME,PEST%MEASURES(I)%IPFTYPE,PEST%MEASURES(I)%IXCOL, &
PEST%MEASURES(I)%IYCOL ,PEST%MEASURES(I)%ILCOL ,PEST%MEASURES(I)%IMCOL,PEST%MEASURES(I)%IVCOL
ENDDO
ENDIF
ENDIF
READ(IU,'(A256)') LINE
READ(LINE,*,IOSTAT=IOS) PEST%PE_MXITER,PEST%PE_STOP,PEST%PE_SENS,N,M,PEST%PE_TARGET(1),PEST%PE_TARGET(2),PEST%PE_SCALING, &
PEST%PE_PADJ,PEST%PE_DRES,PEST%PE_KTYPE,PEST%PE_KRANGE,PEST%PE_REGULARISATION,PEST%PE_REGFACTOR
IF(IOS.NE.0)THEN
!## apply default kriging range
PEST%PE_REGULARISATION=0; PEST%PE_REGFACTOR=0.0D0
READ(LINE,*,IOSTAT=IOS) PEST%PE_MXITER,PEST%PE_STOP,PEST%PE_SENS,N,M,PEST%PE_TARGET(1),PEST%PE_TARGET(2),PEST%PE_SCALING, &
PEST%PE_PADJ,PEST%PE_DRES,PEST%PE_KTYPE,PEST%PE_KRANGE
IF(IOS.NE.0)THEN
PEST%PE_KTYPE=1; PEST%PE_KRANGE=10000.0D0
READ(LINE,*,IOSTAT=IOS) PEST%PE_MXITER,PEST%PE_STOP,PEST%PE_SENS,N,M,PEST%PE_TARGET(1),PEST%PE_TARGET(2),PEST%PE_SCALING, &
PEST%PE_PADJ,PEST%PE_DRES
IF(IOS.NE.0)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error reading runfile in the PST section with the parameter definitions.','Error')
RETURN
ENDIF
ENDIF
ENDIF
IF(PEST%PE_KTYPE.LE.0)THEN
READ(IU,'(A)') PEST%PPBNDIDF
ENDIF
PEST%PE_SCALING=PEST%PE_SCALING+1
!## periods defined
IF(N.GT.0)THEN
ALLOCATE(PEST%S_PERIOD(N),PEST%E_PERIOD(N))
PEST%S_PERIOD='0'; PEST%E_PERIOD='0'
DO I=1,SIZE(PEST%S_PERIOD)
READ(IU,'(A256)') LINE
READ(LINE,*) PEST%S_PERIOD(I),PEST%E_PERIOD(I)
ENDDO
ENDIF
!## batchfiles defined
IF(M.GT.0)THEN
ALLOCATE(PEST%B_FRACTION(M),PEST%B_BATCHFILE(M),PEST%B_OUTFILE(M))
PEST%B_FRACTION=1.0D0; PEST%B_BATCHFILE=''; PEST%B_OUTFILE=''
DO I=1,SIZE(PEST%B_FRACTION)
READ(IU,'(A256)') LINE
READ(LINE,*,IOSTAT=IOS) PEST%B_FRACTION(I),PEST%B_BATCHFILE(I),PEST%B_OUTFILE(I)
ENDDO
ENDIF
IF(NPARAM.GT.0)THEN
ALLOCATE(PEST%PARAM(NPARAM))
DO I=1,SIZE(PEST%PARAM)
READ(IU,'(A256)') LINE
READ(LINE,*,IOSTAT=IOS) PEST%PARAM(I)%PACT,PEST%PARAM(I)%PPARAM,PEST%PARAM(I)%PILS,PEST%PARAM(I)%PIZONE,PEST%PARAM(I)%PINI,PEST%PARAM(I)%PDELTA, &
PEST%PARAM(I)%PMIN,PEST%PARAM(I)%PMAX,PEST%PARAM(I)%PINCREASE,PEST%PARAM(I)%PIGROUP,PEST%PARAM(I)%PLOG,PEST%PARAM(I)%ACRONYM,PEST%PARAM(I)%PPRIOR
IF(IOS.NE.0)THEN
PEST%PARAM(I)%PPRIOR=PEST%PARAM(I)%PINI
READ(LINE,*,IOSTAT=IOS) PEST%PARAM(I)%PACT,PEST%PARAM(I)%PPARAM,PEST%PARAM(I)%PILS,PEST%PARAM(I)%PIZONE,PEST%PARAM(I)%PINI,PEST%PARAM(I)%PDELTA, &
PEST%PARAM(I)%PMIN,PEST%PARAM(I)%PMAX,PEST%PARAM(I)%PINCREASE,PEST%PARAM(I)%PIGROUP,PEST%PARAM(I)%PLOG,PEST%PARAM(I)%ACRONYM
IF(IOS.NE.0)THEN
PEST%PARAM(I)%ACRONYM=''
READ(LINE,*,IOSTAT=IOS) PEST%PARAM(I)%PACT,PEST%PARAM(I)%PPARAM,PEST%PARAM(I)%PILS,PEST%PARAM(I)%PIZONE,PEST%PARAM(I)%PINI,PEST%PARAM(I)%PDELTA, &
PEST%PARAM(I)%PMIN,PEST%PARAM(I)%PMAX,PEST%PARAM(I)%PINCREASE,PEST%PARAM(I)%PIGROUP,PEST%PARAM(I)%PLOG
PEST%PARAM(I)%PPARAM=UTL_CAP(PEST%PARAM(I)%PPARAM,'U')
IF(IOS.NE.0)THEN
SELECT CASE (PEST%PARAM(I)%PPARAM)
!## recharge/anisotropy/stages angle non log transformed
CASE ('RE','AH','RL','RB','IL','IB','DL')
PEST%PARAM(I)%PLOG=0
CASE DEFAULT
PEST%PARAM(I)%PLOG=1
END SELECT
READ(LINE,*,IOSTAT=IOS) PEST%PARAM(I)%PACT,PEST%PARAM(I)%PPARAM,PEST%PARAM(I)%PILS,PEST%PARAM(I)%PIZONE,PEST%PARAM(I)%PINI,PEST%PARAM(I)%PDELTA, &
PEST%PARAM(I)%PMIN,PEST%PARAM(I)%PMAX,PEST%PARAM(I)%PINCREASE,PEST%PARAM(I)%PIGROUP
IF(IOS.NE.0)THEN
PEST%PARAM(I)%PIGROUP=I
READ(LINE,*,IOSTAT=IOS) PEST%PARAM(I)%PACT,PEST%PARAM(I)%PPARAM,PEST%PARAM(I)%PILS,PEST%PARAM(I)%PIZONE,PEST%PARAM(I)%PINI,PEST%PARAM(I)%PDELTA, &
PEST%PARAM(I)%PMIN,PEST%PARAM(I)%PMAX,PEST%PARAM(I)%PINCREASE
IF(IOS.NE.0)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error reading runfile in the PST section with the parameter definitions.','Error')
RETURN
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
!## fill in iparam
DO J=1,SIZE(PARAM); IF(PEST%PARAM(I)%PPARAM.EQ.PARAM(J))EXIT; ENDDO
PEST%PARAM(I)%IPARAM=J
ENDDO
ENDIF
READ(IU,*) I
IF(I.GT.0)THEN
ALLOCATE(PEST%IDFFILES(I))
DO I=1,SIZE(PEST%IDFFILES)
READ(IU,'(A256)') LINE
READ(LINE,*) PEST%IDFFILES(I)
ENDDO
ENDIF
END SUBROUTINE PMANAGER_LOADPST
!###======================================================================
SUBROUTINE PMANAGER_STRESSES(ITOPIC,IPER)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: ITOPIC
INTEGER,INTENT(INOUT) :: IPER
INTEGER :: N,I,J,K
IF(IPER.GT.0)RETURN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN
!## only increase for timedependent information
IF(TOPICS(ITOPIC)%TIMDEP)THEN
!## make copy of current memory
N=SIZE(TOPICS(ITOPIC)%STRESS)
NULLIFY(TOPICS(ITOPIC)%STRESS_TMP)
ALLOCATE(TOPICS(ITOPIC)%STRESS_TMP(N+1))
DO I=1,N
J=SIZE(TOPICS(ITOPIC)%STRESS(I)%FILES,1)
K=SIZE(TOPICS(ITOPIC)%STRESS(I)%FILES,2)
NULLIFY(TOPICS(ITOPIC)%STRESS_TMP(I)%FILES)
NULLIFY(TOPICS(ITOPIC)%STRESS_TMP(I)%INPFILES)
ALLOCATE(TOPICS(ITOPIC)%STRESS_TMP(I)%FILES(J,K))
TOPICS(ITOPIC)%STRESS_TMP(I)%FILES=TOPICS(ITOPIC)%STRESS(I)%FILES
TOPICS(ITOPIC)%STRESS_TMP(I)%CDATE=TOPICS(ITOPIC)%STRESS(I)%CDATE
TOPICS(ITOPIC)%STRESS_TMP(I)%IYR=TOPICS(ITOPIC)%STRESS(I)%IYR
TOPICS(ITOPIC)%STRESS_TMP(I)%IMH=TOPICS(ITOPIC)%STRESS(I)%IMH
TOPICS(ITOPIC)%STRESS_TMP(I)%IDY=TOPICS(ITOPIC)%STRESS(I)%IDY
TOPICS(ITOPIC)%STRESS_TMP(I)%IHR=TOPICS(ITOPIC)%STRESS(I)%IHR
TOPICS(ITOPIC)%STRESS_TMP(I)%IMT=TOPICS(ITOPIC)%STRESS(I)%IMT
TOPICS(ITOPIC)%STRESS_TMP(I)%ISC=TOPICS(ITOPIC)%STRESS(I)%ISC
DEALLOCATE(TOPICS(ITOPIC)%STRESS(I)%FILES)
ENDDO
TOPICS(ITOPIC)%STRESS=>TOPICS(ITOPIC)%STRESS_TMP
IPER=N+1
ELSE
IPER=1
ENDIF
ELSE
ALLOCATE(TOPICS(ITOPIC)%STRESS(1))
NULLIFY(TOPICS(ITOPIC)%STRESS(1)%FILES)
TOPICS(ITOPIC)%IACT =1
TOPICS(ITOPIC)%IACT_MODEL=1
IPER=1
ENDIF
END SUBROUTINE PMANAGER_STRESSES
!###======================================================================
SUBROUTINE PMANAGER_SYSTEMS(ITOPIC,IPER,ISYS)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: ITOPIC,IPER
INTEGER,INTENT(INOUT) :: ISYS
INTEGER :: N,M
!## create new system
IF(ISYS.GT.0)RETURN
IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(IPER)%FILES))THEN
!## make copy of current memory
M=SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,1)
N=SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,2)
NULLIFY(TOPICS(ITOPIC)%STRESS(IPER)%FILES_TMP)
ALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%FILES_TMP(M,N+1))
TOPICS(ITOPIC)%STRESS(IPER)%FILES_TMP(1:M,1:N)=TOPICS(ITOPIC)%STRESS(IPER)%FILES(1:M,1:N)
DEALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%FILES)
TOPICS(ITOPIC)%STRESS(IPER)%FILES=>TOPICS(ITOPIC)%STRESS(IPER)%FILES_TMP
ISYS=N+1
ELSE
N=TOPICS(ITOPIC)%NSUBTOPICS
ALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%FILES(N,1))
ISYS=1
ENDIF
END SUBROUTINE PMANAGER_SYSTEMS
!###======================================================================
SUBROUTINE PMANAGERSTART(RUNFNAME,IRUNMODE,IBATCH,NICORES,ILOGFILE)
!###======================================================================
IMPLICIT NONE
CHARACTER(LEN=*),INTENT(IN) :: RUNFNAME
INTEGER,INTENT(IN) :: IRUNMODE,IBATCH,NICORES,ILOGFILE
CHARACTER(LEN=256) :: DIR,DIRNAME
CHARACTER(LEN=52) :: MNAME
INTEGER :: IU,IOS,I,N1,N2,IFLAGS,IEXCOD,IERROR,IMODE
LOGICAL :: LEX
IMODE=0
IF(LEN_TRIM(PREFVAL(8)).GT.0)THEN
INQUIRE(FILE=PREFVAL(8),EXIST=LEX)
ELSE
LEX=.FALSE.
ENDIF
IF(.NOT.LEX)THEN
IF(IBATCH.EQ.0)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMODFLOW cannot be started, iMOD cannot find the executable:'//CHAR(13)// &
'['//TRIM(PREFVAL(8))//']','Error')
ELSE
WRITE(*,'(A)') 'iMODFLOW cannot be started, iMOD cannot find the exectuable given'
WRITE(*,'(A)') '['//TRIM(PREFVAL(8))//']'
ENDIF
RETURN
ENDIF
IMODE=0
!## runfile or namfile
IF(INDEX(UTL_CAP(RUNFNAME,'U'),'.NAM',.TRUE.).GT.0)THEN
IMODE=1
ELSEIF(INDEX(UTL_CAP(RUNFNAME,'U'),'.RUN',.TRUE.).GT.0)THEN
IMODE=2
ELSE
IF(IBATCH.EQ.0)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMODFLOW cannot be started with given file:'//CHAR(13)// &
TRIM(RUNFNAME),'Error')
ELSE
WRITE(*,'(A)') 'iMODFLOW cannot be started with given file: '//TRIM(RUNFNAME)
ENDIF
RETURN
ENDIF
!## simulation directory
DIR=RUNFNAME(:INDEX(RUNFNAME,'\',.TRUE.)-1)
CALL UTL_CREATEDIR(DIR)
!## modelname
MNAME=RUNFNAME(INDEX(RUNFNAME,'\',.TRUE.)+1:INDEX(RUNFNAME,'.',.TRUE.)-1)
!## create component file(s)
IF(LMSP)THEN
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
!## simulate batch-file
IU=UTL_GETUNIT()
IF(PBMAN%IPESTP.EQ.0)THEN
CALL OSD_OPEN(IU,FILE=TRIM(DIR)//'\COMPONENTS.INP',STATUS='REPLACE',ACTION='WRITE,DENYREAD',IOSTAT=IOS)
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(DIR)//'\COMPONENTS_P#'//TRIM(ITOS(I))//'.INP',STATUS='REPLACE',ACTION='WRITE,DENYREAD',IOSTAT=IOS)
ELSE
CALL OSD_OPEN(IU,FILE=TRIM(DIR)//'\COMPONENTS_L#'//TRIM(ITOS(ABS(I)))//'.INP',STATUS='REPLACE',ACTION='WRITE,DENYREAD',IOSTAT=IOS)
ENDIF
ENDIF
IF(IOS.NE.0)THEN
IF(IBATCH.EQ.0)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMODFLOW is already running, you cannot start '//CHAR(13)// &
'new run while previous run is still running'//CHAR(13)//'or'//CHAR(13)//'Run-script cannot be created'//CHAR(13)// &
TRIM(DIR)//'\COMPONENTS.INP','Error')
ELSE
WRITE(*,'(A)') 'iMODFLOW is already running, you cannot start new run while previous run is still running'// &
'or Run-script cannot be created '//TRIM(DIR)//'\COMPONENTS.INP'
ENDIF
RETURN
ENDIF
IF(PBMAN%IPESTP.EQ.0)THEN
WRITE(IU,'(A)') 'MODFLOW -wd \MODELINPUT -namfile '//TRIM(DIR)//'\'//TRIM(MNAME)//'.NAM -DXC .\MODELINPUT\'//TRIM(MNAME)//'.DXC'
ELSE
IF(I.GT.0)THEN
IF(PEST%PARAM(I)%PACT.EQ.0.OR.PEST%PARAM(I)%PIGROUP.LT.0)CYCLE
WRITE(IU,'(A)') 'MODFLOW -wd \MODELINPUT -namfile '//TRIM(DIR)//'\'//TRIM(MNAME)//'_P#'//TRIM(ITOS(I))//'.NAM -DXC .\MODELINPUT\'//TRIM(MNAME)//'.DXC'
ELSE
WRITE(IU,'(A)') 'MODFLOW -wd \MODELINPUT -namfile '//TRIM(DIR)//'\'//TRIM(MNAME)//'_L#'//TRIM(ITOS(ABS(I)))//'.NAM -DXC .\MODELINPUT\'//TRIM(MNAME)//'.DXC'
ENDIF
ENDIF
WRITE(IU,'(A)') 'METASWAP -wd \MSWAPINPUT'
CLOSE(IU)
ENDDO
ENDIF
!## remove previous version of imodflow
I=INDEXNOCASE(PREFVAL(8),'\',.TRUE.)+1
INQUIRE(FILE=TRIM(DIR)//'\'//TRIM(PREFVAL(8)(I:)),EXIST=LEX)
IF(LEX)CALL IOSDELETEFILE(TRIM(DIR)//'\'//TRIM(PREFVAL(8)(I:)))
!## copy imodflow executable
CALL IOSCOPYFILE(TRIM(PREFVAL(8)),TRIM(DIR)//'\'//TRIM(PREFVAL(8)(I:)))
INQUIRE(FILE=TRIM(EXEPATH)//'\'//TRIM(LICFILE),EXIST=LEX)
IF(.NOT.LEX)THEN
IERROR=0; CALL IMOD_AGREEMENT(IERROR)
IF(IERROR.NE.1)THEN
IF(LBETA)THEN
IF(IBATCH.EQ.0)THEN
CALL WMESSAGEBOX(OKONLY,COMMONOK,EXCLAMATIONICON,'Cannot start Beta-iMOD because you are not authorized in writing for Beta-iMOD','Error')
ELSE
WRITE(*,'(A)') 'Cannot start Beta-iMOD because you are not authorized in writing for Beta-iMOD'
ENDIF
ELSE
IF(IBATCH.EQ.0)THEN
CALL WMESSAGEBOX(OKONLY,COMMONOK,EXCLAMATIONICON,'Cannot start iMODFLOW unless you accept the iMOD Software License Agreement','Error')
ELSE
WRITE(*,'(A)') 'Cannot start iMODFLOW unless you accept the iMOD Software License Agreement'
ENDIF
ENDIF
RETURN
ENDIF
ENDIF
!## copy imod license text file
CALL IOSCOPYFILE(TRIM(EXEPATH)//'\'//TRIM(LICFILE),TRIM(DIR)//'\'//TRIM(LICFILE))
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
!## simulate batch-file
IU=UTL_GETUNIT()
IF(PBMAN%IPESTP.EQ.0)THEN
CALL OSD_OPEN(IU,FILE=TRIM(DIR)//'\RUN.BAT',STATUS='REPLACE',ACTION='WRITE,DENYREAD',IOSTAT=IOS)
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(DIR)//'\RUN_P#'//TRIM(ITOS(I))//'.BAT',STATUS='REPLACE',ACTION='WRITE,DENYREAD',IOSTAT=IOS)
ELSE
CALL OSD_OPEN(IU,FILE=TRIM(DIR)//'\RUN_L#'//TRIM(ITOS(ABS(I)))//'.BAT',STATUS='REPLACE',ACTION='WRITE,DENYREAD',IOSTAT=IOS)
ENDIF
ENDIF
IF(IOS.NE.0)THEN
IF(IBATCH.EQ.0)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMODFLOW is already running, you cannot start '//CHAR(13)// &
'new run while previous run is still running'//CHAR(13)//'or'//CHAR(13)//'Run-script cannot be created','Error')
ELSE
WRITE(*,'(A)') 'iMODFLOW is already running, you cannot start new run while previous run is still running'// &
'or Run-script cannot be created'
ENDIF
RETURN
ENDIF
!## write start script in batch file
WRITE(IU,'(A)') 'REM =========================='
WRITE(IU,'(A)') 'REM Run Script iMOD '//TRIM(RVERSION)
WRITE(IU,'(A)') 'REM =========================='
!## namfile
IF(IMODE.EQ.1)THEN
IF(PBMAN%IFORMAT.EQ.1)WRITE(IU,'(A)') 'TITLE "NAMFILE: '//TRIM(MNAME)//'.nam"'
IF(LMSP)THEN
IF(PBMAN%IPESTP.EQ.0)THEN
WRITE(IU,'(/A/)') '"'//TRIM(PREFVAL(8))//'" -components components.inp'
ELSE
IF(I.GT.0)THEN
WRITE(IU,'(/A/)') '"'//TRIM(PREFVAL(8))//'" -components components_P#'//TRIM(ITOS(I))//'.inp -ipest ".\modelinput\'//TRIM(MNAME)//'.pst1"'
ELSE
WRITE(IU,'(/A/)') '"'//TRIM(PREFVAL(8))//'" -components components_L#'//TRIM(ITOS(ABS(I)))//'.inp -ipest ".\modelinput\'//TRIM(MNAME)//'.pst1"'
ENDIF
ENDIF
ELSE
IF(PBMAN%IPEST+PBMAN%IPESTP.EQ.0)THEN
IF(PBMAN%IFORMAT.EQ.2)WRITE(IU,'(/A/)') '"'//TRIM(PREFVAL(8))//'" "'//TRIM(MNAME)//'.nam"'
IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(/A/)') '"'//TRIM(PREFVAL(8))//'"'
!## ipest
ELSEIF(PBMAN%IPEST.EQ.1)THEN
WRITE(IU,'(/A/)') '"'//TRIM(PREFVAL(8))//'" "'//TRIM(MNAME)//'.nam" -ipest ".\modelinput\'//TRIM(MNAME)//'.pst1"'
!## parrallel ipest
ELSEIF(PBMAN%IPESTP.EQ.1)THEN
IF(I.GT.0)THEN
WRITE(IU,'(/A/)') '"'//TRIM(PREFVAL(8))//'" "'//TRIM(MNAME)//'_P#'//TRIM(ITOS(I))//'.nam" -ipest ".\modelinput\'// &
TRIM(MNAME)//'_P#'//TRIM(ITOS(I))//'.pst1"'
ELSE
WRITE(IU,'(/A/)') '"'//TRIM(PREFVAL(8))//'" "'//TRIM(MNAME)//'_L#'//TRIM(ITOS(ABS(I)))//'.nam" -ipest ".\modelinput\'// &
TRIM(MNAME)//'_L#'//TRIM(ITOS(ABS(I)))//'.pst1"'
ENDIF
ENDIF
ENDIF
!## include conversion of sfr package into isg-file
IF(LSFR)THEN
WRITE(IU,'(/A)') 'REM ============================================='
WRITE(IU,'( A)') 'REM iMOD Batch Script iMOD '//TRIM(RVERSION)
WRITE(IU,'( A)') 'REM ============================================='
WRITE(IU,'( A)') 'ECHO FUNCTION=SFRTOISG > SFRTOISG.INI'
WRITE(IU,'( A)') 'ECHO ISGFILE_IN= "'//TRIM(DIR)//'\MODELINPUT\SFR7\SFR.ISG" >> SFRTOISG.INI'
WRITE(IU,'( A)') 'ECHO ISGFILE_OUT="'//TRIM(DIR)//'\BDGSFR\ISG\SFR.ISG" >> SFRTOISG.INI'
WRITE(IU,'(A/)') 'ECHO SFRFILE_IN= "'//TRIM(DIR)//'\'//TRIM(MNAME)//'_FSFR.TXT" >> SFRTOISG.INI'
WRITE(IU,'(A)')
WRITE(IU,'(A)') '"'//TRIM(EXENAME)//'" SFRTOISG.INI'
WRITE(IU,'(A)')
ENDIF
!## runfile
ELSEIF(IMODE.EQ.2)THEN
IF(IBATCH.EQ.0)THEN
IF(NICORES.GT.1)THEN
WRITE(IU,'(A)') ':: Set number of MPI processes'
WRITE(IU,'(A)') 'set np='//ITOS(NICORES)
WRITE(IU,'(A)') ''
WRITE(IU,'(A)') ':: Run model'
WRITE(IU,'(A)') '"C:\Program Files\MPICH2\bin\mpiexec.exe" -localonly %np% "'//TRIM(PREFVAL(8))//'" '//TRIM(MNAME)//'.run"'
ELSE
WRITE(IU,'(A)') '"'//TRIM(PREFVAL(8))//'" '//'IMODFLOW.RUN'
ENDIF
ELSE
WRITE(IU,'(A)') '"'//TRIM(PREFVAL(8))//'" '//TRIM(MNAME)//'.run'
ENDIF
ENDIF
CLOSE(IU)
ENDDO
!## move iMOD to the simulation directory
CALL IOSDIRNAME(DIRNAME); CALL IOSDIRCHANGE(TRIM(DIR)//'\')
IF(PBMAN%IPESTP.EQ.1)THEN
CALL IPEST_GLM_MAIN(TRIM(DIR),MNAME,IBATCH)
CALL IPEST_GLM_RESET_PARAMETER()
ELSE
!## start the batch file - run in the foreground
IF(IRUNMODE.GT.0)THEN
IFLAGS=PROCBLOCKED
!## executes on commandtool such that commands alike 'dir' etc. works
IFLAGS=IFLAGS+PROCCMDPROC
IF(ILOGFILE.EQ.0)THEN
CALL IOSCOMMAND('RUN.BAT',IFLAGS,IEXCOD=IEXCOD)
ELSE
CALL IOSCOMMAND('RUN.BAT > RUN_LOG.TXT',IFLAGS,IEXCOD=IEXCOD)
ENDIF
IF(IEXCOD.EQ.0)THEN
IF(IBATCH.EQ.0)THEN
CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Successful simulation using: '//CHAR(13)// &
'MODFLOW: '//TRIM(PREFVAL(8))//CHAR(13)// &
'RUNFILE/NAMFILE: '//TRIM(RUNFNAME),'Information')
ELSE
WRITE(*,'(A)') 'Successfully STARTED the Modflow simulation using:'
WRITE(*,'(A)') 'MODFLOW: '//TRIM(PREFVAL(8))
WRITE(*,'(A)') 'RUNFILE/NAMFILE: '//TRIM(RUNFNAME)
ENDIF
ELSE
IF(IBATCH.EQ.0)THEN
CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'An error occured in starting your simulation','Error')
ELSE
WRITE(*,'(A)') 'An error occured in starting your simulation'
ENDIF
ENDIF
!## start the batch file - run in the background
ELSEIF(IRUNMODE.LT.0)THEN
IFLAGS=0
!## executes on commandtool such that commands alike 'dir' etc. works
IFLAGS=IFLAGS+PROCCMDPROC
IF(ILOGFILE.EQ.0)THEN
CALL IOSCOMMAND('RUN.BAT',IFLAGS,IEXCOD=IEXCOD)
ELSE
CALL IOSCOMMAND('RUN.BAT > RUN_LOG.TXT',IFLAGS,IEXCOD=IEXCOD)
ENDIF
IF(IBATCH.EQ.0)THEN
CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Successfully STARTED the Modflow simulation using:'//CHAR(13)// &
'MODFLOW: '//TRIM(PREFVAL(8))//CHAR(13)// &
'RUNFILE/NAMFILE: '//TRIM(RUNFNAME),'Information')
ELSE
WRITE(*,'(A)') 'Successful simulation using:'
WRITE(*,'(A)') 'MODFLOW: '//TRIM(PREFVAL(8))
WRITE(*,'(A)') 'RUNFILE/NAMFILE: '//TRIM(RUNFNAME)
ENDIF
ENDIF
ENDIF
CALL IOSDIRCHANGE(DIRNAME)
END SUBROUTINE PMANAGERSTART
!###====================================================================
LOGICAL FUNCTION PMANAGER_SAVEMF2005_COARSEGRID(IDF,X1,Y1,X2,Y2,BUFFERCS)
!###====================================================================
IMPLICIT NONE
TYPE(IDFOBJ),INTENT(INOUT) :: IDF
REAL(KIND=DP_KIND),INTENT(IN) :: BUFFERCS,X1,Y1,X2,Y2
REAL(KIND=DP_KIND),PARAMETER :: INC=1.0D0 !## minimal scaling in interest
REAL(KIND=DP_KIND),PARAMETER :: FINCR=0.02D0
REAL(KIND=DP_KIND),PARAMETER :: POWR=0.3D0 !
INTEGER :: NOMAXCELL !## maximal # cells in the end
INTEGER,PARAMETER :: NOMINCELL=1 !## minimal # cells in the centre
LOGICAL,PARAMETER :: LCLIP=.TRUE. !## along edge small cells
INTEGER :: IC1,IC2,IR1,IR2,ORGNCOL,ORGNROW,OC1,OC2,OR1,OR2,I
INTEGER,ALLOCATABLE,DIMENSION(:) :: PDELR,PDELC
REAL(KIND=DP_KIND),DIMENSION(:),ALLOCATABLE :: DX,DY
PMANAGER_SAVEMF2005_COARSEGRID=.FALSE.
NOMAXCELL=INT(BUFFERCS/IDF%DX)
IC1=INT((X1-IDF%XMIN)/IDF%DX)+1
IC2=INT((X2-IDF%XMIN)/IDF%DX)+1
IR1=INT((IDF%YMAX-Y1)/IDF%DY)+1
IR2=INT((IDF%YMAX-Y2)/IDF%DY)+1
ORGNCOL=IDF%NCOL
ORGNROW=IDF%NROW
ALLOCATE(PDELR(IDF%NCOL),PDELC(IDF%NROW))
CALL UTL_MODELLHS1(PDELR,ORGNCOL,IDF%NCOL,IC1,IC2,OC1,OC2,INC,FINCR,POWR,NOMINCELL,NOMAXCELL,LCLIP)
CALL UTL_MODELLHS1(PDELC,ORGNROW,IDF%NROW,IR1,IR2,OR1,OR2,INC,FINCR,POWR,NOMINCELL,NOMAXCELL,LCLIP)
IDF%IEQ=1; IF(.NOT.IDFALLOCATESXY(IDF))RETURN
ALLOCATE(DX(IDF%NCOL),DY(IDF%NROW))
CALL PMANAGER_SAVEMF2005_COARSEGRID_RESULT(PDELR,DX,IDF%NCOL,ORGNCOL,IDF%DX)
CALL PMANAGER_SAVEMF2005_COARSEGRID_RESULT(PDELC,DY,IDF%NROW,ORGNROW,IDF%DY)
IDF%SX(0)=IDF%XMIN
DO I=1,IDF%NCOL; IDF%SX(I)=IDF%SX(I-1)+DX(I); ENDDO
IDF%SY(0)=IDF%YMAX
DO I=1,IDF%NROW; IDF%SY(I)=IDF%SY(I-1)-DY(I); ENDDO
DEALLOCATE(DX,DY)
PMANAGER_SAVEMF2005_COARSEGRID=.TRUE.
END FUNCTION PMANAGER_SAVEMF2005_COARSEGRID
!###====================================================================
SUBROUTINE PMANAGER_SAVEMF2005_COARSEGRID_RESULT(IX,DX,NX,NXORG,SIMCSIZE)
!###====================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: NX,NXORG
REAL(KIND=DP_KIND),INTENT(IN) :: SIMCSIZE
REAL(KIND=DP_KIND),INTENT(OUT),DIMENSION(NX) :: DX
INTEGER,INTENT(IN),DIMENSION(NXORG) :: IX
INTEGER :: I,J,K
J=1
K=1
DO I=2,NXORG
IF(IX(I).NE.IX(I-1))THEN
DX(K)=SIMCSIZE*REAL(J)
K=K+1
J=1
ELSE
J=J+1
ENDIF
END DO
DX(K)=SIMCSIZE*REAL(J)
END SUBROUTINE PMANAGER_SAVEMF2005_COARSEGRID_RESULT
!###======================================================================
LOGICAL FUNCTION PMANAGER_SAVEMF2005_PCK_GETMINMAX(X,NCOL,NROW,XB,MINV,MAXV,IFBND)
!###======================================================================
IMPLICIT NONE
REAL(KIND=DP_KIND),INTENT(IN),DIMENSION(NCOL,NROW) :: X,XB
INTEGER,INTENT(IN) :: NROW,NCOL,IFBND
INTEGER :: IROW,ICOL,I
REAL(KIND=DP_KIND),INTENT(OUT) :: MINV,MAXV
PMANAGER_SAVEMF2005_PCK_GETMINMAX=.FALSE.
MINV=HUGE(1.0D0); MAXV=-HUGE(1.0D0); I=0
DO IROW=1,PRJIDF%NROW; DO ICOL=1,PRJIDF%NCOL
!## skip nodata points
IF(X(ICOL,IROW).EQ.HNOFLOW)CYCLE
!## check on active nodes only
IF(IFBND.EQ.1)THEN
IF(XB(ICOL,IROW).NE.0.0D0)THEN
MINV=MIN(MINV,X(ICOL,IROW))
MAXV=MAX(MAXV,X(ICOL,IROW))
I =I+1
ENDIF
ELSE
MINV=MIN(MINV,X(ICOL,IROW))
MAXV=MAX(MAXV,X(ICOL,IROW))
I =I+1
ENDIF
ENDDO; ENDDO
IF(I.LE.0)THEN
MINV=HNOFLOW; MAXV=MINV
! CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Cannot find any data for active cells'//CHAR(13)// &
! TRIM(EXFNAME),'Error')
ENDIF
PMANAGER_SAVEMF2005_PCK_GETMINMAX=.TRUE.
END FUNCTION PMANAGER_SAVEMF2005_PCK_GETMINMAX
!###======================================================================
SUBROUTINE PMANAGER_SAVEMF2005_ALLOCATEPCK(N)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: N
INTEGER :: I
IF(ALLOCATED(PCK))CALL PMANAGER_SAVEMF2005_DEALLOCATEPCK()
ALLOCATE(PCK(N))
DO I=1,N
CALL IDFNULLIFY(PCK(I))
CALL IDFCOPY(BND(1),PCK(I))
ENDDO
END SUBROUTINE PMANAGER_SAVEMF2005_ALLOCATEPCK
!###======================================================================
SUBROUTINE PMANAGER_SAVEMF2005_DEALLOCATEPCK()
!###======================================================================
IMPLICIT NONE
INTEGER:: N,I
IF(.NOT.ALLOCATED(PCK))RETURN
N=SIZE(PCK)
DO I=1,N; CALL IDFDEALLOCATEX(PCK(I)); ENDDO
DEALLOCATE(PCK)
END SUBROUTINE PMANAGER_SAVEMF2005_DEALLOCATEPCK
!###======================================================================
SUBROUTINE PMANAGER_ALLOCATE()
!###======================================================================
IMPLICIT NONE
INTEGER :: I,N,M
DO I=1,SIZE(TOPICS)
IF(ASSOCIATED(TOPICS(I)%STRESS))THEN
N=SIZE(TOPICS(I)%STRESS)
M=TOPICS(I)%NSUBTOPICS
IF(ASSOCIATED(TOPICS(I)%IDT))DEALLOCATE(TOPICS(I)%IDT)
IF(ASSOCIATED(TOPICS(I)%ISD))DEALLOCATE(TOPICS(I)%ISD)
ALLOCATE(TOPICS(I)%IDT(N))
ALLOCATE(TOPICS(I)%ISD(N,M))
TOPICS(I)%IDT=0; TOPICS(I)%ISD=0
ENDIF
ENDDO
END SUBROUTINE PMANAGER_ALLOCATE
!###======================================================================
SUBROUTINE PMANAGER_DEALLOCATE(I)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: I
INTEGER :: J
IF(ASSOCIATED(TOPICS(I)%STRESS))THEN
DO J=1,SIZE(TOPICS(I)%STRESS)
IF(ASSOCIATED(TOPICS(I)%STRESS(J)%FILES))DEALLOCATE(TOPICS(I)%STRESS(J)%FILES)
IF(ASSOCIATED(TOPICS(I)%STRESS(J)%INPFILES))DEALLOCATE(TOPICS(I)%STRESS(J)%INPFILES)
ENDDO
DEALLOCATE(TOPICS(I)%STRESS)
ENDIF
IF(ASSOCIATED(TOPICS(I)%IDT))DEALLOCATE(TOPICS(I)%IDT)
IF(ASSOCIATED(TOPICS(I)%ISD))DEALLOCATE(TOPICS(I)%ISD)
NULLIFY(TOPICS(I)%STRESS); NULLIFY(TOPICS(I)%IDT); NULLIFY(TOPICS(I)%ISD)
TOPICS(I)%IACT_MODEL=0
END SUBROUTINE PMANAGER_DEALLOCATE
!#####=================================================================
SUBROUTINE PMANAGER_DEALLOCATE_PEST()
!#####=================================================================
IMPLICIT NONE
INTEGER :: I
IF(ASSOCIATED(PEST%PARAM))THEN
DO I=1,SIZE(PEST%PARAM)
IF(ASSOCIATED(PEST%PARAM(I)%ALPHA_ERROR_VARIANCE))DEALLOCATE(PEST%PARAM(I)%ALPHA_ERROR_VARIANCE)
IF(ASSOCIATED(PEST%PARAM(I)%ALPHA_HISTORY)) DEALLOCATE(PEST%PARAM(I)%ALPHA_HISTORY)
IF(ASSOCIATED(PEST%PARAM(I)%GALPHA)) DEALLOCATE(PEST%PARAM(I)%GALPHA)
IF(ASSOCIATED(PEST%PARAM(I)%LALPHA)) DEALLOCATE(PEST%PARAM(I)%LALPHA)
ENDDO
DEALLOCATE(PEST%PARAM)
ENDIF
IF(ASSOCIATED(PEST%S_PERIOD)) DEALLOCATE(PEST%S_PERIOD)
IF(ASSOCIATED(PEST%E_PERIOD)) DEALLOCATE(PEST%E_PERIOD)
IF(ASSOCIATED(PEST%B_FRACTION)) DEALLOCATE(PEST%B_FRACTION)
IF(ASSOCIATED(PEST%B_BATCHFILE))DEALLOCATE(PEST%B_BATCHFILE)
IF(ASSOCIATED(PEST%B_OUTFILE)) DEALLOCATE(PEST%B_OUTFILE)
IF(ASSOCIATED(PEST%IDFFILES)) DEALLOCATE(PEST%IDFFILES)
IF(ASSOCIATED(PEST%MEASURES)) DEALLOCATE(PEST%MEASURES)
END SUBROUTINE PMANAGER_DEALLOCATE_PEST
!###======================================================================
SUBROUTINE PMANAGER_UTL_SHOW(ICODE)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: ICODE
CALL WINDOWSELECT(0)
IF(WMENUGETSTATE(ID_PMANAGER,2).EQ.1)THEN
IF(ICODE.EQ.0)THEN; CALL PMANAGER_UTL_CLOSE(); RETURN; ENDIF
ENDIF
CALL WMENUSETSTATE(ID_PMANAGER,2,1)
CALL WDIALOGSELECT(ID_DPMANAGER); CALL WDIALOGSHOW(0,65,0,2)
END SUBROUTINE PMANAGER_UTL_SHOW
!###======================================================================
SUBROUTINE PMANAGER_UTL_INIT()
!###======================================================================
IMPLICIT NONE
INTEGER :: I
TOPICS(1)%TNAME ='(CAP) MetaSwap'
TOPICS(2)%TNAME ='(TOP) Top Elevation'
TOPICS(3)%TNAME ='(BOT) Bottom Elevation'
TOPICS(4)%TNAME ='(BND) Boundary Condition'
TOPICS(5)%TNAME ='(SHD) Starting Heads'
TOPICS(6)%TNAME ='(KDW) Transmissivity'
TOPICS(7)%TNAME ='(KHV) Horizontal Permeability'
TOPICS(8)%TNAME ='(KVA) Vertical Anisotropy'
TOPICS(9)%TNAME ='(VCW) Vertical Resistance'
TOPICS(10)%TNAME='(KVV) Vertical Permeability'
TOPICS(11)%TNAME='(STO) Confined Storage Coefficient'
TOPICS(12)%TNAME='(SPY) Specific Yield'
TOPICS(13)%TNAME='(PWT) Perched Water Table'
TOPICS(14)%TNAME='(ANI) Anisotropy'
TOPICS(15)%TNAME='(HFB) Horizontal Flow Barrier'
TOPICS(16)%TNAME='(IBS) Interbed Storage'
TOPICS(17)%TNAME='(SFT) StreamFlow Thickness'
TOPICS(18)%TNAME='(UZF) Unsaturated Zone Flow Package'
TOPICS(19)%TNAME='(MNW) Multi Node Well Package'
TOPICS(20)%TNAME='(PST) Parameter Estimation'
TOPICS(21)%TNAME='(WEL) Wells'
TOPICS(22)%TNAME='(DRN) Drainage'
TOPICS(23)%TNAME='(RIV) Rivers'
TOPICS(24)%TNAME='(EVT) Evapotranspiration'
TOPICS(25)%TNAME='(GHB) General Head Boundary'
TOPICS(26)%TNAME='(RCH) Recharge'
TOPICS(27)%TNAME='(OLF) Overland Flow'
TOPICS(28)%TNAME='(CHD) Constant Head Boundary'
TOPICS(29)%TNAME='(ISG) iMOD Segment Rivers'
TOPICS(30)%TNAME='(SFR) Stream Flow Routing'
TOPICS(31)%TNAME='(FHB) Flow and Head Boundary'
TOPICS(32)%TNAME='(LAK) Lake Package'
TOPICS(33)%TNAME='(PCG) Precondition Conjugate-Gradient'
TOPICS(1)%NSUBTOPICS =22 !CAP
TOPICS(2)%NSUBTOPICS =1 !TOP
TOPICS(3)%NSUBTOPICS =1 !BOT
TOPICS(4)%NSUBTOPICS =1 !BND
TOPICS(5)%NSUBTOPICS =1 !SHD
TOPICS(6)%NSUBTOPICS =1 !KDW
TOPICS(7)%NSUBTOPICS =1 !KHV
TOPICS(8)%NSUBTOPICS =1 !KHA
TOPICS(9)%NSUBTOPICS =1 !VCW
TOPICS(10)%NSUBTOPICS=1 !KVV
TOPICS(11)%NSUBTOPICS=1 !STO
TOPICS(12)%NSUBTOPICS=1 !SSC
TOPICS(13)%NSUBTOPICS=6 !PWT
TOPICS(14)%NSUBTOPICS=2 !ANI
TOPICS(15)%NSUBTOPICS=1 !HFB
TOPICS(16)%NSUBTOPICS=4 !IBS
TOPICS(17)%NSUBTOPICS=2 !SFT
TOPICS(18)%NSUBTOPICS=8 !UZF
TOPICS(19)%NSUBTOPICS=1 !MNW
TOPICS(20)%NSUBTOPICS=1 !PST
TOPICS(21)%NSUBTOPICS=1 !WEL
TOPICS(22)%NSUBTOPICS=2 !DRN
TOPICS(23)%NSUBTOPICS=4 !RIV
TOPICS(24)%NSUBTOPICS=3 !EVT
TOPICS(25)%NSUBTOPICS=2 !GHB
TOPICS(26)%NSUBTOPICS=1 !RCH
TOPICS(27)%NSUBTOPICS=1 !OLF
TOPICS(28)%NSUBTOPICS=1 !CHD
TOPICS(29)%NSUBTOPICS=1 !ISG
TOPICS(30)%NSUBTOPICS=1 !SFR
TOPICS(31)%NSUBTOPICS=2 !FHB
TOPICS(32)%NSUBTOPICS=10 !LAK
TOPICS(33)%NSUBTOPICS=1 !PCG
TOPICS(1)%TIMDEP =.FALSE. !CAP
TOPICS(2)%TIMDEP =.FALSE. !TOP
TOPICS(3)%TIMDEP =.FALSE. !BOT
TOPICS(4)%TIMDEP =.FALSE. !BND
TOPICS(5)%TIMDEP =.FALSE. !SHD
TOPICS(6)%TIMDEP =.FALSE. !KDW
TOPICS(7)%TIMDEP =.FALSE. !KHV
TOPICS(8)%TIMDEP =.FALSE. !KVA
TOPICS(9)%TIMDEP =.FALSE. !VCW
TOPICS(10)%TIMDEP=.FALSE. !KVV
TOPICS(11)%TIMDEP=.FALSE. !STO
TOPICS(12)%TIMDEP=.FALSE. !SSC
TOPICS(13)%TIMDEP=.FALSE. !PWT
TOPICS(14)%TIMDEP=.FALSE. !ANI
TOPICS(15)%TIMDEP=.FALSE. !HFB
TOPICS(16)%TIMDEP=.FALSE. !IBS
TOPICS(17)%TIMDEP=.FALSE. !SFT
TOPICS(18)%TIMDEP=.TRUE. !UZF
TOPICS(19)%TIMDEP=.TRUE. !MNW
TOPICS(20)%TIMDEP=.FALSE. !PST
TOPICS(21)%TIMDEP=.TRUE. !WEL
TOPICS(22)%TIMDEP=.TRUE. !DRN
TOPICS(23)%TIMDEP=.TRUE. !RIV
TOPICS(24)%TIMDEP=.TRUE. !EVT
TOPICS(25)%TIMDEP=.TRUE. !GHB
TOPICS(26)%TIMDEP=.TRUE. !RCH
TOPICS(27)%TIMDEP=.TRUE. !OLF
TOPICS(28)%TIMDEP=.TRUE. !CHD
TOPICS(29)%TIMDEP=.TRUE. !ISG
TOPICS(30)%TIMDEP=.TRUE. !SFR
TOPICS(31)%TIMDEP=.TRUE. !FHB
TOPICS(32)%TIMDEP=.TRUE. !LAK
TOPICS(33)%TIMDEP=.FALSE. !PCG
TOPICS(1)%SNAME(1) ='(BND) Boundary (IDF)'
TOPICS(1)%SNAME(2) ='(LUS) Landuse (IDF)'
TOPICS(1)%SNAME(3) ='(RTZ) Rootzone (IDF)'
TOPICS(1)%SNAME(4) ='(SLT) Soiltype (IDF)'
TOPICS(1)%SNAME(5) ='(MST) Meteostation (IDF)'
TOPICS(1)%SNAME(6) ='(SFL) Surfacelevel (IDF)'
TOPICS(1)%SNAME(7) ='(ARQ) Artificial discharge (IDF)'
TOPICS(1)%SNAME(8) ='(ARL) Artificial layer (IDF)'
TOPICS(1)%SNAME(9) ='(ARL) Artificial location (IPF)'
TOPICS(1)%SNAME(10) ='(WRA) Wetted Rural Area (IDF)'
TOPICS(1)%SNAME(11) ='(WUA) Wetted Urban Area (IDF)'
TOPICS(1)%SNAME(12) ='(PUA) Pondingdepth Urban Area (IDF)'
TOPICS(1)%SNAME(13) ='(PRA) Pondingdepth Rural Area (IDF)'
TOPICS(1)%SNAME(14) ='(RUA) Runoff Resistance Urban Area (IDF)'
TOPICS(1)%SNAME(15) ='(RRA) Runoff Resistance Rural Area (IDF)'
TOPICS(1)%SNAME(16) ='(RUA) Runon Resistance Urban Area (IDF)'
TOPICS(1)%SNAME(17) ='(RRA) Runon Resistance Rural Area (IDF)'
TOPICS(1)%SNAME(18) ='(IUA) Infiltration Capacity Urban Area (IDF)'
TOPICS(1)%SNAME(19) ='(IRA) Infiltration Capacity Rural Area (IDF)'
TOPICS(1)%SNAME(20) ='(PWD) Purgewater Depth (IDF)'
TOPICS(1)%SNAME(21) ='(SMF) Soil Moisture Factor (IDF)'
TOPICS(1)%SNAME(22) ='(SPF) Soil Permeability Factor (IDF)'
TOPICS(2)%SNAME(1) ='(TOP) Top of Modellayer (IDF)'
TOPICS(3)%SNAME(1) ='(BOT) Bottom of Modellayer (IDF)'
TOPICS(4)%SNAME(1) ='(BND) Boundary Settings (IDF)'
TOPICS(5)%SNAME(1) ='(SHD) Starting Heads (IDF)'
TOPICS(6)%SNAME(1) ='(KDW) COnductance (IDF)'
TOPICS(7)%SNAME(1) ='(KHV) Horizontal Permeability (IDF)'
TOPICS(8)%SNAME(1) ='(KVA) Vertical Anisotropy (IDF)'
TOPICS(9)%SNAME(1) ='(VCW) Vertical Resistance (IDF)'
TOPICS(10)%SNAME(1) ='(KVV) Vertical Permeability (IDF)'
TOPICS(11)%SNAME(1) ='(STO) Storage Coefficient (IDF)'
TOPICS(12)%SNAME(1) ='(SSY) Specific Yield / Confined Storage Coef. (IDF)'
TOPICS(13)%SNAME(1) ='(LAY) Layer Identification (IDF)'
TOPICS(13)%SNAME(2) ='(STO) Phreatic Storage Coefficient (IDF)'
TOPICS(13)%SNAME(3) ='(TA1) Top of Aquifer above PWT-layer (IDF)'
TOPICS(13)%SNAME(4) ='(TAQ) Top of Aquitard PWT-layer (IDF)'
TOPICS(13)%SNAME(5) ='(TA2) Top of Aquifer beneath PWT-layer (IDF)'
TOPICS(13)%SNAME(6) ='(VCP) Vertical Resistance of PWT-clay (IDF)'
TOPICS(14)%SNAME(1) ='(FCT) Factor (IDF)'
TOPICS(14)%SNAME(2) ='(ANG) Angle (IDF)'
TOPICS(15)%SNAME(1) ='(HFB) Horizontal Barrier Flow (GEN)'
TOPICS(16)%SNAME(1) ='(PCH) Preconsolidation Head (IDF)'
TOPICS(16)%SNAME(2) ='(ESC) Elastic Storage Coefficient (IDF)'
TOPICS(16)%SNAME(3) ='(ISC) Inelastic Storage Coefficient (IDF)'
TOPICS(16)%SNAME(4) ='(SCP) Starting Compaction (IDF)'
TOPICS(17)%SNAME(1) ='(SFT) Stream Flow Thickness (IDF)'
TOPICS(17)%SNAME(2) ='(PER) Permeability (IDF)'
TOPICS(18)%SNAME(1) ='(AEA) Areal Extent of Active Model (IDF)'
! TOPICS(18)%SNAME(2) ='Overland Flow to SFR (>0) / LAK (<0) (IDF)'
! TOPICS(18)%SNAME(2) ='Saturated Vertical Conductivity (IDF)'
TOPICS(18)%SNAME(2) ='(BCE) Brooks-Corey Epsilon (IDF)'
TOPICS(18)%SNAME(3) ='(SWC) Saturated Water Content of Unsat. Zone (IDF)'
! TOPICS(18)%SNAME(4) ='(RWC) Residual Water Content of Unsat. Zone (IDF)'
TOPICS(18)%SNAME(4) ='(IWC) Initial Water Content (IDF)'
TOPICS(18)%SNAME(5) ='(INF) Infiltration Rates at Land Surface (IDF)'
TOPICS(18)%SNAME(6) ='(EVA) Evaporation Demands (IDF)'
TOPICS(18)%SNAME(7) ='(EXD) Extinction Depth (IDF)'
TOPICS(18)%SNAME(8) ='(EWC) Extinction Water Content (IDF)'
TOPICS(19)%SNAME(1) ='(WRL) Well Rate and Well Loss (IPF)'
TOPICS(20)%SNAME(1) ='(PAR) Parameters Estimation (-)'
TOPICS(21)%SNAME(1) ='(WRA) Well Rate (IPF)'
TOPICS(22)%SNAME(1) ='(CON) Conductance (IDF)'
TOPICS(22)%SNAME(2) ='(DEL) Drainage Level (IDF)'
TOPICS(23)%SNAME(1) ='(CON) Conductance (IDF)'
TOPICS(23)%SNAME(2) ='(RST) River Stage (IDF)'
TOPICS(23)%SNAME(3) ='(RBT) River Bottom (IDF)'
TOPICS(23)%SNAME(4) ='(RIF) Infiltration Factor (IDF)'
TOPICS(24)%SNAME(1) ='(EVA) Evapotranspiration Rate (IDF)'
TOPICS(24)%SNAME(2) ='(SUR) Surface Level (IDF)'
TOPICS(24)%SNAME(3) ='(EXD) Extinction Depth (IDF)'
TOPICS(25)%SNAME(1) ='(CON) Conductance (IDF)'
TOPICS(25)%SNAME(2) ='(LVL) Reference Level (IDF)'
TOPICS(26)%SNAME(1) ='(RCH) Recharge Rate (IDF)'
TOPICS(27)%SNAME(1) ='(LVL) Overland Flow Level (IDF)'
TOPICS(28)%SNAME(1) ='(CHD) Constant Head (IDF)'
TOPICS(29)%SNAME(1) ='(ISG) Segment River (ISG)'
TOPICS(30)%SNAME(1) ='(ISG) Stream Flow River (ISG)'
TOPICS(31)%SNAME(1) ='(FHB) Specified Flow (IDF)'
TOPICS(31)%SNAME(2) ='(FHB) Specified Head (IDF)'
TOPICS(32)%SNAME(1) ='(LID) Lake Identifications (IDF)'
TOPICS(32)%SNAME(2) ='(LBA) Lake Bathymetry (IDF)'
TOPICS(32)%SNAME(3) ='(INI) Initial Lake Levels (IDF)'
TOPICS(32)%SNAME(4) ='(MIN) Minimal Lake Levels (IDF)'
TOPICS(32)%SNAME(5) ='(MAX) Maximal Lake Levels (IDF)'
TOPICS(32)%SNAME(6) ='(LRE) Lakebed Resistance (IDF)'
TOPICS(32)%SNAME(7) ='(LPR) Precipitation at surface Lake (IDF)'
TOPICS(32)%SNAME(8) ='(LEV) Evaporation at surface Lake (IDF)'
TOPICS(32)%SNAME(9) ='(LOR) Overland runoff (IDF)'
TOPICS(32)%SNAME(10)='(LWD) Lake Withdrawall (IDF)'
TOPICS(33)%SNAME(1) ='(PCG) Parameters PCG method (-)'
CALL WDIALOGLOAD(ID_DPMANAGER)
CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPEN,1)
CALL WDIALOGPUTIMAGE(ID_SAVE,ID_ICONSAVEAS,1)
CALL WDIALOGPUTIMAGE(ID_PROPERTIES,ID_ICONPROPERTIES,1)
CALL WDIALOGPUTIMAGE(ID_PROPERTIES_AUTO,ID_ICONPROPERTIES_AUTO,1)
CALL WDIALOGPUTIMAGE(ID_DRAW,ID_ICONDRAW,1)
CALL WDIALOGPUTIMAGE(ID_DRAW2,ID_ICONDRAWPLUS,1)
CALL WDIALOGPUTIMAGE(ID_OPENRUN,ID_ICONOPENRUN,1)
CALL WDIALOGPUTIMAGE(ID_SAVERUN,ID_ICONSAVERUN,1)
CALL WDIALOGPUTIMAGE(ID_CLEAN,ID_ICONNEW,1)
CALL WDIALOGPUTIMAGE(ID_DELETE,ID_ICONDELETE,1)
CALL WDIALOGPUTIMAGE(ID_CALC,ID_ICONCALC,1)
ALLOCATE(PERIOD(MAXPERIODS)); NPERIOD=0
DO I=1,SIZE(TOPICS)
NULLIFY(TOPICS(I)%STRESS)
NULLIFY(TOPICS(I)%STRESS_TMP)
ENDDO
END SUBROUTINE PMANAGER_UTL_INIT
!#####=================================================================
SUBROUTINE PMANAGER_UTL_CLOSE()
!#####=================================================================
IMPLICIT NONE
CALL WINDOWSELECT(0); CALL WMENUSETSTATE(ID_PMANAGER,2,0)
CALL WDIALOGSELECT(ID_DPMANAGER); CALL WDIALOGHIDE()
IF(ALLOCATED(LAYCON))DEALLOCATE(LAYCON)
END SUBROUTINE PMANAGER_UTL_CLOSE
END MODULE MOD_PMANAGER_UTL