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.

101 lines
3.1 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 ZLNK (NELB, IDELB, NUMELB, NUMLNK, LINK, NEWLNK,
$ NUMATR, ATRIB, NUMEL, MAP, MAPNOD, BLKTYP)
C=======================================================================
C --*** *** (GREPOS)
C -- Written by Greg Sjaardema - revised 03/02/90
C --
C --Parameters:
C -- NELB - IN - the number of element blocks
C -- IDELB - IN - the element block IDs for each block
C -- NUMELB - IN - the number of elements in each block
C -- NUMLNK - IN - the number of nodes per element in each block
C -- LINK - IN - the connectivity for each block
C -- NEWLNK - OUT - the new connectivity for each block
C -- MAP - OUT - list of active nodes
C -- map(i) > 0 for active node
C -- map(i) = length of map()+1 for deleted node
include 'gp_params.blk'
INTEGER IDELB(NELB)
INTEGER NUMELB(NELB)
INTEGER NUMLNK(NELB)
INTEGER LINK(*), NEWLNK(*)
INTEGER NUMATR(NELB)
REAL ATRIB(*)
INTEGER MAP(NUMEL), MAPNOD(*)
CHARACTER*(MXSTLN) BLKTYP(*)
CALL INIINT (NUMEL, 0, MAP)
IOFF = 0
IOFFA = 0
IELNK = 0
IEATR = 0
IEELE = 0
DO 40 IELB = 1, NELB
ISLNK = IELNK + 1
IELNK = IELNK + NUMLNK(IELB) * NUMELB(IELB)
ISATR = IEATR + 1
IEATR = IEATR + NUMATR(IELB) * NUMELB(IELB)
ISELE = IEELE + 1
IEELE = IEELE + NUMELB(IELB)
IF (IDELB(IELB) .EQ. 0) THEN
C -- deleted element block
IOFF = IOFF + NUMLNK(IELB) * NUMELB(IELB)
IOFFA = IOFFA + NUMATR(IELB) * NUMELB(IELB)
ELSE
C?? IF (IOFF .NE. 0) THEN
DO 10 I = ISLNK, IELNK
NEWLNK(I-IOFF) = MAPNOD(LINK(I))
10 CONTINUE
C?? END IF
IF (IOFFA .NE. 0) THEN
DO 20 I = ISATR, IEATR
ATRIB(I-IOFFA) = ATRIB(I)
20 CONTINUE
END IF
DO 30 I = ISELE, IEELE
MAP(I) = 1
30 CONTINUE
END IF
40 CONTINUE
C .. Set up map of old number to new number. If old id = I, then
C new id = MAP(I)
NEWID = 0
DO 50 IEL = 1, NUMEL
IF (MAP(IEL) .GT. 0) THEN
NEWID = NEWID + 1
MAP(IEL) = NEWID
ELSE
MAP(IEL) = NUMEL+1
END IF
50 CONTINUE
NUMEL = NEWID
C .. Update element block counter arrays
IAELB = 0
DO 60 IELB = 1, NELB
IF (IDELB(IELB) .NE. 0) THEN
IAELB = IAELB + 1
IDELB(IAELB) = IDELB(IELB)
NUMELB(IAELB) = NUMELB(IELB)
NUMLNK(IAELB) = NUMLNK(IELB)
NUMATR(IAELB) = NUMATR(IELB)
BLKTYP(IAELB) = BLKTYP(IELB)
END IF
60 CONTINUE
NELB = IAELB
RETURN
END