File: function_derivative.h

package info (click to toggle)
deal.ii 9.7.1-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 326,024 kB
  • sloc: cpp: 440,899; ansic: 77,337; python: 3,307; perl: 1,041; sh: 1,022; xml: 252; makefile: 97; javascript: 14
file content (134 lines) | stat: -rw-r--r-- 4,286 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// ------------------------------------------------------------------------
//
// SPDX-License-Identifier: LGPL-2.1-or-later
// Copyright (C) 2000 - 2025 by the deal.II authors
//
// This file is part of the deal.II library.
//
// Part of the source code is dual licensed under Apache-2.0 WITH
// LLVM-exception OR LGPL-2.1-or-later. Detailed license information
// governing the source code and code contributions can be found in
// LICENSE.md and CONTRIBUTING.md at the top level directory of deal.II.
//
// ------------------------------------------------------------------------

#ifndef dealii_function_derivative_h
#define dealii_function_derivative_h

#include <deal.II/base/config.h>

#include <deal.II/base/auto_derivative_function.h>
#include <deal.II/base/exceptions.h>
#include <deal.II/base/function.h>

#include <vector>


DEAL_II_NAMESPACE_OPEN


/**
 * Derivative of a function object.  The value access functions of this class
 * return the directional derivative of a function with respect to a direction
 * provided on construction. If <tt>b</tt> is the vector, the derivative <tt>b
 * . grad f</tt> is computed. This derivative is evaluated directly, not by
 * computing the gradient of <tt>f</tt> and its scalar product with
 * <tt>b</tt>.
 *
 * The derivative is computed numerically, using one of the provided
 * difference formulas (see <tt>set_formula</tt> for available schemes).
 * Experimenting with <tt>h</tt> and the difference scheme may be necessary to
 * obtain sufficient results.
 *
 * @ingroup functions
 */
template <int dim>
class FunctionDerivative : public AutoDerivativeFunction<dim>
{
public:
  /**
   * Constructor. Provided are the functions to compute derivatives of, the
   * direction vector of the differentiation and the step size <tt>h</tt> of
   * the difference formula.
   */
  FunctionDerivative(const Function<dim> &f,
                     const Point<dim>    &direction,
                     const double         h = 1.e-6);

  /**
   * Constructor. Provided are the functions to compute derivatives of and the
   * direction vector of the differentiation in each quadrature point and the
   * difference step size.
   *
   * This is the constructor for a variable velocity field. Most probably, a
   * new object of <tt>FunctionDerivative</tt> has to be constructed for each
   * set of quadrature points.
   *
   * The number of quadrature point must still be the same, when values are
   * accessed.
   */
  FunctionDerivative(const Function<dim>           &f,
                     const std::vector<Point<dim>> &direction,
                     const double                   h = 1.e-6);

  /**
   * Choose the difference formula. This is set to the default in the
   * constructor.
   *
   * Formulas implemented right now are first order backward Euler
   * (<tt>UpwindEuler</tt>), second order symmetric Euler (<tt>Euler</tt>) and
   * a symmetric fourth order formula (<tt>FourthOrder</tt>).
   */
  void
  set_formula(typename AutoDerivativeFunction<dim>::DifferenceFormula formula =
                AutoDerivativeFunction<dim>::Euler);
  /**
   * Change the base step size of the difference formula
   */
  void
  set_h(const double h);

  virtual double
  value(const Point<dim> &p, const unsigned int component = 0) const override;

  virtual void
  vector_value(const Point<dim> &p, Vector<double> &value) const override;

  virtual void
  value_list(const std::vector<Point<dim>> &points,
             std::vector<double>           &values,
             const unsigned int             component = 0) const override;

  /**
   * Return an estimate for the memory consumption, in bytes, of this object.
   * This is not exact (but will usually be close) because calculating the
   * memory usage of trees (e.g., <tt>std::map</tt>) is difficult.
   */
  virtual std::size_t
  memory_consumption() const override;

private:
  /**
   * Function for differentiation.
   */
  const Function<dim> &f;

  /**
   * Step size of the difference formula.
   */
  double h;

  /**
   * Difference formula.
   */
  typename AutoDerivativeFunction<dim>::DifferenceFormula formula;

  /**
   * Helper object. Contains the increment vector for the formula.
   */
  std::vector<Tensor<1, dim>> incr;
};

DEAL_II_NAMESPACE_CLOSE

#endif