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.

1458 lines
35 KiB
Fortran

!IPK LAST UPDATE SEP 23 2015 REVISE TESTING FOR RIVER SECTIONS
subroutine tekgin(x,y,iflag)
save
!iPK APR94
COMMON /RECOD/ IRECD,TSPC
character*1 iflag,iiflag,iflags
data rsclx,rscly/100.0,100./
data itime/0/
if(itime .eq. 0) then
itime=1
iky=0
endif
!iPK APR94
IF(IRECD .EQ. 2) THEN
if(iky .eq. 0) then
READ(91,'(2F7.2,A1)') X,Y,IFLAG
iflags=iflag
xs=x
ys=y
else
iflag=iflags
x=xs
y=ys
endif
! write(*,'(2f7.2,a1,i4)') x,y,iflag,iky
call flush_screen
CALL INTRVL(TA,0)
90 CALL INTRVL(TA,1)
IF(TA .LT. TSPC) GO TO 90
if(tspc .eq. 0.) then
call gim_an_event(ix,iy,iiflag)
if(iiflag .eq. '~') then
iflag='P'
iky=1
return
endif
endif
iky=0
ENDIF
100 continue
! write(*,'(2i15,a1,i3)') ix,iy,iflag,iky
if(irecd .eq. 2) return
call flush_screen
CALL gim_an_event(ix, iy, iiflag)
! write(*,'(2i5,a1)') ix,iy,iiflag
IF (iiflag.eq.'~') then
! call hedr
! CALL plotot
! call hedr
iflag='P'
iky=1
! go to 100
return
endif
iky=0
! if(irecd .eq. 2) return
x= float(ix)/rsclx
! y= 8.0-float(iy)/rscly
y= float(iy)/rscly
iflag=iiflag
! write(90,666) x,y,iflag,ix,iy,iiflag,iky
! 666 format('tekgin',2f8.2,a1,2i5,a1,i2)
if(iflag .eq. 'u') then
go to 100
endif
!ipk apr94
if(irecd .eq. 1) then
write(91,'(2f7.2,a1)') x,y,iflag
endif
return
end
subroutine draw(x,y)
save
common /pltc/ipsav,iflg,xll,yll
data rsclx,rscly/100.,100./
ix=x*rsclx
iy=y*rscly
CALL gim_a_line(ix, iy)
! save data on file if requested
if(ipsav .gt. 0) then
! don't write out point unless > .005" from previous point
if (abs(xll-x) .ge. .005 .or. abs(yll-y) .ge. .005 ) then
write(ipsav,99) 'pa',x,y
xll = x
yll = y
iflg = 0
else
iflg = 1
endif
endif
99 format (a2,2f8.3)
return
end
subroutine move(x,y)
save
common /pltc/ipsav,iflg,xll,yll
data rsclx,rscly/100.,100./
ix=x*rsclx
iy=y*rscly
CALL move_da_pointer(ix, iy)
! save data on file if requested
if(ipsav .gt. 0) then
! don't write out point unless > .005" from previous point
write(ipsav,99) 'ma',x,y
xll = x
yll = y
iflg = 0
endif
99 format (a2,2f8.3)
return
end
!*************************************************************
!
! SYMBOL SUBROUTINE
!
! ROUTINE TO OUTPUT !HARACTER STRINGS.
!
!*****************************************************************
SUBROUTINE SYMBL (X,Y,HEIGHT,STRING,ANGLE,NCHAR)
save
COMMON /PLTC/IPSAV,IFLG,XLL,YLL
CHARACTER*(*) STRING
CHARACTER*32 FMT1
CHARACTER*2 PS
CHARACTER*2 IHT
DATA PS/'PS'/,HT/0.8/
integer*4 nchar
IHT(1:1)=CHAR(27)
IHT(2:2)=':'
HT=height*5.
! if(height .gt. 0.7) then
! ht=height
! else
! ipk mar01
! ht=0.6
! endif
!
! Centered symbols
!
ICHR = -1
IF (NCHAR .LT. 0) THEN
ICHR = ICHAR(STRING(1:1))
IF (ICHR .EQ. 0) STRING(1:1) = CHAR(35)
IF (ICHR .EQ. 1) STRING(1:1) = CHAR(33)
IF (ICHR .EQ. 2) STRING(1:1) = CHAR(39)
IF (ICHR .EQ. 3) STRING(1:1) = CHAR(41)
!cc WRITE(2,'(A)') 'SS "CENTERED.SYM"'
ENDIF
!
ZANGLE = ANGLE
LSTR = LENSTR(STRING)
LSTR = MIN(LSTR,IABS(NCHAR))
!
! ixx = x*scrnx
! iyy = (7.50-y-0.2)*scrny
!
!
CALL QUAD(X,Y,ITS)
IF(ITS .EQ. 22) THEN
yy=y
! CALL move( x, yy)
CALL LABL(X,YY,LSTR,HT,STRING)
ANGL = ZANGLE/3.14159
XLAS = X + COS(ANGL)*(HEIGHT*LSTR)
YLAS = Y + SIN(ANGL)*(HEIGHT*LSTR)
!
IF(IPSAV .GT. 0) THEN
HTG=HT*0.75
WRITE(FMT1,198) NCHAR
198 FORMAT(18h(A2,4F8.3,1X,1H",A,i2,5h,1H"))
WRITE(ipsav,FMT1) PS,X,Y,HTG,ANGLE,STRING
ENDIF
ENDIF
!
RETURN
END
SUBROUTINE QUAD(X,Y,IST)
!-
!...... Subroutine to establish location of X and Y relative to bounds
!-
COMMON /PAGE/ XL,XH,YL,YH
!-
!...... Test side of X
!-
IST=22
IF(X .LT. XL) IST=12
IF(X .GT. XH) IST=32
!-
!...... Test side of Y
!-
IF(Y .LT. YL) IST=IST-1
IF(Y .GT. YH) IST=IST+1
!-
!...... Final pattern for IST is
!-
! 13 23 33
! ------
! 12 | 22 | 32
! ------
! 11 21 31
!
RETURN
END
SUBROUTINE TRIM(XO,YO,XI,YI,XB,YB,IST,ISTN)
!...... Subroutine to compute coordinates for XB and YB on the boundary
COMMON /PAGE/ XL,XH,YL,YH
IF(IST .LT. 20) THEN
!...... XO is to the left
IF(ISTN .LT. 20) THEN
!...... XI is also left skip out
! by setting IST negative
IST=-IST
RETURN
ELSE
XB = XL
YB = YO+(YI-YO)/(XI-XO)*(XL-XO)
!...... Check location of YB. If its within limits we are done
! or have found a totally crossing line
IF(YB .LT. YL) THEN
!...... Below
IF (YI .EQ. YB) THEN
XB = 999.
ELSE
XB = XB+(XI-XB)/(YI-YB)*(YL-YB)
ENDIF
YB = YL
IF(XB .GT. XH .OR. XB .LT. XL) THEN
!...... Signify that final point is still out by negative IST
IST=-IST
ELSEIF(ISTN .NE. 22) THEN
!...... Part of a crossing line set ISTN negative
ISTN=-ISTN
ENDIF
ELSEIF(YB .GT. YH) THEN
!...... Above
IF (YI .EQ. YB) THEN
XB = 999.
ELSE
XB = XB+(XI-XB)/(YI-YB)*(YH-YB)
ENDIF
YB = YH
IF(XB .GT. XH .OR. XB .LT. XL) THEN
IST=-IST
ELSEIF(ISTN .NE. 22) THEN
ISTN=-ISTN
ENDIF
ELSEIF(ISTN .NE. 22) THEN
ISTN=-ISTN
ENDIF
ENDIF
ELSEIF(IST .GT. 30) THEN
!...... XO is to the right
IF(ISTN .GT. 30) THEN
!...... XI is also right skip out
IST=-IST
ELSE
XB = XH
YB = YO+(YI-YO)/(XI-XO)*(XH-XO)
!...... Check location of YB. If its within limits we are done
IF(YB .LT. YL) THEN
!...... Below
IF (YI .EQ. YB) THEN
XB = 999.
ELSE
XB = XB+(XI-XB)/(YI-YB)*(YL-YB)
ENDIF
YB = YL
IF(XB .GT. XH .OR. XB .LT. XL) THEN
IST=-IST
ELSEIF(ISTN .NE. 22) THEN
ISTN=-ISTN
ENDIF
ELSEIF(YB .GT. YH) THEN
!...... Above
IF (YI .EQ. YB) THEN
XB = 999.
ELSE
XB = XB+(XI-XB)/(YI-YB)*(YH-YB)
ENDIF
YB = YH
IF(XB .GT. XH .OR. XB .LT. XL) THEN
IST=-IST
ELSEIF(ISTN .NE. 22) THEN
ISTN=-ISTN
ENDIF
ELSEIF(ISTN .NE. 22) THEN
ISTN=-ISTN
ENDIF
ENDIF
ELSE
!...... XO is in the middle section
!...... Check location of YB. If its within limits we are done
IF(YO .LT. YL) THEN
!...... Below
IF(MOD(ISTN,10) .EQ. 1) THEN
!...... still out
IST=-IST
ELSE
YB = YL
IF (YI .EQ. YO) THEN
XB = 999.
ELSE
XB = XO+(XI-XO)/(YI-YO)*(YL-YO)
ENDIF
IF(XB .GT. XH .OR. XB .LT. XL) THEN
IST=-IST
ELSEIF(ISTN .NE. 22) THEN
ISTN=-ISTN
ENDIF
ENDIF
ELSEIF(YO .GT. YH) THEN
!...... Above
IF(MOD(ISTN,10) .EQ. 3) THEN
!...... still out
IST=-IST
ELSE
YB = YH
IF (YI .EQ. YO) THEN
XB = 999.
ELSE
XB = XO+(XI-XO)/(YI-YO)*(YH-YO)
ENDIF
IF(XB .GT. XH .OR. XB .LT. XL) THEN
IST=-IST
ELSEIF(ISTN .NE. 22) THEN
ISTN=-ISTN
ENDIF
ENDIF
ENDIF
ENDIF
RETURN
END
SUBROUTINE NUMBR(X,Y,HITE,RNUM,THETA,NDEC)
! This routine has been extensively rewritten AUG 94
SAVE
COMMON /PLTC/IPSAV,IFLG,XLL,YLL
integer*4 ndec
CHARACTER*36 FMT,FMT1,NARRAY
CHARACTER*1 QOT
! WHERE: X,Y DEFINE THE COORDINATES OF THE LOWER-LEFT CORNER OF THE
! FIRST DIGIT TO BE PLOTTED
! HITE CHARACTER HEIGHT (INCHES)
! RNUM THE REAL NUMBER TO BE PLOTTED
! THETA THE ANGLE (IN DEGREES) THE CHARACTER STRING MAKES WITH THE
! X-AXIS
! NDEC THE OF DECIMAL PLACES TO WHICH THE IS PLOTTED
DATA QOT/'"'/
CALL CVF(RNUM,NDEC,NARRAY,NUMC)
CALL SYMBL(X,Y,HITE,NARRAY,THETA,NUMC)
IF(IPSAV .GT. 0) THEN
XLAS=X+NUMC*HITE*0.75
YLAS=Y
ZANGLE = THETA
HTG=HITE*0.75
WRITE(IPSAV,199) 'PS',X,Y,HTG,ZANGLE,(NARRAY(I:I),I=1,NUMC),QOT
199 FORMAT (A2,2F8.3,2F8.3,1X,1H",11A1)
ENDIF
RETURN
END
subroutine polyfl(x,y,npts,icol)
! polygon fill routine npts close it , colour code is icol
save
dimension x(*),y(*)
dimension itran(0:16)
data itran/0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16/
IF(icol .EQ. -11) then
icll=8
else
icll=itran(icol)
endif
if (npts .lt. 4) return
CALL nwpen(icll)
CALL fill_a_polygon(x,y,npts)
call Rblue
return
end
! ---------------------------------------------------------------------------
subroutine nwpen(icl)
CALL change_color(icl)
return
end
subroutine RGrey
icl=15
! 240
call nwpen(icl)
return
end
! -----------------------------------------------------------------------------
subroutine RDGrey
icv=216
! 216
CALL IGrcolourN(ICV)
return
end
! -----------------------------------------------------------------------------
subroutine RBlack
icl=14
! 223
call nwpen(icl)
return
end
! -----------------------------------------------------------------------------
subroutine Rwhite
icl=0
! 224
call nwpen(icl)
return
end
! -----------------------------------------------------------------------------
subroutine Rwhiteb
icl=1
! 224
call nwpen(icl)
return
end
! -----------------------------------------------------------------------------
subroutine RRed
icl=12
! 16
call nwpen(icl)
return
end
! -----------------------------------------------------------------------------
subroutine RBlue
icl=3
! 175
call nwpen(icl)
return
end
! -----------------------------------------------------------------------------
subroutine Rcyan
icl=5
! 112
call nwpen(icl)
return
end
! -----------------------------------------------------------------------------
subroutine RYellow
icl=10
! 63
call nwpen(icl)
return
end
! -----------------------------------------------------------------------------
subroutine RGreen
icl=7
! 96
call nwpen(icl)
return
end
! -----------------------------------------------------------------------------
! Routine to obtain keyboard entry in ascii code
SUBROUTINE KEYBRD(K)
character*1 cha
call gim_a_charac(K,cha,x,y)
RETURN
END
subroutine clscrn
CALL clear_screen
return
end
SUBROUTINE PLOTT(XX,YY,II)
SAVE
COMMON /PLTC/IPSAV,IFLG,XLL,YLL
COMMON /PAGE/ XL,XH,YL,YH
COMMON /PLXZ/ XLAS,YLAS,NPLT,NCHRS,XORG,YORG
! Save data on file if requested
IF(IPSAV .GT. 0 .AND. II .LT. 0) THEN
WRITE(IPSAV,99) 'tr',XX,YY
WRITE(IPSAV,99) 'pi',0.0,0.0
WRITE(IPSAV,99) 'ma',0.0,0.0
xold=xx
yold=yy
ENDIF
99 FORMAT (a2,2F8.3)
IF(II .EQ. 3) THEN
CALL QUAD(XX,YY,ITS)
XOLD=XX
YOLD=YY
IF(ITS .EQ. 22) call move(xx,yy)
ENDIF
IF(II .EQ. 2) THEN
IF(ITS .EQ. 22) THEN
! was in
CALL QUAD(XX,YY,ITS)
IF(ITS .EQ. 22) THEN
! still in
CALL DRAW(XX,YY)
XOLD=XX
YOLD=YY
ELSE
! now out
ITSN=22
CALL TRIM(XX,YY,XOLD,YOLD,XB,YB,ITS,ITSN)
CALL DRAW(XB, YB)
XOLD=XX
YOLD=YY
ITS=IABS(ITS)
ENDIF
ELSE
! was out
CALL QUAD(XX,YY,ITSN)
IF(ITSN .EQ. 22) THEN
! now in
CALL TRIM(XOLD,YOLD,XX,YY,XB,YB,ITS,ITSN)
CALL MOVE(XB, YB)
CALL DRAW(XX, YY)
XOLD=XX
YOLD=YY
ITS=22
ELSE
! still out but could have been in for a time so test
CALL TRIM(XOLD,YOLD,XX,YY,XB,YB,ITS,ITSN)
IF(ITS .LT. 0) THEN
! yes
XOLD=XX
YOLD=YY
ITS=IABS(ITSN)
ELSEIF(ITSN .LT. 0) THEN
CALL MOVE(XB,YB)
ITSN=-ITSN
ITS=22
XOLD=XB
YOLD=YB
CALL TRIM(XX,YY,XOLD,YOLD,XB,YB,ITSN,ITS)
CALL DRAW(XB, YB)
XOLD=XX
YOLD=YY
ITS=IABS(ITSN)
ENDIF
ENDIF
ENDIF
ENDIF
XLAS=XOLD
YLAS=YOLD
RETURN
END
subroutine quit_pgm
call setd(24)
close (90)
CALL get_rid_window
stop
end
! -----------------------------------------------------------------------------
subroutine clrbox
CALL clear_box
return
end
SUBROUTINE INTRVL(TA,IS)
!...... Timing routine
! TA is interval time in seconds
!IPK APR94
COMMON /RECOD/ IRECD,TSPC
INTEGER*4 ITA,ITN
IF(IS .EQ. 0) THEN
! CALL TIMER(ITA)
CALL GETTIM(IHR,IMIN,ISEC,IHUN)
TB=3600.*IHR+60.*IMIN+ISEC+ FLOAT(IHUN)/100.
RETURN
ELSE
CALL GETTIM(IHR,IMIN,ISEC,IHUN)
TA=3600.*IHR+60.*IMIN+ISEC+ FLOAT(IHUN)/100.
! CALL TIMER(ITN)
ENDIF
! ITIC=ITN-ITA
! IF(ITIC .LT. 0) THEN
! ITA=ITN
! ITIC=0
! ENDIF
! TA=FLOAT(ITIC)/100.
TA=TA-TB
IF(TSPC .EQ. 0.) THEN
TA=TA-0.5
ENDIF
RETURN
END
SUBROUTINE DASHLN(XLIN,YLIN,NLINP,ICD)
! Routine to draw a line with dashes
DIMENSION XLIN(*),YLIN(*)
! Work through points
DO 200 K=1,NLINP
IF(K .EQ. 1) THEN
CALL PLOTT(XLIN(K),YLIN(K),3)
ELSEIF(ICD .EQ. 0) THEN
CALL PLOTT(XLIN(K),YLIN(K),2)
ELSE
! Draw dashed line
DASHNT=0.2/2.**ICD
SC1=(XLIN(K)-XLIN(K-1))**2
SC2=(YLIN(K)-YLIN(K-1))**2
SLEN=SQRT(SC1+SC2)
NDASH=IFIX(SLEN/DASHNT)+1
XINC=(XLIN(K)-XLIN(K-1))/SLEN*DASHNT
YINC=(YLIN(K)-YLIN(K-1))/SLEN*DASHNT
XP=XLIN(K-1)
YP=YLIN(K-1)
DO 180 ND=1,NDASH
IF(ND .LT. NDASH) THEN
XP=XP+XINC
YP=YP+YINC
ELSE
XP=XLIN(K)
YP=YLIN(K)
ENDIF
IF(MOD(ND,2) .EQ. 1) THEN
CALL PLOTT(XP,YP,2)
ELSE
CALL PLOTT(XP,YP,3)
ENDIF
180 CONTINUE
ENDIF
200 CONTINUE
RETURN
END
subroutine chint(iflag)
character*1 iflag
iflag='c'
return
end
SUBROUTINE GETINTAA(INUM)
COMMON /RECOD/ IRECD,TSPC
character*50 cha
CHARACTER*11 DATA
CHARACTER*30 MES
DATA MES/'Error reading integer, Reenter'/
if(irecd .eq. 2) then
read(91,'(i7)') inum
CALL INTRVL(TA,0)
70 CALL INTRVL(TA,1)
IF(TA .LT. TSPC) GO TO 70
return
endif
80 CONTINUE
DO 90 I=1,11
DATA(I:I)=' '
90 CONTINUE
I = 1
10 CONTINUE
I = I+1
call gim_a_charac(key,cha,x,y)
! write(90,*) 'key',key
IF (KEY .EQ. 8) THEN
I = I-2
GO TO 10
ENDIF
IF(KEY .EQ. 13) GO TO 200
DATA(I:I)=CHAR(KEY)
CALL GTEXT(4,I+20,DATA(I:I))
100 CONTINUE
GO TO 10
200 CONTINUE
READ(DATA,5000,ERR=300) INUM
5000 FORMAT(1X,I10)
if(irecd .eq. 1) then
write(91,'(i7)') inum
endif
RETURN
300 CONTINUE
CALL SYMBL(3.0,7.6,0.2,MES,0.0,30)
GO TO 80
END
SUBROUTINE GETFPNA(FPN)
!IPK APR94
COMMON /RECOD/ IRECD,TSPC
CHARACTER*11 DATA
character*50 cha
CHARACTER*30 MES
DATA MES/'Error reading number, Reenter.'/
if(irecd .eq. 2) then
read(91,'(f7.2)') fpn
CALL INTRVL(TA,0)
70 CALL INTRVL(TA,1)
IF(TA .LT. TSPC) GO TO 70
return
endif
80 CONTINUE
DO 90 I=1,11
DATA(I:I)=' '
90 CONTINUE
I = 1
10 CONTINUE
I = I+1
call gim_a_charac(key,cha,x,y)
! write(90,*) 'key',key
IF (KEY .EQ. 8) THEN
I = I-2
GO TO 10
ENDIF
IF(KEY .EQ. 13) GO TO 200
DATA(I:I)=CHAR(KEY)
CALL GTEXT(4,I+20,DATA(I:I))
100 CONTINUE
GO TO 10
200 CONTINUE
READ(DATA,5000,ERR=300) FPN
5000 FORMAT(1X,F10.0)
if(irecd .eq. 1) then
write(91,'(f7.2)') fpn
endif
RETURN
300 CONTINUE
CALL SYMBL(3.0,7.6,0.2,MES,0.0,30)
GO TO 80
END
SUBROUTINE FLUSHWN
CALL FLUSH_SCREEN
RETURN
END
subroutine gtext(j,i,cha)
character*1 cha
y=8.0-0.1*j
x=i*0.15
call symbl(x,y,0.15,cha,0.0,1)
return
end
subroutine fillem(ielem)
USE BLK1MOD
INCLUDE 'TXFRM.COM'
dimension xvs(9),yvs(9)
! include 'BLK1.COM'
ncn=ncorn(ielem)
if(ncn .gt. 5) go to 200
N1=NOP(IELEM,1)
N2=NOP(IELEM,3)
IF(IPW1 .EQ. 1) THEN
wd11=width(n1)/txscal
wd2=width(n2)/txscal
ELSE
BT1= &
CRSDAT(NRIVCR1(N1),1,1)*WTRIVCR1(N1)+ &
CRSDAT(NRIVCR2(N1),1,1)*WTRIVCR2(N1)
BT2= &
CRSDAT(NRIVCR1(N2),1,1)*WTRIVCR1(N2)+ &
CRSDAT(NRIVCR2(N2),1,1)*WTRIVCR2(N2)
H1=WIDEL-BT1
H2=WIDEL-BT2
CALL INTERPWLV(N1,H1,AR1,WR1,DWR1)
CALL INTERPWLV(N2,H2,AR2,WR2,DWR2)
WIDTH(N1)=WR1
WIDTH(N2)=WR2
IF(IPW1 .EQ. 2) THEN
WD11=WR1*WIDSCL/TXSCAL
WD2=WR2*WIDSCL/TXSCAL
ELSE
WD11=AR1*WIDSCL/TXSCAL
WD2=AR2*WIDSCL/TXSCAL
ENDIF
ENDIF
IF(WD11 .GT. 0. .AND. WD2 .GT. 0.) THEN
X1= CORD(N1,1)
X2= CORD(N2,1)
Y1= CORD(N1,2)
Y2= CORD(N2,2)
ELDIR=ATAN2(Y2-Y1,X2-X1)
ELNORM=ELDIR-1.5708
XVS(1)=X1+COS(ELNORM)*WD11/2.
XVS(4)=X1-COS(ELNORM)*WD11/2.
XVS(2)=X2+COS(ELNORM)*WD2/2.
XVS(3)=X2-COS(ELNORM)*WD2/2.
YVS(1)=Y1+SIN(ELNORM)*WD11/2.
YVS(4)=Y1-SIN(ELNORM)*WD11/2.
YVS(2)=Y2+SIN(ELNORM)*WD2/2.
YVS(3)=Y2-SIN(ELNORM)*WD2/2.
NPTS=4
call polyfl(xvs,yvs,npts,14)
ENDIF
RETURN
200 xvs(1)=cord(nop(ielem,1),1)
yvs(1)=cord(nop(ielem,1),2)
npts=1
do 100 n=1,ncn
if(n .ge. 9) go to 100
if(nop(ielem,n) .eq. 0) go to 100
npts=npts+1
xvs(npts)=cord(nop(ielem,n),1)
yvs(npts)=cord(nop(ielem,n),2)
100 continue
call polyfl(xvs,yvs,npts,14)
return
end
SUBROUTINE CLRSTP(y1,y2)
REAL HSIZE
COMMON /SSIZE/ HSIZE
dimension x(4),y(4)
x(1)=0.
x(2)=HSIZE
x(3)=HSIZE
x(4)=0.
y(1)=y1
y(2)=y1
y(3)=y2
y(4)=y2
call Rwhite
CALL fill_a_polygon(x,y,4)
call RBlue
return
end
SUBROUTINE FILLEMC(IELEM,ICCT)
USE BLK1MOD
INCLUDE 'BFILES.I90'
INCLUDE 'TXFRM.COM'
! INCLUDE 'BLK1.COM'
DIMENSION X(4),Y(4)
DO 300 N=1,NCORN(IELEM),2
M=NOP(IELEM,N)
IF(M .EQ. 0) THEN
GO TO 310
ELSE
X((N+1)/2)=CORD(M,1)
Y((N+1)/2)=CORD(M,2)
if(i3dview .eq. 1) then
Y((N+1)/2)=Y((N+1)/2)+(WD(M)-VRTORIG)*COS(VANG/57.29578)/VRTSCAL
endif
NPOL=(N+1)/2
ENDIF
300 CONTINUE
310 CONTINUE
IF(NCORN(IELEM) .GT. 5) THEN
CALL NWPEN(ICCT)
CALL fill_a_polygon(x,y,npol)
ELSE
N1=NOP(IELEM,1)
N2=NOP(IELEM,3)
!ipk dec17
if(ncorn(ielem) .eq. 2) n2=nop(ielem,2)
IF(IPW1 .EQ. 1) THEN
wd11=width(n1)/txscal
wd2=width(n2)/txscal
ELSE
IF(NRIVCR1(N1) .EQ. 0 .AND. NRIVCR2(N1) .EQ. 0) RETURN
IF(NRIVCR1(N2) .EQ. 0 .AND. NRIVCR2(N2) .EQ. 0) RETURN
BT1= &
CRSDAT(NRIVCR1(N1),1,1)*WTRIVCR1(N1)+ &
CRSDAT(NRIVCR2(N1),1,1)*WTRIVCR2(N1)
BT2= &
CRSDAT(NRIVCR1(N2),1,1)*WTRIVCR1(N2)+ &
CRSDAT(NRIVCR2(N2),1,1)*WTRIVCR2(N2)
H1=WIDEL-BT1
H2=WIDEL-BT2
CALL INTERPWLV(N1,H1,AR1,WR1,DWR1)
CALL INTERPWLV(N2,H2,AR2,WR2,DWR2)
WIDTH(N1)=WR1
WIDTH(N2)=WR2
IF(IPW1 .EQ. 2) THEN
WD11=WR1*WIDSCL/TXSCAL
WD2=WR2*WIDSCL/TXSCAL
ELSE
WD11=AR1*WIDSCL/TXSCAL
WD2=AR2*WIDSCL/TXSCAL
ENDIF
ENDIF
IF(WD11 .GT. 0. .AND. WD2 .GT. 0.) THEN
X1= CORD(N1,1)
X2= CORD(N2,1)
Y1= CORD(N1,2)
Y2= CORD(N2,2)
ELDIR=ATAN2(Y2-Y1,X2-X1)
ELNORM=ELDIR-1.5708
X(1)=X1+COS(ELNORM)*WD11/2.
X(4)=X1-COS(ELNORM)*WD11/2.
X(2)=X2+COS(ELNORM)*WD2/2.
X(3)=X2-COS(ELNORM)*WD2/2.
Y(1)=Y1+SIN(ELNORM)*WD11/2.
Y(4)=Y1-SIN(ELNORM)*WD11/2.
Y(2)=Y2+SIN(ELNORM)*WD2/2.
Y(3)=Y2-SIN(ELNORM)*WD2/2.
NPOL=4
CALL NWPEN(ICCT)
CALL fill_a_polygon(x,y,npol)
ENDIF
ENDIF
CALL RBlue
RETURN
END
SUBROUTINE POLYG(AX,AY,NPT,N)
SAVE
DIMENSION AX(10),AY(10),BX(15),BY(15)
! Duplicate numbers around AX to form long list
!
DO 200 I=1,NPT
AX(I+NPT)=AX(I)
AY(I+NPT)=AY(I)
200 CONTINUE
! Find a starting point that is on the page
DO 250 I=1,NPT
CALL QUAD(AX(I),AY(I),ITS)
IF(ITS .EQ. 22) THEN
! We have a starting point
II=I
GO TO 350
ENDIF
! Keep looking
250 CONTINUE
! No point on page then skip out
RETURN
! Loop to check each point and trim as required
350 CONTINUE
JJ=1
BX(1)=AX(II)
BY(1)=AY(II)
XOLD=AX(II)
YOLD=AY(II)
DO 500 J=2,NPT+1
II=II+1
IF(ITS .EQ. 22) THEN
CALL QUAD(AX(II),AY(II),ITS)
IF(ITS .EQ. 22) THEN
! still in copy over from A to B
JJ=JJ+1
BX(JJ)=AX(II)
BY(JJ)=AY(II)
XOLD=AX(II)
YOLD=AY(II)
ELSE
! now out copy over boundary
ITSN=22
CALL TRIM(AX(II),AY(II),XOLD,YOLD,XB,YB,ITS,ITSN)
JJ=JJ+1
BX(JJ)=XB
BY(JJ)=YB
XOLD=AX(II)
YOLD=AY(II)
ITS=IABS(ITS)
ENDIF
ELSE
! WAS OUT
CALL QUAD(AX(II),AY(II),ITSN)
IF(ITSN .EQ. 22) THEN
! now in copy over point of return
CALL TRIM(XOLD,YOLD,AX(II),AY(II),XB,YB,ITS,ITSN)
JJ=JJ+1
BX(JJ)=XB
BY(JJ)=YB
! Copy destination point
JJ=JJ+1
BX(JJ)=AX(II)
BY(JJ)=AY(II)
XOLD=AX(II)
YOLD=AY(II)
ITS=22
ELSE
! still out but could have been in for a time so test
CALL TRIM(XOLD,YOLD,AX(II),AY(II),XB,YB,ITS,ITSN)
IF(ITS .LT. 0) THEN
! no
XOLD=AX(II)
YOLD=AY(II)
ITS=IABS(ITSN)
ELSEIF(ITSN .LT. 0) THEN
! Temporarily in. Copy point of return
JJ=JJ+1
BX(JJ)=XB
BY(JJ)=YB
ITSN=-ITSN
ITS=22
XOLD=XB
YOLD=YB
CALL TRIM(AX(II),AY(II),XOLD,YOLD,XB,YB,ITSN,ITS)
! Now copy over point of exit
JJ=JJ+1
BX(JJ)=XB
BY(JJ)=YB
XOLD=AX(II)
YOLD=AY(II)
ITS=IABS(ITSN)
ENDIF
ENDIF
ENDIF
500 CONTINUE
! Record final number of points
NPTS=JJ
!ipk sep 94 icl=mod(n,16)+1
icl=mod(n-1,14)
call polyfl(bx,by,npts,icl)
RETURN
END
SUBROUTINE DBDASHLN(XLIN,YLIN,NLINP,ICD)
! Routine to draw a line with dashes
REAL*8 XLIN(*),YLIN(*)
! Work through points
DO 200 K=1,NLINP
IF(K .EQ. 1) THEN
XCT=XLIN(K)
YCT=YLIN(K)
CALL PLOTT(XCT,YCT,3)
ELSEIF(ICD .EQ. 0) THEN
XCT=XLIN(K)
YCT=YLIN(K)
CALL PLOTT(XCT,YCT,2)
ELSE
! Draw dashed line
DASHNT=0.2/2.**ICD
SC1=(XLIN(K)-XLIN(K-1))**2
SC2=(YLIN(K)-YLIN(K-1))**2
SLEN=SQRT(SC1+SC2)
if(slen .lt. 0.1) then
XP=XLIN(K-1)
YP=YLIN(K-1)
CALL PLOTT(XP,YP,3)
XP=XLIN(K)
YP=YLIN(K)
CALL PLOTT(XP,YP,2)
cycle
endif
NDASH=IFIX(SLEN/DASHNT)+1
XINC=(XLIN(K)-XLIN(K-1))/SLEN*DASHNT
YINC=(YLIN(K)-YLIN(K-1))/SLEN*DASHNT
XP=XLIN(K-1)
YP=YLIN(K-1)
DO 180 ND=1,NDASH
IF(ND .LT. NDASH) THEN
XP=XP+XINC
YP=YP+YINC
ELSE
XP=XLIN(K)
YP=YLIN(K)
ENDIF
IF(MOD(ND,2) .EQ. 1) THEN
CALL PLOTT(XP,YP,2)
ELSE
CALL PLOTT(XP,YP,3)
ENDIF
180 CONTINUE
ENDIF
200 CONTINUE
RETURN
END
SUBROUTINE GETINT(ISW)
USE WINTERACTER
!
!
include 'd.inc'
!
! Declare window-type and message variables
!
TYPE(WIN_STYLE) :: WINDOW
TYPE(WIN_MESSAGE) :: MESSAGE
COMMON /RECOD/ IRECD,TSPC
COMMON /HEDS/ NP,NE,NHTP,NMESS,NBRR,IPSW(15),IRMAIN,ISCRN,icolon(12),IQSW(2),IRDISP,ntempin,igfgsw,igfgswb,ICRIN,IPW1,WIDEL,WIDSCL,itrianout
CHARACTER*47 MESOUT,MESS(47)
DATA MESS /'Enter node to search for',' Enter material type',&
'Enter element to search for ',&
'Enter number of layers ',&
'Enter width ',&
'Click mouse at end of line ',&
'Enter number of nodes in line ',&
'Click at corners of block ',&
'Enter number of elements in x-dir ',&
'Enter number of elements in y-dir ',&
'Click to move boundaries or (q)uit to terminate',&
'Click on elements','Enter starting list number ',&
'Enter bed elevation','Click on node ',&
'Click location of new node','Click at node to move ',&
'Click at node to delete ',&
'Type 1 to use all nodes else type 0 ',&
'Enter element to select','Click location of node',&
'Enter SS1','Enter SS2','Enter STRWID','Enter STORAGE ELEVATION',&
'Click mouse on node','click mouse on next node',&
'ERROR - Midside node selected - Select node again',&
'Plotting a selected cross section',&
'Click two locations to form a cross section',&
'Click to adjust the cross section',&
'Compute cross section parameters',&
'Click a node for the cross section',&
'Click two locations to form the width','Click to adjust the line','Click two locations to form left slope',&
'Click two locations to form right slope','Click a location'&
,'Enter storage elevation','Enter storage slope',&
'Click at two locations to determine distance'&
,'Enter continuity line number. Use 0 to end','Click at location to define register point'&
,'Enter 1-D cross-section bed slope','Enter element frequency for search'&
,'Enter no. of elements to reverse '&
,'Enter no. of elements across section'/
if(irecd .eq. 2) then
read(91,'(i7)') isw
CALL INTRVL(TA,0)
70 CALL INTRVL(TA,1)
IF(TA .LT. TSPC) GO TO 70
return
endif
if(isw .eq. 0) isw=1
call wdialogload(IDD_GETINT)
ierr=infoerror(1)
CALL WDialogSelect(IDD_GETINT)
ierr=infoerror(1)
CALL WDialogPutString(IDF_STRING1,MESS(NMESS))
CALL WDialogPutInteger(IDF_INTEGER1,ISW)
CALL WDialogShow(-1,-1,0,Modal)
ierr=infoerror(1)
! Branch depending on type of message.
!
DO
IF (WInfoDialog(ExitButton) .EQ. IDOK) THEN
CALL WDialogGetInteger(IDF_INTEGER1,ISW)
RETURN
ELSE
RETURN
ENDIF
ENDDO
RETURN
END
SUBROUTINE GETFPN(FPN)
USE WINTERACTER
!
!
include 'd.inc'
!
! Declare window-type and message variables
!
TYPE(WIN_STYLE) :: WINDOW
TYPE(WIN_MESSAGE) :: MESSAGE
COMMON /RECOD/ IRECD,TSPC
COMMON /HEDS/ NP,NE,NHTP,NMESS,NBRR,IPSW(15),IRMAIN,ISCRN,icolon(12),IQSW(2),IRDISP,ntempin,igfgsw,igfgswb,ICRIN,IPW1,WIDEL,WIDSCL,itrianout
CHARACTER*47 MESOUT,MESS(47)
DATA MESS /'Enter node to search for',' Enter material type',&
'Enter element to search for ',&
'Enter number of layers ',&
'Enter width ',&
'Click mouse at end of line ',&
'Enter number of nodes in line ',&
'Click at corners of block ',&
'Enter number of elements in x-dir ',&
'Enter number of elements in y-dir ',&
'Click to move boundaries or (q)uit to terminate',&
'Click on elements','Enter starting list number ',&
'Enter bed elevation','Click on node ',&
'Click location of new node','Click at node to move ',&
'Click at node to delete ',&
'Type 1 to use all nodes else type 0 ',&
'Enter element to select','Click location of node',&
'Enter SS1','Enter SS2','Enter STRWID','Enter STORAGE ELEVATION',&
'Click mouse on node','click mouse on next node',&
'ERROR - Midside node selected - Select node again',&
'Plotting a selected cross section',&
'Click two locations to form a cross section',&
'Click to adjust the cross section',&
'Compute cross section parameters',&
'Click a node for the cross section',&
'Click two locations to form the width','Click to adjust the line','Click two locations to form left slope',&
'Click two locations to form right slope','Click a location'&
,'Enter storage elevation','Enter storage slope',&
'Click at two locations to determine distance'&
,'Enter continuity line number. Use 0 to end','Click at location to define register point'&
,'Enter 1-D cross-section bed slope','Enter time interval for display of steps'&
,'Enter tolerance for overlapping points','Enter direction of axis for reordering'/
if(irecd .eq. 2) then
read(91,'(f7.2)') fpn
CALL INTRVL(TA,0)
70 CALL INTRVL(TA,1)
IF(TA .LT. TSPC) GO TO 70
return
endif
call wdialogload(IDD_GETFPN)
ierr=infoerror(1)
CALL WDialogSelect(IDD_GETFPN)
ierr=infoerror(1)
CALL WDialogPutString(IDF_STRING1,MESS(NMESS))
CALL WDialogPutReal(IDF_REAL1,FPN)
CALL WDialogShow(-1,-1,0,Modal)
ierr=infoerror(1)
! Branch depending on type of message.
!
DO
IF (WInfoDialog(ExitButton) .EQ. IDOK) THEN
CALL WDialogGetReal(IDF_REAL1,FPN)
RETURN
ELSE
RETURN
ENDIF
ENDDO
RETURN
END
subroutine drawcr(x,y,siz)
! routine to draw x mark
siz1=0.707/2.*siz
x1=x-siz1
y1=y-siz1
call plott(x1,y1,3)
x1=x+siz1
y1=y+siz1
call plott(x1,y1,2)
x1=x-siz1
y1=y+siz1
call plott(x1,y1,3)
x1=x+siz1
y1=y-siz1
call plott(x1,y1,2)
return
end
SUBROUTINE GETREV(ISW,ILMIT)
USE WINTERACTER
!
!
include 'd.inc'
!
! Declare window-type and message variables
!
TYPE(WIN_STYLE) :: WINDOW
TYPE(WIN_MESSAGE) :: MESSAGE
INTEGER ISW,ILMIT
call wdialogload(IDD_GETINTR)
ierr=infoerror(1)
CALL WDialogSelect(IDD_GETINTR)
ierr=infoerror(1)
CALL WDialogPutCheckBox(IDF_check1,ILMIT)
CALL WDialogPutInteger(IDF_INTEGER1,ISW)
CALL WDialogShow(-1,-1,0,Modal)
ierr=infoerror(1)
! Branch depending on type of message.
!
DO
IF (WInfoDialog(ExitButton) .EQ. IDOK) THEN
CALL WDialogGetCheckBox(IDF_check1,ILMIT)
CALL WDialogGetInteger(IDF_INTEGER1,ISW)
RETURN
ELSE
ISW=-1
RETURN
ENDIF
ENDDO
RETURN
END