1 #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 (
'@');
66 "invalid basis_on_pointset name, expect e.g. \"P1@b(gauss(3))\"");
67 basis_name =
name.substr (0, i_pos_at);
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);
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_restricted_to_sides()) {
413 if (!_b.option().is_restricted_to_sides()) {
419 details::basis_on_pointset_evaluate_on_sides (_b, tilde_L, hat_node, _sid_vector_val[L_variant][sid.
loc_isid][ori_idx][sid.
shift]);
425 if (!_b.option().is_restricted_to_sides()) {
431 details::basis_on_pointset_evaluate_on_sides (_b, tilde_L, hat_node, _sid_tensor_val[L_variant][sid.
loc_isid][ori_idx][sid.
shift]);
437 if (!_b.option().is_restricted_to_sides()) {
443 details::basis_on_pointset_evaluate_on_sides (_b, tilde_L, hat_node, _sid_tensor_val[L_variant][sid.
loc_isid][ori_idx][sid.
shift]);
449 <<
"-valued basis \"" << _b.name() <<
"\"");
461 Eigen::Matrix<point_basic<T>,Eigen::Dynamic,1> hat_node, tilde_node;
462 if (_mode == quad_mode) {
463 _quad.get_nodes (sid.
hat, hat_node);
465 hat_node = _nb.hat_node (sid.
hat);
467 tilde_node.resize (hat_node.size());
468 if (!_b.option().is_restricted_to_sides()) {
470 for (
size_type q = 0, nq = hat_node.size(); q < nq; ++q) {
475 tilde_node = hat_node;
477 _sid_initialize_continued (tilde_L, sid, tilde_node);
490 int last_orient = (sid.
dim == 0) ? 1 : -1;
494 _sid_initialize (tilde_L, sid);
498 _sid_initialized [tilde_L.
variant()] =
true;
510 template<
class Value>
511 const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>&
514 if (!_initialized [hat_K.
variant()]) _initialize (hat_K);
518 template<
class Value>
519 const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>&
522 if (!_grad_initialized [hat_K.
variant()]) _grad_initialize (hat_K);
526 template<
class Value>
527 const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>&
532 if (!_sid_initialized [hat_K.
variant()]) _sid_initialize (hat_K);
536 template<
class Value>
537 const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>&
542 if (!_sid_initialized [hat_K.
variant()]) _sid_initialize (hat_K);
548 #define _RHEOLEF_instanciation_value(T,Value) \
550 const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>& \
551 basis_on_pointset_rep<T>::evaluate (reference_element hat_K) const; \
553 const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>& \
554 basis_on_pointset_rep<T>::evaluate_on_side ( \
555 reference_element hat_K, \
556 const side_information_type& sid) const; \
558 const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>& \
559 basis_on_pointset_rep<T>::grad_evaluate (reference_element hat_K) const; \
561 const Eigen::Matrix<Value,Eigen::Dynamic,Eigen::Dynamic>& \
562 basis_on_pointset_rep<T>::grad_evaluate_on_side ( \
563 reference_element hat_K, \
564 const side_information_type& sid) const; \
566 #define _RHEOLEF_instanciation(T) \
567 template class basis_on_pointset<T>; \
568 template class basis_on_pointset_rep<T>; \
569 _RHEOLEF_instanciation_value(T,T) \
570 _RHEOLEF_instanciation_value(T,point_basic<T>) \
571 _RHEOLEF_instanciation_value(T,tensor_basic<T>) \
572 _RHEOLEF_instanciation_value(T,tensor3_basic<T>) \
573 _RHEOLEF_instanciation_value(T,tensor4_basic<T>) \