!! Copyright (C) Stichting Deltares, 2005-2020. !! !! This file is part of iMOD. !! !! This program is free software: you can redistribute it and/or modify !! it under the terms of the GNU General Public License as published by !! the Free Software Foundation, either version 3 of the License, or !! (at your option) any later version. !! !! This program is distributed in the hope that it will be useful, !! but WITHOUT ANY WARRANTY; without even the implied warranty of !! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the !! GNU General Public License for more details. !! !! You should have received a copy of the GNU General Public License !! along with this program. If not, see . !! !! Contact: imod.support@deltares.nl !! Stichting Deltares !! P.O. Box 177 !! 2600 MH Delft, The Netherlands. !! MODULE MOD_IPEST_ANALYSER USE IMODVAR, ONLY : DP_KIND,SP_KIND USE MODPLOT, ONLY : MPW,MP,MXMPLOT USE MOD_PREF_PAR, ONLY : PREFVAL USE WINTERACTER USE MOD_COLOURS USE MOD_IPEST_PAR USE LSQ USE RESOURCE USE MOD_LEGEND, ONLY : LEG_MAIN,LEG_PREDEFINED_WRITELEG,LEG_READ USE MOD_UTL, ONLY : UTL_GETUNIT,UTL_GETUNIQUE_INT,ITOS,UTL_MESSAGEHANDLE,UTL_GOODNESS_OF_FIT,RTOS,UTL_GETMED,UTL_GETAXESCALES, & SXVALUE,SYVALUE,NSX,NSY,UTL_GETMED,UTL_STDEF,UTL_IDFGETCLASS,UTL_IDFCRDCOR,UTL_GETUNIQUE_DINT,UTL_GETUNIQUE_CHAR, & UTL_CAP,ITIMETOFTIME,UTL_IDATETOJDATE,UTL_NASH_SUTCLIFFE,UTL_DIALOGSHOW USE MOD_DBL USE MOD_GRAPH, ONLY : GRAPH_PLOTAXES,AXESOBJ,GRAPHUNITS,GRAPHAREA USE MOD_POLINT, ONLY : POL1LOCATE TYPE(AXESOBJ),PRIVATE :: AXES CONTAINS !###====================================================================== SUBROUTINE IPEST_ANALYSE_MAIN(ITYPE,MESSAGE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ITYPE TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE CHARACTER(LEN=256) :: DIR CALL WDIALOGSELECT(MESSAGE%WIN) SELECT CASE (ITYPE) CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_ZOOMIN,ID_ZOOMOUT,ID_ZOOMFULL,ID_ZOOMRECTANGLE,ID_ZOOMMOVE) CALL IPEST_ZOOMGRAPH(MESSAGE%VALUE1) CALL IPEST_ANALYSE_PLOTGRAPH(IDF_RADIO14) CASE (IDCANCEL) CALL IPEST_ANALYSE_CLOSE CASE (ID_OPEN) CALL UTL_MESSAGEHANDLE(0) DIR=''; CALL WSELECTDIR(DIRCHANGE,DIR,'Select Model Result Directory') IF(WINFODIALOG(4).EQ.1)THEN IF(IPEST_ANALYSE_READLOG(DIR))CALL IPEST_ANALYSE_PLOTGRAPH(0) ENDIF CALL UTL_MESSAGEHANDLE(1) ! CALL IPEST_ANALYSE_READLOG('d:\COMPILE\OSSDELTARES\iMOD\TUTORIALS\IMOD_USER\MODELS\TUT_PST_PPEST\IPEST') ! CALL IPEST_ANALYSE_READLOG('d:\IMOD-MODELS\A27\IMOD_USER\RESULTS\V48A_GW1\A27_NAM\pest') ! CALL IPEST_ANALYSE_READLOG('d:\COMPILE\OSSDELTARES\iMOD\TUTORIALS\IMOD_USER\MODELS\TUT_PST_OPTIMIZE\pest') ! CALL IPEST_ANALYSE_READLOG('d:\IMOD-MODELS\SWISS\CALIBRATION\pest') CASE (ID_LEGEND2) IF(LEG_MAIN(MXMPLOT))CALL IPEST_ANALYSE_PLOTGRAPH(IDF_PICTURE6) CASE (IDHELP) END SELECT CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_MENU1,IDF_RADIO1,IDF_RADIO2,IDF_RADIO3,IDF_RADIO4,IDF_RADIO5,IDF_RADIO7,IDF_RADIO8,IDF_RADIO9,IDF_RADIO10,IDF_CHECK1, & IDF_CHECK2,IDF_CHECK3,IDF_MENU2,IDF_MENU3,IDF_RADIO11,IDF_RADIO12,IDF_RADIO13,IDF_RADIO14,IDF_RADIO15,IDF_CHECK4,IDF_MENU4, & IDF_MENU5,IDF_RADIO16) IF(MESSAGE%VALUE1.EQ.MESSAGE%VALUE2)CALL IPEST_ANALYSE_PLOTGRAPH(MESSAGE%VALUE2) END SELECT CASE (RESIZE,EXPOSE) CALL IPEST_ANALYSE_PLOTGRAPH(0) END SELECT END SUBROUTINE IPEST_ANALYSE_MAIN !###====================================================================== SUBROUTINE IPEST_ZOOMGRAPH(IDZ) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IDZ REAL(KIND=DP_KIND),PARAMETER :: FZIN =0.90D0 REAL(KIND=DP_KIND),PARAMETER :: FZOUT=1.0D0/FZIN TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,IDOWN,IDCURSOR,IWIN_ID REAL(KIND=DP_KIND) :: FZ,XC1,YC1,XC2,YC2,XC3,YC3,DX,DY,F,MOUSEX,MOUSEY LOGICAL :: LEX IF(IDZ.EQ.ID_ZOOMIN)THEN FZ=FZIN ELSEIF(IDZ.EQ.ID_ZOOMOUT)THEN FZ=FZOUT ELSEIF(IDZ.EQ.ID_ZOOMMOVE)THEN IDCURSOR=ID_CURSORMOVE ELSEIF(IDZ.EQ.ID_ZOOMRECTANGLE)THEN IDCURSOR=ID_CURSORZOOMRECTANGLE FZ=FZIN ENDIF !## full map-view - selected idf's IF(IDZ.EQ.ID_ZOOMFULL)THEN IF(IPEST_ANALYSE_DIMGRAPH6(X1G6,Y1G6,X2G6,Y2G6))THEN; ENDIF !## interactive zooming ELSEIF(IDZ.EQ.ID_ZOOMIN.OR.IDZ.EQ.ID_ZOOMOUT)THEN DX=X2G6-X1G6; DY=Y2G6-Y1G6; DX=FZ*DX-DX; DY=FZ*DY-DY X1G6=X1G6-DX; X2G6=X2G6+DX; Y1G6=Y1G6-DY; Y2G6=Y2G6+DY ELSEIF(IDZ.EQ.ID_ZOOMMOVE)THEN IWIN_ID=ID_DIPESTANALYSE; CALL IGRSELECT(3,IDF_PICTURE6) CALL DBL_IGRUNITS(GRAPHUNITS(1,6),GRAPHUNITS(2,6),GRAPHUNITS(3,6),GRAPHUNITS(4,6)) IDOWN=0; XC1=0.0D0; YC1=0.0D0 DO CALL WMESSAGE(ITYPE,MESSAGE) IF(MESSAGE%WIN.NE.IWIN_ID)THEN IF(WINFOMOUSE(MOUSECURSOR).NE.CURHOURGLASS)CALL WCURSORSHAPE(CURHOURGLASS) ELSE IF(WINFOMOUSE(MOUSECURSOR).NE.IDCURSOR)CALL WCURSORSHAPE(IDCURSOR) SELECT CASE(ITYPE) CASE(MOUSEMOVE) MOUSEX=DBLE(MESSAGE%GX); MOUSEY=DBLE(MESSAGE%GY) !## first point set! IF(IDOWN.EQ.1)THEN DX=XC1-MOUSEX; DY=YC1-MOUSEY X1G6=X1G6+DX; X2G6=X2G6+DX Y1G6=Y1G6+DY; Y2G6=Y2G6+DY CALL IPEST_ANALYSE_PLOTGRAPH(IDF_RADIO14) CALL IGRSELECT(3,IDF_PICTURE6) CALL DBL_IGRUNITS(GRAPHUNITS(1,6),GRAPHUNITS(2,6),GRAPHUNITS(3,6),GRAPHUNITS(4,6)) XC1=MOUSEX; YC1=MOUSEY ENDIF !## mouse button released CASE (MOUSEBUTUP) SELECT CASE (MESSAGE%VALUE1) CASE (1) IDOWN=0 END SELECT !## mouse button pressed CASE (MOUSEBUTDOWN) SELECT CASE (MESSAGE%VALUE1) !## left button CASE (1) IF(IDOWN.EQ.0)THEN XC1=MOUSEX; YC1=MOUSEY; IDOWN=1 ENDIF !## right button CASE (3) EXIT END SELECT END SELECT ENDIF ENDDO CALL WCURSORSHAPE(CURARROW) !## interactive zooming ELSEIF(IDZ.EQ.ID_ZOOMRECTANGLE)THEN !## rectangle zoom CALL IGRPLOTMODE(MODEXOR); CALL IGRCOLOURN(WRGB(255,255,255)); CALL WCURSORSHAPE(IDCURSOR) CALL IGRFILLPATTERN(OUTLINE); CALL IGRLINETYPE(DASHED); CALL IGRLINEWIDTH(1) IWIN_ID=ID_DIPESTANALYSE; CALL IGRSELECT(3,IDF_PICTURE6) CALL DBL_IGRUNITS(GRAPHUNITS(1,6),GRAPHUNITS(2,6),GRAPHUNITS(3,6),GRAPHUNITS(4,6)) IDOWN=0; LEX=.FALSE.; XC1=0.0D0; YC1=0.0D0 DO CALL WMESSAGE(ITYPE,MESSAGE) IF(MESSAGE%WIN.NE.IWIN_ID)THEN IF(WINFOMOUSE(MOUSECURSOR).NE.CURHOURGLASS)CALL WCURSORSHAPE(CURHOURGLASS) ELSE IF(WINFOMOUSE(MOUSECURSOR).NE.IDCURSOR)CALL WCURSORSHAPE(IDCURSOR) SELECT CASE(ITYPE) CASE(MOUSEMOVE) MOUSEX=DBLE(MESSAGE%GX); MOUSEY=DBLE(MESSAGE%GY) XC2=MOUSEX; YC2=MOUSEY !## first point set! IF(IDOWN.EQ.1)THEN IF(LEX)CALL DBL_IGRRECTANGLE(XC1,YC1,XC3,YC3) LEX=.FALSE. IF(XC1.NE.XC2.AND.YC1.NE.YC2)LEX=.TRUE. IF(LEX)CALL DBL_IGRRECTANGLE(XC1,YC1,XC2,YC2) ENDIF XC3=XC2; YC3=YC2 !## mouse button pressed CASE (MOUSEBUTDOWN) SELECT CASE (MESSAGE%VALUE1) !## left button CASE (1) IF(IDOWN.EQ.0)THEN XC1=XC2; YC1=YC2; IDOWN=1 ELSE X1G6=MIN(XC1,XC2); X2G6=MAX(XC1,XC2) Y1G6=MIN(YC1,YC2); Y2G6=MAX(YC1,YC2) CALL IGRLINETYPE(SOLIDLINE) EXIT ENDIF !## right button CASE (3) IF(IDOWN.EQ.1)THEN IF(LEX)CALL DBL_IGRRECTANGLE(XC1,YC1,XC3,YC3) ENDIF EXIT END SELECT END SELECT ENDIF ENDDO CALL WCURSORSHAPE(CURARROW); CALL IGRPLOTMODE(MODECOPY); CALL IGRLINETYPE(SOLIDLINE) ENDIF !## make sure there is something to plot IF(X2G6-X1G6.LE.0.0D0)X2G6=X1G6+1.0D0 IF(Y2G6-Y1G6.LE.0.0D0)Y2G6=Y1G6+1.0D0 F=(X2G6-X1G6)*0.025D0; X1G6=X1G6-F; X2G6=X2G6+F F=(Y2G6-Y1G6)*0.025D0; Y1G6=Y1G6-F; Y2G6=Y2G6+F DX=WINFOGRREAL(GRAPHICSAREAMAXX)-WINFOGRREAL(GRAPHICSAREAMINX) DY=WINFOGRREAL(GRAPHICSAREAMAXY)-WINFOGRREAL(GRAPHICSAREAMINY) CALL UTL_IDFCRDCOR(X1G6,X2G6,Y1G6,Y2G6,DX,DY) END SUBROUTINE IPEST_ZOOMGRAPH !###====================================================================== LOGICAL FUNCTION IPEST_ANALYSE_READLOG(DIR) !###====================================================================== IMPLICIT NONE CHARACTER(LEN=*),INTENT(IN) :: DIR INTEGER :: I,J,IU,NI,NP,NU,IOS,N,M,IACT,ISS,NPER,NDIM,IDATE,ITIME CHARACTER(LEN=256) :: LINE INTEGER,DIMENSION(:),ALLOCATABLE :: IGROUP,SGROUP,IPS,ILS,IZN CHARACTER(LEN=15),DIMENSION(:),ALLOCATABLE :: ACRONYM CHARACTER(LEN=52) :: TXT CHARACTER(LEN=14) :: CDATE,ADDTXT1,ADDTXT2 CHARACTER(LEN=5),DIMENSION(:),ALLOCATABLE :: PTYPE CHARACTER(LEN=52),DIMENSION(:),ALLOCATABLE :: ITXT CHARACTER(LEN=15),DIMENSION(:),ALLOCATABLE :: LABELS_TMP INTEGER(KIND=DP_KIND),ALLOCATABLE,DIMENSION(:) :: TMP CHARACTER(LEN=32),DIMENSION(:),ALLOCATABLE :: CTMP REAL(KIND=DP_KIND),ALLOCATABLE,DIMENSION(:) :: X REAL(KIND=DP_KIND),DIMENSION(2) :: PERC REAL(KIND=DP_KIND) :: XMIN,YMIN,XMAX,YMAX,RDATE LOGICAL :: LEX IPEST_ANALYSE_READLOG=.FALSE. !## parrallel ipest or ipest regular ADDTXT1=''; ADDTXT2='' INQUIRE(FILE=TRIM(DIR)//'\log_pest_efficiency.txt',EXIST=LEX) IF(.NOT.LEX)THEN INQUIRE(FILE=TRIM(DIR)//'\log_pest_efficiency_mf2005.txt',EXIST=LEX) ADDTXT1='mf2005'; ADDTXT2='_mf2005' ENDIF IF(.NOT.LEX)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD cannot find appropriate iPEST files in the specified folder.','Error') RETURN ENDIF !## find number of iterations and parameters IU=UTL_GETUNIT(); OPEN(IU,FILE=TRIM(DIR)//'\log_pest_efficiency'//TRIM(ADDTXT2)//'.txt',STATUS='OLD',ACTION='READ') DO I=1,2; READ(IU,*,IOSTAT=IOS); IF(IOS.NE.0)THEN; CLOSE(IU); RETURN; ENDIF; ENDDO NI=0; DO; READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT; NI=NI+1; ENDDO CALL IPEST_ANALYSE_ALLOCATE(NI,0) REWIND(IU) DO I=1,2; READ(IU,*,IOSTAT=IOS); IF(IOS.NE.0)THEN; CLOSE(IU); RETURN; ENDIF; ENDDO DO I=1,NI; READ(IU,*,IOSTAT=IOS) IPEST(I)%J; IF(IOS.NE.0)EXIT; ENDDO CLOSE(IU) !## find number of parameters IU=UTL_GETUNIT(); OPEN(IU,FILE=TRIM(DIR)//'\log_pest'//TRIM(ADDTXT2)//'.txt',STATUS='OLD',ACTION='READ') !## find number of parameters DO I=1,2 NP=0 DO READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT IF(INDEX(TRIM(LINE),'Parameters').GT.0)THEN READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT DO READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT IF(TRIM(LINE).EQ.'')EXIT READ(LINE,'(I2)') IACT IF(IACT.EQ.1)THEN NP=NP+1 IF(I.EQ.2)THEN READ(LINE,'(I2,1X,A5,2(1X,I5),80X,I10,20X,A15)') IACT,PTYPE(NP),ILS(NP),IZN(NP),IGROUP(NP),ACRONYM(NP) !## no keyword given fill in with default IF(LEN_TRIM(ACRONYM(NP)).EQ.0)THEN PTYPE(NP)=ADJUSTL(PTYPE(NP)) WRITE(ACRONYM(NP),'(A2,2I5.5,I3.3)') PTYPE(NP),ILS(NP),IZN(NP),IGROUP(NP) ENDIF ENDIF ENDIF ENDDO EXIT ENDIF ENDDO IF(I.EQ.1)ALLOCATE(IGROUP(NP),ACRONYM(NP),SGROUP(NP),PTYPE(NP),ILS(NP),IZN(NP)) REWIND(IU) ENDDO IF(NP.GT.0)THEN !## get unique set of groups SGROUP=IGROUP; CALL UTL_GETUNIQUE_INT(SGROUP,NP,NU,-999) CALL IPEST_ANALYSE_ALLOCATE(0,NU) ALLOCATE(LABELS_TMP(NU),IPS(NU)) !## set new list of parameters DO I=1,NU PARAM(I)%IGROUP=SGROUP(I) !## look for correct acronym DO J=1,NP IF(PARAM(I)%IGROUP.EQ.IGROUP(J))THEN PARAM(I)%ACRONYM=ACRONYM(J); EXIT ENDIF ENDDO ENDDO DEALLOCATE(IGROUP,SGROUP,ACRONYM,PTYPE,ILS,IZN) NP=NU ENDIF DO READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT IF(INDEX(LINE,'Upgrade Vector Parameter History:').GT.0)THEN IF(LEN_TRIM(ADDTXT1).EQ.0)READ(IU,*) READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT !## how many iterations N=0; DO I=0,SIZE(IPEST) WRITE(TXT,'(A4,I3.3)') 'ITER',I IF(INDEX(LINE,TRIM(TXT)).GT.0)N=N+1 ENDDO !## make sure n does not exceed size(ipest) N=MIN(N,SIZE(IPEST)) DO I=1,SIZE(PARAM) READ(IU,'(4X,A15,99F10.0)') IPEST(1)%CPARAM(I),(IPEST(J)%ALPHA(I),J=N,1,-1) ENDDO ENDIF IF(INDEX(LINE,'Optimization History:').GT.0)THEN READ(IU,*) READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT !## how many iterations N=0; DO I=0,SIZE(IPEST) WRITE(TXT,'(A4,I3.3)') 'ITER',I IF(INDEX(LINE,TRIM(TXT)).GT.0)N=N+1 ENDDO !## make sure n does not exceed size(ipest) DO I=1,10; READ(IU,*); ENDDO N=MIN(N,SIZE(IPEST)) DO I=1,SIZE(PARAM) READ(IU,'(A15,99F15.0)') IPEST(1)%CPARAM(I),(IPEST(J)%ALPHA(I),J=N,1,-1) ENDDO ENDIF ENDDO REWIND(IU) !## continue reading NPER=1 DO READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT IF(INDEX(LINE,'*** Next Outer Iteration ***').GT.0)NPER=NPER+1 IF(INDEX(LINE,'*** Next Optimization Cycle').GT.0) NPER=NPER+1 IF(NPER.GT.SIZE(IPEST))EXIT IF(INDEX(LINE,'Best Residual Value').GT.0)THEN; READ(LINE,'(25X,F15.0)') IPEST(NPER)%RJ; CYCLE; ENDIF IF(INDEX(LINE,'Best Plausibility Value').GT.0)THEN; READ(LINE,'(25X,F15.0)') IPEST(NPER)%PJ; CYCLE; ENDIF IF(INDEX(LINE,'Total Objective Value').GT.0)THEN; READ(LINE,'(25X,F15.0)') IPEST(NPER)%J; CYCLE; ENDIF IF(INDEX(LINE,'Confidence Limits (96%):').GT.0)THEN READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT DO I=1,SIZE(PARAM) READ(IU,'(A256)') LINE READ(LINE,'(15X,F15.0,15X,F15.0)',IOSTAT=IOS) IPEST(NPER)%LOWER(I),IPEST(NPER)%UPPER(I) !## insensitive IF(IOS.NE.0)THEN IF(NPER.EQ.1)THEN IPEST(NPER)%LOWER(I)=0.0D0; IPEST(NPER)%UPPER(I)=0.0D0 ELSE IPEST(NPER)%LOWER(I)=IPEST(NPER-1)%LOWER(I); IPEST(NPER)%UPPER(I)=IPEST(NPER-1)%UPPER(I) ENDIF ENDIF ENDDO ENDIF IF(INDEX(LINE,'Confidence Limits ~96%)').GT.0)THEN DO I=1,2; READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT; ENDDO DO I=1,SIZE(PARAM) READ(IU,'(A256)') LINE READ(LINE,'(15X,F15.0,15X,F15.0)',IOSTAT=IOS) IPEST(NPER)%LOWER(I),IPEST(NPER)%UPPER(I) !## insensitive IF(IOS.NE.0)THEN IF(NPER.EQ.1)THEN IPEST(NPER)%LOWER(I)=0.0D0; IPEST(NPER)%UPPER(I)=0.0D0 ELSE IPEST(NPER)%LOWER(I)=IPEST(NPER-1)%LOWER(I); IPEST(NPER)%UPPER(I)=IPEST(NPER-1)%UPPER(I) ENDIF ENDIF ENDDO ENDIF IF(INDEX(LINE,'Determinant JQJ').GT.0)THEN READ(LINE,'(18X,F15.0)') IPEST(NPER)%DETERMINANT DO I=1,4; READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT; ENDDO DO I=1,SIZE(PARAM) READ(IU,'(A256)') LINE !## nothing read IF(TRIM(LINE).EQ.'')EXIT READ(LINE,'(10X,F15.0)',IOSTAT=IOS) IPEST(NPER)%EIGVALUES(I) ENDDO ENDIF IF(INDEX(LINE,'Parameter Correlation Matrix').GT.0)THEN READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT N=2; IF(TRIM(LINE).EQ.'')N=0 DO I=1,N; READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT; ENDDO !## read number of parameters READ(IU,'(15X,999A15)') (LABELS_TMP(I),I=1,SIZE(PARAM)) !## get active parameters for this iteration N=0; DO I=1,SIZE(PARAM) IF(TRIM(LABELS_TMP(I)).EQ.'')EXIT; N=N+1 DO J=1,SIZE(PARAM) IF(TRIM(ADJUSTL(LABELS_TMP(I))).EQ.TRIM(ADJUSTL(PARAM(J)%ACRONYM)))THEN IPS(I)=J; EXIT ENDIF ENDDO ENDDO DO I=1,N READ(IU,'(15X,999F15.0)',IOSTAT=IOS) (IPEST(NPER)%CORR(IPS(I),IPS(J)),J=1,N) ENDDO ENDIF ENDDO CLOSE(IU) !## find number of parameters IU=UTL_GETUNIT(); OPEN(IU,FILE=TRIM(DIR)//'\log_pest_sensitivity'//TRIM(ADDTXT2)//'.txt',STATUS='OLD',ACTION='READ') DO I=1,2; READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT; ENDDO DO READ(IU,'(I10,999F15.0)',IOSTAT=IOS) I,(IPEST(I)%SENSI(J),J=1,NP) IF(IOS.NE.0)EXIT IF(I.EQ.SIZE(IPEST))EXIT ENDDO CLOSE(IU) !## find residuals ISS=0 DO I=1,2 DO J=1,SIZE(IPEST) NP=0 IU=UTL_GETUNIT(); OPEN(IU,FILE=TRIM(DIR)//'\log_pest_residual_'//TRIM(ITOS(J-1))//TRIM(ADDTXT1)//'.txt',STATUS='OLD',ACTION='READ') !# read number of ipf files DO !K=1,2 READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT !## steady-state IF(INDEX(LINE,'ILAY, MSR, MDL,').GT.0)THEN; ISS=1; LSS=.TRUE.; EXIT; ENDIF !## transient IF(INDEX(LINE,'ILAY, WEIGH, MSR,').GT.0)THEN; ISS=2; LSS=.FALSE.; EXIT; ENDIF ENDDO IF(ISS.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONNO,'Cannot determine in the log_pest_residual_*.txt files'//CHAR(13)// & 'Whether they are configured for a steady or transient simulation','Error') ENDIF DO READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT NP=NP+1 IF(I.EQ.2)THEN IF(LSS)THEN READ(LINE,'(2(F15.0,1X),I10,1X,2(F15.0,1X),48X,F15.0,11X,A32)') IPEST(J)%MEASURE(NP)%X,IPEST(J)%MEASURE(NP)%Y,IPEST(J)%MEASURE(NP)%ILAY, & IPEST(J)%MEASURE(NP)%OBS,IPEST(J)%MEASURE(NP)%COM,IPEST(J)%MEASURE(NP)%W,IPEST(J)%MEASURE(NP)%FNAME IPEST(J)%MEASURE(NP)%IDATE=0; IPEST(J)%MEASURE(NP)%FNAME=ADJUSTL(UTL_CAP(IPEST(J)%MEASURE(NP)%FNAME,'U')) ELSE READ(LINE,'(2(F15.0,1X),I10,1X,3(F15.0,1X),5(16X),11X,A32,1X,I15)') IPEST(J)%MEASURE(NP)%X,IPEST(J)%MEASURE(NP)%Y,IPEST(J)%MEASURE(NP)%ILAY, & IPEST(J)%MEASURE(NP)%W,IPEST(J)%MEASURE(NP)%OBS,IPEST(J)%MEASURE(NP)%COM,IPEST(J)%MEASURE(NP)%FNAME,IPEST(J)%MEASURE(NP)%IDATE IPEST(J)%MEASURE(NP)%FNAME=ADJUSTL(UTL_CAP(IPEST(J)%MEASURE(NP)%FNAME,'U')) WRITE(CDATE,'(I14)') IPEST(J)%MEASURE(NP)%IDATE READ(CDATE,'(I8)',IOSTAT=IOS) IDATE; IF(IOS.NE.0)EXIT RDATE=DBLE(UTL_IDATETOJDATE(IDATE)) READ(CDATE,'(8X,I6)',IOSTAT=IOS) ITIME IF(IOS.EQ.0)RDATE=RDATE+ITIMETOFTIME(ITIME) IPEST(J)%MEASURE(NP)%RDATE=RDATE ENDIF ENDIF ENDDO CLOSE(IU) IF(I.EQ.1)THEN; IPEST(J)%NMEASURE=NP; ALLOCATE(IPEST(J)%MEASURE(NP)); ENDIF ENDDO ENDDO !## create histogram classes between 10-90 percent N=0; DO I=1,SIZE(IPEST); N=N+IPEST(I)%NMEASURE; ENDDO; ALLOCATE(X(N)); X=0.0D0 !## get an appropriate scale N=0; DO I=1,SIZE(IPEST) DO J=1,IPEST(I)%NMEASURE N=N+1; X(N)=ABS(IPEST(I)%MEASURE(J)%COM-IPEST(I)%MEASURE(J)%OBS) ENDDO ENDDO CALL UTL_GETMED(X,N,-999.0D0,(/10.0D0,90.0D0/),2,M,PERC) !## make classes XMIN=MINVAL(PERC); XMAX=MAXVAL(PERC) XMAX= MAX(ABS(XMIN),ABS(XMAX)) XMIN=-1.0D0*XMAX YMIN=XMIN; YMAX=XMAX CALL UTL_GETAXESCALES(XMIN,YMIN,XMAX,YMAX) DEALLOCATE(X) NDIM=NSX ALLOCATE(HCLASSES(NDIM),XCLASSES(NDIM-1)) DO I=1,NSX; HCLASSES(I)=SXVALUE(I); ENDDO !## only entries of first cycle needed M=1; N=0; DO I=1,M; N=N+IPEST(I)%NMEASURE; ENDDO; ALLOCATE(TMP(N),CTMP(N)) !## get unique layers N=0; DO I=1,M; DO J=1,IPEST(I)%NMEASURE; N=N+1; TMP(N)=IPEST(I)%MEASURE(J)%ILAY; ENDDO; ENDDO CALL UTL_GETUNIQUE_DINT(TMP,N,NU) ALLOCATE(CLAY(NU),ILAY(NU),LLAY(NU)); DO I=1,NU; WRITE(CLAY(I),'(I10)') TMP(I); LLAY(I)=TMP(I); ENDDO; ILAY=1 !## get unique periods N=0; DO I=1,M; DO J=1,IPEST(I)%NMEASURE; N=N+1; TMP(N)=IPEST(I)%MEASURE(J)%IDATE; ENDDO; ENDDO CALL UTL_GETUNIQUE_DINT(TMP,N,NU) ALLOCATE(CPERIOD(NU),IPERIOD(NU),LPERIOD(NU)); DO I=1,NU; WRITE(CPERIOD(I),'(I16)') TMP(I); LPERIOD(I)=TMP(I); ENDDO; IPERIOD=1 !## get unique measures N=0; DO I=1,M; DO J=1,IPEST(I)%NMEASURE; N=N+1; CTMP(N)=IPEST(I)%MEASURE(J)%FNAME; ENDDO; ENDDO CALL UTL_GETUNIQUE_CHAR(CTMP,N,NU) ALLOCATE(CFNAME(NU),IFNAME(NU)); DO I=1,NU; WRITE(CFNAME(I),'(A32)') CTMP(I); ENDDO; IFNAME=1 CALL WDIALOGPUTMENU(IDF_MENU2,CPERIOD,SIZE(CPERIOD),IPERIOD) CALL WDIALOGPUTMENU(IDF_MENU3,CLAY ,SIZE(CLAY) ,ILAY) CALL WDIALOGPUTMENU(IDF_MENU5,CFNAME ,SIZE(CFNAME) ,IFNAME) ALLOCATE(ITXT(SIZE(IPEST))) DO I=1,SIZE(IPEST) IF(I.EQ.1)THEN ITXT(I)='Initial' ELSE ITXT(I)='Cycle '//TRIM(ITOS(I-1)) ENDIF ENDDO CALL WDIALOGPUTMENU(IDF_MENU1,ITXT,SIZE(IPEST),1) IF(ALLOCATED(ITXT))DEALLOCATE(ITXT) IF(ALLOCATED(LABELS_TMP))DEALLOCATE(LABELS_TMP) IF(ALLOCATED(IPS))DEALLOCATE(IPS) IF(ALLOCATED(PARAM))THEN ALLOCATE(LPARAM(SIZE(PARAM))); LPARAM=1; CALL WDIALOGPUTMENU(IDF_MENU4,PARAM%ACRONYM,SIZE(PARAM),LPARAM) ENDIF !## fill in vector of references DO J=1,SIZE(IPEST) DO I=1,IPEST(J)%NMEASURE IPEST(J)%MEASURE(I)%ISEL=IPEST_ANALYSE_QUERY(IPEST(J)%MEASURE(I)%ILAY,IPEST(J)%MEASURE(I)%IDATE,IPEST(J)%MEASURE(I)%FNAME, & IPEST(J)%MEASURE(I)%SLAY,IPEST(J)%MEASURE(I)%SPER, IPEST(J)%MEASURE(I)%SFNM) ENDDO ENDDO IF(LSS)CALL WDIALOGFIELDSTATE(IDF_RADIO16,2) !## set graph6 dimensions IF(IPEST_ANALYSE_DIMGRAPH6(X1G6,Y1G6,X2G6,Y2G6))THEN; ENDIF IPEST_ANALYSE_READLOG=.TRUE. END FUNCTION IPEST_ANALYSE_READLOG !###====================================================================== SUBROUTINE IPEST_ANALYSE_INIT() !###====================================================================== IMPLICIT NONE INTEGER :: IOS CALL WINDOWSELECT(0); IF(WMENUGETSTATE(ID_IPESTANALYSER,2).EQ.1)THEN CALL IPEST_ANALYSE_CLOSE(); RETURN ENDIF IF(LEG_PREDEFINED_WRITELEG(4))CALL LEG_READ(MP(MXMPLOT)%LEG,TRIM(PREFVAL(1))//'\tmp\tmp.leg',IOS) CALL WINDOWSELECT(0); CALL WMENUSETSTATE(ID_IPESTANALYSER,2,1) !## fill in dialog CALL WDIALOGLOAD(ID_DIPESTANALYSE,ID_DIPESTANALYSE) CALL WDIALOGPUTIMAGE(ID_PROP1,ID_ICONPROPERTIES,1) CALL WDIALOGPUTIMAGE(ID_PROP2,ID_ICONPROPERTIES,1) CALL WDIALOGPUTIMAGE(ID_LEGEND1,ID_ICONLEGEND,1) CALL WDIALOGPUTIMAGE(ID_LEGEND2,ID_ICONLEGEND,1) CALL WDIALOGPUTIMAGE(ID_ZOOMIN,ID_ICONZOOMIN,1) CALL WDIALOGPUTIMAGE(ID_ZOOMOUT,ID_ICONZOOMOUT,1) CALL WDIALOGPUTIMAGE(ID_ZOOMFULL,ID_ICONZOOMFULL,1) CALL WDIALOGPUTIMAGE(ID_ZOOMRECTANGLE,ID_ICONZOOMBOX,1) CALL WDIALOGPUTIMAGE(ID_ZOOMMOVE,ID_ICONMOVE,1) CALL WDIALOGTOOLTIP(ID_PROP1,'Define the Properties') CALL UTL_DIALOGSHOW(-1,-1,0,2) END SUBROUTINE IPEST_ANALYSE_INIT !###==================================================================== SUBROUTINE IPEST_ANALYSE_PLOTGRAPH(ID) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID REAL(KIND=DP_KIND) :: YMIN,YMAX,XMIN,XMAX,DX,DY INTEGER :: I,IPOS,IPARAM CHARACTER(LEN=52) :: XTITLE,YTITLE INTEGER,DIMENSION(6) :: GID LOGICAL :: LDATE DATA GID/IDF_PICTURE1,IDF_PICTURE2,IDF_PICTURE3,IDF_PICTURE4,IDF_PICTURE5,IDF_PICTURE6/ CALL WDIALOGSELECT(ID_DIPESTANALYSE) CALL WDIALOGGETMENU(IDF_MENU2,IPERIOD) CALL WDIALOGGETMENU(IDF_MENU3,ILAY) IF(ALLOCATED(LPARAM))CALL WDIALOGGETMENU(IDF_MENU4,LPARAM) CALL WDIALOGGETMENU(IDF_MENU5,IFNAME) !## set appropriate set of files IF(ID.EQ.IDF_MENU1.OR.ID.EQ.IDF_MENU2.OR.ID.EQ.IDF_MENU3.OR.ID.EQ.IDF_MENU5)THEN CALL WDIALOGGETMENU(IDF_MENU1,IPOS) DO I=1,IPEST(IPOS)%NMEASURE IPEST(IPOS)%MEASURE(I)%ISEL=IPEST_ANALYSE_QUERY2(IPEST(IPOS)%MEASURE(I)%SLAY,IPEST(IPOS)%MEASURE(I)%SPER,IPEST(IPOS)%MEASURE(I)%SFNM) ENDDO ENDIF DO I=1,SIZE(GID) !## skip pictures IF(ID.NE.0)THEN SELECT CASE (ID) CASE (IDF_RADIO14,IDF_RADIO15,IDF_RADIO16) IF(I.NE.6)CYCLE CASE (IDF_MENU4) SELECT CASE (I) CASE (1,5,6); CYCLE END SELECT CASE (IDF_RADIO1,IDF_RADIO2,IDF_CHECK2) IF(I.NE.3)CYCLE CASE (IDF_RADIO3,IDF_RADIO4,IDF_CHECK1,IDF_CHECK3) IF(I.NE.2)CYCLE CASE (IDF_RADIO11,IDF_RADIO12,IDF_RADIO13,IDF_CHECK4) IF(I.NE.4)CYCLE CASE (IDF_MENU2,IDF_MENU3) IF(ID.EQ.IDF_RADIO5.OR.ID.EQ.IDF_RADIO7)THEN IF(I.NE.5)CYCLE ELSEIF(ID.EQ.IDF_PICTURE6)THEN IF(I.NE.6)CYCLE ENDIF CASE (IDF_RADIO8,IDF_RADIO9,IDF_RADIO10) IF(I.NE.1)CYCLE END SELECT ENDIF CALL IGRSELECT(3,GID(I)); CALL DBL_IGRAREA(0.0D0,0.0D0,1.0D0,1.0D0); CALL IGRAREACLEAR() CALL IGRFILLPATTERN(SOLID) IF((I.EQ.5.OR.I.EQ.6).AND.(SUM(IPERIOD).EQ.0.OR.SUM(ILAY).EQ.0))CYCLE XMIN= HUGE(1.0D0); YMIN=XMIN XMAX=-HUGE(1.0D0); YMAX=YMIN !## set dimensions LDATE=.FALSE. SELECT CASE (I) !## j CASE (1); CALL IPEST_ANALYSE_DIMGRAPH1(XMIN,YMIN,XMAX,YMAX,XTITLE,YTITLE) !## alpha CASE (2); IF(.NOT.ALLOCATED(LPARAM))CYCLE; CALL IPEST_ANALYSE_DIMGRAPH2(XMIN,YMIN,XMAX,YMAX,XTITLE,YTITLE) !## sensitivity CASE (3); IF(.NOT.ALLOCATED(LPARAM))CYCLE; CALL IPEST_ANALYSE_DIMGRAPH3(XMIN,YMIN,XMAX,YMAX,XTITLE,YTITLE) !## correlation CASE (4); IF(.NOT.ALLOCATED(LPARAM))CYCLE; CALL IPEST_ANALYSE_DIMGRAPH4(XMIN,YMIN,XMAX,YMAX,XTITLE,YTITLE) !## histogram/scatter CASE (5); IF(.NOT.IPEST_ANALYSE_DIMGRAPH5(XMIN,YMIN,XMAX,YMAX,XTITLE,YTITLE))CYCLE !## xy plot CASE (6) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO14,IPARAM) IF(IPARAM.EQ.3)THEN YTITLE='Altitude'; XTITLE='Date'; LDATE=.TRUE. ELSE YTITLE='Y-coordinate (m)'; XTITLE='X-coordinate (m)' ENDIF IF(.NOT.IPEST_ANALYSE_DIMGRAPH6(X1G6,Y1G6,X2G6,Y2G6))CYCLE XMIN=X1G6; YMIN=Y1G6; XMAX=X2G6; YMAX=Y2G6 CASE DEFAULT; CYCLE END SELECT DX=(XMAX-XMIN)/20.0D0; XMIN=XMIN-DX; XMAX=XMAX+DX DY=(YMAX-YMIN)/20.0D0; YMIN=YMIN-DY; YMAX=YMAX+DY !## set axes CALL IPEST_ANALYSE_PLOT_AXES(XMIN,YMIN,XMAX,YMAX,LDATE,XTITLE,YTITLE,I) !## plot figure SELECT CASE (I) CASE (1); CALL IPEST_ANALYSE_PLOTGRAPH1() CASE (2); CALL IPEST_ANALYSE_PLOTGRAPH2(YMIN,YMAX) CASE (3); CALL IPEST_ANALYSE_PLOTGRAPH3(YMIN,YMAX) CASE (4); CALL IPEST_ANALYSE_PLOTGRAPH4(YMIN,YMAX) CASE (5); CALL IPEST_ANALYSE_PLOTGRAPH5(XMIN,YMIN,XMAX,YMAX) CASE (6); CALL IPEST_ANALYSE_PLOTGRAPH6() END SELECT CALL IPEST_ANALLYSE_PLOTIPOS(I,XMIN,YMIN,YMAX) ENDDO CALL IGRSELECT(DRAWWIN,MPW%IWIN); CALL DBL_IGRAREA(0.0D0,0.0D0,1.0D0,1.0D0) CALL DBL_IGRUNITS(MPW%XMIN,MPW%YMIN,MPW%XMAX,MPW%YMAX,IOFFSET=1) END SUBROUTINE IPEST_ANALYSE_PLOTGRAPH !###==================================================================== SUBROUTINE IPEST_ANALYSE_DIMGRAPH1(XMIN,YMIN,XMAX,YMAX,XTITLE,YTITLE) !###==================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),INTENT(INOUT) :: XMIN,YMIN,XMAX,YMAX CHARACTER(LEN=*),INTENT(OUT) :: XTITLE,YTITLE INTEGER :: IPARAM,IPOS,I REAL(KIND=DP_KIND) :: D,T XTITLE='Iteration (#)' CALL WDIALOGGETRADIOBUTTON(IDF_RADIO8,IPARAM) IF(IPARAM.EQ.1)THEN YTITLE='Objective Function Value (m2)' ELSEIF(IPARAM.EQ.2)THEN YTITLE='Average Absolute Objective Function Value (m)' ELSEIF(IPARAM.EQ.3)THEN YTITLE='Average Objective Function Value (m)' ENDIF XMIN=0.0D0; XMAX=SIZE(IPEST)-1 IF(IPARAM.EQ.1)THEN YMIN=MIN(MINVAL(IPEST%RJ),MINVAL(IPEST%PJ),MINVAL(IPEST%J)) YMAX=MAX(MAXVAL(IPEST%RJ),MAXVAL(IPEST%PJ),MAXVAL(IPEST%J)) ELSE YMIN=HUGE(1.0D0); YMAX=-1.0D0*HUGE(1.0D0) DO IPOS=1,SIZE(IPEST) T=0.0D0 DO I=1,IPEST(IPOS)%NMEASURE D=IPEST(IPOS)%MEASURE(I)%COM-IPEST(IPOS)%MEASURE(I)%OBS IF(IPARAM.EQ.2)D=ABS(D) T=T+D ENDDO T=T/DBLE(IPEST(IPOS)%NMEASURE) YMIN=MIN(YMIN,T); YMAX=MAX(YMAX,T) IPEST(IPOS)%T=T ENDDO ENDIF END SUBROUTINE IPEST_ANALYSE_DIMGRAPH1 !###==================================================================== SUBROUTINE IPEST_ANALYSE_DIMGRAPH2(XMIN,YMIN,XMAX,YMAX,XTITLE,YTITLE) !###==================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),INTENT(INOUT) :: XMIN,YMIN,XMAX,YMAX CHARACTER(LEN=*),INTENT(OUT) :: XTITLE,YTITLE INTEGER :: I,J,IPARAM,ICHECK,IPOS YTITLE='Multiplication Factor Alpha (-)' CALL WDIALOGGETMENU(IDF_MENU1,IPOS) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO3,IPARAM) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,ICHECK) XMIN=0.0D0 IF(IPARAM.EQ.1)THEN XTITLE='Iteration (#)' XMAX=SIZE(IPEST)-1 ELSE XTITLE='Parameters (#)' XMAX=SIZE(PARAM)+1 ENDIF YMIN= HUGE(1.0D0); YMAX=-HUGE(1.0D0) IF(ICHECK.EQ.0.OR.IPARAM.EQ.1)THEN DO I=1,SIZE(IPEST) DO J=1,SIZE(IPEST(I)%ALPHA) IF(LPARAM(J).EQ.0)CYCLE YMIN=MIN(YMIN,IPEST(I)%ALPHA(J)) YMAX=MAX(YMAX,IPEST(I)%ALPHA(J)) ENDDO ENDDO ELSE DO I=IPOS,IPOS DO J=1,SIZE(IPEST(I)%ALPHA) IF(LPARAM(J).EQ.0)CYCLE YMIN=MIN(YMIN,IPEST(I)%ALPHA(J)) YMAX=MAX(YMAX,IPEST(I)%ALPHA(J)) IF(IPARAM.EQ.2)THEN YMIN=MIN(YMIN,IPEST(I)%LOWER(J)) YMAX=MAX(YMAX,IPEST(I)%UPPER(J)) ENDIF ENDDO ENDDO ENDIF END SUBROUTINE IPEST_ANALYSE_DIMGRAPH2 !###==================================================================== SUBROUTINE IPEST_ANALYSE_DIMGRAPH3(XMIN,YMIN,XMAX,YMAX,XTITLE,YTITLE) !###==================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),INTENT(INOUT) :: XMIN,YMIN,XMAX,YMAX CHARACTER(LEN=*),INTENT(OUT) :: XTITLE,YTITLE INTEGER :: I,J,IPARAM YTITLE='Sensitivity (%)' CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,IPARAM) XMIN=0.0D0 IF(IPARAM.EQ.1)THEN XTITLE='Iteration (#)' XMAX=SIZE(IPEST)-1 ELSE XTITLE='Parameters (#)' XMAX=SIZE(PARAM)+1 ENDIF YMIN= HUGE(1.0D0); YMAX=-HUGE(1.0D0) DO I=1,SIZE(IPEST) DO J=1,SIZE(IPEST(I)%ALPHA) IF(LPARAM(J).EQ.0)CYCLE YMIN=MIN(YMIN,IPEST(I)%SENSI(J)) YMAX=MAX(YMAX,IPEST(I)%SENSI(J)) ENDDO ENDDO END SUBROUTINE IPEST_ANALYSE_DIMGRAPH3 !###==================================================================== SUBROUTINE IPEST_ANALYSE_DIMGRAPH4(XMIN,YMIN,XMAX,YMAX,XTITLE,YTITLE) !###==================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),INTENT(INOUT) :: XMIN,YMIN,XMAX,YMAX CHARACTER(LEN=*),INTENT(OUT) :: XTITLE,YTITLE INTEGER :: IPARAM,I CALL WDIALOGGETRADIOBUTTON(IDF_RADIO11,IPARAM) XMIN=0.0D0 IF(IPARAM.EQ.1)THEN XTITLE='Parameters (#)' YTITLE='Parameters (#)' XMAX=SIZE(PARAM)+1 YMIN=XMIN; YMAX=XMAX ELSEIF(IPARAM.EQ.2)THEN XTITLE='Number (#)' YTITLE='Eigenvalue (-)' XMAX=SIZE(PARAM)+1 YMIN=0.0D0; YMAX=-HUGE(1.0D0) DO I=1,SIZE(IPEST) YMAX=MAX(YMAX,MAXVAL(IPEST(I)%EIGVALUES)) ENDDO ELSEIF(IPARAM.EQ.3)THEN XTITLE='Number (#)' YTITLE='Expected Variance (-)' XMAX=SIZE(PARAM)+1 YMIN=0.0; YMAX=100.0D0 ENDIF END SUBROUTINE IPEST_ANALYSE_DIMGRAPH4 !###==================================================================== LOGICAL FUNCTION IPEST_ANALYSE_DIMGRAPH5(XMIN,YMIN,XMAX,YMAX,XTITLE,YTITLE) !###==================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),INTENT(INOUT) :: XMIN,YMIN,XMAX,YMAX CHARACTER(LEN=*),INTENT(OUT) :: XTITLE,YTITLE INTEGER :: IPOS,IPARAM,N,J IPEST_ANALYSE_DIMGRAPH5=.FALSE. CALL WDIALOGGETMENU(IDF_MENU1,IPOS) IF(IPEST(IPOS)%NMEASURE.EQ.0)RETURN CALL WDIALOGGETRADIOBUTTON(IDF_RADIO5,IPARAM) IF(IPARAM.EQ.1)THEN XTITLE='Measure (m+MSL)' YTITLE='Computed (m+MSL)' ELSE YTITLE='Frequency (%)' XTITLE='Difference' ENDIF IF(IPARAM.EQ.1)THEN XMIN= HUGE(1.0D0); YMIN= HUGE(1.0D0) XMAX=-1.0D0*HUGE(1.0D0); YMAX=-1.0D0*HUGE(1.0D0) DO IPOS=1,SIZE(IPEST) DO J=1,IPEST(IPOS)%NMEASURE XMIN=MIN(XMIN,IPEST(IPOS)%MEASURE(J)%OBS); XMAX=MAX(XMAX,IPEST(IPOS)%MEASURE(J)%OBS) YMIN=MIN(YMIN,IPEST(IPOS)%MEASURE(J)%COM); YMAX=MAX(YMAX,IPEST(IPOS)%MEASURE(J)%COM) ENDDO ENDDO XMIN=MIN(XMIN,YMIN); XMAX=MAX(XMAX,YMAX); YMIN=XMIN; YMAX=XMAX ELSE !## fill it in categories CALL IPEST_ANALYSE_HISTCLASS(IPOS) N=SIZE(HCLASSES) XMIN=MINVAL(HCLASSES); XMAX=MAXVAL(HCLASSES) YMIN=0.0; YMAX=100.0D0 ENDIF IPEST_ANALYSE_DIMGRAPH5=.TRUE. END FUNCTION IPEST_ANALYSE_DIMGRAPH5 !###=================================== SUBROUTINE IPEST_ANALYSE_HISTCLASS(IPOS) !###=================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IPOS INTEGER :: I,J,N,NDIM REAL(KIND=DP_KIND) :: D NDIM=SIZE(HCLASSES) !## count amount of points per class XCLASSES=0.0D0; N=0 DO J=1,IPEST(IPOS)%NMEASURE IF(IPEST(IPOS)%MEASURE(J)%ISEL.EQ.0)CYCLE D=IPEST(IPOS)%MEASURE(J)%COM-IPEST(IPOS)%MEASURE(J)%OBS IF(D.LT.HCLASSES(2))THEN XCLASSES(1)=XCLASSES(1)+1; N=N+1 ELSEIF(D.GT.HCLASSES(NDIM-1))THEN XCLASSES(NDIM-1)=XCLASSES(NDIM-1)+1; N=N+1 ELSE CALL POL1LOCATE(HCLASSES,SIZE(HCLASSES),D,I) !## add to the histogram class XCLASSES(I)=XCLASSES(I)+1; N=N+1 ENDIF ENDDO !## get percentages DO I=1,SIZE(XCLASSES); XCLASSES(I)=100.0D0*(XCLASSES(I)/DBLE(N)); ENDDO END SUBROUTINE IPEST_ANALYSE_HISTCLASS !###==================================================================== LOGICAL FUNCTION IPEST_ANALYSE_DIMGRAPH6(XMIN,YMIN,XMAX,YMAX) !###==================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),INTENT(INOUT) :: XMIN,YMIN,XMAX,YMAX INTEGER :: IPOS,J,IPARAM,N REAL(KIND=DP_KIND) :: DX,DY,RDATE IPEST_ANALYSE_DIMGRAPH6=.FALSE. CALL WDIALOGGETRADIOBUTTON(IDF_RADIO14,IPARAM) XMIN= HUGE(1.0D0); YMIN= HUGE(1.0D0) XMAX=-1.0D0*HUGE(1.0D0); YMAX=-1.0D0*HUGE(1.0D0) N=0 DO IPOS=1,SIZE(IPEST) DO J=1,IPEST(IPOS)%NMEASURE IF(IPEST(IPOS)%MEASURE(J)%ISEL.EQ.0)CYCLE N=N+1 !## timeseries IF(IPARAM.EQ.3)THEN RDATE=DBLE(IPEST(IPOS)%MEASURE(J)%RDATE) XMIN=MIN(XMIN,RDATE); XMAX=MAX(XMAX,RDATE) YMIN=MIN(YMIN,IPEST(IPOS)%MEASURE(J)%OBS); YMAX=MAX(YMAX,IPEST(IPOS)%MEASURE(J)%OBS) YMIN=MIN(YMIN,IPEST(IPOS)%MEASURE(J)%COM); YMAX=MAX(YMAX,IPEST(IPOS)%MEASURE(J)%COM) ELSE XMIN=MIN(XMIN,IPEST(IPOS)%MEASURE(J)%X); XMAX=MAX(XMAX,IPEST(IPOS)%MEASURE(J)%X) YMIN=MIN(YMIN,IPEST(IPOS)%MEASURE(J)%Y); YMAX=MAX(YMAX,IPEST(IPOS)%MEASURE(J)%Y) ENDIF ENDDO ENDDO DX=WINFOGRREAL(GRAPHICSAREAMAXX)-WINFOGRREAL(GRAPHICSAREAMINX) DY=WINFOGRREAL(GRAPHICSAREAMAXY)-WINFOGRREAL(GRAPHICSAREAMINY) IF(IPARAM.NE.3)CALL UTL_IDFCRDCOR(XMIN,XMAX,YMIN,YMAX,DX,DY) IF(N.GT.0)IPEST_ANALYSE_DIMGRAPH6=.TRUE. END FUNCTION IPEST_ANALYSE_DIMGRAPH6 !###==================================================================== SUBROUTINE IPEST_ANALYSE_PLOTGRAPH1() !###==================================================================== IMPLICIT NONE INTEGER :: I,IPARAM CALL WDIALOGGETRADIOBUTTON(IDF_RADIO8,IPARAM) CALL IGRCOLOURN(WRGB(255,0,0)) IF(IPARAM.EQ.1)THEN DO I=1,SIZE(IPEST) IF(I.EQ.1)THEN CALL DBL_IGRMOVETO(DBLE(I-1),IPEST(I)%J) ELSE CALL DBL_IGRLINETO(DBLE(I-1),IPEST(I)%J) ENDIF ENDDO CALL IGRCOLOURN(WRGB(0,255,0)) DO I=1,SIZE(IPEST) IF(I.EQ.1)THEN CALL DBL_IGRMOVETO(DBLE(I-1),IPEST(I)%PJ) ELSE CALL DBL_IGRLINETO(DBLE(I-1),IPEST(I)%PJ) ENDIF ENDDO CALL IGRCOLOURN(WRGB(0,0,255)) DO I=1,SIZE(IPEST) IF(I.EQ.1)THEN CALL DBL_IGRMOVETO(DBLE(I-1),IPEST(I)%RJ) ELSE CALL DBL_IGRLINETO(DBLE(I-1),IPEST(I)%RJ) ENDIF ENDDO ELSE DO I=1,SIZE(IPEST) IF(I.EQ.1)THEN CALL DBL_IGRMOVETO(DBLE(I-1),IPEST(I)%T) ELSE CALL DBL_IGRLINETO(DBLE(I-1),IPEST(I)%T) ENDIF ENDDO ENDIF END SUBROUTINE IPEST_ANALYSE_PLOTGRAPH1 !###==================================================================== SUBROUTINE IPEST_ANALYSE_PLOTGRAPH2(YMIN,YMAX) !###==================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),INTENT(IN) :: YMIN,YMAX INTEGER :: I,J,K,IPARAM,IPOS,ICHECK,ILABEL REAL(KIND=DP_KIND) :: U,L,A,D,XS,DY,X1,Y1 CALL WDIALOGGETRADIOBUTTON(IDF_RADIO3,IPARAM) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,ICHECK) CALL WDIALOGGETCHECKBOX(IDF_CHECK3,ILABEL) IF(IPARAM.EQ.1)THEN K=0; DO J=1,SIZE(IPEST(1)%ALPHA) K=K+1; IF(K.GT.SIZE(ICOLOR))K=1 IF(LPARAM(J).EQ.0)CYCLE CALL IGRCOLOURN(ICOLOR(K)) DO I=1,SIZE(IPEST) IF(I.EQ.1)THEN CALL DBL_IGRMOVETO(DBLE(I-1),IPEST(I)%ALPHA(J)) ELSE CALL DBL_IGRLINETO(DBLE(I-1),IPEST(I)%ALPHA(J)) ENDIF ENDDO ENDDO ELSE XS=0.45D0 CALL WDIALOGGETMENU(IDF_MENU1,IPOS) IF(ICHECK.EQ.0)THEN DY=(YMAX-YMIN)/10.0D0 K=0; DO I=1,SIZE(IPEST(IPOS)%ALPHA) K=K+1; IF(K.GT.SIZE(ICOLOR))K=1 IF(LPARAM(I).EQ.0)CYCLE CALL IGRCOLOURN(ICOLOR(K)) CALL IGRFILLPATTERN(SOLID) CALL DBL_IGRRECTANGLE(DBLE(I)-XS,0.0D0,DBLE(I)+XS,IPEST(IPOS)%ALPHA(I)) CALL IGRCOLOURN(WRGB(0,0,0)) CALL IGRFILLPATTERN(OUTLINE) CALL DBL_IGRRECTANGLE(DBLE(I)-XS,0.0D0,DBLE(I)+XS,IPEST(IPOS)%ALPHA(I)) IF(ILABEL.EQ.1)THEN X1=DBLE(I); Y1=IPEST(IPOS)%ALPHA(I) IF(Y1.GT.0.5D0*(YMAX+YMIN))THEN CALL DBL_WGRTEXTORIENTATION(ALIGNLEFT,ANGLE=-90.0D0) ELSE CALL DBL_WGRTEXTORIENTATION(ALIGNRIGHT,ANGLE=-90.0D0) ENDIF CALL DBL_WGRTEXTSTRING(X1,Y1,TRIM(IPEST(1)%CPARAM(I))) ENDIF ENDDO CALL DBL_WGRTEXTORIENTATION(ALIGNLEFT,ANGLE=0.0D0) ELSE XS=0.25D0 K=0; DO I=1,SIZE(IPEST(IPOS)%ALPHA) K=K+1; IF(K.GT.SIZE(ICOLOR))K=1 CALL IGRCOLOURN(ICOLOR(K)) IF(LPARAM(I).EQ.0)CYCLE !## get 1*std error U=0.0D0; IF(IPEST(IPOS)%UPPER(I).GT.0.0D0)U=LOG(IPEST(IPOS)%UPPER(I)) L=0.0D0; IF(IPEST(IPOS)%LOWER(I).GT.0.0D0)L=LOG(IPEST(IPOS)%LOWER(I)) IF(U.EQ.0.0D0.OR.L.EQ.0.0D0)THEN CALL IGRCOLOURN(WRGB(0,0,0)) CALL DBL_IGRJOIN(DBLE(I)-XS,IPEST(IPOS)%ALPHA(I),DBLE(I)+XS,IPEST(IPOS)%ALPHA(I)) ELSE A=LOG(IPEST(IPOS)%ALPHA(I)) !## inner upper border D=(U-A)/1.96D0; U=EXP(A+D) !## inner lower border D=(A-L)/1.96D0; L=EXP(A-D) CALL IGRFILLPATTERN(SOLID); CALL DBL_IGRRECTANGLE(DBLE(I)-XS,L,DBLE(I)+XS,U) CALL IGRFILLPATTERN(OUTLINE); CALL DBL_IGRRECTANGLE(DBLE(I)-XS,L,DBLE(I)+XS,U) CALL IGRCOLOURN(WRGB(0,0,0)) CALL DBL_IGRJOIN(DBLE(I)-XS,IPEST(IPOS)%ALPHA(I),DBLE(I)+XS,IPEST(IPOS)%ALPHA(I)) CALL DBL_IGRJOIN(DBLE(I),IPEST(IPOS)%LOWER(I),DBLE(I),IPEST(IPOS)%UPPER(I)) CALL DBL_IGRJOIN(DBLE(I)-XS,IPEST(IPOS)%LOWER(I),DBLE(I)+XS,IPEST(IPOS)%LOWER(I)) CALL DBL_IGRJOIN(DBLE(I)-XS,IPEST(IPOS)%UPPER(I),DBLE(I)+XS,IPEST(IPOS)%UPPER(I)) ENDIF ENDDO ENDIF ENDIF END SUBROUTINE IPEST_ANALYSE_PLOTGRAPH2 !###==================================================================== SUBROUTINE IPEST_ANALYSE_PLOTGRAPH3(YMIN,YMAX) !###==================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),INTENT(IN) :: YMIN,YMAX INTEGER :: I,J,K,IPARAM,IPOS,ILABEL REAL(KIND=DP_KIND) :: XS,X1,Y1 CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,IPARAM) CALL WDIALOGGETCHECKBOX(IDF_CHECK2,ILABEL) IF(IPARAM.EQ.1)THEN K=0; DO J=1,SIZE(IPEST(1)%SENSI) K=K+1; IF(K.GT.SIZE(ICOLOR))K=1 CALL IGRCOLOURN(ICOLOR(K)) IF(LPARAM(J).EQ.0)CYCLE DO I=1,SIZE(IPEST) IF(I.EQ.1)THEN CALL DBL_IGRMOVETO(DBLE(I-1),IPEST(I)%SENSI(J)) ELSE CALL DBL_IGRLINETO(DBLE(I-1),IPEST(I)%SENSI(J)) ENDIF ENDDO ENDDO ELSE XS=0.45D0 CALL WDIALOGGETMENU(IDF_MENU1,IPOS) K=0; DO I=1,SIZE(IPEST(IPOS)%SENSI) K=K+1; IF(K.GT.SIZE(ICOLOR))K=1 CALL IGRCOLOURN(ICOLOR(K)) IF(LPARAM(I).EQ.0)CYCLE CALL IGRFILLPATTERN(SOLID) CALL DBL_IGRRECTANGLE(DBLE(I)-XS,0.0D0,DBLE(I)+XS,IPEST(IPOS)%SENSI(I)) CALL IGRCOLOURN(WRGB(0,0,0)) CALL IGRFILLPATTERN(OUTLINE) CALL DBL_IGRRECTANGLE(DBLE(I)-XS,0.0D0,DBLE(I)+XS,IPEST(IPOS)%SENSI(I)) IF(ILABEL.EQ.1)THEN X1=DBLE(I); Y1=IPEST(IPOS)%SENSI(I) IF(Y1.GT.0.5D0*(YMAX+YMIN))THEN CALL DBL_WGRTEXTORIENTATION(ALIGNLEFT,ANGLE=-90.0D0) ELSE CALL DBL_WGRTEXTORIENTATION(ALIGNRIGHT,ANGLE=-90.0D0) ENDIF CALL DBL_WGRTEXTSTRING(X1,Y1,TRIM(IPEST(1)%CPARAM(I))) ENDIF ENDDO ENDIF END SUBROUTINE IPEST_ANALYSE_PLOTGRAPH3 !###==================================================================== SUBROUTINE IPEST_ANALYSE_PLOTGRAPH4(YMIN,YMAX) !###==================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),INTENT(IN) :: YMIN,YMAX INTEGER :: I,J,K,IPARAM,IPOS,IRED,IGRN,ICLR,ILABEL,N,IACTIVE REAL(KIND=DP_KIND) :: X1,Y1,X2,Y2,X,Y,TV,CN CALL WDIALOGGETRADIOBUTTON(IDF_RADIO11,IPARAM) CALL WDIALOGGETMENU(IDF_MENU1,IPOS) CALL WDIALOGGETCHECKBOX(IDF_CHECK4,ILABEL) !## plot correlations IF(IPARAM.EQ.1)THEN IF(SIZE(PARAM).LT.50)THEN CALL DBL_WGRTEXTORIENTATION(ALIGNCENTRE,ANGLE=0.0D0) !## plot rectangles with correlation values DO I=1,SIZE(PARAM); IF(LPARAM(I).EQ.0)CYCLE; DO J=1,SIZE(PARAM); IF(LPARAM(J).EQ.0)CYCLE X1=DBLE(I)-0.5D0; X2=X1+1.0D0; Y1=DBLE(J)-0.5D0; Y2=Y1+1.0D0 CALL IGRFILLPATTERN(SOLID) IACTIVE=0 IF(I.EQ.J)THEN ICLR=WRGB(200,200,200) ELSE !## positive correlated IF(IPEST(IPOS)%CORR(I,J).GT.0.0D0)THEN IRED=255-INT(255.0D0*IPEST(IPOS)%CORR(I,J),4) ICLR=WRGB(255,IRED,IRED) IACTIVE=1 !## negative correlated ELSEIF(IPEST(IPOS)%CORR(I,J).LT.0.0D0)THEN IGRN=255+INT(255.0D0*IPEST(IPOS)%CORR(I,J),4) ICLR=WRGB(ABS(IGRN),255,ABS(IGRN)) IACTIVE=1 ELSE ICLR=WRGB(225,225,225) ENDIF ENDIF CALL IGRCOLOURN(ICLR) CALL DBL_IGRRECTANGLE(X1,Y1,X2,Y2) CALL IGRFILLPATTERN(OUTLINE) CALL IGRCOLOURN(WRGB(75,75,75)) CALL DBL_IGRRECTANGLE(X1,Y1,X2,Y2) IF(ILABEL.EQ.1.AND.IACTIVE.EQ.1)THEN X=(X1+X2)/2.0D0; Y=(Y1+Y2)/2.0D0 CALL DBL_WGRTEXTDOUBLE(X,Y,IPEST(IPOS)%CORR(I,J)) ENDIF ENDDO; ENDDO ENDIF !## plot eigenvalues ELSE IF(IPARAM.EQ.3)TV=SUM(IPEST(IPOS)%EIGVALUES) K=0; DO I=1,SIZE(PARAM) X1=DBLE(I)-0.5D0; X2=X1+1.0D0 Y1=0.0D0; Y2=IPEST(IPOS)%EIGVALUES(I) IF(IPARAM.EQ.3)Y2=100.0D0*(Y2/TV) K=K+1; IF(K.GT.SIZE(ICOLOR))K=1 CALL IGRCOLOURN(ICOLOR(K)) CALL IGRFILLPATTERN(SOLID) CALL DBL_IGRRECTANGLE(X1,Y1,X2,Y2) CALL IGRCOLOURN(WRGB(0,0,0)) CALL IGRFILLPATTERN(OUTLINE) CALL DBL_IGRRECTANGLE(X1,Y1,X2,Y2) IF(ILABEL.EQ.1)THEN X1=DBLE(I) IF(Y2.GT.0.5D0*(YMAX+YMIN))THEN CALL DBL_WGRTEXTORIENTATION(ALIGNLEFT,ANGLE=-90.0D0) ELSE CALL DBL_WGRTEXTORIENTATION(ALIGNRIGHT,ANGLE=-90.0D0) ENDIF CALL DBL_WGRTEXTSTRING(X1,Y2,' '//TRIM(RTOS(Y2,'G',7))//' ') ENDIF ENDDO DO N=1,SIZE(PARAM); IF(IPEST(IPOS)%EIGVALUES(N).EQ.0.0D0)EXIT; ENDDO; N=N-1 CN=0.0D0; IF(N.GT.0.0D0)THEN; CN=SQRT(IPEST(IPOS)%EIGVALUES(1))/SQRT(IPEST(IPOS)%EIGVALUES(N)); CN=LOG(CN); ENDIF X2=SIZE(PARAM)+1.0D0 CALL DBL_WGRTEXTORIENTATION(ALIGNRIGHT,ANGLE=0.0D0) Y2=YMAX-0.075D0*(YMAX-YMIN) IF(IPEST(IPOS)%DETERMINANT.LT.0.1D0)THEN CALL DBL_WGRTEXTSTRING(X2,Y2,'>>> Determinant '//TRIM(RTOS(IPEST(IPOS)%DETERMINANT,'G',7))//' <<<') ELSE CALL DBL_WGRTEXTSTRING(X2,Y2,'Determinant '//TRIM(RTOS(IPEST(IPOS)%DETERMINANT,'G',7))) ENDIF Y2=YMAX-0.15D0*(YMAX-YMIN) IF(CN.GT.30.0D0)THEN CALL DBL_WGRTEXTSTRING(X2,Y2,'>>> Condition Number '//TRIM(RTOS(CN,'G',7))//' <<<') ELSE CALL DBL_WGRTEXTSTRING(X2,Y2,'Condition Number '//TRIM(RTOS(CN,'G',7))) ENDIF ENDIF END SUBROUTINE IPEST_ANALYSE_PLOTGRAPH4 !###==================================================================== SUBROUTINE IPEST_ANALYSE_PLOTGRAPH5(XMIN,YMIN,XMAX,YMAX) !###==================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),INTENT(IN) :: XMIN,YMIN,XMAX,YMAX INTEGER :: IPOS,I,J,IPARAM,N,M,NPOP,DC1,DC2,HC1,HC2,MC,IC REAL(KIND=DP_KIND) :: X1,X2,GOF,X,Y,Y2,AVG,VAR,XT,MINX,MAXX,A,B,R2,BW,NSC REAL(KIND=DP_KIND),ALLOCATABLE,DIMENSION(:) :: D,OBS,COM REAL(KIND=DP_KIND),DIMENSION(3) :: XMED CHARACTER(LEN=256) :: LINE CALL WDIALOGGETMENU(IDF_MENU1,IPOS) IF(IPEST(IPOS)%NMEASURE.EQ.0)RETURN CALL WDIALOGGETRADIOBUTTON(IDF_RADIO5,IPARAM) !## scatter IF(IPARAM.EQ.1)THEN CALL WDIALOGGETDOUBLE(IDF_DOUBLE1,BW) CALL IGRFILLPATTERN(SOLID) CALL IGRCOLOURN(WRGB(255,150,150)) CALL DBL_IGRPOLYGONCOMPLEX((/XMIN,XMIN,XMAX,XMAX,XMIN/),(/XMIN,XMIN+BW,XMAX+BW,XMAX,XMIN/),5) CALL IGRCOLOURN(WRGB(150,255,150)) CALL DBL_IGRPOLYGONCOMPLEX((/XMIN,XMIN,XMAX,XMAX,XMIN/),(/XMIN,XMIN-BW,XMAX-BW,XMAX,XMIN/),5) CALL IGRFILLPATTERN(OUTLINE) CALL IGRCOLOURN(WRGB(25,25,25)) DO I=1,IPEST(IPOS)%NMEASURE IF(IPEST(IPOS)%MEASURE(I)%ISEL.EQ.0)CYCLE CALL DBL_IGRMARKER(IPEST(IPOS)%MEASURE(I)%OBS,IPEST(IPOS)%MEASURE(I)%COM,14) ENDDO CALL IGRCOLOURN(WRGB(50,50,50)); CALL IGRLINETYPE(DASHED) CALL DBL_IGRMOVETO(XMIN,XMIN); CALL DBL_IGRLINETO(XMAX,XMAX) CALL IGRLINETYPE(SOLIDLINE) DO I=1,2 N=0 DO J=1,IPEST(IPOS)%NMEASURE IF(IPEST(IPOS)%MEASURE(J)%ISEL.EQ.0)CYCLE N=N+1 IF(I.EQ.2)THEN OBS(N)=IPEST(IPOS)%MEASURE(J)%OBS COM(N)=IPEST(IPOS)%MEASURE(J)%COM ENDIF ENDDO IF(I.EQ.1)ALLOCATE(OBS(N),COM(N)) ENDDO GOF=UTL_GOODNESS_OF_FIT(OBS,COM,N) CALL LINREGRESSION(N,OBS,COM,A,B,R2) NSC=UTL_NASH_SUTCLIFFE(COM,OBS,N) !## insert line of regression CALL IGRLINETYPE(DASHED) CALL IGRCOLOURN(WRGB(200,0,0)) CALL DBL_IGRMOVETO(XMIN,XMIN*A+B) CALL DBL_IGRLINETO(XMAX,XMAX*A+B) CALL IGRLINETYPE(SOLIDLINE) LINE='Goodness of Fit '//TRIM(RTOS(GOF*100.0D0,'G',7))//'%'//CHAR(13)//CHAR(10)// & 'Nash Sutcliffe'//CHAR(32)//TRIM(RTOS(NSC,'G',7))//CHAR(13)//CHAR(10)// & 'Regression Coefficient'//CHAR(32)//TRIM(RTOS(R2,'G',7))//CHAR(13)//CHAR(10)// & 'y='//TRIM(RTOS(A,'G',7))//'x '//TRIM(RTOS(B,'G',7)) CALL DBL_WGRTEXTORIENTATION(ALIGNLEFT) CALL IGRCOLOURN(WRGB(0,0,0)) X= XMIN+0.05D0*(XMAX-XMIN); Y2=YMAX-0.075D0*(YMAX-YMIN) X2=XMIN+0.75D0*(XMAX-XMIN); Y=YMAX-0.65D0*(YMAX-YMIN) CALL DBL_WGRTEXTBLOCK(X,Y,X2,Y2,TRIM(LINE),IFLAGS=TBFONTSIZE) !## histogram ELSE !## find switch in classes HC1=0; HC2=SIZE(HCLASSES) DO I=1,SIZE(HCLASSES)-1 IF(HCLASSES(I).LT.0.0D0.AND.HCLASSES(I+1).GE.0.0D0)THEN; MC=I; ENDIF IF(HCLASSES(I).GE.0.0D0) THEN; HC2=I; EXIT; ENDIF IF(HCLASSES(I).LE.0.0D0) THEN; HC1=I; ENDIF ENDDO IF(HC1.GT.0)DC1=150/HC1 IF(HC2.GT.0)DC2=150/HC2 DO I=1,SIZE(HCLASSES)-1 !## lower category IF(I.LT.MC)THEN IC=100+I*DC1 CALL IGRCOLOURN(WRGB(0,0,IC)) !## higher category ELSEIF(I.GT.MC)THEN J=I-MC IC=250-J*DC2 CALL IGRCOLOURN(WRGB(IC,0,0)) !## mid column ELSE CALL IGRCOLOURN(WRGB(225,225,225)) ENDIF X1=HCLASSES(I); X2=HCLASSES(I+1) CALL IGRFILLPATTERN(SOLID) CALL DBL_IGRRECTANGLE(HCLASSES(I),0.0D0,HCLASSES(I+1),XCLASSES(I)) CALL IGRFILLPATTERN(OUTLINE) CALL IGRCOLOURN(WRGB(0,0,0)) CALL DBL_IGRRECTANGLE(HCLASSES(I),0.0D0,HCLASSES(I+1),XCLASSES(I)) ENDDO CALL IGRFILLPATTERN(OUTLINE) !## write statistics N=IPEST(IPOS)%NMEASURE; ALLOCATE(D(N)); D=0.0D0 N=0 DO I=1,IPEST(IPOS)%NMEASURE IF(IPEST(IPOS)%MEASURE(I)%ISEL.EQ.0)CYCLE N=N+1 D(N)=IPEST(IPOS)%MEASURE(I)%COM-IPEST(IPOS)%MEASURE(I)%OBS ENDDO AVG=SUM(D(1:N))/DBLE(N); MINX=MINVAL(D(1:N)); MAXX=MAXVAL(D(1:N)) CALL UTL_GETMED(D,N,HUGE(1.0D0),(/10.0D0,50.0D0,90.0D0/),3,M,XMED) CALL UTL_STDEF(D,N,HUGE(1.0D0),VAR,XT,NPOP) DEALLOCATE(D) X= XMIN+0.05D0*(XMAX-XMIN); Y2=YMAX-0.075D0*(YMAX-YMIN) X2=XMIN+0.75D0*(XMAX-XMIN); Y=YMAX-0.5D0*(YMAX-YMIN) LINE='Average: '//CHAR(32)//TRIM(RTOS(AVG,'G',7)) //CHAR(13)//CHAR(10)// & 'St.Dev: '//CHAR(32)//TRIM(RTOS(VAR,'G',7)) //CHAR(13)//CHAR(10)// & 'Minimal: '//CHAR(32)//TRIM(RTOS(MINX,'G',7)) //CHAR(13)//CHAR(10)// & '10 Percent: '//CHAR(32)//TRIM(RTOS(XMED(1),'G',7))//CHAR(13)//CHAR(10)// & '50 Percent: '//CHAR(32)//TRIM(RTOS(XMED(2),'G',7))//CHAR(13)//CHAR(10)// & '90 Percent: '//CHAR(32)//TRIM(RTOS(XMED(3),'G',7))//CHAR(13)//CHAR(10)// & 'Maximal: '//CHAR(32)//TRIM(RTOS(MAXX,'G',7)) CALL DBL_WGRTEXTORIENTATION(ALIGNLEFT) CALL IGRCOLOURN(WRGB(0,0,0)) CALL DBL_WGRTEXTBLOCK(X,Y,X2,Y2,TRIM(LINE),IFLAGS=TBFONTSIZE) ENDIF END SUBROUTINE IPEST_ANALYSE_PLOTGRAPH5 !###==================================================================== SUBROUTINE IPEST_ANALYSE_PLOTGRAPH6() !###==================================================================== IMPLICIT NONE INTEGER :: IPOS,I,J,ICLR,IPARAM,IF1,IF2 REAL(KIND=DP_KIND) :: D,D1,D2,D3,D4,TD,ND CALL WDIALOGGETMENU(IDF_MENU1,IPOS) IF(IPEST(IPOS)%NMEASURE.EQ.0)RETURN CALL WDIALOGGETRADIOBUTTON(IDF_RADIO14,IPARAM) !## timeseries IF(IPARAM.EQ.3)THEN DO I=2,IPEST(IPOS)%NMEASURE IF(IPEST(IPOS)%MEASURE(I-1)%ISEL.EQ.0.OR.IPEST(IPOS)%MEASURE(I)%ISEL.EQ.0)CYCLE IF(IPEST(IPOS)%MEASURE(I-1)%FNAME.NE.IPEST(IPOS)%MEASURE(I)%FNAME)CYCLE D1=IPEST(IPOS)%MEASURE(I-1)%RDATE; D2=IPEST(IPOS)%MEASURE(I-1)%OBS D3=IPEST(IPOS)%MEASURE(I )%RDATE; D4=IPEST(IPOS)%MEASURE(I )%OBS CALL IGRCOLOURN(WRGB(255,0,0)); CALL DBL_IGRJOIN(D1,D2,D3,D4) D2=IPEST(IPOS)%MEASURE(I-1)%COM; D4=IPEST(IPOS)%MEASURE(I )%COM CALL IGRCOLOURN(WRGB(0,255,0)); CALL DBL_IGRJOIN(D1,D2,D3,D4) ENDDO ELSE DO I=1,IPEST(IPOS)%NMEASURE IF(IPEST(IPOS)%MEASURE(I)%ISEL.LE.0)CYCLE IF1=IPEST(IPOS)%MEASURE(I)%SFNM !## compute average TD=0.0D0; ND=0.0D0 DO J=I,IPEST(IPOS)%NMEASURE IF2=IPEST(IPOS)%MEASURE(J)%SFNM IF(IF1.NE.IF2)CYCLE IPEST(IPOS)%MEASURE(J)%ISEL=-1*IPEST(IPOS)%MEASURE(J)%ISEL IF(IPARAM.EQ.1)THEN D=IPEST(IPOS)%MEASURE(I)%COM-IPEST(IPOS)%MEASURE(I)%OBS ELSEIF(IPARAM.EQ.2)THEN IF(IPOS.GT.1)THEN D1=IPEST(IPOS-1)%MEASURE(I)%COM-IPEST(IPOS-1)%MEASURE(I)%OBS D2=IPEST(IPOS )%MEASURE(I)%COM-IPEST(IPOS )%MEASURE(I)%OBS D=D2-D2 ELSE D=0.0D0 ENDIF ENDIF TD=TD+D ND=ND+1.0D0 ENDDO D=TD/ND ICLR=UTL_IDFGETCLASS(MP(MXMPLOT)%LEG,D) CALL IGRCOLOURN(ICLR) CALL DBL_IGRMARKER(IPEST(IPOS)%MEASURE(I)%X,IPEST(IPOS)%MEASURE(I)%Y,14) ENDDO DO I=1,IPEST(IPOS)%NMEASURE IPEST(IPOS)%MEASURE(I)%ISEL=ABS(IPEST(IPOS)%MEASURE(I)%ISEL) ENDDO ENDIF END SUBROUTINE IPEST_ANALYSE_PLOTGRAPH6 !###==================================================================== SUBROUTINE IPEST_ANALLYSE_PLOTIPOS(IGRAPH,XMIN,YMIN,YMAX) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IGRAPH REAL(KIND=DP_KIND),INTENT(IN) :: XMIN,YMIN,YMAX INTEGER :: IPOS,IPARAM !## no plotting IF(IGRAPH.EQ.4)RETURN IF(IGRAPH.EQ.5)RETURN IF(IGRAPH.EQ.6)RETURN CALL WDIALOGGETRADIOBUTTON(IDF_RADIO3,IPARAM) IF(IGRAPH.EQ.2.AND.IPARAM.EQ.2)RETURN CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,IPARAM) IF(IGRAPH.EQ.3.AND.IPARAM.EQ.2)RETURN !## get trackbar CALL WDIALOGGETMENU(IDF_MENU1,IPOS); IPOS=IPOS-1 CALL IGRCOLOURN(WRGB(0,0,0)) CALL DBL_IGRMOVETO(DBLE(IPOS),YMIN) CALL DBL_IGRLINETO(DBLE(IPOS),YMAX) CALL DBL_IGRLINETO(XMIN,YMAX) END SUBROUTINE IPEST_ANALLYSE_PLOTIPOS !###==================================================================== SUBROUTINE IPEST_ANALYSE_PLOT_AXES(XMIN,YMIN,XMAX,YMAX,LDATE,XTITLE,YTITLE,IWIN) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IWIN CHARACTER(LEN=*),INTENT(IN) :: XTITLE,YTITLE REAL(KIND=DP_KIND),INTENT(IN) :: XMIN,YMIN,XMAX,YMAX LOGICAL,INTENT(IN) :: LDATE AXES%XMIN =XMIN AXES%XMAX =XMAX IF(AXES%XMAX.LE.AXES%XMIN)THEN AXES%XMIN=AXES%XMIN-1.0D0 AXES%XMAX=AXES%XMAX+1.0D0 ENDIF AXES%YMIN =YMIN AXES%YMAX =YMAX IF(AXES%YMAX.LE.AXES%YMIN)THEN AXES%YMIN=AXES%YMIN-1.0D0 AXES%YMAX=AXES%YMAX+1.0D0 ENDIF AXES%IFIXX =0 AXES%IFIXY =0 AXES%IFIXY2=0 AXES%XINT =1.0D0 AXES%YINT =1.0D0 AXES%XOFFSET=0 AXES%LDATE =LDATE AXES%XTITLE=TRIM(XTITLE) AXES%YTITLE=TRIM(YTITLE) AXES%IAXES=(/1,0/) !## left/bottom axes only AXES%XFACTOR=1.0D0 AXES%YFACTOR=1.0D0 AXES%DXAXESL=40.0D0 !## 1/40.0D0 als rand AXES%DYAXESB=20.0D0 AXES%DYAXEST=75.0D0 AXES%DXAXESR=150.0D0 AXES%TFONT=FFHELVETICA !## text-font AXES%ICLRRASTER=WRGB(220,220,220) AXES%ICLRBACKGROUND=WRGB(123,152,168) !## plot axes and set units CALL GRAPH_PLOTAXES(AXES,IWIN) END SUBROUTINE IPEST_ANALYSE_PLOT_AXES !###====================================================================== SUBROUTINE IPEST_ANALYSE_ALLOCATE(NI,NP) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: NI,NP INTEGER :: I,IWIN IF(NP.EQ.0)THEN CALL IPEST_ANALYSE_DEALLOCATE(); ALLOCATE(IPEST(NI)); IPEST%J=0.0D0 ALLOCATE(GRAPHUNITS(6,6),GRAPHAREA(4,6)) DO IWIN=1,6 GRAPHUNITS(1,IWIN)=0.0D0; GRAPHUNITS(2,IWIN)=0.0D0 GRAPHUNITS(3,IWIN)=1.0D0; GRAPHUNITS(4,IWIN)=1.0D0 GRAPHUNITS(5,IWIN)=0.0D0; GRAPHUNITS(6,IWIN)=1.0D0 GRAPHAREA(1,IWIN) =0.0D0; GRAPHAREA(2,IWIN) =0.0D0 GRAPHAREA(3,IWIN) =1.0D0; GRAPHAREA(4,IWIN) =1.0D0 ENDDO ELSE DO I=1,SIZE(IPEST); ALLOCATE(IPEST(I)%ALPHA(NP)); IPEST(I)%ALPHA=0.0D0; ENDDO DO I=1,SIZE(IPEST); ALLOCATE(IPEST(I)%UPPER(NP)); IPEST(I)%UPPER=0.0D0; ENDDO DO I=1,SIZE(IPEST); ALLOCATE(IPEST(I)%LOWER(NP)); IPEST(I)%LOWER=0.0D0; ENDDO DO I=1,SIZE(IPEST); ALLOCATE(IPEST(I)%CPARAM(NP)); IPEST(I)%CPARAM=''; ENDDO DO I=1,SIZE(IPEST); ALLOCATE(IPEST(I)%SENSI(NP)); IPEST(I)%SENSI=0.0D0; ENDDO DO I=1,SIZE(IPEST); ALLOCATE(IPEST(I)%EIGVALUES(NP)); IPEST(I)%EIGVALUES=0.0D0; ENDDO DO I=1,SIZE(IPEST); ALLOCATE(IPEST(I)%CORR(NP,NP)); IPEST(I)%CORR=0.0D0; ENDDO DO I=1,SIZE(IPEST); IPEST(I)%NMEASURE=0; ENDDO ALLOCATE(PARAM(NP)) ENDIF END SUBROUTINE IPEST_ANALYSE_ALLOCATE !###====================================================================== SUBROUTINE IPEST_ANALYSE_DEALLOCATE() !###====================================================================== IMPLICIT NONE INTEGER :: I IF(ALLOCATED(IPEST))THEN DO I=1,SIZE(IPEST) IF(ASSOCIATED(IPEST(I)%ALPHA)) DEALLOCATE(IPEST(I)%ALPHA) IF(ASSOCIATED(IPEST(I)%UPPER)) DEALLOCATE(IPEST(I)%UPPER) IF(ASSOCIATED(IPEST(I)%LOWER)) DEALLOCATE(IPEST(I)%LOWER) IF(ASSOCIATED(IPEST(I)%CPARAM)) DEALLOCATE(IPEST(I)%CPARAM) IF(ASSOCIATED(IPEST(I)%SENSI)) DEALLOCATE(IPEST(I)%SENSI) IF(ASSOCIATED(IPEST(I)%CORR)) DEALLOCATE(IPEST(I)%CORR) IF(ASSOCIATED(IPEST(I)%EIGVALUES))DEALLOCATE(IPEST(I)%EIGVALUES) IF(ASSOCIATED(IPEST(I)%MEASURE)) DEALLOCATE(IPEST(I)%MEASURE) ENDDO DEALLOCATE(IPEST) ENDIF IF(ALLOCATED(PARAM))DEALLOCATE(PARAM) IF(ALLOCATED(GRAPHUNITS))DEALLOCATE(GRAPHUNITS) IF(ALLOCATED(GRAPHAREA))DEALLOCATE(GRAPHAREA) IF(ASSOCIATED(HCLASSES))DEALLOCATE(HCLASSES) IF(ASSOCIATED(XCLASSES))DEALLOCATE(XCLASSES) IF(ALLOCATED(CPERIOD))DEALLOCATE(CPERIOD) IF(ALLOCATED(CLAY))DEALLOCATE(CLAY) IF(ALLOCATED(IPERIOD))DEALLOCATE(IPERIOD) IF(ALLOCATED(LPARAM))DEALLOCATE(LPARAM) IF(ALLOCATED(ILAY))DEALLOCATE(ILAY) IF(ALLOCATED(LLAY))DEALLOCATE(LLAY) IF(ALLOCATED(LPERIOD))DEALLOCATE(LPERIOD) IF(ALLOCATED(CFNAME))DEALLOCATE(CFNAME) IF(ALLOCATED(IFNAME))DEALLOCATE(IFNAME) END SUBROUTINE IPEST_ANALYSE_DEALLOCATE !###====================================================================== SUBROUTINE IPEST_ANALYSE_CLOSE() !###====================================================================== IMPLICIT NONE CALL WINDOWSELECT(0); CALL WMENUSETSTATE(ID_IPESTANALYSER,2,0) CALL IPEST_ANALYSE_DEALLOCATE() CALL WDIALOGSELECT(ID_DIPESTANALYSE); CALL WDIALOGUNLOAD() END SUBROUTINE IPEST_ANALYSE_CLOSE !###====================================================================== INTEGER FUNCTION IPEST_ANALYSE_QUERY(JLAY,JDATE,FNAME,SLAY,SPER,SFNM) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: JLAY INTEGER(KIND=DP_KIND),INTENT(IN) :: JDATE INTEGER,INTENT(OUT) :: SLAY,SPER,SFNM CHARACTER(LEN=*),INTENT(IN) :: FNAME INTEGER :: I IPEST_ANALYSE_QUERY=0 SLAY=0; SPER=0; SFNM=0 DO I=1,SIZE(LLAY) IF(JLAY.EQ.LLAY(I).AND.ILAY(I).EQ.1)EXIT ENDDO IF(I.GT.SIZE(LLAY))RETURN; SLAY=I DO I=1,SIZE(LPERIOD) IF(JDATE.EQ.LPERIOD(I).AND.IPERIOD(I).EQ.1)EXIT ENDDO IF(I.GT.SIZE(LPERIOD))RETURN; SPER=I DO I=1,SIZE(CFNAME) IF(FNAME.EQ.CFNAME(I).AND.IFNAME(I).EQ.1)EXIT ENDDO IF(I.GT.SIZE(CFNAME))RETURN; SFNM=I IPEST_ANALYSE_QUERY=1 END FUNCTION IPEST_ANALYSE_QUERY !###====================================================================== INTEGER FUNCTION IPEST_ANALYSE_QUERY2(SLAY,SPER,SFNM) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: SLAY,SPER,SFNM IPEST_ANALYSE_QUERY2=0 IF(ILAY(SLAY).EQ.0)RETURN IF(IPERIOD(SPER).EQ.0)RETURN IF(IFNAME(SFNM).EQ.0)RETURN IPEST_ANALYSE_QUERY2=1 END FUNCTION IPEST_ANALYSE_QUERY2 !###====================================================================== SUBROUTINE IPEST_ANALYSE_SETTINGS() !###====================================================================== IMPLICIT NONE INTEGER :: ITYPE,DID TYPE(WIN_MESSAGE) :: MESSAGE DID=WINFODIALOG(CURRENTDIALOG) !## fill in dialog CALL WDIALOGLOAD(ID_DIPESTANALYSE_SETTINGS,ID_DIPESTANALYSE_SETTINGS) CALL WDIALOGPUTMENU(IDF_MENU1,CPERIOD,SIZE(CPERIOD),IPERIOD) CALL WDIALOGPUTMENU(IDF_MENU2,CLAY ,SIZE(CLAY) ,ILAY) CALL UTL_DIALOGSHOW(-1,-1,0,2) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDCANCEL) EXIT CASE (IDHELP) CASE (IDOK) EXIT END SELECT CASE (FIELDCHANGED) END SELECT ENDDO IF(DID.NE.0)CALL WDIALOGSELECT(DID) END SUBROUTINE IPEST_ANALYSE_SETTINGS END MODULE MOD_IPEST_ANALYSER