NGSolve  4.9
multigrid/smoother.hpp
00001 #ifndef FILE_SMOOTHER
00002 #define FILE_SMOOTHER
00003 
00004 /*********************************************************************/
00005 /* File:   smoother.hh                                               */
00006 /* Author: Joachim Schoeberl                                         */
00007 /* Date:   20. Apr. 2000                                             */
00008 /*********************************************************************/
00009 
00010 namespace ngmg
00011 {
00012 
00017   class NGS_DLL_HEADER Smoother
00018   {
00019   protected:
00021     int additive; 
00023     int updateall;
00025     Flags flags;
00026   public: 
00028     Smoother();
00030     Smoother(const Flags & aflags); 
00032     virtual ~Smoother();
00033   
00035     virtual void Update (bool force_update = 0) = 0;
00036 
00038     virtual void PreSmooth (int level, ngla::BaseVector & u, 
00039                             const ngla::BaseVector & f, int steps) const = 0;
00040 
00041 
00043     virtual void PreSmoothResiduum (int level, ngla::BaseVector & u, 
00044                                     const ngla::BaseVector & f, 
00045                                     ngla::BaseVector & res, 
00046                                     int steps) const 
00047     {
00048       PreSmooth (level, u, f, steps);
00049       Residuum (level, u, f, res);
00050     }
00051 
00052 
00054     virtual void PostSmooth (int level, ngla::BaseVector & u, 
00055                              const ngla::BaseVector & f, int steps) const = 0;
00057     virtual void Precond (int level, const ngla::BaseVector & f, ngla::BaseVector & u) const;
00058 
00060     virtual void Residuum (int level, ngla::BaseVector & u, 
00061                            const ngla::BaseVector & f, 
00062                            ngla::BaseVector & d) const = 0;
00063 
00065     void SetAdditive () { additive = 1; }
00067     void SetUpdateAll (int ua) { updateall = ua; }
00069     void SetMultiplicative () { additive = 0; }
00071     int Additive () const { return additive; }
00072 
00074     virtual ngla::BaseVector * CreateVector(int level) const = 0;
00075 
00076     virtual void MemoryUsage (Array<MemoryUsageStruct*> & mu) const
00077     { ; }
00078   };
00079 
00080 
00085   class GSSmoother : public Smoother
00086   {
00088     const MeshAccess & ma;
00090     const BilinearForm & biform;
00092     Array<ngla::BaseJacobiPrecond*> jac;
00093   
00094   public:
00096     GSSmoother (const MeshAccess & ama,
00097                 const BilinearForm & abiform);
00099     virtual ~GSSmoother();
00100   
00102     virtual void Update (bool force_update = 0);
00104     virtual void PreSmooth (int level, ngla::BaseVector & u, 
00105                             const ngla::BaseVector & f, int steps) const;
00107     virtual void PostSmooth (int level, ngla::BaseVector & u, 
00108                              const ngla::BaseVector & f, int steps) const;
00109 
00110     virtual void PreSmoothResiduum (int level, ngla::BaseVector & u, 
00111                                     const ngla::BaseVector & f, 
00112                                     ngla::BaseVector & res, 
00113                                     int steps) const;
00114 
00116     virtual void Residuum (int level, ngla::BaseVector & u, 
00117                            const ngla::BaseVector & f, ngla::BaseVector & d) const;
00119     virtual ngla::BaseVector * CreateVector(int level) const;
00120   };
00121 
00122 
00127   class AnisotropicSmoother : public Smoother
00128   {
00130     const MeshAccess & ma;
00132     const BilinearForm & biform;
00134     Array<BaseBlockJacobiPrecond*> jac;
00135   
00136   public:
00138     AnisotropicSmoother (const MeshAccess & ama,
00139                          const BilinearForm & abiform);
00141     virtual ~AnisotropicSmoother();
00142   
00144     virtual void Update (bool forace_update = 0);
00146     virtual void PreSmooth (int level, ngla::BaseVector & u, 
00147                             const ngla::BaseVector & f, int steps) const;
00149     virtual void PostSmooth (int level, ngla::BaseVector & u, 
00150                              const ngla::BaseVector & f, int steps) const;
00152     virtual void Residuum (int level, ngla::BaseVector & u, 
00153                            const ngla::BaseVector & f, ngla::BaseVector & d) const;
00155     virtual ngla::BaseVector * CreateVector(int level) const;
00156   };
00157 
00158 
00159 
00160 
00161 
00166   class BlockSmoother : public Smoother
00167   {
00169     const MeshAccess & ma;
00171     const BilinearForm & biform;
00173     const LinearForm * constraint;
00175     Array<ngla::BaseBlockJacobiPrecond*> jac;
00177     Array<BaseMatrix*> inv;
00179     Array<int> * direct;
00180   
00181   public:
00183     BlockSmoother (const MeshAccess & ama,
00184                    const BilinearForm & abiform, const Flags & aflags);
00186     BlockSmoother (const MeshAccess & ama,
00187                    const BilinearForm & abiform,
00188                    const LinearForm & aconstraint, const Flags & aflags);
00190     virtual ~BlockSmoother();
00191   
00193     virtual void Update (bool forace_update = 0);
00195     virtual void PreSmooth (int level, BaseVector & u, 
00196                             const BaseVector & f, int steps) const;
00198     virtual void PreSmoothResiduum (int level, ngla::BaseVector & u, 
00199                                     const ngla::BaseVector & f, 
00200                                     ngla::BaseVector & res, 
00201                                     int steps) const;
00202 
00204     virtual void PostSmooth (int level, ngla::BaseVector & u, 
00205                              const ngla::BaseVector & f, int steps) const;
00207     virtual void Precond (int level, const ngla::BaseVector & f, ngla::BaseVector & u) const;
00209     virtual void Residuum (int level, ngla::BaseVector & u, 
00210                            const ngla::BaseVector & f, ngla::BaseVector & d) const;
00212     virtual ngla::BaseVector * CreateVector(int level) const;
00213 
00214     virtual void MemoryUsage (Array<MemoryUsageStruct*> & mu) const;
00215   };
00216 
00217 
00218 
00219 
00220 
00221 
00225   class SmoothingPreconditioner : public ngla::BaseMatrix
00226   {
00228     const Smoother & smoother;
00230     int level;
00231   public:
00233     SmoothingPreconditioner (const Smoother & asmoother,
00234                              int alevel = 0);
00236     virtual void Mult (const ngla::BaseVector & f, ngla::BaseVector & u) const;
00238     virtual ngla::BaseVector * CreateVector () const;
00239   };
00240 
00241 }
00242 
00243 #endif