From: guido Date: Wed, 14 Aug 2002 09:34:26 +0000 (+0000) Subject: MGTransfer base class reintroduced as template X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=40953a3e4ce6c17fc5ae58978ef570820a3cc91c;p=dealii-svn.git MGTransfer base class reintroduced as template git-svn-id: https://svn.dealii.org/trunk@6325 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/deal.II/include/multigrid/mg_base.h b/deal.II/deal.II/include/multigrid/mg_base.h index 187eb4e1f0..fe070b9e0d 100644 --- a/deal.II/deal.II/include/multigrid/mg_base.h +++ b/deal.II/deal.II/include/multigrid/mg_base.h @@ -165,64 +165,64 @@ class MGCoarseGridLACIteration : public Subscriptor * context. This class is an abstract one and has no implementations of * possible algorithms for these operations. * - * @author Wolfgang Bangerth, Guido Kanschat, 1999 + * @author Wolfgang Bangerth, Guido Kanschat, 1999, 2002 */ -// template -// class MGTransferBase : public Subscriptor -// { -// public: -// /** -// * Destructor. Does nothing here, but -// * needs to be declared virtual anyway. -// */ -// virtual ~MGTransferBase(); - -// /** -// * Prolongate a vector from level -// * @p{to_level-1} to level -// * @p{to_level}. The previous -// * content of @p{dst} is -// * overwritten. -// * -// * @p{src} is assumed to be a vector with -// * as many elements as there are degrees -// * of freedom on the coarser level of -// * the two involved levels, while @p{src} -// * shall have as many elements as there -// * are degrees of freedom on the finer -// * level. -// */ -// virtual void prolongate (const unsigned int to_level, -// VECTOR& dst, -// const VECTOR& src) const = 0; - -// /** -// * Restrict a vector from level -// * @p{from_level} to level -// * @p{from_level-1} and add this -// * restriction to -// * @p{dst}. Obviously, if the -// * refined region on level -// * @p{from_level} is smaller than -// * that on level @p{from_level-1}, -// * some degrees of freedom in -// * @p{dst} are not covered and will -// * not be altered. For the other -// * degress of freedom, the result -// * of the restriction is added. -// * -// * @p{src} is assumed to be a vector with -// * as many elements as there are degrees -// * of freedom on the finer level of -// * the two involved levels, while @p{src} -// * shall have as many elements as there -// * are degrees of freedom on the coarser -// * level. -// */ -// virtual void restrict_and_add (const unsigned int from_level, -// VECTOR& dst, -// const VECTOR& src) const = 0; -// }; + template + class MGTransfer : public Subscriptor + { + public: + /** + * Destructor. Does nothing here, but + * needs to be declared virtual anyway. + */ + virtual ~MGTransfer(); + + /** + * Prolongate a vector from level + * @p{to_level-1} to level + * @p{to_level}. The previous + * content of @p{dst} is + * overwritten. + * + * @p{src} is assumed to be a vector with + * as many elements as there are degrees + * of freedom on the coarser level of + * the two involved levels, while @p{src} + * shall have as many elements as there + * are degrees of freedom on the finer + * level. + */ + virtual void prolongate (const unsigned int to_level, + VECTOR& dst, + const VECTOR& src) const = 0; + + /** + * Restrict a vector from level + * @p{from_level} to level + * @p{from_level-1} and add this + * restriction to + * @p{dst}. Obviously, if the + * refined region on level + * @p{from_level} is smaller than + * that on level @p{from_level-1}, + * some degrees of freedom in + * @p{dst} are not covered and will + * not be altered. For the other + * degress of freedom, the result + * of the restriction is added. + * + * @p{src} is assumed to be a vector with + * as many elements as there are degrees + * of freedom on the finer level of + * the two involved levels, while @p{src} + * shall have as many elements as there + * are degrees of freedom on the coarser + * level. + */ + virtual void restrict_and_add (const unsigned int from_level, + VECTOR& dst, + const VECTOR& src) const = 0; + }; diff --git a/deal.II/deal.II/include/multigrid/mg_tools.templates.h b/deal.II/deal.II/include/multigrid/mg_tools.templates.h index c6e9ef8e03..efeb9e2f15 100644 --- a/deal.II/deal.II/include/multigrid/mg_tools.templates.h +++ b/deal.II/deal.II/include/multigrid/mg_tools.templates.h @@ -26,11 +26,13 @@ //TODO:[?] This function needs to be specially implemented, since in 2d mode we use faces #if deal_II_dimension == 1 +template template void -MGTransferPrebuilt::copy_to_mg (const MGDoFHandler&, - MGLevelObject >&, - const InVector&) const +MGTransferPrebuilt::copy_to_mg ( + const MGDoFHandler&, + MGLevelObject >&, + const InVector&) const { Assert(false, ExcNotImplemented()); } @@ -38,11 +40,13 @@ MGTransferPrebuilt::copy_to_mg (const MGDoFHandler&, #else +template template void -MGTransferPrebuilt::copy_to_mg (const MGDoFHandler& mg_dof_handler, - MGLevelObject >& dst, - const InVector& src) const +MGTransferPrebuilt::copy_to_mg ( + const MGDoFHandler& mg_dof_handler, + MGLevelObject >& dst, + const InVector& src) const { // Make src a real finite element function @@ -136,11 +140,13 @@ MGTransferPrebuilt::copy_to_mg (const MGDoFHandler& mg_dof_handler, #endif +template template void -MGTransferPrebuilt::copy_from_mg(const MGDoFHandler& mg_dof_handler, - OutVector &dst, - const MGLevelObject > &src) const +MGTransferPrebuilt::copy_from_mg( + const MGDoFHandler& mg_dof_handler, + OutVector &dst, + const MGLevelObject > &src) const { const unsigned int dofs_per_cell = mg_dof_handler.get_fe().dofs_per_cell; @@ -180,11 +186,13 @@ MGTransferPrebuilt::copy_from_mg(const MGDoFHandler& mg_dof_handler, //TODO:[GK] constraints->set_zero(dst); } +template template void -MGTransferPrebuilt::copy_from_mg_add(const MGDoFHandler& mg_dof_handler, - OutVector &dst, - const MGLevelObject > &src) const +MGTransferPrebuilt::copy_from_mg_add( + const MGDoFHandler& mg_dof_handler, + OutVector &dst, + const MGLevelObject > &src) const { const unsigned int dofs_per_cell = mg_dof_handler.get_fe().dofs_per_cell; @@ -230,11 +238,13 @@ MGTransferPrebuilt::copy_from_mg_add(const MGDoFHandler& mg_dof_handler, //TODO:[?] This function needs to be specially implemented, since in 2d mode we use faces #if deal_II_dimension == 1 +template template void -MGTransferSelect::copy_to_mg (const MGDoFHandler&, - MGLevelObject >&, - const InVector&) const +MGTransferSelect::copy_to_mg ( + const MGDoFHandler&, + MGLevelObject >&, + const InVector&) const { Assert(false, ExcNotImplemented()); } @@ -242,11 +252,13 @@ MGTransferSelect::copy_to_mg (const MGDoFHandler&, #else +template template void -MGTransferSelect::copy_to_mg (const MGDoFHandler& mg_dof_handler, - MGLevelObject >& dst, - const InVector& osrc) const +MGTransferSelect::copy_to_mg ( + const MGDoFHandler& mg_dof_handler, + MGLevelObject >& dst, + const InVector& osrc) const { // Make src a real finite element function InVector src = osrc; @@ -353,11 +365,13 @@ MGTransferSelect::copy_to_mg (const MGDoFHandler& mg_dof_handler, #endif +template template void -MGTransferSelect::copy_from_mg(const MGDoFHandler& mg_dof_handler, - OutVector &dst, - const MGLevelObject > &src) const +MGTransferSelect::copy_from_mg( + const MGDoFHandler& mg_dof_handler, + OutVector &dst, + const MGLevelObject > &src) const { const FiniteElement& fe = mg_dof_handler.get_fe(); @@ -409,11 +423,13 @@ MGTransferSelect::copy_from_mg(const MGDoFHandler& mg_dof_handler, //TODO:[GK] constraints->set_zero(dst); } +template template void -MGTransferSelect::copy_from_mg_add(const MGDoFHandler& mg_dof_handler, - OutVector &dst, - const MGLevelObject > &src) const +MGTransferSelect::copy_from_mg_add( + const MGDoFHandler& mg_dof_handler, + OutVector &dst, + const MGLevelObject > &src) const { const FiniteElement& fe = mg_dof_handler.get_fe(); diff --git a/deal.II/deal.II/include/multigrid/mg_transfer.h b/deal.II/deal.II/include/multigrid/mg_transfer.h index f76a4e8d65..61b2163230 100644 --- a/deal.II/deal.II/include/multigrid/mg_transfer.h +++ b/deal.II/deal.II/include/multigrid/mg_transfer.h @@ -29,9 +29,10 @@ template class MGDoFHandler; * once by looping over all cells and storing the result in a matrix for * each level, but requires additional memory. * - * @author Wolfgang Bangerth, Guido Kanschat, 1999 + * @author Wolfgang Bangerth, Guido Kanschat, 1999, 2000, 2001, 2002 */ -class MGTransferPrebuilt : public Subscriptor // MGTransferBase > +template +class MGTransferPrebuilt : public MGTransfer > { public: /** @@ -62,8 +63,8 @@ class MGTransferPrebuilt : public Subscriptor // MGTransferBase > * level. */ virtual void prolongate (const unsigned int to_level, - Vector &dst, - const Vector &src) const; + Vector &dst, + const Vector &src) const; /** * Restrict a vector from level @@ -89,8 +90,8 @@ class MGTransferPrebuilt : public Subscriptor // MGTransferBase > * level. */ virtual void restrict_and_add (const unsigned int from_level, - Vector &dst, - const Vector &src) const; + Vector &dst, + const Vector &src) const; /** * Transfer from a vector on the @@ -101,7 +102,7 @@ class MGTransferPrebuilt : public Subscriptor // MGTransferBase > template void copy_to_mg (const MGDoFHandler& mg_dof, - MGLevelObject > &dst, + MGLevelObject > &dst, const InVector &src) const; /** @@ -111,7 +112,7 @@ class MGTransferPrebuilt : public Subscriptor // MGTransferBase > * Copies data from active * portions of an MGVector into * the respective positions of a - * @p{Vector}. In order to + * @p{Vector}. In order to * keep the result consistent, * constrained degrees of freedom * are set to zero. @@ -120,7 +121,7 @@ class MGTransferPrebuilt : public Subscriptor // MGTransferBase > void copy_from_mg (const MGDoFHandler& mg_dof, OutVector &dst, - const MGLevelObject > &src) const; + const MGLevelObject > &src) const; /** * Add a multi-level vector to a @@ -134,7 +135,7 @@ class MGTransferPrebuilt : public Subscriptor // MGTransferBase > void copy_from_mg_add (const MGDoFHandler& mg_dof, OutVector &dst, - const MGLevelObject > &src) const; + const MGLevelObject > &src) const; /** * Finite element does not @@ -241,9 +242,10 @@ class MGTransferBlockBase * transfer routines may only have as many components as there are * @p{true}s in the selected-field. * - * @author Guido Kanschat, 2001 + * @author Guido Kanschat, 2001, 2002 */ -class MGTransferBlock : public Subscriptor, // MGTransferBase >, +template +class MGTransferBlock : public MGTransfer >, private MGTransferBlockBase { public: @@ -286,8 +288,8 @@ class MGTransferBlock : public Subscriptor, // MGTransferBase &dst, - const BlockVector &src) const; + BlockVector &dst, + const BlockVector &src) const; /** * Restrict a vector from level @@ -313,8 +315,8 @@ class MGTransferBlock : public Subscriptor, // MGTransferBase &dst, - const BlockVector &src) const; + BlockVector &dst, + const BlockVector &src) const; protected: }; @@ -327,9 +329,10 @@ class MGTransferBlock : public Subscriptor, // MGTransferBase >, +template +class MGTransferSelect : public MGTransfer >, private MGTransferBlockBase { public: @@ -369,8 +372,8 @@ class MGTransferSelect : public Subscriptor, // MGTransferBase >, * level. */ virtual void prolongate (const unsigned int to_level, - Vector &dst, - const Vector &src) const; + Vector &dst, + const Vector &src) const; /** * Restrict a vector from level @@ -396,8 +399,8 @@ class MGTransferSelect : public Subscriptor, // MGTransferBase >, * level. */ virtual void restrict_and_add (const unsigned int from_level, - Vector &dst, - const Vector &src) const; + Vector &dst, + const Vector &src) const; /** * Transfer from a vector on the @@ -408,7 +411,7 @@ class MGTransferSelect : public Subscriptor, // MGTransferBase >, template void copy_to_mg (const MGDoFHandler& mg_dof, - MGLevelObject > &dst, + MGLevelObject > &dst, const InVector &src) const; /** @@ -418,7 +421,7 @@ class MGTransferSelect : public Subscriptor, // MGTransferBase >, * Copies data from active * portions of an MGVector into * the respective positions of a - * @p{Vector}. In order to + * @p{Vector}. In order to * keep the result consistent, * constrained degrees of freedom * are set to zero. @@ -427,7 +430,7 @@ class MGTransferSelect : public Subscriptor, // MGTransferBase >, void copy_from_mg (const MGDoFHandler& mg_dof, OutVector &dst, - const MGLevelObject > &src) const; + const MGLevelObject > &src) const; /** * Add a multi-level vector to a @@ -441,7 +444,7 @@ class MGTransferSelect : public Subscriptor, // MGTransferBase >, void copy_from_mg_add (const MGDoFHandler& mg_dof, OutVector &dst, - const MGLevelObject > &src) const; + const MGLevelObject > &src) const; private: diff --git a/deal.II/deal.II/include/multigrid/multigrid.h b/deal.II/deal.II/include/multigrid/multigrid.h index 331c8ab4b5..809103a0e0 100644 --- a/deal.II/deal.II/include/multigrid/multigrid.h +++ b/deal.II/deal.II/include/multigrid/multigrid.h @@ -54,7 +54,7 @@ * returning the solution to the system @p{Ax=b} on the coarsest level * in @p{x}. * - * @author Guido Kanschat, 1999, 2001 + * @author Guido Kanschat, 1999, 2001, 2002 */ template class Multigrid : public Subscriptor @@ -111,9 +111,9 @@ class Multigrid : public Subscriptor * function is done in * @p{level_mgstep}. */ - template + template void vcycle(const MGLevelObject& matrix, - const TRANSFER& transfer, + const MGTransfer& transfer, const SMOOTHER& pre_smooth, const SMOOTHER& post_smooth, const COARSE& cgs); @@ -143,10 +143,10 @@ class Multigrid : public Subscriptor * is used to solve the matrix of * this level. */ - template + template void level_mgstep (const unsigned int level, const MGLevelObject& matrix, - const TRANSFER& transfer, + const MGTransfer& transfer, const SMOOTHER& pre_smooth, const SMOOTHER& post_smooth, const COARSE& cgs); @@ -189,7 +189,7 @@ class Multigrid : public Subscriptor DeclException2(ExcSwitchedLevels, int, int, << "minlevel and maxlevel switched, should be: " << arg1 << "<=" << arg2); - template friend class PreconditionMG; + template friend class PreconditionMG; }; @@ -203,7 +203,7 @@ class Multigrid : public Subscriptor * to store @p{src} in the right hand side of the multi-level method and * @p{void copy_from_mg(VECTOR&)} to store the result of the v-cycle in @p{dst}. * - * @author Guido Kanschat, 1999 + * @author Guido Kanschat, 1999, 2000, 2001, 2002 */ template class PreconditionMG : public Subscriptor @@ -218,7 +218,7 @@ class PreconditionMG : public Subscriptor PreconditionMG(const MGDoFHandler& mg_dof, Multigrid& mg, const MGLevelObject& matrix, - const TRANSFER& transfer, + const TRANSFER& transfer, const SMOOTHER& pre, const SMOOTHER& post, const COARSE& coarse); @@ -326,11 +326,11 @@ Multigrid::Multigrid (const MGDoFHandler& mg_dof_handler, template -template +template void Multigrid::level_mgstep(const unsigned int level, const MGLevelObject& matrix, - const TRANSFER& transfer, + const MGTransfer& transfer, const SMOOTHER &pre_smooth, const SMOOTHER &post_smooth, const COARSE &coarse_grid_solver) @@ -413,10 +413,10 @@ Multigrid::level_mgstep(const unsigned int level, template -template +template void Multigrid::vcycle(const MGLevelObject& matrix, - const TRANSFER& transfer, + const MGTransfer& transfer, const SMOOTHER &pre_smooth, const SMOOTHER &post_smooth, const COARSE &coarse_grid_solver) diff --git a/deal.II/deal.II/source/multigrid/mg_base.cc b/deal.II/deal.II/source/multigrid/mg_base.cc index 01295cbb1b..6fe65ce039 100644 --- a/deal.II/deal.II/source/multigrid/mg_base.cc +++ b/deal.II/deal.II/source/multigrid/mg_base.cc @@ -19,16 +19,16 @@ #include -////////////////////////////////////////////////////////////////////// -// template -// MGTransferBase::~MGTransferBase() -// {}; + template + MGTransfer::~MGTransfer() + {}; -// // Explicit instantiations -// template class MGTransferBase >; -// template class MGTransferBase >; -// template class MGTransferBase >; -// template class MGTransferBase >; + // Explicit instantiations + + template class MGTransfer >; + template class MGTransfer >; + template class MGTransfer >; + template class MGTransfer >; 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 a2904071ef..c3bc1ba9da 100644 --- a/deal.II/deal.II/source/multigrid/mg_dof_tools.cc +++ b/deal.II/deal.II/source/multigrid/mg_dof_tools.cc @@ -512,7 +512,7 @@ template void MGTools::reinit_vector (const MGDoFHandler (const MGDoFHandler&, -// const MGTransferBase >&, +// const MGTransfer >&, // MGLevelObject >&, // const Vector&); @@ -525,7 +525,7 @@ template void MGTools::reinit_vector (const MGDoFHandler >&); // template void MGTools::copy_to_mg (const MGDoFHandler&, -// const MGTransferBase >&, +// const MGTransfer >&, // MGLevelObject >&, // const Vector&); @@ -538,7 +538,7 @@ template void MGTools::reinit_vector (const MGDoFHandler >&); // template void MGTools::copy_to_mg (const MGDoFHandler&, -// const MGTransferBase >&, +// const MGTransfer >&, // MGLevelObject >&, // const BlockVector&); @@ -551,7 +551,7 @@ template void MGTools::reinit_vector (const MGDoFHandler >&); // template void MGTools::copy_to_mg (const MGDoFHandler&, -// const MGTransferBase >&, +// const MGTransfer >&, // MGLevelObject >&, // const BlockVector&); diff --git a/deal.II/deal.II/source/multigrid/multigrid.all_dimensions.cc b/deal.II/deal.II/source/multigrid/multigrid.all_dimensions.cc index 6ffb4c3b0c..c125ad3c32 100644 --- a/deal.II/deal.II/source/multigrid/multigrid.all_dimensions.cc +++ b/deal.II/deal.II/source/multigrid/multigrid.all_dimensions.cc @@ -19,13 +19,16 @@ #include -MGTransferPrebuilt::~MGTransferPrebuilt () +template +MGTransferPrebuilt::~MGTransferPrebuilt () {}; -void MGTransferPrebuilt::prolongate (const unsigned int to_level, - Vector &dst, - const Vector &src) const +template +void MGTransferPrebuilt::prolongate ( + const unsigned int to_level, + Vector &dst, + const Vector &src) const { Assert ((to_level >= 1) && (to_level<=prolongation_matrices.size()), ExcIndexRange (to_level, 1, prolongation_matrices.size()+1)); @@ -34,9 +37,11 @@ void MGTransferPrebuilt::prolongate (const unsigned int to_level, }; -void MGTransferPrebuilt::restrict_and_add (const unsigned int from_level, - Vector &dst, - const Vector &src) const +template +void MGTransferPrebuilt::restrict_and_add ( + const unsigned int from_level, + Vector &dst, + const Vector &src) const { Assert ((from_level >= 1) && (from_level<=prolongation_matrices.size()), ExcIndexRange (from_level, 1, prolongation_matrices.size()+1)); @@ -48,13 +53,16 @@ void MGTransferPrebuilt::restrict_and_add (const unsigned int from_level, -MGTransferBlock::~MGTransferBlock () +template +MGTransferBlock::~MGTransferBlock () {}; -void MGTransferBlock::prolongate (const unsigned int to_level, - BlockVector &dst, - const BlockVector &src) const +template +void MGTransferBlock::prolongate ( + const unsigned int to_level, + BlockVector &dst, + const BlockVector &src) const { Assert ((to_level >= 1) && (to_level<=prolongation_matrices.size()), ExcIndexRange (to_level, 1, prolongation_matrices.size()+1)); @@ -70,9 +78,11 @@ void MGTransferBlock::prolongate (const unsigned int to_level, }; -void MGTransferBlock::restrict_and_add (const unsigned int from_level, - BlockVector &dst, - const BlockVector &src) const +template +void MGTransferBlock::restrict_and_add ( + const unsigned int from_level, + BlockVector &dst, + const BlockVector &src) const { Assert ((from_level >= 1) && (from_level<=prolongation_matrices.size()), ExcIndexRange (from_level, 1, prolongation_matrices.size()+1)); @@ -90,13 +100,16 @@ void MGTransferBlock::restrict_and_add (const unsigned int from_level, -MGTransferSelect::~MGTransferSelect () +template +MGTransferSelect::~MGTransferSelect () {}; -void MGTransferSelect::prolongate (const unsigned int to_level, - Vector &dst, - const Vector &src) const +template +void MGTransferSelect::prolongate ( + const unsigned int to_level, + Vector &dst, + const Vector &src) const { Assert ((to_level >= 1) && (to_level<=prolongation_matrices.size()), ExcIndexRange (to_level, 1, prolongation_matrices.size()+1)); @@ -106,9 +119,11 @@ void MGTransferSelect::prolongate (const unsigned int to_level, }; -void MGTransferSelect::restrict_and_add (const unsigned int from_level, - Vector &dst, - const Vector &src) const +template +void MGTransferSelect::restrict_and_add ( + const unsigned int from_level, + Vector &dst, + const Vector &src) const { Assert ((from_level >= 1) && (from_level<=prolongation_matrices.size()), ExcIndexRange (from_level, 1, prolongation_matrices.size()+1)); @@ -116,3 +131,13 @@ void MGTransferSelect::restrict_and_add (const unsigned int from_level, prolongation_matrices[from_level-1].block(selected, selected) .Tvmult_add (dst, src); }; + + +// Explicit instantiations + +template MGTransferPrebuilt; +template MGTransferPrebuilt; +template MGTransferBlock; +template MGTransferBlock; +template MGTransferSelect; +template MGTransferSelect; diff --git a/deal.II/deal.II/source/multigrid/multigrid.cc b/deal.II/deal.II/source/multigrid/multigrid.cc index 0314ee90b9..3247ac6074 100644 --- a/deal.II/deal.II/source/multigrid/multigrid.cc +++ b/deal.II/deal.II/source/multigrid/multigrid.cc @@ -28,8 +28,10 @@ /* ----------------------------- MGTransferPrebuilt ------------------------ */ +template template -void MGTransferPrebuilt::build_matrices (const MGDoFHandler &mg_dof) +void MGTransferPrebuilt::build_matrices ( + const MGDoFHandler &mg_dof) { const unsigned int n_levels = mg_dof.get_tria().n_levels(); const unsigned int dofs_per_cell = mg_dof.get_fe().dofs_per_cell; @@ -144,8 +146,9 @@ void MGTransferPrebuilt::build_matrices (const MGDoFHandler &mg_dof) template -void MGTransferBlockBase::build_matrices (const MGDoFHandler &mg_dof, - std::vector select) +void MGTransferBlockBase::build_matrices ( + const MGDoFHandler &mg_dof, + std::vector select) { const FiniteElement& fe = mg_dof.get_fe(); const unsigned int n_components = fe.n_components(); @@ -306,9 +309,11 @@ void MGTransferBlockBase::build_matrices (const MGDoFHandler &mg_dof, }; +template template -void MGTransferBlock::build_matrices (const MGDoFHandler &mg_dof, - std::vector select) +void MGTransferBlock::build_matrices ( + const MGDoFHandler &mg_dof, + std::vector select) { if (select.size() == 0) select = std::vector (mg_dof.get_fe().n_components(), true); @@ -317,9 +322,11 @@ void MGTransferBlock::build_matrices (const MGDoFHandler &mg_dof, } +template template -void MGTransferSelect::build_matrices (const MGDoFHandler &mg_dof, - unsigned int select) +void MGTransferSelect::build_matrices ( + const MGDoFHandler &mg_dof, + unsigned int select) { selected = select; std::vector s(mg_dof.get_fe().n_components(), false); @@ -333,15 +340,29 @@ void MGTransferSelect::build_matrices (const MGDoFHandler &mg_dof, // explicit instatations template -void MGTransferPrebuilt::build_matrices +void MGTransferPrebuilt::build_matrices (const MGDoFHandler &mg_dof); template -void MGTransferBlock::build_matrices +void MGTransferBlock::build_matrices (const MGDoFHandler &mg_dof, std::vector); template -void MGTransferSelect::build_matrices +void MGTransferSelect::build_matrices +(const MGDoFHandler &mg_dof, + unsigned int); + +template +void MGTransferPrebuilt::build_matrices +(const MGDoFHandler &mg_dof); + +template +void MGTransferBlock::build_matrices +(const MGDoFHandler &mg_dof, + std::vector); + +template +void MGTransferSelect::build_matrices (const MGDoFHandler &mg_dof, unsigned int);