subroutine aptsver (ax, ay, az, bx, by, bz, cx, cy, cz, tol, & sa, sb, sc, sum, wa, wb, wc, sx, sy, sz, nerr) ccbeg. cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc c c SUBROUTINE APTSVER c c call aptsver (ax, ay, az, bx, by, bz, cx, cy, cz, tol, c & sa, sb, sc, sum, wa, wb, wc, sx, sy, sz, nerr) c c Version: aptsver Updated 2001 March 13 13:45. c aptsver Originated 2001 March 7 13:40. c c Author: Arthur L. Edwards, LLNL, L-298, Telephone (925) 422-4123. c c c Purpose: For the triangle with vertices a = (ax, ay, az), c b = (bx, by, bz), and c = (cx, cy, cz) in 3-D space, to find c the Steiner vertex s = (sx, sy, sz), from which the sum of the c lengths sum = sa + sb + sc of the lines to the three triangle c vertices is minimized. The angles between each pair of those c lines is 120 degrees, unless the triangle has a vertex angle c exceeding 120 degrees, in which case the Steiner vertex is at c that vertex. The relative vertex weights wa, wb and wc are c also returned. c Flag nerr indicates any failure to find a true Steiner vertex. c c Input: ax, ay, az, bx, by, bz, cx, cy, cz, tol. c c Output: sa, sb, sc, wa, wb, wc, sx, sy, sz, nerr. c c Calls: aptvang, aptvdis c c Glossary: c c ax,ay,az Input The x, y, z coordinates of vertex "a" of the triangle. c c bx,by,bz Input The x, y, z coordinates of vertex "b" of the triangle. c c cx,cy,cz Input The x, y, z coordinates of vertex "c" of the triangle. c c ab Output The length of edge "ab" of the triangle. c c bc Output The length of edge "bc" of the triangle. c c ca Output The length of edge "ca" of the triangle. c c sa,b,c Output The distances from the Steiner vertex "s" to the c triangle vertices "a", "b" and "c". c c sum Output The sum of distances, sum = sa + sb + sc. c c nerr Output Indicates special case, if not 0. c 1 if the triangle has two coincident vertices. c Steiner vertex is put there. c 2 if the triangle has a vertex angle of 120 degrees c or more. Steiner vertex is put there. c c sx,sy,sz Output The x, y, z coordinates of the Steiner vertex. c c tol Input Numerical tolerance limit. c On computers with 64-bit real numbers, recommend c 1.e-5 to 1.e-11. c c wa,b,c Output Relative eights of triangle vertices "a", "b" and "c", c relative to Steiner vertex. c sx = wa * ax + wb * bx + wc * cx c sy = wa * ay + wb * by + wc * cy c sz = wa * az + wb * bz + wc * cz. c cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ccend. c.... Specify variable types. implicit none c.... Arguments. integer nerr ! Special case indicator. real ax ! Coordinate x of vertex a. real ay ! Coordinate y of vertex a. real az ! Coordinate z of vertex a. real bx ! Coordinate x of vertex b. real by ! Coordinate y of vertex b. real bz ! Coordinate z of vertex b. real cx ! Coordinate x of vertex c. real cy ! Coordinate y of vertex c. real cz ! Coordinate z of vertex c. real sa ! Distance from Steiner vertex to point a. real sb ! Distance from Steiner vertex to point b. real sc ! Distance from Steiner vertex to point c. real sum ! Sub sa + sb + sc. real sx ! Coordinate x of Steiner vertex. real sy ! Coordinate y of Steiner vertex. real sz ! Coordinate z of Steiner vertex. real tol ! Precision limit. real wa ! Weight of vertex a. real wb ! Weight of vertex b. real wc ! Weight of vertex c. c.... Local variables. integer nerra ! Error return from apt subroutine. real ab ! Length of edge vector ab. real abx ! Component x of edge vector ab. real aby ! Component y of edge vector ab. real abz ! Component z of edge vector ab. real anga ! Angle at vertex a, radians. real angb ! Angle at vertex b, radians. real angc ! Angle at vertex c, radians. real angm ! Angle of 120 degrees, in radians. real angra ! Angle angm - anga. real angrb ! Angle angm - angb. real angrc ! Angle angm - angc. real bc ! Length of edge vector bc. real bcx ! Component x of edge vector bc. real bcy ! Component y of edge vector bc. real bcz ! Component z of edge vector bc. real ca ! Length of edge vector ca. real cax ! Component x of edge vector ca. real cay ! Component y of edge vector ca. real caz ! Component z of edge vector ca. real costha ! Cosine of angle at vertex a. real costhb ! Cosine of angle at vertex b. real costhc ! Cosine of angle at vertex c. real den ! Denominator sa*sb + sb*sc + sc*sa. real dena ! Denominator for finding sa. real denb ! Denominator for finding sb. real denc ! Denominator for finding sc. real fact ! Constant fact = 2.0 / sqrt (3.0). real pi ! Constant pi = 3.14159265358979323... c.... Intrinsic functions. intrinsic cos ! Cosine function. intrinsic sin ! Sine function. c=======================================================================******** cbugc***DEBUG begins. cbug 9901 format (/ 'aptsver finding triangle Steiner vertex.', cbug & ' tol=',1pe22.14 / cbug & ' ax,ay,az= ',1p3e22.14 / cbug & ' bx,by,bz= ',1p3e22.14 / cbug & ' cx,cy,cz= ',1p3e22.14 ) cbug write ( 3, 9901) tol, ax, ay, az, bx, by, bz, cx, cy, cz cbugc***DEBUG ends. c=======================================================================******** c.... Initialize. nerr = 0 c=======================================================================******** c.... Find the edge vectors of the triangle, "ab", "bc" and "ca", c.... and the edge lengths, ab, bc and ca. c.... Put the Steiner vertex at any edge of zero length. call aptvdis (ax, ay, az, bx, by, bz, 1, tol, & abx, aby, abz, ab, nerra) call aptvdis (bx, by, bz, cx, cy, cz, 1, tol, & bcx, bcy, bcz, bc, nerra) call aptvdis (cx, cy, cz, ax, ay, az, 1, tol, & cax, cay, caz, ca, nerra) if (ab .eq. 0.0) then ! Steiner vertex at vertex A = B. nerr = 1 sa = 0.0 sb = 0.0 sc = ca wa = 0.5 wb = 0.5 wc = 0.0 go to 150 endif if (bc .eq. 0.0) then ! Steiner vertex at vertex B = C. nerr = 1 sa = ab sb = 0.0 sc = 0.0 wa = 0.0 wb = 0.5 wc = 0.5 go to 150 endif if (ca .eq. 0.0) then ! Steiner vertex at vertex C = A. nerr = 1 sa = 0.0 sb = bc sc = 0.0 wa = 0.5 wb = 0.0 wc = 0.5 go to 150 endif c=======================================================================******** c.... Find the vertex angles. c.... Put the Steiner vertex at any triangle vertex of 120 degrees or more. pi = 3.14159265358979323 angm = 2.0 * pi / 3.0 ! 120 degrees. call aptvang (cax, cay, caz, abx, aby, abz, 1, tol, costha, nerra) anga = acos (-costha) if (abs (anga - angm) .le. tol * angm) anga = angm if (anga .ge. angm) then ! Steiner vertex at vertex A. nerr = 2 sa = 0.0 sb = ab sc = ca wa = 1.0 wb = 0.0 wc = 0.0 go to 150 endif call aptvang (abx, aby, abz, bcx, bcy, bcz, 1, tol, costhb, nerra) angb = acos (-costhb) if (abs (angb - angm) .le. tol * angm) angb = angm if (angb .ge. angm) then ! Steiner vertex at vertex B. nerr = 2 sa = ab sb = 0.0 sc = bc wa = 0.0 wb = 1.0 wc = 0.0 go to 150 endif call aptvang (bcx, bcy, bcz, cax, cay, caz, 1, tol, costhc, nerra) angc = acos (-costhc) if (abs (angc - angm) .le. tol * angm) angc = angm if (angc .ge. angm) then ! Steiner vertex at vertex C. nerr = 2 sa = ca sb = bc sc = 0.0 wa = 0.0 wb = 0.0 wc = 1.0 go to 150 endif c=======================================================================******** c.... Find the distances from the Steiner vertex to the triangle vertices. fact = 2.0 / sqrt (3.0) angra = angm - anga angrb = angm - angb angrc = angm - angc dena = sqrt (ca**2 + ab**2 + 2.0 * ca * ab * cos (angra)) denb = sqrt (ab**2 + bc**2 + 2.0 * ab * bc * cos (angrb)) denc = sqrt (bc**2 + ca**2 + 2.0 * bc * ca * cos (angrc)) sa = fact * ca * ab * sin (angra) / dena sb = fact * ab * bc * sin (angrb) / denb sc = fact * bc * ca * sin (angrc) / denc den = sa * sb + sb * sc + sc * sa wa = sb * sc / den wb = sc * sa / den wc = sa * sb / den c=======================================================================******** c.... Find the total length and the Steiner vertex. 150 sum = sa + sb + sc sx = wa * ax + wb * bx + wc * cx sy = wa * ay + wb * by + wc * cy sz = wa * az + wb * bz + wc * cz c=======================================================================******** 210 continue cbugc***DEBUG begins. cbug 9916 format (/ 'aptsver results. nerr = ',i2 / cbug & ' ab,bc,ca ',1p3e22.14 / cbug & '