00001
00002
00003 #ifndef CH_MATRIX_CLASSES__LANCZPOL_HXX
00004 #define CH_MATRIX_CLASSES__LANCZPOL_HXX
00005
00015 #ifndef CH_MATRIX_CLASSES__LANCZOS_HXX
00016 #include "lanczos.hxx"
00017 #endif
00018 #include "clock.hxx"
00019
00020 namespace CH_Matrix_Classes {
00021
00022
00026
00027
00035 class Lanczpol:public Lanczos,protected Memarrayuser
00036 {
00037 private:
00038 int ierr;
00039 Integer maxop;
00040 Integer maxiter;
00041 Integer maxguessiter;
00042 Integer guessmult;
00043 Integer choicencheb;
00044 Integer nchebit;
00045 Integer choicenbmult;
00046 Integer nblockmult;
00047 Integer nlanczvecs;
00048 Integer retlanvecs;
00049
00050
00051 Integer neigfound;
00052 Integer blocksz;
00053 Integer iter;
00054 Integer nmult;
00055
00056 Real errc;
00057 Real eps;
00058 Real mcheps;
00059 Real maxval;
00060 Real minval;
00061 Real polval;
00062
00063 Matrix X;
00064 Matrix C;
00065 Matrix d;
00066 Matrix e;
00067 Matrix Xqr;
00068 Matrix u;
00069 Matrix v;
00070 Matrix w;
00071 Matrix minvec;
00072
00073 const Lanczosmatrix* bigmatrix;
00074
00075 int stop_above;
00076 Real upper_bound;
00077
00078 Integer ncalls;
00079 Integer mymaxj;
00080
00081 CH_Tools::GB_rand randgen;
00082
00083 CH_Tools::Clock myclock;
00084 CH_Tools::Microseconds time_mult;
00085 CH_Tools::Microseconds time_mult_sum;
00086 CH_Tools::Microseconds time_iter;
00087 CH_Tools::Microseconds time_sum;
00088
00089 int print_level;
00090 std::ostream* myout;
00091
00093 void error(const char *s){
00094 if (myout)
00095 (*myout)<<"Lanczos Error: "<<s<<std::endl;
00096 }
00097
00099 int guess_extremes(Integer nproposed);
00100
00102 int dhua(Integer nreig,Integer nproposed, Integer maxmult);
00103
00105 int bklanc(Integer neigfound,Integer blocksz,Integer s,
00106 const Matrix &d,Matrix &C,Matrix &X,
00107 Matrix &e,Matrix &u,Matrix &v);
00108
00110 int bkqrlanc(Integer neigfound,Integer blocksz,Integer s,
00111 const Matrix &d,Matrix &C,Matrix &X,
00112 Matrix &e,Matrix &u,Matrix &v);
00113
00115 int bklanccheb(Integer neigfound,Integer blocksz,Integer s,
00116 Matrix &C,Matrix &X,Matrix &e,Matrix &v);
00117
00119 int bkqrlanccheb(Integer neigfound,Integer blocksz,Integer s,
00120 Matrix &C,Matrix &X,Matrix &e,Matrix &v);
00121
00122 int pch(Integer q,Integer neigfound,Integer nreig,Integer nconv,
00123 Integer &blocksz,Integer &s,Integer iter,Integer sbs,const Matrix& d);
00124
00126 int err(Integer neigfound,Integer blocksz,const Matrix& X,Matrix &e);
00127
00129 int cnvtst(Integer neigfound,Integer blocksz,Real& errc,Real eps,
00130 const Matrix& d,const Matrix &e,Integer &nconv);
00131
00133 int eigen(Integer neigfound,Integer blocksz,Integer sbsz,Matrix& C,
00134 Matrix& d,Matrix& u,Matrix& v,Real& af);
00135
00137 int sectn(Matrix& X,Integer neigfound,Integer blocksz,
00138 Matrix& C,Matrix& d,Matrix& u,Matrix& v,
00139 Real& af);
00140
00142 int rotate_extremes(Integer neigfound,Integer sbs,Matrix& d,
00143 const Matrix& C,Matrix &X,Matrix& v);
00144
00146 int rotate(Integer neigfound,Integer sbs,Integer l,
00147 const Matrix& C,Matrix &X,Matrix& v);
00148
00150 int random(Matrix& X,Integer j);
00151
00153 Integer orthog(Integer offset,Integer blocksz,Matrix &X,Matrix& B);
00154
00156 int blockcheby(Integer col_offset,const Matrix& X,Matrix& v);
00157
00159 Real scalarcheby(Real xval);
00160
00162 int tred2(Integer n,const Matrix& C,Matrix& u,Matrix& v,Matrix& Z);
00163
00165 int tql2(Integer n,Matrix &u,Matrix &v, Matrix& Z);
00166
00167 public:
00169 Lanczpol();
00171 ~Lanczpol();
00172
00173
00180
00182 void set_mineig(Real ie){minval=ie;}
00184 void set_maxmult(Integer mop){maxop=mop;}
00186 void set_maxiter(Integer mi){maxiter=mi;}
00188 void set_relprec(Real relprec){eps=relprec;}
00190 void set_nchebit(Integer cheb){choicencheb=cheb;}
00192 void set_nblockmult(Integer nb){choicenbmult=nb;}
00193
00195 void enable_stop_above(Real ub){stop_above=1; upper_bound=ub;}
00197 void disable_stop_above(){stop_above=0;}
00198
00200 void set_retlanvecs(Integer nl){retlanvecs=nl;}
00201
00203 int get_lanczosvecs(Matrix& val,Matrix& vecs) const;
00204
00206 Real get_relprec(void){return eps;}
00207
00209 int get_err() const{return ierr;}
00211 Integer get_iter() const{return iter;}
00213 Integer get_nmult() const{return nmult;}
00214
00216
00218 int compute(const Lanczosmatrix* bigmat,
00219 Matrix& eigval,
00220 Matrix& eigvec,
00221 Integer nreig,
00222 Integer in_blocksz=0,
00223 Integer maxcol=0
00224 );
00225
00226
00227
00232
00234 void set_out(std::ostream* o=0,int pril=1)
00235 {myout=o; print_level=pril;}
00236
00237
00239 std::ostream& save(std::ostream& out) const;
00240
00242 std::istream& restore(std::istream& in);
00244 };
00245
00247
00248 }
00249
00250 #endif
00251