Rheolef  7.1
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
3 #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 
165  template<class Value>
166  void transform (const piola<T>& p, const Value& hat_u, Value& u) const;
167  template<class Value>
168  void inv_transform (const piola<T>& p, const Value& u, Value& hat_u) const;
169  template<class Value, class GradValue>
170  void grad_transform (
171  const piola<T>& p,
172  const Value& hat_u,
173  const GradValue& hat_grad_u,
174  const details::differentiate_option& gopt,
175  GradValue& grad_u) const;
176 };
177 //>verbatim:
178 // -----------------------------------------------------------
179 // inlined
180 // -----------------------------------------------------------
181 template<class T>
182 inline
183 piola_fem<T>::piola_fem(rep* p)
184  : base(p)
185 {
186 }
187 template<class T>
188 inline
189 bool
190 piola_fem<T>::transform_need_piola() const
191 {
192  return base::data().transform_need_piola();
193 }
194 template<class T>
195 template<class Value>
196 inline
197 void
198 piola_fem<T>::transform (const piola<T>& p, const Value& hat_u, Value& u) const
199 {
200  base::data().transform (p, hat_u, u);
201 }
202 template<class T>
203 template<class Value>
204 inline
205 void
206 piola_fem<T>::inv_transform (const piola<T>& p, const Value& u, Value& hat_u) const
207 {
208  base::data().inv_transform (p, u, hat_u);
209 }
210 template<class T>
211 template<class Value, class GradValue>
212 inline
213 void
214 piola_fem<T>::grad_transform (
215  const piola<T>& p,
216  const Value& hat_u,
217  const GradValue& hat_grad_u,
218  const details::differentiate_option& gopt,
219  GradValue& grad_u) const
220 {
221  base::data().grad_transform (p, hat_u, hat_grad_u, gopt, grad_u);
222 }
223 
224 }// namespace rheolef
225 #endif // _RHEOLEF_PIOLA_FEM_H
tensor3
see the tensor3 page for the full documentation
tensor
see the tensor page for the full documentation
rheolef::piola_fem_rep::inv_transform
virtual void inv_transform(const piola< T > &p, const T &u, T &hat_u) const
rheolef::point_basic
Definition: point.h:87
rheolef::piola_fem_rep::grad_transform
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
rheolef::tensor4_basic
Definition: tensor4.h:80
rheolef::piola_fem_rep::transform
virtual void transform(const piola< T > &p, const tensor_basic< T > &hat_u, tensor_basic< T > &u) const
rheolef::smart_pointer_nocopy
Definition: smart_pointer.h:389
rheolef::point_basic::size_type
size_t size_type
Definition: point.h:92
rheolef::piola_fem_rep::size_type
point_basic< T >::size_type size_type
Definition: piola_fem.h:54
rheolef::_RHEOLEF_inline_value_g
_RHEOLEF_inline_value_g("scalar", T, point_basic< T >) _RHEOLEF_inline_value_g("vector"
tensor4
see the tensor4 page for the full documentation
rheolef::tensor_basic
Definition: tensor.h:90
rheolef::piola_fem_rep::transform_need_piola
virtual bool transform_need_piola() const
Definition: piola_fem.h:59
rheolef::piola_fem_rep::transform
virtual void transform(const piola< T > &p, const tensor4_basic< T > &hat_u, tensor4_basic< T > &u) const
rheolef::size_type
size_t size_type
Definition: basis_get.cc:76
rheolef::piola_fem_rep::transform
virtual void transform(const piola< T > &p, const T &hat_u, T &u) const
p
Definition: sphere.icc:25
rheolef::piola_fem_rep::~piola_fem_rep
virtual ~piola_fem_rep()
Definition: piola_fem.h:56
rheolef::piola_fem_rep::grad_transform
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
rheolef::details::differentiate_option
Definition: piola.h:41
rheolef::value_type
result_type value_type
Definition: field_expr_recursive.h:499
rheolef::piola_fem_rep::inv_transform
virtual void inv_transform(const piola< T > &p, const tensor4_basic< T > &u, tensor4_basic< T > &hat_u) const
rheolef::tensor3_basic
Definition: tensor3.h:73
rheolef::piola_fem_rep::transform
virtual void transform(const piola< T > &p, const point_basic< T > &hat_u, point_basic< T > &u) const
rheolef
This file is part of Rheolef.
Definition: compiler_eigen.h:37
u
Definition: leveque.h:25
rheolef::piola_fem_rep::grad_transform
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
rheolef::piola_fem_rep::grad_transform
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
size_type
field::size_type size_type
Definition: branch.cc:425
rheolef::piola_fem_rep
Definition: piola_fem.h:51
rheolef::piola_fem_rep::name
virtual std::string name() const =0
rheolef::piola_fem_rep::transform
virtual void transform(const piola< T > &p, const tensor3_basic< T > &hat_u, tensor3_basic< T > &u) const
grad_u
Definition: combustion_exact.icc:34
rheolef::piola_fem_rep::inv_transform
virtual void inv_transform(const piola< T > &p, const tensor_basic< T > &u, tensor_basic< T > &hat_u) const
rheolef::piola_fem_rep::inv_transform
virtual void inv_transform(const piola< T > &p, const tensor3_basic< T > &u, tensor3_basic< T > &hat_u) const
rheolef::piola_fem_rep::value_type
T value_type
Definition: piola_fem.h:53
T
Expr1::float_type T
Definition: field_expr.h:261
rheolef::piola
Definition: piola.h:67
rheolef::piola_fem_rep::inv_transform
virtual void inv_transform(const piola< T > &p, const point_basic< T > &u, point_basic< T > &hat_u) const
rheolef::piola_fem_rep::piola_fem_rep
piola_fem_rep()
Definition: piola_fem.h:55