From 50d1a5caa0e5dbcc409815496047c72cfca51474 Mon Sep 17 00:00:00 2001 From: Ralf Hartmann Date: Mon, 23 Jan 2006 12:28:35 +0000 Subject: [PATCH] Make the distribute_dofs and renumbering functions work on coarsened grids (i.e. unused vertices, faces and cells). Now tested with multigrid/renumbering_02 and _03. git-svn-id: https://svn.dealii.org/trunk@12124 0785d39b-7218-0410-832d-ea1e28bc413d --- .../source/multigrid/mg_dof_handler.cc | 106 ++++++++++++------ 1 file changed, 70 insertions(+), 36 deletions(-) diff --git a/deal.II/deal.II/source/multigrid/mg_dof_handler.cc b/deal.II/deal.II/source/multigrid/mg_dof_handler.cc index 272c2367b5..af4b61377a 100644 --- a/deal.II/deal.II/source/multigrid/mg_dof_handler.cc +++ b/deal.II/deal.II/source/multigrid/mg_dof_handler.cc @@ -1592,9 +1592,12 @@ void MGDoFHandler<1>::renumber_dofs (const unsigned int level, for (std::vector::iterator i=mg_levels[level]->line_dofs.begin(); i!=mg_levels[level]->line_dofs.end(); ++i) { - Assert (*i != DoFHandler<1>::invalid_dof_index, ExcInternalError()); - *i = new_numbers[*i]; - }; + if (*i != DoFHandler<1>::invalid_dof_index) + { + Assert(*i::renumber_dofs (const unsigned int level, for (std::vector::iterator i=mg_levels[level]->line_dofs.begin(); i!=mg_levels[level]->line_dofs.end(); ++i) { - Assert (*i != DoFHandler<2>::invalid_dof_index, ExcInternalError()); - *i = new_numbers[*i]; - }; + if (*i != DoFHandler<2>::invalid_dof_index) + { + Assert(*i::iterator i=mg_levels[level]->quad_dofs.begin(); i!=mg_levels[level]->quad_dofs.end(); ++i) { - Assert (*i != DoFHandler<2>::invalid_dof_index, ExcInternalError()); - *i = new_numbers[*i]; - }; + if (*i != DoFHandler<2>::invalid_dof_index) + { + Assert(*i::renumber_dofs (const unsigned int level, for (std::vector::iterator i=mg_levels[level]->line_dofs.begin(); i!=mg_levels[level]->line_dofs.end(); ++i) { - Assert (*i != DoFHandler<3>::invalid_dof_index, ExcInternalError()); - *i = new_numbers[*i]; - }; + if (*i != DoFHandler<3>::invalid_dof_index) + { + Assert(*i::iterator i=mg_levels[level]->quad_dofs.begin(); i!=mg_levels[level]->quad_dofs.end(); ++i) { - Assert (*i != DoFHandler<3>::invalid_dof_index, ExcInternalError()); - *i = new_numbers[*i]; - }; + if (*i != DoFHandler<3>::invalid_dof_index) + { + Assert(*i::iterator i=mg_levels[level]->hex_dofs.begin(); i!=mg_levels[level]->hex_dofs.end(); ++i) { - Assert (*i != DoFHandler<3>::invalid_dof_index, ExcInternalError()); - *i = new_numbers[*i]; - }; + if (*i != DoFHandler<3>::invalid_dof_index) + { + Assert(*i::reserve_space () { // now allocate the needed space for (unsigned int vertex=0; vertextria->vertices.size(); ++vertex) - { -//TODO:[WB,GK] These conditions are violated on unused vertices - Assert (min_level[vertex] < this->tria->n_levels(), ExcInternalError()); - Assert (max_level[vertex] >= min_level[vertex], ExcInternalError()); - - mg_vertex_dofs[vertex].init (min_level[vertex], - max_level[vertex], - this->selected_fe->dofs_per_vertex); - }; + if (this->tria->vertices_used[vertex]) + { + Assert (min_level[vertex] < this->tria->n_levels(), ExcInternalError()); + Assert (max_level[vertex] >= min_level[vertex], ExcInternalError()); + + mg_vertex_dofs[vertex].init (min_level[vertex], + max_level[vertex], + this->get_fe().dofs_per_vertex); + } + else + { + Assert (min_level[vertex] == this->tria->n_levels(), ExcInternalError()); + Assert (max_level[vertex] == 0, ExcInternalError()); + + // reset to original state + mg_vertex_dofs[vertex].init (1, 0, 0); + } } #endif @@ -1910,15 +1936,23 @@ void MGDoFHandler<3>::reserve_space () { // now allocate the needed space for (unsigned int vertex=0; vertextria->vertices.size(); ++vertex) - { -//TODO:[WB,GK] These conditions are violated on unused vertices - Assert (min_level[vertex] < this->tria->n_levels(), ExcInternalError()); - Assert (max_level[vertex] >= min_level[vertex], ExcInternalError()); - - mg_vertex_dofs[vertex].init (min_level[vertex], - max_level[vertex], - this->selected_fe->dofs_per_vertex); - }; + if (this->tria->vertices_used[vertex]) + { + Assert (min_level[vertex] < this->tria->n_levels(), ExcInternalError()); + Assert (max_level[vertex] >= min_level[vertex], ExcInternalError()); + + mg_vertex_dofs[vertex].init (min_level[vertex], + max_level[vertex], + this->get_fe().dofs_per_vertex); + } + else + { + Assert (min_level[vertex] == this->tria->n_levels(), ExcInternalError()); + Assert (max_level[vertex] == 0, ExcInternalError()); + + // reset to original state + mg_vertex_dofs[vertex].init (1, 0, 0); + } } #endif -- 2.39.5