!! Copyright (C) Stichting Deltares, 2005-2018. !! !! 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_IDFPLOT USE MODPLOT USE DATEVAR 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 SELECT CASE (ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE1) CASE (ID_TREEVIEW1) CALL PMANAGERFIELDS() END SELECT CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_CLEAN) CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to refresh the Project Manager?','Question') IF(WINFODIALOG(4).EQ.1)THEN DO I=1,SIZE(TOPICS); CALL PMANAGER_DEALLOCATE(I); ENDDO; CALL PMANAGER_DEALLOCATE_PEST() CALL PMANAGER_UTL_UPDATE(0,0,0) ENDIF CASE (ID_DRAW) CALL PMANAGERDRAW() CASE (ID_DRAW2) CALL PMANAGERDRAW_PLUS() CASE (ID_PROPERTIES_AUTO) CALL PMANAGEROPEN_AUTOMATIC() CASE (ID_PROPERTIES) CALL PMANAGEROPEN() CASE (ID_OPENRUN,ID_SAVERUN) IF(PMANAGERRUN(MESSAGE%VALUE1,'',0))THEN; ENDIF CASE (ID_OPEN,ID_SAVE) IF(PMANAGERPRJ(MESSAGE%VALUE1,'',0,1))THEN; ENDIF CASE (ID_DELETE) CALL PMANAGER_DELETE() CASE (ID_CALC) CALL PMANAGER_CALC() CASE (IDCANCEL) CALL PMANAGER_UTL_CLOSE() CASE (IDHELP) CALL UTL_GETHELP('3.3.6','VMO.iMODProjMan') END SELECT END SELECT END SUBROUTINE PMANAGERMAIN !###====================================================================== SUBROUTINE PMANAGEROPEN() !###====================================================================== IMPLICIT NONE INTEGER :: I,J,N,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 CHARACTER(LEN=MAXLENPRJ) :: CD CHARACTER(LEN=256),POINTER,DIMENSION(:) :: INPLIST CALL WDIALOGSELECT(ID_DPMANAGER); 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 IF(ITOPIC.EQ.20.OR.ITOPIC.EQ.33)THEN !## pst=settings IF(ITOPIC.EQ.20)CALL PMANAGEROPEN_PEST() !## pcg-settings IF(ITOPIC.EQ.33)CALL PMANAGEROPEN_PCG() 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(ITOPIC,IPER,ISYS) RETURN ENDIF N=TOPICS(ITOPIC)%NSUBTOPICS; 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 PRJ%ILAY =1 PRJ%FCT =1.0D0 PRJ%IMP =0.0D0 PRJ%CNST =-999.99D0 PRJ%ICNST=1 PRJ%FNAME='' PRJ%IACT =1 CALL IOSDATE(IYR,IMH,IDY); IHR=0; IMT=0; ISC=0 CALL WDIALOGFIELDSTATE(IDOK3,0) 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) LNEW=.FALSE. ENDIF IF(ITOPIC.EQ.1.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)) 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) IF(ITOPIC.EQ.1)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 CALL WDIALOGPUTIMAGE(ID_OPEN ,ID_ICONOPENIDF,1) 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 (24,26,30,31) 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) CALL WDIALOGPUTINTEGER(IDF_INTEGER1,PRJ(1)%ILAY) CALL WDIALOGPUTCHECKBOX(IDF_CHECK1 ,PRJ(1)%IACT) ! 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 WDIALOGSHOW(-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_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 WDIALOGGETINTEGER(IDF_INTEGER3,IYR) CALL WDIALOGGETMENU(IDF_MENU2,IMH) 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 (24,26,30,31) 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.1)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(ITOPIC,IPER,ISYS) ENDIF DEALLOCATE(MENUNAMES,PRJ) END SUBROUTINE PMANAGEROPEN !###====================================================================== 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 ! CHARACTER(LEN=256),POINTER,DIMENSION(:,:) :: FILES INTEGER(KIND=8) :: IDATE CALL WDIALOGSELECT(ID_DPMANAGER); 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 IF(ITOPIC.EQ.1.OR.ITOPIC.EQ.20.OR.ITOPIC.EQ.33)THEN RETURN ENDIF 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((/2,3,4,5,6,7,8,9,10,11,12/),NF); NF=MAX(1,NF) CALL WDIALOGPUTINTEGER(IDF_INTEGER12,NF) CALL WDIALOGRANGEINTEGER(IDF_INTEGER12,1,999) CALL WDIALOGSHOW(-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(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) 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 WDIALOGSHOW(-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 ! !## sort files - get them nicely lined up ! DO I=1,N ! IF(NF(I).GT.1)CALL WSORT(FILES(:,I),1,NF(I)) ! ENDDO !## 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 CHARACTER(LEN=256) :: FNAME LOGICAL :: LEX PMANAGERRUN=.FALSE. ILOGFILE=0 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) IF(PMANAGER_GETKEYS(IU)) THEN IF(PMANAGER_GETFILES(IU,ITOPIC))THEN IF(IBATCH.EQ.0)CALL PMANAGER_UTL_UPDATE(0,0,0); PMANAGERRUN=.TRUE. ELSE CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error reading BODY runfile '//TRIM(CMOD(ITOPIC)),'Error') ENDIF ELSE CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Error reading HEADER runfile','Error') ENDIF CLOSE(IU) IF(IBATCH.EQ.0)CALL UTL_MESSAGEHANDLE(1) ELSEIF(ID.EQ.ID_SAVERUN)THEN FNAME=RUNFNAME LEX=PMANAGER_INITSIM(FNAME,IBATCH,IRUN) CALL WDIALOGSELECT(ID_DPMANAGER_SIM); CALL WDIALOGUNLOAD() CALL WDIALOGSELECT(ID_DPMANAGERLAYERTYPES); CALL WDIALOGUNLOAD() IF(.NOT.LEX)THEN; IF(ASSOCIATED(SIM))DEALLOCATE(SIM); RETURN; ENDIF IF(IBATCH.EQ.0)CALL UTL_MESSAGEHANDLE(0) IF(PBMAN%IFORMAT.EQ.1)THEN IF(PMANAGER_SAVERUN(FNAME,IBATCH))THEN IF(IBATCH.EQ.0)THEN IF(IRUN.EQ.0)CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Successfully written runfile:'//CHAR(13)//TRIM(FNAME)//CHAR(13)//CHAR(13)// & 'Start the MODELTOOL to use this runfile for a simulation.','Information') ELSE WRITE(*,'(/A/)') 'Successfully written runfile:'//TRIM(FNAME) ENDIF PMANAGERRUN=.TRUE. ENDIF ELSEIF(PBMAN%IFORMAT.EQ.2.OR.PBMAN%IFORMAT.EQ.3)THEN IF(PMANAGER_SAVEMF2005(FNAME,IBATCH))THEN IF(IBATCH.EQ.0)THEN IF(IRUN.EQ.0)THEN IF(PBMAN%IFORMAT.EQ.2)CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Successfully written MF2005 files:'//CHAR(13)//TRIM(FNAME),'Information') IF(PBMAN%IFORMAT.EQ.3)CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Successfully written MF6 files:'//CHAR(13)//TRIM(FNAME),'Information') ENDIF ELSE IF(PBMAN%IFORMAT.EQ.2)WRITE(*,'(/A/)') 'Successfully written MF2005 files:'//TRIM(FNAME) IF(PBMAN%IFORMAT.EQ.3)WRITE(*,'(/A/)') 'Successfully written MF6 files:'//TRIM(FNAME) ENDIF PMANAGERRUN=.TRUE. ENDIF CALL PMANAGER_SAVEMF2005_DEALLOCATE() ENDIF CALL UTL_CLOSEUNITS() DEALLOCATE(SIM) IF(PBMAN%NSUBMODEL.EQ.PBMAN%ISUBMODEL)THEN IF(ABS(IRUN).EQ.1.AND.PMANAGERRUN)CALL PMANAGERSTART(FNAME,IRUN,IBATCH,1,ILOGFILE) ENDIF IF(IBATCH.EQ.0)CALL UTL_MESSAGEHANDLE(1) ENDIF END FUNCTION PMANAGERRUN !###====================================================================== SUBROUTINE PMANAGEROPEN_PCG() !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,DID !CHARACTER,ALLOCATABLE,DIMENSION(:) :: COPTS 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 WDIALOGSHOW(-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_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 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 WDIALOGPUTOPTION(IDF_MENU4,PEST%PE_SCALING) 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 WDIALOGSHOW(-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 (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 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) ENDIF CALL WDIALOGSELECT(ID_DPMANAGER_PEST) CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(DID) END SUBROUTINE PMANAGEROPEN_PEST !###====================================================================== 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) 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 WDIALOGSHOW(-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) 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%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%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) 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 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) 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 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 WDIALOGSHOW(-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 WDIALOGSHOW(-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 !###====================================================================== 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 !## get subitem CALL WDIALOGGETMENU(IDF_MENU1,IST) ICF=0; IF(INDEX(UTL_CAP(MENUNAMES(IST),'U'),'(IDF)').GT.0)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' 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 ! CALL WDIALOGGETCHECKBOX(IDF_CHECK2,II); II=ABS(II-1) II=1 ! J=J*II; L=L*II 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((/2,3,4,5,6,7,8,9,10,11,12/),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 WDIALOGSHOW(-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)=2; PRJILIST(2)=3 !## TOP1 - KDW1 - BOT1 - TOP2 - KDW2 - BOT2 ... CASE (2) ALLOCATE(FNAMES(NLAY*3),PRJILIST(3)) PRJILIST(1)=2; PRJILIST(2)=6; PRJILIST(3)=3 !## TOP1 - KDW1 - BOT1 - VCW1 - TOP2 - KDW1- BOT2 - VCW2 - TOP3 ... CASE (3) ALLOCATE(FNAMES(NLAY*4-1),PRJILIST(4)) PRJILIST(1)=2; PRJILIST(2)=6; PRJILIST(3)=3; PRJILIST(4)=9 !## TOP1 - BOT1 - VCW1 - TOP2 - BOT2 - VCW2 - TOP3 ... CASE(4) ALLOCATE(FNAMES(NLAY*3-1),PRJILIST(3)) PRJILIST(1)=2; PRJILIST(2)=3; PRJILIST(3)=9 !## TOP1 - SHD1 - BOT1 - TOP2 - SHD2 - BOT2 ... CASE (5) ALLOCATE(FNAMES(NLAY*3),PRJILIST(3)) PRJILIST(1)=2; PRJILIST(2)=5; PRJILIST(3)=3 !## TOP1 - KHV1 - BOT1 - TOP2 - KHV2 - BOT2 ... CASE (6) ALLOCATE(FNAMES(NLAY*3),PRJILIST(3)) PRJILIST(1)=2; PRJILIST(2)=7; PRJILIST(3)=3 !## TOP1 - BOT1 - KVV1 - TOP2 - BOT2 - KVV2 - TOP3 ... CASE(7) ALLOCATE(FNAMES(NLAY*3-1),PRJILIST(3)) PRJILIST(1)=2; PRJILIST(2)=3; PRJILIST(3)=10 !## TOP1 - KHV1 - BOT1 - KVV1 - TOP2 - KHV2 - BOT2 - KVV2 - TOP3 ... CASE (8) ALLOCATE(FNAMES(NLAY*4-1),PRJILIST(4)) PRJILIST(1)=2; PRJILIST(2)=7; PRJILIST(3)=3; PRJILIST(4)=10 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); 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(1)%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(1)%FILES(ISUBTOPIC,ISYS)%FNAME) ENDIF CALL IDFPLOTFAST(0) !peter 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 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(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 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 !## pst module is exception IF(I.EQ.20)THEN 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))RETURN CYCLE !## pcg module another exception ELSEIF(I.EQ.33)THEN 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 ENDIF 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:)) LINE=TRIM(LINE)//',['//TOPICS(I)%SNAME(1)(2:4) DO L=2,(TOPICS(I)%NSUBTOPICS) LINE=TRIM(LINE)//','//TOPICS(I)%SNAME(L)(2:4) ENDDO LINE=TRIM(LINE)//']' 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) !## systems(.) DO J=1,SIZE(TOPICS(I)%STRESS(L)%FILES,2) !## subtopics(.) WRITE(IU,'(1X,2(I1,A1),I4.3,3(A1,G15.7),A1,A)') & 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) 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 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 CHARACTER(LEN=MAXLENPRJ) :: CTOPIC PMANAGER_LOADPRJ=.FALSE. 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 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')EXIT !## pst module is exception IF(I.EQ.20)THEN CALL PMANAGER_LOADPST(IU,NPER,0) TOPICS(I)%IACT_MODEL=IACT; ALLOCATE(TOPICS(I)%STRESS(1)); ALLOCATE(TOPICS(I)%STRESS(1)%FILES(1,1)) CYCLE ELSEIF(I.EQ.33)THEN CALL PMANAGER_LOADPCG(IU,0) TOPICS(I)%IACT_MODEL=IACT; ALLOCATE(TOPICS(I)%STRESS(1)); ALLOCATE(TOPICS(I)%STRESS(1)%FILES(1,1)) CYCLE ENDIF 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.OR.NC.NE.TOPICS(I)%NSUBTOPICS)THEN IF(IBATCH.EQ.0)CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Number of parameters is not correct'//CHAR(13)//TRIM(TOPICS(I)%TNAME),'Error') IF(IBATCH.EQ.1)WRITE(*,'(/A/)') 'Number of parameters 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)) 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 only for MetaSWAP IF(I.EQ.1)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 I=0 DO DO READ(IU,'(A512)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT IF(TRIM(LINE).NE.'')EXIT ENDDO IF(IOS.NE.0)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 CLOSE(IU) PMANAGER_LOADPRJ=.TRUE. END FUNCTION PMANAGER_LOADPRJ !###====================================================================== SUBROUTINE PMANAGER_LOADPCG(IU,IOPTION) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IU,IOPTION INTEGER :: IOS !## prj file IF(IOPTION.EQ.0)THEN READ(IU,'(A256)') LINE READ(LINE,*,IOSTAT=IOS) PCG%NOUTER,PCG%NINNER,PCG%HCLOSE,PCG%RCLOSE,PCG%RELAX,PCG%NPCOND, & PCG%IPRPCG,PCG%MUTPCG,PCG%DAMPPCG,PCG%DAMPPCGT,PCG%IQERROR,PCG%QERROR IF(IOS.NE.0)THEN PCG%IQERROR=0; PCG%QERROR=0.0D0 READ(LINE,*,IOSTAT=IOS) PCG%NOUTER,PCG%NINNER,PCG%HCLOSE,PCG%RCLOSE,PCG%RELAX,PCG%NPCOND, & PCG%IPRPCG,PCG%MUTPCG,PCG%DAMPPCG,PCG%DAMPPCGT ENDIF !## run file ELSEIF(IOPTION.EQ.1)THEN !## mf2005 file ELSEIF(IOPTION.EQ.2)THEN ENDIF END SUBROUTINE PMANAGER_LOADPCG !###====================================================================== 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); 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(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=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.20)CALL PMANAGER_DEALLOCATE_PEST() !## update the project manager for changes - on topic level, other is not possible CALL PMANAGER_UTL_UPDATE(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=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(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((/2,3,4,5,6,7,8,9,10,11,12/),PRJMXNLAY) CALL WDIALOGPUTINTEGER(IDF_INTEGER1,1) CALL WDIALOGPUTINTEGER(IDF_INTEGER2,PRJMXNLAY) CALL WDIALOGSHOW(-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 !## fill sx/sy variable in idf IF(.NOT.IDFFILLSXSY(PRJIDF))RETURN ! ALLOCATE(BND(NLAY)); DO ILAY=1,SIZE(BND); CALL IDFNULLIFY(BND(ILAY)); ENDDO ! ALLOCATE(SHD(NLAY)); DO ILAY=1,SIZE(SHD); CALL IDFNULLIFY(SHD(ILAY)); ENDDO 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-1)); DO ILAY=IL1,IL2-1; 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-1)); DO ILAY=IL1,IL2-1; CALL IDFNULLIFY(KVV(ILAY)); ENDDO ALLOCATE(VCW(IL1:IL2-1)); DO ILAY=IL1,IL2-1; 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-1)); DO ILAY=IL1,IL2-1; 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,SIZE(VCW); 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-1; 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=2; 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=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(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=7; 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=6; 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=8; 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) ITOPIC=10; 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 CASE (8) ITOPIC=9; 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 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.IL2)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) 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(IDITOPIC,IDIPER,IDISUBS) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IDITOPIC,IDIPER,IDISUBS INTEGER :: IPER,I,J,K,N,IDTOPIC,IDSUBTC,IFILES,NF,MF,JD CHARACTER(LEN=256) :: STRING,CNAME CHARACTER(LEN=4) :: EXT I=INFOERROR(1) JD=0 CALL PMANAGER_ALLOCATE() CALL WDIALOGSELECT(ID_DPMANAGER); CALL WDIALOGCLEARFIELD(ID_TREEVIEW1) #if(defined(WINTERACTER11)) CALL WDIALOGTREEVIEWCHECK(0) #endif IDTOPIC=1000-1; IDSUBTC=2000-1 IFILES=0; DO I=1,SIZE(TOPICS) IDTOPIC =IDTOPIC+1 TOPICS(I)%ID=IDTOPIC !## create main topics CALL WDIALOGINSERTTREEVIEWITEM(ID_TREEVIEW1,TOPICS(MAX(1,I-1))%ID,INSERTAFTER, & TOPICS(I)%ID,TRIM(TOPICS(I)%TNAME)) !## 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) 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 is a special case IF(I.EQ.20)THEN 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 ELSEIF(I.EQ.33)THEN 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)) ELSE 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 STRING=TRIM(STRING)//';cnst='//TRIM(RTOS(TOPICS(I)%STRESS(IPER)%FILES(J,K)%CNST,'*',3)) 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 STRING=TRIM(STRING)//';fct='//TRIM(RTOS(TOPICS(I)%STRESS(IPER)%FILES(J,K)%FCT,'*',3)) STRING=TRIM(STRING)//';imp='//TRIM(RTOS(TOPICS(I)%STRESS(IPER)%FILES(J,K)%IMP,'*',3)) ENDIF 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 #if(defined(WINTERACTER11)) CALL WDIALOGTREEVIEWCHECK(1) #endif ! !## 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 END MODULE