Rheolef  7.2
an efficient C++ finite element environment
 
Loading...
Searching...
No Matches
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"
26namespace rheolef {
27
28/*Class:piola_fem
29NAME: @code{piola_fem} - maps a finite element method from a reference element
30@cindex piola transformation
31@cindex finite element method
32SYNOPSIS:
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.
40AUTHORS:
41 LMC-IMAG, 38041 Grenoble cedex 9, France
42 | Pierre.Saramito@imag.fr
43DATE: 26 january 2019
44End:
45*/
46
47// ---------------------------------------------------------------------------
48// polymorphic abstract class
49// ---------------------------------------------------------------------------
50template<class T>
52public:
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,
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,
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) \
107template<class T> \
108void \
109piola_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} \
113template<class T> \
114void \
115piola_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) \
122template<class T> \
123void \
124piola_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:
146template<class T>
147class piola_fem: public smart_pointer_nocopy<piola_fem_rep<T> > {
148public:
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// -----------------------------------------------------------
182template<class T>
183inline
184piola_fem<T>::piola_fem(rep* p)
185 : base(p)
186{
187}
188template<class T>
189inline
190std::string
191piola_fem<T>::name() const
192{
193 return base::data().name();
194}
195template<class T>
196inline
197bool
198piola_fem<T>::transform_need_piola() const
199{
200 return base::data().transform_need_piola();
201}
202template<class T>
203template<class Value>
204inline
205void
206piola_fem<T>::transform (const piola<T>& p, const Value& hat_u, Value& u) const
207{
208 base::data().transform (p, hat_u, u);
209}
210template<class T>
211template<class Value>
212inline
213void
214piola_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}
218template<class T>
219template<class Value, class GradValue>
220inline
221void
222piola_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
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