* first have to be mapped to the global degrees of freedom, to correspond
* with them.
*/
- template <int dim, int spacedim>
- void
- extract_dofs(const DoFHandler<dim, spacedim> &dof_handler,
- const ComponentMask & component_mask,
- std::vector<bool> & selected_dofs);
-
- /**
- * The same function as above, but for a hp::DoFHandler.
- */
- template <int dim, int spacedim>
+ template <int dim, int spacedim, typename DoFHandlerType>
void
- extract_dofs(const hp::DoFHandler<dim, spacedim> &dof_handler,
- const ComponentMask & component_mask,
- std::vector<bool> & selected_dofs);
+ extract_dofs(const DoFHandlerType &dof_handler,
+ const ComponentMask & component_mask,
+ std::vector<bool> & selected_dofs);
/**
* This function is the equivalent to the DoFTools::extract_dofs() functions
* sequential computations of course equals DoFHandler::n_dofs(). The
* previous contents of this array are overwritten.
*/
- template <int dim, int spacedim>
- void
- extract_dofs(const DoFHandler<dim, spacedim> &dof_handler,
- const BlockMask & block_mask,
- std::vector<bool> & selected_dofs);
-
- /**
- * The same function as above, but for a hp::DoFHandler.
- */
- template <int dim, int spacedim>
+ template <int dim, int spacedim, typename DoFHandlerType>
void
- extract_dofs(const hp::DoFHandler<dim, spacedim> &dof_handler,
- const BlockMask & block_mask,
- std::vector<bool> & selected_dofs);
+ extract_dofs(const DoFHandlerType &dof_handler,
+ const BlockMask & block_mask,
+ std::vector<bool> & selected_dofs);
/**
* Do the same thing as the corresponding extract_dofs() function for one
- template <int dim, int spacedim>
- void
- extract_dofs(const DoFHandler<dim, spacedim> &dof,
- const ComponentMask & component_mask,
- std::vector<bool> & selected_dofs)
- {
- const FiniteElement<dim, spacedim> &fe = dof.get_fe();
- (void)fe;
-
- Assert(component_mask.represents_n_components(fe.n_components()),
- ExcMessage(
- "The given component mask is not sized correctly to represent the "
- "components of the given finite element."));
- Assert(selected_dofs.size() == dof.n_locally_owned_dofs(),
- ExcDimensionMismatch(selected_dofs.size(),
- dof.n_locally_owned_dofs()));
-
- // two special cases: no component is selected, and all components are
- // selected; both rather stupid, but easy to catch
- if (component_mask.n_selected_components(n_components(dof)) == 0)
- {
- std::fill_n(selected_dofs.begin(), dof.n_locally_owned_dofs(), false);
- return;
- }
- else if (component_mask.n_selected_components(n_components(dof)) ==
- n_components(dof))
- {
- std::fill_n(selected_dofs.begin(), dof.n_locally_owned_dofs(), true);
- return;
- }
-
-
- // preset all values by false
- std::fill_n(selected_dofs.begin(), dof.n_locally_owned_dofs(), false);
-
- // get the component association of each DoF and then select the ones
- // that match the given set of blocks
- std::vector<unsigned char> dofs_by_component(dof.n_locally_owned_dofs());
- internal::get_component_association(dof, component_mask, dofs_by_component);
-
- for (types::global_dof_index i = 0; i < dof.n_locally_owned_dofs(); ++i)
- if (component_mask[dofs_by_component[i]] == true)
- selected_dofs[i] = true;
- }
-
-
- // TODO: Unify the following two functions with the non-hp case
-
- template <int dim, int spacedim>
+ template <int dim, int spacedim, typename DoFHandlerType>
void
- extract_dofs(const hp::DoFHandler<dim, spacedim> &dof,
- const ComponentMask & component_mask,
- std::vector<bool> & selected_dofs)
+ extract_dofs(const DoFHandlerType &dof,
+ const ComponentMask & component_mask,
+ std::vector<bool> & selected_dofs)
{
Assert(component_mask.represents_n_components(
dof.get_fe_collection().n_components()),
- template <int dim, int spacedim>
- void
- extract_dofs(const DoFHandler<dim, spacedim> &dof,
- const BlockMask & block_mask,
- std::vector<bool> & selected_dofs)
- {
- // simply forward to the function that works based on a component mask
- extract_dofs(dof, dof.get_fe().component_mask(block_mask), selected_dofs);
- }
-
-
-
- template <int dim, int spacedim>
+ template <int dim, int spacedim, typename DoFHandlerType>
void
- extract_dofs(const hp::DoFHandler<dim, spacedim> &dof,
- const BlockMask & block_mask,
- std::vector<bool> & selected_dofs)
+ extract_dofs(const DoFHandlerType &dof,
+ const BlockMask & block_mask,
+ std::vector<bool> & selected_dofs)
{
// simply forward to the function that works based on a component mask
- extract_dofs(dof, dof.get_fe().component_mask(block_mask), selected_dofs);
+ extract_dofs<dim, spacedim, DoFHandlerType>(
+ dof, dof.get_fe_collection().component_mask(block_mask), selected_dofs);
}
&patch);
template void
- extract_dofs<deal_II_dimension, deal_II_space_dimension>(
+ extract_dofs<deal_II_dimension,
+ deal_II_space_dimension,
+ DoFHandler<deal_II_dimension, deal_II_space_dimension>>(
const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const ComponentMask &,
std::vector<bool> &);
template void
- extract_dofs<deal_II_dimension, deal_II_space_dimension>(
+ extract_dofs<deal_II_dimension,
+ deal_II_space_dimension,
+ DoFHandler<deal_II_dimension, deal_II_space_dimension>>(
const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const BlockMask &,
std::vector<bool> &);
template void
- extract_dofs<deal_II_dimension, deal_II_space_dimension>(
+ extract_dofs<deal_II_dimension,
+ deal_II_space_dimension,
+ hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>(
const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const ComponentMask &,
std::vector<bool> &);
template void
- extract_dofs<deal_II_dimension, deal_II_space_dimension>(
+ extract_dofs<deal_II_dimension,
+ deal_II_space_dimension,
+ hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>(
const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const BlockMask &,
std::vector<bool> &);
{
std::vector<bool> mask(coarse_grid.get_fe(0).n_components(), false);
mask[coarse_component] = true;
- extract_dofs(coarse_grid, ComponentMask(mask), coarse_dof_is_parameter);
+ extract_dofs<dim, spacedim, DoFHandler<dim, spacedim>>(
+ coarse_grid, ComponentMask(mask), coarse_dof_is_parameter);
}
// now we know that the weights in each row constitute a constraint. enter
// only select first component
mask[0] = true;
- DoFTools::extract_dofs(dof_handler, ComponentMask(mask), selected_dofs);
+ DoFTools::extract_dofs<dim, dim, DoFHandler<dim>>(dof_handler,
+ ComponentMask(mask),
+ selected_dofs);
output_bool_vector(selected_dofs);
// also select last component
mask.back() = true;
- DoFTools::extract_dofs(dof_handler, ComponentMask(mask), selected_dofs);
+ DoFTools::extract_dofs<dim, dim, DoFHandler<dim>>(dof_handler,
+ ComponentMask(mask),
+ selected_dofs);
output_bool_vector(selected_dofs);
}
// only select first component
mask[0] = true;
- DoFTools::extract_dofs(dof_handler, ComponentMask(mask), selected_dofs);
+ DoFTools::extract_dofs<dim, dim, DoFHandlerType>(dof_handler,
+ ComponentMask(mask),
+ selected_dofs);
output_bool_vector(selected_dofs);
// also select last component
mask.back() = true;
- DoFTools::extract_dofs(dof_handler, ComponentMask(mask), selected_dofs);
+ DoFTools::extract_dofs<dim, dim, DoFHandlerType>(dof_handler,
+ ComponentMask(mask),
+ selected_dofs);
output_bool_vector(selected_dofs);
}
std::vector<bool> component_mask(dof_handler.get_fe().n_components(),
false);
component_mask[0] = true;
- DoFTools::extract_dofs(dof_handler,
- ComponentMask(component_mask),
- component_dofs);
+ DoFTools::extract_dofs<dim, dim, DoFHandler<dim>>(
+ dof_handler, ComponentMask(component_mask), component_dofs);
for (unsigned int i = 0; i < dof_data.size(); ++i)
if (component_dofs[i] == true)
std::vector<bool> component_mask(dof_handler.get_fe().n_components(),
false);
component_mask.back() = true;
- DoFTools::extract_dofs(dof_handler,
- ComponentMask(component_mask),
- component_dofs);
+ DoFTools::extract_dofs<dim, dim, DoFHandler<dim>>(
+ dof_handler, ComponentMask(component_mask), component_dofs);
for (unsigned int i = 0; i < dof_data.size(); ++i)
if (component_dofs[i] == true)
dof_data(i) = i + 1;
component_mask[c] = (int_mask & (1 << c));
std::vector<bool> dofs(dof.n_dofs());
- DoFTools::extract_dofs(dof, ComponentMask(component_mask), dofs);
+ DoFTools::extract_dofs<dim, dim, DoFHandler<dim>>(
+ dof, ComponentMask(component_mask), dofs);
for (unsigned int d = 0; d < dof.n_dofs(); ++d)
deallog << dofs[d];
component_mask[c] = (int_mask & (1 << c));
std::vector<bool> dofs(dof.n_dofs());
- DoFTools::extract_dofs(dof, ComponentMask(component_mask), dofs);
+ DoFTools::extract_dofs<dim, dim, hp::DoFHandler<dim>>(
+ dof, ComponentMask(component_mask), dofs);
for (unsigned int d = 0; d < dof.n_dofs(); ++d)
deallog << dofs[d];
component_mask[0] = true;
std::vector<bool> dofs(dof.n_dofs());
- DoFTools::extract_dofs(dof, ComponentMask(component_mask), dofs);
+ DoFTools::extract_dofs<dim, dim, DoFHandler<dim>>(
+ dof, ComponentMask(component_mask), dofs);
for (unsigned int d = 0; d < dof.n_dofs(); ++d)
deallog << dofs[d];
component_mask[comp] = true;
std::vector<bool> dofs(dof.n_dofs());
- DoFTools::extract_dofs(dof, ComponentMask(component_mask), dofs);
+ DoFTools::extract_dofs<dim, dim, DoFHandler<dim>>(
+ dof, ComponentMask(component_mask), dofs);
for (unsigned int d = 0; d < dof.n_dofs(); ++d)
deallog << dofs[d];
component_mask[c] = (int_mask & (1 << c));
std::vector<bool> dofs(dof.n_dofs());
- DoFTools::extract_dofs(dof, BlockMask(component_mask), dofs);
+ DoFTools::extract_dofs<dim, dim, DoFHandler<dim>>(
+ dof, BlockMask(component_mask), dofs);
for (unsigned int d = 0; d < dof.n_dofs(); ++d)
deallog << dofs[d];
component_mask[c] = (int_mask & (1 << c));
std::vector<bool> dofs(dof.n_dofs());
- DoFTools::extract_dofs(dof, BlockMask(component_mask), dofs);
+ DoFTools::extract_dofs<dim, dim, hp::DoFHandler<dim>>(
+ dof, BlockMask(component_mask), dofs);
for (unsigned int d = 0; d < dof.n_dofs(); ++d)
deallog << dofs[d];