13#ifndef dealii_dof_accessor_h
14#define dealii_dof_accessor_h
31#include <boost/container/small_vector.hpp>
42template <
typename number>
44template <
typename number>
46template <
typename number>
49template <
typename Accessor>
57 namespace DoFCellAccessorImplementation
59 struct Implementation;
62 namespace DoFHandlerImplementation
64 struct Implementation;
67 struct Implementation;
73 namespace DoFHandlerImplementation
75 struct Implementation;
84 namespace DoFAccessorImplementation
102 template <
int structdim,
int dim,
int spacedim>
118 template <
int dim,
int spacedim>
209template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
230 using BaseClass = typename ::internal::DoFAccessorImplementation::
231 Inheritance<structdim, dimension, space_dimension>::BaseClass;
300 template <
int structdim2,
int dim2,
int spacedim2>
307 template <
int structdim2,
int dim2,
int spacedim2,
bool level_dof_access2>
314 template <
bool level_dof_access2>
351 template <
bool level_dof_access2>
387 typename ::internal::DoFHandlerImplementation::
388 Iterators<dim, spacedim, level_dof_access>::line_iterator
389 line(
const unsigned int i)
const;
396 typename ::internal::DoFHandlerImplementation::
397 Iterators<dim, spacedim, level_dof_access>::quad_iterator
398 quad(
const unsigned int i)
const;
447 std::vector<types::global_dof_index> &dof_indices,
459 std::vector<types::global_dof_index> &dof_indices,
468 const std::vector<types::global_dof_index> &dof_indices,
494 const unsigned int vertex,
495 const unsigned int i,
506 const unsigned int vertex,
507 const unsigned int i,
587 std::set<types::fe_index>
620 "This accessor object has not been "
621 "associated with any DoFHandler object.");
675 template <
int structdim2,
int dim2,
int spacedim2,
bool level_dof_access2>
683 template <
int structdim2,
int dim2,
int spacedim2,
bool level_dof_access2>
715 const unsigned int i,
721 const unsigned int i,
727 const unsigned int vertex,
728 const unsigned int i,
736 template <
int,
int,
int,
bool>
744 friend struct ::internal::DoFHandlerImplementation::Policy::
746 friend struct ::internal::DoFHandlerImplementation::Implementation;
747 friend struct ::internal::hp::DoFHandlerImplementation::Implementation;
748 friend struct ::internal::DoFCellAccessorImplementation::Implementation;
749 friend struct ::internal::DoFAccessorImplementation::Implementation;
761template <
int spacedim,
bool level_dof_access>
820 const unsigned int vertex_index,
846 template <
int structdim2,
int dim2,
int spacedim2>
853 template <
int structdim2,
int dim2,
int spacedim2,
bool level_dof_access2>
905 template <
bool level_dof_access2>
929 child(const
unsigned int c) const;
937 typename ::
internal::DoFHandlerImplementation::
938 Iterators<1, spacedim, level_dof_access>::line_iterator
939 line(const
unsigned int i) const;
947 typename ::
internal::DoFHandlerImplementation::
948 Iterators<1, spacedim, level_dof_access>::quad_iterator
949 quad(const
unsigned int i) const;
996 std::vector<
types::global_dof_index> &dof_indices,
997 const
types::fe_index fe_index =
numbers::invalid_fe_index) const;
1008 std::vector<
types::global_dof_index> &dof_indices,
1009 const
types::fe_index fe_index =
numbers::invalid_fe_index) const;
1029 types::global_dof_index
1031 const
unsigned int vertex,
1032 const
unsigned int i,
1033 const
types::fe_index fe_index =
numbers::invalid_fe_index) const;
1052 types::global_dof_index
1054 const
types::fe_index fe_index =
numbers::invalid_fe_index) const;
1116 "This accessor
object has not been "
1160 template <
int structdim2,
int dim2,
int spacedim2,
bool level_dof_access2>
1163 const
DoFAccessor<structdim2, dim2, spacedim2, level_dof_access2> &) const;
1168 template <
int structdim2,
int dim2,
int spacedim2,
bool level_dof_access2>
1171 const
DoFAccessor<structdim2, dim2, spacedim2, level_dof_access2> &) const;
1199 const
unsigned int i,
1200 const
types::global_dof_index index,
1201 const
types::fe_index fe_index =
numbers::invalid_fe_index) const;
1213 friend struct ::
internal::DoFHandlerImplementation::Policy::
1245template <
int structdim,
int dim,
int spacedim = dim>
1263 const int level = -1,
1264 const int index = -1,
1280 template <
typename OtherAccessor>
1300 const unsigned int i,
1321template <
int dimension_,
int space_dimension_,
bool level_dof_access>
1331 static const unsigned int dim = dimension_;
1336 static const unsigned int spacedim = space_dimension_;
1392 template <
int structdim2,
int dim2,
int spacedim2>
1399 template <
int structdim2,
int dim2,
int spacedim2,
bool level_dof_access2>
1473 neighbor(
const unsigned int i)
const;
1481 periodic_neighbor(
const unsigned int i)
const;
1489 neighbor_or_periodic_neighbor(
const unsigned int i)
const;
1497 child(
const unsigned int i)
const;
1502 boost::container::small_vector<
1506 child_iterators()
const;
1515 face(
const unsigned int i)
const;
1522 face_iterators()
const;
1531 neighbor_child_on_subface(
const unsigned int face_no,
1532 const unsigned int subface_no)
const;
1541 periodic_neighbor_child_on_subface(
const unsigned int face_no,
1542 const unsigned int subface_no)
const;
1572 template <
class InputVector,
typename number>
1574 get_dof_values(
const InputVector &values,
Vector<number> &local_values)
const;
1593 template <
typename Number,
typename ForwardIterator>
1596 ForwardIterator local_values_begin,
1597 ForwardIterator local_values_end)
const;
1619 template <
class InputVector,
typename ForwardIterator>
1623 const InputVector &values,
1624 ForwardIterator local_values_begin,
1625 ForwardIterator local_values_end)
const;
1651 template <
class OutputVector,
typename number>
1654 OutputVector &values)
const;
1687 template <
typename Number>
1689 get_interpolated_dof_values(
1698 template <
typename Number>
1700 get_interpolated_dof_values(
1766 template <
class OutputVector,
typename number>
1768 set_dof_values_by_interpolation(
1770 OutputVector &values,
1772 const bool perform_check =
false)
const;
1783 template <
class OutputVector,
typename number>
1785 distribute_local_to_global_by_interpolation(
1787 OutputVector &values,
1804 template <
typename number,
typename OutputVector>
1807 OutputVector &global_destination)
const;
1823 template <
typename ForwardIterator,
typename OutputVector>
1825 distribute_local_to_global(ForwardIterator local_source_begin,
1826 ForwardIterator local_source_end,
1827 OutputVector &global_destination)
const;
1842 template <
typename ForwardIterator,
typename OutputVector>
1844 distribute_local_to_global(
1846 ForwardIterator local_source_begin,
1847 ForwardIterator local_source_end,
1848 OutputVector &global_destination)
const;
1856 template <
typename number,
typename OutputMatrix>
1859 OutputMatrix &global_destination)
const;
1865 template <
typename number,
typename OutputMatrix,
typename OutputVector>
1869 OutputMatrix &global_matrix,
1870 OutputVector &global_vector)
const;
1897 get_active_or_mg_dof_indices(
1898 std::vector<types::global_dof_index> &dof_indices)
const;
1932 get_dof_indices(std::vector<types::global_dof_index> &dof_indices)
const;
1939 get_mg_dof_indices(std::vector<types::global_dof_index> &dof_indices)
const;
1994 active_fe_index()
const;
2033 set_dof_indices(
const std::vector<types::global_dof_index> &dof_indices);
2039 set_mg_dof_indices(
const std::vector<types::global_dof_index> &dof_indices);
2067 get_future_fe()
const;
2088 future_fe_index()
const;
2108 future_fe_index_set()
const;
2119 clear_future_fe_index()
const;
2125 friend struct ::internal::DoFCellAccessorImplementation::Implementation;
2129template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
2133 return level_dof_access;
2138template <
int structdim,
int dim,
int spacedim>
2139template <
typename OtherAccessor>
2141 const OtherAccessor &)
2144 ExcMessage(
"You are attempting an illegal conversion between "
2145 "iterator/accessor types. The constructor you call "
2146 "only exists to make certain template constructs "
2147 "easier to write as dimension independent code but "
2148 "the conversion is not valid in the current context."));
2156template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
2164template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
2170 : ::
internal::DoFAccessorImplementation::
2171 Inheritance<structdim, dim, spacedim>::
BaseClass(tria,
level, index)
2177 "You can't create a DoF accessor in which the DoFHandler object "
2178 "uses a different triangulation than the one you pass as argument."));
2183template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
2184template <
int structdim2,
int dim2,
int spacedim2>
2188 Assert(
false, ExcInvalidObject());
2193template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
2194template <
int structdim2,
int dim2,
int spacedim2,
bool level_dof_access2>
2198 , dof_handler(nullptr)
2202 "You are trying to assign iterators that are incompatible. "
2203 "The reason for incompatibility is that they refer to objects of "
2204 "different dimensionality (e.g., assigning a line iterator "
2205 "to a quad iterator)."));
2210template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
2211template <
bool level_dof_access2>
2215 , dof_handler(const_cast<
DoFHandler<dim, spacedim> *>(other.dof_handler))
2220template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
2225 Assert(dh !=
nullptr, ExcInvalidObject());
2226 this->dof_handler = dh;
2231template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
2235 Assert(this->dof_handler !=
nullptr, ExcInvalidObject());
2236 return *this->dof_handler;
2241template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
2246 Assert(this->dof_handler !=
nullptr, ExcInvalidObject());
2247 BaseClass::copy_from(da);
2252template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
2253template <
bool level_dof_access2>
2258 BaseClass::copy_from(a);
2264template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
2265template <
int structdim2,
int dim2,
int spacedim2,
bool level_dof_access2>
2270 Assert(structdim == structdim2, ExcCantCompareIterators());
2272 return (BaseClass::operator==(a));
2277template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
2278template <
int structdim2,
int dim2,
int spacedim2,
bool level_dof_access2>
2283 Assert(structdim == structdim2, ExcCantCompareIterators());
2285 return (BaseClass::operator!=(a));
2290template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
2293 const unsigned int i)
const
2296 this->dof_handler->object_dof_indices.size(),
2303 *t, this->dof_handler);
2310 namespace DoFAccessorImplementation
2316 template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
2330 "It is not possible to specify a FE index if no hp support is used!"));
2350 "You need to specify a FE index if hp support is used!"));
2371 boost::container::small_vector<::types::global_dof_index, 100>;
2386 typename GlobalIndexType,
2387 typename DoFPProcessor>
2390 const unsigned int obj_level,
2391 const unsigned int obj_index,
2393 const unsigned int local_index,
2394 const std::integral_constant<int, structdim> &,
2395 GlobalIndexType &global_index,
2396 const DoFPProcessor &process)
2408 [obj_level][structdim]
2417 if (structdim == dim)
2421 [obj_level][structdim]
2449 "You are requesting an active FE index that is not assigned "
2450 "to any of the cells connected to this entity."));
2465 [obj_level][structdim]
2474 [obj_level][structdim]
2476 [obj_level][structdim]
2494 template <
int dim,
int spacedim,
int structdim>
2495 static std::pair<unsigned int, unsigned int>
2497 const unsigned int obj_level,
2498 const unsigned int obj_index,
2500 const std::integral_constant<int, structdim> &)
2506 if (structdim == dim)
2508 const unsigned int ptr_0 =
2510 const unsigned int length =
2511 dof_handler.
get_fe(fe_index).template n_dofs_per_object<dim>(0);
2513 return {ptr_0, length};
2522 const unsigned int ptr_0 =
2524 const unsigned int length =
2525 dof_handler.
object_dof_ptr[obj_level][structdim][obj_index + 1] -
2528 return {ptr_0, length};
2540 const auto fe_index_local_ptr =
2547 Assert(fe_index_local_ptr !=
2551 "You tried to call a function accessing DoF indices, but "
2552 "they appear not be available (yet) or inconsistent. "
2553 "Did you call distribute_dofs() first? Alternatively, if "
2554 "you are using different elements on different cells (i.e., "
2555 "you are using the hp capabilities of deal.II), did you "
2556 "change the active_fe_index of a cell since you last "
2557 "called distribute_dofs()?"));
2562 fe_index_local_ptr);
2568 const unsigned int ptr_0 =
2573 const unsigned int ptr_1 =
2577 fe_index_local + 1];
2579 return {ptr_0, ptr_1 - ptr_0};
2582 template <
int dim,
int spacedim,
int structdim,
bool level_dof_access>
2583 static std::pair<unsigned int, unsigned int>
2585 const ::DoFAccessor<structdim, dim, spacedim, level_dof_access>
2593 std::integral_constant<int, structdim>());
2596 template <
int dim,
int spacedim,
int structdim>
2597 static std::pair<unsigned int, unsigned int>
2619 typename DoFProcessor,
2620 typename DoFMapping>
2623 const unsigned int obj_level,
2624 const unsigned int obj_index,
2626 const DoFMapping &mapping,
2627 const std::integral_constant<int, structdim> &dd,
2629 const DoFProcessor &process)
2636 if (range.second == 0)
2639 std::vector<types::global_dof_index> &object_dof_indices =
2644 object_dof_indices.data() + range.first;
2647 for (
unsigned int i = 0; i < range.second; ++i)
2650 stored_indices[(structdim == 0 || structdim == dim) ? i :
2653 if (dof_indices_ptr !=
nullptr)
2670 template <
int dim,
int spacedim,
int structdim>
2673 const unsigned int obj_level,
2674 const unsigned int obj_index,
2676 const unsigned int local_index,
2677 const std::integral_constant<int, structdim> &dd,
2687 [](
auto &ptr,
const auto &
value) { ptr =
value; });
2701 template <
int dim,
int spacedim,
int structdim>
2704 const unsigned int obj_level,
2705 const unsigned int obj_index,
2707 const unsigned int local_index,
2708 const std::integral_constant<int, structdim> &dd)
2718 [](
const auto &ptr,
auto &
value) {
value = ptr; });
2719 return global_index;
2723 template <
int dim,
int spacedim>
2727 const unsigned int vertex_index,
2728 const unsigned int i)
2732 "DoFHandler in hp-mode does not implement multilevel DoFs."));
2749 template <
int dim,
int spacedim,
int structdim>
2752 const unsigned int obj_level,
2753 const unsigned int obj_index,
2754 const std::integral_constant<int, structdim> &)
2765 if (structdim == dim)
2788 template <
int dim,
int spacedim,
int structdim>
2791 const unsigned int obj_level,
2792 const unsigned int obj_index,
2793 const unsigned int local_index,
2794 const std::integral_constant<int, structdim> &)
2799 Assert(((structdim == dim) &&
2809 if (structdim == dim)
2840 template <
int dim,
int spacedim,
int structdim>
2841 static std::set<types::fe_index>
2843 const unsigned int obj_level,
2844 const unsigned int obj_index,
2845 const std::integral_constant<int, structdim> &t)
2854 if (structdim == dim)
2858 std::set<types::fe_index> active_fe_indices;
2859 for (
unsigned int i = 0;
2862 active_fe_indices.insert(
2864 return active_fe_indices;
2869 template <
int dim,
int spacedim,
int structdim>
2872 const unsigned int obj_level,
2873 const unsigned int obj_index,
2875 const std::integral_constant<int, structdim> &)
2884 if (structdim == dim)
2901 template <
typename InputVector,
typename ForwardIterator>
2906 ForwardIterator local_values_begin)
2908 values.extract_subvector_to(cache, cache_end, local_values_begin);
2913#ifdef DEAL_II_WITH_TRILINOS
2914 static std::vector<unsigned int>
2919 std::vector<unsigned int> idx(v_end - v_begin);
2920 std::iota(idx.begin(), idx.end(), 0u);
2923 std::sort(idx.begin(),
2925 [&v_begin](
unsigned int i1,
unsigned int i2) {
2926 return *(v_begin + i1) < *(v_begin + i2);
2934# ifdef DEAL_II_TRILINOS_WITH_TPETRA
2935 template <
typename ForwardIterator,
typename Number,
typename MemorySpace>
2942 ForwardIterator local_values_begin)
2944 std::vector<unsigned int> sorted_indices_pos =
2946 const unsigned int cache_size = cache_end - cache_begin;
2947 std::vector<types::global_dof_index> cache_indices(cache_size);
2948 for (
unsigned int i = 0; i < cache_size; ++i)
2949 cache_indices[i] = *(cache_begin + sorted_indices_pos[i]);
2951 IndexSet index_set(cache_indices.back() + 1);
2952 index_set.
add_indices(cache_indices.begin(), cache_indices.end());
2958 for (
unsigned int i = 0; i < cache_size; ++i, ++local_values_begin)
2959 *local_values_begin = read_write_vector[sorted_indices_pos[i]];
2964# ifdef DEAL_II_TRILINOS_WITH_EPETRA
2965 template <
typename ForwardIterator>
2970 ForwardIterator local_values_begin)
2972 std::vector<unsigned int> sorted_indices_pos =
2974 const unsigned int cache_size = cache_end - cache_begin;
2975 std::vector<types::global_dof_index> cache_indices(cache_size);
2976 for (
unsigned int i = 0; i < cache_size; ++i)
2977 cache_indices[i] = *(cache_begin + sorted_indices_pos[i]);
2979 IndexSet index_set(cache_indices.back() + 1);
2980 index_set.
add_indices(cache_indices.begin(), cache_indices.end());
2986 for (
unsigned int i = 0; i < cache_size; ++i, ++local_values_begin)
2987 *local_values_begin = read_write_vector[sorted_indices_pos[i]];
2996 template <
int dim,
int spacedim,
bool level_dof_access,
int structdim>
2999 const ::DoFAccessor<structdim, dim, spacedim, level_dof_access>
3002 const bool count_level_dofs)
3007 if (count_level_dofs)
3009 const auto &fe = accessor.get_fe(fe_index_);
3012 dofs_per_vertex = fe.n_dofs_per_vertex(),
3013 dofs_per_line = fe.n_dofs_per_line(),
3014 dofs_per_quad = fe.n_dofs_per_quad(0 ),
3015 dofs_per_hex = fe.n_dofs_per_hex();
3017 unsigned int index = 0;
3020 index += dofs_per_vertex * accessor.n_vertices();
3023 if (structdim == 2 || structdim == 3)
3024 index += dofs_per_line * accessor.n_lines();
3028 index += dofs_per_quad * accessor.n_faces();
3031 const unsigned int interior_dofs =
3032 structdim == 1 ? dofs_per_line :
3033 (structdim == 2 ? dofs_per_quad : dofs_per_hex);
3035 index += interior_dofs;
3041 const auto fe_index =
3043 accessor, fe_index_);
3045 unsigned int index = 0;
3048 for (
const auto vertex : accessor.vertex_indices())
3051 accessor.vertex_index(vertex),
3053 std::integral_constant<int, 0>())
3057 if constexpr (structdim == 2 || structdim == 3)
3059 const auto line_indices = TriaAccessorImplementation::
3060 Implementation::get_line_indices_of_cell(accessor);
3061 for (
const auto line_no : accessor.line_indices())
3064 &accessor.get_triangulation(),
3066 line_indices[line_no],
3067 &accessor.get_dof_handler());
3074 for (
const auto face : accessor.face_indices())
3091 template <
typename ArrayType>
3095 return array.size();
3104 template <
typename ArrayType>
3126 bool level_dof_access,
3128 typename DoFIndicesType,
3129 typename DoFOperation,
3130 typename DoFProcessor>
3133 const ::DoFAccessor<structdim, dim, spacedim, level_dof_access>
3135 const DoFIndicesType &const_dof_indices,
3137 const DoFOperation &dof_operation,
3138 const DoFProcessor &dof_processor,
3139 const bool count_level_dofs)
3143 accessor, fe_index_);
3148 (void)count_level_dofs;
3150 const auto &fe = accessor.get_fe(fe_index);
3164 if (fe.n_dofs_per_vertex() > 0)
3165 for (
const auto vertex : accessor.vertex_indices())
3166 dof_operation.process_vertex_dofs(*accessor.dof_handler,
3167 accessor.vertex_index(vertex),
3174 if (structdim > 1 && fe.n_dofs_per_line() > 0)
3176 const auto [line_indices, line_orientations] =
3177 internal::TriaAccessorImplementation::Implementation::
3178 get_line_indices_and_orientations_of_cell(accessor);
3180 for (
const auto line : accessor.line_indices())
3182 const auto line_orientation = line_orientations[line];
3184 dof_operation.process_dofs(
3185 accessor.get_dof_handler(),
3189 [](
const auto d) {
return d; },
3190 std::integral_constant<int, 1>(),
3195 Assert(line_orientation ==
3198 dof_operation.process_dofs(
3199 accessor.get_dof_handler(),
3203 [&fe](
const auto d) {
3204 return fe.adjust_line_dof_index_for_line_orientation(
3205 d, numbers::reverse_line_orientation);
3207 std::integral_constant<int, 1>(),
3217 if (structdim == 3 && fe.max_dofs_per_quad() > 0)
3218 for (
const auto face_no : accessor.face_indices())
3220 const auto combined_orientation =
3221 accessor.combined_face_orientation(face_no);
3222 const unsigned int quad_index = accessor.quad_index(face_no);
3223 if (combined_orientation ==
3225 dof_operation.process_dofs(
3226 accessor.get_dof_handler(),
3230 [](
const auto d) {
return d; },
3231 std::integral_constant<int, 2>(),
3235 dof_operation.process_dofs(
3236 accessor.get_dof_handler(),
3241 return fe.adjust_quad_dof_index_for_face_orientation(
3242 d, face_no, combined_orientation);
3244 std::integral_constant<int, 2>(),
3253 if (((dim == 3 && structdim == 2) ?
3254 fe.max_dofs_per_quad() :
3255 fe.template n_dofs_per_object<structdim>()) > 0)
3256 dof_operation.process_dofs(
3257 accessor.get_dof_handler(),
3261 [&](
const auto d) {
return d; },
3262 std::integral_constant<int, structdim>(),
3266 if (dof_indices_ptr !=
nullptr)
3279 for (; dof_indices_ptr < end_dof_indices; ++dof_indices_ptr)
3280 dof_processor(invalid_index, dof_indices_ptr);
3289 template <
int dim,
int spacedim>
3295 template <
typename DoFProcessor>
3298 const unsigned int vertex_index,
3301 const DoFProcessor &dof_processor)
const
3312 std::integral_constant<int, 0>(),
3320 template <
int structdim,
typename DoFMapping,
typename DoFProcessor>
3323 const unsigned int obj_level,
3324 const unsigned int obj_index,
3326 const DoFMapping &mapping,
3327 const std::integral_constant<int, structdim>,
3329 const DoFProcessor &dof_processor)
const
3337 std::integral_constant<
int,
std::min(structdim, dim)>(),
3349 template <
int dim,
int spacedim>
3362 template <
typename DoFProcessor>
3365 const unsigned int vertex_index,
3368 const DoFProcessor &dof_processor)
const
3370 const unsigned int n_indices =
3371 dof_handler.
get_fe(0).template n_dofs_per_object<0>();
3376 for (
unsigned int d = 0; d < n_indices; ++d, ++dof_indices_ptr)
3377 dof_processor(stored_indices[d], dof_indices_ptr);
3383 template <
int structdim,
typename DoFMapping,
typename DoFProcessor>
3387 const unsigned int obj_index,
3389 const DoFMapping &mapping,
3390 const std::integral_constant<int, structdim>,
3392 const DoFProcessor &dof_processor)
const
3394 const unsigned int n_indices =
3395 dof_handler.
get_fe(0).template n_dofs_per_object<structdim>();
3403 std::integral_constant<
int,
std::min(structdim, dim)>());
3404 for (
unsigned int d = 0; d < n_indices; ++d, ++dof_indices_ptr)
3405 dof_processor(stored_indices[structdim < dim ? mapping(d) : d],
3415 template <
int dim,
int spacedim,
bool level_dof_access,
int structdim>
3418 const ::DoFAccessor<structdim, dim, spacedim, level_dof_access>
3420 std::vector<types::global_dof_index> &dof_indices,
3428 [](
auto stored_index,
auto dof_ptr) { *dof_ptr = stored_index; },
3434 template <
int dim,
int spacedim,
bool level_dof_access,
int structdim>
3437 const ::DoFAccessor<structdim, dim, spacedim, level_dof_access>
3439 const std::vector<types::global_dof_index> &dof_indices,
3450 "This function is intended to be used for DoFCellAccessor, i.e., "
3451 "dimension == structdim."));
3458 [](
auto &stored_index,
auto dof_ptr) { stored_index = *dof_ptr; },
3464 template <
int dim,
int spacedim,
bool level_dof_access,
int structdim>
3467 const ::DoFAccessor<structdim, dim, spacedim, level_dof_access>
3470 std::vector<types::global_dof_index> &dof_indices,
3474 ExcMessage(
"MG DoF indices cannot be queried in hp case"));
3480 [](
auto stored_index,
auto dof_ptr) { *dof_ptr = stored_index; },
3486 template <
int dim,
int spacedim,
bool level_dof_access,
int structdim>
3489 const ::DoFAccessor<structdim, dim, spacedim, level_dof_access>
3492 const std::vector<types::global_dof_index> &dof_indices,
3496 ExcMessage(
"MG DoF indices cannot be queried in hp case"));
3504 ExcMessage(
"This function is intended to be used for "
3505 "DoFCellAccessor, i.e., dimension == structdim."));
3512 [](
auto &stored_index,
auto dof_ptr) { stored_index = *dof_ptr; },
3518 template <
int dim,
int spacedim>
3526 const unsigned int obj_index,
3528 const unsigned int local_index,
3529 const std::integral_constant<int, dim>)
3534 return mg_level->dof_object.access_dof_index(
3543 template <
int dim,
int spacedim, std::enable_if_t<(dim > 1),
int> = 0>
3551 const unsigned int obj_index,
3553 const unsigned int local_index,
3554 const std::integral_constant<int, 1>)
3556 return mg_faces->lines.access_dof_index(
3565 template <
int spacedim>
3573 const unsigned int obj_index,
3575 const unsigned int local_index,
3576 const std::integral_constant<int, 2>)
3580 return mg_faces->quads.access_dof_index(
3590 template <
int dim,
int spacedim,
bool level_dof_access>
3593 const ::DoFCellAccessor<dim, spacedim, level_dof_access> &accessor,
3595 const unsigned int fe_index);
3601template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
3604 const unsigned int i,
3607 const auto fe_index =
3612 return ::internal::DoFAccessorImplementation::Implementation::
3613 get_dof_index(*this->dof_handler,
3618 std::integral_constant<int, structdim>());
3622template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
3626 const unsigned int i)
const
3630 this->dof_handler->mg_levels[
level],
3631 this->dof_handler->mg_faces,
3635 std::integral_constant<int, structdim>());
3639template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
3642 const unsigned int i,
3646 const auto fe_index =
3657 std::integral_constant<int, structdim>(),
3663template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
3667 const unsigned int i,
3672 this->dof_handler->mg_levels[
level],
3673 this->dof_handler->mg_faces,
3677 std::integral_constant<int, structdim>()) = index;
3682template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
3688 return ::internal::DoFAccessorImplementation::Implementation::
3689 n_active_fe_indices(*this->dof_handler,
3692 std::integral_constant<int, structdim>());
3697template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
3700 const unsigned int n)
const
3703 return ::internal::DoFAccessorImplementation::Implementation::
3704 nth_active_fe_index(*this->dof_handler,
3708 std::integral_constant<int, structdim>());
3713template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
3714inline std::set<types::fe_index>
3718 std::set<types::fe_index> active_fe_indices;
3719 for (
unsigned int i = 0; i < n_active_fe_indices(); ++i)
3720 active_fe_indices.insert(nth_active_fe_index(i));
3721 return active_fe_indices;
3726template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
3732 return ::internal::DoFAccessorImplementation::Implementation::
3733 fe_index_is_active(*this->dof_handler,
3737 std::integral_constant<int, structdim>());
3742template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
3745 const unsigned int vertex,
3746 const unsigned int i,
3750 (((this->dof_handler->hp_capability_enabled ==
false) &&
3761 this->nth_active_fe_index(0) :
3764 return ::internal::DoFAccessorImplementation::Implementation::
3765 get_dof_index(*this->dof_handler,
3767 this->vertex_index(vertex),
3770 std::integral_constant<int, 0>());
3774template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
3778 const unsigned int vertex,
3779 const unsigned int i,
3782 const auto fe_index =
3786 Assert(this->dof_handler !=
nullptr, ExcInvalidObject());
3787 Assert(this->dof_handler->mg_vertex_dofs.size() > 0,
3788 ExcMessage(
"Multigrid DoF indices can only be accessed after "
3789 "DoFHandler::distribute_mg_dofs() has been called!"));
3791 AssertIndexRange(i, this->dof_handler->get_fe(fe_index).n_dofs_per_vertex());
3793 Assert(dof_handler->hp_capability_enabled ==
false,
3795 "DoFHandler in hp-mode does not implement multilevel DoFs."));
3797 return this->dof_handler->mg_vertex_dofs[this->vertex_index(vertex)]
3798 .access_index(
level, i, this->dof_handler->get_fe().n_dofs_per_vertex());
3803template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
3807 const unsigned int vertex,
3808 const unsigned int i,
3812 const auto fe_index =
3816 Assert(this->dof_handler !=
nullptr, ExcInvalidObject());
3818 AssertIndexRange(i, this->dof_handler->get_fe(fe_index).n_dofs_per_vertex());
3820 Assert(dof_handler->hp_capability_enabled ==
false,
3822 "DoFHandler in hp-mode does not implement multilevel DoFs."));
3824 this->dof_handler->mg_vertex_dofs[this->vertex_index(vertex)].access_index(
3825 level, i, this->dof_handler->get_fe().n_dofs_per_vertex()) = index;
3830template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
3835 Assert(fe_index_is_active(fe_index) ==
true,
3836 ExcMessage(
"This function can only be called for active FE indices"));
3838 return this->dof_handler->get_fe(fe_index);
3843template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
3844inline typename ::internal::DoFHandlerImplementation::
3845 Iterators<dim, spacedim, level_dof_access>::line_iterator
3847 const unsigned int i)
const
3855 ExcMessage(
"You can only ask for line zero if the "
3856 "current object is a line itself."));
3857 return typename ::internal::DoFHandlerImplementation::
3858 Iterators<dim, spacedim, level_dof_access>::cell_iterator(
3859 &this->get_triangulation(),
3862 &this->get_dof_handler());
3870 return typename ::internal::DoFHandlerImplementation::
3871 Iterators<dim, spacedim, level_dof_access>::line_iterator(
3874 this->line_index(i),
3879template <
int structdim,
int dim,
int spacedim,
bool level_dof_access>
3880inline typename ::internal::DoFHandlerImplementation::
3881 Iterators<dim, spacedim, level_dof_access>::quad_iterator
3883 const unsigned int i)
const
3893 ExcMessage(
"You can only ask for quad zero if the "
3894 "current object is a quad itself."));
3895 return typename ::internal::DoFHandlerImplementation::
3896 Iterators<dim, spacedim>::cell_iterator(&this->get_triangulation(),
3899 &this->get_dof_handler());
3907 return typename ::internal::DoFHandlerImplementation::
3908 Iterators<dim, spacedim, level_dof_access>::quad_iterator(
3911 this->quad_index(i),
3919template <
int spacedim,
bool level_dof_access>
3922 Assert(
false, ExcInvalidObject());
3927template <
int spacedim,
bool level_dof_access>
3931 const unsigned int vertex_index,
3933 :
BaseClass(tria, vertex_kind, vertex_index)
3934 , dof_handler(const_cast<
DoFHandler<1, spacedim> *>(dof_handler))
3939template <
int spacedim,
bool level_dof_access>
3961 Assert((tria ==
nullptr) && (
level == -2) && (index == -2) &&
3964 "This constructor can not be called for face iterators in 1d, "
3965 "except to default-construct iterator objects."));
3970template <
int spacedim,
bool level_dof_access>
3971template <
int structdim2,
int dim2,
int spacedim2>
3975 Assert(
false, ExcInvalidObject());
3980template <
int spacedim,
bool level_dof_access>
3981template <
int structdim2,
int dim2,
int spacedim2,
bool level_dof_access2>
3985 Assert(
false, ExcInvalidObject());
3990template <
int spacedim,
bool level_dof_access>
3995 Assert(dh !=
nullptr, ExcInvalidObject());
3996 this->dof_handler = dh;
4001template <
int spacedim,
bool level_dof_access>
4004 const unsigned int ,
4013template <
int spacedim,
bool level_dof_access>
4017 return *this->dof_handler;
4022template <
int spacedim,
bool level_dof_access>
4025 std::vector<types::global_dof_index> &dof_indices,
4028 const auto fe_index =
4032 for (
unsigned int i = 0; i < dof_indices.size(); ++i)
4033 dof_indices[i] = ::internal::DoFAccessorImplementation::
4034 Implementation::get_dof_index(*dof_handler,
4036 this->global_vertex_index,
4039 std::integral_constant<int, 0>());
4044template <
int spacedim,
bool level_dof_access>
4048 std::vector<types::global_dof_index> &dof_indices,
4051 const auto fe_index =
4057 for (
unsigned int i = 0; i < dof_indices.size(); ++i)
4060 mg_vertex_dof_index(*dof_handler,
level, this->global_vertex_index, i);
4065template <
int spacedim,
bool level_dof_access>
4068 const unsigned int vertex,
4069 const unsigned int i,
4072 const auto fe_index =
4078 return ::internal::DoFAccessorImplementation::Implementation::
4079 get_dof_index(*dof_handler,
4081 this->global_vertex_index,
4084 std::integral_constant<int, 0>());
4089template <
int spacedim,
bool level_dof_access>
4092 const unsigned int i,
4095 const auto fe_index =
4099 return ::internal::DoFAccessorImplementation::Implementation::
4100 get_dof_index(*this->dof_handler,
4102 this->vertex_index(0),
4105 std::integral_constant<int, 0>());
4110template <
int spacedim,
bool level_dof_access>
4119template <
int spacedim,
bool level_dof_access>
4122 const unsigned int )
const
4129template <
int spacedim,
bool level_dof_access>
4140template <
int spacedim,
bool level_dof_access>
4145 Assert(this->dof_handler !=
nullptr, ExcInvalidObject());
4146 return dof_handler->get_fe(fe_index);
4151template <
int spacedim,
bool level_dof_access>
4156 Assert(this->dof_handler !=
nullptr, ExcInvalidObject());
4157 BaseClass::copy_from(da);
4162template <
int spacedim,
bool level_dof_access>
4163template <
bool level_dof_access2>
4168 BaseClass::copy_from(a);
4174template <
int spacedim,
bool level_dof_access>
4177 const unsigned int )
const
4184template <
int spacedim,
bool level_dof_access>
4185inline typename ::internal::DoFHandlerImplementation::
4186 Iterators<1, spacedim, level_dof_access>::line_iterator
4188 const unsigned int )
const
4191 return typename ::internal::DoFHandlerImplementation::
4192 Iterators<1, spacedim, level_dof_access>::line_iterator();
4197template <
int spacedim,
bool level_dof_access>
4198inline typename ::internal::DoFHandlerImplementation::
4199 Iterators<1, spacedim, level_dof_access>::quad_iterator
4201 const unsigned int )
const
4204 return typename ::internal::DoFHandlerImplementation::
4205 Iterators<1, spacedim, level_dof_access>::quad_iterator();
4210template <
int spacedim,
bool level_dof_access>
4211template <
int structdim2,
int dim2,
int spacedim2,
bool level_dof_access2>
4216 Assert(structdim2 == 0, ExcCantCompareIterators());
4218 return (BaseClass::operator==(a));
4223template <
int spacedim,
bool level_dof_access>
4224template <
int structdim2,
int dim2,
int spacedim2,
bool level_dof_access2>
4229 Assert(structdim2 == 0, ExcCantCompareIterators());
4231 return (BaseClass::operator!=(a));
4241 namespace DoFCellAccessorImplementation
4253 template <
int dim,
int spacedim,
bool level_dof_access>
4262 (
typename std::decay_t<
decltype(accessor)>::ExcInvalidObject()));
4263 Assert(
static_cast<unsigned int>(accessor.level()) <
4277 template <
int dim,
int spacedim,
bool level_dof_access>
4290 (
typename std::decay_t<
decltype(accessor)>::ExcInvalidObject()));
4291 Assert(
static_cast<unsigned int>(accessor.level()) <
4295 ExcMessage(
"Invalid finite element index."));
4299 [accessor.present_index] = i;
4308 template <
int dim,
int spacedim,
bool level_dof_access>
4317 (
typename std::decay_t<
decltype(accessor)>::ExcInvalidObject()));
4318 Assert(
static_cast<unsigned int>(accessor.level()) <
4325 [accessor.present_index];
4329 [accessor.present_index];
4337 template <
int dim,
int spacedim,
bool level_dof_access>
4350 (
typename std::decay_t<
decltype(accessor)>::ExcInvalidObject()));
4351 Assert(
static_cast<unsigned int>(accessor.level()) <
4355 ExcMessage(
"Invalid finite element index."));
4359 [accessor.present_index] = i;
4368 template <
int dim,
int spacedim,
bool level_dof_access>
4377 (
typename std::decay_t<
decltype(accessor)>::ExcInvalidObject()));
4378 Assert(
static_cast<unsigned int>(accessor.level()) <
4384 [accessor.present_index] !=
4394 template <
int dim,
int spacedim,
bool level_dof_access>
4403 (
typename std::decay_t<
decltype(accessor)>::ExcInvalidObject()));
4404 Assert(
static_cast<unsigned int>(accessor.level()) <
4410 [accessor.present_index] =
4419template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4425 :
DoFAccessor<dimension_, dimension_, space_dimension_, level_dof_access>(
4434template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4435template <
int structdim2,
int dim2,
int spacedim2>
4439 Assert(
false,
typename BaseClass::ExcInvalidObject());
4444template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4445template <
int structdim2,
int dim2,
int spacedim2,
bool level_dof_access2>
4454template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4458 const unsigned int i)
const
4462 this->neighbor_level(i),
4463 this->neighbor_index(i),
4476template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4480 const unsigned int i)
const
4483 q(this->tria, this->
level() + 1, this->child_index(i), this->dof_handler);
4495template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4496inline boost::container::small_vector<
4502 boost::container::small_vector<
4506 child_iterators(this->n_children());
4508 for (
unsigned int i = 0; i < this->n_children(); ++i)
4509 child_iterators[i] = this->child(i);
4511 return child_iterators;
4516template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4522 q(this->tria, this->
level() - 1, this->parent_index(), this->dof_handler);
4531 namespace DoFCellAccessorImplementation
4533 template <
int dim,
int spacedim,
bool level_dof_access>
4537 const ::DoFCellAccessor<dim, spacedim, level_dof_access> &cell,
4538 const unsigned int i,
4539 const std::integral_constant<int, 1>)
4542 &cell.get_triangulation(),
4543 ((i == 0) && cell.at_boundary(0) ?
4545 ((i == 1) && cell.at_boundary(1) ?
4548 cell.vertex_index(i),
4549 &cell.get_dof_handler());
4550 return ::TriaIterator<
4555 template <
int dim,
int spacedim,
bool level_dof_access>
4559 const ::DoFCellAccessor<dim, spacedim, level_dof_access> &cell,
4560 const unsigned int i,
4561 const std::integral_constant<int, 2>)
4563 return cell.
line(i);
4567 template <
int dim,
int spacedim,
bool level_dof_access>
4571 const ::DoFCellAccessor<dim, spacedim, level_dof_access> &cell,
4572 const unsigned int i,
4573 const std::integral_constant<int, 3>)
4575 return cell.
quad(i);
4582template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4585 level_dof_access>::face_iterator
4587 const unsigned int i)
const
4591 return ::internal::DoFCellAccessorImplementation::get_face(
4592 *
this, i, std::integral_constant<int, dimension_>());
4597template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4598inline boost::container::small_vector<
4605 boost::container::small_vector<
4609 face_iterators(this->n_faces());
4611 for (
const unsigned int i : this->face_indices())
4614 *
this, i, std::integral_constant<int, dimension_>());
4616 return face_iterators;
4621template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4625 std::vector<types::global_dof_index> &dof_indices)
const
4627 if (level_dof_access)
4628 get_mg_dof_indices(dof_indices);
4630 get_dof_indices(dof_indices);
4635template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4636template <
class InputVector,
typename number>
4639 const InputVector &values,
4642 get_dof_values(values, local_values.
begin(), local_values.
end());
4647template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4648template <
typename Number,
typename ForwardIterator>
4652 ForwardIterator local_values_begin,
4653 ForwardIterator local_values_end)
const
4655 (void)local_values_end;
4656 Assert(this->is_artificial() ==
false,
4657 ExcMessage(
"Can't ask for DoF indices on artificial cells."));
4659 Assert(this->dof_handler !=
nullptr,
typename BaseClass::ExcInvalidObject());
4661 Assert(
static_cast<unsigned int>(local_values_end - local_values_begin) ==
4662 this->get_fe().n_dofs_per_cell(),
4664 Assert(values.size() == this->get_dof_handler().n_dofs(),
4668 dof_indices(this->get_fe().n_dofs_per_cell());
4670 *
this, dof_indices, this->active_fe_index());
4672 boost::container::small_vector<Number, 100> values_temp(local_values_end -
4673 local_values_begin);
4678 using view_type = std::remove_reference_t<
decltype(*local_values_begin)>;
4680 local_values_end - local_values_begin);
4681 std::copy(values_temp.begin(), values_temp.end(), values_view2.
begin());
4686template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4687template <
class InputVector,
typename ForwardIterator>
4691 const InputVector &values,
4692 ForwardIterator local_values_begin,
4693 ForwardIterator local_values_end)
const
4695 Assert(this->is_artificial() ==
false,
4696 ExcMessage(
"Can't ask for DoF indices on artificial cells."));
4699 Assert(
static_cast<unsigned int>(local_values_end - local_values_begin) ==
4700 this->get_fe().n_dofs_per_cell(),
4702 Assert(values.size() == this->get_dof_handler().n_dofs(),
4707 dof_indices(this->get_fe().n_dofs_per_cell());
4709 *
this, dof_indices, this->active_fe_index());
4719template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4720template <
class OutputVector,
typename number>
4724 OutputVector &values)
const
4726 Assert(this->is_artificial() ==
false,
4727 ExcMessage(
"Can't ask for DoF indices on artificial cells."));
4730 Assert(
static_cast<unsigned int>(local_values.
size()) ==
4731 this->get_fe().n_dofs_per_cell(),
4733 Assert(values.size() == this->get_dof_handler().n_dofs(),
4737 Assert(this->dof_handler !=
nullptr,
typename BaseClass::ExcInvalidObject());
4739 dof_indices(this->get_fe().n_dofs_per_cell());
4741 *
this, dof_indices, this->active_fe_index());
4743 for (
unsigned int i = 0; i < this->get_fe().n_dofs_per_cell(); ++i)
4751template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4755 Assert(this->dof_handler !=
nullptr,
typename BaseClass::ExcInvalidObject());
4756 Assert((this->dof_handler->hp_capability_enabled ==
false) ||
4759 "For DoFHandler objects in hp-mode, finite elements are only "
4760 "associated with active cells. Consequently, you can not ask "
4761 "for the active finite element on cells with children."));
4763 const auto &fe = this->dof_handler->get_fe(active_fe_index());
4765 Assert(this->reference_cell() == fe.reference_cell(),
4767 "The reference-cell type used on this cell (" +
4768 this->reference_cell().to_string() +
4769 ") does not match the reference-cell type of the finite element "
4770 "associated with this cell (" +
4771 fe.reference_cell().to_string() +
4773 "Did you accidentally use simplex elements on hypercube meshes "
4774 "(or the other way around), or are you using a mixed mesh and "
4775 "assigned a simplex element to a hypercube cell (or the other "
4776 "way around) via the active_fe_index?"));
4783template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4788 Assert((this->dof_handler->hp_capability_enabled ==
false) ||
4791 "You can not ask for the active FE index on a cell that has "
4792 "children because no degrees of freedom are assigned "
4793 "to this cell and, consequently, no finite element "
4794 "is associated with it."));
4795 Assert((this->dof_handler->hp_capability_enabled ==
false) ||
4796 (this->is_locally_owned() || this->is_ghost()),
4797 ExcMessage(
"You can only query active FE index information on cells "
4798 "that are either locally owned or (after distributing "
4799 "degrees of freedom) are ghost cells."));
4801 return ::internal::DoFCellAccessorImplementation::Implementation::
4802 active_fe_index(*
this);
4807template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4812 Assert((this->dof_handler->hp_capability_enabled ==
false) ||
4814 ExcMessage(
"You can not set the active FE index on a cell that has "
4815 "children because no degrees of freedom will be assigned "
4818 Assert((this->dof_handler->hp_capability_enabled ==
false) ||
4819 this->is_locally_owned(),
4820 ExcMessage(
"You can only set active FE index information on cells "
4821 "that are locally owned. On ghost cells, this information "
4822 "will automatically be propagated from the owning process "
4823 "of that cell, and there is no information at all on "
4824 "artificial cells."));
4832template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4837 Assert(this->dof_handler !=
nullptr,
typename BaseClass::ExcInvalidObject());
4838 Assert((this->dof_handler->hp_capability_enabled ==
false) ||
4841 "For DoFHandler objects in hp-mode, finite elements are only "
4842 "associated with active cells. Consequently, you can not ask "
4843 "for the future finite element on cells with children."));
4845 return this->dof_handler->get_fe(future_fe_index());
4850template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4855 Assert((this->dof_handler->hp_capability_enabled ==
false) ||
4856 (this->has_children() ==
false),
4858 "You can not ask for the future FE index on a cell that has "
4859 "children because no degrees of freedom are assigned "
4860 "to this cell and, consequently, no finite element "
4861 "is associated with it."));
4862 Assert((this->dof_handler->hp_capability_enabled ==
false) ||
4863 (this->is_locally_owned()),
4864 ExcMessage(
"You can only query future FE index information on cells "
4865 "that are locally owned."));
4867 return ::internal::DoFCellAccessorImplementation::Implementation::
4868 future_fe_index(*
this);
4873template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4878 Assert((this->dof_handler->hp_capability_enabled ==
false) ||
4879 (this->has_children() ==
false),
4880 ExcMessage(
"You can not set the future FE index on a cell that has "
4881 "children because no degrees of freedom will be assigned "
4884 Assert((this->dof_handler->hp_capability_enabled ==
false) ||
4885 this->is_locally_owned(),
4886 ExcMessage(
"You can only set future FE index information on cells "
4887 "that are locally owned."));
4895template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4900 Assert((this->dof_handler->hp_capability_enabled ==
false) ||
4901 (this->has_children() ==
false),
4903 "You can not ask for the future FE index on a cell that has "
4904 "children because no degrees of freedom are assigned "
4905 "to this cell and, consequently, no finite element "
4906 "is associated with it."));
4907 Assert((this->dof_handler->hp_capability_enabled ==
false) ||
4908 (this->is_locally_owned()),
4909 ExcMessage(
"You can only query future FE index information on cells "
4910 "that are locally owned."));
4912 return ::internal::DoFCellAccessorImplementation::Implementation::
4913 future_fe_index_set(*
this);
4918template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4923 Assert((this->dof_handler->hp_capability_enabled ==
false) ||
4924 (this->has_children() ==
false),
4926 "You can not ask for the future FE index on a cell that has "
4927 "children because no degrees of freedom are assigned "
4928 "to this cell and, consequently, no finite element "
4929 "is associated with it."));
4930 Assert((this->dof_handler->hp_capability_enabled ==
false) ||
4931 (this->is_locally_owned()),
4932 ExcMessage(
"You can only query future FE index information on cells "
4933 "that are locally owned."));
4941template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4942template <
typename number,
typename OutputVector>
4946 OutputVector &global_destination)
const
4948 this->distribute_local_to_global(local_source.
begin(),
4950 global_destination);
4955template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4956template <
typename ForwardIterator,
typename OutputVector>
4960 ForwardIterator local_source_end,
4961 OutputVector &global_destination)
const
4963 Assert(this->dof_handler !=
nullptr,
4964 (
typename std::decay_t<
decltype(*
this)>::ExcInvalidObject()));
4965 Assert(
static_cast<unsigned int>(local_source_end - local_source_begin) ==
4966 this->get_fe().n_dofs_per_cell(),
4967 (
typename std::decay_t<
decltype(*
this)>::ExcVectorDoesNotMatch()));
4968 Assert(this->dof_handler->n_dofs() == global_destination.size(),
4969 (
typename std::decay_t<
decltype(*
this)>::ExcVectorDoesNotMatch()));
4974 internal::ArrayViewHelper::is_contiguous(local_source_begin,
4977 "This function can not be called with iterator types that do not point to contiguous memory."));
4979 const unsigned int n_dofs = local_source_end - local_source_begin;
4982 dof_indices(n_dofs);
4984 *
this, dof_indices, this->active_fe_index());
4987 global_destination.add(n_dofs, dof_indices.data(), &(*local_source_begin));
4992template <
int dimension_,
int space_dimension_,
bool level_dof_access>
4993template <
typename ForwardIterator,
typename OutputVector>
4998 ForwardIterator local_source_begin,
4999 ForwardIterator local_source_end,
5000 OutputVector &global_destination)
const
5002 Assert(this->dof_handler !=
nullptr,
5003 (
typename std::decay_t<
decltype(*
this)>::ExcInvalidObject()));
5004 Assert(local_source_end - local_source_begin ==
5005 this->get_fe().n_dofs_per_cell(),
5006 (
typename std::decay_t<
decltype(*
this)>::ExcVectorDoesNotMatch()));
5007 Assert(this->dof_handler->n_dofs() == global_destination.size(),
5008 (
typename std::decay_t<
decltype(*
this)>::ExcVectorDoesNotMatch()));
5013 dof_indices(this->get_fe().n_dofs_per_cell());
5015 *
this, dof_indices, this->active_fe_index());
5021 global_destination);
5026template <
int dimension_,
int space_dimension_,
bool level_dof_access>
5027template <
typename number,
typename OutputMatrix>
5031 OutputMatrix &global_destination)
const
5033 Assert(this->dof_handler !=
nullptr,
5034 (
typename std::decay_t<
decltype(*
this)>::ExcInvalidObject()));
5035 Assert(local_source.
m() == this->get_fe().n_dofs_per_cell(),
5036 (
typename std::decay_t<
decltype(*
this)>::ExcMatrixDoesNotMatch()));
5037 Assert(local_source.
n() == this->get_fe().n_dofs_per_cell(),
5038 (
typename std::decay_t<
decltype(*
this)>::ExcMatrixDoesNotMatch()));
5039 Assert(this->dof_handler->n_dofs() == global_destination.m(),
5040 (
typename std::decay_t<
decltype(*
this)>::ExcMatrixDoesNotMatch()));
5041 Assert(this->dof_handler->n_dofs() == global_destination.n(),
5042 (
typename std::decay_t<
decltype(*
this)>::ExcMatrixDoesNotMatch()));
5046 const unsigned int n_dofs = local_source.
m();
5049 dof_indices(n_dofs);
5051 *
this, dof_indices, this->active_fe_index());
5054 for (
unsigned int i = 0; i < n_dofs; ++i)
5055 global_destination.add(dof_indices[i],
5058 &local_source(i, 0));
5063template <
int dimension_,
int space_dimension_,
bool level_dof_access>
5064template <
typename number,
typename OutputMatrix,
typename OutputVector>
5069 OutputMatrix &global_matrix,
5070 OutputVector &global_vector)
const
5072 Assert(this->dof_handler !=
nullptr,
5073 (
typename std::decay_t<
decltype(*
this)>::ExcInvalidObject()));
5074 Assert(local_matrix.
m() == this->get_fe().n_dofs_per_cell(),
5075 (
typename std::decay_t<
decltype(*
this)>::ExcMatrixDoesNotMatch()));
5076 Assert(local_matrix.
n() == this->get_fe().n_dofs_per_cell(),
5077 (
typename std::decay_t<
decltype(*
this)>::ExcVectorDoesNotMatch()));
5078 Assert(this->dof_handler->n_dofs() == global_matrix.m(),
5079 (
typename std::decay_t<
decltype(*
this)>::ExcMatrixDoesNotMatch()));
5080 Assert(this->dof_handler->n_dofs() == global_matrix.n(),
5081 (
typename std::decay_t<
decltype(*
this)>::ExcMatrixDoesNotMatch()));
5082 Assert(local_vector.
size() == this->get_fe().n_dofs_per_cell(),
5083 (
typename std::decay_t<
decltype(*
this)>::ExcVectorDoesNotMatch()));
5084 Assert(this->dof_handler->n_dofs() == global_vector.size(),
5085 (
typename std::decay_t<
decltype(*
this)>::ExcVectorDoesNotMatch()));
5089 const unsigned int n_dofs = this->get_fe().n_dofs_per_cell();
5091 dof_indices(n_dofs);
5093 *
this, dof_indices, this->active_fe_index());
5096 for (
unsigned int i = 0; i < n_dofs; ++i)
5098 global_matrix.add(dof_indices[i],
5101 &local_matrix(i, 0));
5102 global_vector(dof_indices[i]) += local_vector(i);
ArrayView< std::remove_reference_t< typename std::iterator_traits< Iterator >::reference >, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
void get_dof_values(const VectorType &global_vector, ForwardIteratorInd local_indices_begin, ForwardIteratorVec local_vector_begin, ForwardIteratorVec local_vector_end) const
void distribute_local_to_global(const InVector &local_vector, const std::vector< size_type > &local_dof_indices, OutVector &global_vector) const
DoFAccessor< 0, 1, spacedim, level_dof_access > & operator=(const DoFAccessor< 0, 1, spacedim, level_dof_access > &da)=delete
DoFAccessor< 0, 1, spacedim, level_dof_access > & operator=(DoFAccessor< 0, 1, spacedim, level_dof_access > &&) noexcept=default
DoFAccessor(DoFAccessor< 0, 1, spacedim, level_dof_access > &&)=default
DoFAccessor(const DoFAccessor< 0, 1, spacedim, level_dof_access > &)=default
typename::internal::DoFHandlerImplementation::Iterators< dim, spacedim, level_dof_access >::line_iterator line(const unsigned int i) const
friend struct ::internal::DoFHandlerImplementation::Policy::Implementation
static constexpr unsigned int space_dimension
const DoFHandler< dim, spacedim > & get_dof_handler() const
void set_mg_dof_index(const int level, const unsigned int i, const types::global_dof_index index) const
DoFAccessor< structdim, dim, spacedim, level_dof_access > & operator=(const DoFAccessor< structdim, dim, spacedim, level_dof_access > &da)=delete
types::fe_index nth_active_fe_index(const unsigned int n) const
DoFAccessor(DoFAccessor< structdim, dim, spacedim, level_dof_access > &&)
DoFAccessor(const DoFAccessor< structdim, dim, spacedim, level_dof_access2 > &)
TriaIterator< DoFAccessor< structdim, dim, spacedim, level_dof_access > > child(const unsigned int c) const
void set_mg_vertex_dof_index(const int level, const unsigned int vertex, const unsigned int i, const types::global_dof_index index, const types::fe_index fe_index=numbers::invalid_fe_index) const
static constexpr unsigned int dimension
void set_dof_handler(DoFHandler< dim, spacedim > *dh)
DoFAccessor(const DoFAccessor< structdim2, dim2, spacedim2, level_dof_access2 > &)
DoFAccessor< structdim, dim, spacedim, level_dof_access > & operator=(DoFAccessor< structdim, dim, spacedim, level_dof_access > &&)
std::set< types::fe_index > get_active_fe_indices() const
DoFAccessor(const DoFAccessor< structdim, dim, spacedim, level_dof_access > &)=default
void set_mg_dof_indices(const int level, const std::vector< types::global_dof_index > &dof_indices, const types::fe_index fe_index=numbers::invalid_fe_index)
void get_mg_dof_indices(const int level, std::vector< types::global_dof_index > &dof_indices, const types::fe_index fe_index=numbers::invalid_fe_index) const
types::global_dof_index mg_vertex_dof_index(const int level, const unsigned int vertex, const unsigned int i, const types::fe_index fe_index=numbers::invalid_fe_index) const
DoFAccessor(const Triangulation< dim, spacedim > *tria, const int level, const int index, const DoFHandler< dim, spacedim > *dof_handler)
bool operator!=(const DoFAccessor< structdim2, dim2, spacedim2, level_dof_access2 > &) const
void copy_from(const TriaAccessorBase< structdim, dim, spacedim > &da)
types::global_dof_index dof_index(const unsigned int i, const types::fe_index fe_index=numbers::invalid_fe_index) const
typename::internal::DoFHandlerImplementation::Iterators< dim, spacedim, level_dof_access >::quad_iterator quad(const unsigned int i) const
void copy_from(const DoFAccessor< structdim, dim, spacedim, level_dof_access2 > &a)
const FiniteElement< dim, spacedim > & get_fe(const types::fe_index fe_index) const
void get_dof_indices(std::vector< types::global_dof_index > &dof_indices, const types::fe_index fe_index=numbers::invalid_fe_index) const
bool operator==(const DoFAccessor< structdim2, dim2, spacedim2, level_dof_access2 > &) const
types::global_dof_index mg_dof_index(const int level, const unsigned int i) const
void set_dof_index(const unsigned int i, const types::global_dof_index index, const types::fe_index fe_index=numbers::invalid_fe_index) const
unsigned int n_active_fe_indices() const
static bool is_level_cell()
typename ::internal::DoFAccessorImplementation::Inheritance< structdim, dimension, space_dimension >::BaseClass BaseClass
types::global_dof_index vertex_dof_index(const unsigned int vertex, const unsigned int i, const types::fe_index fe_index=numbers::invalid_fe_index) const
DoFHandler< dim, spacedim > * dof_handler
DoFAccessor(const InvalidAccessor< structdim2, dim2, spacedim2 > &)
bool fe_index_is_active(const types::fe_index fe_index) const
boost::container::small_vector< TriaIterator< DoFCellAccessor< dimension_, space_dimension_, level_dof_access > >, GeometryInfo< dimension_ >::max_children_per_cell > child_iterators() const
DoFCellAccessor(DoFCellAccessor< dimension_, space_dimension_, level_dof_access > &&)=default
void get_active_or_mg_dof_indices(std::vector< types::global_dof_index > &dof_indices) const
void get_dof_values(const InputVector &values, Vector< number > &local_values) const
boost::container::small_vector< face_iterator, GeometryInfo< dimension_ >::faces_per_cell > face_iterators() const
types::fe_index future_fe_index() const
DoFCellAccessor< dimension_, space_dimension_, level_dof_access > & operator=(const DoFCellAccessor< dimension_, space_dimension_, level_dof_access > &da)=delete
const FiniteElement< dimension_, space_dimension_ > & get_fe() const
TriaIterator< DoFCellAccessor< dimension_, space_dimension_, level_dof_access > > child(const unsigned int i) const
DoFCellAccessor(const Triangulation< dimension_, space_dimension_ > *tria, const int level, const int index, const AccessorData *local_data)
void set_future_fe_index(const types::fe_index i) const
void distribute_local_to_global(const Vector< number > &local_source, OutputVector &global_destination) const
const FiniteElement< dimension_, space_dimension_ > & get_future_fe() const
TriaIterator< DoFCellAccessor< dimension_, space_dimension_, level_dof_access > > neighbor(const unsigned int i) const
void set_active_fe_index(const types::fe_index i) const
face_iterator face(const unsigned int i) const
void clear_future_fe_index() const
void set_dof_values(const Vector< number > &local_values, OutputVector &values) const
DoFCellAccessor(const DoFCellAccessor< dimension_, space_dimension_, level_dof_access > &)=default
~DoFCellAccessor()=default
bool future_fe_index_set() const
DoFCellAccessor< dimension_, space_dimension_, level_dof_access > & operator=(DoFCellAccessor< dimension_, space_dimension_, level_dof_access > &&)=default
types::fe_index active_fe_index() const
TriaIterator< DoFCellAccessor< dimension_, space_dimension_, level_dof_access > > parent() const
std::vector< std::unique_ptr<::internal::DoFHandlerImplementation::DoFLevel< dim > > > mg_levels
std::vector< std::vector< types::fe_index > > hp_cell_future_fe_indices
const FiniteElement< dim, spacedim > & get_fe(const types::fe_index index=0) const
std::vector< std::vector< types::fe_index > > hp_cell_active_fe_indices
std::vector< MGVertexDoFs > mg_vertex_dofs
std::vector< std::array< std::vector< types::global_dof_index >, dim+1 > > object_dof_indices
const Triangulation< dim, spacedim > & get_triangulation() const
std::vector< std::array< std::vector< offset_type >, dim+1 > > object_dof_ptr
std::unique_ptr<::internal::DoFHandlerImplementation::DoFFaces< dim > > mg_faces
bool hp_capability_enabled
bool has_hp_capabilities() const
std::array< std::vector< offset_type >, dim+1 > hp_object_fe_ptr
std::array< std::vector< types::fe_index >, dim+1 > hp_object_fe_indices
DoFInvalidAccessor(const void *parent=nullptr, const int level=-1, const int index=-1, const AccessorData *local_data=nullptr)
typename InvalidAccessor< structdim, dim, spacedim >::AccessorData AccessorData
unsigned int n_dofs_per_vertex() const
void add_indices(const ForwardIterator &begin, const ForwardIterator &end)
void import_elements(const ::Vector< Number > &vec, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
TriaIterator< TriaAccessor< structdim, dim, spacedim > > child(const unsigned int i) const
IteratorState::IteratorStates state() const
virtual size_type size() const override
#define DEAL_II_ALWAYS_INLINE
#define DEAL_II_NAMESPACE_OPEN
constexpr bool running_in_debug_mode()
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ASSERT_UNREACHABLE()
#define DEAL_II_NOT_IMPLEMENTED()
static ::ExceptionBase & ExcVectorNotEmpty()
#define DeclException0(Exception0)
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
static ::ExceptionBase & ExcImpossibleInDim(int arg1)
static ::ExceptionBase & ExcNotActive()
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcMatrixDoesNotMatch()
#define AssertIndexRange(index, range)
#define DeclExceptionMsg(Exception, defaulttext)
static ::ExceptionBase & ExcInvalidObject()
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcCantCompareIterators()
static ::ExceptionBase & ExcVectorDoesNotMatch()
static ::ExceptionBase & ExcMessage(std::string arg1)
@ past_the_end
Iterator reached end of container.
types::fe_index get_fe_index_or_default(const DoFAccessor< structdim, dim, spacedim, level_dof_access > &cell, const types::fe_index fe_index)
void get_cell_dof_indices(const ::DoFCellAccessor< dim, spacedim, level_dof_access > &accessor, Implementation::dof_index_vector_type &dof_indices, const unsigned int fe_index)
TriaIterator< ::DoFAccessor< dim - 1, dim, spacedim, level_dof_access > > get_face(const ::DoFCellAccessor< dim, spacedim, level_dof_access > &cell, const unsigned int i, const std::integral_constant< int, 1 >)
constexpr types::global_dof_index invalid_dof_index
constexpr types::geometric_orientation reverse_line_orientation
constexpr types::geometric_orientation default_geometric_orientation
constexpr types::fe_index invalid_fe_index
::VectorizedArray< Number, width > min(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
unsigned short int fe_index
void process_vertex_dofs(DoFHandler< dim, spacedim > &dof_handler, const unsigned int vertex_index, const types::fe_index fe_index, types::global_dof_index *&dof_indices_ptr, const DoFProcessor &dof_processor) const
void process_dofs(const DoFHandler< dim, spacedim > &dof_handler, const unsigned int obj_level, const unsigned int obj_index, const types::fe_index fe_index, const DoFMapping &mapping, const std::integral_constant< int, structdim >, types::global_dof_index *&dof_indices_ptr, const DoFProcessor &dof_processor) const
void process_dofs(const DoFHandler< dim, spacedim > &dof_handler, const unsigned int, const unsigned int obj_index, const types::fe_index fe_index, const DoFMapping &mapping, const std::integral_constant< int, structdim >, types::global_dof_index *&dof_indices_ptr, const DoFProcessor &dof_processor) const
MGDoFIndexProcessor(const unsigned int level)
void process_vertex_dofs(DoFHandler< dim, spacedim > &dof_handler, const unsigned int vertex_index, const types::fe_index, types::global_dof_index *&dof_indices_ptr, const DoFProcessor &dof_processor) const
static types::global_dof_index * get_array_ptr(const std::tuple<> &)
static void process_dof_indices(const ::DoFAccessor< structdim, dim, spacedim, level_dof_access > &accessor, const DoFIndicesType &const_dof_indices, const types::fe_index fe_index_, const DoFOperation &dof_operation, const DoFProcessor &dof_processor, const bool count_level_dofs)
static void get_dof_indices(const ::DoFAccessor< structdim, dim, spacedim, level_dof_access > &accessor, std::vector< types::global_dof_index > &dof_indices, const types::fe_index fe_index)
static void extract_subvector_to(const LinearAlgebra::TpetraWrappers::Vector< Number, MemorySpace > &values, const types::global_dof_index *cache_begin, const types::global_dof_index *cache_end, ForwardIterator local_values_begin)
static std::set< types::fe_index > get_active_fe_indices(const DoFHandler< dim, spacedim > &dof_handler, const unsigned int obj_level, const unsigned int obj_index, const std::integral_constant< int, structdim > &t)
static types::global_dof_index * get_array_ptr(const ArrayType &array)
static unsigned int get_array_length(const std::tuple<> &)
static unsigned int n_active_fe_indices(const DoFHandler< dim, spacedim > &dof_handler, const unsigned int obj_level, const unsigned int obj_index, const std::integral_constant< int, structdim > &)
static void set_dof_index(const DoFHandler< dim, spacedim > &dof_handler, const unsigned int obj_level, const unsigned int obj_index, const types::fe_index fe_index, const unsigned int local_index, const std::integral_constant< int, structdim > &dd, const types::global_dof_index global_index)
static void extract_subvector_to(const LinearAlgebra::EpetraWrappers::Vector &values, const types::global_dof_index *cache_begin, const types::global_dof_index *cache_end, ForwardIterator local_values_begin)
static void get_mg_dof_indices(const ::DoFAccessor< structdim, dim, spacedim, level_dof_access > &accessor, const int level, std::vector< types::global_dof_index > &dof_indices, const types::fe_index fe_index)
static bool fe_index_is_active(const DoFHandler< dim, spacedim > &dof_handler, const unsigned int obj_level, const unsigned int obj_index, const types::fe_index fe_index, const std::integral_constant< int, structdim > &)
static types::global_dof_index & get_mg_dof_index(const DoFHandler< dim, spacedim > &dof_handler, const std::unique_ptr< internal::DoFHandlerImplementation::DoFLevel< dim > > &, const std::unique_ptr< internal::DoFHandlerImplementation::DoFFaces< dim > > &mg_faces, const unsigned int obj_index, const types::fe_index fe_index, const unsigned int local_index, const std::integral_constant< int, 1 >)
boost::container::small_vector<::types::global_dof_index, 100 > dof_index_vector_type
static types::global_dof_index & get_mg_dof_index(const DoFHandler< dim, spacedim > &dof_handler, const std::unique_ptr< internal::DoFHandlerImplementation::DoFLevel< dim > > &mg_level, const std::unique_ptr< internal::DoFHandlerImplementation::DoFFaces< dim > > &, const unsigned int obj_index, const types::fe_index fe_index, const unsigned int local_index, const std::integral_constant< int, dim >)
static std::pair< unsigned int, unsigned int > process_object_range(const ::DoFAccessor< structdim, dim, spacedim, level_dof_access > accessor, const types::fe_index fe_index)
static types::global_dof_index & mg_vertex_dof_index(DoFHandler< dim, spacedim > &dof_handler, const int level, const unsigned int vertex_index, const unsigned int i)
static void set_mg_dof_indices(const ::DoFAccessor< structdim, dim, spacedim, level_dof_access > &accessor, const int level, const std::vector< types::global_dof_index > &dof_indices, const types::fe_index fe_index)
static void set_dof_indices(const ::DoFAccessor< structdim, dim, spacedim, level_dof_access > &accessor, const std::vector< types::global_dof_index > &dof_indices, const types::fe_index fe_index)
static void process_dof_index(const DoFHandler< dim, spacedim > &dof_handler, const unsigned int obj_level, const unsigned int obj_index, const types::fe_index fe_index, const unsigned int local_index, const std::integral_constant< int, structdim > &, GlobalIndexType &global_index, const DoFPProcessor &process)
static types::global_dof_index & get_mg_dof_index(const DoFHandler< 3, spacedim > &dof_handler, const std::unique_ptr< internal::DoFHandlerImplementation::DoFLevel< 3 > > &, const std::unique_ptr< internal::DoFHandlerImplementation::DoFFaces< 3 > > &mg_faces, const unsigned int obj_index, const types::fe_index fe_index, const unsigned int local_index, const std::integral_constant< int, 2 >)
static std::pair< unsigned int, unsigned int > process_object_range(const DoFHandler< dim, spacedim > &dof_handler, const unsigned int obj_level, const unsigned int obj_index, const types::fe_index fe_index, const std::integral_constant< int, structdim > &)
static void extract_subvector_to(const InputVector &values, const types::global_dof_index *cache, const types::global_dof_index *cache_end, ForwardIterator local_values_begin)
static std::vector< unsigned int > sort_indices(const types::global_dof_index *v_begin, const types::global_dof_index *v_end)
static types::fe_index nth_active_fe_index(const DoFHandler< dim, spacedim > &dof_handler, const unsigned int obj_level, const unsigned int obj_index, const unsigned int local_index, const std::integral_constant< int, structdim > &)
static void process_object(const DoFHandler< dim, spacedim > &dof_handler, const unsigned int obj_level, const unsigned int obj_index, const types::fe_index fe_index, const DoFMapping &mapping, const std::integral_constant< int, structdim > &dd, types::global_dof_index *&dof_indices_ptr, const DoFProcessor &process)
static types::global_dof_index get_dof_index(const DoFHandler< dim, spacedim > &dof_handler, const unsigned int obj_level, const unsigned int obj_index, const types::fe_index fe_index, const unsigned int local_index, const std::integral_constant< int, structdim > &dd)
static unsigned int n_dof_indices(const ::DoFAccessor< structdim, dim, spacedim, level_dof_access > &accessor, const types::fe_index fe_index_, const bool count_level_dofs)
static std::pair< unsigned int, unsigned int > process_object_range(::DoFInvalidAccessor< structdim, dim, spacedim >, const unsigned int)
static unsigned int get_array_length(const ArrayType &array)
static types::fe_index future_fe_index(const DoFCellAccessor< dim, spacedim, level_dof_access > &accessor)
static void clear_future_fe_index(const DoFCellAccessor< dim, spacedim, level_dof_access > &accessor)
static bool future_fe_index_set(const DoFCellAccessor< dim, spacedim, level_dof_access > &accessor)
static void set_active_fe_index(const DoFCellAccessor< dim, spacedim, level_dof_access > &accessor, const types::fe_index i)
static void set_future_fe_index(const DoFCellAccessor< dim, spacedim, level_dof_access > &accessor, const types::fe_index i)
static types::fe_index active_fe_index(const DoFCellAccessor< dim, spacedim, level_dof_access > &accessor)