Isis 3 Developer Reference
Isis::NumericalAtmosApprox Class Reference

This class extends Isis::NumericalApproximation. More...

#include <NumericalAtmosApprox.h>

Inheritance diagram for Isis::NumericalAtmosApprox:
Inheritance graph
Collaboration diagram for Isis::NumericalAtmosApprox:
Collaboration graph

Public Types

enum  IntegFunc { OuterFunction, InnerFunction }
 This enum defines function to be integrated by Romberg's method. More...
 
enum  InterpType {
  Linear, Polynomial, PolynomialNeville, CubicNatural,
  CubicClamped, CubicNatPeriodic, CubicNeighborhood, CubicHermite,
  Akima, AkimaPeriodic
}
 This enum defines the types of interpolation supported in this class. More...
 
enum  ExtrapType { ThrowError, Extrapolate, NearestEndpoint }
 This enum defines the manner in which a value outside of the domain should be handled if passed to the Evaluate() method. More...
 

Public Member Functions

 NumericalAtmosApprox (const NumericalApproximation::InterpType &itype=CubicNatural)
 Uses Isis::NumericalApproximation constructor. More...
 
virtual ~NumericalAtmosApprox ()
 Empty destructor. More...
 
double RombergsMethod (AtmosModel *am, IntegFunc sub, double a, double b)
 This variation on the NumericalApproximation method integrates a specified AtmosModel function rather than an interpolated function based on a data set. More...
 
double RefineExtendedTrap (AtmosModel *am, IntegFunc sub, double a, double b, double s, unsigned int n)
 This variation on the NumericalApproximation method integrates a specified AtmosModel function rather than an interpolated function based on a data set. More...
 
string Name () const
 Get name of interpolating function assigned to object. More...
 
InterpType InterpolationType ()
 Returns the enumerated type of interpolation chosen. More...
 
int MinPoints ()
 Minimum number of points required by interpolating function. More...
 
int MinPoints (NumericalApproximation::InterpType itype)
 Minimum number of points required by interpolating function. More...
 
void AddData (const double x, const double y)
 Add a datapoint to the set. More...
 
void AddData (unsigned int n, double *x, double *y)
 Add set of points to the data set using pointer arrays. More...
 
void AddData (const vector< double > &x, const vector< double > &y)
 Add set of points to the data set using vectors. More...
 
void SetCubicClampedEndptDeriv (const double yp1, const double ypn)
 Sets the values for the first derivatives of the endpoints of the data set. More...
 
void AddCubicHermiteDeriv (unsigned int n, double *fprimeOfx)
 Adds values for the first derivatives of the data points. More...
 
void AddCubicHermiteDeriv (const vector< double > &fprimeOfx)
 Adds values for the first derivatives of the data points. More...
 
void AddCubicHermiteDeriv (const double fprimeOfx)
 Adds value of a first derivative of a data point. More...
 
double DomainMinimum ()
 Input data domain minimum value. More...
 
double DomainMaximum ()
 Input data domain maximum value. More...
 
bool Contains (double x)
 Returns whether the passed value is an element of the set of x-values in the data set. More...
 
unsigned int Size ()
 Returns the number of the coordinates added to the data set. More...
 
double Evaluate (const double a, const ExtrapType &etype=ThrowError)
 Calculates interpolated or extrapolated value of tabulated data set for given domain value. More...
 
vector< double > Evaluate (const vector< double > &a, const ExtrapType &etype=ThrowError)
 Calculates interpolated value for given set of domain values. More...
 
vector< double > PolynomialNevilleErrorEstimate ()
 Retrieves the error estimate for the Neville's polynomial interpolation type. More...
 
vector< double > CubicClampedSecondDerivatives ()
 Retrieves the second derivatives of the data set. More...
 
double EvaluateCubicHermiteFirstDeriv (const double a)
 Approximates the first derivative of the data set function evaluated at the given domain value for CubicHermite interpolation type. More...
 
double EvaluateCubicHermiteSecDeriv (const double a)
 Approximates the second derivative of the data set function evaluated at the given domain value for CubicHermite interpolation type. More...
 
double GslFirstDerivative (const double a)
 Approximates the first derivative of the data set function evaluated at the given domain value for GSL supported interpolation types. More...
 
double BackwardFirstDifference (const double a, const unsigned int n=3, const double h=0.1)
 Uses an n point backward first difference formula to approximate the first derivative evaluated at a given domain value. More...
 
double ForwardFirstDifference (const double a, const unsigned int n=3, const double h=0.1)
 Uses an n point forward first difference formula to approximate the first derivative evaluated at a given domain value. More...
 
double CenterFirstDifference (const double a, const unsigned int n=5, const double h=0.1)
 Uses an n point center first difference formula to approximate the first derivative evaluated at a given domain value. More...
 
double GslSecondDerivative (const double a)
 Approximates the second derivative of the interpolated data set function evaluated at the given domain value for GSL supported interpolation types. More...
 
double BackwardSecondDifference (const double a, const unsigned int n=3, const double h=0.1)
 Uses an n point backward second difference formula to approximate the second derivative evaluated at a given domain value. More...
 
double ForwardSecondDifference (const double a, const unsigned int n=3, const double h=0.1)
 Uses an n point forward second difference formula to approximate the second derivative evaluated at a given domain value. More...
 
double CenterSecondDifference (const double a, const unsigned int n=5, const double h=0.1)
 Uses an n point center second difference formula to approximate the second derivative evaluated at a given domain value. More...
 
double GslIntegral (const double a, const double b)
 Approximates the integral of the data set function evaluated on the given interval for GSL supported interpolation types. More...
 
double TrapezoidalRule (const double a, const double b)
 Uses the trapezoidal rule to approximate the integral of the interpolated data set function on the interval (a, b). More...
 
double Simpsons3PointRule (const double a, const double b)
 Uses Simpson's 3-point rule to approximate the integral of the interpolated data set function on the interval (a,b). More...
 
double Simpsons4PointRule (const double a, const double b)
 Uses Simpson's 4-point rule to approximate the integral of the interpolated data set function on the interval (a,b). More...
 
double BoolesRule (const double a, const double b)
 Uses Boole's Rule to approximate the integral of the interpolated data set function on the interval (a,b). More...
 
double RefineExtendedTrap (double a, double b, double s, unsigned int n)
 Calculates refinements extended trapezoidal rule to approximate the integral of the interpolated data set function on the interval (a,b). More...
 
double RombergsMethod (double a, double b)
 Uses Romberg's method to approximate the integral of the interpolated data set function on the interval (a,b). More...
 
void Reset ()
 Resets the state of the object. More...
 
void Reset (NumericalApproximation::InterpType itype)
 Resets the state of the object and resets interpolation type. More...
 
void SetInterpType (NumericalApproximation::InterpType itype)
 Sets interpolation type. More...
 

Static Public Member Functions

static double OutrFunc2Bint (AtmosModel *am, double phi)
 This function is the outer integrand over mu at specified phi. More...
 
static double InrFunc2Bint (AtmosModel *am, double mu)
 Inner function to be integrated. More...
 

Protected Types

typedef const gsl_interp_type * InterpFunctor
 GSL Interpolation specs. More...
 
typedef map< InterpType, InterpFunctorFunctorList
 Set up a std::map of GSL interpolator functors. List of function types. More...
 
typedef FunctorList::const_iterator FunctorConstIter
 GSL Iterator. More...
 

Protected Member Functions

void Init (NumericalApproximation::InterpType itype)
 Initializes the object upon instantiation. More...
 
bool GslInterpType (NumericalApproximation::InterpType itype) const
 Returns whether an interpolation type is adapted from the GSL library. More...
 
void GslAllocation (unsigned int npoints)
 Allocates GSL interpolation functions. More...
 
void GslDeallocation ()
 Deallocate GSL interpolator resources, if used. More...
 
InterpFunctor GslFunctor (NumericalApproximation::InterpType itype) const
 Search for a GSL interpolation function. More...
 
void GslIntegrityCheck (int gsl_status, const char *src, int line)
 Checks the status of the GSL interpolation operations. More...
 
void ValidateDataSet ()
 Validates the data set before computing interpolation. More...
 
bool InsideDomain (const double a)
 Returns whether the passed value is greater than or equal to the domain minimum and less than or equal to the domain maximum. More...
 
bool GslComputed () const
 Returns whether a GSL interpolation computation of the data set has been performed. More...
 
void ComputeGsl ()
 Computes the GSL interpolation for a set of (x,y) data points. More...
 
void ComputeCubicClamped ()
 Computes the cubic clamped interpolation for a set of (x,y) data points, given the first derivatives of the endpoints of the data set. More...
 
double ValueToExtrapolate (const double a, const ExtrapType &etype)
 Returns the domain value at which to evaluate. More...
 
double EvaluateCubicNeighborhood (const double a)
 Performs cubic spline interpolation for a neighborhood about a. More...
 
vector< double > EvaluateCubicNeighborhood (const vector< double > &a, const ExtrapType &etype)
 Performs cubic spline interpolations for neighborhoods about each value of a. More...
 
double EvaluateCubicClamped (const double a)
 Performs cubic spline interpolation with clamped boundary conditions, if possible. More...
 
double EvaluateCubicHermite (const double a)
 Performs interpolation using the Hermite cubic polynomial. More...
 
double EvaluatePolynomialNeville (const double a)
 Performs polynomial interpolation using Neville's algorithm. More...
 
vector< double > EvaluateForIntegration (const double a, const double b, const unsigned int n)
 Evaluates data set in order to have enough data points to approximate the function to be integrated. More...
 
int FindIntervalLowerIndex (const double a)
 Find the index of the x-value in the data set that is just below the input value, a. More...
 
void ReportException (IException::ErrorType type, const string &method, const string &message, const char *filesrc, int lineno) const
 Generalized error report generator. More...
 

Protected Attributes

InterpType p_itype
 Interpolation type. More...
 
vector< double > p_x
 List of X values. More...
 
vector< double > p_y
 List of Y values. More...
 
bool p_dataValidated
 Flag variable to determine whether ValidateDataSet() has been called. More...
 
gsl_interp_accel * p_acc
 Lookup accelorator. More...
 
gsl_spline * p_interp
 Currently active interpolator. More...
 
bool p_clampedEndptsSet
 Flag variable to determine whether SetCubicClampedEndptDeriv() has been called after all data was added for CubicClamped interpolation. More...
 
bool p_clampedComputed
 Flag variable to determine whether ComputeCubicClamped() has been called. More...
 
double p_clampedDerivFirstPt
 First derivative of first x-value, p_x[0]. This is only used for the CubicClamped interpolation type. More...
 
double p_clampedDerivLastPt
 First derivative of last x-value, p_x[n-1]. This is only used for the CubicClamped interpolation type. More...
 
vector< double > p_clampedSecondDerivs
 List of second derivatives evaluated at p_x values. This is only used for the CubicClamped interpolation type. More...
 
vector< double > p_polyNevError
 Estimate of error for interpolation evaluated at x. This is only used for the PolynomialNeville interpolation type. 91 taken from AtmosModel. More...
 
vector< double > p_fprimeOfx
 List of first derivatives corresponding to each x value in the data set (i.e. each value in p_x) More...
 

Static Protected Attributes

static FunctorList p_interpFunctors
 Maintains list of interpolator options. More...
 

Detailed Description

This class extends Isis::NumericalApproximation.

It was created to handle numerical integration methods for specific atmospheric functions in the Isis::AtmosModel class. Rather than using a data set to interpolate a function, these methods can take in a pointer to an AtmosModel object and an enumerated value for the specific function that needs to be integrated.


Author
2008-11-05 Jeannie Walldren

Member Typedef Documentation

◆ FunctorConstIter

typedef FunctorList::const_iterator Isis::NumericalApproximation::FunctorConstIter
protectedinherited

GSL Iterator.

◆ FunctorList

Set up a std::map of GSL interpolator functors. List of function types.

◆ InterpFunctor

typedef const gsl_interp_type* Isis::NumericalApproximation::InterpFunctor
protectedinherited

GSL Interpolation specs.

Member Enumeration Documentation

◆ ExtrapType

This enum defines the manner in which a value outside of the domain should be handled if passed to the Evaluate() method.

Enumerator
ThrowError 

Evaluate() throws an error if a is outside of the domain.

Extrapolate 

Evaluate() attempts to extrapolate if a is outside of the domain. This is only valid for NumericalApproximation::InterpType CubicClamped or PolynomialNeville and the result will be accurate only if sufficiently close to the domain boundary.

NearestEndpoint 

Evaluate() returns the y-value of the nearest endpoint if a is outside of the domain.

◆ IntegFunc

This enum defines function to be integrated by Romberg's method.

Enumerator
OuterFunction 

Indicates that Romberg's method will integrate the function OutrFunc2Bint()

InnerFunction 

Indicates that Romberg's method will integrate the function InrFunc2Bint()

◆ InterpType

This enum defines the types of interpolation supported in this class.

Enumerator
Linear 

Linear interpolation.

Polynomial 

Polynomial interpolation.

PolynomialNeville 

Polynomial interpolation using Neville's algorithm.

CubicNatural 

Cubic Spline interpolation with natural boundary conditions.

CubicClamped 

Cubic Spline interpolation with clamped boundary conditions.

CubicNatPeriodic 

Cubic Spline interpolation with periodic boundary conditions.

CubicNeighborhood 

Cubic Spline interpolation using 4-pt Neighborhoods with natural boundary conditions.

CubicHermite 

Cubic Spline interpolation using the Hermite cubic polynomial.

Akima 

Non-rounded Akima Spline interpolation with natural boundary conditions.

AkimaPeriodic 

Non-rounded Akima Spline interpolation with periodic boundary conditions.

Constructor & Destructor Documentation

◆ NumericalAtmosApprox()

Isis::NumericalAtmosApprox::NumericalAtmosApprox ( const NumericalApproximation::InterpType itype = CubicNatural)
inline

Uses Isis::NumericalApproximation constructor.

◆ ~NumericalAtmosApprox()

virtual Isis::NumericalAtmosApprox::~NumericalAtmosApprox ( )
inlinevirtual

Empty destructor.

Member Function Documentation

◆ AddCubicHermiteDeriv() [1/3]

void Isis::NumericalApproximation::AddCubicHermiteDeriv ( unsigned int  n,
double *  fprimeOfx 
)
inherited

Adds values for the first derivatives of the data points.

This method can only be called for cubic Hermite splines, i.e. if NumericalApproximation::InterpType is CubicHermite. These values should be entered in the order of the corresponding data points.

Parameters
nNumber of derivative values to be added.
fprimeOfxArray of derivative values to be added.
Exceptions
Isis::IException::Programmer"Method only used for cspline-Hermite interpolation type"

References _FILEINFO_.

Referenced by Isis::SpicePosition::HermiteIndices(), and Isis::SpicePosition::SetEphemerisTimeHermiteCache().

◆ AddCubicHermiteDeriv() [2/3]

void Isis::NumericalApproximation::AddCubicHermiteDeriv ( const vector< double > &  fprimeOfx)
inherited

Adds values for the first derivatives of the data points.

This method can only be called for cubic Hermite splines, i.e. if NumericalApproximation::InterpType is CubicHermite. These values should be entered in the order of the corresponding data points.

Parameters
fprimeOfxVector of derivative values to be added.
Exceptions
Isis::IException::Programmer"Method only used for cspline-Hermite interpolation type"

References _FILEINFO_.

◆ AddCubicHermiteDeriv() [3/3]

void Isis::NumericalApproximation::AddCubicHermiteDeriv ( const double  fprimeOfx)
inherited

Adds value of a first derivative of a data point.

This method can only be called for cubic Hermite splines, i.e. if NumericalApproximation::InterpType is CubicHermite. Values should be entered in the order of the corresponding data points.

Parameters
fprimeOfxDerivative value to be added.
Exceptions
Isis::IException::Programmer"Method only used for cspline-Hermite interpolation type"

References _FILEINFO_.

◆ AddData() [1/3]

void Isis::NumericalApproximation::AddData ( const double  x,
const double  y 
)
inherited

Add a datapoint to the set.

This method allows the user to add a point to the set of data in preparation for interpolation over an interval.

Note: All data sets must have unique x values. If the interpolation type is not PolynomialNeville, x values must be sorted in ascending order. If CubicNatPeriodic interpolation type is used, the first and last points added to the data set must have the same y value.

Parameters
xDomain value to add to data set
yRange value corresponding to domain value x

Referenced by Isis::NumericalApproximation::EvaluateCubicNeighborhood(), Isis::SpicePosition::HermiteIndices(), Isis::LunarLambertEmpirical::LunarLambertEmpirical(), Isis::MinnaertEmpirical::MinnaertEmpirical(), Isis::rebin(), RombergsMethod(), Isis::NumericalApproximation::RombergsMethod(), and Isis::SpicePosition::SetEphemerisTimeHermiteCache().

◆ AddData() [2/3]

void Isis::NumericalApproximation::AddData ( unsigned int  n,
double *  x,
double *  y 
)
inherited

Add set of points to the data set using pointer arrays.

This method allows the user to add a set of points to the set of data in preparation for interpolation over an interval. This method does not overwrite previously added data. Rather, it adds the new data to the end of the existing data set.

Note: Behavior is undefined if the domain is not sorted in ascending or descending order.

Parameters
nNumber of data points to be used.
xArray of domain values to add to data set
yArray of range values corresponding to each domain value in x

◆ AddData() [3/3]

void Isis::NumericalApproximation::AddData ( const vector< double > &  x,
const vector< double > &  y 
)
inherited

Add set of points to the data set using vectors.

This method allows the user to add a set of points to the set of data in preparation for interpolation over an interval. This method does not overwrite previously added data. Rather, it adds the new data to the end of the existing data set.

Note: Behavior is undefined if the domain is not sorted in ascending or descending order.

Parameters
xVector of domain values to add to data set
yVector of range values corresponding to each domain value in x
Exceptions
Isis::IException::Programmer"Invalid arguments. The number of x-values does not equal the number of y-values."

References _FILEINFO_.

◆ BackwardFirstDifference()

double Isis::NumericalApproximation::BackwardFirstDifference ( const double  a,
const unsigned int  n = 3,
const double  h = 0.1 
)
inherited

Uses an n point backward first difference formula to approximate the first derivative evaluated at a given domain value.

This method uses backward first difference formulas to return an approximation of the first derivative of the interpolated data set function evaluated at given a valid domain value, a. Backward difference formulas use n points, with the largest x value at a, for numerical differentiation approximation. This method uses one of the following formulas:

  • 2-point backward difference.

    \[ f\prime(a) \approx \frac{1}{h}[f(a) - f(a - h)] \]

  • 3-point backward difference.

    \[ f\prime(a) \approx \frac{1}{2h}[3f(a) - 4f(a - h) + f(a - 2h)] \]

Parameters
aDomain value at which first deriviative is evaluated.
nThe number of points used in the formula
hDistance between nearest points in the formula
Returns
double First derivative approximation for the given domain value
Exceptions
Isis::IException::Programmer"Invalid argument. Value entered is outside of domain."
Isis::IException::Programmer"Formula steps outside of domain." If a-(n-1)h is less than domain min.
Isis::IException::Programmer"Invalid argument. There is no n-point backward difference formula in use." @throws Isis::IException::Programmer "Unable to calculate backward first difference for given (a,n,h)"

References _FILEINFO_, and Isis::IException::errorType().

◆ BackwardSecondDifference()

double Isis::NumericalApproximation::BackwardSecondDifference ( const double  a,
const unsigned int  n = 3,
const double  h = 0.1 
)
inherited

Uses an n point backward second difference formula to approximate the second derivative evaluated at a given domain value.

This method uses backward second difference formulas to return an approximation of the second derivative of the interpolated data set function evaluated at given a valid domain value, a. Backward second difference formulas use n points, with the largest x value at a, for numerical differentiation approximation. This method uses the following formula:

  • 3-point backward second difference.

    \[ f\prime\prime(a) \approx \frac{1}{h^2}[f(a) - 2f(a - h) + f(a - 2h)] \]

Parameters
aDomain value at which second deriviative is evaluated.
nThe number of points used in the formula.
hDistance between nearest points in the formula.
Returns
double Second derivative approximation for the given domain value
Exceptions
Isis::IException::Programmer"Invalid argument. Value entered is outside of domain."
Isis::IException::Programmer"Formula steps outside of domain." If a-(n-1)h is less than domain min.
Isis::IException::Programmer"Invalid argument. There is no n-point backward difference formula in use."
Isis::IException::Programmer

References _FILEINFO_, and Isis::IException::errorType().

◆ BoolesRule()

double Isis::NumericalApproximation::BoolesRule ( const double  a,
const double  b 
)
inherited

Uses Boole's Rule to approximate the integral of the interpolated data set function on the interval (a,b).

The Boole's Rule for integration approximation uses a 5-point Newton-Cote formula. This rule states:

\[ \int_{a}^b f(x)dx \approx \frac{2h}{45}[7f(a) + 32f(a+h) + 12f(a+2h) + 32f(a+3h) + 7f(a+4h)] \]

where h = (b - a)/4.

This method uses a composite, or extended, Boole's rule formula to approximate the integral.

Note: The method uses an algorithm that is adapted from the IDL function int_tabulated.pro.

Parameters
aLower bound of interval.
bUpper bound of interval.
Returns
double Approximate integral of data set function from a to b.
Exceptions
Isis::IException::Programmer"Unable to calculate the integral on the interval (a,b) using Boole's rule"

References _FILEINFO_, and Isis::IException::errorType().

◆ CenterFirstDifference()

double Isis::NumericalApproximation::CenterFirstDifference ( const double  a,
const unsigned int  n = 5,
const double  h = 0.1 
)
inherited

Uses an n point center first difference formula to approximate the first derivative evaluated at a given domain value.

This method uses center first difference formulas to return an approximation of the first derivative of the interpolated data set function evaluated at given a valid domain value, a. Center difference formulas use n points, centered at a, for numerical differentiation approximation. This method uses one of the following formulas:

  • 3-point center difference.

    \[ f\prime(a) \approx \frac{1}{2h}[f(a + h) - f(a - h)] \]

  • 5-point center difference.

    \[ f\prime(a) \approx \frac{1}{12h}[-f(a + 2h) + 8f(a +h) - 8f(a - h) + f(a - 2h)] \]

Parameters
aDomain value at which first deriviative is evaluated.
nThe number of points used in the formula.
hDistance between nearest points in the formula.
Returns
double First derivative approximation for the given domain value
Exceptions
Isis::IException::Programmer"Invalid argument. Value entered is outside of domain."
Isis::IException::Programmer"Formula steps outside of domain." If a+(n-1)h is greater than domain max or a-(n-1)h is less than domain min.
Isis::IException::Programmer"Invalid argument. There is no n-point center difference formula in use."
Isis::IException::Programmer"Unable to calculate center first difference for (a,n,h)"

References _FILEINFO_, and Isis::IException::errorType().

◆ CenterSecondDifference()

double Isis::NumericalApproximation::CenterSecondDifference ( const double  a,
const unsigned int  n = 5,
const double  h = 0.1 
)
inherited

Uses an n point center second difference formula to approximate the second derivative evaluated at a given domain value.

This method uses center second difference formulas to return an approximation of the second derivative of the interpolated data set function evaluated at given a valid domain value, a. Center second difference formulas use n points, centered at a, for numerical differentiation approximation. This method uses one of the following formulas:

  • 3-point center second difference.

    \[ f\prime\prime(a) \approx \frac{1}{h^2}[f(a + h) - 2f(a) + f(a - h)] \]

  • 5-point center second difference.

    \[ f\prime\prime(a) \approx \frac{1}{12h^2}[-f(a + 2h) + 16f(a +h) - 30f(a) + 16f(a - h) - f(a - 2h)] \]

Parameters
aDomain value at which second deriviative is evaluated.
nThe number of points used in the formula.
hDistance between nearest points in the formula.
Returns
double Second derivative approximation for the given domain value
Exceptions
Isis::IException::Programmer"Invalid argument. Value entered is outside of domain."
Isis::IException::Programmer"Formula steps outside of domain." If a+(n-1)h is greater than domain max or a-(n-1)h is less than domain min.
Isis::IException::Programmer"Invalid argument. There is no n-point center difference formula in use."
Isis::IException::Programmer"Unable to calculate center second difference for (a,n,h)"

References _FILEINFO_, and Isis::IException::errorType().

◆ ComputeCubicClamped()

void Isis::NumericalApproximation::ComputeCubicClamped ( )
protectedinherited

Computes the cubic clamped interpolation for a set of (x,y) data points, given the first derivatives of the endpoints of the data set.

This protected method is called only if the object is assigned a cubic clamped interpolation type and if it has not already been computed for the given data set. It calculates the second derivatives for each p_x value of the known data set and stores these values in p_clampedSecondDerivs so that the EvaluateCubicClamped() method may be called to interpolate the set using clamped boundary conditions, if possible. This method must be called when all the data points have been added to the object for the data set and after SetCubicClampedEndptDeriv() has been called. If the endpoint derivatives are greater than or equal to 1 x 1030, the routine is signaled to set the corresponding boundary condition for a natural spline, with zero second derivative on that boundary.

Exceptions
Issis::IException::Programmer"Must use SetCubicClampedEndptDeriv() before computing cubic spline with clamped boundary" @throws Issis::IException::Programmer "Unable to compute cubic clamped interpolation"
See also
SetCubicClampedEndptDeriv()
EvaluateCubicClamped()

References _FILEINFO_, and Isis::IException::errorType().

◆ ComputeGsl()

void Isis::NumericalApproximation::ComputeGsl ( )
protectedinherited

Computes the GSL interpolation for a set of (x,y) data points.

This protected method is called only if the object is assigned a GSL interpolation type and if it has not already been computed on the given data set. It will compute the interval of interpolated range values over the given domain. A copy of this data is maintained in the object so the data points do not need to be interpolated on each evaluation of a point unless the data set changes.

Exceptions
Isis::IException::Programmer"Unable to compute GSL interpolation"

References _FILEINFO_, and Isis::IException::errorType().

◆ Contains()

bool Isis::NumericalApproximation::Contains ( double  x)
inherited

Returns whether the passed value is an element of the set of x-values in the data set.

This method uses a binary search of the set of x-values to determine whether the input is contained in this set.

Parameters
xValue to search for in the data set.
Returns
bool Whether the passed value is contained in the x-values of the data set.

◆ CubicClampedSecondDerivatives()

vector< double > Isis::NumericalApproximation::CubicClampedSecondDerivatives ( )
inherited

Retrieves the second derivatives of the data set.

This method returns a vector of the same size as the data set. Each component is the second derivative of the corresponding p_x value , as estimated by the ComputeCubicClamped() method.

Returns
vector <double> List of second derivatives for each p_x value in the data set.
Exceptions
Isis::IException::Programmer"Method only used for cspline-clamped interpolation type"
Isis::IException::Programmer"Unable to calculate the second derivatives of the data set for a clamped cubic spline."
See also
ComputeCubicClamped()

References _FILEINFO_, and Isis::IException::errorType().

◆ DomainMaximum()

double Isis::NumericalApproximation::DomainMaximum ( )
inherited

Input data domain maximum value.

This method validates the data set for the assigned interpolation type and returns the largest value in p_x of the data set.

Returns
double Maximum domain value
Exceptions
Isis::IException::Programmer"Unable to calculate the domain minimum for the data set."

References _FILEINFO_, and Isis::IException::errorType().

◆ DomainMinimum()

double Isis::NumericalApproximation::DomainMinimum ( )
inherited

Input data domain minimum value.

This method validates the data set for the assigned interpolation type and returns the smallest value in p_x of the data set.

Returns
double Minimum domain value
Exceptions
Isis::IException::Programmer"Unable to calculate the domain maximum for the data set."

References _FILEINFO_, and Isis::IException::errorType().

◆ Evaluate() [1/2]

double Isis::NumericalApproximation::Evaluate ( const double  a,
const ExtrapType etype = ThrowError 
)
inherited

Calculates interpolated or extrapolated value of tabulated data set for given domain value.

This method returns the approximate value for f(a), where a is an element near the domain and f is the approximated function for the given data set. If the given value, a, falls outside of the domain, then the extrapoltion type is examined to determine the result. CubicNeighborhood and GSL interpolation types can not extrapolate, so the user must choose to throw an error or return f evaluated at the nearest domain boundary. CubicClamped, CubicHermite, and PolynomialNeville interpolation types can extrapolate a value with accuracy only if a is near enough to the domain boundary. Default NumericalApproximation::ExtrapType is ThrowError.

Parameters
aDomain value from which to interpolate a corresponding range value
etypeNumericalApproximation::ExtrapType enum value indicates how to evaluate if a falls outside of the domain. (Default: ThrowError)
Returns
double Range value interpolated or extrapolated for the given domain value
Exceptions
Isis::IException::Programmer"Unable to evaluate the function at the point a"

References _FILEINFO_, and Isis::IException::errorType().

Referenced by Isis::HapkeAtm1::AtmosModelAlgorithm(), Isis::HapkeAtm2::AtmosModelAlgorithm(), Isis::NumericalApproximation::EvaluateCubicNeighborhood(), Isis::SpicePosition::HermiteIndices(), Isis::LunarLambertEmpirical::PhotoModelAlgorithm(), Isis::MinnaertEmpirical::PhotoModelAlgorithm(), Isis::rebin(), RombergsMethod(), Isis::NumericalApproximation::RombergsMethod(), and Isis::SpicePosition::SetEphemerisTimeHermiteCache().

◆ Evaluate() [2/2]

vector< double > Isis::NumericalApproximation::Evaluate ( const vector< double > &  a,
const ExtrapType etype = ThrowError 
)
inherited

Calculates interpolated value for given set of domain values.

This method returns the approximate values for f(ai), where ai is an element in the domain and f is the interpolated function for the given data set. If any of the given values in a fall outside of the domain, then the extrapoltion type is examined to determine the result. CubicNeighborhood and GSL interpolation types can not extrapolate, so the user must choose to throw an error or return f evaluated at the nearest domain boundary. CubicClamped and PolynomialNeville interpolation types can extrapolate a value with accuracy only if ai is near enough to the domain boundary.

Parameters
aVector of domain values from which to interpolate a vector of corresponding range values
etypeNumericalApproximation::ExtrapType enum value indicates how to evaluate any value of a that falls outside of the domain. (Default: ThrowError)
Returns
vector <double> Set of interpolated range values corresponding to the elements of the vector of domain values given
Exceptions
Isis::IException::Programmer"Unable to evaluate the function at the vector of points, a."

References _FILEINFO_, and Isis::IException::errorType().

◆ EvaluateCubicClamped()

double Isis::NumericalApproximation::EvaluateCubicClamped ( const double  a)
protectedinherited

Performs cubic spline interpolation with clamped boundary conditions, if possible.

This is a protected method called by Evaluate() if the NumericalApproximation::InterpType is CubicClamped and SetCubicClampedEndptDeriv() has been called. It uses the second derivative vector, p_clampedSecondDerivs, to interpolate the value for f(a) using a clamped cubic spline formula,

Note: If the given value, a, falls outside of the domain, then extrapolation is attempted and the result is accurate only if a is near enough to the domain boundary.

Parameters
aDomain value from which to interpolate a corresponding range value
Returns
double Value returned from interpolation or extrapolation.
See also
Evaluate()
ComputeCubicClamped()
SetCubicClampedEndptDeriv()

◆ EvaluateCubicHermite()

double Isis::NumericalApproximation::EvaluateCubicHermite ( const double  a)
protectedinherited

Performs interpolation using the Hermite cubic polynomial.

This is a protected method called by Evaluate() if the NumericalApproximation::InterpType is CubicHermite. It returns an approximate value for f(a) by using the Hermite cubic polynomial, which uses Lagrange coefficient polynomials. The data points and each corresponding first derivative should have been already added.

Parameters
aDomain value from which to interpolate a corresponding range value
Returns
double Value returned from interpolation or extrapolation
Exceptions
Isis::IException::User"Invalid arguments. The size of the first derivative vector does not match the number of (x,y) data points."
See also
http://mathworld.wolfram.com/HermitesInterpolatingPolynomial.html
http://en.wikipedia.org/wiki/Lagrange_Polynomial
Evaluate()
AddCubicHermiteDeriv()

References _FILEINFO_.

◆ EvaluateCubicHermiteFirstDeriv()

double Isis::NumericalApproximation::EvaluateCubicHermiteFirstDeriv ( const double  a)
inherited

Approximates the first derivative of the data set function evaluated at the given domain value for CubicHermite interpolation type.

This method returns an approximation of the first derivative evaluated at given a valid domain value, a. It is able to extrapolate for values not far outside of the domain

References _FILEINFO_.

Referenced by Isis::SpicePosition::SetEphemerisTimeHermiteCache().

◆ EvaluateCubicHermiteSecDeriv()

double Isis::NumericalApproximation::EvaluateCubicHermiteSecDeriv ( const double  a)
inherited

Approximates the second derivative of the data set function evaluated at the given domain value for CubicHermite interpolation type.

This method returns an approximation of the second derivative evaluated at given a valid domain value, a. It is able to extrapolate for values not far outside of the domain

References _FILEINFO_.

◆ EvaluateCubicNeighborhood() [1/2]

double Isis::NumericalApproximation::EvaluateCubicNeighborhood ( const double  a)
protectedinherited

Performs cubic spline interpolation for a neighborhood about a.

This is a protected method called by Evaluate() if the NumericalApproximation::InterpType is CubicNeighborhood. It uses an algorithm that is adapted from the IDL interpol.pro application using the "/spline" keyword on an irregular grid. This type of cubic spline fits a natural cubic spline to the 4-point neighborhood of known data points surrounding a. For example, suppose {x0, x1, ..., xn} is the array of known domain values in the data set and \( x_i \leq a < x_{i+1}\) for some i such that \( 0 \leq i \leq n \), then f(a) is evaluated by interpolating the natural cubic spline consisting of the data set {xi-1, xi, xi+1, xi+2} at a.

Note: If the given value, a, falls outside of the domain, then f evaluated at the nearest domain boundary is returned.

Parameters
aDomain value from which to interpolate a corresponding range value.
Returns
double Result of interpolated value of f(a).
Exceptions
Isis::IException::Programmer"Unable to evaluate cubic neighborhood interpolation at a"
See also
Evaluate()

References _FILEINFO_, Isis::NumericalApproximation::AddData(), Isis::IException::errorType(), and Isis::NumericalApproximation::Evaluate().

◆ EvaluateCubicNeighborhood() [2/2]

vector< double > Isis::NumericalApproximation::EvaluateCubicNeighborhood ( const vector< double > &  a,
const ExtrapType etype 
)
protectedinherited

Performs cubic spline interpolations for neighborhoods about each value of a.

This is a protected method called by Evaluate() if the NumericalApproximation::InterpType is CubicNeighborhood. It uses an algorithm that is adapted from the IDL interpol.pro application using the "/spline" keyword on an irregular grid. For each component of a, this method fits a natural cubic spline using the 4-point neighborhood of known data points surrounding that component. For example, suppose {x0, x1, ..., xn} is the array of known domain values in the data set, then for each component of a, ak, in the domain, there is an i such that \( 0 \leq i \leq n \) and \( x_i \leq a_k < x_{i+1}\). Then, f(ak) is evaluated by interpolating the natural cubic spline consisting of the data set {xi-1, xi, xi+1, xi+2} at ak.

Note: If any given value, ai, falls outside of the domain, then f is evaluated at the nearest domain boundary.

Parameters
aVector of domain values from which to interpolate a vector of corresponding range values
etypeNumericalApproximation::ExtrapType enum value indicates how to evaluate if a falls outside of the domain. (Default: ThrowError)
Returns
vector <double> Result of interpolated value of f at each value of a.
Exceptions
Isis::IException::Programmer"Unable to evaluate cubic neighborhood interpolation at the values in the vector, a"
See also
Evaluate()

References _FILEINFO_, Isis::NumericalApproximation::AddData(), Isis::IException::errorType(), Isis::NumericalApproximation::Evaluate(), and Isis::NumericalApproximation::Reset().

◆ EvaluateForIntegration()

vector< double > Isis::NumericalApproximation::EvaluateForIntegration ( const double  a,
const double  b,
const unsigned int  n 
)
protectedinherited

Evaluates data set in order to have enough data points to approximate the function to be integrated.

Parameters
aLower bound of interval.
bUpper bound of interval.
nNumber of points used in Newton-Cotes formula.
Returns
vector <double> Array of y values to be used in numerical integration
Exceptions
Isis::IException::Programmer(When a > b) "Invalid interval entered"
Isis::IException::Programmer"Invalid arguments. Interval entered is not contained within domain"
Isis::IException::Programmer"Unable to evaluate the data set for integration"

References _FILEINFO_, and Isis::IException::errorType().

◆ EvaluatePolynomialNeville()

double Isis::NumericalApproximation::EvaluatePolynomialNeville ( const double  a)
protectedinherited

Performs polynomial interpolation using Neville's algorithm.

This is a protected method called by Evaluate() if the NumericalApproximation::InterpType is PolynomialNeville. It uses Neville's algorithm for Lagrange polynomials. It returns a value f(a) and sets the error estimate p_polyNevError. After this method is called, the user may access this error estimate by calling PolynomialNevilleErrorEstimate().

Note: If the given value, a, falls outside of the domain, then extrapolation is attempted and the result is accurate only if a is near enough to the domain boundary.

Parameters
aDomain value from which to interpolate a corresponding range value
Returns
double Value returned from interpolation or extrapolation
See also
http://mathworld.wolfram.com/NevillesAlgorithm.html
Evaluate()
PolynomialNevilleErrorEstimate()

◆ FindIntervalLowerIndex()

int Isis::NumericalApproximation::FindIntervalLowerIndex ( const double  a)
protectedinherited

Find the index of the x-value in the data set that is just below the input value, a.

This method is used by EvaluateCubicHermite(), EvaluateCubFirstDeriv() and EvaluateCubicHermiteSecDeriv() to determine in which interval of x-values a lies. It returns the index of the lower endpoint of the interval. If a is below the domain minimum, the method returns 0 as the lower index. If a is above the domain maximum, it returns the second to last index of the data set, Size()-2, as the lower index.

Parameters
aDomain value around which the interval lies
Returns
int Index of the x-value that is the lower endpoint of the interval of data points that surrounds a. Returns 0 if a is below domain min and Size()-2 if a is above domain max.

◆ ForwardFirstDifference()

double Isis::NumericalApproximation::ForwardFirstDifference ( const double  a,
const unsigned int  n = 3,
const double  h = 0.1 
)
inherited

Uses an n point forward first difference formula to approximate the first derivative evaluated at a given domain value.

This method uses forward first difference formulas to return an approximation of the first derivative of the interpolated data set function evaluated at given a valid domain value, a. Forward difference formulas use n points, with the smallest x value at a, for numerical differentiation approximation. This method uses one of the following formulas:

  • 2-point forward difference.

    \[ f\prime(a) \approx \frac{1}{h}[f(a + h) - f(a)] \]

  • 3-point forward difference.

    \[ f\prime(a) \approx \frac{1}{2h}[-f(a + 2h) + 4f(a + h) - 3f(a)] \]

Parameters
aDomain value at which first deriviative is evaluated.
nThe number of points used in the formula.
hDistance between nearest points in the formula.
Returns
double First derivative approximation for the given domain value
Exceptions
Isis::IException::Programmer"Invalid argument. Value entered is outside of domain."
Isis::IException::Programmer"Formula steps outside of domain." If a+(n-1)h is greater than domain max.
Isis::IException::Programmer"Invalid argument. There is no n-point forward difference formula in use."
Isis::IException::Programmer"Unable to calculate forward first difference for (a,n,h)"

References _FILEINFO_, and Isis::IException::errorType().

◆ ForwardSecondDifference()

double Isis::NumericalApproximation::ForwardSecondDifference ( const double  a,
const unsigned int  n = 3,
const double  h = 0.1 
)
inherited

Uses an n point forward second difference formula to approximate the second derivative evaluated at a given domain value.

This method uses forward second difference formulas to return an approximation of the second derivative of the interpolated data set function evaluated at given a valid domain value, a. Forward second difference formulas use n points, with the smallest x value at a, for numerical differentiation approximation. This method uses the following formula:

  • 3-point forward second difference.

    \[ f\prime\prime(a) \approx \frac{1}{h^2}[f(a + 2h) - 2f(a + h) + f(a)] \]

Parameters
aDomain value at which second deriviative is evaluated.
nThe number of points used in the formula.
hDistance between nearest points in the formula.
Returns
double Second derivative approximation for the given domain value
Exceptions
Isis::IException::Programmer"Invalid argument. Value entered is outside of domain."
Isis::IException::Programmer"Formula steps outside of domain." If a+(n-1)h is greater than domain max.
Isis::IException::Programmer"Invalid argument. There is no n-point forward difference formula in use."
Isis::IException::Programmer"Unable to calculate forward second difference for (a,n,h)"

References _FILEINFO_, and Isis::IException::errorType().

◆ GslAllocation()

void Isis::NumericalApproximation::GslAllocation ( unsigned int  npoints)
protectedinherited

Allocates GSL interpolation functions.

This method is called within Compute to allocate pointers to a GSL interpolation object and to a GSL accelerator object (for interpolation look-ups). This is only called for the GSL interpolation types. If it is deemed invalid, an exception will be thrown.

Parameters
npointsNumber of points to allocate for the GSL interpolator

◆ GslComputed()

bool Isis::NumericalApproximation::GslComputed ( ) const
protectedinherited

Returns whether a GSL interpolation computation of the data set has been performed.

This method is only applicable to GSL interpolation types.

Returns
bool True if GSL interpolation has been computed.
Exceptions
Isis::IException::Programmer"Method only valid for GSL interpolation types"
See also
ComputeGsl()

References _FILEINFO_.

◆ GslDeallocation()

void Isis::NumericalApproximation::GslDeallocation ( )
protectedinherited

Deallocate GSL interpolator resources, if used.

If a GSL interpolator function has been allocated, this routine will free its resources and reset internal pointers to reflect this state and provide a mechanism to test its state. Otherwise, this method sets the internal GSL pointers to their default, 0.

◆ GslFirstDerivative()

double Isis::NumericalApproximation::GslFirstDerivative ( const double  a)
inherited

Approximates the first derivative of the data set function evaluated at the given domain value for GSL supported interpolation types.

This method returns an approximation of the first derivative evaluated at given a valid domain value, a. It is a wrapper for the GSL subroutine gsl_spline_eval_deriv_e(). If the NumericalApproximation::InterpType is not a GSL type, then this method throws an error. No documentation was found concerning the algorithm used by this method.

Parameters
aDomain value at which first deriviative is evaluated.
Returns
double First derivative approximation for the given domain value, if valid.
Exceptions
Isis::IException::Programmer"Invalid argument. Value entered is outside of domain."
Isis::IException::Programmer"Cannot use this method for interpolation type" (If the interpolation type is not GSL)
Isis::IException::Programmer"Unable to compute the first derivative at a using the GSL interpolation" @throws Isis::IException::Programmer "Unable to compute the first derivative at a. GSL integrity check failed"

References _FILEINFO_, and Isis::IException::errorType().

◆ GslFunctor()

NumericalApproximation::InterpFunctor Isis::NumericalApproximation::GslFunctor ( NumericalApproximation::InterpType  itype) const
protectedinherited

Search for a GSL interpolation function.

This method searches the supported GSL options table for a given interpolation function as requested by the caller. If it is not found, an exception will be thrown indicating the erroneous request.

Parameters
itypeType of GSL interpolator to find
Returns
NumericalApproximation::InterpFunctor Pointer to the GSL spline interpolator construct.
Exceptions
Isis::IException::Programmer"Invalid argument. Unable to find GSL interpolator"

References _FILEINFO_.

Referenced by Isis::NumericalApproximation::MinPoints().

◆ GslIntegral()

double Isis::NumericalApproximation::GslIntegral ( const double  a,
const double  b 
)
inherited

Approximates the integral of the data set function evaluated on the given interval for GSL supported interpolation types.

This method returns an approximation of the integral evaluated on a given valid domain interval, (a,b). It is a wrapper for the GSL subroutine gsl_spline_eval_integ_e(). If the NumericalApproximation::InterpType is not a GSL type, then this method throws an error. No documentation was found concerning the algorithm used by this method.

Parameters
aLower endpoint at which integral is evaluated.
bUpper endpoint at which integral is evaluated.
Returns
double Integral approximation for the given interval, if valid.
Exceptions
Isis::IException::Programmer(When a > b) "Invalid interval entered"
Isis::IException::Programmer"Invalid arguments. Interval entered is not contained within domain"
Isis::IException::Programmer"Cannot use this method for interpolation type" (If the interpolation type is not GSL)
Isis::IException::Programmer"Unable to compute the integral on the interval (a,b) using GSL interpolation" @throws Isis::IException::Programmer "Unable to compute the integral on the interval (a,b). GSL integrity check failed."

References _FILEINFO_, and Isis::IException::errorType().

◆ GslIntegrityCheck()

void Isis::NumericalApproximation::GslIntegrityCheck ( int  gsl_status,
const char *  src,
int  line 
)
protectedinherited

Checks the status of the GSL interpolation operations.

This method takes a return status from a GSL call and determines if it is completed successfully. This implementation currently allows the GSL_DOMAIN error to propagate through sucessfully as the domain can be checked by the caller if they deem this necessary.

Parameters
gsl_statusReturn status of a GSL function call
srcName of the calling source invoking the check. This allows more precise determination of the error.
lineLine of the calling source that invoked the check
Exceptions
Isis::IException::Programmer"GSL error occured"

◆ GslInterpType()

bool Isis::NumericalApproximation::GslInterpType ( NumericalApproximation::InterpType  itype) const
protectedinherited

Returns whether an interpolation type is adapted from the GSL library.

GSL interpolation types include the following:

  • Linear = 0
  • Polynomial = 1
  • CubicNatural = 3
  • CubicNatPeriodic = 5
  • Akima = 7
  • AkimaPeriodic = 8
Parameters
itypeInterpolation type to be compared to GSL list
Returns
bool True if interpolation type is GSL

◆ GslSecondDerivative()

double Isis::NumericalApproximation::GslSecondDerivative ( const double  a)
inherited

Approximates the second derivative of the interpolated data set function evaluated at the given domain value for GSL supported interpolation types.

This method returns an approximation of the second derivative evaluated at given a valid domain value, a. It is a wrapper for the GSL subroutine gsl_spline_eval_deriv2_e(). If the NumericalApproximation::InterpType is not a GSL type, then this method throws an error. No documentation was found concerning the algorithm used by this method.

Parameters
aDomain value at which second deriviative is evaluated.
Returns
double Second derivative approximation for the given domain value, if valid.
Exceptions
Isis::IException::Programmer"Invalid argument. Value entered is outside of domain."
Isis::IException::Programmer"Cannot use this method for interpolation type" (If the interpolation type is not GSL)
Isis::IException::Programmer"Unable to compute the second derivative at a using GSL interpolation"
Isis::IException::Programmer"Unable to compute the second derivative at a. GSL integrity check failed"

References _FILEINFO_, and Isis::IException::errorType().

◆ Init()

void Isis::NumericalApproximation::Init ( NumericalApproximation::InterpType  itype)
protectedinherited

Initializes the object upon instantiation.

This method sets up the initial state of the object, typically at instantiation. It populates the interpolation function table identifying which options are available to the users of this class.

GSL error handling is turned off - upon repeated instantiation of this object. The GSL default error handling, termination of the application via an abort() is unacceptable. This calls adopts an alternative policy provided by the GSL whereby error checking must be done by the calling environment. This has an unfortunate drawback in that it is not enforceable in an object oriented environment that utilizes the GSL in disjoint classes.

Parameters
itypeNumericalApproximation::InterpType enum value to be assigned to this object
Exceptions
Isis::IException::Programmer"Unable to initialize NumericalApproximation object"

References _FILEINFO_, and Isis::IException::errorType().

◆ InrFunc2Bint()

double Isis::NumericalAtmosApprox::InrFunc2Bint ( AtmosModel am,
double  mu 
)
static

Inner function to be integrated.

This function is the inner integrand with all its parameters except cos(ema) hidden. For atmSwitch=0 this integrand is mu times the photometric angle, giving the hemispheric albedo for the outer integral. atmSwitch of 1, 2, 3, give the 3 integrals over the atmospheric single- particle phase function used in the Hapke/Henyey-Greenstein atmospheric model.

Parameters
amPointer to AtmosModel object
muAngle at which the function will be integrated
Returns
double Value of the function evaluated at the given mu
Exceptions
Isis::iException::Programmer"Invalid value of atmospheric switch used as argument to this function"

References _FILEINFO_, Isis::AtmosModel::AtmosHga(), Isis::AtmosModel::AtmosTau(), Isis::PhotoModel::CalcSurfAlbedo(), Isis::AtmosModel::p_atmosAtmSwitch, Isis::AtmosModel::p_atmosCosphi, Isis::AtmosModel::p_atmosInc, Isis::AtmosModel::p_atmosMunot, Isis::AtmosModel::p_atmosSini, and Isis::PI.

◆ InsideDomain()

bool Isis::NumericalApproximation::InsideDomain ( const double  a)
protectedinherited

Returns whether the passed value is greater than or equal to the domain minimum and less than or equal to the domain maximum.

Parameters
aValue to be verified as valid domain value.
Returns
bool True if passed parameter is within the domain.
Exceptions
Isis::IException::Programmer"Unable to compute domain boundaries"

References _FILEINFO_, and Isis::IException::errorType().

◆ InterpolationType()

InterpType Isis::NumericalApproximation::InterpolationType ( )
inlineinherited

Returns the enumerated type of interpolation chosen.

This method can be selected after all the points are added in the interpolation by using Compute() method. Note that this prints out as an integer representaion of the enumerated type:

  • Linear = 0
  • Polynomial = 1
  • PolynomialNeville = 2
  • CubicNatural = 3
  • CubicClamped = 4
  • CubicNatPeriodic = 5
  • CubicNeighborhood = 6
  • CubicHermite = 7
  • Akima = 8
  • AkimaPeriodic = 9
Returns
NumericalApproximation::InterpType Currently assigned interpolation type

◆ MinPoints() [1/2]

int Isis::NumericalApproximation::MinPoints ( )
inherited

Minimum number of points required by interpolating function.

This method returns the minimum number of points that are required by the interpolating function in order for it to be applied to a data set. It returns the number of the of the currently selected/active interpolation function.

Returns
int Minimum number of data points required for the interpolation function
Exceptions
Isis::IException::Programmer"Unable to calculate minimum points."

References _FILEINFO_, and Isis::IException::errorType().

◆ MinPoints() [2/2]

int Isis::NumericalApproximation::MinPoints ( NumericalApproximation::InterpType  itype)
inherited

Minimum number of points required by interpolating function.

This method returns the minimum number of points that are required by the interpolating function in order for it to be applied to a data set. It returns the minimum number for the specifed interpolation function as specified by the caller.

Parameters
itypeType of interpolation function for which to return minimum points
Returns
int Minimum number of data points required for the interpolation function
Exceptions
Isis::IException::Programmer"Invalid argument. Unknown interpolation type"
Isis::IException::Programmer"Unable to calculate minimum points"

References _FILEINFO_, Isis::IException::errorType(), and Isis::NumericalApproximation::GslFunctor().

◆ Name()

string Isis::NumericalApproximation::Name ( ) const
inherited

Get name of interpolating function assigned to object.

This method returns the name of the interpolation type that is currently assigned to this object as a std::string. This may be called without adding any points. If called before computation, the result reflects the name of the function chosen at instantiation.

Returns
std::string Name of the interpolation function used/to be used.
Exceptions
Isis::IException::Programmer"Unable to retrieve numerical approximation name",

References _FILEINFO_, and Isis::IException::errorType().

◆ OutrFunc2Bint()

double Isis::NumericalAtmosApprox::OutrFunc2Bint ( AtmosModel am,
double  phi 
)
static

This function is the outer integrand over mu at specified phi.

Outer function to be integrated.

Parameters
amPointer to AtmosModel object
phiAngle at which the function will be integrated
Returns
double Value of the function evaluated at the given phi

References _FILEINFO_, Isis::IException::errorType(), Isis::AtmosModel::p_atmosCosphi, Isis::AtmosModel::p_atmosPhi, Isis::PI, and RombergsMethod().

◆ PolynomialNevilleErrorEstimate()

vector< double > Isis::NumericalApproximation::PolynomialNevilleErrorEstimate ( )
inherited

Retrieves the error estimate for the Neville's polynomial interpolation type.

This method must be called after the Evaluate() method has been invoked. If the Evaluate() method is passed a vector, this error will contain an error estimate for each of the values of the passed in vector. Otherwise, it will contain a single value.

Returns
vector <double> Estimation of difference between actual value of f(a) and the polynomial Neville interpolated return value of Evaluate(), where f is the function that defines the given data set.
Exceptions
Isis::IException::Programmer"Method only used for polynomial-Neville's interpolation type"
Isis::IException::Programmer"Error not calculated"

References _FILEINFO_.

Referenced by RombergsMethod(), and Isis::NumericalApproximation::RombergsMethod().

◆ RefineExtendedTrap() [1/2]

double Isis::NumericalAtmosApprox::RefineExtendedTrap ( AtmosModel am,
IntegFunc  sub,
double  a,
double  b,
double  s,
unsigned int  n 
)

This variation on the NumericalApproximation method integrates a specified AtmosModel function rather than an interpolated function based on a data set.

This routine computes the nth stage of refinement of an extended trapezoidal rule. This method is used by RombergsMethod() to integrate. When called with n = 1, the method returns the crudest estimate of the integral. Subsequent calls with n = 2, 3, ... (in sequential order) will improve the accuracy by adding 2n-2 additional interior points. This method can be used to integrate by the extended trapeziodal rule if you know the number of steps you want to take.

Parameters
amPointer to AtmosModel object
subEnumerated value of atmospheric function to be integrated
aLower limit of integration
bUpper limit of integration
sPrevious value of refinement
nNumber of partitions to use when integrating
Returns
double Integral (refined) approximation of the function on the interval (a, b)
Exceptions
Isis::iException::Programmer"Caught an error" (from InrFunc2Bint() or OutrFunc2Bint() method)
See also
RombergsMethod()

References _FILEINFO_, and Isis::IException::errorType().

◆ RefineExtendedTrap() [2/2]

double Isis::NumericalApproximation::RefineExtendedTrap ( double  a,
double  b,
double  s,
unsigned int  n 
)
inherited

Calculates refinements extended trapezoidal rule to approximate the integral of the interpolated data set function on the interval (a,b).

This method calculates the nth stage of refinement of an extended trapezoidal rule. When called with n = 1, the method returns the non-composite trapezoidal estimate of the integral. Subsequent calls with n = 2, 3, ... (in sequential order) will improve the accuracy by adding 2n-2 additional interior points. This method can be used to integrate by the extended trapeziodal rule if you know the number of steps you want to take. For example, if you want 2M + 1, use the following code:

double result;
for(int j = 1; j <= M+1; j++){
result = RefineExtendedTrap(a,b,result,j);
}

Note: Although this method may be used to approximate an integral, as described above, it is most often used by RombergsMethod() to integrate.

Parameters
aLower limit of integration
bUpper limit of integration
sPrevious value of refinement
nNumber of partitions to use when integrating
Returns
double Integral (refined) approximation of the function on the interval (a, b)
Exceptions
Isis::IException::Programmer"Unable to calculate the integral on the interval (a,b) using the extended trapezoidal rule"
See also
RombergsMethod()

References _FILEINFO_, and Isis::IException::errorType().

◆ ReportException()

void Isis::NumericalApproximation::ReportException ( IException::ErrorType  type,
const string &  methodName,
const string &  message,
const char *  filesrc,
int  lineno 
) const
protectedinherited

Generalized error report generator.

This method is used throughout this class to standardize error reporting as a convenience to its implementor.

Parameters
typeType of Isis::IException
methodNameName of method where exception originated
messageError context string provided by the caller
filesrcName of the file the error occured in.
linenoLine number of the calling source where the error occured.
Exceptions
Isis::IException::errTypeequal to type and error message equal to (methodName + " - " + message)

◆ Reset() [1/2]

void Isis::NumericalApproximation::Reset ( )
inherited

Resets the state of the object.

This method deallocates the internal state of the object and clears the data set and class variables. The object is returned to its original state, so data points must be entered before computing again. This does not clear or reset the interpolation type.

Referenced by Isis::HapkeAtm1::AtmosModelAlgorithm(), Isis::HapkeAtm2::AtmosModelAlgorithm(), Isis::NumericalApproximation::EvaluateCubicNeighborhood(), Isis::AtmosModel::GenerateHahgTables(), Isis::AtmosModel::GenerateHahgTablesShadow(), Isis::LunarLambertEmpirical::LunarLambertEmpirical(), Isis::MinnaertEmpirical::MinnaertEmpirical(), RombergsMethod(), Isis::NumericalApproximation::RombergsMethod(), Isis::LunarLambertEmpirical::~LunarLambertEmpirical(), and Isis::MinnaertEmpirical::~MinnaertEmpirical().

◆ Reset() [2/2]

void Isis::NumericalApproximation::Reset ( NumericalApproximation::InterpType  itype)
inherited

Resets the state of the object and resets interpolation type.

This method will clear the data set, reset the validation status of the data to false, reset the interpolation type, clear class variables and deallocate (inactivate) the internal state of the object. The object is returned to its original state, so data points must be entered before computing again.

Parameters
itypeNumericalApproximation::InterpType enum value to be assigned to this object
Exceptions
Isis::IException::Programmer"Unable to reset interpolation type"

References _FILEINFO_, and Isis::IException::errorType().

◆ RombergsMethod() [1/2]

double Isis::NumericalAtmosApprox::RombergsMethod ( AtmosModel am,
IntegFunc  sub,
double  a,
double  b 
)

This variation on the NumericalApproximation method integrates a specified AtmosModel function rather than an interpolated function based on a data set.

It returns the integral of the given function from a to b for the given AtmosModel. Integration is performed by Romberg's method for Numerical Integration of order 2K, where, e.g., K=2 is simpson's rule. This is a generalization of the trapezoidal rule. Romberg Integration uses a series of refinements on the extended (or composite) trapezoidal rule. This method calls a polynomial interpolation (Neville's algorithm) to extrapolate successive refinements.

Parameters
amPointer to AtmosModel object
subEnumerated value of atmospheric function to be integrated
aLower limit of integration
bUpper limit of integration
Returns
double Integral approximation of the function on the interval (a, b)
Exceptions
Isis::iException::Programmer"Failed to converge."
Isis::iException::Programmer"Caught an error" (from RefineExtendedTrap(), Constructor, Evaluate(), or PolynomialNevilleErrorEstimate() method)
See also
mathworld.wolfram.com/RombergIntegration.html
RefineExtendedTrap()

References _FILEINFO_, Isis::NumericalApproximation::AddData(), Isis::IException::errorType(), Isis::NumericalApproximation::Evaluate(), Isis::NumericalApproximation::PolynomialNevilleErrorEstimate(), and Isis::NumericalApproximation::Reset().

Referenced by Isis::HapkeAtm1::AtmosModelAlgorithm(), Isis::HapkeAtm2::AtmosModelAlgorithm(), Isis::AtmosModel::GenerateAhTable(), Isis::AtmosModel::GenerateHahgTables(), Isis::AtmosModel::GenerateHahgTablesShadow(), and OutrFunc2Bint().

◆ RombergsMethod() [2/2]

double Isis::NumericalApproximation::RombergsMethod ( double  a,
double  b 
)
inherited

Uses Romberg's method to approximate the integral of the interpolated data set function on the interval (a,b).

This method returns the integral of the function from a to b using Romberg's method for Numerical Integration of order 2K, where, e.g., K=2 is simpson's rule. This is a generalization of the trapezoidal rule. Romberg Integration uses a series of refinements on the extended (or composite) trapezoidal rule to reduce error terms. This method makes use of Neville's algorithm for polynomial interpolation to extrapolate successive refinements.

Parameters
aLower limit of integration
bUpper limit of integration
Returns
double Integral approximation of the function on the interval (a, b)
Exceptions
Isis::IException::Programmer"Failed to converge."
Isis::IException::Programmer"Unable to calculate the integral on the interval (a,b) using Romberg's method"
See also
http://mathworld.wolfram.com/RombergIntegration.html
RefineExtendedTrap()

References _FILEINFO_, Isis::NumericalApproximation::AddData(), Isis::IException::errorType(), Isis::NumericalApproximation::Evaluate(), Isis::NumericalApproximation::PolynomialNevilleErrorEstimate(), and Isis::NumericalApproximation::Reset().

◆ SetCubicClampedEndptDeriv()

void Isis::NumericalApproximation::SetCubicClampedEndptDeriv ( const double  yp1,
const double  ypn 
)
inherited

Sets the values for the first derivatives of the endpoints of the data set.

This method can only be called for cubic splines with clamped boundary conditions, i.e. if NumericalApproximation::InterpType is CubicClamped.

Parameters
yp1First derivative of the function evaluated at the domain minimum.
ypnFirst derivative of the function evaluated at the domain maximum.
Exceptions
Isis::IException::Programmer"Method only used for cspline-clamped interpolation type"

References _FILEINFO_.

Referenced by Isis::LunarLambertEmpirical::LunarLambertEmpirical(), and Isis::MinnaertEmpirical::MinnaertEmpirical().

◆ SetInterpType()

void Isis::NumericalApproximation::SetInterpType ( NumericalApproximation::InterpType  itype)
inherited

Sets interpolation type.

This method will reset the interpolation type to that of the input parameter and deallocate memory. Unlike the Reset() method, this method does NOT discard the data set. However, since interpolations have differing requirements for valid data sets, the data set stored is not yet validated for the new interpolation type. Other class variables are cleared if they are interpolation type dependent.

Parameters
itypeNumericalApproximation::InterpType enum value to be assigned to this object
Exceptions
Isis::IException::Programmer"Invalid argument. Unknown interpolation type"
Isis::IException::Programmer"Unable to set interpolation type"
See also
Reset()

References _FILEINFO_, and Isis::IException::errorType().

Referenced by Isis::LunarLambertEmpirical::LunarLambertEmpirical(), and Isis::MinnaertEmpirical::MinnaertEmpirical().

◆ Simpsons3PointRule()

double Isis::NumericalApproximation::Simpsons3PointRule ( const double  a,
const double  b 
)
inherited

Uses Simpson's 3-point rule to approximate the integral of the interpolated data set function on the interval (a,b).

The Simpson's 3-Point Rule for numerical integration uses a 3-point Newton-Cote formula. This rule states:

\[ \int_{a}^b f(x)dx \approx \frac{h}{3}[f(a) + f(a+h) + 4*f(a+2h)] \]

where h = (b - a)/2. This method uses a composite, or extended, Simpson's rule algorithm to approximate the integral.

Parameters
aLower bound of interval.
bUpper bound of interval.
Returns
double Approximate integral of data set function from a to b.
Exceptions
Isis::IException::Programmer"Unable to calculate the integral on the interval (a,b) using Simpson's 3 point rule"

References _FILEINFO_, and Isis::IException::errorType().

◆ Simpsons4PointRule()

double Isis::NumericalApproximation::Simpsons4PointRule ( const double  a,
const double  b 
)
inherited

Uses Simpson's 4-point rule to approximate the integral of the interpolated data set function on the interval (a,b).

The Simpson's 4-point Rule for numerical integration uses a 4-point Newton-Cote formula and is sometimes called the Simpson's 3/8 Rule. This rule states:

\[ \int_{a}^b f(x)dx \approx \frac{3h}{8}[f(a) + 3f(a+h) + 3f(a+2h) + f(a+3h)] \]

where h = (b - a)/3. This method uses a composite, or extended, Simpson's 3/8 rule algorithm to approximate the integral.

Parameters
aLower bound of interval.
bUpper bound of interval.
Returns
double Approximate integral of data set function from a to b.
Exceptions
Isis::IException::Programmer"Unable to calculate the integral on the interval (a,b) using Simpson's 4 point rule"

References _FILEINFO_, and Isis::IException::errorType().

◆ Size()

unsigned int Isis::NumericalApproximation::Size ( )
inlineinherited

Returns the number of the coordinates added to the data set.

Returns
unsigned int Size of data set.

◆ TrapezoidalRule()

double Isis::NumericalApproximation::TrapezoidalRule ( const double  a,
const double  b 
)
inherited

Uses the trapezoidal rule to approximate the integral of the interpolated data set function on the interval (a, b).

The trapeziod rule for integration approximation uses a 2-point Newton-Cote formula. This rule states:

\[ \int_{a}^b f(x)dx \approx \frac{h}{2}[f(a) + f(b)] \]

where h = b - a. This method uses a composite, or extended, trapeziodal rule algorithm to approximate the integral.

Parameters
aLower bound of interval.
bUpper bound of interval.
Returns
double Approximate integral of data set function from a to b.
Exceptions
Isis::IException::Programmer"Unable to calculate the integral on the interval (a,b) using the trapezoidal rule"

References _FILEINFO_, and Isis::IException::errorType().

◆ ValidateDataSet()

void Isis::NumericalApproximation::ValidateDataSet ( )
protectedinherited

Validates the data set before computing interpolation.

This method is called from the ComputeCubicClamped() and ComputeGsl() methods to verify that the data set contains the minimum number of required points and that the components of the vector of domain values are unique. For all interpolation types other than polynomial-Neville's, the method verifies that the vector of domain values are also sorted in ascending order. For CubicNatPeriodic interpolation type, this method verifies that the first and last p_y values are equal, i.e. \( f(x_0) = f(x_{n-1}) \).

Exceptions
Isis::IException::Programmer"Interpolation requires a minimim of data points"
Isis::IException::Programmer"Invalid data set, x-values must be unique"
Isis::IException::Programmer"Invalid data set, x-values must be in ascending order" (if interpolation type is not polynomial-Neville's)
Isis::IException::Programmer"First and last points of the data set must have the same y-value" (if interpolation type is cubic-periodic)

References _FILEINFO_.

◆ ValueToExtrapolate()

double Isis::NumericalApproximation::ValueToExtrapolate ( const double  a,
const ExtrapType etype 
)
protectedinherited

Returns the domain value at which to evaluate.

This protected method is called by Evaluate() if a falls outside of the domain of p_x values in the data set. The return value is determined by the NumericalApproximation::ExtrapType. If it is ThrowError, an error is thrown indicating that a is out of the domain. If it is NearestEndpoint, then the nearest domain boundary value is returned. Otherwise, i.e. Extrapolate, a is returned as long as the NumericalApproximation::InterpType is not GSL or cubic neighborhood.

Parameters
aValue passed into Evaluate() that falls outside of domain.
etypeNumericalApproximation::ExtrapType enum value indicates how to evaluate if a falls outside of the domain. (Default: ThrowError)
Returns
double Value returned to Evaluate() to be extrapolated.
Exceptions
Isis::IException::Programmer"Invalid argument. Value entered is outside of domain
Isis::IException::Programmer"Invalid argument. Cannot extrapolate for interpolation type" (GSL or CubicNeighborhood)
See also
Evaluate()

References _FILEINFO_.

Member Data Documentation

◆ p_acc

gsl_interp_accel* Isis::NumericalApproximation::p_acc
protectedinherited

Lookup accelorator.

◆ p_clampedComputed

bool Isis::NumericalApproximation::p_clampedComputed
protectedinherited

Flag variable to determine whether ComputeCubicClamped() has been called.

Referenced by Isis::NumericalApproximation::NumericalApproximation().

◆ p_clampedDerivFirstPt

double Isis::NumericalApproximation::p_clampedDerivFirstPt
protectedinherited

First derivative of first x-value, p_x[0]. This is only used for the CubicClamped interpolation type.

Referenced by Isis::NumericalApproximation::NumericalApproximation(), and Isis::NumericalApproximation::operator=().

◆ p_clampedDerivLastPt

double Isis::NumericalApproximation::p_clampedDerivLastPt
protectedinherited

First derivative of last x-value, p_x[n-1]. This is only used for the CubicClamped interpolation type.

Referenced by Isis::NumericalApproximation::NumericalApproximation(), and Isis::NumericalApproximation::operator=().

◆ p_clampedEndptsSet

bool Isis::NumericalApproximation::p_clampedEndptsSet
protectedinherited

Flag variable to determine whether SetCubicClampedEndptDeriv() has been called after all data was added for CubicClamped interpolation.

Referenced by Isis::NumericalApproximation::NumericalApproximation().

◆ p_clampedSecondDerivs

vector<double> Isis::NumericalApproximation::p_clampedSecondDerivs
protectedinherited

List of second derivatives evaluated at p_x values. This is only used for the CubicClamped interpolation type.

Referenced by Isis::NumericalApproximation::NumericalApproximation(), and Isis::NumericalApproximation::operator=().

◆ p_dataValidated

bool Isis::NumericalApproximation::p_dataValidated
protectedinherited

Flag variable to determine whether ValidateDataSet() has been called.

Referenced by Isis::NumericalApproximation::NumericalApproximation(), and Isis::NumericalApproximation::operator=().

◆ p_fprimeOfx

vector<double> Isis::NumericalApproximation::p_fprimeOfx
protectedinherited

List of first derivatives corresponding to each x value in the data set (i.e. each value in p_x)

Referenced by Isis::NumericalApproximation::NumericalApproximation(), and Isis::NumericalApproximation::operator=().

◆ p_interp

gsl_spline* Isis::NumericalApproximation::p_interp
protectedinherited

Currently active interpolator.

◆ p_interpFunctors

NumericalApproximation::FunctorList Isis::NumericalApproximation::p_interpFunctors
staticprotectedinherited

Maintains list of interpolator options.

◆ p_itype

InterpType Isis::NumericalApproximation::p_itype
protectedinherited

◆ p_polyNevError

vector<double> Isis::NumericalApproximation::p_polyNevError
protectedinherited

Estimate of error for interpolation evaluated at x. This is only used for the PolynomialNeville interpolation type. 91 taken from AtmosModel.

Referenced by Isis::NumericalApproximation::NumericalApproximation(), and Isis::NumericalApproximation::operator=().

◆ p_x

vector<double> Isis::NumericalApproximation::p_x
protectedinherited

◆ p_y

vector<double> Isis::NumericalApproximation::p_y
protectedinherited

The documentation for this class was generated from the following files: