17 #ifndef dealii__matrix_free_dof_info_h 18 #define dealii__matrix_free_dof_info_h 21 #include <deal.II/base/exceptions.h> 22 #include <deal.II/base/vectorization.h> 23 #include <deal.II/base/partitioner.h> 24 #include <deal.II/lac/constraint_matrix.h> 25 #include <deal.II/lac/dynamic_sparsity_pattern.h> 26 #include <deal.II/dofs/dof_handler.h> 27 #include <deal.II/matrix_free/helper_functions.h> 29 #include <deal.II/base/std_cxx11/array.h> 34 DEAL_II_NAMESPACE_OPEN
38 namespace MatrixFreeFunctions
40 template <
typename Number>
struct ConstraintValues;
70 DoFInfo (
const DoFInfo &dof_info);
81 const unsigned int *begin_indices (
const unsigned int row)
const;
87 const unsigned int *end_indices (
const unsigned int row)
const;
92 unsigned int row_length_indices (
const unsigned int row)
const;
98 const std::pair<unsigned short,unsigned short> *
99 begin_indicators (
const unsigned int row)
const;
105 const std::pair<unsigned short,unsigned short> *
106 end_indicators (
const unsigned int row)
const;
112 unsigned int row_length_indicators (
const unsigned int row)
const;
118 const unsigned int *begin_indices_plain (
const unsigned int row)
const;
124 const unsigned int *end_indices_plain (
const unsigned int row)
const;
132 unsigned int fe_index_from_degree (
const unsigned int fe_degree)
const;
142 fe_index_from_dofs_per_cell (
const unsigned int dofs_per_cell)
const;
152 void read_dof_indices (
const std::vector<types::global_dof_index> &local_indices,
153 const std::vector<unsigned int> &lexicographic_inv,
155 const unsigned int cell_number,
156 ConstraintValues<double> &constraint_values,
157 bool &cell_at_boundary);
166 void assign_ghosts(
const std::vector<unsigned int> &boundary_cells);
174 void compute_renumber_serial (
const std::vector<unsigned int> &boundary_cells,
175 const SizeInfo &size_info,
176 std::vector<unsigned int> &renumbering);
184 void compute_renumber_hp_serial (SizeInfo &size_info,
185 std::vector<unsigned int> &renumbering,
186 std::vector<unsigned int> &irregular_cells);
193 void compute_renumber_parallel (
const std::vector<unsigned int> &boundary_cells,
195 std::vector<unsigned int> &renumbering);
203 void reorder_cells (
const SizeInfo &size_info,
204 const std::vector<unsigned int> &renumbering,
205 const std::vector<unsigned int> &constraint_pool_row_index,
206 const std::vector<unsigned int> &irregular_cells,
207 const unsigned int vectorization_length);
215 void guess_block_size (
const SizeInfo &size_info,
216 TaskInfo &task_info);
232 make_thread_graph_partition_color (SizeInfo &size_info,
234 std::vector<unsigned int> &renumbering,
235 std::vector<unsigned int> &irregular_cells,
253 make_thread_graph_partition_partition (SizeInfo &size_info,
255 std::vector<unsigned int> &renumbering,
256 std::vector<unsigned int> &irregular_cells,
266 make_connectivity_graph (
const SizeInfo &size_info,
267 const TaskInfo &task_info,
268 const std::vector<unsigned int> &renumbering,
269 const std::vector<unsigned int> &irregular_cells,
270 const bool do_blocking,
276 void renumber_dofs (std::vector<types::global_dof_index> &renumbering);
287 template <
typename StreamType>
288 void print_memory_consumption(StreamType &out,
289 const SizeInfo &size_info)
const;
295 template <
typename Number>
296 void print (
const std::vector<Number> &constraint_pool_data,
297 const std::vector<unsigned int> &constraint_pool_row_index,
298 std::ostream &out)
const;
310 std::vector<std_cxx11::array<unsigned int, 3> > row_starts;
327 std::vector<unsigned int> dof_indices;
338 std::vector<std::pair<unsigned short,unsigned short> > constraint_indicator;
346 std_cxx11::shared_ptr<const Utilities::MPI::Partitioner> vector_partitioner;
352 std::vector<unsigned int> constrained_dofs;
358 std::vector<unsigned int> row_starts_plain_indices;
368 std::vector<unsigned int> plain_dof_indices;
375 unsigned int dimension;
381 unsigned int n_components;
386 std::vector<unsigned int> dofs_per_cell;
391 std::vector<unsigned int> dofs_per_face;
396 bool store_plain_indices;
401 std::vector<unsigned int> cell_active_fe_index;
407 unsigned int max_fe_index;
414 std::vector<std::pair<unsigned int,unsigned int> > fe_index_conversion;
421 std::vector<types::global_dof_index> ghost_dofs;
431 DoFInfo::begin_indices (
const unsigned int row)
const 434 const unsigned int index = row_starts[row][0];
436 return dof_indices.empty() ? 0 : &dof_indices[0] + index;
443 DoFInfo::end_indices (
const unsigned int row)
const 446 const unsigned int index = row_starts[row+1][0];
448 return dof_indices.empty() ? 0 : &dof_indices[0] + index;
455 DoFInfo::row_length_indices (
const unsigned int row)
const 458 return (row_starts[row+1][0] - row_starts[row][0]);
464 const std::pair<unsigned short,unsigned short> *
465 DoFInfo::begin_indicators (
const unsigned int row)
const 468 const unsigned int index = row_starts[row][1];
470 return constraint_indicator.empty() ? 0 : &constraint_indicator[0] + index;
476 const std::pair<unsigned short,unsigned short> *
477 DoFInfo::end_indicators (
const unsigned int row)
const 480 const unsigned int index = row_starts[row+1][1];
482 return constraint_indicator.empty() ? 0 : &constraint_indicator[0] + index;
489 DoFInfo::row_length_indicators (
const unsigned int row)
const 492 return (row_starts[row+1][1] - row_starts[row][1]);
499 DoFInfo::begin_indices_plain (
const unsigned int row)
const 502 if (row_length_indicators(row) == 0)
506 return begin_indices(row);
511 const unsigned int index = row_starts_plain_indices[row];
513 return plain_dof_indices.empty() ? 0 : &plain_dof_indices[0] + index;
521 DoFInfo::end_indices_plain (
const unsigned int row)
const 523 return begin_indices_plain(row) +
524 dofs_per_cell[(cell_active_fe_index.size()==0)?
525 0:cell_active_fe_index[row]];
532 DoFInfo::fe_index_from_degree (
const unsigned int fe_degree)
const 534 const unsigned int n_indices = fe_index_conversion.size();
535 for (
unsigned int i=0; i<n_indices; ++i)
536 if (fe_index_conversion[i].first == fe_degree)
545 DoFInfo::fe_index_from_dofs_per_cell (
const unsigned int dofs_per_cell)
const 547 for (
unsigned int i=0; i<fe_index_conversion.size(); ++i)
548 if (fe_index_conversion[i].second == dofs_per_cell)
556 #endif // ifndef DOXYGEN 558 DEAL_II_NAMESPACE_CLOSE
static const unsigned int invalid_unsigned_int
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
#define Assert(cond, exc)
std_cxx11::enable_if< std_cxx11::is_fundamental< T >::value, std::size_t >::type memory_consumption(const T &t)
static ::ExceptionBase & ExcInternalError()