25 #ifndef __DOLFIN_DOF_MAP_H
26 #define __DOLFIN_DOF_MAP_H
31 #include <unordered_map>
34 #include <Eigen/Dense>
37 #include <dolfin/common/types.h>
38 #include <dolfin/la/IndexMap.h>
39 #include <dolfin/mesh/Cell.h>
40 #include "GenericDofMap.h"
64 DofMap(std::shared_ptr<const ufc::dofmap> ufc_dofmap,
75 DofMap(std::shared_ptr<const ufc::dofmap> ufc_dofmap,
82 const std::vector<std::size_t>& component,
86 DofMap(std::unordered_map<std::size_t, std::size_t>& collapsed_map,
171 {
return _index_map->off_process_owner(); }
178 const std::unordered_map<int, std::vector<int>>&
shared_nodes()
const;
191 _ufc_local_to_local.clear();
200 Eigen::Map<const Eigen::Array<dolfin::la_index, Eigen::Dynamic, 1>>
203 const std::size_t index = cell_index*_cell_dimension;
204 dolfin_assert(index + _cell_dimension <= _dofmap.size());
205 return Eigen::Map<const Eigen::Array<dolfin::la_index, Eigen::Dynamic, 1>>(&_dofmap[index], _cell_dimension);
218 std::vector<dolfin::la_index>
220 const std::vector<std::size_t> & entity_indices)
const;
230 std::vector<dolfin::la_index>
244 std::vector<dolfin::la_index>
246 const std::vector<std::size_t> & entity_indices)
const;
257 std::vector<dolfin::la_index>
267 std::size_t cell_facet_index)
const;
278 std::size_t entity_dim, std::size_t cell_entity_index)
const;
289 std::size_t entity_dim, std::size_t cell_entity_index)
const;
297 dolfin_assert(_global_nodes.empty() ||
block_size() == 1);
298 element_dofs.resize(_global_nodes.size());
299 std::copy(_global_nodes.cbegin(), _global_nodes.cend(), element_dofs.begin());
306 std::shared_ptr<GenericDofMap>
copy()
const;
315 std::shared_ptr<GenericDofMap>
create(
const Mesh& new_mesh)
const;
327 std::shared_ptr<GenericDofMap>
329 const Mesh& mesh)
const;
340 std::shared_ptr<GenericDofMap>
341 collapse(std::unordered_map<std::size_t, std::size_t>&
342 collapsed_map,
const Mesh& mesh)
const;
347 std::vector<dolfin::la_index>
dofs(
const Mesh& mesh,
348 std::size_t dim)
const;
351 std::vector<dolfin::la_index>
dofs()
const;
366 {
return _index_map; }
371 {
return _index_map->block_size(); }
388 {
return _index_map->local_to_global(local_index); }
392 {
return _index_map->local_to_global_unowned(); }
401 std::string
str(
bool verbose)
const;
409 static void check_dimensional_consistency(
const ufc::dofmap& dofmap,
413 static void check_provided_entities(
const ufc::dofmap& dofmap,
417 std::vector<dolfin::la_index> _dofmap;
420 std::set<std::size_t> _global_nodes;
423 std::size_t _cell_dimension;
426 std::shared_ptr<const ufc::dofmap> _ufc_dofmap;
433 std::vector<std::size_t> _num_mesh_entities_global;
437 std::vector<int> _ufc_local_to_local;
444 std::size_t _global_dimension;
447 std::size_t _ufc_offset;
450 std::size_t _multimesh_offset;
454 std::shared_ptr<IndexMap> _index_map;
460 std::unordered_map<int, std::vector<int>> _shared_nodes;
463 std::set<int> _neighbours;