From: Guido Kanschat Date: Wed, 21 Dec 2005 13:29:46 +0000 (+0000) Subject: implement downwind renumbering for hpDoFHandler X-Git-Tag: v8.0.0~12747 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=44d80b2ac4b9706423921edde330636870fccab6;p=dealii.git implement downwind renumbering for hpDoFHandler git-svn-id: https://svn.dealii.org/trunk@11908 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/deal.II/include/dofs/dof_renumbering.h b/deal.II/deal.II/include/dofs/dof_renumbering.h index 0895c3666e..c4dbd2087a 100644 --- a/deal.II/deal.II/include/dofs/dof_renumbering.h +++ b/deal.II/deal.II/include/dofs/dof_renumbering.h @@ -400,10 +400,10 @@ class DoFRenumbering * freedom have to be associated * with the interior of the cell. */ - template + template static void - cell_wise_dg (DoFHandler &dof_handler, - const std::vector::cell_iterator> &cell_order); + cell_wise_dg (DH &dof_handler, + const std::vector &cell_order); /** * Computes the renumbering @@ -414,11 +414,11 @@ class DoFRenumbering * returns the renumbering * vector. */ - template + template static void compute_cell_wise_dg (std::vector &new_dof_indices, - const DoFHandler &dof_handler, - const std::vector::cell_iterator> &cell_order); + const DH &dof_handler, + const std::vector &cell_order); /** * Cell-wise renumbering on one @@ -460,10 +460,10 @@ class DoFRenumbering * have to be associated with the * interior of the cell. */ - template + template static void - downstream_dg (DoFHandler &dof_handler, - const Point &direction); + downstream_dg (DH& dof_handler, + const Point& direction); /** * Cell-wise downstream numbering @@ -487,11 +487,11 @@ class DoFRenumbering * returns the renumbering * vector. */ - template + template static void - compute_downstream_dg (std::vector &new_dof_indices, - const DoFHandler &dof_handler, - const Point &direction); + compute_downstream_dg (std::vector& new_dof_indices, + const DH& dof_handler, + const Point& direction); //TODO:[GK] Documentation! /** diff --git a/deal.II/deal.II/source/dofs/dof_renumbering.cc b/deal.II/deal.II/source/dofs/dof_renumbering.cc index 0fc9d0a042..6de4a8dd8f 100644 --- a/deal.II/deal.II/source/dofs/dof_renumbering.cc +++ b/deal.II/deal.II/source/dofs/dof_renumbering.cc @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -120,9 +121,10 @@ struct CompareDownstream {} /** * Return true if c1 < c2. - */ - bool operator () (const typename DoFHandler::cell_iterator &c1, - const typename DoFHandler::cell_iterator &c2) const + */ + template + bool operator () (const DHCellIterator &c1, + const DHCellIterator &c2) const { const Point diff = c2->center() - c1->center(); return (diff*dir > 0); @@ -870,11 +872,11 @@ DoFRenumbering::compute_sort_selected_dofs_back ( -template +template void DoFRenumbering::cell_wise_dg ( - DoFHandler& dof, - const typename std::vector::cell_iterator>& cells) + DH& dof, + const typename std::vector& cells) { std::vector renumbering(dof.n_dofs()); compute_cell_wise_dg(renumbering, dof, cells); @@ -884,31 +886,18 @@ DoFRenumbering::cell_wise_dg ( -template +template void DoFRenumbering::compute_cell_wise_dg ( std::vector& new_indices, - const DoFHandler& dof, - const typename std::vector::cell_iterator>& cells) + const DH& dof, + const typename std::vector& cells) { Assert(cells.size() == dof.get_tria().n_active_cells(), ExcDimensionMismatch(cells.size(), dof.get_tria().n_active_cells())); - switch (dim) - { - case 3: - Assert(dof.get_fe().n_dofs_per_quad()==0, - ExcNotDGFEM()); - case 2: - Assert(dof.get_fe().n_dofs_per_line()==0, - ExcNotDGFEM()); - default: - Assert(dof.get_fe().n_dofs_per_vertex()==0, - ExcNotDGFEM()); - } unsigned int n_global_dofs = dof.n_dofs(); - unsigned int n_cell_dofs = dof.get_fe().n_dofs_per_cell(); // Actually, we compute the inverse of the reordering vector, called reverse here. // Later, irs inverse is computed into new_indices, which is the return argument. @@ -917,14 +906,22 @@ DoFRenumbering::compute_cell_wise_dg ( ExcDimensionMismatch(new_indices.size(), n_global_dofs)); std::vector reverse(new_indices.size()); - std::vector cell_dofs(n_cell_dofs); + std::vector cell_dofs; unsigned int global_index = 0; - typename std::vector::cell_iterator>::const_iterator cell; + typename std::vector::const_iterator cell; for(cell = cells.begin(); cell != cells.end(); ++cell) { + Assert((*cell)->get_fe().n_dofs_per_face()==0, ExcNotDGFEM()); + // Determine the number of dofs + // on this cell and reinit the + // vector storing these + // numbers. + unsigned int n_cell_dofs = (*cell)->get_fe().n_dofs_per_cell(); + cell_dofs.resize(n_cell_dofs); + (*cell)->get_dof_indices(cell_dofs); // Sort here to make sure that @@ -1001,10 +998,9 @@ void DoFRenumbering::cell_wise_dg ( -template +template void -DoFRenumbering::downstream_dg (DoFHandler& dof, - const Point& direction) +DoFRenumbering::downstream_dg (DH& dof, const Point& direction) { std::vector renumbering(dof.n_dofs()); compute_downstream_dg(renumbering, dof, direction); @@ -1014,19 +1010,19 @@ DoFRenumbering::downstream_dg (DoFHandler& dof, -template +template void DoFRenumbering::compute_downstream_dg ( std::vector& new_indices, - const DoFHandler& dof, + const DH& dof, const Point& direction) { - std::vector::cell_iterator> + std::vector ordered_cells(dof.get_tria().n_active_cells()); const CompareDownstream comparator(direction); - typename DoFHandler::active_cell_iterator begin = dof.begin_active(); - typename DoFHandler::active_cell_iterator end = dof.end(); + 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); @@ -1301,33 +1297,64 @@ void DoFRenumbering::component_wise (MGDoFHandler&, const std::vector&); +// DG renumbering for DoFHandler template void -DoFRenumbering::cell_wise_dg +DoFRenumbering::cell_wise_dg (DoFHandler&, const std::vector::cell_iterator>&); template void -DoFRenumbering::compute_cell_wise_dg +DoFRenumbering::compute_cell_wise_dg (std::vector&, const DoFHandler&, const std::vector::cell_iterator>&); template void -DoFRenumbering::downstream_dg +DoFRenumbering::downstream_dg (DoFHandler&, const Point&); template void -DoFRenumbering::compute_downstream_dg +DoFRenumbering::compute_downstream_dg (std::vector&, const DoFHandler&, const Point&); +// DG renumbering for hpDoFHandler + +template +void +DoFRenumbering::cell_wise_dg +(hpDoFHandler&, + const std::vector::cell_iterator>&); + +template +void +DoFRenumbering::compute_cell_wise_dg +(std::vector&, + const hpDoFHandler&, + const std::vector::cell_iterator>&); + +template +void +DoFRenumbering::downstream_dg +(hpDoFHandler&, + const Point&); + +template +void +DoFRenumbering::compute_downstream_dg +(std::vector&, + const hpDoFHandler&, + const Point&); + +// MG + template void DoFRenumbering::downstream_dg (MGDoFHandler&,