!! 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_SCENTOOL_WELLS USE WINTERACTER USE RESOURCE USE MOD_DBL USE MOD_IDFPLOT USE MODPLOT, ONLY : MPW USE MOD_SCENTOOL_PAR USE MOD_SCENTOOL_UTL USE MOD_UTL, ONLY : UTL_HIDESHOWDIALOG,JDATETOGDATE,ITOS,RTOS,GDATETOJDATE,UTL_GETUNIT,UTL_JDATETOIDATE, & UTL_CREATEDIR,UTL_IDATETOJDATE,UTL_GETMED,UTL_PCK_READTXT,UTL_PCK_GETTLP USE MOD_IDF, ONLY : IDFIROWICOL,IDFGETVAL,IDFREAD,IDFDEALLOCATE USE MOD_OSD, ONLY : OSD_OPEN USE MOD_IPF, ONLY : IPFREAD2,IPF,IPFWRITE INTEGER,PRIVATE :: ITIME !## fill in dates (1) fill in durations (2) CHARACTER(LEN=10),PRIVATE :: CDATE INTEGER,PRIVATE :: IMODE CONTAINS !###====================================================================== SUBROUTINE STWEL1INIT(IOPT) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IOPT IMODE=IOPT IF(IOPT.EQ.ID_ADD)THEN IF(NWEL.EQ.MAXNWEL)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You cannot add another WEL SYSTEM in the current configuration.'//CHAR(13)// & 'Currently the maximum WEL SYSTEMS is '//TRIM(ITOS(MAXNWEL))//'.'//CHAR(13)// & 'Increase/add the keyword MAXNWEL= in the PUMPING TOOL file to increase the number of WEL SYSTEMS allowed','Information') IMODE=0 CALL STWEL1CLOSE() IMODE=IOPT RETURN ENDIF NWEL =NWEL+1 IWEL =NWEL WEL(IWEL)%CNAME='Well Field '//TRIM(ITOS(IWEL)) WEL(IWEL)%NLOC =0 WEL(IWEL)%NQ =0 WEL(IWEL)%ILOCT=1 WEL(IWEL)%ICLR =WRGB(255,0,0) WEL(IWEL)%ISYMBOL=28 ALLOCATE(WEL(IWEL)%Q(NROWQ)) ALLOCATE(WEL(IWEL)%LOC(NROWL)) ELSE CALL WDIALOGSELECT(ID_DSCENTOOLTAB1) CALL WDIALOGGETMENU(IDF_MENU1,IWEL) ENDIF CALL UTL_HIDESHOWDIALOG(ID_DSCENTOOL,0) CALL WINDOWSELECT(0) CALL WMENUSETSTATE(ID_SCENTOOL,1,0) CALL WDIALOGSELECT(ID_DSCENTOOL_PROPTAB1) CALL WDIALOGPUTSTRING(IDF_LABEL1,'Well System name:') CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO2) !## start enter durations !## put grid columnlabels CALL WGRIDLABELCOLUMN(IDF_GRID1,1,'Start Date') CALL WGRIDLABELCOLUMN(IDF_GRID1,2,'Duration') CALL WGRIDLABELCOLUMN(IDF_GRID1,3,'Rate (m3/hr)') CALL STWEL1PUTFIELDS() CALL ST1_PROPUPDATEGRID(1) CALL ST1_PROPFIELDS() !## initialize date in grid CALL WDIALOGSELECT(ID_DSCENTOOL_PROPTAB1) IF(WEL(IWEL)%NQ.EQ.0)THEN CALL WDIALOGGETSTRING(IDF_STRING2,CDATE) CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,1,CDATE) ENDIF CALL WDIALOGSELECT(ID_DSCENTOOL_PROP) CALL WDIALOGSETTAB(IDF_TAB,ID_DSCENTOOL_PROPTAB1) CALL WDIALOGTITLE('Well Systems') CALL UTL_DIALOGSHOW(-1,-1,0,2) END SUBROUTINE STWEL1INIT !###====================================================================== SUBROUTINE STWEL1MAIN(ITYPE,MESSAGE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ITYPE TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE CALL WDIALOGSELECT(ID_DSCENTOOL_PROP) SELECT CASE (MESSAGE%WIN) !## main dialog CASE (ID_DSCENTOOL_PROP) SELECT CASE (ITYPE) CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) !## quit well editing CASE (IDCANCEL) CALL STWEL1CLOSE() END SELECT CASE (TABCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (ID_DSCENTOOL_PROPTAB3) CALL ST_SYMBOLDRAW(ID_DSCENTOOL_PROPTAB3,IDF_PICTURE1,IDF_MENU1,IDF_INTEGER1) END SELECT END SELECT !## well strengths CASE (ID_DSCENTOOL_PROPTAB1) SELECT CASE (ITYPE) CASE (FIELDCHANGED) CALL ST1_PROPFIELDS() CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_OPEN,ID_SAVEAS) CALL ST1_PROPOPENSAVE(MESSAGE%VALUE1,ID_DSCENTOOL_PROPTAB1,1) CASE (ID_GRAPH) CALL ST1_PROPGRAPH(1) CASE (ID_CALC) CALL ST1_PROPUPDATEGRID(1) END SELECT END SELECT !## well locations CASE (ID_DSCENTOOL_PROPTAB2) SELECT CASE (ITYPE) CASE (FIELDCHANGED) ! CALL ST1_PROPFIELDS()() CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_OPEN,ID_SAVEAS) CALL ST1_PROPOPENSAVE(MESSAGE%VALUE1,ID_DSCENTOOL_PROPTAB2,1) CASE (ID_MOVE,ID_DRAW,ID_DELETE) CALL WDIALOGSELECT(ID_DSCENTOOL_PROPTAB2) CALL WDIALOGFIELDSTATE(ID_OPEN,2) CALL WDIALOGFIELDSTATE(ID_SAVEAS,2) IF(MESSAGE%VALUE1.EQ.ID_MOVE)THEN CALL WDIALOGFIELDSTATE(ID_DRAW,2) CALL WDIALOGFIELDSTATE(ID_DELETE,2) CALL ST_DRAWPNTS(ID_DSCENTOOL_PROPTAB2,IDF_GRID1,(/4,5/),2,WEL(IWEL)%ISYMBOL,WEL(IWEL)%ICLR,1) !## move ELSEIF(MESSAGE%VALUE1.EQ.ID_DELETE)THEN CALL WDIALOGFIELDSTATE(ID_DRAW,2) CALL WDIALOGFIELDSTATE(ID_MOVE,2) CALL ST_DRAWPNTS(ID_DSCENTOOL_PROPTAB2,IDF_GRID1,(/4,5/),3,WEL(IWEL)%ISYMBOL,WEL(IWEL)%ICLR,1) !## delete ELSE CALL WDIALOGFIELDSTATE(ID_MOVE,2) CALL WDIALOGFIELDSTATE(ID_DELETE,2) CALL ST_DRAWPNTS(ID_DSCENTOOL_PROPTAB2,IDF_GRID1,(/4,5/),1,WEL(IWEL)%ISYMBOL,WEL(IWEL)%ICLR,1) !## add ENDIF CALL WDIALOGSELECT(ID_DSCENTOOL_PROPTAB2) CALL WDIALOGFIELDSTATE(ID_OPEN,1) CALL WDIALOGFIELDSTATE(ID_SAVEAS,1) CALL WDIALOGFIELDSTATE(ID_MOVE,1) CALL WDIALOGFIELDSTATE(ID_DRAW,1) CALL WDIALOGFIELDSTATE(ID_DELETE,1) END SELECT END SELECT !## well display options CASE (ID_DSCENTOOL_PROPTAB3) SELECT CASE (ITYPE) CASE (RESIZE,EXPOSE) CALL ST_SYMBOLDRAW(ID_DSCENTOOL_PROPTAB3,IDF_PICTURE1,IDF_MENU1,IDF_INTEGER1) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_MENU1,IDF_REAL1) CALL ST_SYMBOLDRAW(ID_DSCENTOOL_PROPTAB3,IDF_PICTURE1,IDF_MENU1,IDF_INTEGER1) END SELECT !IDD,IDF,IDM,IDC,IDS) CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_COLOUR) CALL ST1_GETCOLOUR(ID_DSCENTOOL_PROPTAB3,IDF_INTEGER1) CALL ST_SYMBOLDRAW(ID_DSCENTOOL_PROPTAB3,IDF_PICTURE1,IDF_MENU1,IDF_INTEGER1) END SELECT END SELECT END SELECT END SUBROUTINE STWEL1MAIN !###====================================================================== SUBROUTINE STWEL1CLOSE() !###====================================================================== IMPLICIT NONE IF(IMODE.NE.0)THEN CALL WMESSAGEBOX(YESNOCANCEL,QUESTIONICON,COMMONNO,'Do you want to save any adjustments ?','Question') !## save and quit IF(WINFODIALOG(4).EQ.1)THEN CALL ST1_PROPUPDATEGRID(1) !## recompute grid and sort data IF(.NOT.STWEL1GETFIELDS())RETURN !## get data from grid, if not correct, return - not closing! !## no save and quit ELSEIF(WINFODIALOG(4).EQ.2)THEN IF(IMODE.EQ.ID_ADD)THEN IWEL=IWEL-1 NWEL=NWEL-1 ENDIF ENDIF !## not canceling IF(WINFODIALOG(4).EQ.0)RETURN ENDIF CALL WDIALOGSELECT(ID_DSCENTOOL_PROP) CALL WDIALOGHIDE() !## change tab-header for number of well systems available CALL STWEL1TITLE() IWEL=0 CALL UTL_HIDESHOWDIALOG(ID_DSCENTOOL,2) CALL WMENUSETSTATE(ID_SCENTOOL,1,1) CALL ST1FIELDS() CALL IDFPLOT(1) END SUBROUTINE STWEL1CLOSE !###====================================================================== SUBROUTINE STWEL1TITLE() !###====================================================================== IMPLICIT NONE CALL WDIALOGSELECT(ID_DSCENTOOLTAB1) CALL WDIALOGTITLE('Well Systems ('//TRIM(ITOS(NWEL))//')') IF(IWEL.NE.0)THEN CALL WDIALOGPUTMENU(IDF_MENU1,WEL%CNAME,NWEL,IWEL) ELSE CALL WDIALOGCLEARFIELD(IDF_MENU1) ENDIF END SUBROUTINE STWEL1TITLE !###====================================================================== SUBROUTINE ST1SAVELOADWELLS(IU,ICODE,FNAME) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IU,ICODE CHARACTER(LEN=*),INTENT(IN) :: FNAME CHARACTER(LEN=256) :: LINE,DIR INTEGER :: I,J,K,NDAY,IDATE,IOS,JU IF(ABS(ICODE).EQ.ID_SAVEAS.OR.ABS(ICODE).EQ.ID_SAVE)THEN IF(ICODE.GT.0)THEN LINE=TRIM(ITOS(NWEL)) WRITE(IU,'(A)') TRIM(LINE) !//' !## nwells[i]' DO I=1,NWEL WRITE(IU,'(A)') '"'//TRIM(WEL(I)%CNAME)//'"' ! !## name of well system[c]' LINE=TRIM(ITOS(WEL(I)%NQ-1))//','//TRIM(ITOS(WEL(I)%ITYPE))//','// & TRIM(ITOS(UTL_JDATETOIDATE(WEL(I)%Q(1)%IDATE))) WRITE(IU,'(A)') TRIM(LINE) !//' !## nrates[i],dtype[i],sdate[c]' DO J=2,WEL(I)%NQ LINE=TRIM(ITOS( WEL(I)%Q(J)%IDATE-WEL(I)%Q(J-1)%IDATE ))//','//TRIM(RTOS(WEL(I)%Q(J-1)%QRATE/24.0,'F',2)) !## m3/day -> m3/hr WRITE(IU,'(A)') TRIM(LINE) !//' !## delt[i],qrate[r]' END DO LINE=TRIM(ITOS(WEL(I)%NLOC))//','//TRIM(ITOS(WEL(I)%ILOCT))//','// & TRIM(ITOS(WEL(I)%ISYMBOL))//','//TRIM(ITOS(WEL(I)%ICLR)) !## number of locations, iloct:1=msl 2=surface WRITE(IU,'(A)') TRIM(LINE) !//' !## nloc[i],ltype[i],isymbol[i],iclr[i]' DO J=1,WEL(I)%NLOC LINE='"'//TRIM(WEL(I)%LOC(J)%ID)//'",'//TRIM(RTOS(WEL(I)%LOC(J)%Z1,'F',3))//','// & TRIM(RTOS(WEL(I)%LOC(J)%Z2,'F',3))//','// & TRIM(RTOS(WEL(I)%LOC(J)%X ,'F',3))//','// & TRIM(RTOS(WEL(I)%LOC(J)%Y ,'F',3)) WRITE(IU,'(A)') TRIM(LINE) !//' !## id[c],z1[r],z2[r],x[r],y[r]' END DO END DO !## save as IPF file ELSE DIR=FNAME(:INDEX(FNAME,'\',.TRUE.)-1) K=0; DO I=1,NWEL; DO J=1,WEL(I)%NLOC; K=K+1; ENDDO; ENDDO WRITE(IU,'(A)') TRIM(ITOS(K)) WRITE(IU,'(A)') '6' WRITE(IU,'(A)') 'X' WRITE(IU,'(A)') 'Y' WRITE(IU,'(A)') 'ID' WRITE(IU,'(A)') 'Z1' WRITE(IU,'(A)') 'Z2' WRITE(IU,'(A)') 'NAME' WRITE(IU,'(A)') '3,TXT' DO I=1,NWEL DO J=1,WEL(I)%NLOC WRITE(IU,'(A)') TRIM(RTOS(WEL(I)%LOC(J)%X,'F',3))//','//TRIM(RTOS(WEL(I)%LOC(J)%Y,'F',3))// & ',"'//TRIM(WEL(I)%LOC(J)%ID)//'",'//TRIM(RTOS(WEL(I)%LOC(J)%Z1,'F',3))//','//TRIM(RTOS(WEL(I)%LOC(J)%Z2,'F',3))// & ',"'//TRIM(WEL(I)%CNAME)//'"' JU=UTL_GETUNIT() OPEN(JU,FILE=TRIM(DIR)//'\'//TRIM(WEL(I)%LOC(J)%ID)//'.TXT',STATUS='UNKNOWN',ACTION='WRITE') WRITE(JU,'(A)') TRIM(ITOS(WEL(I)%NQ)) WRITE(JU,'(A)') '2,1' WRITE(JU,'(A)') 'DATE,-999.99' WRITE(JU,'(A)') 'Q_M3D,-999.99' DO K=1,WEL(I)%NQ IF(K.LT.WEL(I)%NQ)THEN LINE=TRIM(ITOS(UTL_JDATETOIDATE(WEL(I)%Q(K)%IDATE)))//','//TRIM(RTOS(WEL(I)%Q(K)%QRATE/24.0/REAL(WEL(I)%NLOC,8),'F',3)) ELSE LINE=TRIM(ITOS(UTL_JDATETOIDATE(WEL(I)%Q(K)%IDATE)))//','//TRIM(RTOS(0.0D0,'F',3)) ENDIF WRITE(JU,'(A)') TRIM(LINE) !//' !## delt[i],qrate[r]' ENDDO CLOSE(JU) END DO ENDDO CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Succesfully save '//TRIM(FNAME),'Information') ENDIF ELSEIF(ICODE.EQ.ID_OPEN)THEN READ(IU,*,IOSTAT=IOS) NWEL IF(IOS.NE.0)NWEL=0 IF(MAXNWEL.LT.NWEL)THEN CALL WMESSAGEBOX(OKONLY,QUESTIONICON,COMMONYES,'Maximal number of observation is currently '//TRIM(ITOS(MAXNWEL))//CHAR(13)// & 'Do you want to set the maximal to '//TRIM(ITOS(NWEL))//' and continue ?'//CHAR(13)// & 'If not, iMOD will discard further reading of the observations','Question') IF(WINFODIALOG(4).EQ.1)THEN MAXNWEL=NWEL CALL PT_UTL_ALLOCATEWEL() NWEL=MAXNWEL ELSE NWEL=0 ENDIF ENDIF DO I=1,NWEL READ(IU,*) WEL(I)%CNAME READ(IU,*) WEL(I)%NQ,WEL(I)%ITYPE,IDATE WEL(I)%NQ=WEL(I)%NQ+1 IF(.NOT.ASSOCIATED(WEL(I)%Q)) ALLOCATE(WEL(I)%Q(NROWQ)) WEL(I)%Q(1)%IDATE=UTL_IDATETOJDATE(IDATE) DO J=2,WEL(I)%NQ WEL(I)%Q(J-1)%QRATE=0.0D0 READ(IU,*) NDAY,WEL(I)%Q(J-1)%QRATE WEL(I)%Q(J)%IDATE =WEL(I)%Q(J-1)%IDATE+NDAY WEL(I)%Q(J-1)%QRATE=WEL(I)%Q(J-1)%QRATE*24.0D0 !## m3/hr -> m3/day END DO READ(IU,*) WEL(I)%NLOC,WEL(I)%ILOCT,WEL(I)%ISYMBOL,WEL(I)%ICLR IF(.NOT.ASSOCIATED(WEL(I)%LOC))ALLOCATE(WEL(I)%LOC(NROWL)) DO J=1,WEL(I)%NLOC READ(IU,*) WEL(I)%LOC(J)%ID,WEL(I)%LOC(J)%Z1,WEL(I)%LOC(J)%Z2,WEL(I)%LOC(J)%X,WEL(I)%LOC(J)%Y ENDDO END DO ENDIF END SUBROUTINE ST1SAVELOADWELLS !###====================================================================== LOGICAL FUNCTION ST1CREATEIPF_STEADY(IKD,MINKHT,IMIDF,SDATE,EDATE,ISS,HNODATA,FNODATA,MINKD,STNLAY) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IKD,ISS,IMIDF,STNLAY !,ICW INTEGER,INTENT(IN) :: SDATE,EDATE REAL(KIND=DP_KIND),INTENT(IN) :: MINKHT,HNODATA,FNODATA,MINKD INTEGER,ALLOCATABLE,DIMENSION(:) :: IU REAL(KIND=DP_KIND),ALLOCATABLE,DIMENSION(:) :: TOP,BOT,Q,C,KHV,TLP,QT INTEGER :: I,J,IOS,ILAY,IROW,ICOL REAL(KIND=DP_KIND) :: MEANQ,FMID,NCOUNT CHARACTER(LEN=521) :: LINE CHARACTER(LEN=256) :: DIR,FNAME CHARACTER(LEN=1) :: CA LOGICAL :: LEX INTEGER(KIND=8) :: STIME,ETIME ST1CREATEIPF_STEADY=.FALSE. DIR=IPF(1)%FNAME(:INDEX(IPF(1)%FNAME,'.',.TRUE.)-1) CALL UTL_CREATEDIR(TRIM(DIR)) WRITE(*,'(/A/)') 'Results saved in folder: ['//TRIM(DIR)//']' IF(STNLAY.GT.0)THEN ALLOCATE(IU(-1:STNLAY),TOP(STNLAY),BOT(STNLAY),KHV(STNLAY),Q(STNLAY),C(STNLAY-1),QT(STNLAY)) IU=0 DO ILAY=-1,STNLAY IU(ILAY)=UTL_GETUNIT() IF(ILAY.EQ.-1)THEN INQUIRE(FILE=TRIM(DIR)//'\imod_mkipf_wells_unassigned.ipf',EXIST=LEX) IF(LEX)THEN WRITE(*,*) TRIM(DIR)//'\imod_mkipf_wells_unassigned.ipf allready exists, overwrite it ?'; READ(*,'(A1)') CA IF(CA.NE.'Y'.AND.CA.NE.'y')STOP ENDIF CALL OSD_OPEN(IU(ILAY),FILE=TRIM(DIR)//'\imod_mkipf_wells_unassigned.ipf',STATUS='UNKNOWN',IOSTAT=IOS) ELSEIF(ILAY.EQ.0)THEN INQUIRE(FILE=TRIM(DIR)//'\imod_mkipf_wells_all.ipf',EXIST=LEX) IF(LEX)THEN WRITE(*,*) TRIM(DIR)//'\imod_mkipf_wells_all.ipf allready exists, overwrite it ?'; READ(*,'(A1)') CA IF(CA.NE.'Y'.AND.CA.NE.'y')STOP ENDIF CALL OSD_OPEN(IU(ILAY),FILE=TRIM(DIR)//'\imod_mkipf_wells_all.ipf',STATUS='UNKNOWN',IOSTAT=IOS) ELSE CALL OSD_OPEN(IU(ILAY),FILE=TRIM(DIR)//'\imod_mkipf_wells_l'//TRIM(ITOS(ILAY))//'_tmp.ipf',STATUS='UNKNOWN',IOSTAT=IOS) ENDIF IF(IOS.NE.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Cannot create '//TRIM(DIR)//'\imod_mkipf_wells_l'// & TRIM(ITOS(ILAY))//'_tmp.ipf','Error'); GOTO 10 ENDIF ENDDO DO ILAY=1,STNLAY IF(.NOT.IDFREAD(TOPIDF(ILAY),TOPIDF(ILAY)%FNAME,0))THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Cannot read '//TRIM(TOPIDF(ILAY)%FNAME),'Error'); GOTO 10 ENDIF IF(.NOT.IDFREAD(BOTIDF(ILAY),BOTIDF(ILAY)%FNAME,0))THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Cannot read '//TRIM(BOTIDF(ILAY)%FNAME),'Error'); GOTO 10 ENDIF IF(IKD.EQ.1)THEN IF(.NOT.IDFREAD(KHVIDF(ILAY),KHVIDF(ILAY)%FNAME,0))THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Cannot read '//TRIM(KHVIDF(ILAY)%FNAME),'Error'); GOTO 10 ENDIF ENDIF ! IF(ILAY.LT.STNLAY)THEN ! IF(ICW.EQ.1)THEN ! IF(.NOT.IDFREAD(CIDF(ILAY),CIDF(ILAY)%FNAME,0))THEN ! CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Cannot read '//TRIM(CIDF(ILAY)%FNAME),'Error'); GOTO 10 ! ENDIF ! ENDIF ! ENDIF END DO !## everything opened, write/read information for wells DO ILAY=-1,STNLAY LINE=TRIM(ITOS(IPF(1)%NROW)); WRITE(IU(ILAY),'(A)') TRIM(LINE) LINE=TRIM(ITOS(IPF(1)%NCOL+7)); WRITE(IU(ILAY),'(A)') TRIM(LINE) DO I=1,IPF(1)%NCOL IF(ISS.EQ.0)THEN IF(I.EQ.IPF(1)%QCOL)WRITE(IU(ILAY),'(A)') 'Q_ASSIGNED' IF(I.NE.IPF(1)%QCOL)WRITE(IU(ILAY),'(A)') TRIM(IPF(1)%ATTRIB(I)) ELSEIF(ISS.EQ.1)THEN IF(I.EQ.IPF(1)%ACOL)WRITE(IU(ILAY),'(A)') 'Q_ASSIGNED' IF(I.NE.IPF(1)%ACOL)WRITE(IU(ILAY),'(A)') TRIM(IPF(1)%ATTRIB(I)) ENDIF ENDDO WRITE(IU(ILAY),'(A)') 'Q_ORG' WRITE(IU(ILAY),'(A)') 'FRACTION' WRITE(IU(ILAY),'(A)') 'ILAY' WRITE(IU(ILAY),'(A)') 'TOP' WRITE(IU(ILAY),'(A)') 'BOT' WRITE(IU(ILAY),'(A)') 'KD' WRITE(IU(ILAY),'(A)') 'ERROR_CODE' IF(ISS.EQ.0)THEN LINE=TRIM(ITOS(IPF(1)%ACOL))//','//TRIM(IPF(1)%FEXT) ELSE LINE=TRIM(ITOS(IPF(1)%NCOL+1))//','//TRIM(IPF(1)%FEXT) ENDIF WRITE(IU(ILAY),'(A)') TRIM(LINE) END DO !## allocate multiplication factors to be used to compute well-strengths ALLOCATE(TLP(STNLAY)); TLP=0.0D0 ELSE ALLOCATE(IU(1),QT(1)); IU=0; IU(1)=UTL_GETUNIT() INQUIRE(FILE=TRIM(DIR)//'\imod_mkipf_wells.ipf',EXIST=LEX) IF(LEX)THEN WRITE(*,*) TRIM(DIR)//'\imod_mkipf_wells.ipf allready exists, overwrite it ?'; READ(*,'(A1)') CA IF(CA.NE.'Y'.AND.CA.NE.'y')STOP ENDIF CALL OSD_OPEN(IU(1),FILE=TRIM(DIR)//'\imod_mkipf_wells.ipf',STATUS='UNKNOWN',IOSTAT=IOS) LINE=TRIM(ITOS(IPF(1)%NROW)); WRITE(IU(1),'(A)') TRIM(LINE) LINE=TRIM(ITOS(IPF(1)%NCOL+1)); WRITE(IU(1),'(A)') TRIM(LINE) DO I=1,IPF(1)%NCOL IF(ISS.EQ.0)THEN IF(I.EQ.IPF(1)%QCOL)WRITE(IU(1),'(A)') 'Q_ASSIGNED' IF(I.NE.IPF(1)%QCOL)WRITE(IU(1),'(A)') TRIM(IPF(1)%ATTRIB(I)) ELSEIF(ISS.EQ.1)THEN IF(I.EQ.IPF(1)%ACOL)WRITE(IU(1),'(A)') 'Q_ASSIGNED' IF(I.NE.IPF(1)%ACOL)WRITE(IU(1),'(A)') TRIM(IPF(1)%ATTRIB(I)) ENDIF ENDDO WRITE(IU(1),'(A)') 'Q_ORG' IF(ISS.EQ.0)THEN LINE=TRIM(ITOS(IPF(1)%ACOL))//','//TRIM(IPF(1)%FEXT) ELSE LINE=TRIM(ITOS(IPF(1)%NCOL+1))//','//TRIM(IPF(1)%FEXT) ENDIF WRITE(IU(1),'(A)') TRIM(LINE) ENDIF !## each well inside a wel-system ... get top/bottom,permeabilities QT=0.0D0 DO I=1,IPF(1)%NROW IF(STNLAY.GT.0)THEN !## get top/bottoms DO ILAY=1,STNLAY !## read current top value TOP(ILAY)=TOPIDF(ILAY)%NODATA CALL IDFIROWICOL(TOPIDF(ILAY),IROW,ICOL,IPF(1)%XYZ(1,I),IPF(1)%XYZ(2,I)) IF(IROW.NE.0.AND.ICOL.NE.0)TOP(ILAY)=IDFGETVAL(TOPIDF(ILAY),IROW,ICOL) !## read current bot value BOT(ILAY)=BOTIDF(ILAY)%NODATA CALL IDFIROWICOL(BOTIDF(ILAY),IROW,ICOL,IPF(1)%XYZ(1,I),IPF(1)%XYZ(2,I)) IF(IROW.NE.0.AND.ICOL.NE.0)BOT(ILAY)=IDFGETVAL(BOTIDF(ILAY),IROW,ICOL) !## read current kd value KHV(ILAY)=1.0D0 IF(IKD.EQ.1)THEN KHV(ILAY)=KHVIDF(ILAY)%NODATA CALL IDFIROWICOL(KHVIDF(ILAY),IROW,ICOL,IPF(1)%XYZ(1,I),IPF(1)%XYZ(2,I)) IF(IROW.NE.0.AND.ICOL.NE.0)KHV(ILAY)=IDFGETVAL(KHVIDF(ILAY),IROW,ICOL) ENDIF ! !## read current c value ! IF(ILAY.LT.STNLAY)THEN ! C(ILAY)=1.0D0 ! IF(ICW.EQ.1)THEN ! C(ILAY)=CIDF(ILAY)%NODATA ! CALL IDFIROWICOL(CIDF(ILAY),IROW,ICOL,IPF(1)%XYZ(1,I),IPF(1)%XYZ(2,I)) ! IF(IROW.NE.0.AND.ICOL.NE.0)C(ILAY)=IDFGETVAL(CIDF(ILAY),IROW,ICOL) ! ENDIF ! ENDIF ENDDO ! !## fit current position (compute length of well inside each modellayer) ! DO ILAY=1,STNLAY ! Z1=0.0D0; Z2=0.0D0; KH(ILAY)=0.0D0 ! IF(TOP(ILAY).NE.TOPIDF(ILAY)%NODATA.AND.BOT(ILAY).NE.BOTIDF(ILAY)%NODATA)THEN ! IF(TOP(ILAY)-BOT(ILAY).GT.0.0D0)KH(ILAY)=KD(ILAY)/(TOP(ILAY)-BOT(ILAY)) ! ENDIF ! END DO FMID=FNODATA IF(IMIDF.EQ.1)THEN IF(IPF(1)%XYZ(3,I).NE.FNODATA.AND.IPF(1)%XYZ(4,I).NE.FNODATA)THEN FMID=(IPF(1)%XYZ(3,I)+IPF(1)%XYZ(4,I))/2.0 ELSEIF(IPF(1)%XYZ(3,I).NE.FNODATA)THEN FMID=IPF(1)%XYZ(3,I) ELSEIF(IPF(1)%XYZ(4,I).NE.FNODATA)THEN FMID=IPF(1)%XYZ(4,I) ENDIF IPF(1)%XYZ(3,I)=FMID; IPF(1)%XYZ(4,I)=FMID ELSE IF(IPF(1)%XYZ(3,I).NE.FNODATA.AND.IPF(1)%XYZ(4,I).NE.FNODATA)THEN FMID=(IPF(1)%XYZ(3,I)+IPF(1)%XYZ(4,I))/2.0 ENDIF ENDIF TLP=0.0D0 IF(FMID.NE.FNODATA)THEN IF(IPF(1)%ACOL.GT.0)THEN CALL UTL_PCK_GETTLP(STNLAY,TLP,KHV,TOP,BOT,IPF(1)%XYZ(3,I),IPF(1)%XYZ(4,I),MINKHT) ELSE CALL UTL_PCK_GETTLP(STNLAY,TLP,KHV,TOP,BOT,IPF(1)%XYZ(3,I),IPF(1)%XYZ(4,I),MINKHT) ENDIF ELSE IF(MINKD.GT.0.0D0)THEN !## overrule, take first aquifer with kd larger than minkd DO ILAY=1,STNLAY IF((TOP(ILAY)-BOT(ILAY))*KHV(ILAY).GT.MINKD)EXIT ENDDO TLP=0.0D0 IF(ILAY.LE.STNLAY)THEN TLP(ILAY)=1.0D0 ELSE DO ILAY=1,STNLAY; WRITE(*,*) ILAY,TOP(ILAY),BOT(ILAY),KHV(ILAY),(TOP(ILAY)-BOT(ILAY))*KHV(ILAY); ENDDO IPF(1)%XYZ(5,I)=HNODATA ENDIF ELSE IPF(1)%XYZ(5,I)=HNODATA ENDIF ENDIF ENDIF !## get extraction (mean value) IF(ISS.GT.0.AND.IPF(1)%ACOL.GT.0)THEN FNAME=IPF(1)%FNAME(:INDEX(IPF(1)%FNAME,'\',.TRUE.)-1)//'\'// & TRIM(IPF(1)%INFO(IPF(1)%ACOL,I))//'.txt' STIME=INT(SDATE,8)*1000000 ETIME=INT(EDATE,8)*1000000 IF(.NOT.UTL_PCK_READTXT(2,STIME,ETIME,IPF(1)%XYZ(5,I),FNAME,0,'',2,NCOUNT))THEN WRITE(*,'(A)') 'Error IPF-TXT '//TRIM(IPF(1)%FNAME)//' failed' ENDIF ENDIF IF(STNLAY.GT.0)THEN !## multiply well strength with appropriate factor DO ILAY=1,STNLAY IF(IPF(1)%XYZ(5,I).EQ.HNODATA)THEN Q(ILAY)=HNODATA ELSE IF(TLP(ILAY).EQ.0.0D0)THEN Q(ILAY)=HNODATA ELSE Q(ILAY)=ABS(TLP(ILAY))*IPF(1)%XYZ(5,I) ENDIF ENDIF QT(ILAY)=QT(ILAY)+Q(ILAY) LINE='"'//TRIM(IPF(1)%INFO(1,I))//'"' DO J=2,IPF(1)%NCOL IF(ISS.EQ.0)THEN IF(J.EQ.IPF(1)%QCOL)LINE=TRIM(LINE)//',"'//TRIM(RTOS(Q(ILAY),'F',3))//'"' IF(J.NE.IPF(1)%QCOL)LINE=TRIM(LINE)//',"'//TRIM(IPF(1)%INFO(J,I))//'"' ELSEIF(ISS.EQ.1)THEN IF(J.EQ.IPF(1)%ACOL)LINE=TRIM(LINE)//',"'//TRIM(RTOS(Q(ILAY),'F',3))//'"' IF(J.NE.IPF(1)%ACOL)LINE=TRIM(LINE)//',"'//TRIM(IPF(1)%INFO(J,I))//'"' ENDIF ENDDO IF(ISS.EQ.0)THEN LINE=TRIM(LINE)//',"'//TRIM(IPF(1)%INFO(IPF(1)%QCOL,I))//'","'//TRIM(RTOS(ABS(TLP(ILAY)),'F',4))//'"' ELSEIF(ISS.EQ.1)THEN LINE=TRIM(LINE)//',"'//TRIM(IPF(1)%INFO(IPF(1)%ACOL,I))//'","'//TRIM(RTOS(ABS(TLP(ILAY)),'F',4))//'"' ENDIF LINE=TRIM(LINE)//',"'//TRIM(ITOS(ILAY))//'","'//TRIM(RTOS(TOP(ILAY),'F',2))//'","'// & TRIM(RTOS(BOT(ILAY),'F',2))//'","'//TRIM(RTOS(KHV(ILAY),'G',5))//'"' IF(SUM(TLP).EQ.0.0D0)THEN LINE=TRIM(LINE)//',"#"' ELSEIF(SUM(TLP).LT.0.0D0)THEN LINE=TRIM(LINE)//',"@"' ELSE LINE=TRIM(LINE)//',"-"' ENDIF WRITE(IU(ILAY),'(A)') TRIM(LINE) IF(SUM(TLP).LE.0.0D0)WRITE(IU(-1),'(A)') TRIM(LINE) WRITE(IU(0),'(A)') TRIM(LINE) ENDDO ELSE QT(1)=QT(1)+IPF(1)%XYZ(5,I) LINE='"'//TRIM(IPF(1)%INFO(1,I))//'"' DO J=2,IPF(1)%NCOL IF(ISS.EQ.0)THEN IF(J.EQ.IPF(1)%QCOL)LINE=TRIM(LINE)//',"'//TRIM(RTOS(IPF(1)%XYZ(5,I),'F',3))//'"' IF(J.NE.IPF(1)%QCOL)LINE=TRIM(LINE)//',"'//TRIM(IPF(1)%INFO(J,I))//'"' ELSEIF(ISS.EQ.1)THEN IF(J.EQ.IPF(1)%ACOL)LINE=TRIM(LINE)//',"'//TRIM(RTOS(IPF(1)%XYZ(5,I),'F',3))//'"' IF(J.NE.IPF(1)%ACOL)LINE=TRIM(LINE)//',"'//TRIM(IPF(1)%INFO(J,I))//'"' ENDIF ENDDO IF(ISS.EQ.0)THEN LINE=TRIM(LINE)//',"'//TRIM(IPF(1)%INFO(IPF(1)%QCOL,I))//'"' ELSEIF(ISS.EQ.1)THEN LINE=TRIM(LINE)//',"'//TRIM(IPF(1)%INFO(IPF(1)%ACOL,I))//'"' ENDIF WRITE(IU(1),'(A)') TRIM(LINE) ENDIF ENDDO IF(STNLAY.GT.0)THEN DO ILAY=-1,STNLAY; CLOSE(IU(ILAY)); ENDDO DEALLOCATE(TLP) ELSE CLOSE(IU(1)) ENDIF IF(ISS.EQ.1)IPF(1)%QCOL=IPF(1)%ACOL IF(STNLAY.GT.0)THEN DO ILAY=1,STNLAY IPF(1)%FNAME=TRIM(DIR)//'\imod_mkipf_wells_l'//TRIM(ITOS(ILAY))//'_tmp.ipf' !## read entire ipf IF(.NOT.IPFREAD2(1,1,0))RETURN J=0; DO I=1,IPF(1)%NROW !## extraction ne zero IF(IPF(1)%XYZ(5,I).NE.HNODATA)THEN !## always on five J=J+1 IF(J.NE.I)THEN; IPF(1)%INFO(:,J)=IPF(1)%INFO(:,I); ENDIF ENDIF ENDDO IPF(1)%NROW=J IF(IPF(1)%NROW.GT.0)THEN IPF(1)%FNAME=TRIM(DIR)//'\imod_mkipf_wells_l'//TRIM(ITOS(ILAY))//'.ipf' IF(.NOT.IPFWRITE(1))THEN ENDIF ENDIF CALL IOSDELETEFILE(TRIM(DIR)//'\imod_mkipf_wells_l'//TRIM(ITOS(ILAY))//'_tmp.ipf') ENDDO ELSE ENDIF ST1CREATEIPF_STEADY=.TRUE. 10 CONTINUE IF(STNLAY.GT.0)THEN CALL IDFDEALLOCATE(TOPIDF,SIZE(TOPIDF)); CALL IDFDEALLOCATE(BOTIDF,SIZE(BOTIDF)) CALL IDFDEALLOCATE(KHVIDF,SIZE(KHVIDF)) !; CALL IDFDEALLOCATE(CIDF,SIZE(CIDF)) DO ILAY=0,STNLAY; IF(IU(ILAY).GT.0)THEN; INQUIRE(IU(ILAY),OPENED=LEX); IF(LEX)CLOSE(IU(ILAY)); ENDIF; ENDDO ENDIF MEANQ=0.0D0 WRITE(*,'(A10,A15)') 'Layer','Total_Rate' DO I=1,SIZE(QT) WRITE(*,'(I10,F15.3)') I,QT(I); MEANQ=MEANQ+QT(I) ENDDO WRITE(*,'(/10X,A15)') 'Total' WRITE(*,'(10X,F15.3)') MEANQ DEALLOCATE(IU,QT); IF(STNLAY.GT.0)DEALLOCATE(TOP,BOT,KHV,Q,C) END FUNCTION ST1CREATEIPF_STEADY !###====================================================================== SUBROUTINE STWEL1DELETE() !###====================================================================== IMPLICIT NONE CALL WDIALOGSELECT(ID_DSCENTOOLTAB1) CALL WDIALOGGETMENU(IDF_MENU1,IWEL) CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to delete the definition for:'//CHAR(13)// & TRIM(WEL(IWEL)%CNAME)//' ?','Question') IF(WINFODIALOG(4).NE.1)RETURN END SUBROUTINE STWEL1DELETE !###====================================================================== SUBROUTINE STWEL1PUTFIELDS() !###====================================================================== IMPLICIT NONE INTEGER :: I,J,IY,IM,ID !## clear fields CALL WDIALOGSELECT(ID_DSCENTOOL_PROPTAB1) DO I=1,NROWQ DO J=1,4; CALL WGRIDCLEARCELL(IDF_GRID1,J,I); END DO END DO CALL WDIALOGSELECT(ID_DSCENTOOL_PROPTAB2) DO I=1,NROWL DO J=1,5; CALL WGRIDCLEARCELL(IDF_GRID1,J,I); END DO ENDDO CALL WDIALOGSELECT(ID_DSCENTOOL_PROPTAB1) CALL WDIALOGPUTSTRING(IDF_STRING1,WEL(IWEL)%CNAME) IF(WEL(IWEL)%NQ.GT.0)THEN CALL WDIALOGPUTSTRING(IDF_STRING2,JDATETOGDATE(WEL(IWEL)%Q(1)%IDATE)) ELSE CALL IOSDATE(IY,IM,ID) CALL WDIALOGPUTSTRING(IDF_STRING2,TRIM(ITOS(ID))//'/'//TRIM(ITOS(IM))//'/'//TRIM(ITOS(IY))) ENDIF DO I=1,WEL(IWEL)%NQ CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,I,JDATETOGDATE(WEL(IWEL)%Q(I)%IDATE)) IF(I.LT.WEL(IWEL)%NQ)CALL WGRIDPUTCELLDOUBLE(IDF_GRID1,3,I,WEL(IWEL)%Q(I)%QRATE/24.0D0) !## m3/day -> m3/hr CALL WGRIDPUTCELLINTEGER(IDF_GRID1,4,I,WEL(IWEL)%Q(I)%IDATE) END DO CALL WGRIDSETCELL(IDF_GRID1,1,1) CALL WDIALOGSELECT(ID_DSCENTOOL_PROPTAB2) DO I=1,WEL(IWEL)%NLOC CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,I,WEL(IWEL)%LOC(I)%ID) CALL WGRIDPUTCELLDOUBLE(IDF_GRID1,2,I,WEL(IWEL)%LOC(I)%Z1,'(F15.3)') CALL WGRIDPUTCELLDOUBLE(IDF_GRID1,3,I,WEL(IWEL)%LOC(I)%Z2,'(F15.3)') CALL WGRIDPUTCELLDOUBLE(IDF_GRID1,4,I,WEL(IWEL)%LOC(I)%X,'(F15.3)') CALL WGRIDPUTCELLDOUBLE(IDF_GRID1,5,I,WEL(IWEL)%LOC(I)%Y,'(F15.3)') END DO CALL WGRIDSETCELL(IDF_GRID1,1,1)!,IPOS) IF(WEL(IWEL)%ILOCT.EQ.1)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO1) IF(WEL(IWEL)%ILOCT.EQ.2)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO2) IF(WEL(IWEL)%ITYPE.EQ.1)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO3) IF(WEL(IWEL)%ITYPE.EQ.2)CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO4) CALL WDIALOGSELECT(ID_DSCENTOOL_PROPTAB3) CALL WDIALOGPUTOPTION(IDF_MENU1,WEL(IWEL)%ISYMBOL) CALL WDIALOGPUTINTEGER(IDF_INTEGER1,WEL(IWEL)%ICLR) END SUBROUTINE STWEL1PUTFIELDS !###====================================================================== LOGICAL FUNCTION STWEL1GETFIELDS() !###====================================================================== IMPLICIT NONE INTEGER :: I STWEL1GETFIELDS=.FALSE. CALL WDIALOGSELECT(ID_DSCENTOOL_PROPTAB1) CALL WDIALOGGETSTRING(IDF_STRING1,WEL(IWEL)%CNAME) IF(LEN_TRIM(WEL(IWEL)%CNAME).EQ.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You should specify a name for the Wel-system at least','Warning') RETURN ENDIF CALL WDIALOGUNDEFINED(DVALUE=NODATAGRID) WEL(IWEL)%NQ=0 DO I=1,NROWQ IF(WINFOGRIDCELL(IDF_GRID1,1,I,GRIDCELLDEFINED).EQ.0)EXIT CALL WGRIDGETCELLSTRING(IDF_GRID1,1,I,CDATE) !## empty IF(LEN_TRIM(CDATE).EQ.0)EXIT WEL(IWEL)%Q(I)%IDATE=GDATETOJDATE(CDATE) !## date conversion went wrong IF(WEL(IWEL)%Q(I)%IDATE.EQ.0)EXIT IF(WINFOGRIDCELL(IDF_GRID1,3,I,GRIDCELLDEFINED).EQ.1)THEN CALL WGRIDGETCELLDOUBLE(IDF_GRID1,3,I,WEL(IWEL)%Q(I)%QRATE) ELSE WEL(IWEL)%Q(I)%QRATE=0.0D0 ENDIF WEL(IWEL)%NQ=WEL(IWEL)%NQ+1 WEL(IWEL)%Q(I)%QRATE=WEL(IWEL)%Q(I)%QRATE*24.0D0 !## m3/hr -> m3/day END DO CALL WDIALOGSELECT(ID_DSCENTOOL_PROPTAB2) WEL(IWEL)%NLOC=0 DO I=1,NROWL WEL(IWEL)%LOC(I)%ID='' IF(WINFOGRIDCELL(IDF_GRID1,1,I,GRIDCELLDEFINED).EQ.1)CALL WGRIDGETCELLSTRING(IDF_GRID1,1,I,WEL(IWEL)%LOC(I)%ID) WEL(IWEL)%LOC(I)%Z1=NODATAGRID IF(WINFOGRIDCELL(IDF_GRID1,2,I,GRIDCELLDEFINED).EQ.1)CALL WGRIDGETCELLDOUBLE(IDF_GRID1,2,I,WEL(IWEL)%LOC(I)%Z1) WEL(IWEL)%LOC(I)%Z2=NODATAGRID IF(WINFOGRIDCELL(IDF_GRID1,3,I,GRIDCELLDEFINED).EQ.1)CALL WGRIDGETCELLDOUBLE(IDF_GRID1,3,I,WEL(IWEL)%LOC(I)%Z2) IF(WEL(IWEL)%LOC(I)%Z1.LT.WEL(IWEL)%LOC(I)%Z2)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You should specify top filter to be above the bottom filter'//CHAR(13)// & 'Check well number '//TRIM(ITOS(I)),'Warning') RETURN ENDIF IF(WINFOGRIDCELL(IDF_GRID1,4,I,GRIDCELLDEFINED).EQ.0)EXIT CALL WGRIDGETCELLDOUBLE(IDF_GRID1,4,I,WEL(IWEL)%LOC(I)%X) IF(WEL(IWEL)%LOC(I)%X.EQ.NODATAGRID)EXIT IF(WINFOGRIDCELL(IDF_GRID1,5,I,GRIDCELLDEFINED).EQ.0)EXIT CALL WGRIDGETCELLDOUBLE(IDF_GRID1,5,I,WEL(IWEL)%LOC(I)%Y) IF(WEL(IWEL)%LOC(I)%Y.EQ.NODATAGRID)EXIT WEL(IWEL)%NLOC=WEL(IWEL)%NLOC+1 END DO CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,WEL(IWEL)%ILOCT) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO3,WEL(IWEL)%ITYPE) CALL WDIALOGSELECT(ID_DSCENTOOL_PROPTAB3) CALL WDIALOGGETMENU(IDF_MENU1,WEL(IWEL)%ISYMBOL) CALL WDIALOGGETINTEGER(IDF_INTEGER1,WEL(IWEL)%ICLR) STWEL1GETFIELDS=.TRUE. END FUNCTION STWEL1GETFIELDS END MODULE MOD_SCENTOOL_WELLS