8 : mat(mat), orthogonal(orthogonal), apply_mat(apply_mat), hermitian(hermitian), profile(profile){
21 using namespace Eigen;
25 const int N = q.size();
26 vector phi(N), psi(N);
31 std::vector<ColorSpinorField*> Q;
32 for (
int i=0; i<N; i++) Q.push_back(q[i]);
49 for (
int i=0; i<N; i++) {
50 phi(i) = A_[i*(N+1)+N];
51 for (
int j=0; j<N; j++) {
52 A(i,j) = A_[i*(N+1)+j];
61 LDLT<matrix> cholesky(A);
62 psi = cholesky.solve(phi);
67 for (
int i=0; i<N; i++) psi_[i] = psi(i);
83 std::vector<ColorSpinorField*> p, std::vector<ColorSpinorField*> q) {
88 const int N = p.size();
112 for (
int i=0; i<N; i++) {
118 std::vector<ColorSpinorField*> Pi;
120 std::vector<ColorSpinorField*> P;
121 for (
int j=i+1; j<N; j++) P.push_back(p[j]);
123 for (
int j=i+1; j<N; j++) alpha[j] = -alpha[j];
128 std::vector<ColorSpinorField*>
X;
130 std::vector<ColorSpinorField*> Y;
131 for (
int j=i+1; j<N; j++) { Y.push_back(q[j]); }
139 if (
apply_mat)
for (
int i=0; i<N; i++)
mat(*q[i], *p[i]);
144 std::vector<ColorSpinorField*>
X;
150 for (
int i=0; i<N; i++) alpha[i] = -alpha[i];
151 std::vector<ColorSpinorField*> B;
155 double rsd =
sqrt(blas::norm2(b) / b2 );
156 printfQuda(
"MinResExt: N = %d, |res| / |src| = %e\n", N, rsd);
166 std::vector<ColorSpinorField*> p(basis.size()), q(basis.size());
167 for (
unsigned int i=0; i<basis.size(); i++) { p[i] = basis[i].first; q[i] = basis[i].second; }
void ax(double a, ColorSpinorField &x)
QudaVerbosity getVerbosity()
double norm2(const ColorSpinorField &a)
void operator()(ColorSpinorField &x, ColorSpinorField &b, std::vector< std::pair< ColorSpinorField *, ColorSpinorField *> > basis)
__host__ __device__ ValueType sqrt(ValueType x)
Complex cDotProduct(ColorSpinorField &, ColorSpinorField &)
void copy(ColorSpinorField &dst, const ColorSpinorField &src)
bool hermitian
Whether to compute q = Ap or assume it is provided.
bool isRunning(QudaProfileType idx)
void solve(Complex *psi_, std::vector< ColorSpinorField *> &p, std::vector< ColorSpinorField *> &q, ColorSpinorField &b, bool hermitian)
Solve the equation A p_k psi_k = q_k psi_k = b by minimizing the residual and using Eigen's SVD algor...
TimeProfile & profile
whether A is hermitian ot not
MinResExt(DiracMatrix &mat, bool orthogonal, bool apply_mat, bool hermitian, TimeProfile &profile)
std::complex< double > Complex
void caxpy(const Complex &a, ColorSpinorField &x, ColorSpinorField &y)
void zero(ColorSpinorField &a)
bool apply_mat
Whether to construct an orthogonal basis or not.
void mat(void *out, void **link, void *in, int dagger_bit, int mu, QudaPrecision sPrecision, QudaPrecision gPrecision)