21#include "rheolef/basis_on_pointset.h"
22#include "rheolef/memorized_value.h"
23#include "rheolef/pretty_name.h"
34 const std::string& basis_name,
35 const std::string& pointset_name)
37 if (mode == max_mode) {
39 }
else if (mode == quad_mode) {
40 return basis_name +
"@q(" + pointset_name +
")";
42 return basis_name +
"@b(" + pointset_name +
")";
49 if (_mode == max_mode) {
51 }
else if (_mode == quad_mode) {
52 return _make_name (_mode, _b.name(), _quad.name());
54 return _make_name (_mode, _b.name(), _nb.name());
60 const std::string& name,
61 std::string& basis_name,
62 std::string& pointset_name)
64 long i_pos_at = name.find (
'@');
65 check_macro (i_pos_at > 0 && i_pos_at+1 <
long(name.size()),
66 "invalid basis_on_pointset name, expect e.g. \"P1@b(gauss(3))\"");
67 basis_name = name.substr (0, i_pos_at);
68 check_macro (name[i_pos_at+1] ==
'q' || name[i_pos_at+1] ==
'b',
69 "invalid basis_on_pointset name, expect e.g. \"P1@b(gauss(3))\"");
70 mode_type mode = name[i_pos_at+1] ==
'q' ? quad_mode : nodal_mode;
71 long l = name.size() - (i_pos_at+4);
72 check_macro (l > 0 && i_pos_at+3 <
long(name.size()),
73 "invalid basis_on_pointset name, expect e.g. \"P1@b(gauss(3))\"");
74 pointset_name = name.substr (i_pos_at+3, l);
98 base::operator= (new_macro(
rep()));
169 _initialized.fill(
false);
170 _grad_initialized.fill(
false);
171 _sid_initialized.fill(
false);
172 if (name ==
"")
return;
173 std::string basis_name, pointset_name;
174 _mode = _parse_name (name, basis_name, pointset_name);
176 if (_mode == quad_mode) {
188 _scalar_val(x._scalar_val),
189 _vector_val(x._vector_val),
190 _tensor_val(x._tensor_val),
191 _tensor3_val(x._tensor3_val),
192 _tensor4_val(x._tensor4_val),
193 _sid_scalar_val(x._sid_scalar_val),
194 _sid_vector_val(x._sid_vector_val),
195 _sid_tensor_val(x._sid_tensor_val),
196 _sid_tensor3_val(x._sid_tensor3_val),
197 _sid_tensor4_val(x._sid_tensor4_val),
198 _initialized (x._initialized),
199 _grad_initialized(x._grad_initialized),
200 _sid_initialized (x._sid_initialized)
213 _scalar_val = x._scalar_val;
214 _vector_val = x._vector_val;
215 _tensor_val = x._tensor_val;
216 _tensor3_val = x._tensor3_val;
217 _tensor4_val = x._tensor4_val;
218 _sid_scalar_val = x._sid_scalar_val;
219 _sid_vector_val = x._sid_vector_val;
220 _sid_tensor_val = x._sid_tensor_val;
221 _sid_tensor3_val = x._sid_tensor3_val;
222 _sid_tensor4_val = x._sid_tensor4_val;
232 if (_mode == quad_mode) {
233 return _quad.size (hat_K);
235 return _nb.nnod (hat_K);
242 return _b.ndof (hat_K);
248 check_macro (_mode == quad_mode,
"get_quadrature: pointset mode is not quadrature");
255 check_macro (_mode == nodal_mode,
"get_nodal_basis: pointset mode is not nodal");
265 const Eigen::Matrix<
point_basic<T>,Eigen::Dynamic,1>& hat_node)
const
267 switch (_b.valued_tag()) {
282 <<
"-valued basis \"" << _b.name() <<
"\"");
289 const Eigen::Matrix<
point_basic<T>,Eigen::Dynamic,1>& hat_node)
const
291 switch (_b.valued_tag()) {
302 <<
"-valued basis \"" << _b.name() <<
"\"");
310 if (_mode == quad_mode) {
311 Eigen::Matrix<point_basic<T>,Eigen::Dynamic,1> hat_node;
312 _quad.get_nodes (hat_K, hat_node);
313 _initialize_continued (hat_K, hat_node);
315 const Eigen::Matrix<point_basic<T>,Eigen::Dynamic,1>& hat_node = _nb.hat_node (hat_K);
316 _initialize_continued (hat_K, hat_node);
318 _initialized [hat_K.
variant()] =
true;
325 if (_mode == quad_mode) {
326 Eigen::Matrix<point_basic<T>,Eigen::Dynamic,1> hat_node;
327 _quad.get_nodes (hat_K, hat_node);
328 _grad_initialize_continued (hat_K, hat_node);
330 const Eigen::Matrix<point_basic<T>,Eigen::Dynamic,1>& hat_node = _nb.hat_node (hat_K);
331 _grad_initialize_continued (hat_K, hat_node);
333 _grad_initialized [K_variant] =
true;
396 const Eigen::Matrix<
point_basic<T>,Eigen::Dynamic,1>& hat_node)
const
400 switch (_b.valued_tag()) {
402 if (! _b.option().is_trace_n()) {
411 if (! _b.option().is_trace_n()) {
417 details::basis_on_pointset_evaluate_on_sides (_b, tilde_L, hat_node, _sid_vector_val[L_variant][sid.
loc_isid][ori_idx][sid.
shift]);
423 if (! _b.option().is_trace_n()) {
429 details::basis_on_pointset_evaluate_on_sides (_b, tilde_L, hat_node, _sid_tensor_val[L_variant][sid.
loc_isid][ori_idx][sid.
shift]);
435 if (! _b.option().is_trace_n()) {
441 details::basis_on_pointset_evaluate_on_sides (_b, tilde_L, hat_node, _sid_tensor_val[L_variant][sid.
loc_isid][ori_idx][sid.
shift]);
447 <<
"-valued basis \"" << _b.name() <<
"\"");
459 Eigen::Matrix<point_basic<T>,Eigen::Dynamic,1> hat_node, tilde_node;
460 if (_mode == quad_mode) {
461 _quad.get_nodes (sid.
hat, hat_node);
463 hat_node = _nb.hat_node (sid.
hat);
465 tilde_node.resize (hat_node.size());
466 if (! _b.option().is_trace_n()) {
468 for (
size_type q = 0, nq = hat_node.size(); q < nq; ++q) {
473 tilde_node = hat_node;
475 _sid_initialize_continued (tilde_L, sid, tilde_node);
488 int last_orient = (sid.
dim == 0) ? 1 : -1;
492 _sid_initialize (tilde_L, sid);
496 _sid_initialized [tilde_L.
variant()] =
true;
509const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>&
512 if (!_initialized [hat_K.
variant()]) _initialize (hat_K);
517const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>&
520 if (!_grad_initialized [hat_K.
variant()]) _grad_initialize (hat_K);
525const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>&
530 if (!_sid_initialized [hat_K.
variant()]) _sid_initialize (hat_K);
535const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>&
540 if (!_sid_initialized [hat_K.
variant()]) _sid_initialize (hat_K);
546#define _RHEOLEF_instanciation_value(T,Value) \
548const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>& \
549basis_on_pointset_rep<T>::evaluate (reference_element hat_K) const; \
551const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>& \
552basis_on_pointset_rep<T>::evaluate_on_side ( \
553 reference_element hat_K, \
554 const side_information_type& sid) const; \
556const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>& \
557basis_on_pointset_rep<T>::grad_evaluate (reference_element hat_K) const; \
559const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>& \
560basis_on_pointset_rep<T>::grad_evaluate_on_side ( \
561 reference_element hat_K, \
562 const side_information_type& sid) const; \
564#define _RHEOLEF_instanciation(T) \
565template class basis_on_pointset<T>; \
566template class basis_on_pointset_rep<T>; \
567_RHEOLEF_instanciation_value(T,T) \
568_RHEOLEF_instanciation_value(T,point_basic<T>) \
569_RHEOLEF_instanciation_value(T,tensor_basic<T>) \
570_RHEOLEF_instanciation_value(T,tensor3_basic<T>) \
571_RHEOLEF_instanciation_value(T,tensor4_basic<T>) \
#define _RHEOLEF_instanciation(T, M, A)
see the Float page for the full documentation
void _sid_grad_initialize(reference_element tilde_L) const
static basis_on_pointset_rep< T > * make_ptr(const std::string &name)
static std::string _make_name(mode_type mode, const std::string &basis_name, const std::string &pointset_name)
const Eigen::Matrix< Value, Eigen::Dynamic, Eigen::Dynamic > & grad_evaluate_on_side(reference_element tilde_L, const side_information_type &sid) const
basis_on_pointset_rep(const std::string &name="")
basis_on_pointset_rep< T > & operator=(const basis_on_pointset_rep< T > &)
std::array< bool, reference_element::max_variant > _initialized
void reset(const std::string &name)
static mode_type _parse_name(const std::string &name, std::string &basis_name, std::string &node_name)
void _grad_initialize(reference_element hat_K) const
void _sid_initialize(reference_element tilde_L) const
size_type ndof(reference_element hat_K) const
size_type nnod(reference_element hat_K) const
void _initialize_continued(reference_element hat_K, const Eigen::Matrix< point_basic< T >, Eigen::Dynamic, 1 > &hat_node) const
void _grad_initialize_continued(reference_element hat_K, const Eigen::Matrix< point_basic< T >, Eigen::Dynamic, 1 > &hat_node) const
std::vector< T >::size_type size_type
std::array< bool, reference_element::max_variant > _sid_initialized
const quadrature< T > & get_quadrature() const
std::array< bool, reference_element::max_variant > _grad_initialized
const basis_basic< T > & get_nodal_basis() const
const Eigen::Matrix< Value, Eigen::Dynamic, Eigen::Dynamic > & grad_evaluate(reference_element hat_K) const
void _initialize(reference_element hat_K) const
const Eigen::Matrix< Value, Eigen::Dynamic, Eigen::Dynamic > & evaluate_on_side(reference_element tilde_L, const side_information_type &sid) const
void _sid_initialize_continued(reference_element tilde_L, const side_information_type &sid, const Eigen::Matrix< point_basic< T >, Eigen::Dynamic, 1 > &hat_node) const
const Eigen::Matrix< Value, Eigen::Dynamic, Eigen::Dynamic > & evaluate(reference_element hat_K) const
basis_on_pointset(const std::string &name="")
void set(const quadrature< T > &quad, const basis_basic< T > &b)
void reset(const std::string &name)
smart_pointer< rep > base
basis_on_pointset_rep< T > rep
see the persistent_table page for the full documentation
see the reference_element page for the full documentation
void set_variant(variant_type x)
size_type dimension() const
size_type subgeo_size(size_type subgeo_dim, size_type loc_isid) const
variant_type variant() const
size_type n_subgeo(size_type subgeo_dim) const
#define trace_macro(message)
#define error_macro(message)
#define fatal_macro(message)
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
void basis_on_pointset_grad_evaluate(const Basis &b, const reference_element &hat_K, const Eigen::Matrix< point_basic< T >, Eigen::Dynamic, 1 > &hat_x, Eigen::Matrix< Value, Eigen::Dynamic, Eigen::Dynamic > &vdm_grad)
void basis_on_pointset_evaluate(const Basis &b, const reference_element &hat_K, const Eigen::Matrix< point_basic< T >, Eigen::Dynamic, 1 > &hat_x, Eigen::Matrix< Value, Eigen::Dynamic, Eigen::Dynamic > &vdm)
void basis_on_pointset_evaluate_on_side(const Basis &b, const reference_element &tilde_K, const side_information_type &sid, const Eigen::Matrix< point_basic< T >, Eigen::Dynamic, 1 > &hat_x, Eigen::Matrix< Value, Eigen::Dynamic, Eigen::Dynamic > &vdm)
const std::string & valued_name(valued_type valued_tag)
This file is part of Rheolef.
point_basic< T > reference_element_face_transformation(reference_element tilde_K, const side_information_type &sid, const point_basic< T > &sid_hat_x)
void load(idiststream &in, Float &p, field &uh)