libMesh
fem_function_base.h
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2024 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3 
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License, or (at your option) any later version.
8 
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
13 
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 
18 
19 
20 #ifndef LIBMESH_FEM_FUNCTION_BASE_H
21 #define LIBMESH_FEM_FUNCTION_BASE_H
22 
23 // Local Includes
24 #include "libmesh/libmesh_common.h"
25 #include "libmesh/dense_vector.h" // required to instantiate a DenseVector<> below
26 #include "libmesh/fem_context.h"
27 
28 // C++ includes
29 #include <memory>
30 
31 namespace libMesh
32 {
33 
34 // Forward Declarations
35 class Point;
36 
45 template <typename Output=Number>
46 class FEMFunctionBase
47 {
48 protected:
49 
53  FEMFunctionBase () = default;
54 
55 public:
56 
60  FEMFunctionBase (FEMFunctionBase &&) = default;
61  FEMFunctionBase (const FEMFunctionBase &) = default;
62  FEMFunctionBase & operator= (const FEMFunctionBase &) = default;
64  virtual ~FEMFunctionBase () = default;
65 
72  virtual void init_context (const FEMContext &) {}
73 
81  virtual std::unique_ptr<FEMFunctionBase<Output>> clone () const = 0;
82 
89  virtual Output operator() (const FEMContext &,
90  const Point & p,
91  const Real time = 0.) = 0;
92 
97  void operator() (const FEMContext &,
98  const Point & p,
99  DenseVector<Output> & output);
100 
107  virtual void operator() (const FEMContext &,
108  const Point & p,
109  const Real time,
110  DenseVector<Output> & output) = 0;
111 
124  virtual Output component(const FEMContext &,
125  unsigned int i,
126  const Point & p,
127  Real time=0.);
128 };
129 
130 template <typename Output>
131 inline
133  unsigned int i,
134  const Point & p,
135  Real time)
136 {
137  DenseVector<Output> outvec(i+1);
138  (*this)(context, p, time, outvec);
139  return outvec(i);
140 }
141 
142 template <typename Output>
143 inline
145  const Point & p,
146  DenseVector<Output> & output)
147 {
148  // Call the time-dependent function with t=0.
149  this->operator()(context, p, 0., output);
150 }
151 
152 } // namespace libMesh
153 
154 #endif // LIBMESH_FEM_FUNCTION_BASE_H
The libMesh namespace provides an interface to certain functionality in the library.
FEMFunctionBase & operator=(const FEMFunctionBase &)=default
virtual void init_context(const FEMContext &)
Prepares a context object for use.
This class provides all data required for a physics package (e.g.
Definition: fem_context.h:62
FEMFunctionBase()=default
Constructor.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual ~FEMFunctionBase()=default
virtual Output operator()(const FEMContext &, const Point &p, const Real time=0.)=0
virtual Output component(const FEMContext &, unsigned int i, const Point &p, Real time=0.)
virtual std::unique_ptr< FEMFunctionBase< Output > > clone() const =0
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition: point.h:39