//----------------------------------------------------------------------------- void DofMap::check_dimensional_consistency(const ufc::dofmap& dofmap, const Mesh& mesh) { // Check topological dimension if (dofmap.topological_dimension() != mesh.topology().dim()) { dolfin_error("DofMap.cpp", "create mapping of degrees of freedom", "Topological dimension of the UFC dofmap (dim = %d) and the mesh (dim = %d) do not match", dofmap.topological_dimension(), mesh.topology().dim()); } }
//----------------------------------------------------------------------------- std::size_t DofMapBuilder::compute_blocksize(const ufc::dofmap& ufc_dofmap) { bool has_block_structure = false; if (ufc_dofmap.num_sub_dofmaps() > 1) { // Create UFC first sub-dofmap boost::scoped_ptr<ufc::dofmap> ufc_sub_dofmap0(ufc_dofmap.create_sub_dofmap(0)); dolfin_assert(ufc_sub_dofmap0); // Create UFC sub-dofmaps and check that all sub dofmaps have the // same number of dofs per entity if (ufc_sub_dofmap0->num_sub_dofmaps() != 0) has_block_structure = false; else { // Assume dof map has block structure, then check has_block_structure = true; // Create UFC sub-dofmaps and check that all sub dofmaps have the // same number of dofs per entity for (std::size_t i = 1; i < ufc_dofmap.num_sub_dofmaps(); ++i) { boost::scoped_ptr<ufc::dofmap> ufc_sub_dofmap(ufc_dofmap.create_sub_dofmap(i)); dolfin_assert(ufc_sub_dofmap); for (std::size_t d = 0; d <= ufc_dofmap.topological_dimension(); ++d) { if (ufc_sub_dofmap->num_entity_dofs(d) != ufc_sub_dofmap0->num_entity_dofs(d)) { has_block_structure = false; break; } } } } } if (has_block_structure) return ufc_dofmap.num_sub_dofmaps(); else return 1; }