18 #ifndef __deal2__matrix_free_dof_info_h
19 #define __deal2__matrix_free_dof_info_h
23 #include <deal.II/base/vectorization.h>
24 #include <deal.II/base/partitioner.h>
25 #include <deal.II/lac/constraint_matrix.h>
26 #include <deal.II/dofs/dof_handler.h>
27 #include <deal.II/matrix_free/helper_functions.h>
29 #include <deal.II/base/std_cxx1x/array.h>
38 namespace MatrixFreeFunctions
68 DoFInfo (
const DoFInfo &dof_info);
79 const unsigned int *begin_indices (
const unsigned int row)
const;
85 const unsigned int *end_indices (
const unsigned int row)
const;
90 unsigned int row_length_indices (
const unsigned int row)
const;
96 const std::pair<unsigned short,unsigned short> *
97 begin_indicators (
const unsigned int row)
const;
103 const std::pair<unsigned short,unsigned short> *
104 end_indicators (
const unsigned int row)
const;
110 unsigned int row_length_indicators (
const unsigned int row)
const;
116 const unsigned int *begin_indices_plain (
const unsigned int row)
const;
122 const unsigned int *end_indices_plain (
const unsigned int row)
const;
130 unsigned int fe_index_from_degree (
const unsigned int fe_degree)
const;
140 fe_index_from_dofs_per_cell (
const unsigned int dofs_per_cell)
const;
150 void read_dof_indices (
const std::vector<types::global_dof_index> &local_indices,
151 const std::vector<unsigned int> &lexicographic_inv,
153 const unsigned int cell_number,
154 ConstraintValues<double> &constraint_values,
155 bool &cell_at_boundary);
164 void assign_ghosts(
const std::vector<unsigned int> &boundary_cells);
172 void compute_renumber_serial (
const std::vector<unsigned int> &boundary_cells,
173 const SizeInfo &size_info,
174 std::vector<unsigned int> &renumbering);
182 void compute_renumber_hp_serial (SizeInfo &size_info,
183 std::vector<unsigned int> &renumbering,
184 std::vector<unsigned int> &irregular_cells);
191 void compute_renumber_parallel (
const std::vector<unsigned int> &boundary_cells,
193 std::vector<unsigned int> &renumbering);
201 void reorder_cells (
const SizeInfo &size_info,
202 const std::vector<unsigned int> &renumbering,
203 const std::vector<unsigned int> &constraint_pool_row_index,
204 const std::vector<unsigned int> &irregular_cells,
205 const unsigned int vectorization_length);
213 void guess_block_size (
const SizeInfo &size_info,
214 TaskInfo &task_info);
230 make_thread_graph_partition_color (SizeInfo &size_info,
232 std::vector<unsigned int> &renumbering,
233 std::vector<unsigned int> &irregular_cells,
251 make_thread_graph_partition_partition (SizeInfo &size_info,
253 std::vector<unsigned int> &renumbering,
254 std::vector<unsigned int> &irregular_cells,
264 make_connectivity_graph (
const SizeInfo &size_info,
265 const TaskInfo &task_info,
266 const std::vector<unsigned int> &renumbering,
267 const std::vector<unsigned int> &irregular_cells,
268 const bool do_blocking,
274 void renumber_dofs (std::vector<types::global_dof_index> &renumbering);
285 template <
typename STREAM>
286 void print_memory_consumption(STREAM &out,
287 const SizeInfo &size_info)
const;
293 template <
typename Number>
294 void print (
const std::vector<Number> &constraint_pool_data,
295 const std::vector<unsigned int> &constraint_pool_row_index,
296 std::ostream &out)
const;
308 std::vector<std_cxx1x::array<unsigned int, 3> > row_starts;
326 std::vector<unsigned int> dof_indices;
337 std::vector<std::pair<unsigned short,unsigned short> > constraint_indicator;
345 std_cxx1x::shared_ptr<const Utilities::MPI::Partitioner> vector_partitioner;
351 std::vector<unsigned int> constrained_dofs;
357 std::vector<unsigned int> row_starts_plain_indices;
367 std::vector<unsigned int> plain_dof_indices;
374 unsigned int dimension;
380 unsigned int n_components;
385 std::vector<unsigned int> dofs_per_cell;
390 std::vector<unsigned int> dofs_per_face;
395 bool store_plain_indices;
400 std::vector<unsigned int> cell_active_fe_index;
406 unsigned int max_fe_index;
413 std::vector<std::pair<unsigned int,unsigned int> > fe_index_conversion;
420 std::vector<types::global_dof_index> ghost_dofs;
430 DoFInfo::begin_indices (
const unsigned int row)
const
433 const unsigned int index = row_starts[row][0];
435 return dof_indices.empty() ? 0 : &dof_indices[0] + index;
442 DoFInfo::end_indices (
const unsigned int row)
const
445 const unsigned int index = row_starts[row+1][0];
447 return dof_indices.empty() ? 0 : &dof_indices[0] + index;
454 DoFInfo::row_length_indices (
const unsigned int row)
const
457 return (row_starts[row+1][0] - row_starts[row][0]);
463 const std::pair<unsigned short,unsigned short> *
464 DoFInfo::begin_indicators (
const unsigned int row)
const
467 const unsigned int index = row_starts[row][1];
469 return constraint_indicator.empty() ? 0 : &constraint_indicator[0] + index;
475 const std::pair<unsigned short,unsigned short> *
476 DoFInfo::end_indicators (
const unsigned int row)
const
479 const unsigned int index = row_starts[row+1][1];
481 return constraint_indicator.empty() ? 0 : &constraint_indicator[0] + index;
488 DoFInfo::row_length_indicators (
const unsigned int row)
const
491 return (row_starts[row+1][1] - row_starts[row][1]);
498 DoFInfo::begin_indices_plain (
const unsigned int row)
const
501 if (row_length_indicators(row) == 0)
505 return begin_indices(row);
510 const unsigned int index = row_starts_plain_indices[row];
512 return plain_dof_indices.empty() ? 0 : &plain_dof_indices[0] + index;
520 DoFInfo::end_indices_plain (
const unsigned int row)
const
522 return begin_indices_plain(row) +
523 dofs_per_cell[(cell_active_fe_index.size()==0)?
524 0:cell_active_fe_index[row]];
531 DoFInfo::fe_index_from_degree (
const unsigned int fe_degree)
const
533 const unsigned int n_indices = fe_index_conversion.size();
534 for (
unsigned int i=0; i<n_indices; ++i)
535 if (fe_index_conversion[i].first == fe_degree)
544 DoFInfo::fe_index_from_dofs_per_cell (
const unsigned int dofs_per_cell)
const
546 for (
unsigned int i=0; i<fe_index_conversion.size(); ++i)
547 if (fe_index_conversion[i].second == dofs_per_cell)
555 #endif // ifndef DOXYGEN
557 DEAL_II_NAMESPACE_CLOSE
static const unsigned int invalid_unsigned_int
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
#define Assert(cond, exc)
std::size_t memory_consumption(const T &t)
::ExceptionBase & ExcInternalError()