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"
57 virtual std::string
name()
const = 0;
106#define _RHEOLEF_inline_value_s(ValueName,Value) \
109piola_fem_rep<T>::transform (const piola<T>& p, const Value& hat_u, Value& u) const \
111 error_macro (ValueName<<"-valued "<<name()<<" transfom not implemented"); \
115piola_fem_rep<T>::inv_transform (const piola<T>& p, const Value& u, Value& hat_u) const \
117 error_macro (ValueName<<"-valued "<<name()<<" inverse-transfom not implemented"); \
120#define _RHEOLEF_inline_value_g(ValueName,Value,GradValue) \
121 _RHEOLEF_inline_value_s(ValueName,Value) \
124piola_fem_rep<T>::grad_transform ( \
126 const Value& hat_u, \
127 const GradValue& hat_grad_u, \
128 const details::differentiate_option& gopt, \
129 GradValue& grad_u) const \
131 error_macro (ValueName<<"-valued "<<name()<<" grad-transfom not implemented"); \
138_RHEOLEF_inline_value_s(
"tensor4",tensor4_basic<
T>)
139#undef _RHEOLEF_inline_value_s
140#undef _RHEOLEF_inline_value_g
147class piola_fem:
public smart_pointer_nocopy<piola_fem_rep<T> > {
152 typedef piola_fem_rep<T> rep;
153 typedef smart_pointer_nocopy<rep> base;
155 typedef typename rep::size_type size_type;
159 piola_fem(rep *
p = 0);
163 bool transform_need_piola()
const;
164 std::string name()
const;
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 (
174 const GradValue& hat_grad_u,
175 const details::differentiate_option& gopt,
184piola_fem<T>::piola_fem(rep*
p)
191piola_fem<T>::name()
const
193 return base::data().name();
198piola_fem<T>::transform_need_piola()
const
200 return base::data().transform_need_piola();
206piola_fem<T>::transform (
const piola<T>&
p,
const Value& hat_u, Value&
u)
const
208 base::data().transform (
p, hat_u,
u);
214piola_fem<T>::inv_transform (
const piola<T>&
p,
const Value&
u, Value& hat_u)
const
216 base::data().inv_transform (
p,
u, hat_u);
219template<
class Value,
class GradValue>
222piola_fem<T>::grad_transform (
225 const GradValue& hat_grad_u,
226 const details::differentiate_option& gopt,
229 base::data().grad_transform (
p, hat_u, hat_grad_u, gopt,
grad_u);
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 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
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
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
This file is part of Rheolef.
_RHEOLEF_inline_value_g("scalar", T, point_basic< T >) _RHEOLEF_inline_value_g("vector"