!! 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 MOD_TOOLS USE WINTERACTER USE RESOURCE USE MOD_UTL, ONLY : UTL_FILLDATES,UTL_DIRINFO,UTL_GETUNIT,GETITOPIC,UTL_IMODFILLMENU,ILIST,LISTNAME,UTL_IDFGETLAYERS, & UTL_IDFGETDATES,IDATETOGDATE,ITOS,RTOS,IDFPLOT1BITMAP,IDFPLOT2BITMAP,UTL_WSELECTFILE, & UTL_FILLDATESDIALOG,UTL_MESSAGEHANDLE USE MOD_PREF_PAR, ONLY : PREFVAL USE IMODVAR, ONLY : 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,WBAL_GRAPHCOMPUTE USE MOD_GXG_CLC, ONLY : FGLG,FGHG,FGVG,FGT,FNLEG,GXG1COMPUTEGXG,GXG1ABORT USE MOD_MEAN_CLC, ONLY : MEAN1COMPUTE,MEAN1ABORT USE MOD_TS_CLC, ONLY : TS1COMPUTE,TS_END USE MOD_TS_PAR, ONLY : IPFNAME1,IPFNAME2,TSILAY,JD1,JD2,IASSF,TSDIR,IBATCH,LCOL USE MOD_IPF_PAR, ONLY : IPF USE MOD_OSD, ONLY : OSD_OPEN USE IMOD USE MOD_TOOLS_UTL, ONLY : TOOLS1GETPERIODS,TOOLS2GETPERIODS INTEGER,PRIVATE :: TOOLSNTOPIC,TOOLSNDIR,TOOLSID CHARACTER(LEN=256) :: TOOLSBROWSENAME,TOOLSDIR,ADIR,FNAME,LINE CHARACTER(LEN=3),ALLOCATABLE,DIMENSION(:) :: CLAY CHARACTER(LEN=4),ALLOCATABLE,DIMENSION(:) :: CYEAR INTEGER,ALLOCATABLE,DIMENSION(:) :: ILAY,IYEAR INTEGER,ALLOCATABLE,DIMENSION(:) :: COPYSHPIACT INTEGER,POINTER,DIMENSION(:,:) :: IPERIOD CHARACTER(LEN=3) :: DUMCLAY !## cause lahey90 will not take this CHARACTER(LEN=4) :: DUMCYEAR !## cause lahey90 will not take this CONTAINS !###====================================================================== SUBROUTINE TOOLS1MAIN(ITYPE,MESSAGE) !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE INTEGER,INTENT(IN) :: ITYPE 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) CALL IMODGETHELP('5.12','TMO.CompWatBal') CASE (ID_GXG) CALL IMODGETHELP('5.13','TMO.GxG') CASE (ID_MEAN) CALL IMODGETHELP('5.14','TMO.CompMeanVal') CASE (ID_TS) CALL IMODGETHELP('5.15','TMO.CompTimeSer') END SELECT CASE (IDCANCEL) CALL TOOLS1CLOSE() CASE (IDOK) SELECT CASE (TOOLSID) CASE (ID_WBAL) CALL TOOLS1APPLY_WBAL() CASE (ID_GXG) CALL TOOLS1APPLY_GXG() CASE (ID_MEAN) CALL TOOLS1APPLY_MEAN() CASE (ID_TS) CALL TOOLS1APPLY_TS() END SELECT CASE (ID_OPEN) IF(UTL_WSELECTFILE('iMOD Waterbalance File (*.csv)|*.csv|',& LOADDIALOG+MUSTEXIST+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,& 'Load iMOD Waterbalance File (*.csv)'))THEN IF(WBAL_GRAPHCOMPUTE(FNAME))THEN; ENDIF ENDIF END SELECT END SELECT !## maps/results CASE (ID_TOOLSTAB1) SELECT CASE(ITYPE) CASE (FIELDCHANGED) IF(MESSAGE%VALUE1.EQ.MESSAGE%VALUE2)THEN SELECT CASE (MESSAGE%VALUE2) CASE (IDF_RADIO1,IDF_RADIO2,IDF_RADIO3,IDF_RADIO4) CALL TOOLS1FIELDS1(0) CASE (IDF_MENU1) CALL TOOLS1FIELDS1(1) CASE (IDF_MENU2) CALL TOOLS1GETTYPE() CASE (IDF_STRING1) CALL WDIALOGGETSTRING(IDF_STRING1,TOOLSBROWSENAME) CALL TOOLS1FIELDS1(0) END SELECT ENDIF CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) 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 TOOLS1FIELDS1(0) END SELECT 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 TOOLS1FIELDS2() END SELECT END SELECT !## results/polygon/areas CASE (ID_TOOLSTAB3) IACTSHAPES=(/3,3,1,3,3,3/) CALL POLYGON1MAIN(ITYPE,MESSAGE) CALL TOOLS1FIELDS3() SELECT CASE(ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_RADIO1,IDF_RADIO2,IDF_RADIO3,IDF_STRING1) CALL TOOLS1FIELDS3() CASE (IDF_MENU1) CALL TOOLS1FIELDS3() END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_OPEN) CALL WDIALOGSELECT(MESSAGE%WIN) CALL TOOLS1OPENIDF() CALL TOOLS1FIELDS3() 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 TOOLS1READHEADERIPF() CALL TOOLS1FIELDS4() END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_OPEN) CALL WDIALOGSELECT(MESSAGE%WIN) CALL TOOLS1OPENIDF() CALL TOOLS1FIELDS4() CASE (ID_DRAW) CALL TOOLS1DRAWIPF() END SELECT END SELECT END SELECT END SUBROUTINE TOOLS1MAIN !###====================================================================== SUBROUTINE TOOLS1OPENIDF() !###====================================================================== IMPLICIT NONE IF(TOOLSID.EQ.ID_TS)THEN FNAME=TRIM(PREFVAL(1))//'\*.IPF' 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 FNAME=TRIM(PREFVAL(1))//'\*.IDF' 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 TOOLS1READHEADERIPF()!FNAME) CALL IDFINIT(IDFNAMEGIVEN=FNAME)!,'') ENDIF END SUBROUTINE TOOLS1OPENIDF !###====================================================================== SUBROUTINE TOOLS1APPLY_WBAL() !###====================================================================== USE MOD_WBAL_PAR USE MOD_PROFILE_UTL, ONLY : GRAPH,PROFILE_PLOTGRAPH,PROFILE_DEALLGRAPH,PROFILE_ALLGRAPH !,PROFILE_GETFORMAT IMPLICIT NONE INTEGER :: I,J,K,IY,IM,ID,ICSV,JPERIOD,IERROR CHARACTER(LEN=500) :: STRING LOGICAL :: LEX CALL WDIALOGSELECT(ID_TOOLS) ICSV =1 WBAL_OUTFNAME=TRIM(TOOLSDIR)//'\wbal.txt' IF(.NOT.UTL_WSELECTFILE('Textfile (*.txt)|*.txt|Comma-Separated File (*.csv)|*.csv|iMOD Point File (*.ipf)|*.ipf|', & SAVEDIALOG+PROMPTON+NONEXPATH+DIRCHANGE+APPENDEXT, & WBAL_OUTFNAME,'Specify Filename for Budget Saving'))RETURN !,ICSV))RETURN CALL IUPPERCASE(WBAL_OUTFNAME) I=INDEXNOCASE(WBAL_OUTFNAME,'.',.TRUE.) SELECT CASE (WBAL_OUTFNAME(I+1:I+3)) CASE ('TXT') ICSV=1 CASE ('CSV') ICSV=2 CASE ('IPF') ICSV=3 CASE DEFAULT CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD can not recognize the file extension given','Error') RETURN END SELECT 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 TOOLS2GETPERIODS(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) CALL WDIALOGGETCHECKBOX(IDF_CHECK2,J) DO I=1,SIZE(TP) IF(ASSOCIATED(TP(I)%ISYS))DEALLOCATE(TP(I)%ISYS) ALLOCATE(TP(I)%ISYS(MXSYS)) TP(I)%ISYS=0 IF(J.EQ.1)THEN DO K=1,MXSYS; TP(I)%ISYS(K)=K; ENDDO TP(I)%NSYS=MXSYS ELSE TP(I)%NSYS=1 TP(I)%ISYS(1)=0 ENDIF ENDDO !## write type of area to be used CALL TOOLS1DEFINEAREA(WBAL_ISEL,WBAL_IDFNAME,WBAL_GENFNAME) !## 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 WDIALOGGETMENU(IDF_MENU3,IM) WBAL_FYR=IY*10000+IM*100+ID CALL WDIALOGGETINTEGER(IDF_INTEGER5,ID) CALL WDIALOGGETINTEGER(IDF_INTEGER6,IY) CALL WDIALOGGETMENU(IDF_MENU4,IM) WBAL_TYR=IY*10000+IM*100+ID !## write years to be processed CALL TOOLS1READYEARS(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 SHPNO=0 IF(WBALCOMPUTE())THEN INQUIRE(FILE=WBAL_OUTFNAME(:INDEX(WBAL_OUTFNAME,'.',.TRUE.)-1)//'.IDF',EXIST=LEX) IF(LEX)CALL IDFINIT(IDFNAMEGIVEN=WBAL_OUTFNAME(:INDEX(WBAL_OUTFNAME,'.',.TRUE.)-1)//'.IDF',LPLOT=.FALSE.) ! INQUIRE(FILE=TRIM(PREFVAL(1))//'\TMP\POINTER.IDF',EXIST=LEX) ! IF(LEX)CALL IDFINIT(IDFNAMEGIVEN=TRIM(PREFVAL(1))//'\TMP\POINTER.IDF',LPLOT=.FALSE.) ENDIF !## release waterbalance-related memory again CALL WBALABORT() !## reread area to be used CALL TOOLS1REREADAREA() END SUBROUTINE TOOLS1APPLY_WBAL !###====================================================================== SUBROUTINE TOOLS1APPLY_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)!,CTOPIC) 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 TOOLS1GETPERIODS(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 TOOLS1READYEARS(GXG_NYEAR,GXG_IYEAR) !## write type of area to be used CALL TOOLS1DEFINEAREA(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(GXG1COMPUTEGXG())THEN INQUIRE(FILE=TRIM(PREFVAL(1))//'\TMP\POINTER.IDF',EXIST=LEX) IF(LEX)CALL IDFINIT(IDFNAMEGIVEN=TRIM(PREFVAL(1))//'\TMP\POINTER.IDF',LPLOT=.FALSE.) CALL IDFINIT(IDFNAMEGIVEN=FGLG,LPLOT=.FALSE.)!,'') CALL IDFINIT(IDFNAMEGIVEN=FGHG,LPLOT=.FALSE.)!,'') CALL IDFINIT(IDFNAMEGIVEN=FGVG,LPLOT=.FALSE.)!,'') CALL IDFINIT(IDFNAMEGIVEN=FGT,LEGNAME=FNLEG,LPLOT=.TRUE.) ENDIF !## clean memory CALL GXG1ABORT() 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 TOOLS1REREADAREA() END SUBROUTINE TOOLS1APPLY_GXG !###====================================================================== SUBROUTINE TOOLS1APPLY_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 TOOLS2GETPERIODS(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 TOOLS1READYEARS(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 TOOLS1DEFINEAREA(MEAN_ISEL,MEAN_IDFNAME,MEAN_GENFNAME) MEAN_RESDIR=TRIM(TOOLSDIR)//'\'//TRIM(CTOPIC)//'\'//TRIM(CTOPIC) SHPNO=0 IBATCH=0 CFUNC='MEAN' ALLOCATE(MEAN_FTOTAL(MEAN_NLAYER),MEAN_FMEAN(MEAN_NLAYER)) IF(MEAN1COMPUTE())THEN DO I=1,MEAN_NLAYER CALL IDFINIT(IDFNAMEGIVEN=MEAN_FTOTAL(I),LPLOT=.FALSE.) CALL IDFINIT(IDFNAMEGIVEN=MEAN_FMEAN(I) ,LPLOT=.TRUE.) 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 TOOLS1REREADAREA() END SUBROUTINE TOOLS1APPLY_MEAN !###====================================================================== SUBROUTINE TOOLS1APPLY_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=FNAME(:INDEX(FNAME,'\',.TRUE.))//'*.IPF' 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() CALL TS_END() CALL UTL_MESSAGEHANDLE(1) !## make sure ipf is reread again IPF(1)%FNAME='' IF(LOKAY)THEN CALL IDFINIT(IDFNAMEGIVEN=ADIR) CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Succesfully added timeserie information to'//CHAR(13)// & TRIM(ADIR)//CHAR(13)//'File has been added to you imod-manager','Information') ENDIF END SUBROUTINE TOOLS1APPLY_TS !###====================================================================== SUBROUTINE TOOLS1READYEARS(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 TOOLS1READYEARS !###====================================================================== SUBROUTINE TOOLS1DEFINEAREA(ISEL,FNAME,GENFNAME) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(OUT) :: ISEL CHARACTER(LEN=*),INTENT(OUT) :: FNAME,GENFNAME CALL WDIALOGSELECT(ID_TOOLSTAB3) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,ISEL) !## entire area IF(ISEL.EQ.1)THEN !## polygon ELSEIF(ISEL.EQ.2)THEN SHPIACT=1 !## write temporary gen-file GENFNAME=TRIM(PREFVAL(1))//'\TMP\tmp.gen' !## save ALL polygons - temporary IF(ALLOCATED(COPYSHPIACT))DEALLOCATE(COPYSHPIACT) ALLOCATE(COPYSHPIACT(MAXSHAPES+1)) COPYSHPIACT=SHPIACT !## save all of them SHPIACT(1:SHPNO)=1 CALL POLYGON1SAVELOADSHAPE(ID_SAVESHAPE,0,GENFNAME) !ID_TOOLSTAB3,FNAME) !## pointer from idf ELSEIF(ISEL.EQ.3)THEN CALL WDIALOGGETSTRING(IDF_STRING1,FNAME) ENDIF END SUBROUTINE TOOLS1DEFINEAREA !###====================================================================== SUBROUTINE TOOLS1REREADAREA() !###====================================================================== IMPLICIT NONE INTEGER :: IRADIO CALL WDIALOGSELECT(ID_TOOLSTAB3) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,IRADIO) IF(IRADIO.NE.2)RETURN !## load all polygons SHPNO=0 CALL POLYGON1SAVELOADSHAPE(ID_LOADSHAPE,ID_TOOLSTAB3,TRIM(PREFVAL(1))//'\TMP\TMP.GEN') SHPIACT=COPYSHPIACT CALL WDIALOGSELECT(ID_TOOLSTAB3) CALL WDIALOGPUTOPTION(IDF_MENU1,SHPIACT) IF(ALLOCATED(COPYSHPIACT))DEALLOCATE(COPYSHPIACT) END SUBROUTINE TOOLS1REREADAREA !###====================================================================== SUBROUTINE TOOLS1FIELDS1(CODE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: CODE INTEGER :: I,J,K CALL WDIALOGSELECT(ID_TOOLSTAB1) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,I) !## directory user/getityourself CALL WDIALOGGETRADIOBUTTON(IDF_RADIO3,J) !## models/scenarios K=0 IF(I.EQ.1)K=1 CALL WDIALOGFIELDSTATE(IDF_RADIO3,K) CALL WDIALOGFIELDSTATE(IDF_RADIO4,K) CALL WDIALOGFIELDSTATE(IDF_MENU1,K) CALL WDIALOGFIELDSTATE(IDF_LABEL2,K) K=ABS(K-1) CALL WDIALOGFIELDSTATE(ID_OPEN,K) CALL WDIALOGFIELDSTATE(IDF_STRING1,K) IF(CODE.EQ.0)THEN TOOLSNDIR=0 IF(I.EQ.1)THEN IF(J.EQ.1)CALL UTL_IMODFILLMENU(IDF_MENU1,TRIM(PREFVAL(1))//'\MODELS\','*','D',TOOLSNDIR,0,1) IF(J.EQ.2)CALL UTL_IMODFILLMENU(IDF_MENU1,TRIM(PREFVAL(1))//'\SCENARIOS\','*','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) IF(J.EQ.1)TOOLSDIR=TRIM(PREFVAL(1))//'\MODELS\'//TRIM(ADIR) IF(J.EQ.2)TOOLSDIR=TRIM(PREFVAL(1))//'\SCENARIOS\'//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) CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB2,0) CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB3,0) CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB4,0) END SUBROUTINE TOOLS1FIELDS1 !###====================================================================== SUBROUTINE TOOLS1GETTYPE() !###====================================================================== IMPLICIT NONE INTEGER,PARAMETER :: LDIM=250 INTEGER :: I,J,K,N,DATE1,DATE2,NLAY CHARACTER(LEN=256),ALLOCATABLE,DIMENSION(:) :: LISTIDF INTEGER,ALLOCATABLE,DIMENSION(:) :: TLAY !,IYEAR INTEGER :: MINDATE,MAXDATE,IS,IT,TIS,TIT,NYEAR CHARACTER(LEN=100) :: TXT CALL TOOLS1FIELDS1_GETTOPIC() !## can not 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(TP%IACT).NE.1)TP%IACT=0 ENDIF !## 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)TLAY=0 MINDATE= 21001231 MAXDATE=-18000101 TIS =0 TIT =0 DO I=1,SIZE(ILIST) IF(ILIST(I).EQ.1)THEN CALL IOSDIRCOUNT(TRIM(TOOLSDIR)//'\'//TRIM(LISTNAME(I)),'*.IDF',N) IF(N.GT.0)THEN 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,LDIM) !## to be sure all selected are available for these model layers (not in case of Waterbalancing) IF(TOOLSID.NE.ID_WBAL)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,DATE1,DATE2) TIS=TIS+IS TIT=TIT+IT IF(IT.GT.0)THEN MINDATE=MIN(MINDATE,DATE1) MAXDATE=MAX(MAXDATE,DATE2) ENDIF ENDIF ENDIF END DO !## copy ilay=tlay ILAY=MIN(TLAY,1) !0 TLAY=ILAY NLAY=SUM(TLAY) !## can not 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)THEN !## not steady-state available IF(TIS.EQ.0)CALL WDIALOGFIELDSTATE(IDF_RADIO1,0) !## not transient available IF(TIT.EQ.0)CALL WDIALOGFIELDSTATE(IDF_RADIO2,0) 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 UTL_FILLDATESDIALOG(ID_TOOLSTAB2,IDF_INTEGER3,IDF_MENU3,IDF_INTEGER4,MINDATE) !## put end date CALL UTL_FILLDATESDIALOG(ID_TOOLSTAB2,IDF_INTEGER5,IDF_MENU4,IDF_INTEGER6,MAXDATE) ENDIF IF(ALLOCATED(CLAY))DEALLOCATE(CLAY) ALLOCATE(CLAY(NLAY)) J=0 DO I=1,LDIM !NLAY 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) 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 !K-I+1 WRITE(CYEAR(I),'(I4)') I+J-1 END DO IYEAR=1 ! CALL WDIALOGFIELDSTATE(IDF_MENU6,1) CALL WDIALOGPUTMENU(IDF_MENU6,CYEAR,NYEAR,IYEAR) ELSE NYEAR=1 ALLOCATE(CYEAR(NYEAR),IYEAR(NYEAR)) CALL WDIALOGCLEARFIELD(IDF_MENU6) ! CALL WDIALOGFIELDSTATE(IDF_MENU6,0) ENDIF CALL TOOLS1FIELDS2() !## 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 ELSE I=0 TXT='No proper Result Type selected, or more than one item Type selected!' 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) CALL WDIALOGPUTSTRING(IDF_LABEL4,'Select one or more of the layers') END SELECT CALL WDIALOGSELECT(ID_TOOLS) CALL WDIALOGFIELDSTATE(IDOK,I) CALL WDIALOGPUTSTRING(IDF_LABEL1,'') 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) CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB3,I) !## area CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB4,0) !## surface level END SELECT END SUBROUTINE TOOLS1GETTYPE !###====================================================================== SUBROUTINE TOOLS1FIELDS1_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 CALL IUPPERCASE(LISTNAME(I)) ITOPIC=GETITOPIC(LISTNAME(I)) IF(ITOPIC.NE.0)THEN TP(ITOPIC)%IACT=1 SELECT CASE (TOOLSID) ! CASE (ID_WBAL) ! IF(TP(ITOPIC)%ACRNM(1:3).NE.'BDG')THEN ! TP(ITOPIC)%IACT=0 ! ILIST(I) =0 ! ENDIF CASE (ID_GXG) IF(INDEX(TP(ITOPIC)%ACRNM,'HEAD').EQ.0.AND.INDEX(TP(ITOPIC)%ACRNM,'GWL').EQ.0)THEN TP(ITOPIC)%IACT=0 ILIST(I) =0 ENDIF END SELECT ENDIF ENDIF ENDDO END SUBROUTINE TOOLS1FIELDS1_GETTOPIC !###====================================================================== SUBROUTINE TOOLS1FIELDS2() !###====================================================================== IMPLICIT NONE INTEGER :: I,J CALL WDIALOGSELECT(ID_TOOLSTAB2) ! IF(TOOLSID.EQ.ID_TS)THEN ! CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO2) ! CALL WDIALOGFIELDSTATE(IDF_RADIO1,0)!3) ! ENDIF CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,J) !## 1=steady/2=transient SELECT CASE (TOOLSID) CASE (ID_WBAL) 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_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_WBAL,ID_MEAN) ! CALL WDIALOGSELECT(ID_TOOLSTAB2) ! CALL WDIALOGFIELDSTATE(IDF_CHECK1,1)!3) ! CALL WDIALOGFIELDSTATE(IDF_STRING1,1)!3) CASE (ID_GXG,ID_WBAL,ID_MEAN) ! CALL WDIALOGSELECT(ID_TOOLS) ! CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB4,ABS(J-2)) CALL WDIALOGSELECT(ID_TOOLSTAB2) ! CALL WDIALOGFIELDSTATE(IDF_CHECK1,ABS(J-2)) !WRITE(*,*) j IF(J.EQ.2)THEN!ABS(J-2).EQ.1)THEN CALL WDIALOGGETCHECKBOX(IDF_CHECK1,I) CALL WDIALOGFIELDSTATE(IDF_STRING1,I) ELSE CALL WDIALOGFIELDSTATE(IDF_STRING1,I)!ABS(J-2)) ENDIF CASE (ID_TS) ! CALL WDIALOGSELECT(ID_TOOLS) ! CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB4,ABS(J-2)) 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.1)CALL WDIALOGGETMENU(IDF_MENU6,IYEAR) CALL WDIALOGSELECT(ID_TOOLS) I=1 SELECT CASE (TOOLSID) CASE (ID_WBAL,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 WDIALOGFIELDSTATE(IDOK,MIN(I,J)) SELECT CASE (TOOLSID) CASE (ID_WBAL) 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 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 ! IF(J.EQ.1)CALL WDIALOGTABSTATE(ID_TAB,ID_TOOLSTAB4,I) !## surface level END SELECT END SUBROUTINE TOOLS1FIELDS2 !###====================================================================== SUBROUTINE TOOLS1FIELDS3() !###====================================================================== 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(SHPNO.GT.0)THEN CALL WDIALOGGETMENU(IDF_MENU1,SHPIACT) IF(SUM(SHPIACT(1:SHPNO)).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 ENDIF CALL WDIALOGFIELDSTATE(ID_LOADSHAPE,L) CALL WDIALOGFIELDSTATE(ID_DRAW,L) CALL WDIALOGFIELDSTATE(ID_OPEN,K) CALL WDIALOGFIELDSTATE(IDF_STRING1,K) CALL WDIALOGSELECT(ID_TOOLS) CALL WDIALOGFIELDSTATE(IDOK,J) END SUBROUTINE TOOLS1FIELDS3 !###====================================================================== SUBROUTINE TOOLS1FIELDS4() !###====================================================================== 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) END SUBROUTINE TOOLS1FIELDS4 !###====================================================================== SUBROUTINE TOOLS1READHEADERIPF() !###====================================================================== 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 TOOLS1READHEADERIPF !###====================================================================== SUBROUTINE TOOLS1DRAWIPF() !###====================================================================== IMPLICIT NONE INTEGER,PARAMETER :: MAXCRD=1000.0 TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,IU,I INTEGER :: NIPF REAL,ALLOCATABLE,DIMENSION(:) :: XCRD,YCRD REAL :: DX,DY ALLOCATE(XCRD(MAXCRD),YCRD(MAXCRD)) CALL WCURSORSHAPE(ID_CURSORPIPET) DX=(MPW%XMAX-MPW%XMIN)/500.0 DY=(MPW%YMAX-MPW%YMIN)/500.0 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 IDFPLOT1BITMAP() CALL IGRJOIN(XCRD(NIPF)-DX,YCRD(NIPF),XCRD(NIPF)+DX,YCRD(NIPF)) CALL IGRJOIN(XCRD(NIPF),YCRD(NIPF)-DY,XCRD(NIPF),YCRD(NIPF)+DY) CALL IDFPLOT2BITMAP() 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=TRIM(TOOLSDIR)//'\*.ipf' 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 IDFINIT(IDFNAMEGIVEN=FNAME) END SUBROUTINE TOOLS1DRAWIPF !###====================================================================== SUBROUTINE TOOLS1INIT(ID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID INTEGER :: I CALL WINDOWSELECT(0) IF(WMENUGETSTATE(ID,2).EQ.1)THEN CALL TOOLS1CLOSE() RETURN ENDIF CALL MAIN1INACTMODULE(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 WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPEN,1) !## show interactive waterbalance CALL WDIALOGFIELDSTATE(ID_OPEN,3) SELECT CASE (TOOLSID) CASE (ID_WBAL) CALL WDIALOGTITLE('Compute Waterbalance') CASE (ID_GXG) CALL WDIALOGTITLE('Compute GxG"s') CALL WDIALOGFIELDSTATE(ID_OPEN,3) CASE (ID_TS) CALL WDIALOGTITLE('Compute Timeseries') CALL WDIALOGFIELDSTATE(ID_OPEN,3) CASE (ID_MEAN) CALL WDIALOGTITLE('Compute Mean Values') CALL WDIALOGFIELDSTATE(ID_OPEN,3) END SELECT CALL WDIALOGSELECT(ID_TOOLSTAB1) SELECT CASE (TOOLSID) CASE (ID_WBAL,ID_GXG,ID_TS,ID_MEAN) CALL WDIALOGTITLE('Result Folder') 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")') CALL WDIALOGPUTSTRING(IDF_RADIO2,'Transient (Names contain "_yyyymmdd_")') CALL WDIALOGPUTSTRING(IDF_LABEL9,'From Date (based on data found):') CALL WDIALOGPUTSTRING(IDF_LABEL10,'To Date (based on data found):') CALL WDIALOGTITLE('Period and Layers') CALL WDIALOGPUTSTRING(IDF_CHECK2,'Use system files [*_sys{i}_*.idf], max systems='//TRIM(ITOS(MXSYS))) SELECT CASE (TOOLSID) CASE (ID_WBAL) CALL WDIALOGFIELDSTATE(IDF_GROUP7,1) CALL WDIALOGFIELDSTATE(IDF_CHECK2,1) CASE (ID_GXG,ID_MEAN,ID_TS) CALL WDIALOGFIELDSTATE(IDF_GROUP7,0) CALL WDIALOGFIELDSTATE(IDF_CHECK2,0) 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)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,ID_GXG,ID_MEAN) CALL WDIALOGTITLE('Apply To') 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,ID_GXG,ID_MEAN) CALL WDIALOGTITLE('Surface Level') CALL WDIALOGFIELDSTATE(ID_DRAW,3) CALL WDIALOGFIELDSTATE(IDF_CHECK1,3) END SELECT TOOLSNDIR=0 CALL TOOLS1FIELDS1(0) CALL POLYGON1INIT() CALL POLYGON1FIELDS(ID_TOOLSTAB3) CALL WDIALOGSELECT(ID_TOOLS) CALL WDIALOGSHOW(-0,100,0,2) END SUBROUTINE TOOLS1INIT !###====================================================================== SUBROUTINE TOOLS1CLOSE() !###====================================================================== IMPLICIT NONE IDIAGERROR=1 CALL POLYGON1DRAWSHAPE(1,SHPNO) CALL POLYGON1CLOSE() CALL WINDOWSELECT(0) CALL WMENUSETSTATE(TOOLSID,2,0) CALL WDIALOGSELECT(ID_TOOLS) CALL WDIALOGUNLOAD() !## used in imod_utl: UTL_IMODFILLMENU IF(ALLOCATED(LISTNAME))DEALLOCATE(LISTNAME) IF(ALLOCATED(ILIST))DEALLOCATE(ILIST) IF(ALLOCATED(CLAY))DEALLOCATE(CLAY) IF(ALLOCATED(ILAY))DEALLOCATE(ILAY) IF(ALLOCATED(CYEAR))DEALLOCATE(CYEAR) IF(ALLOCATED(IYEAR))DEALLOCATE(IYEAR) IDIAGERROR=0 END SUBROUTINE TOOLS1CLOSE END MODULE MOD_TOOLS