9 const multi2d<DComplex>& M,
10 const multi1d<DComplex>&
b )
14 int Nvec1 = M.size1();
15 int Nvec2 = M.size2();
17 if( Nvec1 != Nvec2 ) {
18 QDPIO::cerr <<
"Barf" << std::endl;
29 multi1d<DComplex> b_local(
b);
30 multi2d<DComplex> M_local(M);
49 for(
int i = 1;
i < Nvec;
i++) {
57 Double maxnorm = norm2(M_local(
i,
i));
61 for(
int row=
i+1; row < Nvec; row++) {
62 if ( toBool( norm2(M_local(row,
i)) > maxnorm ) ) {
65 maxnorm = norm2(M_local(row,
i));
77 for(
int j=0;
j < Nvec;
j++ ) {
79 M_local(
i,
j) = M_local(maxrow,
j);
80 M_local(maxrow,
j) =
tmp;
85 b_local[
i] = b_local[maxrow];
86 b_local[maxrow] =
tmp;
97 for(
int j=0;
j <
i;
j++) {
99 DComplex sum_LU = DComplex(0);;
100 for(
int k = 0;
k <
j;
k++) {
101 sum_LU += M_local(
i,
k)*M_local(
k,
j);
104 M_local(
i,
j) -= sum_LU;
105 M_local(
i,
j) /= M_local(
j,
j);
108 for(
int j=
i;
j < Nvec;
j++) {
109 DComplex sum_LU = DComplex(0);
110 for(
int k = 0;
k <
i;
k++) {
111 sum_LU += M_local(
i,
k)*M_local(
k,
j);
113 M_local(
i,
j) -= sum_LU;
127 multi1d<DComplex>
y(Nvec);
130 for(
int i=1;
i < Nvec;
i++) {
132 for(
int j=0;
j <
i;
j++) {
133 y[
i] -= M_local(
i,
j)*
y[
j];
138 a[Nvec-1] =
y[Nvec-1] / M_local(Nvec-1, Nvec-1);
140 for(
int i = Nvec-2;
i >= 0;
i--) {
141 DComplex tmpcmpx =
y[
i];
142 for(
int j=
i+1;
j < Nvec;
j++) {
143 tmpcmpx -= M_local(
i,
j)*
a[
j];
145 a[
i] = tmpcmpx/M_local(
i,
i);
Primary include file for CHROMA library code.
void LUSolve(multi1d< DComplex > &a, const multi2d< DComplex > &M, const multi1d< DComplex > &b)
Solve M a = b by LU decomposition with partial pivoting.
Asqtad Staggered-Dirac operator.
FloatingPoint< double > Double