Diffpack Documentation


Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Search  

LinEqSystem.h

Go to the documentation of this file.
00001 
00005 class LinEqSystem : public HandleId
00006 
00007 {
00008 protected:
00009   LinEqPrecMode    sysprec_mode;
00010   LinEqStorageMode storage_mode;
00011 
00012   LinEqSystem (LinEqStorageMode storage_mode = EXTERNAL_STORAGE);
00013 
00014 public:
00015 
00016   virtual ~LinEqSystem () {}
00017 
00018   virtual void init () =0;  
00019   virtual void exit () =0;  
00020   virtual bool ok   () const =0;
00021 
00022   LinEqPrecMode getPrecMode () const { return sysprec_mode; }
00023 
00024   virtual bool hasLeftPrec  () const =0;
00025   virtual bool hasRightPrec () const =0;
00026 
00027   
00028   virtual void connect (Handle(LinEqCommBlk)& communication) =0;
00029   virtual void receive () =0;
00030 
00031 
00032   virtual int  getWork (const LinEqSysWork work_tp = TOTAL_WORK) const =0;
00033 
00034   virtual real getStorage
00035   (const LinEqSysStorage storage_tp = TOTAL_STORAGE) const =0;
00036 
00037   virtual void performance (LinEqStatBlk& performance_status) =0;
00038 
00039 
00040   
00041   
00042   
00043 
00044   bool compatible (LinEqPrecMode algprec_mode);
00045 
00046 
00047   
00048   virtual void residual  (LinEqVector& v,
00049                           Residual_type residual_tp = ORIGINAL_RES) =0;
00050 
00051   
00052   virtual void residuals (LinEqVector& r, LinEqVector& s) =0;
00053 
00054   
00055   virtual void residuals (LinEqVector& r, LinEqVector& s, LinEqVector& z) =0;
00056 
00057 
00058   
00059   virtual void matvec
00060   (
00061     const LinEqVector& c,
00062           LinEqVector& d,
00063           TransposeMode tpmode = NOT_TRANSPOSED,
00064           bool add_to_yb = false
00065   ) =0;
00066 
00067   
00068   virtual void matvecLeftPrec
00069   (
00070     const LinEqVector& c,
00071           LinEqVector& d,
00072           TransposeMode tpmode = NOT_TRANSPOSED
00073   ) =0;
00074 
00075   
00076   virtual void matvecRightPrec
00077   (
00078     const LinEqVector& c,
00079           LinEqVector& d,
00080           TransposeMode tpmode = NOT_TRANSPOSED
00081   ) =0;
00082 
00083   
00084   virtual void matvecPrec
00085   (
00086     const LinEqVector& c,
00087           LinEqVector& d,
00088           TransposeMode tpmode = NOT_TRANSPOSED
00089   ) =0;
00090 
00091   
00092   virtual void applyLeftPrec
00093   (
00094     const LinEqVector& c,
00095           LinEqVector& d,
00096           TransposeMode tpmode = NOT_TRANSPOSED
00097   ) =0;
00098 
00099   
00100   virtual void applyRightPrec
00101   (
00102     const LinEqVector& c,
00103           LinEqVector& d,
00104           TransposeMode tpmode = NOT_TRANSPOSED
00105   ) =0;
00106 
00107   
00108   virtual void applyPrec
00109   (
00110     const LinEqVector& c,
00111           LinEqVector& d,
00112           TransposeMode tpmode = NOT_TRANSPOSED
00113   ) =0;
00114 
00115 
00116   virtual LinEqMatrix& A () =0;
00117   virtual const LinEqMatrix& A () const =0;
00118 
00119   virtual LinEqVector& x () =0;
00120   virtual const LinEqVector& x () const =0;
00121 
00122   virtual LinEqVector& b () =0;
00123   virtual const LinEqVector& b () const =0;
00124 
00125   virtual bool factorize (const FactStrategy& fstrategy) =0;
00126   virtual void forwBack  () =0;
00127 
00128   
00129   bool allow_factorization;
00130 
00131   virtual void debugPrint (Os os, int amount_of_output = 1) const =0;
00132 
00133   CLASS_INFO
00134 
00135   DEF_VIRTUAL_CAST(LinEqSystemStd)
00136   DEF_VIRTUAL_CAST(LinEqSystemPrec)
00137   DEF_VIRTUAL_CAST(LinEqSystemBlockPrec)
00138 };
00139 
00140 
00196 class LinEqSystemStd : public LinEqSystem
00197 
00198 {
00199 protected:
00200 
00201   
00202 
00203   Handle(LinEqMatrix) Amat;
00204   Handle(LinEqVector) sol;
00205   Handle(LinEqVector) rhs;
00206 
00207   int matvecCalls;       
00208   int factorizeCalls;    
00209   int forwbackCalls;
00210 
00211   
00212   
00213   LinEqVector r;
00214 
00215 public:
00216 
00217   LinEqSystemStd (LinEqStorageMode storage_mode = EXTERNAL_STORAGE);
00218   LinEqSystemStd (LinEqMatrix& A, LinEqVector& x, LinEqVector& b);
00219   LinEqSystemStd (Matrix(NUMT)& A, Vector(NUMT)& x, Vector(NUMT)& b);
00220   ~LinEqSystemStd ();
00221 
00222   virtual void init ();
00223   virtual void exit () {}
00224   virtual bool ok   () const;
00225 
00226 
00227   void attach (LinEqMatrix& A, LinEqVector& x, LinEqVector& b);
00228   void attach (LinEqMatrix& A);
00229   void attach (LinEqVector& x, LinEqVector& b);
00230   void attach (LinEqVector& x);
00231 
00232   void attach (Matrix(NUMT)& A, Vector(NUMT)& x, Vector(NUMT)& b);
00233   void attach (Matrix(NUMT)& A);
00234   void attach (Vector(NUMT)& x, Vector(NUMT)& b);
00235   void attach (Vector(NUMT)& x);
00236 
00237   bool redim
00238   (
00239     const LinEqMatrix_prm& A_prm,
00240     const LinEqVector_prm& xb_prm
00241   );
00242 
00243   bool redim (const LinEqMatrix& A, const LinEqVector& xb);
00244 
00245 
00246   
00247   virtual bool hasLeftPrec  () const { return false; }
00248   virtual bool hasRightPrec () const { return false; }
00249 
00250   
00251   virtual void connect (Handle(LinEqCommBlk))& { /* Nothing to do */ }
00252   virtual void receive ()                      { /* Nothing to do */ }
00253 
00254 
00255   
00256   virtual int  getWork
00257     (const LinEqSysWork work_tp = TOTAL_WORK) const;
00258 
00259   virtual real getStorage
00260     (const LinEqSysStorage storage_tp = TOTAL_STORAGE) const;
00261 
00262   virtual void performance (LinEqStatBlk& performance_status);
00263 
00264   
00265   virtual void residual  (LinEqVector& v,
00266                           Residual_type residual_tp = ORIGINAL_RES);
00267   virtual void residuals (LinEqVector& r, LinEqVector& s);
00268   virtual void residuals (LinEqVector& r, LinEqVector& s, LinEqVector& z);
00269 
00270 
00271   
00272   virtual void matvec
00273   (
00274     const LinEqVector& c,
00275           LinEqVector& d,
00276           TransposeMode tpmode = NOT_TRANSPOSED,
00277           bool add_to_yb = false
00278   );
00279 
00280   
00281   virtual void matvecLeftPrec
00282   (
00283     const LinEqVector& c,
00284           LinEqVector& d,
00285           TransposeMode tpmode = NOT_TRANSPOSED
00286   );
00287 
00288   
00289   virtual void matvecRightPrec
00290   (
00291     const LinEqVector& c,
00292           LinEqVector& d,
00293           TransposeMode tpmode = NOT_TRANSPOSED
00294   );
00295 
00296   
00297   virtual void matvecPrec
00298   (
00299     const LinEqVector& c,
00300           LinEqVector& d,
00301           TransposeMode tpmode = NOT_TRANSPOSED
00302   );
00303 
00304 
00305   
00306   virtual void applyLeftPrec
00307   (
00308     const LinEqVector& c,
00309           LinEqVector& d,
00310           TransposeMode tpmode = NOT_TRANSPOSED
00311   );
00312 
00313   
00314   virtual void applyRightPrec
00315   (
00316     const LinEqVector& c,
00317           LinEqVector& d,
00318           TransposeMode tpmode = NOT_TRANSPOSED
00319   );
00320 
00321   
00322   virtual void applyPrec
00323   (
00324     const LinEqVector& c,
00325           LinEqVector& d,
00326           TransposeMode tpmode = NOT_TRANSPOSED
00327   );
00328 
00329 
00330   virtual LinEqMatrix& A ()
00331     { return *Amat; }
00332 
00333   virtual const LinEqMatrix& A () const
00334     { return *Amat; }
00335 
00336   virtual LinEqVector& x ()
00337     { return *sol; }
00338 
00339   virtual const LinEqVector& x () const
00340     { return *sol; }
00341 
00342   virtual LinEqVector& b ()
00343     { return *rhs; }
00344 
00345   virtual const LinEqVector& b () const
00346     { return *rhs; }
00347 
00348   virtual bool factorize (const FactStrategy& fstrategy);
00349   virtual void forwBack  ();
00350 
00351   virtual void debugPrint (Os os, int amount_of_output = 1) const;
00352 
00353   CLASS_INFO
00354 
00355   VIRTUAL_CAST(LinEqSystemStd)
00356 };
00357 
00358 
00568 class LinEqSystemPrec : public LinEqSystemStd
00569 
00570 {
00571 protected:
00572 
00573   Handle(Precond) Cleft;
00574   Handle(Precond) Cright;
00575 
00576   bool attachedCleft;   
00577   bool attachedCright;
00578 
00579 
00580   
00581   
00582   
00583   
00584   
00585 
00586   PrecBasis ApbLeft;     
00587   PrecBasis ApbRight;    
00588 
00589   int applyLeftCalls;    
00590   int applyRightCalls;   
00591 
00592   Handle(SubdCommAdm) comm_adm;
00593 
00594 public:
00595 
00596   LinEqSystemPrec (LinEqStorageMode storage_mode = EXTERNAL_STORAGE);
00597   LinEqSystemPrec (LinEqMatrix& A, LinEqVector& x, LinEqVector& b);
00598   LinEqSystemPrec (Matrix(NUMT)& A, Vector(NUMT)& x, Vector(NUMT)& b);
00599  ~LinEqSystemPrec ();
00600 
00601   virtual void init ();
00602   virtual void exit ();
00603   virtual bool ok   () const;
00604 
00605   void attach (LinEqMatrix& A, LinEqVector& x, LinEqVector& b);
00606   void attach (LinEqMatrix& A);
00607   void attach (LinEqVector& x, LinEqVector& b);
00608   void attach (LinEqVector& x);
00609 
00610   void attach (Matrix(NUMT)& A, Vector(NUMT)& x, Vector(NUMT)& b);
00611   void attach (Matrix(NUMT)& A);
00612   void attach (Vector(NUMT)& x, Vector(NUMT)& b);
00613   void attach (Vector(NUMT)& x);
00614 
00615   void attach (Precond_prm& precprm);
00616   void attach (Precond_prm& precprm, PrecBasis& Apb);
00617 
00618   void attach (Precond_prm& precprm, LinEqMatrix& ApbMat,
00619                bool Apb_is_A = true);
00620 
00621   void attach (Precond_prm& precprm, Matrix(NUMT)& ApbMat,
00622                bool Apb_is_A = true);
00623 
00624   void attach (Precond& prec);
00625   void attach (Precond& prec, PrecBasis& Apb);
00626   void attach (Precond& prec, LinEqMatrix& ApbMat,  bool Apb_is_A = true);
00627   void attach (Precond& prec, Matrix(NUMT)& ApbMat, bool Apb_is_A = true);
00628 
00629   Precond& getPrec (const bool left = true);
00630 
00631   void getPrec (LinEqMatrix& precmat, String& precname,
00632                 const bool left = true) const;
00633 
00634 
00635   
00636   virtual bool hasLeftPrec  () const { return attachedCleft;  }
00637   virtual bool hasRightPrec () const { return attachedCright; }
00638 
00639 
00640   
00641   virtual void connect (Handle(LinEqCommBlk)& communication);
00642   virtual void receive ();
00643 
00644 
00645   
00646   virtual int  getWork
00647   (const LinEqSysWork work_tp = TOTAL_WORK) const;
00648 
00649   virtual real getStorage
00650   (const LinEqSysStorage storage_tp = TOTAL_STORAGE) const;
00651 
00652   virtual void performance (LinEqStatBlk& performance_status);
00653 
00654   
00655   virtual void residual (LinEqVector& v,
00656                          Residual_type residual_tp = ORIGINAL_RES);
00657 
00658   
00659   virtual void residuals (LinEqVector& r, LinEqVector& s);
00660 
00661   
00662   virtual void residuals (LinEqVector& r, LinEqVector& s, LinEqVector& z);
00663 
00664   virtual void matvec
00665     (
00666      const LinEqVector& c,
00667            LinEqVector& d,
00668            TransposeMode tpmode = NOT_TRANSPOSED,
00669            bool add_to_yb = false
00670     );
00671 
00672   
00673   virtual void matvecLeftPrec
00674   (
00675     const LinEqVector& c,
00676           LinEqVector& d,
00677           TransposeMode tpmode = NOT_TRANSPOSED
00678   );
00679 
00680   
00681   virtual void matvecRightPrec
00682   (
00683     const LinEqVector& c,
00684           LinEqVector& d,
00685           TransposeMode tpmode = NOT_TRANSPOSED
00686   );
00687 
00688   
00689   virtual void matvecPrec
00690   (
00691     const LinEqVector& c,
00692           LinEqVector& d,
00693           TransposeMode tpmode = NOT_TRANSPOSED
00694   );
00695 
00696   
00697   virtual void applyLeftPrec
00698   (
00699     const LinEqVector& c,
00700           LinEqVector& d,
00701           TransposeMode tpmode = NOT_TRANSPOSED
00702   );
00703 
00704   
00705   virtual void applyRightPrec
00706   (
00707     const LinEqVector& c,
00708           LinEqVector& d,
00709           TransposeMode tpmode = NOT_TRANSPOSED
00710   );
00711 
00712   
00713   virtual void applyPrec
00714   (
00715     const LinEqVector& c,
00716           LinEqVector& d,
00717           TransposeMode tpmode = NOT_TRANSPOSED
00718   );
00719 
00720 
00721   
00722 
00723   virtual bool factorize (const FactStrategy& fstrategy);
00724   virtual void forwBack  ();
00725 
00726   virtual void debugPrint (Os os, int amount_of_output = 1) const;
00727 
00728   void attachCommAdm (const SubdCommAdm& adm_);
00729 
00730   CLASS_INFO
00731 
00732   VIRTUAL_CAST(LinEqSystemPrec)
00733 };
00734 
00735 
00881 class LinEqSystemBlockPrec : public LinEqSystemPrec
00882 
00883 {
00884 public:
00885   MatSimplest(Handle(Precond)) Cleft_mat;
00886   MatSimplest(Handle(Precond)) Cright_mat;
00887 
00888   MatSimplest(Handle(LinEqMatrix)) left_matrices;
00889   MatSimplest(Handle(LinEqMatrix)) right_matrices;
00890 
00891   MatSimplest(bool) attachedCleft_mat;
00892   MatSimplest(bool) attachedCright_mat;
00893   MatSimplest(bool) attachedApbLeft_mat;
00894   MatSimplest(bool) attachedApbRight_mat;
00895 
00896   MatSimplest(Handle(PrecBasis)) ApbLeft_mat;
00897   MatSimplest(Handle(PrecBasis)) ApbRight_mat;
00898 
00899   VecSimplest(Handle(LinEqVector)) d_lvec;
00900   VecSimplest(Handle(LinEqVector)) c_lvec;
00901   VecSimplest(Handle(Vec(NUMT))) d_vec;
00902   VecSimplest(Handle(Vec(NUMT))) c_vec;
00903 
00904   int number_of_precs;
00905   bool diag;
00906   bool block;
00907   bool initialized;
00908   int colblocks;
00909   int rowblocks;
00910 
00911 
00912   LinEqSystemBlockPrec (LinEqStorageMode storage_mode = EXTERNAL_STORAGE);
00913   LinEqSystemBlockPrec (int cols, int rows, 
00914                         LinEqStorageMode storage_mode = EXTERNAL_STORAGE);
00915   LinEqSystemBlockPrec (LinEqMatrix& A, LinEqVector& x, LinEqVector& b);
00916   LinEqSystemBlockPrec (Matrix(NUMT)& A, Vector(NUMT)& x, Vector(NUMT)& b);
00917   virtual ~LinEqSystemBlockPrec (){}
00918 
00919   void initBlocks ();
00920   virtual void init();
00921 
00922   void setNumberOfBlocks(int i, int j, bool diagonal = true);
00923 
00924   virtual void attach (Precond_prm& precprm, int i);
00925   void attach (Precond_prm& precprm, PrecBasis& Apb, int i) ;
00926 
00927   void attach (Precond_prm& precprm, LinEqMatrix& ApbMat, int i,
00928                bool Apb_is_A = true);
00929 
00930   void attach (Precond_prm& precprm, Matrix(NUMT)& ApbMat, int i,
00931                bool Apb_is_A = true);
00932   void attach (Precond& prec, int i);
00933   void attach (Precond& prec, PrecBasis& Apb, int i);
00934   void attach (Precond& prec, LinEqMatrix& ApbMat,  int i,
00935                bool Apb_is_A = true);
00936   void attach (Precond& prec, Matrix(NUMT)& ApbMat, int i,
00937                bool Apb_is_A = true);
00938 
00939   Precond& getPrec (int i, const bool left = true);
00940   Precond& getPrec (const bool left = true);
00941 
00942   
00943 
00944   void attach (LinEqMatrix& A, LinEqVector& x, LinEqVector& b)
00945     { LinEqSystemPrec ::attach(A,x,b); }
00946 
00947   void attach (LinEqMatrix& A)
00948     { LinEqSystemPrec ::attach(A); }
00949 
00950   void attach (LinEqVector& x, LinEqVector& b)
00951     { LinEqSystemPrec ::attach(x,b); }
00952 
00953   void attach (LinEqVector& x)
00954     { LinEqSystemPrec ::attach(x); }
00955 
00956   void attach (Matrix(NUMT)& A, Vector(NUMT)& x, Vector(NUMT)& b)
00957     { LinEqSystemPrec ::attach(A,x,b); }
00958 
00959   void attach (Matrix(NUMT)& A)
00960     { LinEqSystemPrec ::attach(A); }
00961 
00962   void attach (Vector(NUMT)& x, Vector(NUMT)& b)
00963     { LinEqSystemPrec ::attach(x,b); }
00964 
00965   void attach (Vector(NUMT)& x)
00966     { LinEqSystemPrec ::attach(x); }
00967 
00968   void attach (Precond_prm& precprm)
00969     { LinEqSystemPrec ::attach(precprm); }
00970 
00971   void attach (Precond_prm& precprm, PrecBasis& Apb)
00972   { LinEqSystemPrec ::attach(precprm,Apb); }
00973 
00974   void attach (Precond_prm& precprm, LinEqMatrix& ApbMat,
00975                bool Apb_is_A = true)
00976     { LinEqSystemPrec ::attach(precprm,ApbMat,Apb_is_A); }
00977 
00978   void attach (Precond_prm& precprm, Matrix(NUMT)& ApbMat,
00979                bool Apb_is_A = true)
00980     { LinEqSystemPrec ::attach(precprm,ApbMat,Apb_is_A); }
00981 
00982   void attach (Precond& prec)
00983     { LinEqSystemPrec ::attach(prec); }
00984 
00985   void attach (Precond& prec, PrecBasis& Apb)
00986     { LinEqSystemPrec ::attach(prec,Apb); }
00987 
00988   void attach (Precond& prec, LinEqMatrix& ApbMat,  bool Apb_is_A = true)
00989     { LinEqSystemPrec ::attach(prec,ApbMat,Apb_is_A); }
00990 
00991   void attach (Precond& prec, Matrix(NUMT)& ApbMat, bool Apb_is_A = true)
00992     { LinEqSystemPrec ::attach(prec,ApbMat,Apb_is_A); }
00993 
00994   void getPrec (LinEqMatrix& precmat, String& precname,
00995                 const bool left = true) const;
00996 
00997   virtual bool hasLeftPrec () const;
00998   virtual bool hasRightPrec () const;
00999 
01000   
01001   virtual void applyLeftPrec
01002   (
01003     const LinEqVector& c,
01004           LinEqVector& d,
01005           TransposeMode tpmode = NOT_TRANSPOSED
01006   );
01007 
01008   
01009   virtual void applyRightPrec
01010   (
01011     const LinEqVector& c,
01012     LinEqVector& d,
01013     TransposeMode tpmode = NOT_TRANSPOSED
01014   );
01015   
01016   virtual void applyLeftBlockDiagPrec
01017   (
01018     const LinEqVector& c,
01019           LinEqVector& d,
01020           TransposeMode tpmode = NOT_TRANSPOSED
01021   );
01022 
01023   
01024   virtual void applyRightBlockDiagPrec
01025   (
01026     const LinEqVector& c,
01027           LinEqVector& d,
01028           TransposeMode tpmode = NOT_TRANSPOSED
01029   );
01030 
01031   virtual bool ok() const ;
01032   virtual void printBlockStructure(Os os) const;
01033   virtual void debugPrint (Os os, int amount_of_output = 1) const;
01034 
01035   virtual int  getWork
01036   (const LinEqSysWork work_tp = TOTAL_WORK) const;
01037 
01038   virtual real getStorage
01039   (const LinEqSysStorage storage_tp = TOTAL_STORAGE) const;
01040 
01041   virtual void performance (LinEqStatBlk& performance_status);
01042 
01043 
01044   CLASS_INFO
01045   VIRTUAL_CAST(LinEqSystemBlockPrec)
01046 };
01047 
01048 

Copyright © 2003 inuTech GmbH. All rights reserved.