PK_BSURF_splinewise_sf_t   


struct PK_BSURF_splinewise_sf_s
    {
    int                 u_degree;      --- The u degree = order -1
    int                 v_degree;      --- The u degree = order -1
    int                 n_u_positions; --- The number of positions in u
    int                 n_v_positions; --- The number of positions in v
    PK_VECTOR_t        *positions;     --- The positions
    PK_PARAM_end_t      u_end;         --- End condition at lower u
    PK_PARAM_end_t      v_end;         --- End condition at lower v
    PK_PARAM_end_t      U_end;         --- End condition at upper U
    PK_PARAM_end_t      V_end;         --- End condition at upper V
    PK_VECTOR_t        *u_derivs;      --- Derivatives at lower u
    PK_VECTOR_t        *v_derivs;      --- Derivatives at lower v
    PK_VECTOR_t        *U_derivs;      --- Derivatives at upper U
    PK_VECTOR_t        *V_derivs;      --- Derivatives at upper V
    PK_PARAM_knot_t     u_how_knot;    --- How u knot vector defined
    PK_PARAM_knot_t     v_how_knot;    --- How v knot vector defined
    double             *u_knot;        --- u Knot vector
    double             *v_knot;        --- v Knot vector
    PK_PARAM_twist_t    u_v;           --- how lower u lower v
                                       --- twist vector defined
    PK_PARAM_twist_t    u_V;           --- how lower u upper V
                                       --- twist vector defined
    PK_PARAM_twist_t    U_v;           --- how upper U lower v
                                       --- twist vector defined
    PK_PARAM_twist_t    U_V;           --- how upper U upper V
                                       --- twist vector defined
    PK_VECTOR_t         u_v_twist;     --- lower u lower v twist vector
    PK_VECTOR_t         u_V_twist;     --- lower u upper V twist vector
    PK_VECTOR_t         U_v_twist;     --- upper U lower v twist vector
    PK_VECTOR_t         U_V_twist;     --- upper U upper V twist vector
    };
typedef struct PK_BSURF_splinewise_sf_s PK_BSURF_splinewise_sf_t;


This structure is the splinewise standard form of a b-surface.


Specific Errors:
    PK_ERROR_incompatible_props     only one end is periodic or a periodic
                                    surface has coincident end points.
    PK_ERROR_bad_derivative         a derivative is too large
    PK_ERROR_insufficient_points    not enough spline points
    PK_ERROR_coincident_points      repeated spline points
    PK_ERROR_bad_position           a spline point is outside size box
    PK_ERROR_bad_knots              bad parameterisation
    PK_ERROR_repeated_knots         repeated knots
    PK_ERROR_wrong_number_knots     wrong number of knots


u_degree       surface degree in the u direction.
                 When the standard form is input to
                 Parasolid (PK_BSURF_create_splinewise), u_degree may only be
                 set to 3 to produce cubic curves or 0 in which case
                 Parasolid will select an appropriate degree.

v_degree       surface degree in the v direction.
                 When the standard form is input to
                 Parasolid (PK_BSURF_create_splinewise), v_degree may only be
                 set to 3 to produce cubic curves or 0 in which case
                 Parasolid will select an appropriate degree.

n_u_positions  number of positions in the u direction
                 If u_end is PK_PARAM_end_periodic_c then n_u_positions
                 must be at least 3, otherwise 'n_u_positions' must be at
                 least 2.

n_v_positions  number of positions in the v direction
                 If v_end is PK_PARAM_end_periodic_c then n_v_positions
                 must be at least 3, otherwise 'n_v_positions' must be at
                 least 2.

positions      array of positions.
                 positions are supplied in the order with u changing most
                 rapidly.
                 Positions consecutive in either the u or v direction mus not
                 coincide.
                 For a surface which is closed but not periodic in the u
                 direction, the start and end u positions must coincide.
                 For a surface which is closed but not periodic in the v
                 direction, the start and end v positions must coincide.
                 For a surface which is periodic in the u direction, the start
                 and end u positions must not coincide.
                 For a surface which is periodic in the v direction, the start
                 and end v positions must not coincide.

u_end          end condition at lower u.
                 If this is PK_PARAM_end_periodic_t then U_end must also be
                 PK_PARAM_end_periodic_t.
                 If this is PK_PARAM_end_clamped_vector_c then u_derivs
                  must be set to the u start derivatives.

v_end          end condition at lower v.
                 If this is PK_PARAM_end_periodic_t then V_end must also be
                 PK_PARAM_end_periodic_t.
                 If this is PK_PARAM_end_clamped_vector_c then v_derivs
                 must be set to the v start derivatives.

U_end          end condition at upper U.
                 If this is PK_PARAM_end_periodic_t then u_end must also be
                 PK_PARAM_end_periodic_t.
                 If this is PK_PARAM_end_clamped_vector_c then U_derivs
                 must be set to the U end derivatives.

V_end          end condition at upper V.
                 If this is PK_PARAM_end_periodic_t then v_end must also be
                 PK_PARAM_end_periodic_t.
                 If this is PK_PARAM_end_clamped_vector_c then V_derivs
                 must be set to the V end derivatives.

'u_derivs'       derivatives at lower u if u_end is
                 PK_PARAM_end_clamped_vector_c

'v_derivs'       derivatives at lower v if v_end is
                 PK_PARAM_end_clamped_vector_c

'U_derivs'       derivatives at upper U if U_end is
                 PK_PARAM_end_clamped_vector_c

'V_derivs'       derivatives at upper V if V_end is
                 PK_PARAM_end_clamped_vector_c

u_how_knot     how the u knot vector is defined

v_how_knot     how the v knot vector is defined

u_knot         if u_how_knot is PK_PARAM_knot_defined_c then u_knot is
                 the knot vector of length n_u_positions if the surface is
                 not periodic in the u direction, or n_u_positions + 1 if
                 the surface is periodic in the u direction.


v_knot         if v_how_knot is PK_PARAM_knot_defined_c then v_knot is
                 the knot vector of length n_v_positions if the surface is
                 not periodic in the v direction, or n_v_positions + 1 if
                 the surface is periodic in the v direction.

u_v            how twist vector defined at lower u lower v.

u_V            how twist vector defined at lower u upper V.

U_v            how twist vector defined at upper U lower v.

U_V            how twist vector defined at UPPER U upper V.

u_v_twist      if 'u_v' is PK_PARAM_twist_yes_c the u_v_twist is
                 the twist vector at lower u lower v.

u_V_twist      if 'u_V' is PK_PARAM_twist_yes_c the u_V_twist is
                 the twist vector at lower u upper V.

U_v_twist      if 'U_v' is PK_PARAM_twist_yes_c the U_v_twist is
                 the twist vector at upper U lower v.

U_V_twist      if 'U_V' is PK_PARAM_twist_yes_c the U_V_twist is
                 the twist vector at upper U upper V.