deal.II version GIT relicensing-2647-gce4370862c 2025-02-15 16:00:00+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
Loading...
Searching...
No Matches
function.h
Go to the documentation of this file.
1// ------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: LGPL-2.1-or-later
4// Copyright (C) 1998 - 2023 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Part of the source code is dual licensed under Apache-2.0 WITH
9// LLVM-exception OR LGPL-2.1-or-later. Detailed license information
10// governing the source code and code contributions can be found in
11// LICENSE.md and CONTRIBUTING.md at the top level directory of deal.II.
12//
13// ------------------------------------------------------------------------
14
15#ifndef dealii_function_h
16#define dealii_function_h
17
18
19#include <deal.II/base/config.h>
20
25#include <deal.II/base/point.h>
27#include <deal.II/base/tensor.h>
28
29#include <functional>
30#include <vector>
31
33
34// Forward declarations
35#ifndef DOXYGEN
36template <typename number>
37class Vector;
38template <int rank, int dim, typename Number>
39class TensorFunction;
40#endif
41
149template <int dim, typename RangeNumberType = double>
150class Function : public FunctionTime<
151 typename numbers::NumberTraits<RangeNumberType>::real_type>,
153{
154public:
159 static constexpr unsigned int dimension = dim;
160
164 const unsigned int n_components;
165
169 using time_type = typename FunctionTime<
171
177 explicit Function(const unsigned int n_components = 1,
178 const time_type initial_time = 0.0);
179
183 Function(const Function &f) = default;
184
206 virtual ~Function() override = 0;
207
214 Function &
216
223 virtual RangeNumberType
224 value(const Point<dim> &p, const unsigned int component = 0) const;
225
233 virtual void
235
245 virtual void
246 value_list(const std::vector<Point<dim>> &points,
247 std::vector<RangeNumberType> &values,
248 const unsigned int component = 0) const;
249
260 virtual void
261 vector_value_list(const std::vector<Point<dim>> &points,
262 std::vector<Vector<RangeNumberType>> &values) const;
263
272 virtual void
273 vector_values(const std::vector<Point<dim>> &points,
274 std::vector<std::vector<RangeNumberType>> &values) const;
275
281 gradient(const Point<dim> &p, const unsigned int component = 0) const;
282
286 virtual void
288 const Point<dim> &p,
289 std::vector<Tensor<1, dim, RangeNumberType>> &gradients) const;
290
297 virtual void
298 gradient_list(const std::vector<Point<dim>> &points,
299 std::vector<Tensor<1, dim, RangeNumberType>> &gradients,
300 const unsigned int component = 0) const;
301
310 virtual void
312 const std::vector<Point<dim>> &points,
313 std::vector<std::vector<Tensor<1, dim, RangeNumberType>>> &gradients) const;
314
324 virtual void
326 const std::vector<Point<dim>> &points,
327 std::vector<std::vector<Tensor<1, dim, RangeNumberType>>> &gradients) const;
328
332 virtual RangeNumberType
333 laplacian(const Point<dim> &p, const unsigned int component = 0) const;
334
339 virtual void
341
345 virtual void
346 laplacian_list(const std::vector<Point<dim>> &points,
347 std::vector<RangeNumberType> &values,
348 const unsigned int component = 0) const;
349
353 virtual void
354 vector_laplacian_list(const std::vector<Point<dim>> &points,
355 std::vector<Vector<RangeNumberType>> &values) const;
356
362 hessian(const Point<dim> &p, const unsigned int component = 0) const;
363
368 virtual void
370 const Point<dim> &p,
371 std::vector<SymmetricTensor<2, dim, RangeNumberType>> &values) const;
372
376 virtual void
377 hessian_list(const std::vector<Point<dim>> &points,
378 std::vector<SymmetricTensor<2, dim, RangeNumberType>> &values,
379 const unsigned int component = 0) const;
380
384 virtual void
386 const std::vector<Point<dim>> &points,
387 std::vector<std::vector<SymmetricTensor<2, dim, RangeNumberType>>> &values)
388 const;
389
390
396 virtual std::size_t
398};
399
400
401namespace Functions
402{
409 template <int dim, typename RangeNumberType = double>
410 class ConstantFunction : public Function<dim, RangeNumberType>
411 {
412 public:
417 explicit ConstantFunction(const RangeNumberType value,
418 const unsigned int n_components = 1);
419
425 explicit ConstantFunction(const std::vector<RangeNumberType> &values);
426
433
438 ConstantFunction(const RangeNumberType *begin_ptr,
439 const unsigned int n_components);
440
441 virtual RangeNumberType
442 value(const Point<dim> &p, const unsigned int component = 0) const override;
443
444 virtual void
446 Vector<RangeNumberType> &return_value) const override;
447
448 virtual void
449 value_list(const std::vector<Point<dim>> &points,
450 std::vector<RangeNumberType> &return_values,
451 const unsigned int component = 0) const override;
452
453 virtual void
455 const std::vector<Point<dim>> &points,
456 std::vector<Vector<RangeNumberType>> &return_values) const override;
457
460 const unsigned int component = 0) const override;
461
462 virtual void
464 const Point<dim> &p,
465 std::vector<Tensor<1, dim, RangeNumberType>> &gradients) const override;
466
467 virtual void
468 gradient_list(const std::vector<Point<dim>> &points,
469 std::vector<Tensor<1, dim, RangeNumberType>> &gradients,
470 const unsigned int component = 0) const override;
471
472 virtual void
474 const std::vector<Point<dim>> &points,
475 std::vector<std::vector<Tensor<1, dim, RangeNumberType>>> &gradients)
476 const override;
477
479 hessian(const Point<dim> &point,
480 const unsigned int component = 0) const override;
481
482 virtual RangeNumberType
483 laplacian(const Point<dim> &point,
484 const unsigned int component = 0) const override;
485
486 virtual std::size_t
487 memory_consumption() const override;
488
489 protected:
493 std::vector<RangeNumberType> function_value_vector;
494 };
495
496
497
509 template <int dim, typename RangeNumberType = double>
510 class ZeroFunction : public ConstantFunction<dim, RangeNumberType>
511 {
512 public:
516 explicit ZeroFunction(const unsigned int n_components = 1);
517 };
518
529 template <int dim, typename RangeNumberType = double>
530 class IdentityFunction : public Function<dim, RangeNumberType>
531 {
532 public:
537
541 virtual RangeNumberType
542 value(const Point<dim> &p, const unsigned int component = 0) const override;
543
549 const unsigned int component = 0) const override;
550
554 virtual RangeNumberType
556 const unsigned int component = 0) const override;
557
563 const unsigned int component = 0) const override;
564 };
565} // namespace Functions
566
580template <int dim, typename RangeNumberType = double>
582 : public Functions::ConstantFunction<dim, RangeNumberType>
583{
584public:
590 ComponentSelectFunction(const unsigned int selected,
591 const RangeNumberType value,
592 const unsigned int n_components);
593
598 ComponentSelectFunction(const unsigned int selected,
599 const unsigned int n_components);
600
608 ComponentSelectFunction(const std::pair<unsigned int, unsigned int> &selected,
609 const unsigned int n_components);
610
611
625 virtual void
628
632 virtual void
634 Vector<RangeNumberType> &return_value) const override;
635
642 virtual void
644 const std::vector<Point<dim>> &points,
645 std::vector<Vector<RangeNumberType>> &values) const override;
646
650 virtual std::size_t
651 memory_consumption() const override;
652
653protected:
657 const std::pair<unsigned int, unsigned int> selected_components;
658};
659
660
661
802template <int dim, typename RangeNumberType = double>
803class ScalarFunctionFromFunctionObject : public Function<dim, RangeNumberType>
804{
805public:
812 const std::function<RangeNumberType(const Point<dim> &)> &function_object);
813
820 const std::function<RangeNumberType(const double, const Point<dim> &)>
821 &function_object_t);
822
827 virtual RangeNumberType
828 value(const Point<dim> &p, const unsigned int component = 0) const override;
829
830private:
835 const std::function<RangeNumberType(const double, const Point<dim> &)>
837};
838
839
840
879template <int dim, typename RangeNumberType = double>
881 : public Function<dim, RangeNumberType>
882{
883public:
897 const std::function<RangeNumberType(const Point<dim> &)> &function_object,
898 const unsigned int selected_component,
899 const unsigned int n_components);
900
905 virtual RangeNumberType
906 value(const Point<dim> &p, const unsigned int component = 0) const override;
907
913 virtual void
915 Vector<RangeNumberType> &values) const override;
916
917private:
922 const std::function<RangeNumberType(const Point<dim> &)> function_object;
923
928 const unsigned int selected_component;
929};
930
931
967template <int dim, typename RangeNumberType = double>
968class FunctionFromFunctionObjects : public Function<dim, RangeNumberType>
969{
970public:
979 explicit FunctionFromFunctionObjects(const unsigned int n_components = 1,
980 const double initial_time = 0);
981
991 const std::vector<std::function<RangeNumberType(const Point<dim> &)>>
992 &values,
993 const double initial_time = 0.0);
994
1004 const std::function<RangeNumberType(const Point<dim> &, const unsigned int)>
1005 &values,
1006 const unsigned int n_components,
1007 const double initial_time = 0.0);
1008
1018 const std::vector<std::function<RangeNumberType(const Point<dim> &)>>
1019 &values,
1020 const std::vector<
1021 std::function<Tensor<1, dim, RangeNumberType>(const Point<dim> &)>>
1022 &gradients,
1023 const double initial_time = 0.0);
1024
1025
1032 virtual RangeNumberType
1033 value(const Point<dim> &p, const unsigned int component = 0) const override;
1034
1043 const unsigned int component = 0) const override;
1044
1050 void
1052 const std::vector<std::function<RangeNumberType(const Point<dim> &)>>
1053 &values);
1054
1060 void
1062 const std::vector<
1063 std::function<Tensor<1, dim, RangeNumberType>(const Point<dim> &)>>
1064 &gradients);
1065
1066private:
1070 std::function<RangeNumberType(const Point<dim> &, const unsigned int)>
1072
1076 std::function<Tensor<1, dim, RangeNumberType>(const Point<dim> &,
1077 const unsigned int)>
1079};
1080
1081
1117template <int dim, typename RangeNumberType = double>
1118class VectorFunctionFromTensorFunction : public Function<dim, RangeNumberType>
1119{
1120public:
1139 const unsigned int selected_component = 0,
1140 const unsigned int n_components = dim);
1141
1146 virtual ~VectorFunctionFromTensorFunction() override = default;
1147
1151 virtual RangeNumberType
1152 value(const Point<dim> &p, const unsigned int component = 0) const override;
1153
1159 virtual void
1161 Vector<RangeNumberType> &values) const override;
1162
1170 virtual void
1172 const std::vector<Point<dim>> &points,
1173 std::vector<Vector<RangeNumberType>> &value_list) const override;
1174
1181 const unsigned int component = 0) const override;
1182
1186 virtual void
1188 const Point<dim> &p,
1189 std::vector<Tensor<1, dim, RangeNumberType>> &gradients) const override;
1190
1197 virtual void
1198 gradient_list(const std::vector<Point<dim>> &points,
1199 std::vector<Tensor<1, dim, RangeNumberType>> &gradients,
1200 const unsigned int component = 0) const override;
1201
1210 virtual void
1211 vector_gradients(const std::vector<Point<dim>> &points,
1212 std::vector<std::vector<Tensor<1, dim, RangeNumberType>>>
1213 &gradients) const override;
1214
1224 virtual void
1225 vector_gradient_list(const std::vector<Point<dim>> &points,
1226 std::vector<std::vector<Tensor<1, dim, RangeNumberType>>>
1227 &gradients) const override;
1228
1229private:
1235
1242 const unsigned int selected_component;
1243};
1244
1245
1246#ifndef DOXYGEN
1247// icc 2018 complains about an undefined reference
1248// if we put this in the templates.h file
1249//
1250// The destructor is pure virtual so we can't default it
1251// in the declaration.
1252template <int dim, typename RangeNumberType>
1254#endif
1255
1256
1258
1259#endif
const std::pair< unsigned int, unsigned int > selected_components
Definition function.h:657
virtual std::size_t memory_consumption() const override
ComponentSelectFunction(const std::pair< unsigned int, unsigned int > &selected, const unsigned int n_components)
virtual void vector_value(const Point< dim > &p, Vector< RangeNumberType > &return_value) const override
ComponentSelectFunction(const unsigned int selected, const unsigned int n_components)
virtual void substitute_function_value_with(const Functions::ConstantFunction< dim, RangeNumberType > &f)
virtual void vector_value_list(const std::vector< Point< dim > > &points, std::vector< Vector< RangeNumberType > > &values) const override
ComponentSelectFunction(const unsigned int selected, const RangeNumberType value, const unsigned int n_components)
virtual RangeNumberType value(const Point< dim > &p, const unsigned int component=0) const override
std::function< RangeNumberType(const Point< dim > &, const unsigned int)> function_values
Definition function.h:1071
virtual Tensor< 1, dim, RangeNumberType > gradient(const Point< dim > &p, const unsigned int component=0) const override
FunctionFromFunctionObjects(const std::vector< std::function< RangeNumberType(const Point< dim > &)> > &values, const std::vector< std::function< Tensor< 1, dim, RangeNumberType >(const Point< dim > &)> > &gradients, const double initial_time=0.0)
std::function< Tensor< 1, dim, RangeNumberType >(const Point< dim > &, const unsigned int)> function_gradients
Definition function.h:1078
FunctionFromFunctionObjects(const std::vector< std::function< RangeNumberType(const Point< dim > &)> > &values, const double initial_time=0.0)
FunctionFromFunctionObjects(const std::function< RangeNumberType(const Point< dim > &, const unsigned int)> &values, const unsigned int n_components, const double initial_time=0.0)
void set_function_values(const std::vector< std::function< RangeNumberType(const Point< dim > &)> > &values)
FunctionFromFunctionObjects(const unsigned int n_components=1, const double initial_time=0)
void set_function_gradients(const std::vector< std::function< Tensor< 1, dim, RangeNumberType >(const Point< dim > &)> > &gradients)
virtual void vector_gradient(const Point< dim > &p, std::vector< Tensor< 1, dim, RangeNumberType > > &gradients) const
virtual void vector_laplacian_list(const std::vector< Point< dim > > &points, std::vector< Vector< RangeNumberType > > &values) const
virtual void vector_values(const std::vector< Point< dim > > &points, std::vector< std::vector< RangeNumberType > > &values) const
static constexpr unsigned int dimension
Definition function.h:159
virtual void vector_laplacian(const Point< dim > &p, Vector< RangeNumberType > &values) const
virtual SymmetricTensor< 2, dim, RangeNumberType > hessian(const Point< dim > &p, const unsigned int component=0) const
typename FunctionTime< typename numbers::NumberTraits< RangeNumberType >::real_type >::time_type time_type
Definition function.h:170
Function & operator=(const Function &f)
virtual std::size_t memory_consumption() const
virtual void gradient_list(const std::vector< Point< dim > > &points, std::vector< Tensor< 1, dim, RangeNumberType > > &gradients, const unsigned int component=0) const
virtual Tensor< 1, dim, RangeNumberType > gradient(const Point< dim > &p, const unsigned int component=0) const
virtual void vector_value_list(const std::vector< Point< dim > > &points, std::vector< Vector< RangeNumberType > > &values) const
const unsigned int n_components
Definition function.h:164
virtual RangeNumberType laplacian(const Point< dim > &p, const unsigned int component=0) const
virtual ~Function() override=0
Function(const unsigned int n_components=1, const time_type initial_time=0.0)
virtual void laplacian_list(const std::vector< Point< dim > > &points, std::vector< RangeNumberType > &values, const unsigned int component=0) const
virtual void vector_hessian_list(const std::vector< Point< dim > > &points, std::vector< std::vector< SymmetricTensor< 2, dim, RangeNumberType > > > &values) const
virtual void value_list(const std::vector< Point< dim > > &points, std::vector< RangeNumberType > &values, const unsigned int component=0) const
virtual void vector_gradient_list(const std::vector< Point< dim > > &points, std::vector< std::vector< Tensor< 1, dim, RangeNumberType > > > &gradients) const
virtual RangeNumberType value(const Point< dim > &p, const unsigned int component=0) const
virtual void vector_hessian(const Point< dim > &p, std::vector< SymmetricTensor< 2, dim, RangeNumberType > > &values) const
virtual void vector_gradients(const std::vector< Point< dim > > &points, std::vector< std::vector< Tensor< 1, dim, RangeNumberType > > > &gradients) const
virtual void vector_value(const Point< dim > &p, Vector< RangeNumberType > &values) const
virtual void hessian_list(const std::vector< Point< dim > > &points, std::vector< SymmetricTensor< 2, dim, RangeNumberType > > &values, const unsigned int component=0) const
Function(const Function &f)=default
virtual std::size_t memory_consumption() const override
virtual void value_list(const std::vector< Point< dim > > &points, std::vector< RangeNumberType > &return_values, const unsigned int component=0) const override
ConstantFunction(const RangeNumberType *begin_ptr, const unsigned int n_components)
virtual RangeNumberType laplacian(const Point< dim > &point, const unsigned int component=0) const override
virtual void gradient_list(const std::vector< Point< dim > > &points, std::vector< Tensor< 1, dim, RangeNumberType > > &gradients, const unsigned int component=0) const override
virtual void vector_gradient(const Point< dim > &p, std::vector< Tensor< 1, dim, RangeNumberType > > &gradients) const override
virtual SymmetricTensor< 2, dim, RangeNumberType > hessian(const Point< dim > &point, const unsigned int component=0) const override
ConstantFunction(const RangeNumberType value, const unsigned int n_components=1)
virtual RangeNumberType value(const Point< dim > &p, const unsigned int component=0) const override
virtual Tensor< 1, dim, RangeNumberType > gradient(const Point< dim > &p, const unsigned int component=0) const override
virtual void vector_value_list(const std::vector< Point< dim > > &points, std::vector< Vector< RangeNumberType > > &return_values) const override
ConstantFunction(const std::vector< RangeNumberType > &values)
virtual void vector_gradient_list(const std::vector< Point< dim > > &points, std::vector< std::vector< Tensor< 1, dim, RangeNumberType > > > &gradients) const override
std::vector< RangeNumberType > function_value_vector
Definition function.h:493
ConstantFunction(const Vector< RangeNumberType > &values)
virtual void vector_value(const Point< dim > &p, Vector< RangeNumberType > &return_value) const override
virtual SymmetricTensor< 2, dim, RangeNumberType > hessian(const Point< dim > &p, const unsigned int component=0) const override
virtual RangeNumberType value(const Point< dim > &p, const unsigned int component=0) const override
virtual RangeNumberType laplacian(const Point< dim > &p, const unsigned int component=0) const override
virtual Tensor< 1, dim, RangeNumberType > gradient(const Point< dim > &p, const unsigned int component=0) const override
ZeroFunction(const unsigned int n_components=1)
Definition point.h:113
ScalarFunctionFromFunctionObject(const std::function< RangeNumberType(const double, const Point< dim > &)> &function_object_t)
virtual RangeNumberType value(const Point< dim > &p, const unsigned int component=0) const override
const std::function< RangeNumberType(const double, const Point< dim > &)> function_object
Definition function.h:836
ScalarFunctionFromFunctionObject(const std::function< RangeNumberType(const Point< dim > &)> &function_object)
const std::function< RangeNumberType(const Point< dim > &)> function_object
Definition function.h:922
const unsigned int selected_component
Definition function.h:928
virtual void vector_value(const Point< dim > &p, Vector< RangeNumberType > &values) const override
virtual RangeNumberType value(const Point< dim > &p, const unsigned int component=0) const override
VectorFunctionFromScalarFunctionObject(const std::function< RangeNumberType(const Point< dim > &)> &function_object, const unsigned int selected_component, const unsigned int n_components)
virtual Tensor< 1, dim, RangeNumberType > gradient(const Point< dim > &p, const unsigned int component=0) const override
virtual void vector_gradient(const Point< dim > &p, std::vector< Tensor< 1, dim, RangeNumberType > > &gradients) const override
virtual RangeNumberType value(const Point< dim > &p, const unsigned int component=0) const override
virtual void vector_gradients(const std::vector< Point< dim > > &points, std::vector< std::vector< Tensor< 1, dim, RangeNumberType > > > &gradients) const override
virtual void vector_gradient_list(const std::vector< Point< dim > > &points, std::vector< std::vector< Tensor< 1, dim, RangeNumberType > > > &gradients) const override
const TensorFunction< 1, dim, RangeNumberType > & tensor_function
Definition function.h:1234
virtual void gradient_list(const std::vector< Point< dim > > &points, std::vector< Tensor< 1, dim, RangeNumberType > > &gradients, const unsigned int component=0) const override
virtual void vector_value_list(const std::vector< Point< dim > > &points, std::vector< Vector< RangeNumberType > > &value_list) const override
VectorFunctionFromTensorFunction(const TensorFunction< 1, dim, RangeNumberType > &tensor_function, const unsigned int selected_component=0, const unsigned int n_components=dim)
virtual ~VectorFunctionFromTensorFunction() override=default
virtual void vector_value(const Point< dim > &p, Vector< RangeNumberType > &values) const override
const unsigned int selected_component
Definition function.h:1242
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:518
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:519