!! 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_PMANAGER USE WINTERACTER USE RESOURCE USE IMODVAR USE MOD_UTL USE MOD_IDF USE MOD_OSD USE MOD_PMANAGER_PAR USE MOD_PMANAGER_UTL USE MOD_PMANAGER_MF2005 USE MOD_MANAGER_UTL USE MOD_PMANAGER_WQ USE MOD_PMANAGER_MF6NETWORK USE MOD_IDFPLOT USE MODPLOT USE DATEVAR USE MOD_IPEST_GLM, ONLY : IPEST_GLM_MAIN,IPEST_GLM_RESET_PARAMETER,IPEST_GLM_CREATE_RESIDUALSFILES USE MOD_IPEST_IES, ONLY : IPEST_IES_MAIN CHARACTER(LEN=256),POINTER,DIMENSION(:,:),PRIVATE :: FILES CHARACTER(LEN=256),DIMENSION(:,:),POINTER,PRIVATE :: FILES_BU CONTAINS !###====================================================================== SUBROUTINE PMANAGERMAIN(ITYPE,MESSAGE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ITYPE TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE INTEGER :: I,J SELECT CASE (MESSAGE%WIN) CASE (ID_DPMANAGER) SELECT CASE (ITYPE) CASE (TABCHANGED) !## new tabview selected IF(MESSAGE%VALUE2.EQ.ID_DPMANAGER_TAB1)THEN CALL PMANAGER_UTL_UPDATE_TREEVIEW(0,0,0) CALL WDIALOGSELECT(ID_DPMANAGER) CALL WDIALOGFIELDSTATE(ID_DRAW,1) CALL WDIALOGFIELDSTATE(ID_DRAW2,1) CALL WDIALOGFIELDSTATE(ID_PROPERTIES,1) CALL WDIALOGFIELDSTATE(ID_PROPERTIES_AUTO,1) CALL WDIALOGFIELDSTATE(ID_CALC,0) ENDIF IF(MESSAGE%VALUE2.EQ.ID_DPMANAGER_TAB2)THEN CALL WDIALOGSELECT(ID_DPMANAGER) CALL WDIALOGFIELDSTATE(ID_DRAW,0) CALL WDIALOGFIELDSTATE(ID_DRAW2,0) CALL WDIALOGFIELDSTATE(ID_PROPERTIES,0) CALL WDIALOGFIELDSTATE(ID_PROPERTIES_AUTO,0) CALL WDIALOGFIELDSTATE(ID_CALC,0) ENDIF CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_CLEAN) IF(UTL_PMANAGER_REFRESH(1))CALL PMANAGER_UTL_UPDATE_TREEVIEW(0,0,0) CASE (ID_DELETE) CALL PMANAGER_DELETE() !## open PRJ file CASE (ID_OPEN) IF(UTL_PMANAGER_REFRESH(1))THEN !## not loaded in correctly, clean it IF(.NOT.PMANAGERPRJ(MESSAGE%VALUE1,'',0,1))THEN IF(UTL_PMANAGER_REFRESH(1))THEN; ENDIF ENDIF CALL PMANAGER_UTL_UPDATE_TREEVIEW(0,0,0); ENDIF !## save PRJ file CASE (ID_SAVE) IF(PMANAGERPRJ(MESSAGE%VALUE1,'',0,1))THEN; ENDIF !## open RUN file, start simulation manager CASE (ID_OPENRUN) IF(UTL_PMANAGER_REFRESH(1))THEN IF(PMANAGERRUN(MESSAGE%VALUE1,'',0))THEN !IF(UTL_PMANAGER_REFRESH(1))THEN; ENDIF ENDIF CALL PMANAGER_UTL_UPDATE_TREEVIEW(0,0,0) ENDIF !## save RUN file, start simulation manager CASE (ID_SAVERUN) IF(PMANAGERRUN(MESSAGE%VALUE1,'',0))THEN; ENDIF CASE (ID_DRAW) CALL PMANAGERDRAW() CASE (ID_DRAW2) CALL PMANAGERDRAW_PLUS() CASE (ID_PROPERTIES) CALL PMANAGEROPEN() CASE (ID_PROPERTIES_AUTO) CALL PMANAGEROPEN_AUTOMATIC() CASE (ID_CALC) CALL PMANAGER_CALC() CASE (IDCANCEL) CALL PMANAGER_UTL_CLOSE() CASE (IDHELP) CALL UTL_GETHELP('*','VMO.iMODProjMan') END SELECT END SELECT !## treeview CASE (ID_DPMANAGER_TAB1) SELECT CASE (ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE1) CASE (ID_TREEVIEW1) CALL PMANAGERFIELDS() END SELECT END SELECT !## dropdown view CASE (ID_DPMANAGER_TAB2) SELECT CASE (ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE1) CASE (IDF_GRID1) CALL WDIALOGSELECT(ID_DPMANAGER_TAB2); CALL WDIALOGGETMENU(IDF_MENU1,I) J=SIZE(MC(I)%IACT); CALL WGRIDGETCHECKBOX(IDF_GRID1,2,MC(I)%IACT,J) ! CASE (IDF_MENU1) END SELECT SELECT CASE (MESSAGE%VALUE2) CASE (IDF_MENU1) !## model configuration Menu CALL PMANAGEROPEN_LISTITEMS() END SELECT END SELECT END SELECT END SUBROUTINE PMANAGERMAIN !###====================================================================== SUBROUTINE PMANAGEROPEN_LISTITEMS() !###====================================================================== IMPLICIT NONE INTEGER :: IMF,I CALL WDIALOGSELECT(ID_DPMANAGER_TAB2) CALL WDIALOGGETMENU(IDF_MENU1,IMF) CALL WGRIDROWS(IDF_GRID1,SIZE(MC(IMF)%T)) DO I=1,SIZE(MC(IMF)%T) CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,I,TOPICS(MC(IMF)%T(I))%TNAME) CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,2,I,MC(IMF)%IACT(I)) ENDDO END SUBROUTINE PMANAGEROPEN_LISTITEMS !###====================================================================== SUBROUTINE PMANAGEROPEN() !###====================================================================== IMPLICIT NONE INTEGER :: I,J,N,M,ITYPE,IPER,ITOPIC,IYR,IMH,IDY,IHR,IMT,ISC,ICF,ID,ISYS,ISUBTOPIC,IST,IOPTION TYPE(WIN_MESSAGE) :: MESSAGE CHARACTER(LEN=256) :: CNAME CHARACTER(LEN=3) :: EXT LOGICAL :: LEX,LNEW,LADD CHARACTER(LEN=MAXLENPRJ) :: CD CHARACTER(LEN=256),POINTER,DIMENSION(:) :: INPLIST CALL WDIALOGSELECT(ID_DPMANAGER_TAB1); CALL WDIALOGGETTREEVIEW(ID_TREEVIEW1,ID,CNAME) !## get the right topics, attributes from the tree-view IF(.NOT.PMANAGER_GETSELECTED(ID,ITOPIC,IPER,ISYS,ISUBTOPIC,1))RETURN !## pst/pcg and iMOW-WQ packages go to another dialog SELECT CASE (ITOPIC) CASE (TPST,TPCG,TGCG,TVDF,TRCT,TIES) !## pst=settings IF(ITOPIC.EQ.TPST)CALL PMANAGEROPEN_PEST() ! !## ies=settings ! IF(ITOPIC.EQ.TIES)CALL PMANAGEROPEN_IES() !## pcg-settings IF(ITOPIC.EQ.TPCG)CALL PMANAGEROPEN_PCG() !## gcg-settings IF(ITOPIC.EQ.TGCG)CALL PMANAGEROPEN_GCG() !## rct-settings IF(ITOPIC.EQ.TRCT)CALL PMANAGEROPEN_RCT() !## vdf-settings IF(ITOPIC.EQ.TVDF)CALL PMANAGEROPEN_VDF() IF(.NOT.ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN !## create/update new period CALL PMANAGER_STRESSES(ITOPIC,IPER) !## create new system CALL PMANAGER_SYSTEMS(ITOPIC,IPER,ISYS) ELSE IPER=1; ISYS=1 ENDIF TOPICS(ITOPIC)%STRESS(IPER)%FILES(1,ISYS)%IACT =1 CALL PMANAGER_UTL_UPDATE_TREEVIEW(ITOPIC,IPER,ISYS) RETURN END SELECT N=TOPICS(ITOPIC)%NSUBTOPICS; IF(N.GT.0)ALLOCATE(PRJ(N)) IYR=0; IMH=0; IDY=0; IHR=0; IMT=0; ISC=0 CALL WDIALOGLOAD(ID_DPMANAGEROPEN,ID_DPMANAGEROPEN) !## add a new period !## add a new system for current period IF(IPER.EQ.0.OR.ISYS.EQ.0)THEN IF(ASSOCIATED(PRJ))THEN PRJ%ILAY =1 PRJ%FCT =1.0D0 PRJ%IMP =0.0D0 PRJ%CNST =-999.99D0 PRJ%ICNST=1 PRJ%FNAME='' PRJ%IACT =1 ENDIF CALL IOSDATE(IYR,IMH,IDY); IHR=0; IMT=0; ISC=0 CALL WDIALOGFIELDSTATE(IDOK3,0); LADD=.TRUE. LNEW=.FALSE.; IF(IPER.EQ.0)LNEW=.TRUE. !## edit an existing system ELSE DO ISUBTOPIC=1,TOPICS(ITOPIC)%NSUBTOPICS PRJ(ISUBTOPIC)%FNAME=TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME PRJ(ISUBTOPIC)%FCT =TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FCT PRJ(ISUBTOPIC)%IMP =TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%IMP PRJ(ISUBTOPIC)%CNST =TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%CNST PRJ(ISUBTOPIC)%ICNST=TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST PRJ(ISUBTOPIC)%ILAY =TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ILAY PRJ(ISUBTOPIC)%IACT =TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%IACT ENDDO CALL WDIALOGFIELDSTATE(IDOK,0); LADD=.FALSE. LNEW=.FALSE. ENDIF IF(ITOPIC.EQ.TCAP.AND.IPER.GT.0)THEN IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(IPER)%INPFILES))THEN ALLOCATE(INPLIST(SIZE(TOPICS(ITOPIC)%STRESS(IPER)%INPFILES))) INPLIST=TOPICS(ITOPIC)%STRESS(IPER)%INPFILES ENDIF ENDIF ENDIF IOPTION=1 !## cannot change date IF(.NOT.LNEW)THEN CALL WDIALOGFIELDSTATE(IDF_RADIO3,0) CALL WDIALOGFIELDSTATE(IDF_RADIO4,0) CALL WDIALOGFIELDSTATE(IDF_RADIO5,0) ENDIF IF(IPER.GT.0)THEN IF(TOPICS(ITOPIC)%TIMDEP)THEN IYR=TOPICS(ITOPIC)%STRESS(IPER)%IYR; IMH=TOPICS(ITOPIC)%STRESS(IPER)%IMH; IDY=TOPICS(ITOPIC)%STRESS(IPER)%IDY IHR=TOPICS(ITOPIC)%STRESS(IPER)%IHR; IMT=TOPICS(ITOPIC)%STRESS(IPER)%IMT; ISC=TOPICS(ITOPIC)%STRESS(IPER)%ISC !## true date eentered IF(IYR+IMH+IDY+IHR+IMT+ISC.GT.0)THEN CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO4) !## transient IF(.NOT.LNEW)CALL WDIALOGFIELDSTATE(IDF_RADIO4,1) ELSE !## check whether available period selected DO I=1,NPERIOD; IF(TRIM(UTL_CAP(TOPICS(ITOPIC)%STRESS(IPER)%CDATE,'U')).EQ.TRIM(UTL_CAP(PERIOD(I)%NAME,'U')))EXIT; ENDDO IF(I.LE.NPERIOD)THEN IOPTION=I CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO5) !## specified period IF(.NOT.LNEW)CALL WDIALOGFIELDSTATE(IDF_RADIO5,1) ELSE CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO3) !## steady-state IF(.NOT.LNEW)CALL WDIALOGFIELDSTATE(IDF_RADIO3,1) ENDIF ENDIF ENDIF ENDIF IST=1; CALL WDIALOGTITLE('Define Characteristics for: '//TRIM(TOPICS(ITOPIC)%TNAME)) IF(TOPICS(ITOPIC)%NSUBTOPICS.GT.0)THEN ALLOCATE(MENUNAMES(TOPICS(ITOPIC)%NSUBTOPICS)) DO J=1,TOPICS(ITOPIC)%NSUBTOPICS; MENUNAMES(J)=TOPICS(ITOPIC)%SNAME(J); ENDDO CALL WDIALOGPUTMENU(IDF_MENU1,MENUNAMES,TOPICS(ITOPIC)%NSUBTOPICS,IST) ENDIF CALL PMANAGEROPEN_NOENTRIES(TOPICS(ITOPIC)%NSUBTOPICS,LADD) !## include species once defined IF(.NOT.TOPICS(ITOPIC)%LSPECIES)THEN CALL WDIALOGFIELDSTATE(IDF_LABEL8,0) CALL WDIALOGFIELDSTATE(IDF_LABEL9,0) CALL WDIALOGPUTSTRING(IDF_LABEL9,'No species available for this package') CALL WDIALOGFIELDSTATE(ID_SPECIES,0) CALL WDIALOGFIELDSTATE(IDF_GROUP3,0) ENDIF IF(ITOPIC.EQ.TCAP)THEN CALL WDIALOGFIELDSTATE(IDF_LABEL1,0) CALL WDIALOGFIELDSTATE(IDF_INTEGER1,0) CALL WDIALOGFIELDSTATE(ID_ADDFILES,1) ELSE CALL WDIALOGFIELDSTATE(ID_ADDFILES,0) ENDIF IF(NPERIOD.EQ.0)THEN CALL WDIALOGFIELDSTATE(IDF_MENU3,0) CALL WDIALOGCLEARFIELD(IDF_MENU3) ELSE CALL WDIALOGPUTMENU(IDF_MENU3,PERIOD%NAME,NPERIOD,IOPTION) CALL WDIALOGFIELDSTATE(IDF_MENU3,1) ENDIF IF(NSPECIES.EQ.0)THEN CALL WDIALOGPUTSTRING(IDF_LABEL9,'No species defined') ELSE WRITE(CNAME,'(99A)') (TRIM(SPECIES(I)%NAME)//',',I=1,NSPECIES-1),TRIM(SPECIES(NSPECIES)%NAME) CALL WDIALOGPUTSTRING(IDF_LABEL9,'Species: '//TRIM(CNAME)) ENDIF CALL WDIALOGPUTIMAGE(ID_OPEN ,ID_ICONOPENIDF,1) IF(.NOT.TOPICS(ITOPIC)%LSPECIES)THEN !## species section CALL WDIALOGFIELDSTATE(IDF_GROUP3,0) CALL WDIALOGFIELDSTATE(IDF_LABEL8,0) CALL WDIALOGFIELDSTATE(IDF_LABEL9,0) CALL WDIALOGFIELDSTATE(ID_SPECIES,0) ENDIF IF(.NOT.TOPICS(ITOPIC)%TIMDEP)THEN CALL WDIALOGFIELDSTATE(IDF_RADIO3,0) CALL WDIALOGFIELDSTATE(IDF_RADIO4,0) CALL WDIALOGFIELDSTATE(IDF_RADIO5,0) CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO3) CALL WDIALOGFIELDSTATE(IDF_INTEGER2,0) CALL WDIALOGFIELDSTATE(IDF_INTEGER3,0) CALL WDIALOGFIELDSTATE(IDF_INTEGER4,0) CALL WDIALOGFIELDSTATE(IDF_INTEGER5,0) CALL WDIALOGFIELDSTATE(IDF_INTEGER6,0) CALL WDIALOGFIELDSTATE(IDF_MENU2,0) CALL WDIALOGFIELDSTATE(IDF_MENU3,0) CALL WDIALOGFIELDSTATE(ID_PROPERTIES,0) CALL WDIALOGPUTSTRING(IDF_LABEL1,'Assign parameter to modellayer. Use >0 to enter modellayer number:') CALL WDIALOGRANGEINTEGER(IDF_INTEGER1,1,999) ELSE CALL WDIALOGRANGEINTEGER(IDF_INTEGER1,-1,999) SELECT CASE (ITOPIC) CASE (TEVT,TRCH,TSFR,TFHB) CALL WDIALOGPUTSTRING(IDF_LABEL1,'Assign parameter to modellayer. Use >0 to enter modellayer number; use -1 to assign to uppermost active modellayer:') CASE DEFAULT CALL WDIALOGPUTSTRING(IDF_LABEL1,'Assign parameter to modellayer. Use >0 to enter modellayer number; use -1 to assign to uppermost active '// & 'modellayer and use 0 to assign to modellayers automatically based on elevations:') END SELECT ENDIF CALL WDIALOGPUTMENU(IDF_MENU2,CDATE,12,MAX(1,IMH)) CALL WDIALOGPUTINTEGER(IDF_INTEGER2,IDY) CALL WDIALOGPUTINTEGER(IDF_INTEGER3,IYR) CALL WDIALOGPUTINTEGER(IDF_INTEGER4,IHR) CALL WDIALOGPUTINTEGER(IDF_INTEGER5,IMT) CALL WDIALOGPUTINTEGER(IDF_INTEGER6,ISC) IF(ASSOCIATED(PRJ))THEN CALL WDIALOGPUTINTEGER(IDF_INTEGER1,PRJ(1)%ILAY) CALL WDIALOGPUTCHECKBOX(IDF_CHECK1 ,PRJ(1)%IACT) ELSE CALL WDIALOGPUTINTEGER(IDF_INTEGER1,1) CALL WDIALOGPUTCHECKBOX(IDF_CHECK1 ,1) ENDIF ! IF(.NOT.TOPICS(ITOPIC)%TIMDEP.OR.SIZE(MENUNAMES).EQ.1)CALL WDIALOGFIELDSTATE(IDF_CHECK2,0) ! IF(PRJ(1)%ICNST.EQ.0)CALL WDIALOGPUTCHECKBOX(IDF_CHECK2,1) IF(TOPICS(ITOPIC)%TIMDEP)THEN CALL WDIALOGRANGEINTEGER(IDF_INTEGER1,-1,9999) ELSE CALL WDIALOGRANGEINTEGER(IDF_INTEGER1, 1,9999) ENDIF CALL PMANAGERPUTFIELDS(IST,ICF,EXT) CALL WDIALOGFIELDSTATE(IDF_RADIO1,ICF) IF(ICF.EQ.0)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO2) CALL PMANAGEROPENFIELDS(TOPICS(ITOPIC)%TIMDEP,LNEW,ICF) CALL UTL_FILLDATES(IDF_INTEGER3,IDF_MENU2,IDF_INTEGER2) CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_MENU1) CALL PMANAGERGETFIELDS(IST) CASE (IDF_RADIO1,IDF_RADIO2,IDF_RADIO3,IDF_RADIO4,IDF_RADIO5,IDF_CHECK1) !,IDF_CHECK2) CALL PMANAGEROPENFIELDS(TOPICS(ITOPIC)%TIMDEP,LNEW,ICF) CASE (IDF_INTEGER2,IDF_INTEGER3,IDF_MENU2) CALL UTL_FILLDATES(IDF_INTEGER3,IDF_MENU2,IDF_INTEGER2) END SELECT SELECT CASE (MESSAGE%VALUE1) CASE (IDF_MENU1) CALL PMANAGERPUTFIELDS(IST,ICF,EXT) CALL PMANAGEROPENFIELDS(TOPICS(ITOPIC)%TIMDEP,LNEW,ICF) END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_ADDFILES) CALL UTL_LISTOFFILES(INPLIST,(/'*.*','','','','','Specify the files to be added to the package'/),I) CASE (ID_PROPERTIES) CALL PMANAGERDEFINEPERIODS() IF(NPERIOD.GT.0)THEN CALL WDIALOGPUTMENU(IDF_MENU3,PERIOD%NAME,NPERIOD,1) CALL WDIALOGFIELDSTATE(IDF_MENU3,1) ELSE CALL WDIALOGFIELDSTATE(IDF_MENU3,0) CALL WDIALOGCLEARFIELD(IDF_MENU3) ENDIF CASE (ID_SPECIES) CALL PMANAGERDEFINESPECIES() !## new number of species N=TOPICS(ITOPIC)%NSUBTOPICS; ALLOCATE(PRJ_TMP(N)) !## old number of species M=0; IF(ASSOCIATED(PRJ))M=SIZE(PRJ) !## copy new species DO ISUBTOPIC=1,MIN(SIZE(PRJ_TMP),M) PRJ_TMP(ISUBTOPIC)%FNAME=PRJ(ISUBTOPIC)%FNAME PRJ_TMP(ISUBTOPIC)%FCT =PRJ(ISUBTOPIC)%FCT PRJ_TMP(ISUBTOPIC)%IMP =PRJ(ISUBTOPIC)%IMP PRJ_TMP(ISUBTOPIC)%CNST =PRJ(ISUBTOPIC)%CNST PRJ_TMP(ISUBTOPIC)%ICNST=PRJ(ISUBTOPIC)%ICNST PRJ_TMP(ISUBTOPIC)%ILAY =PRJ(ISUBTOPIC)%ILAY PRJ_TMP(ISUBTOPIC)%IACT =PRJ(ISUBTOPIC)%IACT ENDDO DO ISUBTOPIC=M+1,N PRJ_TMP(ISUBTOPIC)%FNAME='' PRJ_TMP(ISUBTOPIC)%FCT =1.0D0 PRJ_TMP(ISUBTOPIC)%IMP =0.0D0 PRJ_TMP(ISUBTOPIC)%CNST =0.0D0 PRJ_TMP(ISUBTOPIC)%ICNST=1 IF(M.GT.0)THEN PRJ_TMP(ISUBTOPIC)%ILAY=PRJ(1)%ILAY ELSE PRJ_TMP(ISUBTOPIC)%ILAY=1 ENDIF PRJ_TMP(ISUBTOPIC)%IACT=1 ENDDO IF(ASSOCIATED(PRJ))DEALLOCATE(PRJ); PRJ=>PRJ_TMP IF(ALLOCATED(MENUNAMES))DEALLOCATE(MENUNAMES); IF(TOPICS(ITOPIC)%NSUBTOPICS.GT.0)THEN ALLOCATE(MENUNAMES(TOPICS(ITOPIC)%NSUBTOPICS)) DO J=1,TOPICS(ITOPIC)%NSUBTOPICS; MENUNAMES(J)=TOPICS(ITOPIC)%SNAME(J); ENDDO CALL WDIALOGPUTMENU(IDF_MENU1,MENUNAMES,TOPICS(ITOPIC)%NSUBTOPICS,IST) ELSE CALL WDIALOGCLEARFIELD(IDF_MENU1); CALL WDIALOGFIELDSTATE(IDF_MENU1,2) ENDIF IF(NSPECIES.EQ.0)THEN CALL WDIALOGPUTSTRING(IDF_LABEL9,'No species defined') ELSE WRITE(CNAME,'(99A)') (TRIM(SPECIES(I)%NAME)//',',I=1,NSPECIES-1),TRIM(SPECIES(NSPECIES)%NAME) CALL WDIALOGPUTSTRING(IDF_LABEL9,'Species: '//TRIM(CNAME)) ENDIF CALL PMANAGEROPEN_NOENTRIES(TOPICS(ITOPIC)%NSUBTOPICS,LADD) CASE (ID_OPEN) IF(UTL_WSELECTFILE('iMOD '//TRIM(EXT)//' File (*.'//TRIM(EXT)//')|*.'//TRIM(EXT)//'|', & LOADDIALOG+MUSTEXIST+PROMPTON+DIRCHANGE+APPENDEXT,PRJ(IST)%FNAME,& 'Load iMOD '//TRIM(EXT)//' File'))THEN CALL WDIALOGPUTSTRING(IDF_STRING1,PRJ(IST)%FNAME) ENDIF CASE (IDOK,IDOK3) LEX=.TRUE. IF(TOPICS(ITOPIC)%TIMDEP)THEN CALL WDIALOGGETRADIOBUTTON(IDF_RADIO3,I) CD='' !## steady-state IF(I.EQ.1)THEN CD='STEADY-STATE'; IYR=0; IMH=0; IDY=0; IHR=0; IMT=0; ISC=0 !## date ELSEIF(I.EQ.2)THEN CALL WDIALOGGETINTEGER(IDF_INTEGER2,IDY) CALL WDIALOGGETMENU(IDF_MENU2,IMH) CALL WDIALOGGETINTEGER(IDF_INTEGER3,IYR) CALL WDIALOGGETINTEGER(IDF_INTEGER4,IHR) CALL WDIALOGGETINTEGER(IDF_INTEGER5,IMT) CALL WDIALOGGETINTEGER(IDF_INTEGER6,ISC) WRITE(CD,'(I4.4,5(A1,I2.2))') IYR,'-',IMH,'-',IDY,' ',IHR,':',IMT,':',ISC !## period ELSEIF(I.EQ.3)THEN CALL WDIALOGGETMENU(IDF_MENU3,I) WRITE(CD,'(A)') PERIOD(I)%NAME IYR=0; IMH=0; IDY=0; IHR=0; IMT=0; ISC=0 ENDIF IF(LNEW)THEN !## test whether date has been defined already N=0; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))N=SIZE(TOPICS(ITOPIC)%STRESS) DO I=1,N IF(TRIM(UTL_CAP(TOPICS(ITOPIC)%STRESS(I)%CDATE,'U')).EQ.TRIM(UTL_CAP(CD,'U')))THEN !## defined already CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Entered date ['//TRIM(CD)//'] has been defined already.','Information') LEX=.FALSE. ENDIF ENDDO ENDIF ENDIF IF(LEX)THEN CALL WDIALOGGETINTEGER(IDF_INTEGER1,PRJ(1)%ILAY) SELECT CASE (ITOPIC) CASE (TEVT,TRCH,TSFR,TFHB) IF(PRJ(1)%ILAY.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'You can not specify a layer number of zero for this package','Error') LEX=.FALSE. ENDIF END SELECT ENDIF IF(LEX)THEN CALL WDIALOGGETCHECKBOX(IDF_CHECK1 ,PRJ(1)%IACT) PRJ(1:SIZE(PRJ))%ILAY=PRJ(1)%ILAY PRJ(1:SIZE(PRJ))%IACT=PRJ(1)%IACT CALL PMANAGERGETFIELDS(IST) EXIT ENDIF CASE (IDCANCEL) EXIT END SELECT END SELECT ENDDO CALL WDIALOGUNLOAD() IF(MESSAGE%VALUE1.EQ.IDOK.OR.MESSAGE%VALUE1.EQ.IDOK3)THEN !## create new period CALL PMANAGER_STRESSES(ITOPIC,IPER) !## create new system CALL PMANAGER_SYSTEMS(ITOPIC,IPER,ISYS) TOPICS(ITOPIC)%STRESS(IPER)%CDATE=CD TOPICS(ITOPIC)%STRESS(IPER)%IYR=IYR; TOPICS(ITOPIC)%STRESS(IPER)%IMH=IMH TOPICS(ITOPIC)%STRESS(IPER)%IDY=IDY; TOPICS(ITOPIC)%STRESS(IPER)%IHR=IHR TOPICS(ITOPIC)%STRESS(IPER)%IMT=IMT; TOPICS(ITOPIC)%STRESS(IPER)%ISC=ISC IF(ITOPIC.EQ.TCAP)THEN IF(ASSOCIATED(INPLIST))THEN IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(IPER)%INPFILES))DEALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%INPFILES) ALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%INPFILES(SIZE(INPLIST))) TOPICS(ITOPIC)%STRESS(IPER)%INPFILES=INPLIST DEALLOCATE(INPLIST) ENDIF ENDIF DO ISUBTOPIC=1,TOPICS(ITOPIC)%NSUBTOPICS TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%IACT =PRJ(ISUBTOPIC)%IACT TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME=PRJ(ISUBTOPIC)%FNAME TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FCT =PRJ(ISUBTOPIC)%FCT TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%IMP =PRJ(ISUBTOPIC)%IMP TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST=PRJ(ISUBTOPIC)%ICNST TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%CNST =PRJ(ISUBTOPIC)%CNST TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ILAY =PRJ(ISUBTOPIC)%ILAY IF(PRJ(ISUBTOPIC)%ICNST.EQ.2)THEN TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ALIAS= & UTL_CAP(TRIM(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME & (INDEX(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME,'\',.TRUE.)+1:)),'L') ENDIF ENDDO CALL PMANAGER_SORTTOPIC(ITOPIC,IPER) CALL PMANAGER_UTL_UPDATE_TREEVIEW(ITOPIC,IPER,ISYS) ENDIF IF(ALLOCATED(MENUNAMES))DEALLOCATE(MENUNAMES); IF(ASSOCIATED(PRJ))DEALLOCATE(PRJ) END SUBROUTINE PMANAGEROPEN !###====================================================================== SUBROUTINE PMANAGEROPEN_NOENTRIES(ITOPIC,LADD) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ITOPIC LOGICAL,INTENT(IN) :: LADD INTEGER :: IACT IACT=1; IF(ITOPIC.LE.0)IACT=0 CALL WDIALOGFIELDSTATE(IDF_MENU1,IACT) IF(IACT.EQ.0)CALL WDIALOGCLEARFIELD(IDF_MENU1) !## turn off all relevant fields CALL WDIALOGFIELDSTATE(IDF_INTEGER1,IACT) CALL WDIALOGFIELDSTATE(IDF_REAL1,IACT) CALL WDIALOGFIELDSTATE(IDF_REAL2,IACT) IF(IACT.EQ.0)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO1) CALL WDIALOGFIELDSTATE(IDF_STRING1,IACT) CALL WDIALOGFIELDSTATE(IDF_RADIO1,IACT) CALL WDIALOGFIELDSTATE(IDF_RADIO2,IACT) CALL WDIALOGFIELDSTATE(ID_OPEN,IACT) IF(LADD)THEN CALL WDIALOGFIELDSTATE(IDOK,IACT) ELSE CALL WDIALOGFIELDSTATE(IDOK3,IACT) ENDIF END SUBROUTINE PMANAGEROPEN_NOENTRIES !###====================================================================== SUBROUTINE PMANAGEROPEN_AUTOMATIC() !###====================================================================== IMPLICIT NONE INTEGER :: I,J,N,ITYPE,ITOPIC,IPER,ISYS,ISUBTOPIC,ID,NF,ICNST,ILAY,IOS,IYR,IMH,IDY,IHR,IMT,ISC,ISEL REAL(KIND=DP_KIND) :: CNST TYPE(WIN_MESSAGE) :: MESSAGE CHARACTER(LEN=14) :: CD CHARACTER(LEN=256) :: CNAME CHARACTER(LEN=256),ALLOCATABLE,DIMENSION(:) :: PNAME INTEGER(KIND=8) :: IDATE CALL WDIALOGSELECT(ID_DPMANAGER_TAB1); CALL WDIALOGGETTREEVIEW(ID_TREEVIEW1,ID,CNAME) !## get the right topics, attributes from the tree-view IF(.NOT.PMANAGER_GETSELECTED(ID,ITOPIC,IPER,ISYS,ISUBTOPIC,1))RETURN !## pst/pcg goes to another dialog SELECT CASE (ITOPIC) CASE (TCAP,TPST,TPCG,TIES); RETURN END SELECT CALL WDIALOGLOAD(ID_DPMANAGER_AUTOMATIC,ID_DPMANAGER_AUTOMATIC) CALL WGRIDROWS(IDF_GRID1,TOPICS(ITOPIC)%NSUBTOPICS) CALL WDIALOGTITLE('Define Characteristics for: '//TRIM(TOPICS(ITOPIC)%TNAME)) DO J=1,TOPICS(ITOPIC)%NSUBTOPICS; CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,J,TOPICS(ITOPIC)%SNAME(J)); ENDDO IF(ALLOCATED(PNAME))DEALLOCATE(PNAME) ALLOCATE(PNAME(TOPICS(ITOPIC)%NSUBTOPICS)) IF(TOPICS(ITOPIC)%TIMDEP)THEN CALL WDIALOGPUTSTRING(IDF_RADIO1,'iMOD will look for unique TIME STEPS (>0) and MODEL LAYERS (>0) at the wildcard and add those files to your Project Manager') CALL WDIALOGFIELDSTATE(IDF_RADIO2,0) ELSE CALL WDIALOGPUTSTRING(IDF_RADIO1,'iMOD will look for unique LAYERS (>0) at the wildcard and add those files to your Project Manager') CALL WDIALOGFIELDSTATE(IDF_RADIO3,0) ENDIF CALL WDIALOGPUTMENU(IDF_MENU1,CDATE,12,1) CALL WDIALOGPUTMENU(IDF_MENU2,CDATE,12,1) CALL UTL_FILLDATESDIALOG(ID_DPMANAGER_AUTOMATIC,IDF_INTEGER1,IDF_MENU1,IDF_INTEGER2,UTL_GETCURRENTDATE()) CALL UTL_FILLDATESDIALOG(ID_DPMANAGER_AUTOMATIC,IDF_INTEGER2,IDF_MENU2,IDF_INTEGER4,UTL_GETCURRENTDATE()) CALL PMANAGEROPEN_AUTOMATIC_FIELDS() CALL WDIALOGRANGEINTEGER(IDF_INTEGER5,1,999) CALL WDIALOGPUTINTEGER(IDF_INTEGER5,1) CALL PMANAGER_GETNFILES((/TTOP,TBOT,TBND,TSHD,TKDW,TKHV,TKVA,TVCW,TKVV,TSTO,TSPY/),NF); NF=MAX(1,NF) CALL WDIALOGPUTINTEGER(IDF_INTEGER12,NF) CALL WDIALOGRANGEINTEGER(IDF_INTEGER12,1,999) CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_RADIO1,IDF_RADIO2,IDF_RADIO3) CALL PMANAGEROPEN_AUTOMATIC_FIELDS() CASE (IDF_MENU1) CALL UTL_FILLDATES(IDF_INTEGER3,IDF_MENU1,IDF_INTEGER1) CASE (IDF_MENU2) CALL UTL_FILLDATES(IDF_INTEGER4,IDF_MENU2,IDF_INTEGER2) END SELECT SELECT CASE (MESSAGE%VALUE1) END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDOK) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,ISEL); NF=0 DO J=1,TOPICS(ITOPIC)%NSUBTOPICS CALL WGRIDGETCELLSTRING(IDF_GRID1,2,J,PNAME(J)) IF(TRIM(PNAME(J)).EQ.'')THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Nothing filled in for'//CHAR(13)// & TRIM(TOPICS(ITOPIC)%SNAME(J)),'Error'); EXIT ENDIF IF(INDEX(PNAME(J),'*').GT.0)NF=NF+1 ENDDO IF(ISEL.NE.2.AND.NF.LE.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You need to add at least one parameter'//CHAR(13)// & 'defined with a wildcard','Error') ELSE IF(J.GT.TOPICS(ITOPIC)%NSUBTOPICS)THEN IF(PMANAGEROPEN_AUTOMATIC_FILES(ITOPIC,PNAME,SIZE(PNAME)))THEN !,FILES))THEN !## show files found IF(PMANAGEROPEN_AUTOMATIC_LISTFILES(ITOPIC))EXIT !FILES,ITOPIC))EXIT CALL WDIALOGSELECT(ID_DPMANAGER_AUTOMATIC) ENDIF ENDIF ENDIF CASE (IDHELP) CASE (IDCANCEL) EXIT END SELECT END SELECT ENDDO CALL WDIALOGSELECT(ID_DPMANAGER_AUTOMATIC); CALL WDIALOGUNLOAD() IF(MESSAGE%VALUE1.EQ.IDOK)THEN !## add files to project manager DO I=1,SIZE(FILES,1) IF(TOPICS(ITOPIC)%TIMDEP)THEN READ(FILES(I,TOPICS(ITOPIC)%NSUBTOPICS+1),*,IOSTAT=IOS) IDATE IF(IOS.EQ.0)THEN CALL ITIMETOGDATE(IDATE,IYR,IMH,IDY,IHR,IMT,ISC) WRITE(CD,'(I14)') IDATE ELSE READ(FILES(I,TOPICS(ITOPIC)%NSUBTOPICS+1),*,IOSTAT=IOS) CD IYR=0; IMH=0; IDY=0; IHR=0; IMT=0; ISC=0 ENDIF !## test whether date has been defined already IPER=0; N=0; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))N=SIZE(TOPICS(ITOPIC)%STRESS) DO J=1,N IF(TRIM(UTL_CAP(TOPICS(ITOPIC)%STRESS(J)%CDATE,'U')).EQ.TRIM(UTL_CAP(CD,'U')))THEN IPER=J; EXIT ENDIF ENDDO !## create new period CALL PMANAGER_STRESSES(ITOPIC,IPER) !## create new system ISYS=0; CALL PMANAGER_SYSTEMS(ITOPIC,IPER,ISYS) TOPICS(ITOPIC)%STRESS(IPER)%CDATE=ADJUSTL(FILES(I,TOPICS(ITOPIC)%NSUBTOPICS+1)) TOPICS(ITOPIC)%STRESS(IPER)%IYR=IYR; TOPICS(ITOPIC)%STRESS(IPER)%IMH=IMH TOPICS(ITOPIC)%STRESS(IPER)%IDY=IDY; TOPICS(ITOPIC)%STRESS(IPER)%IHR=IHR TOPICS(ITOPIC)%STRESS(IPER)%IMT=IMT; TOPICS(ITOPIC)%STRESS(IPER)%ISC=ISC ILAY=-9999 ELSE !## create new period CALL PMANAGER_STRESSES(ITOPIC,IPER) !## create new system ISYS=0; CALL PMANAGER_SYSTEMS(ITOPIC,IPER,ISYS) READ(FILES(I,TOPICS(ITOPIC)%NSUBTOPICS+1),*,IOSTAT=IOS) ILAY IF(IOS.NE.0)ILAY=-9999 ENDIF DO ISUBTOPIC=1,TOPICS(ITOPIC)%NSUBTOPICS READ(FILES(I,ISUBTOPIC),*,IOSTAT=IOS) CNST IF(IOS.EQ.0)THEN !## constant value ICNST=1; FILES(I,ISUBTOPIC)='' ELSE !## file given ICNST=2; CNST=-999.99 !## try to read layer IF(ILAY.EQ.-9999)ILAY=IDFGETILAY(FILES(I,ISUBTOPIC)) ILAY=MAX(1,ILAY) ENDIF TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%IACT =1 TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME=FILES(I,ISUBTOPIC) TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FCT =1.0D0 TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%IMP =0.0D0 TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST=ICNST TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%CNST =CNST TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ILAY =ILAY IF(ICNST.EQ.2)THEN TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ALIAS= & UTL_CAP(TRIM(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME & (INDEX(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME,'\',.TRUE.)+1:)),'L') ELSE TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ALIAS='' ENDIF ENDDO ENDDO CALL PMANAGER_SORTTOPIC(ITOPIC,IPER) CALL PMANAGER_UTL_UPDATE_TREEVIEW(ITOPIC,IPER,ISYS) DEALLOCATE(FILES,PNAME) ENDIF END SUBROUTINE PMANAGEROPEN_AUTOMATIC !###====================================================================== SUBROUTINE PMANAGEROPEN_AUTOMATIC_FIELDS() !###====================================================================== IMPLICIT NONE INTEGER :: I,I1,I2 CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,I) SELECT CASE (I) CASE (1); I1=0; I2=0 CASE (2); I1=0; I2=1 CASE (3); I1=1; I2=0 END SELECT CALL WDIALOGFIELDSTATE(IDF_MENU1,I1) CALL WDIALOGFIELDSTATE(IDF_MENU2,I1) CALL WDIALOGFIELDSTATE(IDF_INTEGER1,I1) CALL WDIALOGFIELDSTATE(IDF_INTEGER2,I1) CALL WDIALOGFIELDSTATE(IDF_INTEGER3,I1) CALL WDIALOGFIELDSTATE(IDF_INTEGER4,I1) CALL WDIALOGFIELDSTATE(IDF_INTEGER6,I1) CALL WDIALOGFIELDSTATE(IDF_INTEGER7,I1) CALL WDIALOGFIELDSTATE(IDF_INTEGER8,I1) CALL WDIALOGFIELDSTATE(IDF_INTEGER9,I1) CALL WDIALOGFIELDSTATE(IDF_INTEGER10,I1) CALL WDIALOGFIELDSTATE(IDF_INTEGER11,I1) CALL WDIALOGFIELDSTATE(IDF_LABEL2,I1) CALL WDIALOGFIELDSTATE(IDF_LABEL3,I1) CALL WDIALOGFIELDSTATE(IDF_INTEGER5,I2) CALL WDIALOGFIELDSTATE(IDF_INTEGER12,I2) END SUBROUTINE PMANAGEROPEN_AUTOMATIC_FIELDS !###====================================================================== LOGICAL FUNCTION PMANAGEROPEN_AUTOMATIC_LISTFILES(ITOPIC) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ITOPIC INTEGER,DIMENSION(:),ALLOCATABLE :: ICOLS INTEGER :: I,J,N,M,ITYPE TYPE(WIN_MESSAGE) :: MESSAGE PMANAGEROPEN_AUTOMATIC_LISTFILES=.FALSE. CALL WDIALOGLOAD(ID_DPMANAGER_AUTO_LIST,ID_DPMANAGER_AUTO_LIST) N=SIZE(FILES,1); M=SIZE(FILES,2)-1 IF(WINFOGRID(IDF_GRID1,GRIDROWSMAX).LT.N)THEN CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'iMOD can display '//TRIM(ITOS(WINFOGRID(IDF_GRID1,GRIDROWSMAX)))//' rows only'//CHAR(13)// & 'The current selection of files is '//TRIM(ITOS(N)),'Information') CALL WDIALOGUNLOAD(); RETURN ENDIF CALL WGRIDROWS(IDF_GRID1,N) ALLOCATE(ICOLS(M)); ICOLS=1; CALL WGRIDCOLUMNS(IDF_GRID1,M,ICOLS); DEALLOCATE(ICOLS) CALL WGRIDLABELCOLUMN(IDF_GRID1,0,'number of files: '//TRIM(ITOS(N))) DO I=1,M; CALL WGRIDLABELCOLUMN(IDF_GRID1,I,TOPICS(ITOPIC)%SNAME(I)(1:5)); ENDDO DO I=1,N; CALL WGRIDLABELROW(IDF_GRID1,I,FILES(I,M+1)); ENDDO DO I=1,M; DO J=1,N CALL WGRIDPUTCELLSTRING(IDF_GRID1,I,J,FILES(J,I)) ENDDO; ENDDO CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) END SELECT SELECT CASE (MESSAGE%VALUE1) END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDOK) !## read from dialog any adjustments DO I=1,M; DO J=1,N CALL WGRIDGETCELLSTRING(IDF_GRID1,I,J,FILES(J,I)) IF(UTL_CAP(FILES(J,I),'U').EQ.'INHERENT')THEN IF(J.EQ.1)THEN CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'You cannot assign key word INHERENT on the first row','Information') EXIT ELSE FILES(J,I)=FILES(J-1,I) ENDIF ENDIF ENDDO; IF(J.LE.N)EXIT; ENDDO IF(I.GT.M)THEN PMANAGEROPEN_AUTOMATIC_LISTFILES=.TRUE.; EXIT ENDIF CASE (IDHELP) CASE (IDCANCEL) PMANAGEROPEN_AUTOMATIC_LISTFILES=.FALSE.; EXIT END SELECT END SELECT ENDDO CALL WDIALOGUNLOAD() END FUNCTION PMANAGEROPEN_AUTOMATIC_LISTFILES !###====================================================================== LOGICAL FUNCTION PMANAGEROPEN_AUTOMATIC_FILES(ITOPIC,PNAME,NPNAME) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ITOPIC,NPNAME CHARACTER(LEN=*),INTENT(IN),DIMENSION(NPNAME) :: PNAME INTEGER :: I,J,K,L,N,M,IOS,ISEL,IDY,IMH,IYR,IHR,IMT,ISC,IL,IL1,IL2,MLV CHARACTER(LEN=256),ALLOCATABLE,DIMENSION(:) :: LISTNAME INTEGER,ALLOCATABLE,DIMENSION(:) :: NF,PF CHARACTER(LEN=256) :: DIR CHARACTER(LEN=52) :: WC REAL(KIND=DP_KIND) :: X INTEGER(KIND=8) :: IT,IT1,IT2,MTV LOGICAL :: LEX PMANAGEROPEN_AUTOMATIC_FILES=.FALSE. CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,ISEL) IF(ISEL.EQ.2)THEN CALL WDIALOGGETINTEGER(IDF_INTEGER5 ,IL1) CALL WDIALOGGETINTEGER(IDF_INTEGER12,IL2) ELSEIF(ISEL.EQ.3)THEN CALL WDIALOGGETINTEGER(IDF_INTEGER1 ,IDY) CALL WDIALOGGETMENU(IDF_MENU1 ,IMH) CALL WDIALOGGETINTEGER(IDF_INTEGER3 ,IYR) CALL WDIALOGGETINTEGER(IDF_INTEGER6 ,IHR) CALL WDIALOGGETINTEGER(IDF_INTEGER7 ,IMT) CALL WDIALOGGETINTEGER(IDF_INTEGER8 ,ISC) IT1=IYR*10000000000+IMH*100000000+IDY*1000000+IHR*10000+IMT*100+ISC CALL WDIALOGGETINTEGER(IDF_INTEGER2 ,IDY) CALL WDIALOGGETMENU(IDF_MENU2 ,IMH) CALL WDIALOGGETINTEGER(IDF_INTEGER4 ,IYR) CALL WDIALOGGETINTEGER(IDF_INTEGER9 ,IHR) CALL WDIALOGGETINTEGER(IDF_INTEGER10,IMT) CALL WDIALOGGETINTEGER(IDF_INTEGER11,ISC) IT2=IYR*10000000000+IMH*100000000+IDY*1000000+IHR*10000+IMT*100+ISC ENDIF N=TOPICS(ITOPIC)%NSUBTOPICS CALL IOSDIRENTRYTYPE('F') ALLOCATE(NF(N),PF(N)); NF=0; PF=1 !## okay let's go DO J=1,2 NF=0 DO I=1,N !## try to read a number READ(PNAME(I),*,IOSTAT=IOS) X !## okay is number, go to next IF(IOS.EQ.0)THEN IF(J.EQ.2)WRITE(FILES(1,I),*) X ELSE !## try wildcard IF(INDEX(PNAME(I),'*').GT.0)THEN DIR=PNAME(I)(1:INDEX(PNAME(I),'\',.TRUE.)-1) WC =PNAME(I)(INDEX(PNAME(I),'\',.TRUE.)+1:) CALL IOSDIRCOUNT(DIR,WC,M) ALLOCATE(LISTNAME(M)); CALL UTL_DIRINFO(DIR,WC,LISTNAME,M,'F',CORDER='N') L=0 DO K=1,M !## file okay until proven otherwise LEX=.TRUE. IF(.NOT.TOPICS(ITOPIC)%TIMDEP)THEN IL=IDFGETILAY(LISTNAME(K)) !## negative/zero layers always invalid IF(IL.LE.0)LEX=.FALSE. IF(ISEL.EQ.2)THEN; IF(IL.LT.IL1.OR.IL.GT.IL2)LEX=.FALSE.; ENDIF ELSE IT=0 IF(UTL_IDFGETDATE(LISTNAME(K),IYR=IYR,IMH=IMH,IDY=IDY,IHR=IHR,IMT=IMT,ISC=ISC).NE.0)THEN IT=IYR*10000000000+IMH*100000000+IDY*1000000+IHR*10000+IMT*100+ISC ENDIF IL=IDFGETILAY(LISTNAME(K)) !## negative dates/layers always invalid IF(IT.LE.0.AND.IL.LE.0)LEX=.FALSE. IF(ISEL.EQ.3)THEN; IF(IT.LT.IT1.OR.IT.GT.IT2)LEX=.FALSE.; ENDIF ENDIF IF(LEX)THEN L=L+1; IF(J.EQ.2)FILES(L,I)=TRIM(DIR)//'\'//TRIM(LISTNAME(K)) ENDIF ENDDO NF(I)=L; DEALLOCATE(LISTNAME) ELSE IF(J.EQ.2)FILES(1,I)=PNAME(I) ENDIF ENDIF ENDDO !## layer may be filled in without wildcards IF(SUM(NF).EQ.0)THEN !## layer asked IF(ISEL.EQ.2)EXIT CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'No files found for the parameter(s)'//CHAR(13)// & 'defined with a wildcard','Error'); DEALLOCATE(NF,PF); RETURN ENDIF IF(J.EQ.1)ALLOCATE(FILES(SUM(NF),N)) ENDDO IF(SUM(NF).GT.0)THEN !## organize them properly ALLOCATE(FILES_BU(SUM(NF),N+1)) !## initial value FILES_BU='Inherent' IF(TOPICS(ITOPIC)%TIMDEP)THEN DO I=1,SUM(NF) MTV=HUGE(INT(1,8)) !## find min-value K=0; DO J=1,N !## skip time-constant files IF(NF(J).EQ.0)CYCLE IL=IDFGETILAY(FILES(PF(J),J)) IT=INT(0,8) IF(UTL_IDFGETDATE(FILES(PF(J),J),IYR=IYR,IMH=IMH,IDY=IDY,IHR=IHR,IMT=IMT,ISC=ISC).NE.0)THEN IT=IYR*10000000000+IMH*100000000+IDY*1000000+IHR*10000+IMT*100+ISC IF(IT.LE.MTV)MTV=IT !THEN; MTV=IT; K=K+1; ENDIF ENDIF IF(IT.NE.0.OR.IL.NE.0)K=K+1 ENDDO !## nothing found anymore - quit IF(K.EQ.0)EXIT !## copy all equal to minvalue IF(MTV.EQ.HUGE(INT(0,8)))MTV=INT(0,8) !THEN IF(MTV.EQ.INT(0,8))THEN WRITE(FILES_BU(I,N+1),*) 'STEADY-STATE' ELSE WRITE(FILES_BU(I,N+1),*) MTV ENDIF DO J=1,N !## skip time-constant files IF(NF(J).EQ.0)CYCLE IT=INT(0,8) IF(UTL_IDFGETDATE(FILES(PF(J),J),IYR=IYR,IMH=IMH,IDY=IDY,IHR=IHR,IMT=IMT,ISC=ISC).NE.0)THEN IT=IYR*10000000000+IMH*100000000+IDY*1000000+IHR*10000+IMT*100+ISC ENDIF IF(IT.EQ.MTV)THEN FILES_BU(I,J)=FILES(PF(J),J); PF(J)=PF(J)+1 ENDIF ENDDO ENDDO ELSE DO I=1,SUM(NF) MLV=HUGE(1) !## find min-value K=0; DO J=1,N IL=IDFGETILAY(FILES(PF(J),J)); IF(IL.LE.MLV)THEN; MLV=IL; K=K+1; ENDIF ENDDO !## nothing found anymore - quit IF(K.EQ.0)EXIT !## copy all equal to minvalue WRITE(FILES_BU(I,N+1),*) MLV DO J=1,N IL=IDFGETILAY(FILES(PF(J),J)) IF(IL.EQ.MLV)THEN FILES_BU(I,J)=FILES(PF(J),J); PF(J)=PF(J)+1 ENDIF ENDDO ENDDO ENDIF K=I-1 DEALLOCATE(FILES) ALLOCATE(FILES(K,N+1)) DO I=1,K; DO J=1,N+1; FILES(I,J)=FILES_BU(I,J); ENDDO; ENDDO DEALLOCATE(FILES_BU) !## fill in constants at the beginning DO I=1,N IF(NF(I).EQ.0)FILES(1,I)=PNAME(I) ENDDO ELSE K=(IL2-IL1)+1 ALLOCATE(FILES(K,N+1)) IL=IL1-1; DO I=1,K; IL=IL+1; DO J=1,N; FILES(I,J)=PNAME(J); ENDDO; FILES(I,N+1)=TRIM(ITOS(IL)); ENDDO NF=K ENDIF IF(SUM(NF).GT.0)PMANAGEROPEN_AUTOMATIC_FILES=.TRUE. DEALLOCATE(NF,PF) END FUNCTION PMANAGEROPEN_AUTOMATIC_FILES !###====================================================================== LOGICAL FUNCTION PMANAGERRUN(ID,RUNFNAME,IBATCH) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID,IBATCH CHARACTER(LEN=*),INTENT(IN) :: RUNFNAME INTEGER :: IU,ITOPIC,IRUN,ILOGFILE,ISUB,I,N CHARACTER(LEN=256) :: FNAME,DIR LOGICAL :: LEX !## depending ID input this function: !## - opens an existing Runfile !## - starts the Simulation manager Window. PMANAGERRUN=.FALSE. ILOGFILE=0 !## open existing runfile IF(ID.EQ.ID_OPENRUN)THEN IF(RUNFNAME.EQ.'')THEN FNAME='' IF(.NOT.UTL_WSELECTFILE('iMOD Run File (*.run)|*.run|', & LOADDIALOG+MUSTEXIST+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,& 'Load iMOD Run File'))RETURN ELSE FNAME=RUNFNAME ENDIF IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',ACTION='READ,DENYWRITE',FORM='FORMATTED') IF(IBATCH.EQ.0)CALL UTL_MESSAGEHANDLE(0) !## read existing RUN file and fill treeview IF(PMANAGER_GETKEYS(IU)) THEN IF(PMANAGER_GETFILES(IU,ITOPIC))THEN IF(IBATCH.EQ.0)CALL PMANAGER_UTL_UPDATE_TREEVIEW(0,0,0); PMANAGERRUN=.TRUE. ELSE CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error reading BODY runfile '//TRIM(TOPICS(ITOPIC)%CMOD),'Error') ENDIF ELSE CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error reading HEADER runfile','Error') ENDIF CLOSE(IU) IF(IBATCH.EQ.0)CALL UTL_MESSAGEHANDLE(1) !## save runfile/start simulation manager ELSEIF(ID.EQ.ID_SAVERUN)THEN PBMAN%RUNFILE=RUNFNAME !## open sim window and get info from it, e.g. fname and pbman%** LEX=PMANAGER_INITSIM(PBMAN%RUNFILE,IBATCH,IRUN) IF(.NOT.LEX)THEN; CALL PMANAGER_INITSIM_DEAL(); RETURN; ENDIF IF(IBATCH.EQ.0)CALL UTL_MESSAGEHANDLE(0) SELECT CASE (PBMAN%IFORMAT) !## runfile CASE (1) IF(PMANAGER_SAVERUN(PBMAN%RUNFILE,IBATCH))THEN IF(IBATCH.EQ.0)THEN IF(IRUN.EQ.0)CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Successfully written runfile:'//CHAR(13)//TRIM(PBMAN%RUNFILE)//CHAR(13)//CHAR(13)// & 'Start the MODELTOOL to use this runfile for a simulation.','Information') ELSE WRITE(*,'(/A/)') 'Successfully written runfile:'//TRIM(PBMAN%RUNFILE) ENDIF PMANAGERRUN=.TRUE. ENDIF !## mf2005 CASE (2) IF(ABS(PBMAN%IEXPORTMF2005).EQ.1)THEN IF(PMANAGER_SAVEMF2005(PBMAN%RUNFILE,IBATCH))THEN IF(IBATCH.EQ.0)THEN IF(IRUN.EQ.0)CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Successfully written MF2005 files:'//CHAR(13)//TRIM(PBMAN%RUNFILE),'Information') ELSE WRITE(*,'(/A/)') 'Successfully written MF2005 files:'//TRIM(PBMAN%RUNFILE) ENDIF ENDIF ELSE CALL IPEST_GLM_SETGROUPS() WRITE(*,'(/A/)') 'Reusing existing exported-files for MF2005 files:'//TRIM(PBMAN%RUNFILE) ENDIF PMANAGERRUN=.TRUE.; CALL PMANAGER_SAVEMF2005_DEALLOCATE() !## mf6 CASE (3) IF(ABS(PBMAN%IEXPORTMF2005).EQ.1)THEN !## generate IDF files for submodelling IF(PBMAN%IGENMF6.EQ.1)THEN IF(LEN_TRIM(PBMAN%OUTPUT).EQ.0)THEN; DIR=PBMAN%RUNFILE(:INDEX(PBMAN%RUNFILE,'\',.TRUE.)-1) ELSE; DIR=TRIM(PBMAN%OUTPUT); ENDIF; DIR=TRIM(DIR)//'\GEN' !## generate them per submodel and per layer IF(PBMAN%SMTYPE.EQ.1)THEN DO I=1,PRJNLAY; CALL PMANAGER_GENERATEMFNETWORKS(PBMAN%GENFNAME,DIR,N,IBATCH,I); ENDDO !## generate them for all layers ELSE CALL PMANAGER_GENERATEMFNETWORKS(PBMAN%GENFNAME,DIR,PBMAN%NSUBMODEL,IBATCH,0) ENDIF PBMAN%IWINDOW=3; CALL POLYGON1CLOSE() !## mf6 model for the entire region ELSE PBMAN%NSUBMODEL=1; PBMAN%IWINDOW=1 ENDIF !## generate all submodels DO ISUB=1,PBMAN%NSUBMODEL PBMAN%BNDFILE=''; PBMAN%ISUBMODEL=ISUB !## set fname IF(PBMAN%IWINDOW.EQ.3)PBMAN%BNDFILE=TRIM(DIR)//'\'//'SUBMODEL'//TRIM(ITOS(ISUB))//'.IDF' !## set active layers for current submodel IF(PBMAN%SMTYPE.EQ.1)THEN IF(ASSOCIATED(PBMAN%ILAY))DEALLOCATE(PBMAN%ILAY) ALLOCATE(PBMAN%ILAY(PRJNLAY)); PBMAN%ILAY=0 N=SIZE(PBMAN%SM(ISUB)%ILAY); DO I=1,N; PBMAN%ILAY(PBMAN%SM(ISUB)%ILAY(I))=1; ENDDO ENDIF IF(PMANAGER_SAVEMF2005(PBMAN%RUNFILE,IBATCH))THEN IF(IBATCH.EQ.0)THEN CALL WINDOWOUTSTATUSBAR(4,'Successfully written MF6 files:'//CHAR(13)//TRIM(PBMAN%RUNFILE)) IF(ISUB.EQ.PBMAN%NSUBMODEL.AND.IRUN.EQ.0)CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK, & 'Successfully written MODFLOW6 Namfile:'//CHAR(13)//TRIM(PBMAN%RUNFILE)//CHAR(13)//CHAR(13),'Information') ELSE WRITE(*,'(/A/)') 'Successfully written MF6 files:'//TRIM(PBMAN%RUNFILE) ENDIF PMANAGERRUN=.TRUE. ENDIF CALL PMANAGER_SAVEMF2005_DEALLOCATE() ENDDO IF(ASSOCIATED(PBMAN%SM))DEALLOCATE(PBMAN%SM) ELSE CALL IPEST_GLM_SETGROUPS(); PMANAGERRUN=.TRUE.; CALL PMANAGER_SAVEMF2005_DEALLOCATE() WRITE(*,'(/A/)') 'Reusing existing exported-files for MF2005 files:'//TRIM(PBMAN%RUNFILE) ENDIF !## SeaWAT/MT3D CASE (4,5) IF(PMANAGER_SAVERUNWQ(PBMAN%RUNFILE,IBATCH))THEN IF(IBATCH.EQ.0)THEN IF(IRUN.EQ.0)CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Successfully written SEAWAT runfile:'//CHAR(13)//TRIM(PBMAN%RUNFILE),'Information') ELSE WRITE(*,'(/A/)') 'Successfully written SEAWAT runfile:'//TRIM(PBMAN%RUNFILE) ENDIF PMANAGERRUN=.TRUE. ENDIF END SELECT CALL UTL_CLOSEUNITS() ! DO I=1,MAXTOPICS; IF(ASSOCIATED(PBMAN%ISAVE(I)%ILAY))DEALLOCATE(PBMAN%ISAVE(I)%ILAY); ENDDO IF(ASSOCIATED(PBMAN%UNCONFINED))DEALLOCATE(PBMAN%UNCONFINED) IF(ASSOCIATED(PBMAN%ILAY))DEALLOCATE(PBMAN%ILAY) !## start the model IF(ABS(IRUN).EQ.1.AND.PMANAGERRUN)CALL PMANAGERSTART(PBMAN%RUNFILE,IRUN,IBATCH,1,ILOGFILE) DO I=1,MAXTOPICS; IF(ASSOCIATED(PBMAN%ISAVE(I)%ILAY))DEALLOCATE(PBMAN%ISAVE(I)%ILAY); ENDDO IF(IBATCH.EQ.0)CALL UTL_MESSAGEHANDLE(1) IF(ASSOCIATED(SIM))DEALLOCATE(SIM) CALL PMANAGER_INITSIM_DEAL() ENDIF END FUNCTION PMANAGERRUN !###====================================================================== SUBROUTINE PMANAGERSTART(RUNFNAME,IRUNMODE,IBATCH,NICORES,ILOGFILE) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: RUNFNAME INTEGER,INTENT(IN) :: IRUNMODE,IBATCH,NICORES,ILOGFILE CHARACTER(LEN=256) :: DIR,DIRNAME,SEXENAME,FNAME CHARACTER(LEN=52) :: MNAME INTEGER :: IU,IOS,I,II,J,K,N1,N2,IFLAGS,IEXCOD,IERROR,IMODE,I1 INTEGER :: IPREVAL ! location of executable LOGICAL :: LEX IMODE=0 SELECT CASE (PBMAN%IFORMAT) !## mf2005-run,mf2005-nam CASE (1,2); IPREVAL=8 !## seawat,mt3d CASE (4,5); IPREVAL=9 !## modflow6 CASE (3); IPREVAL=12 END SELECT IF(LEN_TRIM(PREFVAL(IPREVAL)).GT.0)THEN INQUIRE(FILE=PREFVAL(IPREVAL),EXIST=LEX) ELSE LEX=.FALSE. ENDIF IF(.NOT.LEX)THEN IF(IBATCH.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,TRIM(PREF(IPREVAL))//' cannot be started, iMOD cannot find the executable:'//CHAR(13)// & '['//TRIM(PREFVAL(IPREVAL))//']','Error') ELSE WRITE(*,'(A)') TRIM(PREF(IPREVAL))//' cannot be started, iMOD cannot find the exectuable given' WRITE(*,'(A)') '['//TRIM(PREFVAL(IPREVAL))//']' ENDIF RETURN ENDIF IMODE=0 !## runfile or namfile IF(INDEX(UTL_CAP(RUNFNAME,'U'),'.NAM',.TRUE.).GT.0)THEN IMODE=1 ELSEIF(INDEX(UTL_CAP(RUNFNAME,'U'),'.RUN',.TRUE.).GT.0)THEN IMODE=2 ELSE IF(IBATCH.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMODFLOW cannot be started with given file:'//CHAR(13)// & TRIM(RUNFNAME),'Error') ELSE WRITE(*,'(A)') 'iMODFLOW cannot be started with given file: '//TRIM(RUNFNAME) ENDIF RETURN ENDIF !## simulation directory DIR=RUNFNAME(:INDEX(RUNFNAME,'\',.TRUE.)-1) CALL UTL_CREATEDIR(DIR) !## modelname MNAME=RUNFNAME(INDEX(RUNFNAME,'\',.TRUE.)+1:INDEX(RUNFNAME,'.',.TRUE.)-1) !## create component file(s) IF(TOPICS(TCAP)%DEFINED.AND.PBMAN%IFORMAT.NE.3)THEN N1=1; N2=1; IF(PBMAN%IPESTP.EQ.1)THEN; N1=-PBMAN%NLAMBDASEARCH; N2=SIZE(PEST%PARAM); ENDIF DO I=N1,N2 !## skip zero IF(I.EQ.0)CYCLE !## simulate batch-file IU=UTL_GETUNIT() IF(PBMAN%IPESTP.EQ.0)THEN CALL OSD_OPEN(IU,FILE=TRIM(DIR)//'\COMPONENTS.INP',STATUS='REPLACE',ACTION='WRITE,DENYREAD',IOSTAT=IOS) ELSE IF(I.GT.0)THEN IF(PEST%PARAM(I)%PACT.EQ.0.OR.PEST%PARAM(I)%PIGROUP.LT.0)CYCLE CALL OSD_OPEN(IU,FILE=TRIM(DIR)//'\COMPONENTS_P#'//TRIM(ITOS(I))//'.INP',STATUS='REPLACE',ACTION='WRITE,DENYREAD',IOSTAT=IOS) ELSE CALL OSD_OPEN(IU,FILE=TRIM(DIR)//'\COMPONENTS_L#'//TRIM(ITOS(ABS(I)))//'.INP',STATUS='REPLACE',ACTION='WRITE,DENYREAD',IOSTAT=IOS) ENDIF ENDIF IF(IOS.NE.0)THEN IF(IBATCH.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMODFLOW is already running, you cannot start '//CHAR(13)// & 'new run while previous run is still running'//CHAR(13)//'or'//CHAR(13)//'Run-script cannot be created'//CHAR(13)// & TRIM(DIR)//'\COMPONENTS.INP','Error') ELSE WRITE(*,'(A)') 'iMODFLOW is already running, you cannot start new run while previous run is still running'// & 'or Run-script cannot be created '//TRIM(DIR)//'\COMPONENTS.INP' ENDIF RETURN ENDIF IF(PBMAN%IPESTP.EQ.0)THEN WRITE(IU,'(A)') 'MODFLOW -wd \MODELINPUT -namfile '//TRIM(DIR)//'\'//TRIM(MNAME)//'.NAM -DXC .\MODELINPUT\'//TRIM(MNAME)//'.DXC' ELSE IF(I.GT.0)THEN IF(PEST%PARAM(I)%PACT.EQ.0.OR.PEST%PARAM(I)%PIGROUP.LT.0)CYCLE WRITE(IU,'(A)') 'MODFLOW -wd \MODELINPUT -namfile '//TRIM(DIR)//'\'//TRIM(MNAME)//'_P#'//TRIM(ITOS(I))//'.NAM -DXC .\MODELINPUT\'//TRIM(MNAME)//'.DXC' ELSE WRITE(IU,'(A)') 'MODFLOW -wd \MODELINPUT -namfile '//TRIM(DIR)//'\'//TRIM(MNAME)//'_L#'//TRIM(ITOS(ABS(I)))//'.NAM -DXC .\MODELINPUT\'//TRIM(MNAME)//'.DXC' ENDIF ENDIF WRITE(IU,'(A)') 'METASWAP -wd \MSWAPINPUT' CLOSE(IU) ENDDO ENDIF INQUIRE(FILE=TRIM(EXEPATH)//'\'//TRIM(LICFILE),EXIST=LEX) IF(.NOT.LEX)THEN IERROR=0; CALL IMOD_AGREEMENT(IERROR) IF(IERROR.NE.1)THEN IF(LBETA)THEN IF(IBATCH.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,COMMONOK,EXCLAMATIONICON,'Cannot start Beta-iMOD because you are not authorized in writing for Beta-iMOD','Error') ELSE WRITE(*,'(A)') 'Cannot start Beta-iMOD because you are not authorized in writing for Beta-iMOD' ENDIF ELSE IF(IBATCH.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,COMMONOK,EXCLAMATIONICON,'Cannot start iMODFLOW unless you accept the iMOD Software License Agreement','Error') ELSE WRITE(*,'(A)') 'Cannot start iMODFLOW unless you accept the iMOD Software License Agreement' ENDIF ENDIF RETURN ENDIF ENDIF ! !## Save Keywords from Model Simulation window to INI file. For reuse in window or run iMODBATCH Function= RUNFILE ! IF(PMANAGERINI(1,"")) THEN; ENDIF !## copy imod license text file CALL IOSCOPYFILE(TRIM(EXEPATH)//'\'//TRIM(LICFILE),TRIM(DIR)//'\'//TRIM(LICFILE)) N1=1; N2=1 IF(PBMAN%IPESTP.EQ.1)THEN N1=-PBMAN%NLAMBDASEARCH; N2=SIZE(PEST%PARAM) ELSEIF(PBMAN%IIES.EQ.1)THEN N1=1; N2=PEST%NREALS ENDIF DO I=N1,N2 !## skip zero IF(I.EQ.0)CYCLE !## simulate batch-file IU=UTL_GETUNIT() IF(PBMAN%IPESTP+PBMAN%IIES.EQ.0)THEN FNAME=TRIM(DIR)//'\RUN.BAT' ELSEIF(PBMAN%IPESTP.EQ.1)THEN IF(I.GT.0)THEN IF(PEST%PARAM(I)%PACT.EQ.0.OR.PEST%PARAM(I)%PIGROUP.LT.0)CYCLE !## mf6 IF(PBMAN%IFORMAT.EQ.3)THEN FNAME=TRIM(DIR)//'\IPEST_P#'//TRIM(ITOS(I))//'\RUN_P#'//TRIM(ITOS(I))//'.BAT' ELSE FNAME=TRIM(DIR)//'\RUN_P#'//TRIM(ITOS(I))//'.BAT' ENDIF ELSE IF(PBMAN%IFORMAT.EQ.3)THEN FNAME=TRIM(DIR)//'\IPEST_L#'//TRIM(ITOS(ABS(I)))//'\RUN_L#'//TRIM(ITOS(ABS(I)))//'.BAT' ELSE FNAME=TRIM(DIR)//'\RUN_L#'//TRIM(ITOS(ABS(I)))//'.BAT' ENDIF ENDIF ELSEIF(PBMAN%IIES.EQ.1)THEN IF(PBMAN%IFORMAT.EQ.3)THEN FNAME=TRIM(DIR)//'\IPEST_R#'//TRIM(ITOS(I))//'\RUN_R#'//TRIM(ITOS(I))//'.BAT' ELSE FNAME=TRIM(DIR)//'\RUN_R#'//TRIM(ITOS(I))//'.BAT' ENDIF ENDIF CALL OSD_OPEN(IU,FILE=FNAME,STATUS='REPLACE',ACTION='WRITE,DENYREAD',IOSTAT=IOS) IF(IOS.NE.0)THEN IF(IBATCH.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMODFLOW is already running, you cannot start '//CHAR(13)// & 'new run while previous run is still running'//CHAR(13)//'or'//CHAR(13)//'Run-script cannot be created','Error') ELSE WRITE(*,'(A)') 'iMODFLOW is already running, you cannot start new run while previous run is still running'// & 'or Run-script cannot be created' ENDIF RETURN ENDIF SEXENAME=PREFVAL(IPREVAL) !## write start script in batch file WRITE(IU,'(A)') 'REM ==========================' WRITE(IU,'(A)') 'REM Run Script iMOD '//TRIM(RVERSION) WRITE(IU,'(A)') 'REM ==========================' !## namfile IF(IMODE.EQ.1)THEN IF(PBMAN%IFORMAT.EQ.1)WRITE(IU,'(A)') 'TITLE "NAMFILE: '//TRIM(MNAME)//'.nam"' IF(TOPICS(TCAP)%DEFINED)THEN IF(PBMAN%IPESTP.EQ.0)THEN IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IU,'(/A/)') '"'//TRIM(SEXENAME)//'"' ELSE WRITE(IU,'(/A/)') '"'//TRIM(SEXENAME)//'" -components components.inp' ENDIF ELSE IF(I.GT.0)THEN WRITE(IU,'(/A/)') '"'//TRIM(SEXENAME)//'" -components components_P#'//TRIM(ITOS(I))//'.inp -ipest ".\modelinput\'//TRIM(MNAME)//'.pst1"' ELSE WRITE(IU,'(/A/)') '"'//TRIM(SEXENAME)//'" -components components_L#'//TRIM(ITOS(ABS(I)))//'.inp -ipest ".\modelinput\'//TRIM(MNAME)//'.pst1"' ENDIF ENDIF ELSE IF(PBMAN%IPEST+PBMAN%IPESTP+PBMAN%IIES.EQ.0)THEN IF(PBMAN%IFORMAT.EQ.2)WRITE(IU,'(/A/)') '"'//TRIM(PREFVAL(IPREVAL))//'" "'//TRIM(MNAME)//'.nam"' IF(PBMAN%IFORMAT.EQ.3)WRITE(IU,'(/A/)') '"'//TRIM(PREFVAL(IPREVAL))//'"' !## ipest ELSEIF(PBMAN%IPEST.EQ.1)THEN WRITE(IU,'(/A/)') '"'//TRIM(SEXENAME)//'" "'//TRIM(MNAME)//'.nam" -ipest ".\modelinput\'//TRIM(MNAME)//'.pst1"' !## parrallel ipest ELSEIF(PBMAN%IPESTP.EQ.1)THEN IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IU,'(A)') 'CD '//FNAME(:INDEX(FNAME,'\',.TRUE.)-1) WRITE(IU,'(/A/)') '"'//TRIM(SEXENAME) ELSE IF(I.GT.0)THEN WRITE(IU,'(/A/)') '"'//TRIM(SEXENAME)//'" "'//TRIM(MNAME)//'_P#'//TRIM(ITOS(I))//'.nam" -ipest ".\modelinput\'// & TRIM(MNAME)//'_P#'//TRIM(ITOS(I))//'.pst1"' ELSE WRITE(IU,'(/A/)') '"'//TRIM(SEXENAME)//'" "'//TRIM(MNAME)//'_L#'//TRIM(ITOS(ABS(I)))//'.nam" -ipest ".\modelinput\'// & TRIM(MNAME)//'_L#'//TRIM(ITOS(ABS(I)))//'.pst1"' ENDIF ENDIF !## ies ELSEIF(PBMAN%IIES.EQ.1)THEN IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IU,'(A)') 'CD '//FNAME(:INDEX(FNAME,'\',.TRUE.)-1) WRITE(IU,'(/A/)') '"'//TRIM(SEXENAME) ELSE WRITE(IU,'(/A/)') '"'//TRIM(SEXENAME)//'" "'//TRIM(MNAME)//'_R#'//TRIM(ITOS(I))//'.nam" -ipest ".\modelinput\'//TRIM(MNAME)//'.pst1"' ENDIF ENDIF ENDIF !## include postprocessing only in case not parameter optimization is carried out IF(PBMAN%IPEST+PBMAN%IPESTP.EQ.0)THEN !## include conversion from mf6 to idf files IF(PBMAN%IFORMAT.EQ.3)THEN WRITE(IU,'(/A)') 'ECHO OFF' WRITE(IU,'(/A)') 'ECHO MODFLOW finished, postprocessing started ' WRITE(IU,'(/A)') 'ECHO =============================================' WRITE(IU,'( A)') 'ECHO iMOD Batch Script iMOD '//TRIM(RVERSION) WRITE(IU,'( A)') 'ECHO =============================================' DO J=1,PBMAN%NSUBMODEL WRITE(IU,'(/A)') 'ECHO FUNCTION=MF6TOIDF' WRITE(IU,'(/A)') 'ECHO FUNCTION=MF6TOIDF > MF6TOIDF.INI' WRITE(IU,'( A)') 'ECHO GRB="'//TRIM(DIR)//'\GWF_'//TRIM(ITOS(J))//'\MODELINPUT\'//TRIM(MNAME)//'.DIS6.GRB" >> MF6TOIDF.INI' IF(LSHD)WRITE(IU,'( A)') 'ECHO HED="'//TRIM(DIR)//'\GWF_'//TRIM(ITOS(J))//'\MODELOUTPUT\HEAD\HEAD.HED" >> MF6TOIDF.INI' IF(LBDG)WRITE(IU,'( A)') 'ECHO BDG="'//TRIM(DIR)//'\GWF_'//TRIM(ITOS(J))//'\MODELOUTPUT\BUDGET\BUDGET.CBC" >> MF6TOIDF.INI' IF(PRJNPER.GT.1)THEN DO K=1,PRJNPER IF(SIM(K)%DELT.GT.0.0)THEN WRITE(IU,'(A,I4.4,2I2.2,A)') 'ECHO SDATE=',SIM(K)%IYR,SIM(K)%IMH,SIM(K)%IDY,' >> MF6TOIDF.INI' EXIT ENDIF ENDDO ENDIF !## write layers to be saved CALL PMANAGER_SAVEMF2005_MF6TOIDF_ISAVE(PBMAN%ISAVE(TSHD)%ILAY,'SAVESHD',IU) CALL PMANAGER_SAVEMF2005_MF6TOIDF_ISAVE(PBMAN%ISAVE(TWEL)%ILAY,'SAVEWEL',IU) CALL PMANAGER_SAVEMF2005_MF6TOIDF_ISAVE(PBMAN%ISAVE(TDRN)%ILAY,'SAVEDRN',IU) CALL PMANAGER_SAVEMF2005_MF6TOIDF_ISAVE(PBMAN%ISAVE(TRIV)%ILAY,'SAVERIV',IU) CALL PMANAGER_SAVEMF2005_MF6TOIDF_ISAVE(PBMAN%ISAVE(TRCH)%ILAY,'SAVERCH',IU) CALL PMANAGER_SAVEMF2005_MF6TOIDF_ISAVE(PBMAN%ISAVE(TEVT)%ILAY,'SAVEEVT',IU) CALL PMANAGER_SAVEMF2005_MF6TOIDF_ISAVE(PBMAN%ISAVE(TGHB)%ILAY,'SAVEGHB',IU) CALL PMANAGER_SAVEMF2005_MF6TOIDF_ISAVE(PBMAN%ISAVE(TCHD)%ILAY,'SAVECHD',IU) I1=0; DO II=1,SIZE(TFLX) IF(ASSOCIATED(PBMAN%ISAVE(TFLX(II))%ILAY))THEN SELECT CASE (TFLX(II)) CASE (TSTO) CALL PMANAGER_SAVEMF2005_MF6TOIDF_ISAVE(PBMAN%ISAVE(TFLX(II))%ILAY,'SAVESTO',IU) CASE (TSPY) CALL PMANAGER_SAVEMF2005_MF6TOIDF_ISAVE(PBMAN%ISAVE(TFLX(II))%ILAY,'SAVESPY',IU) CASE DEFAULT IF(I1.EQ.0)THEN CALL PMANAGER_SAVEMF2005_MF6TOIDF_ISAVE(PBMAN%ISAVE(TFLX(II))%ILAY,'SAVEFLX',IU); I1=1 ENDIF END SELECT ENDIF ENDDO WRITE(IU,'(/A/)') '"'//TRIM(EXENAME)//'" MF6TOIDF.INI' ENDDO ENDIF !## include conversion of sfr package into isg-file IF(TOPICS(TSFR)%IACT_MODEL.EQ.1)THEN !DEFINED)THEN WRITE(IU,'(/A)') 'ECHO =============================================' WRITE(IU,'( A)') 'ECHO iMOD Batch Script iMOD '//TRIM(RVERSION) WRITE(IU,'( A)') 'ECHO =============================================' WRITE(IU,'(/A)') 'ECHO FUNCTION=SFRTOISG ' WRITE(IU,'(/A)') 'ECHO FUNCTION=SFRTOISG > SFRTOISG.INI' WRITE(IU,'( A)') 'ECHO ISGFILE_IN= "'//TRIM(DIR)//'\MODELINPUT\SFR7\SFR.ISG" >> SFRTOISG.INI' WRITE(IU,'( A)') 'ECHO ISGFILE_OUT="'//TRIM(DIR)//'\BDGSFR\ISG\SFR.ISG" >> SFRTOISG.INI' WRITE(IU,'( A)') 'ECHO SFRFILE_IN= "'//TRIM(DIR)//'\'//TRIM(MNAME)//'_FSFR.TXT" >> SFRTOISG.INI' WRITE(IU,'( A)') WRITE(IU,'( A)') '"'//TRIM(EXENAME)//'" SFRTOISG.INI' WRITE(IU,'( A)') ENDIF ENDIF !## runfile ELSEIF(IMODE.EQ.2)THEN IF(IBATCH.EQ.0)THEN IF(NICORES.GT.1)THEN WRITE(IU,'(A)') ':: Set number of MPI processes' WRITE(IU,'(A)') 'set np='//ITOS(NICORES) WRITE(IU,'(A)') '' WRITE(IU,'(A)') ':: Run model' WRITE(IU,'(A)') '"C:\Program Files\MPICH2\bin\mpiexec.exe" -localonly %np% "'//TRIM(PREFVAL(IPREVAL))//'" '//TRIM(MNAME)//'.run"' ELSE WRITE(IU,'(A)') '"'//TRIM(SEXENAME)//'" '//TRIM(MNAME)//'.RUN' ENDIF ELSE WRITE(IU,'(A)') '"'//TRIM(SEXENAME)//'" '//TRIM(MNAME)//'.RUN' ENDIF ENDIF CLOSE(IU) ENDDO !## get and remember actual iMOD run location + switch to tempral simulation directory CALL IOSDIRNAME(DIRNAME); CALL IOSDIRCHANGE(TRIM(DIR)//'\') !## parralel pest IF(PBMAN%IPESTP.EQ.1)THEN CALL IPEST_GLM_MAIN(TRIM(DIR),MNAME,IBATCH) CALL IPEST_GLM_RESET_PARAMETER() !## iterative ensemble smoother ELSEIF(PBMAN%IIES.EQ.1)THEN CALL IPEST_IES_MAIN(TRIM(DIR),MNAME,IBATCH) ELSE !## start the batch file - run in the foreground IF(IRUNMODE.GT.0)THEN IFLAGS=PROCBLOCKED !## executes on commandtool such that commands alike 'dir' etc. works IFLAGS=IFLAGS+PROCCMDPROC IF(ILOGFILE.EQ.0)THEN CALL IOSCOMMAND('RUN.BAT',IFLAGS,IEXCOD=IEXCOD) ELSE CALL IOSCOMMAND('RUN.BAT > RUN_LOG.TXT',IFLAGS,IEXCOD=IEXCOD) ENDIF !## create output files in case modflow6 is used (aggregate results from different modflow6- models) IF(PBMAN%IFORMAT.EQ.3.AND.PBMAN%IPESTP.EQ.0.AND.TOPICS(TOBS)%IACT_MODEL.EQ.1)THEN CALL IPEST_GLM_CREATE_RESIDUALSFILES(DIR,0,'',IBATCH,MNAME) ENDIF IF(IEXCOD.EQ.0)THEN IF(IBATCH.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Successful simulation using '//TRIM(CSOLVER(PBMAN%IFORMAT))//CHAR(13)// & '- Executable: '//CHAR(13)//TRIM(PREFVAL(IPREVAL))//CHAR(13)// & '- Outputfile: '//CHAR(13)//TRIM(RUNFNAME),'Information') ELSE WRITE(*,'(A)') 'Successfully STARTED the Modflow simulation using:' WRITE(*,'(A)') TRIM(CSOLVER(PBMAN%IFORMAT))//': '//TRIM(PREFVAL(IPREVAL)) WRITE(*,'(A)') 'OUTPUTFILE: '//TRIM(RUNFNAME) ENDIF ELSE IF(IBATCH.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'An error occured in starting your simulation','Error') ELSE WRITE(*,'(A)') 'An error occured in starting your simulation' ENDIF ENDIF !## start the batch file - run in the background ELSEIF(IRUNMODE.LT.0)THEN IFLAGS=0 !## executes on commandtool such that commands alike 'dir' etc. works IFLAGS=IFLAGS+PROCCMDPROC IF(ILOGFILE.EQ.0)THEN CALL IOSCOMMAND('RUN.BAT',IFLAGS,IEXCOD=IEXCOD) ELSE CALL IOSCOMMAND('RUN.BAT > RUN_LOG.TXT',IFLAGS,IEXCOD=IEXCOD) ENDIF IF(IBATCH.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Successfully STARTED the Modflow simulation using:'//CHAR(13)// & 'MODFLOW: '//TRIM(PREFVAL(IPREVAL))//CHAR(13)// & 'RUNFILE/NAMFILE: '//TRIM(RUNFNAME),'Information') ELSE WRITE(*,'(A)') 'Successful simulation using:' WRITE(*,'(A)') 'MODFLOW: '//TRIM(PREFVAL(IPREVAL)) WRITE(*,'(A)') 'RUNFILE/NAMFILE: '//TRIM(RUNFNAME) ENDIF ENDIF ENDIF !## bring the iMOD run location back to he origional directory CALL IOSDIRCHANGE(DIRNAME) END SUBROUTINE PMANAGERSTART !###====================================================================== LOGICAL FUNCTION PMANAGERINI(ICODE,INIFNAME) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ICODE ! Read INI file: ICODE=0, Save INI file: ICODE=1 CHARACTER(LEN=*),INTENT(IN) :: INIFNAME CHARACTER(LEN=256) :: FNAME PMANAGERINI=.FALSE. IF(ICODE.EQ.0)THEN IF(INIFNAME.EQ.'')THEN FNAME='' IF(.NOT.UTL_WSELECTFILE('iMOD INI File (*.ini)|*.ini|', & LOADDIALOG+MUSTEXIST+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,& 'Load iMOD INI File'))RETURN ELSE FNAME=INIFNAME ENDIF !## reading content INI file IF(.NOT.PMANAGER_LOADINI(FNAME))CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD cannot read in the Project File','Error') ELSEIF(ICODE.EQ.1)THEN FNAME=TRIM(PBMAN%OUTPUT)//'\'//TRIM(PBMAN%MODELNAME)//'.INI' CALL PMANAGER_SAVEINI(FNAME) ENDIF END FUNCTION PMANAGERINI !###====================================================================== SUBROUTINE PMANAGER_SAVEINI(INIFNAME) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: INIFNAME INTEGER :: IU,ILAY IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=INIFNAME,STATUS='REPLACE',ACTION='WRITE,DENYREAD',FORM='FORMATTED') WRITE(IU,*) '# INI file writen by iMOD version ...' WRITE(IU,*) 'FUNCTION= RUNFILE' WRITE(IU,*) 'PRJFILE_IN='//TRIM(PBMAN%OUTPUT)//'\'//TRIM(PBMAN%MODELNAME)//'.PRJ' !## get values from tab1 !CALL WDIALOGSELECT(ID_DSIMMANAGER_TAB1) WRITE(IU,*) 'SIM_TYPE= ',PBMAN%IFORMAT WRITE(IU,*) 'OUTPUT_FOLDER= ',TRIM(PBMAN%MODELNAME) WRITE(IU,*) 'FLOW_RESULT_DIR= ',TRIM(PBMAN%FLOW_RESULT_DIR) !## get values from tab2 !CALL WDIALOGSELECT(ID_DSIMMANAGER_TAB2) WRITE(IU,*) 'UNCONFINED= ',(LAYCON(ILAY),ILAY=1,PRJNLAY) !## get values from tab3 !CALL WDIALOGSELECT(ID_DSIMMANAGER_TAB3) !WRITE(IU,*) 'UNCONFINED= ',(LAYCON(ILAY),ILAY=1,PRJNLAY) CLOSE(IU) END SUBROUTINE PMANAGER_SAVEINI !###====================================================================== LOGICAL FUNCTION PMANAGER_LOADINI(INIFNAME) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: INIFNAME INTEGER :: IU PMANAGER_LOADINI=.FALSE. IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=INIFNAME,STATUS='OLD',ACTION='READ,DENYWRITE',FORM='FORMATTED') CLOSE(IU) PMANAGER_LOADINI=.TRUE. END FUNCTION PMANAGER_LOADINI !###====================================================================== SUBROUTINE PMANAGEROPEN_PCG() !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,DID DID=WINFODIALOG(CURRENTDIALOG); CALL WDIALOGLOAD(ID_DPMANAGER_PCG,ID_DPMANAGER_PCG) CALL WDIALOGPUTSTRING(IDOK,'Apply') CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPENIDF) !## fill in values CALL WDIALOGPUTINTEGER(IDF_INTEGER1 ,ABS(PCG%NOUTER)) CALL WDIALOGPUTINTEGER(IDF_INTEGER2 ,PCG%NINNER) CALL WDIALOGPUTDOUBLE(IDF_REAL1,PCG%HCLOSE, '(G10.5)') CALL WDIALOGPUTDOUBLE(IDF_REAL2,PCG%RCLOSE, '(G10.5)') CALL WDIALOGPUTDOUBLE(IDF_REAL3,PCG%RELAX , '(G10.5)') CALL WDIALOGPUTDOUBLE(IDF_REAL4,PCG%QERROR, '(G10.5)') CALL WDIALOGPUTCHECKBOX(IDF_CHECK1,PCG%IQERROR) CALL WDIALOGPUTOPTION(IDF_MENU1,PCG%NPCOND) CALL WDIALOGPUTINTEGER(IDF_INTEGER4 ,PCG%IPRPCG) CALL WDIALOGPUTOPTION(IDF_MENU2,PCG%MUTPCG) CALL WDIALOGPUTDOUBLE(IDF_REAL7,PCG%DAMPPCG ,'(G10.5)') CALL WDIALOGPUTDOUBLE(IDF_REAL8,PCG%DAMPPCGT,'(G10.5)') !## pks settings CALL WDIALOGFIELDSTATE(IDF_MENU3,3) CALL WDIALOGFIELDSTATE(IDF_MENU4,3) CALL WDIALOGFIELDSTATE(IDF_STRING1,3) CALL WDIALOGFIELDSTATE(IDF_CHECK2,3) CALL WDIALOGFIELDSTATE(IDF_LABEL20,3) CALL WDIALOGFIELDSTATE(IDF_LABEL21,3) CALL WDIALOGFIELDSTATE(IDF_LABEL22,3) CALL WDIALOGFIELDSTATE(ID_OPEN,3) !CALL UTL_SYSCOREINFO(NMAXCORES) !ALLOCATE(COPTS(NMAXCORES)) !DO I=1,NMAXCORES ! COPTS(I)=ITOS(I) !ENDDO !CALL WDIALOGPUTMENU(IDF_MENU3,COPTS,NMAXCORES,PCG%NCORES) !DEALLOCATE(COPTS) !PARTOPT=PCG%PARTOPT; IF(PARTOPT.EQ.0)PARTOPT=PCG%PARTOPT+1 !CALL WDIALOGPUTOPTION(IDF_MENU4,PARTOPT) !CALL WDIALOGPUTSTRING(IDF_STRING1,PCG%MRGFNAME) !CALL WDIALOGPUTCHECKBOX(IDF_CHECK2,PCG%IMERGE) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,PCG%IQERROR) CALL WDIALOGFIELDSTATE(IDF_REAL4,PCG%IQERROR) !CALL PMANAGEROPEN_PCGFIELDS() CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_CHECK1) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,PCG%IQERROR) CALL WDIALOGFIELDSTATE(IDF_REAL4,PCG%IQERROR) !CASE (IDF_MENU3,IDF_MENU4) ! CALL PMANAGEROPEN_PCGFIELDS() END SELECT SELECT CASE (MESSAGE%VALUE1) END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDOK,IDCANCEL) EXIT !CASE (ID_OPEN) ! FNAME='' ! IF(UTL_WSELECTFILE('iMOD IDF-File (*.idf)|*.idf|',LOADDIALOG+PROMPTON+DIRCHANGE+MUSTEXIST, & ! FNAME,'Select IDF File (*.idf)'))THEN !CALL WDIALOGSELECT(ID_DPMANAGER_PCG) !CALL WDIALOGPUTSTRING(IDF_STRING1,FNAME) !ENDIF !PCG%MRGFNAME=FNAME CASE (IDHELP) CALL UTL_GETHELP('7.8','TMO.ModSim.SolverSettings') END SELECT END SELECT ENDDO !## read values IF(MESSAGE%VALUE1.EQ.IDOK)THEN CALL WDIALOGGETINTEGER(IDF_INTEGER1,PCG%NOUTER) CALL WDIALOGGETINTEGER(IDF_INTEGER2,PCG%NINNER) CALL WDIALOGGETDOUBLE(IDF_REAL1,PCG%HCLOSE) CALL WDIALOGGETDOUBLE(IDF_REAL2,PCG%RCLOSE) CALL WDIALOGGETDOUBLE(IDF_REAL3,PCG%RELAX) CALL WDIALOGGETDOUBLE(IDF_REAL4,PCG%QERROR) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,PCG%IQERROR) CALL WDIALOGGETMENU(IDF_MENU1,PCG%NPCOND) CALL WDIALOGGETINTEGER(IDF_INTEGER4,PCG%IPRPCG) CALL WDIALOGGETMENU(IDF_MENU2,PCG%MUTPCG) CALL WDIALOGGETDOUBLE(IDF_REAL7,PCG%DAMPPCG) CALL WDIALOGGETDOUBLE(IDF_REAL8,PCG%DAMPPCGT) !CALL WDIALOGGETMENU(IDF_MENU3,PCG%NCORES) !CALL WDIALOGGETMENU(IDF_MENU4,PCG%PARTOPT) !CALL WDIALOGGETCHECKBOX(IDF_CHECK2,PCG%IMERGE) !CALL WDIALOGGETSTRING(IDF_STRING1,PCG%MRGFNAME) ENDIF CALL WDIALOGSELECT(ID_DPMANAGER_PCG) CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(DID) END SUBROUTINE PMANAGEROPEN_PCG !###====================================================================== SUBROUTINE PMANAGEROPEN_GCG() !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,DID,TMP DID=WINFODIALOG(CURRENTDIALOG); CALL WDIALOGLOAD(ID_DPMANAGER_MT3D_GCG,ID_DPMANAGER_MT3D_GCG) CALL WDIALOGSELECT(ID_DPMANAGER_MT3D_GCG) !## fill in gcg settings window CALL WDIALOGPUTINTEGER(IDF_INTEGER1,WQ%GCG%MXITER) CALL WDIALOGPUTINTEGER(IDF_INTEGER2,WQ%GCG%ITER1) CALL WDIALOGPUTDOUBLE(IDF_REAL1,WQ%GCG%CCLOSE,'(E15.3)') CALL WDIALOGPUTOPTION(IDF_MENU1,WQ%GCG%ISOLVE) CALL WDIALOGPUTDOUBLE(IDF_REAL2,WQ%GCG%ACCL,'(E15.3)') CALL WDIALOGPUTINTEGER(IDF_INTEGER3,WQ%GCG%IPRGCG) TMP=WQ%GCG%NCRS+1 ; CALL WDIALOGPUTOPTION(IDF_MENU2,TMP) CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) END SELECT SELECT CASE (MESSAGE%VALUE1) END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDOK,IDCANCEL) EXIT CASE (IDHELP) ! CALL UTL_GETHELP('7.8','TMO.ModSim.SolverSettings') END SELECT END SELECT ENDDO !## get gcg settings screeninput IF(MESSAGE%VALUE1.EQ.IDOK)THEN CALL WDIALOGGETINTEGER(IDF_INTEGER1,WQ%GCG%MXITER) CALL WDIALOGGETINTEGER(IDF_INTEGER2,WQ%GCG%ITER1) CALL WDIALOGGETDOUBLE(IDF_REAL1,WQ%GCG%CCLOSE) CALL WDIALOGGETMENU(IDF_MENU1,WQ%GCG%ISOLVE) CALL WDIALOGGETDOUBLE(IDF_REAL2,WQ%GCG%ACCL) CALL WDIALOGGETINTEGER(IDF_INTEGER3,WQ%GCG%IPRGCG) CALL WDIALOGGETMENU(IDF_MENU2,TMP) ; WQ%GCG%NCRS = TMP-1 ENDIF CALL WDIALOGSELECT(ID_DPMANAGER_MT3D_GCG) CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(DID) END SUBROUTINE PMANAGEROPEN_GCG !###====================================================================== SUBROUTINE PMANAGEROPEN_RCT() !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,DID,TMP DID=WINFODIALOG(CURRENTDIALOG); CALL WDIALOGLOAD(ID_DPMANAGER_MT3D_RCT,ID_DPMANAGER_MT3D_RCT) !## FILLEN RCT settings window TMP = WQ%RCT%ISOTHM+1 ; CALL WDIALOGPUTOPTION(IDF_MENU1,TMP) TMP = WQ%RCT%IREACT+1 ; CALL WDIALOGPUTOPTION(IDF_MENU2,TMP) CALL WDIALOGPUTINTEGER(IDF_INTEGER1,WQ%RCT%IGETSC) CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) END SELECT SELECT CASE (MESSAGE%VALUE1) END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDOK,IDCANCEL) EXIT CASE (IDHELP) ! CALL UTL_GETHELP('7.8','TMO.ModSim.SolverSettings') END SELECT END SELECT ENDDO !## read RCT values IF(MESSAGE%VALUE1.EQ.IDOK)THEN CALL WDIALOGGETMENU(IDF_MENU1,TMP) ; WQ%RCT%ISOTHM=TMP-1 CALL WDIALOGGETMENU(IDF_MENU2,TMP) ; WQ%RCT%IREACT=TMP-1 CALL WDIALOGGETINTEGER(IDF_INTEGER1,WQ%RCT%IGETSC) ENDIF CALL WDIALOGSELECT(ID_DPMANAGER_MT3D_RCT) CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(DID) END SUBROUTINE PMANAGEROPEN_RCT !###====================================================================== SUBROUTINE PMANAGEROPEN_ADV() !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,DID DID=WINFODIALOG(CURRENTDIALOG) CALL WDIALOGLOAD(ID_DPMANAGER_MT3D_ADV,ID_DPMANAGER_MT3D_ADV) CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) END SELECT SELECT CASE (MESSAGE%VALUE1) END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDOK,IDCANCEL) EXIT CASE (IDHELP) ! CALL UTL_GETHELP('7.8','TMO.ModSim.SolverSettings') END SELECT END SELECT ENDDO !## read values IF(MESSAGE%VALUE1.EQ.IDOK)THEN ENDIF CALL WDIALOGSELECT(ID_DPMANAGER_MT3D_ADV) CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(DID) END SUBROUTINE PMANAGEROPEN_ADV !###====================================================================== SUBROUTINE PMANAGEROPEN_VDF() !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,DID DID=WINFODIALOG(CURRENTDIALOG) CALL WDIALOGLOAD(ID_DPMANAGER_MT3D_VDF,ID_DPMANAGER_MT3D_VDF) !## FILLEN VDF settings window CALL WDIALOGPUTDOUBLE(IDF_REAL1,WQ%VDF%DENSEMIN) CALL WDIALOGPUTDOUBLE(IDF_REAL2,WQ%VDF%DENSEMAX) CALL WDIALOGPUTDOUBLE(IDF_REAL3,WQ%VDF%DENSEREF) CALL WDIALOGPUTDOUBLE(IDF_REAL4,WQ%VDF%DENSESLP) CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) END SELECT SELECT CASE (MESSAGE%VALUE1) END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDOK,IDCANCEL) EXIT CASE (IDHELP) ! CALL UTL_GETHELP('7.8','TMO.ModSim.SolverSettings') END SELECT END SELECT ENDDO !## read values IF(MESSAGE%VALUE1.EQ.IDOK)THEN CALL WDIALOGGETDOUBLE(IDF_REAL1,WQ%VDF%DENSEMIN) CALL WDIALOGGETDOUBLE(IDF_REAL2,WQ%VDF%DENSEMAX) CALL WDIALOGGETDOUBLE(IDF_REAL3,WQ%VDF%DENSEREF) CALL WDIALOGGETDOUBLE(IDF_REAL4,WQ%VDF%DENSESLP) ENDIF CALL WDIALOGSELECT(ID_DPMANAGER_MT3D_VDF) CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(DID) END SUBROUTINE PMANAGEROPEN_VDF !###====================================================================== SUBROUTINE PMANAGEROPEN_PCGFIELDS() !###====================================================================== IMPLICIT NONE CALL WDIALOGSELECT(ID_DPMANAGER_PCG) !## get amount of cores to be used in modelsimulation, selected by user !CALL WDIALOGGETMENU(IDF_MENU3,PCG%NCORES) !J=0; IF(PCG%NCORES.NE.1)J=1 !IF(J.EQ.1)THEN !!## enable partitioning option + subdomain merge option ! CALL WDIALOGFIELDSTATE(IDF_LABEL21,J) ! CALL WDIALOGFIELDSTATE(IDF_MENU4,J) ! CALL WDIALOGGETMENU(IDF_MENU4,I) ! K=0; IF(I.EQ.3)K=1 ! CALL WDIALOGFIELDSTATE(IDF_STRING1,K) ! CALL WDIALOGFIELDSTATE(ID_OPEN,K) ! CALL WDIALOGFIELDSTATE(IDF_LABEL22,K) ! K=0; IF(I.NE.1)K=1 ! CALL WDIALOGFIELDSTATE(IDF_CHECK2,K) ! CALL WDIALOGGETSTRING(IDF_STRING1,PCG%MRGFNAME) !ELSE !!## amount of selected cores is equal to 1; !!## parallel simulation is not possible --> all options disabled ! CALL WDIALOGFIELDSTATE(IDF_LABEL21,J) ! CALL WDIALOGFIELDSTATE(IDF_MENU4,J) ! CALL WDIALOGPUTOPTION(IDF_MENU4,J+1) ! CALL WDIALOGFIELDSTATE(IDF_STRING1,J) ! CALL WDIALOGFIELDSTATE(ID_OPEN,J) ! CALL WDIALOGFIELDSTATE(IDF_LABEL22,J) ! CALL WDIALOGFIELDSTATE(IDF_CHECK2,J) !ENDIF CALL WDIALOGSELECT(ID_DPMANAGER_PCG) END SUBROUTINE PMANAGEROPEN_PCGFIELDS !###====================================================================== SUBROUTINE PMANAGEROPEN_PEST() !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,DID,N DID=WINFODIALOG(CURRENTDIALOG) CALL WDIALOGLOAD(ID_DPMANAGER_PEST,ID_DPMANAGER_PEST) CALL WDIALOGPUTSTRING(IDOK,'Apply System Settings') !## fill in values CALL WDIALOGPUTCHECKBOX(IDF_CHECK2,PEST%IPESTP) CALL WDIALOGPUTCHECKBOX(IDF_CHECK3,PEST%CMDHIDE) PEST%NCPU=MAX(1,PEST%NCPU); CALL WDIALOGPUTINTEGER(IDF_INTEGER13,PEST%NCPU) PEST%NLAMBDASEARCH=MAX(1,PEST%NLAMBDASEARCH); CALL WDIALOGPUTINTEGER(IDF_INTEGER14,PEST%NLAMBDASEARCH) CALL PMANAGEROPEN_PEST_FIELDS() CALL WDIALOGPUTINTEGER(IDF_INTEGER7,PEST%PE_MXITER) CALL WDIALOGPUTDOUBLE(IDF_REAL4,PEST%PE_STOP,'(F15.3)') CALL WDIALOGPUTDOUBLE(IDF_REAL8,PEST%PE_PADJ ,'(F15.3)') CALL WDIALOGPUTDOUBLE(IDF_REAL5,PEST%PE_SENS,'(F15.3)') CALL WDIALOGPUTDOUBLE(IDF_REAL9,PEST%PE_DRES,'(F15.3)') CALL WDIALOGPUTDOUBLE(IDF_REAL6,PEST%PE_TARGET(1),'(F15.3)') CALL WDIALOGPUTDOUBLE(IDF_REAL7,PEST%PE_TARGET(2),'(F15.3)') CALL WDIALOGPUTCHECKBOX(IDF_CHECK1,PEST%PE_REGULARISATION) CALL WDIALOGPUTOPTION(IDF_MENU4,PEST%PE_SCALING+1) CALL WDIALOGPUTOPTION(IDF_MENU5,PEST%PE_KTYPE) N=0; IF(ASSOCIATED(PEST%S_PERIOD))N=SIZE(PEST%S_PERIOD) CALL WDIALOGPUTINTEGER(IDF_INTEGER8 ,N) CALL WDIALOGFIELDSTATE(IDF_INTEGER8,2) N=0; IF(ASSOCIATED(PEST%B_FRACTION))N=SIZE(PEST%B_FRACTION) CALL WDIALOGPUTINTEGER(IDF_INTEGER9 ,N) CALL WDIALOGFIELDSTATE(IDF_INTEGER9,2) N=0; IF(ASSOCIATED(PEST%PARAM))N=SIZE(PEST%PARAM) CALL WDIALOGPUTINTEGER(IDF_INTEGER10,N) CALL WDIALOGFIELDSTATE(IDF_INTEGER10,2) N=0; IF(ASSOCIATED(PEST%IDFFILES))N=SIZE(PEST%IDFFILES) CALL WDIALOGPUTINTEGER(IDF_INTEGER11,N) CALL WDIALOGFIELDSTATE(IDF_INTEGER11,2) N=0; IF(ASSOCIATED(PEST%MEASURES))N=SIZE(PEST%MEASURES) CALL WDIALOGPUTINTEGER(IDF_INTEGER12,N) CALL WDIALOGFIELDSTATE(IDF_INTEGER12,2) CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_CHECK2) CALL PMANAGEROPEN_PEST_FIELDS() END SELECT SELECT CASE (MESSAGE%VALUE1) END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_PERIODS) CALL WDIALOGGETINTEGER(IDF_INTEGER8,N) CALL PMANAGEROPEN_PESTPARAM(ID_PERIODS,N) CALL WDIALOGPUTINTEGER(IDF_INTEGER8,N) CASE (ID_BATCHFILES) CALL WDIALOGGETINTEGER(IDF_INTEGER9,N) CALL PMANAGEROPEN_PESTPARAM(ID_BATCHFILES,N) CALL WDIALOGPUTINTEGER(IDF_INTEGER9,N) CASE (ID_PARAMETERS) CALL WDIALOGGETINTEGER(IDF_INTEGER10,N) CALL PMANAGEROPEN_PESTPARAM(ID_PARAMETERS,N) CALL WDIALOGPUTINTEGER(IDF_INTEGER10,N) CASE (ID_ZONES) CALL WDIALOGGETINTEGER(IDF_INTEGER11,N) CALL PMANAGEROPEN_PESTPARAM(ID_ZONES,N) CALL WDIALOGPUTINTEGER(IDF_INTEGER11,N) CASE (ID_MEASURES) CALL WDIALOGGETINTEGER(IDF_INTEGER12,N) CALL PMANAGEROPEN_PESTPARAM(ID_MEASURES,N) CALL WDIALOGPUTINTEGER(IDF_INTEGER12,N) CASE (IDOK,IDCANCEL) EXIT END SELECT END SELECT ENDDO !## read values IF(MESSAGE%VALUE1.EQ.IDOK)THEN CALL WDIALOGGETCHECKBOX(IDF_CHECK2,PEST%IPESTP) CALL WDIALOGGETCHECKBOX(IDF_CHECK3,PEST%CMDHIDE) CALL WDIALOGGETINTEGER(IDF_INTEGER13,PEST%NCPU) CALL WDIALOGGETINTEGER(IDF_INTEGER14,PEST%NLAMBDASEARCH) CALL WDIALOGGETINTEGER(IDF_INTEGER7 ,PEST%PE_MXITER) CALL WDIALOGGETDOUBLE(IDF_REAL4,PEST%PE_STOP) CALL WDIALOGGETDOUBLE(IDF_REAL8,PEST%PE_PADJ) CALL WDIALOGGETDOUBLE(IDF_REAL5,PEST%PE_SENS) CALL WDIALOGGETDOUBLE(IDF_REAL9,PEST%PE_DRES) CALL WDIALOGGETDOUBLE(IDF_REAL6,PEST%PE_TARGET(1)) CALL WDIALOGGETDOUBLE(IDF_REAL7,PEST%PE_TARGET(2)) CALL WDIALOGGETMENU(IDF_MENU4,PEST%PE_SCALING) CALL WDIALOGGETMENU(IDF_MENU5,PEST%PE_KTYPE) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,PEST%PE_REGULARISATION) ENDIF CALL WDIALOGSELECT(ID_DPMANAGER_PEST) CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(DID) END SUBROUTINE PMANAGEROPEN_PEST !###====================================================================== SUBROUTINE PMANAGEROPEN_PEST_FIELDS() !###====================================================================== IMPLICIT NONE INTEGER :: I CALL WDIALOGGETCHECKBOX(IDF_CHECK2,I) CALL WDIALOGFIELDSTATE(IDF_CHECK3,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER13,I) CALL WDIALOGFIELDSTATE(IDF_LABEL21,I) CALL WDIALOGFIELDSTATE(IDF_LABEL22,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER14,I) END SUBROUTINE PMANAGEROPEN_PEST_FIELDS !###====================================================================== SUBROUTINE PMANAGEROPEN_PESTPARAM(ID,N) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID INTEGER,INTENT(INOUT) :: N TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,DID,I,M DID=WINFODIALOG(CURRENTDIALOG) CALL WDIALOGLOAD(ID_DPMANAGER_PESTFILES,ID_DPMANAGER_PESTFILES) SELECT CASE (ID) CASE (ID_PERIODS) CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES) CALL WDIALOGSETTAB(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB1) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB2,0) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB3,0) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB4,0) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB5,0) CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES_TAB1) CALL WDIALOGPUTINTEGER(IDF_INTEGER8,N) IF(N.GT.0)THEN CALL WGRIDROWS(IDF_GRID1,N) CALL WGRIDPUTSTRING(IDF_GRID1,1,PEST%S_PERIOD,N) CALL WGRIDPUTSTRING(IDF_GRID1,2,PEST%E_PERIOD,N) ELSE CALL WDIALOGFIELDSTATE(IDF_GRID1,3) ENDIF CASE (ID_BATCHFILES) CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES) CALL WDIALOGSETTAB(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB2) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB1,0) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB3,0) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB4,0) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB5,0) CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES_TAB2) CALL WDIALOGPUTINTEGER(IDF_INTEGER9,N) IF(N.GT.0)THEN CALL WGRIDROWS(IDF_GRID1,N) CALL WGRIDPUTDOUBLE(IDF_GRID1,1,PEST%B_FRACTION,N) CALL WGRIDPUTSTRING(IDF_GRID1,2,PEST%B_BATCHFILE,N) CALL WGRIDPUTSTRING(IDF_GRID1,3,PEST%B_OUTFILE,N) ELSE CALL WDIALOGFIELDSTATE(IDF_GRID1,3) ENDIF CASE (ID_PARAMETERS) CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES) CALL WDIALOGSETTAB(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB3) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB1,0) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB2,0) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB4,0) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB5,0) CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES_TAB3) CALL WDIALOGPUTINTEGER(IDF_INTEGER10,N) IF(N.GT.0)THEN CALL WGRIDROWS(IDF_GRID1,N) CALL WGRIDPUTCHECKBOX(IDF_GRID1,1 ,PEST%PARAM%PACT,N) CALL WGRIDPUTMENU(IDF_GRID1 ,2 ,PARAM,SIZE(PARAM),PEST%PARAM%IPARAM,N) CALL WGRIDPUTINTEGER(IDF_GRID1 ,3 ,PEST%PARAM%PILS,N) CALL WGRIDPUTINTEGER(IDF_GRID1 ,4 ,PEST%PARAM%PIZONE,N) CALL WGRIDPUTINTEGER(IDF_GRID1 ,5 ,PEST%PARAM%PIGROUP,N) CALL WGRIDPUTDOUBLE(IDF_GRID1 ,6 ,PEST%PARAM%PINI,N) CALL WGRIDPUTDOUBLE(IDF_GRID1 ,7 ,PEST%PARAM%PMIN,N) CALL WGRIDPUTDOUBLE(IDF_GRID1 ,8 ,PEST%PARAM%PMAX,N) CALL WGRIDPUTDOUBLE(IDF_GRID1 ,9 ,PEST%PARAM%PDELTA,N) CALL WGRIDPUTDOUBLE(IDF_GRID1 ,10,PEST%PARAM%PINCREASE,N) CALL WGRIDPUTCHECKBOX(IDF_GRID1,11,PEST%PARAM%PLOG,N) CALL WGRIDPUTSTRING(IDF_GRID1 ,12,PEST%PARAM%ACRONYM,N) CALL WGRIDPUTDOUBLE(IDF_GRID1 ,13,PEST%PARAM%PPRIOR,N) ELSE CALL WDIALOGFIELDSTATE(IDF_GRID1,3) ENDIF CASE (ID_ZONES) CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES) CALL WDIALOGSETTAB(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB4) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB1,0) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB2,0) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB3,0) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB5,0) CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES_TAB4) CALL WDIALOGPUTINTEGER(IDF_INTEGER11,N) IF(N.GT.0)THEN CALL WGRIDROWS(IDF_GRID1,N) CALL WGRIDPUTSTRING(IDF_GRID1,1,PEST%IDFFILES,N) ELSE CALL WDIALOGFIELDSTATE(IDF_GRID1,3) ENDIF CASE (ID_MEASURES) CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES) CALL WDIALOGSETTAB(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB5) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB1,0) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB2,0) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB3,0) CALL WDIALOGTABSTATE(IDF_TAB1,ID_DPMANAGER_PESTFILES_TAB4,0) CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES_TAB5) CALL WDIALOGPUTINTEGER(IDF_INTEGER12,N) IF(N.GT.0)THEN CALL WGRIDROWS(IDF_GRID1,N) CALL WGRIDPUTSTRING (IDF_GRID1,1,PEST%MEASURES%IPFNAME,N) PEST%MEASURES%IPFTYPE=PEST%MEASURES%IPFTYPE-1 CALL WGRIDPUTCHECKBOX(IDF_GRID1,2,PEST%MEASURES%IPFTYPE,N) CALL WGRIDPUTINTEGER (IDF_GRID1,3,PEST%MEASURES%IXCOL,N) CALL WGRIDPUTINTEGER (IDF_GRID1,4,PEST%MEASURES%IYCOL,N) CALL WGRIDPUTINTEGER (IDF_GRID1,5,PEST%MEASURES%ILCOL,N) CALL WGRIDPUTINTEGER (IDF_GRID1,6,PEST%MEASURES%IMCOL,N) CALL WGRIDPUTINTEGER (IDF_GRID1,7,PEST%MEASURES%IVCOL,N) ELSE CALL WDIALOGFIELDSTATE(IDF_GRID1,3) ENDIF END SELECT CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES) CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) END SELECT SELECT CASE (MESSAGE%VALUE1) END SELECT CASE(PUSHBUTTON) CALL WDIALOGSELECT(MESSAGE%WIN) SELECT CASE (MESSAGE%VALUE1) CASE (ID_PERIODS) CALL WDIALOGGETINTEGER(IDF_INTEGER8,N) IF(N.EQ.0)THEN CALL WDIALOGCLEARFIELD(IDF_GRID1) IF(ASSOCIATED(PEST%S_PERIOD))DEALLOCATE(PEST%S_PERIOD,PEST%E_PERIOD) CALL WDIALOGFIELDSTATE(IDF_GRID1,3) ELSE M=WINFOGRID(IDF_GRID1,GRIDROWSMAX) IF(N.GT.M)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You can specify a maximum of '//TRIM(ITOS(M))//' Periods','Error'); N=M ENDIF !## resize variables IF(ASSOCIATED(PEST%S_PERIOD))THEN M=SIZE(PEST%S_PERIOD) IF(N.NE.M)THEN ALLOCATE(PEST%S_PERIOD_BU(N),PEST%E_PERIOD_BU(N)); PEST%S_PERIOD_BU='20150101000000'; PEST%E_PERIOD_BU='20151231000000' DO I=1,MIN(N,M); PEST%S_PERIOD_BU(I)=PEST%S_PERIOD(I); ENDDO DO I=1,MIN(N,M); PEST%E_PERIOD_BU(I)=PEST%E_PERIOD(I); ENDDO DEALLOCATE(PEST%S_PERIOD,PEST%E_PERIOD); PEST%S_PERIOD=>PEST%S_PERIOD_BU; PEST%E_PERIOD=>PEST%E_PERIOD_BU ENDIF ELSE ALLOCATE(PEST%S_PERIOD(N),PEST%E_PERIOD(N)); PEST%S_PERIOD='20150101000000'; PEST%E_PERIOD='20151231000000' ENDIF CALL WDIALOGFIELDSTATE(IDF_GRID1,1) CALL WGRIDROWS(IDF_GRID1,N) CALL WGRIDPUTSTRING(IDF_GRID1,1,PEST%S_PERIOD,N) CALL WGRIDPUTSTRING(IDF_GRID1,2,PEST%E_PERIOD,N) ENDIF CASE (ID_BATCHFILES) CALL WDIALOGGETINTEGER(IDF_INTEGER9,N) IF(N.EQ.0)THEN CALL WDIALOGCLEARFIELD(IDF_GRID1) IF(ASSOCIATED(PEST%B_FRACTION))DEALLOCATE(PEST%B_FRACTION,PEST%B_BATCHFILE,PEST%B_OUTFILE) CALL WDIALOGFIELDSTATE(IDF_GRID1,3) ELSE M=WINFOGRID(IDF_GRID1,GRIDROWSMAX) IF(N.GT.M)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You can specify a maximum of '//TRIM(ITOS(M))//' Batchfiles','Error'); N=M ENDIF !## resize variables IF(ASSOCIATED(PEST%B_FRACTION))THEN M=SIZE(PEST%B_FRACTION) IF(N.NE.M)THEN ALLOCATE(PEST%B_FRACTION_BU(N),PEST%B_BATCHFILE_BU(N),PEST%B_OUTFILE_BU(N)) PEST%B_FRACTION_BU=1.0D0; PEST%B_BATCHFILE_BU=''; PEST%B_OUTFILE_BU='' DO I=1,MIN(N,M); PEST%B_FRACTION_BU(I) =PEST%B_FRACTION(I); ENDDO DO I=1,MIN(N,M); PEST%B_BATCHFILE_BU(I)=PEST%B_BATCHFILE(I); ENDDO DO I=1,MIN(N,M); PEST%B_OUTFILE_BU(I) =PEST%B_OUTFILE(I); ENDDO DEALLOCATE(PEST%B_FRACTION,PEST%B_BATCHFILE,PEST%B_OUTFILE) PEST%B_FRACTION=>PEST%B_FRACTION_BU; PEST%B_BATCHFILE=>PEST%B_BATCHFILE_BU; PEST%B_OUTFILE=>PEST%B_OUTFILE_BU ENDIF ELSE ALLOCATE(PEST%B_FRACTION(N),PEST%B_BATCHFILE(N),PEST%B_OUTFILE(N)); PEST%B_FRACTION=1.0D0; PEST%B_BATCHFILE=''; PEST%B_OUTFILE='' ENDIF CALL WDIALOGFIELDSTATE(IDF_GRID1,1) CALL WGRIDROWS(IDF_GRID1,N) CALL WGRIDPUTDOUBLE(IDF_GRID1,1,PEST%B_FRACTION,N) CALL WGRIDPUTSTRING(IDF_GRID1,2,PEST%B_BATCHFILE,N) CALL WGRIDPUTSTRING(IDF_GRID1,3,PEST%B_OUTFILE,N) ENDIF CASE (ID_PARAMETERS) CALL WDIALOGGETINTEGER(IDF_INTEGER10,N) IF(N.EQ.0)THEN CALL WDIALOGCLEARFIELD(IDF_GRID1) IF(ASSOCIATED(PEST%PARAM))DEALLOCATE(PEST%PARAM) CALL WDIALOGFIELDSTATE(IDF_GRID1,3) ELSE M=WINFOGRID(IDF_GRID1,GRIDROWSMAX) IF(N.GT.M)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You can specify a maximum of '//TRIM(ITOS(M))//' Parameters','Error'); N=M ENDIF !## resize variables IF(ASSOCIATED(PEST%PARAM))THEN M=SIZE(PEST%PARAM) IF(N.NE.M)THEN ALLOCATE(PEST%PARAM_BU(N)); DO I=1,N; PEST%PARAM_BU(I)%PIGROUP=I; PEST%PARAM_BU(I)%PIZONE=I; ENDDO DO I=1,MIN(N,M); PEST%PARAM_BU(I) =PEST%PARAM(I); ENDDO DEALLOCATE(PEST%PARAM) PEST%PARAM=>PEST%PARAM_BU ENDIF ELSE ALLOCATE(PEST%PARAM(N)); DO I=1,N; PEST%PARAM(I)%PIGROUP=I; PEST%PARAM(I)%PIZONE=I; PEST%PARAM(I)%ACRONYM=''; ENDDO ENDIF CALL WDIALOGFIELDSTATE(IDF_GRID1,1) CALL WGRIDROWS(IDF_GRID1,N) CALL WGRIDPUTCHECKBOX(IDF_GRID1,1 ,PEST%PARAM%PACT,N) CALL WGRIDPUTMENU(IDF_GRID1 ,2 ,PARAM,SIZE(PARAM),PEST%PARAM%IPARAM,N) CALL WGRIDPUTINTEGER(IDF_GRID1 ,3 ,PEST%PARAM%PILS,N) CALL WGRIDPUTINTEGER(IDF_GRID1 ,4 ,PEST%PARAM%PIZONE,N) CALL WGRIDPUTINTEGER(IDF_GRID1 ,5 ,PEST%PARAM%PIGROUP,N) CALL WGRIDPUTDOUBLE(IDF_GRID1 ,6 ,PEST%PARAM%PINI,N) CALL WGRIDPUTDOUBLE(IDF_GRID1 ,7 ,PEST%PARAM%PMIN,N) CALL WGRIDPUTDOUBLE(IDF_GRID1 ,8 ,PEST%PARAM%PMAX,N) CALL WGRIDPUTDOUBLE(IDF_GRID1 ,9 ,PEST%PARAM%PDELTA,N) CALL WGRIDPUTDOUBLE(IDF_GRID1 ,10,PEST%PARAM%PINCREASE,N) CALL WGRIDPUTCHECKBOX(IDF_GRID1,11,PEST%PARAM%PLOG,N) CALL WGRIDPUTSTRING(IDF_GRID1 ,12,PEST%PARAM%ACRONYM,N) CALL WGRIDPUTDOUBLE(IDF_GRID1 ,13,PEST%PARAM%PPRIOR,N) ENDIF CASE (ID_ZONES) CALL WDIALOGGETINTEGER(IDF_INTEGER11,N) IF(N.EQ.0)THEN CALL WDIALOGCLEARFIELD(IDF_GRID1) IF(ASSOCIATED(PEST%IDFFILES))DEALLOCATE(PEST%IDFFILES) CALL WDIALOGFIELDSTATE(IDF_GRID1,3) ELSE M=WINFOGRID(IDF_GRID1,GRIDROWSMAX) IF(N.GT.M)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You can specify a maximum of '//TRIM(ITOS(M))//' Zones','Error'); N=M ENDIF !## resize variables IF(ASSOCIATED(PEST%IDFFILES))THEN M=SIZE(PEST%IDFFILES) IF(N.NE.M)THEN ALLOCATE(PEST%IDFFILES_BU(N)) PEST%IDFFILES_BU='' DO I=1,MIN(N,M); PEST%IDFFILES_BU(I) =PEST%IDFFILES(I); ENDDO DEALLOCATE(PEST%IDFFILES) PEST%IDFFILES=>PEST%IDFFILES_BU ENDIF ELSE ALLOCATE(PEST%IDFFILES(N)); PEST%IDFFILES='' ENDIF CALL WDIALOGFIELDSTATE(IDF_GRID1,1) CALL WGRIDROWS(IDF_GRID1,N) CALL WGRIDPUTSTRING(IDF_GRID1,1,PEST%IDFFILES,N) ENDIF CASE (ID_MEASURES) CALL WDIALOGGETINTEGER(IDF_INTEGER12,N) IF(N.EQ.0)THEN CALL WDIALOGCLEARFIELD(IDF_GRID1) IF(ASSOCIATED(PEST%MEASURES))DEALLOCATE(PEST%MEASURES) CALL WDIALOGFIELDSTATE(IDF_GRID1,3) ELSE M=WINFOGRID(IDF_GRID1,GRIDROWSMAX) IF(N.GT.M)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You can specify a maximum of '//TRIM(ITOS(M))//' Measurement','Error'); N=M ENDIF !## resize variables IF(ASSOCIATED(PEST%MEASURES))THEN M=SIZE(PEST%MEASURES) IF(N.NE.M)THEN ALLOCATE(PEST%MEASURES_BU(N)); PEST%MEASURES_BU%IPFNAME=''; PEST%MEASURES_BU%IXCOL=1; PEST%MEASURES_BU%IYCOL=2; PEST%MEASURES_BU%ILCOL=3 PEST%MEASURES_BU%IMCOL=4; PEST%MEASURES_BU%IVCOL=-5; PEST%MEASURES_BU%IDCOL=0; PEST%MEASURES_BU%IPFTYPE=0 DO I=1,MIN(N,M); PEST%MEASURES_BU(I)=PEST%MEASURES(I); ENDDO DEALLOCATE(PEST%MEASURES); PEST%MEASURES=>PEST%MEASURES_BU ENDIF ELSE ALLOCATE(PEST%MEASURES(N)); PEST%MEASURES%IPFNAME=''; PEST%MEASURES%IXCOL=1; PEST%MEASURES%IYCOL=2; PEST%MEASURES%ILCOL=3 PEST%MEASURES%IMCOL=4; PEST%MEASURES%IVCOL=-5; PEST%MEASURES%IDCOL=0; PEST%MEASURES%IPFTYPE=0 ENDIF CALL WDIALOGFIELDSTATE(IDF_GRID1,1) CALL WGRIDROWS(IDF_GRID1,N) CALL WGRIDPUTSTRING (IDF_GRID1,1,PEST%MEASURES%IPFNAME,N) CALL WGRIDPUTCHECKBOX(IDF_GRID1,2,PEST%MEASURES%IPFTYPE,N) CALL WGRIDPUTINTEGER (IDF_GRID1,3,PEST%MEASURES%IXCOL,N) CALL WGRIDPUTINTEGER (IDF_GRID1,4,PEST%MEASURES%IYCOL,N) CALL WGRIDPUTINTEGER (IDF_GRID1,5,PEST%MEASURES%ILCOL,N) CALL WGRIDPUTINTEGER (IDF_GRID1,6,PEST%MEASURES%IMCOL,N) CALL WGRIDPUTINTEGER (IDF_GRID1,7,PEST%MEASURES%IVCOL,N) ! CALL WGRIDPUTINTEGER (IDF_GRID1,7,PEST%MEASURES%IDCOL,N) ENDIF CASE (IDOK,IDCANCEL) IF(PMANAGEROPEN_PESTPARAM_GETVALUES(ID))THEN EXIT ELSE CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Empty fields are not allowed or invalid entries.','Error') ENDIF END SELECT END SELECT ENDDO CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES) CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(DID) END SUBROUTINE PMANAGEROPEN_PESTPARAM !###====================================================================== LOGICAL FUNCTION PMANAGEROPEN_PESTPARAM_GETVALUES(ID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID INTEGER :: N,I PMANAGEROPEN_PESTPARAM_GETVALUES=.FALSE. SELECT CASE (ID) CASE (ID_PERIODS) CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES_TAB1) IF(ASSOCIATED(PEST%S_PERIOD))THEN N=SIZE(PEST%S_PERIOD) CALL WGRIDGETSTRING(IDF_GRID1,1,PEST%S_PERIOD,N) CALL WGRIDGETSTRING(IDF_GRID1,2,PEST%E_PERIOD,N) DO I=1,N IF(LEN_TRIM(PEST%S_PERIOD(I)).EQ.'')RETURN IF(LEN_TRIM(PEST%E_PERIOD(I)).EQ.'')RETURN ENDDO ENDIF CASE (ID_BATCHFILES) CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES_TAB2) IF(ASSOCIATED(PEST%B_FRACTION))THEN N=SIZE(PEST%B_FRACTION) CALL WGRIDGETDOUBLE(IDF_GRID1,1,PEST%B_FRACTION,N) CALL WGRIDGETSTRING(IDF_GRID1,2,PEST%B_BATCHFILE,N) CALL WGRIDGETSTRING(IDF_GRID1,3,PEST%B_OUTFILE,N) DO I=1,N IF(PEST%B_FRACTION(I).LT.0.0D0)RETURN IF(LEN_TRIM(PEST%B_BATCHFILE(I)).EQ.'')RETURN IF(LEN_TRIM(PEST%B_OUTFILE(I)).EQ.'')RETURN ENDDO ENDIF CASE (ID_PARAMETERS) CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES_TAB3) IF(ASSOCIATED(PEST%PARAM))THEN N=SIZE(PEST%PARAM) CALL WGRIDGETCHECKBOX(IDF_GRID1,1 ,PEST%PARAM%PACT,N) CALL WGRIDGETMENU(IDF_GRID1 ,2 ,PEST%PARAM%IPARAM,N) CALL WGRIDGETINTEGER(IDF_GRID1 ,3 ,PEST%PARAM%PILS,N) CALL WGRIDGETINTEGER(IDF_GRID1 ,4 ,PEST%PARAM%PIZONE,N) CALL WGRIDGETINTEGER(IDF_GRID1 ,5 ,PEST%PARAM%PIGROUP,N) CALL WGRIDGETDOUBLE(IDF_GRID1 ,6 ,PEST%PARAM%PINI,N) CALL WGRIDGETDOUBLE(IDF_GRID1 ,7 ,PEST%PARAM%PMIN,N) CALL WGRIDGETDOUBLE(IDF_GRID1 ,8 ,PEST%PARAM%PMAX,N) CALL WGRIDGETDOUBLE(IDF_GRID1 ,9 ,PEST%PARAM%PDELTA,N) CALL WGRIDGETDOUBLE(IDF_GRID1 ,10,PEST%PARAM%PINCREASE,N) CALL WGRIDGETCHECKBOX(IDF_GRID1,11,PEST%PARAM%PLOG,N) CALL WGRIDGETSTRING(IDF_GRID1 ,12,PEST%PARAM%ACRONYM,N) CALL WGRIDGETDOUBLE(IDF_GRID1 ,13,PEST%PARAM%PPRIOR,N) DO I=1,SIZE(PEST%PARAM); PEST%PARAM(I)%PPARAM=PARAM(PEST%PARAM(I)%IPARAM); ENDDO DO I=1,N IF(PEST%PARAM(I)%PINI.LT.0.0D0)RETURN IF(PEST%PARAM(I)%PMIN.LT.0.0D0)RETURN IF(PEST%PARAM(I)%PMAX.LT.0.0D0)RETURN IF(PEST%PARAM(I)%PDELTA.LT.0.0D0)RETURN IF(PEST%PARAM(I)%PINCREASE.LT.0.0D0)RETURN ENDDO ENDIF CASE (ID_ZONES) CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES_TAB4) CALL WDIALOGGETINTEGER(IDF_INTEGER11,N) IF(N.GT.0)CALL WGRIDGETSTRING(IDF_GRID1,1,PEST%IDFFILES,N) DO I=1,N IF(LEN_TRIM(PEST%IDFFILES(I)).EQ.'')RETURN ENDDO CASE (ID_MEASURES) CALL WDIALOGSELECT(ID_DPMANAGER_PESTFILES_TAB5) IF(ASSOCIATED(PEST%MEASURES))THEN N=SIZE(PEST%MEASURES) CALL WGRIDGETSTRING (IDF_GRID1,1,PEST%MEASURES%IPFNAME,N) CALL WGRIDGETCHECKBOX(IDF_GRID1,2,PEST%MEASURES%IPFTYPE,N) PEST%MEASURES%IPFTYPE=PEST%MEASURES%IPFTYPE+1 CALL WGRIDGETINTEGER (IDF_GRID1,3,PEST%MEASURES%IXCOL,N) CALL WGRIDGETINTEGER (IDF_GRID1,4,PEST%MEASURES%IYCOL,N) CALL WGRIDGETINTEGER (IDF_GRID1,5,PEST%MEASURES%ILCOL,N) CALL WGRIDGETINTEGER (IDF_GRID1,6,PEST%MEASURES%IMCOL,N) CALL WGRIDGETINTEGER (IDF_GRID1,7,PEST%MEASURES%IVCOL,N) ! CALL WGRIDGETINTEGER (IDF_GRID1,7,PEST%MEASURES%IDCOL,N) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,PEST%IIPF) DO I=1,N IF(LEN_TRIM(PEST%MEASURES(I)%IPFNAME).EQ.'')RETURN ENDDO ENDIF END SELECT PMANAGEROPEN_PESTPARAM_GETVALUES=.TRUE. END FUNCTION PMANAGEROPEN_PESTPARAM_GETVALUES !###====================================================================== SUBROUTINE PMANAGERDEFINEPERIODS() !###====================================================================== IMPLICIT NONE INTEGER :: ITYPE,I,IOPTION TYPE(WIN_MESSAGE) :: MESSAGE CALL WDIALOGLOAD(ID_DPMANAGERDATES,ID_DPMANAGERDATES) CALL WDIALOGPUTIMAGE(ID_NEW,ID_ICONNEW,1) CALL WDIALOGPUTIMAGE(ID_DELETE,ID_ICONDELETE,1) CALL WDIALOGPUTIMAGE(ID_RENAME,ID_ICONRENAME,1) !## enter artificial year to be able to use generic routine CALL WDIALOGPUTINTEGER(IDF_INTEGER3,2000) IF(.NOT.PMANAGERDEFINEPERIODS_INIT())THEN CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(ID_DPMANAGEROPEN) RETURN ENDIF !## display dialog CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) !## current field SELECT CASE (MESSAGE%VALUE2) CASE (IDF_MENU3) IF(MESSAGE%VALUE1.EQ.MESSAGE%VALUE2)CALL PMANAGERDEFINEPERIODS_PUT() CASE (IDF_MENU1) CALL UTL_FILLDATES(IDF_INTEGER3,IDF_MENU1,IDF_INTEGER1) END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_DELETE) CALL WDIALOGGETMENU(IDF_MENU3,IOPTION) CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to delete selected'//CHAR(13)// & 'period: ['//TRIM(PERIOD(IOPTION)%NAME)//']','Question') IF(WINFODIALOG(4).EQ.1)THEN DO I=IOPTION,SIZE(PERIOD)-1; PERIOD(I)=PERIOD(I+1); ENDDO; NPERIOD=MAX(NPERIOD-1,0) ENDIF IF(.NOT.PMANAGERDEFINEPERIODS_INIT())EXIT CASE (ID_NEW) CALL WDIALOGSELECT(ID_DPMANAGERDATES); CALL WDIALOGGETMENU(IDF_MENU3,IOPTION) CALL PMANAGERDEFINEPERIODS_GET(IOPTION) CALL PMANAGERDEFINEPERIODS_RENAME(0) CASE (ID_RENAME) CALL PMANAGERDEFINEPERIODS_RENAME(1) CASE (IDOK) CALL WDIALOGSELECT(ID_DPMANAGERDATES); CALL WDIALOGGETMENU(IDF_MENU3,IOPTION) CALL PMANAGERDEFINEPERIODS_GET(IOPTION); EXIT CASE (IDCANCEL) EXIT CASE (IDHELP) END SELECT END SELECT ENDDO CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(ID_DPMANAGEROPEN) END SUBROUTINE PMANAGERDEFINEPERIODS !###====================================================================== LOGICAL FUNCTION PMANAGERDEFINEPERIODS_INIT() !###====================================================================== IMPLICIT NONE PMANAGERDEFINEPERIODS_INIT=.FALSE. IF(NPERIOD.EQ.0)THEN CALL PMANAGERDEFINEPERIODS_RENAME(0) !## cannot start unless nperiod>0 IF(NPERIOD.EQ.0)THEN CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(ID_DPMANAGERDATES); RETURN ENDIF ELSE !## fill in menu CALL WDIALOGPUTMENU(IDF_MENU3,PERIOD%NAME,NPERIOD,1) CALL PMANAGERDEFINEPERIODS_PUT() IF(NPERIOD.GE.SIZE(PERIOD))CALL WDIALOGFIELDSTATE(ID_NEW,0) ENDIF PMANAGERDEFINEPERIODS_INIT=.TRUE. END FUNCTION PMANAGERDEFINEPERIODS_INIT !###====================================================================== SUBROUTINE PMANAGERDEFINEPERIODS_RENAME(ICODE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ICODE INTEGER :: IOPTION,ITYPE,I TYPE(WIN_MESSAGE) :: MESSAGE !## define new period IF(ICODE.EQ.0)THEN NPERIOD=NPERIOD+1; IOPTION=NPERIOD PERIOD(IOPTION)%NAME='' PERIOD(IOPTION)%IMH=4; PERIOD(IOPTION)%IDY=1; PERIOD(IOPTION)%IYR=2014 PERIOD(IOPTION)%IHR=0; PERIOD(IOPTION)%IMT=0; PERIOD(IOPTION)%ISC=0 !## use existing one ELSE CALL WDIALOGGETMENU(IDF_MENU3,IOPTION) ENDIF CALL WDIALOGLOAD(ID_POLYGONSHAPENAME,ID_POLYGONSHAPENAME) CALL WDIALOGFIELDSTATE(IDF_INTEGER1,3) CALL WDIALOGFIELDSTATE(IDF_LABEL2,3) CALL UTL_DIALOGSHOW(-1,-1,0,3) CALL WDIALOGPUTSTRING(IDF_LABEL1,'Enter a new name') IF(IOPTION.EQ.0)CALL WDIALOGPUTSTRING(IDF_STRING1,'...') IF(IOPTION.GT.0)CALL WDIALOGPUTSTRING(IDF_STRING1,TRIM(PERIOD(IOPTION)%NAME)) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDOK) CALL WDIALOGGETSTRING(IDF_STRING1,PERIOD(IOPTION)%NAME) IF(TRIM(PERIOD(IOPTION)%NAME).EQ.'')THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You should specify a name of at least 1 character','Warning') ELSE DO I=1,NPERIOD IF(I.EQ.IOPTION)CYCLE IF(UTL_CAP(TRIM(PERIOD(I)%NAME),'U').EQ.UTL_CAP(TRIM(PERIOD(IOPTION)%NAME),'U'))THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Given name has defined already.'//CHAR(13)// & 'You should specify an unique name','Warning') EXIT ENDIF ENDDO IF(I.GT.NPERIOD)EXIT ENDIF CASE (IDCANCEL) EXIT END SELECT END SELECT ENDDO CALL WDIALOGUNLOAD() CALL WDIALOGSELECT(ID_DPMANAGERDATES) IF(MESSAGE%VALUE1.EQ.IDOK)THEN CALL WDIALOGPUTMENU(IDF_MENU3,PERIOD%NAME,NPERIOD,IOPTION) CALL PMANAGERDEFINEPERIODS_PUT() ELSEIF(MESSAGE%VALUE1.EQ.IDCANCEL)THEN NPERIOD=NPERIOD-1 ENDIF IF(NPERIOD.GE.SIZE(PERIOD))CALL WDIALOGFIELDSTATE(ID_NEW,0) END SUBROUTINE PMANAGERDEFINEPERIODS_RENAME !###====================================================================== SUBROUTINE PMANAGERDEFINEPERIODS_PUT() !###====================================================================== IMPLICIT NONE INTEGER :: IOPTION,I CALL WDIALOGSELECT(ID_DPMANAGERDATES) CALL WDIALOGGETMENU(IDF_MENU3,IOPTION) CALL WDIALOGGETINTEGER(IDF_INTEGER4,I) !## make copy of entered data first, before overwrite it with new one IF(I.NE.IOPTION)CALL PMANAGERDEFINEPERIODS_GET(I) CALL WDIALOGPUTINTEGER(IDF_INTEGER4,IOPTION) CALL WDIALOGPUTMENU(IDF_MENU1,CDATE,12,PERIOD(IOPTION)%IMH) CALL WDIALOGPUTINTEGER(IDF_INTEGER1 ,PERIOD(IOPTION)%IDY) CALL WDIALOGPUTINTEGER(IDF_INTEGER3 ,PERIOD(IOPTION)%IYR) CALL WDIALOGPUTINTEGER(IDF_INTEGER6 ,PERIOD(IOPTION)%IHR) CALL WDIALOGPUTINTEGER(IDF_INTEGER7 ,PERIOD(IOPTION)%IMT) CALL WDIALOGPUTINTEGER(IDF_INTEGER8 ,PERIOD(IOPTION)%ISC) CALL UTL_FILLDATES(IDF_INTEGER3,IDF_MENU1,IDF_INTEGER1) END SUBROUTINE PMANAGERDEFINEPERIODS_PUT !###====================================================================== SUBROUTINE PMANAGERDEFINEPERIODS_GET(IOPTION) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IOPTION IF(IOPTION.GT.0)THEN CALL WDIALOGGETMENU(IDF_MENU1 ,PERIOD(IOPTION)%IMH) CALL WDIALOGGETINTEGER(IDF_INTEGER1 ,PERIOD(IOPTION)%IDY) CALL WDIALOGGETINTEGER(IDF_INTEGER3 ,PERIOD(IOPTION)%IYR) CALL WDIALOGGETINTEGER(IDF_INTEGER6 ,PERIOD(IOPTION)%IHR) CALL WDIALOGGETINTEGER(IDF_INTEGER7 ,PERIOD(IOPTION)%IMT) CALL WDIALOGGETINTEGER(IDF_INTEGER8 ,PERIOD(IOPTION)%ISC) ENDIF END SUBROUTINE PMANAGERDEFINEPERIODS_GET !###====================================================================== SUBROUTINE PMANAGERDEFINESPECIES() !###====================================================================== IMPLICIT NONE INTEGER :: ITYPE,I,J,DID,ISYS,IPER,NPER,NSYS,NSPEC,NTOP,NORG,ISUB TYPE(WIN_MESSAGE) :: MESSAGE LOGICAL :: LEX DID=WINFODIALOG(CURRENTDIALOG) CALL WDIALOGLOAD(ID_DPMANAGER_MT3D_SPECIES,ID_DPMANAGER_MT3D_SPECIES) !## save previous number of species NSPEC=NSPECIES !## display dialog CALL WGRIDSTATE(IDF_GRID1,1,2); CALL WGRIDSTATE(IDF_GRID1,2,1); CALL WGRIDSTATE(IDF_GRID1,3,1) CALL WDIALOGRANGEINTEGER(IDF_INTEGER1,0,SIZE(SPECIES)) CALL WDIALOGPUTINTEGER(IDF_INTEGER1,NSPECIES) CALL PMANAGERDEFINESPECIES_ADJUST(0) CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) !## current field SELECT CASE (MESSAGE%VALUE2) END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_APPLY) CALL PMANAGERDEFINESPECIES_ADJUST(1) CASE (IDCANCEL) !## restore to original number of species NSPECIES=NSPEC; EXIT CASE (IDOK) CALL WGRIDGETSTRING(IDF_GRID1,2,SPECIES%NAME ,NSPECIES) CALL WGRIDGETMENU( IDF_GRID1,3,SPECIES%IMOBILE,NSPECIES) EXIT CASE (IDHELP) CALL UTL_GETHELP('*','VMO.iPM.DefSpec') END SELECT END SELECT ENDDO CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(DID) IF(NSPEC.NE.NSPECIES)THEN !## all will be removed LEX=.TRUE.; IF(NSPEC.GT.0.AND.NSPECIES.EQ.0)THEN CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to remove all species','Question') IF(WINFODIALOG(4).NE.1)LEX=.FALSE. ENDIF !## modify all to include the species DO I=1,MAXTOPICS !## skip time invarient topics IF(.NOT.TOPICS(I)%LSPECIES)CYCLE !## drainage does not have species SELECT CASE (I) CASE (TDRN,TOLF); CYCLE END SELECT !## original number of topics NORG=TOPICS(I)%NSUBTOPICS-NSPEC !## new number of topics NTOP=NORG+NSPECIES !## process none empty ones IF(ASSOCIATED(TOPICS(I)%STRESS))THEN !## number of defined stresses NPER=SIZE(TOPICS(I)%STRESS) DO IPER=1,NPER NSYS=SIZE(TOPICS(I)%STRESS(IPER)%FILES,2) ALLOCATE(TOPICS(I)%STRESS(IPER)%FILES_TMP(NTOP,NSYS)) DO ISYS=1,NSYS DO ISUB=1,NORG TOPICS(I)%STRESS(IPER)%FILES_TMP(ISUB,ISYS)=TOPICS(I)%STRESS(IPER)%FILES(ISUB,ISYS) ENDDO !## add new ones DO ISUB=NORG+1,NTOP TOPICS(I)%STRESS(IPER)%FILES_TMP(ISUB,ISYS)%IACT =1 TOPICS(I)%STRESS(IPER)%FILES_TMP(ISUB,ISYS)%FNAME='' TOPICS(I)%STRESS(IPER)%FILES_TMP(ISUB,ISYS)%FCT =1.0D0 TOPICS(I)%STRESS(IPER)%FILES_TMP(ISUB,ISYS)%IMP =0.0D0 TOPICS(I)%STRESS(IPER)%FILES_TMP(ISUB,ISYS)%ICNST=1 TOPICS(I)%STRESS(IPER)%FILES_TMP(ISUB,ISYS)%CNST =1.0D0 TOPICS(I)%STRESS(IPER)%FILES_TMP(ISUB,ISYS)%ILAY =TOPICS(I)%STRESS(IPER)%FILES(1,ISYS)%ILAY ENDDO ENDDO DEALLOCATE(TOPICS(I)%STRESS(IPER)%FILES) TOPICS(I)%STRESS(IPER)%FILES=>TOPICS(I)%STRESS(IPER)%FILES_TMP ENDDO ENDIF TOPICS(I)%NSUBTOPICS=NTOP DO J=1,NSPECIES; TOPICS(I)%SNAME(J+NORG)='Concentration '//TRIM(SPECIES(J)%NAME); ENDDO !//' (IDF)'; ENDDO ENDDO ENDIF END SUBROUTINE PMANAGERDEFINESPECIES !###====================================================================== SUBROUTINE PMANAGERDEFINESPECIES_ADJUST(IUPDATE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IUPDATE INTEGER :: I,N CALL WDIALOGGETINTEGER(IDF_INTEGER1,N) IF(N.EQ.0)THEN CALL WGRIDCLEAR(IDF_GRID1); CALL WDIALOGFIELDSTATE(IDF_GRID1,3) ELSE !## get data from current grid so far IF(IUPDATE.EQ.1)THEN CALL WGRIDGETSTRING(IDF_GRID1,2,SPECIES%NAME,NSPECIES) CALL WGRIDGETMENU(IDF_GRID1,3,SPECIES%IMOBILE,NSPECIES) ENDIF !## renew grid CALL WDIALOGFIELDSTATE(IDF_GRID1,1); CALL WGRIDROWS(IDF_GRID1,N) !## fill in species number, name and mobility DO I=1,N; CALL WGRIDPUTCELLINTEGER(IDF_GRID1,1,I,I); ENDDO !## initialize new species DO I=NSPECIES+1,N; SPECIES(I)%NAME='SPECIES '//TRIM(ITOS(I)); SPECIES(I)%IMOBILE=1; ENDDO !## put them on the dialog CALL WGRIDPUTSTRING(IDF_GRID1,2,SPECIES%NAME,N) CALL WGRIDPUTOPTION(IDF_GRID1,3,SPECIES%IMOBILE,N) ENDIF !## update number of species NSPECIES=N END SUBROUTINE PMANAGERDEFINESPECIES_ADJUST !###====================================================================== LOGICAL FUNCTION PMANAGER_GETSELECTED(ID,ITOPIC,IPER,ISYS,ISUBTOPIC,IERROR) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID,IERROR INTEGER,INTENT(OUT) :: ITOPIC,IPER,ISYS,ISUBTOPIC INTEGER :: NSYS PMANAGER_GETSELECTED=.FALSE. !## check what topic has been selected TOPICLOOP: DO ITOPIC=1,MAXTOPICS IPER=0; ISYS=0; ISUBTOPIC=0; IF(ID.EQ.TOPICS(ITOPIC)%ID)EXIT TOPICLOOP NPER=0; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))NPER=SIZE(TOPICS(ITOPIC)%STRESS) DO IPER=1,NPER ISYS=0; ISUBTOPIC=0 IF(ID.EQ.TOPICS(ITOPIC)%IDT(IPER))EXIT TOPICLOOP NSYS=0; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(IPER)%FILES))NSYS=SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,2) !## read for each subtopic DO ISUBTOPIC=1,TOPICS(ITOPIC)%NSUBTOPICS ISYS=0 IF(ID.EQ.TOPICS(ITOPIC)%ISD(IPER,ISUBTOPIC))THEN IF(IERROR.EQ.1)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You should select a MAIN TOPIC, a DATE or an individual FILENAME.','Warning') RETURN ELSE EXIT TOPICLOOP ENDIF ENDIF !## read for each system DO ISYS=1,NSYS IF(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ID.EQ.ID)EXIT TOPICLOOP ENDDO ENDDO ENDDO ENDDO TOPICLOOP IF(ITOPIC.GT.MAXTOPICS)THEN ITOPIC=0; CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You should select a MAIN TOPIC at least','Warning'); RETURN ENDIF !## ITOPIC =TOPIC NUMBER (E.G. SHD, BND, WEL) !## IPER =STRESSPERIOD !## ISYS =SYSTEM NUMBER PMANAGER_GETSELECTED=.TRUE. END FUNCTION PMANAGER_GETSELECTED !###====================================================================== SUBROUTINE PMANAGERPUTFIELDS(IST,ICF,EXT) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(OUT) :: EXT INTEGER,INTENT(OUT) :: IST,ICF IF(.NOT.ALLOCATED(MENUNAMES))RETURN !## get subitem CALL WDIALOGGETMENU(IDF_MENU1,IST) !## usage of constant values ICF=1 IF(INDEX(UTL_CAP(MENUNAMES(IST),'U'),'(IDF)').GT.0)EXT='IDF' IF(INDEX(UTL_CAP(MENUNAMES(IST),'U'),'(IPF)').GT.0)EXT='IPF' IF(INDEX(UTL_CAP(MENUNAMES(IST),'U'),'(ISG)').GT.0)EXT='ISG' IF(INDEX(UTL_CAP(MENUNAMES(IST),'U'),'(GEN)').GT.0)EXT='GEN' SELECT CASE (EXT); CASE('IPF','ISG','GEN'); ICF=0; END SELECT CALL WDIALOGPUTDOUBLE(IDF_REAL1,PRJ(IST)%FCT,'(G12.5)') CALL WDIALOGPUTDOUBLE(IDF_REAL2,PRJ(IST)%IMP,'(G12.5)') CALL WDIALOGPUTDOUBLE(IDF_REAL3,PRJ(IST)%CNST,'(G12.5)') !## for ipf,isg,gen not constant values allowed IF(ICF.EQ.0)PRJ(IST)%ICNST=2 IF(PRJ(IST)%ICNST.EQ.1)THEN CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO1) CALL WDIALOGPUTSTRING(IDF_STRING1,'') ELSEIF(PRJ(IST)%ICNST.EQ.2)THEN CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO2) CALL WDIALOGPUTSTRING(IDF_STRING1,TRIM(PRJ(IST)%FNAME)) ENDIF END SUBROUTINE PMANAGERPUTFIELDS !###====================================================================== SUBROUTINE PMANAGERGETFIELDS(IST) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IST CALL WDIALOGGETDOUBLE(IDF_REAL1,PRJ(IST)%FCT) CALL WDIALOGGETDOUBLE(IDF_REAL2,PRJ(IST)%IMP) ! CALL WDIALOGGETCHECKBOX(IDF_CHECK2,PRJ(IST)%ICNST) ! !## inherent ! IF(PRJ(IST)%ICNST.EQ.1)THEN ! PRJ(IST)%ICNST=0 ! ELSE CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,PRJ(IST)%ICNST) ! ENDIF CALL WDIALOGGETDOUBLE(IDF_REAL3,PRJ(IST)%CNST) IF(PRJ(IST)%ICNST.EQ.2)CALL WDIALOGGETSTRING(IDF_STRING1,PRJ(IST)%FNAME) END SUBROUTINE PMANAGERGETFIELDS !###====================================================================== SUBROUTINE PMANAGEROPENFIELDS(LEX,LNEW,ICF) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ICF LOGICAL,INTENT(IN) :: LEX,LNEW INTEGER :: II,I,J,K,L CALL WDIALOGGETCHECKBOX(IDF_CHECK1,II) IF(II.EQ.1)THEN CALL WDIALOGPUTSTRING(IDF_CHECK1,'Current Particular System for the selected Package is ACTIVE, deselect to Deactivate it.') CALL WDIALOGCOLOUR(IDF_CHECK1,WRGB(0,0,0),WRGB(0,255,0)) ELSE CALL WDIALOGPUTSTRING(IDF_CHECK1,'Current Particular System for the selected Package is INACTIVE, select to Activate it.') CALL WDIALOGCOLOUR(IDF_CHECK1,WRGB(255,255,255),WRGB(255,0,0)) ENDIF CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,I) SELECT CASE (I) !## constant CASE (1); J=0; L=1 !## idf CASE (2); J=1; L=0 END SELECT II=1 CALL WDIALOGFIELDSTATE(IDF_REAL1,II) CALL WDIALOGFIELDSTATE(IDF_REAL2,II) CALL WDIALOGFIELDSTATE(IDF_LABEL2,II) CALL WDIALOGFIELDSTATE(IDF_LABEL3,II) CALL WDIALOGFIELDSTATE(IDF_RADIO1,II*ICF) CALL WDIALOGFIELDSTATE(IDF_RADIO2,II) CALL WDIALOGFIELDSTATE(IDF_REAL3,L) CALL WDIALOGFIELDSTATE(IDF_STRING1,J) CALL WDIALOGFIELDSTATE(ID_OPEN,J) !## new definition IF(LEX)THEN CALL WDIALOGGETRADIOBUTTON(IDF_RADIO3,I) SELECT CASE (I) CASE (1) J=0; K=0; L=0 CASE (2) J=1; K=0; L=0; IF(.NOT.LNEW)J=2 CASE (3) J=0; K=1; L=1; IF(.NOT.LNEW)L=2 IF(NPERIOD.EQ.0)L=0 END SELECT CALL WDIALOGFIELDSTATE(IDF_MENU2,J) CALL WDIALOGFIELDSTATE(IDF_INTEGER2,J) CALL WDIALOGFIELDSTATE(IDF_INTEGER3,J) CALL WDIALOGFIELDSTATE(IDF_INTEGER4,J) CALL WDIALOGFIELDSTATE(IDF_INTEGER5,J) CALL WDIALOGFIELDSTATE(IDF_INTEGER6,J) CALL WDIALOGFIELDSTATE(IDF_MENU3,L) CALL WDIALOGFIELDSTATE(ID_PROPERTIES,K) ENDIF END SUBROUTINE PMANAGEROPENFIELDS !###====================================================================== SUBROUTINE PMANAGERDRAW_PLUS() !###====================================================================== IMPLICIT NONE INTEGER :: ITYPE,IOPTION TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: I,IL1,IL2,IPLOT,NFILES CALL PMANAGER_GETNFILES((/TTOP,TBOT,TBND,TSHD,TKDW,TKHV,TKVA,TVCW,TKVV,TSTO,TSPY/),PRJMXNLAY) IF(PRJMXNLAY.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'There are no layers available.','Warning') RETURN ENDIF CALL WDIALOGLOAD(ID_DPMANAGER_SPECIALOPEN,ID_DPMANAGER_SPECIALOPEN) CALL WDIALOGPUTINTEGER(IDF_INTEGER1,1) CALL WDIALOGRANGEINTEGER(IDF_INTEGER1,1,PRJMXNLAY) CALL WDIALOGPUTINTEGER(IDF_INTEGER2,PRJMXNLAY) CALL WDIALOGRANGEINTEGER(IDF_INTEGER2,1,PRJMXNLAY) CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDCANCEL) EXIT CASE (IDHELP) CASE (IDOK) CALL WDIALOGGETMENU(IDF_MENU1,IOPTION) CALL WDIALOGGETINTEGER(IDF_INTEGER1,IL1) CALL WDIALOGGETINTEGER(IDF_INTEGER2,IL2) EXIT END SELECT END SELECT ENDDO CALL WDIALOGUNLOAD IF(MESSAGE%VALUE1.EQ.IDCANCEL)RETURN NLAY=IL2-IL1+1 !## create list of filenames SELECT CASE (IOPTION) !## TOP1 - BOT1 - TOP2 - ... CASE (1) ALLOCATE(FNAMES(NLAY*2),PRJILIST(2)) PRJILIST(1)=TTOP; PRJILIST(2)=TBOT !## TOP1 - KDW1 - BOT1 - TOP2 - KDW2 - BOT2 ... CASE (2) ALLOCATE(FNAMES(NLAY*3),PRJILIST(3)) PRJILIST(1)=TTOP; PRJILIST(2)=TKDW; PRJILIST(3)=TBOT !## TOP1 - KDW1 - BOT1 - VCW1 - TOP2 - KDW1- BOT2 - VCW2 - TOP3 ... CASE (3) ALLOCATE(FNAMES(NLAY*4-1),PRJILIST(4)) PRJILIST(1)=TTOP; PRJILIST(2)=TKDW; PRJILIST(3)=TBOT; PRJILIST(4)=TVCW !## TOP1 - BOT1 - VCW1 - TOP2 - BOT2 - VCW2 - TOP3 ... CASE(4) ALLOCATE(FNAMES(NLAY*3-1),PRJILIST(3)) PRJILIST(1)=TTOP; PRJILIST(2)=TBOT; PRJILIST(3)=TVCW !## TOP1 - SHD1 - BOT1 - TOP2 - SHD2 - BOT2 ... CASE (5) ALLOCATE(FNAMES(NLAY*3),PRJILIST(3)) PRJILIST(1)=TTOP; PRJILIST(2)=TSHD; PRJILIST(3)=TBOT !## TOP1 - KHV1 - BOT1 - TOP2 - KHV2 - BOT2 ... CASE (6) ALLOCATE(FNAMES(NLAY*3),PRJILIST(3)) PRJILIST(1)=TTOP; PRJILIST(2)=TKHV; PRJILIST(3)=TBOT !## TOP1 - BOT1 - KVV1 - TOP2 - BOT2 - KVV2 - TOP3 ... CASE(7) ALLOCATE(FNAMES(NLAY*3-1),PRJILIST(3)) PRJILIST(1)=TTOP; PRJILIST(2)=TBOT; PRJILIST(3)=TKVV !## TOP1 - KHV1 - BOT1 - KVV1 - TOP2 - KHV2 - BOT2 - KVV2 - TOP3 ... CASE (8) ALLOCATE(FNAMES(NLAY*4-1),PRJILIST(4)) PRJILIST(1)=TTOP; PRJILIST(2)=TKHV; PRJILIST(3)=TBOT; PRJILIST(4)=TKVV END SELECT !## get appropriate number of files - no matter what system or type, for first "stress-period" NFILES=PMANAGER_GETFNAMES(IL1,IL2,0,0,1) !## nothing found IF(NFILES.GT.0)THEN !## select files in the imod manager MP%ISEL=.FALSE. DO I=1,NFILES DO IPLOT=1,SIZE(MP) IF(TRIM(UTL_CAP(MP(IPLOT)%IDFNAME,'U')).EQ.TRIM(UTL_CAP(FNAMES(I)%FNAME,'U')))MP(IPLOT)%ISEL=.TRUE. ENDDO END DO !## delete them all from manager CALL MANAGER_UTL_DELETE(IQ=0) DO I=1,NFILES; CALL MANAGER_UTL_ADDFILE(FNAMES(I)%FNAME,LDEACTIVATE=.FALSE.); ENDDO ENDIF DEALLOCATE(FNAMES,PRJILIST) END SUBROUTINE PMANAGERDRAW_PLUS !###====================================================================== SUBROUTINE PMANAGERDRAW() !###====================================================================== IMPLICIT NONE INTEGER :: IPER,ITOPIC,ISYS,ID,ISUBTOPIC CHARACTER(LEN=256) :: CNAME CALL WDIALOGSELECT(ID_DPMANAGER_TAB1); CALL WDIALOGGETTREEVIEW(ID_TREEVIEW1,ID,CNAME) !## get the right topics, attributes from the tree-view IF(.NOT.PMANAGER_GETSELECTED(ID,ITOPIC,IPER,ISYS,ISUBTOPIC,0))RETURN !## major topic selected, draw everything IF(IPER.EQ.0.AND.ISYS.EQ.0.AND.ISUBTOPIC.EQ.0)THEN NPER=0; IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))NPER=SIZE(TOPICS(ITOPIC)%STRESS) DO IPER=1,NPER DO ISYS=1,SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,2) DO ISUBTOPIC=1,TOPICS(ITOPIC)%NSUBTOPICS !## idf file IF(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST.EQ.2)THEN CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME) ENDIF ENDDO ENDDO ENDDO ELSEIF(IPER.GT.0.AND.ISYS.EQ.0.AND.ISUBTOPIC.EQ.0)THEN DO ISYS=1,SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,2) DO ISUBTOPIC=1,TOPICS(ITOPIC)%NSUBTOPICS !## idf file IF(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST.EQ.2)THEN CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME) ENDIF ENDDO ENDDO ELSEIF(IPER.GT.0.AND.ISYS.GT.0.AND.ISUBTOPIC.EQ.0)THEN DO ISUBTOPIC=1,TOPICS(ITOPIC)%NSUBTOPICS !## idf file IF(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST.EQ.2)THEN CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME) ENDIF ENDDO ELSEIF(IPER.GT.0.AND.ISYS.EQ.0.AND.ISUBTOPIC.GT.0)THEN DO ISYS=1,SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,2) !## idf file IF(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST.EQ.2)THEN CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME) ENDIF ENDDO ELSE CALL MANAGER_UTL_ADDFILE(IDFNAMEGIVEN=TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FNAME) ENDIF CALL IDFPLOTFAST(0) END SUBROUTINE PMANAGERDRAW !###====================================================================== LOGICAL FUNCTION PMANAGERPRJ(ID,RUNFNAME,IBATCH,IDIALOG) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID,IBATCH,IDIALOG CHARACTER(LEN=*),INTENT(IN) :: RUNFNAME CHARACTER(LEN=256) :: FNAME PMANAGERPRJ=.FALSE. IF(ID.EQ.ID_OPEN)THEN IF(RUNFNAME.EQ.'')THEN FNAME='' IF(.NOT.UTL_WSELECTFILE('iMOD Project File (*.prj)|*.prj|', & LOADDIALOG+MUSTEXIST+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,& 'Load iMOD Project File'))RETURN ELSE FNAME=RUNFNAME ENDIF !## reading content PRJ file IF(.NOT.PMANAGER_LOADPRJ(FNAME,IBATCH))THEN IF(IBATCH.EQ.0)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD cannot read in the Project File','Error') ELSE IF(IBATCH.EQ.0.AND.IDIALOG.EQ.1)CALL PMANAGER_UTL_UPDATE_TREEVIEW(0,0,0); PMANAGERPRJ=.TRUE. ENDIF ELSEIF(ID.EQ.ID_SAVE)THEN IF(RUNFNAME.EQ.'')THEN FNAME='' IF(.NOT.UTL_WSELECTFILE('iMOD Project Files (*.prj)|*.prj|', & SAVEDIALOG+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,'Save iMOD Project File'))RETURN ELSE FNAME=RUNFNAME ENDIF IF(PMANAGER_SAVEPRJ(FNAME))THEN IF(IBATCH.EQ.0)CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Successfully written project file:'//CHAR(13)//TRIM(FNAME),'Information') IF(IBATCH.EQ.1)WRITE(*,'(/A/)') 'Successfully written project file:'//TRIM(FNAME) PMANAGERPRJ=.TRUE. ENDIF ENDIF END FUNCTION PMANAGERPRJ !###====================================================================== LOGICAL FUNCTION PMANAGER_SAVEPRJ(FNAME) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: FNAME INTEGER :: IU,I,J,K,L,N CHARACTER(LEN=52) :: FRM PMANAGER_SAVEPRJ=.FALSE. IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=FNAME,STATUS='REPLACE',ACTION='WRITE,DENYREAD',FORM='FORMATTED') !## write modules DO I=1,MAXTOPICS IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS))CYCLE !## get maximal file length for file names N=0; DO J=1,SIZE(TOPICS(I)%STRESS) IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS(J)%FILES))CYCLE DO K=1,SIZE(TOPICS(I)%STRESS(J)%FILES,1) !## systems(.) DO L=1,SIZE(TOPICS(I)%STRESS(J)%FILES,2) !## subtopics(.) N=MAX(LEN_TRIM(TOPICS(I)%STRESS(J)%FILES(K,L)%FNAME),N) ENDDO ENDDO ENDDO N=N+2; WRITE(FRM,'(A34,I3.3,A3)') '(1X,2(I1,A1),I4.3,3(A1,G15.7),A1,A',N,',A)' !## pst module is exception SELECT CASE (I) CASE (TPST) WRITE(IU,'(/I4.4,A,I1,A)') SIZE(PEST%PARAM),','//TOPICS(I)%TNAME(1:5)//',',TOPICS(I)%IACT_MODEL,','//TRIM(TOPICS(I)%TNAME(6:))//' []' IF(.NOT.PMANAGER_SAVEPST(IU,0,'',0,0))RETURN CYCLE CASE (TIES) WRITE(IU,'(/I4.4,A,I1,A)') SIZE(PEST%PARAM),','//TOPICS(I)%TNAME(1:5)//',',TOPICS(I)%IACT_MODEL,','//TRIM(TOPICS(I)%TNAME(6:))//' []' CALL PMANAGER_SAVEIES(IU) CYCLE !## pcg module another exception CASE (TPCG) WRITE(IU,'(/I4.4,A,I1,A)') 1,','//TOPICS(I)%TNAME(1:5)//',',TOPICS(I)%IACT_MODEL,','//TRIM(TOPICS(I)%TNAME(6:)) !//' []' CALL PMANAGER_SAVEPCG(IU,0) CYCLE !## gcg module another exception CASE (TGCG) WRITE(IU,'(/I4.4,A,I1,A)') 1,','//TOPICS(I)%TNAME(1:5)//',',TOPICS(I)%IACT_MODEL,','//TRIM(TOPICS(I)%TNAME(6:)) !//' []' CALL PMANAGER_SAVEGCG(IU) CYCLE !## rct module another exception CASE (TRCT) WRITE(IU,'(/I4.4,A,I1,A)') 1,','//TOPICS(I)%TNAME(1:5)//',',TOPICS(I)%IACT_MODEL,','//TRIM(TOPICS(I)%TNAME(6:)) !//' []' CALL PMANAGER_SAVERCT(IU) CYCLE !## vdf module another exception CASE (TVDF) WRITE(IU,'(/I4.4,A,I1,A)') 1,','//TOPICS(I)%TNAME(1:5)//',',TOPICS(I)%IACT_MODEL,','//TRIM(TOPICS(I)%TNAME(6:)) !//' []' CALL PMANAGER_SAVEVDF(IU) CYCLE END SELECT WRITE(LINE,'(I4.4,A,I1,A)') SIZE(TOPICS(I)%STRESS),','//TOPICS(I)%TNAME(1:5)//',',TOPICS(I)%IACT_MODEL,','//TRIM(TOPICS(I)%TNAME(6:)) WRITE(IU,'(/A)') TRIM(LINE) DO L=1,SIZE(TOPICS(I)%STRESS) IF(.NOT.ASSOCIATED(TOPICS(I)%STRESS(L)%FILES))CYCLE IF(TOPICS(I)%TIMDEP)THEN IF(TOPICS(I)%STRESS(L)%IYR+TOPICS(I)%STRESS(L)%IMH+TOPICS(I)%STRESS(L)%IDY+ & TOPICS(I)%STRESS(L)%IHR+TOPICS(I)%STRESS(L)%IMT+TOPICS(I)%STRESS(L)%ISC.GT.0)THEN WRITE(IU,'(I4.4,5(A1,I2.2))') TOPICS(I)%STRESS(L)%IYR,'-',TOPICS(I)%STRESS(L)%IMH,'-',TOPICS(I)%STRESS(L)%IDY,' ', & TOPICS(I)%STRESS(L)%IHR,':',TOPICS(I)%STRESS(L)%IMT,':',TOPICS(I)%STRESS(L)%ISC ELSE WRITE(IU,'(A)') TRIM(TOPICS(I)%STRESS(L)%CDATE) ENDIF ENDIF WRITE(IU,'(2(I3.3,A1))') SIZE(TOPICS(I)%STRESS(L)%FILES,1),',',SIZE(TOPICS(I)%STRESS(L)%FILES,2) DO K=1,SIZE(TOPICS(I)%STRESS(L)%FILES,1) !## subtopics(.) DO J=1,SIZE(TOPICS(I)%STRESS(L)%FILES,2) !## systems(.) WRITE(IU,FRM) TOPICS(I)%STRESS(L)%FILES(K,J)%IACT ,',', & TOPICS(I)%STRESS(L)%FILES(K,J)%ICNST,',', & TOPICS(I)%STRESS(L)%FILES(K,J)%ILAY ,',', & TOPICS(I)%STRESS(L)%FILES(K,J)%FCT ,',', & TOPICS(I)%STRESS(L)%FILES(K,J)%IMP ,',', & TOPICS(I)%STRESS(L)%FILES(K,J)%CNST ,',', & CHAR(39)//TRIM(TOPICS(I)%STRESS(L)%FILES(K,J)%FNAME)//CHAR(39),' >>> '//TRIM(TOPICS(I)%SNAME(K))//' <<<' ENDDO ENDDO !## write extra files only for MetaSWAP IF(I.EQ.1)THEN IF(ASSOCIATED(TOPICS(I)%STRESS(L)%INPFILES))THEN K=SIZE(TOPICS(I)%STRESS(L)%INPFILES) WRITE(IU,'(I3.3,A)') K,',EXTRA FILES' DO J=1,K; WRITE(IU,'(A)') TRIM(TOPICS(I)%STRESS(L)%INPFILES(J)); ENDDO ENDIF ENDIF ENDDO ENDDO WRITE(IU,'(/A)') 'Periods' DO I=1,NPERIOD WRITE(IU,'(A)') '"'//TRIM(PERIOD(I)%NAME)//'"' WRITE(IU,'(2(I2.2,A1),I4.4,3(A1,I2.2))') PERIOD(I)%IDY,'-',PERIOD(I)%IMH,'-',PERIOD(I)%IYR,' ', & PERIOD(I)%IHR,':',PERIOD(I)%IMT,':',PERIOD(I)%ISC ENDDO WRITE(IU,'(/A)') 'Species' DO I=1,NSPECIES WRITE(IU,'(A)') '"'//TRIM(SPECIES(I)%NAME)//'",'//TRIM(ITOS(SPECIES(I)%IMOBILE)) ENDDO CLOSE(IU) PMANAGER_SAVEPRJ=.TRUE. END FUNCTION PMANAGER_SAVEPRJ !###====================================================================== LOGICAL FUNCTION PMANAGER_LOADPRJ(FNAME,IBATCH) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: FNAME INTEGER,INTENT(IN) :: IBATCH INTEGER :: IU,I,J,K,IOS,NC,L,NSYS,IACT,M1,M2 CHARACTER(LEN=MAXLENPRJ) :: CTOPIC PMANAGER_LOADPRJ=.FALSE. NPERIOD=0; NSPECIES=0 DO I=1,SIZE(TOPICS); CALL PMANAGER_DEALLOCATE(I); ENDDO; CALL PMANAGER_DEALLOCATE_PEST() IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',ACTION='READ,DENYWRITE',FORM='FORMATTED') !## read modules DO DO READ(IU,'(A512)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT !## check keyword IF(TRIM(LINE).NE.'')THEN !## periods defined - stop searching for modules/packages IF(TRIM(UTL_CAP(LINE,'U')).EQ.'PERIODS')EXIT !## periods defined - stop searching for modules/packages IF(TRIM(UTL_CAP(LINE,'U')).EQ.'SPECIES')EXIT READ(LINE,*,IOSTAT=IOS) NPER,CTOPIC,IACT IF(IOS.NE.0)THEN; IACT=1; READ(LINE,*,IOSTAT=IOS) NPER,CTOPIC; ENDIF IF(IOS.EQ.0)THEN !## skip empty packages IF(NPER.LE.0)CYCLE I=PMANAGER_FIND_KEYWORD(CTOPIC); IF(I.GT.0)EXIT ENDIF ENDIF ENDDO IF(IOS.NE.0)EXIT !## periods defined - stop searching for modules/packages IF(TRIM(UTL_CAP(LINE,'U')).EQ.'PERIODS')THEN !## reading period list I=0; DO READ(IU,'(A512)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT IF(TRIM(LINE).EQ.'')EXIT I=I+1; READ(LINE,*,IOSTAT=IOS) PERIOD(I)%NAME READ(IU,'(2(I2.2,1X),I4.4,3(1X,I2.2))',IOSTAT=IOS) PERIOD(I)%IDY,PERIOD(I)%IMH,PERIOD(I)%IYR, & PERIOD(I)%IHR,PERIOD(I)%IMT,PERIOD(I)%ISC IF(IOS.NE.0)THEN; I=I-1; EXIT; ENDIF ENDDO; NPERIOD=I CYCLE ENDIF !## reading species list IF(TRIM(UTL_CAP(LINE,'U')).EQ.'SPECIES')THEN I=0; DO READ(IU,'(A512)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT IF(TRIM(LINE).EQ.'')EXIT I=I+1; READ(LINE,*,IOSTAT=IOS) SPECIES(I)%NAME,SPECIES(I)%IMOBILE IF(IOS.NE.0)THEN; I=I-1; EXIT; ENDIF ENDDO; NSPECIES=I CYCLE ENDIF !## module with tailor made settings window SELECT CASE (I) CASE (TPST) CALL PMANAGER_LOADPST(IU,NPER,0) TOPICS(I)%IACT_MODEL=IACT; ALLOCATE(TOPICS(I)%STRESS(1)); ALLOCATE(TOPICS(I)%STRESS(1)%FILES(1,1)); TOPICS(I)%STRESS(1)%FILES%FNAME='' CYCLE CASE (TIES) IF(PMANAGER_LOADIES(IU,NPER))THEN TOPICS(I)%IACT_MODEL=IACT; ALLOCATE(TOPICS(I)%STRESS(1)); ALLOCATE(TOPICS(I)%STRESS(1)%FILES(1,1)); TOPICS(I)%STRESS(1)%FILES%FNAME='' ENDIF CYCLE CASE (TPCG) TOPICS(I)%IACT_MODEL=IACT; ALLOCATE(TOPICS(I)%STRESS(1)); ALLOCATE(TOPICS(I)%STRESS(1)%FILES(1,1)); TOPICS(I)%STRESS(1)%FILES%FNAME='' IF(.NOT.PMANAGER_LOADPCG(IU))THEN; CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error reading PCG Section - skipping this part.','Error'); ENDIF CYCLE CASE (TRCT) TOPICS(I)%IACT_MODEL=IACT; ALLOCATE(TOPICS(I)%STRESS(1)); ALLOCATE(TOPICS(I)%STRESS(1)%FILES(1,1)); TOPICS(I)%STRESS(1)%FILES%FNAME='' IF(.NOT.PMANAGER_LOADRCT(IU))THEN; CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error reading RCT Section - skipping this part.','Error'); ENDIF CYCLE CASE (TGCG) TOPICS(I)%IACT_MODEL=IACT; ALLOCATE(TOPICS(I)%STRESS(1)); ALLOCATE(TOPICS(I)%STRESS(1)%FILES(1,1)); TOPICS(I)%STRESS(1)%FILES%FNAME='' IF(.NOT.PMANAGER_LOADGCG(IU))THEN; CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error reading GCG Section - skipping this part.','Error'); ENDIF CYCLE CASE (TVDF) TOPICS(I)%IACT_MODEL=IACT; ALLOCATE(TOPICS(I)%STRESS(1)); ALLOCATE(TOPICS(I)%STRESS(1)%FILES(1,1)); TOPICS(I)%STRESS(1)%FILES%FNAME='' IF(.NOT.PMANAGER_LOADVDF(IU))THEN; CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error reading VDF Section - skipping this part.','Error'); ENDIF CYCLE END SELECT !## read all other packages ALLOCATE(TOPICS(I)%STRESS(NPER)); TOPICS(I)%IACT_MODEL=IACT DO L=1,NPER IF(TOPICS(I)%TIMDEP)THEN READ(IU,'(A512)') LINE READ(LINE,'(I4,5(1X,I2))',IOSTAT=IOS) TOPICS(I)%STRESS(L)%IYR,TOPICS(I)%STRESS(L)%IMH,TOPICS(I)%STRESS(L)%IDY, & TOPICS(I)%STRESS(L)%IHR,TOPICS(I)%STRESS(L)%IMT,TOPICS(I)%STRESS(L)%ISC IF(IOS.NE.0)THEN READ(LINE,*) TOPICS(I)%STRESS(L)%CDATE TOPICS(I)%STRESS(L)%IYR=0; TOPICS(I)%STRESS(L)%IMH=0; TOPICS(I)%STRESS(L)%IDY=0 TOPICS(I)%STRESS(L)%IHR=0; TOPICS(I)%STRESS(L)%IMT=0; TOPICS(I)%STRESS(L)%ISC=0 ENDIF ENDIF READ(IU,*,IOSTAT=IOS) NC,NSYS IF(IOS.NE.0)THEN IF(IBATCH.EQ.0)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error reading of parameters for'//CHAR(13)//TRIM(TOPICS(I)%TNAME),'Error') IF(IBATCH.EQ.1)WRITE(*,'(/A/)') 'Error reading parameters for '//TRIM(TOPICS(I)%TNAME)//' stress '//TRIM(ITOS(L))//' "'//TRIM(LINE)//'"' CLOSE(IU); RETURN ENDIF !## check whether number of attributes is similar to the number defined before IF(L.GT.1.AND.NC.NE.TOPICS(I)%NSUBTOPICS)THEN IF(IBATCH.EQ.0)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Number of attributes is not correct'//CHAR(13)//TRIM(TOPICS(I)%TNAME),'Error') IF(IBATCH.EQ.1)WRITE(*,'(/A/)') 'Number of attributes is not correct '//TRIM(TOPICS(I)%TNAME)//' stress '//TRIM(ITOS(L))//' "'//TRIM(LINE)//'"' CLOSE(IU); RETURN ENDIF ALLOCATE(TOPICS(I)%STRESS(L)%FILES(NC,NSYS)) TOPICS(I)%NSUBTOPICS=NC DO K=1,TOPICS(I)%NSUBTOPICS DO J=1,NSYS READ(IU,'(A512)',IOSTAT=IOS) LINE IF(IOS.EQ.0)THEN READ(LINE,*,IOSTAT=IOS) TOPICS(I)%STRESS(L)%FILES(K,J)%IACT , & TOPICS(I)%STRESS(L)%FILES(K,J)%ICNST IF(IOS.EQ.0)THEN IF(TOPICS(I)%STRESS(L)%FILES(K,J)%ICNST.EQ.1)THEN READ(LINE,*,IOSTAT=IOS) TOPICS(I)%STRESS(L)%FILES(K,J)%IACT , & TOPICS(I)%STRESS(L)%FILES(K,J)%ICNST, & TOPICS(I)%STRESS(L)%FILES(K,J)%ILAY , & TOPICS(I)%STRESS(L)%FILES(K,J)%FCT , & TOPICS(I)%STRESS(L)%FILES(K,J)%IMP , & TOPICS(I)%STRESS(L)%FILES(K,J)%CNST TOPICS(I)%STRESS(L)%FILES(K,J)%FNAME='' ELSEIF(TOPICS(I)%STRESS(L)%FILES(K,J)%ICNST.EQ.2)THEN READ(LINE,*,IOSTAT=IOS) TOPICS(I)%STRESS(L)%FILES(K,J)%IACT , & TOPICS(I)%STRESS(L)%FILES(K,J)%ICNST, & TOPICS(I)%STRESS(L)%FILES(K,J)%ILAY , & TOPICS(I)%STRESS(L)%FILES(K,J)%FCT , & TOPICS(I)%STRESS(L)%FILES(K,J)%IMP , & TOPICS(I)%STRESS(L)%FILES(K,J)%CNST , & TOPICS(I)%STRESS(L)%FILES(K,J)%FNAME IF(TRIM(PREFVAL(5)).NE.'')THEN TOPICS(I)%STRESS(L)%FILES(K,J)%FNAME=UTL_SUBST(TOPICS(I)%STRESS(L)%FILES(K,J)%FNAME,TRIM(REPLACESTRING),PREFVAL(5)) ENDIF TOPICS(I)%STRESS(L)%FILES(K,J)%ALIAS= & UTL_CAP(TRIM(TOPICS(I)%STRESS(L)%FILES(K,J)%FNAME(INDEX(TOPICS(I)%STRESS(L)%FILES(K,J)%FNAME,'\',.TRUE.)+1:)),'L') ELSE CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Incorrect syntax, the ICNST need to be 1 or 2.'//CHAR(13)// & 'iMOD reads ['//TRIM(ITOS(TOPICS(I)%STRESS(L)%FILES(K,J)%ICNST))//']','Error') CLOSE(IU); RETURN ENDIF ENDIF ENDIF IF(IOS.NE.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Incorrect number of input fields for'//CHAR(13)//TRIM(TOPICS(I)%TNAME)//CHAR(13)// & 'or syntax error in line'//CHAR(13)//CHAR(13)//TRIM(LINE)//CHAR(13)//CHAR(13)//'Maybe a quote is missing in the filename','Error') CLOSE(IU); RETURN ENDIF ENDDO ENDDO !## extra files (INP) only for MetaSWAP IF(I.EQ.TCAP)THEN READ(IU,*) K IF(ASSOCIATED(TOPICS(I)%STRESS(L)%INPFILES))DEALLOCATE(TOPICS(I)%STRESS(L)%INPFILES) ALLOCATE(TOPICS(I)%STRESS(L)%INPFILES(K)) DO J=1,K; READ(IU,'(A256)') TOPICS(I)%STRESS(L)%INPFILES(J); ENDDO ENDIF ENDDO ENDDO CLOSE(IU) !## if species defined update relevant packages IF(NSPECIES.GT.0)THEN DO I=1,MAXTOPICS IF(.NOT.TOPICS(I)%LSPECIES)CYCLE !## find first empty spot DO J=1,SIZE(TOPICS(I)%SNAME); IF(TRIM(TOPICS(I)%SNAME(J)).EQ.'')EXIT; ENDDO !## number of available subtopics, if none attributes yet, start at 1 M1=J; M2=M1+(NSPECIES-1) K=0; DO J=M1,M2; K=K+1; TOPICS(I)%SNAME(J)=SPECIES(K)%NAME; ENDDO !## insert space to include species TOPICS(I)%NSUBTOPICS=M2 ENDDO ENDIF !## deactivate inactivated packages DO I=1,SIZE(MC) DO J=1,SIZE(MC(I)%IACT) IF(TOPICS(MC(I)%T(J))%IACT_MODEL.EQ.0)MC(I)%IACT(J)=0 ENDDO ENDDO PMANAGER_LOADPRJ=.TRUE. END FUNCTION PMANAGER_LOADPRJ !###====================================================================== SUBROUTINE PMANAGER_DELETE() !###====================================================================== IMPLICIT NONE INTEGER :: ID,ITOPIC,IPER,ISYS,ISUBTOPIC,I,II,J,K,N,M CHARACTER(LEN=256) :: CNAME,STRING CHARACTER(LEN=4) :: EXT CALL WDIALOGSELECT(ID_DPMANAGER_TAB1); CALL WDIALOGGETTREEVIEW(ID_TREEVIEW1,ID,CNAME) !## get the right topics and attribute from the treeview IF(.NOT.PMANAGER_GETSELECTED(ID,ITOPIC,IPER,ISYS,ISUBTOPIC,1))RETURN !## remove/clean entire topic IF(IPER+ISYS+ISUBTOPIC.EQ.0)THEN CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to delete the content'//CHAR(13)// & 'for the topic ['//TRIM(TOPICS(ITOPIC)%TNAME)//']','Question'); IF(WINFODIALOG(4).NE.1)RETURN CALL PMANAGER_DEALLOCATE(ITOPIC) !## update the project manager for changes CALL PMANAGER_UTL_UPDATE_TREEVIEW(0,0,0) ELSEIF(IPER.NE.0.AND.ISYS.NE.0.AND.ISUBTOPIC.NE.0)THEN STRING='ilay='//TRIM(ITOS(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ILAY)) STRING=TRIM(STRING)//CHAR(13)//'fct='//TRIM(RTOS(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%FCT,'*',3)) STRING=TRIM(STRING)//CHAR(13)//'imp='//TRIM(RTOS(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%IMP,'*',3)) !## constant value IF(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST.EQ.1)THEN STRING=TRIM(STRING)//CHAR(13)//'cnst='//TRIM(RTOS(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%CNST,'*',3)) !## filename ELSEIF(TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ICNST.EQ.2)THEN CNAME=TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ALIAS EXT=CNAME(INDEX(CNAME,'.',.TRUE.)+1:) STRING=TRIM(STRING)//CHAR(13)//TRIM(EXT)//'='//TRIM(CNAME) !TOPICS(ITOPIC)%STRESS(IPER)%FILES(ISUBTOPIC,ISYS)%ALIAS) ENDIF CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to remove the selected entry:'//CHAR(13)//TRIM(STRING),'Question') IF(WINFODIALOG(4).NE.1)RETURN !## file selected, selected system will be deleted, thus conductance removes stage,bottom and inffactor as well. !## delete selected file and decrease size of files(). N=SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,1) !## number of subtopics M=SIZE(TOPICS(ITOPIC)%STRESS(IPER)%FILES,2) !## number of systems IF(M.GT.1)THEN ALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%FILES_TMP(N,M-1)) !## decrease size of the systems DO I=1,N; K=0; DO J=1,M IF(J.NE.ISYS)THEN K=K+1 TOPICS(ITOPIC)%STRESS(IPER)%FILES_TMP(I,K)=TOPICS(ITOPIC)%STRESS(IPER)%FILES(I,J) ENDIF ENDDO; ENDDO DEALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%FILES) TOPICS(ITOPIC)%STRESS(IPER)%FILES=>TOPICS(ITOPIC)%STRESS(IPER)%FILES_TMP ELSE !## remove current date - nothing left IF(TOPICS(ITOPIC)%TIMDEP)THEN !## make copy of current memory N=SIZE(TOPICS(ITOPIC)%STRESS) NULLIFY(TOPICS(ITOPIC)%STRESS_TMP) ALLOCATE(TOPICS(ITOPIC)%STRESS_TMP(N-1)) II=0; DO I=1,N IF(I.EQ.IPER)CYCLE II=II+1 J=SIZE(TOPICS(ITOPIC)%STRESS(I)%FILES,1) K=SIZE(TOPICS(ITOPIC)%STRESS(I)%FILES,2) NULLIFY(TOPICS(ITOPIC)%STRESS_TMP(II)%FILES) NULLIFY(TOPICS(ITOPIC)%STRESS_TMP(II)%INPFILES) ALLOCATE(TOPICS(ITOPIC)%STRESS_TMP(II)%FILES(J,K)); TOPICS(ITOPIC)%STRESS_TMP(II)%FILES%FNAME='' TOPICS(ITOPIC)%STRESS_TMP(II)%FILES=TOPICS(ITOPIC)%STRESS(I)%FILES TOPICS(ITOPIC)%STRESS_TMP(II)%CDATE=TOPICS(ITOPIC)%STRESS(I)%CDATE TOPICS(ITOPIC)%STRESS_TMP(II)%IYR=TOPICS(ITOPIC)%STRESS(I)%IYR TOPICS(ITOPIC)%STRESS_TMP(II)%IMH=TOPICS(ITOPIC)%STRESS(I)%IMH TOPICS(ITOPIC)%STRESS_TMP(II)%IDY=TOPICS(ITOPIC)%STRESS(I)%IDY TOPICS(ITOPIC)%STRESS_TMP(II)%IHR=TOPICS(ITOPIC)%STRESS(I)%IHR TOPICS(ITOPIC)%STRESS_TMP(II)%IMT=TOPICS(ITOPIC)%STRESS(I)%IMT TOPICS(ITOPIC)%STRESS_TMP(II)%ISC=TOPICS(ITOPIC)%STRESS(I)%ISC DEALLOCATE(TOPICS(ITOPIC)%STRESS(I)%FILES) ENDDO TOPICS(ITOPIC)%STRESS=>TOPICS(ITOPIC)%STRESS_TMP ELSE DEALLOCATE(TOPICS(ITOPIC)%STRESS(1)%FILES) DEALLOCATE(TOPICS(ITOPIC)%STRESS) TOPICS(ITOPIC)%IACT_MODEL=0 ENDIF ENDIF !## if pest associated, remove number of pest parameters IF(ITOPIC.EQ.TPST)CALL PMANAGER_DEALLOCATE_PEST() ! !## if pest associated, remove number of pest parameters ! IF(ITOPIC.EQ.TIES)CALL PMANAGER_DEALLOCATE_IES() !## update the project manager for changes - on topic level, other is not possible CALL PMANAGER_UTL_UPDATE_TREEVIEW(ITOPIC,IPER,ISUBTOPIC) !## remove selected date ELSEIF(IPER.NE.0.AND.ISYS.EQ.0.AND.ISUBTOPIC.EQ.0)THEN CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to delete the selected date ['//TRIM(TOPICS(ITOPIC)%STRESS(IPER)%CDATE)//']'//CHAR(13)// & ' for the topic ['//TRIM(TOPICS(ITOPIC)%TNAME)//']','Question'); IF(WINFODIALOG(4).NE.1)RETURN !## make copy of current memory N=SIZE(TOPICS(ITOPIC)%STRESS) IF(N.GT.1)THEN NULLIFY(TOPICS(ITOPIC)%STRESS_TMP) ALLOCATE(TOPICS(ITOPIC)%STRESS_TMP(N-1)) M=0 DO I=1,N !## skip selected period (do not copy) IF(I.EQ.IPER)CYCLE M=M+1 J =SIZE(TOPICS(ITOPIC)%STRESS(I)%FILES,1) K =SIZE(TOPICS(ITOPIC)%STRESS(I)%FILES,2) NULLIFY(TOPICS(ITOPIC)%STRESS_TMP(M)%FILES) ALLOCATE(TOPICS(ITOPIC)%STRESS_TMP(M)%FILES(J,K)); TOPICS(ITOPIC)%STRESS_TMP(M)%FILES%FNAME='' TOPICS(ITOPIC)%STRESS_TMP(M)%FILES=TOPICS(ITOPIC)%STRESS(I)%FILES TOPICS(ITOPIC)%STRESS_TMP(M)%CDATE=TOPICS(ITOPIC)%STRESS(I)%CDATE TOPICS(ITOPIC)%STRESS_TMP(M)%IYR=TOPICS(ITOPIC)%STRESS(I)%IYR TOPICS(ITOPIC)%STRESS_TMP(M)%IMH=TOPICS(ITOPIC)%STRESS(I)%IMH TOPICS(ITOPIC)%STRESS_TMP(M)%IDY=TOPICS(ITOPIC)%STRESS(I)%IDY TOPICS(ITOPIC)%STRESS_TMP(M)%IHR=TOPICS(ITOPIC)%STRESS(I)%IHR TOPICS(ITOPIC)%STRESS_TMP(M)%IMT=TOPICS(ITOPIC)%STRESS(I)%IMT TOPICS(ITOPIC)%STRESS_TMP(M)%ISC=TOPICS(ITOPIC)%STRESS(I)%ISC DEALLOCATE(TOPICS(ITOPIC)%STRESS(I)%FILES) ENDDO TOPICS(ITOPIC)%STRESS=>TOPICS(ITOPIC)%STRESS_TMP ELSE DEALLOCATE(TOPICS(ITOPIC)%STRESS(IPER)%FILES) DEALLOCATE(TOPICS(ITOPIC)%STRESS) ENDIF CALL PMANAGER_UTL_UPDATE_TREEVIEW(ITOPIC,0,0) ELSE CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'You should select a topic or a individual filename','Question') IF(WINFODIALOG(4).NE.1)RETURN ENDIF END SUBROUTINE PMANAGER_DELETE !###====================================================================== SUBROUTINE PMANAGER_CALC() !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,IWINDOW,IL1,IL2 CALL WDIALOGLOAD(ID_DPMANAGER_CALC,ID_DPMANAGER_CALC) !## define number of modellayers CALL PMANAGER_GETNFILES((/TTOP,TBOT,TBND,TSHD,TKDW,TKHV,TKVA,TVCW,TKVV,TSTO,TSPY/),PRJMXNLAY) CALL WDIALOGPUTINTEGER(IDF_INTEGER1,1) CALL WDIALOGPUTINTEGER(IDF_INTEGER2,PRJMXNLAY) CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) END SELECT SELECT CASE (MESSAGE%VALUE1) END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDOK,IDCANCEL); EXIT END SELECT END SELECT ENDDO CALL WDIALOGGETMENU(IDF_MENU1,ITYPE) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,IWINDOW) CALL WDIALOGGETINTEGER(IDF_INTEGER1,IL1) CALL WDIALOGGETINTEGER(IDF_INTEGER2,IL2) CALL WDIALOGUNLOAD() IF(MESSAGE%VALUE1.EQ.IDOK)THEN CALL UTL_MESSAGEHANDLE(0) IF(PMANAGER_CALC_INIT(IWINDOW,ITYPE,IL1,IL2))THEN CALL PMANAGER_CALC_READ(ITYPE,IL1,IL2) CALL PMANAGER_CALC_PROCESS(ITYPE,IL1,IL2) CALL PMANAGER_CALC_SAVE(ITYPE,IL1,IL2) ENDIF CALL PMANAGER_SAVEMF2005_DEALLOCATE() CALL UTL_MESSAGEHANDLE(1) ENDIF CALL WDIALOGSELECT(ID_DPMANAGER) END SUBROUTINE PMANAGER_CALC !###====================================================================== LOGICAL FUNCTION PMANAGER_CALC_INIT(IWINDOW,ITYPE,IL1,IL2) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IWINDOW,ITYPE,IL1,IL2 INTEGER :: ILAY PMANAGER_CALC_INIT=.FALSE. !## read idf for dimensions CALL IDFNULLIFY(PRJIDF) IF(.NOT.PMANAGER_INIT_SIMAREA(PRJIDF,0))RETURN IF(IWINDOW.EQ.2)THEN !## make sure size of model (including buffer) does not exceed total model domain SUBMODEL(1)=MAX(MPW%XMIN,PRJIDF%XMIN); SUBMODEL(2)=MAX(MPW%YMIN,PRJIDF%YMIN) SUBMODEL(3)=MIN(MPW%XMAX,PRJIDF%XMAX); SUBMODEL(4)=MIN(MPW%YMAX,PRJIDF%YMAX) !## compute dimensions of submodel CALL UTL_IDFSNAPTOGRID(SUBMODEL(1),SUBMODEL(3),SUBMODEL(2),SUBMODEL(4),SUBMODEL(5),PRJIDF%NCOL,PRJIDF%NROW) PRJIDF%XMIN=SUBMODEL(1); PRJIDF%YMIN=SUBMODEL(2); PRJIDF%XMAX=SUBMODEL(3); PRJIDF%YMAX=SUBMODEL(4) PRJIDF%DX=SUBMODEL(5); PRJIDF%DY=SUBMODEL(5); PRJIDF%IEQ=0 ENDIF IF(.NOT.IDFALLOCATEX(PRJIDF))RETURN; PRJIDF%X=0.0D0 !## fill sx/sy variable in idf IF(.NOT.IDFFILLSXSY(PRJIDF))RETURN SELECT CASE (ITYPE) !## transmissivities CASE (1,7) ALLOCATE(TOP(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(TOP(ILAY)); ENDDO ALLOCATE(BOT(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(BOT(ILAY)); ENDDO ALLOCATE(KHV(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(KHV(ILAY)); ENDDO ALLOCATE(KDW(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(KDW(ILAY)); ENDDO !## vertical resistance aquifer CASE (2) ALLOCATE(TOP(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(TOP(ILAY)); ENDDO ALLOCATE(BOT(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(BOT(ILAY)); ENDDO ALLOCATE(KHV(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(KHV(ILAY)); ENDDO ALLOCATE(KVA(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(KVA(ILAY)); ENDDO ALLOCATE(VCW(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(VCW(ILAY)); ENDDO !## vertical resistance aquitard CASE (3,8) ALLOCATE(TOP(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(TOP(ILAY)); ENDDO ALLOCATE(BOT(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(BOT(ILAY)); ENDDO ALLOCATE(KVV(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(KVV(ILAY)); ENDDO ALLOCATE(VCW(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(VCW(ILAY)); ENDDO !## total vertical resistance CASE (4) ALLOCATE(TOP(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(TOP(ILAY)); ENDDO ALLOCATE(BOT(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(BOT(ILAY)); ENDDO ALLOCATE(KHV(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(KHV(ILAY)); ENDDO ALLOCATE(KVA(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(KVA(ILAY)); ENDDO ALLOCATE(KVV(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(KVV(ILAY)); ENDDO ALLOCATE(VCW(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(VCW(ILAY)); ENDDO !## thickness aquifer CASE (5) ALLOCATE(TOP(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(TOP(ILAY)); ENDDO ALLOCATE(BOT(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(BOT(ILAY)); ENDDO ALLOCATE(KDW(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(KDW(ILAY)); ENDDO !## thickness aquitard CASE (6) ALLOCATE(TOP(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(TOP(ILAY)); ENDDO ALLOCATE(BOT(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(BOT(ILAY)); ENDDO ALLOCATE(VCW(IL1:IL2)); DO ILAY=IL1,IL2; CALL IDFNULLIFY(VCW(ILAY)); ENDDO END SELECT ! IF(ISS.EQ.1)THEN ! ALLOCATE(STO(NLAY)); DO ILAY=1,SIZE(STO); CALL IDFNULLIFY(STO(ILAY)); ENDDO ! ALLOCATE(SPY(NLAY)); DO ILAY=1,SIZE(SPY); CALL IDFNULLIFY(SPY(ILAY)); ENDDO ! ENDIF ! IF(LLPF)THEN ! ALLOCATE(KVV(NLAY-1)); DO ILAY=1,SIZE(KVV); CALL IDFNULLIFY(KVV(ILAY)); ENDDO ! ALLOCATE(KVA(NLAY)); DO ILAY=1,SIZE(KVA); CALL IDFNULLIFY(KVA(ILAY)); ENDDO ! ENDIF IF(ALLOCATED(TOP))THEN; DO ILAY=IL1,IL2; CALL IDFCOPY(PRJIDF,TOP(ILAY)); ENDDO; ENDIF IF(ALLOCATED(BOT))THEN; DO ILAY=IL1,IL2; CALL IDFCOPY(PRJIDF,BOT(ILAY)); ENDDO; ENDIF IF(ALLOCATED(KDW))THEN; DO ILAY=IL1,IL2; CALL IDFCOPY(PRJIDF,KDW(ILAY)); ENDDO; ENDIF IF(ALLOCATED(VCW))THEN; DO ILAY=IL1,IL2; CALL IDFCOPY(PRJIDF,VCW(ILAY)); ENDDO; ENDIF IF(ALLOCATED(KHV))THEN; DO ILAY=IL1,IL2; CALL IDFCOPY(PRJIDF,KHV(ILAY)); ENDDO; ENDIF IF(ALLOCATED(KVV))THEN; DO ILAY=IL1,IL2; CALL IDFCOPY(PRJIDF,KVV(ILAY)); ENDDO; ENDIF IF(ALLOCATED(KVA))THEN; DO ILAY=IL1,IL2; CALL IDFCOPY(PRJIDF,KVA(ILAY)); ENDDO; ENDIF PMANAGER_CALC_INIT=.TRUE. END FUNCTION PMANAGER_CALC_INIT !###====================================================================== SUBROUTINE PMANAGER_CALC_READ(ITYPE,IL1,IL2) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IL1,IL2,ITYPE INTEGER :: SCL_D,SCL_U,ILAY,ITOPIC,IINV,IPRT LOGICAL :: LEX ALLOCATE(FNAMES(1),PRJILIST(1)) IPRT=0 !## read files DO ILAY=IL1,IL2 !## top/bot data SELECT CASE (ITYPE) CASE (1,2,3,4,5,6,7,8) SCL_D=1; SCL_U=2; ITOPIC=TTOP; LEX=.FALSE.; IINV=0 IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))THEN PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN CALL WINDOWOUTSTATUSBAR(4,'Reading '//TRIM(FNAMES(1)%FNAME)//' ...') IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(TOP(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN LEX=.TRUE. ENDIF ENDIF IF(.NOT.LEX)THEN ENDIF SCL_D=1; SCL_U=2; ITOPIC=TBOT; LEX=.FALSE.; IINV=0 IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))THEN PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN CALL WINDOWOUTSTATUSBAR(4,'Reading '//TRIM(FNAMES(1)%FNAME)//' ...') IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(BOT(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN LEX=.TRUE. ENDIF ENDIF IF(.NOT.LEX)THEN ENDIF END SELECT !## khv/kdw data SELECT CASE (ITYPE) CASE (1,2,4) ITOPIC=TKHV; SCL_D=1; SCL_U=3; LEX=.FALSE.; IINV=0 IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))THEN PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN CALL WINDOWOUTSTATUSBAR(4,'Reading '//TRIM(FNAMES(1)%FNAME)//' ...') IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(KHV(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN LEX=.TRUE. ENDIF ENDIF IF(.NOT.LEX)THEN ENDIF CASE (7) ITOPIC=TKDW; SCL_D=1; SCL_U=3; LEX=.FALSE.; IINV=0 IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))THEN PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN CALL WINDOWOUTSTATUSBAR(4,'Reading '//TRIM(FNAMES(1)%FNAME)//' ...') IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(KDW(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN LEX=.TRUE. ENDIF ENDIF IF(.NOT.LEX)THEN ENDIF END SELECT !## kva data SELECT CASE (ITYPE) CASE (2,4) ITOPIC=TKVA; SCL_D=1; SCL_U=2; LEX=.FALSE.; IINV=1 IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))THEN PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN CALL WINDOWOUTSTATUSBAR(4,'Reading '//TRIM(FNAMES(1)%FNAME)//' ...') IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(KVA(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN LEX=.TRUE. ENDIF ENDIF IF(.NOT.LEX)THEN ENDIF END SELECT !## kvv data SELECT CASE (ITYPE) CASE (3,4) IF(ILAY.LT.PRJMXNLAY)THEN ITOPIC=TKVV; SCL_D=1; SCL_U=3; LEX=.FALSE.; IINV=0 IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))THEN PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN CALL WINDOWOUTSTATUSBAR(4,'Reading '//TRIM(FNAMES(1)%FNAME)//' ...') IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(KVV(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN LEX=.TRUE. ENDIF ENDIF IF(.NOT.LEX)THEN ENDIF ENDIF CASE (8) IF(ILAY.LT.PRJMXNLAY)THEN ITOPIC=TVCW; SCL_D=1; SCL_U=6; LEX=.FALSE.; IINV=0 IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS))THEN IF(ASSOCIATED(TOPICS(ITOPIC)%STRESS(1)%FILES))THEN PRJILIST=ITOPIC; IF(PMANAGER_GETFNAMES(ILAY,ILAY,0,1,0).LE.0)RETURN CALL WINDOWOUTSTATUSBAR(4,'Reading '//TRIM(FNAMES(1)%FNAME)//' ...') IF(.NOT.PMANAGER_SAVEMF2005_MOD_READ(VCW(ILAY),ITOPIC,1,SCL_D,SCL_U,IINV,IPRT))RETURN LEX=.TRUE. ENDIF ENDIF IF(.NOT.LEX)THEN ENDIF ENDIF END SELECT ENDDO DEALLOCATE(FNAMES,PRJILIST) END SUBROUTINE PMANAGER_CALC_READ !###====================================================================== SUBROUTINE PMANAGER_CALC_PROCESS(ITYPE,IL1,IL2) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IL1,IL2,ITYPE INTEGER :: IROW,ICOL,ILAY REAL(KIND=DP_KIND) :: T1,T2,K1,K2,C1,C2,C3 !## read files DO ILAY=IL1,IL2 SELECT CASE (ITYPE) !## transmissivity CASE (1) DO IROW=1,TOP(IL1)%NROW; DO ICOL=1,TOP(IL1)%NCOL IF(TOP(ILAY)%X(ICOL,IROW).NE.TOP(ILAY)%NODATA.AND. & BOT(ILAY)%X(ICOL,IROW).NE.BOT(ILAY)%NODATA.AND. & KHV(ILAY)%X(ICOL,IROW).NE.KHV(ILAY)%NODATA)THEN KDW(ILAY)%X(ICOL,IROW)=KHV(ILAY)%X(ICOL,IROW)*(TOP(ILAY)%X(ICOL,IROW)-BOT(ILAY)%X(ICOL,IROW)) ELSE KDW(ILAY)%X(ICOL,IROW)=KDW(ILAY)%NODATA ENDIF ENDDO; ENDDO !## vertical resistance aquifer CASE (2) DO IROW=1,TOP(IL1)%NROW; DO ICOL=1,TOP(IL1)%NCOL IF(TOP(ILAY )%X(ICOL,IROW).NE.TOP(ILAY )%NODATA.AND. & BOT(ILAY )%X(ICOL,IROW).NE.BOT(ILAY )%NODATA.AND. & KVA(ILAY )%X(ICOL,IROW).NE.KVA(ILAY )%NODATA.AND. & KHV(ILAY )%X(ICOL,IROW).NE.KHV(ILAY )%NODATA)THEN T1=TOP(ILAY )%X(ICOL,IROW)-BOT(ILAY )%X(ICOL,IROW) K1=KHV(ILAY )%X(ICOL,IROW)/KVA(ILAY )%X(ICOL,IROW) C1=0.0D0; IF(K1.GT.0.0D0)C1=T1/K1 VCW(ILAY)%X(ICOL,IROW)=C1 ELSE VCW(ILAY)%X(ICOL,IROW)=VCW(ILAY)%NODATA ENDIF ENDDO; ENDDO !## vertical resistance aquitard CASE (3) IF(ILAY.LT.IL2)THEN DO IROW=1,TOP(IL1)%NROW; DO ICOL=1,TOP(IL1)%NCOL IF(BOT(ILAY )%X(ICOL,IROW).NE.BOT(ILAY )%NODATA.AND. & TOP(ILAY+1)%X(ICOL,IROW).NE.TOP(ILAY+1)%NODATA.AND. & KVV(ILAY )%X(ICOL,IROW).NE.KVV(ILAY )%NODATA)THEN IF(KVV(ILAY)%X(ICOL,IROW).GT.0.0D0)THEN VCW(ILAY)%X(ICOL,IROW)=(BOT(ILAY)%X(ICOL,IROW)-TOP(ILAY+1)%X(ICOL,IROW))/KVV(ILAY)%X(ICOL,IROW) ELSE VCW(ILAY)%X(ICOL,IROW)=0.0D0 ENDIF ELSE VCW(ILAY)%X(ICOL,IROW)=VCW(ILAY)%NODATA ENDIF ENDDO; ENDDO ENDIF !## total vertical resistance CASE (4) IF(ILAY.LT.IL2)THEN DO IROW=1,TOP(IL1)%NROW; DO ICOL=1,TOP(IL1)%NCOL IF(TOP(ILAY )%X(ICOL,IROW).NE.TOP(ILAY )%NODATA.AND. & BOT(ILAY )%X(ICOL,IROW).NE.BOT(ILAY )%NODATA.AND. & TOP(ILAY+1)%X(ICOL,IROW).NE.TOP(ILAY+1)%NODATA.AND. & BOT(ILAY+1)%X(ICOL,IROW).NE.BOT(ILAY+1)%NODATA.AND. & KHV(ILAY )%X(ICOL,IROW).NE.KHV(ILAY )%NODATA.AND. & KHV(ILAY+1)%X(ICOL,IROW).NE.KHV(ILAY+1)%NODATA.AND. & KVA(ILAY )%X(ICOL,IROW).NE.KVA(ILAY )%NODATA.AND. & KVA(ILAY+1)%X(ICOL,IROW).NE.KVA(ILAY+1)%NODATA.AND. & KVV(ILAY )%X(ICOL,IROW).NE.KVV(ILAY )%NODATA)THEN T1=TOP(ILAY )%X(ICOL,IROW)-BOT(ILAY )%X(ICOL,IROW) T2=TOP(ILAY+1)%X(ICOL,IROW)-BOT(ILAY+1)%X(ICOL,IROW) K1=KHV(ILAY )%X(ICOL,IROW)/KVA(ILAY )%X(ICOL,IROW) K2=KHV(ILAY+1)%X(ICOL,IROW)/KVA(ILAY+1)%X(ICOL,IROW) C1=0.0D0; IF(K1.GT.0.0D0)C1=0.5D0*T1/K1 C2=0.0D0; IF(K2.GT.0.0D0)C2=0.5D0*T2/K2 C3=0.0D0; IF(KVV(ILAY)%X(ICOL,IROW).GT.0.0D0)C3=(BOT(ILAY)%X(ICOL,IROW)-TOP(ILAY+1)%X(ICOL,IROW))/KVV(ILAY)%X(ICOL,IROW) VCW(ILAY)%X(ICOL,IROW)=C1+C2+C3 ELSE VCW(ILAY)%X(ICOL,IROW)=VCW(ILAY)%NODATA ENDIF ENDDO; ENDDO ENDIF !## thickness of aquifer CASE (5) DO IROW=1,TOP(IL1)%NROW; DO ICOL=1,TOP(IL1)%NCOL IF(TOP(ILAY)%X(ICOL,IROW).NE.TOP(ILAY)%NODATA.AND. & BOT(ILAY)%X(ICOL,IROW).NE.BOT(ILAY)%NODATA)THEN KDW(ILAY)%X(ICOL,IROW)=TOP(ILAY)%X(ICOL,IROW)-BOT(ILAY)%X(ICOL,IROW) ELSE KDW(ILAY)%X(ICOL,IROW)=KDW(ILAY)%NODATA ENDIF ENDDO; ENDDO !## thickness of aquitard CASE (6) IF(ILAY.LT.IL2)THEN DO IROW=1,TOP(IL1)%NROW; DO ICOL=1,TOP(IL1)%NCOL IF(BOT(ILAY )%X(ICOL,IROW).NE.BOT(ILAY )%NODATA.AND. & TOP(ILAY+1)%X(ICOL,IROW).NE.TOP(ILAY+1)%NODATA)THEN VCW(ILAY)%X(ICOL,IROW)=BOT(ILAY)%X(ICOL,IROW)-TOP(ILAY+1)%X(ICOL,IROW) ELSE VCW(ILAY)%X(ICOL,IROW)=VCW(ILAY)%NODATA ENDIF ENDDO; ENDDO ENDIF !## permeability CASE (7) DO IROW=1,TOP(IL1)%NROW; DO ICOL=1,TOP(IL1)%NCOL IF(TOP(ILAY)%X(ICOL,IROW).NE.TOP(ILAY)%NODATA.AND. & BOT(ILAY)%X(ICOL,IROW).NE.BOT(ILAY)%NODATA.AND. & KDW(ILAY)%X(ICOL,IROW).NE.KDW(ILAY)%NODATA)THEN IF(TOP(ILAY)%X(ICOL,IROW)-BOT(ILAY)%X(ICOL,IROW).GT.0.0D0)THEN KHV(ILAY)%X(ICOL,IROW)=KDW(ILAY)%X(ICOL,IROW)/(TOP(ILAY)%X(ICOL,IROW)-BOT(ILAY)%X(ICOL,IROW)) ELSE KHV(ILAY)%X(ICOL,IROW)=0.0D0 ENDIF ELSE KHV(ILAY)%X(ICOL,IROW)=KHV(ILAY)%NODATA ENDIF ENDDO; ENDDO !## vertical permeability CASE (8) IF(ILAY.LT.IL2)THEN DO IROW=1,TOP(IL1)%NROW; DO ICOL=1,TOP(IL1)%NCOL IF(BOT(ILAY )%X(ICOL,IROW).NE.BOT(ILAY )%NODATA.AND. & TOP(ILAY+1)%X(ICOL,IROW).NE.TOP(ILAY+1)%NODATA.AND. & VCW(ILAY )%X(ICOL,IROW).NE.VCW(ILAY )%NODATA)THEN IF(VCW(ILAY)%X(ICOL,IROW).GT.0.0D0)THEN KVV(ILAY)%X(ICOL,IROW)=(BOT(ILAY)%X(ICOL,IROW)-TOP(ILAY+1)%X(ICOL,IROW))/VCW(ILAY)%X(ICOL,IROW) ELSE KVV(ILAY)%X(ICOL,IROW)=0.0D0 ENDIF ELSE KVV(ILAY)%X(ICOL,IROW)=KVV(ILAY)%NODATA ENDIF ENDDO; ENDDO ENDIF END SELECT ENDDO END SUBROUTINE PMANAGER_CALC_PROCESS !###====================================================================== SUBROUTINE PMANAGER_CALC_SAVE(ITYPE,IL1,IL2) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IL1,IL2,ITYPE INTEGER :: ILAY !## read files DO ILAY=IL1,IL2 SELECT CASE (ITYPE) CASE (1) KDW(ILAY)%FNAME=TRIM(PREFVAL(1))//'\TMP\KDW_L'//TRIM(ITOS(ILAY))//'.IDF' CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(KDW(ILAY)%FNAME)//' ...') IF(.NOT.IDFWRITE(KDW(ILAY),KDW(ILAY)%FNAME,1))RETURN CASE (2) VCW(ILAY)%FNAME=TRIM(PREFVAL(1))//'\TMP\VCW_AQF_L'//TRIM(ITOS(ILAY))//'.IDF' CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(VCW(ILAY)%FNAME)//' ...') IF(.NOT.IDFWRITE(VCW(ILAY),VCW(ILAY)%FNAME,1))RETURN CASE (3) IF(ILAY.LT.IL2)THEN VCW(ILAY)%FNAME=TRIM(PREFVAL(1))//'\TMP\VCW_AQT_L'//TRIM(ITOS(ILAY))//'.IDF' CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(VCW(ILAY)%FNAME)//' ...') IF(.NOT.IDFWRITE(VCW(ILAY),VCW(ILAY)%FNAME,1))RETURN ENDIF CASE (4) IF(ILAY.LT.IL2)THEN VCW(ILAY)%FNAME=TRIM(PREFVAL(1))//'\TMP\VCW_MDL_L'//TRIM(ITOS(ILAY))//'.IDF' CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(VCW(ILAY)%FNAME)//' ...') IF(.NOT.IDFWRITE(VCW(ILAY),VCW(ILAY)%FNAME,1))RETURN ENDIF CASE (5) KDW(ILAY)%FNAME=TRIM(PREFVAL(1))//'\TMP\THK_AQF_L'//TRIM(ITOS(ILAY))//'.IDF' CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(KDW(ILAY)%FNAME)//' ...') IF(.NOT.IDFWRITE(KDW(ILAY),KDW(ILAY)%FNAME,1))RETURN CASE (6) IF(ILAY.LT.IL2)THEN VCW(ILAY)%FNAME=TRIM(PREFVAL(1))//'\TMP\THK_AQT_L'//TRIM(ITOS(ILAY))//'.IDF' CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(VCW(ILAY)%FNAME)//' ...') IF(.NOT.IDFWRITE(VCW(ILAY),VCW(ILAY)%FNAME,1))RETURN ENDIF CASE (7) KHV(ILAY)%FNAME=TRIM(PREFVAL(1))//'\TMP\KHV_L'//TRIM(ITOS(ILAY))//'.IDF' CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(KHV(ILAY)%FNAME)//' ...') IF(.NOT.IDFWRITE(KHV(ILAY),KHV(ILAY)%FNAME,1))RETURN CASE (8) IF(ILAY.LT.PRJMXNLAY)THEN KVV(ILAY)%FNAME=TRIM(PREFVAL(1))//'\TMP\KVV_L'//TRIM(ITOS(ILAY))//'.IDF' CALL WINDOWOUTSTATUSBAR(4,'Writing '//TRIM(KVV(ILAY)%FNAME)//' ...') IF(.NOT.IDFWRITE(KVV(ILAY),KVV(ILAY)%FNAME,1))RETURN ENDIF END SELECT ENDDO !## read files DO ILAY=IL1,IL2 SELECT CASE (ITYPE) CASE (1,5) CALL MANAGER_UTL_ADDFILE(KDW(ILAY)%FNAME) CASE (2) CALL MANAGER_UTL_ADDFILE(VCW(ILAY)%FNAME) CASE (3,4,6) IF(ILAY.LT.IL2)CALL MANAGER_UTL_ADDFILE(VCW(ILAY)%FNAME) CASE (7) CALL MANAGER_UTL_ADDFILE(KHV(ILAY)%FNAME) CASE (8) IF(ILAY.LT.IL2)CALL MANAGER_UTL_ADDFILE(KVV(ILAY)%FNAME) END SELECT ENDDO CALL WINDOWOUTSTATUSBAR(4,'') END SUBROUTINE PMANAGER_CALC_SAVE !###====================================================================== SUBROUTINE PMANAGERFIELDS() !###====================================================================== IMPLICIT NONE INTEGER :: I,ID CALL WDIALOGSELECT(ID_DPMANAGER_TAB1) CALL WDIALOGUNDEFINED(IVALUE=-1); CALL UTL_DEBUGLEVEL(0) CALL WDIALOGGETTREEVIEW(ID_TREEVIEW1,ID); CALL UTL_DEBUGLEVEL(1) !## nothing selected IF(ID.EQ.-1)ID=0; ID=MAX(ID,0); I=1; IF(ID.EQ.0)I=0 CALL WDIALOGFIELDSTATE(ID_DRAW,I) CALL WDIALOGFIELDSTATE(ID_PROPERTIES,I) CALL WDIALOGFIELDSTATE(ID_PROPERTIES_AUTO,I) END SUBROUTINE PMANAGERFIELDS !###====================================================================== SUBROUTINE PMANAGER_UTL_UPDATE_TREEVIEW(IDITOPIC,IDIPER,IDISUBS) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IDITOPIC,IDIPER,IDISUBS INTEGER :: IPER,I,II,J,K,N,IDTOPIC,IDSUBTC,IFILES,NF,MF,JD,IMF CHARACTER(LEN=256) :: STRING,CNAME,XSTRING CHARACTER(LEN=4) :: EXT I=INFOERROR(1) JD=0 CALL PMANAGER_ALLOCATE() !## get model configuration CALL WDIALOGSELECT(ID_DPMANAGER_TAB2); CALL WDIALOGGETMENU(IDF_MENU1,IMF) I=SIZE(MC(IMF)%IACT); CALL WGRIDGETCHECKBOX(IDF_GRID1,2,MC(IMF)%IACT,I) CALL WDIALOGGETMENUSTRING(IDF_MENU1,IMF,STRING) CALL WDIALOGSELECT(ID_DPMANAGER_TAB1); CALL WDIALOGCLEARFIELD(ID_TREEVIEW1) CALL WDIALOGTREEVIEWCHECK(0) CALL WDIALOGTITLE('TreeView '//TRIM(MC(IMF)%MCNAME)) IDTOPIC=1000-1; IDSUBTC=2000-1; TOPICS%ID=0 II=0; IFILES=0; DO I=1,SIZE(TOPICS) IF(IMF.GT.0)THEN DO J=1,SIZE(MC(IMF)%T); IF(MC(IMF)%T(J).EQ.I.AND.MC(IMF)%IACT(J).EQ.1)EXIT; ENDDO IF(J.GT.SIZE(MC(IMF)%T))CYCLE ENDIF IDTOPIC =IDTOPIC+1 TOPICS(I)%ID=IDTOPIC !## create main topics CALL WDIALOGINSERTTREEVIEWITEM(ID_TREEVIEW1,TOPICS(MAX(1,II))%ID,INSERTAFTER, & TOPICS(I)%ID,TRIM(TOPICS(I)%TNAME)) !## save previous inserted treeview item II=I !## stress periods available N=0; IF(ASSOCIATED(TOPICS(I)%STRESS))N=SIZE(TOPICS(I)%STRESS) IF(N.GT.0)THEN !## create timestamps DO IPER=1,SIZE(TOPICS(I)%STRESS) NF=0; MF=0 IF(ASSOCIATED(TOPICS(I)%STRESS(IPER)%FILES))THEN NF=SIZE(TOPICS(I)%STRESS(IPER)%FILES,1); MF=SIZE(TOPICS(I)%STRESS(IPER)%FILES,2) ENDIF !## create timestamp - only whenever files are active IF(TOPICS(I)%TIMDEP.AND.NF.GT.0)THEN IDSUBTC =IDSUBTC+1 TOPICS(I)%IDT(IPER)=IDSUBTC IF(TOPICS(I)%STRESS(IPER)%IYR+TOPICS(I)%STRESS(IPER)%IMH+TOPICS(I)%STRESS(IPER)%IDY+ & TOPICS(I)%STRESS(IPER)%IHR+TOPICS(I)%STRESS(IPER)%IMT+TOPICS(I)%STRESS(IPER)%ISC.GT.0)THEN WRITE(STRING,'(I4.4,5(A1,I2.2))') TOPICS(I)%STRESS(IPER)%IYR,'-', & TOPICS(I)%STRESS(IPER)%IMH,'-', & TOPICS(I)%STRESS(IPER)%IDY,' ', & TOPICS(I)%STRESS(IPER)%IHR,':', & TOPICS(I)%STRESS(IPER)%IMT,':', & TOPICS(I)%STRESS(IPER)%ISC ELSE STRING=TRIM(TOPICS(I)%STRESS(IPER)%CDATE) ENDIF CALL WDIALOGINSERTTREEVIEWITEM(ID_TREEVIEW1,TOPICS(I)%ID,INSERTCHILD, & TOPICS(I)%IDT(IPER),TRIM(STRING)) ELSE TOPICS(I)%IDT(IPER)=TOPICS(I)%ID ENDIF !## create subtopics names - only whenever files are active IF(TOPICS(I)%NSUBTOPICS.GT.1.AND.NF.GT.0)THEN DO J=1,TOPICS(I)%NSUBTOPICS IDSUBTC =IDSUBTC+1 TOPICS(I)%ISD(IPER,J)=IDSUBTC CALL WDIALOGINSERTTREEVIEWITEM(ID_TREEVIEW1,TOPICS(I)%IDT(IPER),INSERTCHILD, & TOPICS(I)%ISD(IPER,J),TRIM(TOPICS(I)%SNAME(J))) END DO ELSE TOPICS(I)%ISD(IPER,1)=TOPICS(I)%IDT(IPER) ENDIF DO J=1,NF !## number of periods (types) DO K=1,MF !## number of files (systems) !## add tooltips IDSUBTC=IDSUBTC+1 IFILES=IFILES+1 TOPICS(I)%STRESS(IPER)%FILES(J,K)%ID=IDSUBTC STRING='' IF(TOPICS(I)%STRESS(IPER)%FILES(J,K)%IACT.EQ.0)THEN STRING='* inactive *;' ENDIF !## pst, gcg, rct and VDF are special cases SELECT CASE (I) !## pst-settings CASE (TPST) IF(ASSOCIATED(PEST%MEASURES))THEN; STRING='nmeasures='//TRIM(ITOS(SIZE(PEST%MEASURES))) ELSE; STRING=TRIM(STRING)//'nmeasures=0'; ENDIF IF(ASSOCIATED(PEST%PARAM))THEN; STRING=TRIM(STRING)//';nparam='//TRIM(ITOS(SIZE(PEST%PARAM))) ELSE; STRING=TRIM(STRING)//';nparam=0'; ENDIF IF(ASSOCIATED(PEST%S_PERIOD))THEN; STRING=TRIM(STRING)//';nperiods='//TRIM(ITOS(SIZE(PEST%S_PERIOD))) ELSE; STRING=TRIM(STRING)//';nperiods=0'; ENDIF IF(ASSOCIATED(PEST%B_FRACTION))THEN; STRING=TRIM(STRING)//';nbatchfiles='//TRIM(ITOS(SIZE(PEST%B_FRACTION))) ELSE; STRING=TRIM(STRING)//';nbatchfiles=0'; ENDIF IF(ASSOCIATED(PEST%IDFFILES))THEN; STRING=TRIM(STRING)//';nzones='//TRIM(ITOS(SIZE(PEST%IDFFILES))) ELSE; STRING=TRIM(STRING)//';nzones=0'; ENDIF CASE (TIES) ! IF(ASSOCIATED(PEST%MEASURES))THEN; STRING=TRIM(STRING)//'nmeasures='//TRIM(ITOS(SIZE(PEST%MEASURES))) ! ELSE; STRING=TRIM(STRING)//'nmeasures=0'; ENDIF ! IF(ASSOCIATED(PEST%PARAM))THEN; STRING=TRIM(STRING)//';nparam='//TRIM(ITOS(SIZE(PEST%PARAM))) ! ELSE; STRING=TRIM(STRING)//';nparam=0'; ENDIF ! IF(ASSOCIATED(PEST%S_PERIOD))THEN; STRING=TRIM(STRING)//';nperiods='//TRIM(ITOS(SIZE(PEST%S_PERIOD))) ! ELSE; STRING=TRIM(STRING)//';nperiods=0'; ENDIF ! IF(ASSOCIATED(PEST%B_FRACTION))THEN; STRING=TRIM(STRING)//';nbatchfiles='//TRIM(ITOS(SIZE(PEST%B_FRACTION))) ! ELSE; STRING=TRIM(STRING)//';nbatchfiles=0'; ENDIF ! IF(ASSOCIATED(PEST%IDFFILES))THEN; STRING=TRIM(STRING)//';nzones='//TRIM(ITOS(SIZE(PEST%IDFFILES))) ! ELSE; STRING=TRIM(STRING)//';nzones=0'; ENDIF !## pcg-settings CASE (TPCG) STRING=TRIM(STRING)//'outer='//TRIM(ITOS(PCG%NOUTER))//';inner='// & TRIM(ITOS(PCG%NINNER))//';hclose='//TRIM(RTOS(PCG%HCLOSE,'G',5))// & ';rclose='//TRIM(RTOS(PCG%RCLOSE,'G',5)) !## gcg-settings CASE (TGCG) STRING=TRIM(STRING)//'mxiter='//TRIM(ITOS(WQ%GCG%MXITER))//';iter1='//TRIM(ITOS(WQ%GCG%ITER1))// & ';cclose='//TRIM(RTOS(WQ%GCG%CCLOSE,'G',5))//';isolve='//TRIM(ITOS(WQ%GCG%ISOLVE)) !## rct-settings CASE (TRCT) STRING=TRIM(STRING)//'isothm='//TRIM(ISOTHM_STR(WQ%RCT%ISOTHM))//';igetsc='//TRIM(ITOS(WQ%RCT%IGETSC)) IF(WQ%RCT%IREACT.EQ.1)THEN ; STRING=TRIM(STRING)//';ireact= no kinetic rate reaction is simulated' ; ELSE STRING=TRIM(STRING)//';ireact= first-order irreversible reaction' ; ENDIF !## vdf-settings CASE (TVDF) STRING=TRIM(STRING)//'densemin='//TRIM(RTOS(WQ%VDF%DENSEMIN,'G',5)) STRING=TRIM(STRING)//'densemax='//TRIM(RTOS(WQ%VDF%DENSEMAX,'G',5)) STRING=TRIM(STRING)//'denseref='//TRIM(RTOS(WQ%VDF%DENSEREF,'G',5)) STRING=TRIM(STRING)//'denseslp='//TRIM(RTOS(WQ%VDF%DENSESLP,'G',5)) CASE DEFAULT STRING=TRIM(STRING)//'ilay='//TRIM(ITOS(TOPICS(I)%STRESS(IPER)%FILES(J,K)%ILAY)) IF(TOPICS(I)%STRESS(IPER)%FILES(J,K)%ICNST.EQ.1)THEN WRITE(XSTRING,UTL_GETFORMAT(TOPICS(I)%STRESS(IPER)%FILES(J,K)%CNST)) TOPICS(I)%STRESS(IPER)%FILES(J,K)%CNST STRING=TRIM(STRING)//';cnst='//TRIM(XSTRING) ELSEIF(TOPICS(I)%STRESS(IPER)%FILES(J,K)%ICNST.EQ.2)THEN CNAME=TOPICS(I)%STRESS(IPER)%FILES(J,K)%ALIAS EXT=UTL_CAP(CNAME(INDEX(CNAME,'.',.TRUE.)+1:),'L') STRING=TRIM(STRING)//';'//CHAR(13)//TRIM(EXT)//'='//TRIM(CNAME) ENDIF WRITE(XSTRING,UTL_GETFORMAT(TOPICS(I)%STRESS(IPER)%FILES(J,K)%FCT)) TOPICS(I)%STRESS(IPER)%FILES(J,K)%FCT STRING=TRIM(STRING)//';fct='//TRIM(XSTRING) WRITE(XSTRING,UTL_GETFORMAT(TOPICS(I)%STRESS(IPER)%FILES(J,K)%IMP)) TOPICS(I)%STRESS(IPER)%FILES(J,K)%IMP STRING=TRIM(STRING)//';imp='//TRIM(XSTRING) END SELECT CALL WDIALOGINSERTTREEVIEWITEM(ID_TREEVIEW1,TOPICS(I)%ISD(IPER,J),INSERTCHILD, & TOPICS(I)%STRESS(IPER)%FILES(J,K)%ID,TRIM(STRING)) !## select file of first type IF(J.EQ.1.AND.IDITOPIC.EQ.I.AND.IDIPER.EQ.IPER.AND.IDISUBS.EQ.K)THEN JD=TOPICS(I)%STRESS(IPER)%FILES(J,K)%ID ENDIF END DO END DO ENDDO ENDIF END DO CALL WDIALOGTREEVIEWCHECK(1) ! !## expand the last selected id of filename ! IF(IDITOPIC.NE.0.AND.IDIPER.NE.0.AND.IDISUBS.NE.0)THEN ! CALL WDIALOGSETTREEVIEWSTATE(IDF_TREEVIEW1,TOPICS(I)%ID,BranchCollapsed) ! CALL WDIALOGPUTTREEVIEW(ID_TREEVIEW1,TOPICS(IDITOPIC)%ISD(IDIPER,IDISUBS)) !,BRANCHEXPANDED) ! ELSEIF(IDITOPIC.NE.0.AND.IDIPER.NE.0)THEN ! CALL WDIALOGPUTTREEVIEW(ID_TREEVIEW1,TOPICS(IDITOPIC)%IDT(IDIPER)) !,BRANCHEXPANDED) ! ELSEIF(IDITOPIC.NE.0)THEN ! CALL WDIALOGPUTTREEVIEW(ID_TREEVIEW1,TOPICS(IDITOPIC)%ID) !,BranchCollapsed) ! ENDIF !## select appropriate id's IF(JD.NE.0)CALL WDIALOGPUTTREEVIEW(ID_TREEVIEW1,JD) I=INFOERROR(1) END SUBROUTINE PMANAGER_UTL_UPDATE_TREEVIEW END MODULE