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))& { }
00252 virtual void receive () { }
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