!! Copyright (C) Stichting Deltares, 2005-2020. !! !! 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_TOOLS USE WINTERACTER USE RESOURCE USE MOD_DBL USE MOD_UTL USE MOD_PREF_PAR, ONLY : PREFVAL USE IMODVAR, ONLY : DP_KIND,SP_KIND,IDIAGERROR,MXTP,TP !,MXSYS USE MODPLOT USE DATEVAR USE MOD_COLOURS USE MOD_POLYGON, ONLY : POLYGON1MAIN USE MOD_POLYGON_DRAW, ONLY : POLYGON1DRAWSHAPE USE MOD_POLYGON_UTL, ONLY : POLYGON1INIT,POLYGON1CLOSE,POLYGON1SAVELOADSHAPE,POLYGON1IMAGES,POLYGON1FIELDS USE MOD_POLYGON_PAR USE MOD_WBAL_CLC, ONLY : WBALCOMPUTE,WBALABORT USE MOD_WBAL_PAR USE MOD_WBAL_ANALYSE, ONLY : WBAL_ANALYSE_INIT,WBAL_ANALYSE_GETBALANCETERM USE MOD_GXG_CLC, ONLY : FGLG,FGHG,FGVG,FGT,FNLEG,GXG1_COMPUTEGXG,GXG1_ABORT USE MOD_MEAN_CLC, ONLY : MEAN1COMPUTE,MEAN1ABORT USE MOD_TS_CLC, ONLY : TS1COMPUTE,TS_END USE MOD_TS_PAR, ONLY : IPFNAME1,IPFNAME2,TSILAY,SDATE,EDATE,IASSF,TSDIR,LCOL USE MOD_IPF_PAR, ONLY : IPF USE MOD_OSD, ONLY : OSD_OPEN USE MOD_MANAGER_UTL USE MOD_TOOLS_UTL USE MOD_TOOLS_PAR USE MOD_MAIN_UTL USE MOD_IDFPLOT CONTAINS !###====================================================================== SUBROUTINE TOOLS_MAIN(ITYPE,MESSAGE) !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE INTEGER,INTENT(IN) :: ITYPE INTEGER :: IBAL,I,J CALL WDIALOGSELECT(MESSAGE%WIN) SELECT CASE (MESSAGE%WIN) CASE (ID_TOOLS) SELECT CASE(ITYPE) CASE (FIELDCHANGED) CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDHELP) SELECT CASE (TOOLSID) CASE (ID_WBAL_GENERATE) CALL UTL_GETHELP('5.12','TMO.CompWatBal') CASE (ID_GXG) CALL UTL_GETHELP('5.13','TMO.GxG') CASE (ID_MEAN) CALL UTL_GETHELP('5.14','TMO.CompMeanVal') CASE (ID_TS) CALL UTL_GETHELP('5.15','TMO.CompTimeSer') END SELECT CASE (IDCANCEL) CALL TOOLS_CLOSE() CASE (IDOK,IDOK1,IDOK3) SELECT CASE (TOOLSID) CASE (ID_WBAL_GENERATE) CALL TOOLS_APPLY_WBAL(MESSAGE%VALUE1) CASE (ID_GXG) CALL TOOLS_APPLY_GXG() CASE (ID_MEAN) CALL TOOLS_APPLY_MEAN() CASE (ID_TS) CALL TOOLS_APPLY_TS() END SELECT END SELECT END SELECT !## maps/results CASE (ID_TOOLSTAB1) SELECT CASE(ITYPE) CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDF_MODFLOW,IDF_METASWAP) IF(MESSAGE%VALUE1.EQ.IDF_MODFLOW) J=1 IF(MESSAGE%VALUE1.EQ.IDF_METASWAP)J=2 CALL WDIALOGSELECT(ID_TOOLSTAB1) IF(ALLOCATED(ILIST))THEN CALL WDIALOGGETMENU(IDF_MENU2,ILIST) DO I=1,SIZE(ILIST) IF(ILIST(I).EQ.0)THEN LISTNAME(I)=UTL_CAP(LISTNAME(I),'U') IBAL=WBAL_ANALYSE_GETBALANCETERM(LISTNAME(I)) !## part of modflow-family IF(IBAL.GT.0.AND.IBAL.LE.SIZE(TP))THEN IF(TP(IBAL)%MODFLOWMETASWAP.EQ.J)ILIST(I)=1 ENDIF ENDIF ENDDO CALL WDIALOGPUTOPTION(IDF_MENU2,ILIST) !## get list of files CALL TOOLS_GETTYPE() ENDIF CASE (ID_OPEN) FNAME=TRIM(PREFVAL(1))//'\' CALL WSELECTDIR(DIRCHANGE,FNAME,'Select Model Result Directory') IF(WINFODIALOG(4).EQ.1)THEN TOOLSBROWSENAME=FNAME CALL WDIALOGPUTSTRING(IDF_STRING1,TRIM(FNAME)) ENDIF CALL TOOLS_FIELDS1(0) END SELECT CASE (FIELDCHANGED) IF(MESSAGE%VALUE1.EQ.MESSAGE%VALUE2)THEN SELECT CASE (MESSAGE%VALUE2) CASE (IDF_RADIO1,IDF_RADIO2) CALL TOOLS_FIELDS1(0) !## select different folder CASE (IDF_MENU1) CALL TOOLS_FIELDS1(1) !## get available items CASE (IDF_MENU2) CALL TOOLS_GETTYPE() CASE (IDF_STRING1) CALL WDIALOGGETSTRING(IDF_STRING1,TOOLSBROWSENAME) CALL TOOLS_FIELDS1(0) END SELECT ENDIF END SELECT !## periods/layers CASE (ID_TOOLSTAB2) SELECT CASE(ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_CHECK1,IDF_INTEGER3,IDF_MENU3,IDF_INTEGER4,IDF_MENU5,IDF_MENU6, & IDF_INTEGER5,IDF_MENU4,IDF_INTEGER6,IDF_STRING1,IDF_RADIO1,IDF_RADIO2) CALL TOOLS_FIELDS2() END SELECT END SELECT !## results/polygon/areas CASE (ID_TOOLSTAB3) IACTSHAPES=(/3,3,1,3,3,3/) CALL POLYGON1MAIN(ITYPE,MESSAGE) IF(ITYPE.EQ.PUSHBUTTON.AND.MESSAGE%VALUE1.EQ.ID_ZOOMSELECT)THEN CALL IDFZOOM(ID_DGOTOXY,0.0D0,0.0D0,0) CALL IDFPLOT(1) ENDIF CALL TOOLS_FIELDS3() SELECT CASE(ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_RADIO1,IDF_RADIO2,IDF_RADIO3,IDF_STRING1) CALL TOOLS_FIELDS3() CASE (IDF_MENU1) CALL TOOLS_FIELDS3() END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_OPEN) CALL WDIALOGSELECT(MESSAGE%WIN) CALL TOOLS_OPENIDF() CALL TOOLS_FIELDS3() END SELECT END SELECT !## apply to CASE (ID_TOOLSTAB4) SELECT CASE(ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_STRING1) IF(TOOLSID.EQ.ID_TS)CALL TOOLS_READHEADERIPF() CALL TOOLS_FIELDS4() END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_OPEN) CALL WDIALOGSELECT(MESSAGE%WIN) CALL TOOLS_OPENIDF() CALL TOOLS_FIELDS4() CASE (ID_DRAW) CALL TOOLS_DRAWIPF() END SELECT END SELECT END SELECT END SUBROUTINE TOOLS_MAIN !###====================================================================== SUBROUTINE TOOLS_OPENIDF() !###====================================================================== IMPLICIT NONE IF(TOOLSID.EQ.ID_TS)THEN IF(.NOT.UTL_WSELECTFILE('iMOD Map (*.ipf)|*.ipf|',& LOADDIALOG+MUSTEXIST+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,& 'Load iMOD Map (*.ipf)'))RETURN CALL WDIALOGPUTSTRING(IDF_STRING1,TRIM(FNAME)) ELSE IF(.NOT.UTL_WSELECTFILE('iMOD Map (*.idf)|*.idf|',& LOADDIALOG+MUSTEXIST+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,& 'Load iMOD Map (*.idf)'))RETURN CALL WDIALOGPUTSTRING(IDF_STRING1,TRIM(FNAME)) ENDIF IF(TOOLSID.EQ.ID_TS)THEN CALL WDIALOGFIELDSTATE(IDF_STRING1,1) CALL TOOLS_READHEADERIPF() CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=FNAME)!,'') ENDIF END SUBROUTINE TOOLS_OPENIDF !###====================================================================== SUBROUTINE TOOLS_APPLY_WBAL(DID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: DID INTEGER :: I,J,K,IY,IM,ID,ICSV,JPERIOD,IERROR,IU,IWIN,ICLOSE,IHR,IMT,ISC,IBAL,NSYS,KLAY,JLAY,NU,II CHARACTER(LEN=500) :: STRING CHARACTER(LEN=256) :: ROOT LOGICAL :: LEX INTEGER(KIND=DP_KIND),POINTER,DIMENSION(:) :: ISYS,ISYS_BU INTEGER(KIND=DP_KIND),ALLOCATABLE,DIMENSION(:) :: LSYS CHARACTER(LEN=256),DIMENSION(:),POINTER :: IDFNAMES CALL WDIALOGSELECT(ID_TOOLS) !## csv IF(DID.EQ.IDOK)THEN ICSV=2; WBAL_OUTFNAME=TRIM(TOOLSDIR)//'\wbal.csv' IF(.NOT.UTL_WSELECTFILE('Comma-Separated File (*.csv)|*.csv|', & SAVEDIALOG+PROMPTON+NONEXPATH+DIRCHANGE+APPENDEXT, & WBAL_OUTFNAME,'Specify Filename for Budget Saving'))RETURN !## txt ELSEIF(DID.EQ.IDOK1)THEN ICSV=1; WBAL_OUTFNAME=TRIM(TOOLSDIR)//'\wbal.txt' IF(.NOT.UTL_WSELECTFILE('Textfile (*.txt)|*.txt|', & SAVEDIALOG+PROMPTON+NONEXPATH+DIRCHANGE+APPENDEXT, & WBAL_OUTFNAME,'Specify Filename for Budget Saving'))RETURN !## ipf ELSEIF(DID.EQ.IDOK3)THEN ICSV=3; WBAL_OUTFNAME=TRIM(TOOLSDIR)//'\wbal.ipf' IF(.NOT.UTL_WSELECTFILE('iMOD Point File (*.ipf)|*.ipf|', & SAVEDIALOG+PROMPTON+NONEXPATH+DIRCHANGE+APPENDEXT, & WBAL_OUTFNAME,'Specify Filename for Budget Saving'))RETURN ENDIF CALL WDIALOGSELECT(ID_TOOLSTAB1) CALL WDIALOGGETMENU(IDF_MENU2,ILIST) ALLOCATE(WCTP(SUM(ILIST))) J=0; DO I=1,SIZE(ILIST); IF(ILIST(I).EQ.0)CYCLE; J=J+1; WCTP(J)%BDGNAME=LISTNAME(I); ENDDO CALL WDIALOGSELECT(ID_TOOLSTAB2) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,JPERIOD) !## determine periods WBAL_NPERIOD=0 IF(JPERIOD.EQ.1)THEN CALL WDIALOGGETSTRING(IDF_STRING1,STRING) CALL TOOLS_UTL_GETPERIODS(STRING,IPERIOD,IERROR) WBAL_NPERIOD=SIZE(IPERIOD) ALLOCATE(WBAL_IPERIOD(WBAL_NPERIOD,2)) WBAL_IPERIOD=IPERIOD DEALLOCATE(IPERIOD) !## use all periods ELSE IERROR =0 ENDIF IF(IERROR.EQ.1)THEN CALL WBALABORT() CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error found in given period','Error') RETURN ENDIF WBAL_RESDIR=TRIM(TOOLSDIR) !## write type of area to be used CALL TOOLS_DEFINEAREA(WBAL_ISEL,WBAL_IDFNAME,WBAL_GENFNAME) CALL WDIALOGSELECT(ID_TOOLSTAB3) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,WBAL_WBEX) !## steady/transient? CALL WDIALOGSELECT(ID_TOOLSTAB2) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,WBAL_ISTEADY) WBAL_ISTEADY=ABS(WBAL_ISTEADY-2) !## get dates IF(WBAL_ISTEADY.EQ.0)THEN CALL WDIALOGGETINTEGER(IDF_INTEGER3 ,ID) CALL WDIALOGGETINTEGER(IDF_INTEGER4 ,IY) CALL WDIALOGGETINTEGER(IDF_INTEGER9, IHR) CALL WDIALOGGETINTEGER(IDF_INTEGER10,IMT) CALL WDIALOGGETINTEGER(IDF_INTEGER11,ISC) CALL WDIALOGGETMENU(IDF_MENU3,IM) WBAL_FYR=YMDHMSTOITIME(IY,IM,ID,IHR,IMT,ISC) CALL WDIALOGGETINTEGER(IDF_INTEGER5 ,ID) CALL WDIALOGGETINTEGER(IDF_INTEGER6 ,IY) CALL WDIALOGGETINTEGER(IDF_INTEGER14,IHR) CALL WDIALOGGETINTEGER(IDF_INTEGER13,IMT) CALL WDIALOGGETINTEGER(IDF_INTEGER12,ISC) CALL WDIALOGGETMENU(IDF_MENU4,IM) WBAL_TYR=YMDHMSTOITIME(IY,IM,ID,IHR,IMT,ISC) !## write years to be processed CALL TOOLS_READYEARS(WBAL_NYEAR,WBAL_IYEAR) ENDIF ILAY=0; CALL WDIALOGGETMENU(IDF_MENU5,ILAY) WBAL_NLAYER=SUM(ILAY) ALLOCATE(WBAL_ILAYER(WBAL_NLAYER)) J=0 DO I=1,SIZE(CLAY) IF(ILAY(I).EQ.1)THEN J=J+1; WBAL_ILAYER(J)=I ENDIF END DO CALL UTL_MESSAGEHANDLE(0) !## get number of systems ALLOCATE(ISYS(1000)); ISYS=INT(0,8) !## get all unique files DO IBAL=1,SIZE(WCTP) NSYS=0 ROOT=TRIM(WBAL_RESDIR)//'\'//TRIM(WCTP(IBAL)%BDGNAME); NSYS=0 DO JLAY=1,WBAL_NLAYER KLAY=WBAL_ILAYER(JLAY) !## construct filename FNAME=TRIM(WCTP(IBAL)%BDGNAME)//'_SYS*_*_L'//TRIM(ITOS(KLAY))//'.IDF' IF(UTL_DIRINFO_POINTER(ROOT,FNAME,IDFNAMES,'F',CORDER='N'))THEN; ENDIF DO I=1,SIZE(IDFNAMES) IDFNAMES(I)=UTL_CAP(IDFNAMES(I),'U') J=INDEX(IDFNAMES(I),'_SYS',.TRUE.); IF(J.LE.0)CYCLE J=J+4; K=INDEX(IDFNAMES(I)(J:),'_',.FALSE.); IF(K.LE.0)CYCLE K=K-1; K=J+K-1 NSYS=NSYS+1 IF(NSYS.GT.SIZE(ISYS))THEN ALLOCATE(ISYS_BU(SIZE(ISYS)+1000)) DO II=1,SIZE(ISYS); ISYS_BU(II)=ISYS(II); ENDDO DEALLOCATE(ISYS); ISYS=>ISYS_BU ENDIF READ(IDFNAMES(I)(J:K),*) ISYS(NSYS) ENDDO DEALLOCATE(IDFNAMES) ENDDO IF(NSYS.GT.0)THEN ALLOCATE(LSYS(NSYS)); DO I=1,NSYS; LSYS(I)=ISYS(I); ENDDO !## get number unique systems CALL UTL_GETUNIQUE_DINT(LSYS,NSYS,NU,0); NSYS=NU ALLOCATE(WCTP(IBAL)%ISYS(NSYS)); DO I=1,NSYS; WCTP(IBAL)%ISYS(I)=LSYS(I); ENDDO IF(ALLOCATED(LSYS))DEALLOCATE(LSYS) ENDIF WCTP(IBAL)%NSYS=MAX(NSYS,1) ENDDO DEALLOCATE(ISYS) CALL WDIALOGSELECT(ID_TOOLS) CALL WDIALOGFIELDSTATE(IDF_PROGRESS1,1) CALL WDIALOGFIELDSTATE(IDF_PROGRESS2,1) !## compute waterbalance SHP%NPOL=0; LEX=WBALCOMPUTE() CALL UTL_MESSAGEHANDLE(1) !## reread polygons in dialog IF(WBAL_ISEL.EQ.2)CALL POLYGON1SAVELOADSHAPE(ID_LOADSHAPE,TRIM(PREFVAL(1))//'\TMP\tmp.gen','GEN') CALL WDIALOGSELECT(ID_TOOLS) CALL WDIALOGFIELDSTATE(IDF_PROGRESS1,3) CALL WDIALOGFIELDSTATE(IDF_PROGRESS2,3) !## release waterbalance-related memory again CALL WBALABORT() ICLOSE=0 IF(LEX)THEN INQUIRE(FILE=WBAL_OUTFNAME(:INDEX(WBAL_OUTFNAME,'.',.TRUE.)-1)//'_ZONES.IDF',EXIST=LEX) IF(LEX)CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=WBAL_OUTFNAME(:INDEX(WBAL_OUTFNAME,'.',.TRUE.)-1)//'_ZONES.IDF') !## plot IPF file IF(ICSV.EQ.3)THEN CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=WBAL_OUTFNAME) CALL IDFPLOTFAST(1) !## open TXT file ELSEIF(ICSV.EQ.1)THEN IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=WBAL_OUTFNAME,STATUS='OLD',IOSTAT=I) IF(I.NE.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD cannot view the created file : '//CHAR(13)// & TRIM(WBAL_OUTFNAME)//'.'//CHAR(13)//'It is probably opened already in another application','Error') ELSE CLOSE(IU) CALL WINDOWOPENCHILD(IWIN,FLAGS=SYSMENUON+MINBUTTON+MAXBUTTON,WIDTH=1000,HEIGHT=500) CALL WINDOWSELECT(IWIN) CALL WEDITFILE(WBAL_OUTFNAME,ITYPE=MODAL,IDMENU=0, & IFLAGS=NOTOOLBAR+VIEWONLY+WORDWRAP+NOFILENEWOPEN,& IFONT=4,ISIZE=10) ENDIF !## open CSV file ELSEIF(ICSV.EQ.2)THEN CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Succesfully created the waterbalance file : '//CHAR(13)// & TRIM(WBAL_OUTFNAME)//'.'//CHAR(13)//'Do you want to start the Waterbalance Analyser ?','Question') IF(WINFODIALOG(4).EQ.1)THEN; CALL WBAL_ANALYSE_INIT(WBAL_OUTFNAME,0); ICLOSE=1; ENDIF ENDIF ENDIF !## reread area to be used IF(ICLOSE.EQ.0)CALL TOOLS_REREADAREA() END SUBROUTINE TOOLS_APPLY_WBAL !###====================================================================== SUBROUTINE TOOLS_APPLY_GXG() !###====================================================================== USE MOD_GXG_PAR IMPLICIT NONE INTEGER :: I,J,JPERIOD,IERROR CHARACTER(LEN=500) :: STRING CHARACTER(LEN=50) :: CTOPIC LOGICAL :: LEX CALL WDIALOGSELECT(ID_TOOLSTAB1) CALL WDIALOGGETMENU(IDF_MENU2,ILIST) IF(SUM(ILIST).NE.1)RETURN DO I=1,SIZE(ILIST) IF(ILIST(I).EQ.1)CTOPIC=LISTNAME(I) END DO CALL WDIALOGSELECT(ID_TOOLSTAB4) CALL WDIALOGGETSTRING(IDF_STRING1,GXG_MVIDFNAME) IF(LEN_TRIM(GXG_MVIDFNAME).GT.0)THEN INQUIRE(FILE=GXG_MVIDFNAME,EXIST=LEX) IF(.NOT.LEX)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Cannot find '//CHAR(13)//TRIM(GXG_MVIDFNAME),'Error') RETURN ENDIF ENDIF CALL WDIALOGSELECT(ID_TOOLSTAB2) IF(ASSOCIATED(GXG_IPERIOD))DEALLOCATE(GXG_IPERIOD) ALLOCATE(GXG_IPERIOD(12,2)) GXG_IPERIOD=0 CALL WDIALOGGETCHECKBOX(IDF_CHECK1,JPERIOD) !## determine periods IF(JPERIOD.EQ.1)THEN CALL WDIALOGGETSTRING(IDF_STRING1,STRING) CALL TOOLS_UTL_GETPERIODS_GXG(STRING,IPERIOD,IERROR) GXG_IPERIOD=IPERIOD DEALLOCATE(IPERIOD) !## use all periods ELSE GXG_IPERIOD=1 IERROR =0 ENDIF CALL WDIALOGGETMENU(IDF_MENU5,ILAY) GXG_NLAYER=SUM(ILAY) ALLOCATE(GXG_ILAYER(GXG_NLAYER)) J=0 DO I=1,SIZE(CLAY) IF(ILAY(I).EQ.1)THEN J=J+1; GXG_ILAYER(J)=I ENDIF END DO CALL WDIALOGGETMENU(IDF_MENU6,IYEAR) !## write years to be processed CALL TOOLS_READYEARS(GXG_NYEAR,GXG_IYEAR) !## write type of area to be used CALL TOOLS_DEFINEAREA(ISEL,GXG_IDFNAME,GXG_GENFNAME) GXG_RESDIR=TRIM(TOOLSDIR)//'\'//TRIM(CTOPIC) IF(IERROR.EQ.1)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error found in given period','Error') RETURN ENDIF IF(GXG1_COMPUTEGXG())THEN INQUIRE(FILE=TRIM(PREFVAL(1))//'\TMP\POINTER.IDF',EXIST=LEX) IF(LEX)CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=TRIM(PREFVAL(1))//'\TMP\POINTER.IDF') CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=FGLG) CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=FGHG) CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=FGVG) CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=FGT,LEGNAME=FNLEG) CALL IDFPLOTFAST(1) ENDIF !## clean memory CALL GXG1_ABORT() IF(ASSOCIATED(GXG_IPERIOD))DEALLOCATE(GXG_IPERIOD) IF(ASSOCIATED(GXG_IYEAR))DEALLOCATE(GXG_IYEAR) IF(ASSOCIATED(GXG_ILAYER))DEALLOCATE(GXG_ILAYER) !## reread area to be used CALL TOOLS_REREADAREA() END SUBROUTINE TOOLS_APPLY_GXG !###====================================================================== SUBROUTINE TOOLS_APPLY_MEAN() !###====================================================================== USE MOD_MEAN_PAR IMPLICIT NONE INTEGER :: I,J,FYR,TYR,FMN,TMN,FDY,TDY,JPERIOD,IERROR CHARACTER(LEN=256) :: STRING CHARACTER(LEN=50) :: CTOPIC CALL WDIALOGSELECT(ID_TOOLSTAB1) CALL WDIALOGGETMENU(IDF_MENU2,ILIST) IF(SUM(ILIST).NE.1)RETURN DO I=1,SIZE(ILIST) IF(ILIST(I).EQ.1)CTOPIC=LISTNAME(I) END DO CALL WDIALOGSELECT(ID_TOOLSTAB2) CALL WDIALOGGETINTEGER(IDF_INTEGER4,FYR) CALL WDIALOGGETINTEGER(IDF_INTEGER6,TYR) CALL WDIALOGGETINTEGER(IDF_INTEGER3,FDY) CALL WDIALOGGETINTEGER(IDF_INTEGER5,TDY) CALL WDIALOGGETMENU(IDF_MENU3,FMN) CALL WDIALOGGETMENU(IDF_MENU4,TMN) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,JPERIOD) !## determine periods IF(JPERIOD.EQ.1)THEN CALL WDIALOGGETSTRING(IDF_STRING1,STRING) CALL TOOLS_UTL_GETPERIODS(STRING,IPERIOD,IERROR) !## use all periods ELSE IERROR =0 ENDIF IF(IERROR.EQ.1)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error found in given period','Error') RETURN ENDIF ILAY=0; CALL WDIALOGGETMENU(IDF_MENU5,ILAY) MEAN_NLAYER=SUM(ILAY) ALLOCATE(MEAN_ILAYER(MEAN_NLAYER)) J=0 DO I=1,SIZE(CLAY) IF(ILAY(I).EQ.1)THEN J=J+1; MEAN_ILAYER(J)=I ENDIF END DO MEAN_FYR=FYR*10000+FMN*100+FDY MEAN_TYR=TYR*10000+TMN*100+TDY !## write years to be processed CALL TOOLS_READYEARS(MEAN_NYEAR,MEAN_IYEAR) !## determine periods IF(JPERIOD.GT.0)THEN MEAN_NPERIOD=SIZE(IPERIOD) ALLOCATE(MEAN_IPERIOD(MEAN_NPERIOD,2)) MEAN_IPERIOD=IPERIOD DEALLOCATE(IPERIOD) ENDIF !## write type of area to be used CALL TOOLS_DEFINEAREA(MEAN_ISEL,MEAN_IDFNAME,MEAN_GENFNAME) MEAN_RESDIR=TRIM(TOOLSDIR)//'\'//TRIM(CTOPIC)//'\'//TRIM(CTOPIC) SHP%NPOL=0 IBATCH=0 CFUNC='MEAN' ALLOCATE(MEAN_FTOTAL(MEAN_NLAYER),MEAN_FMEAN(MEAN_NLAYER)) IF(MEAN1COMPUTE())THEN DO I=1,MEAN_NLAYER CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=MEAN_FTOTAL(I)) CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=MEAN_FMEAN(I)) CALL IDFPLOTFAST(1) ENDDO ENDIF DEALLOCATE(MEAN_FTOTAL,MEAN_FMEAN) IF(ASSOCIATED(MEAN_IPERIOD))DEALLOCATE(MEAN_IPERIOD) IF(ASSOCIATED(MEAN_IYEAR))DEALLOCATE(MEAN_IYEAR) IF(ASSOCIATED(MEAN_ILAYER))DEALLOCATE(MEAN_ILAYER) !## clean memory CALL MEAN1ABORT() !## reread area to be used CALL TOOLS_REREADAREA() END SUBROUTINE TOOLS_APPLY_MEAN !###====================================================================== SUBROUTINE TOOLS_APPLY_TS() !###====================================================================== IMPLICIT NONE INTEGER :: I,FYR,TYR,FMN,TMN,FDY,TDY,IL,IASSF CHARACTER(LEN=50) :: CTOPIC LOGICAL :: LEX,LOKAY CALL WDIALOGSELECT(ID_TOOLSTAB4) CALL WDIALOGGETSTRING(IDF_STRING1,FNAME) IF(LEN_TRIM(FNAME).EQ.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'It is compulsory to fill in an IPF File!','Error') RETURN ENDIF INQUIRE(FILE=FNAME,EXIST=LEX) IF(.NOT.LEX)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Cannot find '//CHAR(13)//TRIM(FNAME),'Error') RETURN ENDIF ADIR='' IF(.NOT.UTL_WSELECTFILE('iMOD Map (*.ipf)|*.ipf|',& SAVEDIALOG+PROMPTON+NONEXPATH+DIRCHANGE+APPENDEXT,ADIR,& 'Save iMOD Map (*.ipf)'))RETURN CALL WDIALOGGETCHECKBOX(IDF_CHECK1,IASSF) CALL WDIALOGSELECT(ID_TOOLSTAB1) CALL WDIALOGGETMENU(IDF_MENU2,ILIST) IF(SUM(ILIST).NE.1)RETURN DO I=1,SIZE(ILIST) IF(ILIST(I).EQ.1)CTOPIC=LISTNAME(I) END DO CALL WDIALOGSELECT(ID_TOOLSTAB2) CALL WDIALOGGETINTEGER(IDF_INTEGER4,FYR) CALL WDIALOGGETINTEGER(IDF_INTEGER6,TYR) CALL WDIALOGGETINTEGER(IDF_INTEGER3,FDY) CALL WDIALOGGETINTEGER(IDF_INTEGER5,TDY) CALL WDIALOGGETMENU(IDF_MENU3,FMN) CALL WDIALOGGETMENU(IDF_MENU4,TMN) CALL WDIALOGGETMENU(IDF_MENU5,ILAY) DO I=1,SIZE(CLAY) DUMCLAY=CLAY(I) IF(ILAY(I).EQ.1)READ(DUMCLAY,'(I3)') IL END DO ! IU=UTL_GETUNIT() ! CALL OSD_OPEN(IU,FILE=TRIM(PREFVAL(1))//'\TMP\BATCH.TXT',STATUS='UNKNOWN') IPFNAME1=FNAME IPFNAME2=ADIR TSILAY=IL ! JD1=FYR*10000+FMN*100+FDY ! JD2=TYR*10000+TMN*100+TDY ! !## ts-batch-file ! WRITE(IU,'(A)') '"'//TRIM(FNAME)//'" !## old ipf file' ! WRITE(IU,'(A)') '"'//TRIM(ADIR)//'" !## new ipf file' ! WRITE(IU,'(I3,A)') IL,' !## ilay' ! WRITE(IU,*) FYR*10000+FMN*100+FDY,' !## start-date, yyyymmdd' ! WRITE(IU,*) TYR*10000+TMN*100+TDY,' !## end-date, yyyymmdd' ! WRITE(IU,*) IASSF TSDIR=TRIM(TOOLSDIR)//'\'//TRIM(CTOPIC)//'\'//TRIM(CTOPIC) ! WRITE(IU,'(A)') '"'//TRIM(TOOLSDIR)//'\'//TRIM(CTOPIC)//'" !## directory' ! CLOSE(IU) ! CALL TSBATCH(TRIM(PREFVAL(1))//'\TMP\BATCH.TXT',LOKAY) LCOL=0 CALL UTL_MESSAGEHANDLE(0) LOKAY=TS1COMPUTE(0) CALL TS_END() CALL UTL_MESSAGEHANDLE(1) !## make sure ipf is reread again IPF(1)%FNAME='' IF(LOKAY)THEN CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=ADIR) CALL IDFPLOTFAST(1) CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Successfully added timeserie information to'//CHAR(13)// & TRIM(ADIR)//CHAR(13)//'File has been added to you imod-manager','Information') ENDIF END SUBROUTINE TOOLS_APPLY_TS !###====================================================================== SUBROUTINE TOOLS_READYEARS(NYR,IYR) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(OUT) :: NYR INTEGER,POINTER,DIMENSION(:) :: IYR INTEGER :: I,IY,IY1,IY2 !## specified years!!! CALL WDIALOGGETMENU(IDF_MENU6,IYEAR) CALL WDIALOGGETINTEGER(IDF_INTEGER4,IY1) CALL WDIALOGGETINTEGER(IDF_INTEGER6,IY2) !## get proper number of years NYR=0 DO I=1,SIZE(IYEAR) DUMCYEAR=CYEAR(I) READ(DUMCYEAR,'(I4)') IY IF(IYEAR(I).EQ.1.AND.IY.GE.IY1.AND.IY.LE.IY2)NYR=NYR+1 ENDDO ALLOCATE(IYR(NYR)) NYR=0 DO I=1,SIZE(IYEAR) DUMCYEAR=CYEAR(I) READ(DUMCYEAR,'(I4)') IY IF(IYEAR(I).EQ.1.AND.IY.GE.IY1.AND.IY.LE.IY2)THEN NYR=NYR+1 IYR(NYR)=IY ENDIF ENDDO END SUBROUTINE TOOLS_READYEARS !###====================================================================== SUBROUTINE TOOLS_DEFINEAREA(ISEL,FNAME,GENFNAME) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(OUT) :: ISEL CHARACTER(LEN=*),INTENT(OUT) :: FNAME,GENFNAME INTEGER :: IALL CALL WDIALOGSELECT(ID_TOOLSTAB3) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,ISEL) !## use all of selected polygons only CALL WDIALOGGETCHECKBOX(IDF_CHECK2,IALL) !## entire area IF(ISEL.EQ.1)THEN !## polygon ELSEIF(ISEL.EQ.2)THEN !## write temporary gen-file GENFNAME=TRIM(PREFVAL(1))//'\TMP\tmp.gen' !## save ALL polygons - temporary IF(ALLOCATED(COPYSHPIACT))DEALLOCATE(COPYSHPIACT) ALLOCATE(COPYSHPIACT(MAXSHAPES)) COPYSHPIACT=SHP%POL%IACT !## save all of them IF(IALL.EQ.0)SHP%POL(1:SHP%NPOL)%IACT=1 CALL POLYGON1SAVELOADSHAPE(ID_SAVESHAPE,GENFNAME,'GEN',ISAVESEL=1) !## pointer from idf ELSEIF(ISEL.EQ.3)THEN CALL WDIALOGGETSTRING(IDF_STRING1,FNAME) ENDIF END SUBROUTINE TOOLS_DEFINEAREA !###====================================================================== SUBROUTINE TOOLS_REREADAREA() !###====================================================================== IMPLICIT NONE INTEGER :: IRADIO CALL WDIALOGSELECT(ID_TOOLSTAB3) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,IRADIO) IF(IRADIO.NE.2)RETURN !## load all polygons SHP%NPOL=0 CALL POLYGON1SAVELOADSHAPE(ID_LOADSHAPE,TRIM(PREFVAL(1))//'\TMP\TMP.GEN','GEN') SHP%POL%IACT=COPYSHPIACT CALL WDIALOGSELECT(ID_TOOLSTAB3) CALL WDIALOGPUTMENU(IDF_MENU1,SHP%POL%PNAME,SHP%NPOL,SHP%POL%IACT) ! CALL WDIALOGPUTOPTION(IDF_MENU1,SHP%POL%IACT) IF(ALLOCATED(COPYSHPIACT))DEALLOCATE(COPYSHPIACT) END SUBROUTINE TOOLS_REREADAREA !###====================================================================== SUBROUTINE TOOLS_FIELDS1(CODE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: CODE INTEGER :: I,K CALL WDIALOGSELECT(ID_TOOLSTAB1) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,I) !## directory user/getityourself K=I CALL WDIALOGFIELDSTATE(IDF_MENU1,K) K=ABS(I-1) CALL WDIALOGFIELDSTATE(ID_OPEN,K) CALL WDIALOGFIELDSTATE(IDF_STRING1,K) IF(CODE.EQ.0)THEN TOOLSNDIR=0 IF(I.EQ.1)THEN CALL UTL_IMODFILLMENU(IDF_MENU1,TRIM(PREFVAL(1))//'\MODELS\','*','D',TOOLSNDIR,0,1) ELSE !## dummy for directory get it yourself IF(IOSDIREXISTS(TOOLSBROWSENAME))TOOLSNDIR=1 ENDIF ENDIF IF(TOOLSNDIR.GT.0)THEN IF(I.EQ.1)THEN CALL WDIALOGSELECT(ID_TOOLSTAB1) CALL WDIALOGGETMENU(IDF_MENU1,K,ADIR) TOOLSDIR=TRIM(PREFVAL(1))//'\MODELS\'//TRIM(ADIR) CALL UTL_IMODFILLMENU(IDF_MENU2,TRIM(TOOLSDIR),'*','D',TOOLSNTOPIC,1,1) ELSE TOOLSDIR=TRIM(TOOLSBROWSENAME) CALL UTL_IMODFILLMENU(IDF_MENU2,TRIM(TOOLSDIR),'*','D',TOOLSNTOPIC,1,1) ENDIF ELSE TOOLSNTOPIC=0 CALL WDIALOGSELECT(ID_TOOLSTAB1) CALL WDIALOGCLEARFIELD(IDF_MENU1) CALL WDIALOGCLEARFIELD(IDF_MENU2) CALL WDIALOGFIELDSTATE(IDF_MENU2,0) ENDIF CALL WDIALOGSELECT(ID_TOOLSTAB1) CALL WDIALOGPUTSTRING(IDF_LABEL3,'No Result Type selected') CALL WDIALOGSELECT(ID_TOOLS) CALL WDIALOGFIELDSTATE(IDOK,0) SELECT CASE (TOOLSID) CASE (ID_WBAL_GENERATE) CALL WDIALOGFIELDSTATE(IDOK1,0) CALL WDIALOGFIELDSTATE(IDOK3,0) END SELECT CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB2,0) CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB3,0) CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB4,0) END SUBROUTINE TOOLS_FIELDS1 !###====================================================================== SUBROUTINE TOOLS_GETTYPE() !###====================================================================== IMPLICIT NONE INTEGER,PARAMETER :: LDIM=250 INTEGER :: I,J,K,N,NLAY,DATE1,DATE2 CHARACTER(LEN=256),ALLOCATABLE,DIMENSION(:) :: LISTIDF INTEGER,ALLOCATABLE,DIMENSION(:) :: TLAY INTEGER :: IS,IT,TIS,TIT,NYEAR,IY,IM,ID,IHR,IMT,ISC CHARACTER(LEN=100) :: TXT INTEGER(KIND=DP_KIND) :: DDATE1,DDATE2,MINDATE,MAXDATE CALL WDIALOGSELECT(ID_TOOLSTAB1) CALL WDIALOGGETMENU(IDF_MENU2,ILIST) !## cannot continue for steady-state solutions and/or more than one selected item in case of gxg/timeseries/mean IF(TOOLSID.EQ.ID_GXG.OR.TOOLSID.EQ.ID_TS.OR.TOOLSID.EQ.ID_MEAN)THEN IF(SUM(ILIST).NE.1)RETURN ! IF(SUM(TP%IACT).NE.1)TP%IACT=0 ENDIF CALL UTL_MESSAGEHANDLE(0) ! CALL TOOLS_FIELDS1_GETTOPIC() CALL WDIALOGSELECT(ID_TOOLS) CALL WDIALOGFIELDSTATE(IDF_PROGRESS1,1) CALL WDIALOGFIELDSTATE(IDF_PROGRESS2,1) ! !## proper topics found ! IF(SUM(TP%IACT).NE.0)THEN CALL IOSDIRENTRYTYPE('F') IF(ALLOCATED(ILAY))DEALLOCATE(ILAY) ALLOCATE(ILAY(LDIM),TLAY(LDIM)) !## get list of filenames TLAY = 1 IF(TOOLSID.EQ.ID_WBAL_GENERATE)TLAY=0 MINDATE= 21001231000000 MAXDATE=-18000101000000 TIS =0 TIT =0 N=0; DO I=1,SIZE(ILIST); IF(ILIST(I).EQ.1)N=N+1; ENDDO CALL WDIALOGSELECT(ID_TOOLS) CALL WDIALOGRANGEPROGRESSBAR(IDF_PROGRESS1,0,N) CALL WDIALOGPUTPROGRESSBAR(IDF_PROGRESS1,0,0) DO I=1,SIZE(ILIST) IF(ILIST(I).EQ.0)CYCLE CALL WDIALOGSELECT(ID_TOOLS) CALL WDIALOGPUTPROGRESSBAR(IDF_PROGRESS1,1,1) CALL IOSDIRCOUNT(TRIM(TOOLSDIR)//'\'//TRIM(LISTNAME(I)),'*.IDF',N) IF(N.GT.0)THEN CALL WDIALOGSELECT(ID_TOOLS) CALL WDIALOGRANGEPROGRESSBAR(IDF_PROGRESS2,0,N) CALL WDIALOGPUTPROGRESSBAR(IDF_PROGRESS2,0,0) IF(ALLOCATED(LISTIDF))DEALLOCATE(LISTIDF); ALLOCATE(LISTIDF(N)) CALL UTL_DIRINFO(TRIM(TOOLSDIR)//'\'//TRIM(LISTNAME(I)),'*.IDF',LISTIDF,N,'F') !## get max. nlayers CALL UTL_IDFGETLAYERS(LISTIDF,SIZE(LISTIDF),ILAY) !## to be sure all selected are available for these model layers (not in case of Waterbalancing) IF(TOOLSID.NE.ID_WBAL_GENERATE)THEN DO J=1,LDIM IF(TLAY(J).EQ.0.AND.ILAY(J).EQ.1)ILAY(J)=0 END DO TLAY=ILAY ELSE TLAY=TLAY+ILAY !## count maximal number of existing modellayers ENDIF !## get mindate/maxdate CALL UTL_IDFGETDATES(LISTIDF,SIZE(LISTIDF),IS,IT,DDATE1,DDATE2,IDF_PROGRESS2) TIS=TIS+IS TIT=TIT+IT IF(IT.GT.0)THEN MINDATE=MIN(MINDATE,DDATE1) MAXDATE=MAX(MAXDATE,DDATE2) ENDIF ENDIF END DO !## copy ilay=tlay ILAY=MIN(TLAY,1) TLAY=ILAY NLAY=SUM(TLAY) !## cannot continue for steady-state solutions and/or more than one selected item in case of gxg/timeseries/mean IF(TOOLSID.EQ.ID_GXG.OR.TOOLSID.EQ.ID_TS.OR.TOOLSID.EQ.ID_MEAN)THEN IF(TIT.EQ.0.OR.SUM(TP%IACT).NE.1)TIS=0 ENDIF IF(SUM(TLAY).GT.0.AND. & !## layers found (TIS.NE.0.OR.TIT.NE.0))THEN !## steady-state or transient files found CALL WDIALOGSELECT(ID_TOOLSTAB2) IF(TOOLSID.EQ.ID_WBAL_GENERATE)THEN !## not steady-state available CALL WDIALOGFIELDSTATE(IDF_RADIO1,MIN(1,MAX(0,TIS))) !## not transient available CALL WDIALOGFIELDSTATE(IDF_RADIO2,MIN(1,MAX(0,TIT))) IF(TIS.GT.0)THEN CALL WDIALOGFIELDSTATE(IDF_RADIO1,1) CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO1) ELSEIF(TIT.GT.0)THEN CALL WDIALOGFIELDSTATE(IDF_RADIO2,1) CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO2) ENDIF ENDIF IF(TIT.GT.0)THEN !## put begin date CALL ITIMETOGDATE(MINDATE,IY,IM,ID,IHR,IMT,ISC) DATE1=IY*10000+IM*100+ID CALL UTL_FILLDATESDIALOG(ID_TOOLSTAB2,IDF_INTEGER3,IDF_MENU3,IDF_INTEGER4,DATE1) CALL WDIALOGPUTINTEGER(IDF_INTEGER9,IHR) CALL WDIALOGPUTINTEGER(IDF_INTEGER10,IMT) CALL WDIALOGPUTINTEGER(IDF_INTEGER11,ISC) !## put end date CALL ITIMETOGDATE(MAXDATE,IY,IM,ID,IHR,IMT,ISC) DATE2=IY*10000+IM*100+ID CALL UTL_FILLDATESDIALOG(ID_TOOLSTAB2,IDF_INTEGER5,IDF_MENU4,IDF_INTEGER6,DATE2) CALL WDIALOGPUTINTEGER(IDF_INTEGER14,IHR) CALL WDIALOGPUTINTEGER(IDF_INTEGER13,IMT) CALL WDIALOGPUTINTEGER(IDF_INTEGER12,ISC) ENDIF IF(ALLOCATED(CLAY))DEALLOCATE(CLAY); ALLOCATE(CLAY(NLAY)) J=0 DO I=1,LDIM IF(TLAY(I).EQ.1)THEN J=J+1 CLAY(J)=TRIM(ITOS(I)) ENDIF END DO NLAY=J ILAY=0 SELECT CASE (TOOLSID) CASE (ID_WBAL_GENERATE) ILAY=1 CASE (ID_GXG,ID_TS,ID_MEAN) ILAY(1)=1 END SELECT CALL WDIALOGSELECT(ID_TOOLSTAB2) CALL WDIALOGPUTSTRING(IDF_LABEL5,'Based upon '//TRIM(ITOS(TIT+TIS))//' files found in selected map') CALL WDIALOGPUTMENU(IDF_MENU5,CLAY,NLAY,ILAY) IF(ALLOCATED(CYEAR))DEALLOCATE(CYEAR) IF(ALLOCATED(IYEAR))DEALLOCATE(IYEAR) IF(TIT.GT.0)THEN CALL WDIALOGGETINTEGER(IDF_INTEGER4,J) CALL WDIALOGGETINTEGER(IDF_INTEGER6,K) NYEAR=K-J+1 ALLOCATE(CYEAR(NYEAR),IYEAR(NYEAR)) DO I=1,NYEAR WRITE(CYEAR(I),'(I4)') I+J-1 END DO IYEAR=1 CALL WDIALOGPUTMENU(IDF_MENU6,CYEAR,NYEAR,IYEAR) ELSE NYEAR=1 ALLOCATE(CYEAR(NYEAR),IYEAR(NYEAR)) CALL WDIALOGCLEARFIELD(IDF_MENU6) ENDIF CALL TOOLS_FIELDS2() !## okay, something correct found I=1 TXT='Found '//TRIM(ITOS(TIS+TIT))//' correct files' ELSE I=0 TXT='Found NO correct files, lacking layer OR time information' ENDIF IF(ALLOCATED(TLAY)) DEALLOCATE(TLAY) CALL WDIALOGSELECT(ID_TOOLSTAB1) CALL WDIALOGPUTSTRING(IDF_LABEL3,TRIM(TXT)) CALL WDIALOGSELECT(ID_TOOLSTAB2) SELECT CASE (TOOLSID) CASE (ID_GXG,ID_TS,ID_MEAN) CALL WDIALOGPUTSTRING(IDF_LABEL4,'Select one layer only') CASE (ID_WBAL_GENERATE) CALL WDIALOGPUTSTRING(IDF_LABEL4,'Select one or more of the layers') END SELECT CALL WDIALOGSELECT(ID_TOOLS) CALL WDIALOGFIELDSTATE(IDOK,I) CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB2,I) SELECT CASE (TOOLSID) CASE (ID_MEAN) CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB3,I) !## area CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB4,0) !## surface level CASE (ID_GXG) CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB3,I) !## area CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB4,I) !## surface level CASE (ID_TS) CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB3,0) !## area CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB4,I) !## surface level CASE (ID_WBAL_GENERATE) CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB3,I) !## area CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB4,0) !## surface level CALL WDIALOGFIELDSTATE(IDOK1,I) CALL WDIALOGFIELDSTATE(IDOK3,I) END SELECT CALL WDIALOGSELECT(ID_TOOLS) CALL WDIALOGFIELDSTATE(IDF_PROGRESS1,3) CALL WDIALOGFIELDSTATE(IDF_PROGRESS2,3) CALL UTL_MESSAGEHANDLE(1) END SUBROUTINE TOOLS_GETTYPE ! !###====================================================================== ! SUBROUTINE TOOLS_FIELDS1_GETTOPIC() ! !###====================================================================== ! IMPLICIT NONE ! INTEGER :: I,ITOPIC ! ! !## get topics ! CALL WDIALOGSELECT(ID_TOOLSTAB1) ! CALL WDIALOGGETMENU(IDF_MENU2,ILIST) ! ! TP%IACT=0 ! DO I=1,SIZE(ILIST) ! IF(ILIST(I).EQ.1)THEN ! LISTNAME(I)=UTL_CAP(LISTNAME(I),'U') ! ITOPIC=GETITOPIC(LISTNAME(I)) ! IF(ITOPIC.NE.0)THEN ! TP(ITOPIC)%IACT=1 ! SELECT CASE (TOOLSID) ! CASE (ID_WBAL_GENERATE) ! IF(TP(ITOPIC)%ACRNM(1:3).NE.'BDG'.AND. & ! TP(ITOPIC)%ACRNM(1:3).NE.'MSW')THEN ! TP(ITOPIC)%IACT=0 ! ILIST(I) =0 ! ENDIF ! CASE (ID_GXG) ! IF(TP(ITOPIC)%ACRNM(1:4).NE.'HEAD'.AND. & ! TP(ITOPIC)%ACRNM(1:3).NE.'GWL')THEN ! TP(ITOPIC)%IACT=0 ! ILIST(I) =0 ! ENDIF ! END SELECT ! ENDIF ! ENDIF ! ENDDO ! ! END SUBROUTINE TOOLS_FIELDS1_GETTOPIC !###====================================================================== SUBROUTINE TOOLS_FIELDS2() !###====================================================================== IMPLICIT NONE INTEGER :: I,J CALL WDIALOGSELECT(ID_TOOLSTAB2) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,J) !## 1=steady/2=transient SELECT CASE (TOOLSID) CASE (ID_WBAL_GENERATE) I=ABS(J-1) CASE (ID_GXG,ID_TS,ID_MEAN) I=1 END SELECT CALL WDIALOGFIELDSTATE(IDF_INTEGER3,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER4,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER5,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER6,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER9,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER10,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER11,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER12,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER13,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER14,I) CALL WDIALOGFIELDSTATE(IDF_MENU3,I) CALL WDIALOGFIELDSTATE(IDF_MENU4,I) CALL WDIALOGFIELDSTATE(IDF_LABEL9,I) CALL WDIALOGFIELDSTATE(IDF_LABEL10,I) CALL WDIALOGFIELDSTATE(IDF_MENU6,I) CALL WDIALOGFIELDSTATE(IDF_GROUP6,I) CALL WDIALOGFIELDSTATE(IDF_CHECK1,I) CALL UTL_FILLDATES(IDF_INTEGER4,IDF_MENU3,IDF_INTEGER3) CALL UTL_FILLDATES(IDF_INTEGER6,IDF_MENU4,IDF_INTEGER5) SELECT CASE (TOOLSID) CASE (ID_GXG,ID_WBAL_GENERATE,ID_MEAN) CALL WDIALOGSELECT(ID_TOOLSTAB2) !## transient' IF(J.EQ.2)THEN CALL WDIALOGGETCHECKBOX(IDF_CHECK1,I) CALL WDIALOGFIELDSTATE(IDF_STRING1,I) !## steady state ELSE CALL WDIALOGFIELDSTATE(IDF_STRING1,I) ENDIF CASE (ID_TS) CALL WDIALOGSELECT(ID_TOOLSTAB2) CALL WDIALOGFIELDSTATE(IDF_CHECK1,3) CALL WDIALOGFIELDSTATE(IDF_STRING1,3) END SELECT ILAY=0 CALL WDIALOGSELECT(ID_TOOLSTAB2) CALL WDIALOGGETMENU(IDF_MENU5,ILAY) IYEAR=1 !## fake for steady-state conditions IF(J.EQ.2)CALL WDIALOGGETMENU(IDF_MENU6,IYEAR) CALL WDIALOGSELECT(ID_TOOLSTAB2) I=1; J=1 SELECT CASE (TOOLSID) CASE (ID_WBAL_GENERATE,ID_MEAN) IF(SUM(ILAY) .EQ.0)I=0 IF(SUM(IYEAR).EQ.0)J=0 IF(I.EQ.0)CALL WDIALOGPUTSTRING(IDF_LABEL1,'Select at least one layer') IF(J.EQ.0)CALL WDIALOGPUTSTRING(IDF_LABEL1,'Select at least one year') CASE (ID_GXG) IF(SUM(ILAY) .NE.1)I=0 IF(SUM(IYEAR).LE.1)J=0 IF(I.EQ.0)CALL WDIALOGPUTSTRING(IDF_LABEL1,'Select one layer only') IF(J.EQ.0)CALL WDIALOGPUTSTRING(IDF_LABEL1,'Select at least two years') CASE (ID_TS) IF(SUM(ILAY) .NE.1)I=0 IF(SUM(IYEAR).EQ.0)J=0 IF(I.EQ.0)CALL WDIALOGPUTSTRING(IDF_LABEL1,'Select one layer only') IF(J.EQ.0)CALL WDIALOGPUTSTRING(IDF_LABEL1,'Select at least one year') END SELECT IF(I.EQ.1.AND.J.EQ.1)CALL WDIALOGPUTSTRING(IDF_LABEL1,'') CALL WDIALOGSELECT(ID_TOOLS) CALL WDIALOGFIELDSTATE(IDOK ,MIN(I,J)) SELECT CASE (TOOLSID) CASE (ID_WBAL_GENERATE) CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB3,I) !## area CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB4,0) !## surface level CALL WDIALOGFIELDSTATE(IDOK1,MIN(I,J)) CALL WDIALOGFIELDSTATE(IDOK3,MIN(I,J)) CASE (ID_GXG) CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB3,I) !## area IF(J.EQ.1)CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB4,I) !## surface level (optional) CASE (ID_MEAN) CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB3,I) !## area CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB4,0) !## surface level CASE (ID_TS) CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB3,0) !## area END SELECT END SUBROUTINE TOOLS_FIELDS2 !###====================================================================== SUBROUTINE TOOLS_FIELDS3() !###====================================================================== IMPLICIT NONE INTEGER :: I,J,K,L LOGICAL :: LEX CALL WDIALOGSELECT(ID_TOOLSTAB3) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,I) J=0 K=0 L=0 IF(I.EQ.1)THEN J=1 ELSEIF(I.EQ.2)THEN L=1 IF(SHP%NPOL.GT.0)THEN CALL WDIALOGGETMENU(IDF_MENU1,SHP%POL%IACT) IF(SUM(SHP%POL(1:SHP%NPOL)%IACT).GT.0)J=1 ENDIF ELSEIF(I.EQ.3)THEN K=1 CALL WDIALOGGETSTRING(IDF_STRING1,FNAME) IF(LEN_TRIM(FNAME).NE.0)THEN INQUIRE(FILE=FNAME,EXIST=LEX) IF(LEX)J=1 ENDIF IF(J.EQ.1)CALL WDIALOGPUTSTRING(IDF_LABEL1,'') IF(J.NE.1)CALL WDIALOGPUTSTRING(IDF_LABEL1,'Entered IDF file does not exist') ENDIF CALL WDIALOGFIELDSTATE(ID_LOADSHAPE,L) CALL WDIALOGFIELDSTATE(ID_DRAW,L) CALL WDIALOGFIELDSTATE(IDF_CHECK2,L) CALL WDIALOGFIELDSTATE(ID_OPEN,K) CALL WDIALOGFIELDSTATE(IDF_STRING1,K) CALL WDIALOGSELECT(ID_TOOLS) CALL WDIALOGFIELDSTATE(IDOK,J) SELECT CASE (TOOLSID) CASE (ID_WBAL_GENERATE) CALL WDIALOGFIELDSTATE(IDOK1,J) CALL WDIALOGFIELDSTATE(IDOK3,J) END SELECT END SUBROUTINE TOOLS_FIELDS3 !###====================================================================== SUBROUTINE TOOLS_FIELDS4() !###====================================================================== IMPLICIT NONE INTEGER :: I LOGICAL :: LEX CALL WDIALOGSELECT(ID_TOOLSTAB4) CALL WDIALOGGETSTRING(IDF_STRING1,FNAME) !## optional if empty IF(LEN_TRIM(FNAME).EQ.0)THEN I=1 ELSE INQUIRE(FILE=FNAME,EXIST=LEX) I=0; IF(LEX)I=1 ENDIF CALL WDIALOGSELECT(ID_TOOLS) CALL WDIALOGFIELDSTATE(IDOK,I) SELECT CASE (TOOLSID) CASE (ID_WBAL_GENERATE) CALL WDIALOGFIELDSTATE(IDOK1,I) CALL WDIALOGFIELDSTATE(IDOK3,I) END SELECT END SUBROUTINE TOOLS_FIELDS4 !###====================================================================== SUBROUTINE TOOLS_READHEADERIPF() !###====================================================================== IMPLICIT NONE CHARACTER(LEN=256) :: FNAME INTEGER :: IU,I,ICN,IOS,NCOL CALL WDIALOGSELECT(ID_TOOLSTAB4) CALL WDIALOGGETSTRING(IDF_STRING1,FNAME) IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=FNAME,ACTION='READ,DENYWRITE',FORM='FORMATTED',IOSTAT=IOS) IF(IOS.EQ.0)THEN READ(IU,*) READ(IU,*) NCOL DO I=1,NCOL READ(IU,*) END DO READ(IU,*) ICN ICN=MIN(1,ICN) CLOSE(IU) ELSE ICN=0 ENDIF ! CALL WDIALOGSELECT(ID_TOOLSTAB4) CALL WDIALOGFIELDSTATE(IDF_CHECK1,ICN) END SUBROUTINE TOOLS_READHEADERIPF !###====================================================================== SUBROUTINE TOOLS_DRAWIPF() !###====================================================================== IMPLICIT NONE INTEGER,PARAMETER :: MAXCRD=1000.0D0 TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,IU,I INTEGER :: NIPF REAL(KIND=DP_KIND),ALLOCATABLE,DIMENSION(:) :: XCRD,YCRD REAL(KIND=DP_KIND) :: DX,DY ALLOCATE(XCRD(MAXCRD),YCRD(MAXCRD)) CALL WCURSORSHAPE(ID_CURSORPIPET) DX=(MPW%XMAX-MPW%XMIN)/500.0D0 DY=(MPW%YMAX-MPW%YMIN)/500.0D0 CALL IGRCOLOURN(WRGB(255,0,0)) CALL IGRFILLPATTERN(SOLID) CALL IGRPLOTMODE(MODECOPY) NIPF=0 DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) !## mouse-move CASE (MOUSEMOVE) CALL WINDOWSELECT(0) CALL WINDOWOUTSTATUSBAR(1,'X:'//TRIM(ITOS(INT(MESSAGE%GX)))//' m, Y:'// & TRIM(ITOS(INT(MESSAGE%GY)))//' m') CASE (MOUSEBUTDOWN) SELECT CASE (MESSAGE%VALUE1) CASE (1) NIPF =NIPF+1 XCRD(NIPF)=MESSAGE%GX YCRD(NIPF)=MESSAGE%GY CALL UTL_PLOT1BITMAP() CALL DBL_IGRJOIN(XCRD(NIPF)-DX,YCRD(NIPF),XCRD(NIPF)+DX,YCRD(NIPF)) CALL DBL_IGRJOIN(XCRD(NIPF),YCRD(NIPF)-DY,XCRD(NIPF),YCRD(NIPF)+DY) CALL UTL_PLOT2BITMAP() CASE (3) EXIT END SELECT !## bitmap scrolled, renew top-left pixel coordinates CASE (BITMAPSCROLLED) MPW%IX=MESSAGE%VALUE1 MPW%IY=MESSAGE%VALUE2 END SELECT END DO CALL WCURSORSHAPE(CURARROW) CALL IGRCOLOURN(WRGB(255,255,255)) CALL IGRFILLPATTERN(OUTLINE) FNAME='' IF(.NOT.UTL_WSELECTFILE('iMOD Pointer File (*.ipf)|*.ipf|',& SAVEDIALOG+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,& 'Save iMOD Pointer File (*.ipf)'))RETURN CALL WDIALOGSELECT(ID_TOOLSTAB4) CALL WDIALOGPUTSTRING(IDF_STRING1,TRIM(FNAME)) ! !## no editable - to avoid overwrite questioning ! CALL WDIALOGFIELDSTATE(IDF_STRING1,2) IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=FNAME,STATUS='REPLACE',FORM='FORMATTED') WRITE(IU,*) NIPF WRITE(IU,*) 2 WRITE(IU,*) 'XCRD' WRITE(IU,*) 'YCRD' WRITE(IU,*) '0,TXT' DO I=1,NIPF LINE=TRIM(RTOS(XCRD(I),'F',2))//','//TRIM(RTOS(YCRD(I),'F',2)) WRITE(IU,*) TRIM(LINE) END DO CLOSE(IU) DEALLOCATE(XCRD,YCRD) CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=FNAME) CALL IDFPLOTFAST(1) END SUBROUTINE TOOLS_DRAWIPF !###====================================================================== SUBROUTINE TOOLS_INIT(ID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID INTEGER :: I CALL WINDOWSELECT(0) IF(WMENUGETSTATE(ID,2).EQ.1)THEN CALL TOOLS_CLOSE() RETURN ENDIF CALL MAIN_UTL_INACTMODULE(ID) TOOLSID=ID !## other module no closed, no approvement given IF(IDIAGERROR.EQ.1)RETURN CALL WMENUSETSTATE(TOOLSID,2,1) CALL WDIALOGLOAD(ID_TOOLS,ID_TOOLS) CALL WDIALOGFIELDSTATE(IDOK1,3) CALL WDIALOGFIELDSTATE(IDOK3,3) SELECT CASE (TOOLSID) CASE (ID_WBAL_GENERATE) CALL WDIALOGTITLE('Compute Waterbalance') CALL WDIALOGPUTSTRING(IDF_GROUP1,'Save Water Balance As:') CALL WDIALOGPUTSTRING(IDOK,'Create CSV ...') CASE (ID_GXG) CALL WDIALOGTITLE('Compute GxG'//CHAR(39)//'s') CALL WDIALOGPUTSTRING(IDF_GROUP1,'Save GxGs As:') CALL WDIALOGPUTSTRING(IDOK,'Create IDF ...') CASE (ID_TS) CALL WDIALOGTITLE('Compute Timeseries') CALL WDIALOGPUTSTRING(IDF_GROUP1,'Save Timeseries As:') CALL WDIALOGPUTSTRING(IDOK,'Create IPF ...') CASE (ID_MEAN) CALL WDIALOGTITLE('Compute Mean Values') CALL WDIALOGPUTSTRING(IDF_GROUP1,'Save Mean Values As:') CALL WDIALOGPUTSTRING(IDOK,'Create IDF ...') END SELECT CALL WDIALOGFIELDSTATE(IDF_PROGRESS1,3) CALL WDIALOGFIELDSTATE(IDF_PROGRESS2,3) CALL WDIALOGSELECT(ID_TOOLSTAB1) SELECT CASE (TOOLSID) CASE (ID_GXG,ID_TS,ID_MEAN) ! CALL WDIALOGTITLE('Result Folder') CALL WDIALOGFIELDSTATE(IDF_MODFLOW,3) CALL WDIALOGFIELDSTATE(IDF_METASWAP,3) CALL WDIALOGPUTSTRING(IDF_LABEL4,'Select Term:') CASE (ID_WBAL_GENERATE) CALL WDIALOGPUTSTRING(IDF_LABEL4,'Select Budget Term:') END SELECT CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPEN,1) !## string editable, changes will be monitored directly CALL WDIALOGFIELDOPTIONS(IDF_STRING1,EDITFIELDCHANGED,ENABLED) CALL WDIALOGSELECT(ID_TOOLSTAB2) CALL WDIALOGPUTSTRING(IDF_RADIO1,'Steady-State (Names contain "steady-state")') SELECT CASE (TOOLSID) CASE (ID_GXG,ID_TS,ID_MEAN) CALL WDIALOGPUTSTRING(IDF_RADIO2,'Transient (Names contain "_yyyymmdd_")') CASE (ID_WBAL_GENERATE) CALL WDIALOGPUTSTRING(IDF_RADIO2,'Transient (Names contain "_yyyymmdd_" or "_yyyymmddhhmmss_")') END SELECT CALL WDIALOGTITLE('Period and Layers') SELECT CASE (TOOLSID) CASE (ID_WBAL_GENERATE) CASE (ID_GXG,ID_MEAN,ID_TS) CALL WDIALOGFIELDSTATE(IDF_RADIO1,0) CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO2) END SELECT CALL WDIALOGPUTMENU(IDF_MENU3,CDATE,12,1) CALL WDIALOGPUTMENU(IDF_MENU4,CDATE,12,12) CALL WDIALOGPUTINTEGER(IDF_INTEGER3,1) CALL WDIALOGPUTINTEGER(IDF_INTEGER5,31) CALL WDIALOGPUTINTEGER(IDF_INTEGER4,1996) CALL WDIALOGPUTINTEGER(IDF_INTEGER6,2004) I=3 IF(TOOLSID.EQ.ID_MEAN.OR.TOOLSID.EQ.ID_WBAL_GENERATE)I=1 !## showing number of selected years, only for mean CALL WDIALOGFIELDSTATE(IDF_GROUP6,I) CALL WDIALOGFIELDSTATE(IDF_MENU6,I) CALL WDIALOGSELECT(ID_TOOLSTAB3) SELECT CASE (TOOLSID) CASE (ID_WBAL_GENERATE,ID_GXG,ID_MEAN) CALL WDIALOGTITLE('Apply To') END SELECT SELECT CASE (TOOLSID) CASE (ID_GXG,ID_MEAN) CALL WDIALOGFIELDSTATE(IDF_CHECK1,3) END SELECT CALL POLYGON1IMAGES(ID_TOOLSTAB3) CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPENIDF,1) CALL WDIALOGFIELDOPTIONS(IDF_STRING1,EDITFIELDCHANGED,ENABLED) CALL WDIALOGSELECT(ID_TOOLSTAB4) CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(ID_DRAW,ID_ICONDRAW,1) !## string editable, changes will be monitored directly CALL WDIALOGFIELDOPTIONS(IDF_STRING1,EDITFIELDCHANGED,ENABLED) SELECT CASE (TOOLSID) CASE (ID_WBAL_GENERATE,ID_GXG,ID_MEAN) CALL WDIALOGTITLE('Surface Level') CALL WDIALOGFIELDSTATE(ID_DRAW,3) CALL WDIALOGFIELDSTATE(IDF_CHECK1,3) END SELECT TOOLSNDIR=0; CALL TOOLS_FIELDS1(0) CALL POLYGON1INIT(); CALL POLYGON1FIELDS(ID_TOOLSTAB3); CALL TOOLS_FIELDS3() CALL WDIALOGSELECT(ID_TOOLS); CALL UTL_DIALOGSHOW(-1,-1,0,2) END SUBROUTINE TOOLS_INIT END MODULE MOD_TOOLS