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.
 
 
 
 
 
 

121 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
SUBROUTINE EQLANG (MXND, XN, YN, LXN, NODE, N0, N2, NFROM, DIST,
& VRO, XDEL, YDEL)
C***********************************************************************
C SUBROUTINE EQLANG = CALCULATES A VECTOR SUM THAT ATTEMPTS TO
C MAINTAIN EQUAL ANGLES FOR A NODE
C***********************************************************************
DIMENSION XN(MXND), YN(MXND), LXN(4, MXND)
LOGICAL EXPAND
PI = ATAN2(0.0, -1.0)
TWOPI = 2.0 * PI
IF (NFROM .GT. 0) THEN
C TEST FOR THE EXPANSION CASE
IF ( ( ((LXN (4, NFROM) .NE. 0) .AND.
& (LXN (2, NFROM) .LT. 0)) .OR.
& ((LXN (4, NFROM) .LT. 0) .AND.
& (LXN (2, NFROM) .GT. 0)) )
& .AND.
& ((LXN (3, N0) .EQ. 0) .OR. (LXN (3, N2) .EQ. 0)) ) THEN
EXPAND = .TRUE.
ELSE
EXPAND = .FALSE.
ENDIF
ANG1 = ATAN2 ( YN (N2) - YN (NFROM), XN (N2) - XN (NFROM))
IF (ANG1 .LT. 0.) ANG1 = ANG1 + TWOPI
ANG2 = ATAN2 ( YN (N0) - YN (NFROM), XN (N0) - XN (NFROM))
IF (ANG2 .LT. 0.) ANG2 = ANG2 + TWOPI
ANG3 = ATAN2 ( YN (NODE) - YN (NFROM), XN (NODE) - XN (NFROM))
IF (ANG3 .LT. 0.) ANG3 = ANG3 + TWOPI
C GET THE APPROPRIATE ANGLE BETWEEN ANGLE 1 AND 2
ANG12D = ANG2 - ANG1
IF (ANG12D .LT. 0.) ANG12D = ANG12D + TWOPI
C IF THIS IS AN EXPANSION, THEN ADJUST THE ANGLE ACCORDINGLY
IF (EXPAND) THEN
IF (LXN (3, N2) .EQ. 0) THEN
ANG12 = ANG1 + (ANG12D * .6)
ELSEIF (LXN (3, N0) .EQ. 0) THEN
ANG12 = ANG1 + (ANG12D * .4)
ELSE
ANG12 = ANG1 + (ANG12D * .5)
ENDIF
ELSE
ANG12 = ANG1 + (ANG12D * .5)
ENDIF
IF (ANG12 .GT. TWOPI) ANG12 = ANG12 - TWOPI
C GET THE AVERAGE ANGLE BETWEEN ANGLE 12 AND 3
IF (ANG12 .GT. ANG3) THEN
ANG3D = ANG12 - ANG3
IF (ANG3D .GT. PI) THEN
ANG = ANG12 + ((TWOPI - ANG3D) * .5)
ELSE
ANG = ANG12 - (ANG3D * .5)
ENDIF
ELSE
ANG3D = ANG3 - ANG12
IF (ANG3D .GT. PI) THEN
ANG = ANG3 + ((TWOPI - ANG3D) * .5)
ELSE
ANG = ANG3 - (ANG3D * .5)
ENDIF
ENDIF
C GET THE DISTANCE TO MAKE THE OUTSIDE FLAT AT THIS ANGLE
D1 = SQRT ( ((XN (NFROM) - XN (N0)) ** 2) +
& ((YN (NFROM) - YN (N0)) ** 2) )
D2 = SQRT ( ((XN (N2) - XN (N0)) ** 2) +
& ((YN (N2) - YN (N0)) ** 2) )
D3 = SQRT ( ((XN (NFROM) - XN (N2)) ** 2) +
& ((YN (NFROM) - YN (N2)) ** 2) )
ARG = (SIN (ANG12D) * D1) / D2
IF (ARG .GT. 1.0) ARG = 1.0
IF (ARG .LT. -1.0) ARG = -1.0
BETA = ASIN (ARG)
D0 = (D3 * SIN (BETA)) / SIN (PI - BETA - (ANG12D * .5))
IF (D0 .GT. DIST) THEN
IF (EXPAND) THEN
DIST0 = D0
ELSE
DIST0 = (DIST + D0) * .5
ENDIF
ELSE
DIST0 = DIST
ENDIF
C CALCULATE THE NEW COORDINATES
X0 = XN (NFROM) + (COS (ANG) * DIST0)
Y0 = YN (NFROM) + (SIN (ANG) * DIST0)
XDEL = (X0 - XN (NODE)) * VRO
YDEL = (Y0 - YN (NODE)) * VRO
ELSE
XDEL = 0.
YDEL = 0.
ENDIF
RETURN
END