59 template <
int dim,
int spacedim>
64 std::vector<std::vector<
65 std::pair<types::global_dof_index, types::global_dof_index>>>
67 std::vector<std::vector<
68 std::pair<types::global_dof_index, types::global_dof_index>>>
69 ©_indices_global_mine,
70 std::vector<std::vector<
71 std::pair<types::global_dof_index, types::global_dof_index>>>
72 ©_indices_level_mine,
73 const bool skip_interface_dofs)
86 std::vector<DoFPair> send_data_temp;
88 const unsigned int n_levels =
90 copy_indices.resize(n_levels);
91 copy_indices_global_mine.resize(n_levels);
92 copy_indices_level_mine.resize(n_levels);
96 std::vector<types::global_dof_index> global_dof_indices(dofs_per_cell);
97 std::vector<types::global_dof_index> level_dof_indices(dofs_per_cell);
101 std::vector<bool> dof_touched(owned_dofs.
n_elements(),
false);
109 std::vector<types::global_dof_index> unrolled_copy_indices;
112 copy_indices_global_mine[
level].clear();
114 for (
const auto &level_cell :
119 (level_cell->level_subdomain_id() ==
121 level_cell->subdomain_id() ==
125 unrolled_copy_indices.resize(owned_dofs.
n_elements(),
130 level_cell->get_dof_indices(global_dof_indices);
131 level_cell->get_mg_dof_indices(level_dof_indices);
133 for (
unsigned int i = 0; i < dofs_per_cell; ++i)
137 if (skip_interface_dofs && mg_constrained_dofs !=
nullptr &&
139 level, level_dof_indices[i]))
151 owned_level_dofs.
is_element(level_dof_indices[i]);
153 if (global_mine && level_mine)
158 unrolled_copy_indices[global_index_in_set] =
159 level_dof_indices[i];
161 else if (global_mine &&
162 dof_touched[global_index_in_set] ==
false)
164 copy_indices_global_mine[
level].emplace_back(
165 global_dof_indices[i], level_dof_indices[i]);
168 send_data_temp.emplace_back(
level,
169 global_dof_indices[i],
170 level_dof_indices[i]);
171 dof_touched[global_index_in_set] =
true;
182 if (!unrolled_copy_indices.empty())
184 copy_indices[
level].clear();
188 if (copy_indices_global_mine[
level].empty())
189 copy_indices[
level].reserve(unrolled_copy_indices.size());
194 for (
unsigned int i = 0; i < unrolled_copy_indices.size(); ++i)
196 copy_indices[
level].emplace_back(
201 const ::parallel::TriangulationBase<dim, spacedim> *
tria =
202 (
dynamic_cast<const ::parallel::TriangulationBase<dim, spacedim>
205 send_data_temp.empty() ||
tria !=
nullptr,
207 "We should only be sending information with a parallel Triangulation!"));
209 #ifdef DEAL_II_WITH_MPI
213 const std::set<types::subdomain_id> &neighbors =
214 tria->level_ghost_owners();
215 std::map<int, std::vector<DoFPair>> send_data;
217 std::sort(send_data_temp.begin(),
218 send_data_temp.end(),
220 if (lhs.level < rhs.level)
222 if (lhs.level > rhs.level)
225 if (lhs.level_dof_index < rhs.level_dof_index)
227 if (lhs.level_dof_index > rhs.level_dof_index)
230 if (lhs.global_dof_index < rhs.global_dof_index)
235 send_data_temp.erase(
236 std::unique(send_data_temp.begin(),
237 send_data_temp.end(),
239 return (lhs.level == rhs.level) &&
240 (lhs.level_dof_index == rhs.level_dof_index) &&
241 (lhs.global_dof_index == rhs.global_dof_index);
243 send_data_temp.end());
250 std::vector<types::global_dof_index> level_dof_indices;
251 std::vector<types::global_dof_index> global_dof_indices;
252 for (
const auto &dofpair : send_data_temp)
253 if (dofpair.level ==
level)
255 level_dof_indices.push_back(dofpair.level_dof_index);
256 global_dof_indices.push_back(dofpair.global_dof_index);
261 level_dof_indices.end());
266 const auto index_owner =
271 AssertThrow(level_dof_indices.size() == index_owner.size(),
274 for (
unsigned int i = 0; i < index_owner.size(); ++i)
275 send_data[index_owner[i]].emplace_back(
level,
276 global_dof_indices[i],
277 level_dof_indices[i]);
290 std::vector<MPI_Request> requests;
292 for (
const auto dest : neighbors)
294 requests.push_back(MPI_Request());
295 std::vector<DoFPair> &data = send_data[dest];
298 MPI_Isend(data.data(),
299 data.size() *
sizeof(decltype(*data.data())),
304 &*requests.rbegin());
312 std::vector<DoFPair> receive_buffer;
313 for (
unsigned int counter = 0; counter < neighbors.size();
317 int ierr = MPI_Probe(MPI_ANY_SOURCE,
323 ierr = MPI_Get_count(&status, MPI_BYTE, &len);
328 ierr = MPI_Recv(
nullptr,
339 int count = len /
sizeof(
DoFPair);
342 receive_buffer.resize(count);
344 void *ptr = receive_buffer.data();
354 for (
const auto &dof_pair : receive_buffer)
356 copy_indices_level_mine[dof_pair.level].emplace_back(
357 dof_pair.global_dof_index, dof_pair.level_dof_index);
363 if (requests.size() > 0)
365 const int ierr = MPI_Waitall(requests.size(),
367 MPI_STATUSES_IGNORE);
385 std::less<std::pair<types::global_dof_index, types::global_dof_index>>
387 for (
auto &level_indices : copy_indices_level_mine)
388 std::sort(level_indices.begin(), level_indices.end(), compare);
389 for (
auto &level_indices : copy_indices_global_mine)
390 std::sort(level_indices.begin(), level_indices.end(), compare);
400 std::vector<types::global_dof_index> &ghosted_level_dofs,
401 const std::shared_ptr<const Utilities::MPI::Partitioner>
402 &external_partitioner,
403 const MPI_Comm communicator,
404 std::shared_ptr<const Utilities::MPI::Partitioner> &target_partitioner,
407 std::sort(ghosted_level_dofs.begin(), ghosted_level_dofs.end());
409 ghosted_dofs.
add_indices(ghosted_level_dofs.begin(),
410 ghosted_level_dofs.end());
414 if (target_partitioner.get() !=
nullptr &&
415 target_partitioner->size() == locally_owned.
size())
417 ghosted_dofs.
add_indices(target_partitioner->ghost_indices());
422 const int ghosts_locally_contained =
423 (external_partitioner.get() !=
nullptr &&
424 (external_partitioner->ghost_indices() & ghosted_dofs) ==
428 if (external_partitioner.get() !=
nullptr &&
434 if (target_partitioner.get() !=
nullptr &&
435 target_partitioner->size() == locally_owned.
size())
436 for (
unsigned int i = 0; i < copy_indices_global_mine.n_cols(); ++i)
437 copy_indices_global_mine(1, i) =
438 external_partitioner->global_to_local(
439 target_partitioner->local_to_global(
440 copy_indices_global_mine(1, i)));
441 target_partitioner = external_partitioner;
445 if (target_partitioner.get() !=
nullptr &&
446 target_partitioner->size() == locally_owned.
size())
447 for (
unsigned int i = 0; i < copy_indices_global_mine.n_cols(); ++i)
448 copy_indices_global_mine(1, i) =
451 target_partitioner->local_to_global(
452 copy_indices_global_mine(1, i)));
454 std::make_shared<Utilities::MPI::Partitioner>(locally_owned,
466 const std::vector<types::global_dof_index> &mine,
467 const std::vector<types::global_dof_index> &remote,
468 std::vector<unsigned int> &localized_indices)
470 localized_indices.resize(mine.size() + remote.size(),
472 for (
unsigned int i = 0; i < mine.size(); ++i)
476 for (
unsigned int i = 0; i < remote.size(); ++i)
488 const unsigned int fe_shift_1d,
489 const unsigned int fe_degree)
493 unsigned int c_tensor_index[dim];
494 unsigned int tmp = child;
495 for (
unsigned int d = 0;
d < dim; ++
d)
497 c_tensor_index[
d] = tmp % 2;
500 const unsigned int n_child_dofs_1d = fe_degree + 1 + fe_shift_1d;
501 unsigned int factor = 1;
502 unsigned int shift = fe_shift_1d * c_tensor_index[0];
503 for (
unsigned int d = 1;
d < dim; ++
d)
505 factor *= n_child_dofs_1d;
506 shift =
shift + factor * fe_shift_1d * c_tensor_index[
d];
518 const unsigned int child,
519 const unsigned int fe_shift_1d,
520 const unsigned int fe_degree,
521 const std::vector<unsigned int> &lexicographic_numbering,
522 const std::vector<types::global_dof_index> &local_dof_indices,
525 const unsigned int n_child_dofs_1d = fe_degree + 1 + fe_shift_1d;
526 const unsigned int shift =
527 compute_shift_within_children<dim>(child, fe_shift_1d, fe_degree);
528 const unsigned int n_components =
529 local_dof_indices.size() / Utilities::fixed_power<dim>(fe_degree + 1);
531 const unsigned int n_scalar_cell_dofs =
532 Utilities::fixed_power<dim>(n_child_dofs_1d);
533 for (
unsigned int c = 0, m = 0; c < n_components; ++c)
534 for (
unsigned int k = 0; k < (dim > 2 ? (fe_degree + 1) : 1); ++k)
535 for (
unsigned int j = 0; j < (dim > 1 ? (fe_degree + 1) : 1); ++j)
536 for (
unsigned int i = 0; i < (fe_degree + 1); ++i, ++m)
538 const unsigned int index =
539 c * n_scalar_cell_dofs +
540 k * n_child_dofs_1d * n_child_dofs_1d + j * n_child_dofs_1d +
544 local_dof_indices[lexicographic_numbering[m]],
546 indices[
index] = local_dof_indices[lexicographic_numbering[m]];
552 template <
int dim,
typename Number>
588 const unsigned int n_child_dofs_1d =
593 elem_info.
n_components * Utilities::fixed_power<dim>(n_child_dofs_1d);
597 shape_info.
reinit(dummy_quadrature, dof_handler.
get_fe(), 0);
604 for (
unsigned int c = 0; c < GeometryInfo<1>::max_children_per_cell; ++c)
608 .prolongation_matrix_1d[i * n_child_dofs_1d + j + c *
shift] =
616 template <
int dim,
typename Number>
621 const std::vector<std::shared_ptr<const Utilities::MPI::Partitioner>>
622 &external_partitioners,
624 std::vector<std::vector<unsigned int>> &level_dof_indices,
625 std::vector<std::vector<std::pair<unsigned int, unsigned int>>>
626 &parent_child_connect,
627 std::vector<unsigned int> &n_owned_level_cells,
628 std::vector<std::vector<std::vector<unsigned short>>> &dirichlet_indices,
629 std::vector<std::vector<Number>> &weights_on_refined,
631 MGLevelObject<std::shared_ptr<const Utilities::MPI::Partitioner>>
632 &target_partitioners)
634 level_dof_indices.clear();
635 parent_child_connect.clear();
636 n_owned_level_cells.clear();
637 dirichlet_indices.clear();
638 weights_on_refined.clear();
641 if (mg_constrained_dofs)
643 const unsigned int n_levels =
646 for (
unsigned int l = 0;
l < n_levels; ++
l)
648 const auto &constraints =
654 for (
const auto dof : constraints.get_local_lines())
656 const auto *entries_ptr =
657 constraints.get_constraint_entries(dof);
659 if (entries_ptr ==
nullptr)
663 Assert((entries_ptr->size() == 0) ||
664 ((entries_ptr->size() == 1) &&
665 (std::abs((*entries_ptr)[0].second - 1.) <
685 const std::size_t template_starts = fe_name.find_first_of(
'<');
686 Assert(fe_name[template_starts + 1] ==
687 (dim == 1 ?
'1' : (dim == 2 ?
'2' :
'3')),
689 fe_name[template_starts + 1] =
'1';
691 const std::unique_ptr<FiniteElement<1>> fe(
692 FETools::get_fe_by_name<1, 1>(fe_name));
699 level_dof_indices.resize(n_levels);
700 parent_child_connect.resize(n_levels - 1);
701 n_owned_level_cells.resize(n_levels - 1);
702 std::vector<std::vector<unsigned int>> coarse_level_indices(n_levels - 1);
703 for (
unsigned int level = 0;
708 std::vector<types::global_dof_index> local_dof_indices(
710 dirichlet_indices.resize(n_levels - 1);
713 Assert(external_partitioners.empty() ||
714 external_partitioners.size() == n_levels,
719 unsigned int counter = 0;
720 std::vector<types::global_dof_index> global_level_dof_indices;
721 std::vector<types::global_dof_index> global_level_dof_indices_remote;
722 std::vector<types::global_dof_index> ghosted_level_dofs;
723 std::vector<types::global_dof_index> global_level_dof_indices_l0;
724 std::vector<types::global_dof_index> ghosted_level_dofs_l0;
729 for (cell = dof_handler.
begin(
level - 1); cell != endc; ++cell)
733 if (!cell->has_children())
744 const bool cell_is_remote = !consider_cell;
745 for (
unsigned int c = 0;
746 c < GeometryInfo<dim>::max_children_per_cell;
748 if (cell->child(c)->level_subdomain_id() ==
751 consider_cell =
true;
766 std::vector<types::global_dof_index> &next_indices =
767 cell_is_remote ? global_level_dof_indices_remote :
768 global_level_dof_indices;
769 const std::size_t start_index = next_indices.size();
772 for (
unsigned int c = 0;
773 c < GeometryInfo<dim>::max_children_per_cell;
776 if (cell_is_remote && cell->child(c)->level_subdomain_id() !=
779 cell->child(c)->get_mg_dof_indices(local_dof_indices);
787 for (
const auto local_dof_index : local_dof_indices)
788 if (!owned_level_dofs.
is_element(local_dof_index))
789 ghosted_level_dofs.push_back(local_dof_index);
791 add_child_indices<dim>(c,
792 fe->n_dofs_per_cell() -
793 fe->n_dofs_per_vertex(),
797 &next_indices[start_index]);
800 if (cell->child(c)->has_children() &&
803 cell->child(c)->level_subdomain_id() ==
806 const unsigned int child_index =
807 coarse_level_indices[
level][cell->child(c)->index()];
809 parent_child_connect[
level].size());
810 unsigned int parent_index = counter;
821 parent_child_connect[
level][child_index] =
822 std::make_pair(parent_index, c);
824 static_cast<unsigned short>(-1));
828 if (mg_constrained_dofs !=
nullptr)
829 for (
unsigned int i = 0;
830 i < dof_handler.
get_fe().n_dofs_per_cell();
836 dirichlet_indices[
level][child_index].push_back(i);
842 coarse_level_indices[
level - 1].size());
843 coarse_level_indices[
level - 1][cell->index()] = counter++;
850 if (
level == 1 && !cell_is_remote)
852 cell->get_mg_dof_indices(local_dof_indices);
858 const IndexSet &owned_level_dofs_l0 =
860 for (
const auto local_dof_index : local_dof_indices)
861 if (!owned_level_dofs_l0.
is_element(local_dof_index))
862 ghosted_level_dofs_l0.push_back(local_dof_index);
864 const std::size_t start_index =
865 global_level_dof_indices_l0.
size();
866 global_level_dof_indices_l0.resize(
869 add_child_indices<dim>(
871 fe->n_dofs_per_cell() - fe->n_dofs_per_vertex(),
875 &global_level_dof_indices_l0[start_index]);
877 dirichlet_indices[0].emplace_back();
878 if (mg_constrained_dofs !=
nullptr)
879 for (
unsigned int i = 0;
880 i < dof_handler.
get_fe().n_dofs_per_cell();
884 local_dof_indices[elem_info
886 dirichlet_indices[0].back().push_back(i);
894 global_level_dof_indices.size());
895 n_owned_level_cells[
level - 1] = counter;
896 dirichlet_indices[
level - 1].resize(counter);
897 parent_child_connect[
level - 1].resize(
905 if (
level < n_levels - 1)
906 for (std::vector<std::pair<unsigned int, unsigned int>>::iterator
908 i != parent_child_connect[
level].end();
924 external_partitioners.empty() ?
926 external_partitioners[
level],
928 target_partitioners[
level],
929 copy_indices_global_mine[
level]);
932 global_level_dof_indices,
933 global_level_dof_indices_remote,
934 level_dof_indices[
level]);
938 for (
unsigned int i = 0; i < parent_child_connect[0].size(); ++i)
939 parent_child_connect[0][i] = std::make_pair(i, 0
U);
942 ghosted_level_dofs_l0,
943 external_partitioners.empty() ?
945 external_partitioners[0],
947 target_partitioners[0],
948 copy_indices_global_mine[0]);
951 *target_partitioners[0],
952 global_level_dof_indices_l0,
953 std::vector<types::global_dof_index>(),
954 level_dof_indices[0]);
960 const unsigned int n_child_dofs_1d =
961 fe->degree + 1 + fe->n_dofs_per_cell() - fe->n_dofs_per_vertex();
965 weights_on_refined.resize(n_levels - 1);
969 target_partitioners[
level]);
970 for (
unsigned int c = 0; c < n_owned_level_cells[
level - 1]; ++c)
978 std::vector<unsigned int> degree_to_3(n_child_dofs_1d);
980 for (
unsigned int i = 1; i < n_child_dofs_1d - 1; ++i)
982 degree_to_3.back() = 2;
986 weights_on_refined[
level - 1].resize(n_owned_level_cells[
level - 1] *
987 Utilities::fixed_power<dim>(3));
988 for (
unsigned int c = 0; c < n_owned_level_cells[
level - 1]; ++c)
989 for (
unsigned int k = 0, m = 0; k < (dim > 2 ? n_child_dofs_1d : 1);
991 for (
unsigned int j = 0; j < (dim > 1 ? n_child_dofs_1d : 1); ++j)
993 unsigned int shift = 9 * degree_to_3[k] + 3 * degree_to_3[j];
994 for (
unsigned int i = 0; i < n_child_dofs_1d; ++i, ++m)
995 weights_on_refined[
level -
996 1][c * Utilities::fixed_power<dim>(3) +
997 shift + degree_to_3[i]] =
1000 level_dof_indices[
level]
1011 const unsigned int level,
1012 std::vector<types::global_dof_index> &dof_indices)
1014 if (mg_constrained_dofs !=
nullptr &&
1016 for (
auto &ind : dof_indices)
1036 #include "mg_transfer_internal.inst"
const std::vector< std::pair< size_type, number > > * get_constraint_entries(const size_type line_n) const
bool is_identity_constrained(const size_type line_n) const
size_type n_constraints() const
cell_iterator end() const
const Triangulation< dim, spacedim > & get_triangulation() const
const IndexSet & locally_owned_mg_dofs(const unsigned int level) const
const FiniteElement< dim, spacedim > & get_fe(const types::fe_index index=0) const
cell_iterator begin(const unsigned int level=0) const
const IndexSet & locally_owned_dofs() const
unsigned int n_dofs_per_vertex() const
const unsigned int degree
unsigned int n_dofs_per_cell() const
unsigned int n_dofs_per_line() const
virtual std::string get_name() const =0
virtual const FiniteElement< dim, spacedim > & base_element(const unsigned int index) const
unsigned int element_multiplicity(const unsigned int index) const
unsigned int n_base_elements() const
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
size_type index_within_set(const size_type global_index) const
size_type n_elements() const
bool is_element(const size_type index) const
size_type nth_index_in_set(const size_type local_index) const
void add_indices(const ForwardIterator &begin, const ForwardIterator &end)
Number local_element(const size_type local_index) const
void update_ghost_values() const
void compress(VectorOperation::values operation)
bool at_refinement_edge(const unsigned int level, const types::global_dof_index index) const
bool is_boundary_index(const unsigned int level, const types::global_dof_index index) const
const AffineConstraints< double > & get_user_constraint_matrix(const unsigned int level) const
const AffineConstraints< double > & get_level_constraints(const unsigned int level) const
virtual MPI_Comm get_communicator() const
virtual types::subdomain_id locally_owned_subdomain() const
unsigned int n_levels() const
unsigned int n_raw_cells(const unsigned int level) const
virtual unsigned int n_global_levels() const
unsigned int n_cells() const
unsigned int global_to_local(const types::global_dof_index global_index) const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
IteratorRange< active_cell_iterator > active_cell_iterators_on_level(const unsigned int level) const
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
#define Assert(cond, exc)
static ::ExceptionBase & ExcNotImplemented()
#define AssertDimension(dim1, dim2)
#define AssertThrowMPI(error_code)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
typename ActiveSelector::cell_iterator cell_iterator
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
SymmetricTensor< 2, dim, Number > epsilon(const Tensor< 2, dim, Number > &Grad_u)
Tensor< 2, dim, Number > l(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
VectorType::value_type * begin(VectorType &V)
T sum(const T &t, const MPI_Comm mpi_communicator)
T min(const T &t, const MPI_Comm mpi_communicator)
std::vector< unsigned int > compute_index_owner(const IndexSet &owned_indices, const IndexSet &indices_to_look_up, const MPI_Comm comm)
void setup_element_info(ElementInfo< Number > &elem_info, const FiniteElement< 1 > &fe, const DoFHandler< dim > &dof_handler)
void resolve_identity_constraints(const MGConstrainedDoFs *mg_constrained_dofs, const unsigned int level, std::vector< types::global_dof_index > &dof_indices)
unsigned int compute_shift_within_children(const unsigned int child, const unsigned int fe_shift_1d, const unsigned int fe_degree)
void add_child_indices(const unsigned int child, const unsigned int fe_shift_1d, const unsigned int fe_degree, const std::vector< unsigned int > &lexicographic_numbering, const std::vector< types::global_dof_index > &local_dof_indices, types::global_dof_index *target_indices)
void setup_transfer(const DoFHandler< dim > &dof_handler, const MGConstrainedDoFs *mg_constrained_dofs, const std::vector< std::shared_ptr< const Utilities::MPI::Partitioner >> &external_partitioners, ElementInfo< Number > &elem_info, std::vector< std::vector< unsigned int >> &level_dof_indices, std::vector< std::vector< std::pair< unsigned int, unsigned int >>> &parent_child_connect, std::vector< unsigned int > &n_owned_level_cells, std::vector< std::vector< std::vector< unsigned short >>> &dirichlet_indices, std::vector< std::vector< Number >> &weights_on_refined, std::vector< Table< 2, unsigned int >> ©_indices_global_mine, MGLevelObject< std::shared_ptr< const Utilities::MPI::Partitioner >> &vector_partitioners)
void reinit_level_partitioner(const IndexSet &locally_owned, std::vector< types::global_dof_index > &ghosted_level_dofs, const std::shared_ptr< const Utilities::MPI::Partitioner > &external_partitioner, const MPI_Comm communicator, std::shared_ptr< const Utilities::MPI::Partitioner > &target_partitioner, Table< 2, unsigned int > ©_indices_global_mine)
void copy_indices_to_mpi_local_numbers(const Utilities::MPI::Partitioner &part, const std::vector< types::global_dof_index > &mine, const std::vector< types::global_dof_index > &remote, std::vector< unsigned int > &localized_indices)
void fill_copy_indices(const DoFHandler< dim, spacedim > &dof_handler, const MGConstrainedDoFs *mg_constrained_dofs, std::vector< std::vector< std::pair< types::global_dof_index, types::global_dof_index >>> ©_indices, std::vector< std::vector< std::pair< types::global_dof_index, types::global_dof_index >>> ©_indices_global_mine, std::vector< std::vector< std::pair< types::global_dof_index, types::global_dof_index >>> ©_indices_level_mine, const bool skip_interface_dofs=true)
const types::subdomain_id artificial_subdomain_id
const types::subdomain_id invalid_subdomain_id
static const unsigned int invalid_unsigned_int
const types::global_dof_index invalid_dof_index
unsigned int global_dof_index
types::global_dof_index global_dof_index
types::global_dof_index level_dof_index
DoFPair(const unsigned int level, const types::global_dof_index global_dof_index, const types::global_dof_index level_dof_index)
std::vector< Number > prolongation_matrix_1d
unsigned int n_child_cell_dofs
std::vector< unsigned int > lexicographic_numbering
bool element_is_continuous
unsigned int n_components
void reinit(const Quadrature< dim_q > &quad, const FiniteElement< dim, spacedim > &fe_dim, const unsigned int base_element=0)
std::vector< unsigned int > lexicographic_numbering
const ::Triangulation< dim, spacedim > & tria