You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

961 lines
25 KiB
Fortran

! last update feb 10 2002 add lock/unlock
! Last change: IPK 2 Mar 1999 12:05 pm
SUBROUTINE SELNODE(ISW)
USE WINTERACTER
USE BLKMAP
USE BLK1MOD
USE BLK2MOD
include 'd.inc'
dimension xot(100),yot(100)
! INCLUDE 'BLK1.COM'
! INCLUDE 'BLK2.COM'
!
dimension nodlist(maxp),RLAY(9)
! DIMENSION ICN(MAXP)
character*1 iflag
CHARACTER*1 ANS,ANSW(10)
CHARACTER*63 STRELS
DATA ANSW/'m','a','f','s','k','u','t','w','h','q'/
DATA STRELS/' You have tried set to set elevation with no mapfile"'/
!
! save nhtp etc
nhtps=nhtp
nbrs=nbrr
nmessv=nmess
if(isw .eq. 0 .or. isw .eq. 4) then
CALL GETPOLY(XOT,YOT,NPTS)
! look for points inside polygon
ndlist=0
do j=1,np
if(inskp(j) .eq. 0) then
inswt=0
call cpoly(xot,yot,npts,cord(j,1),cord(j,2),inswt)
if(inswt .eq. 1) then
call rred
fpn=j
x = cord(j,1)
y = cord(j,2) - .11
call numbr(x,y,ht,fpn,0.0,-1)
ndlist=ndlist+1
nodlist(ndlist)=j
endif
endif
enddo
call rblue
elseif(isw .eq. 1) then
!
! Add all nodes to list
!
NDLIST=0
DO J=1,NP
IF(INEW(J) .EQ. 1) THEN
NDLIST=NDLIST+1
NODLIST(NDLIST)=J
ENDIF
END DO
elseif(isw .eq. 2) then
! Get inactive nodes
DO I=1,NP
ICN(I) = 0
ENDDO
DO J = 1, NE
IF( IMAT(J) .NE. 0 ) THEN
DO K = 1, 8
IF( NOP(J,K) .GT. 0) THEN
ICN(NOP(J,K))=999
ENDIF
ENDDO
ENDIF
END DO
!
! Add nodes to list
!
NDLIST=0
DO J=1,NP
IF(ICN(J) .EQ. 0 .AND. INEW(J) .EQ. 1) THEN
NDLIST=NDLIST+1
NODLIST(NDLIST)=J
ENDIF
END DO
elseif(isw .eq. 3) then
NS=1
call wdialogload(IDD_SELELTYP)
ierr=infoerror(1)
CALL WDialogPutInteger(IDF_INTEGER1,NS)
CALL WDialogSelect(IDD_SELELTYP)
ierr=infoerror(1)
CALL WDialogShow(-1,-1,0,ModaL)
ierr=infoerror(1)
do
IF (WInfoDialog(ExitButton) .EQ. IDOK) THEN
CALL WDialogGetInteger(IDF_INTEGER1,NS)
go to 80
ENDIF
enddo
80 CONTINUE
DO I=1,NP
ICN(I) = 0
ENDDO
NDLIST=0
DO K=1,NE
IF(IMAT(K) .EQ. NS) THEN
DO L=1,8
NST=NOP(K,L)
IF(NST .GT. 0) THEN
IF(ICN(NST) .EQ. 0) THEN
NDLIST=NDLIST+1
NODLIST(NDLIST)=NST
ICN(NST)=1
ENDIF
ENDIF
ENDDO
ENDIF
ENDDO
endif
! NEW MOVE OPERATION
IF(ISW .EQ. 4) THEN
CALL MVGRP(NDLIST,NODLIST)
nhtp=nhtps
nbrr=nbrs
nmess=nmessv
call hedr
RETURN
ENDIF
nbrr=0
nhtp=14
call hedr
CALL XYLOC(xscrn1,yscrn1,iflag,ibox)
if(ibox .eq. 1 .or. iflag .eq. 'd') then
do n=1,ndlist
j=nodlist(n)
call deletn(j)
enddo
elseif(ibox .eq. 2 .or. iflag .eq. 'e') then
do n=1,ndlist
j=nodlist(n)
wd(j)=-9999.
enddo
elseif(ibox .eq. 3 .or. iflag .eq. 't') then
!
! Establish size for range
!
! IF(IMP .EQ. 0) THEN
! CALL SYMBL(0.,7.25,0.20,STRELS,0.,63)
! nhtp=nhtps
! nbrr=nbrs
! nmess=nmessv
! call hedr
! RETURN
! endif
100 CONTINUE
NHTP = 16
NMESS = 0
NBRR = 0
CALL HEDR
!
! Get answer
!
110 call xyloc(XPT,YPT,ANS,IBOX)
IF(IRMAIN .EQ. 1) RETURN
IF(ANS .EQ. 'c') THEN
if(ibox .eq. 0) go to 110
ANS=ANSW(IBOX)
ENDIF
IF(ANS .EQ. 'm') THEN
!
! This option allows changes to bottom elevations
!
CALL ADDPTH2(NODLIST,NDLIST)
GO TO 220
ELSEIF (ANS .EQ. 'a') THEN
!
! All nodes
!
ISWT = -1
ELSEIF(ANS .EQ. 'f') THEN
!
! Fill nodes
!
ISWT = 0
! ELSEIF(ANS .EQ. 's') THEN
!
! Single node at a time
!
! ISWT = 1
!ipk feb02 add lock/unlock and remove cdata
! ELSEIF(ANS .EQ. 'w') THEN
!
! This option allows changes to nodal widths
!
! CALL ADDWID
! IF(IRMAIN .EQ. 1) RETURN
! GO TO 100
!
! Call to help screen
!
ELSEIF(ANS .EQ. 'h') THEN
CALL HELPS(4)
IF(IRMAIN .EQ. 1) RETURN
GO TO 100
!
ELSEIF(ANS .EQ. 'q') THEN
!
! Writeout and return
!
CALL WRTOUT(0)
RETURN
ENDIF
IF(IMP .EQ. 0) THEN
CALL SYMBL(0.,7.25,0.20,STRELS,0.,63)
go to 100
endif
!
! Establish size for range
!
!!!!!!!!!!!!!!!!!!!!!!!!!
IF(ISWTAGN .EQ. 0) THEN
! IF(IRECD .EQ. 2) THEN
! iswtintp=0
! iswtagn=0
! go to 210
! ENDIF
CALL WMessageBox(YesNo,QuestionIcon,CommonOK,'Do you wish to interpolate '//&
CHAR(13)//'from the triangulated map file?' ,&
'Select Interpolation method?')
! If answer 'Yes' set interpolate switch to 1
!
IF (WInfoDialog(4) .EQ. 2) then
iswtintp=0
ELSE
iswtintp=1
ENDIF
CALL WMessageBox(YesNo,QuestionIcon,CommonOK,'Ask this question again?'//&
CHAR(13)//' ' ,&
'Ask again?')
! If answer 'Yes' set again switch to 0
!
IF (WInfoDialog(4) .EQ. 2) then
iswtagn=1
ELSE
iswtagn=0
ENDIF
ENDIF
210 CONTINUE
!!!!!!!!!!!!!!!!!!!!!!!!!!!!
IF(ISWTINTP .EQ. 0) THEN
call setrng(xnears,nmap)
iswt=0
do n=1,ndlist
m=nodlist(n)
!ipk feb02
!ipk jan08 chnage subscript
if(lock(m) .eq. 0) CALL SETELV(XNEARS,NMAP,M,ISWT)
enddo
ELSE
if(nelts .eq. 0) then
CALL WMessageBox(YesNo,QuestionIcon,CommonOK,'No triangulated exists'//&
CHAR(13)//'Do you wish to triangulate now?' ,&
'NO TRIANGULATION AVAILABLE?')
! If answer 'Yes' set triangulate now
!
IF (WInfoDialog(4) .EQ. 2) then
return
ELSE
call triang
ENDIF
endif
do n=1,ndlist
m=nodlist(n)
write(155,*) 'selt',m
!ipk mar20
if(iswt .eq. 0 .and. wd(m) .gt. -4400.) cycle
if(lock(m) .eq. 0) CALL TRIANINT(NMAP,M,ISWT,ITIME)
enddo
ENDIF
220 CONTINUE
elseif(ibox .eq. 4 .or. iflag .eq. 'l') then
! Define layers
call openlay
NHTP=0
NBRR=0
NMESS=45
CALL HEDR
NMESS=4
xprt=3.2
!
! call getint(nlay)
call GETLAYDAT(NLAY,ipos,RLAY)
ILAYTP=IPOS
do n=1,ndlist
j=nodlist(n)
lay(j)=nlay
DO I=1,NLAY
WTLAY(J,I)=RLAY(I)
ENDDO
enddo
REWIND 102
DO J=1,NP
IF(LAY(J) .GT. -9998) THEN
if(ILAYTP .eq. 1) then
write(102,6000) J,LAY(J),(WTLAY(J,I),I=1,LAY(J))
6000 format('LD2 ',2i8,9F8.2)
else
write(102,6001) J,LAY(J),(WTLAY(J,I),I=1,LAY(J))
6001 format('LD3 ',2i8,9F8.2)
endif
ENDIF
ENDDO
nlayd=1
!ipk feb02 add lcok/unlock
elseif(ibox .eq. 5 .or. iflag .eq. 'k') then
do n=1,ndlist
j=nodlist(n)
lock(j)=1
enddo
elseif(ibox .eq. 6 .or. iflag .eq. 'u') then
do n=1,ndlist
j=nodlist(n)
lock(j)=0
enddo
elseif(ibox .eq. 7 .or. iflag .eq. 'f') then
do n=1,np
list(n)=0
enddo
do n=1,ndlist
list(nodlist(n))=1
enddo
call deln2(np,0)
endif
! CALL PLOTOT(1)
nhtp=nhtps
nbrr=nbrs
nmess=nmessv
call hedr
RETURN
END
SUBROUTINE SELELT(ISW)
USE BLK1MOD
save fracd
dimension xot(100),yot(100)
! INCLUDE 'BLK1.COM'
!
dimension nodlist(maxp)
character*1 iflag
data itime/0/
if(itime .eq. 0) then
mat=0
itime=1
endif
IF(ISW .EQ. 2) GO TO 200
CALL GETPOLY(XOT,YOT,NPTS)
!
! save nhtp etc
nhtps=nhtp
nbrs=nbrr
nmessv=nmess
! look for points inside polygon
ndlist=0
nefl=0
do n=1,ne
ieswt=0
if(ieskp(n) .eq. 0) then
ieswt=1
do m=1,ncorn(n)
j=nop(n,m)
if(j .gt. 0) then
inswt=0
call cpoly(xot,yot,npts,cord(j,1),cord(j,2),inswt)
if(inswt .eq. 1) then
! call rred
! fpn=j
! x = cord(j,1)
! y = cord(j,2) - .11
! call numbr(x,y,ht,fpn,0.0,-1)
ndlist=ndlist+1
nodlist(ndlist)=j
else
ieswt=0
endif
endif
enddo
endif
if(ieswt .eq. 1) then
nefl=nefl+1
neflag(nefl)=n
! call rcyan
! fpn = n
! x = xc(n)
! y = yc(n) + .01
! call numbr(x,y,0.20,fpn,0.0,-1)
call fillem(n)
endif
enddo
call rblue
GO TO 300
200 CONTINUE
!
! save nhtp etc
nhtps=nhtp
nbrs=nbrr
nmessv=nmess
NEFL=0
CALL GETFRAC(FRACD)
call plotot(0)
DO N=1,NE
IF(EDIF(N) .GT. (1.-FRACD)*EDIF(0)) THEN
nefl=nefl+1
neflag(nefl)=n
call fillem(n)
ENDIF
ENDDO
300 CONTINUE
if(isw .eq. 0 .OR. ISW .EQ. 2) then
nbrr=0
nhtp=15
call hedr
CALL XYLOC(xscrn1,yscrn1,iflag,ibox)
if(ibox .eq. 1 .or. iflag .eq. 'd') then
do n=1,nefl
j=neflag(n)
call deltel(j)
enddo
nefl=0
elseif(ibox .eq. 2 .or. iflag .eq. 'e') then
call refb
elseif(ibox .eq. 3 .or. iflag .eq. 't') then
nhtp=0
nbrr=4
NMESS=45
call hedr
nmess=2
call getint(mat)
ipsw(7)=1
ipsw(5)=0
do n=1,nefl
j=neflag(n)
imat(j) = mat
enddo
nefl=0
elseif(ibox .eq. 4 .or. iflag .eq. 'm') then
!
! simplify layout
!
IECHG=0
!IPK MAY03
ICHG=0
CALL SMFY
!ipk dec11
elseif(ibox .eq. 5 .or. iflag .eq. 'g') then
!
! form group
!
CALL FORMGP
endif
CALL PLOTOT(1)
nhtp=nhtps
nbrr=nbrs
nmess=nmessv
call clrbox
call hedr
else
call extract(NODLIST,NDLIST)
! display extracted file
CALL PLOTOT(1)
nhtp=nhtps
nbrr=nbrs
nmess=nmessv
call clrbox
call hedr
endif
RETURN
END
SUBROUTINE CPOLY(XOT,YOT,NPTS,X,Y,INSWT)
DIMENSION XOT(*),YOT(*)
REAL*8 X,Y
DATA PI/3.14159/
SUMA=0
DO N=1,NPTS-1
ANG1=ATAN2(YOT(N+1)-Y,XOT(N+1)-X)
ANG2=ATAN2(YOT(N)-Y,XOT(N)-X)
DIFA=ANG2-ANG1
IF(ABS(DIFA) .GT. PI) THEN
IF(DIFA .LT. -PI) DIFA=DIFA+2.*PI
IF(DIFA .GT. PI) DIFA=DIFA-2.*PI
ENDIF
SUMA=SUMA+DIFA
ENDDO
IF(ABS(SUMA) .GT. PI) THEN
INSWT=1
ELSE
INSWT=0
ENDIF
RETURN
END
SUBROUTINE GETPOLY(XOT,YOT,NPTS)
USE BLK1MOD
dimension xot(*),yot(*)
! INCLUDE 'BLK1.COM'
!
CHARACTER*23 SELN3
CHARACTER*32 SELN
CHARACTER*24 SELN2
CHARACTER*1 IFLAG
data SELN/' Click at points to form polygon'/
data SELN2/' Click next point '/
data SELN3/' Click last point again'/
80 CALL CLRBOX
nhtp=0
nbrr=5
nmess=0
call hedr
CALL SYMBL(0.,7.70,0.20,SELN,0.,32)
!
100 continue
!
! Get cursor location
!
CALL XYLOC(xscrn,yscrn,iflag,ibox)
IF(IRMAIN .EQ. 1) RETURN
!
if (iflag .eq. 'q') return
!
if(iflag .eq. 'c') then
xot(1)=xscrn
yot(1)=yscrn
npts=1
!
! This option is creating an inset locations
!
120 continue
CALL XYLOC(xscrn1,yscrn1,iflag,ibox)
IF(IRMAIN .EQ. 1) RETURN
if(ibox .eq. 6 .or. iflag .eq. 'b') then
npts=npts-1
go to 120
endif
if(iflag .eq. 'c') then
!
! Look for a screen size
!
122 continue
xsiz=abs(xscrn1-xscrn)
ysiz=abs(yscrn1-yscrn)
!ipk jun96 test for zero sizes
if(xsiz .lt. 0.001 .or. ysiz .lt. 0.001) then
CALL CLRBOX
call hedr
CALL SYMBL(0.,7.70,0.20,seln3,0.,23)
go to 120
endif
npts=npts+1
xot(npts)=xscrn1
yot(npts)=yscrn1
call DASHLN(xot,yot,npts,1)
CALL CLRBOX
call hedr
CALL SYMBL(0.,7.70,0.20,seln2,0.,24)
CALL XYLOC(xscrn1,yscrn1,iflag,ibox)
IF(IRMAIN .EQ. 1) RETURN
if(ibox .eq. 6 .or. iflag .eq. 'b') then
npts=npts-1
go to 120
elseif(ibox .eq. 7 .or. iflag .eq. 'n') then
npts=npts+1
xot(npts)=xot(1)
yot(npts)=yot(1)
call DASHLN(xot,yot,npts,1)
go to 280
else
go to 122
endif
endif
ENDIF
280 continue
RETURN
END
subroutine extract(NODLIST,NDLIST)
USE WINTERACTER
USE BLK1MOD
INCLUDE 'BFILES.I90'
! include 'blk1.com'
include 'd.inc'
DIMENSION NODLIST(*)
CHARACTER(LEN=256) :: FILTER
CHARACTER(LEN=255) :: FNAME,FNAMRM
! select filename for new file
FILTER ="Rm1 file -- *.rm1|*.rm1|"
CALL WSelectFile(Filter,SaveDialog+PromptOn+AppendExt+DirChange,FNAME,'Filename for extracted file')
IF (WInfoDialog(ExitButtonCommon).EQ.CommonOpen) THEN
GO TO 200
ELSE
GO TO 500
ENDIF
200 CONTINUE
CALL IlowerCase(FNAME)
ITOTFIL=ITOTFIL+1
FNAMEOUT(ITOTFIL)=FNAME
! save current file
IFILOUT=IACTVFIL+50
CALL WRTFIL(IFILOUT)
! create network structure
CALL ZERORELM(NODLIST,NDLIST)
IACTVFIL=ITOTFIL
! save new structure
IOT = 20
FNAMRM=FNAME
igfgsw=0
close(iot)
OPEN(IOT,FILE=FNAME,STATUS='UNKNOWN')
!
! Check if file cords format to be short or long
!
!
CALL WMessageBox(YesNo,QuestionIcon,CommonOK,'Do you wish to save'//&
CHAR(13)//'coordinates in long format?' ,&
'Coordinate save format')
!
! If answer 'No', use short format
!
IF (WInfoDialog(4) .EQ. 2) then
ntempin=0
else
ntempin=2
END IF
!
call wrtout(1)
CLOSE (IOT)
OPEN(IOT,FILE=FNAMRM,STATUS='UNKNOWN')
500 continue
return
end
SUBROUTINE ZERORELM(NODLIST,NDLIST)
USE BLK1MOD
! INCLUDE 'BLK1.COM'
!
dimension nodlist(*)
DO N=1,NP
! search nodlist
do k=1,ndlist
if(n .eq. nodlist(K)) go to 300
enddo
call deletn(n)
300 continue
ENDDO
! reset NP
do k=np,1,-1
if(inew(k) .gt. 0) then
np=k
go to 350
endif
enddo
350 continue
! reset NE
do k=ne,1,-1
if(imat(k) .gt. 0) then
ne=k
go to 400
endif
enddo
400 continue
RETURN
END
SUBROUTINE GETFRAC(FRACD)
!
! Generate continuity lines
!
USE WINTERACTER
save
include 'd.inc'
!
! Declare window-type and message variables
!
TYPE(WIN_STYLE) :: WINDOW
TYPE(WIN_MESSAGE) :: MESSAGE
integer :: I1,I2,I3,ITIME,IPOS
REAL :: FRACD
data itime/0/
IF(ITIME .EQ. 0) THEN
FRACD=0.1
itime=1
ENDIF
call wdialogload(IDD_SETSEL)
ierr=infoerror(1)
CALL WDialogSelect(IDD_SETSEL)
ierr=infoerror(1)
CALL WDialogPutReal(IDF_REAL1,FRACD)
CALL WDialogShow(-1,-1,0,Modal)
ierr=infoerror(1)
do
!
IF (WInfoDialog(ExitButton) .EQ. IDOK) THEN
CALL WDialoggetReal(IDF_REAL1,FRACD)
GO TO 100
ENDIF
enddo
100 CONTINUE
return
end
SUBROUTINE FINDTYP
USE WINTERACTER
USE BLKMAP
USE BLK1MOD
USE BLK2MOD
character*1 iflag
include 'd.inc'
DATA NS/1/
call wdialogload(IDD_SELELTYP)
ierr=infoerror(1)
CALL WDialogPutInteger(IDF_INTEGER1,NS)
CALL WDialogSelect(IDD_SELELTYP)
ierr=infoerror(1)
CALL WDialogShow(-1,-1,0,ModaL)
ierr=infoerror(1)
do
IF (WInfoDialog(ExitButton) .EQ. IDOK) THEN
CALL WDialogGetInteger(IDF_INTEGER1,NS)
go to 80
ENDIF
enddo
80 CONTINUE
ICLL=4
call clscrn
call plotot(0)
nefl=0
DO N=1,NE
IF(IMAT(N) .EQ. NS) THEN
CALL FILLEMC(N,ICLL)
nefl=nefl+1
neflag(nefl)=n
ENDIF
ENDDO
nbrr=0
nhtp=15
call hedr
CALL XYLOC(xscrn1,yscrn1,iflag,ibox)
if(ibox .eq. 1 .or. iflag .eq. 'd') then
do n=1,nefl
j=neflag(n)
call deltel(j)
enddo
nefl=0
elseif(ibox .eq. 2 .or. iflag .eq. 'e') then
call refb
elseif(ibox .eq. 3 .or. iflag .eq. 't') then
nhtp=0
nbrr=4
NMESS=45
call hedr
nmess=2
call getint(mat)
ipsw(7)=1
ipsw(5)=0
do n=1,nefl
j=neflag(n)
imat(j) = mat
enddo
nefl=0
elseif(ibox .eq. 4 .or. iflag .eq. 'm') then
!
! simplify layout
!
IECHG=0
!IPK MAY03
ICHG=0
CALL SMFY
!ipk dec11
elseif(ibox .eq. 5 .or. iflag .eq. 'g') then
!
! form group
!
CALL FORMGP
elseif(ibox .eq. 6) then
do n=1,nefl
j=neflag(n)
do jj=1,8
if(nop(j,jj) .ne. 0) then
wd(nop(j,jj))=-9999.
endif
enddo
enddo
endif
RETURN
END
SUBROUTINE MVGRP(NDLIST,NODLIST)
USE WINTERACTER
USE BLK1MOD
INCLUDE 'TXFRM.COM'
dimension nodlist(maxp),RLAY(9)
character*1 iflag
! GET AMOUNT OF SHIFT IN PAGE UNITS
200 continue
NHTP = 16
NMESS = 47
NBRR = 0
CALL HEDR
CALL xyloc(xscrn1,yscrn1,iflag,ibox)
CALL XYLOC(XSCRN2,YSCRN2,IFLAG,IBOX)
XSHIFT=XSCRN2-XSCRN1
YSHIFT=YSCRN2-YSCRN1
! APPLY SHIFT TO NODES IN THE LIST
DO N=1,NDLIST
CORD(NODLIST(N),1)=CORD(NODLIST(N),1)+XSHIFT
CORD(NODLIST(N),2)=CORD(NODLIST(N),2)+YSHIFT
ENDDO
CALL PLOTOT(0)
CALL WMessageBox(YesNo,QuestionIcon,CommonOK,'Do you wish to save'//&
CHAR(13)//'new coordinate location?' ,&
'COORDINATE MOVE')
IF (WInfoDialog(4) .EQ. 2) then
! revert to old
DO N=1,NDLIST
CORD(NODLIST(N),1)=(XUSR(NODLIST(N))+XS)/TXSCAL
CORD(NODLIST(N),2)=(YUSR(NODLIST(N))+YS)/TXSCAL
ENDDO
CALL PLOTOT(0)
CALL WMessageBox(YesNo,QuestionIcon,CommonOK,'Do you wish to '//&
CHAR(13)//'try again?' ,&
'COORDINATE MOVE')
IF (WInfoDialog(4) .EQ. 2) then
return
else
go to 200
endif
else
! accept
END IF
RETURN
END