# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.

include <math/curfit.h>

$if (datatype == r)
include "curfitdef.h"
$else
include "dcurfitdef.h"
$endif

# CVSET -- Procedure to store the fit parameters derived from outside
# the CURFIT package inside the curve descriptor structure for use
# by the CVEVAL and CVVECTOR proocedures. The curve_type is one of
# LEGENDRE, CHEBYSHEV or SPLINE3. For the polynomials the number of
# coefficients is equal to one plus the order of the polynomial. In the
# case of the cubic spline the number of coefficients equals three plus
# the number of polynomial pieces. The polynomials are normalized over
# from xmin to xmax.

$if (datatype == r)
procedure cvset (cv, curve_type, xmin, xmax, coeff, ncoeff)
$else
procedure dcvset (cv, curve_type, xmin, xmax, coeff, ncoeff)
$endif

pointer	cv		# curve descriptor
int	curve_type	# the functional form of the curve
PIXEL	xmin		# the minimum x value
PIXEL	xmax		# the maximum x value
PIXEL	coeff[ncoeff]	# the coefficient array
int	ncoeff		# the number of coefficients

errchk	malloc

begin
	# allocate space for curve descriptor
	call malloc (cv, LEN_CVSTRUCT, TY_STRUCT)

	if (ncoeff < 1)
	    call error (0, "CVSET: Illegal number of coefficients.")

	if (xmin >= xmax)
	    call  error (0, "CVSET: xmax <= xmin.")

	# set curve_type dependent curve descriptor parameters
	switch (curve_type) {
	case CHEBYSHEV, LEGENDRE:
	    CV_ORDER(cv) = ncoeff
	    CV_NCOEFF(cv) = ncoeff
	    CV_RANGE(cv) = 2. / (xmax - xmin)
	    CV_MAXMIN(cv) = - (xmax + xmin) / 2.
	case SPLINE3:
	    CV_ORDER(cv) = SPLINE3_ORDER
	    CV_NCOEFF(cv) = ncoeff
	    CV_NPIECES(cv) = ncoeff - SPLINE3_ORDER
	    CV_SPACING(cv) = (CV_NPIECES(cv) + 1) / (xmax - xmin) 
	case SPLINE1:
	    CV_ORDER(cv) = SPLINE1_ORDER
	    CV_NCOEFF(cv) = ncoeff
	    CV_NPIECES(cv) = ncoeff - SPLINE1_ORDER
	    CV_SPACING(cv) = (CV_NPIECES(cv) + 1) / (xmax - xmin) 
	case USERFNC:
	    CV_ORDER(cv) = ncoeff
	    CV_NCOEFF(cv) = ncoeff
	    CV_RANGE(cv) = 2. / (xmax - xmin)
	    CV_MAXMIN(cv) = - (xmax + xmin) / 2.
	default:
	    call error (0, "CVSET: Unknown curve type.")
	}

	# set remaining curve parameters
	CV_TYPE(cv) = curve_type
	CV_XMIN(cv) = xmin
	CV_XMAX(cv) = xmax

	# allocate space for xbasis and coefficient arrays, set remaining
	# pointers to NULL

	$if (datatype == r)
	call malloc (CV_XBASIS(cv), CV_ORDER(cv), TY_REAL)
	call malloc (CV_COEFF(cv), CV_NCOEFF(cv), TY_REAL)
	$else
	call malloc (CV_XBASIS(cv), CV_ORDER(cv), TY_DOUBLE)
	call malloc (CV_COEFF(cv), CV_NCOEFF(cv), TY_DOUBLE)
	$endif

	CV_MATRIX(cv) = NULL
	CV_CHOFAC(cv) = NULL
	CV_VECTOR(cv) = NULL
	CV_BASIS(cv) = NULL
	CV_WY(cv) = NULL
	CV_LEFT(cv) = NULL

	CV_USERFNC(cv) = NULL

	# restore coefficients
	call amov$t (coeff, COEFF(CV_COEFF(cv)), CV_NCOEFF(cv))
end
