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.
122 lines
3.6 KiB
122 lines
3.6 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
|
||
|
|
||
|
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
|