AutoDerivativeFunction< dim > Class Template Reference
[Functions]

Inheritance diagram for AutoDerivativeFunction< dim >:
Inheritance graph
[legend]

List of all members.

Public Types

enum  DifferenceFormula { Euler, UpwindEuler, FourthOrder }

Public Member Functions

 AutoDerivativeFunction (const double h, const unsigned int n_components=1, const double initial_time=0.0)
virtual ~AutoDerivativeFunction ()
void set_formula (const DifferenceFormula formula=Euler)
void set_h (const double h)
virtual Tensor< 1, dim > gradient (const Point< dim > &p, const unsigned int component=0) const
virtual void vector_gradient (const Point< dim > &p, std::vector< Tensor< 1, dim > > &gradients) const
virtual void gradient_list (const std::vector< Point< dim > > &points, std::vector< Tensor< 1, dim > > &gradients, const unsigned int component=0) const
virtual void vector_gradient_list (const std::vector< Point< dim > > &points, std::vector< std::vector< Tensor< 1, dim > > > &gradients) const
 DeclException0 (ExcInvalidFormula)

Static Public Member Functions

static DifferenceFormula get_formula_of_order (const unsigned int ord)

Private Attributes

double h
std::vector< Tensor< 1, dim > > ht
DifferenceFormula formula

Detailed Description

template<int dim>
class AutoDerivativeFunction< dim >

This class automatically computes the gradient of a function by employing numerical difference quotients. This only, if the user function does not provide the gradient function himself.

The following example of an user defined function overloads and implements only the value() function but not the gradient() function. If the gradient() function is invoked then the gradient function implemented by the AutoDerivativeFunction is called, where the latter function imployes numerical difference quotients.

 class UserFunction: public AutoDerivativeFunction
 {               // access to one component at one point
   double value (const Point<dim> &p, const
                 unsigned int component = 0) const
          { // Implementation ....  };
 } user_function;

            // gradient by employing difference quotients.
 Tensor<1,dim> grad=user_function.gradient(some_point);

If the user overloads and implements also the gradient function, then, of course, the users gradient function is called.

Note, that the usage of the value() and gradient() functions explained above, also applies to the value_list() and gradient_list() functions as well as to the vector valued versions of these functions, see e.g. vector_value(), vector_gradient(), vector_value_list() and vector_gradient_list().

The gradient() and gradient_list() functions make use of the Function::value() function. The vector_gradient() and vector_gradient_list() make use of the Function::vector_value() function. Make sure that the user defined function implements the value() function and the vector_value() function, respectively.

Furthermore note, that an object of this class does not represent the derivative of a function, like FunctionDerivative, that gives a directional derivate by calling the value() function. In fact, this class (the AutoDerivativeFunction class) can substitute the Function class as base class for user defined classes. This class implements the gradient() functions for automatic computation of numerical difference quotients and serves as intermediate class between the base Function class and the user defined function class.

Author:
Ralf Hartmann, 2001

Member Enumeration Documentation

Names of difference formulas.

Enumerator:
Euler 

The symmetric Euler formula of second order:

\[ u'(t) \approx \frac{u(t+h) - u(t-h)}{2h}. \]

UpwindEuler 

The upwind Euler formula of first order:

\[ u'(t) \approx \frac{u(t) - u(t-h)}{h}. \]

FourthOrder 

The fourth order scheme

\[ u'(t) \approx \frac{u(t-2h) - 8u(t-h) + 8u(t+h) - u(t+2h)}{12h}. \]


Constructor & Destructor Documentation

template<int dim>
AutoDerivativeFunction< dim >::AutoDerivativeFunction ( const double  h,
const unsigned int  n_components = 1,
const double  initial_time = 0.0 
)

Constructor. Takes the difference step size h. It's within the user's responsibility to choose an appropriate value here. h should be chosen taking into account the absolute value as well as the amount of local variation of the function. Setting h=1e-6 might be a good choice for functions with an absolute value of about 1, that furthermore does not vary to much.

h can be changed later using the set_h() function.

Sets DifferenceFormula formula to the default Euler formula of the set_formula() function. Change this preset formula by calling the set_formula() function.

template<int dim>
virtual AutoDerivativeFunction< dim >::~AutoDerivativeFunction (  )  [virtual]

Virtual destructor; absolutely necessary in this case.


Member Function Documentation

template<int dim>
void AutoDerivativeFunction< dim >::set_formula ( const DifferenceFormula  formula = Euler  ) 

Choose the difference formula. See the enum DifferenceFormula for available choices.

template<int dim>
void AutoDerivativeFunction< dim >::set_h ( const double  h  ) 

Takes the difference step size h. It's within the user's responsibility to choose an appropriate value here. h should be chosen taking into account the absolute value of as well as the amount of local variation of the function. Setting h=1e-6 might be a good choice for functions with an absolute value of about 1, that furthermore does not vary to much.

Reimplemented in FunctionDerivative< dim >.

template<int dim>
virtual Tensor<1,dim> AutoDerivativeFunction< dim >::gradient ( const Point< dim > &  p,
const unsigned int  component = 0 
) const [virtual]

Return the gradient of the specified component of the function at the given point.

Computes numerical difference quotients using the preset DifferenceFormula.

Reimplemented from Function< dim >.

template<int dim>
virtual void AutoDerivativeFunction< dim >::vector_gradient ( const Point< dim > &  p,
std::vector< Tensor< 1, dim > > &  gradients 
) const [virtual]

Return the gradient of all components of the function at the given point.

Computes numerical difference quotients using the preset DifferenceFormula.

Reimplemented from Function< dim >.

template<int dim>
virtual void AutoDerivativeFunction< dim >::gradient_list ( const std::vector< Point< dim > > &  points,
std::vector< Tensor< 1, dim > > &  gradients,
const unsigned int  component = 0 
) const [virtual]

Set gradients to the gradients of the specified component of the function at the points. It is assumed that gradients already has the right size, i.e. the same size as the points array.

Computes numerical difference quotients using the preset DifferenceFormula.

Reimplemented from Function< dim >.

template<int dim>
virtual void AutoDerivativeFunction< dim >::vector_gradient_list ( const std::vector< Point< dim > > &  points,
std::vector< std::vector< Tensor< 1, dim > > > &  gradients 
) const [virtual]

Set gradients to the gradients of the function at the points, for all components. It is assumed that gradients already has the right size, i.e. the same size as the points array.

The outer loop over gradients is over the points in the list, the inner loop over the different components of the function.

Computes numerical difference quotients using the preset DifferenceFormula.

Reimplemented from Function< dim >.

template<int dim>
static DifferenceFormula AutoDerivativeFunction< dim >::get_formula_of_order ( const unsigned int  ord  )  [static]

Returns a DifferenceFormula of the order ord at minimum.

template<int dim>
AutoDerivativeFunction< dim >::DeclException0 ( ExcInvalidFormula   ) 

Exception.


Member Data Documentation

template<int dim>
double AutoDerivativeFunction< dim >::h [private]

Step size of the difference formula. Set by the set_h() function.

Reimplemented in FunctionDerivative< dim >.

template<int dim>
std::vector<Tensor<1,dim> > AutoDerivativeFunction< dim >::ht [private]

Includes the unit vectors scaled by h.

template<int dim>
DifferenceFormula AutoDerivativeFunction< dim >::formula [private]

Difference formula. Set by the set_formula() function.

Reimplemented in FunctionDerivative< dim >.


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

deal.II documentation generated on Mon Nov 23 22:57:28 2009 by doxygen 1.6.1