subroutine aptqvac (au, av, bu, bv, cu, cv, du, dv, np, tol, nopt,
     &                    arpa, arpb, arpc, arpd, ntype, qu, qv, nerr)

ccbeg.
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c
c                             SUBROUTINE APTQVAC
c
c     call aptqvac (au, av, bu, bv, cu, cv, du, dv, np, tol, nopt,
c    &              arpa, arpb, arpc, arpd, ntype, qu, qv, nerr)
c
c     Version:  aptqvac  Updated    1990 November 29 15:30.
c               aptqvac  Originated 1990 February 8 14:00.
c
c     Author:   Arthur L. Edwards, LLNL, L-298, Telephone (925) 422-4123.
c
c
c     Purpose:  To find the shape and size of np quadrangles in the uv plane,
c               with vertices a = (au, av), b = (bu, bv), c = (cu, cv) and
c               d = (du, dv) counterclockwise around the quadrangle.
c               Optionally (nopt = 0 or 2), the vertex parallelogram areas arpa,
c               arpb, arpc and arpd will be returned, and (nopt = 1 or 2) the
c               number and location of any concave (negative area) vertices
c               will be returned, encoded in ntype, and if the quadrangle is a
c               bowtie, the intersection of the sides q = (qu, qv), will be
c               returned.  The net area of the quadrangle is
c                 0.25 * (arpa + arpb + arpc + arpd).
c               Flag nerr indicates any input error.
c
c     Input:    au, av, bu, bv, cu, cv, du, dv, np, tol, nopt.
c
c     Output:   arpa, arpb, arpc, arpd, ntype, qu, qv, nerr.
c
c     Calls: aptvdic, aptvaxc 
c               
c
c     Glossary:
c
c     arpa      Output   Parallelogram area at vertex "a" (nopt = 0 or 2).
c                          Size np.
c
c     arpb      Output   Parallelogram area at vertex "b" (nopt = 0 or 2).
c                          Size np.
c
c     arpc      Output   Parallelogram area at vertex "c" (nopt = 0 or 2).
c                          Size np.
c
c     arpd      Output   Parallelogram area at vertex "d" (nopt = 0 or 2).
c                          Size np.
c
c     au, av    Input    The u and v coordinates of vertex "a" of quadrangle.
c                          Size np.
c
c     bu, bv    Input    The u and v coordinates of vertex "b" of quadrangle.
c                          Size np.
c
c     cu, cv    Input    The u and v coordinates of vertex "c" of quadrangle.
c                          Size np.
c
c     du, dv    Input    The u and v coordinates of vertex "d" of quadrangle.
c                          Size np.
c
c     nerr      Output   Indicates an input error, if not 0.
c                          1 if np is not positive.
c                          2 if nopt is not 0, 1 or 2.
c
c     nopt      Input    Output option:
c                          0 or 2 to return vertex parallelogram areas.
c                          1 or 2 to return shape type code ntype.
c                          2 to return areas, ntype, and bowtie intersections.
c
c     np        Input    Size of arrays au, av, bu, bv, cu, cv, du, dv,
c                          and if nopt = 0 or 2, arpa, arpb, arpc and arpd,
c                          and if nopt = 1 or 2, ntype.
c
c     ntype     Output   Shape type of quadrangle (nopt = 1 or 2).  Size np.
c                           0 if all vertices are convex.  Regular.
c                          11 if only vertex "a" is concave.  Boomerang.
c                          12 if only vertex "b" is concave.  Boomerang.
c                          13 if only vertex "c" is concave.  Boomerang.
c                          14 if only vertex "d" is concave.  Boomerang.
c                          21 if only vertices "c" and "d" are concave.  Bowtie.
c                          22 if only vertices "d" and "a" are concave.  Bowtie.
c                          23 if only vertices "a" and "b" are concave.  Bowtie.
c                          24 if only vertices "b" and "c" are concave.  Bowtie.
c                          31 if only vertex "a" is convex.  Inverted boomerang.
c                          32 if only vertex "b" is convex.  Inverted boomerang.
c                          33 if only vertex "c" is convex.  Inverted boomerang.
c                          34 if only vertex "d" is convex.  Inverted boomerang.
c                          40 if all vertices are concave.  Inverted regular.
c
c     qu, qv    Output   The u and v coordinates of the intersection "q" of
c                          two opposite sides of a bowtied quadrangle.
c                          Returned only if nopt = 1 or 2, and ntype = 21
c                          to 24.  Size np, only if nopt = 1 or 2.
c
c     tol       Input    Numerical tolerance limit.  With 64-bit floating
c                          point numbers, 1.e-5 to 1.e-11 is recommended.
c
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccend.

c.... Dimensioned arguments.

c---- Parallelogram area at vertex "a".
      dimension arpa    (1)
c---- Parallelogram area at vertex "b".
      dimension arpb    (1)
c---- Parallelogram area at vertex "c".
      dimension arpc    (1)
c---- Parallelogram area at vertex "d".
      dimension arpd    (1)
c---- Coordinate u of vertex "a".
      dimension au      (1)
c---- Coordinate v of vertex "a".
      dimension av      (1)
c---- Coordinate u of vertex "b".
      dimension bu      (1)
c---- Coordinate v of vertex "b".
      dimension bv      (1)
c---- Coordinate u of vertex "c".
      dimension cu      (1)
c---- Coordinate v of vertex "c".
      dimension cv      (1)
c---- Coordinate u of vertex "d".
      dimension du      (1)
c---- Coordinate v of vertex "d".
      dimension dv      (1)
c---- Shape type number of quadrangle.
      dimension ntype   (1)
c---- Coordinate u of bowtie point "q".
      dimension qu      (1)
c---- Coordinate v of bowtie point "q".
      dimension qv      (1)

c.... Local variables.

c---- Magnitude of edge vector "ab".
      common /laptqvac/ ablen   (64)
c---- Component u of edge vector "ab".
      common /laptqvac/ abu     (64)
c---- Component v of edge vector "ab".
      common /laptqvac/ abv     (64)
c---- Parallelogram area at vertex "a".
      common /laptqvac/ arla    (64)
c---- Parallelogram area at vertex "b".
      common /laptqvac/ arlb    (64)
c---- Parallelogram area at vertex "c".
      common /laptqvac/ arlc    (64)
c---- Parallelogram area at vertex "d".
      common /laptqvac/ arld    (64)
c---- Magnitude of edge vector "bc".
      common /laptqvac/ bclen   (64)
c---- Component u of edge vector "bc".
      common /laptqvac/ bcu     (64)
c---- Component v of edge vector "bc".
      common /laptqvac/ bcv     (64)

c---- A very big number.
      common /laptqvac/ big

c---- Magnitude of edge vector "cd".
      common /laptqvac/ cdlen   (64)
c---- Component u of edge vector "cd".
      common /laptqvac/ cdu     (64)
c---- Component v of edge vector "cd".
      common /laptqvac/ cdv     (64)
c---- Magnitude of edge vector "da".
      common /laptqvac/ dalen   (64)
c---- Component u of edge vector "da".
      common /laptqvac/ dau     (64)
c---- Component v of edge vector "da".
      common /laptqvac/ dav     (64)
c---- Fractional distance along "ab" of "q".
      common /laptqvac/ fab
c---- Fractional distance along "bc" of "q".
      common /laptqvac/ fbc
c---- Fractional distance along "cd" of "q".
      common /laptqvac/ fcd
c---- Fractional distance along "da" of "q".
      common /laptqvac/ fda

c---- A very small number.
      common /laptqvac/ fuz

c---- Index in shpal array.
      common /laptqvac/ n
c---- First index of subset of data.
      common /laptqvac/ n1
c---- Last index of subset of data.
      common /laptqvac/ n2
c---- Index in external array.
      common /laptqvac/ nn
c---- 1 if ntype values not all zero.
      common /laptqvac/ nodd
c---- Size of current subset of data.
      common /laptqvac/ ns
c---- Component u of temporary bowtie point.
      common /laptqvac/ qabu
c---- Component v of temporary bowtie point.
      common /laptqvac/ qabv
c---- Component u of temporary bowtie point.
      common /laptqvac/ qbcu
c---- Component v of temporary bowtie point.
      common /laptqvac/ qbcv
c---- Component u of temporary bowtie point.
      common /laptqvac/ qcdu
c---- Component v of temporary bowtie point.
      common /laptqvac/ qcdv
c---- Component u of temporary bowtie point.
      common /laptqvac/ qdau
c---- Component v of temporary bowtie point.
      common /laptqvac/ qdav
cbugc***DEBUG begins.
cbugc---- 0 if all quadrangles are convex.
cbug      common /laptqvac/ noddt
cbug 9901 format (/ 'aptqvac finding quadrangle shapes.  nopt=',i3 /
cbug     &  (i3,' au=',1pe22.14,' av=',1pe22.14 /
cbug     &  '    bu=',1pe22.14,' bv=',1pe22.14 /
cbug     &  '    cu=',1pe22.14,' cv=',1pe22.14 /
cbug     &  '    du=',1pe22.14,' dv=',1pe22.14))
cbug      write (3, 9901) nopt, (n, au(n), av(n), bu(n), bv(n),
cbug     &  cu(n), cv(n), du(n), dv(n), n = 1, np)
cbug      noddt = 0
cbugc***DEBUG ends.

c.... initialize.

c---- A very big number.
      big = 1.e+99

c---- A very small number.
      fuz = 1.e-99

      nerr = 0

c.... Test for input errors.

      if (np .le. 0) then
        nerr = 1
        go to 210
      endif

      if ((nopt .lt. 0) .and. (nopt .gt. 2)) then
        nerr = 2
        go to 210
      endif

c.... Set up the indices of the first subset of data.

      n1 = 1
      n2 = min (np, 64)
  110 ns = n2 - n1 + 1

c.... Find the edge vectors.

      call aptvdic (au(n1), av(n1), bu(n1), bv(n1), ns, tol,
     &              abu, abv, ablen, nerr)
      call aptvdic (bu(n1), bv(n1), cu(n1), cv(n1), ns, tol,
     &              bcu, bcv, bclen, nerr)
      call aptvdic (cu(n1), cv(n1), du(n1), dv(n1), ns, tol,
     &              cdu, cdv, cdlen, nerr)
      call aptvdic (du(n1), dv(n1), au(n1), av(n1), ns, tol,
     &              dau, dav, dalen, nerr)

c.... Find the parallelogram areas at the vertices.  Positive if convex.

      call aptvaxc (dau, dav, abu, abv, ns, tol, arla, nerr)
      call aptvaxc (abu, abv, bcu, bcv, ns, tol, arlb, nerr)
      call aptvaxc (bcu, bcv, cdu, cdv, ns, tol, arlc, nerr)
      call aptvaxc (cdu, cdv, dau, dav, ns, tol, arld, nerr)

c.... See if the shape type code is to be returned.

c++++ Find ntype.
      if ((nopt .eq. 1) .or. (nopt .eq. 2)) then

c....   Find and identify all positive convex quadrangles.

c---- Loop over subset of data.
        do 120 n = 1, ns

          nn = n + n1 - 1

          if ((arla(n) .ge. 0.0) .and.
     &        (arlb(n) .ge. 0.0) .and.
     &        (arlc(n) .ge. 0.0) .and.
     &        (arld(n) .ge. 0.0)       ) then
            ntype(nn) = 0
          else
            ntype(nn) = 1
          endif

c---- End of loop over subset of data.
  120   continue

        nodd = 0

c---- Loop over subset of data.
        do 130 nn = n1, n2

          nodd = nodd + ntype(nn)

c---- End of loop over subset of data.
  130   continue
cbugc***DEBUG begins.
cbug      noddt = noddt + nodd
cbugc***DEBUG ends.

c....   Find and identify all other quadrangles.

c---- Odd shapes exist.
        if (nodd .gt. 0) then

c---- Loop over subset of data.
        do 140 n = 1, ns

          nn = n + n1 - 1

c....     Test for a convex quadrangle.

          if ((arla(n) .ge. 0.0) .and.
     &        (arlb(n) .ge. 0.0) .and.
     &        (arlc(n) .ge. 0.0) .and.
     &        (arld(n) .ge. 0.0)       ) then
            ntype(nn) = 0
          else
            ntype(nn) = -1
          endif

c....     Test for a boomerang (one concave vertex).

          if ((arla(n) .lt. 0.0) .and.
     &        (arlb(n) .ge. 0.0) .and.
     &        (arlc(n) .ge. 0.0) .and.
     &        (arld(n) .ge. 0.0)       ) then
            ntype(nn) = 11
          endif

          if ((arla(n) .ge. 0.0) .and.
     &        (arlb(n) .lt. 0.0) .and.
     &        (arlc(n) .ge. 0.0) .and.
     &        (arld(n) .ge. 0.0)       ) then
            ntype(nn) = 12
          endif

          if ((arla(n) .ge. 0.0) .and.
     &        (arlb(n) .ge. 0.0) .and.
     &        (arlc(n) .lt. 0.0) .and.
     &        (arld(n) .ge. 0.0)       ) then
            ntype(nn) = 13
          endif

          if ((arla(n) .ge. 0.0) .and.
     &        (arlb(n) .ge. 0.0) .and.
     &        (arlc(n) .ge. 0.0) .and.
     &        (arld(n) .lt. 0.0)       ) then
            ntype(nn) = 14
          endif

c....     Test for a bowtie (two concave vertices).

          if ((arla(n) .ge. 0.0) .and.
     &        (arlb(n) .ge. 0.0) .and.
     &        (arlc(n) .lt. 0.0) .and.
     &        (arld(n) .lt. 0.0)       ) then
            ntype(nn) = 21
          endif

          if ((arla(n) .lt. 0.0) .and.
     &        (arlb(n) .ge. 0.0) .and.
     &        (arlc(n) .ge. 0.0) .and.
     &        (arld(n) .lt. 0.0)       ) then
            ntype(nn) = 22
          endif

          if ((arla(n) .lt. 0.0) .and.
     &        (arlb(n) .lt. 0.0) .and.
     &        (arlc(n) .ge. 0.0) .and.
     &        (arld(n) .ge. 0.0)       ) then
            ntype(nn) = 23
          endif

          if ((arla(n) .ge. 0.0) .and.
     &        (arlb(n) .lt. 0.0) .and.
     &        (arlc(n) .lt. 0.0) .and.
     &        (arld(n) .ge. 0.0)       ) then
            ntype(nn) = 24
          endif

c....     Test for a negative boomerang (three concave vertices).

          if ((arla(n) .ge. 0.0) .and.
     &        (arlb(n) .lt. 0.0) .and.
     &        (arlc(n) .lt. 0.0) .and.
     &        (arld(n) .lt. 0.0)       ) then
            ntype(nn) = 31
          endif

          if ((arla(n) .lt. 0.0) .and.
     &        (arlb(n) .ge. 0.0) .and.
     &        (arlc(n) .lt. 0.0) .and.
     &        (arld(n) .lt. 0.0)       ) then
            ntype(nn) = 32
          endif

          if ((arla(n) .lt. 0.0) .and.
     &        (arlb(n) .lt. 0.0) .and.
     &        (arlc(n) .ge. 0.0) .and.
     &        (arld(n) .lt. 0.0)       ) then
            ntype(nn) = 33
          endif

          if ((arla(n) .lt. 0.0) .and.
     &        (arlb(n) .lt. 0.0) .and.
     &        (arlc(n) .lt. 0.0) .and.
     &        (arld(n) .ge. 0.0)       ) then
            ntype(nn) = 34
          endif

c....     Test for an inside-out convex quadrangle (four concave vertices).

          if ((arla(n) .lt. 0.0) .and.
     &        (arlb(n) .lt. 0.0) .and.
     &        (arlc(n) .lt. 0.0) .and.
     &        (arld(n) .lt. 0.0)       ) then
            ntype(nn) = 40
          endif

c---- End of loop over subset of data.
  140   continue

c---- Tested nodd.
      endif

c---- Tested nopt.
      endif

c.... See if the vertex parallelogram areas are to be returned.

c++++ Find parallelogram areas.
      if ((nopt .eq. 0) .or. (nopt .eq. 2)) then

c---- Loop over subset of data.
        do 150 n = 1, ns

          nn       = n + n1 - 1
          arpa(nn) = arla(n)
          arpb(nn) = arlb(n)
          arpc(nn) = arlc(n)
          arpd(nn) = arld(n)

c---- End of loop over subset of data.
  150   continue

c---- Tested nopt.
      endif

c.... See if the edge intersections of bowtied quadrangles are to be
c....   returned.

c++++ Find bowtie point.
      if ((nopt .eq. 2) .and. (nodd .gt. 0)) then

c---- Loop over subset of data.
        do 160 n = 1, ns

          nn  = n + n1 - 1
          fab = arld(n) / (arla(n) - arlb(n) + fuz)
          fbc = arla(n) / (arlb(n) - arlc(n) + fuz)
          fcd = arlb(n) / (arlc(n) - arld(n) + fuz)
          fda = arlc(n) / (arld(n) - arla(n) + fuz)

          qabu = au(nn) + fab * abu(n)
          qabv = av(nn) + fab * abv(n)
          qbcu = bu(nn) + fbc * bcu(n)
          qbcv = bv(nn) + fbc * bcv(n)
          qcdu = cu(nn) + fcd * cdu(n)
          qcdv = cv(nn) + fcd * cdv(n)
          qdau = du(nn) + fda * dau(n)
          qdav = dv(nn) + fda * dav(n)

          if (ntype(nn) .eq. 21) then
            qu(nn) = qbcu
            qv(nn) = qbcv
          else
            qu(nn) = -big
            qv(nn) = -big
          endif

          if (ntype(nn) .eq. 22) then
            qu(nn) = qcdu
            qv(nn) = qcdv
          endif

          if (ntype(nn) .eq. 23) then
            qu(nn) = qdau
            qv(nn) = qdav
          endif

          if (ntype(nn) .eq. 24) then
            qu(nn) = qabu
            qv(nn) = qabv
          endif

c---- End of loop over subset of data.
  160   continue

c---- Tested nopt and nodd.
      endif

c.... See if all data subsets are done.

c---- Do another subset of data.
      if (n2 .lt. np) then
        n1 = n2 + 1
        n2 = min (np, n1 + 63)
        go to 110
      endif
cbugc***DEBUG begins.
cbug 9902 format (/ 'aptqvac results.  noddt=',i3)
cbug 9903 format (i3,' arpa=',1pe22.14,' arpb=',1pe22.14 /
cbug     &  '    arpc=',1pe22.14,' arpd=',1pe22.14)
cbug 9904 format (i3,' ntype=',i3)
cbug 9905 format (i3,' arpa=',1pe22.14,' arpb=',1pe22.14 /
cbug     &  '    arpc=',1pe22.14,' arpd=',1pe22.14 /
cbug     &  '    qu=  ',1pe22.14,' qv=  ',1pe22.14,' ntype=',i3)
cbug      write ( 3, 9902) noddt
cbug      if (nopt .eq. 0) then
cbug        write ( 3, 9903) (n, arpa(n), arpb(n),
cbug     &  arpc(n), arpd(n), n = 1, np)
cbug      endif
cbug      if (nopt .eq. 1) then
cbug        write ( 3, 9904) (n, ntype(n), n = 1, np)
cbug      endif
cbug      if (nopt .eq. 2) then
cbug        write ( 3, 9905) (n, arpa(n), arpb(n),
cbug     &  arpc(n), arpd(n), qu(n), qv(n), ntype(n), n = 1, np)
cbug      endif
cbugc***DEBUG ends.

  210 return

c.... End of subroutine aptqvac.      (+1 line.)
      end

UCRL-WEB-209832