10#ifndef QDP_SCALARSITE_BAGEL_QDP_BLAS_H
11#define QDP_SCALARSITE_BAGEL_QDP_BLAS_H
50 REAL ar = a.
elem().elem().elem().elem();
58 int n_3vec = (s.
end()-s.
start()+1)*4;
59 qdp_vaxpy3(yptr, aptr, xptr, yptr, n_3vec);
66 REAL* xptr = (
REAL *)&(x.
elem(i).elem(0).elem(0).real());
69 qdp_vaxpy3(yptr, aptr, xptr, yptr, 4);
95 REAL ar = -( a.
elem().elem().elem().elem());
102 int n_3vec = (s.
end()-s.
start()+1)*4;
103 qdp_vaxpy3(yptr, aptr, xptr, yptr, n_3vec);
110 REAL* xptr = (
REAL *)&(x.
elem(i).elem(0).elem(0).real());
112 qdp_vaxpy3(yptr, aptr, xptr, yptr, 4);
148 const BN &mulNode =
static_cast<const BN&
> (rhs.expression().left());
154 REAL ar = a.
elem().elem().elem().elem();
164 int n_3vec = (s.
end()-s.
start()+1)*4;
165 qdp_vaxpy3(zptr, aptr, xptr, yptr, n_3vec);
171 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
172 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
174 qdp_vaxpy3(zptr, aptr, xptr, yptr, 4);
212 const BN &mulNode =
static_cast<const BN&
> (rhs.expression().right());
218 REAL ar = a.
elem().elem().elem().elem();
227 int n_3vec = (s.
end()-s.
start()+1)*4;
228 qdp_vaxpy3(zptr, aptr, xptr, yptr, n_3vec);
234 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
235 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
238 qdp_vaxpy3(zptr, aptr, xptr, yptr, 4);
271 const BN &mulNode =
static_cast<const BN&
> (rhs.expression().left());
277 REAL ar = a.
elem().elem().elem().elem();
287 int n_3vec = (s.
end()-s.
start()+1)*4;
288 qdp_vaxmy3(zptr, aptr, xptr, yptr, n_3vec);
295 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
296 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
299 qdp_vaxmy3(zptr, aptr, xptr, yptr, 4);
330 const BN &mulNode =
static_cast<const BN&
> (rhs.expression().right());
338 REAL ar = -a.
elem().elem().elem().elem();
348 int n_3vec = (s.
end()-s.
start()+1)*4;
349 qdp_vaxpy3(zptr, aptr, xptr, yptr, n_3vec);
356 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
357 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
360 qdp_vaxpy3(zptr, aptr, xptr, yptr, 4);
385 REAL ar = a.
elem().elem().elem().elem();
393 int n_3vec = (s.
end()-s.
start()+1)*4;
394 qdp_vaxpy3(yptr, aptr, xptr, yptr, n_3vec);
400 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
401 REAL *yptr = (
REAL *) &(d.
elem(i).elem(0).elem(0).real());
402 qdp_vaxpy3(yptr, aptr, xptr, yptr, 4);
429 REAL ar = -( a.
elem().elem().elem().elem());
436 int n_3vec = (s.
end()-s.
start()+1)*4;
437 qdp_vaxpy3(yptr, aptr, xptr, yptr, n_3vec);
443 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
444 REAL *yptr = (
REAL *) &(d.
elem(i).elem(0).elem(0).real());
445 qdp_vaxpy3(yptr, aptr, xptr, yptr, 4);
482 const BN &mulNode =
static_cast<const BN&
> (rhs.expression().left());
488 REAL ar = a.
elem().elem().elem().elem();
497 int n_3vec = (s.
end()-s.
start()+1)*4;
498 qdp_vaxpy3(zptr, aptr, xptr, yptr, n_3vec);
504 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
505 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
508 qdp_vaxpy3(zptr, aptr, xptr, yptr, 4);
547 const BN &mulNode =
static_cast<const BN&
> (rhs.expression().right());
553 REAL ar = a.
elem().elem().elem().elem();
562 int n_3vec = (s.
end()-s.
start()+1)*4;
563 qdp_vaxpy3(zptr, aptr, xptr, yptr, n_3vec);
569 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
570 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
573 qdp_vaxpy3(zptr, aptr, xptr, yptr, 4);
608 const BN &mulNode =
static_cast<const BN&
> (rhs.expression().left());
614 REAL ar = a.
elem().elem().elem().elem();
622 int n_3vec = (s.
end()-s.
start()+1)*4;
623 qdp_vaxmy3(zptr, aptr, xptr, yptr, n_3vec);
629 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
630 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
633 qdp_vaxmy3(zptr, aptr, xptr, yptr, 4);
667 const BN &mulNode =
static_cast<const BN&
> (rhs.expression().right());
675 REAL ar = -a.
elem().elem().elem().elem();
685 int n_3vec = (s.
end()-s.
start()+1)*4;
686 qdp_vaxpy3(zptr, aptr, xptr, yptr, n_3vec);
692 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
693 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
696 qdp_vaxpy3(zptr, aptr, xptr, yptr, 4);
716 cout <<
"BJ: v+v " << endl;
730 int n_3vec = (s.
end()-s.
start()+1)*4;
731 qdp_vaxpy3(zptr,&one, xptr, yptr, n_3vec);
737 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
738 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
741 qdp_vaxpy3(zptr,&one, xptr, yptr, 4);
759 cout <<
"BJ: v-v " << endl;
772 int n_3vec = (s.
end()-s.
start()+1)*4;
774 qdp_vaxmy3(zptr,&one, xptr, yptr, n_3vec);
780 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
781 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
784 qdp_vaxmy3(zptr,&one, xptr, yptr, 4);
802 cout <<
"BJ: v = a*v " << endl;
807 REAL ar = a.
elem().elem().elem().elem();
813 int n_3vec = (s.
end()-s.
start()+1)*4;
814 qdp_vscal3(zptr, aptr, xptr, n_3vec);
820 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
822 qdp_vscal3(zptr, aptr, xptr, 4);
841 cout <<
"BJ: v = v*a " << endl;
847 REAL ar = a.
elem().elem().elem().elem();
853 int n_3vec = (s.
end()-s.
start()+1)*4;
855 qdp_vscal3(zptr, aptr, xptr, n_3vec);
861 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
863 qdp_vscal3(zptr, aptr, xptr, 4);
887 REAL ar = a.
elem().elem().elem().elem();
892 int n_3vec = (s.
end()-s.
start()+1)*4;
893 qdp_vscal3(zptr,&ar, xptr, n_3vec);
899 REAL *xptr = (
REAL *) &(d.
elem(i).elem(0).elem(0).real());
901 qdp_vscal3(zptr, &ar, xptr, 4);
929 int n_3vec = (s.
end()-s.
start()+1)*4;
930 qdp_vscal3(zptr,&ar, xptr, n_3vec);
936 REAL *xptr = (
REAL *) &(d.
elem(i).elem(0).elem(0).real());
938 qdp_vscal3(zptr, &ar, xptr, 4);
966 int n_3vec = (s.
end() - s.
start()+1)*4;
970 qdp_vadd3(yptr, yptr, xptr,n_3vec);
976 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
977 REAL *yptr = (
REAL *)(&d.
elem(i).elem(0).elem(0).real());
979 qdp_vadd3(yptr, yptr, xptr,4);
1004 int n_3vec = (s.
end() - s.
start()+1)*4;
1008 qdp_vsub3(yptr, yptr, xptr, n_3vec);
1014 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
1015 REAL *yptr = (
REAL *)(&d.
elem(i).elem(0).elem(0).real());
1017 qdp_vsub3(yptr, yptr, xptr, 4);
1054 const BN &mulNode1 =
static_cast<const BN&
> (rhs.expression().left());
1055 const BN &mulNode2 =
static_cast<const BN&
> (rhs.expression().right());
1077 int n_3vec = (s.
end()-s.
start()+1)*4;
1078 qdp_vaxpby3(zptr, aptr, xptr, bptr, yptr, n_3vec);
1084 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
1085 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
1089 qdp_vaxpby3(zptr, aptr, xptr, bptr, yptr, 4);
1133 const BN1 &mulNode1 =
static_cast<const BN1&
> (rhs.expression().left());
1134 const BN2 &mulNode2 =
static_cast<const BN2&
> (rhs.expression().right());
1157 int n_3vec = (s.
end()-s.
start()+1)*4;
1158 qdp_vaxpby3(zptr, aptr, xptr, bptr, yptr, n_3vec);
1164 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
1165 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
1169 qdp_vaxpby3(zptr, aptr, xptr, bptr, yptr, 4);
1214 const BN1 &mulNode1 =
static_cast<const BN1&
> (rhs.expression().left());
1217 const BN2 &mulNode2 =
static_cast<const BN2&
> (rhs.expression().right());
1242 int n_3vec = (s.
end()-s.
start()+1)*4;
1243 qdp_vaxpby3(zptr, aptr, xptr, bptr, yptr, n_3vec);
1249 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
1250 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
1254 qdp_vaxpby3(zptr, aptr, xptr, bptr, yptr, 4);
1291 const BN &mulNode1 =
static_cast<const BN&
> (rhs.expression().left());
1292 const BN &mulNode2 =
static_cast<const BN&
> (rhs.expression().right());
1314 int n_3vec = (s.
end()-s.
start()+1)*4;
1315 qdp_vaxpby3(zptr, aptr, xptr, bptr, yptr, n_3vec);
1321 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
1322 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
1325 qdp_vaxpby3(zptr, aptr, xptr, bptr, yptr, 4);
1362 const BN &mulNode1 =
static_cast<const BN&
> (rhs.expression().left());
1363 const BN &mulNode2 =
static_cast<const BN&
> (rhs.expression().right());
1385 int n_3vec = (s.
end()-s.
start()+1)*4;
1386 qdp_vaxmby3(zptr, aptr, xptr, bptr, yptr, n_3vec);
1392 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
1393 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
1396 qdp_vaxmby3(zptr, aptr, xptr, bptr, yptr, 4);
1440 const BN1 &mulNode1 =
static_cast<const BN1&
> (rhs.expression().left());
1441 const BN2 &mulNode2 =
static_cast<const BN2&
> (rhs.expression().right());
1464 int n_3vec = (s.
end()-s.
start()+1)*4;
1465 qdp_vaxmby3(zptr, aptr, xptr, bptr, yptr, n_3vec);
1471 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
1472 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
1475 qdp_vaxmby3(zptr, aptr, xptr, bptr, yptr, 4);
1520 const BN1 &mulNode1 =
static_cast<const BN1&
> (rhs.expression().left());
1523 const BN2 &mulNode2 =
static_cast<const BN2&
> (rhs.expression().right());
1548 int n_3vec = (s.
end()-s.
start()+1)*4;
1549 qdp_vaxmby3(zptr, aptr, xptr, bptr, yptr, n_3vec);
1555 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
1556 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
1559 qdp_vaxmby3(zptr, aptr, xptr, bptr, yptr, 4);
1596 const BN &mulNode1 =
static_cast<const BN&
> (rhs.expression().left());
1597 const BN &mulNode2 =
static_cast<const BN&
> (rhs.expression().right());
1619 int n_3vec = (s.
end()-s.
start()+1)*4;
1620 qdp_vaxmby3(zptr, aptr, xptr, bptr, yptr, n_3vec);
1626 REAL *xptr = (
REAL *) &(x.
elem(i).elem(0).elem(0).real());
1627 REAL *yptr = (
REAL *) &(y.
elem(i).elem(0).elem(0).real());
1630 qdp_vaxmby3(zptr, aptr, xptr, bptr, yptr, 4);
1654 int n_3vec = (s.
end() - s.
start() + 1)*4;
1655 const REAL *s1ptr = &(s1.elem(s.
start()).elem(0).elem(0).real());
1657 qdp_lsum2(&lsum,(
REAL *)s1ptr, n_3vec);
1665 const REAL *s1ptr = &(s1.elem(i).elem(0).elem(0).
real());
1667 qdp_lsum2(<mp,(
REAL *)s1ptr, 4);
1693 int n_3vec = (
all.end() -
all.start() + 1)*4;
1694 const REAL *s1ptr = &(s1.elem(
all.start()).elem(0).elem(0).real());
1697 qdp_lsum2(&lsum, (
REAL *)s1ptr, n_3vec);
1722 unsigned long n_3vec = (
all.end() -
all.start() + 1)*4;
1725 qdp_lcdot(&(ip[0]), &(ip[1]),
1726 (
REAL *)&(v1.elem(
all.start()).elem(0).elem(0).real()),
1727 (
REAL *)&(v2.elem(
all.start()).elem(0).elem(0).real()),
1735 lprod.elem().elem().elem().real() = ip[0];
1736 lprod.elem().elem().elem().imag() = ip[1];
1760 unsigned long n_3vec = (s.
end() - s.
start() + 1)*4;
1761 qdp_lcdot(&(ip[0]), &(ip[1]),
1762 (
REAL *)&(v1.elem(s.
start()).elem(0).elem(0).real()),
1763 (
REAL *)&(v2.elem(s.
start()).elem(0).elem(0).real()),
1774 qdp_lcdot(&(ip_tmp[0]), &(ip_tmp[1]),
1775 (
REAL *)&(v1.elem(i).elem(0).elem(0).real()),
1776 (
REAL *)&(v2.elem(i).elem(0).elem(0).real()),
1786 lprod.elem().elem().elem().real() = ip[0];
1787 lprod.elem().elem().elem().imag() = ip[1];
1803 QDPIO::cout <<
"BJ: innerProductReal all" << endl;
1813 unsigned long n_3vec = (
all.end() -
all.start() + 1)*4;
1817 (
REAL *)&(v1.elem(
all.start()).elem(0).elem(0).real()),
1818 (
REAL *)&(v2.elem(
all.start()).elem(0).elem(0).real()),
1826 lprod.elem().elem().elem().elem() = ip_re;
1848 unsigned long n_3vec = (s.
end() - s.
start() + 1)*4;
1850 (
REAL *)&(v1.elem(s.
start()).elem(0).elem(0).real()),
1851 (
REAL *)&(v2.elem(s.
start()).elem(0).elem(0).real()),
1861 qdp_lcdotr(&ip_re_tmp,
1862 (
REAL *)&(v1.elem(i).elem(0).elem(0).real()),
1863 (
REAL *)&(v2.elem(i).elem(0).elem(0).real()),
1871 lprod.elem().elem().elem().elem() = ip_re;
1885 QDPIO::cout <<
"Using SSE multi1d sumsq all" << endl;
1888 int n_3vec = (
all.end() -
all.start() + 1)*4;
1891 for(
int n=0; n < s1.size(); ++n)
1893 const REAL* s1ptr = &(s1[n].elem(
all.start()).elem(0).elem(0).real());
1897 qdp_lsum2(&lltmp, (
REAL*)s1ptr, n_3vec);
1916 QDPIO::cout <<
"Using SSE multi1d sumsq all" << endl;
1920 for(
int n=0; n < s1.size(); ++n) {
1925 int n_3vec = (s.
end() - s.
start() + 1)*4;
1927 const REAL* s1ptr = &(s1[n].elem(s.
start()).elem(0).elem(0).real());
1931 qdp_lsum2(&lltmp, (
REAL*)s1ptr, n_3vec);
1940 const REAL* s1ptr = &(s1[n].elem(i).elem(0).elem(0).
real());
1945 qdp_lsum2(&lltmp, (
REAL*)s1ptr, 4);
1965 QDPIO::cout <<
"BJ: multi1d innerProduct all" << endl;
1977 unsigned long n_3vec = (
all.end() -
all.start() + 1)*4;
1979 for(
int n=0; n < v1.size(); ++n)
1985 qdp_lcdot(&(iip[0]), &(iip[1]),
1986 (
REAL *)&(v1[n].elem(
all.start()).elem(0).elem(0).real()),
1987 (
REAL *)&(v2[n].elem(
all.start()).elem(0).elem(0).real()),
1998 lprod.elem().elem().elem().real() = ip[0];
1999 lprod.elem().elem().elem().imag() = ip[1];
2014 QDPIO::cout <<
"BJ: innerProductReal(multi1d) all" << endl;
2025 unsigned long n_3vec = (
all.end() -
all.start() + 1)*4;
2027 for(
int n=0; n < v1.size(); ++n)
2033 (
REAL *)&(v1[n].elem(
all.start()).elem(0).elem(0).real()),
2034 (
REAL *)&(v2[n].elem(
all.start()).elem(0).elem(0).real()),
2046 lprod.elem().elem().elem().elem() = ip_re;
2060 QDPIO::cout <<
"BJ: innerProductReal(multi1d) all" << endl;
2070 for(
int n=0; n < v1.size(); ++n) {
2075 unsigned long n_3vec = (s.
end() - s.
start() + 1)*4;
2081 (
REAL *)&(v1[n].elem(s.
start()).elem(0).elem(0).real()),
2082 (
REAL *)&(v2[n].elem(s.
start()).elem(0).elem(0).real()),
2096 (
REAL *)&(v1[n].elem(i).elem(0).elem(0).
real()),
2097 (
REAL *)&(v2[n].elem(i).elem(0).elem(0).
real()),
2112 lprod.elem().elem().elem().elem() = ip_re;
Outer grid Scalar class */.
Primitive spin Vector class.
Expression class for QDP.
QDPType - major type class/container for all QDP objects.
Subsets - controls how lattices are looped.
const multi1d< int > & siteTable() const
bool hasOrderedRep() const
Container for a multi-dimensional 1D array.
const T * slice() const
Return ref to a column slice.
BinaryReturn< C1, C2, FnInnerProductReal >::Type_t innerProductReal(const QDPType< T1, C1 > &s1, const QDPType< T2, C2 > &s2)
OScalar = innerProductReal(adj(source1)*source2).
UnaryReturn< C, FnNorm2 >::Type_t norm2(const QDPType< T, C > &s1)
OScalar = norm2(trace(adj(source)*source)).
BinaryReturn< C1, C2, FnInnerProduct >::Type_t innerProduct(const QDPType< T1, C1 > &s1, const QDPType< T2, C2 > &s2)
OScalar = innerProduct(adj(source1)*source2).
void evaluate(OLattice< DCol > &d, const OpAssign &op, const QDPExpr< BinaryNode< OpMultiply, Reference< QDPType< DCol, OLattice< DCol > > >, Reference< QDPType< DCol, OLattice< DCol > > > >, OLattice< DCol > > &rhs, const Subset &s)
Subset all
Default all subset.
StandardOutputStream cout
void globalSum(T &dest)
Sum across all nodes.
void globalSumArray(unsigned int *dest, int len)
Wrapper to get a functional unsigned global sum.
Yet another random number generator.
PScalar< PScalar< RScalar< REAL > > > TScal
MakeReturn< UnaryNode< FnReal, typenameCreateLeaf< QDPExpr< T1, C1 > >::Leaf_t >, typenameUnaryReturn< C1, FnReal >::Type_t >::Expression_t real(const QDPExpr< T1, C1 > &l)
PSpinVector< PColorVector< RComplex< REAL >, 3 >, Ns > TVec