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.

1270 lines
47 KiB
Fortran

!IPK LAST UPDATE SEP 23 2015 ADD TESTING FOR CHNAGED ELEMENTS/NODES
!ipk last update Jan25 2001 fix when deleting center-mid expand ipsw
! last change ipk 12 July 1999
! Last change: IPK 13 Jan 98 10:01 am
!ipk last update Nov 18 1997
!ipk last updated Oct 23 1996
!ipk last updated June 23 1996
!ipk last updated Oct 25 1995
SUBROUTINE GETELM(NEM)
!
! Routine to find first free element number
!
USE BLK1MOD
! INCLUDE 'BLK1.COM'
!
DO 200 J=NELAST,NE
IF(IMAT(J) .EQ. 0) THEN
NEM=J
NELAST=J
RETURN
ENDIF
200 END DO
NE=NE+1
NELAST=NE
NEM=NE
RETURN
END
!
SUBROUTINE GETNOD(NPT)
!
! Routine to find first free node number
!
USE BLK1MOD
! INCLUDE 'BLK1.COM'
!
IF(NP .GT. 0) THEN
DO 200 J=NPLAST,NP
IF(INEW(J) .EQ. 0) THEN
NPT=J
NPLAST=J
RETURN
ENDIF
200 END DO
ELSE
NP=0
ENDIF
NP=NP+1
NPLAST=NP
NPT=NP
IF(NPT .GT. MAXP) THEN
CALL WMessageBox(OKOnly,ExclamationIcon,CommonOK,'Execution terminated, nodal limits exceeded. Backup written','LIMITS EXCEEDED')
CALL WRTOUT(0)
STOP
ENDIF
!IPK MAY03
ICHG=0
RETURN
END
!
!***********************************************************************
!
SUBROUTINE DELETN(J)
!
USE BLK1MOD
! INCLUDE 'BLK1.COM'
!
! Search for elements that attach to node J and remove them
!
DO 200 N=1,NE
IF(IMAT(N) .GT. 0) THEN
NCN=NCORN(N)
DO 180 K=1,NCN
IF(NOP(N,K) .EQ. J) THEN
!IPK APR94
IF(IMAT(N) .LT. 901 .OR. IMAT(N) .GT. 903) THEN
IF(MOD(K,2) .EQ. 0) THEN
IF(NCN .NE. 2) THEN
IF(NCN .NE. 5 .OR. K .EQ. 2) THEN
NOP(N,K)=0
GO TO 200
ENDIF
!IPK APR94 END CHANGES
ENDIF
ENDIF
ENDIF
IMAT(N)=0
XC(N)=VOID
YC(N)=VOID
NCORN(N)=0.
IF(N .LT. NELAST) NELAST=N
DO 170 KK=1,8
NOP(N,KK)=0
170 CONTINUE
IESKP(N)=1
GO TO 200
ENDIF
180 CONTINUE
ENDIF
200 END DO
!IPK FEB08 TEST FOR LOWERING NE
DO N=NE,1,-1
IF(IMAT(N) .NE. 0) THEN
JJ=N
GO TO 225
ENDIF
ENDDO
225 NE=JJ
!
! Remove node now
!
CORD(J,1)=VOID
CORD(J,2)=VOID
XUSR(J) = VOID
YUSR(J) = VOID
INSKP(J)=1
INEW(J) = 0
WD(J)=-9999.
WIDTH(J)=0.
SS1(J)=0.
SS2(J)=0.
WIDS(J)=0.
IF(NPLAST .GT. J) NPLAST=J
!IPK FEB08 TEST FOR LOWERING NE
IF(J .EQ. NP) THEN
DO N=NP,1,-1
IF(INEW(N) .NE. 0) THEN
JJ=N
GO TO 250
ENDIF
ENDDO
250 NP=JJ
ENDIF
RETURN
END
!
!
!***********************************************************************
function lenstr(str)
!
! Find length of string (position of last non-blank character)
!
character*(*) str
n = len(str)
lenstr = n
do 10 i=0,n-1
idx = n-i
if (str(idx:idx) .ne. ' ') then
lenstr = idx
return
endif
10 continue
return
END
!
!****************************************************************
!
subroutine prox(x,y,npts,xx,yy,ipt,iflag,inskp,ibox)
! x=array of x node locations
! y=array of y node location
! npts= max number of nodes
! xx=x screen lpcation
! yy=y screen location
! iflag=character flag
! inskp=array telling nodes to skip
! ibox=any box checked
save
CHARACTER*80 TITLE
CHARACTER*24 HLABL
CHARACTER*1 ALABL(10)
CHARACTER*40 MPDUM
COMMON /BLKA1/ TITLE,HLABL,ALABL &
& ,MPDUM
!ipk oct 95 lines defining MPDUM added
!
!ipk jan01 expand IPSW
COMMON /HEDS/ NP,NE,NHTP,NMESS,NBRR,IPSW(15),IRMAIN,ISCRN,icolon(12),IQSW(2),IRDISP,ntempin,igfgsw,igfgswb,ICRIN,IPW1,WIDEL,WIDSCL,itrianout
!
integer*2 inskp(*)
!IPK MAY02
REAL*8 x(*),y(*)
character*1 iflag
!
! if(ibox .eq. 0) then
! nbx=2
! call boxr(nbx)
! endif
!
! Get location of cursor
!
10 call xyloc(xscrn,yscrn,iflag,ibox)
! write(90,*) 'ibox,xscrn,yscrn',ibox,xscrn,yscrn,irmain
! write(90,7893) iflag
7893 format(' iflag',a2)
! read(*,*) junk
if(irmain .eq. 1) return
if(ibox .eq. 10) then
iflag = 'q'
return
elseif(ibox .eq. 9) then
iflag = 'r'
! elseif(ibox .eq. 7) then
! iflag = 'a'
endif
!
!
if (iflag .eq. 'q') then
return
elseif(iflag .eq. 'r') then
return
elseif(iflag .ne. 'c') then
ibox=0
if(iflag .eq. 't') return
if(iflag .eq. 'l') return
if(iflag .eq. 'f') return
if(iflag .eq. 'e') return
if(iflag .eq. 'a') return
if(iflag .eq. 'j') return
if(iflag .eq. 'z') return
if(iflag .eq. 'n') return
if(iflag .eq. 'g') return
if(iflag .eq. 'h') return
!ipk oct96 add line below
if(iflag .eq. 'b') return
if(iflag .eq. 'U') return
!
if(iflag .eq. 'm') go to 12
!ipk jan98 write(*,*) char(7),char(7)
go to 10
endif
!
! Compare to coordinates
12 d = 1.E+20
do 20 i=1,npts
!! write(*,*) 'i,npts',i,npts,inskp(i),x(i),y(i)
if(inskp(i) .ne. 0) go to 20
dist = sqrt( (xscrn-x(i))**2 + (yscrn-y(i))**2)
if (dist .lt. d) then
d = dist
ipt = i
xx = x(i)
yy = y(i)
endif
20 continue
return
!
!
END
!***********************************************************
subroutine zoom
!
USE BLK1MOD
! INCLUDE 'BLK1.COM'
!
dimension xot(5),yot(5)
character*1 iflag,ans
!
!ipk jun96 add zoomj
character*36 zoomh,zoomj,IFLAG32
character*22 zoomi
!ipk jan98
CHARACTER*80 lind
data zoomh/' Zooming, click at diagonal corners'/
data zoomi/' Click left if size OK'/
!ipk jun96 add zoomj
data zoomj/' Double click, click second point '/
!
!
80 CALL CLRBOX
CALL SYMBL(0.,7.70,0.20,zoomh,0.,36)
!jan09 xcc = 5.00
xcc = 5.00*hsize/10.
ycc = 3.5
!
100 continue
!
! Get cursor location
!
CALL XYLOC(xscrn,yscrn,iflag,ibox)
IF(IRMAIN .EQ. 1) RETURN
!
if (iflag .eq. 'q') return
!
xp = xmin + xscrn
yp = ymin + yscrn
if(iflag .eq. 'c') then
!
! This option is creating an inset window
!
!ipk jun96 add new path
120 continue
CALL XYLOC(xscrn1,yscrn1,iflag,ibox)
IF(IRMAIN .EQ. 1) RETURN
if(iflag .eq. 'c') then
!
! Look for a screen size
!
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 SYMBL(0.,7.70,0.20,zoomj,0.,36)
go to 120
endif
if(xscrn1 .lt. xscrn) xscrn=xscrn1
if(yscrn1 .lt. yscrn) yscrn=yscrn1
fact=HSIZE/xsiz
!jan09 if(7./ysiz .lt. fact) fact=7./ysiz
if(7.5/ysiz .lt. fact) fact=7.5/ysiz
xot(1)=xscrn
xot(5)=xscrn
yot(1)=yscrn
yot(5)=yscrn
yot(2)=yscrn
xot(4)=xscrn
!jan09 xscrn=xscrn+5./fact
!jan09 yscrn=yscrn+3.5/fact
xscrn=xscrn+xcc/fact
yscrn=yscrn+3.75/fact
!jan09 xot(2)=xscrn+5./fact
xot(2)=xscrn+xcc/fact
xot(3)=xot(2)
!jan09 yot(3)=yscrn+3.5/fact
yot(3)=yscrn+3.75/fact
yot(4)=yot(3)
call DASHLN(xot,yot,5,1)
xp=xscrn
yp=yscrn
CALL CLRBOX
CALL SYMBL(0.,7.70,0.20,zoomi,0.,22)
CALL XYLOC(xscrn1,yscrn1,iflag,ibox)
IF(IRMAIN .EQ. 1) RETURN
if(iflag .ne. 'c') go to 80
go to 280
!
! pan right
!
else if(iflag .eq. 'r') then
fact=1.0
!jan09 xscrn=xscrn+5.0
xscrn=xscrn+hsize/2.
xp=xscrn
yp=yscrn
!
! pan left
!
else if(iflag .eq. 'l') then
fact=1.0
!jan09 xscrn=xscrn-5.0
xscrn=xscrn-hsize/2.
xp=xscrn
yp=yscrn
endif
!
! redraw at half size
!
elseif(iflag .eq. 'r') then
fact = 0.500
!
! user controlled redraw
!
else
call setd(23)
write (*,*) ' factor '
read(*,*) fact
call setd(2)
endif
do 250 i=1,np
if(cord(i,1) .gt. void) then
inskp(i)=0
endif
250 continue
do 270 i=1,ne
if(imat(i) .gt. 0) then
ieskp(i)=0
endif
270 continue
280 continue
pscale = pscale/fact
xmino=xmin
ymino=ymin
!
xmin = xp - (xcc*pscale)
ymin = yp - (ycc*pscale)
!
if(iflag .eq. 'c') then
! CALL PLOTS(0)
!ipk nov97 add (0)
CALL PLOTOT(0)
return
elseif(iflag .eq. 'r') then
! CALL PLOTS(0)
!ipk nov97 add (0)
CALL PLOTOT(0)
return
elseif(iflag .eq. 'l') then
! CALL PLOTS(0)
!ipk nov97 add (0)
CALL PLOTOT(0)
return
endif
call setd(23)
write(lind,*) 'Illegal zoom press return to continue'
call symbl &
& (1.1,7.1,0.20,LIND,0.0,80)
ndig=1
CALL GTCHARX(IFLAG32,NDIG,5.0,7.6)
!ipk jan98 write(*,*) 'O.K. to plot at this scale? (y)es .or. (n)o'
!ipk jan98 write(*,*) 'Note n means redraw old plot'
!ipk jan98 read(*,'(a)') ans
!ipk jan98 call setd(2)
!ipk jan98 if (ans .eq. 'y') then
! CALL PLOTS(0)
!ipk nov97 add (0)
CALL PLOTOT(0)
return
!ipk jan98 endif
pscale = pscale * fact
xmin=xmino
ymin=ymino
! CALL PLOTS(0)
!ipk nov97 add (0)
CALL PLOTOT(0)
return
END
!***********************************************************
SUBROUTINE DELETM(ISW)
!
USE BLK1MOD
INCLUDE 'BFILES.I90'
! INCLUDE 'BLK1.COM'
!
! COMMON /ICN1/ ICN(MAXP)
DIST(N1,N2)=SQRT((CORD(N1,1)-CORD(N2,1))**2 &
& +(CORD(N1,2)-CORD(N2,2))**2)
DO 150 J=1,MAXP
ICN(J)=0
150 END DO
IF(ISW .EQ. 2) GO TO 650
! First sort out the potential midsides
! Note that transition elements caues a problem
! Find these first
IRDONE=0
DO 200 N=1,NE
IF(NCORN(N) .EQ. 5 .AND. IMAT(N) .LT. 901) THEN
!
! We have a transition mark node number as if it were corner
!
ICN(NOP(N,3))=1
ICN(NOP(N,1))=2
ICN(NOP(N,4))=2
ICN(NOP(N,5))=2
ELSE
if(imat(n) .eq. 0) then
ncorn(n)=0
go to 200
endif
!
! Store ICN = 2 for corner nodes
!
NCN=NCORN(N)
!IPKOCT93 IF(IMAT(N) .GT. 900) THEN
IF(IMAT(N) .GT. 900 .AND. IMAT(N) .LT. 904) THEN
MST=1
ELSE
MST=2
ENDIF
DO 180 M=1,NCN,MST
ICN(NOP(N,M))=2
180 CONTINUE
ENDIF
200 END DO
!
! test ISW
! if isw=0 then delete all midsides except at transition
! if isw=1 then delete only midsides that are truely in the middle
!
IF(ISW .EQ. 0) THEN
DO 400 N=1,NE
!IPKOCT93 IF(IMAT(N) .LT. 901) THEN
IF(IMAT(N) .LT. 901 .OR. IMAT(N) .GT. 903) THEN
IF(NCORN(N) .EQ. 5) THEN
NCN=3
ELSE
NCN=NCORN(N)
ENDIF
DO 350 M=2,NCN,2
J=NOP(N,M)
!SEP93 IPK
IF(J .EQ. 0) GO TO 350
!SEP93 IPK
IF(ICN(J) .NE. 1) THEN
NOP(N,M)=0
IF(ICN(J) .EQ. 0) THEN
!
! Remove node now
!
CORD(J,1)=VOID
CORD(J,2)=VOID
XUSR(J) = VOID
YUSR(J) = VOID
INSKP(J)=1
INEW(J) = 0
WD(J)=-9999.
WIDTH(J)=0.
SS1(J)=0.
SS2(J)=0.
WIDS(J)=0.
!IPK MAY03
ICHG=0
IF(NPLAST .GT. J) NPLAST=J
ENDIF
ENDIF
350 CONTINUE
ENDIF
400 CONTINUE
ELSE
DO 600 N=1,NE
IF(IMAT(N) .LT. 901) THEN
IF(NCORN(N) .EQ. 5) THEN
NCN=3
ELSE
NCN=NCORN(N)
ENDIF
DO 550 M=2,NCN,2
J1=M-1
IF(M .EQ. NCN) THEN
J2=1
ELSE
J2=M+1
ENDIF
J=NOP(N,M)
!ipk jul99
if(j .gt. 0) then
!ipk jan01
IF(INEW(J) .EQ. 0 .or. inew(j) .eq. 2) THEN
inew(j)=0
NOP(N,M)=0
GO TO 550
ENDIF
else
go to 550
endif
!
! Test for distance separation of midside node
!
XMID=(CORD(NOP(N,J1),1)+CORD(NOP(N,J2),1))/2.
YMID=(CORD(NOP(N,J1),2)+CORD(NOP(N,J2),2))/2.
DM=SQRT((XMID-CORD(J,1))**2+(YMID-CORD(J,2))**2)
DL=DIST(J1,J2)
IF(DM .LT. 0.005*DL) THEN
IF(ICN(J) .NE. 1) THEN
NOP(N,M)=0
IF(ICN(J) .EQ. 0) THEN
!
! Remove node now
!
CORD(J,1)=VOID
CORD(J,2)=VOID
XUSR(J) = VOID
YUSR(J) = VOID
INSKP(J)=1
INEW(J) = 0
WD(J)=-9999.
WIDTH(J)=0.
SS1(J)=0.
SS2(J)=0.
WIDS(J)=0.
!IPK MAY03
ICHG=0
IF(NPLAST .GT. J) NPLAST=J
ENDIF
ENDIF
ENDIF
550 CONTINUE
ENDIF
600 CONTINUE
ENDIF
!IPK FEB08 RESET NP
DO J=NP,1,-1
IF(INEW(J) .NE. 0) THEN
JJ=J
GO TO 625
ENDIF
ENDDO
625 CONTINUE
NP=JJ
RETURN
!-
!-.....FIND MISSING NODE NUMBERS.....
!-
650 CONTINUE
DO 700 I=1,MAXP
700 ICN(I) = 0
DO 725 J = 1, NE
IF( IMAT(J) .EQ. 0 ) GO TO 725
DO 720 K = 1, 8
IF( NOP(J,K) .LE. 0) GOTO 720
ICN(NOP(J,K))=999
720 CONTINUE
725 END DO
!
! Remove nodes
!
DO 800 J=1,NP
IF(ICN(J) .EQ. 0) THEN
CORD(J,1)=VOID
CORD(J,2)=VOID
XUSR(J) = VOID
YUSR(J) = VOID
INSKP(J)=1
INEW(J) = 0
WD(J)=-9999.
WIDTH(J)=0.
SS1(J)=0.
SS2(J)=0.
WIDS(J)=0.
IF(NPLAST .GT. J) NPLAST=J
!IPK MAY03
ICHG=0
ENDIF
800 END DO
!IPK FEB08 RESET NP
DO J=NP,1,-1
IF(INEW(J) .NE. 0) THEN
JJ=J
GO TO 900
ENDIF
ENDDO
900 CONTINUE
NP=JJ
RETURN
END
!****************************************************************
!
subroutine prox2(x,y,npts,xx,yy,ipt,xx2,yy2,ipt2,iflag,inskp,ibox)
save
CHARACTER*80 TITLE
CHARACTER*24 HLABL
CHARACTER*1 ALABL(10)
CHARACTER*40 MPDUM
COMMON /BLKA1/ TITLE,HLABL,ALABL ,MPDUM
!ipk oct 95 lines defining MPDUM added
!
!ipk jan01 expand IPSW
COMMON /HEDS/ NP,NE,NHTP,NMESS,NBRR,IPSW(15),IRMAIN,ISCRN,icolon(12),IQSW(2),IRDISP,ntempin,igfgsw,igfgswb,ICRIN,IPW1,WIDEL,WIDSCL,itrianout
!
integer*2 inskp(*)
!IPK MAY02
REAL*8 x(*),y(*)
character*1 iflag
!
! if(ibox .eq. 0) then
! nbx=2
! call boxr(nbx)
! endif
!
! Get location of cursor
!
10 call xyloc(xscrn,yscrn,iflag,ibox)
if(irmain .eq. 1) return
if(ibox .eq. 10) then
iflag = 'q'
return
elseif(ibox .eq. 9) then
iflag = 'r'
endif
!
!
if (iflag .eq. 'q') then
return
elseif(iflag .eq. 'r') then
return
elseif(iflag .ne. 'c') then
ibox=0
if(iflag .eq. 't') return
if(iflag .eq. 'l') return
if(iflag .eq. 'f') return
if(iflag .eq. 'e') return
if(iflag .eq. 'a') return
if(iflag .eq. 'j') return
if(iflag .eq. 'z') return
if(iflag .eq. 'n') return
if(iflag .eq. 'g') return
if(iflag .eq. 'h') return
!
if(iflag .eq. 'm') go to 12
!ipk jan98 write(*,*) char(7),char(7)
go to 10
endif
!
! Compare to coordinates
!
ipt2=0
12 d = 1.E+20
do 20 i=1,npts
if(inskp(i) .ne. 0) go to 20
dist = sqrt( (xscrn-x(i))**2 + (yscrn-y(i))**2)
if (dist .lt. d) then
if(i .ne. ipt) then
xx2=x(i)
yy2=y(i)
ipt2=i
d = dist
go to 20
endif
endif
20 continue
return
!
END
SUBROUTINE CVF(FPN,IDEC,NUMSTR,NUMC)
!
! Routine to convert number to array and prepare for plotting
!
CHARACTER*36 NUMSTR
CHARACTER*36 FMT,FMT1
IF(FPN .NE. 0.) THEN
if(idec .eq. 1) then
NDIG = ALOG10(ABS(FPN)+0.05)
elseif(idec .eq. 2) then
NDIG = ALOG10(ABS(FPN)+0.005)
elseif(idec .eq. 3) then
NDIG = ALOG10(ABS(FPN)+0.0005)
else
NDIG = ALOG10(ABS(FPN)+0.50005)
endif
ELSE
NDIG = 0
ENDIF
!
! Check for Numbers than 10
!
IF(NDIG .LE. 0) THEN
!
! Check for negative numbers
!
IF(FPN .LT. 0.) THEN
!
! Check for integer plot
!
IF(IDEC .LT. 0) THEN
NUMC = 2
IF(FPN .EQ. 0) NUMC=1
ELSE
!
! This is a negative number less than 10
!
NUMC = IDEC+3
ENDIF
!
! Check for integer plot probably a zero
!
ELSEIF(IDEC .LT. 0) THEN
NUMC = 1
ELSE
!
! This is a positive number less than 1
!
NUMC = IDEC+2
ENDIF
!
! Now check numbers of magnitude greater than 1
!
ELSEIF(FPN .LT. 0.) THEN
!
! Check for integer plot. A negative number
!
IF(IDEC .LT. 0) THEN
NUMC = NDIG+2
ELSE
!
! This is a negative number smaller than -1.
!
NUMC = IDEC+NDIG+3
ENDIF
!
! Check for integer plot. A positive number
!
ELSEIF(IDEC .LT. 0) THEN
NUMC = NDIG+1
ELSE
!
! This is a positive number greater than 1.
!
NUMC = IDEC+NDIG+2
ENDIF
IF(IDEC .LT. 0) THEN
IF(FPN .LT. 0.) THEN
NUM = FPN-0.5
ELSE
NUM = FPN+0.5
ENDIF
WRITE(FMT,97) NUMC
WRITE(NUMSTR,FMT) NUM
97 FORMAT('(I',i1,')')
ELSE
!ipk mar95 fix bug that causes error when IDEC >12
if(idec .gt. 9) then
write(fmt1,99) numc,idec
99 format('(F',i2,'.',i2,')')
else
WRITE(FMT1,98) NUMC,IDEC
98 FORMAT('(F',i2,'.',i1,')')
endif
WRITE(NUMSTR,FMT1) FPN
ENDIF
RETURN
END
!ipk oct96 routines below added
SUBROUTINE GTCHARX(DATA,NDIG,XLC,YLC)
COMMON /RECOD/ IRECD,TSPC
CHARACTER*32 DATA
if(irecd .eq. 2) then
read(91,'(A32)') DATA
CALL INTRVL(TA,0)
70 CALL INTRVL(TA,1)
IF(TA .LT. TSPC) GO TO 70
return
endif
80 CONTINUE
DO 90 I=1,NDIG
DATA(I:I)=' '
90 END DO
!
I = 1
10 CONTINUE
I = I+1
call keybrd(key)
IF (KEY .EQ. 8) THEN
I = I-2
xp=XLC+(i+1)*0.20
call drblk(xp,YLC+0.23,0.20,0.30,-11)
GO TO 10
ENDIF
IF(KEY .EQ. 13 .OR. I .EQ. ndig+2) GO TO 200
if(key .eq. 1072 .or. key .eq. 1075 .or. key .eq. 1077 .or.&
& key .eq. 1080) go to 200
DATA(I-1:I-1)=CHAR(KEY)
xp=XLC+i*0.20
call drblk(xp,YLC+0.23,0.20,0.30,-11)
call rblue
call symbl(xp,YLC,0.20,data(i-1:i-1),0.0,1)
100 CONTINUE
GO TO 10
200 CONTINUE
NDIG=I-2
call rblue
RETURN
!ipk mar94 add
END
SUBROUTINE DRBLK(XS,YS,XL,YL,ICOL)
DIMENSION X(4),Y(4)
X(1)=XS
X(2)=XS
X(3)=XS+XL
X(4)=XS+XL
Y(1)=YS
Y(2)=YS-YL
Y(3)=Y(2)
Y(4)=YS
! WRITE(90,*) 'GOING TO POLYFL',X,Y,ICOL
CALL POLYFL(X,Y,4,ICOL)
call rblue
RETURN
END
SUBROUTINE GTFPNX(FPN,NDEC,NDIG,XLC,YLC)
CHARACTER*11 DATA
CHARACTER*30 MES
REAL HSIZE
COMMON /SSIZE/ HSIZE
DATA MES/'Error reading number, Reenter.'/
80 CONTINUE
DO 90 I=1,11
DATA(I:I)=' '
90 END DO
!
I = 1
NDEC=-2
10 CONTINUE
I = I+1
call keybrd(key)
! WRITE(90,*) 'BACK FROMKEYBRD',KEY,I
IF (KEY .EQ. 8) THEN
I = I-2
xp=xlc+(i+1)*0.20
call drblk(xp,ylc+0.23,0.20,0.30,13)
GO TO 10
ENDIF
IF(KEY .EQ. 46) THEN
NDEC=-1
ENDIF
IF(KEY .EQ. 13) GO TO 200
if(key .eq. 1072 .or. key .eq. 1075 .or. key .eq. 1077 .or.&
& key .eq. 1080) go to 200
IF(NDEC .GE. -1) NDEC=NDEC+1
DATA(I:I)=CHAR(KEY)
! WRITE(90,'(A)') ' GETTING CHAR',DATA(I:I)
xp=xlc+i*0.20
! WRITE(90,*) 'GOING TO DRBLK',XP,YLC
call drblk(xp,ylc+0.23,0.20,0.30,-11)
! WRITE(90,*) 'BACK FROM DRBLK'
call rblue
call symbl(xp,ylc,0.20,data(i:i),0.0,1)
100 CONTINUE
GO TO 10
200 CONTINUE
NDIG=I-2
READ(DATA,5000,ERR=300) FPN
5000 FORMAT(1X,F10.0)
call rblue
RETURN
300 CONTINUE
CALL SYMBL(3.0,1.73,0.20,MES,0.0,30)
GO TO 80
END
SUBROUTINE GTINTX(INUM,NDIG,XLC,YLC)
CHARACTER*11 DATA
CHARACTER*30 MES
DATA MES/'Error reading integer, Reenter'/
80 CONTINUE
DO 90 I=1,11
DATA(I:I)=' '
90 END DO
!
I = 1
10 CONTINUE
I = I+1
call keybrd(key)
IF (KEY .EQ. 8) THEN
I = I-2
xp=xlc+(i+1)*0.20
call drblk(xp,ylc+0.00,0.20,0.32,-11)
GO TO 10
ENDIF
IF(KEY .EQ. 13) GO TO 200
if(key .eq. 1072 .or. key .eq. 1075 .or. key .eq. 1077 .or.&
& key .eq. 1080) go to 200
DATA(I:I)=CHAR(KEY)
xp=xlc+i*0.20
call drblk(xp,ylc+0.00,0.20,0.32,-11)
call rblue
call symbl(xp,ylc-0.20,0.20,data(i:i),0.0,1)
100 CONTINUE
GO TO 10
200 CONTINUE
NDIG=I-2
READ(DATA,5000,ERR=300) INUM
5000 FORMAT(1X,I10)
call rblue
RETURN
300 CONTINUE
CALL SYMBL(3.0,1.73,0.20,MES,0.0,30)
GO TO 80
END
SUBROUTINE WRTBOX(IDELV)
dimension x(5),y(5)
CHARACTER*6 label
COMMON /SSIZE/ HSIZE
DATA label/'(e)lsw'/
!
! Draw box around selections with colour
!
Y(1)=7.5
Y(2)=7.5
Y(3)=7.995
Y(4)=7.995
Y(5)=7.5
X(1)=6.0*HSIZE/10.
X(2)=7.0*HSIZE/10.
X(3)=7.0*HSIZE/10.
X(4)=6.0*HSIZE/10.
X(5)=6.0*HSIZE/10.
IF(IDELV .EQ. 1) THEN
IBLK=12
ELSE
IBLK= 8
ENDIF
CALL POLYFL(X,Y,5,IBLK)
CALL RBLACK
CALL PLOTT(X(1),Y(1),3)
CALL PLOTT(X(2),Y(2),2)
CALL PLOTT(X(3),Y(3),2)
CALL PLOTT(X(4),Y(4),2)
CALL PLOTT(X(1),Y(1),2)
call symbl(6.02*hsize/10.,7.6,0.20,label,0.0,6)
RETURN
END
SUBROUTINE UNDOACT
USE BLK1MOD
! INCLUDE '!BLK1.COM'
! IF(NEUNDO .GT. 0) THEN
! DO N=1,NEUNDO
! J=IELDEL(N)
! CALL DELTEL(J)
! ENDDO
! ELSE
! RETURN
! ENDIF
IF(NPUNDO .GT. 0) THEN
DO N=1,NPUNDO
J=NODDEL(N)
if(j .gt. 0) CALL DELETN(J)
ENDDO
ENDIF
NPUNDO=0
NEUNDO=0
WRITE(90,*) 'NESAV,NEFSAV',NESAV,NEFSAV,NE,NENTRY
IF(NESAV .GT. 0) THEN
DO J=1,NESAV
DO K=1,8
NOP(J,K)=NOPSV(J,K)
ENDDO
NCN = 2
IF (NOP(J,3) .NE. 0) NCN = 3
IF (NOP(J,4) .NE. 0) NCN = 4
IF (NOP(J,5) .NE. 0 .AND. NOP(J,4) .NE. 0) NCN = 5
IF (NOP(J,5) .NE. 0 .AND. NOP(J,4) .EQ. 0) NCN = 6
IF (NOP(J,6) .NE. 0) NCN = 6
IF (NOP(J,7) .NE. 0) NCN = 8
NCORN(J) = NCN
IESKP(J) = 0
IMAT(J)=IMATSV(J)
ENDDO
NE=NESAV
ENDIF
NESAV=0
IF(NENTRY .GT. NEFSAV) THEN
IF(NEFSAV .GT. 0) THEN
DO N=1,NEFSAV
DO M=1,3
NEF(N,M)=NEFSV(N,M)
ENDDO
ENDDO
ENDIF
NENTRY=NEFSAV
ENDIF
NEFSAV=NENTRY
CALL PLOTOT(-1)
CALL HEDR
RETURN
END
SUBROUTINE GETXC
USE BLK1MOD
DO J=1,NE
XXC=0.
YYC=0.
IF(IMAT(J) .EQ. 0) GO TO 50
NCN = NCORN(J)
IF(NCN .EQ. 9) THEN
NCNR=8
ELSE
NCNR=NCN
ENDIF
DO 25 K=1,NCNR
N = NOP(J,K)
!
IF (N .EQ. 0) GO TO 25
IF (CORD(N,1) .LT. VDX) GOTO 25
! !
IF (NCN .NE. 5 .OR. K .LT. 5) THEN
IF (MOD(K,2) .EQ. 1) THEN
XXC = XXC + CORD(N,1)
YYC = YYC + CORD(N,2)
ENDIF
ENDIF
25 END DO
IF (NCN .EQ. 3 .OR. NCN .EQ. 5) NCN = 4
IF(NCN .LT. 9) THEN
XC(J) = 2.*XXC/NCN
YC(J) = 2.*YYC/NCN
ELSE
XC(J)= CORD(NOP(J,9),1)
YC(J)= CORD(NOP(J,9),2)
ENDIF
50 CONTINUE
ENDDO
RETURN
END
SUBROUTINE DELETEM
USE WINTERACTER
USE BLK1MOD
SAVE
! implicit none
include 'd.inc'
INCLUDE 'TXFRM.COM'
INCLUDE 'BFILES.I90'
CHARACTER*1 IFLAG
CHARACTER*24 MESSAG
INTEGER NTYPR,ITIMETHRU
DATA MESSAG/'GET ELEMENT TYPE NUMBER '/
!
! Declare window-type and message variables
!
TYPE(WIN_STYLE) :: WINDOW
TYPE(WIN_MESSAGE) :: MESSAGE
call wdialogload(IDD_GETINT)
ierr=infoerror(1)
CALL WDialogSelect(IDD_GETINT)
ierr=infoerror(1)
NFD=0
CALL WDialogPutString(IDF_STRING1,MESSAG)
CALL WDialogPutInteger(IDF_INTEGER1,NFD)
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,NFD)
GO TO 200
ENDIF
ENDDO
200 CONTINUE
IF(NFD .EQ. 0) RETURN
! ASK FOR ELEMENT NUMBER
! LOOP ON ELEMENTS DROPPING ELEMENTS OF GIVEN TYPE
DO N=1,NE
IF(IMAT(N) .EQ. NFD) THEN
DO K=1,8
NOP(N,K)=0
ENDDO
IMAT(N)=0
NCORN(N)=0
ENDIF
ENDDO
RETURN
END
!
!****************************************************************
!
subroutine proxel(x,y,npts,xx,yy,ipt,iflag,inskp,ibox,neac)
! x=array of x node locations
! y=array of y node location
! npts= max number of nodes
! xx=x screen lpcation
! yy=y screen location
! iflag=character flag
! inskp=array telling nodes to skip
! ibox=any box checked
save
CHARACTER*80 TITLE
CHARACTER*24 HLABL
CHARACTER*1 ALABL(10)
CHARACTER*40 MPDUM
COMMON /BLKA1/ TITLE,HLABL,ALABL &
& ,MPDUM
!ipk oct 95 lines defining MPDUM added
!
!ipk jan01 expand IPSW
COMMON /HEDS/ NP,NE,NHTP,NMESS,NBRR,IPSW(15),IRMAIN,ISCRN,icolon(12),IQSW(2),IRDISP,ntempin,igfgsw,igfgswb,ICRIN,IPW1,WIDEL,WIDSCL,itrianout
!
integer*2 inskp(*)
INTEGER neac(*)
!IPK MAY02
REAL*8 x(*),y(*)
character*1 iflag
!
! if(ibox .eq. 0) then
! nbx=2
! call boxr(nbx)
! endif
!
! Get location of cursor
!
10 call xyloc(xscrn,yscrn,iflag,ibox)
! write(90,*) 'ibox,xscrn,yscrn',ibox,xscrn,yscrn,irmain
! write(90,7893) iflag
7893 format(' iflag',a2)
! read(*,*) junk
if(irmain .eq. 1) return
if(ibox .eq. 10) then
iflag = 'q'
return
elseif(ibox .eq. 9) then
iflag = 'r'
! elseif(ibox .eq. 7) then
! iflag = 'a'
endif
!
!
if (iflag .eq. 'q') then
return
elseif(iflag .eq. 'r') then
return
elseif(iflag .ne. 'c') then
ibox=0
if(iflag .eq. 't') return
if(iflag .eq. 'l') return
if(iflag .eq. 'f') return
if(iflag .eq. 'e') return
if(iflag .eq. 'a') return
if(iflag .eq. 'j') return
if(iflag .eq. 'z') return
if(iflag .eq. 'n') return
if(iflag .eq. 'g') return
if(iflag .eq. 'h') return
!ipk oct96 add line below
if(iflag .eq. 'b') return
if(iflag .eq. 'U') return
!
if(iflag .eq. 'm') go to 12
!ipk jan98 write(*,*) char(7),char(7)
go to 10
endif
!
! Compare to coordinates
12 d = 1.E+20
do ii=1,8
i=neac(ii)
if(neac(ii) .eq. 0) cycle
!! write(*,*) 'i,npts',i,npts,inskp(i),x(i),y(i)
if(inskp(i) .ne. 0) cycle
dist = sqrt( (xscrn-x(i))**2 + (yscrn-y(i))**2)
if (dist .lt. d) then
d = dist
ipt = i
xx = x(i)
yy = y(i)
endif
enddo
return
!
!
END