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.
112 lines
3.4 KiB
112 lines
3.4 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 ENDTAN (MP, ML, N, IPOINT, COOR, LTYPE, LCON, LINKP,
|
||
|
& LINKL, LNUM, LPNTR, NP, THETA, ERR)
|
||
|
C***********************************************************************
|
||
|
|
||
|
C SUBROUTINE ENDTAN = GETS THE ANGLE FOR THE TANGENT AT THE END OF
|
||
|
C A LINE
|
||
|
|
||
|
C***********************************************************************
|
||
|
|
||
|
C VARIABLES USED: LNUM = LINE NUMBER
|
||
|
C LPNTR = LINE POINTER
|
||
|
C VECTX = X VECTOR
|
||
|
C VECTY = Y VECTOR
|
||
|
C ICCW = THE POINTER TO THE CCW END OF THE LINE
|
||
|
C ICW = THE POINTER TO THE CW END OF THE LINE
|
||
|
C I1 = THE FIRST POINT NUMBER OF THE LINE
|
||
|
C I2 = THE SECOND POINT NUMBER OF THE LINE
|
||
|
C I3 = THE THIRD POINT NUMBER OF THE LINE
|
||
|
C J1 = THE FIRST POINT NUMBER INDEX
|
||
|
C J2 = THE SECOND POINT NUMBER INDEX
|
||
|
C J3 = THE THIRD POINT NUMBER INDEX
|
||
|
|
||
|
C***********************************************************************
|
||
|
|
||
|
DIMENSION IPOINT (MP), COOR (2, MP), LTYPE (ML), LCON (3, ML)
|
||
|
DIMENSION LINKP (2, MP), LINKL (2, ML)
|
||
|
DIMENSION N (29)
|
||
|
|
||
|
LOGICAL ADDLNK, ERR
|
||
|
|
||
|
PI = ATAN2(0.0, -1.0)
|
||
|
|
||
|
TWOPI = PI + PI
|
||
|
ADDLNK = .FALSE.
|
||
|
ERR = .FALSE.
|
||
|
|
||
|
C GET THE POINTERS TO THE POINTS THAT DEFINE THE LINE
|
||
|
|
||
|
I1 = LCON (1, LPNTR)
|
||
|
I2 = LCON (2, LPNTR)
|
||
|
I3 = LCON (3, LPNTR)
|
||
|
CALL LTSORT (MP, LINKP, I1, J1, ADDLNK)
|
||
|
CALL LTSORT (MP, LINKP, I2, J2, ADDLNK)
|
||
|
IF ( (J1 .LE. 0) .OR. (J2 .LE. 0))RETURN
|
||
|
IF (I3 .NE. 0) THEN
|
||
|
CALL LTSORT (MP, LINKP, IABS (I3), J3, ADDLNK)
|
||
|
IF (J3 .LE. 0)RETURN
|
||
|
ELSE
|
||
|
J3 = 0
|
||
|
ENDIF
|
||
|
|
||
|
C STRAIGHT LINE END TANGENT
|
||
|
|
||
|
IF (LTYPE (LPNTR) .EQ. 1) THEN
|
||
|
IF (I1 .EQ. NP) THEN
|
||
|
VECTX = COOR (1, J2) - COOR (1, J1)
|
||
|
VECTY = COOR (2, J2) - COOR (2, J1)
|
||
|
ELSEIF (I2 .EQ. NP) THEN
|
||
|
VECTX = COOR (1, J1) - COOR (1, J2)
|
||
|
VECTY = COOR (2, J1) - COOR (2, J2)
|
||
|
ELSE
|
||
|
ERR = .TRUE.
|
||
|
RETURN
|
||
|
ENDIF
|
||
|
THETA = ATAN2 (VECTY, VECTX)
|
||
|
|
||
|
C ARC LINE END TANGENT
|
||
|
|
||
|
ELSEIF (LTYPE (LPNTR) .NE. 5) THEN
|
||
|
CALL ARCPAR (MP, LTYPE (LPNTR), LNUM, COOR, LINKP,
|
||
|
& J1, J2, J3, I3, XCEN, YCEN, THETA1, THETA2, TANG,
|
||
|
& R1, R2, ERR, ICCW, ICW, XK, XA)
|
||
|
|
||
|
C CHECK FOR THE A CLOSED ARC
|
||
|
|
||
|
IF (IPOINT (ICCW) .EQ. IPOINT (ICW)) THEN
|
||
|
THETA = THETA2 + (PI * .5)
|
||
|
ELSEIF (NP .EQ. IPOINT (ICCW)) THEN
|
||
|
THETA = THETA1 + (PI * .5) + XK
|
||
|
ELSEIF (NP .EQ. IPOINT (ICW)) THEN
|
||
|
THETA = THETA2 - ( (PI * .5) - XK )
|
||
|
ELSE
|
||
|
ERR = .TRUE.
|
||
|
RETURN
|
||
|
ENDIF
|
||
|
|
||
|
C NO OTHER LINES SUPPORTED
|
||
|
|
||
|
ELSE
|
||
|
ERR = .TRUE.
|
||
|
CALL MESSAGE('UNSUPPORTED LINE TYPE IN ENDTAN')
|
||
|
RETURN
|
||
|
ENDIF
|
||
|
|
||
|
C MAKE SURE THAT THETA IS BETWEEN 0 AND 2PI
|
||
|
|
||
|
IF (THETA .LT. 0) THEN
|
||
|
THETA = THETA + TWOPI
|
||
|
ELSEIF (THETA .GT. TWOPI) THEN
|
||
|
THETA = THETA - TWOPI
|
||
|
ENDIF
|
||
|
|
||
|
RETURN
|
||
|
|
||
|
END
|