function yval = spline_beta_val ( beta1, beta2, ndata, tdata, ydata, tval )

%*****************************************************************************80
%
%% spline_beta_val() evaluates a cubic beta spline approximant.
%
%  Discussion:
%
%    The cubic beta spline will approximate the data, but is not
%    designed to interpolate it.
%
%    If BETA1 = 1 and BETA2 = 0, the cubic beta spline will be the
%    same as the cubic B spline approximant.
%
%    With BETA1 = 1 and BETA2 large, the beta spline becomes more like
%    a linear spline.
%
%    In effect, two "phantom" data values are appended to the data,
%    so that the spline will interpolate the first and last data values.
%
%  Licensing:
%
%    This code is distributed under the MIT license.
%
%  Modified:
%
%    11 February 2004
%
%  Author:
%
%    John Burkardt
%
%  Input:
%
%    real BETA1, the skew or bias parameter.
%    BETA1 = 1 for no skew or bias.
%
%    real BETA2, the tension parameter.
%    BETA2 = 0 for no tension.
%
%    integer NDATA, the number of data values.
%
%    real TDATA(NDATA), the abscissas of the data.
%
%    real YDATA(NDATA), the data values.
%
%    real TVAL, a point at which the spline is to be evaluated.
%
%  Output:
%
%    real YVAL, the value of the function at TVAL.
%

%
%  Find the nearest interval [ TDATA(LEFT), TDATA(RIGHT) ] to TVAL.
%
  [ left, right ] = r8vec_bracket ( ndata, tdata, tval );
%
%  Evaluate the 5 nonzero beta spline basis functions in the interval,
%  weighted by their corresponding data values.
%
  u = ( tval - tdata(left) ) / ( tdata(right) - tdata(left) );

  delta = ( ( 2.0E+00   ...
    * beta1 + 4.0E+00 ) ...
    * beta1 + 4.0E+00 ) ...
    * beta1 + 2.0E+00 + beta2;

  yval = 0.0E+00;
%
%  Beta function associated with node LEFT - 1, (or "phantom node"),
%  evaluated in its 4th interval.
%
  bval = 2.0E+00 * ( beta1 * ( 1.0E+00 - u ) )^3  / delta;

  if ( 0 < left-1 )
    yval = yval + ydata(left-1) * bval;
  else
    yval = yval + ( 2.0E+00 * ydata(1) - ydata(2) ) * bval;
  end
%
%  Beta function associated with node LEFT,
%  evaluated in its third interval.
%
  a = beta2 + ( 4.0E+00 + 4.0E+00 * beta1 ) * beta1;

  b = - 6.0E+00 * beta1 * ( 1.0E+00 - beta1 ) * ( 1.0E+00 + beta1 );

  c = ( (     - 6.0E+00   ...
      * beta1 - 6.0E+00 ) ...
      * beta1 + 0.0E+00 ) ...
      * beta1 - 3.0E+00 * beta2;

  d = ( (     + 2.0E+00   ...
      * beta1 + 2.0E+00 ) ...
      * beta1 + 2.0E+00 ) ...
      * beta1 + 2.0E+00 * beta2;

  bval = ( a + u * ( b + u * ( c + u * d ) ) ) / delta;

  yval = yval + ydata(left) * bval;
%
%  Beta function associated with node RIGHT,
%  evaluated in its second interval.
%
  a = 2.0E+00;

  b = 6.0E+00 * beta1;

  c = 3.0E+00 * beta2 + 6.0E+00 * beta1 * beta1;

  d = - 2.0E+00 * ( 1.0E+00 + beta2 + beta1 + beta1 * beta1 );

  bval = ( a + u * ( b + u * ( c + u * d ) ) ) / delta;

  yval = yval + ydata(right) * bval;
%
%  Beta function associated with node RIGHT+1, (or "phantom node"),
%  evaluated in its first interval.
%
  bval = 2.0E+00 * u^3 / delta;

  if ( right+1 <= ndata )
    yval = yval + ydata(right+1) * bval;
  else
    yval = yval + ( 2.0E+00 * ydata(ndata) - ydata(ndata-1) ) * bval;
  end

  return
end
