You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
5.3 KiB
173 lines
5.3 KiB
2 years ago
|
C Copyright(C) 1999-2020 National Technology & Engineering Solutions
|
||
|
C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
|
||
|
C NTESS, the U.S. Government retains certain rights in this software.
|
||
|
C
|
||
|
C See packages/seacas/LICENSE for details
|
||
|
|
||
|
C=======================================================================
|
||
|
SUBROUTINE GEOM2D (LENF, NLNKF, LINKF, IF2EL,
|
||
|
& LENL, LINSET, IEBSET, LINDEF, NREF, LREF)
|
||
|
C=======================================================================
|
||
|
|
||
|
C --*** GEOM2D *** (MESH) Group lines connecting nodes
|
||
|
C -- Modified by John H. Glick - 10/25/88
|
||
|
C -- Written by Amy Gilkey - revised 03/29/88
|
||
|
C -- D. P. Flanagan, 07/02/82
|
||
|
C --
|
||
|
C --GEOM2D groups the lines connecting nodes. Each unique line in the
|
||
|
C --mesh is defined by searching through the connectivity.
|
||
|
C --The line set is then sorted into the following parts:
|
||
|
C -- -1) Mesh boundary
|
||
|
C -- 0) Element block boundary
|
||
|
C -- n) Interior within Element block 'n'
|
||
|
C --
|
||
|
C --Parameters:
|
||
|
C -- LENF - IN - the cumulative face counts by element block
|
||
|
C -- NLNKF - IN - the number of nodes per face
|
||
|
C -- LINKF - IN - the connectivity for all faces
|
||
|
C -- IF2EL - IN - the element number of each face
|
||
|
C -- LENL - OUT - the cumulative line counts by element block
|
||
|
C -- LINSET - OUT - the sorted line set
|
||
|
C -- IEBSET - SCRATCH - the element block for LINSET;
|
||
|
C -- size = maximum number of lines
|
||
|
C -- LINDEF - SCRATCH - the non-boundary line set;
|
||
|
C -- size = (1+LLNSET) * maximum number of lines
|
||
|
C -- NREF - SCRATCH - the number of references to a node in the line set;
|
||
|
C -- size = NUMNPF
|
||
|
C -- LREF - SCRATCH - the last line set index of a node in the line set;
|
||
|
C -- size = NUMNPF
|
||
|
C --
|
||
|
C --Common Variables:
|
||
|
C -- Uses NELBLK of /DBNUMS/
|
||
|
C -- Uses NUMNPF, LLNSET of /D3NUMS/
|
||
|
|
||
|
common /debugc/ cdebug
|
||
|
common /debugn/ idebug
|
||
|
character*8 cdebug
|
||
|
|
||
|
include 'dbnums.blk'
|
||
|
COMMON /D3NUMS/ IS3DIM, NNPSUR, NUMNPF, LLNSET
|
||
|
LOGICAL IS3DIM
|
||
|
|
||
|
INTEGER LENF(0:NELBLK)
|
||
|
INTEGER NLNKF(NELBLK)
|
||
|
INTEGER LINKF(*)
|
||
|
INTEGER IF2EL(*)
|
||
|
INTEGER LENL(-2:NELBLK), LINSET(LLNSET,*)
|
||
|
INTEGER IEBSET(*)
|
||
|
INTEGER LINDEF(0:LLNSET,*)
|
||
|
INTEGER NREF(NUMNPF), LREF(NUMNPF)
|
||
|
|
||
|
C --Define line set
|
||
|
|
||
|
DO 100 IELB = -2, NELBLK
|
||
|
LENL(IELB) = 0
|
||
|
100 CONTINUE
|
||
|
|
||
|
CALL INIINT (NUMNPF, 0, NREF)
|
||
|
CALL INIINT (NUMNPF, 0, LREF)
|
||
|
|
||
|
NHEAP = 0
|
||
|
NSTACK = 0
|
||
|
|
||
|
DO 150 IELB = 1, NELBLK
|
||
|
|
||
|
IXL0 = IDBLNK (IELB, 0, LENF, NLNKF) - 1
|
||
|
NNPF = NLNKF(IELB)
|
||
|
IF (NNPF .EQ. 9)NNPF = 8
|
||
|
DO 140 IFAC = LENF(IELB-1)+1, LENF(IELB)
|
||
|
|
||
|
C --Extract element lines and element block type
|
||
|
|
||
|
NOLD = NHEAP
|
||
|
N2 = LINKF(IXL0+NNPF)
|
||
|
LREFN2 = LREF(N2)
|
||
|
LSTREF = LREFN2
|
||
|
|
||
|
DO 130 ILINK = 1, NNPF
|
||
|
N1 = N2
|
||
|
N2 = LINKF(IXL0+ILINK)
|
||
|
LREFN1 = LREFN2
|
||
|
IF (ILINK .LT. NNPF) THEN
|
||
|
LREFN2 = LREF(N2)
|
||
|
ELSE
|
||
|
LREFN2 = LSTREF
|
||
|
END IF
|
||
|
|
||
|
C --Determine if line already exists in line set
|
||
|
|
||
|
DO 110 IL = MIN (LREFN1, LREFN2, NOLD), 1, -1
|
||
|
IF (LINSET(1,IL) .EQ. N2) THEN
|
||
|
IF (LINSET(2,IL) .EQ. N1) GOTO 120
|
||
|
END IF
|
||
|
110 CONTINUE
|
||
|
120 CONTINUE
|
||
|
|
||
|
IF (IL .GT. 0) THEN
|
||
|
IELB1 = IEBSET(IL)
|
||
|
|
||
|
C --Delete line from boundary set
|
||
|
|
||
|
IEBSET(IL) = IEBSET(NHEAP)
|
||
|
LINSET(1,IL) = LINSET(1,NHEAP)
|
||
|
LINSET(2,IL) = LINSET(2,NHEAP)
|
||
|
NREF(N1) = NREF(N1) - 1
|
||
|
NREF(N2) = NREF(N2) - 1
|
||
|
IF (NREF(N1) .LE. 0) LREF(N1) = 0
|
||
|
IF (NREF(N2) .LE. 0) LREF(N2) = 0
|
||
|
NHEAP = NHEAP - 1
|
||
|
IF (NOLD .GT. NHEAP) NOLD = NHEAP
|
||
|
|
||
|
C --Add line to element block boundary or interior set
|
||
|
|
||
|
IF (IELB .EQ. IELB1) THEN
|
||
|
C --Move line to interior set
|
||
|
CONTINUE
|
||
|
ELSE
|
||
|
C --Move line to element block boundary set
|
||
|
IELB1 = 0
|
||
|
END IF
|
||
|
|
||
|
NSTACK = NSTACK + 1
|
||
|
LINDEF(0,NSTACK) = IELB1
|
||
|
LINDEF(1,NSTACK) = N2
|
||
|
LINDEF(2,NSTACK) = N1
|
||
|
LENL(IELB1) = LENL(IELB1) + 1
|
||
|
|
||
|
ELSE
|
||
|
|
||
|
C --Add line to boundary set
|
||
|
|
||
|
NHEAP = NHEAP + 1
|
||
|
IEBSET(NHEAP) = IELB
|
||
|
LINSET(1,NHEAP) = N1
|
||
|
LINSET(2,NHEAP) = N2
|
||
|
NREF(N1) = NREF(N1) + 1
|
||
|
NREF(N2) = NREF(N2) + 1
|
||
|
LREF(N1) = NHEAP
|
||
|
LREF(N2) = NHEAP
|
||
|
END IF
|
||
|
130 CONTINUE
|
||
|
|
||
|
IXL0 = IXL0 + NLNKF(IELB)
|
||
|
140 CONTINUE
|
||
|
150 CONTINUE
|
||
|
|
||
|
C --Sort element block boundary and interior line sets
|
||
|
|
||
|
LENL(-1) = NHEAP
|
||
|
DO 160 IELB = 0, NELBLK
|
||
|
L = LENL(IELB)
|
||
|
LENL(IELB) = NHEAP
|
||
|
NHEAP = NHEAP + L
|
||
|
160 CONTINUE
|
||
|
DO 170 I = 1, NSTACK
|
||
|
IELB = LINDEF(0,I)
|
||
|
NHEAP = LENL(IELB) + 1
|
||
|
LENL(IELB) = NHEAP
|
||
|
CALL CPYINT (2, LINDEF(1,I), LINSET(1,NHEAP))
|
||
|
170 CONTINUE
|
||
|
|
||
|
RETURN
|
||
|
END
|