6 #ifndef __syssolver_linop_fgmres_dr_h__
7 #define __syssolver_linop_fgmres_dr_h__
24 namespace LinOpSysSolverFGMRESDREnv
89 if( toBool( real(f) ==
Double(0) && imag(f) ==
Double(0) ) ) {
97 if( toBool( real(g) ==
Double(0) && imag(g) ==
Double(0) ) ) {
99 c_ = conj(f)/sqrt( norm2(f) );
100 r_ = DComplex( sqrt(norm2(f)) );
104 Double t = sqrt( norm2(f) + norm2(g) );
127 DComplex
a = H(col,row);
128 DComplex
b = H(col,row+1);
129 H(col,row) = conj(
c_)*
a + conj(
s_)*
b;
130 H(col,row+1) = -
s_*
a +
c_*
b;
136 DComplex
a = v(
col_);
137 DComplex
b = v(
col_+1);
158 using T = LatticeFermion;
159 using U = LatticeColorMatrix;
160 using Q = multi1d<U>;
177 XMLReader precond_xml_reader(precond_xml);
182 QDPIO::cout <<
"Unable to create Preconditioner" << std::endl;
187 QDPIO::cout <<
"WARNING: LAPACK Is not built!!!" << std::endl;
188 QDPIO::cout <<
"WARNING: SUBSPACE Augmentation requires it!!!!" << std::endl;
189 QDPIO::cout <<
"WARNING: Using the solver with NDefl > 0 will fail!!! " << std::endl;
190 QDPIO::cout <<
"WARNING: Run this version with NDefl = 0 only!!!!" << std::endl;
191 QDPIO::cout <<
"WARNING: OR reconfigure with --enable-lapack=lapack" << std::endl;
194 QDPIO::cout <<
" invParam.NDefl > 0: This mode is not supported without LAPACK" <<std::endl;
215 const Subset&
subset()
const {
return A_->subset();}
228 const Real& rsd_target,
231 multi2d<DComplex>& H,
232 multi2d<DComplex>& R,
234 multi1d<DComplex>& g,
235 multi2d<DComplex>& Qk,
236 multi1d<DComplex>& Qk_tau,
237 int& ndim_cycle)
const;
240 const multi1d<DComplex>& rhs,
241 multi1d<DComplex>&
eta,
245 const multi2d<DComplex>& H,
246 multi1d<DComplex>& f_m,
247 multi2d<DComplex>& evecs,
248 multi1d<DComplex>& evals,
249 multi1d<int>& order_array)
const;
261 mutable multi2d<DComplex>
H_;
262 mutable multi2d<DComplex>
R_;
263 mutable multi1d<T>
V_;
264 mutable multi1d<T>
Z_;
280 mutable multi1d<DComplex>
c_;
281 mutable multi1d<DComplex>
eta_;
282 mutable multi1d<DComplex>
g_;
Support class for fermion actions and linear operators.
void operator()(multi1d< DComplex > &v)
Givens(int col, const multi2d< DComplex > &H)
void operator()(int col, multi2d< DComplex > &H)
Class for counted reference semantics.
Solve a M*psi=chi linear system by FGMRESDR.
multi2d< DComplex > Hk_QR_
Handle< FermState< T, Q, Q > > state_
const Subset & subset() const
Return the subset on which the operator acts.
LinOpSysSolverFGMRESDR(Handle< LinearOperator< T > > A, Handle< FermState< T, Q, Q > > state, const SysSolverFGMRESDRParams &invParam)
Constructor.
void LeastSquaresSolve(const multi2d< DComplex > &R, const multi1d< DComplex > &rhs, multi1d< DComplex > &eta, int dim) const
multi1d< Handle< Givens > > givens_rots_
void FlexibleArnoldi(int n_krylov, int n_deflate, const Real &rsd_target, multi1d< T > &V, multi1d< T > &Z, multi2d< DComplex > &H, multi2d< DComplex > &R, multi1d< Handle< Givens > > &givens_rots, multi1d< DComplex > &g, multi2d< DComplex > &Qk, multi1d< DComplex > &Qk_tau, int &ndim_cycle) const
Handle< LinOpSystemSolver< T > > preconditioner_
void GetEigenvectors(int total_dim, const multi2d< DComplex > &H, multi1d< DComplex > &f_m, multi2d< DComplex > &evecs, multi1d< DComplex > &evals, multi1d< int > &order_array) const
multi1d< DComplex > Hk_QR_taus_
SystemSolverResults_t operator()(T &psi, const T &chi) const
Solver the linear system.
~LinOpSysSolverFGMRESDR()
Destructor is automatic.
Handle< LinearOperator< T > > A_
void InitMatrices()
Initialize the internal matrices.
SysSolverFGMRESDRParams invParam_
SystemSolver disambiguator.
Class for counted reference semantics.
bool registerAll()
Register all the factories.
Asqtad Staggered-Dirac operator.
LinOpSysSolverMGProtoClover::T T
multi1d< LatticeFermion > chi(Ncb)
const WilsonTypeFermAct< multi1d< LatticeFermion > > Handle< const ConnectState > state
FloatingPoint< double > Double
Reunitarize in place a color matrix to SU(N)
Support class for fermion actions and linear operators.
Params for FGMRESDR inverter.
Holds return info from SystemSolver call.
Solve an FGMRESR-DR system.
Disambiguator for LinOp system solvers.
Factory for solving M*psi=chi where M is not hermitian or pos. def.