]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
MGTransfer base class reintroduced as template
authorguido <guido@0785d39b-7218-0410-832d-ea1e28bc413d>
Wed, 14 Aug 2002 09:34:26 +0000 (09:34 +0000)
committerguido <guido@0785d39b-7218-0410-832d-ea1e28bc413d>
Wed, 14 Aug 2002 09:34:26 +0000 (09:34 +0000)
git-svn-id: https://svn.dealii.org/trunk@6325 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/deal.II/include/multigrid/mg_base.h
deal.II/deal.II/include/multigrid/mg_tools.templates.h
deal.II/deal.II/include/multigrid/mg_transfer.h
deal.II/deal.II/include/multigrid/multigrid.h
deal.II/deal.II/source/multigrid/mg_base.cc
deal.II/deal.II/source/multigrid/mg_dof_tools.cc
deal.II/deal.II/source/multigrid/multigrid.all_dimensions.cc
deal.II/deal.II/source/multigrid/multigrid.cc

index 187eb4e1f057c9248d8e4f5a81ed2a2057f8e021..fe070b9e0d685ca4a66483af15cc252820f724e3 100644 (file)
@@ -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 VECTOR>
-//  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 VECTOR>
+ 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;
+ };
 
 
 
index c6e9ef8e03a5cdf5982f7762b985c4a33e4d955d..efeb9e2f15b2801a08c02daecdfb2282e50d2bd0 100644 (file)
 //TODO:[?] This function needs to be specially implemented, since in 2d mode we use faces
 #if deal_II_dimension == 1
 
+template <typename number>
 template <int dim, class InVector>
 void
-MGTransferPrebuilt::copy_to_mg (const MGDoFHandler<dim>&,
-                               MGLevelObject<Vector<double> >&,
-                               const InVector&) const
+MGTransferPrebuilt<number>::copy_to_mg (
+  const MGDoFHandler<dim>&,
+  MGLevelObject<Vector<number> >&,
+  const InVector&) const
 {
   Assert(false, ExcNotImplemented());
 }
@@ -38,11 +40,13 @@ MGTransferPrebuilt::copy_to_mg (const MGDoFHandler<dim>&,
 #else
 
 
+template <typename number>
 template <int dim, class InVector>
 void
-MGTransferPrebuilt::copy_to_mg (const MGDoFHandler<dim>& mg_dof_handler,
-                               MGLevelObject<Vector<double> >& dst,
-                               const InVector& src) const
+MGTransferPrebuilt<number>::copy_to_mg (
+  const MGDoFHandler<dim>& mg_dof_handler,
+  MGLevelObject<Vector<number> >& dst,
+  const InVector& src) const
 {
 
                                   // Make src a real finite element function
@@ -136,11 +140,13 @@ MGTransferPrebuilt::copy_to_mg (const MGDoFHandler<dim>& mg_dof_handler,
 #endif
 
 
+template <typename number>
 template <int dim, class OutVector>
 void
-MGTransferPrebuilt::copy_from_mg(const MGDoFHandler<dim>& mg_dof_handler,
-                                OutVector &dst,
-                                const MGLevelObject<Vector<double> > &src) const
+MGTransferPrebuilt<number>::copy_from_mg(
+  const MGDoFHandler<dim>& mg_dof_handler,
+  OutVector &dst,
+  const MGLevelObject<Vector<number> > &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<dim>& mg_dof_handler,
 //TODO:[GK]  constraints->set_zero(dst);
 }
 
+template <typename number>
 template <int dim, class OutVector>
 void
-MGTransferPrebuilt::copy_from_mg_add(const MGDoFHandler<dim>& mg_dof_handler,
-                                    OutVector &dst,
-                                    const MGLevelObject<Vector<double> > &src) const
+MGTransferPrebuilt<number>::copy_from_mg_add(
+  const MGDoFHandler<dim>& mg_dof_handler,
+  OutVector &dst,
+  const MGLevelObject<Vector<number> > &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<dim>& mg_dof_handler,
 //TODO:[?] This function needs to be specially implemented, since in 2d mode we use faces
 #if deal_II_dimension == 1
 
+template <typename number>
 template <int dim, class InVector>
 void
-MGTransferSelect::copy_to_mg (const MGDoFHandler<dim>&,
-                               MGLevelObject<Vector<double> >&,
-                               const InVector&) const
+MGTransferSelect<number>::copy_to_mg (
+  const MGDoFHandler<dim>&,
+  MGLevelObject<Vector<number> >&,
+  const InVector&) const
 {
   Assert(false, ExcNotImplemented());
 }
@@ -242,11 +252,13 @@ MGTransferSelect::copy_to_mg (const MGDoFHandler<dim>&,
 #else
 
 
+template <typename number>
 template <int dim, class InVector>
 void
-MGTransferSelect::copy_to_mg (const MGDoFHandler<dim>& mg_dof_handler,
-                               MGLevelObject<Vector<double> >& dst,
-                               const InVector& osrc) const
+MGTransferSelect<number>::copy_to_mg (
+  const MGDoFHandler<dim>& mg_dof_handler,
+  MGLevelObject<Vector<number> >& 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<dim>& mg_dof_handler,
 #endif
 
 
+template <typename number>
 template <int dim, class OutVector>
 void
-MGTransferSelect::copy_from_mg(const MGDoFHandler<dim>& mg_dof_handler,
-                                OutVector &dst,
-                                const MGLevelObject<Vector<double> > &src) const
+MGTransferSelect<number>::copy_from_mg(
+  const MGDoFHandler<dim>& mg_dof_handler,
+  OutVector &dst,
+  const MGLevelObject<Vector<number> > &src) const
 {
 
   const FiniteElement<dim>& fe = mg_dof_handler.get_fe();
@@ -409,11 +423,13 @@ MGTransferSelect::copy_from_mg(const MGDoFHandler<dim>& mg_dof_handler,
 //TODO:[GK]  constraints->set_zero(dst);
 }
 
+template <typename number>
 template <int dim, class OutVector>
 void
-MGTransferSelect::copy_from_mg_add(const MGDoFHandler<dim>& mg_dof_handler,
-                                    OutVector &dst,
-                                    const MGLevelObject<Vector<double> > &src) const
+MGTransferSelect<number>::copy_from_mg_add(
+  const MGDoFHandler<dim>& mg_dof_handler,
+  OutVector &dst,
+  const MGLevelObject<Vector<number> > &src) const
 {
 
   const FiniteElement<dim>& fe = mg_dof_handler.get_fe();
index f76a4e8d65268fafd8f4fe0352ce6b2ccf431444..61b2163230a0800753057e33d09e4ffa71430a59 100644 (file)
@@ -29,9 +29,10 @@ template <int dim> 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<Vector<double> > 
+template<typename number>
+class MGTransferPrebuilt : public MGTransfer<Vector<number> > 
 {
   public:
                                     /**
@@ -62,8 +63,8 @@ class MGTransferPrebuilt : public Subscriptor // MGTransferBase<Vector<double> >
                                      * level.
                                      */
     virtual void prolongate (const unsigned int    to_level,
-                            Vector<double>       &dst,
-                            const Vector<double> &src) const;
+                            Vector<number>       &dst,
+                            const Vector<number> &src) const;
 
                                     /**
                                      * Restrict a vector from level
@@ -89,8 +90,8 @@ class MGTransferPrebuilt : public Subscriptor // MGTransferBase<Vector<double> >
                                      * level.
                                      */
     virtual void restrict_and_add (const unsigned int    from_level,
-                                  Vector<double>       &dst,
-                                  const Vector<double> &src) const;
+                                  Vector<number>       &dst,
+                                  const Vector<number> &src) const;
 
                                     /**
                                      * Transfer from a vector on the
@@ -101,7 +102,7 @@ class MGTransferPrebuilt : public Subscriptor // MGTransferBase<Vector<double> >
     template<int dim, class InVector>
     void
     copy_to_mg (const MGDoFHandler<dim>& mg_dof,
-               MGLevelObject<Vector<double> > &dst,
+               MGLevelObject<Vector<number> > &dst,
                const InVector &src) const;
 
                                     /**
@@ -111,7 +112,7 @@ class MGTransferPrebuilt : public Subscriptor // MGTransferBase<Vector<double> >
                                      * Copies data from active
                                      * portions of an MGVector into
                                      * the respective positions of a
-                                     * @p{Vector<double>}. In order to
+                                     * @p{Vector<number>}. In order to
                                      * keep the result consistent,
                                      * constrained degrees of freedom
                                      * are set to zero.
@@ -120,7 +121,7 @@ class MGTransferPrebuilt : public Subscriptor // MGTransferBase<Vector<double> >
     void
     copy_from_mg (const MGDoFHandler<dim>& mg_dof,
                  OutVector &dst,
-                 const MGLevelObject<Vector<double> > &src) const;
+                 const MGLevelObject<Vector<number> > &src) const;
 
                                     /**
                                      * Add a multi-level vector to a
@@ -134,7 +135,7 @@ class MGTransferPrebuilt : public Subscriptor // MGTransferBase<Vector<double> >
     void
     copy_from_mg_add (const MGDoFHandler<dim>& mg_dof,
                      OutVector &dst,
-                     const MGLevelObject<Vector<double> > &src) const;
+                     const MGLevelObject<Vector<number> > &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<BlockVector<double> >,
+template <typename number>
+class MGTransferBlock : public MGTransfer<BlockVector<number> >,
                        private MGTransferBlockBase
 {
   public:
@@ -286,8 +288,8 @@ class MGTransferBlock : public Subscriptor, // MGTransferBase<BlockVector<double
                                      * level.
                                      */
     virtual void prolongate (const unsigned int    to_level,
-                            BlockVector<double>       &dst,
-                            const BlockVector<double> &src) const;
+                            BlockVector<number>       &dst,
+                            const BlockVector<number> &src) const;
 
                                     /**
                                      * Restrict a vector from level
@@ -313,8 +315,8 @@ class MGTransferBlock : public Subscriptor, // MGTransferBase<BlockVector<double
                                      * level.
                                      */
     virtual void restrict_and_add (const unsigned int    from_level,
-                                  BlockVector<double>       &dst,
-                                  const BlockVector<double> &src) const;
+                                  BlockVector<number>       &dst,
+                                  const BlockVector<number> &src) const;
 
   protected: 
 };
@@ -327,9 +329,10 @@ class MGTransferBlock : public Subscriptor, // MGTransferBase<BlockVector<double
  * selecting a single component. The transfer operators themselves are
  * implemented for simple vectors again.
  *
- * @author Guido Kanschat, 2001
+ * @author Guido Kanschat, 2001, 2002
  */
-class MGTransferSelect : public Subscriptor, // MGTransferBase<Vector<double> >,
+template <typename number>
+class MGTransferSelect : public MGTransfer<Vector<number> >,
                         private MGTransferBlockBase
 {
   public:
@@ -369,8 +372,8 @@ class MGTransferSelect : public Subscriptor, // MGTransferBase<Vector<double> >,
                                      * level.
                                      */
     virtual void prolongate (const unsigned int    to_level,
-                            Vector<double>       &dst,
-                            const Vector<double> &src) const;
+                            Vector<number>       &dst,
+                            const Vector<number> &src) const;
 
                                     /**
                                      * Restrict a vector from level
@@ -396,8 +399,8 @@ class MGTransferSelect : public Subscriptor, // MGTransferBase<Vector<double> >,
                                      * level.
                                      */
     virtual void restrict_and_add (const unsigned int    from_level,
-                                  Vector<double>       &dst,
-                                  const Vector<double> &src) const;
+                                  Vector<number>       &dst,
+                                  const Vector<number> &src) const;
 
                                     /**
                                      * Transfer from a vector on the
@@ -408,7 +411,7 @@ class MGTransferSelect : public Subscriptor, // MGTransferBase<Vector<double> >,
     template<int dim, class InVector>
     void
     copy_to_mg (const MGDoFHandler<dim>& mg_dof,
-               MGLevelObject<Vector<double> > &dst,
+               MGLevelObject<Vector<number> > &dst,
                const InVector &src) const;
 
                                     /**
@@ -418,7 +421,7 @@ class MGTransferSelect : public Subscriptor, // MGTransferBase<Vector<double> >,
                                      * Copies data from active
                                      * portions of an MGVector into
                                      * the respective positions of a
-                                     * @p{Vector<double>}. In order to
+                                     * @p{Vector<number>}. In order to
                                      * keep the result consistent,
                                      * constrained degrees of freedom
                                      * are set to zero.
@@ -427,7 +430,7 @@ class MGTransferSelect : public Subscriptor, // MGTransferBase<Vector<double> >,
     void
     copy_from_mg (const MGDoFHandler<dim>& mg_dof,
                  OutVector &dst,
-                 const MGLevelObject<Vector<double> > &src) const;
+                 const MGLevelObject<Vector<number> > &src) const;
 
                                     /**
                                      * Add a multi-level vector to a
@@ -441,7 +444,7 @@ class MGTransferSelect : public Subscriptor, // MGTransferBase<Vector<double> >,
     void
     copy_from_mg_add (const MGDoFHandler<dim>& mg_dof,
                      OutVector &dst,
-                     const MGLevelObject<Vector<double> > &src) const;
+                     const MGLevelObject<Vector<number> > &src) const;
 
   private:
 
index 331c8ab4b50a213e8e8377f38fc10ff5bbb99300..809103a0e013505fd92cbc9d44dfb6212a5726d1 100644 (file)
@@ -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 VECTOR>
 class Multigrid : public Subscriptor
@@ -111,9 +111,9 @@ class Multigrid : public Subscriptor
                                      * function is done in
                                      * @p{level_mgstep}.
                                      */
-    template <class MATRIX, class TRANSFER, class SMOOTHER, class COARSE>
+    template <class MATRIX, class SMOOTHER, class COARSE>
     void vcycle(const MGLevelObject<MATRIX>& matrix,
-               const TRANSFER&              transfer,
+               const MGTransfer<VECTOR>&    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 <class MATRIX, class TRANSFER, class SMOOTHER, class COARSE>
+    template <class MATRIX, class SMOOTHER, class COARSE>
     void level_mgstep (const unsigned int           level,
                       const MGLevelObject<MATRIX>& matrix,
-                      const TRANSFER&              transfer,
+                      const MGTransfer<VECTOR>& 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<int dim, class MATRIX, class VECTOR2, class TRANSFER, class SMOOTHER, class COARSE> friend class PreconditionMG;
+    template<int dim, class MATRIX, class VECTOR2, class SMOOTHER, class TRANSFER, class COARSE> 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<int dim, class MATRIX, class VECTOR, class TRANSFER, class SMOOTHER, class COARSE>
 class PreconditionMG : public Subscriptor
@@ -218,7 +218,7 @@ class PreconditionMG : public Subscriptor
     PreconditionMG(const MGDoFHandler<dim>&     mg_dof,
                   Multigrid<VECTOR>&           mg,
                   const MGLevelObject<MATRIX>& matrix,
-                  const TRANSFER&              transfer,
+                  const TRANSFER& transfer,
                   const SMOOTHER&              pre,
                   const SMOOTHER&              post,
                   const COARSE&                coarse);
@@ -326,11 +326,11 @@ Multigrid<VECTOR>::Multigrid (const MGDoFHandler<dim>& mg_dof_handler,
 
 
 template <class VECTOR>
-template <class MATRIX, class TRANSFER, class SMOOTHER, class COARSE>
+template <class MATRIX, class SMOOTHER, class COARSE>
 void
 Multigrid<VECTOR>::level_mgstep(const unsigned int        level,
                                const MGLevelObject<MATRIX>& matrix,
-                               const TRANSFER&              transfer,
+                               const MGTransfer<VECTOR>& transfer,
                                const SMOOTHER     &pre_smooth,
                                const SMOOTHER     &post_smooth,
                                const COARSE &coarse_grid_solver)
@@ -413,10 +413,10 @@ Multigrid<VECTOR>::level_mgstep(const unsigned int        level,
 
 
 template <class VECTOR>
-template <class MATRIX, class TRANSFER, class SMOOTHER, class COARSE>
+template <class MATRIX, class SMOOTHER, class COARSE>
 void
 Multigrid<VECTOR>::vcycle(const MGLevelObject<MATRIX>& matrix,
-                         const TRANSFER&              transfer,
+                         const MGTransfer<VECTOR>& transfer,
                          const SMOOTHER     &pre_smooth,
                          const SMOOTHER     &post_smooth,
                          const COARSE &coarse_grid_solver)
index 01295cbb1bdfc4352027f22b293f053800f85cf4..6fe65ce039f91b52fef9b34a181ef8ccfe0dfba7 100644 (file)
 #include <cmath>
 
 
-//////////////////////////////////////////////////////////////////////
 
-//  template <class VECTOR>
-//  MGTransferBase<VECTOR>::~MGTransferBase()
-//  {};
 
+ template <class VECTOR>
+ MGTransfer<VECTOR>::~MGTransfer()
+ {};
 
-//  // Explicit instantiations
 
-//  template class MGTransferBase<Vector<double> >;
-//  template class MGTransferBase<Vector<float> >;
-//  template class MGTransferBase<BlockVector<double> >;
-//  template class MGTransferBase<BlockVector<float> >;
+ // Explicit instantiations
+
+ template class MGTransfer<Vector<double> >;
+ template class MGTransfer<Vector<float> >;
+ template class MGTransfer<BlockVector<double> >;
+ template class MGTransfer<BlockVector<float> >;
index a2904071efb9bf0396a29b13c197f0dafd533d78..c3bc1ba9da89d8d0cce3881caea5c86c3d32c874 100644 (file)
@@ -512,7 +512,7 @@ template void MGTools::reinit_vector<deal_II_dimension> (const MGDoFHandler<deal
 
 
 //  template void MGTools::copy_to_mg<deal_II_dimension> (const MGDoFHandler<deal_II_dimension>&,
-//                                const MGTransferBase<Vector<double> >&,
+//                                const MGTransfer<Vector<double> >&,
 //                                MGLevelObject<Vector<double> >&,
 //                                const Vector<double>&);
 
@@ -525,7 +525,7 @@ template void MGTools::reinit_vector<deal_II_dimension> (const MGDoFHandler<deal
 //                                     const MGLevelObject<Vector<double> >&);
 
 //  template void MGTools::copy_to_mg<deal_II_dimension> (const MGDoFHandler<deal_II_dimension>&,
-//                                const MGTransferBase<Vector<double> >&,
+//                                const MGTransfer<Vector<double> >&,
 //                                MGLevelObject<Vector<double> >&,
 //                                const Vector<float>&);
 
@@ -538,7 +538,7 @@ template void MGTools::reinit_vector<deal_II_dimension> (const MGDoFHandler<deal
 //                                     const MGLevelObject<Vector<float> >&);
 
 //  template void MGTools::copy_to_mg<deal_II_dimension> (const MGDoFHandler<deal_II_dimension>&,
-//                                const MGTransferBase<Vector<double> >&,
+//                                const MGTransfer<Vector<double> >&,
 //                                MGLevelObject<Vector<double> >&,
 //                                const BlockVector<double>&);
 
@@ -551,7 +551,7 @@ template void MGTools::reinit_vector<deal_II_dimension> (const MGDoFHandler<deal
 //                                     const MGLevelObject<Vector<double> >&);
 
 //  template void MGTools::copy_to_mg<deal_II_dimension> (const MGDoFHandler<deal_II_dimension>&,
-//                                const MGTransferBase<Vector<double> >&,
+//                                const MGTransfer<Vector<double> >&,
 //                                MGLevelObject<Vector<double> >&,
 //                                const BlockVector<float>&);
 
index 6ffb4c3b0c541e9ae53596b7a19ba86fab919fe2..c125ad3c32a336756b27ab695ff1d2176698ded3 100644 (file)
 #include <multigrid/mg_transfer.h>
 
 
-MGTransferPrebuilt::~MGTransferPrebuilt () 
+template <typename number>
+MGTransferPrebuilt<number>::~MGTransferPrebuilt () 
 {};
 
 
-void MGTransferPrebuilt::prolongate (const unsigned int   to_level,
-                                    Vector<double>       &dst,
-                                    const Vector<double> &src) const 
+template <typename number>
+void MGTransferPrebuilt<number>::prolongate (
+  const unsigned int   to_level,
+  Vector<number>       &dst,
+  const Vector<number> &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<double>       &dst,
-                                          const Vector<double> &src) const 
+template <typename number>
+void MGTransferPrebuilt<number>::restrict_and_add (
+  const unsigned int   from_level,
+  Vector<number>       &dst,
+  const Vector<number> &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 <typename number>
+MGTransferBlock<number>::~MGTransferBlock () 
 {};
 
 
-void MGTransferBlock::prolongate (const unsigned int   to_level,
-                                    BlockVector<double>       &dst,
-                                    const BlockVector<double> &src) const 
+template <typename number>
+void MGTransferBlock<number>::prolongate (
+  const unsigned int   to_level,
+  BlockVector<number>       &dst,
+  const BlockVector<number> &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<double>       &dst,
-                                          const BlockVector<double> &src) const 
+template <typename number>
+void MGTransferBlock<number>::restrict_and_add (
+  const unsigned int   from_level,
+  BlockVector<number>       &dst,
+  const BlockVector<number> &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 <typename number>
+MGTransferSelect<number>::~MGTransferSelect () 
 {};
 
 
-void MGTransferSelect::prolongate (const unsigned int   to_level,
-                                    Vector<double>       &dst,
-                                    const Vector<double> &src) const 
+template <typename number>
+void MGTransferSelect<number>::prolongate (
+  const unsigned int   to_level,
+  Vector<number>       &dst,
+  const Vector<number> &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<double>       &dst,
-                                          const Vector<double> &src) const 
+template <typename number>
+void MGTransferSelect<number>::restrict_and_add (
+  const unsigned int   from_level,
+  Vector<number>       &dst,
+  const Vector<number> &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<float>;
+template MGTransferPrebuilt<double>;
+template MGTransferBlock<float>;
+template MGTransferBlock<double>;
+template MGTransferSelect<float>;
+template MGTransferSelect<double>;
index 0314ee90b962e195750d6db67bab98c70733e556..3247ac607423c032b08057f90f1cc9143b23605d 100644 (file)
 /* ----------------------------- MGTransferPrebuilt ------------------------ */
 
 
+template <typename number>
 template <int dim>
-void MGTransferPrebuilt::build_matrices (const MGDoFHandler<dim> &mg_dof) 
+void MGTransferPrebuilt<number>::build_matrices (
+  const MGDoFHandler<dim> &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<dim> &mg_dof)
 
 
 template <int dim>
-void MGTransferBlockBase::build_matrices (const MGDoFHandler<dim> &mg_dof,
-                                     std::vector<bool> select) 
+void MGTransferBlockBase::build_matrices (
+  const MGDoFHandler<dim> &mg_dof,
+  std::vector<bool> select) 
 {
   const FiniteElement<dim>& fe = mg_dof.get_fe();
   const unsigned int n_components  = fe.n_components();
@@ -306,9 +309,11 @@ void MGTransferBlockBase::build_matrices (const MGDoFHandler<dim> &mg_dof,
 };
 
 
+template <typename number>
 template <int dim>
-void MGTransferBlock::build_matrices (const MGDoFHandler<dim> &mg_dof,
-                                         std::vector<bool> select) 
+void MGTransferBlock<number>::build_matrices (
+  const MGDoFHandler<dim> &mg_dof,
+  std::vector<bool> select) 
 {
   if (select.size() == 0)
     select = std::vector<bool> (mg_dof.get_fe().n_components(), true);
@@ -317,9 +322,11 @@ void MGTransferBlock::build_matrices (const MGDoFHandler<dim> &mg_dof,
 }
 
 
+template <typename number>
 template <int dim>
-void MGTransferSelect::build_matrices (const MGDoFHandler<dim> &mg_dof,
-                                        unsigned int select)
+void MGTransferSelect<number>::build_matrices (
+  const MGDoFHandler<dim> &mg_dof,
+  unsigned int select)
 {
   selected = select;
   std::vector<bool> s(mg_dof.get_fe().n_components(), false);
@@ -333,15 +340,29 @@ void MGTransferSelect::build_matrices (const MGDoFHandler<dim> &mg_dof,
 // explicit instatations
 
 template
-void MGTransferPrebuilt::build_matrices<deal_II_dimension>
+void MGTransferPrebuilt<float>::build_matrices<deal_II_dimension>
 (const MGDoFHandler<deal_II_dimension> &mg_dof);
 
 template
-void MGTransferBlock::build_matrices<deal_II_dimension>
+void MGTransferBlock<float>::build_matrices<deal_II_dimension>
 (const MGDoFHandler<deal_II_dimension> &mg_dof,
  std::vector<bool>);
 
 template
-void MGTransferSelect::build_matrices<deal_II_dimension>
+void MGTransferSelect<float>::build_matrices<deal_II_dimension>
+(const MGDoFHandler<deal_II_dimension> &mg_dof,
+ unsigned int);
+
+template
+void MGTransferPrebuilt<double>::build_matrices<deal_II_dimension>
+(const MGDoFHandler<deal_II_dimension> &mg_dof);
+
+template
+void MGTransferBlock<double>::build_matrices<deal_II_dimension>
+(const MGDoFHandler<deal_II_dimension> &mg_dof,
+ std::vector<bool>);
+
+template
+void MGTransferSelect<double>::build_matrices<deal_II_dimension>
 (const MGDoFHandler<deal_II_dimension> &mg_dof,
  unsigned int);

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.