OUSPPS   

Equivalent PK functions: PK_BSURF_ask_splinewise

OUSPPS ( bs, pts, ncol, nrow, props, pdata, nprops, sense, ifail )
==================================================================

  Output B-surface as spline points

Receives:
  KI_tag_b_surface         *bs             --- B-surface

Returns:
  KI_tag_list_dbl          *pts            --- mesh of spline points
  KI_int_nitems            *ncol           --- number of columns of points
  KI_int_nitems            *nrow           --- number of rows of points
  KI_tag_list_int          *props          --- surface properties
  KI_tag_list_<list>       *pdata          --- list of data lists
  KI_int_nitems            *nprops         --- number of surface properties
  KI_cod_logical           *sense          --- surface sense
  KI_cod_error             *ifail          --- failure indicator

Specific errors:
  KI_bad_knots              surface has unsuitable knot vector
  KI_unsuitable_entity      more than one patch in linear or quadratic direction
                            order of surface is greater than four

Description:
  This function outputs a B-surface as spline points, boundary conditions and
  knot vectors. This constitutes sufficient information to recreate the surface
  (via CRSPPS).

  Restrictions
    . The surface must be bicubic (or lower degree), non-rational and have
      continuous first and second derivatives. If a surface is linear or
      quadratic the u direction then to satisfy these conditions it must
      consist of a single column of patches (similarly for v direction and rows
      of patches).
    . If the surface is periodic in a particular direction the corresponding
      knot vector must not contain any repeated knots.
    . If the surface is non-periodic in a particular direction the
      corresponding knot vector can only contain repeated knots at the start
      and end. Surfaces
    . Any surface created using CRSPPS and not subsequently modified will
      satisfy these conditions.

  Spline points 'pts', 'npts':
    The spline points are returned in the list of real data 'pts', in order
    along the rows, row by row. 'ncol' * 'nrow' points are returned. They
    correspond to corners of the patches in the surface.

  Surface properties 'props', 'pdata', 'nprops':
    The 'props' array contains 'nprops' tokens from the sequence PAPR00. A
    particular property may be associated with additional data; if so, this
    is returned in a list. The tag of the list is returned in the 'pdata' list,
    in the position corresponding to the token in 'props'.

    The table shows which tokens may be present, and the data associated with
    them. Some tokens are always present, whereas others are only present if the
    surface has a particular property.

    In explaining the various properties of splined surfaces the following
    notation is used

        o  bottom boundary  - first row of points
        o  top boundary     - last row of points
        o  left boundary    - first col of points
        o  right boundary   - last col of points


      token   |       meaning         |     real data     | always present?
      ---------------------------------------------------------------------
              |                       |                   |
      PAPRPU  |   rows are periodic   |       none        | NO - the default is
              |                       |                   |      non-periodic
              |                       |                   |
      PAPRPV  | columns are periodic  |       none        | NO - the default is
              |                       |                   |      non-periodic
              |                       |                   |
      PAPRCB  | derivatives returned  | 'ncol' derivative | present unless
              | at start of columns   |       vectors     | columns are periodic
              |  (clamped boundary    |                   |
              |      condition)       |                   |
              |                       |                   |
      PAPRCT  | derivatives returned  | 'ncol' derivative | present unless
              |   at end of columns   |       vectors     | columns are periodic
              |  (clamped boundary    |                   |
              |      condition)       |                   |
              |                       |                   |
      PAPRCL  | derivatives returned  | 'nrow' derivative | present unless
              |   at start of rows    |       vectors     | rows are periodic
              |  (clamped boundary    |                   |
              |      condition)       |                   |
              |                       |                   |
      PAPRCR  | derivatives returned  | 'nrow' derivative | present unless
              |    at end of rows     |       vectors     | rows are periodic
              |  (clamped boundary    |                   |
              |      condition)       |                   |
              |                       |                   |
      PAPRBL  |   bottom left twist   |   twist vector    | present unless rows
              |    vector returned    |                   | or cols are periodic
              |                       |                   |
      PAPRBR  |   bottom right twist  |   twist vector    | present unless rows
              |    vector returned    |                   | or cols are periodic
              |                       |                   |
      PAPRTL  |    top left twist     |   twist vector    | present unless rows
              |    vector returned    |                   | or cols are periodic
              |                       |                   |
      PAPRTR  |    top right twist    |   twist vector    | present unless rows
              |    vector returned    |                   | or cols are periodic
              |                       |                   |
      PAPRKU  |   knot vector in u    |   knot vector     |   YES
              |                       |                   |
      PAPRKV  |   knot vector in v    |   knot vector     |   YES
              |                       |                   |
      PAPRCU  |  surface is bicubic   |       none        |   NO
              |                       |                   |


  Boundary conditions PAPRPU, PAPRPV, PAPRCB, PAPRCT, PAPRCL, PAPRCR:
    Either clamped or periodic boundary conditions may be returned. These apply
    to u and v directions (rows and columns) independently. Clamped boundary
    conditions refer to either the start or end of the rows or columns.
    Periodic boundary conditions apply to both the start and end of rows or
    columns simultaneously.

  . Clamped boundary conditions return the first derivatives, with respect to a
    parameter varying between 0 and 1 over the first or last interval, across
    some boundary of the surface.  The derivatives are returned in a real list.

  . Periodic boundary conditions imply that the rows or columns are closed, so
    that the surface meets itself with continuity of tangent and curvature.

  Twist vectors PAPRBL, PAPRBR, PAPRTL, PAPRTR:
    A twist vector is a derivative with respect to both u and v; i.e. it
    is the rate of change of the u derivatives in the v direction, and also
    the rate of change of the v derivatives in the u direction (these two
    quantities are always equal). The twist vectors are returned at all four
    corners, but only if neither the rows nor the columns are periodic.

  Knot vector PAPRKU, PAPRKV:
    Knot vectors are always returned. They have the following properties:
    . The knot values form strictly increasing sequences.
    . If the rows are not periodic there will be 'ncol' knot values in the
      u knot vector.
    . If the rows are periodic there will be ('ncol'+1) knot values in the
      u knot vector.
    . If the columns are not periodic there will be 'nrow' knot values in
      the v knot vector.
    . If the columns are periodic there will be ('nrow'+1) knot values in
      the v knot vector.

  Bicubic surface PAPRCU:
    This token indicates that the surface is bicubic.

  Surface sense 'sense'
  . If 'sense' is KI_true the surface normal is given by the cross product of
    the first derivatives of the surface with respect the u and v parameters.
    i.e.
             normal = Pu X Pv

  . If 'sense' is KI_false the surface normal is in opposite to that described
    for 'sense' == KI_true.