22#include "rheolef/rheostream.h"
44 std::array<std::array<size_type,reference_element::max_variant>,4>& ndof_on_subgeo_internal,
45 std::array<std::array<size_type,reference_element::max_variant>,4>& ndof_on_subgeo,
46 std::array<std::array<size_type,reference_element::max_variant>,4>& nnod_on_subgeo_internal,
47 std::array<std::array<size_type,reference_element::max_variant>,4>& nnod_on_subgeo,
54 if (k ==
size_t(-1)) {
56 for (
size_type map_d = 0; map_d < 4; ++map_d) {
57 ndof_on_subgeo_internal [map_d].fill (0);
61 for (
size_type map_d = 0; map_d < 4; ++map_d) {
62 ndof_on_subgeo_internal [map_d].fill (0);
66 ndof_on_subgeo_internal [map_d] [variant] = 1;
70 for (
size_type map_d = 0; map_d < 4; ++map_d) {
75 ndof_on_subgeo_internal [map_d] [variant] = 0;
80 base::_helper_make_discontinuous_ndof_on_subgeo (is_continuous, ndof_on_subgeo_internal, ndof_on_subgeo);
83 base::_helper_initialize_first_ixxx_by_dimension_from_nxxx_on_subgeo (ndof_on_subgeo_internal, first_idof_by_dimension_internal);
84 base::_helper_initialize_first_ixxx_by_dimension_from_nxxx_on_subgeo (ndof_on_subgeo, first_idof_by_dimension);
86 nnod_on_subgeo_internal = ndof_on_subgeo_internal;
87 nnod_on_subgeo = ndof_on_subgeo;
88 first_inod_by_dimension_internal = first_idof_by_dimension_internal;
89 first_inod_by_dimension = first_idof_by_dimension;
108 switch (base::_sopt.get_raw_polynomial()) {
112 default:
error_macro (
"unsupported polynomial: "<<
sopt.get_raw_polynomial_name());
128const Eigen::Matrix<point_basic<T>,Eigen::Dynamic,1>&
131 base::_initialize_data_guard (hat_K);
132 return _hat_node [hat_K.
variant()];
135const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>&
138 base::_initialize_data_guard (hat_K);
142const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>&
145 base::_initialize_data_guard (hat_K);
146 return _inv_vdm [hat_K.
variant()];
154 base::is_continuous(),
155 base::_ndof_on_subgeo_internal,
156 base::_ndof_on_subgeo,
157 base::_nnod_on_subgeo_internal,
158 base::_nnod_on_subgeo,
159 base::_first_idof_by_dimension_internal,
160 base::_first_idof_by_dimension,
161 base::_first_inod_by_dimension_internal,
162 base::_first_inod_by_dimension);
172 switch (base::_sopt.get_node()) {
179 default:
error_macro (
"unsupported node set: "<<base::_sopt.get_node_name());
184 "unisolvence failed for " << base::name() <<
"(" << hat_K.
name() <<
") basis");
192 Eigen::Matrix<T,Eigen::Dynamic,1>& value)
const
194 base::_initialize_data_guard (hat_K);
195 Eigen::Matrix<T,Eigen::Dynamic,1> raw_value;
196 _raw_basis.evaluate (hat_K, hat_x, raw_value);
197 value = _inv_vdm[hat_K.
variant()].transpose()*raw_value;
207 base::_initialize_data_guard (hat_K);
208 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& inv_vdm = _inv_vdm [hat_K.
variant()];
209 Eigen::Matrix<point_basic<T>,Eigen::Dynamic,1> raw_v_value;
210 _raw_basis.grad_evaluate (hat_K, hat_x, raw_v_value);
212 value.resize (loc_ndof);
214 for (
size_type loc_idof = 0; loc_idof < loc_ndof; ++loc_idof) {
216 for (
size_type loc_jdof = 0; loc_jdof < loc_ndof; ++loc_jdof) {
217 value [loc_idof] += inv_vdm (loc_jdof,loc_idof)*raw_v_value[loc_jdof];
228 return base::ndof (sid.
hat);
235 Eigen::Matrix<size_type,Eigen::Dynamic,1>& loc_idof)
const
237 details::Pk_get_local_idof_on_side (hat_K, sid, degree(), loc_idof);
244 const Eigen::Matrix<T,Eigen::Dynamic,1>& f_xnod,
245 Eigen::Matrix<T,Eigen::Dynamic,1>& dof)
const
252#define _RHEOLEF_instanciation(T) \
253template class basis_fem_Pk_lagrange<T>;
#define _RHEOLEF_instanciation(T, M, A)
see the Float page for the full documentation
basis_raw_basic< T > _raw_basis
const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > & vdm(reference_element hat_K) const
reference_element::size_type size_type
void local_idof_on_side(reference_element hat_K, const side_information_type &sid, Eigen::Matrix< size_type, Eigen::Dynamic, 1 > &loc_idof) const
void _initialize_cstor_sizes() const
void evaluate(reference_element hat_K, const point_basic< T > &hat_x, Eigen::Matrix< T, Eigen::Dynamic, 1 > &value) const
static void initialize_local_first(size_type k, bool is_continuous, std::array< std::array< size_type, reference_element::max_variant >, 4 > &ndof_on_subgeo_internal, std::array< std::array< size_type, reference_element::max_variant >, 4 > &ndof_on_subgeo, std::array< std::array< size_type, reference_element::max_variant >, 4 > &nnod_on_subgeo_internal, std::array< std::array< size_type, reference_element::max_variant >, 4 > &nnod_on_subgeo, std::array< std::array< size_type, 5 >, reference_element::max_variant > &first_idof_by_dimension_internal, std::array< std::array< size_type, 5 >, reference_element::max_variant > &first_idof_by_dimension, std::array< std::array< size_type, 5 >, reference_element::max_variant > &first_inod_by_dimension_internal, std::array< std::array< size_type, 5 >, reference_element::max_variant > &first_inod_by_dimension)
size_type local_ndof_on_side(reference_element hat_K, const side_information_type &sid) const
void grad_evaluate(reference_element hat_K, const point_basic< T > &hat_x, Eigen::Matrix< point_basic< T >, Eigen::Dynamic, 1 > &value) const
void _compute_dofs(reference_element hat_K, const Eigen::Matrix< T, Eigen::Dynamic, 1 > &f_xnod, Eigen::Matrix< T, Eigen::Dynamic, 1 > &dof) const
basis_fem_Pk_lagrange(size_type degree, const basis_option &sopt)
const Eigen::Matrix< point_basic< T >, Eigen::Dynamic, 1 > & hat_node(reference_element hat_K) const
virtual std::string family_name() const
const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > & inv_vdm(reference_element hat_K) const
void _initialize_data(reference_element hat_K) const
see the basis_option page for the full documentation
see the reference_element page for the full documentation
static const variant_type max_variant
static void init_local_nnode_by_variant(size_type order, std::array< size_type, reference_element::max_variant > &loc_nnod_by_variant)
static variant_type last_variant_by_dimension(size_type dim)
static variant_type first_variant_by_dimension(size_type dim)
variant_type variant() const
#define error_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_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)
This file is part of Rheolef.
void pointset_lagrange_warburton(reference_element hat_K, size_t degree, Eigen::Matrix< point_basic< T >, Eigen::Dynamic, 1 > &hat_xnod, bool map_on_reference_element=true)
void pointset_lagrange_fekete(reference_element hat_K, size_t degree, Eigen::Matrix< point_basic< T >, Eigen::Dynamic, 1 > &hat_xnod, bool map_on_reference_element=true)
void invert(tiny_matrix< T > &a, tiny_matrix< T > &inv_a)
void pointset_lagrange_equispaced(reference_element hat_K, size_t order_in, Eigen::Matrix< point_basic< T >, Eigen::Dynamic, 1 > &hat_xnod, size_t internal=0)