Cloned SEACAS for EXODUS library with extra build files for internal package management.
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

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