dof_handler.distribute_mg_dofs();
// set up constraints
- IndexSet locally_relevant_dofs;
- DoFTools::extract_locally_relevant_dofs(dof_handler,
- locally_relevant_dofs);
- constraint.reinit(locally_relevant_dofs);
- VectorTools::interpolate_boundary_values(
- *mapping, dof_handler, 0, Functions::ZeroFunction<dim>(), constraint);
- DoFTools::make_hanging_node_constraints(dof_handler, constraint);
+ std::set<types::boundary_id> dirichlet_boundary;
+ dirichlet_boundary.insert(0);
+ MGConstrainedDoFs mg_constrained_dofs;
+ mg_constrained_dofs.initialize(dof_handler);
+ mg_constrained_dofs.make_zero_boundary_constraints(dof_handler,
+ dirichlet_boundary);
+
+ IndexSet relevant_dofs;
+ DoFTools::extract_locally_relevant_level_dofs(dof_handler,
+ 0 /*level*/,
+ relevant_dofs);
+ constraint.reinit(relevant_dofs);
+ constraint.add_lines(
+ mg_constrained_dofs.get_boundary_indices(0 /*level*/));
constraint.close();
// set up operator
- op.reinit(*mapping, dof_handler, *quad, constraint);
+ op.reinit(*mapping, dof_handler, *quad, constraint, 0 /*level*/);
}
// set up transfer operator
dof_handlers[l],
constraints[l + 1],
constraints[l],
- 0,
- 0);
+ 0 /*level*/,
+ 0 /*level*/);
MGTransferGlobalCoarsening<dim, VectorType> transfer(
transfers,
reinit(const Mapping<dim> & mapping,
const DoFHandler<dim> & dof_handler,
const Quadrature<dim> & quad,
- const AffineConstraints<number> &constraints)
+ const AffineConstraints<number> &constraints,
+ const unsigned int mg_level = numbers::invalid_unsigned_int)
{
// Clear internal data structures (if operator is reused).
this->system_matrix.clear();
// functions so that we only need to set the flag `update_gradients`.
typename MatrixFree<dim, number>::AdditionalData data;
data.mapping_update_flags = update_gradients;
+ data.mg_level = mg_level;
matrix_free.reinit(mapping, dof_handler, constraints, quad, data);
}