subroutine aptpfit (ax, ay, az, bx, by, bz, cx, cy, cz, tol,
& qc, qx, qy, qz, nerr)
ccbeg.
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c
c SUBROUTINE APTPFIT
c
c call aptpfit (ax, ay, az, bx, by, bz, cx, cy, cz, tol,
c & qc, qx, qy, qz, nerr)
c
c Version: aptpfit Updated 1999 March 3 10:30.
c aptpfit Originated 1999 March 3 10:30.
c
c Author: Arthur L. Edwards, LLNL, L-298, Telephone (925) 422-4123.
c
c
c Purpose: For the three points a = (ax, ay, az), b = (bx, by, bz),
c c = (cx, cy, cz), to find the coefficients qc, qx, qy and qz
c of the equation of the plane through the three points:
c F(x,y,z) = qc + qx * x + qy * y + qz * z = 0
c The distance of the plane from the origin is qc. The unit
c vector normal to the plane is q = (qx, qy, qz).
c Flag nerr indicates an input error, if not zero.
c
c Input: ax, ay, az, bx, by, bz, cx, cy, cz, tol.
c
c Output: qc, qx, qy, qz, nerr.
c
c Calls: aptvdot, aptvpln
c
c
c Glossary:
c
c ax,ay,az Input The x, y, z coordinates of point "a".
c
c bx,by,bz Input The x, y, z coordinates of point "b".
c
c cx,cy,cz Input The x, y, z coordinates of point "c".
c
c nerr Output Indicates an input error, if not 0.
c 1 if the points are colinear or any are coincident.
c If so, -1.e99 is returned for qc, qx, qy, qz.
c
c qc Output The distance of the plane from the origin.
c
c qx,qy,qz Output The x, y, z components of the unit vector normal to the
c plane. A component may be truncated to zero, if less
c than the estimated numerical error in its
c calculation, based on tol.
c
c tol Input Numerical tolerance limit for qc, qx, qy, qz.
c On computers with 48-bit floating point numbers,
c recommend 1.e-5 to 1.e-11.
c
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccend.
cbugc***DEBUG begins.
cbug 9901 format (/ 'aptpfit finding the plane through the three points:' /
cbug & ' ax,ay,az= ',1p3e22.14 /
cbug & ' bx,by,bz= ',1p3e22.14 /
cbug & ' cx,cy,cz= ',1p3e22.14 )
cbug write ( 3, 9901) ax, ay, az, bx, by, bz, cx, cy, cz
cbugc***DEBUG ends.
c.... Initialize.
nerr = 0
c.... Find the normal vectors.
call aptvpln (ax, ay, az, bx, by, bz, cx, cy, cz, 1, tol,
& qx, qy, qz, vlen, nerra)
c.... See if points are colinear, or if any are coincident.
if (vlen .eq. 0.0) then
nerr = 1
qc = -1.e99
qx = -1.e99
qy = -1.e99
qz = -1.e99
go to 210
endif
c.... Find the dot product of the vector to point "a" and the normal vector.
call aptvdot (ax, ay, az, qx, qy, qz, 1, tol, qc, nerra)
c.... Find the coefficients of the quadric equation for the plane.
qc = -qc / vlen
qx = qx / vlen
qy = qy / vlen
qz = qz / vlen
210 continue
cbugc***DEBUG begins.
cbug 9902 format (/ 'aptpfit results. nerr=',i3 /
cbug & ' qc= ',1pe22.14 /
cbug & ' qx,qy,qz= ',1p3e22.14)
cbug write ( 3, 9902) nerr, qc, qx, qy, qz
cbugc***DEBUG ends.
return
c.... End of subroutine aptpfit. (+1 line.)
end
UCRL-WEB-209832