ENPOPS   

Equivalent PK functions: PK_SURF_eval
PK_SURF_eval_with_normal

ENPOPS ( surf, u, v, nudrvs, nvdrvs, nreq, p, norm, ifail )
===========================================================

  Evaluate point from surface parameters

    Can be called from the GO.

Receives:
  KI_tag_surface           *surf           --- surface
  KI_dbl                   *u              --- u parameter of required point
  KI_dbl                   *v              --- v parameter of required point
 <KI_int_nitems>           *nudrvs         --- number of derivs wrt u required
 <KI_int_nitems>           *nvdrvs         --- number of derivs wrt v required
  KI_cod_logical           *nreq           --- request for normal

Returns:
  KI_vec_derivatives        p[(nudrvs+1) * (nvdrvs+1)]
                                           --- point and derivatives
  KI_vec_normal             norm           --- surface normal
  KI_cod_error             *ifail          --- failure code

Specific errors:
  KI_at_singularity         failure to evaluate normal at singularity
  KI_bad_parameter          parameter out of range
  KI_too_many_derivatives   too many derivatives requested
  KI_invalid_geometry       surface not supported

Description:
  Calculates the Cartesian coordinates of the point at the given parameter
  values 'u' and 'v', and also the derivatives with respect to 'u' and 'v',
  up to order 'nudrvs' and 'nvdrvs' respectively. It also optionally
  calculates the surface normal. This normal will be parallel to the
  cross product of the derivative with respect to 'u' and the derivative
  with respect to 'v'. However, if the surface sense returned by OUTSUR is
  false, the sign of the normal will be reversed.
  The function works for any type of surface.

  Except for B_surfaces and their offsets, which can be evaluated out of range,
  if ENSUPA indicates that this surface is not periodic or infinite (in either
  u or v), then the corresponding parameter must be in the range specified in
  ENSUPA for this surface.

  Where derivative discontinuities occur at patch boundaries, the derivatives
  just after the discontinuity are returned.

  There is a limit on the number of derivatives which may be requested.

  In the case of foreign geometry surfaces (type TYSUFG), the maximum
  number of derivatives that can be returned by this function is determined
  by the surface's external evaluator. The evaluator should, at least, be
  able to calculate up to second order derivatives.

  The following table shows the derivatives that can be requested for other
  surface types.

                                u derivs

                        |   0   |   1   |   2   |  >2   |
                  --------------------------------------
                     0  |   A   |   A   |   B   |   D   |
                  --------------------------------------
       v derivs      1  |   A   |   A   |   C   |   D   |
                  --------------------------------------
                     2  |   B   |   C   |   E   |   D   |
                  --------------------------------------
                    >2  |   D   |   D   |   D   |   D   |
                  --------------------------------------

    A - All surface types.
    B - All surface types except blend surfaces.
    C - All surface types except blend and offset surfaces.
    D - B-Surfaces only.
    E - All surface types except blend surfaces.
            ENPOPS can be called with nudrvs = 2 and nvdrvs = 2 for offset
            surfaces, but only zeroth, first and second derivatives will be
            calculated. The uncalculated third and fourth derivatives will be
            returned in the derivative array as zero vectors.

  The return argument 'p' is a vector array returning the point and possibly
  derivatives. These are stored as follows:

      The point on the surface is the first vector in 'p' (i.e. vector 0)
      The i'th derivative ( i <= 'nudrvs' ) wrt u and
      the j'th derivative ( j <= 'nvdrvs' ) wrt v is vector
          ( i + ( 'nudrvs'+1 ) * j )    of 'p'.

  The return argument 'norm' contains the surface normal. The normal is only
  returned if 'nreq' is true. A value is returned even at a singular point
  of the surface, unlike ENPOGS. Note that a singular point has an ambiguous
  parametrisation, and different parameter pairs may give different normals,
  for the same point.