Reference documentation for deal.II version Git 7f58f27 2017-09-20 15:35:49 -0600
dof_handler.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 1998 - 2017 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE at
12 // the top level of the deal.II distribution.
13 //
14 // ---------------------------------------------------------------------
15 
16 #ifndef dealii_dof_handler_h
17 #define dealii_dof_handler_h
18 
19 
20 
21 #include <deal.II/base/config.h>
22 #include <deal.II/base/exceptions.h>
23 #include <deal.II/base/smartpointer.h>
24 #include <deal.II/base/index_set.h>
25 #include <deal.II/base/iterator_range.h>
26 #include <deal.II/dofs/block_info.h>
27 #include <deal.II/dofs/dof_iterator_selector.h>
28 #include <deal.II/dofs/number_cache.h>
29 #include <deal.II/dofs/dof_faces.h>
30 #include <deal.II/dofs/dof_levels.h>
31 #include <deal.II/dofs/function_map.h>
32 #include <deal.II/hp/fe_collection.h>
33 
34 #include <boost/serialization/split_member.hpp>
35 
36 #include <vector>
37 #include <map>
38 #include <set>
39 #include <memory>
40 
41 DEAL_II_NAMESPACE_OPEN
42 
43 template <int dim, int spacedim> class FiniteElement;
44 template <int dim, int spacedim> class Triangulation;
45 
46 namespace internal
47 {
48  namespace DoFHandler
49  {
50  struct Implementation;
51 
52  namespace Policy
53  {
54  template <int dim, int spacedim> class PolicyBase;
55  struct Implementation;
56  }
57  }
58 
59  namespace DoFAccessor
60  {
61  struct Implementation;
62  }
63 
64  namespace DoFCellAccessor
65  {
66  struct Implementation;
67  }
68 }
69 
70 
191 template <int dim, int spacedim=dim>
192 class DoFHandler : public Subscriptor
193 {
194  typedef ::internal::DoFHandler::Iterators<DoFHandler<dim,spacedim>, false> ActiveSelector;
195  typedef ::internal::DoFHandler::Iterators<DoFHandler<dim,spacedim>, true> LevelSelector;
196 public:
197  typedef typename ActiveSelector::CellAccessor cell_accessor;
198  typedef typename ActiveSelector::FaceAccessor face_accessor;
199 
200  typedef typename ActiveSelector::line_iterator line_iterator;
201  typedef typename ActiveSelector::active_line_iterator active_line_iterator;
202 
203  typedef typename ActiveSelector::quad_iterator quad_iterator;
204  typedef typename ActiveSelector::active_quad_iterator active_quad_iterator;
205 
206  typedef typename ActiveSelector::hex_iterator hex_iterator;
207  typedef typename ActiveSelector::active_hex_iterator active_hex_iterator;
208 
229  typedef typename ActiveSelector::active_cell_iterator active_cell_iterator;
230 
257  typedef typename ActiveSelector::cell_iterator cell_iterator;
258 
259  typedef typename ActiveSelector::face_iterator face_iterator;
260  typedef typename ActiveSelector::active_face_iterator active_face_iterator;
261 
262  typedef typename LevelSelector::CellAccessor level_cell_accessor;
263  typedef typename LevelSelector::FaceAccessor level_face_accessor;
264 
265  typedef typename LevelSelector::cell_iterator level_cell_iterator;
266  typedef typename LevelSelector::face_iterator level_face_iterator;
267 
268 
272  static const unsigned int dimension = dim;
273 
277  static const unsigned int space_dimension = spacedim;
278 
291 
301  static const unsigned int default_fe_index = 0;
302 
308  DoFHandler ();
309 
314 
321  DoFHandler (const DoFHandler &) = delete;
322 
326  virtual ~DoFHandler ();
327 
334  DoFHandler &operator = (const DoFHandler &) = delete;
335 
341  const FiniteElement<dim,spacedim> &fe);
342 
359  virtual void distribute_dofs (const FiniteElement<dim,spacedim> &fe);
360 
369  virtual void distribute_mg_dofs (const FiniteElement<dim, spacedim> &fe) DEAL_II_DEPRECATED;
370 
376  virtual void distribute_mg_dofs ();
377 
383  bool has_level_dofs() const;
384 
399  bool has_active_dofs() const;
400 
408 
412  virtual void clear ();
413 
443  void renumber_dofs (const std::vector<types::global_dof_index> &new_numbers);
444 
449  void renumber_dofs (const unsigned int level,
450  const std::vector<types::global_dof_index> &new_numbers);
451 
480  unsigned int max_couplings_between_dofs () const;
481 
494  unsigned int max_couplings_between_boundary_dofs () const;
495 
496  /*--------------------------------------*/
497 
502  /*
503  * @{
504  */
505 
509  cell_iterator begin (const unsigned int level = 0) const;
510 
523  active_cell_iterator begin_active(const unsigned int level = 0) const;
524 
529  cell_iterator end () const;
530 
535  cell_iterator end (const unsigned int level) const;
536 
542  active_cell_iterator end_active (const unsigned int level) const;
543 
544 
549  level_cell_iterator begin_mg (const unsigned int level = 0) const;
550 
555  level_cell_iterator end_mg (const unsigned int level) const;
556 
561  level_cell_iterator end_mg () const;
562 
578 
621 
634 
650  IteratorRange<cell_iterator> cell_iterators_on_level (const unsigned int level) const;
651 
668 
685  IteratorRange<level_cell_iterator> mg_cell_iterators_on_level (const unsigned int level) const;
686 
687  /*
688  * @}
689  */
690 
691 
692  /*---------------------------------------*/
693 
694 
719 
727  types::global_dof_index n_dofs (const unsigned int level) const;
728 
733 
746  template <typename number>
748  n_boundary_dofs (const std::map<types::boundary_id, const Function<spacedim,number>*> &boundary_ids) const;
749 
755  n_boundary_dofs (const std::set<types::boundary_id> &boundary_ids) const;
756 
772  const BlockInfo &block_info() const;
773 
774 
788  unsigned int n_locally_owned_dofs() const;
789 
795  const IndexSet &locally_owned_dofs() const;
796 
801  const IndexSet &locally_owned_mg_dofs(const unsigned int level) const;
802 
803 
812  const std::vector<IndexSet> &
814 
815  const std::vector<IndexSet> &
816  locally_owned_mg_dofs_per_processor (const unsigned int level) const;
817 
830  const std::vector<types::global_dof_index> &
832 
839  get_fe (const unsigned int index=0) const;
840 
848 
853 
862  virtual std::size_t memory_consumption () const;
863 
868  template <class Archive>
869  void save (Archive &ar, const unsigned int version) const;
870 
875  template <class Archive>
876  void load (Archive &ar, const unsigned int version);
877 
878  BOOST_SERIALIZATION_SPLIT_MEMBER()
879 
880 
902  types::global_dof_index,
903  << "The given list of new dof indices is not consecutive: "
904  << "the index " << arg1 << " does not exist.");
910  int,
911  << "The given level " << arg1
912  << " is not in the valid range!");
923  int,
924  << "You tried to do something on level " << arg1
925  << ", but this level is empty.");
926 
927 
928 private:
929 
934 
938  SmartPointer<const Triangulation<dim,spacedim>,DoFHandler<dim,spacedim> >
940 
941 
946  std::unique_ptr<const hp::FECollection<dim,spacedim> > fe_collection;
947 
952  std::unique_ptr<::internal::DoFHandler::Policy::PolicyBase<dim,spacedim> > policy;
953 
962 
966  std::vector<::internal::DoFHandler::NumberCache> mg_number_cache;
967 
975  {
976  public:
980  MGVertexDoFs ();
981 
987  void init (const unsigned int coarsest_level,
988  const unsigned int finest_level,
989  const unsigned int dofs_per_vertex);
990 
994  unsigned int get_coarsest_level () const;
995 
999  unsigned int get_finest_level () const;
1000 
1006  get_index (const unsigned int level,
1007  const unsigned int dof_number,
1008  const unsigned int dofs_per_vertex) const;
1009 
1014  void set_index (const unsigned int level,
1015  const unsigned int dof_number,
1016  const unsigned int dofs_per_vertex,
1017  const types::global_dof_index index);
1018 
1019  private:
1023  unsigned int coarsest_level;
1024 
1028  unsigned int finest_level;
1029 
1039  std::unique_ptr<types::global_dof_index[]> indices;
1040  };
1041 
1045  void clear_space ();
1046 
1050  void clear_mg_space ();
1051 
1052  template <int structdim>
1053  types::global_dof_index get_dof_index (const unsigned int obj_level,
1054  const unsigned int obj_index,
1055  const unsigned int fe_index,
1056  const unsigned int local_index) const;
1057 
1058  template <int structdim>
1059  void set_dof_index (const unsigned int obj_level,
1060  const unsigned int obj_index,
1061  const unsigned int fe_index,
1062  const unsigned int local_index,
1063  const types::global_dof_index global_index) const;
1064 
1068  std::vector<types::global_dof_index> vertex_dofs;
1069 
1074  std::vector<MGVertexDoFs> mg_vertex_dofs;
1075 
1080  std::vector<std::unique_ptr<::internal::DoFHandler::DoFLevel<dim> > > levels;
1081 
1082  std::vector<std::unique_ptr<::internal::DoFHandler::DoFLevel<dim> > > mg_levels;
1083 
1089  std::unique_ptr<::internal::DoFHandler::DoFFaces<dim> > faces;
1090 
1091  std::unique_ptr<::internal::DoFHandler::DoFFaces<dim> > mg_faces;
1092 
1096  template <int, class, bool> friend class DoFAccessor;
1097  template <class, bool> friend class DoFCellAccessor;
1098  friend struct ::internal::DoFAccessor::Implementation;
1099  friend struct ::internal::DoFCellAccessor::Implementation;
1100 
1101  friend struct ::internal::DoFHandler::Implementation;
1102  friend struct ::internal::DoFHandler::Policy::Implementation;
1103 
1104  // explicitly check for sensible template arguments, but not on windows
1105  // because MSVC creates bogus warnings during normal compilation
1106 #ifndef DEAL_II_MSVC
1107  static_assert (dim<=spacedim,
1108  "The dimension <dim> of a DoFHandler must be less than or "
1109  "equal to the space dimension <spacedim> in which it lives.");
1110 #endif
1111 };
1112 
1113 
1114 
1115 
1116 #ifndef DOXYGEN
1117 
1118 /* ----------------------- Inline functions ---------------------------------- */
1119 
1120 
1121 template <int dim, int spacedim>
1122 inline
1123 bool
1125 {
1126  return mg_number_cache.size()>0;
1127 }
1128 
1129 
1130 
1131 template <int dim, int spacedim>
1132 inline
1133 bool
1135 {
1136  return number_cache.n_global_dofs>0;
1137 }
1138 
1139 
1140 
1141 template <int dim, int spacedim>
1142 inline
1145 {
1146  return number_cache.n_global_dofs;
1147 }
1148 
1149 
1150 
1151 template <int dim, int spacedim>
1152 inline
1154 {
1155  Assert(has_level_dofs(), ExcMessage("n_dofs(level) can only be called after distribute_mg_dofs()"));
1156  Assert (level < mg_number_cache.size (), ExcInvalidLevel (level));
1157  return mg_number_cache[level].n_global_dofs;
1158 }
1159 
1160 
1161 
1162 template <int dim, int spacedim>
1163 unsigned int
1165 {
1166  return number_cache.n_locally_owned_dofs;
1167 }
1168 
1169 
1170 
1171 template <int dim, int spacedim>
1172 const IndexSet &
1174 {
1175  return number_cache.locally_owned_dofs;
1176 }
1177 
1178 
1179 
1180 template <int dim, int spacedim>
1181 const IndexSet &
1182 DoFHandler<dim, spacedim>::locally_owned_mg_dofs(const unsigned int level) const
1183 {
1184  Assert(level < this->get_triangulation().n_global_levels(),
1185  ExcMessage("invalid level in locally_owned_mg_dofs"));
1186  return mg_number_cache[level].locally_owned_dofs;
1187 }
1188 
1189 
1190 
1191 template <int dim, int spacedim>
1192 const std::vector<types::global_dof_index> &
1194 {
1195  return number_cache.n_locally_owned_dofs_per_processor;
1196 }
1197 
1198 
1199 
1200 template <int dim, int spacedim>
1201 const std::vector<IndexSet> &
1203 {
1204  return number_cache.locally_owned_dofs_per_processor;
1205 }
1206 
1207 
1208 
1209 template <int dim, int spacedim>
1210 const std::vector<IndexSet> &
1212 {
1213  Assert(level < this->get_triangulation().n_global_levels(), ExcMessage("invalid level in locally_owned_mg_dofs_per_processor"));
1214  return mg_number_cache[level].locally_owned_dofs_per_processor;
1215 }
1216 
1217 
1218 
1219 template <int dim, int spacedim>
1220 inline
1223 (const unsigned int index) const
1224 {
1225  (void) index;
1226  Assert(index == 0, ExcMessage("There is only one FiniteElement stored. The index must be zero!"));
1227  return get_fe_collection()[0];
1228 }
1229 
1230 
1231 
1232 template <int dim, int spacedim>
1233 inline
1236 {
1237  Assert(fe_collection != nullptr,
1238  ExcMessage("You are trying to access the DoFHandler's FECollection object before it has been initialized."));
1239  return *fe_collection;
1240 }
1241 
1242 
1243 
1244 template <int dim, int spacedim>
1245 inline
1248 {
1249  Assert(tria != nullptr,
1250  ExcMessage("This DoFHandler object has not been associated "
1251  "with a triangulation."));
1252  return *tria;
1253 }
1254 
1255 
1256 
1257 template <int dim, int spacedim>
1258 inline
1259 const BlockInfo &
1261 {
1262  return block_info_object;
1263 }
1264 
1265 
1266 
1267 template <int dim, int spacedim>
1268 template <typename number>
1271 {
1272  // extract the set of boundary ids and forget about the function object pointers
1273  std::set<types::boundary_id> boundary_ids_only;
1274  for (typename std::map<types::boundary_id, const Function<spacedim,number>*>::const_iterator
1275  p = boundary_ids.begin();
1276  p != boundary_ids.end(); ++p)
1277  boundary_ids_only.insert (p->first);
1278 
1279  // then just hand everything over to the other function that does the work
1280  return n_boundary_dofs(boundary_ids_only);
1281 }
1282 
1283 
1284 
1285 namespace internal
1286 {
1294  template <int dim, int spacedim>
1295  std::string policy_to_string(const ::internal::DoFHandler::Policy::PolicyBase<dim,spacedim> &policy);
1296 }
1297 
1298 
1299 
1300 template <int dim, int spacedim>
1301 template <class Archive>
1302 void DoFHandler<dim,spacedim>::save (Archive &ar,
1303  const unsigned int) const
1304 {
1305  ar &block_info_object;
1306  ar &vertex_dofs;
1307  ar &number_cache;
1308 
1309  // some versions of gcc have trouble with loading vectors of
1310  // std::unique_ptr objects because std::unique_ptr does not
1311  // have a copy constructor. do it one level at a time
1312  unsigned int n_levels = levels.size();
1313  ar &n_levels;
1314  for (unsigned int i = 0; i < levels.size(); ++i)
1315  ar &levels[i];
1316 
1317  // boost dereferences a nullptr when serializing a nullptr
1318  // at least up to 1.65.1. This causes problems with clang-5.
1319  // Therefore, work around it.
1320  bool faces_is_nullptr = (faces.get()==nullptr);
1321  ar &faces_is_nullptr;
1322  if (!faces_is_nullptr)
1323  ar &faces;
1324 
1325  // write out the number of triangulation cells and later check during
1326  // loading that this number is indeed correct; same with something that
1327  // identifies the FE and the policy
1328  unsigned int n_cells = tria->n_cells();
1329  std::string fe_name = this->get_fe(0).get_name();
1330  std::string policy_name = internal::policy_to_string(*policy);
1331 
1332  ar &n_cells &fe_name &policy_name;
1333 }
1334 
1335 
1336 
1337 template <int dim, int spacedim>
1338 template <class Archive>
1339 void DoFHandler<dim,spacedim>::load (Archive &ar,
1340  const unsigned int)
1341 {
1342  ar &block_info_object;
1343  ar &vertex_dofs;
1344  ar &number_cache;
1345 
1346  // boost::serialization can restore pointers just fine, but if the
1347  // pointer object still points to something useful, that object is not
1348  // destroyed and we end up with a memory leak. consequently, first delete
1349  // previous content before re-loading stuff
1350  levels.clear();
1351  faces.reset();
1352 
1353  // some versions of gcc have trouble with loading vectors of
1354  // std::unique_ptr objects because std::unique_ptr does not
1355  // have a copy constructor. do it one level at a time
1356  unsigned int size;
1357  ar &size;
1358  levels.resize(size);
1359  for (unsigned int i = 0; i < levels.size(); ++i)
1360  {
1361  std::unique_ptr<internal::DoFHandler::DoFLevel<dim>> level;
1362  ar &level;
1363  levels[i] = std::move(level);
1364  }
1365 
1366  //Workaround for nullptr, see in save().
1367  bool faces_is_nullptr = true;
1368  ar &faces_is_nullptr;
1369  if (!faces_is_nullptr)
1370  ar &faces;
1371 
1372  // these are the checks that correspond to the last block in the save()
1373  // function
1374  unsigned int n_cells;
1375  std::string fe_name;
1376  std::string policy_name;
1377 
1378  ar &n_cells &fe_name &policy_name;
1379 
1380  AssertThrow (n_cells == tria->n_cells(),
1381  ExcMessage ("The object being loaded into does not match the triangulation "
1382  "that has been stored previously."));
1383  AssertThrow (fe_name == this->get_fe(0).get_name(),
1384  ExcMessage ("The finite element associated with this DoFHandler does not match "
1385  "the one that was associated with the DoFHandler previously stored."));
1386  AssertThrow (policy_name == internal::policy_to_string(*policy),
1387  ExcMessage ("The policy currently associated with this DoFHandler ("
1388  + internal::policy_to_string(*policy)
1389  + ") does not match the one that was associated with the "
1390  "DoFHandler previously stored ("
1391  + policy_name
1392  + ")."));
1393 }
1394 
1395 
1396 
1397 
1398 template <int dim, int spacedim>
1399 inline
1401 DoFHandler<dim, spacedim>::MGVertexDoFs::get_index (const unsigned int level,
1402  const unsigned int dof_number,
1403  const unsigned int dofs_per_vertex) const
1404 {
1405  Assert ((level >= coarsest_level) && (level <= finest_level), ExcInvalidLevel (level));
1406  return indices[dofs_per_vertex * (level - coarsest_level) + dof_number];
1407 }
1408 
1409 
1410 
1411 template <int dim, int spacedim>
1412 inline
1413 void
1414 DoFHandler<dim, spacedim>::MGVertexDoFs::set_index (const unsigned int level,
1415  const unsigned int dof_number,
1416  const unsigned int dofs_per_vertex,
1417  const types::global_dof_index index)
1418 {
1419  Assert ((level >= coarsest_level) && (level <= finest_level), ExcInvalidLevel (level));
1420  indices[dofs_per_vertex * (level - coarsest_level) + dof_number] = index;
1421 }
1422 
1423 
1424 #endif // DOXYGEN
1425 
1426 DEAL_II_NAMESPACE_CLOSE
1427 
1428 #endif
DoFHandler & operator=(const DoFHandler &)=delete
unsigned int max_couplings_between_boundary_dofs() const
std::vector< MGVertexDoFs > mg_vertex_dofs
Definition: dof_handler.h:1074
active_cell_iterator end_active(const unsigned int level) const
Definition: dof_handler.cc:772
active_cell_iterator begin_active(const unsigned int level=0) const
Definition: dof_handler.cc:734
Iterator points to a valid object.
std::vector<::internal::DoFHandler::NumberCache > mg_number_cache
Definition: dof_handler.h:966
static const unsigned int dimension
Definition: dof_handler.h:272
const BlockInfo & block_info() const
static const unsigned int spacedim
static::ExceptionBase & ExcRenumberingIncomplete()
static::ExceptionBase & ExcInvalidLevel(int arg1)
level_cell_iterator begin_mg(const unsigned int level=0) const
Definition: dof_handler.cc:784
unsigned int boundary_id
Definition: types.h:110
virtual void clear()
const Triangulation< dim, spacedim > & get_triangulation() const
const FiniteElement< dim, spacedim > & get_fe(const unsigned int index=0) const
void clear_mg_space()
ActiveSelector::active_cell_iterator active_cell_iterator
Definition: dof_handler.h:229
SmartPointer< const Triangulation< dim, spacedim >, DoFHandler< dim, spacedim > > tria
Definition: dof_handler.h:939
STL namespace.
bool has_level_dofs() const
#define AssertThrow(cond, exc)
Definition: exceptions.h:398
const std::vector< types::global_dof_index > & n_locally_owned_dofs_per_processor() const
::internal::DoFHandler::NumberCache number_cache
Definition: dof_handler.h:961
unsigned int max_couplings_between_dofs() const
void initialize(const Triangulation< dim, spacedim > &tria, const FiniteElement< dim, spacedim > &fe)
Definition: dof_handler.cc:698
std::unique_ptr<::internal::DoFHandler::Policy::PolicyBase< dim, spacedim > > policy
Definition: dof_handler.h:952
static::ExceptionBase & ExcInvalidBoundaryIndicator()
BlockInfo block_info_object
Definition: dof_handler.h:933
IteratorRange< active_cell_iterator > active_cell_iterators_on_level(const unsigned int level) const
Definition: dof_handler.cc:863
static::ExceptionBase & ExcFacesHaveNoLevel()
static::ExceptionBase & ExcMessage(std::string arg1)
level_cell_iterator end_mg() const
Definition: dof_handler.cc:810
ActiveSelector::cell_iterator cell_iterator
Definition: dof_handler.h:257
#define DeclException1(Exception1, type1, outsequence)
Definition: exceptions.h:593
Definition: types.h:30
unsigned int global_dof_index
Definition: types.h:88
std::vector< std::unique_ptr<::internal::DoFHandler::DoFLevel< dim > > > levels
Definition: dof_handler.h:1080
virtual void distribute_mg_dofs()
#define Assert(cond, exc)
Definition: exceptions.h:337
types::global_dof_index n_dofs() const
static const unsigned int default_fe_index
Definition: dof_handler.h:301
std::unique_ptr< const hp::FECollection< dim, spacedim > > fe_collection
Definition: dof_handler.h:946
const Triangulation< dim, spacedim > * tria
unsigned int n_locally_owned_dofs() const
static::ExceptionBase & ExcGridsDoNotMatch()
#define DeclException0(Exception0)
Definition: exceptions.h:570
void set_index(const unsigned int level, const unsigned int dof_number, const unsigned int dofs_per_vertex, const types::global_dof_index index)
cell_iterator end() const
Definition: dof_handler.cc:750
Definition: hp.h:102
virtual ~DoFHandler()
Definition: dof_handler.cc:683
IteratorRange< cell_iterator > cell_iterators_on_level(const unsigned int level) const
Definition: dof_handler.cc:852
const IndexSet & locally_owned_mg_dofs(const unsigned int level) const
IteratorRange< cell_iterator > cell_iterators() const
Definition: dof_handler.cc:819
void renumber_dofs(const std::vector< types::global_dof_index > &new_numbers)
std::unique_ptr< types::global_dof_index[]> indices
Definition: dof_handler.h:1039
void initialize_local_block_info()
bool has_active_dofs() const
static::ExceptionBase & ExcEmptyLevel(int arg1)
static const unsigned int dim
cell_iterator begin(const unsigned int level=0) const
Definition: dof_handler.cc:722
void save(Archive &ar, const unsigned int version) const
types::global_dof_index get_index(const unsigned int level, const unsigned int dof_number, const unsigned int dofs_per_vertex) const
IteratorRange< level_cell_iterator > mg_cell_iterators() const
Definition: dof_handler.cc:840
types::global_dof_index n_boundary_dofs() const
Definition: dof_handler.cc:888
unsigned int coarsest_level
Definition: dof_handler.h:1023
void clear_space()
IteratorRange< level_cell_iterator > mg_cell_iterators_on_level(const unsigned int level) const
Definition: dof_handler.cc:874
int index() const
const hp::FECollection< dim, spacedim > & get_fe_collection() const
virtual void distribute_dofs(const FiniteElement< dim, spacedim > &fe)
Definition: dof_handler.cc:992
void load(Archive &ar, const unsigned int version)
A small class collecting the different BlockIndices involved in global, multilevel and local computat...
Definition: block_info.h:93
static::ExceptionBase & ExcNewNumbersNotConsecutive(types::global_dof_index arg1)
static const unsigned int space_dimension
Definition: dof_handler.h:277
virtual std::size_t memory_consumption() const
Definition: dof_handler.cc:963
const types::global_dof_index invalid_dof_index
Definition: types.h:187
const IndexSet & locally_owned_dofs() const
const std::vector< IndexSet > & locally_owned_dofs_per_processor() const
const Triangulation< dim, spacedim > & get_triangulation() const
IteratorRange< active_cell_iterator > active_cell_iterators() const
Definition: dof_handler.cc:829
std::unique_ptr<::internal::DoFHandler::DoFFaces< dim > > faces
Definition: dof_handler.h:1089
static const types::global_dof_index invalid_dof_index
Definition: dof_handler.h:290
std::vector< types::global_dof_index > vertex_dofs
Definition: dof_handler.h:1068
int level() const