Rheolef  7.2
an efficient C++ finite element environment
piola_fem.h
Go to the documentation of this file.
1 #ifndef _RHEOLEF_PIOLA_FEM_H
2 #define _RHEOLEF_PIOLA_FEM_H
23 #include "rheolef/piola.h"
24 #include "rheolef/space_constant.h"
25 #include "rheolef/smart_pointer.h"
26 namespace rheolef {
27 
28 /*Class:piola_fem
29 NAME: @code{piola_fem} - maps a finite element method from a reference element
30 @cindex piola transformation
31 @cindex finite element method
32 SYNOPSIS:
33  @noindent
34  The @code{piola_fem} is an abstract class that defines how a finite element
35  method could be map from a corresponding method defined on a reference element.
36  See also the @ref{piola_fem_lagrange class}
37  and the the @ref{piola_fem_hdiv class} for concrete transformations
38  and the @code{basis} class for finite element methods definied on a
39  reference element.
40 AUTHORS:
41  LMC-IMAG, 38041 Grenoble cedex 9, France
42  | Pierre.Saramito@imag.fr
43 DATE: 26 january 2019
44 End:
45 */
46 
47 // ---------------------------------------------------------------------------
48 // polymorphic abstract class
49 // ---------------------------------------------------------------------------
50 template<class T>
52 public:
53  typedef T value_type;
56  virtual ~piola_fem_rep() {}
57  virtual std::string name() const = 0;
58 
59  virtual bool transform_need_piola() const { return true; }
60 
61  // scalar-valued:
62  virtual void transform (const piola<T>& p, const T& hat_u, T& u) const;
63  virtual void inv_transform (const piola<T>& p, const T& u, T& hat_u) const;
64  virtual void grad_transform (
65  const piola<T>& p,
66  const T& hat_u,
67  const point_basic<T>& hat_grad_u,
69  point_basic<T>& grad_u) const;
70 
71  // vector-valued:
72  virtual void transform (const piola<T>& p, const point_basic<T>& hat_u, point_basic<T>& u) const;
73  virtual void inv_transform (const piola<T>& p, const point_basic<T>& u, point_basic<T>& hat_u) const;
74  virtual void grad_transform (
75  const piola<T>& p,
76  const point_basic<T>& hat_u,
77  const tensor_basic<T>& hat_grad_u,
79  tensor_basic<T>& grad_u) const;
80 
81  // tensor-valued:
82  virtual void transform (const piola<T>& p, const tensor_basic<T>& hat_u, tensor_basic<T>& u) const;
83  virtual void inv_transform (const piola<T>& p, const tensor_basic<T>& u, tensor_basic<T>& hat_u) const;
84  virtual void grad_transform (
85  const piola<T>& p,
86  const tensor_basic<T>& hat_u,
87  const tensor3_basic<T>& hat_grad_u,
89  tensor3_basic<T>& grad_u) const;
90 
91  // tensor3-valued:
92  virtual void transform (const piola<T>& p, const tensor3_basic<T>& hat_u, tensor3_basic<T>& u) const;
93  virtual void inv_transform (const piola<T>& p, const tensor3_basic<T>& u, tensor3_basic<T>& hat_u) const;
94  virtual void grad_transform (
95  const piola<T>& p,
96  const tensor3_basic<T>& hat_u,
97  const tensor4_basic<T>& hat_grad_u,
99  tensor4_basic<T>& grad_u) const;
100 
101  // tensor4-valued:
102  virtual void transform (const piola<T>& p, const tensor4_basic<T>& hat_u, tensor4_basic<T>& u) const;
103  virtual void inv_transform (const piola<T>& p, const tensor4_basic<T>& u, tensor4_basic<T>& hat_u) const;
104 };
105 
106 #define _RHEOLEF_inline_value_s(ValueName,Value) \
107 template<class T> \
108 void \
109 piola_fem_rep<T>::transform (const piola<T>& p, const Value& hat_u, Value& u) const \
110 { \
111  error_macro (ValueName<<"-valued "<<name()<<" transfom not implemented"); \
112 } \
113 template<class T> \
114 void \
115 piola_fem_rep<T>::inv_transform (const piola<T>& p, const Value& u, Value& hat_u) const \
116 { \
117  error_macro (ValueName<<"-valued "<<name()<<" inverse-transfom not implemented"); \
118 }
119 
120 #define _RHEOLEF_inline_value_g(ValueName,Value,GradValue) \
121  _RHEOLEF_inline_value_s(ValueName,Value) \
122 template<class T> \
123 void \
124 piola_fem_rep<T>::grad_transform ( \
125  const piola<T>& p, \
126  const Value& hat_u, \
127  const GradValue& hat_grad_u, \
128  const details::differentiate_option& gopt, \
129  GradValue& grad_u) const \
130 { \
131  error_macro (ValueName<<"-valued "<<name()<<" grad-transfom not implemented"); \
132 }
133 
138 _RHEOLEF_inline_value_s("tensor4",tensor4_basic<T>)
139 #undef _RHEOLEF_inline_value_s
140 #undef _RHEOLEF_inline_value_g
141 
142 // ---------------------------------------------------------------------------
143 // smart pointer interface class
144 // ---------------------------------------------------------------------------
145 //<verbatim:
146 template<class T>
147 class piola_fem: public smart_pointer_nocopy<piola_fem_rep<T> > {
148 public:
149 
150 // typedefs:
151 
152  typedef piola_fem_rep<T> rep;
153  typedef smart_pointer_nocopy<rep> base;
154  typedef typename rep::value_type value_type;
155  typedef typename rep::size_type size_type;
156 
157 // allocators:
158 
159  piola_fem(rep *p = 0);
160 
161 // accessors:
162 
163  bool transform_need_piola() const;
164  std::string name() const;
165 
166  template<class Value>
167  void transform (const piola<T>& p, const Value& hat_u, Value& u) const;
168  template<class Value>
169  void inv_transform (const piola<T>& p, const Value& u, Value& hat_u) const;
170  template<class Value, class GradValue>
171  void grad_transform (
172  const piola<T>& p,
173  const Value& hat_u,
174  const GradValue& hat_grad_u,
175  const details::differentiate_option& gopt,
176  GradValue& grad_u) const;
177 };
178 //>verbatim:
179 // -----------------------------------------------------------
180 // inlined
181 // -----------------------------------------------------------
182 template<class T>
183 inline
184 piola_fem<T>::piola_fem(rep* p)
185  : base(p)
186 {
187 }
188 template<class T>
189 inline
190 std::string
191 piola_fem<T>::name() const
192 {
193  return base::data().name();
194 }
195 template<class T>
196 inline
197 bool
198 piola_fem<T>::transform_need_piola() const
199 {
200  return base::data().transform_need_piola();
201 }
202 template<class T>
203 template<class Value>
204 inline
205 void
206 piola_fem<T>::transform (const piola<T>& p, const Value& hat_u, Value& u) const
207 {
208  base::data().transform (p, hat_u, u);
209 }
210 template<class T>
211 template<class Value>
212 inline
213 void
214 piola_fem<T>::inv_transform (const piola<T>& p, const Value& u, Value& hat_u) const
215 {
216  base::data().inv_transform (p, u, hat_u);
217 }
218 template<class T>
219 template<class Value, class GradValue>
220 inline
221 void
222 piola_fem<T>::grad_transform (
223  const piola<T>& p,
224  const Value& hat_u,
225  const GradValue& hat_grad_u,
226  const details::differentiate_option& gopt,
227  GradValue& grad_u) const
228 {
229  base::data().grad_transform (p, hat_u, hat_grad_u, gopt, grad_u);
230 }
231 
232 }// namespace rheolef
233 #endif // _RHEOLEF_PIOLA_FEM_H
field::size_type size_type
Definition: branch.cc:430
virtual void transform(const piola< T > &p, const point_basic< T > &hat_u, point_basic< T > &u) const
virtual void transform(const piola< T > &p, const tensor_basic< T > &hat_u, tensor_basic< T > &u) const
virtual void inv_transform(const piola< T > &p, const tensor3_basic< T > &u, tensor3_basic< T > &hat_u) const
virtual void transform(const piola< T > &p, const tensor3_basic< T > &hat_u, tensor3_basic< T > &u) const
virtual void inv_transform(const piola< T > &p, const tensor4_basic< T > &u, tensor4_basic< T > &hat_u) const
virtual void inv_transform(const piola< T > &p, const tensor_basic< T > &u, tensor_basic< T > &hat_u) const
virtual ~piola_fem_rep()
Definition: piola_fem.h:56
virtual void transform(const piola< T > &p, const T &hat_u, T &u) const
virtual void grad_transform(const piola< T > &p, const tensor3_basic< T > &hat_u, const tensor4_basic< T > &hat_grad_u, const details::differentiate_option &gopt, tensor4_basic< T > &grad_u) const
virtual void transform(const piola< T > &p, const tensor4_basic< T > &hat_u, tensor4_basic< T > &u) const
virtual void grad_transform(const piola< T > &p, const tensor_basic< T > &hat_u, const tensor3_basic< T > &hat_grad_u, const details::differentiate_option &gopt, tensor3_basic< T > &grad_u) const
virtual std::string name() const =0
virtual bool transform_need_piola() const
Definition: piola_fem.h:59
virtual void grad_transform(const piola< T > &p, const point_basic< T > &hat_u, const tensor_basic< T > &hat_grad_u, const details::differentiate_option &gopt, tensor_basic< T > &grad_u) const
virtual void inv_transform(const piola< T > &p, const T &u, T &hat_u) const
point_basic< T >::size_type size_type
Definition: piola_fem.h:54
virtual void grad_transform(const piola< T > &p, const T &hat_u, const point_basic< T > &hat_grad_u, const details::differentiate_option &gopt, point_basic< T > &grad_u) const
virtual void inv_transform(const piola< T > &p, const point_basic< T > &u, point_basic< T > &hat_u) const
size_t size_type
Definition: point.h:91
size_t size_type
Definition: basis_get.cc:76
result_type value_type
see the tensor3 page for the full documentation
see the tensor4 page for the full documentation
see the tensor page for the full documentation
Expr1::float_type T
Definition: field_expr.h:230
This file is part of Rheolef.
_RHEOLEF_inline_value_g("scalar", T, point_basic< T >) _RHEOLEF_inline_value_g("vector"
Definition: sphere.icc:25
Definition: leveque.h:25