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.
177 lines
6.0 KiB
177 lines
6.0 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=======================================================================
|
||
|
*DECK, SETON1
|
||
|
SUBROUTINE SETON1(CNTRA,SOLEA,SOLENA,IDBLK,XA,YA,ZA,ICONA,
|
||
|
& NDLSTA,INVLN,INVCN,MAXLN,ISTP,ITT,iblk)
|
||
|
|
||
|
C *********************************************************************
|
||
|
|
||
|
C Subroutine SETON1 extracts nodal values of element variables by
|
||
|
C performing a weighted least squares fit (4 or more elements) or
|
||
|
C a triangulation (3 elements) over the centroids of the elements
|
||
|
C attached to the current node.
|
||
|
|
||
|
C Each element block must be processed independently in order to
|
||
|
C avoid averaging element variables across material boundaries.
|
||
|
C Note: the last set of DO loops acts over all nodes; to make sense
|
||
|
C one element block must be completely processed before another
|
||
|
C element block is sent into this subroutine.
|
||
|
|
||
|
C Calls subroutines CNTR, VOL, EXTS, AVG, ERROR
|
||
|
|
||
|
C Called by MAPVAR
|
||
|
|
||
|
C *********************************************************************
|
||
|
|
||
|
C CNTRA a list of element centroid coordinates for all elements
|
||
|
C in the current element block (1:ndima,1:numeba)
|
||
|
C SOLEA element variables (1:numeba,1:nvarel)
|
||
|
C SOLENA element variables at nodes (1:nodesa,1:nvarel)
|
||
|
C IDBLK current element block I.D.
|
||
|
C XA,etc coordinates
|
||
|
C ICONA connectivity array (1:nelnda,1:nodesa)
|
||
|
C NDLSTA list of nodes in element block - from RDA2 (1:numnda)
|
||
|
C INVLN number of elements connected to a node (1:numnda)
|
||
|
C INVCN inverse connectivity (1:maxln,1:numnda)
|
||
|
C MAXLN maximum number of elements connected to any node
|
||
|
C ITT truth table
|
||
|
C iblk element block being processed (not ID)
|
||
|
|
||
|
C** RELATIONSHIP BETWEEN NODAL IDENTIFICATIONS **
|
||
|
C IGLND = NDLSTA(INOD) = ICONA(NOWLND,INVCN(1,IGLND))
|
||
|
|
||
|
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 SOLENA(NODESA,NVAREL)
|
||
|
DIMENSION XX(27), YY(27), ZZ(27)
|
||
|
DIMENSION XA(*), YA(*), ZA(*), ICONA(NELNDA,*), NDLSTA(*)
|
||
|
DIMENSION INVCN(MAXLN,*),INVLN(*), ITT(NVAREL,*)
|
||
|
|
||
|
C *********************************************************************
|
||
|
|
||
|
DO I = 1, NODESA
|
||
|
DO J = 1, NVAREL
|
||
|
SOLENA(I,J) = 0.
|
||
|
end do
|
||
|
end do
|
||
|
|
||
|
C load up CNTRA array - coordinates of donor mesh element centroids
|
||
|
|
||
|
NNODES = 4
|
||
|
DO IEL = 1, NUMEBA
|
||
|
DO I = 1, NNODES
|
||
|
INODE = ICONA(I,IEL)
|
||
|
XX(I) = XA(INODE)
|
||
|
YY(I) = YA(INODE)
|
||
|
ZZ(I) = ZA(INODE)
|
||
|
end do
|
||
|
CALL CNTR(13,XX,YY,ZZ,CNTRA(IEL,1),CNTRA(IEL,2),CNTRA(IEL,3))
|
||
|
end do
|
||
|
|
||
|
C put element variables into SOLEA array
|
||
|
|
||
|
DO IVAR = 1, NVAREL
|
||
|
IF (ITT(IVAR,iblk) .EQ. 0)GO TO 30
|
||
|
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 IEL = 1, NUMEBA
|
||
|
DO I = 1, NNODES
|
||
|
XX(I) = XA(ICONA(I,IEL))
|
||
|
YY(I) = YA(ICONA(I,IEL))
|
||
|
ZZ(I) = ZA(ICONA(I,IEL))
|
||
|
end do
|
||
|
CALL VOL(ITYPE,XX,YY,ZZ,VOLUME)
|
||
|
SOLEA(IEL,IVAR) = SOLEA(IEL,IVAR) / VOLUME
|
||
|
end do
|
||
|
END IF
|
||
|
30 CONTINUE
|
||
|
end do
|
||
|
|
||
|
C start least squares extrapolation
|
||
|
C Find the elements connected to the node. If fewer than 3 elements,
|
||
|
C adjust search to find additional elements. If unable to get at
|
||
|
C least 3 elements, must be treated as special case (just average
|
||
|
C element values at node)(see below).
|
||
|
|
||
|
DO INOD = 1, NUMNDA
|
||
|
IGLND = NDLSTA(INOD)
|
||
|
|
||
|
C Process special case of only 1 element attached to node
|
||
|
|
||
|
IF (INVLN(IGLND) .EQ. 1)THEN
|
||
|
|
||
|
C Get node number diagonally across element, in most cases this
|
||
|
C node will have 4 elements attached.
|
||
|
|
||
|
NXTLND = 0
|
||
|
DO I = 1, NNODES
|
||
|
IF (IGLND .EQ. ICONA(I,INVCN(1,IGLND)))NXTLND = I + 2
|
||
|
end do
|
||
|
IF (NXTLND .GT. NNODES) NXTLND = NXTLND - NNODES
|
||
|
NXGLND = ICONA(NXTLND,INVCN(1,IGLND))
|
||
|
|
||
|
C If 3 or more elements,
|
||
|
c fit a plane through the element centroids, project element
|
||
|
c centroids and original node onto plane, extrapolate
|
||
|
c in 2-d (coords of plane) to original node (done in EXTS).
|
||
|
c If 2 or less elements,
|
||
|
c average original element variables at original node
|
||
|
|
||
|
IF (INVLN(NXGLND) .GT. 2)THEN
|
||
|
CALL EXTS(IGLND,INVCN,MAXLN,NXGLND,INVLN(NXGLND),XA,YA,ZA,
|
||
|
& CNTRA,SOLEA,SOLENA,ITT,iblk)
|
||
|
ELSE
|
||
|
CALL AVG(IGLND,INVCN,MAXLN,INVLN(IGLND),SOLEA,SOLENA,
|
||
|
& ITT,iblk)
|
||
|
END IF
|
||
|
|
||
|
C Process special case of only 2 elements attached to node
|
||
|
|
||
|
ELSE IF (INVLN(IGLND) .EQ. 2)THEN
|
||
|
|
||
|
c get second node that is shared by both elements. That is the
|
||
|
c node on the other end of the shared element side.
|
||
|
|
||
|
DO I = 1, NNODES
|
||
|
DO J = 1, NNODES
|
||
|
IF(ICONA(I,INVCN(1,IGLND)) .NE. IGLND .AND.
|
||
|
& ICONA(I,INVCN(1,IGLND)) .EQ. ICONA(J,INVCN(2,IGLND)))
|
||
|
& NXGLND = ICONA(I,INVCN(1,IGLND))
|
||
|
end do
|
||
|
end do
|
||
|
c
|
||
|
c If this second node has more than 3 elements, extrapolate. Otherwise
|
||
|
c average. (at original node)
|
||
|
|
||
|
IF (INVLN(NXGLND) .GT. 2)THEN
|
||
|
CALL EXTS(IGLND,INVCN,MAXLN,NXGLND,INVLN(NXGLND),XA,YA,ZA,
|
||
|
& CNTRA,SOLEA,SOLENA,ITT,iblk)
|
||
|
ELSE
|
||
|
CALL AVG(IGLND,INVCN,MAXLN,INVLN(IGLND),SOLEA,SOLENA,
|
||
|
& ITT,iblk)
|
||
|
END IF
|
||
|
ELSE
|
||
|
CALL EXTS(IGLND,INVCN,MAXLN,IGLND,INVLN(IGLND),XA,YA,ZA,
|
||
|
& CNTRA,SOLEA,SOLENA,ITT,iblk)
|
||
|
END IF
|
||
|
end do
|
||
|
RETURN
|
||
|
END
|