From f1b85ef109843c5c2078439aa562107db230d745 Mon Sep 17 00:00:00 2001 From: kanschat Date: Tue, 27 Feb 2007 22:06:14 +0000 Subject: [PATCH] add function for xomputing permutation vectors git-svn-id: https://svn.dealii.org/trunk@14516 0785d39b-7218-0410-832d-ea1e28bc413d --- .../deal.II/include/dofs/dof_renumbering.h | 62 ++++++++- .../deal.II/source/dofs/dof_renumbering.cc | 120 +++++++++++++++--- 2 files changed, 164 insertions(+), 18 deletions(-) diff --git a/deal.II/deal.II/include/dofs/dof_renumbering.h b/deal.II/deal.II/include/dofs/dof_renumbering.h index 7aabd175af..00f9c250e0 100644 --- a/deal.II/deal.II/include/dofs/dof_renumbering.h +++ b/deal.II/deal.II/include/dofs/dof_renumbering.h @@ -2,7 +2,7 @@ // $Id$ // Version: $Name$ // -// Copyright (C) 2003, 2004, 2005, 2006 by the deal.II authors +// Copyright (C) 2003, 2004, 2005, 2006, 2007 by the deal.II authors // // This file is subject to QPL and may not be distributed // without copyright and license information. Please refer @@ -417,7 +417,8 @@ class DoFRenumbering */ template static void - compute_cell_wise_dg (std::vector &new_dof_indices, + compute_cell_wise_dg (std::vector& renumbering, + std::vector& inverse_renumbering, const DH &dof_handler, const std::vector &cell_order); @@ -433,6 +434,23 @@ class DoFRenumbering const unsigned int level, const std::vector::cell_iterator> &cell_order); + /** + * Computes the renumbering + * vector needed by the + * cell_wise_dg() level renumbering function. Does + * not perform the renumbering on + * the MGDoFHandler dofs but + * returns the renumbering + * vector. + */ + template + static void + compute_cell_wise_dg (std::vector& renumbering, + std::vector& inverse_renumbering, + const MGDoFHandler& dof_handler, + const unsigned int level, + const std::vector::cell_iterator>& cell_order); + /** * Cell-wise downstream numbering @@ -480,6 +498,13 @@ class DoFRenumbering const Point &direction); /** + * @deprecated The new function + * of this name computes the + * renumbering and its inverse at + * the same time. So, at least if + * you need both, you should use + * the other one. + * * Computes the renumbering * vector needed by the * downstream_dg() function. Does @@ -494,6 +519,39 @@ class DoFRenumbering const DH& dof_handler, const Point& direction); + /** + * Computes the renumbering + * vector needed by the + * downstream_dg() function. Does + * not perform the renumbering on + * the DoFHandler dofs but + * returns the renumbering + * vector. + */ + template + static void + compute_downstream_dg (std::vector& new_dof_indices, + std::vector& reverse, + const DH& dof_handler, + const Point& direction); + + /** + * Computes the renumbering + * vector needed by the + * downstream_dg() function. Does + * not perform the renumbering on + * the MGDoFHandler dofs but + * returns the renumbering + * vector. + */ + template + static void + compute_downstream_dg (std::vector& new_dof_indices, + std::vector& reverse, + const MGDoFHandler& dof_handler, + const unsigned int level, + const Point& direction); + //TODO:[GK] Documentation! /** * Cell-wise clockwise numbering. diff --git a/deal.II/deal.II/source/dofs/dof_renumbering.cc b/deal.II/deal.II/source/dofs/dof_renumbering.cc index e5e4efcf35..be8047068c 100644 --- a/deal.II/deal.II/source/dofs/dof_renumbering.cc +++ b/deal.II/deal.II/source/dofs/dof_renumbering.cc @@ -882,7 +882,8 @@ DoFRenumbering::cell_wise_dg ( const std::vector& cells) { std::vector renumbering(dof.n_dofs()); - compute_cell_wise_dg(renumbering, dof, cells); + std::vector reverse(dof.n_dofs()); + compute_cell_wise_dg(renumbering, reverse, dof, cells); dof.renumber_dofs(renumbering); } @@ -893,6 +894,7 @@ template void DoFRenumbering::compute_cell_wise_dg ( std::vector& new_indices, + std::vector& reverse, const DH& dof, const typename std::vector& cells) { @@ -907,8 +909,9 @@ DoFRenumbering::compute_cell_wise_dg ( Assert(new_indices.size() == n_global_dofs, ExcDimensionMismatch(new_indices.size(), n_global_dofs)); - std::vector reverse(new_indices.size()); - + Assert(reverse.size() == n_global_dofs, + ExcDimensionMismatch(reverse.size(), n_global_dofs)); + std::vector cell_dofs; unsigned int global_index = 0; @@ -950,6 +953,22 @@ void DoFRenumbering::cell_wise_dg ( MGDoFHandler& dof, const unsigned int level, const typename std::vector::cell_iterator>& cells) +{ + std::vector renumbering(dof.n_dofs(level)); + std::vector reverse(dof.n_dofs(level)); + + compute_cell_wise_dg(renumbering, reverse, dof, level, cells); + dof.renumber_dofs(level, reverse); +} + + +template +void DoFRenumbering::compute_cell_wise_dg ( + std::vector& new_order, + std::vector& reverse, + const MGDoFHandler& dof, + const unsigned int level, + const typename std::vector::cell_iterator>& cells) { Assert(cells.size() == dof.get_tria().n_cells(level), ExcDimensionMismatch(cells.size(), @@ -966,13 +985,17 @@ void DoFRenumbering::cell_wise_dg ( Assert(dof.get_fe().n_dofs_per_vertex()==0, ExcNotDGFEM()); } - + + Assert (new_order.size() == dof.n_dofs(level), + ExcDimensionMismatch(new_order.size(), dof.n_dofs(level))); + Assert (reverse.size() == dof.n_dofs(level), + ExcDimensionMismatch(reverse.size(), dof.n_dofs(level))); + unsigned int n_global_dofs = dof.n_dofs(level); unsigned int n_cell_dofs = dof.get_fe().n_dofs_per_cell(); - - std::vector new_order(n_global_dofs); + std::vector cell_dofs(n_cell_dofs); - + unsigned int global_index = 0; typename std::vector::cell_iterator>::const_iterator cell; @@ -991,12 +1014,8 @@ void DoFRenumbering::cell_wise_dg ( } Assert(global_index == n_global_dofs, ExcRenumberingIncomplete()); - std::vector reverse(new_order.size()); - for (unsigned int i=0;i reverse(new_indices.size()); + compute_cell_wise_dg(new_indices, reverse, dof, ordered_cells); +} + + +template +void +DoFRenumbering::compute_downstream_dg ( + std::vector& new_indices, + std::vector& reverse, + const DH& dof, + const Point& direction) +{ + std::vector + ordered_cells(dof.get_tria().n_active_cells()); + const CompareDownstream comparator(direction); + + typename DH::active_cell_iterator begin = dof.begin_active(); + typename DH::active_cell_iterator end = dof.end(); + + copy (begin, end, ordered_cells.begin()); + sort (ordered_cells.begin(), ordered_cells.end(), comparator); + + compute_cell_wise_dg(new_indices, reverse, dof, ordered_cells); } @@ -1053,6 +1095,29 @@ void DoFRenumbering::downstream_dg (MGDoFHandler& dof, } +template +void +DoFRenumbering::compute_downstream_dg ( + std::vector& new_indices, + std::vector& reverse, + const MGDoFHandler& dof, + const unsigned int level, + const Point& direction) +{ + std::vector::cell_iterator> + ordered_cells(dof.get_tria().n_cells(level)); + const CompareDownstream comparator(direction); + + typename MGDoFHandler::cell_iterator begin = dof.begin(level); + typename MGDoFHandler::cell_iterator end = dof.end(level); + + copy (begin, end, ordered_cells.begin()); + sort (ordered_cells.begin(), ordered_cells.end(), comparator); + + compute_cell_wise_dg(new_indices, reverse, dof, level, ordered_cells); +} + + /** * Provide comparator for DoFCellAccessors @@ -1127,7 +1192,8 @@ DoFRenumbering::compute_clockwise_dg ( copy (begin, end, ordered_cells.begin()); sort (ordered_cells.begin(), ordered_cells.end(), comparator); - compute_cell_wise_dg(new_indices, dof, ordered_cells); + std::vector reverse(new_indices.size()); + compute_cell_wise_dg(new_indices, reverse, dof, ordered_cells); } @@ -1314,7 +1380,7 @@ DoFRenumbering::cell_wise_dg > template void DoFRenumbering::compute_cell_wise_dg > -(std::vector&, +(std::vector&, std::vector&, const DoFHandler&, const std::vector::cell_iterator>&); @@ -1327,6 +1393,12 @@ DoFRenumbering::downstream_dg > template void DoFRenumbering::compute_downstream_dg > +(std::vector&,std::vector&, + const DoFHandler&, + const Point&); +template +void +DoFRenumbering::compute_downstream_dg > (std::vector&, const DoFHandler&, const Point&); @@ -1356,7 +1428,7 @@ DoFRenumbering::cell_wise_dg > template void DoFRenumbering::compute_cell_wise_dg > -(std::vector&, +(std::vector&, std::vector&, const hp::DoFHandler&, const std::vector::cell_iterator>&); @@ -1369,6 +1441,12 @@ DoFRenumbering::downstream_dg > template void DoFRenumbering::compute_downstream_dg > +(std::vector&,std::vector&, + const hp::DoFHandler&, + const Point&); +template +void +DoFRenumbering::compute_downstream_dg > (std::vector&, const hp::DoFHandler&, const Point&); @@ -1469,5 +1547,15 @@ void DoFRenumbering::cell_wise_dg (MGDoFHandler&, const unsigned int, const std::vector::cell_iterator>&); +template +void DoFRenumbering::compute_cell_wise_dg +(std::vector&, std::vector&, + const MGDoFHandler&, const unsigned int, + const std::vector::cell_iterator>&); +template +void DoFRenumbering::compute_downstream_dg +(std::vector&, std::vector&, + const MGDoFHandler&, const unsigned int, + const Point&); DEAL_II_NAMESPACE_CLOSE -- 2.39.5