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.
 
 
 
 
 
 

96 lines
3.4 KiB

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 ELECOR (NDIM, NELBLK, LEN, NLNK, LINK,
& XN, YN, ZN, XE, YE, ZE)
C=======================================================================
C --*** ELECOR *** (BLOT) Calculate element centers
C -- Written by Amy Gilkey, revised 10/23/87
C --
C --ELECOR calculates the element centers from the nodal coordinates.
C --
C --Parameters:
C -- NDIM - IN - the number of dimensions
C -- NELBLK - IN - the number of element blocks
C -- LEN - IN - the cumulative element counts by element block
C -- NLNK - IN - the number of nodes per element
C -- LINK - IN - the connectivity array; connectivity all zero if
C -- element is undefined
C -- XN, YN, ZN - IN - the nodal coordinates
C -- XE, YE, ZE - OUT - the element center coordinates
INTEGER LEN(0:*), LINK(*)
INTEGER NLNK(*)
REAL XN(*), YN(*), ZN(*)
REAL XE(*), YE(*), ZE(*)
DO 170 IELB = 1, NELBLK
IF (NLNK(IELB) .LE. 0) GOTO 170
DIVLNK = 1.0 / NLNK(IELB)
IXL0 = IDBLNK (IELB, 0, LEN, NLNK) - 1
IF (NDIM .EQ. 2) THEN
IF (NLNK(IELB) .NE. 8) THEN
DO 110 IEL = LEN(IELB-1)+1, LEN(IELB)
X0 = 0.0
Y0 = 0.0
IF (LINK(IXL0+1) .NE. 0) THEN
DO 100 I = 1, NLNK(IELB)
X0 = X0 + XN(LINK(IXL0+I))
Y0 = Y0 + YN(LINK(IXL0+I))
100 CONTINUE
END IF
XE(IEL) = X0 * DIVLNK
YE(IEL) = Y0 * DIVLNK
IXL0 = IXL0 + NLNK(IELB)
110 CONTINUE
ELSE IF (NLNK(IELB) .EQ. 8) THEN
C --Note that 8-node elements are numbered with corners at 1-3-5-7
DO 140 IEL = LEN(IELB-1)+1, LEN(IELB)
X0 = 0.0
Y0 = 0.0
IF (LINK(IXL0+1) .NE. 0) THEN
DO 120 I = 1, NLNK(IELB), 2
X0 = X0 - 0.25 * XN(LINK(IXL0+I))
Y0 = Y0 - 0.25 * YN(LINK(IXL0+I))
120 CONTINUE
DO 130 I = 2, NLNK(IELB), 2
X0 = X0 + 0.5 * XN(LINK(IXL0+I))
Y0 = Y0 + 0.5 * YN(LINK(IXL0+I))
130 CONTINUE
END IF
XE(IEL) = X0
YE(IEL) = Y0
IXL0 = IXL0 + NLNK(IELB)
140 CONTINUE
END IF
ELSE IF (NDIM .EQ. 3) THEN
DO 160 IEL = LEN(IELB-1)+1, LEN(IELB)
X0 = 0.0
Y0 = 0.0
Z0 = 0.0
IF (LINK(IXL0+1) .NE. 0) THEN
DO 150 I = 1, NLNK(IELB)
X0 = X0 + XN(LINK(IXL0+I))
Y0 = Y0 + YN(LINK(IXL0+I))
Z0 = Z0 + ZN(LINK(IXL0+I))
150 CONTINUE
END IF
XE(IEL) = X0 * DIVLNK
YE(IEL) = Y0 * DIVLNK
ZE(IEL) = Z0 * DIVLNK
IXL0 = IXL0 + NLNK(IELB)
160 CONTINUE
END IF
170 CONTINUE
RETURN
END