deal.II version GIT relicensing-6809-ge913b9bb34 2026-09-25 17:20:01+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: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 1998 - 2025 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
13#ifndef dealii_function_h
14#define dealii_function_h
15
16
17#include <deal.II/base/config.h>
18
23#include <deal.II/base/point.h>
25#include <deal.II/base/tensor.h>
26
27#include <functional>
28#include <vector>
29
31
32// Forward declarations
33#ifndef DOXYGEN
34template <typename number>
35class Vector;
36template <int rank, int dim, typename Number>
37class TensorFunction;
38#endif
39
147template <int dim, typename RangeNumberType = double>
148class Function : public FunctionTime<
149 typename numbers::NumberTraits<RangeNumberType>::real_type>,
151{
152public:
157 static constexpr unsigned int dimension = dim;
158
162 const unsigned int n_components;
163
167 using time_type = typename FunctionTime<
169
175 explicit Function(const unsigned int n_components = 1,
176 const time_type initial_time = 0.0);
177
181 Function(const Function &f) = default;
182
204 virtual ~Function() override = 0;
205
212 Function &
214
221 virtual RangeNumberType
222 value(const Point<dim> &p, const unsigned int component = 0) const;
223
231 virtual void
233
243 virtual void
244 value_list(const std::vector<Point<dim>> &points,
245 std::vector<RangeNumberType> &values,
246 const unsigned int component = 0) const;
247
258 virtual void
259 vector_value_list(const std::vector<Point<dim>> &points,
260 std::vector<Vector<RangeNumberType>> &values) const;
261
270 virtual void
271 vector_values(const std::vector<Point<dim>> &points,
272 std::vector<std::vector<RangeNumberType>> &values) const;
273
279 gradient(const Point<dim> &p, const unsigned int component = 0) const;
280
284 virtual void
286 const Point<dim> &p,
287 std::vector<Tensor<1, dim, RangeNumberType>> &gradients) const;
288
295 virtual void
296 gradient_list(const std::vector<Point<dim>> &points,
297 std::vector<Tensor<1, dim, RangeNumberType>> &gradients,
298 const unsigned int component = 0) const;
299
308 virtual void
310 const std::vector<Point<dim>> &points,
311 std::vector<std::vector<Tensor<1, dim, RangeNumberType>>> &gradients) const;
312
322 virtual void
324 const std::vector<Point<dim>> &points,
325 std::vector<std::vector<Tensor<1, dim, RangeNumberType>>> &gradients) const;
326
330 virtual RangeNumberType
331 laplacian(const Point<dim> &p, const unsigned int component = 0) const;
332
337 virtual void
339
343 virtual void
344 laplacian_list(const std::vector<Point<dim>> &points,
345 std::vector<RangeNumberType> &values,
346 const unsigned int component = 0) const;
347
351 virtual void
352 vector_laplacian_list(const std::vector<Point<dim>> &points,
353 std::vector<Vector<RangeNumberType>> &values) const;
354
360 hessian(const Point<dim> &p, const unsigned int component = 0) const;
361
366 virtual void
368 const Point<dim> &p,
369 std::vector<SymmetricTensor<2, dim, RangeNumberType>> &values) const;
370
374 virtual void
375 hessian_list(const std::vector<Point<dim>> &points,
376 std::vector<SymmetricTensor<2, dim, RangeNumberType>> &values,
377 const unsigned int component = 0) const;
378
382 virtual void
384 const std::vector<Point<dim>> &points,
385 std::vector<std::vector<SymmetricTensor<2, dim, RangeNumberType>>> &values)
386 const;
387
388
394 virtual std::size_t
396};
397
398
399namespace Functions
400{
407 template <int dim, typename RangeNumberType = double>
408 class ConstantFunction : public Function<dim, RangeNumberType>
409 {
410 public:
415 explicit ConstantFunction(const RangeNumberType value,
416 const unsigned int n_components = 1);
417
423 explicit ConstantFunction(const std::vector<RangeNumberType> &values);
424
431
436 ConstantFunction(const RangeNumberType *begin_ptr,
437 const unsigned int n_components);
438
439 virtual RangeNumberType
440 value(const Point<dim> &p, const unsigned int component = 0) const override;
441
442 virtual void
444 Vector<RangeNumberType> &return_value) const override;
445
446 virtual void
447 value_list(const std::vector<Point<dim>> &points,
448 std::vector<RangeNumberType> &return_values,
449 const unsigned int component = 0) const override;
450
451 virtual void
453 const std::vector<Point<dim>> &points,
454 std::vector<Vector<RangeNumberType>> &return_values) const override;
455
458 const unsigned int component = 0) const override;
459
460 virtual void
462 const Point<dim> &p,
463 std::vector<Tensor<1, dim, RangeNumberType>> &gradients) const override;
464
465 virtual void
466 gradient_list(const std::vector<Point<dim>> &points,
467 std::vector<Tensor<1, dim, RangeNumberType>> &gradients,
468 const unsigned int component = 0) const override;
469
470 virtual void
472 const std::vector<Point<dim>> &points,
473 std::vector<std::vector<Tensor<1, dim, RangeNumberType>>> &gradients)
474 const override;
475
477 hessian(const Point<dim> &point,
478 const unsigned int component = 0) const override;
479
480 virtual RangeNumberType
481 laplacian(const Point<dim> &point,
482 const unsigned int component = 0) const override;
483
484 virtual std::size_t
485 memory_consumption() const override;
486
487 protected:
491 std::vector<RangeNumberType> function_value_vector;
492 };
493
494
495
507 template <int dim, typename RangeNumberType = double>
508 class ZeroFunction : public ConstantFunction<dim, RangeNumberType>
509 {
510 public:
514 explicit ZeroFunction(const unsigned int n_components = 1);
515 };
516
527 template <int dim, typename RangeNumberType = double>
528 class IdentityFunction : public Function<dim, RangeNumberType>
529 {
530 public:
535
539 virtual RangeNumberType
540 value(const Point<dim> &p, const unsigned int component = 0) const override;
541
547 const unsigned int component = 0) const override;
548
552 virtual RangeNumberType
554 const unsigned int component = 0) const override;
555
561 const unsigned int component = 0) const override;
562 };
563} // namespace Functions
564
578template <int dim, typename RangeNumberType = double>
580 : public Functions::ConstantFunction<dim, RangeNumberType>
581{
582public:
588 ComponentSelectFunction(const unsigned int selected,
589 const RangeNumberType value,
590 const unsigned int n_components);
591
596 ComponentSelectFunction(const unsigned int selected,
597 const unsigned int n_components);
598
606 ComponentSelectFunction(const std::pair<unsigned int, unsigned int> &selected,
607 const unsigned int n_components);
608
609
623 virtual void
626
630 virtual void
632 Vector<RangeNumberType> &return_value) const override;
633
640 virtual void
642 const std::vector<Point<dim>> &points,
643 std::vector<Vector<RangeNumberType>> &values) const override;
644
648 virtual std::size_t
649 memory_consumption() const override;
650
651protected:
655 const std::pair<unsigned int, unsigned int> selected_components;
656};
657
658
659
800template <int dim, typename RangeNumberType = double>
801class ScalarFunctionFromFunctionObject : public Function<dim, RangeNumberType>
802{
803public:
810 const std::function<RangeNumberType(const Point<dim> &)> &function_object);
811
818 const std::function<RangeNumberType(const double, const Point<dim> &)>
819 &function_object_t);
820
825 virtual RangeNumberType
826 value(const Point<dim> &p, const unsigned int component = 0) const override;
827
828private:
833 const std::function<RangeNumberType(const double, const Point<dim> &)>
835};
836
837
838
877template <int dim, typename RangeNumberType = double>
879 : public Function<dim, RangeNumberType>
880{
881public:
895 const std::function<RangeNumberType(const Point<dim> &)> &function_object,
896 const unsigned int selected_component,
897 const unsigned int n_components);
898
903 virtual RangeNumberType
904 value(const Point<dim> &p, const unsigned int component = 0) const override;
905
911 virtual void
913 Vector<RangeNumberType> &values) const override;
914
915private:
920 const std::function<RangeNumberType(const Point<dim> &)> function_object;
921
926 const unsigned int selected_component;
927};
928
929
965template <int dim, typename RangeNumberType = double>
966class FunctionFromFunctionObjects : public Function<dim, RangeNumberType>
967{
968public:
977 explicit FunctionFromFunctionObjects(const unsigned int n_components = 1,
978 const double initial_time = 0);
979
989 const std::vector<std::function<RangeNumberType(const Point<dim> &)>>
990 &values,
991 const double initial_time = 0.0);
992
1002 const std::function<RangeNumberType(const Point<dim> &, const unsigned int)>
1003 &values,
1004 const unsigned int n_components,
1005 const double initial_time = 0.0);
1006
1016 const std::vector<std::function<RangeNumberType(const Point<dim> &)>>
1017 &values,
1018 const std::vector<
1019 std::function<Tensor<1, dim, RangeNumberType>(const Point<dim> &)>>
1020 &gradients,
1021 const double initial_time = 0.0);
1022
1023
1030 virtual RangeNumberType
1031 value(const Point<dim> &p, const unsigned int component = 0) const override;
1032
1041 const unsigned int component = 0) const override;
1042
1048 void
1050 const std::vector<std::function<RangeNumberType(const Point<dim> &)>>
1051 &values);
1052
1058 void
1060 const std::vector<
1061 std::function<Tensor<1, dim, RangeNumberType>(const Point<dim> &)>>
1062 &gradients);
1063
1064private:
1068 std::function<RangeNumberType(const Point<dim> &, const unsigned int)>
1070
1074 std::function<Tensor<1, dim, RangeNumberType>(const Point<dim> &,
1075 const unsigned int)>
1077};
1078
1079
1115template <int dim, typename RangeNumberType = double>
1116class VectorFunctionFromTensorFunction : public Function<dim, RangeNumberType>
1117{
1118public:
1137 const unsigned int selected_component = 0,
1138 const unsigned int n_components = dim);
1139
1144 virtual ~VectorFunctionFromTensorFunction() override = default;
1145
1149 virtual RangeNumberType
1150 value(const Point<dim> &p, const unsigned int component = 0) const override;
1151
1157 virtual void
1159 Vector<RangeNumberType> &values) const override;
1160
1168 virtual void
1170 const std::vector<Point<dim>> &points,
1171 std::vector<Vector<RangeNumberType>> &value_list) const override;
1172
1179 const unsigned int component = 0) const override;
1180
1184 virtual void
1186 const Point<dim> &p,
1187 std::vector<Tensor<1, dim, RangeNumberType>> &gradients) const override;
1188
1195 virtual void
1196 gradient_list(const std::vector<Point<dim>> &points,
1197 std::vector<Tensor<1, dim, RangeNumberType>> &gradients,
1198 const unsigned int component = 0) const override;
1199
1208 virtual void
1209 vector_gradients(const std::vector<Point<dim>> &points,
1210 std::vector<std::vector<Tensor<1, dim, RangeNumberType>>>
1211 &gradients) const override;
1212
1222 virtual void
1223 vector_gradient_list(const std::vector<Point<dim>> &points,
1224 std::vector<std::vector<Tensor<1, dim, RangeNumberType>>>
1225 &gradients) const override;
1226
1227private:
1233
1240 const unsigned int selected_component;
1241};
1242
1243
1278template <int dim, typename RangeNumberType = double>
1280 : public Function<dim, RangeNumberType>
1281{
1282public:
1300 const std::function<Tensor<1, dim, RangeNumberType>(const Point<dim> &)>
1302 const unsigned int selected_component = 0,
1303 const unsigned int n_components = dim);
1304
1309 virtual ~VectorFunctionFromTensorFunctionObject() override = default;
1310
1314 virtual RangeNumberType
1315 value(const Point<dim> &p, const unsigned int component = 0) const override;
1316
1322 virtual void
1324 Vector<RangeNumberType> &values) const override;
1325
1333 virtual void
1335 const std::vector<Point<dim>> &points,
1336 std::vector<Vector<RangeNumberType>> &value_list) const override;
1337
1338private:
1343 const std::function<Tensor<1, dim, RangeNumberType>(const Point<dim> &)>
1345
1352 const unsigned int selected_component;
1353};
1354
1355
1356#ifndef DOXYGEN
1357// icc 2018 complains about an undefined reference
1358// if we put this in the templates.h file
1359//
1360// The destructor is pure virtual so we can't default it
1361// in the declaration.
1362template <int dim, typename RangeNumberType>
1364#endif
1365
1366
1368
1369#endif
const std::pair< unsigned int, unsigned int > selected_components
Definition function.h:655
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:1069
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:1076
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:157
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:168
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:162
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:491
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:111
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:834
ScalarFunctionFromFunctionObject(const std::function< RangeNumberType(const Point< dim > &)> &function_object)
const std::function< RangeNumberType(const Point< dim > &)> function_object
Definition function.h:920
const unsigned int selected_component
Definition function.h:926
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)
const std::function< Tensor< 1, dim, RangeNumberType >(const Point< dim > &)> tensor_function_object
Definition function.h:1344
VectorFunctionFromTensorFunctionObject(const std::function< Tensor< 1, dim, RangeNumberType >(const Point< dim > &)> &tensor_function_object, const unsigned int selected_component=0, const unsigned int n_components=dim)
virtual ~VectorFunctionFromTensorFunctionObject() override=default
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
virtual void vector_value_list(const std::vector< Point< dim > > &points, std::vector< Vector< RangeNumberType > > &value_list) const override
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:1232
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:1240
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39