From 666154e901edec1d5c5d63b7d3c708211cbe8789 Mon Sep 17 00:00:00 2001 From: guido Date: Mon, 25 Apr 2005 19:09:42 +0000 Subject: [PATCH] vmult functions in Multigrid git-svn-id: https://svn.dealii.org/trunk@10575 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/deal.II/include/multigrid/multigrid.h | 28 +++++++++++++++++++ .../include/multigrid/multigrid.templates.h | 25 ++++++++++++++++- .../deal.II/source/multigrid/mg_dof_tools.cc | 4 ++- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/deal.II/deal.II/include/multigrid/multigrid.h b/deal.II/deal.II/include/multigrid/multigrid.h index 2de911c30d..a28eb4b136 100644 --- a/deal.II/deal.II/include/multigrid/multigrid.h +++ b/deal.II/deal.II/include/multigrid/multigrid.h @@ -174,6 +174,24 @@ class Multigrid : public Subscriptor */ void vmult(VECTOR& dst, const VECTOR& src) const; + /** + * @deprecated This function is + * purely experimental and will + * probably never be implemented + * in a way that it can be + * released. + * + * Perform a multigrid cycle with + * a vector which is already a + * level vector. Use of this + * function assumes that there is + * NO local refinement and that + * both vectors are on the finest + * level of this Multigrid + * object. + */ + void vmult_add(VECTOR& dst, const VECTOR& src) const; + /** * @deprecated Even worse than * vmult(), this function is not @@ -184,6 +202,16 @@ class Multigrid : public Subscriptor */ void Tvmult(VECTOR& dst, const VECTOR& src) const; + /** + * @deprecated Even worse than + * vmult(), this function is not + * even implemented, but just + * declared such that certain + * objects relying on it can be + * constructed. + */ + void Tvmult_add(VECTOR& dst, const VECTOR& src) const; + /** * Set additional matrices to * correct residual computation diff --git a/deal.II/deal.II/include/multigrid/multigrid.templates.h b/deal.II/deal.II/include/multigrid/multigrid.templates.h index 06c1c95b9f..33e6c803c8 100644 --- a/deal.II/deal.II/include/multigrid/multigrid.templates.h +++ b/deal.II/deal.II/include/multigrid/multigrid.templates.h @@ -345,9 +345,32 @@ Multigrid::vcycle() level_v_step (maxlevel); } + template void Multigrid::vmult(VECTOR& dst, const VECTOR& src) const +{ + Multigrid& mg = const_cast&>(*this); + mg.defect[maxlevel] = src; + mg.cycle(); + dst = mg.solution[maxlevel]; +} + + +template +void +Multigrid::vmult_add(VECTOR& dst, const VECTOR& src) const +{ + Multigrid& mg = const_cast&>(*this); + mg.defect[maxlevel] = src; + mg.cycle(); + dst += mg.solution[maxlevel]; +} + + +template +void +Multigrid::Tvmult(VECTOR&, const VECTOR&) const { Assert(false, ExcNotImplemented()); } @@ -355,7 +378,7 @@ Multigrid::vmult(VECTOR& dst, const VECTOR& src) const template void -Multigrid::Tvmult(VECTOR& dst, const VECTOR& src) const +Multigrid::Tvmult_add(VECTOR&, const VECTOR&) const { Assert(false, ExcNotImplemented()); } diff --git a/deal.II/deal.II/source/multigrid/mg_dof_tools.cc b/deal.II/deal.II/source/multigrid/mg_dof_tools.cc index 62a6a106b6..39e716efff 100644 --- a/deal.II/deal.II/source/multigrid/mg_dof_tools.cc +++ b/deal.II/deal.II/source/multigrid/mg_dof_tools.cc @@ -513,7 +513,9 @@ MGTools::count_dofs_per_component ( true); // finally sanity check - Assert (std::accumulate (result[l].begin(), + Assert (!dof_handler.get_fe().is_primitive() + || + std::accumulate (result[l].begin(), result[l].end(), 0U) == dof_handler.n_dofs(l), -- 2.39.5