!! Copyright (C) Stichting Deltares, 2005-2014. !! !! 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 PMANAGER_MOD USE WINTERACTER USE RESOURCE USE MOD_MDL_PAR, ONLY : REPLACESTRING USE MOD_UTL, ONLY : UTL_GETUNIT,ITOS,RTOS,UTL_WSELECTFILE,UTL_CAP,UTL_MESSAGEHANDLE,UTL_SUBST,UTL_FILLDATES, & IDATETOGDATE,IDATETOJDATE,GDATE,JDATETOIDATE,JD USE MOD_IDF, ONLY : IDFREAD,IDFDEALLOCATE,IDFNULLIFY USE MOD_IDF_PAR, ONLY : IDFOBJ USE MOD_OSD, ONLY : OSD_OPEN USE MOD_PMANAGER_PAR USE IMOD, ONLY : IDFINIT USE MOD_PREF_PAR, ONLY : PREFVAL USE DATEVAR TYPE PRJOBJ INTEGER :: ILAY,ICNST,IACT REAL :: FCT,IMP,CNST CHARACTER(LEN=256) :: FNAME END TYPE PRJOBJ TYPE(PRJOBJ),ALLOCATABLE,DIMENSION(:),PRIVATE :: PRJ INTEGER,PRIVATE :: NLAY,NPER,MXNLAY,IUNCONF,ISTEADY REAL,PRIVATE :: MINKD,MINC CONTAINS !###====================================================================== SUBROUTINE PMANAGERMAIN(ITYPE,MESSAGE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ITYPE TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE INTEGER :: I SELECT CASE (ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE1) CASE (ID_TREEVIEW1) CALL PMANAGERFIELDS() END SELECT CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_CLEAN) CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to refresh the Project Manager?','Question') IF(WINFODIALOG(4).EQ.1)THEN DO I=1,SIZE(TOPICS); CALL PMANAGER_DEALLOCATE(I); ENDDO CALL PMANAGERUPDATE(0,0,0) ENDIF CASE (ID_DRAW) CALL PMANAGERDRAW() CASE (ID_PROPERTIES) CALL PMANAGEROPEN() CASE (ID_OPENRUN,ID_SAVERUN) IF(PMANAGERRUN(MESSAGE%VALUE1,''))THEN; ENDIF CASE (ID_OPEN,ID_SAVE) IF(PMANAGERPRJ(MESSAGE%VALUE1,''))THEN; ENDIF CASE (ID_DELETE) CALL PMANAGERDELETE() CASE (IDCANCEL) CALL PMANAGERCLOSE() CASE (IDHELP) CALL IMODGETHELP('3.3.6','iMOD Project Manager') END SELECT END SELECT END SUBROUTINE PMANAGERMAIN !###====================================================================== SUBROUTINE PMANAGEROPEN() !###====================================================================== IMPLICIT NONE INTEGER :: I,II,J,K,N,M,ITYPE,ID,IOS,IPER,IFILE,ITOPIC,IST,IYR,IMH,IDY,ISUBTOPIC,IDATE,NPER,ISYS,NSYS,IOPTION TYPE(WIN_MESSAGE) :: MESSAGE CHARACTER(LEN=256) :: CNAME CHARACTER(LEN=3) :: EXT LOGICAL :: LEX,LNEW CHARACTER(LEN=MAXLEN) :: CD INTEGER,ALLOCATABLE,DIMENSION(:) :: ILAY,ISORT CALL WDIALOGSELECT(ID_DPMANAGER); CALL WDIALOGGETTREEVIEW(ID_TREEVIEW1,ID,CNAME) !## get the right topics, attributes from the tree-view IF(.NOT.PMANAGER_GETSELECTED(ID,ITOPIC,IPER,ISYS,ISUBTOPIC,1))RETURN N=TOPICS(ITOPIC)%NSUBTOPICS; ALLOCATE(PRJ(N)) CALL WDIALOGLOAD(ID_DPMANAGEROPEN,ID_DPMANAGEROPEN) !## add a new period !## add a new system for current period IF(IPER.EQ.0.OR.ISYS.EQ.0)THEN PRJ%ILAY =1 PRJ%FCT =1.0 PRJ%IMP =0.0 PRJ%CNST =-999.99 PRJ%ICNST=1 PRJ%FNAME='' PRJ%IACT =1 CALL IOSDATE(IYR,IMH,IDY) CALL WDIALOGPUTSTRING(IDOK,'Add New Parameter') LNEW=.FALSE.; IF(IPER.EQ.0)LNEW=.TRUE. !## edit an existing system ELSE DO ISUBTOPIC=1,TOPICS(ITOPIC)%NSUBTOPICS PRJ(ISUBTOPIC)%FNAME=TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME PRJ(ISUBTOPIC)%FCT =TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FCT PRJ(ISUBTOPIC)%IMP =TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%IMP PRJ(ISUBTOPIC)%CNST =TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%CNST PRJ(ISUBTOPIC)%ICNST=TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST PRJ(ISUBTOPIC)%ILAY =TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ILAY PRJ(ISUBTOPIC)%IACT =TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%IACT ENDDO CALL WDIALOGPUTSTRING(IDOK,'Adjust Existing Parameter') LNEW=.FALSE. ENDIF IOPTION=1 IF(IPER.GT.0)THEN IF(TOPICS(ITOPIC)%TIMDEP)THEN READ(TOPICS(ITOPIC)%STRESS(IPER)%CDATE,*,IOSTAT=IOS) IDATE IF(IOS.EQ.0)THEN CALL IDATETOGDATE(IDATE,IYR,IMH,IDY) CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO4) ELSE CALL IOSDATE(IYR,IMH,IDY) !## check whether available period selected DO I=1,NPERIOD; IF(TRIM(UTL_CAP(TOPICS(ITOPIC)%STRESS(IPER)%CDATE,'U')).EQ.TRIM(UTL_CAP(PERIOD(I)%NAME,'U')))EXIT; ENDDO IF(I.LE.NPERIOD)THEN IOPTION=I CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO5) ELSE CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO3) ENDIF ENDIF ENDIF ENDIF SELECT CASE (ITOPIC) CASE (21) EXT='IPF' CASE (29) EXT='ISG' CASE (15) EXT='GEN' CASE DEFAULT EXT='IDF' END SELECT IST=1 CALL WDIALOGTITLE('Define Characteristics for: '//TRIM(TOPICS(ITOPIC)%TNAME)) ALLOCATE(MENUNAMES(TOPICS(ITOPIC)%NSUBTOPICS)) DO J=1,TOPICS(ITOPIC)%NSUBTOPICS; MENUNAMES(J)=TOPICS(ITOPIC)%SNAME(J); ENDDO CALL WDIALOGPUTMENU(IDF_MENU1,MENUNAMES,TOPICS(ITOPIC)%NSUBTOPICS,IST) DEALLOCATE(MENUNAMES) IF(NPERIOD.EQ.0)THEN CALL WDIALOGFIELDSTATE(IDF_MENU3,0) CALL WDIALOGCLEARFIELD(IDF_MENU3) ELSE CALL WDIALOGPUTMENU(IDF_MENU3,PERIOD%NAME,NPERIOD,IOPTION) CALL WDIALOGFIELDSTATE(IDF_MENU3,1) ENDIF CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPENIDF,1) CALL WDIALOGPUTIMAGE(ID_PROPERTIES,ID_ICONPROPERTIES,1) IF(.NOT.TOPICS(ITOPIC)%TIMDEP)THEN CALL WDIALOGFIELDSTATE(IDF_RADIO3,3) CALL WDIALOGFIELDSTATE(IDF_RADIO4,3) CALL WDIALOGFIELDSTATE(IDF_RADIO5,3) CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO3) CALL WDIALOGFIELDSTATE(IDF_INTEGER2,3) CALL WDIALOGFIELDSTATE(IDF_INTEGER3,3) CALL WDIALOGFIELDSTATE(IDF_MENU2,3) CALL WDIALOGFIELDSTATE(IDF_MENU3,3) CALL WDIALOGFIELDSTATE(ID_PROPERTIES,3) ENDIF CALL WDIALOGPUTMENU(IDF_MENU2,CDATE,12,IMH) CALL WDIALOGPUTINTEGER(IDF_INTEGER2,IDY) CALL WDIALOGPUTINTEGER(IDF_INTEGER3,IYR) CALL WDIALOGPUTINTEGER(IDF_INTEGER1,PRJ(1)%ILAY) CALL PMANAGERPUTFIELDS(IST) CALL PMANAGEROPENFIELDS(TOPICS(ITOPIC)%TIMDEP) CALL UTL_FILLDATES(IDF_INTEGER3,IDF_MENU2,IDF_INTEGER2) CALL WDIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_MENU1) CALL PMANAGERGETFIELDS(IST) CASE (IDF_RADIO1,IDF_RADIO2,IDF_RADIO3,IDF_RADIO4,IDF_RADIO5) CALL PMANAGEROPENFIELDS(TOPICS(ITOPIC)%TIMDEP) CASE (IDF_INTEGER2,IDF_INTEGER3,IDF_MENU2) CALL UTL_FILLDATES(IDF_INTEGER3,IDF_MENU2,IDF_INTEGER2) END SELECT SELECT CASE (MESSAGE%VALUE1) CASE (IDF_MENU1) CALL PMANAGERPUTFIELDS(IST) END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_PROPERTIES) CALL PMANAGERDEFINEPERIODS() IF(NPERIOD.GT.0)THEN CALL WDIALOGPUTMENU(IDF_MENU3,PERIOD%NAME,NPERIOD,1) CALL WDIALOGFIELDSTATE(IDF_MENU3,1) ELSE CALL WDIALOGFIELDSTATE(IDF_MENU3,0) CALL WDIALOGCLEARFIELD(IDF_MENU3) ENDIF CASE (ID_OPEN) IF(UTL_WSELECTFILE('iMOD '//TRIM(EXT)//' File (*.'//TRIM(EXT)//')|*.'//TRIM(EXT)//'|', & LOADDIALOG+MUSTEXIST+PROMPTON+DIRCHANGE+APPENDEXT,PRJ(IST)%FNAME,& 'Load iMOD '//TRIM(EXT)//' File'))THEN CALL WDIALOGPUTSTRING(IDF_STRING1,PRJ(IST)%FNAME) ENDIF CASE (IDOK) LEX=.TRUE. IF(TOPICS(ITOPIC)%TIMDEP)THEN CALL WDIALOGGETRADIOBUTTON(IDF_RADIO3,I) CD='' IF(I.EQ.1)THEN !## steady-state CD='STEADY-STATE' ELSEIF(I.EQ.2)THEN !## date CALL WDIALOGGETINTEGER(IDF_INTEGER2,IDY) CALL WDIALOGGETINTEGER(IDF_INTEGER3,IYR) CALL WDIALOGGETMENU(IDF_MENU2,IMH) WRITE(CD,'(I4.4,2I2.2)') IYR,IMH,IDY ELSEIF(I.EQ.3)THEN !## period CALL WDIALOGGETMENU(IDF_MENU3,I) WRITE(CD,'(A)') PERIOD(I)%NAME ENDIF IF(LNEW)THEN !## test whether date has been defined allready N=0; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))N=SIZE(TOPICS(ITOPIC)%STRESS) DO I=1,N IF(TRIM(UTL_CAP(TOPICS(ITOPIC)%STRESS(I)%CDATE,'U')).EQ.TRIM(UTL_CAP(CD,'U')))THEN !## defined allready CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Entered date ['//TRIM(CD)//'] has been defined allready.','Information') LEX=.FALSE. ENDIF ENDDO ENDIF ENDIF IF(LEX)THEN CALL WDIALOGGETINTEGER(IDF_INTEGER1,PRJ(1)%ILAY) PRJ(1:SIZE(PRJ))%ILAY=PRJ(1)%ILAY CALL PMANAGERGETFIELDS(IST) EXIT ENDIF CASE (IDCANCEL) EXIT END SELECT END SELECT ENDDO CALL WDIALOGUNLOAD() IF(MESSAGE%VALUE1.EQ.IDOK)THEN !## create new period CALL PMANAGER_STRESSES(ITOPIC,IPER) !## create new system CALL PMANAGER_SYSTEMS(ITOPIC,IPER,ISYS) TOPICS(ITOPIC)%STRESS(IPER)%CDATE=CD DO ISUBTOPIC=1,TOPICS(ITOPIC)%NSUBTOPICS TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%IACT =PRJ(ISUBTOPIC)%IACT TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME=PRJ(ISUBTOPIC)%FNAME TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FCT =PRJ(ISUBTOPIC)%FCT TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%IMP =PRJ(ISUBTOPIC)%IMP TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST=PRJ(ISUBTOPIC)%ICNST TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%CNST =PRJ(ISUBTOPIC)%CNST TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ILAY =PRJ(ISUBTOPIC)%ILAY IF(PRJ(ISUBTOPIC)%ICNST.EQ.2)THEN TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ALIAS= & UTL_CAP(TRIM(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME & (INDEX(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME,'\',.TRUE.)+1:)),'L') ENDIF ENDDO !## 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 CALL PMANAGERUPDATE(ITOPIC,IPER,ISYS) ENDIF DEALLOCATE(PRJ) END SUBROUTINE PMANAGEROPEN !###====================================================================== SUBROUTINE PMANAGERDEFINEPERIODS() !###====================================================================== IMPLICIT NONE INTEGER :: ITYPE,IMH1,IDY1,IMH2,IDY2,I,IOPTION TYPE(WIN_MESSAGE) :: MESSAGE CALL WDIALOGLOAD(ID_DPMANAGERDATES,ID_DPMANAGERDATES) CALL WDIALOGPUTIMAGE(ID_NEW,ID_ICONNEW,1) CALL WDIALOGPUTIMAGE(ID_DELETE,ID_ICONDELETE,1) CALL WDIALOGPUTIMAGE(ID_RENAME,ID_ICONRENAME,1) !## enter artificial year to be able to use generic routine CALL WDIALOGPUTINTEGER(IDF_INTEGER3,2000) IF(.NOT.PMANAGERDEFINEPERIODS_INIT())THEN CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(ID_DPMANAGEROPEN) RETURN ENDIF !## display dialog CALL WDIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) !## current field SELECT CASE (MESSAGE%VALUE2) CASE (IDF_MENU3) IF(MESSAGE%VALUE1.EQ.MESSAGE%VALUE2)CALL PMANAGERDEFINEPERIODS_PUT() CASE (IDF_MENU1) CALL UTL_FILLDATES(IDF_INTEGER3,IDF_MENU1,IDF_INTEGER1) CASE (IDF_MENU2) CALL UTL_FILLDATES(IDF_INTEGER5,IDF_MENU2,IDF_INTEGER2) END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_DELETE) CALL WDIALOGGETMENU(IDF_MENU3,IOPTION) CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to delete selected'//CHAR(13)// & 'period: ['//TRIM(PERIOD(IOPTION)%NAME)//']','Question') IF(WINFODIALOG(4).EQ.1)THEN DO I=IOPTION,SIZE(PERIOD)-1; PERIOD(I)=PERIOD(I+1); ENDDO; NPERIOD=MAX(NPERIOD-1,0) ENDIF IF(.NOT.PMANAGERDEFINEPERIODS_INIT())EXIT CASE (ID_NEW) CALL WDIALOGSELECT(ID_DPMANAGERDATES); CALL WDIALOGGETMENU(IDF_MENU3,IOPTION) CALL PMANAGERDEFINEPERIODS_GET(IOPTION) CALL PMANAGERDEFINEPERIODS_RENAME(0) CASE (ID_RENAME) CALL PMANAGERDEFINEPERIODS_RENAME(1) CASE (IDOK) CALL WDIALOGSELECT(ID_DPMANAGERDATES); CALL WDIALOGGETMENU(IDF_MENU3,IOPTION) CALL PMANAGERDEFINEPERIODS_GET(IOPTION); EXIT CASE (IDCANCEL) EXIT CASE (IDHELP) END SELECT END SELECT ENDDO CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(ID_DPMANAGEROPEN) END SUBROUTINE PMANAGERDEFINEPERIODS !###====================================================================== LOGICAL FUNCTION PMANAGERDEFINEPERIODS_INIT() !###====================================================================== IMPLICIT NONE PMANAGERDEFINEPERIODS_INIT=.FALSE. IF(NPERIOD.EQ.0)THEN CALL PMANAGERDEFINEPERIODS_RENAME(0) !## cannot start unless nperiod>0 IF(NPERIOD.EQ.0)THEN CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(ID_DPMANAGERDATES); RETURN ENDIF ELSE !## fill in menu CALL WDIALOGPUTMENU(IDF_MENU3,PERIOD%NAME,NPERIOD,1) CALL PMANAGERDEFINEPERIODS_PUT() IF(NPERIOD.GE.SIZE(PERIOD))CALL WDIALOGFIELDSTATE(ID_NEW,0) ENDIF PMANAGERDEFINEPERIODS_INIT=.TRUE. END FUNCTION PMANAGERDEFINEPERIODS_INIT !###====================================================================== SUBROUTINE PMANAGERDEFINEPERIODS_RENAME(ICODE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ICODE INTEGER :: IOPTION,ITYPE,I TYPE(WIN_MESSAGE) :: MESSAGE !## define new period IF(ICODE.EQ.0)THEN NPERIOD=NPERIOD+1; IOPTION=NPERIOD PERIOD(IOPTION)%NAME='' PERIOD(IOPTION)%IMH(1)=4; PERIOD(IOPTION)%IDY(1)=1; PERIOD(IOPTION)%IYR(1)=2014 PERIOD(IOPTION)%IMH(2)=9; PERIOD(IOPTION)%IDY(2)=31; PERIOD(IOPTION)%IYR(2)=2014 !## use existing one ELSE CALL WDIALOGGETMENU(IDF_MENU3,IOPTION) ENDIF CALL WDIALOGLOAD(ID_POLYGONSHAPENAME,ID_POLYGONSHAPENAME) CALL WDIALOGSHOW(-1,-1,0,3) CALL WDIALOGPUTSTRING(IDF_LABEL1,'Enter a new name') IF(IOPTION.EQ.0)CALL WDIALOGPUTSTRING(IDF_STRING1,'...') IF(IOPTION.GT.0)CALL WDIALOGPUTSTRING(IDF_STRING1,TRIM(PERIOD(IOPTION)%NAME)) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDOK) CALL WDIALOGGETSTRING(IDF_STRING1,PERIOD(IOPTION)%NAME) IF(TRIM(PERIOD(IOPTION)%NAME).EQ.'')THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You should specify a name of at least 1 character','Warning') ELSE DO I=1,NPERIOD IF(I.EQ.IOPTION)CYCLE IF(UTL_CAP(TRIM(PERIOD(I)%NAME),'U').EQ.UTL_CAP(TRIM(PERIOD(IOPTION)%NAME),'U'))THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Given name has defined allready.'//CHAR(13)// & 'You should specify an unique name','Warning') EXIT ENDIF ENDDO IF(I.GT.NPERIOD)EXIT ENDIF CASE (IDCANCEL) EXIT END SELECT END SELECT ENDDO CALL WDIALOGUNLOAD() CALL WDIALOGSELECT(ID_DPMANAGERDATES) IF(MESSAGE%VALUE1.EQ.IDOK)THEN CALL WDIALOGPUTMENU(IDF_MENU3,PERIOD%NAME,NPERIOD,IOPTION) CALL PMANAGERDEFINEPERIODS_PUT() ELSEIF(MESSAGE%VALUE1.EQ.IDCANCEL)THEN NPERIOD=NPERIOD-1 ENDIF IF(NPERIOD.GE.SIZE(PERIOD))CALL WDIALOGFIELDSTATE(ID_NEW,0) END SUBROUTINE PMANAGERDEFINEPERIODS_RENAME !###====================================================================== SUBROUTINE PMANAGERDEFINEPERIODS_PUT() !###====================================================================== IMPLICIT NONE INTEGER :: IOPTION,I CALL WDIALOGSELECT(ID_DPMANAGERDATES) CALL WDIALOGGETMENU(IDF_MENU3,IOPTION) CALL WDIALOGGETINTEGER(IDF_INTEGER4,I) !## make copy of entered data first, before overwrite it with new one IF(I.NE.IOPTION)CALL PMANAGERDEFINEPERIODS_GET(I) CALL WDIALOGPUTINTEGER(IDF_INTEGER4,IOPTION) CALL WDIALOGPUTMENU(IDF_MENU1,CDATE,12,PERIOD(IOPTION)%IMH(1)) CALL WDIALOGPUTINTEGER(IDF_INTEGER1 ,PERIOD(IOPTION)%IDY(1)) CALL WDIALOGPUTINTEGER(IDF_INTEGER3 ,PERIOD(IOPTION)%IYR(1)) CALL WDIALOGPUTMENU(IDF_MENU2,CDATE,12,PERIOD(IOPTION)%IMH(2)) CALL WDIALOGPUTINTEGER(IDF_INTEGER2 ,PERIOD(IOPTION)%IDY(2)) CALL WDIALOGPUTINTEGER(IDF_INTEGER5 ,PERIOD(IOPTION)%IYR(2)) CALL UTL_FILLDATES(IDF_INTEGER3,IDF_MENU1,IDF_INTEGER1) CALL UTL_FILLDATES(IDF_INTEGER5,IDF_MENU2,IDF_INTEGER2) END SUBROUTINE PMANAGERDEFINEPERIODS_PUT !###====================================================================== SUBROUTINE PMANAGERDEFINEPERIODS_GET(IOPTION) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IOPTION IF(IOPTION.GT.0)THEN CALL WDIALOGGETMENU(IDF_MENU1 ,PERIOD(IOPTION)%IMH(1)) CALL WDIALOGGETINTEGER(IDF_INTEGER1,PERIOD(IOPTION)%IDY(1)) CALL WDIALOGGETINTEGER(IDF_INTEGER3,PERIOD(IOPTION)%IYR(1)) CALL WDIALOGGETMENU(IDF_MENU2 ,PERIOD(IOPTION)%IMH(2)) CALL WDIALOGGETINTEGER(IDF_INTEGER2,PERIOD(IOPTION)%IDY(2)) CALL WDIALOGGETINTEGER(IDF_INTEGER5,PERIOD(IOPTION)%IYR(2)) ENDIF END SUBROUTINE PMANAGERDEFINEPERIODS_GET !###====================================================================== LOGICAL FUNCTION PMANAGER_GETSELECTED(ID,ITOPIC,IPER,ISYS,ISUBTOPIC,IERROR) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID,IERROR INTEGER,INTENT(OUT) :: ITOPIC,IPER,ISYS,ISUBTOPIC INTEGER :: NSYS PMANAGER_GETSELECTED=.FALSE. !## check what topic has been selected TOPICLOOP: DO ITOPIC=1,MAXTOPICS IPER=0; ISYS=0; ISUBTOPIC=0; IF(ID.EQ.TOPICS(ITOPIC)%ID)EXIT TOPICLOOP NPER=0; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))NPER=SIZE(TOPICS(ITOPIC)%STRESS) DO IPER=1,NPER ISYS=0; ISUBTOPIC=0 IF(ID.EQ.TOPICS(ITOPIC)%IDT(IPER))EXIT TOPICLOOP NSYS=0; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(IPER)%FILES))NSYS=SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,2) !## read for each subtopic DO ISUBTOPIC=1,TOPICS(ITOPIC)%NSUBTOPICS ISYS=0 IF(ID.EQ.TOPICS(ITOPIC)%ISD(IPER,ISUBTOPIC))THEN IF(IERROR.EQ.1)THEN CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'You should select a MAIN TOPIC, a DATE or an individual FILENAME.','Information') RETURN ELSE EXIT TOPICLOOP ENDIF ENDIF !## read for each system DO ISYS=1,NSYS IF(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ID.EQ.ID)EXIT TOPICLOOP ENDDO ENDDO ENDDO ENDDO TOPICLOOP IF(ITOPIC.GT.MAXTOPICS)THEN ITOPIC=0 CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'You should select a MAIN TOPIC at least','Information') RETURN ENDIF !## ITOPIC =TOPIC NUMBER (E.G. SHD, BND, WEL) !## IPER =STRESSPERIOD !## ISYS =SYSTEM NUMBER PMANAGER_GETSELECTED=.TRUE. END FUNCTION PMANAGER_GETSELECTED !###====================================================================== SUBROUTINE PMANAGER_STRESSES(ITOPIC,IPER) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ITOPIC INTEGER,INTENT(OUT) :: 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) 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 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) IPER=1 ENDIF END SUBROUTINE PMANAGER_STRESSES !###====================================================================== SUBROUTINE PMANAGER_SYSTEMS(ITOPIC,IPER,ISYS) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ITOPIC,IPER INTEGER,INTENT(OUT) :: ISYS INTEGER :: N,M,I,J,K !## 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 PMANAGERPUTFIELDS(IST) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(OUT) :: IST CALL WDIALOGGETMENU(IDF_MENU1,IST) CALL WDIALOGPUTREAL(IDF_REAL1,PRJ(IST)%FCT,'(F10.2)') CALL WDIALOGPUTREAL(IDF_REAL2,PRJ(IST)%IMP,'(F10.2)') CALL WDIALOGPUTREAL(IDF_REAL3,PRJ(IST)%CNST,'(F10.2)') IF(PRJ(IST)%ICNST.EQ.1)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO1) IF(PRJ(IST)%ICNST.EQ.2)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO2) CALL WDIALOGPUTSTRING(IDF_STRING1,TRIM(PRJ(IST)%FNAME)) END SUBROUTINE PMANAGERPUTFIELDS !###====================================================================== SUBROUTINE PMANAGERGETFIELDS(IST) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IST INTEGER :: I CALL WDIALOGGETREAL(IDF_REAL1,PRJ(IST)%FCT) CALL WDIALOGGETREAL(IDF_REAL2,PRJ(IST)%IMP) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,PRJ(IST)%ICNST) CALL WDIALOGGETREAL(IDF_REAL3,PRJ(IST)%CNST) CALL WDIALOGGETSTRING(IDF_STRING1,PRJ(IST)%FNAME) END SUBROUTINE PMANAGERGETFIELDS !###====================================================================== SUBROUTINE PMANAGEROPENFIELDS(LEX) !###====================================================================== IMPLICIT NONE LOGICAL,INTENT(IN) :: LEX INTEGER :: I,J,K,L CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,I) CALL WDIALOGFIELDSTATE(IDF_REAL3,ABS(I-2)) CALL WDIALOGFIELDSTATE(IDF_STRING1,ABS(I-1)) CALL WDIALOGFIELDSTATE(ID_OPEN,ABS(I-1)) IF(LEX)THEN CALL WDIALOGGETRADIOBUTTON(IDF_RADIO3,I) SELECT CASE (I) CASE (1) J=0; K=0; L=0 CASE (2) J=1; K=0; L=0 CASE (3) J=0; K=1; L=1 IF(NPERIOD.EQ.0)L=0 END SELECT CALL WDIALOGFIELDSTATE(IDF_MENU2,J) CALL WDIALOGFIELDSTATE(IDF_INTEGER2,J) CALL WDIALOGFIELDSTATE(IDF_INTEGER3,J) CALL WDIALOGFIELDSTATE(IDF_MENU3,L) CALL WDIALOGFIELDSTATE(ID_PROPERTIES,K) ENDIF END SUBROUTINE PMANAGEROPENFIELDS !###====================================================================== SUBROUTINE PMANAGERDRAW() !###====================================================================== IMPLICIT NONE INTEGER :: IPER,ITOPIC,ISYS,ID,NSYS,ISUBTOPIC CHARACTER(LEN=256) :: CNAME CALL WDIALOGSELECT(ID_DPMANAGER); CALL WDIALOGGETTREEVIEW(ID_TREEVIEW1,ID,CNAME) !## get the right topics, attributes from the tree-view IF(.NOT.PMANAGER_GETSELECTED(ID,ITOPIC,IPER,ISYS,ISUBTOPIC,0))RETURN !## major topic selected, draw everything IF(IPER.EQ.0.AND.ISYS.EQ.0.AND.ISUBTOPIC.EQ.0)THEN NPER=1; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))NPER=SIZE(TOPICS(ITOPIC)%STRESS) DO IPER=1,NPER DO ISYS=1,SIZE(TOPICS(ITOPIC)%STRESS(1)%FILES,2) DO ISUBTOPIC=1,TOPICS(ITOPIC)%NSUBTOPICS !## idf file IF(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST.EQ.2)THEN CALL IDFINIT(IDFNAMEGIVEN=TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME,LPLOT=.TRUE.) ENDIF ENDDO ENDDO ENDDO ELSEIF(IPER.GT.0.AND.ISYS.EQ.0.AND.ISUBTOPIC.EQ.0)THEN DO ISYS=1,SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,2) DO ISUBTOPIC=1,TOPICS(ITOPIC)%NSUBTOPICS !## idf file IF(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST.EQ.2)THEN CALL IDFINIT(IDFNAMEGIVEN=TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME,LPLOT=.TRUE.) ENDIF ENDDO ENDDO ELSEIF(IPER.GT.0.AND.ISYS.GT.0.AND.ISUBTOPIC.EQ.0)THEN DO ISUBTOPIC=1,TOPICS(ITOPIC)%NSUBTOPICS !## idf file IF(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST.EQ.2)THEN CALL IDFINIT(IDFNAMEGIVEN=TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME,LPLOT=.TRUE.) ENDIF ENDDO ELSEIF(IPER.GT.0.AND.ISYS.EQ.0.AND.ISUBTOPIC.GT.0)THEN DO ISYS=1,SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,2) !## idf file IF(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST.EQ.2)THEN CALL IDFINIT(IDFNAMEGIVEN=TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME,LPLOT=.TRUE.) ENDIF ENDDO ELSE CALL IDFINIT(IDFNAMEGIVEN=TOPICS(ITOPIC)%STRESS(1)%FILES(ISUBTOPIC,ISYS)%FNAME,LPLOT=.TRUE.) ENDIF END SUBROUTINE PMANAGERDRAW !###====================================================================== LOGICAL FUNCTION PMANAGERPRJ(ID,RUNFNAME) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID CHARACTER(LEN=*),INTENT(IN) :: RUNFNAME INTEGER :: IU,ITOPIC CHARACTER(LEN=256) :: FNAME PMANAGERPRJ=.FALSE. IF(ID.EQ.ID_OPEN)THEN IF(RUNFNAME.EQ.'')THEN FNAME=TRIM(PREFVAL(1))//'\RUNFILES\*.prj' IF(.NOT.UTL_WSELECTFILE('iMOD Project File (*.prj)|*.prj|', & LOADDIALOG+MUSTEXIST+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,& 'Load iMOD Project File'))RETURN ELSE FNAME=RUNFNAME ENDIF IF(.NOT.PMANAGER_LOADPRJ(FNAME))THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD can not read in the Project File','Error') ELSE CALL PMANAGERUPDATE(0,0,0); PMANAGERPRJ=.TRUE. ENDIF ELSEIF(ID.EQ.ID_SAVE)THEN IF(RUNFNAME.EQ.'')THEN FNAME=TRIM(PREFVAL(1))//'\RUNFILES\*.prj' IF(.NOT.UTL_WSELECTFILE('iMOD Project Files (*.prj)|*.prj|', & SAVEDIALOG+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,'Save iMOD Project File'))RETURN ELSE FNAME=RUNFNAME ENDIF IF(PMANAGER_SAVEPRJ(FNAME))THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Succesfully written project file:'//CHAR(13)//TRIM(FNAME),'Error') PMANAGERPRJ=.TRUE. ENDIF ENDIF END FUNCTION PMANAGERPRJ !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEPRJ(FNAME) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: FNAME INTEGER :: IU,I,J,K,L PMANAGER_SAVEPRJ=.FALSE. IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=FNAME,STATUS='REPLACE',ACTION='WRITE,DENYREAD',FORM='FORMATTED') !## write modules DO I=1,MAXTOPICS IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS))CYCLE WRITE(IU,'(I4.4,2A)') SIZE(TOPICS(I)%STRESS),',',TRIM(TOPICS(I)%TNAME) DO L=1,SIZE(TOPICS(I)%STRESS) IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS(L)%FILES))CYCLE IF(TOPICS(I)%TIMDEP)WRITE(IU,'(A)') TRIM(TOPICS(I)%STRESS(L)%CDATE) WRITE(IU,'(2(I3.3,A1))') SIZE(TOPICS(I)%STRESS(L)%FILES,1),',',SIZE(TOPICS(I)%STRESS(L)%FILES,2) DO K=1,SIZE(TOPICS(I)%STRESS(L)%FILES,1) !## systems(.) DO J=1,SIZE(TOPICS(I)%STRESS(L)%FILES,2) !## subtopics(.) WRITE(IU,'(1X,2(I1,A1),I4.4,3(A1,G15.7),A1,A)') & TOPICS(I)%STRESS(L)%FILES(K,J)%IACT ,',', & TOPICS(I)%STRESS(L)%FILES(K,J)%ICNST,',', & TOPICS(I)%STRESS(L)%FILES(K,J)%ILAY ,',', & TOPICS(I)%STRESS(L)%FILES(K,J)%FCT ,',', & TOPICS(I)%STRESS(L)%FILES(K,J)%IMP ,',', & TOPICS(I)%STRESS(L)%FILES(K,J)%CNST ,',', & CHAR(39)//TRIM(TOPICS(I)%STRESS(L)%FILES(K,J)%FNAME)//CHAR(39) ENDDO ENDDO ENDDO ENDDO WRITE(IU,'(A)') 'Periods' DO I=1,NPERIOD WRITE(IU,'(A)') '"'//TRIM(PERIOD(I)%NAME)//'",'//TRIM(ITOS(PERIOD(I)%IDY(1)))//','//TRIM(ITOS(PERIOD(I)%IMH(1)))//','// & TRIM(ITOS(PERIOD(I)%IDY(2)))//','//TRIM(ITOS(PERIOD(I)%IMH(2))) ENDDO CLOSE(IU) PMANAGER_SAVEPRJ=.TRUE. END FUNCTION PMANAGER_SAVEPRJ !###====================================================================== LOGICAL FUNCTION PMANAGER_LOADPRJ(FNAME) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: FNAME INTEGER :: IU,I,J,K,IOS,NC,NPER,L,NSYS CHARACTER(LEN=MAXLEN) :: CTOPIC CHARACTER(LEN=512) :: LINE PMANAGER_LOADPRJ=.FALSE. IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',ACTION='READ,DENYWRITE',FORM='FORMATTED') !## read modules DO READ(IU,*,IOSTAT=IOS) NPER,CTOPIC; IF(IOS.NE.0)EXIT; IF(NPER.LE.0)CYCLE I=PMANAGER_FIND_KEYWORD(CTOPIC); IF(I.LE.0)CYCLE ALLOCATE(TOPICS(I)%STRESS(NPER)) DO L=1,NPER IF(TOPICS(I)%TIMDEP)READ(IU,'(A)') TOPICS(I)%STRESS(L)%CDATE READ(IU,*) NC,NSYS IF(NC.NE.TOPICS(I)%NSUBTOPICS)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Number of parameters is not correct'//CHAR(13)//TRIM(TOPICS(I)%TNAME),'Error') CLOSE(IU); RETURN ENDIF ALLOCATE(TOPICS(I)%STRESS(L)%FILES(NC,NSYS)) DO J=1,NSYS DO K=1,TOPICS(I)%NSUBTOPICS READ(IU,'(A512)',IOSTAT=IOS) LINE IF(IOS.EQ.0)THEN READ(LINE,*,IOSTAT=IOS) & TOPICS(I)%STRESS(L)%FILES(K,J)%IACT , & TOPICS(I)%STRESS(L)%FILES(K,J)%ICNST IF(IOS.EQ.0)THEN IF(TOPICS(I)%STRESS(L)%FILES(K,J)%ICNST.EQ.1)THEN READ(LINE,*,IOSTAT=IOS) & TOPICS(I)%STRESS(L)%FILES(K,J)%IACT , & TOPICS(I)%STRESS(L)%FILES(K,J)%ICNST, & TOPICS(I)%STRESS(L)%FILES(K,J)%ILAY , & TOPICS(I)%STRESS(L)%FILES(K,J)%FCT , & TOPICS(I)%STRESS(L)%FILES(K,J)%IMP , & TOPICS(I)%STRESS(L)%FILES(K,J)%CNST TOPICS(I)%STRESS(L)%FILES(K,J)%FNAME='' ELSEIF(TOPICS(I)%STRESS(L)%FILES(K,J)%ICNST.EQ.2)THEN READ(LINE,*,IOSTAT=IOS) & TOPICS(I)%STRESS(L)%FILES(K,J)%IACT , & TOPICS(I)%STRESS(L)%FILES(K,J)%ICNST, & TOPICS(I)%STRESS(L)%FILES(K,J)%ILAY , & TOPICS(I)%STRESS(L)%FILES(K,J)%FCT , & TOPICS(I)%STRESS(L)%FILES(K,J)%IMP , & TOPICS(I)%STRESS(L)%FILES(K,J)%CNST , & TOPICS(I)%STRESS(L)%FILES(K,J)%FNAME IF(TRIM(PREFVAL(5)).NE.'')THEN TOPICS(I)%STRESS(L)%FILES(K,J)%FNAME=UTL_SUBST(TOPICS(I)%STRESS(L)%FILES(K,J)%FNAME,TRIM(REPLACESTRING),PREFVAL(5)) ENDIF TOPICS(I)%STRESS(L)%FILES(K,J)%ALIAS= & UTL_CAP(TRIM(TOPICS(I)%STRESS(L)%FILES(K,J)%FNAME(INDEX(TOPICS(I)%STRESS(L)%FILES(K,J)%FNAME,'\',.TRUE.)+1:)),'L') ENDIF ENDIF ENDIF IF(IOS.NE.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Incorrect number of input field for'//CHAR(13)//TRIM(TOPICS(I)%TNAME),'Error') CLOSE(IU); RETURN ENDIF ENDDO ENDDO ENDDO ENDDO I=0; DO READ(IU,'(A512)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT I=I+1; READ(LINE,*,IOSTAT=IOS) PERIOD(I)%NAME,PERIOD(I)%IDY(1),PERIOD(I)%IMH(1),PERIOD(I)%IDY(2),PERIOD(I)%IMH(2) IF(IOS.NE.0)THEN; I=I-1; EXIT; ENDIF ENDDO; NPERIOD=I CLOSE(IU) PMANAGER_LOADPRJ=.TRUE. END FUNCTION PMANAGER_LOADPRJ !###====================================================================== LOGICAL FUNCTION PMANAGERRUN(ID,RUNFNAME) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID CHARACTER(LEN=*),INTENT(IN) :: RUNFNAME INTEGER :: IU,ITOPIC CHARACTER(LEN=256) :: FNAME PMANAGERRUN=.FALSE. IF(ID.EQ.ID_OPENRUN)THEN IF(RUNFNAME.EQ.'')THEN FNAME=TRIM(PREFVAL(1))//'\RUNFILES\*.run' IF(.NOT.UTL_WSELECTFILE('iMOD Run File (*.run)|*.run|', & LOADDIALOG+MUSTEXIST+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,& 'Load iMOD Run File'))RETURN ELSE FNAME=RUNFNAME ENDIF IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',ACTION='READ,DENYWRITE',FORM='FORMATTED') CALL UTL_MESSAGEHANDLE(0) IF(PMANAGER_GETKEYS(IU)) THEN IF(PMANAGER_GETFILES(IU,ITOPIC))THEN CALL PMANAGERUPDATE(0,0,0); PMANAGERRUN=.TRUE. ELSE CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error reading BODY runfile '//TRIM(CMOD(ITOPIC)),'Error') ENDIF ELSE CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error reading HEADER runfile','Error') ENDIF CLOSE(IU) CALL UTL_MESSAGEHANDLE(1) ELSEIF(ID.EQ.ID_SAVERUN)THEN IF(.NOT.PMANAGER_INITSIM())RETURN IF(RUNFNAME.EQ.'')THEN FNAME=TRIM(PREFVAL(1))//'\RUNFILES\*.run' IF(.NOT.UTL_WSELECTFILE('iMOD Run Files (*.run)|*.run|', & SAVEDIALOG+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,'Save iMOD Run File'))RETURN ELSE FNAME=RUNFNAME ENDIF IF(PMANAGER_SAVERUN(FNAME))THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Succesfully written runfile:'//CHAR(13)//TRIM(FNAME),'Error') PMANAGERRUN=.TRUE. ENDIF DEALLOCATE(SIM) ENDIF END FUNCTION PMANAGERRUN !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVERUN(FNAME) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: FNAME CHARACTER(LEN=512) :: LINE INTEGER :: IU,I,J,K,N,IPER,KPER TYPE(IDFOBJ),ALLOCATABLE,DIMENSION(:) :: IDF PMANAGER_SAVERUN=.FALSE. MXNLAY=NLAY MINKD=0.10 MINC =0.01 IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=FNAME,STATUS='REPLACE',ACTION='WRITE,DENYREAD',FORM='FORMATTED') IF(IU.EQ.0)RETURN WRITE(IU,'(A)') TRIM(PREFVAL(1))//'\MODELS' WRITE(IU,'(10(I10,A1))') NLAY,',',MXNLAY,',',NPER,',',0,',',1,',',0,',',0,',',0,',',IUNCONF,',0' WRITE(IU,'(6(I10,A1),2(G10.4,A1))') 1,',',0,',',0,',',0,',',0,',',0,',',MINKD,',',MINC WRITE(IU,'(2(I10,A1),3(F10.3,A1),I10,A1,F10.3,A1,2(I10,A1))') 500,',',20,',',0.001,',',0.1,',',0.98,',',1,',',0.1,',',25,',',1 ALLOCATE(IDF(1)); CALL IDFNULLIFY(IDF(1)) IF(.NOT.IDFREAD(IDF(1),TOPICS(4)%STRESS(1)%FILES(1,1)%FNAME,0))THEN CALL IDFDEALLOCATE(IDF,SIZE(IDF)); DEALLOCATE(IDF); CLOSE(IU); RETURN ENDIF WRITE(IU,'(6(F10.2,A1))') IDF(1)%XMIN,',',IDF(1)%YMIN,',',IDF(1)%XMAX,',',IDF(1)%YMAX,',',IDF(1)%DX,',',0.0 CALL IDFDEALLOCATE(IDF,SIZE(IDF)); DEALLOCATE(IDF) WRITE(IU,'(A)') 'ACTIVE MODULES' DO I=1,MAXTOPICS IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS))CYCLE IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS(1)%FILES))CYCLE WRITE(IU,'(A)') '1,1,0 '//TRIM(TOPICS(I)%TNAME) ENDDO !## write bndfile WRITE(IU,'(A)')TRIM(TOPICS(4)%STRESS(1)%FILES(1,1)%FNAME) WRITE(IU,'(A)') 'MODULES FOR EACH LAYER' !## write modules DO I=1,MAXTOPICS IF(TOPICS(I)%TIMDEP)CYCLE IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS))CYCLE IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS(1)%FILES))CYCLE WRITE(IU,'(I3.3,A)') SIZE(TOPICS(I)%STRESS(1)%FILES,2),','//TRIM(TOPICS(I)%TNAME) !## 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) IF(TOPICS(I)%STRESS(1)%FILES(K,J)%ICNST.EQ.1)THEN WRITE(IU,'(1X,I4.4,3(A1,G15.7))') & TOPICS(I)%STRESS(1)%FILES(K,J)%ILAY,',', & TOPICS(I)%STRESS(1)%FILES(K,J)%FCT ,',', & TOPICS(I)%STRESS(1)%FILES(K,J)%IMP ,',', & TOPICS(I)%STRESS(1)%FILES(K,J)%CNST ELSEIF(TOPICS(I)%STRESS(1)%FILES(K,J)%ICNST.EQ.2)THEN WRITE(IU,'(1X,I4.4,2(A1,G15.7),A1,A)') & TOPICS(I)%STRESS(1)%FILES(K,J)%ILAY,',', & TOPICS(I)%STRESS(1)%FILES(K,J)%FCT ,',', & TOPICS(I)%STRESS(1)%FILES(K,J)%IMP ,',', & CHAR(39)//TRIM(TOPICS(I)%STRESS(1)%FILES(K,J)%FNAME)//CHAR(39) ENDIF ENDDO ENDDO ENDDO WRITE(IU,'(A)') 'PACKAGES FOR EACH LAYER AND STRESS-PERIOD ' !## write packages DO KPER=1,NPER !## steady-state IF(SIM(KPER)%DELT.EQ.0.0)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 WRITE(IU,'(I5.5,A1,F15.7,A1,A,2(A1,I1),A)') KPER,',',SIM(KPER)%DELT,',',TRIM(SIM(KPER)%CDATE),',',SIM(KPER)%ISAVE,',',SIM(KPER)%ISUM, & ','//TRIM(SIM(KPER+1)%CDATE) ENDIF DO I=1,MAXTOPICS IF(.NOT.TOPICS(I)%TIMDEP)CYCLE IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS))CYCLE IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS(1)%FILES))CYCLE !## get appropriate stress-period to store in runfile IF(KPER.EQ.1)THEN IPER=PMANAGER_GETIPER(SIM(KPER)%CDATE ,SIM(KPER)%CDATE,TOPICS(I)%STRESS) ELSE IPER=PMANAGER_GETIPER(SIM(KPER-1)%CDATE,SIM(KPER)%CDATE,TOPICS(I)%STRESS) ENDIF !## reuse previous timestep IF(IPER.LE.0)THEN WRITE(IU,'(I3,A)') IPER,','//TRIM(TOPICS(I)%TNAME) ELSE WRITE(IU,'(I3,A)') SIZE(TOPICS(I)%STRESS(IPER)%FILES,2),','//TRIM(TOPICS(I)%TNAME) !## 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) IF(TOPICS(I)%STRESS(1)%FILES(K,J)%ICNST.EQ.1)THEN WRITE(IU,'(1X,I4.4,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(1)%FILES(K,J)%ICNST.EQ.2)THEN WRITE(IU,'(1X,I4.4,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 ENDDO ENDDO CLOSE(IU) PMANAGER_SAVERUN=.TRUE. END FUNCTION PMANAGER_SAVERUN !###====================================================================== SUBROUTINE PMANAGER_GETNPER(JD1,JD2) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: JD1,JD2 INTEGER :: I,II,J,K,MND,MXD,IOS,IDATE,ID,IYR,JDP1,JDP2 INTEGER,ALLOCATABLE,DIMENSION(:) :: JLIST NPER=JD2-JD1+1; ALLOCATE(JLIST(NPER)); JLIST=0 !## fill in jd1 as first stressperiod and jd2 as last stressperiod JLIST(1)=1; JLIST(NPER)=1 !## fill in list DO I=1,MAXTOPICS IF(.NOT.TOPICS(I)%TIMDEP)CYCLE IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS))CYCLE IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS(1)%FILES))CYCLE DO J=1,SIZE(TOPICS(I)%STRESS) !## skip steady-state IF(TRIM(UTL_CAP(TOPICS(I)%STRESS(J)%CDATE,'U')).EQ.'STEADY-STATE')CYCLE !## check whether a period is available DO K=1,NPERIOD IF(TRIM(UTL_CAP(TOPICS(I)%STRESS(J)%CDATE,'U')).EQ.TRIM(UTL_CAP(PERIOD(K)%NAME,'U')))EXIT ENDDO !## see whether the current stress is within mentioned period IF(K.LE.NPERIOD)THEN IYR=PERIOD(J)%IYR(1)-1 DO II=PERIOD(J)%IYR(1),PERIOD(J)%IYR(2) IYR=IYR+1 !## construct julian day for start of period JDP1=JD(IYR,PERIOD(J)%IDY(1),PERIOD(J)%IMH(1)) ID =JDP1-JD1+1; IF(ID.GT.0.AND.ID.LE.NPER)JLIST(ID)=1 IF(PERIOD(J)%IMH(2).LT.PERIOD(J)%IMH(1))THEN IYR=IYR+1 ELSEIF(PERIOD(J)%IMH(1).EQ.PERIOD(J)%IMH(2).AND.PERIOD(J)%IDY(2).LT.PERIOD(J)%IDY(1))THEN IYR=IYR+1 ENDIF !## construct julian day for end of period JDP2=JD(IYR,PERIOD(J)%IDY(2),PERIOD(J)%IMH(2)) ID =JDP2-JD1+2; IF(ID.GT.0.AND.ID.LE.NPER)JLIST(ID)=1 ENDDO ELSE READ(TOPICS(I)%STRESS(J)%CDATE,*,IOSTAT=IOS) IDATE; IF(IOS.NE.0)CYCLE ID=IDATETOJDATE(IDATE); ID=ID-JD1+1; IF(ID.GT.0.AND.ID.LE.NPER)JLIST(ID)=1 ENDIF ENDDO ENDDO !## count dates available NPER=0; DO I=1,SIZE(JLIST); IF(JLIST(I).EQ.1)NPER=NPER+1; ENDDO IF(NPER.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'No stress-periods found in the packages.','Warning') ELSE ALLOCATE(IDT(NPER)) NPER=0; DO I=1,SIZE(JLIST) IF(JLIST(I).EQ.1)THEN; NPER=NPER+1; IDT(NPER)=I+JD1-1; ENDIF ENDDO ENDIF DEALLOCATE(JLIST) END SUBROUTINE PMANAGER_GETNPER !###====================================================================== INTEGER FUNCTION PMANAGER_GETIPER(CDATE1,CDATE2,STRESS) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: CDATE1,CDATE2 TYPE(STRESSOBJ),INTENT(IN),DIMENSION(:) :: STRESS INTEGER :: I,J,K,IDATE,JD1,JD2,JDI,MD,ID,IOS,IYR,IMH,IDY,JDP1,JDP2 !## initially nothing found PMANAGER_GETIPER=0 !## look for steady-state IF(TRIM(UTL_CAP(CDATE2,'U')).EQ.'STEADY-STATE')THEN DO I=1,SIZE(STRESS) IF(TRIM(UTL_CAP(STRESS(I)%CDATE,'U')).EQ.'STEADY-STATE')THEN PMANAGER_GETIPER=I; RETURN ENDIF ENDDO !## transient ELSE !## get time-interval window JD2=0 ; READ(CDATE2,*,IOSTAT=IOS) IDATE; IF(IOS.EQ.0)JD2=IDATETOJDATE(IDATE) JD1=JD2; READ(CDATE1,*,IOSTAT=IOS) IDATE; IF(IOS.EQ.0)JD1=IDATETOJDATE(IDATE) !## might be a sequence of steady-state IF(JD1.EQ.JD2)THEN !## apply minus one ID=-1 ELSE !## look for nearest package to current timestep MD=10E5; 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 !## loop over years IYR=PERIOD(J)%IYR(1)-1 DO K=PERIOD(J)%IYR(1),PERIOD(J)%IYR(2) IYR=IYR+1 !## construct julian day for start of period JDP1=JD(IYR,PERIOD(J)%IDY(1),PERIOD(J)%IMH(1)) IF(PERIOD(J)%IMH(2).LT.PERIOD(J)%IMH(1))THEN IYR=IYR+1 ELSEIF(PERIOD(J)%IMH(1).EQ.PERIOD(J)%IMH(2).AND.PERIOD(J)%IDY(2).LT.PERIOD(J)%IDY(1))THEN IYR=IYR+1 ENDIF !## construct julian day for end of period JDP2=JD(IYR,PERIOD(J)%IDY(2),PERIOD(J)%IMH(2)) IF(JD2.GE.JDP1.AND.JD2.LE.JDP2)THEN !## if inside period, set equal to start of period JDI=JDP1; EXIT ELSE !## if outside, set equal to stressperiod+1 JDI=JD2+1 ENDIF ENDDO ELSE READ(STRESS(I)%CDATE,*,IOSTAT=IOS) IDATE !## error reading date IF(IOS.NE.0)CYCLE !## current date JDI=IDATETOJDATE(IDATE) ENDIF !## defined before/equal to current timestep and after previous timestep IF(JD2-JDI.LE.MD.AND.JD2-JDI.GE.0)THEN MD=JD2-JDI IF(JDI.GT.JD1)THEN ID= I ELSE ID=-I ENDIF ENDIF ENDDO ENDIF !## nothing found ??? IF(ID.EQ.0)THEN PMANAGER_GETIPER=0 !## use previous input ELSEIF(ID.LT.0)THEN PMANAGER_GETIPER=-1 !## number of systems for current stress period ELSE PMANAGER_GETIPER=SIZE(STRESS(ID)%FILES,2) ENDIF ENDIF END FUNCTION PMANAGER_GETIPER !###====================================================================== LOGICAL FUNCTION PMANAGER_INITSIM() !###====================================================================== IMPLICIT NONE INTEGER :: ITYPE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: IDY,IYR,IMH,ITOPIC,IPER,I,J,MINJD,MAXJD,IOS,IDATE,ISS,JD1,JD2,IPERIOD PMANAGER_INITSIM=.FALSE. CALL WDIALOGLOAD(ID_DPMANAGER_SIM,ID_DPMANAGER_SIM) CALL WDIALOGPUTMENU(IDF_MENU4,(/'Daily ','Weekly ','Monthly ','Yearly ','Packages'/),5,1) !## get maximal number of layers MXNLAY=999 DO ITOPIC=2,12 IF(.NOT.ASSOCIATED(TOPICS(ITOPIC)%STRESS))CYCLE IF(.NOT.ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))CYCLE NLAY=-999 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) NLAY=MAX(NLAY,TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,J)%ILAY) ENDDO ENDDO ENDDO SELECT CASE (ITOPIC) CASE (8,9) NLAY=NLAY+1 END SELECT MXNLAY=MIN(MXNLAY,NLAY) ENDDO CALL WDIALOGPUTINTEGER(IDF_INTEGER1,MXNLAY) CALL WDIALOGRANGEINTEGER(IDF_INTEGER1,1,MXNLAY) ISTEADY=0; MINJD=10E7; MAXJD=-10E7 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(TOPICS(ITOPIC)%STRESS(IPER)%CDATE).EQ.'STEADY-STATE')THEN ISTEADY=1 ELSE READ(TOPICS(ITOPIC)%STRESS(IPER)%CDATE,*,IOSTAT=IOS) IDATE IF(IOS.EQ.0)THEN CALL IDATETOGDATE(IDATE,IYR,IMH,IDY) IDATE=IDATETOJDATE(IYR*10000+IMH*100+IDY) MINJD=MIN(MINJD,IDATE); MAXJD=MAX(MAXJD,IDATE) ELSE CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Can not convert date ['//TRIM(TOPICS(ITOPIC)%STRESS(IPER)%CDATE)//'] for'//CHAR(13)// & 'Topic '//TRIM(TOPICS(ITOPIC)%TNAME),'Warning') ENDIF ENDIF ENDDO ENDDO !## no transient data found IF(MINJD.GT.MAXJD)THEN IF(ISTEADY.EQ.0)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'No steady-state or transient data found','Warning') IMH=3; IYR=1970; IDY=8 CALL WDIALOGFIELDSTATE(IDF_RADIO2,0) CALL WDIALOGPUTMENU(IDF_MENU2,CDATE,12,IMH) CALL WDIALOGPUTINTEGER(IDF_INTEGER2,IDY) CALL WDIALOGPUTINTEGER(IDF_INTEGER3,IYR) CALL WDIALOGPUTMENU(IDF_MENU3,CDATE,12,IMH) CALL WDIALOGPUTINTEGER(IDF_INTEGER4,IDY) CALL WDIALOGPUTINTEGER(IDF_INTEGER5,IYR) !## transient data found ELSE IF(ISTEADY.EQ.0)THEN CALL WDIALOGFIELDSTATE(IDF_RADIO1,0) CALL WDIALOGFIELDSTATE(IDF_CHECK2,0) ELSE CALL WDIALOGPUTCHECKBOX(IDF_CHECK2,1) ENDIF CALL GDATE(MINJD,IYR,IMH,IDY) CALL WDIALOGPUTMENU(IDF_MENU2,CDATE,12,IMH) CALL WDIALOGPUTINTEGER(IDF_INTEGER2,IDY) CALL WDIALOGPUTINTEGER(IDF_INTEGER3,IYR) CALL GDATE(MAXJD,IYR,IMH,IDY) CALL WDIALOGPUTMENU(IDF_MENU3,CDATE,12,IMH) CALL WDIALOGPUTINTEGER(IDF_INTEGER4,IDY) CALL WDIALOGPUTINTEGER(IDF_INTEGER5,IYR) ENDIF I=0 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))I=1 !## khv ENDIF CALL WDIALOGFIELDSTATE(IDF_CHECK1,I) !## iunconf CALL PMANAGER_INITSIM_FIELDS() CALL WDIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_RADIO1,IDF_RADIO2) 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 (IDOK) !## get steady-=transient simulation option, ISS=1 steady, ISS=2 transient CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,ISS) IF(ISS.EQ.2)THEN CALL UTL_FILLDATES(IDF_INTEGER3,IDF_MENU2,IDF_INTEGER2,JD1) CALL UTL_FILLDATES(IDF_INTEGER5,IDF_MENU3,IDF_INTEGER4,JD2) !## get periods 1=Daily,2=Weekly,3=Monthly,4=Yearly CALL WDIALOGGETMENU(IDF_MENU4,IPERIOD) SELECT CASE (IPERIOD) CASE (1) !## daily NPER=JD2-JD1; NPER=NPER+1; ALLOCATE(IDT(NPER)); IDT=0 IDT(1)=JD1; I=1; DO; I=I+1; IDT(I)=IDT(I-1)+1; IF(IDT(I).GE.JD2)EXIT; ENDDO IDT(I)=MIN(IDT(I),JD2) CASE (2) !## weekly NPER=JD2-JD1; NPER=NPER+1; NPER=CEILING(REAL(NPER)/7.0)+1; ALLOCATE(IDT(NPER)); IDT=0 IDT(1)=JD1; I=1; DO; I=I+1; IDT(I)=IDT(I-1)+7; IF(IDT(I).GE.JD2)EXIT; ENDDO IDT(I)=MIN(IDT(I),JD2) CASE (3) !## monthly NPER=JD2-JD1; NPER=NPER+1; NPER=CEILING(REAL(NPER)/28.0)+1; ALLOCATE(IDT(NPER)); IDT=0 IDT(1)=JD1; I=1; DO; I=I+1 CALL GDATE(IDT(I-1),IYR,IMH,IDY) IDT(I)=IDT(I-1)+WDATEDAYSINMONTH(IYR,IMH) IF(IDT(I).GE.JD2)EXIT ENDDO IDT(I)=MIN(IDT(I),JD2) CASE (4) !## yearly NPER=JD2-JD1; NPER=NPER+1; NPER=CEILING(REAL(NPER)/360.0)+1; ALLOCATE(IDT(NPER)); IDT=0 IDT(1)=JD1; I=1; DO; I=I+1 CALL GDATE(IDT(I-1),IYR,IMH,IDY) IDT(I)=IDT(I-1); DO I=1,12 IDT(I)=IDT(I-1)+WDATEDAYSINMONTH(IYR,IMH) IF(IDT(I).GE.JD2)EXIT IMH=IMH+1; IF(IMH.GT.12)THEN; IMH=1; IYR=IYR+1; ENDIF ENDDO ENDDO IDT(I)=MIN(IDT(I),JD2) CASE (5) !## packages CALL PMANAGER_GETNPER(JD1,JD2) END SELECT IF(NPER.GT.0)THEN !## determine nper DO I=1,SIZE(IDT); IF(IDT(I).EQ.0)EXIT; ENDDO; NPER=I-1 EXIT ENDIF ELSE NPER=0 ENDIF CASE (IDCANCEL) EXIT END SELECT END SELECT ENDDO CALL WDIALOGUNLOAD(); IF(MESSAGE%VALUE1.EQ.IDCANCEL)RETURN !## use initial steady-state step CALL WDIALOGGETCHECKBOX(IDF_CHECK2,ISTEADY) NPER=NPER+ISTEADY ALLOCATE(SIM(NPER)) IF(ISTEADY.EQ.1)THEN SIM(1)%CDATE='STEADY-STATE'; SIM(1)%DELT=0.0; SIM(1)%ISAVE=1; SIM(1)%ISUM=0 ENDIF DO I=1,NPER-ISTEADY SIM(I+1)%CDATE=TRIM(ITOS(JDATETOIDATE(IDT(I)))) IF(I+1.GT.SIZE(IDT))THEN SIM(I+1)%DELT =0.0 ELSE SIM(I+1)%DELT =IDT(I+1)-IDT(I) ENDIF SIM(I+1)%ISAVE=1 SIM(I+1)%ISUM =0 ENDDO NPER=NPER-1 DEALLOCATE(IDT) !## number of modellayers CALL WDIALOGGETINTEGER(IDF_INTEGER1,NLAY) !## apply unconfinedness CALL WDIALOGGETCHECKBOX(IDF_CHECK1,IUNCONF) PMANAGER_INITSIM=.TRUE. END FUNCTION PMANAGER_INITSIM !###====================================================================== SUBROUTINE PMANAGER_INITSIM_FIELDS() !###====================================================================== IMPLICIT NONE INTEGER :: I 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_INTEGER2,I-1) CALL WDIALOGFIELDSTATE(IDF_INTEGER3,I-1) CALL WDIALOGFIELDSTATE(IDF_INTEGER4,I-1) CALL WDIALOGFIELDSTATE(IDF_INTEGER5,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) END SUBROUTINE PMANAGER_INITSIM_FIELDS !###====================================================================== LOGICAL FUNCTION PMANAGER_GETKEYS(IU) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IU INTEGER :: I,J,IOS CHARACTER(LEN=256) :: LINE PMANAGER_GETKEYS=.FALSE. DO I=1,SIZE(TOPICS); CALL PMANAGER_DEALLOCATE(I); ENDDO READ(IU,*,IOSTAT=IOS); IF(IOS.NE.0)RETURN READ(IU,*,IOSTAT=IOS) NLAY,NLAY,NPER; IF(IOS.NE.0)RETURN !## 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; J=J+1 ELSE 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,J,IOS,IPER,KPER,NSYS,ISYS CHARACTER(LEN=256) :: LINE CHARACTER(LEN=52) :: CDATE,C REAL :: DELT,CNST PMANAGER_GETFILES=.FALSE. !## find available files for different keys CDATE='' 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 !## create stress-period IPER=0; CALL PMANAGER_STRESSES(ITOPIC,IPER) !## create systems ALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%FILES(TOPICS(ITOPIC)%NSUBTOPICS,NSYS)) IF(TOPICS(ITOPIC)%TIMDEP)TOPICS(ITOPIC)%STRESS(IPER)%CDATE=CDATE DO I=1,TOPICS(ITOPIC)%NSUBTOPICS DO ISYS=1,NSYS SELECT CASE (ITOPIC) CASE (1) !## cap READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)RETURN ! READ(LINE,*,IOSTAT=IOS) FILES(J)%FCT,FILES(J)%IMP,FILES(J)%FNAME ! IF(IOS.NE.0)THEN; READ(LINE,*,IOSTAT=IOS) FILES(J)%FNAME; FILES(J)%FCT='NaN'; FILES(J)%IMP='NaN'; ENDIF ! IF(IOS.NE.0)RETURN; FILES(J)%ILAY='NaN' CASE (13) !## pwt ! READ(IU,*,IOSTAT=IOS) FILES(J)%FCT,FILES(J)%IMP,FILES(J)%FNAME; IF(IOS.NE.0)RETURN; FILES(J)%ILAY='NaN' CASE (29) !## isg ! READ(IU,*,IOSTAT=IOS) FILES(J)%ILAY,FILES(J)%FNAME; IF(IOS.NE.0)RETURN; FILES(J)%FCT='NaN'; FILES(J)%IMP='NaN' 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 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 ENDIF ENDIF ENDDO PMANAGER_GETFILES=.TRUE. ! END FUNCTION PMANAGER_GETFILES !###====================================================================== SUBROUTINE PMANAGERDELETE() !###====================================================================== IMPLICIT NONE INTEGER :: ID,ITOPIC,IPER,ISYS,ISUBTOPIC,I,J,K,N,M CHARACTER(LEN=256) :: CNAME,STRING CALL WDIALOGSELECT(ID_DPMANAGER); CALL WDIALOGGETTREEVIEW(ID_TREEVIEW1,ID,CNAME) !## get the right topics and attribute from the treeview IF(.NOT.PMANAGER_GETSELECTED(ID,ITOPIC,IPER,ISYS,ISUBTOPIC,1))RETURN !## remove/clean entire topic IF(IPER+ISYS+ISUBTOPIC.EQ.0)THEN CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to delete the content'//CHAR(13)// & 'for the topic ['//TRIM(TOPICS(ITOPIC)%TNAME)//']','Question'); IF(WINFODIALOG(4).NE.1)RETURN CALL PMANAGER_DEALLOCATE(ITOPIC) !## update the project manager for changes CALL PMANAGERUPDATE(0,0,0) ELSEIF(IPER.NE.0.AND.ISYS.NE.0.AND.ISUBTOPIC.NE.0)THEN STRING='ilay='//TRIM(ITOS(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ILAY)) STRING=TRIM(STRING)//CHAR(13)//'fct='//TRIM(RTOS(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FCT,'*',3)) STRING=TRIM(STRING)//CHAR(13)//'imp='//TRIM(RTOS(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%IMP,'*',3)) !## constant value IF(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST.EQ.1)THEN STRING=TRIM(STRING)//CHAR(13)//'cnst='//TRIM(RTOS(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%CNST,'*',3)) !## filename ELSEIF(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST.EQ.2)THEN STRING=TRIM(STRING)//CHAR(13)//'idf='//TRIM(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ALIAS) ENDIF CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to remove the selected entry:'//CHAR(13)//TRIM(STRING),'Question') IF(WINFODIALOG(4).NE.1)RETURN !## file selected, selected system will be deleted, thus conductance removes stage,bottom and inffactor as well. !## delete selected file and decrease size of files(). N=SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,1) !## number of subtopics M=SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,2) !## number of systems IF(M.GT.1)THEN ALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%FILES_TMP(N,M-1)) !## decrease size of the systems DO I=1,N; K=0; DO J=1,M IF(J.NE.ISYS)THEN K=K+1 TOPICS(ITOPIC)%STRESS(IPER)%FILES_TMP(I,K)=TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,J) ENDIF ENDDO; ENDDO DEALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%FILES) TOPICS(ITOPIC)%STRESS(IPER)%FILES=>TOPICS(ITOPIC)%STRESS(IPER)%FILES_TMP ELSE DEALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%FILES) DEALLOCATE(TOPICS(ITOPIC)%STRESS) ENDIF !## update the project manager for changes - on topic level, other is not possible CALL PMANAGERUPDATE(ITOPIC,IPER,ISUBTOPIC) !## remove selected date ELSEIF(IPER.NE.0.AND.ISYS.EQ.0.AND.ISUBTOPIC.EQ.0)THEN CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to delete the selected date ['//TRIM(TOPICS(ITOPIC)%STRESS(IPER)%CDATE)//']'//CHAR(13)// & ' for the topic ['//TRIM(TOPICS(ITOPIC)%TNAME)//']','Question'); IF(WINFODIALOG(4).NE.1)RETURN !## make copy of current memory N=SIZE(TOPICS(ITOPIC)%STRESS) IF(N.GT.1)THEN NULLIFY(TOPICS(ITOPIC)%STRESS_TMP) ALLOCATE(TOPICS(ITOPIC)%STRESS_TMP(N-1)) M=0 DO I=1,N !## skip selected period (do not copy) IF(I.EQ.IPER)CYCLE M=M+1 J =SIZE(TOPICS(ITOPIC)%STRESS(I)%FILES,1) K =SIZE(TOPICS(ITOPIC)%STRESS(I)%FILES,2) NULLIFY(TOPICS(ITOPIC)%STRESS_TMP(M)%FILES) ALLOCATE(TOPICS(ITOPIC)%STRESS_TMP(M)%FILES(J,K)) TOPICS(ITOPIC)%STRESS_TMP(M)%FILES=TOPICS(ITOPIC)%STRESS(I)%FILES TOPICS(ITOPIC)%STRESS_TMP(M)%CDATE=TOPICS(ITOPIC)%STRESS(I)%CDATE DEALLOCATE(TOPICS(ITOPIC)%STRESS(I)%FILES) ENDDO TOPICS(ITOPIC)%STRESS=>TOPICS(ITOPIC)%STRESS_TMP ELSE DEALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%FILES) DEALLOCATE(TOPICS(ITOPIC)%STRESS) ENDIF CALL PMANAGERUPDATE(ITOPIC,0,0) ELSE CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'You should select a topic or a individual filename','Question') IF(WINFODIALOG(4).NE.1)RETURN ENDIF END SUBROUTINE PMANAGERDELETE !###====================================================================== SUBROUTINE PMANAGERFIELDS() !###====================================================================== IMPLICIT NONE INTEGER :: I,ID CHARACTER(LEN=52) :: CNAME CALL WDIALOGSELECT(ID_DPMANAGER) CALL WDIALOGGETTREEVIEW(ID_TREEVIEW1,ID,CNAME) ID=MAX(ID,0); I=1; IF(ID.EQ.0)I=0 CALL WDIALOGFIELDSTATE(ID_DRAW,I) CALL WDIALOGFIELDSTATE(ID_PROPERTIES,I) ! CALL WDIALOGFIELDSTATE(ID_OPEN,I) ! !#not able to remove main-topics ! DO J=1,MAXTOPICS ! IF(ID.EQ.TOPICS(J)%ID)I=0 ! END DO ! CALL WDIALOGFIELDSTATE(ID_DELETE,I) END SUBROUTINE PMANAGERFIELDS !###====================================================================== SUBROUTINE PMANAGERUPDATE(IDITOPIC,IDIPER,IDISUBS) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IDITOPIC,IDIPER,IDISUBS INTEGER :: IPER,I,J,K,N,IDTOPIC,IDSUBTC,IFILES,NF,MF,JD CHARACTER(LEN=256) :: STRING I=INFOERROR(1) JD=0 CALL PMANAGER_ALLOCATE() CALL WDIALOGSELECT(ID_DPMANAGER); CALL WDIALOGCLEARFIELD(ID_TREEVIEW1) CALL WDIALOGTREEVIEWCHECK(0) IDTOPIC=1000-1; IDSUBTC=2000-1 IFILES=0; DO I=1,SIZE(TOPICS) IDTOPIC =IDTOPIC+1 TOPICS(I)%ID=IDTOPIC !## create main topics CALL WDIALOGINSERTTREEVIEWITEM(ID_TREEVIEW1,TOPICS(MAX(1,I-1))%ID,INSERTAFTER, & TOPICS(I)%ID,TRIM(TOPICS(I)%TNAME)) !## stress periods available N=0; IF(ASSOCIATED(TOPICS(I)%STRESS))N=SIZE(TOPICS(I)%STRESS) IF(N.GT.0)THEN !## create timestamps DO IPER=1,SIZE(TOPICS(I)%STRESS) NF=0; MF=0 IF(ASSOCIATED(TOPICS(I)%STRESS(IPER)%FILES))THEN NF=SIZE(TOPICS(I)%STRESS(IPER)%FILES,1); MF=SIZE(TOPICS(I)%STRESS(IPER)%FILES,2) ENDIF !## create timestamp - only whenever files are active IF(TOPICS(I)%TIMDEP.AND.NF.GT.0)THEN IDSUBTC =IDSUBTC+1 TOPICS(I)%IDT(IPER)=IDSUBTC CALL WDIALOGINSERTTREEVIEWITEM(ID_TREEVIEW1,TOPICS(I)%ID,INSERTCHILD, & TOPICS(I)%IDT(IPER),TRIM(TOPICS(I)%STRESS(IPER)%CDATE)) ELSE TOPICS(I)%IDT(IPER)=TOPICS(I)%ID ENDIF !## create subtopics names - only whenever files are active IF(TOPICS(I)%NSUBTOPICS.GT.1.AND.NF.GT.0)THEN DO J=1,TOPICS(I)%NSUBTOPICS IDSUBTC =IDSUBTC+1 TOPICS(I)%ISD(IPER,J)=IDSUBTC CALL WDIALOGINSERTTREEVIEWITEM(ID_TREEVIEW1,TOPICS(I)%IDT(IPER),INSERTCHILD, & TOPICS(I)%ISD(IPER,J),TRIM(TOPICS(I)%SNAME(J))) END DO ELSE TOPICS(I)%ISD(IPER,1)=TOPICS(I)%IDT(IPER) ENDIF DO J=1,NF !SIZE(TOPICS(I)%STRESS(IPER)%FILES,1) !## number of periods (types) DO K=1,MF !SIZE(TOPICS(I)%STRESS(IPER)%FILES,2) !## number of files (systems) IDSUBTC=IDSUBTC+1 IFILES=IFILES+1 TOPICS(I)%STRESS(IPER)%FILES(J,K)%ID=IDSUBTC STRING='ilay='//TRIM(ITOS(TOPICS(I)%STRESS(IPER)%FILES(J,K)%ILAY)) IF(TOPICS(I)%STRESS(IPER)%FILES(J,K)%ICNST.EQ.1)THEN STRING=TRIM(STRING)//';cnst='//TRIM(RTOS(TOPICS(I)%STRESS(IPER)%FILES(J,K)%CNST,'*',3)) ELSEIF(TOPICS(I)%STRESS(IPER)%FILES(J,K)%ICNST.EQ.2)THEN STRING=TRIM(STRING)//';idf='//TRIM(TOPICS(I)%STRESS(IPER)%FILES(J,K)%ALIAS) ENDIF STRING=TRIM(STRING)//';fct='//TRIM(RTOS(TOPICS(I)%STRESS(IPER)%FILES(J,K)%FCT,'*',3)) STRING=TRIM(STRING)//';imp='//TRIM(RTOS(TOPICS(I)%STRESS(IPER)%FILES(J,K)%IMP,'*',3)) CALL WDIALOGINSERTTREEVIEWITEM(ID_TREEVIEW1,TOPICS(I)%ISD(IPER,J),INSERTCHILD, & TOPICS(I)%STRESS(IPER)%FILES(J,K)%ID,TRIM(STRING)) !## select file of first type IF(J.EQ.1.AND.IDITOPIC.EQ.I.AND.IDIPER.EQ.IPER.AND.IDISUBS.EQ.K)THEN JD=TOPICS(I)%STRESS(IPER)%FILES(J,K)%ID ENDIF END DO END DO ENDDO ENDIF END DO CALL WDIALOGTREEVIEWCHECK(1) ! !## expand the last selected id of filename ! IF(IDITOPIC.NE.0.AND.IDIPER.NE.0.AND.IDISUBS.NE.0)THEN ! CALL WDIALOGSETTREEVIEWSTATE(IDF_TREEVIEW1,TOPICS(I)%ID,BranchCollapsed) ! CALL WDIALOGPUTTREEVIEW(ID_TREEVIEW1,TOPICS(IDITOPIC)%ISD(IDIPER,IDISUBS)) !,BRANCHEXPANDED) ! ELSEIF(IDITOPIC.NE.0.AND.IDIPER.NE.0)THEN ! CALL WDIALOGPUTTREEVIEW(ID_TREEVIEW1,TOPICS(IDITOPIC)%IDT(IDIPER)) !,BRANCHEXPANDED) ! ELSEIF(IDITOPIC.NE.0)THEN ! CALL WDIALOGPUTTREEVIEW(ID_TREEVIEW1,TOPICS(IDITOPIC)%ID) !,BranchCollapsed) ! ENDIF !## select appropriate id's IF(JD.NE.0)CALL WDIALOGPUTTREEVIEW(ID_TREEVIEW1,JD) I=INFOERROR(1) END SUBROUTINE PMANAGERUPDATE !###====================================================================== SUBROUTINE PMANAGERSHOW(ICODE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ICODE CALL WINDOWSELECT(0) IF(WMENUGETSTATE(ID_PMANAGER,2).EQ.1)THEN IF(ICODE.EQ.0)THEN; CALL PMANAGERCLOSE(); RETURN; ENDIF ENDIF CALL WMENUSETSTATE(ID_PMANAGER,2,1) CALL WDIALOGSELECT(ID_DPMANAGER); CALL WDIALOGSHOW(0,65,0,2) END SUBROUTINE PMANAGERSHOW !###====================================================================== SUBROUTINE PMANAGERINIT() !###====================================================================== IMPLICIT NONE INTEGER :: I TOPICS(1)%TNAME ='(CAP) Capsim/MetaSwap [UZF]' TOPICS(2)%TNAME ='(TOP) Top Elevation [DIS]' TOPICS(3)%TNAME ='(BOT) Bottom Elevation [DIS]' TOPICS(4)%TNAME ='(BND) Boundary Condition [BAS]' TOPICS(5)%TNAME ='(SHD) Starting Heads [BAS]' TOPICS(6)%TNAME ='(KDW) Transmissivity [BCF/LPF]' TOPICS(7)%TNAME ='(KHV) Horizontal Permeability [BCF/LPF]' TOPICS(8)%TNAME ='(KVA) Vertical Anisotropy [LPF]' TOPICS(9)%TNAME ='(VCW) Vertical Resistance [LPF]' TOPICS(10)%TNAME='(KVV) Vertical Permeability [BCF/LPF]' TOPICS(11)%TNAME='(STO) Storage Coefficient [BCF/LPF]' TOPICS(12)%TNAME='(SSC) Secundary Storage Coefficient [BCF/LPF]' TOPICS(13)%TNAME='(PWT) Perched Water Table [-]' TOPICS(14)%TNAME='(ANI) Anisotropy [LPF]' TOPICS(15)%TNAME='(HFB) Horizontal Flow Boundary [HFB]' TOPICS(16)%TNAME='(IBS) Interbed Storage [IBS]' TOPICS(17)%TNAME='(CON) Concentration [-]' TOPICS(18)%TNAME='(SFT) StreamFlow Thickness [-]' TOPICS(19)%TNAME='(CPP) Common Pointer Package [-]' TOPICS(20)%TNAME='(PST) Parameter Estimation [-]' TOPICS(21)%TNAME='(WEL) Wells [WEL]' TOPICS(22)%TNAME='(DRN) Drainage [DRN]' TOPICS(23)%TNAME='(RIV) Rivers [RIV]' TOPICS(24)%TNAME='(EVT) Evapotranspiration [EVT]' TOPICS(25)%TNAME='(GHB) General Head Boundary [GHB]' TOPICS(26)%TNAME='(RCH) Recharge [RCH]' TOPICS(27)%TNAME='(OLF) Overland Flow [DRN]' TOPICS(28)%TNAME='(CHD) Constant Head Boundary [CHD]' TOPICS(29)%TNAME='(ISG) iMOD SeGment Rivers [-]' !TOPICS(30)%TNAME='(SCR) Subsidence [SWT]' TOPICS(1)%NSUBTOPICS =1 !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=2 !SSC TOPICS(13)%NSUBTOPICS=6 !PWT TOPICS(14)%NSUBTOPICS=2 !ANI TOPICS(15)%NSUBTOPICS=1 !HFB TOPICS(16)%NSUBTOPICS=4 !IBS TOPICS(17)%NSUBTOPICS=1 !CON TOPICS(18)%NSUBTOPICS=2 !SFT TOPICS(19)%NSUBTOPICS=1 !CPP 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 !ISG 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. !CON TOPICS(18)%TIMDEP=.FALSE. !SFT TOPICS(19)%TIMDEP=.FALSE. !CPP 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(1)%SNAME(1) ='Capsim Parameters' TOPICS(2)%SNAME(1) ='Top of Modellayer' TOPICS(3)%SNAME(1) ='Bottom of Modellayer' TOPICS(4)%SNAME(1) ='Boundary Settings' TOPICS(5)%SNAME(1) ='Starting Heads' TOPICS(6)%SNAME(1) ='Transmissivity' TOPICS(7)%SNAME(1) ='Horizontal Permeability' TOPICS(8)%SNAME(1) ='Vertical Anisotropy' TOPICS(9)%SNAME(1) ='Vertical Resistance' TOPICS(10)%SNAME(1)='Vertical Permeability' TOPICS(11)%SNAME(1)='Storage Coefficient' TOPICS(12)%SNAME(1)='Specific Unconfined Storage Coefficient' TOPICS(12)%SNAME(2)='Specific Confined Storage Coefficient' TOPICS(13)%SNAME(1)='Layer Identification' TOPICS(13)%SNAME(2)='Phreatic Storage Coefficient' TOPICS(13)%SNAME(3)='Top of Aquifer (above PWT-layer)' TOPICS(13)%SNAME(4)='Top of Aquitard (PWT-layer)' TOPICS(13)%SNAME(5)='Top of Aquifer (beneath PWT-layer)' TOPICS(13)%SNAME(6)='Vertical Resistance of PWT-clay' TOPICS(14)%SNAME(1)='Factor' TOPICS(14)%SNAME(2)='Angle' TOPICS(15)%SNAME(1)='Horizontal Barrier Flow' TOPICS(16)%SNAME(1)='Preconsolidation Head' TOPICS(16)%SNAME(2)='Elastic Storage Coefficient' TOPICS(16)%SNAME(3)='Inelastic Storage Coefficient' TOPICS(16)%SNAME(4)='Starting Compaction' TOPICS(17)%SNAME(1)='Concentration' TOPICS(18)%SNAME(1)='Stream Flow Thickness' TOPICS(18)%SNAME(2)='Permeability' TOPICS(19)%SNAME(1)='Common Pointer' TOPICS(20)%SNAME(1)='Parameters Estimation Parameters' TOPICS(21)%SNAME(1)='Well Rate' TOPICS(22)%SNAME(1)='Conductance' TOPICS(22)%SNAME(2)='Drainage Level' TOPICS(23)%SNAME(1)='Conductance' TOPICS(23)%SNAME(2)='River Level' TOPICS(23)%SNAME(3)='Riverbottom Level' TOPICS(23)%SNAME(4)='Infiltration Factor' TOPICS(24)%SNAME(1)='Evapotranspiration Rate' TOPICS(24)%SNAME(2)='Surface Level' TOPICS(24)%SNAME(3)='Extinction Depth' TOPICS(25)%SNAME(1)='Conductance' TOPICS(25)%SNAME(2)='Reference Level' TOPICS(26)%SNAME(1)='Recharge Rate' TOPICS(27)%SNAME(1)='Overland Flow Level' TOPICS(28)%SNAME(1)='Constant Head' TOPICS(29)%SNAME(1)='Segment River' CALL WDIALOGLOAD(ID_DPMANAGER) CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(ID_SAVE,ID_ICONSAVE,1) CALL WDIALOGPUTIMAGE(ID_PROPERTIES,ID_ICONPROPERTIES,1) CALL WDIALOGPUTIMAGE(ID_DRAW,ID_ICONDRAW,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) ALLOCATE(PERIOD(MAXPERIODS)); NPERIOD=0 DO I=1,SIZE(TOPICS) NULLIFY(TOPICS(I)%STRESS) NULLIFY(TOPICS(I)%STRESS_TMP) ENDDO CALL PMANAGERUPDATE(0,0,0) CALL PMANAGERFIELDS() END SUBROUTINE PMANAGERINIT !###====================================================================== 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 ! DO I=1,SIZE(TOPICS) IF(ASSOCIATED(TOPICS(I)%STRESS))THEN DO J=1,SIZE(TOPICS(I)%STRESS) IF(ASSOCIATED(TOPICS(I)%STRESS(J)%FILES))THEN DEALLOCATE(TOPICS(I)%STRESS(J)%FILES) ENDIF 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) ! ENDDO END SUBROUTINE PMANAGER_DEALLOCATE !#####================================================================= INTEGER FUNCTION PMANAGER_FIND_KEYWORD(LINE) !#####================================================================= IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: LINE INTEGER :: I,J CHARACTER(LEN=3) :: CKEY PMANAGER_FIND_KEYWORD=0 I=INDEX(LINE,'('); J=INDEX(LINE,')') IF(I.EQ.0.OR.J.EQ.0)RETURN; IF(J-I.NE.4)RETURN CKEY=LINE(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 !#####================================================================= SUBROUTINE PMANAGERCLOSE() !#####================================================================= IMPLICIT NONE CALL WINDOWSELECT(0); CALL WMENUSETSTATE(ID_PMANAGER,2,0) CALL WDIALOGSELECT(ID_DPMANAGER); CALL WDIALOGHIDE() END SUBROUTINE PMANAGERCLOSE END MODULE