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.

265 lines
8.0 KiB
Fortran

SUBROUTINE TRIANG
USE WINTERACTER
USE BLKMAP
USE BLK1MOD
! INCLUDE 'BLK1.COM'
DATA VOID10/-1.E10/,SPAC/0.0/
NELTS=0
NVERT=MAXPTS
NINTV=1
CALL TRIANOPT(NINTV,SPAC)
! FIRST WRITE EXISTING MAP TO SCRATCH
OPEN(99,FORM='BINARY',STATUS='SCRATCH')
CALL WRTMAP(99)
REWIND 99
DO N=1,NVERT
IF(MOD(N-1,NINTV) .EQ. 0) THEN
IMAP(N)=1
ELSE
IMAP(N)=0
ENDIF
ENDDO
IF(SPAC .GT. 0.) THEN
DO N=1,NVERT
IF(IMAP(N) .EQ. 1) THEN
IF(N .LT. NVERT) THEN
DO M=N+1,NVERT
DISQ=(XMAP(M)-XMAP(N))**2+(YMAP(M)-YMAP(N))**2
IF(DISQ .LT. SPAC**2) THEN
IMAP(M)=0
ENDIF
ENDDO
ENDIF
ENDIF
ENDDO
ENDIF
NN=0
DO N=1,NVERT
IF(IMAP(N) .GT. 0) THEN
NN=NN+1
XMAP(NN)=XMAP(N)
YMAP(NN)=YMAP(N)
IMAP(NN)=IMAP(N)
val(nn)=val(n)
ENDIF
ENDDO
NVERT=NN
! WRITE(185,*) 'NEW NVERT',NVERT
call WcursorShape(CurHourGlass)
CALL DELAUNAY(NVERT)
call WcursorShape(CurArrow)
RETURN
END
! Last change: IPK 2 Feb 2003 6:25 pm
SUBROUTINE DELAUNAY(NVERT)
USE BLKMAP
USE BLK1MOD
! INCLUDE 'BLK1.COM'
CHARACTER*80 LIND
CHARACTER*1 ANS
DATA VDX9/-9.E9/,NEDGE/0/
! Get location of supertriangle
iprt=0
ngap=0
YLV=7.5
call supert(XMAP,YMAP,NVERT)
NELTS=1
NVERTM=NVERT-3
IF(NVERT .GT. MAXP) THEN
DEALLOCATE (NKEY)
ALLOCATE (NKEY(NVERT))
NKEY=0
ENDIF
! Sort points into ascending x order
CALL SORTDB(XMAP,NKEY,NVERTM)
! Loop on the vertices
DO NN=1,NVERT-3
! IF(MOD(NN,5) .EQ. 0) WRITE(185,*) 'LOOP',NN
if(mod(NN,2500) .eq. 0) then
WRITE(90,*) NN,' points processed'
ylv=ylv-0.3
if(ylv .lt. 0.1) then
ylv=7.9
call clscrn
endif
write(lind,6010) NN
6010 format(i8,' points processed')
call symbl &
& (1.1,ylv,0.20,LIND,0.0,80)
endif
! process next point
N=NKEY(NN)
! Skip out if inactive point
IF(N .EQ. 0) GO TO 500
IF(IMAP(N) .EQ. 0) GO TO 500
IF(XMAP(N) .LT. VDX9) GO TO 500
IF(VAL(N) .LT. -9000.) GO TO 500
! IF(NN .GT. 1700. .AND. MOD(NN,5) .EQ. 0) WRITE(185,*) 'N',N,IMAP(N),XMAP(N),VAL(N)
! WRITE(45,*) NN,N,NVERT,XMAP(N),YMAP(N)
IF(NN .LT. NVERTM) THEN
DO KK=NN+1,NVERTM
K=NKEY(KK)
! IF(NN .GT. 1700) WRITE(185,*) 'NKEY',K,KK
IF(K .NE. 0) THEN
IF(XMAP(N) .EQ. XMAP(K)) THEN
IF(YMAP(N) .EQ. YMAP(K)) THEN
WRITE(45,*) 'IDENT',N,K
NKEY(KK)=0
ENDIF
ELSE
GO TO 200
ENDIF
ENDIF
200 CONTINUE
ENDDO
ENDIF
! Set edge buffers to zero
! IF(NN .GT. 1700 .AND. MOD(NN,5) .EQ. 0) WRITE(185,*) 'AFTER 200 NEDGE',NEDGE
IF(NEDGE .GT. 0) THEN
DO J=1,NEDGE
IEDGE(J,1)=0
IEDGE(J,2)=0
END DO
ELSE
DO J=1,100
IEDGE(J,1)=0
IEDGE(J,2)=0
END DO
ENDIF
NEDGE=0
! test for point in circumcircle
DO J=1,NELTS
CALL INSIDCIRC(XMAP,YMAP,J,N,ISWT)
! If inside process edges
IF(ISWT .EQ. 1) THEN
CALL PROCESS(J,NEDGE,NGAP)
ENDIF
END DO
! Setup to form new triangles
CALL SETEDG(NEDGE)
! Now form triangles as needed
DO J=1,NEDGE
IF(IEDGE(J,1) .NE. 0) THEN
CALL FORMT(XMAP,YMAP,J,N,NGAP,KK,WD)
ENDIF
END DO
NEDGE=0
if(iprt .eq. 0) go to 500
DO J=1,NELTS
IF(NOPEL(J,1) .GT. 0) THEN
WRITE(3,'(2i5,2i10,19x,''1'')') J,(NOPEL(J,K),K=1,3)
ENDIF
END DO
IF(NN .EQ. 1) THEN
write(41,'('' 9999'')')
do j=1,nvert
write(41,'(i10,2f20.4,F10.3)') j,XMAP(j),YMAP(j),VAL(J)
enddo
write(41,'('' 9999'')')
write(41,'('' 9999'')')
write(41,'('' 0 NENTRY'')')
write(41,'('' 0 NCLM'')')
WRITE(41,'(''ENDDATA'')')
ENDIF
500 continue
END DO
! Get rid of elements from super point
CALL RIDPOINT(NVERT)
RETURN
END SUBROUTINE
SUBROUTINE TRIANOPT(NINTV,SPAC)
USE WINTERACTER
include 'd.inc'
!
! Declare window-type and message variables
!
TYPE(WIN_STYLE) :: WINDOW
TYPE(WIN_MESSAGE) :: MESSAGE
INTEGER :: NINTV
INTEGER :: IERR
REAL :: SPAC
CHARACTER*1 :: IFLAG
call wdialogload(IDD_TRIAN)
ierr=infoerror(1)
CALL WDialogSelect(IDD_TRIAN)
ierr=infoerror(1)
CALL WDialogPutInteger(IDF_INTEGER1,NINTV)
CALL WDialogPutReal(IDF_REAL1,SPAC)
CALL WDialogShow(-1,-1,0,Modal)
ierr=infoerror(1)
do
!
IF (WInfoDialog(ExitButton) .EQ. IDOK) THEN
CALL WDialogGetINTEGER(IDF_INTEGER1,NINTV)
IF(NINTV .EQ. 0) NINTV=1
CALL WDialogGetREAL(IDF_REAL1,SPAC)
ELSE
SPAC=0.0
NINTV=1
ENDIF
RETURN
enddo
RETURN
END