!! 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_SCENTOOL USE WINTERACTER USE RESOURCE USE MODPLOT, ONLY : MPW USE MOD_SCENTOOL_PAR USE MOD_SCENTOOL_WELLS, ONLY : STWEL1DELETE,ST1SAVELOADWELLS,STWEL1INIT,ST1PLOTWELLS,STWEL1MAIN,STWEL1TITLE USE MOD_SCENTOOL_OBS, ONLY : STOBS1DELETE,ST1SAVELOADOBS ,STOBS1INIT,ST1PLOTOBS ,STOBS1MAIN,STOBS1TITLE USE MOD_SCENTOOL_RESULTS, ONLY : STRES1MAIN,STRES1DELETE ,STRES1TITLE ,STRES1TSERIE_INIT ,STRES1MAPS USE MOD_SCENTOOL_UTL, ONLY : ST1FIELDS,ST1FIELDS_STATE,ST_SYMBOLDRAW,ST1FILLRESULTS,ST_SYMBOLCOLOUR,ST1_GETCOLOUR,ST1ERROR USE MOD_PREF_PAR, ONLY : PREFVAL USE MOD_UTL, ONLY : UTL_GETUNIT,UTL_READINITFILE,UTL_CAP,ITOS,UTL_CREATEDIR,JDATETOGDATE,UTL_IMODFILLMENU,UTL_CLOSEUNITS,UTL_WSELECTFILE USE MOD_IDF, ONLY : IDFDEALLOCATE,IDFNULLIFY USE MOD_OSD, ONLY : OSD_OPEN USE IMODVAR, ONLY : IDIAGERROR INTEGER,PARAMETER :: NTAB=5 INTEGER,PARAMETER,PRIVATE :: NDIALOGS=2 INTEGER,PRIVATE :: STIPROP !## 1=wells, 2=observations INTEGER,DIMENSION(NTAB) :: IDTAB INTEGER,DIMENSION(NDIALOGS),PRIVATE :: IDDIAG DATA IDTAB /ID_DSCENTOOLTAB1,ID_DSCENTOOLTAB2,ID_DSCENTOOLTAB3,ID_DSCENTOOLTAB4,ID_DSCENTOOLTAB5/ DATA IDDIAG/ID_DSCENTOOL_PROPTAB1,ID_DSCENTOOL_PROPTAB2/ CONTAINS !###====================================================================== SUBROUTINE ST1MAIN(ITYPE,MESSAGE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ITYPE TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE INTEGER :: I LOGICAL :: LEX CALL WDIALOGSELECT(MESSAGE%WIN) SELECT CASE (MESSAGE%WIN) !## main scenario CASE (ID_DSCENTOOL) SELECT CASE (ITYPE) CASE (TABCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (ID_DSCENTOOLTAB5) !## save first LEX=.TRUE. IF(LEN_TRIM(SCFFNAME).EQ.0)LEX=ST1SAVELOAD(MESSAGE%VALUE1) IF(LEX)THEN CALL ST1FILLRESULTS() CALL STRES1TITLE() CALL ST1FIELDS() ELSE CALL WDIALOGSETTAB(IDF_TAB,MESSAGE%VALUE1) ENDIF END SELECT CASE (FIELDCHANGED) CALL ST1FIELDS() CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_OPEN) I=2 !## default no saving !## ask to save first IF(LEN_TRIM(SCFFNAME).NE.0)THEN CALL WMESSAGEBOX(YESNOCANCEL,QUESTIONICON,COMMONYES,'Do you want to save your work first?','Question') I=WINFODIALOG(4) ENDIF !## canceling from save question IF(I.NE.0)THEN !## save first? LEX=.TRUE. IF(I.EQ.1)LEX=ST1SAVELOAD(ID_SAVEAS) IF(LEX)LEX=ST1SAVELOAD(ID_OPEN) ENDIF CASE (ID_SAVEAS,ID_SAVE) IF(.NOT.ST1SAVELOAD(MESSAGE%VALUE1))THEN ENDIF CASE (ID_NEW) ! !## ask to save first ! IF(ST1SAVELOAD(ID_SAVEAS))THEN ! ENDIF CASE (IDCANCEL) CALL ST1CLOSE() END SELECT END SELECT !## well systems CASE (ID_DSCENTOOLTAB1) SELECT CASE (ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_RADIO1,IDF_RADIO2,IDF_RADIO3,IDF_RADIO4,IDF_MENU1,IDF_CHECK1,IDF_CHECK2) CALL IDFPLOT(1) CASE DEFAULT CALL ST1FIELDS() END SELECT CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_ADD,ID_INFO) CALL STWEL1INIT(MESSAGE%VALUE1) STIPROP=1 CASE (ID_DELETE) CALL STWEL1DELETE() CALL IDFPLOT(1) ! CASE (ID_COLOUR) ! CALL ST1_GETCOLOUR(ID_DSCENTOOLTAB1,IDF_INTEGER1) END SELECT END SELECT !## cutouts CASE (ID_DSCENTOOLTAB2) SELECT CASE (ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_RADIO1,IDF_RADIO2,IDF_RADIO3,IDF_RADIO4,IDF_MENU1,IDF_CHECK1,IDF_CHECK2) CALL IDFPLOT(1) CASE DEFAULT CALL ST1FIELDS() END SELECT CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_ADD,ID_INFO) CASE (ID_DELETE) ! CASE (ID_COLOUR) ! CALL ST1_GETCOLOUR(ID_DSCENTOOLTAB2,IDF_INTEGER1) END SELECT END SELECT !## observations CASE (ID_DSCENTOOLTAB3) SELECT CASE (ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_RADIO1,IDF_RADIO2,IDF_RADIO3,IDF_RADIO4,IDF_MENU1,IDF_CHECK1,IDF_CHECK2) CALL IDFPLOT(1) CASE DEFAULT CALL ST1FIELDS() END SELECT CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_ADD,ID_INFO) STIPROP=2 CALL STOBS1INIT(MESSAGE%VALUE1) CASE (ID_DELETE) CALL STOBS1DELETE() CALL IDFPLOT(1) ! CASE (ID_COLOUR) ! CALL ST1_GETCOLOUR(ID_DSCENTOOLTAB3,IDF_INTEGER1) END SELECT END SELECT !## monitoring CASE (ID_DSCENTOOLTAB4) SELECT CASE (ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_RADIO1,IDF_RADIO2,IDF_RADIO3,IDF_RADIO4,IDF_MENU1,IDF_CHECK1,IDF_CHECK2) CALL IDFPLOT(1) CASE DEFAULT CALL ST1FIELDS() END SELECT CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_ADD,ID_INFO) CASE (ID_DELETE) ! CASE (ID_COLOUR) ! CALL ST1_GETCOLOUR(ID_DSCENTOOLTAB4,IDF_INTEGER1) END SELECT END SELECT !## results CASE (ID_DSCENTOOLTAB5) SELECT CASE (ITYPE) CASE (FIELDCHANGED) CALL ST1FIELDS() CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_ADD) CALL STRES1MAIN() ! CALL ST1FIELDS() CASE (ID_DELETE) CALL STRES1DELETE() CASE (ID_MAP) CALL STRES1MAPS() CASE (ID_HISTOGRAM) CALL STRES1TSERIE_INIT() ! CASE (ID_INFO) ! CALL WDIALOGSELECT(ID_DSCENTOOLTAB4) ! CALL WDIALOGGETMENU(IDF_MENU1,I) !,FNAME) ! CALL WINDOWOPENCHILD(IWIN,FLAGS=SYSMENUON+MAXBUTTON,WIDTH=1000,HEIGHT=500) ! CALL WINDOWSELECT(IWIN) ! FNAME=TRIM(RES(1)%CNAME)//'\RUNFILES\'//TRIM(FNAME) ! CALL WEDITFILE(FNAME,ITYPE=MODAL,IDMENU=0,IFONT=COURIERNEW,ISIZE=10) END SELECT END SELECT END SELECT END SUBROUTINE ST1MAIN !###====================================================================== SUBROUTINE ST1PROPMAIN(ITYPE,MESSAGE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ITYPE TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE IF(STIPROP.EQ.1)CALL STWEL1MAIN(ITYPE,MESSAGE) IF(STIPROP.EQ.2)CALL STOBS1MAIN(ITYPE,MESSAGE) END SUBROUTINE ST1PROPMAIN !###====================================================================== LOGICAL FUNCTION ST1SAVELOAD(ICODE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ICODE !## 1=read 2=write INTEGER :: IU,IOS LOGICAL :: LEX CHARACTER(LEN=256) :: FNAME ST1SAVELOAD=.FALSE. LEX=.TRUE. IF(ICODE.EQ.ID_OPEN)THEN !## open FNAME=TRIM(RESDIR)//'\*.isf' IF(.NOT.UTL_WSELECTFILE('iMOD Scenario File (*.isf)|*.isf|',& LOADDIALOG+PROMPTON+APPENDEXT,FNAME,'Open iMOD Scenario File'))RETURN SCFFNAME=FNAME ELSE !## save/saveas LEX=LEN_TRIM(SCFFNAME).GT.0 IF(LEX)INQUIRE(FILE=SCFFNAME,EXIST=LEX) IF(.NOT.LEX)THEN FNAME=TRIM(RESDIR)//'\*.isf' IF(.NOT.UTL_WSELECTFILE('iMOD Scenario File (*.isf)|*.isf|',& SAVEDIALOG+PROMPTON+APPENDEXT,FNAME,'Save iMOD Scenario File'))RETURN SCFFNAME=FNAME ENDIF ENDIF IU=UTL_GETUNIT() !## open IF(ICODE.EQ.ID_OPEN)THEN CALL OSD_OPEN(IU,FILE=SCFFNAME,STATUS='OLD',ACTION='READ,DENYWRITE',FORM='FORMATTED',IOSTAT=IOS) !## write ELSE CALL OSD_OPEN(IU,FILE=SCFFNAME,STATUS='REPLACE',ACTION='WRITE,DENYREAD',FORM='FORMATTED',IOSTAT=IOS) ENDIF IF(ST1ERROR(IOS,'iMOD can not open file '//TRIM(SCFFNAME)).NE.0)RETURN !## save well systems CALL ST1SAVELOADWELLS(IU,ICODE) !## save observations CALL ST1SAVELOADOBS(IU,ICODE) CLOSE(IU) IF(ICODE.EQ.ID_OPEN)THEN !## well systems IF(NWEL.GT.0)THEN IWEL=1; CALL STWEL1TITLE() ENDIF !## cuttings IF(NCUT.GT.0)THEN CALL WDIALOGSELECT(ID_DSCENTOOLTAB2) ! ICUT=1; CALL STCUT1TITLE() CALL WDIALOGPUTMENU(IDF_MENU1,CUT%CNAME,NCUT,1) ENDIF !## observations IF(NOBS.GT.0)THEN IOBS=1; CALL STOBS1TITLE() ENDIF IF(NMON.GT.0)THEN ENDIF CALL ST1FILLRESULTS() CALL STRES1TITLE() CALL ST1FIELDS() !## these should be zero otherwise points will be drawn from inputgrid IWEL=0 ICUT=0 IOBS=0 IMON=0 RES%IRES=0 CALL IDFPLOT(1) ENDIF CALL WDIALOGSELECT(ID_DSCENTOOL) CALL WDIALOGFIELDSTATE(ID_NEW,1) CALL WDIALOGFIELDSTATE(ID_SAVE,1) CALL WDIALOGPUTSTRING(IDF_STRING1,TRIM(SCFFNAME)) ST1SAVELOAD=.TRUE. END FUNCTION ST1SAVELOAD !###====================================================================== SUBROUTINE ST1DRAWSCENARIO() !###====================================================================== IMPLICIT NONE CALL IGRSELECT(DRAWBITMAP,MPW%IBITMAP) CALL IGRPLOTMODE(MODECOPY) CALL IGRAREA(0.0,0.0,1.0,1.0) CALL IGRUNITS(MPW%XMIN,MPW%YMIN,MPW%XMAX,MPW%YMAX) !## plot well systems CALL ST1PLOTWELLS() !## plot observations CALL ST1PLOTOBS() END SUBROUTINE ST1DRAWSCENARIO !###====================================================================== SUBROUTINE ST1INIT() !###====================================================================== IMPLICIT NONE INTEGER :: I CALL WINDOWSELECT(0) IF(WMENUGETSTATE(ID_SCENTOOL,2).EQ.1)THEN CALL ST1CLOSE() RETURN ENDIF !## clean everything CALL ST1DEALLOCATE() !## read scenario tool settings IF(.NOT.ST1INITFILES())THEN CALL ST1DEALLOCATE() RETURN ENDIF CALL WMENUSETSTATE(ID_SCENTOOL,2,1) CALL WDIALOGLOAD(ID_DSCENTOOL,ID_DSCENTOOL) CALL WDIALOGPUTIMAGE(ID_SAVE,ID_ICONSAVE) CALL WDIALOGPUTIMAGE(ID_NEW,ID_ICONNEW) CALL WDIALOGPUTIMAGE(ID_SAVEAS,ID_ICONSAVEAS) CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPEN) CALL WDIALOGFIELDSTATE(ID_NEW,0) CALL WDIALOGFIELDSTATE(ID_SAVE,0) !## fill tabs for main dialog DO I=1,NTAB CALL WDIALOGSELECT(IDTAB(I)) CALL WDIALOGPUTIMAGE(ID_ADD,ID_ICONPLUS) CALL WDIALOGPUTIMAGE(ID_DELETE,ID_ICONDELETE) ! CALL WDIALOGPUTIMAGE(ID_COLOUR,ID_ICONLEGEND) SELECT CASE (I) CASE (1:4) !## well systems (red) CALL WDIALOGPUTIMAGE(ID_INFO,ID_ICONPROPERTIES) !INFO) ! CALL WDIALOGPUTINTEGER(IDF_INTEGER1,WRGB(200,0,0)) ! CASE (2) !## cutout systems (brown) ! CALL WDIALOGPUTINTEGER(IDF_INTEGER1,WRGB(163,82,82)) ! CASE (3) !## observation wells (blue) ! CALL WDIALOGPUTINTEGER(IDF_INTEGER1,WRGB(0,255,255)) ! CASE (4) !## monitoring (yellow) ! CALL WDIALOGPUTINTEGER(IDF_INTEGER1,WRGB(255,255,128)) CASE (5) !## results (wit) CALL WDIALOGPUTIMAGE(ID_MAP,ID_ICONCONTOUR) CALL WDIALOGPUTIMAGE(ID_HISTOGRAM,ID_ICONHISTOGRAM) ! CALL WDIALOGPUTIMAGE(ID_PROFILE,ID_ICONPROFILE) ! CALL WDIALOGPUTIMAGE(ID_MOVIE,ID_ICONMOVIE) ! CALL WDIALOGPUTIMAGE(ID_3DTOOL,ID_ICON3DTOOL) ! CALL WDIALOGPUTIMAGE(ID_TIMESERIES,ID_ICONTIMESERIE) END SELECT ! CALL ST_SYMBOLCOLOUR(IDTAB(I),IDF_INTEGER1) END DO CALL ST1FIELDS() !## fill tabs for well,,,, dialogs CALL WDIALOGLOAD(ID_DSCENTOOL_PROP,ID_DSCENTOOL_PROP) DO I=1,NDIALOGS CALL WDIALOGSELECT(IDDIAG(I)) IF(I.EQ.2)THEN CALL WDIALOGPUTIMAGE(ID_DRAW,ID_ICONPOINTPLUS) CALL WDIALOGPUTIMAGE(ID_MOVE,ID_ICONMOVEARROW) CALL WDIALOGPUTIMAGE(ID_DELETE,ID_ICONDELETE) ENDIF IF(I.EQ.1)THEN CALL WDIALOGPUTIMAGE(ID_CALC,ID_ICONCALC) CALL WDIALOGPUTIMAGE(ID_GRAPH,ID_ICONHISTOGRAM) ENDIF CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPEN) CALL WDIALOGPUTIMAGE(ID_SAVEAS,ID_ICONSAVEAS) END DO CALL WDIALOGSELECT(ID_DSCENTOOL_PROPTAB1) NROWQ=WINFOGRID(IDF_GRID1,GRIDROWSMAX) CALL WDIALOGSELECT(ID_DSCENTOOL_PROPTAB2) NROWL=WINFOGRID(IDF_GRID1,GRIDROWSMAX) CALL WDIALOGSELECT(ID_DSCENTOOL_PROPTAB3) CALL WDIALOGPUTIMAGE(ID_COLOUR,ID_ICONLEGEND) STIPROP=0 !## colour fields CALL ST_SYMBOLDRAW(ID_DSCENTOOL_PROPTAB3,IDF_PICTURE1,IDF_MENU1,IDF_INTEGER1) CALL STWEL1TITLE() ! CALL STCUT1TITLE() CALL STOBS1TITLE() ! CALL STMON1TITLE() CALL ST1FILLRESULTS() CALL STRES1TITLE() CALL WDIALOGSELECT(ID_DSCENTOOL) CALL WDIALOGSHOW(-1,-1,0,2) END SUBROUTINE ST1INIT !###====================================================================== LOGICAL FUNCTION ST1INITFILES() !###====================================================================== IMPLICIT NONE INTEGER :: I,IOS,IU LOGICAL :: LEX CHARACTER(LEN=256) :: LINE ST1INITFILES=.FALSE. IF(TRIM(PREFVAL(10)).EQ.'')THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD can not initiate SCENARIO-tool since the variable SCENTOOL '//CHAR(13)// & 'is not loaded from the currently selected *.prf file!','Error') RETURN ENDIF INQUIRE(FILE=PREFVAL(10),EXIST=LEX) IF(.NOT.LEX)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD can not initiate SCENARIO-tool since file: '//CHAR(13)// & TRIM(PREFVAL(10))//CHAR(13)//'does not exists !','Error') RETURN ENDIF IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=TRIM(PREFVAL(10)),ACCESS='SEQUENTIAL',FORM='FORMATTED',ACTION='READ,DENYWRITE',IOSTAT=IOS) IF(IOS.NE.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD can not open '//CHAR(13)// & TRIM(PREFVAL(10))//CHAR(13)//'for reading!','Error') RETURN ENDIF !## result directory ! IF(.NOT.UTL_READINITFILE(UTL_CAP('RESDIR','U'),LINE,IU,0))RETURN ! READ(LINE,*) RESDIR RESDIR=TRIM(PREFVAL(1))//'\SCENTOOL' CALL UTL_CREATEDIR(TRIM(RESDIR)) !## number of scenario configurations IF(.NOT.UTL_READINITFILE(UTL_CAP('NSCNCONF','U'),LINE,IU,0))RETURN READ(LINE,*) NSCNCONF IF(ALLOCATED(CONF))DEALLOCATE(CONF) ALLOCATE(CONF(NSCNCONF)) DO I=1,NSCNCONF IF(.NOT.UTL_READINITFILE(UTL_CAP('RUNFNAME'//TRIM(ITOS(I)),'U'),LINE,IU,0))RETURN READ(LINE,*) CONF(I)%RUNF IF(.NOT.UTL_READINITFILE(UTL_CAP('RUNNAME'//TRIM(ITOS(I)),'U'),LINE,IU,0))RETURN READ(LINE,*) CONF(I)%RUNNAME END DO IF(.NOT.UTL_READINITFILE(UTL_CAP('NLAY','U'),LINE,IU,0))RETURN READ(LINE,*) STNLAY ALLOCATE(TOPIDF(STNLAY),BOTIDF(STNLAY),KDIDF(STNLAY)) DO I=1,STNLAY CALL IDFNULLIFY(TOPIDF(I)); CALL IDFNULLIFY(BOTIDF(I)); CALL IDFNULLIFY(KDIDF(I)) ENDDO ! DO I=1,STNLAY ! NULLIFY(TOPIDF(I)%SX,TOPIDF(I)%SY,TOPIDF(I)%X,TOPIDF(I)%V,TOPIDF(I)%YSEL,TOPIDF(I)%COMMENT) ! NULLIFY(BOTIDF(I)%SX,BOTIDF(I)%SY,BOTIDF(I)%X,BOTIDF(I)%V,BOTIDF(I)%YSEL,BOTIDF(I)%COMMENT) ! NULLIFY(KDIDF(I)%SX ,KDIDF(I)%SY , KDIDF(I)%X, KDIDF(I)%V, KDIDF(I)%YSEL, KDIDF(I)%COMMENT) ! ENDDO DO I=1,STNLAY IF(.NOT.UTL_READINITFILE(UTL_CAP('TOP'//TRIM(ITOS(I)),'U'),LINE,IU,0))RETURN READ(LINE,*) TOPIDF(I)%FNAME IF(.NOT.UTL_READINITFILE(UTL_CAP('BOT'//TRIM(ITOS(I)),'U'),LINE,IU,0))RETURN READ(LINE,*) BOTIDF(I)%FNAME IF(.NOT.UTL_READINITFILE(UTL_CAP('KD'//TRIM(ITOS(I)),'U'),LINE,IU,0))RETURN READ(LINE,*) KDIDF(I)%FNAME END DO !## initiate max. number of objects MAXNWEL=10 MAXNCUT=10 MAXNOBS=10 MAXNMON=10 MAXNRES=10 !## read if available from *.ini file different object sizes (optional) IF(UTL_READINITFILE(UTL_CAP('MAXNWEL','U'),LINE,IU,1))READ(LINE,*) MAXNWEL IF(UTL_READINITFILE(UTL_CAP('MAXNCUT','U'),LINE,IU,1))READ(LINE,*) MAXNCUT IF(UTL_READINITFILE(UTL_CAP('MAXNOBS','U'),LINE,IU,1))READ(LINE,*) MAXNOBS IF(UTL_READINITFILE(UTL_CAP('MAXNMON','U'),LINE,IU,1))READ(LINE,*) MAXNMON IF(UTL_READINITFILE(UTL_CAP('MAXNRES','U'),LINE,IU,1))READ(LINE,*) MAXNRES CLOSE(IU) !## allocate memory ALLOCATE(WEL(MAXNWEL)) ALLOCATE(CUT(MAXNCUT)) ALLOCATE(OBS(MAXNOBS)) ALLOCATE(MON(MAXNMON)) ALLOCATE(RES(MAXNRES)) !## nullify objects DO I=1,SIZE(WEL) NULLIFY(WEL(I)%LOC) NULLIFY(WEL(I)%Q) WEL(I)%NLOC=0 WEL(I)%NQ =0 END DO DO I=1,SIZE(CUT) NULLIFY(CUT(I)%XY) CUT(I)%NXY=0 END DO DO I=1,SIZE(OBS) NULLIFY(OBS(I)%LOC) NULLIFY(OBS(I)%Z) OBS(I)%NLOC=0 OBS(I)%NZ=0 END DO DO I=1,SIZE(MON) NULLIFY(MON(I)%XY) NULLIFY(MON(I)%XZ) MON(I)%NXY=0 MON(I)%NXZ=0 END DO DO I=1,SIZE(RES) ! NULLIFY(RES(I)%IDFNAME) RES(I)%IRES =0 ! RES(I)%NFILES=0 END DO !## initiate number of (selected) objects NWEL=0 IWEL=0 NCUT=0 ICUT=0 NOBS=0 IOBS=0 NMON=0 IMON=0 NRES=0 SCFFNAME='' ST1INITFILES=.TRUE. END FUNCTION ST1INITFILES !###====================================================================== SUBROUTINE ST1CLOSE() !###====================================================================== IMPLICIT NONE IDIAGERROR=1 !## save scenario? CALL WMESSAGEBOX(YESNOCANCEL,QUESTIONICON,COMMONYES, & 'Do you want to save the current project'//CHAR(13)//'before stopping the Scenario Tool ?','Question') IF(WINFODIALOG(4).EQ.0)RETURN !## cancel IF(WINFODIALOG(4).EQ.1)THEN IF(.NOT.ST1SAVELOAD(ID_SAVEAS))RETURN !## yes, do save and quit if succesfull ENDIF CALL ST1DEALLOCATE() CALL WINDOWSELECT(0) CALL WMENUSETSTATE(ID_SCENTOOL,2,0) CALL WDIALOGSELECT(ID_DSCENTOOL) CALL WDIALOGUNLOAD() CALL WDIALOGSELECT(ID_DSCENTOOL_PROP) CALL WDIALOGUNLOAD() !## refresh window CALL IDFPLOTFAST(0) IDIAGERROR=0 END SUBROUTINE ST1CLOSE !###====================================================================== SUBROUTINE ST1DEALLOCATE() !###====================================================================== IMPLICIT NONE INTEGER :: I IF(ALLOCATED(CONF))DEALLOCATE(CONF) !## deallocate memory IF(ALLOCATED(WEL))THEN DO I=1,SIZE(WEL) IF(ASSOCIATED(WEL(I)%LOC))DEALLOCATE(WEL(I)%LOC) IF(ASSOCIATED(WEL(I)%Q)) DEALLOCATE(WEL(I)%Q) END DO DEALLOCATE(WEL) ENDIF IF(ALLOCATED(CUT))THEN DO I=1,SIZE(CUT) IF(ASSOCIATED(CUT(I)%XY))DEALLOCATE(CUT(I)%XY) END DO DEALLOCATE(CUT) ENDIF IF(ALLOCATED(OBS))THEN DO I=1,SIZE(OBS) IF(ASSOCIATED(OBS(I)%LOC))DEALLOCATE(OBS(I)%LOC) IF(ASSOCIATED(OBS(I)%Z)) DEALLOCATE(OBS(I)%Z) END DO DEALLOCATE(OBS) ENDIF IF(ALLOCATED(MON))THEN DO I=1,SIZE(MON) IF(ASSOCIATED(MON(I)%XY))DEALLOCATE(MON(I)%XY) IF(ASSOCIATED(MON(I)%XZ))DEALLOCATE(MON(I)%XZ) END DO DEALLOCATE(MON) ENDIF IF(ALLOCATED(RES))THEN ! DO I=1,SIZE(RES) ! IF(ASSOCIATED(RES(I)%IDFNAME))DEALLOCATE(RES(I)%IDFNAME) ! END DO DEALLOCATE(RES) ENDIF IF(ALLOCATED(TOPIDF))THEN CALL IDFDEALLOCATE(TOPIDF,SIZE(TOPIDF)) DEALLOCATE(TOPIDF) ENDIF IF(ALLOCATED(BOTIDF))THEN CALL IDFDEALLOCATE(BOTIDF,SIZE(BOTIDF)) DEALLOCATE(BOTIDF) ENDIF IF(ALLOCATED(KDIDF))THEN CALL IDFDEALLOCATE(KDIDF,SIZE(KDIDF)) DEALLOCATE(KDIDF) ENDIF CALL UTL_CLOSEUNITS() END SUBROUTINE ST1DEALLOCATE END MODULE MOD_SCENTOOL