//----------------------------------------------------------------------------- SubSpace::SubSpace(const FunctionSpace& V, const std::vector<std::size_t>& component) : FunctionSpace(V.mesh(), V.element(), V.dofmap()) { // Extract subspace and assign std::shared_ptr<FunctionSpace> _function_space(V.extract_sub_space(component)); *static_cast<FunctionSpace*>(this) = *_function_space; }
//----------------------------------------------------------------------------- SubSpace::SubSpace(const FunctionSpace& V, std::size_t component, std::size_t sub_component) : FunctionSpace(V.mesh(), V.element(), V.dofmap()) { // Create array std::vector<std::size_t> c = {{component, sub_component}}; // Extract subspace and assign std::shared_ptr<FunctionSpace> _function_space(V.extract_sub_space(c)); *static_cast<FunctionSpace*>(this) = *_function_space; }
void extract_dof_component_map(std::map<std::size_t, std::size_t>& dof_component_map, const FunctionSpace& VV, int* component) { // Extract sub dofmaps recursively and store dof to component map boost::unordered_map<std::size_t, std::size_t> collapsed_map; boost::unordered_map<std::size_t, std::size_t>::iterator map_it; std::vector<std::size_t> comp(1); if (VV.element()->num_sub_elements() == 0) { boost::shared_ptr<GenericDofMap> dummy = VV.dofmap()->collapse(collapsed_map, *VV.mesh()); (*component)++; for (map_it =collapsed_map.begin(); map_it!=collapsed_map.end(); ++map_it) dof_component_map[map_it->second] = (*component); } else { for (std::size_t i=0; i<VV.element()->num_sub_elements(); i++) { comp[0] = i; boost::shared_ptr<FunctionSpace> Vs = VV.extract_sub_space(comp); extract_dof_component_map(dof_component_map, *Vs, component); } } }