diff --git a/examples/Example_krylov_schur.cc b/examples/Example_krylov_schur.cc index 04211cd0..d194d13d 100644 --- a/examples/Example_krylov_schur.cc +++ b/examples/Example_krylov_schur.cc @@ -105,255 +105,47 @@ template void writeFile(T& in, std::string const fname){ typedef WilsonFermionD WilsonOp; typedef typename WilsonFermionD::FermionField FermionField; - -#if 0 -// Hermitize a DWF operator by squaring it template -class SquaredLinearOperator : public LinearOperatorBase { - - public: +class InvertNonHermitianLinearOperator : public LinearOperatorBase { Matrix &_Mat; - - public: - SquaredLinearOperator(Matrix &Mat): _Mat(Mat) {}; - - void OpDiag (const Field &in, Field &out) { assert(0); } - void OpDir (const Field &in, Field &out,int dir,int disp) { assert(0); } - void OpDirAll (const Field &in, std::vector &out){ assert(0); }; - void Op (const Field &in, Field &out){ - // std::cout << "Op is overloaded as HermOp" << std::endl; - HermOp(in, out); - } - void AdjOp (const Field &in, Field &out){ - HermOp(in, out); - } - void _Op (const Field &in, Field &out){ - // std::cout << "Op: M "< -class PVdagMLinearOperator : public LinearOperatorBase { - Matrix &_Mat; - Matrix &_PV; + RealD _stp; public: - PVdagMLinearOperator(Matrix &Mat,Matrix &PV): _Mat(Mat),_PV(PV){}; - - void OpDiag (const Field &in, Field &out) { assert(0); } - void OpDir (const Field &in, Field &out,int dir,int disp) { assert(0); } - void OpDirAll (const Field &in, std::vector &out){ assert(0); }; + InvertNonHermitianLinearOperator(Matrix &Mat,RealD stp=1e-8): _Mat(Mat),_stp(stp){}; + // Support for coarsening to a multigrid + void OpDiag (const Field &in, Field &out) { +// _Mat.Mdiag(in,out); +// out = out + shift*in; + assert(0); + } + void OpDir (const Field &in, Field &out,int dir,int disp) { +// _Mat.Mdir(in,out,dir,disp); + assert(0); + } + void OpDirAll (const Field &in, std::vector &out){ +// _Mat.MdirAll(in,out); + assert(0); + }; void Op (const Field &in, Field &out){ - std::cout << "Op: PVdag M "< HermOp(_Mat); + BiCGSTAB CG(_stp,10000); + CG(HermOp,in,out); +// out = out + shift * in; } void AdjOp (const Field &in, Field &out){ - std::cout << "AdjOp: Mdag PV "< -class ShiftedPVdagMLinearOperator : public LinearOperatorBase { - Matrix &_Mat; - Matrix &_PV; - RealD shift; -public: - ShiftedPVdagMLinearOperator(RealD _shift,Matrix &Mat,Matrix &PV): shift(_shift),_Mat(Mat),_PV(PV){}; - - void OpDiag (const Field &in, Field &out) { assert(0); } - void OpDir (const Field &in, Field &out,int dir,int disp) { assert(0); } - void OpDirAll (const Field &in, std::vector &out){ assert(0); }; - void Op (const Field &in, Field &out){ - std::cout << "Op: PVdag M "< -class ShiftedComplexPVdagMLinearOperator : public LinearOperatorBase { - Matrix &_Mat; - Matrix &_PV; - ComplexD shift; -public: -ShiftedComplexPVdagMLinearOperator(ComplexD _shift,Matrix &Mat,Matrix &PV): shift(_shift),_Mat(Mat),_PV(PV){}; - - void OpDiag (const Field &in, Field &out) { assert(0); } - void OpDir (const Field &in, Field &out,int dir,int disp) { assert(0); } - void OpDirAll (const Field &in, std::vector &out){ assert(0); }; - void Op (const Field &in, Field &out){ - std::cout << "Op: PVdag M "< -class MGPreconditioner : public LinearFunction< Lattice > { -public: - using LinearFunction >::operator(); - - typedef Aggregation Aggregates; - typedef typename Aggregation::FineField FineField; - typedef typename Aggregation::CoarseVector CoarseVector; - typedef typename Aggregation::CoarseMatrix CoarseMatrix; - typedef LinearOperatorBase FineOperator; - typedef LinearFunction FineSmoother; - typedef LinearOperatorBase CoarseOperator; - typedef LinearFunction CoarseSolver; - Aggregates & _Aggregates; - FineOperator & _FineOperator; - FineSmoother & _PreSmoother; - FineSmoother & _PostSmoother; - CoarseOperator & _CoarseOperator; - CoarseSolver & _CoarseSolve; - - int level; void Level(int lv) {level = lv; }; - - MGPreconditioner(Aggregates &Agg, - FineOperator &Fine, - FineSmoother &PreSmoother, - FineSmoother &PostSmoother, - CoarseOperator &CoarseOperator_, - CoarseSolver &CoarseSolve_) - : _Aggregates(Agg), - _FineOperator(Fine), - _PreSmoother(PreSmoother), - _PostSmoother(PostSmoother), - _CoarseOperator(CoarseOperator_), - _CoarseSolve(CoarseSolve_), - level(1) { } - - virtual void operator()(const FineField &in, FineField & out) - { - GridBase *CoarseGrid = _Aggregates.CoarseGrid; - // auto CoarseGrid = _CoarseOperator.Grid(); - CoarseVector Csrc(CoarseGrid); - CoarseVector Csol(CoarseGrid); - FineField vec1(in.Grid()); - FineField vec2(in.Grid()); - - std::cout< void testSchurFromHess(Arnoldi& Arn, Field& src, int Nlarge, int Nm, int Nk) { @@ -500,6 +292,7 @@ int main (int argc, char ** argv) NonHermitianLinearOperator Dwilson(WilsonOperator); /// <----- + InvertNonHermitianLinearOperator Iwilson(WilsonOperator); /// <----- MdagMLinearOperator HermOp(WilsonOperator); /// <----- Gamma5HermitianLinearOperator HermOp2(WilsonOperator); /// <---- @@ -538,11 +331,14 @@ int main (int argc, char ** argv) // KrySchur(src, maxIter, Nm, Nk, Nstop); // KrylovSchur KrySchur (HermOp2, UGrid, resid,EvalNormSmall); // Hacked, really EvalImagSmall - KrylovSchur KrySchur (Dwilson, UGrid, resid,EvalImNormSmall); -// BlockKrylovSchur KrySchur (HermOp2, UGrid, Nu, resid,EvalNormSmall); - RealD shift=2.5; - KrySchur(src[0], maxIter, Nm, Nk, Nstop,&shift); -// KrySchur(src[0], maxIter, Nm, Nk, Nstop); +#if 0 + RealD shift=1.5; + KrylovSchur KrySchur (Dwilson, UGrid, resid,EvalImNormSmall); + KrySchur(src[0], maxIter, Nm, Nk, Nstop,&shift); +#else + KrylovSchur KrySchur (Iwilson, UGrid, resid,EvalImNormSmall); + KrySchur(src[0], maxIter, Nm, Nk, Nstop); +#endif std::cout << GridLogMessage << "evec.size= " << KrySchur.evecs.size()<< std::endl; src[0]=KrySchur.evecs[0];