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.
186 lines
6.1 KiB
186 lines
6.1 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=======================================================================
|
|
*DECK, ELGRAD
|
|
SUBROUTINE ELGRAD(CNTRA,XA,YA,ZA,SOLEA,SOLGRA,ICHKEL,IDBLK,
|
|
& ICONA,INVLN,INVCN,MAXLN,ISTP,ITT,iblk)
|
|
|
|
C *********************************************************************
|
|
|
|
C Subroutine ELGRAD computes the coefficients of the gradient for
|
|
C each variable within an element based on a constrained (to the
|
|
C value of that element at its centroid) least squares fit to the
|
|
C values in the surrounding elements. If not enough data is available
|
|
C to perform the least squares is a direction, that coefficient is set
|
|
C to zero.
|
|
|
|
C Calls subroutines CNTR, VOL, FLGRAD, ERROR
|
|
|
|
C Called by MAPVAR
|
|
|
|
C *********************************************************************
|
|
|
|
C CNTRA a list of element centroid coordinates for all elements
|
|
C in the current element block (1:numeba,1:ndima)
|
|
C XA,YA,ZA nodal coordinates
|
|
C SOLEA element variables (1:numeba,1:nvarel)
|
|
C SOLGRA element variable gradient (1:ndima,1:numeba,1:nvarel)
|
|
C ICHKEL check if element already in IELLST
|
|
C IDBLK current element block I.D.
|
|
C ICONA connectivity (1:nelnda,1:numeba)
|
|
C INVLN number of elements per node (1:numnda)
|
|
C INVCN inverse connectivity (1:maxln,1:numnda)
|
|
C MAXLN maximum number of elements connected to any node
|
|
C ISTP time step being processed
|
|
C IELLST local list of elements that share a node with element
|
|
C currently being processed (1:100)
|
|
C SHLNRM vector normal to current shell element (1:3)
|
|
C ITT truth table
|
|
C iblk element block being processed (not ID)
|
|
|
|
C *********************************************************************
|
|
|
|
include 'aexds1.blk'
|
|
include 'aexds2.blk'
|
|
include 'amesh.blk'
|
|
include 'ebbyeb.blk'
|
|
include 'ex2tp.blk'
|
|
include 'tapes.blk'
|
|
|
|
DIMENSION CNTRA(NUMEBA,*), SOLEA(NUMEBA,*)
|
|
DIMENSION SOLGRA(NDIMA,NUMEBA,*), ICHKEL(*)
|
|
DIMENSION XX(27), YY(27), ZZ(27), IELLST(100), SHLNRM(3)
|
|
DIMENSION XA(*), YA(*), ZA(*), ICONA(NELNDA,*)
|
|
DIMENSION INVCN(MAXLN,*),INVLN(*), ITT(NVAREL,*)
|
|
|
|
C *********************************************************************
|
|
|
|
IF (ITYPE .EQ. 4 .OR. ITYPE .EQ. 5)THEN
|
|
CALL ERROR('ELGRAD','ELEMENT TYPE',' ',ITYPE,
|
|
& 'ELEMENT VARIABLE PROCESSING NOT YET IMPLEMENTED',
|
|
& 0,' ',' ',1)
|
|
END IF
|
|
|
|
C initialize ICHKEL array - only needs to be done once because
|
|
C checkmark used is specific to each element
|
|
|
|
DO 10 I = 1, NUMEBA
|
|
ICHKEL(I) = 0
|
|
10 CONTINUE
|
|
|
|
C load up CNTRA array - coordinates of mesh-A element centroids
|
|
|
|
C NNODES = NNELM(ITYPE)
|
|
NNODES = NELNDA
|
|
IF (ITYPE .EQ. 6) NNODES = 4
|
|
IF (NDIMA .EQ. 2) THEN
|
|
DO 20 IEL = 1, NUMEBA
|
|
DO 30 I = 1, NNODES
|
|
INODE = ICONA(I,IEL)
|
|
XX(I) = XA(INODE)
|
|
YY(I) = YA(INODE)
|
|
ZZ(I) = 0.
|
|
30 CONTINUE
|
|
CALL CNTR(ITYPE,XX,YY,ZZ,CNTRA(IEL,1),CNTRA(IEL,2),DUMMY)
|
|
|
|
20 CONTINUE
|
|
ELSE
|
|
DO 40 IEL = 1, NUMEBA
|
|
DO 50 I = 1, NNODES
|
|
INODE = ICONA(I,IEL)
|
|
XX(I) = XA(INODE)
|
|
YY(I) = YA(INODE)
|
|
ZZ(I) = ZA(INODE)
|
|
50 CONTINUE
|
|
CALL CNTR(ITYPE,XX,YY,ZZ,CNTRA(IEL,1),CNTRA(IEL,2),
|
|
& CNTRA(IEL,3))
|
|
|
|
40 CONTINUE
|
|
END IF
|
|
|
|
C put element variables into SOLEA array
|
|
|
|
DO 80 IVAR = 1, NVAREL
|
|
IF (ITT(IVAR,iblk) .EQ. 0)GO TO 80
|
|
CALL EXGEV(NTP2EX,ISTP,IVAR,IDBLK,NUMEBA,SOLEA(1,IVAR),IERR)
|
|
|
|
IF (NAMVAR(nvargp+IVAR)(1:6) .EQ. 'ELMASS') THEN
|
|
|
|
C replace element mass with density
|
|
|
|
DO 90 IEL = 1, NUMEBA
|
|
DO 100 I = 1, NNODES
|
|
XX(I) = XA(ICONA(I,IEL))
|
|
YY(I) = YA(ICONA(I,IEL))
|
|
IF (NDIMA .EQ. 3)THEN
|
|
ZZ(I) = ZA(ICONA(I,IEL))
|
|
ELSE
|
|
ZZ(I) = 0.
|
|
END IF
|
|
100 CONTINUE
|
|
CALL VOL(ITYPE,XX,YY,ZZ,VOLUME)
|
|
|
|
SOLEA(IEL,IVAR) = SOLEA(IEL,IVAR) / VOLUME
|
|
90 CONTINUE
|
|
END IF
|
|
80 CONTINUE
|
|
|
|
C start element centroid based gradient calculation
|
|
|
|
C get list of elements that share at least one node with current
|
|
C element being processed IELLST
|
|
|
|
DO 110 IEL = 1, NUMEBA
|
|
ICOUNT = 0
|
|
ICHKEL(IEL) = IEL
|
|
DO 120 INODE = 1, NNODES
|
|
NOWNOD = ICONA(INODE,IEL)
|
|
DO 130 IE = 1, INVLN(NOWNOD)
|
|
NOWELT = INVCN(IE,NOWNOD)
|
|
IF (IEL .NE. ICHKEL(NOWELT))THEN
|
|
ICOUNT = ICOUNT + 1
|
|
ICHKEL(NOWELT) = IEL
|
|
IELLST(ICOUNT) = NOWELT
|
|
END IF
|
|
130 CONTINUE
|
|
120 CONTINUE
|
|
|
|
C If shells element, compute element normal
|
|
C use cross product of vectors from mid-sides
|
|
|
|
IF (ITYPE .EQ. 13)THEN
|
|
XM1 = XA(ICONA(1,IEL)) - XA(ICONA(2,IEL))
|
|
YM1 = YA(ICONA(1,IEL)) - YA(ICONA(2,IEL))
|
|
ZM1 = ZA(ICONA(1,IEL)) - ZA(ICONA(2,IEL))
|
|
XM2 = XA(ICONA(2,IEL)) - XA(ICONA(3,IEL))
|
|
YM2 = YA(ICONA(2,IEL)) - YA(ICONA(3,IEL))
|
|
ZM2 = ZA(ICONA(2,IEL)) - ZA(ICONA(3,IEL))
|
|
XM3 = XA(ICONA(3,IEL)) - XA(ICONA(4,IEL))
|
|
YM3 = YA(ICONA(3,IEL)) - YA(ICONA(4,IEL))
|
|
ZM3 = ZA(ICONA(3,IEL)) - ZA(ICONA(4,IEL))
|
|
XM4 = XA(ICONA(4,IEL)) - XA(ICONA(1,IEL))
|
|
YM4 = YA(ICONA(4,IEL)) - YA(ICONA(1,IEL))
|
|
ZM4 = ZA(ICONA(4,IEL)) - ZA(ICONA(1,IEL))
|
|
V11 = XM1 - XM3
|
|
V12 = YM1 - YM3
|
|
V13 = ZM1 - ZM3
|
|
V21 = XM2 - XM4
|
|
V22 = YM2 - YM4
|
|
V23 = ZM2 - ZM4
|
|
SHLNRM(1) = V12*V23 - V22*V13
|
|
SHLNRM(2) = V21*V13 - V11*V23
|
|
SHLNRM(3) = V11*V22 - V21*V12
|
|
END IF
|
|
|
|
C compute gradients for element IEL and put in SOLGRA
|
|
|
|
CALL FLGRAD(IEL,ICOUNT,IELLST,CNTRA,SHLNRM,SOLEA,SOLGRA,
|
|
& ITT,iblk)
|
|
|
|
110 CONTINUE
|
|
RETURN
|
|
END
|
|
|