Grid 0.7.0
LinalgUtils.h
Go to the documentation of this file.
1/*************************************************************************************
2
3 Grid physics library, www.github.com/paboyle/Grid
4
5 Source file: ./lib/qcd/utils/LinalgUtils.h
6
7 Copyright (C) 2015
8
9Author: Peter Boyle <paboyle@ph.ed.ac.uk>
10Author: Peter Boyle <peterboyle@Peters-MacBook-Pro-2.local>
11Author: paboyle <paboyle@ph.ed.ac.uk>
12
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 2 of the License, or
16 (at your option) any later version.
17
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License along
24 with this program; if not, write to the Free Software Foundation, Inc.,
25 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26
27 See the full license in the file "LICENSE" in the top level distribution directory
28*************************************************************************************/
29/* END LEGAL */
30#pragma once
31
33
35//This file brings additional linear combination assist that is helpful
36//to QCD such as chiral projectors and spin matrices applied to one of the inputs.
37//These routines support five-D chiral fermions and contain s-subslice indexing
38//on the 5d (rb4d) checkerboarded lattices
40
41template<class vobj,class Coeff>
42void axpibg5x(Lattice<vobj> &z,const Lattice<vobj> &x,Coeff a,Coeff b)
43{
44 z.Checkerboard() = x.Checkerboard();
45 conformable(x,z);
46
47 GridBase *grid=x.Grid();
48
49 Gamma G5(Gamma::Algebra::Gamma5);
52 accelerator_for( ss, x_v.size(),vobj::Nsimd(), {
53 auto tmp = a*x_v(ss) + G5*(b*timesI(x_v(ss)));
54 coalescedWrite(z_v[ss],tmp);
55 });
56}
57
58template<class vobj,class Coeff>
59void axpby_ssp(Lattice<vobj> &z, Coeff a,const Lattice<vobj> &x,Coeff b,const Lattice<vobj> &y,int s,int sp)
60{
61 z.Checkerboard() = x.Checkerboard();
62 conformable(x,y);
63 conformable(x,z);
64 GridBase *grid=x.Grid();
65 int Ls = grid->_rdimensions[0];
66 autoView( x_v, x, AcceleratorRead);
67 autoView( y_v, y, AcceleratorRead);
68 autoView( z_v, z, AcceleratorWrite);
69 // FIXME -- need a new class of accelerator_loop to implement this
70 //
71 uint64_t nloop = grid->oSites()/Ls;
72 accelerator_for(sss,nloop,vobj::Nsimd(),{
73 uint64_t ss = sss*Ls;
74 auto tmp = a*x_v(ss+s)+b*y_v(ss+sp);
75 coalescedWrite(z_v[ss+s],tmp);
76 });
77}
78
79template<class vobj,class Coeff>
80void ag5xpby_ssp(Lattice<vobj> &z,Coeff a,const Lattice<vobj> &x,Coeff b,const Lattice<vobj> &y,int s,int sp)
81{
82 z.Checkerboard() = x.Checkerboard();
83 conformable(x,y);
84 conformable(x,z);
85 GridBase *grid=x.Grid();
86 int Ls = grid->_rdimensions[0];
87 Gamma G5(Gamma::Algebra::Gamma5);
88 autoView( x_v, x, AcceleratorRead);
89 autoView( y_v, y, AcceleratorRead);
90 autoView( z_v, z, AcceleratorWrite);
91 uint64_t nloop = grid->oSites()/Ls;
92 accelerator_for(sss,nloop,vobj::Nsimd(),{
93 uint64_t ss = sss*Ls;
94 auto tmp = G5*x_v(ss+s)*a + b*y_v(ss+sp);
95 coalescedWrite(z_v[ss+s],tmp);
96 });
97}
98
99template<class vobj,class Coeff>
100void axpbg5y_ssp(Lattice<vobj> &z,Coeff a,const Lattice<vobj> &x,Coeff b,const Lattice<vobj> &y,int s,int sp)
101{
102 z.Checkerboard() = x.Checkerboard();
103 conformable(x,y);
104 conformable(x,z);
105 GridBase *grid=x.Grid();
106 int Ls = grid->_rdimensions[0];
107 autoView( x_v, x, AcceleratorRead);
108 autoView( y_v, y, AcceleratorRead);
109 autoView( z_v, z, AcceleratorWrite);
110 Gamma G5(Gamma::Algebra::Gamma5);
111 uint64_t nloop = grid->oSites()/Ls;
112 accelerator_for(sss,nloop,vobj::Nsimd(),{
113 uint64_t ss = sss*Ls;
114 auto tmp = G5*y_v(ss+sp)*b + a*x_v(ss+s);
115 coalescedWrite(z_v[ss+s],tmp);
116 });
117}
118
119template<class vobj,class Coeff>
120void ag5xpbg5y_ssp(Lattice<vobj> &z,Coeff a,const Lattice<vobj> &x,Coeff b,const Lattice<vobj> &y,int s,int sp)
121{
122 z.Checkerboard() = x.Checkerboard();
123 conformable(x,y);
124 conformable(x,z);
125 GridBase *grid=x.Grid();
126 int Ls = grid->_rdimensions[0];
127
128 autoView( x_v, x, AcceleratorRead);
129 autoView( y_v, y, AcceleratorRead);
130 autoView( z_v, z, AcceleratorWrite);
131 Gamma G5(Gamma::Algebra::Gamma5);
132 uint64_t nloop = grid->oSites()/Ls;
133 accelerator_for(sss,nloop,vobj::Nsimd(),{
134 uint64_t ss = sss*Ls;
135 auto tmp1 = a*x_v(ss+s)+b*y_v(ss+sp);
136 auto tmp2 = G5*tmp1;
137 coalescedWrite(z_v[ss+s],tmp2);
138 });
139}
140
141template<class vobj,class Coeff>
142void axpby_ssp_pminus(Lattice<vobj> &z,Coeff a,const Lattice<vobj> &x,Coeff b,const Lattice<vobj> &y,int s,int sp)
143{
144 z.Checkerboard() = x.Checkerboard();
145 conformable(x,y);
146 conformable(x,z);
147 GridBase *grid=x.Grid();
148 int Ls = grid->_rdimensions[0];
149
150 autoView( x_v, x, AcceleratorRead);
151 autoView( y_v, y, AcceleratorRead);
152 autoView( z_v, z, AcceleratorWrite);
153 uint64_t nloop = grid->oSites()/Ls;
154 accelerator_for(sss,nloop,vobj::Nsimd(),{
155 uint64_t ss = sss*Ls;
156 decltype(coalescedRead(y_v[ss+sp])) tmp;
157 spProj5m(tmp,y_v(ss+sp));
158 tmp = a*x_v(ss+s)+b*tmp;
159 coalescedWrite(z_v[ss+s],tmp);
160 });
161}
162
163template<class vobj,class Coeff>
164void axpby_ssp_pplus(Lattice<vobj> &z,Coeff a,const Lattice<vobj> &x,Coeff b,const Lattice<vobj> &y,int s,int sp)
165{
166 z.Checkerboard() = x.Checkerboard();
167 conformable(x,y);
168 conformable(x,z);
169 GridBase *grid=x.Grid();
170 int Ls = grid->_rdimensions[0];
171 autoView( x_v, x, AcceleratorRead);
172 autoView( y_v, y, AcceleratorRead);
173 autoView( z_v, z, AcceleratorWrite);
174 uint64_t nloop = grid->oSites()/Ls;
175 accelerator_for(sss,nloop,vobj::Nsimd(),{
176 uint64_t ss = sss*Ls;
177 decltype(coalescedRead(y_v[ss+sp])) tmp;
178 spProj5p(tmp,y_v(ss+sp));
179 tmp = a*x_v(ss+s)+b*tmp;
180 coalescedWrite(z_v[ss+s],tmp);
181 });
182}
183
184template<class vobj>
186{
187 GridBase *grid=x.Grid();
188 z.Checkerboard() = x.Checkerboard();
189 conformable(x,z);
190 int Ls = grid->_rdimensions[0];
191 autoView( x_v, x, AcceleratorRead);
192 autoView( z_v, z, AcceleratorWrite);
193 uint64_t nloop = grid->oSites()/Ls;
194 accelerator_for(sss,nloop,vobj::Nsimd(),{
195 uint64_t ss = sss*Ls;
196 for(int s=0;s<Ls;s++){
197 int sp = Ls-1-s;
198 auto tmp = x_v(ss+s);
199 decltype(tmp) tmp_p;
200 decltype(tmp) tmp_m;
201 spProj5p(tmp_p,tmp);
202 spProj5m(tmp_m,tmp);
203 // Use of spProj5m, 5p captures the coarse space too
204 coalescedWrite(z_v[ss+sp],tmp_p - tmp_m);
205 }
206 });
207}
208
209template<typename vobj>
211{
212 GridBase *grid = x.Grid();
213 z.Checkerboard() = x.Checkerboard();
214 conformable(x, z);
215
216 autoView( x_v, x, AcceleratorRead);
217 autoView( z_v, z, AcceleratorWrite);
218 uint64_t nloop = grid->oSites();
219 accelerator_for(ss,nloop,vobj::Nsimd(),{
220 auto tmp = x_v(ss);
221 decltype(tmp) tmp_p;
222 decltype(tmp) tmp_m;
223 spProj5p(tmp_p,tmp);
224 spProj5m(tmp_m,tmp);
225 coalescedWrite(z_v[ss],tmp_p - tmp_m);
226 });
227}
228
229/*
230template<class CComplex, int nbasis>
231void G5C(Lattice<iVector<CComplex, nbasis>> &z, const Lattice<iVector<CComplex, nbasis>> &x)
232{
233 GridBase *grid = x.Grid();
234 z.Checkerboard() = x.Checkerboard();
235 conformable(x, z);
236
237 static_assert(nbasis % 2 == 0, "");
238 int nb = nbasis / 2;
239
240 autoView( z_v, z, AcceleratorWrite);
241 autoView( x_v, x, AcceleratorRead);
242 accelerator_for(ss,grid->oSites(),CComplex::Nsimd(),
243 {
244 for(int n = 0; n < nb; ++n) {
245 coalescedWrite(z_v[ss](n), x_v(ss)(n));
246 }
247 for(int n = nb; n < nbasis; ++n) {
248 coalescedWrite(z_v[ss](n), -x_v(ss)(n));
249 }
250 });
251}
252*/
253
255
#define accelerator_for(iterator, num, nsimd,...)
void conformable(const Lattice< obj1 > &lhs, const Lattice< obj2 > &rhs)
#define autoView(l_v, l, mode)
void axpby_ssp_pplus(Lattice< vobj > &z, Coeff a, const Lattice< vobj > &x, Coeff b, const Lattice< vobj > &y, int s, int sp)
void axpby_ssp_pminus(Lattice< vobj > &z, Coeff a, const Lattice< vobj > &x, Coeff b, const Lattice< vobj > &y, int s, int sp)
void ag5xpby_ssp(Lattice< vobj > &z, Coeff a, const Lattice< vobj > &x, Coeff b, const Lattice< vobj > &y, int s, int sp)
Definition LinalgUtils.h:80
void ag5xpbg5y_ssp(Lattice< vobj > &z, Coeff a, const Lattice< vobj > &x, Coeff b, const Lattice< vobj > &y, int s, int sp)
void G5R5(Lattice< vobj > &z, const Lattice< vobj > &x)
void axpby_ssp(Lattice< vobj > &z, Coeff a, const Lattice< vobj > &x, Coeff b, const Lattice< vobj > &y, int s, int sp)
Definition LinalgUtils.h:59
void axpibg5x(Lattice< vobj > &z, const Lattice< vobj > &x, Coeff a, Coeff b)
Definition LinalgUtils.h:42
void axpbg5y_ssp(Lattice< vobj > &z, Coeff a, const Lattice< vobj > &x, Coeff b, const Lattice< vobj > &y, int s, int sp)
void G5C(Lattice< vobj > &z, const Lattice< vobj > &x)
@ AcceleratorRead
@ AcceleratorWrite
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
accelerator_inline void coalescedWrite(vobj &__restrict__ vec, const vobj &__restrict__ extracted, int lane=0)
Definition Tensor_SIMT.h:87
accelerator_inline vobj coalescedRead(const vobj &__restrict__ vec, int lane=0)
Definition Tensor_SIMT.h:61
accelerator_inline void spProj5m(iVector< vtype, Nhs > &hspin, const iVector< vtype, Ns > &fspin)
Definition TwoSpinor.h:146
accelerator_inline void spProj5p(iVector< vtype, Nhs > &hspin, const iVector< vtype, Ns > &fspin)
Definition TwoSpinor.h:140
Definition Gamma.h:10
int oSites(void) const
Coordinate _rdimensions
accelerator_inline int Checkerboard(void) const
GridBase * Grid(void) const