Flow123d  JB_release_tests-c4abd42
dofhandler.hh
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2015 Technical University of Liberec. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License version 3 as published by the
7  * Free Software Foundation. (http://www.gnu.org/licenses/gpl-3.0.en.html)
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12  *
13  *
14  * @file dofhandler.hh
15  * @brief Declaration of class which handles the ordering of degrees of freedom (dof) and mappings between local and global dofs.
16  * @author Jan Stebel
17  */
18 
19 #ifndef DOFHANDLER_HH_
20 #define DOFHANDLER_HH_
21 
22 #include <vector> // for vector
23 #include <unordered_map> // for unordered_map
24 #include "system/index_types.hh" // for LongIdx
25 #include "mesh/mesh.h"
26 #include "mesh/accessors.hh"
27 #include "mesh/range_wrapper.hh"
29 #include "fem/discrete_space.hh" // for DiscreteSpace
30 #include "la/vector_mpi.hh" // for VectorMPI
31 #include "petscvec.h" // for Vec
32 
33 
34 template<unsigned int dim> class FiniteElement;
35 class DHCellAccessor;
36 class Mesh;
37 class Distribution;
38 class Dof;
39 
40 
41 /**
42  * Class DOFHandlerBase provides an abstract interface for various dof handlers:
43  * - basic handler for a given spatial dimension
44  * - multi-dimensional handler for all spatial dimensions (1D-3D)
45  * - handler for a specific region / part of mesh
46  */
48 public:
49 
50  /**
51  * @brief Constructor.
52  * @param _mesh The mesh.
53  */
55  : n_global_dofs_(0), lsize_(0), loffset_(0), max_elem_dofs_(0), mesh_(&_mesh), dof_ds_(0) {}
56 
57  /**
58  * @brief Getter for the number of all mesh dofs required by the given
59  * finite element.
60  */
61  unsigned int n_global_dofs() const { return n_global_dofs_; }
62 
63  /**
64  * @brief Returns the number of dofs on the current process.
65  */
66  unsigned int lsize() const { return lsize_; }
67 
68  /**
69  * @brief Returns max. number of dofs on one element.
70  */
71  unsigned int max_elem_dofs() const { return max_elem_dofs_; }
72 
73  std::shared_ptr<Distribution> distr() const { return dof_ds_; }
74 
75  /**
76  * @brief Returns the mesh.
77  */
78  MeshBase *mesh() const { return mesh_; }
79 
80  /**
81  * @brief Compute hash value of DOF handler.
82  */
83  virtual std::size_t hash() const =0;
84 
85  /// Destructor.
86  virtual ~DOFHandlerBase();
87 
88 protected:
89 
90  /**
91  * @brief Fill vector of the global indices of dofs associated to the @p cell.
92  *
93  * @param cell The cell.
94  * @param indices Vector of dof indices on the cell.
95  */
96  virtual unsigned int get_dof_indices(const DHCellAccessor &cell, std::vector<LongIdx> &indices) const = 0;
97 
98  /**
99  * @brief Returns a vector of the indices of dofs associated to the @p cell on the local process.
100  *
101  * @param loc_ele_idx local element index.
102  */
103  virtual LocDofVec get_loc_dof_indices(unsigned int loc_ele_idx) const =0;
104 
105  /**
106  * @brief Number of global dofs assigned by the handler.
107  */
108  unsigned int n_global_dofs_;
109 
110  /**
111  * @brief Number of dofs associated to local process.
112  */
113  unsigned int lsize_;
114 
115  /**
116  * @brief Index of the first dof on the local process.
117  */
118  unsigned int loffset_;
119 
120  /// Max. number of dofs per element.
121  unsigned int max_elem_dofs_;
122 
123  /**
124  * @brief Pointer to the mesh to which the dof handler is associated.
125  */
127 
128  /**
129  * @brief Distribution of dofs associated to local process.
130  */
131  std::shared_ptr<Distribution> dof_ds_;
132 
133 };
134 
135 
136 
137 
138 /**
139  * @brief Provides the numbering of the finite element degrees of freedom
140  * on the computational mesh.
141  *
142  * Class DOFHandlerMultiDim distributes the degrees of freedom (dof) for
143  * a particular triplet of 1d, 2d and 3d finite elements on the computational mesh
144  * and provides mappings between local and global dofs.
145  * The template parameter @p dim denotes the spatial dimension of
146  * the reference finite element.
147  *
148  * Currently the functionality is restricted to finite elements with internal and nodal dofs,
149  * i.e. the neighboring elements can share only dofs on nodes.
150  */
152 public:
153 
154  /**
155  * @brief Constructor.
156  * @param _mesh The mesh.
157  * @param make_elem_part Allow switch off make_element_partitioning, necessary for boundary DOF handler.
158  */
159  DOFHandlerMultiDim(MeshBase &_mesh, bool make_elem_part = true);
160 
161 
162  /**
163  * @brief Distributes degrees of freedom on the mesh needed
164  * for the given discrete space.
165  *
166  * By default, the dof handler is parallel, meaning that each
167  * processor has access to dofs on the local elements and on one
168  * layer of ghost elements (owned by neighbouring elements).
169  * This can be changed by setting @p sequential to true.
170  *
171  * @param ds The discrete space consisting of finite elements for each mesh element.
172  * @param sequential If true then each processor will have information about all dofs.
173  */
174  void distribute_dofs(std::shared_ptr<DiscreteSpace> ds);
175 
176  /** @brief Returns sequential version of the current dof handler.
177  *
178  * Collective on all processors.
179  */
180  std::shared_ptr<DOFHandlerMultiDim> sequential();
181 
182  /**
183  * @brief Returns scatter context from parallel to sequential vectors.
184  *
185  * For sequential dof handler it returns null pointer.
186  * Collective on all processors.
187  */
188  std::shared_ptr<VecScatter> sequential_scatter();
189 
190  /**
191  * @brief Allocates PETSc vector according to the dof distribution.
192  */
193  virtual VectorMPI create_vector();
194 
195  /**
196  * @brief Returns the global index of local edge.
197  *
198  * @param loc_edg Local index of edge.
199  */
200  inline LongIdx edge_index(int loc_edg) const { return edg_4_loc[loc_edg]; }
201 
202  /**
203  * @brief Returns the global index of local neighbour.
204  *
205  * @param loc_nb Local index of neighbour.
206  */
207  inline LongIdx nb_index(int loc_nb) const { return nb_4_loc[loc_nb]; }
208 
209  /**
210  * @brief Returns number of local edges.
211  */
212  inline unsigned int n_loc_edges() const { return edg_4_loc.size(); }
213 
214  /**
215  * @brief Returns number of local neighbours.
216  */
217  inline unsigned int n_loc_nb() const { return nb_4_loc.size(); }
218 
219  /// Output structure of dof handler.
220  void print() const;
221 
222  /**
223  * Implements @p DOFHandlerBase::hash.
224  */
225  std::size_t hash() const override;
226 
227  /// Returns range of DOF handler cells (only range of own without ghost cells)
229 
230  /// Returns range over own and ghost cells of DOF handler
232 
233  /// Returns range over ghosts DOF handler cells
235 
236  /// Return size of own range (number of own cells)
237  inline unsigned int n_own_cells() const {
238  return el_ds_->lsize();
239  }
240 
241  /// Return size of local range (number of local cells)
242  inline unsigned int n_local_cells() const {
243  return el_ds_->lsize()+ghost_4_loc.size();
244  }
245 
246  /// Return size of ghost range (number of ghost cells)
247  inline unsigned int n_ghost_cells() const {
248  return ghost_4_loc.size();
249  }
250 
251  /// Return DHCellAccessor appropriate to ElementAccessor of given idx
252  const DHCellAccessor cell_accessor_from_element(unsigned int elm_idx) const;
253 
254  /// Return pointer to discrete space for which the handler distributes dofs.
255  std::shared_ptr<DiscreteSpace> ds() const { return ds_; }
256 
257  /// Get the map between local dof indices and the global ones.
259 
260  /// Destructor.
261  ~DOFHandlerMultiDim() override;
262 
263 
264 
265  friend class DHCellAccessor;
266  friend class DHCellSide;
267  friend class DHNeighbSide;
268  friend class SubDOFHandlerMultiDim;
269 
270 private:
271 
272  /// Auxiliary function for output of information about dofs in a cell.
273  void print_cell_dofs(stringstream &s, DHCellAccessor cell) const;
274 
275 protected:
276 
277  /**
278  * Returns true if element is on local process.
279  * @param index Global element index.
280  */
281  bool el_is_local(int index) const;
282 
283  /**
284  * @brief Prepare parallel distribution of elements, edges and neighbours.
285  */
286  void make_elem_partitioning();
287 
288  /**
289  * @brief Initialize vector of starting indices for elements.
290  */
291  void init_cell_starts();
292 
293  /**
294  * @brief Initialize auxiliary vector of starting indices of nodal/edge dofs.
295  *
296  * @param node_dof_starts Vector of nodal starting indices (output).
297  * @param edge_dof_starts Vector of edge starting indices (output).
298  */
299  void init_dof_starts(std::vector<LongIdx> &node_dof_starts,
300  std::vector<LongIdx> &edge_dof_starts);
301 
302  /**
303  * @brief Initialize node_status and edge_status.
304  *
305  * Set VALID_NFACE for nodes/edges owned by local elements and
306  * INVALID_NFACE for nodes/edges owned by ghost elements.
307  *
308  * @param node_status Vector of nodal status (output).
309  * @param edge_status Vector of edge status (output).
310  */
311  void init_status(std::vector<short int> &node_status,
312  std::vector<short int> &edge_status);
313 
314  /**
315  * @brief Obtain dof numbers on ghost elements from other processor.
316  * @param proc Neighbouring processor.
317  * @param dofs Array where dofs are stored (output).
318  */
319  void receive_ghost_dofs(unsigned int proc,
320  std::vector<LongIdx> &dofs);
321 
322  /**
323  * @brief Send dof numbers to other processor.
324  * @param proc Neighbouring processor.
325  */
326  void send_ghost_dofs(unsigned int proc);
327 
328  /**
329  * @brief Update dofs on local elements from ghost element dofs.
330  *
331  * @param proc Neighbouring processor.
332  * @param update_cells Vector of global indices of elements which need to be updated
333  * from ghost elements.
334  * @param dofs Vector of dof indices on ghost elements from processor @p proc.
335  * @param node_dof_starts Vector of starting indices of nodal dofs.
336  * @param node_dofs Vector of nodal dof indices (output).
337  * @param edge_dof_starts Vector of starting indices of edge dofs.
338  * @param edge_dofs Vector of edge dof indices (output).
339  */
340  void update_local_dofs(unsigned int proc,
341  const std::vector<bool> &update_cells,
342  const std::vector<LongIdx> &dofs,
343  const std::vector<LongIdx> &node_dof_starts,
344  std::vector<LongIdx> &node_dofs,
345  const std::vector<LongIdx> &edge_dof_starts,
346  std::vector<LongIdx> &edge_dofs);
347 
348  /**
349  * @brief Communicate local dof indices to all processors and create new sequential dof handler.
350  *
351  * Collective on all processors.
352  */
353  void create_sequential();
354 
355  /**
356  * @brief Returns the global indices of dofs associated to the @p cell.
357  *
358  * @param cell The cell.
359  * @param indices Array of dof indices on the cell.
360  */
361  unsigned int get_dof_indices(const DHCellAccessor &cell,
362  std::vector<LongIdx> &indices) const override;
363 
364  /**
365  * @brief Returns the indices of dofs associated to the @p cell on the local process.
366  *
367  * @param loc_ele_idx local element index.
368  */
369  inline LocDofVec get_loc_dof_indices(unsigned int loc_ele_idx) const override
370  {
371  unsigned int ndofs = cell_starts[loc_ele_idx+1]-cell_starts[loc_ele_idx];
372  // create armadillo vector on top of existing array
373  // vec(ptr_aux_mem, number_of_elements, copy_aux_mem = true, strict = false)
374  IntIdx* mem_ptr = const_cast<IntIdx*>(&(dof_indices[cell_starts[loc_ele_idx]]));
375  return LocDofVec(mem_ptr, ndofs, false, false);
376  }
377 
378 
379 
380  /**
381  * Flags used during distribution of dofs to mark n-face and dof status.
382  *
383  * INVALID_NFACE means that on this node/edge/side/cell the current processor
384  * will not distribute dofs.
385  * VALID_NFACE means that on this node/edge/side/cell the current processor
386  * will distribute dofs.
387  * ASSIGNED_NFACE means that dofs on this n-face are already distributed.
388  *
389  * INVALID_DOF marks dofs whose global number has to be set by neighbouring processor.
390  */
391  static const int INVALID_NFACE;
392  static const int VALID_NFACE;
393  static const int ASSIGNED_NFACE;
394  static const int INVALID_DOF;
395 
396 
397  /// Pointer to the discrete space for which the handler distributes dofs.
398  std::shared_ptr<DiscreteSpace> ds_;
399 
400  /// Indicator for parallel/sequential dof handler.
402 
403  /// Sequential dof handler associated to the current (parallel) one.
404  std::shared_ptr<DOFHandlerMultiDim> dh_seq_;
405 
406  /// Scatter context for parallel to sequential vectors.
407  std::shared_ptr<VecScatter> scatter_to_seq_;
408 
409  /**
410  * @brief Starting indices for local (owned+ghost) element dofs.
411  *
412  * E.g. dof_indices[cell_starts[idx]] = dof number for first dof on the
413  * cell with local index idx within the parallel structure. To use with
414  * DHCellAccessor use the following:
415  *
416  * DHCellAccessor<3> cell;
417  * ...
418  * // i-th dof number on the cell
419  * dof_indices[cell_starts[cell.local_idx()]+i] = ...
420  *
421  * For sequential dof handler, dofs from all elements are stored and
422  * elements are ordered as in mesh_->get_row_4_el().
423  */
425 
426  /**
427  * @brief Dof numbers on local and ghost elements.
428  *
429  * Dofs are ordered accordingly with cell_starts and local dof order
430  * given by the finite element. See cell_starts for more description.
431  */
433 
434  /**
435  * @brief Maps local and ghost dof indices to global ones.
436  *
437  * First lsize_ entries correspond to dofs owned by local processor,
438  * the remaining entries are ghost dofs sorted by neighbouring processor id.
439  */
441 
442  /**
443  * @brief Maps global element index into local/ghost index (obsolete).
444  */
445  std::unordered_map<LongIdx,LongIdx> global_to_local_el_idx_;
446 
447  /// Distribution of elements
449 
450  /// Local edge index -> global edge index
452 
453  /// Local neighbour index -> global neighbour index
455 
456  /// Indices of ghost cells (neighbouring with local elements).
458 
459  /// Processors of ghost elements.
460  set<unsigned int> ghost_proc;
461 
462  /// Arrays of ghost cells for each neighbouring processor.
464 
465  /// Temporary flag which prevents using dof handler on meshes where edges are not allocated (currently BCMesh).
467 
468 };
469 
470 
472 {
473 public:
474 
475  /** @brief Creates a new dof handler for a component of FESystem.
476  *
477  * The @p component_idx indicates the index of finite-element
478  * from @p dh for which the new sub- handler is made.
479  * The numbering of dofs in sub-handler is compatible
480  * with the original handler.
481  */
482  SubDOFHandlerMultiDim(std::shared_ptr<DOFHandlerMultiDim> dh, unsigned int component_idx);
483 
484  /** @brief Update values in subvector from parent vector.
485  *
486  * @p vec Vector aligned with the parent dof handler.
487  * @p subvec Vctor aligned with the current sub-handler.
488  */
489  void update_subvector(const VectorMPI &vec, VectorMPI &subvec);
490 
491  /** @brief Update values in parent vector from values of subvector.
492  *
493  * @p vec Vector aligned with parent dof handler.
494  * @p subvec Vector aligned with the current sub-handler.
495  */
496  void update_parent_vector(VectorMPI &vec, const VectorMPI &subvec);
497 
498  /// Local indices in the parent handler.
500 
501 
502 private:
503 
504  /// Get global dof indices of ghost dofs for sub-handler.
505  void receive_sub_ghost_dofs(unsigned int proc, vector<unsigned int> &ghost_dof_proc, map<LongIdx,LongIdx> &global_to_local_dof_idx);
506 
507  /// Send global indices of dofs that are ghost on other processors.
508  void send_sub_ghost_dofs(unsigned int proc, const map<LongIdx,LongIdx> &global_to_local_dof_idx);
509 
510  /// Parent dof handler.
511  std::shared_ptr<DOFHandlerMultiDim> parent_;
512 
513  /// Index of FE in parent FESystem.
514  unsigned int fe_idx_;
515 
516  /// Local indices in the parent handler.
518 };
519 
520 
521 
522 
523 #endif /* DOFHANDLER_HH_ */
Cell accessor allow iterate over DOF handler cells.
Side accessor allows to iterate over sides of DOF handler cell.
Class allows to iterate over sides of neighbour.
unsigned int max_elem_dofs() const
Returns max. number of dofs on one element.
Definition: dofhandler.hh:71
DOFHandlerBase(MeshBase &_mesh)
Constructor.
Definition: dofhandler.hh:54
unsigned int max_elem_dofs_
Max. number of dofs per element.
Definition: dofhandler.hh:121
MeshBase * mesh_
Pointer to the mesh to which the dof handler is associated.
Definition: dofhandler.hh:126
unsigned int lsize_
Number of dofs associated to local process.
Definition: dofhandler.hh:113
unsigned int n_global_dofs_
Number of global dofs assigned by the handler.
Definition: dofhandler.hh:108
unsigned int n_global_dofs() const
Getter for the number of all mesh dofs required by the given finite element.
Definition: dofhandler.hh:61
virtual unsigned int get_dof_indices(const DHCellAccessor &cell, std::vector< LongIdx > &indices) const =0
Fill vector of the global indices of dofs associated to the cell.
unsigned int loffset_
Index of the first dof on the local process.
Definition: dofhandler.hh:118
std::shared_ptr< Distribution > dof_ds_
Distribution of dofs associated to local process.
Definition: dofhandler.hh:131
MeshBase * mesh() const
Returns the mesh.
Definition: dofhandler.hh:78
virtual std::size_t hash() const =0
Compute hash value of DOF handler.
virtual ~DOFHandlerBase()
Destructor.
Definition: dofhandler.cc:41
std::shared_ptr< Distribution > distr() const
Definition: dofhandler.hh:73
unsigned int lsize() const
Returns the number of dofs on the current process.
Definition: dofhandler.hh:66
virtual LocDofVec get_loc_dof_indices(unsigned int loc_ele_idx) const =0
Returns a vector of the indices of dofs associated to the cell on the local process.
Provides the numbering of the finite element degrees of freedom on the computational mesh.
Definition: dofhandler.hh:151
static const int ASSIGNED_NFACE
Definition: dofhandler.hh:393
static const int INVALID_NFACE
Definition: dofhandler.hh:391
vector< LongIdx > nb_4_loc
Local neighbour index -> global neighbour index.
Definition: dofhandler.hh:454
LocDofVec get_loc_dof_indices(unsigned int loc_ele_idx) const override
Returns the indices of dofs associated to the cell on the local process.
Definition: dofhandler.hh:369
unsigned int n_own_cells() const
Return size of own range (number of own cells)
Definition: dofhandler.hh:237
Distribution * el_ds_
Distribution of elements.
Definition: dofhandler.hh:448
LongIdx nb_index(int loc_nb) const
Returns the global index of local neighbour.
Definition: dofhandler.hh:207
std::shared_ptr< DiscreteSpace > ds_
Pointer to the discrete space for which the handler distributes dofs.
Definition: dofhandler.hh:398
std::shared_ptr< VecScatter > scatter_to_seq_
Scatter context for parallel to sequential vectors.
Definition: dofhandler.hh:407
unsigned int get_dof_indices(const DHCellAccessor &cell, std::vector< LongIdx > &indices) const override
Returns the global indices of dofs associated to the cell.
Definition: dofhandler.cc:567
unsigned int n_loc_edges() const
Returns number of local edges.
Definition: dofhandler.hh:212
Range< DHCellAccessor > own_range() const
Returns range of DOF handler cells (only range of own without ghost cells)
Definition: dofhandler.cc:680
void make_elem_partitioning()
Prepare parallel distribution of elements, edges and neighbours.
Definition: dofhandler.cc:584
void update_local_dofs(unsigned int proc, const std::vector< bool > &update_cells, const std::vector< LongIdx > &dofs, const std::vector< LongIdx > &node_dof_starts, std::vector< LongIdx > &node_dofs, const std::vector< LongIdx > &edge_dof_starts, std::vector< LongIdx > &edge_dofs)
Update dofs on local elements from ghost element dofs.
Definition: dofhandler.cc:230
vector< LongIdx > ghost_4_loc
Indices of ghost cells (neighbouring with local elements).
Definition: dofhandler.hh:457
bool distribute_edge_dofs
Temporary flag which prevents using dof handler on meshes where edges are not allocated (currently BC...
Definition: dofhandler.hh:466
std::vector< LongIdx > cell_starts
Starting indices for local (owned+ghost) element dofs.
Definition: dofhandler.hh:424
unsigned int n_ghost_cells() const
Return size of ghost range (number of ghost cells)
Definition: dofhandler.hh:247
friend class SubDOFHandlerMultiDim
Definition: dofhandler.hh:268
std::size_t hash() const override
Definition: dofhandler.cc:675
LongIdx edge_index(int loc_edg) const
Returns the global index of local edge.
Definition: dofhandler.hh:200
bool el_is_local(int index) const
Definition: dofhandler.cc:669
vector< LongIdx > edg_4_loc
Local edge index -> global edge index.
Definition: dofhandler.hh:451
bool is_parallel_
Indicator for parallel/sequential dof handler.
Definition: dofhandler.hh:401
static const int INVALID_DOF
Definition: dofhandler.hh:394
unsigned int n_local_cells() const
Return size of local range (number of local cells)
Definition: dofhandler.hh:242
set< unsigned int > ghost_proc
Processors of ghost elements.
Definition: dofhandler.hh:460
void distribute_dofs(std::shared_ptr< DiscreteSpace > ds)
Distributes degrees of freedom on the mesh needed for the given discrete space.
Definition: dofhandler.cc:324
std::vector< IntIdx > dof_indices
Dof numbers on local and ghost elements.
Definition: dofhandler.hh:432
std::shared_ptr< DOFHandlerMultiDim > sequential()
Returns sequential version of the current dof handler.
Definition: dofhandler.cc:69
static const int VALID_NFACE
Definition: dofhandler.hh:392
const std::vector< LongIdx > & get_local_to_global_map() const
Get the map between local dof indices and the global ones.
Definition: dofhandler.hh:258
std::shared_ptr< DOFHandlerMultiDim > dh_seq_
Sequential dof handler associated to the current (parallel) one.
Definition: dofhandler.hh:404
void print_cell_dofs(stringstream &s, DHCellAccessor cell) const
Auxiliary function for output of information about dofs in a cell.
Definition: dofhandler.cc:707
virtual VectorMPI create_vector()
Allocates PETSc vector according to the dof distribution.
Definition: dofhandler.cc:553
void init_cell_starts()
Initialize vector of starting indices for elements.
Definition: dofhandler.cc:83
DOFHandlerMultiDim(MeshBase &_mesh, bool make_elem_part=true)
Constructor.
Definition: dofhandler.cc:49
~DOFHandlerMultiDim() override
Destructor.
Definition: dofhandler.cc:579
void create_sequential()
Communicate local dof indices to all processors and create new sequential dof handler.
Definition: dofhandler.cc:464
const DHCellAccessor cell_accessor_from_element(unsigned int elm_idx) const
Return DHCellAccessor appropriate to ElementAccessor of given idx.
Definition: dofhandler.cc:701
void print() const
Output structure of dof handler.
Definition: dofhandler.cc:722
Range< DHCellAccessor > local_range() const
Returns range over own and ghost cells of DOF handler.
Definition: dofhandler.cc:687
Range< DHCellAccessor > ghost_range() const
Returns range over ghosts DOF handler cells.
Definition: dofhandler.cc:694
void init_status(std::vector< short int > &node_status, std::vector< short int > &edge_status)
Initialize node_status and edge_status.
Definition: dofhandler.cc:123
void init_dof_starts(std::vector< LongIdx > &node_dof_starts, std::vector< LongIdx > &edge_dof_starts)
Initialize auxiliary vector of starting indices of nodal/edge dofs.
Definition: dofhandler.cc:97
std::vector< LongIdx > local_to_global_dof_idx_
Maps local and ghost dof indices to global ones.
Definition: dofhandler.hh:440
void send_ghost_dofs(unsigned int proc)
Send dof numbers to other processor.
Definition: dofhandler.cc:199
std::shared_ptr< DiscreteSpace > ds() const
Return pointer to discrete space for which the handler distributes dofs.
Definition: dofhandler.hh:255
std::unordered_map< LongIdx, LongIdx > global_to_local_el_idx_
Maps global element index into local/ghost index (obsolete).
Definition: dofhandler.hh:445
unsigned int n_loc_nb() const
Returns number of local neighbours.
Definition: dofhandler.hh:217
std::shared_ptr< VecScatter > sequential_scatter()
Returns scatter context from parallel to sequential vectors.
Definition: dofhandler.cc:76
void receive_ghost_dofs(unsigned int proc, std::vector< LongIdx > &dofs)
Obtain dof numbers on ghost elements from other processor.
Definition: dofhandler.cc:178
map< unsigned int, vector< LongIdx > > ghost_proc_el
Arrays of ghost cells for each neighbouring processor.
Definition: dofhandler.hh:463
unsigned int lsize(int proc) const
get local size
Abstract class for the description of a general finite element on a reference simplex in dim dimensio...
Base class for Mesh and BCMesh.
Definition: mesh.h:96
Definition: mesh.h:362
Range helper class.
unsigned int fe_idx_
Index of FE in parent FESystem.
Definition: dofhandler.hh:514
std::vector< LongIdx > parent_dof_idx_
Local indices in the parent handler.
Definition: dofhandler.hh:517
void update_parent_vector(VectorMPI &vec, const VectorMPI &subvec)
Update values in parent vector from values of subvector.
Definition: dofhandler.cc:938
void receive_sub_ghost_dofs(unsigned int proc, vector< unsigned int > &ghost_dof_proc, map< LongIdx, LongIdx > &global_to_local_dof_idx)
Get global dof indices of ghost dofs for sub-handler.
Definition: dofhandler.cc:880
void update_subvector(const VectorMPI &vec, VectorMPI &subvec)
Update values in subvector from parent vector.
Definition: dofhandler.cc:928
void send_sub_ghost_dofs(unsigned int proc, const map< LongIdx, LongIdx > &global_to_local_dof_idx)
Send global indices of dofs that are ghost on other processors.
Definition: dofhandler.cc:910
const std::vector< LongIdx > & parent_indices()
Local indices in the parent handler.
Definition: dofhandler.hh:499
std::shared_ptr< DOFHandlerMultiDim > parent_
Parent dof handler.
Definition: dofhandler.hh:511
Declaration of class which provides the finite element for every mesh cell.
Template Iter serves as general template for internal iterators.
int IntIdx
Definition: index_types.hh:25
arma::Col< IntIdx > LocDofVec
Definition: index_types.hh:28
int LongIdx
Define type that represents indices of large arrays (elements, nodes, dofs etc.)
Definition: index_types.hh:24
ArmaVec< double, N > vec
Definition: armor.hh:885
Implementation of range helper class.