NGSolve
4.9
|
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