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.

497 lines
15 KiB
Fortran

! Last change: IPK 2 Mar 1999 12:58 pm
!IPK NEW ROUTINE OCT 23 1996
SUBROUTINE CCLINE(ISW)
!
! Generate continuity lines
!
USE BLK1MOD
USE BLK2MOD
! INCLUDE 'BLK1.COM'
! INCLUDE 'BLK2.COM'
CHARACTER*1 IFLAG
DIMENSION XLIN(350),YLIN(350),INODE1(350)
! DIMENSION ICN(MAXP)
LOGICAL :: OPENED
DO J=1,MAXP
ICN(J)=0
ENDDO
IF(ISW .EQ. 1) THEN
call opencln(ipos)
if(ipos .eq. 0) return
ELSE
ipos=2
ENDIF
!
! First sort out the potential midsides
! Note that transition elements caues a problem
! Find these first
DO 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
!
! 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 M=1,NCN,MST
ICN(NOP(N,M))=2
ENDDO
ENDIF
ENDDO
!
! Get connections
!
CALL NTONCON(ipos)
100 CONTINUE
NHTP=0
NMESS=26
NBRR=8
NTRACT=0
CALL HEDR
NCLL=0
!
! Get first point
!
110 CONTINUE
K=1
CALL PROX(CORD(1,1),CORD(1,2),NP,XX,YY,INODE1(1),IFLAG,INSKP,IBOX)
if(inode1(1) .eq. 0) go to 110
IF(IRMAIN .EQ. 1) THEN
NTRACT=0
RETURN
ENDIF
IF(IFLAG .EQ. 'q') THEN
NTRACT=0
GO TO 500
ENDIF
!IPK JAN01
IF(IBOX .EQ. 7 .OR. IFLAG .EQ. 'n' .or. &
IBOX .EQ. 5 .OR. IFLAG .EQ. 'd') THEN
ipos=ncll+1
CALL GETCLN(ipos)
!IPK JAN02
IF(ISW .EQ. 1) THEN
IF(IPOS .EQ. 0) THEN
DO NCLL=1,140
DO KK=1,350
ICCLN(NCLL,KK)=0
ENDDO
ENDDO
NCLM=0
ELSE
ncll=ipos
DO KK=1,350
ICCLN(NCLL,KK)=0
ENDDO
IF(NCLM .EQ. NCLL) NCLM=NCLM-1
ENDIF
GO TO 100
ENDIF
ENDIF
IF(ICN(INODE1(1)) .NE. 2) THEN
NMESS=28
CALL HEDR
GO TO 110
ENDIF
NBRR=5
NMESS=27
CALL HEDR
fpn=inode1(1)
CALL NUMBR(0.5,7.2,0.2,FPN,0.0,-1)
call pltnod(inode1(1),0)
!
! Get second point
!
150 CONTINUE
K=K+1
160 CALL PROX(CORD(1,1),CORD(1,2),NP,XX,YY,INODE1(K),IFLAG,INSKP,IBOX)
IF(IRMAIN .EQ. 1) THEN
NTRACT=0
RETURN
ENDIF
IF(IFLAG .EQ. 'q') THEN
NTRACT=0
GO TO 500
ENDIF
NMESS=26
CALL HEDR
IF(IBOX .EQ. 6 .OR. IFLAG .EQ. 'b' ) THEN
K=K-2
GO TO 150
ELSEIF(IBOX .EQ. 7 .OR. IFLAG .EQ. 'n') THEN
KL=K-2
IF(ISW .EQ. 1) THEN
!IPK Get continuity line number
ipos=ncll+1
CALL GETCLN(ipos)
ncll=ipos
IF(NCLL .EQ. 0) GO TO 500
ENDIF
!
! Trace along line
!
NTRACT=1
IF(KL .GT. 0) THEN
DO LS=1,KL
CALL TRACE(INODE1(LS),INODE1(LS+1))
ENDDO
ELSE
NTRACT=1
ITRAC(1)=INODE1(1)
ENDIF
!
! Output line to file
!
! WRITE(90,6000) (ITRAC(KK),KK=1,NTRAC)
!ipk jan01
INQUIRE(98, OPENED=OPENED)
if(opened) then
IF(IPOS .EQ. 1) THEN
DO KK=1,NTRACT
WRITE(98,6001) ITRAC(KK),XUSR(ITRAC(KK)),YUSR(ITRAC(KK))
6001 FORMAT('NODE',I7,2F15.3)
ENDDO
ELSE
WRITE(98,6000) NCLL,(ITRAC(KK),KK=1,NTRACT)
ENDIF
endif
!IPK JAN01
6000 FORMAT('CC1',I5,9I8/('CC2',5X,9I8))
DO KK=1,NTRACT
XLIN(KK)=CORD(ITRAC(KK),1)
YLIN(KK)=CORD(ITRAC(KK),2)
ENDDO
!ipk jan01
! Save to an array by line number
!
IF(ISW .EQ. 1) THEN
DO KK=1,NTRACT
ICCLN(NCLL,KK)=ITRAC(KK)
ENDDO
IF(NCLL .GT. NCLM) NCLM=NCLL
ENDIF
CALL RRED
!ipk jan01
CALL THICKL
CALL DASHLN(XLIN,YLIN,NTRACT,0)
!ipk jan01
CALL THINL
!
! Go to get another line
!
IF(ISW .EQ. 2) RETURN
GO TO 100
ELSE
IF(ICN(INODE1(K)) .NE. 2) THEN
NMESS=27
CALL HEDR
GO TO 160
ENDIF
KL=K-1
!
! Trace along line
!
call pltnod(inode1(1),0)
NTRACT=1
DO LS=1,KL
CALL TRACE(INODE1(LS),INODE1(LS+1))
call pltnod(inode1(ls+1),0)
ENDDO
if(ntracT .gt. 0) then
DO KK=1,NTRACT
if(itrac(kk) .eq. 0) go to 300
XLIN(KK)=CORD(ITRAC(KK),1)
YLIN(KK)=CORD(ITRAC(KK),2)
ENDDO
CALL RRED
!ipk jan01
CALL THICKL
CALL DASHLN(XLIN,YLIN,NTRACT,0)
!ipk jan01
CALL THINL
endif
300 CONTINUE
fpn=inode1(KL+1)
CALL NUMBR(0.5+KL*0.5,7.2,0.2,FPN,0.0,-1)
!
! Get another point
!
GO TO 150
ENDIF
!
! Exit
!
500 CONTINUE
END
SUBROUTINE NTONCON(ipos)
!
! Generate Connections
!
USE BLK1MOD
USE BLK2MOD
! INCLUDE 'BLK1.COM'
! INCLUDE 'BLK2.COM'
!
! Initialize to zero
!
NCM=MAXECON
DO N=1,NP
DO L=1,NCM
NECON(N,L)=0
ENDDO
ENDDO
!
! Loop on elements
!
DO N=1,NE
!
! Check to see that this element is active
!
IF(IMAT(N) .NE. 0) THEN
NCN=NCORN(N)
!
! Search to see if connection M and K made
!
! DO M=1,NCN,2
DO M=1,NCN,ipos
! IF(M .GT. NCN-1) GO TO 200
! K=M+2
K=M+ipos
IF(K .GT. NCN) K=1
DO L=1,NCM
IF(NECON(NOP(N,M),L) .EQ. 0) THEN
!
! This is new connection
!
NECON(NOP(N,M),L)=NOP(N,K)
GO TO 150
ELSEIF(NECON(NOP(N,M),L) .EQ. NOP(N,K)) THEN
!
! This is an old connection
!
GO TO 150
ENDIF
ENDDO
150 CONTINUE
!
! Now look in the revers direction
!
DO L=1,NCM
IF(NECON(NOP(N,K),L) .EQ. 0) THEN
NECON(NOP(N,K),L)=NOP(N,M)
!
! This is new connection
!
GO TO 175
ELSEIF(NECON(NOP(N,K),L) .EQ. NOP(N,M)) THEN
!
! This is an old connection
!
GO TO 175
ENDIF
ENDDO
175 CONTINUE
ENDDO
ENDIF
200 CONTINUE
ENDDO
!
RETURN
END
SUBROUTINE TRACE(INODE1,INODE2)
!
! Generate continuity lines
!
USE BLK1MOD
USE BLK2MOD
! INCLUDE 'BLK1.COM'
! INCLUDE 'BLK2.COM'
DIST(N,M)=(cord(n,1)-cord(m,1))**2+(cord(n,2)-cord(m,2))**2
!
! Start at INODE1
!
ITRAC(NTRACT)=INODE1
LAT=INODE1
100 CONTINUE
!
! Look for new nearer node to INODE2
!
CURR=1.E30
LAT1=0
DO K=1,NCM
LATTMP=NECON(LAT,K)
IF(LATTMP .NE. 0) THEN
IF(DIST(INODE2,LATTMP) .LT. CURR) THEN
LAT1=LATTMP
CURR=DIST(INODE2,LATTMP)
ENDIF
ELSE
GO TO 150
ENDIF
ENDDO
150 CONTINUE
IF(LAT1 .EQ. 0) RETURN
NTRACT=NTRACT+1
ITRAC(NTRACT)=LAT1
IF(LAT1 .EQ. INODE2) RETURN
IF(NTRACT .GT. 350) RETURN
LAT=LAT1
GO TO 100
END
subroutine opencln(ipos)
use winteracter
implicit none
include 'd.inc'
CHARACTER(LEN=255) :: FNAME
CHARACTER(LEN=3) :: SUB
LOGICAL :: OPENED
INTEGER :: IPOS,IERR
!
! Declare window-type and message variables
!
TYPE(WIN_STYLE) :: WINDOW
TYPE(WIN_MESSAGE) :: MESSAGE
INQUIRE(98, OPENED=OPENED)
if(.not. opened) then
CALL WSelectFile(ID_STRING8,SaveDialog+PromptOn,FNAME,'Save continuity line')
IF (WInfoDialog(ExitButtonCommon).EQ.CommonOpen) THEN
SUB='cln'
CALL ADDSUB(FNAME,SUB)
open(98,file=fname, form='formatted', status='unknown')
ENDIF
endif
call wdialogload(IDD_DIALOG08)
ierr=infoerror(1)
call wdialogputRadioButton(idf_radio1)
CALL WDialogSelect(IDD_DIALOG08)
ierr=infoerror(1)
CALL WDialogShow(-1,-1,0,Modal)
ierr=infoerror(1)
do
IF (WInfoDialog(ExitButton) .EQ. IDOK) THEN
call wdialoggetradiobutton(idf_radio1,ipos)
ipos=3-ipos
return
endif
ipos= 0
RETURN
enddo
ipos= 2
RETURN
END
!ipk jan01
subroutine getcln(ipos)
use winteracter
implicit none
include 'd.inc'
INTEGER :: IPOS,IERR
!
! Declare window-type and message variables
!
TYPE(WIN_STYLE) :: WINDOW
TYPE(WIN_MESSAGE) :: MESSAGE
call wdialogload(IDD_DIALOG010)
ierr=infoerror(1)
CALL WDialogSelect(IDD_DIALOG010)
ierr=infoerror(1)
CALL WDialogPutINTEGER(IDF_INTEGER1,IPOS)
write(90,*) 'iposin',ipos
CALL WDialogShow(-1,-1,0,Modal)
ierr=infoerror(1)
do
IF (WInfoDialog(ExitButton) .EQ. IDOK) THEN
CALL WDialogGetINTEGER(IDF_INTEGER1,IPOS)
write(90,*) 'iposout',ipos
return
endif
return
enddo
RETURN
END
SUBROUTINE CHKLIN
!
! Generate continuity lines
!
USE BLK1MOD
USE BLK2MOD
! INCLUDE 'BLK1.COM'
! INCLUDE 'BLK2.COM'
IPOS=2
CALL NTONCON(ipos)
DO I=1,NCLM
NTRACT=1
ITRAC(1)=ICCLN(I,1)
DO J=1,350
INODE1=ICCLN(I,J)
INODE2=ICCLN(I,J+1)
IF(INODE2 .EQ. 0) GO TO 300
CALL TRACE(INODE1,INODE2)
ENDDO
300 DO J=1,NTRACT
ICCLN(I,J)=ITRAC(J)
ENDDO
ENDDO
RETURN
END