!! 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_PLINES USE WINTERACTER USE RESOURCE USE MOD_PREF_PAR USE MODPLOT USE MOD_UTL USE DATEVAR USE MOD_IDFPLOT USE MOD_PLINES_PAR USE MOD_PLINES_TRACE USE MOD_3D USE IMODVAR USE MOD_MANAGER_UTL USE MOD_OSD CHARACTER(LEN=50),DIMENSION(3,2) :: CKEY CHARACTER(LEN=256),DIMENSION(3) :: CDIR CHARACTER(LEN=256),ALLOCATABLE,DIMENSION(:),PRIVATE :: LISTFNAME CONTAINS !###====================================================================== SUBROUTINE PLINES1MAIN(ITYPE,MESSAGE) !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE INTEGER,INTENT(IN) :: ITYPE CHARACTER(LEN=256) :: FNAME CALL WDIALOGSELECT(MESSAGE%WIN) SELECT CASE(ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%WIN) CASE (ID_DPATHTAB1) IF(MESSAGE%VALUE1.EQ.MESSAGE%VALUE2)THEN SELECT CASE (MESSAGE%VALUE2) CASE (IDF_STRING1) CALL WDIALOGGETSTRING(IDF_STRING1,PLBROWSENAME) CALL PLINES1FIELDS(0) CASE (IDF_RADIO1,IDF_RADIO2,IDF_RADIO3,IDF_RADIO4) CALL PLINES1FIELDS(0) CASE (IDF_MENU1) CALL PLINES1FIELDS(1) CALL PLINES2FIELDS2() END SELECT ENDIF CASE (ID_DPATHTAB2) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_INTEGER4,IDF_MENU3,IDF_INTEGER3, & IDF_INTEGER6,IDF_MENU4,IDF_INTEGER5) CALL PLINES2FIELDS1(IDF_INTEGER4,IDF_MENU3,IDF_INTEGER3) CALL PLINES2FIELDS1(IDF_INTEGER6,IDF_MENU4,IDF_INTEGER5) CASE (IDF_CHECK1,IDF_CHECK2) CALL PLINES2FIELDS2() END SELECT CASE (ID_DPATHTAB3) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_RADIO1,IDF_RADIO2) CALL PLINES3FIELDS() END SELECT CASE (ID_DPATHTAB4) IF(MESSAGE%VALUE1.EQ.MESSAGE%VALUE2)THEN SELECT CASE (MESSAGE%VALUE2) !## forw./backw./both CASE (IDF_RADIO7,IDF_RADIO8,IDF_CHECK1,IDF_CHECK2,IDF_RADIO1,IDF_RADIO2) CALL PLINES4FIELDS() END SELECT ENDIF CASE (ID_DPATHTAB5) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_RADIO1,IDF_RADIO2,IDF_RADIO3) CALL PLINES5FIELDS() END SELECT END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%WIN) CASE (ID_DPATHLINES) SELECT CASE (MESSAGE%VALUE1) CASE (IDHELP) CALL UTL_GETHELP('5.11','TMO.StartPathSim') CASE (IDCANCEL) CALL PLINES1CLOSE() END SELECT CASE (ID_DPATHTAB1) 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 PLDIRNAME =FNAME PLBROWSENAME=PLDIRNAME CALL WDIALOGPUTSTRING(IDF_STRING1,TRIM(PLDIRNAME)) ENDIF CALL PLINES1FIELDS(0) END SELECT CASE (ID_DPATHTAB3) SELECT CASE (MESSAGE%VALUE1) CASE (ID_OPEN,ID_SAVE) CALL PLINES1SETTING(MESSAGE%VALUE1) CASE (ID_PROPERTIES1,ID_PROPERTIES2,ID_PROPERTIES3) CALL PLINES1PROPERTIES(MESSAGE%VALUE1) CASE (ID_OPEN1) FNAME=TRIM(PREFVAL(1))//'\STARTPOINTS' IF(UTL_WSELECTFILE('iMOD Starting Definition File (*.isd)|*.isd|',& LOADDIALOG+MUSTEXIST+PROMPTON+DIRCHANGE+APPENDEXT+MULTIFILE,FNAME,& 'Load Starting Definition File (*.isd)'))CALL WDIALOGPUTSTRING(IDF_STRING1,FNAME) CASE (ID_OPEN2) FNAME=TRIM(PREFVAL(1))//'\STARTPOINTS' IF(UTL_WSELECTFILE('iMOD Point File (*.ipf)|*.ipf|',& LOADDIALOG+MUSTEXIST+PROMPTON+DIRCHANGE+APPENDEXT+MULTIFILE,FNAME,& 'Load Point File (*.ipf)'))CALL WDIALOGPUTSTRING(IDF_STRING2,FNAME) END SELECT CASE (ID_DPATHTAB4) SELECT CASE (MESSAGE%VALUE1) !## select folder CASE (ID_SELECT) FNAME=TRIM(PREFVAL(1)) CALL WSELECTDIR(DIRCHANGE,FNAME,'Select Model Result Directory') IF(WINFODIALOG(4).EQ.1)THEN PLDIRNAME =FNAME PLBROWSENAME=PLDIRNAME CALL WDIALOGSELECT(ID_DPATHTAB4); CALL WDIALOGPUTSTRING(IDF_STRING1,TRIM(PLDIRNAME)) CALL PLINES4FIELDS() ENDIF CASE (IDOK,IDOK2) CALL PLINES1START(MESSAGE%VALUE1) CALL UTL_MESSAGEHANDLE(1) CALL PLINES4FIELDS() END SELECT END SELECT END SELECT END SUBROUTINE PLINES1MAIN !###====================================================================== SUBROUTINE PLINES1PROPERTIES(ID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,I,J,K CHARACTER(LEN=256) :: IDFNAME CALL WDIALOGSELECT(ID_DPATHLINESPROPERTIES) CALL WDIALOGPUTSTRING(IDF_STRING1,'') !## default for top/bottoms SELECT CASE (ID) CASE (ID_PROPERTIES1) CALL WDIALOGPUTSTRING(IDF_GROUP1,'Generate List of Files (below) associated with Flow Boundaries') CALL WDIALOGPUTSTRING(IDF_GROUP2,'List of Files and/or Constant Values associated with Flow Boundaries') CALL WDIALOGPUTSTRING(IDF_STRING1,TRIM(CDIR(1))) CALL WDIALOGPUTSTRING(IDF_STRING2,CKEY(1,1)) CALL WDIALOGPUTSTRING(IDF_LABEL1,'Using the KeyWord:') CALL WDIALOGFIELDSTATE(IDF_STRING3,3) K=WINFOGRID(IDF_GRID1,GRIDROWSMAX) IF(NLAY.GT.K)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Currently iMOD can display only '//TRIM(ITOS(K))//' records','Error') CALL WGRIDROWS(IDF_GRID1,MIN(K,NLAY)) DO I=1,MIN(K,NLAY) CALL WGRIDLABELROW(IDF_GRID1,I,'Boundary Layer '//TRIM(ITOS(I))) END DO CASE (ID_PROPERTIES2) CALL WDIALOGPUTSTRING(IDF_GROUP1,'Generate List of Files (below) associated with Top and Bottoms') CALL WDIALOGPUTSTRING(IDF_GROUP2,'List of Files and/or Constant Values associated with Top and Bottoms') CALL WDIALOGPUTSTRING(IDF_STRING1,TRIM(CDIR(2))) CALL WDIALOGPUTSTRING(IDF_STRING2,CKEY(2,1)) CALL WDIALOGFIELDSTATE(IDF_STRING3,1) CALL WDIALOGPUTSTRING(IDF_STRING3,CKEY(2,2)) CALL WDIALOGPUTSTRING(IDF_LABEL1,'Using the KeyWords:') K=WINFOGRID(IDF_GRID1,GRIDROWSMAX) IF(NLAY*2.GT.K)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Currently iMOD can display only '//TRIM(ITOS(K))//' records','Error') CALL WGRIDROWS(IDF_GRID1,MIN(K,NLAY*2)) J=0 DO I=1,NLAY J=J+1; CALL WGRIDLABELROW(IDF_GRID1,J,'Top of Layer '//TRIM(ITOS(I))) J=J+1; CALL WGRIDLABELROW(IDF_GRID1,J,'Bottom of Layer '//TRIM(ITOS(I))) IF(J.GE.K)EXIT END DO CASE (ID_PROPERTIES3) CALL WDIALOGPUTSTRING(IDF_GROUP1,'Generate List of Files (below) associated with Porosity') CALL WDIALOGPUTSTRING(IDF_GROUP2,'List of Files and/or Constant Values associated with Porosity') CALL WDIALOGPUTSTRING(IDF_STRING1,TRIM(CDIR(3))) CALL WDIALOGPUTSTRING(IDF_STRING2,CKEY(3,1)) CALL WDIALOGPUTSTRING(IDF_STRING3,CKEY(3,2)) CALL WDIALOGFIELDSTATE(IDF_STRING3,1) CALL WDIALOGPUTSTRING(IDF_LABEL1,'Using the KeyWords:') K=WINFOGRID(IDF_GRID1,GRIDROWSMAX) IF(NLAY*2.GT.K)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Currently iMOD can display only '//TRIM(ITOS(K))//' records','Error') CALL WGRIDROWS(IDF_GRID1,MIN(K,NLAY*2)) J=0 DO I=1,NLAY J=J+1; CALL WGRIDLABELROW(IDF_GRID1,J,'Porosity of Aquifer '//TRIM(ITOS(I))) J=J+1; CALL WGRIDLABELROW(IDF_GRID1,J,'Porosity of Aquitard '//TRIM(ITOS(I))) IF(J.GE.K)EXIT END DO END SELECT ! CALL PLINES1READFILES(ID) ALLOCATE(LISTFNAME(NLAY*2)) SELECT CASE (ID) CASE (ID_PROPERTIES1) DO I=1,NLAY LISTFNAME(I)=IBIDF(I) ENDDO CASE (ID_PROPERTIES2) DO I=1,NLAY*2 LISTFNAME(I)=TBIDF(I) ENDDO CASE (ID_PROPERTIES3) DO I=1,NLAY*2 LISTFNAME(I)=PORIDF(I) ENDDO END SELECT CALL PLINES1READFILES(ID) CALL WDIALOGSELECT(ID_DPATHLINESPROPERTIES) CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) ! CALL WDIALOGSELECT(MESSAGE%WIN) SELECT CASE(ITYPE) CASE (FIELDCHANGED) CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) !## fill list CASE (IDF_BUTTON7) CALL PLINES1QUESSFILES(ID) CALL PLINES1READFILES(ID) !## open directory CASE (ID_OPEN) IDFNAME=TRIM(PREFVAL(1)) CALL WSELECTDIR(DIRCHANGE,IDFNAME,'Select Directory') IF(WINFODIALOG(4).EQ.1)CALL WDIALOGPUTSTRING(IDF_STRING1,TRIM(IDFNAME)) CASE (IDCANCEL) EXIT CASE (IDOK) SELECT CASE (ID) CASE (ID_PROPERTIES1) DO I=1,NLAY CALL WGRIDGETCELLSTRING(IDF_GRID1,1,I,LISTFNAME(I)) IF(.NOT.PLINES1CHECKFILES(LISTFNAME(I)))EXIT ENDDO IF(I.GT.NLAY)EXIT CASE (ID_PROPERTIES2) J=0 DO I=1,NLAY J=J+1 CALL WGRIDGETCELLSTRING(IDF_GRID1,1,J,LISTFNAME(J)) IF(.NOT.PLINES1CHECKFILES(LISTFNAME(J)))EXIT J=J+1 CALL WGRIDGETCELLSTRING(IDF_GRID1,1,J,LISTFNAME(J)) IF(.NOT.PLINES1CHECKFILES(LISTFNAME(J)))EXIT ENDDO IF(I.GT.NLAY)EXIT CASE (ID_PROPERTIES3) J=0 DO I=1,NLAY J=J+1 CALL WGRIDGETCELLSTRING(IDF_GRID1,1,J,LISTFNAME(J)) IF(.NOT.PLINES1CHECKFILES(LISTFNAME(J)))EXIT J=J+1 CALL WGRIDGETCELLSTRING(IDF_GRID1,1,J,LISTFNAME(J)) IF(.NOT.PLINES1CHECKFILES(LISTFNAME(J)))EXIT ENDDO IF(I.GT.NLAY)EXIT END SELECT END SELECT END SELECT ENDDO IF(MESSAGE%VALUE1.EQ.IDOK)THEN SELECT CASE (ID) CASE (ID_PROPERTIES1) DO I=1,NLAY IBIDF(I)=LISTFNAME(I) ENDDO CASE (ID_PROPERTIES2) DO I=1,NLAY*2 TBIDF(I)=LISTFNAME(I) ENDDO CASE (ID_PROPERTIES3) DO I=1,NLAY*2 PORIDF(I)=LISTFNAME(I) ENDDO END SELECT ENDIF DEALLOCATE(LISTFNAME) CALL WDIALOGHIDE() CALL PLINES1FILLFILES(ID) END SUBROUTINE PLINES1PROPERTIES !###====================================================================== LOGICAL FUNCTION PLINES1CHECKFILES(FNAME) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: FNAME INTEGER :: I LOGICAL :: LEX PLINES1CHECKFILES=.FALSE. I=INDEX(FNAME,':') IF(I.NE.0)THEN INQUIRE(FILE=FNAME,EXIST=LEX) IF(.NOT.LEX)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Given file:'//CHAR(13)//TRIM(FNAME)//CHAR(13)//'does not exists!','Error') RETURN ENDIF ENDIF PLINES1CHECKFILES=.TRUE. END FUNCTION PLINES1CHECKFILES !###====================================================================== SUBROUTINE PLINES1QUESSFILES(ID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID INTEGER :: I,J CALL WDIALOGSELECT(ID_DPATHLINESPROPERTIES) SELECT CASE (ID) CASE (ID_PROPERTIES1) CALL WDIALOGGETSTRING(IDF_STRING1,CDIR(1)) CALL WDIALOGGETSTRING(IDF_STRING2,CKEY(1,1)) DO I=1,NLAY LISTFNAME(I)=TRIM(CDIR(1))//'\'//TRIM(CKEY(1,1))//TRIM(ITOS(I))//'.IDF' ENDDO CASE (ID_PROPERTIES2) CALL WDIALOGGETSTRING(IDF_STRING1,CDIR(2)) CALL WDIALOGGETSTRING(IDF_STRING2,CKEY(2,1)) CALL WDIALOGGETSTRING(IDF_STRING3,CKEY(2,2)) J=0 DO I=1,NLAY J=J+1 LISTFNAME(J)=TRIM(CDIR(2))//'\'//TRIM(CKEY(2,1))//TRIM(ITOS(I))//'.IDF' J=J+1 LISTFNAME(J)=TRIM(CDIR(2))//'\'//TRIM(CKEY(2,2))//TRIM(ITOS(I))//'.IDF' ENDDO CASE (ID_PROPERTIES3) CALL WDIALOGGETSTRING(IDF_STRING1,CDIR(3)) CALL WDIALOGGETSTRING(IDF_STRING2,CKEY(3,1)) CALL WDIALOGGETSTRING(IDF_STRING3,CKEY(3,2)) J=0 DO I=1,NLAY J=J+1 LISTFNAME(J)=TRIM(CDIR(3))//'\'//TRIM(CKEY(3,1))//TRIM(ITOS(I))//'.IDF' J=J+1 LISTFNAME(J)=TRIM(CDIR(3))//'\'//TRIM(CKEY(3,2))//TRIM(ITOS(I))//'.IDF' ENDDO END SELECT END SUBROUTINE PLINES1QUESSFILES !###====================================================================== SUBROUTINE PLINES1FILLFILES(ID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID CALL WDIALOGSELECT(ID_DPATHTAB3) SELECT CASE (ID) CASE (ID_PROPERTIES1) CALL WDIALOGPUTMENU(IDF_MENU1,IBIDF,NLAY,1) CASE (ID_PROPERTIES2) CALL WDIALOGPUTMENU(IDF_MENU2,TBIDF,NLAY*2,1) CASE (ID_PROPERTIES3) CALL WDIALOGPUTMENU(IDF_MENU3,PORIDF,NLAY*2,1) END SELECT END SUBROUTINE PLINES1FILLFILES !###====================================================================== SUBROUTINE PLINES1READFILES(ID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID INTEGER :: I,J CALL WDIALOGSELECT(ID_DPATHLINESPROPERTIES) J=0 DO I=1,NLAY SELECT CASE (ID) CASE (ID_PROPERTIES1) CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,I,LISTFNAME(I))!IBIDF(I)) CASE (ID_PROPERTIES2) J=J+1 CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,J,LISTFNAME(J))!TBIDF(J)) J=J+1 CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,J,LISTFNAME(J))!TBIDF(J)) CASE (ID_PROPERTIES3) J=J+1 CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,J,LISTFNAME(J))!PORIDF(J)) J=J+1 CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,J,LISTFNAME(J))!PORIDF(J)) END SELECT END DO END SUBROUTINE PLINES1READFILES !###====================================================================== SUBROUTINE PLINES1SETTING(CODE,FNAME) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: CODE CHARACTER(LEN=*),INTENT(IN),OPTIONAL :: FNAME CHARACTER(LEN=256) :: NAMES INTEGER :: IU,IOS,TOS,ILAY LOGICAL :: LEX !## save IF(CODE.EQ.ID_SAVE)THEN IF(.NOT.PRESENT(FNAME))THEN NAMES=TRIM(PREFVAL(1))//'\settings\*.ips' IF(.NOT.UTL_WSELECTFILE('iMOD Pathline Settings File (*.ips)|*.ips|',& SAVEDIALOG+PROMPTON+DIRCHANGE+APPENDEXT,NAMES,& 'Save Pathline Settings File (*.ips)'))RETURN ELSE NAMES=FNAME ENDIF IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=NAMES,STATUS='UNKNOWN') NAMES=TRIM(ITOS(NLAY))//' !## Nlay' WRITE(IU,'(A)') TRIM(NAMES) CALL WDIALOGSELECT(ID_DPATHTAB3) WRITE(IU,'(A)') TRIM(CKEY(1,1))//' !## Key ibound' WRITE(IU,'(A)') '"'//TRIM(CDIR(1))//'" !## Boundary Map' DO ILAY=1,NLAY WRITE(IU,'(A)') '"'//TRIM(IBIDF(ILAY))//'"' END DO WRITE(IU,'(A)') TRIM(CKEY(2,1))//' !## Key top' WRITE(IU,'(A)') TRIM(CKEY(2,1))//' !## Key bot' WRITE(IU,'(A)') '"'//TRIM(CDIR(2))//'" !## Top/Bot Map' DO ILAY=1,NLAY*2 WRITE(IU,'(A)') '"'//TRIM(TBIDF(ILAY))//'"' END DO WRITE(IU,'(A)') TRIM(CKEY(3,1))//' !## Key por aqf' WRITE(IU,'(A)') TRIM(CKEY(3,1))//' !## Key por aqt' WRITE(IU,'(A)') '"'//TRIM(CDIR(3))//'" !## Por Map' DO ILAY=1,NLAY*2 WRITE(IU,'(A)') '"'//TRIM(PORIDF(ILAY))//'"' END DO CLOSE(IU) !## read ELSEIF(CODE.EQ.ID_OPEN)THEN IF(.NOT.PRESENT(FNAME))THEN NAMES=TRIM(PREFVAL(1))//'\settings\*.ips' IF(.NOT.UTL_WSELECTFILE('iMOD Pathline Settings File (*.ips)|*.ips|',& LOADDIALOG+MUSTEXIST+PROMPTON+DIRCHANGE+APPENDEXT+MULTIFILE,NAMES,& 'Load Pathline Settings File (*.ips)'))RETURN ELSE NAMES=FNAME INQUIRE(FILE=NAMES,EXIST=LEX) IF(.NOT.LEX)RETURN ENDIF IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=NAMES,STATUS='UNKNOWN') ILAY=0 READ(IU,*,IOSTAT=IOS) ILAY !## cannot load ips file as nlay.ne.ilay IF(ILAY.NE.NLAY)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Cannot load ips file appropriately'//CHAR(13)// & 'since the current number of model layers ('//TRIM(ITOS(NLAY))//')'//CHAR(13)// & 'does not match the number of model layers inside the ips file ('//TRIM(ITOS(ILAY))//')'//CHAR(13)// & TRIM(NAMES),'Error') CLOSE(IU) RETURN ENDIF CALL PLINESALLOCATE() CALL WDIALOGSELECT(ID_DPATHTAB3) !## iboundary TOS=0 READ(IU,*,IOSTAT=IOS) CKEY(1,1) TOS=TOS+IOS READ(IU,*,IOSTAT=IOS) CDIR(1) TOS=TOS+IOS DO ILAY=1,NLAY READ(IU,*,IOSTAT=IOS) IBIDF(ILAY) TOS=TOS+IOS END DO !## top/bot READ(IU,*,IOSTAT=IOS) CKEY(2,1) TOS=TOS+IOS READ(IU,*,IOSTAT=IOS) CKEY(2,2) TOS=TOS+IOS READ(IU,*,IOSTAT=IOS) CDIR(2) TOS=TOS+IOS DO ILAY=1,NLAY*2 READ(IU,*,IOSTAT=IOS) TBIDF(ILAY) TOS=TOS+IOS END DO !## por_aqf,por_aqt READ(IU,*,IOSTAT=IOS) CKEY(3,1) TOS=TOS+IOS READ(IU,*,IOSTAT=IOS) CKEY(3,2) TOS=TOS+IOS READ(IU,*,IOSTAT=IOS) CDIR(3) TOS=TOS+IOS DO ILAY=1,NLAY*2 READ(IU,*,IOSTAT=IOS) PORIDF(ILAY) TOS=TOS+IOS END DO CLOSE(IU) IF(TOS.NE.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Errors occured in reading the ips file','Error') ENDIF CALL PLINES2FIELDS1(IDF_INTEGER4,IDF_MENU3,IDF_INTEGER3) CALL PLINES2FIELDS1(IDF_INTEGER6,IDF_MENU4,IDF_INTEGER5) CALL PLINES1FIELDS(1) CALL PLINES2FIELDS2() CALL PLINES5FIELDS() CALL PLINES1FILLFILES(ID_PROPERTIES1) CALL PLINES1FILLFILES(ID_PROPERTIES2) CALL PLINES1FILLFILES(ID_PROPERTIES3) ENDIF END SUBROUTINE PLINES1SETTING !###====================================================================== SUBROUTINE PLINESALLOCATE() !###====================================================================== IMPLICIT NONE IF(ALLOCATED(PORIDF))THEN IF(SIZE(PORIDF).LT.NLAY*2)THEN DEALLOCATE(PORIDF) ALLOCATE(PORIDF(NLAY*2)) PORIDF='' ENDIF ELSE ALLOCATE(PORIDF(NLAY*2)) PORIDF='' ENDIF IF(ALLOCATED(IBIDF))THEN IF(SIZE(IBIDF).LT.NLAY)THEN DEALLOCATE(IBIDF) ALLOCATE(IBIDF(NLAY)) IBIDF='' ENDIF ELSE ALLOCATE(IBIDF(NLAY)) IBIDF='' ENDIF IF(ALLOCATED(TBIDF))THEN IF(SIZE(TBIDF).LT.NLAY*2)THEN DEALLOCATE(TBIDF) ALLOCATE(TBIDF(NLAY*2)) TBIDF='' ENDIF ELSE ALLOCATE(TBIDF(NLAY*2)) TBIDF='' ENDIF END SUBROUTINE PLINESALLOCATE !###====================================================================== SUBROUTINE PLINES1START(IDB) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IDB CHARACTER(LEN=256) :: IDFNAME,LINE,FNAME,RUNFNAME CHARACTER(LEN=3),DIMENSION(2) :: EXT LOGICAL :: LEX TYPE(IDFOBJ) :: ZOOMIDF INTEGER :: ILAY,IPER,I,J,ISS,IREV,ISNK,ID,IY,IM,JD1,JD2,ISTOPCRIT,IU,NS,NT INTEGER,DIMENSION(2) :: IMODE REAL(KIND=DP_KIND) :: FRAC,TMAX DATA EXT/'IFF','IPF'/ CALL UTL_MESSAGEHANDLE(0) !## check whether last character is a "\"-as well. I=INDEX(MDLDIRNAME,'\',.TRUE.) IF(I.EQ.LEN_TRIM(MDLDIRNAME))MDLDIRNAME=MDLDIRNAME(:LEN_TRIM(MDLDIRNAME)-1) I=INDEX(PLSAVEDIRNAME,'\',.TRUE.) IF(I.EQ.LEN_TRIM(PLSAVEDIRNAME))PLSAVEDIRNAME=PLSAVEDIRNAME(:LEN_TRIM(PLSAVEDIRNAME)-1) RUNFNAME=TRIM(PLSAVEDIRNAME)//'\IMODPATH.RUN' IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=RUNFNAME,STATUS='UNKNOWN') IF(IU.LE.0)RETURN NPER=MAX(1,NPER) CALL WDIALOGSELECT(ID_DPATHTAB2) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,ISS) !ISS=0: STEADY ISS=1: TRANSIENT LINE=TRIM(ITOS(NLAY))//', !## nlay' WRITE(IU,'(A)') TRIM(LINE) LINE=TRIM(ITOS(NPER))//', !## nper' WRITE(IU,'(A)') TRIM(LINE) !## conventional particle tracking IF(IDB.EQ.IDOK)THEN CALL WDIALOGSELECT(ID_DPATHTAB3) ! CALL WDIALOGGETMENU(IDF_MENU4,I,FNAME) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,I) IF(I.EQ.1)CALL WDIALOGGETSTRING(IDF_STRING1,FNAME) IF(I.EQ.2)CALL WDIALOGGETSTRING(IDF_STRING2,FNAME) ! FNAME=TRIM(PREFVAL(1))//'\STARTPOINTS\'//TRIM(FNAME) IF(.NOT.PLINESCHECKFNAME(IU,FNAME,'Startpoint File'))RETURN WRITE(IU,'(A)') '"'//TRIM(FNAME)//'", !## startpoint file' ELSE !## starting IPS WRITE(IU,'(A)') '"", !## startpoint file' ENDIF CALL WDIALOGSELECT(ID_DPATHTAB4) !## flow type CALL WDIALOGGETCHECKBOX(IDF_CHECK1,IMODE(1)) !MODE=1:STREAMLINES CALL WDIALOGGETCHECKBOX(IDF_CHECK2,IMODE(2)) !MODE=2:ENDPOINTS IF(IDB.EQ.IDOK)THEN IF(SUM(IMODE).EQ.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You should specify at least one output type, choose from:'//CHAR(13)// & '1) Flowpaths (IFF)'//CHAR(13)//'2) End- and Startpoints (IPF)','Warning') CLOSE(IU); RETURN ENDIF CALL WDIALOGGETMENU(IDF_MENU1,I,FNAME) IF(.NOT.PLINESCHECKFNAME(IU,FNAME,'result filename'))RETURN FNAME=UTL_CAP(FNAME,'U') I=INDEXNOCASE(FNAME,'.',.TRUE.) IF(I.GT.0)FNAME=FNAME(:I-1) DO I=1,2 IF(IMODE(I).EQ.1)THEN INQUIRE(FILE=TRIM(PLSAVEDIRNAME)//'\'//TRIM(FNAME)//'.'//TRIM(EXT(I)),EXIST=LEX) IF(LEX)THEN CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to overwrite '//CHAR(13)//& TRIM(TRIM(PLSAVEDIRNAME)//'\'//TRIM(FNAME)//'.'//TRIM(EXT(I)))//' ?','Question') IF(WINFODIALOG(4).NE.1)THEN CLOSE(IU); RETURN ENDIF ENDIF ENDIF ENDDO WRITE(IU,'(A)') '"'//TRIM(PLSAVEDIRNAME)//'\'//TRIM(FNAME)//'", !## result file' ELSE WRITE(IU,'(A)') '"", !## result file' ENDIF LINE=TRIM(ITOS(IMODE(1)))//','//TRIM(ITOS(IMODE(2)))//' !## imode' WRITE(IU,'(A)') TRIM(LINE) CALL WDIALOGSELECT(ID_DPATHTAB4) !## flow-direction already known - but for sure check CALL WDIALOGGETRADIOBUTTON(IDF_RADIO7,IREV) IREV=IREV-1 !forwards:irev=0;backwards=1 LINE=TRIM(ITOS(IREV))//', !## forwards=0;backwards=1' WRITE(IU,'(A)') TRIM(LINE) !## treatment of weak sinks CALL WDIALOGSELECT(ID_DPATHTAB5) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,ISNK) LINE=TRIM(ITOS(ISNK))//', !## isnk 1=pass weak sinks, 2=stop at weak sinks, 3=stop whenever met fraction' WRITE(IU,'(A)') TRIM(LINE) !1 0 = PARTICLES PASS THROUGH CELLS WITH WEAK SINKS' !2 1 = PARTICLES ARE STOPPED WHEN THEY ENTER CELLS WITH INTERNAL SINKS' !3 2 = PARTICLES ARE STOPPED WHEN THEY ENTER CELLS WHERE DISCHARGE TO SINKS IS LARGER THAN A SPECIFIED FRACTION OF THE TOTAL INFLOW TO THE CELL' FRAC=0.99D0; IF(ISNK.EQ.3)CALL WDIALOGGETDOUBLE(IDF_REAL1,FRAC); FRAC=MIN(0.99D0,MAX(0.0D0,FRAC)) LINE=TRIM(RTOS(FRAC,'F',2))//', !## fraction'; WRITE(IU,'(A)') TRIM(LINE) !## get stop-criteria CALL WDIALOGSELECT(ID_DPATHTAB2) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO4,ISTOPCRIT) LINE=TRIM(ITOS(ISTOPCRIT))//', !## stop criterium'; WRITE(IU,'(A)') TRIM(LINE) CALL WDIALOGGETCHECKBOX(IDF_CHECK2,I) IF(I.EQ.1)THEN !## transform from year into days CALL WDIALOGGETDOUBLE(IDF_REAL1,TMAX); TMAX=TMAX*365.25D0 !## days ELSE TMAX=1.0D+30 !## days ENDIF LINE=TRIM(RTOS(TMAX,'E',4))//', !## time maximum (days!)'; WRITE(IU,'(A)') TRIM(LINE) JD1=0; JD2=0 CALL WDIALOGGETINTEGER(IDF_INTEGER3,ID); CALL WDIALOGGETMENU(IDF_MENU3,IM); CALL WDIALOGGETINTEGER(IDF_INTEGER4,IY) JD1=JD(IY,IM,ID) CALL WDIALOGGETINTEGER(IDF_INTEGER5,ID); CALL WDIALOGGETMENU(IDF_MENU4,IM); CALL WDIALOGGETINTEGER(IDF_INTEGER6,IY) JD2=JD(IY,IM,ID) IF(ISS.EQ.1)THEN IF(JD2.LE.JD1)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Given enddate exceeds given startdate!','Error') CLOSE(IU); RETURN ENDIF ENDIF LINE=TRIM(ITOS(UTL_JDATETOIDATE(JD1)))//', !## startdate'; WRITE(IU,'(A)') TRIM(LINE) LINE=TRIM(ITOS(UTL_JDATETOIDATE(JD1)))//', !## startwindow'; WRITE(IU,'(A)') TRIM(LINE) LINE=TRIM(ITOS(UTL_JDATETOIDATE(JD2)))//', !## endwindow'; WRITE(IU,'(A)') TRIM(LINE) DO ILAY=1,NLAY IF(.NOT.PLINESCHECKFNAME(IU,IBIDF(ILAY),'File that contains IBOUND information'))RETURN LINE='"'//TRIM(IBIDF(ILAY))//'", !## ibound layer '//TRIM(ITOS(ILAY)) WRITE(IU,'(A)') TRIM(LINE) I=ILAY*2-1 IF(.NOT.PLINESCHECKFNAME(IU,TBIDF(I),'File that contains TOP information'))RETURN LINE='"'//TRIM(TBIDF(I))//'", !## top layer '//TRIM(ITOS(ILAY)) WRITE(IU,'(A)') TRIM(LINE) I=ILAY*2 IF(.NOT.PLINESCHECKFNAME(IU,TBIDF(I),'File that contains BOTTOM information'))RETURN LINE='"'//TRIM(TBIDF(I))//'", !## bottom layer '//TRIM(ITOS(ILAY)) WRITE(IU,'(A)') TRIM(LINE) I=ILAY*2-1 IF(.NOT.PLINESCHECKFNAME(IU,PORIDF(I),'File that contains POR_AQF information'))RETURN LINE='"'//TRIM(PORIDF(I))//'", !## porosity aquifer layer '//TRIM(ITOS(ILAY)) WRITE(IU,'(A)') TRIM(LINE) IF(ILAY.NE.NLAY)THEN I=ILAY*2 IF(.NOT.PLINESCHECKFNAME(IU,PORIDF(I),'File that contains POR_AQT information'))RETURN LINE='"'//TRIM(PORIDF(I))//'", !## porosity aquitard layer '//TRIM(ITOS(ILAY)) WRITE(IU,'(A)') TRIM(LINE) ENDIF END DO IF(ALLOCATED(PLNLAY))DEALLOCATE(PLNLAY); ALLOCATE(PLNLAY(MAXTYPE)); PLNLAY=0 CALL PLINESCHECKMODELNLAY(NS,NT) DO IPER=1,NPER DO ILAY=1,NLAY IF(ISS.EQ.0)THEN IDFNAME=TRIM(MDLDIRNAME)//'\BDGFRF\BDGFRF_STEADY-STATE_L'//TRIM(ITOS(ILAY))//'.IDF' IF(.NOT.PLINESCHECKFNAME(IU,IDFNAME,'File that contains BDGFRF information'))RETURN WRITE(IU,'(A)') '"'//TRIM(IDFNAME)//'", !## bdgfrf' IDFNAME=TRIM(MDLDIRNAME)//'\BDGFFF\BDGFFF_STEADY-STATE_L'//TRIM(ITOS(ILAY))//'.IDF' IF(.NOT.PLINESCHECKFNAME(IU,IDFNAME,'File that contains BDGFFF information'))RETURN WRITE(IU,'(A)') '"'//TRIM(IDFNAME)//'", !## bdffff' IF(ILAY.LT.NLAY)THEN IDFNAME=TRIM(MDLDIRNAME)//'\BDGFLF\BDGFLF_STEADY-STATE_L'//TRIM(ITOS(ILAY))//'.IDF' IF(.NOT.PLINESCHECKFNAME(IU,IDFNAME,'File that contains BDGFLF information'))RETURN WRITE(IU,'(A)') '"'//TRIM(IDFNAME)//'", !## bdgflf' ENDIF ELSE IF(SUM(PLIPER(IPER,1:MAXTYPE))/MAXTYPE.NE.PLIPER(IPER,1))THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'No transient file names allocated','Error') CLOSE(IU) RETURN ENDIF J=UTL_JDATETOIDATE(PLIPER(IPER,1)) IDFNAME=TRIM(MDLDIRNAME)//'\BDGFRF\BDGFRF_'//TRIM(ITOS(J))//'_L'//TRIM(ITOS(ILAY))//'.IDF' IF(.NOT.PLINESCHECKFNAME(IU,IDFNAME,'File that contains BDGFRF information'))RETURN WRITE(IU,'(A)') '"'//TRIM(IDFNAME)//'", !## bdgfrf' J=UTL_JDATETOIDATE(PLIPER(IPER,2)) IDFNAME=TRIM(MDLDIRNAME)//'\BDGFFF\BDGFFF_'//TRIM(ITOS(J))//'_L'//TRIM(ITOS(ILAY))//'.IDF' IF(.NOT.PLINESCHECKFNAME(IU,IDFNAME,'File that contains BDGFFF information'))RETURN WRITE(IU,'(A)') '"'//TRIM(IDFNAME)//'", !## bdgfff' IF(ILAY.LT.NLAY)THEN J=UTL_JDATETOIDATE(PLIPER(IPER,3)) IDFNAME=TRIM(MDLDIRNAME)//'\BDGFLF\BDGFLF_'//TRIM(ITOS(J))//'_L'//TRIM(ITOS(ILAY))//'.IDF' IF(.NOT.PLINESCHECKFNAME(IU,IDFNAME,'File that contains BDGFLF information'))RETURN WRITE(IU,'(A)') '"'//TRIM(IDFNAME)//'", !## bdgflf' ENDIF ENDIF ENDDO ENDDO CLOSE(IU) ZOOMIDF%XMAX=0.0D0; ZOOMIDF%XMIN=ZOOMIDF%XMAX IF(IDB.EQ.IDOK)THEN CALL WMESSAGEENABLE(KEYDOWN,ENABLED) CALL WINDOWOUTSTATUSBAR(2,'Press ESC to stop process!') IF(TRACEMAIN(RUNFNAME,0,0,ZOOMIDF))THEN DO I=1,2 IF(IMODE(I).EQ.1)THEN CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=TRIM(PLSAVEDIRNAME)//'\'//TRIM(FNAME)//'.'//TRIM(EXT(I))) CALL IDFPLOTFAST(1) ENDIF ENDDO ENDIF !## close all memory CALL TRACEDEALLOCATE(1) CALL WINDOWOUTSTATUSBAR(2,'') CALL UTL_CLOSEUNITS() ELSE IF(TRACE_3D_INIT(RUNFNAME))CALL IMOD3D_INIT(0,1) ENDIF END SUBROUTINE PLINES1START !###====================================================================== LOGICAL FUNCTION PLINESCHECKFNAME(IU,FNAME,TXT) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IU CHARACTER(LEN=*),INTENT(IN) :: FNAME,TXT PLINESCHECKFNAME=.FALSE. IF(LEN_TRIM(FNAME).EQ.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'No '//TRIM(TXT)//' given.'//CHAR(13)// & 'Configure the input further on the tab Input.','Error') CLOSE(IU); RETURN ENDIF PLINESCHECKFNAME=.TRUE. END FUNCTION PLINESCHECKFNAME !###====================================================================== SUBROUTINE PLINES1FIELDS(CODE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: CODE INTEGER :: I,K,NS,NT CHARACTER(LEN=50) :: DIR CALL WDIALOGSELECT(ID_DPATHTAB1) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,I) !## directory user/getityourself K=0; IF(I.EQ.1)K=1 CALL WDIALOGFIELDSTATE(IDF_MENU1,K) CALL WDIALOGFIELDSTATE(IDF_LABEL1,K) K=ABS(K-1) CALL WDIALOGFIELDSTATE(ID_OPEN,K) CALL WDIALOGFIELDSTATE(IDF_STRING1,K) IF(CODE.EQ.-1.OR.CODE.EQ.0)THEN IF(I.EQ.1)THEN PLDIRNAME=TRIM(PREFVAL(1))//'\MODELS' CALL UTL_IMODFILLMENU(IDF_MENU1,TRIM(PLDIRNAME),'*','D',PLNDIR,0,1) ELSE CALL WDIALOGGETSTRING(IDF_STRING1,PLBROWSENAME) MDLDIRNAME=PLBROWSENAME PLNDIR=1 ENDIF ENDIF IF(CODE.NE.-1)THEN IF(I.EQ.1)THEN CALL WDIALOGSELECT(ID_DPATHTAB1) CALL WDIALOGGETMENU(IDF_MENU1,K,DIR) MDLDIRNAME=TRIM(PLDIRNAME)//'\'//TRIM(DIR) ENDIF CALL PLINES4FIELDS() I=0; IF(PLNDIR.GT.0)I=1 !## check model for proper amount of data: heads,bdgfrf,bdgflf,bdgfff files NLAY=0; NPER=0 IF(I.EQ.1)CALL PLINESCHECKMODEL(NS,NT) CALL WDIALOGSELECT(ID_DPATHTAB1) IF(NLAY.LT.0)THEN CALL WDIALOGPUTSTRING(IDF_LABEL3,'No Pathlines to be computed!'//CHAR(13)// & 'Missing data for several layers!') ELSEIF(NLAY.EQ.0)THEN CALL WDIALOGPUTSTRING(IDF_LABEL3,'No Pathlines to be computed! Relevant data is missing!') ENDIF IF(NLAY.GT.0)THEN IF(NPER.EQ.0.AND.NS.GT.0)THEN CALL WDIALOGPUTSTRING(IDF_LABEL3,'Steady-State Pathlines available for '//TRIM(ITOS(NLAY))//' layers.') ELSEIF(NPER.GT.0.AND.NT.GT.0)THEN CALL WDIALOGPUTSTRING(IDF_LABEL3,'Transient Pathlines available for '//TRIM(ITOS(NLAY))// & ' layers and '//TRIM(ITOS(NPER))//' stresses.') ELSE CALL WDIALOGPUTSTRING(IDF_LABEL3,'No Pathlines to be computed! Relevant data is missing!') ENDIF CALL PLINESALLOCATE() ENDIF ELSE NLAY=0 NPER=0 I=0 ENDIF !## fill properties - if available (nlay.gt.0) IF(NLAY.GT.0)THEN CALL PLINES1FILLFILES(ID_PROPERTIES1) CALL PLINES1FILLFILES(ID_PROPERTIES2) CALL PLINES1FILLFILES(ID_PROPERTIES3) ENDIF CALL WDIALOGSELECT(ID_DPATHTAB1) CALL WDIALOGFIELDSTATE(IDF_CHECK2,I) CALL WDIALOGFIELDSTATE(IDF_CHECK3,I) CALL WDIALOGFIELDSTATE(IDF_CHECK4,I) CALL WDIALOGSELECT(ID_DPATHLINES) IF(NLAY.LE.0)I=0 CALL WDIALOGTABSTATE(ID_TAB,ID_DPATHTAB2,I) CALL WDIALOGTABSTATE(ID_TAB,ID_DPATHTAB3,I) CALL WDIALOGTABSTATE(ID_TAB,ID_DPATHTAB4,I) CALL WDIALOGTABSTATE(ID_TAB,ID_DPATHTAB5,I) END SUBROUTINE PLINES1FIELDS !###====================================================================== SUBROUTINE PLINES2FIELDS1(IDY,IDM,IDD) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IDM,IDY,IDD INTEGER :: M,Y,D,NDAY CALL WDIALOGSELECT(ID_DPATHTAB2) CALL WDIALOGGETMENU(IDM,M) CALL WDIALOGGETINTEGER(IDY,Y) NDAY=WDATEDAYSINMONTH(Y,M) CALL WDIALOGGETINTEGER(IDD,D) CALL WDIALOGRANGEINTEGER(IDD,1,NDAY) IF(D.GT.NDAY)CALL WDIALOGPUTINTEGER(IDD,NDAY) END SUBROUTINE PLINES2FIELDS1 !###====================================================================== SUBROUTINE PLINES2FIELDS2() !###====================================================================== IMPLICIT NONE INTEGER :: I CALL WDIALOGSELECT(ID_DPATHTAB2) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER4,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER6,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER3,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER5,I) CALL WDIALOGFIELDSTATE(IDF_MENU3,I) CALL WDIALOGFIELDSTATE(IDF_MENU4,I) CALL WDIALOGFIELDSTATE(IDF_RADIO4,I) CALL WDIALOGFIELDSTATE(IDF_RADIO5,I) CALL WDIALOGFIELDSTATE(IDF_RADIO6,I) CALL WDIALOGFIELDSTATE(IDF_GROUP3,I) CALL WDIALOGFIELDSTATE(IDF_GROUP4,I) CALL WDIALOGFIELDSTATE(IDF_LABEL9,I) CALL WDIALOGFIELDSTATE(IDF_LABEL10,I) CALL WDIALOGGETCHECKBOX(IDF_CHECK2,I) CALL WDIALOGFIELDSTATE(IDF_REAL1,I) CALL WDIALOGFIELDSTATE(IDF_LABEL1,I) END SUBROUTINE PLINES2FIELDS2 !###====================================================================== SUBROUTINE PLINES3FIELDS() !###====================================================================== IMPLICIT NONE INTEGER :: I CALL WDIALOGSELECT(ID_DPATHTAB3) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,I) CALL WDIALOGFIELDSTATE(IDF_STRING1,I) CALL WDIALOGFIELDSTATE(ID_OPEN1,I) I=ABS(I-1) CALL WDIALOGFIELDSTATE(IDF_STRING2,I) CALL WDIALOGFIELDSTATE(ID_OPEN2,I) END SUBROUTINE PLINES3FIELDS !###====================================================================== SUBROUTINE PLINES4FIELDS() !###====================================================================== IMPLICIT NONE INTEGER :: N,K,I CALL WDIALOGSELECT(ID_DPATHTAB4) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,I) !## directory user/getityourself K=0; IF(I.EQ.1)K=1 CALL WDIALOGFIELDSTATE(IDF_MENU1,K) K=ABS(K-1) CALL WDIALOGFIELDSTATE(ID_SELECT,K) CALL WDIALOGFIELDSTATE(IDF_STRING1,K) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,I) IF(I.EQ.2)THEN CALL WDIALOGGETSTRING(IDF_STRING1,PLSAVEDIRNAME) ELSE PLSAVEDIRNAME=MDLDIRNAME ENDIF CALL UTL_IMODFILLMENU(IDF_MENU1,TRIM(PLSAVEDIRNAME),'*.i*f','F',N,0,0) !## results for ipf and iff files CALL WDIALOGFIELDSTATE(IDF_MENU1,1) END SUBROUTINE PLINES4FIELDS !###====================================================================== SUBROUTINE PLINES5FIELDS() !###====================================================================== IMPLICIT NONE INTEGER :: I CALL WDIALOGSELECT(ID_DPATHTAB5) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,I) IF(I.LT.3)I=0 IF(I.EQ.3)I=1 CALL WDIALOGFIELDSTATE(IDF_REAL1,I) CALL WDIALOGFIELDSTATE(IDF_LABEL1,I) CALL WDIALOGFIELDSTATE(IDF_LABEL2,I) CALL WDIALOGFIELDSTATE(IDF_LABEL3,I) END SUBROUTINE PLINES5FIELDS !###====================================================================== SUBROUTINE PLINESCHECKMODEL(NS,NT) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(OUT) :: NS,NT INTEGER :: I,IY,IM,ID CALL UTL_MESSAGEHANDLE(0) IF(ALLOCATED(PLNLAY))DEALLOCATE(PLNLAY) ALLOCATE(PLNLAY(MAXTYPE)) PLNLAY=0 CALL PLINESCHECKMODELNLAY(NS,NT) CALL WDIALOGSELECT(ID_DPATHTAB1) CALL WDIALOGPUTSTRING(IDF_CHECK2,'Flow Right Face [x] ('//TRIM(ITOS(PLNLAY(1)))//' layers)') CALL WDIALOGFIELDSTATE(IDF_CHECK2,MIN(1,PLNLAY(1))) CALL WDIALOGPUTCHECKBOX(IDF_CHECK2,MIN(1,PLNLAY(1))) CALL WDIALOGPUTSTRING(IDF_CHECK3,'Flow Front Face [y] ('//TRIM(ITOS(PLNLAY(2)))//' layers)') CALL WDIALOGFIELDSTATE(IDF_CHECK3,MIN(1,PLNLAY(2))) CALL WDIALOGPUTCHECKBOX(IDF_CHECK3,MIN(1,PLNLAY(2))) CALL WDIALOGPUTSTRING(IDF_CHECK4,'Flow Lower Face [z] ('//TRIM(ITOS(PLNLAY(3)))//' layers)') CALL WDIALOGFIELDSTATE(IDF_CHECK4,MIN(1,PLNLAY(3))) CALL WDIALOGPUTCHECKBOX(IDF_CHECK4,MIN(1,PLNLAY(3))) !## no transient simulation available CALL WDIALOGSELECT(ID_DPATHTAB2) CALL WDIALOGPUTCHECKBOX(IDF_CHECK1,MIN(1,PLNLAY(3))) CALL WDIALOGFIELDSTATE(IDF_CHECK1,2) CALL PLINES2FIELDS2() !## correct flf-idf! PLNLAY(3)=PLNLAY(3)+1 NLAY=MINVAL(PLNLAY(1:3)) IF(PLNLAY(3).GT.NLAY)PLNLAY(3)=NLAY !## determine period to be consequent! DO I=1,MAXVAL(PLNPER) IF(SUM(PLIPER(I,:))/MAXTYPE.NE.PLIPER(I,1))EXIT END DO NPER=I-1 CALL WDIALOGSELECT(ID_DPATHTAB2) CALL WDIALOGPUTCHECKBOX(IDF_CHECK1,MIN(1,NPER)) IF(NPER.GT.0)THEN CALL UTL_GDATE(PLIPER(1,1),IY,IM,ID) CALL WDIALOGPUTINTEGER(IDF_INTEGER3,ID) CALL WDIALOGPUTOPTION(IDF_MENU3,IM) CALL WDIALOGPUTINTEGER(IDF_INTEGER4,IY) CALL UTL_GDATE(PLIPER(NPER,1),IY,IM,ID) CALL WDIALOGPUTINTEGER(IDF_INTEGER5,ID) CALL WDIALOGPUTOPTION(IDF_MENU4,IM) CALL WDIALOGPUTINTEGER(IDF_INTEGER6,IY) ENDIF IF(ALLOCATED(PLNLAY))DEALLOCATE(PLNLAY) CALL UTL_MESSAGEHANDLE(1) END SUBROUTINE PLINESCHECKMODEL !###====================================================================== SUBROUTINE PLINESCHECKMODELNLAY(NS,NT) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(OUT) :: NS,NT !## number steady/transient INTEGER :: I,J,IT,ILAY,MAXNLAY,MN CHARACTER(LEN=256),ALLOCATABLE :: LISTNAME(:,:) INTEGER,ALLOCATABLE,DIMENSION(:) :: IL,N CALL IOSDIRENTRYTYPE('F') IF(ALLOCATED(N))DEALLOCATE(N) ALLOCATE(N(MAXTYPE)) MN=0 N =0 DO IT=1,MAXTYPE IF(IOSDIREXISTS(TRIM(MDLDIRNAME)//'\'//TRIM(CTYPE(IT))))THEN CALL IOSDIRCOUNT(TRIM(MDLDIRNAME)//'\'//TRIM(CTYPE(IT)),TRIM(CTYPE(IT))//'*.IDF',N(IT)) IF(N(IT).GT.0)MN=MAX(MN,N(IT)) ENDIF ENDDO IF(ALLOCATED(LISTNAME))DEALLOCATE(LISTNAME) IF(ALLOCATED(PLIPER))DEALLOCATE(PLIPER) IF(ALLOCATED(PLNPER))DEALLOCATE(PLNPER) ALLOCATE(LISTNAME(MN,MAXTYPE)) ALLOCATE(PLIPER(MN,MAXTYPE)) ALLOCATE(PLNPER(MAXTYPE)) LISTNAME='' PLIPER =0 PLNPER =0 NL =0 NS =0 NT =0 DO IT=1,MAXTYPE IF(N(IT).GT.0)THEN CALL UTL_DIRINFO(TRIM(MDLDIRNAME)//'\'//TRIM(CTYPE(IT)),TRIM(CTYPE(IT))//'*.IDF',LISTNAME(:,IT),N(IT),'F') DO I=1,N(IT) LISTNAME(I,IT)=UTL_CAP(LISTNAME(I,IT),'U') ENDDO !## find maximal number of layers DO J=1,2 MAXNLAY=0 DO I=1,N(IT) ILAY=IDFGETILAY(LISTNAME(I,IT)) IF(ILAY.GT.0)MAXNLAY=MAX(MAXNLAY,ILAY) IF(J.EQ.2.AND.(ILAY.GE.1.AND.ILAY.LE.MAXNLAY))IL(ILAY)=1 END DO IF(J.EQ.1)THEN IF(ALLOCATED(IL))DEALLOCATE(IL) ALLOCATE(IL(MAXNLAY)); IL=0 ENDIF ENDDO DO I=1,N(IT) !## determine period J=INDEX(LISTNAME(I,IT),'_STEADY-STATE_') !## transient period, get date IF(J.EQ.0)THEN PLIPER(I,IT)=UTL_IDFGETDATE(LISTNAME(I,IT)) IF(PLIPER(I,IT).NE.0)THEN PLIPER(I,IT)=UTL_IDATETOJDATE(PLIPER(I,IT)) NT=NT+1 ENDIF ELSE NS=NS+1 ENDIF END DO !## number of layers DO I=1,MAXNLAY; IF(IL(I).EQ.0)EXIT; END DO PLNLAY(IT)=I-1 !## number of periods PLNPER(IT)=0 DO I=1,N(IT) !## exists already DO J=I+1,N(IT) IF(PLIPER(I,IT).EQ.PLIPER(J,IT))EXIT END DO IF(J.LE.N(IT))PLIPER(I,IT)=0 IF(PLIPER(I,IT).NE.0)THEN PLNPER(IT)=PLNPER(IT)+1 IF(I.NE.PLNPER(IT))PLIPER(PLNPER(IT),IT)=PLIPER(I,IT) ENDIF END DO IF(PLNPER(IT).GT.0)CALL WSORT(PLIPER(:,IT),1,PLNPER(IT)) IF(ALLOCATED(IL))DEALLOCATE(IL) ENDIF ENDDO IF(ALLOCATED(LISTNAME))DEALLOCATE(LISTNAME) END SUBROUTINE PLINESCHECKMODELNLAY !###====================================================================== SUBROUTINE PLINES1INIT() !###====================================================================== IMPLICIT NONE CALL WINDOWSELECT(0) IF(WMENUGETSTATE(ID_PATHLINES,2).EQ.1)THEN CALL PLINES1CLOSE(); RETURN ENDIF CALL WMENUSETSTATE(ID_PATHLINES,2,1) CALL WDIALOGLOAD(ID_DPATHLINESPROPERTIES,ID_DPATHLINESPROPERTIES) CALL WDIALOGTITLE('Input Properties') CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPEN) CALL WDIALOGLOAD(ID_DPATHLINES,ID_DPATHLINES) CALL WDIALOGSELECT(ID_DPATHTAB1) CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPEN) !## string editable, changes will be monitored directly CALL WDIALOGFIELDOPTIONS(IDF_STRING1,EDITFIELDCHANGED,ENABLED) CALL WDIALOGSELECT(ID_DPATHTAB3) CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPEN) CALL WDIALOGPUTIMAGE(ID_SAVE,ID_ICONSAVEAS) CALL WDIALOGPUTIMAGE(ID_PROPERTIES1,ID_ICONPROPERTIES) CALL WDIALOGPUTIMAGE(ID_PROPERTIES2,ID_ICONPROPERTIES) CALL WDIALOGPUTIMAGE(ID_PROPERTIES3,ID_ICONPROPERTIES) CALL WDIALOGPUTIMAGE(ID_OPEN1,ID_ICONOPEN) CALL WDIALOGPUTIMAGE(ID_OPEN2,ID_ICONOPEN) CALL WDIALOGPUTSTRING(IDF_STRING1,'') CALL WDIALOGPUTSTRING(IDF_STRING2,'') CALL WDIALOGSELECT(ID_DPATHTAB4) CALL WDIALOGPUTIMAGE(ID_SELECT,ID_ICONOPEN) !## string editable, changes will be monitored directly CALL WDIALOGFIELDOPTIONS(IDF_STRING1,EDITFIELDCHANGED,ENABLED) ! !## fill dropdown list with sdf.files ! CALL UTL_CREATEDIR(TRIM(PREFVAL(1))//'\STARTPOINTS') ! CALL UTL_IMODFILLMENU(IDF_MENU4,TRIM(PREFVAL(1))//'\STARTPOINTS','*.ISD','F',N,0,0) ! IF(N.EQ.0)THEN ! CALL WDIALOGSELECT(ID_DPATHTAB4) ! CALL WDIALOGFIELDSTATE(IDOK,2) ! CALL WDIALOGFIELDSTATE(IDF_LABEL1,1) ! CALL WDIALOGPUTSTRING(IDF_LABEL1,'You cannot use START as you do not have any ISD files') ! !## remove startpoint fields ! CALL WDIALOGSELECT(ID_DPATHTAB3) ! CALL WDIALOGFIELDSTATE(IDF_GROUP5,2) ! CALL WDIALOGCLEARFIELD(IDF_MENU4) ! CALL WDIALOGFIELDSTATE(IDF_MENU4,2) ! ELSE ! CALL WDIALOGSELECT(ID_DPATHTAB4) ! CALL WDIALOGFIELDSTATE(IDF_LABEL1,3) ! ENDIF CALL WDIALOGSELECT(ID_DPATHTAB2) CALL WDIALOGPUTMENU(IDF_MENU3,CDATE,12,4) CALL WDIALOGPUTMENU(IDF_MENU4,CDATE,12,3) CALL WDIALOGPUTINTEGER(IDF_INTEGER3,14) CALL WDIALOGPUTINTEGER(IDF_INTEGER5,28) CALL WDIALOGPUTINTEGER(IDF_INTEGER4,1996) CALL WDIALOGPUTINTEGER(IDF_INTEGER6,2004) CALL PLINES2FIELDS1(IDF_INTEGER4,IDF_MENU3,IDF_INTEGER3) CALL PLINES2FIELDS1(IDF_INTEGER6,IDF_MENU4,IDF_INTEGER5) CALL WDIALOGSELECT(ID_DPATHTAB5) CALL WDIALOGRANGEDOUBLE(IDF_REAL1,0.0D0,1.0D0) CALL WDIALOGSPINNERSTEP(IDF_REAL1,0.01D0,0.05D0) CALL PLINES1FIELDS(-1) CALL PLINES3FIELDS() CALL PLINES5FIELDS() CKEY(1,1)='IB_L' CKEY(2,1)='TOP_L' CKEY(2,2)='BOT_L' CKEY(3,1)='POR_AQF_L' CKEY(3,2)='POR_AQT_L' CDIR='' IF(LEN_TRIM(PREFVAL(5)).NE.0)CDIR(1)=TRIM(PREFVAL(5))//'\boundary_condition' IF(LEN_TRIM(PREFVAL(5)).NE.0)CDIR(2)=TRIM(PREFVAL(5))//'\geohydrology' IF(LEN_TRIM(PREFVAL(5)).NE.0)CDIR(3)=TRIM(PREFVAL(5))//'\porosity' CALL PLINES1FIELDS(0) CALL PLINES1SETTING(ID_OPEN,FNAME=TRIM(PREFVAL(1))//'\SETTINGS\imodpath.ips') CALL WDIALOGSELECT(ID_DPATHLINES) CALL UTL_DIALOGSHOW(-1,-1,0,2) END SUBROUTINE PLINES1INIT !###====================================================================== SUBROUTINE PLINES1CLOSE() !###====================================================================== IMPLICIT NONE IF(ALLOCATED(PLIPER))DEALLOCATE(PLIPER) IF(ALLOCATED(PLNPER))DEALLOCATE(PLNPER) IF(ALLOCATED(PORIDF))DEALLOCATE(PORIDF) IF(ALLOCATED(IBIDF))DEALLOCATE(IBIDF) IF(ALLOCATED(TBIDF))DEALLOCATE(TBIDF) CALL WINDOWSELECT(0) CALL WMENUSETSTATE(ID_PATHLINES,2,0) CALL WDIALOGSELECT(ID_DPATHLINES) CALL WDIALOGUNLOAD() CALL WDIALOGSELECT(ID_DPATHLINESPROPERTIES) CALL WDIALOGUNLOAD() END SUBROUTINE PLINES1CLOSE END MODULE MOD_PLINES