Reference documentation for deal.II version 9.1.0-pre
function.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 1998 - 2017 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE.md at
12 // the top level directory of deal.II.
13 //
14 // ---------------------------------------------------------------------
15 
16 #ifndef dealii_function_h
17 #define dealii_function_h
18 
19 
20 #include <deal.II/base/config.h>
21 
22 #include <deal.II/base/exceptions.h>
23 #include <deal.II/base/function_time.h>
24 #include <deal.II/base/point.h>
25 #include <deal.II/base/subscriptor.h>
27 #include <deal.II/base/tensor.h>
28 
29 #include <functional>
30 #include <vector>
31 
32 DEAL_II_NAMESPACE_OPEN
33 
34 
35 template <typename number>
36 class Vector;
37 template <int rank, int dim, typename Number>
39 
147 template <int dim, typename RangeNumberType = double>
148 class Function : public FunctionTime<RangeNumberType>, public Subscriptor
149 {
150 public:
155  static const unsigned int dimension = dim;
156 
160  const unsigned int n_components;
161 
167  Function(const unsigned int n_components = 1,
168  const RangeNumberType initial_time = 0.0);
169 
191  virtual ~Function() override = 0;
192 
199  Function &
200  operator=(const Function &f);
201 
208  virtual RangeNumberType
209  value(const Point<dim> &p, const unsigned int component = 0) const;
210 
218  virtual void
219  vector_value(const Point<dim> &p, Vector<RangeNumberType> &values) const;
220 
230  virtual void
231  value_list(const std::vector<Point<dim>> &points,
232  std::vector<RangeNumberType> & values,
233  const unsigned int component = 0) const;
234 
245  virtual void
246  vector_value_list(const std::vector<Point<dim>> & points,
247  std::vector<Vector<RangeNumberType>> &values) const;
248 
257  virtual void
258  vector_values(const std::vector<Point<dim>> & points,
259  std::vector<std::vector<RangeNumberType>> &values) const;
260 
266  gradient(const Point<dim> &p, const unsigned int component = 0) const;
267 
271  virtual void
273  const Point<dim> & p,
274  std::vector<Tensor<1, dim, RangeNumberType>> &gradients) const;
275 
282  virtual void
283  gradient_list(const std::vector<Point<dim>> & points,
284  std::vector<Tensor<1, dim, RangeNumberType>> &gradients,
285  const unsigned int component = 0) const;
286 
295  virtual void
297  const std::vector<Point<dim>> & points,
298  std::vector<std::vector<Tensor<1, dim, RangeNumberType>>> &gradients) const;
299 
309  virtual void
311  const std::vector<Point<dim>> & points,
312  std::vector<std::vector<Tensor<1, dim, RangeNumberType>>> &gradients) const;
313 
317  virtual RangeNumberType
318  laplacian(const Point<dim> &p, const unsigned int component = 0) const;
319 
324  virtual void
325  vector_laplacian(const Point<dim> &p, Vector<RangeNumberType> &values) const;
326 
330  virtual void
331  laplacian_list(const std::vector<Point<dim>> &points,
332  std::vector<RangeNumberType> & values,
333  const unsigned int component = 0) const;
334 
338  virtual void
339  vector_laplacian_list(const std::vector<Point<dim>> & points,
340  std::vector<Vector<RangeNumberType>> &values) const;
341 
347  hessian(const Point<dim> &p, const unsigned int component = 0) const;
348 
353  virtual void
355  const Point<dim> & p,
356  std::vector<SymmetricTensor<2, dim, RangeNumberType>> &values) const;
357 
361  virtual void
362  hessian_list(const std::vector<Point<dim>> & points,
363  std::vector<SymmetricTensor<2, dim, RangeNumberType>> &values,
364  const unsigned int component = 0) const;
365 
369  virtual void
371  const std::vector<Point<dim>> & points,
372  std::vector<std::vector<SymmetricTensor<2, dim, RangeNumberType>>> &values)
373  const;
374 
375 
381  std::size_t
382  memory_consumption() const;
383 };
384 
385 
386 namespace Functions
387 {
395  template <int dim, typename RangeNumberType = double>
396  class ConstantFunction : public Function<dim, RangeNumberType>
397  {
398  public:
403  ConstantFunction(const RangeNumberType value,
404  const unsigned int n_components = 1);
405 
411  ConstantFunction(const std::vector<RangeNumberType> &values);
412 
418  ConstantFunction(const Vector<RangeNumberType> &values);
419 
424  ConstantFunction(const RangeNumberType *begin_ptr,
425  const unsigned int n_components);
426 
427  virtual RangeNumberType
428  value(const Point<dim> &p, const unsigned int component = 0) const override;
429 
430  virtual void
431  vector_value(const Point<dim> & p,
432  Vector<RangeNumberType> &return_value) const override;
433 
434  virtual void
435  value_list(const std::vector<Point<dim>> &points,
436  std::vector<RangeNumberType> & return_values,
437  const unsigned int component = 0) const override;
438 
439  virtual void
441  const std::vector<Point<dim>> & points,
442  std::vector<Vector<RangeNumberType>> &return_values) const override;
443 
445  gradient(const Point<dim> & p,
446  const unsigned int component = 0) const override;
447 
448  virtual void
450  const Point<dim> & p,
451  std::vector<Tensor<1, dim, RangeNumberType>> &gradients) const override;
452 
453  virtual void
454  gradient_list(const std::vector<Point<dim>> & points,
455  std::vector<Tensor<1, dim, RangeNumberType>> &gradients,
456  const unsigned int component = 0) const override;
457 
458  virtual void
460  const std::vector<Point<dim>> & points,
461  std::vector<std::vector<Tensor<1, dim, RangeNumberType>>> &gradients)
462  const override;
463 
464  std::size_t
465  memory_consumption() const;
466 
467  protected:
471  std::vector<RangeNumberType> function_value_vector;
472  };
473 
474 
475 
488  template <int dim, typename RangeNumberType = double>
489  class ZeroFunction : public ConstantFunction<dim, RangeNumberType>
490  {
491  public:
495  ZeroFunction(const unsigned int n_components = 1);
496  };
497 
498 } // namespace Functions
499 
506 template <int dim, typename RangeNumberType = double>
507 using ConstantFunction DEAL_II_DEPRECATED =
509 
515 template <int dim, typename RangeNumberType = double>
516 using ZeroFunction DEAL_II_DEPRECATED =
518 
519 
520 
535 template <int dim, typename RangeNumberType = double>
536 class ComponentSelectFunction : public ConstantFunction<dim, RangeNumberType>
537 {
538 public:
544  ComponentSelectFunction(const unsigned int selected,
545  const RangeNumberType value,
546  const unsigned int n_components);
547 
552  ComponentSelectFunction(const unsigned int selected,
553  const unsigned int n_components);
554 
562  ComponentSelectFunction(const std::pair<unsigned int, unsigned int> &selected,
563  const unsigned int n_components);
564 
565 
579  virtual void
580  substitute_function_value_with(
582 
586  virtual void
587  vector_value(const Point<dim> & p,
588  Vector<RangeNumberType> &return_value) const override;
589 
596  virtual void
598  const std::vector<Point<dim>> & points,
599  std::vector<Vector<RangeNumberType>> &values) const override;
600 
606  std::size_t
607  memory_consumption() const;
608 
609 protected:
613  const std::pair<unsigned int, unsigned int> selected_components;
614 };
615 
616 
617 
701 template <int dim, typename RangeNumberType = double>
702 class ScalarFunctionFromFunctionObject : public Function<dim, RangeNumberType>
703 {
704 public:
711  const std::function<RangeNumberType(const Point<dim> &)> &function_object);
712 
717  virtual RangeNumberType
718  value(const Point<dim> &p, const unsigned int component = 0) const override;
719 
720 private:
725  const std::function<RangeNumberType(const Point<dim> &)> function_object;
726 };
727 
728 
729 
767 template <int dim, typename RangeNumberType = double>
769  : public Function<dim, RangeNumberType>
770 {
771 public:
785  const std::function<RangeNumberType(const Point<dim> &)> &function_object,
786  const unsigned int selected_component,
787  const unsigned int n_components);
788 
793  virtual RangeNumberType
794  value(const Point<dim> &p, const unsigned int component = 0) const override;
795 
801  virtual void
802  vector_value(const Point<dim> & p,
803  Vector<RangeNumberType> &values) const override;
804 
805 private:
810  const std::function<RangeNumberType(const Point<dim> &)> function_object;
811 
816  const unsigned int selected_component;
817 };
818 
819 
855 template <int dim, typename RangeNumberType = double>
856 class VectorFunctionFromTensorFunction : public Function<dim, RangeNumberType>
857 {
858 public:
876  const TensorFunction<1, dim, RangeNumberType> &tensor_function,
877  const unsigned int selected_component = 0,
878  const unsigned int n_components = dim);
879 
884  virtual ~VectorFunctionFromTensorFunction() override = default;
885 
889  virtual RangeNumberType
890  value(const Point<dim> &p, const unsigned int component = 0) const override;
891 
897  virtual void
898  vector_value(const Point<dim> & p,
899  Vector<RangeNumberType> &values) const override;
900 
908  virtual void
910  const std::vector<Point<dim>> & points,
911  std::vector<Vector<RangeNumberType>> &value_list) const override;
912 
913 private:
919 
926  const unsigned int selected_component;
927 };
928 
929 
930 #ifndef DOXYGEN
931 // icc 2018 complains about an undefined reference
932 // if we put this in the templates.h file
933 //
934 // The destructor is pure virtual so we can't default it
935 // in the declaration.
936 template <int dim, typename RangeNumberType>
938 #endif
939 
940 
941 DEAL_II_NAMESPACE_CLOSE
942 
943 #endif
const unsigned int n_components
Definition: function.h:160
static const unsigned int dimension
Definition: function.h:155
virtual Tensor< 1, dim, RangeNumberType > gradient(const Point< dim > &p, const unsigned int component=0) const
virtual void vector_gradients(const std::vector< Point< dim >> &points, std::vector< std::vector< Tensor< 1, dim, RangeNumberType >>> &gradients) const
virtual void vector_gradient_list(const std::vector< Point< dim >> &points, std::vector< 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_gradient(const Point< dim > &p, std::vector< Tensor< 1, dim, RangeNumberType >> &gradients) const
virtual void vector_laplacian(const Point< dim > &p, Vector< RangeNumberType > &values) const
Function & operator=(const Function &f)
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 gradient_list(const std::vector< Point< dim >> &points, std::vector< Tensor< 1, dim, RangeNumberType >> &gradients, const unsigned int component=0) const
virtual RangeNumberType laplacian(const Point< dim > &p, const unsigned int component=0) const
virtual SymmetricTensor< 2, dim, RangeNumberType > hessian(const Point< dim > &p, const unsigned int component=0) const
std::size_t memory_consumption() const
virtual void hessian_list(const std::vector< Point< dim >> &points, std::vector< SymmetricTensor< 2, dim, RangeNumberType >> &values, const unsigned int component=0) const
virtual void vector_value(const Point< dim > &p, Vector< RangeNumberType > &values) const
const TensorFunction< 1, dim, RangeNumberType > & tensor_function
Definition: function.h:918
const std::pair< unsigned int, unsigned int > selected_components
Definition: function.h:613
virtual void value_list(const std::vector< Point< dim >> &points, std::vector< RangeNumberType > &values, const unsigned int component=0) const
Definition: mpi.h:55
virtual ~Function() override=0
const unsigned int selected_component
Definition: function.h:926
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
const unsigned int selected_component
Definition: function.h:816
virtual void vector_values(const std::vector< Point< dim >> &points, std::vector< std::vector< RangeNumberType >> &values) const
virtual void vector_value_list(const std::vector< Point< dim >> &points, std::vector< Vector< RangeNumberType >> &values) const
std::vector< RangeNumberType > function_value_vector
Definition: function.h:471
Function(const unsigned int n_components=1, const RangeNumberType initial_time=0.0)