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.
 
 
 
 
 
 

90 lines
3.0 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=======================================================================
SUBROUTINE PTSNRM( PLAPTS, INPT, CUTPT, CUTNRM , IERR)
C=======================================================================
C --*** PTRNRM *** (MESH) Turns three point plane to point-normal form
C -- Written by Ray J. Meyers 29 May, 1990
C --
C -- Given three non-colinear points, returns a description of the plane
C -- consisting of a point on the plane and a normal vector to the plane.
C --
C --Parameters:
C -- PLAPTS - IN - the 3 points defining the cutting plane;
C -- INPT - IN - a point in the mesh, ie, on the opposite side
C from the cutting plane normal
C -- CUTPT - OUT - a point on the cutting plane;
C -- CUTNRM - OUT - the normal to the cutting plane;
C -- IERR - OUT - non-zero if the input points are colinear (no plane
C defined)
REAL PLAPTS(3,3)
REAL INPT(3)
REAL CUTPT(3)
REAL CUTNRM(3)
INTEGER IERR
REAL VEC1(3), VEC2(3)
REAL TOL, DOT
C DEFINE TWO VECTORS IN THE PLANE : VEC1 = P1-P2, VEC2 = P3-P2
VEC1(1) = PLAPTS(1,1) - PLAPTS(1,2)
VEC1(2) = PLAPTS(2,1) - PLAPTS(2,2)
VEC1(3) = PLAPTS(3,1) - PLAPTS(3,2)
VEC2(1) = PLAPTS(1,3) - PLAPTS(1,2)
VEC2(2) = PLAPTS(2,3) - PLAPTS(2,2)
VEC2(3) = PLAPTS(3,3) - PLAPTS(3,2)
C DEFINE A TOLERANCE BASED ON THE LENGTH OF VEC1
TOL = 1E-06 * AMAX1 ( VEC1(1), VEC1(2), VEC1(3) )
C TAKE THE CROSS PRODUCT OF VEC1 AND VEC2 AS THE NORMAL OF THE PLANE AND
C NORMALIZE
CUTNRM(1) = VEC1(2)*VEC2(3) - VEC1(3)*VEC2(2)
CUTNRM(2) = VEC1(3)*VEC2(1) - VEC1(1)*VEC2(3)
CUTNRM(3) = VEC1(1)*VEC2(2) - VEC1(2)*VEC2(1)
DIST = SQRT( CUTNRM(1)*CUTNRM(1) + CUTNRM(2)*CUTNRM(2) +
$ CUTNRM(3)*CUTNRM(3) )
CUTNRM(1) = CUTNRM(1)/DIST
CUTNRM(2) = CUTNRM(2)/DIST
CUTNRM(3) = CUTNRM(3)/DIST
C IF THE NORMAL IS (0,0,0), THE ORIGINAL POINTS WERE COLINEAR
IF( ABS(CUTNRM(1)) .LT. TOL .AND. ABS(CUTNRM(2)) .LT. TOL
$ .AND. ABS(CUTNRM(3)) .LT. TOL) THEN
CALL PRTERR ('CMDERR', 'Points do not define a plane')
IERR = 1
ELSE
IERR = 0
C USE THE SECOND INPUT POINT AS THE CHOSEN CUTPT
CUTPT(1) = PLAPTS(1,2)
CUTPT(2) = PLAPTS(2,2)
CUTPT(3) = PLAPTS(3,2)
C CHECK THE INPT TO SEE IF THE NORMAL IS THE CORRECT SENSE
VEC1(1) = INPT(1) - CUTPT(1)
VEC1(2) = INPT(2) - CUTPT(2)
VEC1(3) = INPT(3) - CUTPT(3)
DOT = VEC1(1)*CUTNRM(1) + VEC1(2)*CUTNRM(2) +
$ VEC1(3)*CUTNRM(3)
IF(DOT .GT. 0) THEN
CUTNRM(1) = -CUTNRM(1)
CUTNRM(2) = -CUTNRM(2)
CUTNRM(3) = -CUTNRM(3)
END IF
END IF
RETURN
END