/* $Id: precondnl.h,v 1.3 1996/11/20 09:57:30 roitzsch Exp $ */ #ifndef PRECONDNL_H #define PRECONDNL_H #include "precondmg.h" #include "numerics.h" #include "stack.h" class SystemMatrix; class SparseMatrix; class FamilyTree; class NonLinearity; //------------------------------------------------------------------------- class NonLinearSGGS : public Preconditioner { protected: NonLinearity& nonLinearity; const Vector* sol; public: NonLinearSGGS(NonLinearity& nonLinearity0); virtual ~NonLinearSGGS() { } virtual precondMode mode() { return singleGrid; } virtual void initialize(SystemMatrix* A, Vector& x, Vector& b); virtual void close (SystemMatrix* A, Vector& x, Vector& b); virtual void invert(Vector& s, SystemMatrix* A, Vector& r); }; //------------------------------------------------------------------------- class NonLinearMLGS : public MMGPreconditioner { protected: NonLinearity& nonLinearity; Vector eMG, ADiag0; Stack*> lowDefObstacle, uppDefObstacle; const Vector* sol; Bool topLevelSmoothing; public: NonLinearMLGS(NonLinearity& nonLinearity0); virtual ~NonLinearMLGS(); virtual precondMode mode() { return multiLevel; } virtual void initialize(SystemMatrix* A, Vector& x, Vector& b); virtual void close (SystemMatrix* A, Vector& x, Vector& b); virtual void update(SystemMatrix* A, FamilyTree* familyTree, DirichletBCs* dirichletBCs); virtual void invert(Vector& s, SystemMatrix* A, Vector& r); protected: virtual void NonLinGSStep(Vector& s, SystemMatrix* A, Vector& r); virtual void setCritical (int /*node*/) { } virtual void setUnCritical(int /*node*/) { } virtual Bool isCritical (int /*node*/, int /*level*/) { return False; } virtual void restrictObstacles(int highLevel); virtual void preSmooth(int level, Vector& e, SystemMatrix& A, Vector& r); virtual void postSmooth(int level, Vector& e, SystemMatrix& A, Vector& r); virtual void restr(Vector& rh, Vector& rl, int level); virtual void prolong (Vector& el, Vector& eh, int level); friend class RK2; }; //------------------------------------------------------------------------- class TrcNonLinearMLGS : public NonLinearMLGS { protected: Stack*> critical; public: TrcNonLinearMLGS(NonLinearity& nonLinearity0); virtual ~TrcNonLinearMLGS(); virtual void update(SystemMatrix* A, FamilyTree* familyTree, DirichletBCs* dirichletBCs); virtual void initialize(SystemMatrix* A, Vector& x, Vector& b); protected: virtual void setCritical (int node); virtual void setUnCritical(int node); virtual Bool isCritical (int node, int level); virtual void restr(Vector& rh, Vector& rl, int level); virtual void prolong (Vector& el, Vector& eh, int level); friend class RK2; }; #endif