11 :
mat(
mat), orthogonal(orthogonal), apply_mat(apply_mat), profile(profile){
31 using namespace Eigen;
35 vector phi(
p.size()), psi(
p.size());
36 matrix A(
p.size(),
p.size());
41 for (
unsigned int j=0; j<
p.size(); j++) {
43 for (
unsigned int k=j+1; k<
p.size(); k++) {
45 A(k,j) =
conj(A(j,k));
48 JacobiSVD<matrix> svd(A, ComputeThinU | ComputeThinV);
51 for (
unsigned int i=0;
i<
p.size();
i++) psi_[
i] = psi(
i);
66 const int N =
p.size();
79 for (
unsigned int j=0; j<
p.size(); j++) {
81 for (
unsigned int k=j+1; k<
p.size(); k++) {
83 A[k][j] =
conj(A[j][k]);
88 for (
int i=0;
i<N;
i++) {
92 for (
int j=
i+1; j<N; j++) if (abs(A[j][j]) >
abs(A[k][k])) k = j;
94 std::swap<Complex>(phi[k], phi[
i]);
95 for (
int j=0; j<N; j++) std::swap<Complex>(A[k][j], A[
i][j]);
99 for (
int j=
i+1; j<N; j++) {
101 phi[j] -= xp * phi[
i];
102 for (
int k=0; k<N; k++) A[j][k] -= xp * A[
i][k];
107 for (
int i=N-1;
i>=0;
i--) {
109 for (
int j=
i+1; j<N; j++) psi[
i] += A[
i][j] * psi[j];
110 psi[
i] = (phi[
i]-psi[
i])/A[
i][
i];
113 for (
int j=0; j<N; j++)
delete [] A[j];
134 std::vector<ColorSpinorField*>
p, std::vector<ColorSpinorField*> q) {
138 const int N =
p.size();
159 for (
int i=0;
i<N;
i++) {
163 for (
int j=
i+1; j<N; j++) {
181 for (
int i=0;
i<N;
i++) minus_alpha[
i] = -alpha[
i];
184 std::vector<ColorSpinorField*>
X, B;
185 X.push_back(&
x); B.push_back(&
b);
196 delete [] minus_alpha;
204 std::vector<ColorSpinorField*>
p(basis.size()), q(basis.size());
205 for (
unsigned int i=0;
i<basis.size();
i++) {
p[
i] = basis[
i].first; q[
i] = basis[
i].second; }
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 &)
std::complex< double > Complex
void ax(const double &a, ColorSpinorField &x)
void solve(Complex *psi, std::vector< ColorSpinorField *> &p, std::vector< ColorSpinorField *> &q, ColorSpinorField &b)
Solve the equation A p_k psi_k = b by minimizing the residual and using Gaussian elimination.
TimeProfile & profile
Whether to compute q = Ap or assume it is provided.
static __inline__ size_t p
void caxpy(const Complex &a, ColorSpinorField &x, ColorSpinorField &y)
void zero(ColorSpinorField &a)
bool apply_mat
Whether to construct an orthogonal basis or not.
__host__ __device__ ValueType abs(ValueType x)
__host__ __device__ ValueType conj(ValueType x)
void mat(void *out, void **link, void *in, int dagger_bit, int mu, QudaPrecision sPrecision, QudaPrecision gPrecision)
MinResExt(DiracMatrix &mat, bool orthogonal, bool apply_mat, TimeProfile &profile)