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.
 
 
 
 
 
 

127 lines
3.6 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=======================================================================
LOGICAL FUNCTION CKCROS (IMID, IH, NLNKF, LINKF1, XN, YN, ZN)
C=======================================================================
C --*** CKCROS *** (MESH) Hide partial lines by face
C -- Written by Amy Gilkey - revised 10/02/86
C --
C --CKCROS deletes partial lines that have a visible node along the edge
C --of a quarilateral and the hidden node is within the area defined
C --by the vectors from the corner to the two adjacent nodes. Such
C --a face totally hides the partial line.
C --
C --Parameters:
C -- IMID - IN - the node in the face that is closest to the
C -- visible node
C -- IH - IN - the hidden nodes
C -- NLNKF - IN - the number of nodes per face
C -- LINKF1 - IN - the connectivity for the face containing the edge
C -- XN,YN,ZN - IN - the nodal coordinates
include 'debug.blk'
C common /debugc/ cdebug
C common /debugn/ idebug
C character*8 cdebug
INTEGER LINKF1(NLNKF)
REAL XN(*), YN(*), ZN(*)
CKCROS = .FALSE.
C --Find left and right node for face
DO 100 ILINK = 1, 4
IF (LINKF1(ILINK) .EQ. IMID) IXMID = ILINK
100 CONTINUE
IF (IXMID .LT. 4) THEN
ILFT = LINKF1(IXMID+1)
ELSE
ILFT = LINKF1(1)
END IF
IF (IXMID .GT. 1) THEN
IRGT = LINKF1(IXMID-1)
ELSE
IRGT = LINKF1(4)
END IF
IF ((ILFT .EQ. IH) .OR. (IRGT .EQ. IH)) GOTO 110
XMID = XN(IMID)
YMID = YN(IMID)
XLFT = XN(ILFT)
YLFT = YN(ILFT)
XRGT = XN(IRGT)
YRGT = YN(IRGT)
IF ((XLFT-XMID)*YRGT + (XRGT-XLFT)*YMID
& + (XMID-XRGT)*YLFT .LT. 0.0) THEN
I = IRGT
IRGT = ILFT
ILFT = I
XLFT = XN(ILFT)
YLFT = YN(ILFT)
XRGT = XN(IRGT)
YRGT = YN(IRGT)
END IF
C --Check 2 triangles formed by 2 adjacent nodes of the face
C --and the node have a positive area
X0 = XN(IH)
Y0 = YN(IH)
ALFT = (XLFT-XMID)*Y0 + (X0-XLFT)*YMID + (XMID-X0)*YLFT
IF (ALFT .LT. 0.0) GOTO 110
ARGT = (XMID-XRGT)*Y0 + (X0-XMID)*YRGT + (XRGT-X0)*YMID
IF (ARGT .LT. 0.0) GOTO 110
C --Check if the node's Z is behind the face's Z at that point
ZMIN = MIN
& (ZN(LINKF1(1)), ZN(LINKF1(2)), ZN(LINKF1(3)), ZN(LINKF1(4)))
IF (ZMIN .LE. ZN(IH)) THEN
C --Calculate normal at visible node with diagonal node and
C --left or right node
IF (IXMID .GT. 2) THEN
IDIA = LINKF1(IXMID-2)
ELSE
IDIA = LINKF1(IXMID+2)
END IF
ZMID = ZN(IMID)
AMIN = MIN (ALFT, ARGT)
IF (AMIN .EQ. ALFT) THEN
ISIDA = ILFT
ISIDB = IDIA
ELSE IF (AMIN .EQ. ARGT) THEN
ISIDA = IDIA
ISIDB = IRGT
END IF
AX = XN(ISIDA) - XMID
AY = YN(ISIDA) - YMID
AZ = ZN(ISIDA) - ZMID
BX = XN(ISIDB) - XMID
BY = YN(ISIDB) - YMID
BZ = ZN(ISIDB) - ZMID
XNORM = 0.5 * (AY*BZ - BY*AZ)
YNORM = 0.5 * (AZ*BX - BZ*AX)
ZNORM = 0.5 * (AX*BY - BX*AY)
IF ((XNORM*(X0-XMID) + YNORM*(Y0-YMID)
& + ZNORM*(ZN(IH)-ZMID)) .GE. 0.0) GOTO 110
END IF
C --Mark totally hidden lines
CKCROS = .TRUE.
110 CONTINUE
RETURN
END