bool is_boundary_index (const unsigned int level,
const unsigned int index) const;
+ /**
+ * Determine whether a dof index
+ * is at an edge that is not
+ * a refinement edge.
+ */
+ bool non_refinement_edge_index (const unsigned int level,
+ const unsigned int index) const;
+
/**
* Determine whether a dof index
* is at the refinement edge.
const std::vector<std::set<unsigned int> > &
get_boundary_indices () const;
+ /**
+ * Return the indices of dofs for each
+ * level that lie on the boundary of the
+ * domain.
+ */
+ const std::vector<std::set<unsigned int> > &
+ get_non_refinement_edge_indices () const;
+
/**
* Return the indices of dofs for each
* level that lie on the refinement edge
*/
std::vector<std::set<unsigned int> > boundary_indices;
+ /**
+ * The degrees of freedom on egdges
+ * that are not a
+ * refinement edge between a
+ * level and coarser cells.
+ */
+ std::vector<std::set<unsigned int> > non_refinement_edge_indices;
+
/**
* The degrees of freedom on the
* refinement edge between a
const unsigned int nlevels = dof.get_tria().n_levels();
refinement_edge_indices.resize(nlevels);
refinement_edge_boundary_indices.resize(nlevels);
+ non_refinement_edge_indices.resize(nlevels);
for(unsigned int l=0; l<nlevels; ++l)
{
refinement_edge_indices[l].resize(dof.n_dofs(l));
}
MGTools::extract_inner_interface_dofs (dof, refinement_edge_indices,
refinement_edge_boundary_indices);
+
+ MGTools::extract_non_interface_dofs (dof, non_refinement_edge_indices);
}
boundary_indices.resize(nlevels);
refinement_edge_indices.resize(nlevels);
refinement_edge_boundary_indices.resize(nlevels);
+ non_refinement_edge_indices.resize(nlevels);
for(unsigned int l=0; l<nlevels; ++l)
{
MGTools::make_boundary_list (dof, function_map, boundary_indices, component_mask);
MGTools::extract_inner_interface_dofs (dof, refinement_edge_indices,
refinement_edge_boundary_indices);
+ MGTools::extract_non_interface_dofs (dof, non_refinement_edge_indices);
}
for(unsigned int l=0; l<refinement_edge_boundary_indices.size(); ++l)
refinement_edge_boundary_indices[l].clear();
+
+ for(unsigned int l=0; l<non_refinement_edge_indices.size(); ++l)
+ non_refinement_edge_indices[l].clear();
}
return false;
}
+inline
+bool
+MGConstrainedDoFs::non_refinement_edge_index (const unsigned int level,
+ const unsigned int index) const
+{
+ AssertIndexRange(level, non_refinement_edge_indices.size());
+
+ if(non_refinement_edge_indices[level].find(index) != non_refinement_edge_indices[level].end())
+ return true;
+ else
+ return false;
+}
inline
bool
return boundary_indices;
}
+inline
+const std::vector<std::set<unsigned int> > &
+MGConstrainedDoFs::get_non_refinement_edge_indices () const
+{
+ return non_refinement_edge_indices;
+}
+
inline
const std::vector<std::vector<bool> > &
MGConstrainedDoFs::get_refinement_edge_indices () const