!! 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_INFO USE WINTERACTER USE RESOURCE USE MOD_IDFPLOT USE MOD_UTL USE MOD_POLYGON_PAR USE MODPLOT USE MOD_IDF, ONLY : IDFREAD,IDFREADPART,IDFDEALLOCATEX,IDFGETCOMMENT,IDFNULLIFY, & IDFOPEN,IDFREADDIM,IDFREADDATA,IDFWRITE,IDFDEALLOCATE,IDFCOPY,IDFIROWICOL, & IDFALLOCATEX,IDFWRITECOMMENT,IDFFILLCOMMENT2,IDFGETLOC,IDFIROWICOL USE MOD_IDF_PAR, ONLY : NIDFTRANSFORM,IDFTRANSFORM,IDFOBJ USE MOD_MDF, ONLY : READMDF,MDF_MAIN,MDFDEALLOCATE,MDF USE MOD_OSD, ONLY : OSD_OPEN,OSD_IOSTAT_MSG,OSD_GETENV,OSD_DATE_AND_TIME USE MOD_GRAPH, ONLY : GRAPH_MAIN,GRAPH_INIT,GRAPH,GRAPH_ALLOCATE,GRAPHDIM,GRAPH_DEALLOCATE USE MOD_IDFEDIT_TABLE, ONLY : UTL_EDITTABLE_INIT USE MOD_PREF_PAR, ONLY : PREFVAL USE MOD_POLYGON_UTL, ONLY : POLYGON_UTL_FILLDATAGRID USE MOD_INFO_PAR CONTAINS !###====================================================================== SUBROUTINE INFOMAIN() !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,J,IPLOT LOGICAL :: LEX,LADJ,LTB,LXY CHARACTER(LEN=52),ALLOCATABLE,DIMENSION(:) :: TMPNAME CALL WDIALOGSELECT(ID_DMANAGERTAB1) CALL WDIALOGGETMENU(ID_DMTABMENU,ACTLIST) CALL WDIALOGLOAD(ID_DINFO,ID_DINFO) JPLOT=0 !## select first selected file DO IPLOT=1,MXMPLOT; IF(MP(IPLOT)%ISEL)EXIT; ENDDO IF(IPLOT.GT.MXMPLOT)IPLOT=1 ALLOCATE(TMPNAME(MPW%NACT)); TMPNAME=MP%ALIAS CALL WDIALOGPUTMENU(IDF_MENU1,TMPNAME,MPW%NACT,IPLOT) DEALLOCATE(TMPNAME) CALL WDIALOGPUTMENU(IDF_MENU2,IDFTRANSFORM,NIDFTRANSFORM,1) CALL WDIALOGPUTDOUBLE(ID_XMIN2,MPW%XMIN,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_XMAX2,MPW%XMAX,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_DX2,(MPW%XMAX-MPW%XMIN),'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_YMIN2,MPW%YMIN,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_YMAX2,MPW%YMAX,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_DY2,(MPW%YMAX-MPW%YMIN),'(F15.3)') CALL WDIALOGPUTIMAGE(ID_INFO,ID_ICONINFO,1) CALL WDIALOGPUTIMAGE(ID_STAT,ID_ICONSOMVAL,1) CALL WDIALOGPUTIMAGE(ID_RENAME,ID_ICONRENAME,1) CALL WDIALOGPUTIMAGE(ID_EDIT,ID_ICONEDIT,1) CALL WDIALOGFIELDSTATE(ID_ADJUST,1) CALL WDIALOGFIELDSTATE(ID_ADJUSTTB,3) CALL WDIALOGFIELDSTATE(IDF_NOSAVE,3) CALL INFOFILL(0) CALL UTL_DIALOGSHOW(-1,-1,1,3) LADJ=.FALSE.; LEX =.FALSE.; LTB =.FALSE.; LXY =.FALSE. DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE1) CASE (IDF_MENU1) !## select other file CALL INFOFILL(1) END SELECT CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_EDIT) !## additional information CALL INFOEDIT() CALL INFOFILL(0) CASE (ID_RENAME) !## change alias CALL WDIALOGGETSTRING(IDF_STRING4,MP(IPLOT)%ALIAS) CASE (IDHELP) CALL UTL_GETHELP('3.4.3','MMO.MapInfo') CASE (IDCANCEL) EXIT CASE (ID_STAT) !## calculate statistics CALL WDIALOGGETMENU(IDF_MENU1,IPLOT) CALL INFOSTAT((/MP(IPLOT)%IDFNAME/),0,0) CASE (ID_INFO) !## open IDF edit window by cell CALL WDIALOGGETMENU(IDF_MENU1,IPLOT) IF(MP(IPLOT)%IPLOT.EQ.1)THEN; CALL UTL_EDITTABLE_INIT(IPLOT); CALL WDIALOGSELECT(ID_DINFO); ENDIF IF(MP(IPLOT)%IPLOT.EQ.5)THEN; IF(MDF_MAIN(IPLOT))CALL IDFPLOT(1); ENDIF ! IF(MP(IPLOT)%IPLOT.EQ.6)CALL POLYGON_UTL_FILLDATAGRID() CALL WDIALOGSELECT(ID_DINFO) CALL INFOFILL(0) CASE (ID_ADJUST) !## adjust no data value IF(.NOT.LEX)THEN CALL WDIALOGPUTSTRING(ID_ADJUST,'Apply') CALL WDIALOGFIELDSTATE(IDF_NOSAVE,1) J=1; LEX=.TRUE. ELSE CALL WDIALOGPUTSTRING(ID_ADJUST,'Adjust') CALL WDIALOGFIELDSTATE(IDF_NOSAVE,3) IF(INFOADJUST(ID_ADJUST))THEN; J=2; LEX=.FALSE.; LADJ=.TRUE.; ENDIF ENDIF CALL WDIALOGFIELDSTATE(ID_NODATA,J) CALL WDIALOGFIELDSTATE(IDF_MENU3,J) CALL WDIALOGFIELDSTATE(IDF_MENU2,J) IF(J.EQ.2)CALL INFOFILL(0) CASE (ID_ADJUSTTB) !## adjust Voxel definition Top/Bot IF(.NOT.LTB)THEN CALL WDIALOGPUTSTRING(ID_ADJUSTTB,'Store') J=1; LTB=.TRUE. ELSE CALL WDIALOGPUTSTRING(ID_ADJUSTTB,'Adjust') IF(INFOADJUST(ID_ADJUSTTB))THEN; J=2; LTB=.FALSE.; LADJ=.TRUE.; ENDIF ENDIF CALL WDIALOGFIELDSTATE(IDF_REAL1,J); CALL WDIALOGFIELDSTATE(IDF_REAL2,J) CALL WDIALOGFIELDSTATE(IDF_LABEL25,J); CALL WDIALOGFIELDSTATE(IDF_LABEL26,J) CALL WDIALOGFIELDSTATE(IDF_LABEL27,J); CALL WDIALOGFIELDSTATE(IDF_LABEL28,J) IF(J.EQ.2)CALL INFOFILL(0) CASE (ID_ADJUSTXY) !## adjust lower left corner IF(.NOT.LXY)THEN CALL WDIALOGPUTSTRING(ID_ADJUSTXY,'Save Adjustment') J=1; LXY=.TRUE. ELSE CALL WDIALOGPUTSTRING(ID_ADJUSTXY,'Adjust Lower Left Corner') IF(INFOADJUST(ID_ADJUSTXY))THEN; J=2; LXY=.FALSE.; LADJ=.TRUE.; ENDIF ENDIF CALL WDIALOGFIELDSTATE(ID_XMIN,J); CALL WDIALOGFIELDSTATE(ID_YMIN,J) IF(J.EQ.2)CALL INFOFILL(0) CASE (IDF_NOSAVE) !## cancel adjust options CALL WDIALOGPUTSTRING(ID_ADJUST,'Adjust') CALL WDIALOGFIELDSTATE(IDF_NOSAVE,3) !## restore nodata value CALL WDIALOGPUTDOUBLE(ID_NODATA,MP(IPLOT)%IDF%NODATA,'(F15.3)') CALL WDIALOGPUTOPTION(IDF_MENU2,MP(IPLOT)%UNITS+1) CALL WDIALOGPUTOPTION(IDF_MENU3,MP(IPLOT)%IDF%ITYPE/4) CALL WDIALOGFIELDSTATE(ID_NODATA,2) CALL WDIALOGFIELDSTATE(IDF_MENU3,2) CALL WDIALOGFIELDSTATE(IDF_MENU2,2) LEX=.FALSE. CASE (ID_MORE) !## create/show Metadata CALL INFOMETA() END SELECT END SELECT ENDDO CALL WDIALOGSELECT(ID_DINFO) CALL WDIALOGUNLOAD() IF(LADJ)CALL IDFPLOTFAST(0) END SUBROUTINE INFOMAIN !###====================================================================== SUBROUTINE INFOEDIT() !###====================================================================== IMPLICIT NONE INTEGER :: IU,I,IWIN,IPLOT,IOS,RECLEN CHARACTER(LEN=256) :: FNAME,LINE CHARACTER(LEN=52) :: DATESTRING CALL WDIALOGGETMENU(IDF_MENU1,IPLOT) CALL WDIALOGGETSTRING(IDF_STRING2,MP(IPLOT)%IDF%FNAME) MP(IPLOT)%IDF%IU=UTL_GETUNIT() RECLEN=UTL_GETRECORDLENGTH(MP(IPLOT)%IDF%FNAME)/4 CALL OSD_OPEN(MP(IPLOT)%IDF%IU,FILE=MP(IPLOT)%IDF%FNAME,STATUS='OLD',FORM='UNFORMATTED',ACCESS='DIRECT', & RECL=RECLEN,ACTION='READWRITE',IOSTAT=IOS) IF(IOS.NE.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD cannot adjust current file'//CHAR(13)// & TRIM(MP(IPLOT)%IDF%FNAME)//CHAR(13)//'IDF has been marked probably as READ-ONLY','Error') IF(MP(IPLOT)%IDF%IU.GT.0)CLOSE(IU) RETURN ENDIF !## read current comment CALL IDFGETCOMMENT(MP(IPLOT)%IDF,0) FNAME=TRIM(PREFVAL(1))//'\comments_'//TRIM(OSD_GETENV('USERNAME'))//'.txt' IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='UNKNOWN',ACTION='WRITE') IF(ASSOCIATED(MP(IPLOT)%IDF%COMMENT))THEN STRING='' DO I=1,SIZE(MP(IPLOT)%IDF%COMMENT) IF(I.EQ.1)THEN STRING=MP(IPLOT)%IDF%COMMENT(I) ELSE STRING=STRING(1:(I-1)*4)//MP(IPLOT)%IDF%COMMENT(I) ENDIF ENDDO WRITE(IU,'(A)') TRIM(STRING) ELSE WRITE(IU,*) '# General Information' WRITE(IU,*) '- Filename : '//TRIM(MP(IPLOT)%IDFNAME) CALL OSD_DATE_AND_TIME(DATEANDTIME=DATESTRING) WRITE(IU,*) '- Publication Date : '//TRIM(DATESTRING) WRITE(IU,*) '- Version Number : ' WRITE(IU,*) '- Comment : ' WRITE(IU,*) '# Description Data' WRITE(IU,*) '- Unit : ' WRITE(IU,*) '- Resolution : ' WRITE(IU,*) '- Source : ' WRITE(IU,*) '# Administration' WRITE(IU,*) '- Organisation : Deltares' WRITE(IU,*) '- Website : www.deltares.nl' WRITE(IU,*) '- Contactperson : '//TRIM(OSD_GETENV('USERNAME')) ENDIF CLOSE(IU) CALL WINDOWOPENCHILD(IWIN,FLAGS=SYSMENUON+OWNEDBYPARENT+NOFILESAVEAS,WIDTH=500,HEIGHT=400) CALL WEDITFILE(FNAME,ITYPE=MODAL,IDMENU=0, & IFLAGS=MUSTEXIST+WORDWRAP+NOFILENEWOPEN+NOFILESAVEAS+NOFILECLOSE,IFONT=COURIERNEW) IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='UNKNOWN',ACTION='READ') IF(IU.GT.0)THEN STRING='' I=0; DO READ(IU,'(A256)',IOSTAT=IOS) LINE IF(IOS.NE.0)EXIT IF(I.EQ.0)THEN STRING=TRIM(LINE) ELSE STRING=TRIM(STRING)//NEWLINE//TRIM(LINE) ENDIF I=I+1 ENDDO CLOSE(IU) CALL IDFFILLCOMMENT2(MP(IPLOT)%IDF,TRIM(STRING)) CALL IDFWRITECOMMENT(MP(IPLOT)%IDF,0) ENDIF CLOSE(MP(IPLOT)%IDF%IU); MP(IPLOT)%IDF%IU=0 CALL IDFDEALLOCATEX(MP(IPLOT)%IDF) END SUBROUTINE INFOEDIT !###====================================================================== SUBROUTINE INFOSTAT(FNAME,IU,IFORMAT,XMIN,YMIN,XMAX,YMAX) !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE,MESSAGE2 INTEGER,INTENT(IN) :: IU,IFORMAT INTEGER :: ITYPE,I,DID,ITYPE2,IEXIT CHARACTER(LEN=*),INTENT(IN),DIMENSION(:) :: FNAME REAL(KIND=DP_KIND),INTENT(IN),OPTIONAL :: XMIN,YMIN,XMAX,YMAX ALLOCATE(IDF(1)) DO I=1,SIZE(IDF); CALL IDFNULLIFY(IDF(I)); ENDDO !## fill idf%v instead of idf%x IDF(1)%IXV=1 IF(IU.EQ.0)THEN DID=WINFODIALOG(CURRENTDIALOG) CALL WDIALOGLOAD(ID_DINFOSTAT,ID_DINFOSTAT) ENDIF IF(PRESENT(XMIN))THEN CALL INFOSTAT_CALC(IU,IFORMAT,FNAME(1),XMIN,YMIN,XMAX,YMAX) ELSE CALL INFOSTAT_CALC(IU,IFORMAT,FNAME(1)) ENDIF I=1 IF(IU.EQ.0)THEN CALL WDIALOGPUTMENU(IDF_MENU1,FNAME,SIZE(FNAME),1) CALL WDIALOGPUTIMAGE(ID_GRAPH,ID_ICONHISTOGRAM,1) CALL WDIALOGPUTIMAGE(ID_CALC,ID_ICONCALC,1) CALL WDIALOGSELECT(ID_DINFOSTAT) CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_CALC) CALL WDIALOGGETMENU(IDF_MENU1,I) IF(PRESENT(XMIN))THEN CALL INFOSTAT_CALC(IU,IFORMAT,FNAME(I),XMIN,YMIN,XMAX,YMAX) ELSE CALL INFOSTAT_CALC(IU,IFORMAT,FNAME(I)) ENDIF CASE (ID_GRAPH) !## display graph GRAPHDIM(1)%GRAPHNAMES=TRIM(FNAME(I)(INDEX(FNAME(I),'\',.TRUE.)+1:)); GRAPHDIM(1)%TEXTSIZE=5.0D0 GRAPHDIM(1)%IFIXX=0; GRAPHDIM(1)%IFIXY=0; GRAPHDIM(1)%XTITLE='Percentile'; GRAPHDIM(1)%YTITLE='Values (-)'; GRAPHDIM(1)%LDATE=.FALSE. CALL GRAPH_INIT(3) DO CALL WMESSAGE(ITYPE2,MESSAGE2) CALL GRAPH_MAIN(ITYPE2,MESSAGE2,IEXIT=IEXIT) IF(IEXIT.EQ.1)EXIT ENDDO CALL WDIALOGSELECT(ID_DINFOSTAT) CASE (IDHELP) CALL UTL_GETHELP('3.4.3','MMO.MapInfo') CASE (IDCANCEL) EXIT END SELECT END SELECT ENDDO CALL WDIALOGSELECT(ID_DINFOSTAT); CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(DID) ENDIF CALL IDFDEALLOCATE(IDF,1); DEALLOCATE(IDF) CALL GRAPH_DEALLOCATE() END SUBROUTINE INFOSTAT !###====================================================================== SUBROUTINE INFOSTAT_CALC(IU,IFORMAT,FNAME,XMIN,YMIN,XMAX,YMAX) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IU,IFORMAT REAL(KIND=DP_KIND),INTENT(IN),OPTIONAL :: XMIN,YMIN,XMAX,YMAX CHARACTER(LEN=*),INTENT(IN) :: FNAME REAL(KIND=DP_KIND) :: D INTEGER :: I,I1,I2,NPOP,IROW,ICOL,JROW,JCOL REAL(KIND=DP_KIND) :: VAR,MEAN,XC,YC CHARACTER(LEN=1000) :: LINE IF(IU.EQ.0)THEN !## clear all DO I=1,WINFOGRID(IDF_GRID1,GRIDROWSMAX) CALL WGRIDCLEARCELL(IDF_GRID1,1,I) CALL WGRIDCLEARCELL(IDF_GRID1,2,I) ENDDO ENDIF !## not IDF IF(INDEX(UTL_CAP(FNAME,'U'),'.IDF',.TRUE.).EQ.0)RETURN !## all IF(.NOT.PRESENT(XMIN))THEN IF(IDFOPEN(IDF(1)%IU,FNAME,'RO',IDF(1)%ITYPE,1,IQUESTION=1).AND. & IDFREADDIM(1,IDF(1)).AND. & IDFREADDATA(1,IDF(1)))THEN ELSE IF(IDF(1)%IU.GT.0)CLOSE(IDF(1)%IU); RETURN ENDIF !## window ELSE IF(.NOT.IDFREAD(IDF(1),FNAME,0))RETURN IF(.NOT.IDFREADPART(IDF(1),XMIN,YMIN,XMAX,YMAX))RETURN ENDIF IF(IDF(1)%IU.GT.0)CLOSE(IDF(1)%IU) !## perform selection if selidf is available IF(ALLOCATED(SELIDF))THEN ALLOCATE(IDF(1)%X(IDF(1)%NCOL,IDF(1)%NROW)); IDF(1)%X=0.0D0 !## get selected cells DO I=1,SELIDF(1)%NTHREAD !## cell-indices from selection ICOL=INT(SELIDF(1)%YSEL(1,I)); IROW=INT(SELIDF(1)%YSEL(2,I)) !## get x/y coordinates CALL IDFGETLOC(SELIDF(1),IROW,ICOL,XC,YC) !## get irow/icol for current idf CALL IDFIROWICOL(IDF(1),JROW,JCOL,XC,YC) !## blank IF(JCOL.NE.0.AND.JROW.NE.0)IDF(1)%X(JCOL,JROW)=1.0D0 ENDDO I=0; DO IROW=1,IDF(1)%NROW; DO ICOL=1,IDF(1)%NCOL; I=I+1 IF(IDF(1)%X(ICOL,IROW).EQ.0.0D0)IDF(1)%V(I)=IDF(1)%NODATA ENDDO; ENDDO ENDIF !## get statistics CALL UTL_STDEF(IDF(1)%V,SIZE(IDF(1)%V),IDF(1)%NODATA,VAR,MEAN,NPOP) !## write statistics to file IF(IU.GT.0)THEN I1=INDEX(FNAME,'\',.TRUE.)+1; I2=INDEX(FNAME,'.',.TRUE.)-1 WRITE(LINE,'(A20,A1,I15,A1,2(F15.7,A1))') FNAME(I1:I2),',',NPOP,',',MEAN,',',VAR CALL INFOSTAT_PERC(IU,LINE,IFORMAT) WRITE(IU,'(A)') TRIM(LINE) RETURN ELSE CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,1,'Sample') D=DBLE(SIZE(IDF(1)%V)) CALL WGRIDPUTCELLDOUBLE(IDF_GRID1,2,1,D,'(G15.9)') CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,2,'Population') D=DBLE(NPOP) CALL WGRIDPUTCELLDOUBLE(IDF_GRID1,2,2,D,'(G15.9)') CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,3,'Mean') D=DBLE(MEAN) CALL WGRIDPUTCELLDOUBLE(IDF_GRID1,2,3,D,'(G15.9)') CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,4,'Variance') D=VAR CALL WGRIDPUTCELLDOUBLE(IDF_GRID1,2,4,D,'(G15.9)') CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,5,'Sum') D=MEAN*DBLE(NPOP) CALL WGRIDPUTCELLDOUBLE(IDF_GRID1,2,5,D,'(G15.9)') CALL INFOSTAT_PERC(IU,LINE,0) ENDIF END SUBROUTINE INFOSTAT_CALC !###====================================================================== SUBROUTINE INFOSTAT_PERC(IU,LINE,IFORMAT) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IU,IFORMAT CHARACTER(LEN=*),INTENT(INOUT) :: LINE INTEGER :: NPERC,I,J,NAJ REAL(KIND=DP_KIND) :: D REAL(KIND=DP_KIND) :: DPERC REAL(KIND=DP_KIND),DIMENSION(:),ALLOCATABLE :: XCOPY IF(IU.EQ.0)THEN CALL WDIALOGSELECT(ID_DINFOSTAT) CALL WDIALOGGETDOUBLE(IDF_REAL1,DPERC) IF(DPERC.LE.0.0D0.OR.DPERC.GE.100.0D0)THEN DPERC=10.0D0 CALL WDIALOGPUTDOUBLE(IDF_REAL1,DPERC) ENDIF ELSE DPERC=5.0 ENDIF NPERC=INT(100.0D0/DPERC) IF(MOD(100.0D0,DPERC).EQ.0.0D0)NPERC=NPERC-1 IF(ALLOCATED(GRAPH))CALL GRAPH_DEALLOCATE() CALL GRAPH_ALLOCATE(1,1) ALLOCATE(GRAPH(1,1)%RX(NPERC+2)) ALLOCATE(GRAPH(1,1)%RY(NPERC+2)) GRAPH(1,1)%RX(1)=DPERC DO I=2,NPERC GRAPH(1,1)%RX(I)=GRAPH(1,1)%RX(I-1)+DPERC END DO !## get percentiles ALLOCATE(XCOPY(SIZE(IDF(1)%V))); XCOPY=IDF(1)%V CALL UTL_GETMED(XCOPY,SIZE(XCOPY),IDF(1)%NODATA,GRAPH(1,1)%RX,NPERC,NAJ,GRAPH(1,1)%RY) DO I=NPERC+1,2,-1 GRAPH(1,1)%RX(I)=GRAPH(1,1)%RX(I-1) GRAPH(1,1)%RY(I)=GRAPH(1,1)%RY(I-1) END DO GRAPH(1,1)%RX(1)=0.0D0 GRAPH(1,1)%RY(1)=XCOPY(1) !## if not yet computed (100%) NPERC=NPERC+2 GRAPH(1,1)%RX(NPERC)=100.0D0 GRAPH(1,1)%RY(NPERC)=IDF(1)%NODATA IF(NAJ.GT.0)THEN GRAPH(1,1)%RY(NPERC)=XCOPY(NAJ) ENDIF GRAPH(1,1)%NP=NPERC GRAPH(1,1)%GTYPE=1 GRAPH(1,1)%LEGTXT='Value' GRAPH(1,1)%ICLR=WRGB(56,180,176) DEALLOCATE(XCOPY) J=5 IF(IU.EQ.0)THEN !## put percentiles into grid DO I=1,NPERC CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,I+J,'Percentile '//TRIM(RTOS(GRAPH(1,1)%RX(I),'F',2))) D=GRAPH(1,1)%RY(I) CALL WGRIDPUTCELLDOUBLE(IDF_GRID1,2,I+J,D,'(F15.3)') END DO ELSE SELECT CASE (IFORMAT) CASE (0) DO I=1,NPERC WRITE(LINE,'(A,A1,F16.7)') TRIM(LINE),',',GRAPH(1,1)%RY(I) ENDDO CASE (1) WRITE(LINE,'(A,3(A1,F16.7))') TRIM(LINE),',',GRAPH(1,1)%RY(1),',',GRAPH(1,1)%RY(NPERC),',',GRAPH(1,1)%RY(NPERC/2) END SELECT ENDIF END SUBROUTINE INFOSTAT_PERC !###====================================================================== LOGICAL FUNCTION INFOADJUST(ID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID INTEGER :: IPLOT,IROW,ICOL,IDOUBLE REAL(KIND=DP_KIND) :: X1,Y1,NODATA INFOADJUST=.FALSE. CALL WDIALOGGETMENU(IDF_MENU1,IPLOT) !## change of units is only changing mp() variable SELECT CASE (ID) CASE (ID_ADJUST) CALL WDIALOGGETDOUBLE(ID_NODATA,NODATA) CALL WDIALOGGETMENU(IDF_MENU3,IDOUBLE); IDOUBLE=IDOUBLE*4 !## only adjust units if current nodata is different IF(NODATA.EQ.MP(IPLOT)%IDF%NODATA.AND.IDOUBLE.EQ.MP(IPLOT)%IDF%ITYPE)THEN CALL WDIALOGGETMENU(IDF_MENU2,MP(IPLOT)%UNITS) MP(IPLOT)%UNITS=MP(IPLOT)%UNITS-1 INFOADJUST=.TRUE.; RETURN ENDIF END SELECT !## read IDF IF(IDFREAD(MP(IPLOT)%IDF,MP(IPLOT)%IDFNAME,1))THEN SELECT CASE (ID) CASE (ID_ADJUST) CALL WDIALOGGETDOUBLE(ID_NODATA,NODATA) CALL WDIALOGGETMENU(IDF_MENU3,IDOUBLE); IDOUBLE=IDOUBLE*4 CALL WDIALOGGETMENU(IDF_MENU2,MP(IPLOT)%UNITS) MP(IPLOT)%UNITS=MP(IPLOT)%UNITS-1 DO IROW=1,MP(IPLOT)%IDF%NROW DO ICOL=1,MP(IPLOT)%IDF%NCOL IF(MP(IPLOT)%IDF%X(ICOL,IROW).EQ.MP(IPLOT)%IDF%NODATA)MP(IPLOT)%IDF%X(ICOL,IROW)=NODATA ENDDO ENDDO MP(IPLOT)%IDF%NODATA=NODATA IF(IDOUBLE.EQ.4.AND.MP(IPLOT)%IDF%ITYPE.EQ.8)THEN CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to convert a Double Precision IDF into Single Precision ?','Question') IF(WINFODIALOG(4).EQ.1)MP(IPLOT)%IDF%ITYPE =IDOUBLE ELSE MP(IPLOT)%IDF%ITYPE =IDOUBLE ENDIF CASE (ID_ADJUSTTB) CALL WDIALOGGETDOUBLE(IDF_REAL1,MP(IPLOT)%IDF%TOP); CALL WDIALOGGETDOUBLE(IDF_REAL2,MP(IPLOT)%IDF%BOT) IF(MP(IPLOT)%IDF%TOP.LE.MP(IPLOT)%IDF%BOT)THEN; MP(IPLOT)%IDF%ITB=0 ELSE; MP(IPLOT)%IDF%ITB=1; ENDIF CASE (ID_ADJUSTXY) X1=MP(IPLOT)%IDF%XMIN; Y1=MP(IPLOT)%IDF%YMIN CALL WDIALOGGETDOUBLE(ID_XMIN,MP(IPLOT)%IDF%XMIN) CALL WDIALOGGETDOUBLE(ID_YMIN,MP(IPLOT)%IDF%YMIN) X1=MP(IPLOT)%IDF%XMIN-X1; Y1=MP(IPLOT)%IDF%YMIN-Y1 MP(IPLOT)%IDF%XMAX=MP(IPLOT)%IDF%XMAX+X1 MP(IPLOT)%IDF%YMAX=MP(IPLOT)%IDF%YMAX+Y1 END SELECT INFOADJUST=IDFWRITE(MP(IPLOT)%IDF,MP(IPLOT)%IDFNAME,1) ENDIF CALL IDFDEALLOCATEX(MP(IPLOT)%IDF) IF(.NOT.INFOADJUST)CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'iMOD cannot change the IDF.','Information') END FUNCTION INFOADJUST !###====================================================================== SUBROUTINE INFOFILL(IOPTION) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IOPTION INTEGER,PARAMETER :: MAXIDS1=12 INTEGER,PARAMETER :: MAXIDS2=17 INTEGER :: I,J,IPLOT,N,IFRM REAL(KIND=DP_KIND) :: MINCS,MAXCS INTEGER,DIMENSION(MAXIDS1) :: IDS1 INTEGER,DIMENSION(MAXIDS2) :: IDS2 CHARACTER(LEN=256) :: FNAME CHARACTER(LEN=7),DIMENSION(2) :: FRM LOGICAL :: LEX DATA IDS1/IDF_LABEL8,IDF_LABEL16,IDF_LABEL25,IDF_LABEL26, & IDF_LABEL27,IDF_LABEL28, & IDF_LABEL11,IDF_LABEL24,ID_ADJUST,IDF_LABEL10,IDF_LABEL5,IDF_LABEL33/ DATA IDS2/ID_DXMIN,ID_DXMAX,ID_DYMIN,ID_DYMAX,IDF_REAL1,IDF_REAL2,ID_NODATA,IDF_MENU2,& ID_ADJUSTTB,ID_ZMIN2,ID_ZMAX2,ID_ZMIN,ID_ZMAX,ID_DZ,ID_DZ2,ID_ADJUSTXY,IDF_MENU3/ DATA FRM/'(G13.7)','(G15.9)'/ CALL WDIALOGGETMENU(IDF_MENU1,IPLOT) IF(IOPTION.EQ.1.AND.JPLOT.NE.0)THEN CALL WDIALOGGETSTRING(IDF_STRING4,STRING) IF(UTL_CAP(STRING,'U').NE.UTL_CAP(MP(JPLOT)%ALIAS,'U'))THEN CALL WMESSAGEBOX(YESNOCANCEL,QUESTIONICON,COMMONNO,'Do you want to store the modified alias ?','Question') IF(WINFODIALOG(4).EQ.1)THEN MP(JPLOT)%ALIAS=STRING ENDIF ENDIF ENDIF JPLOT=IPLOT CALL WDIALOGFIELDSTATE(IDF_STRING4,1) CALL WDIALOGPUTSTRING(IDF_STRING4,MP(IPLOT)%ALIAS) !## change field state based on filetype SELECT CASE (MP(IPLOT)%IPLOT) !## idf/mdf CASE (1,5) J=1; DO I=1 ,MAXIDS1; CALL WDIALOGFIELDSTATE(IDS1(I),J); END DO J=2; DO I=1 ,MAXIDS2; CALL WDIALOGFIELDSTATE(IDS2(I),J); END DO CASE DEFAULT J=3; DO I=1 ,MAXIDS1; CALL WDIALOGFIELDSTATE(IDS1(I),J); END DO J=3; DO I=1 ,MAXIDS2; CALL WDIALOGFIELDSTATE(IDS2(I),J); END DO END SELECT IF(MP(IPLOT)%IPLOT.EQ.1.OR.MP(IPLOT)%IPLOT.EQ.5)THEN CALL WDIALOGFIELDSTATE(ID_STAT,1) ELSE CALL WDIALOGFIELDSTATE(ID_STAT,3) ENDIF IF(MP(IPLOT)%IPLOT.EQ.1.OR.MP(IPLOT)%IPLOT.EQ.5)THEN !## get idf for mdf file LEX=.TRUE. IF(MP(IPLOT)%IPLOT.EQ.5)THEN FNAME=MP(IPLOT)%IDFNAME !## read *.mdf file, only to get selected idf to be plotted IF(READMDF(MP(IPLOT)%IDFNAME,N))THEN MP(IPLOT)%IDFNAME=MDF(MP(IPLOT)%NLIDF)%FNAME CALL MDFDEALLOCATE() ENDIF CALL WDIALOGPUTSTRING(IDF_LABEL30,'Selected:') ELSE CALL WDIALOGPUTSTRING(IDF_LABEL30,'Fullname:') ENDIF CALL WDIALOGFIELDSTATE(ID_INFO,1) CALL WDIALOGPUTSTRING(IDF_STRING2,TRIM(MP(IPLOT)%IDFNAME)) IF(LEX)THEN LEX=IDFREAD(MP(IPLOT)%IDF,MP(IPLOT)%IDFNAME,0) IF(LEX)THEN !## place comments, if found IF(.NOT.ASSOCIATED(MP(IPLOT)%IDF%COMMENT))THEN CALL WDIALOGPUTSTRING(IDF_STRING3,'No additional information found') ELSE STRING='' DO I=1,SIZE(MP(IPLOT)%IDF%COMMENT) IF(I.EQ.1)THEN STRING=MP(IPLOT)%IDF%COMMENT(I) ELSE STRING=STRING(1:(I-1)*4)//MP(IPLOT)%IDF%COMMENT(I) ENDIF ENDDO CALL WDIALOGPUTSTRING(IDF_STRING3,TRIM(STRING)) ENDIF CALL WDIALOGPUTSTRING(ID_TXT1,'Map Size: '//TRIM(ITOS(MP(IPLOT)%IDF%NCOL))//' columns x '// & TRIM(ITOS(MP(IPLOT)%IDF%NROW))//' rows') CALL WDIALOGPUTDOUBLE(ID_XMIN,MP(IPLOT)%IDF%XMIN,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_XMAX,MP(IPLOT)%IDF%XMAX,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_DX,MP(IPLOT)%IDF%XMAX-MP(IPLOT)%IDF%XMIN,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_YMIN,MP(IPLOT)%IDF%YMIN,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_YMAX,MP(IPLOT)%IDF%YMAX,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_DY,MP(IPLOT)%IDF%YMAX-MP(IPLOT)%IDF%YMIN,'(F15.3)') CALL WDIALOGPUTOPTION(IDF_MENU2,MP(IPLOT)%UNITS+1) IFRM=MP(IPLOT)%IDF%ITYPE/4; CALL WDIALOGPUTOPTION(IDF_MENU3,IFRM) CALL WDIALOGPUTDOUBLE(ID_NODATA,MP(IPLOT)%IDF%NODATA,FRM(IFRM)) CALL WDIALOGPUTDOUBLE(ID_ZMIN,MP(IPLOT)%IDF%DMIN,FRM(IFRM)) CALL WDIALOGPUTDOUBLE(ID_ZMAX,MP(IPLOT)%IDF%DMAX,FRM(IFRM)) CALL WDIALOGPUTDOUBLE(ID_DZ,MP(IPLOT)%IDF%DMAX-MP(IPLOT)%IDF%DMIN,FRM(IFRM)) !## handle Shown Value IF(DRWLIST(IPLOT).EQ.1)THEN CALL WDIALOGFIELDSTATE(ID_ZMIN2,2); CALL WDIALOGFIELDSTATE(ID_ZMAX2,2); CALL WDIALOGFIELDSTATE(ID_DZ2,2) CALL WDIALOGPUTDOUBLE(ID_ZMIN2,MP(IPLOT)%UMIN,FRM(IFRM)) CALL WDIALOGPUTDOUBLE(ID_ZMAX2,MP(IPLOT)%UMAX,FRM(IFRM)) IF(MP(IPLOT)%UMAX.LT.MP(IPLOT)%UMIN)THEN CALL WDIALOGPUTDOUBLE(ID_DZ2,HUGE(1.0D0),FRM(IFRM)) ELSE CALL WDIALOGPUTDOUBLE(ID_DZ2,MP(IPLOT)%UMAX-MP(IPLOT)%UMIN,FRM(IFRM)) ENDIF ELSE !## selected file is not drawn, field zero and greyed out CALL WDIALOGPUTDOUBLE(ID_ZMIN2,0.0D0,FRM(IFRM)); CALL WDIALOGFIELDSTATE(ID_ZMIN2,3) CALL WDIALOGPUTDOUBLE(ID_ZMAX2,0.0D0,FRM(IFRM)); CALL WDIALOGFIELDSTATE(ID_ZMAX2,3) CALL WDIALOGPUTDOUBLE(ID_DZ2, 0.0D0,FRM(IFRM)); CALL WDIALOGFIELDSTATE(ID_DZ2,3) ENDIF IF(MP(IPLOT)%IDF%IEQ.EQ.0)THEN CALL WDIALOGPUTDOUBLE(ID_DXMIN,MP(IPLOT)%IDF%DX,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_DYMIN,MP(IPLOT)%IDF%DY,'(F15.3)') CALL WDIALOGFIELDSTATE(ID_DYMAX,3) CALL WDIALOGFIELDSTATE(ID_DXMAX,3) ELSE MINCS=MP(IPLOT)%IDF%XMAX-MP(IPLOT)%IDF%XMIN MAXCS=0.0D0 DO I=1,MP(IPLOT)%IDF%NCOL MINCS=MIN(MINCS,MP(IPLOT)%IDF%SX(I)-MP(IPLOT)%IDF%SX(I-1)) MAXCS=MAX(MAXCS,MP(IPLOT)%IDF%SX(I)-MP(IPLOT)%IDF%SX(I-1)) END DO CALL WDIALOGPUTDOUBLE(ID_DXMIN,MINCS,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_DXMAX,MAXCS,'(F15.3)') MINCS=MP(IPLOT)%IDF%YMAX-MP(IPLOT)%IDF%YMIN MAXCS=0.0D0 DO I=1,MP(IPLOT)%IDF%NROW MINCS=MIN(MINCS,MP(IPLOT)%IDF%SY(I-1)-MP(IPLOT)%IDF%SY(I)) MAXCS=MAX(MAXCS,MP(IPLOT)%IDF%SY(I-1)-MP(IPLOT)%IDF%SY(I)) END DO CALL WDIALOGFIELDSTATE(ID_DYMAX,2) CALL WDIALOGFIELDSTATE(ID_DXMAX,2) CALL WDIALOGPUTDOUBLE(ID_DYMIN,MINCS,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_DYMAX,MAXCS,'(F15.3)') ENDIF CALL WDIALOGFIELDSTATE(ID_ADJUSTTB,1) IF(MP(IPLOT)%IDF%ITB.EQ.0)THEN CALL WDIALOGFIELDSTATE(IDF_REAL1,3) CALL WDIALOGFIELDSTATE(IDF_REAL2,3) CALL WDIALOGFIELDSTATE(IDF_LABEL25,2) CALL WDIALOGFIELDSTATE(IDF_LABEL26,2) CALL WDIALOGFIELDSTATE(IDF_LABEL27,2) CALL WDIALOGFIELDSTATE(IDF_LABEL28,2) ELSE CALL WDIALOGFIELDSTATE(IDF_REAL1,2) CALL WDIALOGFIELDSTATE(IDF_REAL2,2) CALL WDIALOGPUTDOUBLE(IDF_REAL1,MP(IPLOT)%IDF%TOP,'(F15.3)') CALL WDIALOGPUTDOUBLE(IDF_REAL2,MP(IPLOT)%IDF%BOT,'(F15.3)') CALL WDIALOGFIELDSTATE(IDF_LABEL25,1) CALL WDIALOGFIELDSTATE(IDF_LABEL26,1) CALL WDIALOGFIELDSTATE(IDF_LABEL27,1) CALL WDIALOGFIELDSTATE(IDF_LABEL28,1) ENDIF ELSE !## LEX statement !## Initial field states: empty. In case file is in MP() but deleted from drive J=3; DO I=1 ,MAXIDS1; CALL WDIALOGFIELDSTATE(IDS1(I),J); END DO J=3; DO I=1 ,MAXIDS2; CALL WDIALOGFIELDSTATE(IDS2(I),J); END DO CALL WDIALOGPUTSTRING(IDF_STRING2,'File does not exist') CALL WDIALOGPUTSTRING(ID_TXT1,'Map Size: * columns x * rows') CALL WDIALOGFIELDSTATE(IDF_STRING4,3) CALL WDIALOGPUTDOUBLE(ID_XMIN,0.0D0,'(F15.3)') ; CALL WDIALOGPUTDOUBLE(ID_XMAX,0.0D0,'(F15.3)') ; CALL WDIALOGPUTDOUBLE(ID_DX,0.0D0,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_YMIN,0.0D0,'(F15.3)') ; CALL WDIALOGPUTDOUBLE(ID_YMAX,0.0D0,'(F15.3)') ; CALL WDIALOGPUTDOUBLE(ID_DY,0.0D0,'(F15.3)') ENDIF !## deallocate idf%x CALL IDFDEALLOCATEX(MP(IPLOT)%IDF) IF(MP(IPLOT)%IDF%IU.GT.0)CLOSE(MP(IPLOT)%IDF%IU); MP(IPLOT)%IDF%IU=0 ENDIF !## LEX statement IF(MP(IPLOT)%IPLOT.EQ.5)MP(IPLOT)%IDFNAME=FNAME CALL WDIALOGFIELDSTATE(ID_EDIT,1) !## ipf's/iff's/gen's ELSE CALL WDIALOGPUTSTRING(IDF_LABEL30,'Fullname:') ! IF(MP(IPLOT)%IPLOT.EQ.6)THEN !## genfile to be used for datagrid plotting ! CALL WDIALOGFIELDSTATE(ID_INFO,1) ! ELSE CALL WDIALOGFIELDSTATE(ID_INFO,2) ! ENDIF CALL WDIALOGPUTSTRING(IDF_STRING2,TRIM(MP(IPLOT)%IDFNAME)) CALL WDIALOGFIELDSTATE(ID_EDIT,0) CALL WDIALOGPUTDOUBLE(ID_XMIN,MP(IPLOT)%XMIN,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_XMAX,MP(IPLOT)%XMAX,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_DX,MP(IPLOT)%XMAX-MP(IPLOT)%XMIN,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_YMIN,MP(IPLOT)%YMIN,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_YMAX,MP(IPLOT)%YMAX,'(F15.3)') CALL WDIALOGPUTDOUBLE(ID_DY,MP(IPLOT)%YMAX-MP(IPLOT)%YMIN,'(F15.3)') CALL WDIALOGFIELDSTATE(ID_ADJUST,3) CALL WDIALOGFIELDSTATE(ID_ADJUSTTB,3) IF(MP(IPLOT)%IPLOT.EQ.2)CALL WDIALOGPUTSTRING(ID_TXT1,'IPF File') IF(MP(IPLOT)%IPLOT.EQ.3)CALL WDIALOGPUTSTRING(ID_TXT1,'IFF File') IF(MP(IPLOT)%IPLOT.EQ.4)CALL WDIALOGPUTSTRING(ID_TXT1,'ISG File') IF(MP(IPLOT)%IPLOT.EQ.6)CALL WDIALOGPUTSTRING(ID_TXT1,'GEN File') CALL WDIALOGPUTSTRING(IDF_STRING3,'No additional information found') IF(MP(IPLOT)%ILEG.EQ.1)THEN CALL WDIALOGFIELDSTATE(ID_ZMIN,1) CALL WDIALOGFIELDSTATE(ID_ZMAX,1) CALL WDIALOGFIELDSTATE(ID_DZ ,1) CALL WDIALOGFIELDSTATE(IDF_LABEL5,1) CALL WDIALOGPUTDOUBLE(ID_ZMIN,MP(IPLOT)%UMIN,'(G15.9)') CALL WDIALOGPUTDOUBLE(ID_ZMAX,MP(IPLOT)%UMAX,'(G15.9)') CALL WDIALOGPUTDOUBLE(ID_DZ,MP(IPLOT)%UMAX-MP(IPLOT)%UMIN,'(G15.9)') ENDIF ENDIF END SUBROUTINE INFOFILL !###====================================================================== SUBROUTINE INFOMETA() !###====================================================================== IMPLICIT NONE INTEGER :: I,IU,IWIN,IPLOT LOGICAL :: LEX CHARACTER(LEN=52) :: DATESTRING CALL WDIALOGGETMENU(IDF_MENU1,IPLOT) CALL WINDOWOPENCHILD(IWIN,FLAGS=SYSMENUON+OWNEDBYPARENT,WIDTH=500,HEIGHT=400) I=INDEXNOCASE(MP(IPLOT)%IDFNAME,'.IDF',.TRUE.) INQUIRE(FILE=MP(IPLOT)%IDFNAME(1:I)//'MET',EXIST=LEX) IF(.NOT.LEX)THEN IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=MP(IPLOT)%IDFNAME(1:I)//'MET',STATUS='UNKNOWN',FORM='FORMATTED') WRITE(IU,*) '# General Information' WRITE(IU,*) '- Filename : '//TRIM(MP(IPLOT)%IDFNAME) CALL OSD_DATE_AND_TIME(DATEANDTIME=DATESTRING) WRITE(IU,*) '- Publication Date : '//TRIM(DATESTRING) WRITE(IU,*) '- Version Number : ' WRITE(IU,*) '- Comment : ' WRITE(IU,*) '# Description Data' WRITE(IU,*) '- Unit : ' WRITE(IU,*) '- Resolution : ' WRITE(IU,*) '- Source : ' WRITE(IU,*) '# Administration' WRITE(IU,*) '- Organisation : Deltares' WRITE(IU,*) '- Website : www.deltares.nl' WRITE(IU,*) '- Contactperson : '//TRIM(OSD_GETENV('USERNAME')) WRITE(IU,*) '- Email adress : ' CLOSE(IU) ENDIF CALL WEDITFILE(MP(IPLOT)%IDFNAME(1:I)//'MET',ITYPE=MODAL,IDMENU=0, & IFLAGS=MUSTEXIST+WORDWRAP+NOFILENEWOPEN+NOFILESAVEAS,IFONT=COURIERNEW) END SUBROUTINE INFOMETA END MODULE MOD_INFO