QDP++
generic_fused_spin_recon.h
Go to the documentation of this file.
1#ifndef GENERIC_FUSED_SPIN_RECON_H
2#define GENERIC_FUSED_SPIN_RECON_H
3
4namespace QDP {
5
6// Convenience Types
11
12
13// Tell the compiler what the result of the multiply
14// half spinor with gauge field operations are
15// OScalar
16template<>
23
24// Tell the compiler what the result of opreations are
25// For OLattice
26template<>
33
38{
40
41 template<class T1, class T2, int N>
43 operator()(const PScalar<T1>& a, const PSpinVector<T2,N>& b) const
44 {
45 return sreconDir0Minus(a, b);
46 }
47};
48
49
50// Proclaim that the return type of the fused op is the same as the return type
51// of the SpinReconstruction on a normal half vector
52template<class T1, class T2, int N>
57
58// For Generic Subtypes of OLattice<> and OScalar<>
59// Do the generic thing
60template<class T1, class T2, int N>
69
70// This rewrites spinReconstructDir0Minus( Matrix * Vec )
71// as a fused reconstruct: FnSReconDir0MinusProd< Matrix, Vec >
72template<class T1, class T2, template<class> class C, int N >
73inline typename MakeReturn<BinaryNode< FnSReconDir0MinusProd,
74 typename CreateLeaf< QDPType< PScalar<T1> , C<PScalar<T1> > > >::Leaf_t,
102
107{
109
110 template<class T1, class T2, int N>
112 operator()(const PScalar<T1>& a, const PSpinVector<T2,N>& b) const
113 {
114 return sreconDir0Plus(a, b);
115 }
116};
117
118
119// Proclaim that the return type of the fused op is the same as the return type
120// of the SpinReconstruction on a normal half vector
121template<class T1, class T2, int N>
126
127// For Generic Subtypes of OLattice<> and OScalar<>
128// Do the generic thing
129template<class T1, class T2, int N>
138
139// This rewrites spinReconstructDir0Plus( Matrix * Vec )
140// as a fused reconstruct: FnSReconDir0PlusProd< Matrix, Vec >
141template<class T1, class T2, template<class> class C, int N >
142inline typename MakeReturn<BinaryNode< FnSReconDir0PlusProd,
143 typename CreateLeaf< QDPType< PScalar<T1> , C<PScalar<T1> > > >::Leaf_t,
150 >,
153 OpMultiply >::Type_t >& l)
154{
155
156
158 typename CreateLeaf< QDPType< PScalar<T1> , C<PScalar<T1> > > >::Leaf_t,
159 typename CreateLeaf< QDPType< PSpinVector<T2,N>, C<PSpinVector<T2,N> > > >::Leaf_t> Tree_t;
160
161
163 Tree_t(
164 CreateLeaf<QDPType<PScalar<T1> ,C<PScalar<T1> > > >::make(l.expression().left()),
165 CreateLeaf<QDPType<PSpinVector<T2,N>,C<PSpinVector<T2,N> > > >::make(l.expression().right())
166 )
167 );
168
169
170}
171
176{
178
179 template<class T1, class T2, int N>
181 operator()(const PScalar<T1>& a, const PSpinVector<T2,N>& b) const
182 {
183 return sreconDir1Minus(a, b);
184 }
185};
186
187
188// Proclaim that the return type of the fused op is the same as the return type
189// of the SpinReconstruction on a normal half vector
190template<class T1, class T2, int N>
195
196// For Generic Subtypes of OLattice<> and OScalar<>
197// Do the generic thing
198template<class T1, class T2, int N>
207
208// This rewrites spinReconstructDir1Minus( Matrix * Vec )
209// as a fused reconstruct: FnSReconDir1MinusProd< Matrix, Vec >
210template<class T1, class T2, template<class> class C, int N >
211inline typename MakeReturn<BinaryNode< FnSReconDir1MinusProd,
212 typename CreateLeaf< QDPType< PScalar<T1> , C<PScalar<T1> > > >::Leaf_t,
214 typename BinaryReturn< C<PScalar<T1> >, C<PSpinVector<T2,N> >, FnSReconDir1MinusProd>::Type_t >::Expression_t
219 >,
222 OpMultiply >::Type_t >& l)
223{
224
225
227 typename CreateLeaf< QDPType< PScalar<T1> , C<PScalar<T1> > > >::Leaf_t,
228 typename CreateLeaf< QDPType< PSpinVector<T2,N>, C<PSpinVector<T2,N> > > >::Leaf_t> Tree_t;
229
230
232 Tree_t(
233 CreateLeaf<QDPType<PScalar<T1> ,C<PScalar<T1> > > >::make(l.expression().left()),
234 CreateLeaf<QDPType<PSpinVector<T2,N>,C<PSpinVector<T2,N> > > >::make(l.expression().right())
235 )
236 );
237
238
239}
240
245{
247
248 template<class T1, class T2, int N>
250 operator()(const PScalar<T1>& a, const PSpinVector<T2,N>& b) const
251 {
252 return sreconDir1Plus(a, b);
253 }
254};
255
256
257// Proclaim that the return type of the fused op is the same as the return type
258// of the SpinReconstruction on a normal half vector
259template<class T1, class T2, int N>
264
265// For Generic Subtypes of OLattice<> and OScalar<>
266// Do the generic thing
267template<class T1, class T2, int N>
276
277// This rewrites spinReconstructDir1Plus( Matrix * Vec )
278// as a fused reconstruct: FnSReconDir1PlusProd< Matrix, Vec >
279template<class T1, class T2, template<class> class C, int N >
280inline typename MakeReturn<BinaryNode< FnSReconDir1PlusProd,
281 typename CreateLeaf< QDPType< PScalar<T1> , C<PScalar<T1> > > >::Leaf_t,
288 >,
291 OpMultiply >::Type_t >& l)
292{
293
294
296 typename CreateLeaf< QDPType< PScalar<T1> , C<PScalar<T1> > > >::Leaf_t,
297 typename CreateLeaf< QDPType< PSpinVector<T2,N>, C<PSpinVector<T2,N> > > >::Leaf_t> Tree_t;
298
299
301 Tree_t(
302 CreateLeaf<QDPType<PScalar<T1> ,C<PScalar<T1> > > >::make(l.expression().left()),
303 CreateLeaf<QDPType<PSpinVector<T2,N>,C<PSpinVector<T2,N> > > >::make(l.expression().right())
304 )
305 );
306
307
308}
309
310
315{
317
318 template<class T1, class T2, int N>
320 operator()(const PScalar<T1>& a, const PSpinVector<T2,N>& b) const
321 {
322 return sreconDir2Minus(a, b);
323 }
324};
325
326
327// Proclaim that the return type of the fused op is the same as the return type
328// of the SpinReconstruction on a normal half vector
329template<class T1, class T2, int N>
334
335// For Generic Subtypes of OLattice<> and OScalar<>
336// Do the generic thing
337template<class T1, class T2, int N>
346
347// This rewrites spinReconstructDir2Minus( Matrix * Vec )
348// as a fused reconstruct: FnSReconDir2MinusProd< Matrix, Vec >
349template<class T1, class T2, template<class> class C, int N >
350inline typename MakeReturn<BinaryNode< FnSReconDir2MinusProd,
351 typename CreateLeaf< QDPType< PScalar<T1> , C<PScalar<T1> > > >::Leaf_t,
353 typename BinaryReturn< C<PScalar<T1> >, C<PSpinVector<T2,N> >, FnSReconDir2MinusProd>::Type_t >::Expression_t
358 >,
361 OpMultiply >::Type_t >& l)
362{
363
364
366 typename CreateLeaf< QDPType< PScalar<T1> , C<PScalar<T1> > > >::Leaf_t,
367 typename CreateLeaf< QDPType< PSpinVector<T2,N>, C<PSpinVector<T2,N> > > >::Leaf_t> Tree_t;
368
369
371 Tree_t(
372 CreateLeaf<QDPType<PScalar<T1> ,C<PScalar<T1> > > >::make(l.expression().left()),
373 CreateLeaf<QDPType<PSpinVector<T2,N>,C<PSpinVector<T2,N> > > >::make(l.expression().right())
374 )
375 );
376
377
378}
379
384{
386
387 template<class T1, class T2, int N>
389 operator()(const PScalar<T1>& a, const PSpinVector<T2,N>& b) const
390 {
391 return sreconDir2Plus(a, b);
392 }
393};
394
395
396// Proclaim that the return type of the fused op is the same as the return type
397// of the SpinReconstruction on a normal half vector
398template<class T1, class T2, int N>
403
404// For Generic Subtypes of OLattice<> and OScalar<>
405// Do the generic thing
406template<class T1, class T2, int N>
415
416// This rewrites spinReconstructDir2Plus( Matrix * Vec )
417// as a fused reconstruct: FnSReconDir2PlusProd< Matrix, Vec >
418template<class T1, class T2, template<class> class C, int N >
419inline typename MakeReturn<BinaryNode< FnSReconDir2PlusProd,
420 typename CreateLeaf< QDPType< PScalar<T1> , C<PScalar<T1> > > >::Leaf_t,
427 >,
430 OpMultiply >::Type_t >& l)
431{
432
433
435 typename CreateLeaf< QDPType< PScalar<T1> , C<PScalar<T1> > > >::Leaf_t,
436 typename CreateLeaf< QDPType< PSpinVector<T2,N>, C<PSpinVector<T2,N> > > >::Leaf_t> Tree_t;
437
438
440 Tree_t(
441 CreateLeaf<QDPType<PScalar<T1> ,C<PScalar<T1> > > >::make(l.expression().left()),
442 CreateLeaf<QDPType<PSpinVector<T2,N>,C<PSpinVector<T2,N> > > >::make(l.expression().right())
443 )
444 );
445
446
447}
448
449
454{
456
457 template<class T1, class T2, int N>
459 operator()(const PScalar<T1>& a, const PSpinVector<T2,N>& b) const
460 {
461 return sreconDir3Minus(a, b);
462 }
463};
464
465
466// Proclaim that the return type of the fused op is the same as the return type
467// of the SpinReconstruction on a normal half vector
468template<class T1, class T2, int N>
473
474// For Generic Subtypes of OLattice<> and OScalar<>
475// Do the generic thing
476template<class T1, class T2, int N>
485
486// This rewrites spinReconstructDir3Minus( Matrix * Vec )
487// as a fused reconstruct: FnSReconDir3MinusProd< Matrix, Vec >
488template<class T1, class T2, template<class> class C, int N >
489inline typename MakeReturn<BinaryNode< FnSReconDir3MinusProd,
490 typename CreateLeaf< QDPType< PScalar<T1> , C<PScalar<T1> > > >::Leaf_t,
492 typename BinaryReturn< C<PScalar<T1> >, C<PSpinVector<T2,N> >, FnSReconDir3MinusProd>::Type_t >::Expression_t
517
522{
524
525 template<class T1, class T2, int N>
527 operator()(const PScalar<T1>& a, const PSpinVector<T2,N>& b) const
528 {
529 return sreconDir3Plus(a, b);
530 }
531};
532
533
534// Proclaim that the return type of the fused op is the same as the return type
535// of the SpinReconstruction on a normal half vector
536template<class T1, class T2, int N>
541
542// For Generic Subtypes of OLattice<> and OScalar<>
543// Do the generic thing
544template<class T1, class T2, int N>
553
554// This rewrites spinReconstructDir3Plus( Matrix * Vec )
555// as a fused reconstruct: FnSReconDir3PlusProd< Matrix, Vec >
556template<class T1, class T2, template<class> class C, int N >
557inline typename MakeReturn<BinaryNode< FnSReconDir3PlusProd,
558 typename CreateLeaf< QDPType< PScalar<T1> , C<PScalar<T1> > > >::Leaf_t,
585
586
587
591
592// The actual fused op - Replace this with specialist code
593template<>
594inline BinaryReturn< PScalar<ColMat>, PSpinVector<ColVec,2>, FnSReconDir0MinusProd>::Type_t
596{
599
601 b.elem(0),
602 d.elem(0));
603
605 b.elem(1),
606 d.elem(1));
607
608 inlineSpinReconDir0Minus(&(d.elem(0).elem(0).real()),
609 &(ret.elem(0).elem(0).real()),
610 1);
611
612 return ret;
613}
614
615
616// The actual fused op - Replace this with specialist code
617template<>
618inline BinaryReturn< PScalar<ColMat>, PSpinVector<ColVec,2>, FnSReconDir0PlusProd>::Type_t
620{
623
625 b.elem(0),
626 d.elem(0));
627
629 b.elem(1),
630 d.elem(1));
631
632 inlineSpinReconDir0Plus(&(d.elem(0).elem(0).real()),
633 &(ret.elem(0).elem(0).real()),
634 1);
635
636
637 return ret;
638}
639
640// The actual fused op - Replace this with specialist code
641template<>
642inline BinaryReturn< PScalar<ColMat>, PSpinVector<ColVec,2>, FnSReconDir1MinusProd>::Type_t
644{
647
649 b.elem(0),
650 d.elem(0));
651
653 b.elem(1),
654 d.elem(1));
655
656 inlineSpinReconDir1Minus(&(d.elem(0).elem(0).real()),
657 &(ret.elem(0).elem(0).real()),
658 1);
659
660 return ret;
661}
662
663// The actual fused op - Replace this with specialist code
664template<>
665inline BinaryReturn< PScalar<ColMat>, PSpinVector<ColVec,2>, FnSReconDir1PlusProd>::Type_t
667{
670
672 b.elem(0),
673 d.elem(0));
674
676 b.elem(1),
677 d.elem(1));
678
679 inlineSpinReconDir1Plus(&(d.elem(0).elem(0).real()),
680 &(ret.elem(0).elem(0).real()),
681 1);
682
683 return ret;
684}
685
686// The actual fused op - Replace this with specialist code
687template<>
688inline BinaryReturn< PScalar<ColMat>, PSpinVector<ColVec,2>, FnSReconDir2MinusProd>::Type_t
690{
693
695 b.elem(0),
696 d.elem(0));
697
699 b.elem(1),
700 d.elem(1));
701
702 inlineSpinReconDir2Minus(&(d.elem(0).elem(0).real()),
703 &(ret.elem(0).elem(0).real()),
704 1);
705
706 return ret;
707}
708
709// The actual fused op - Replace this with specialist code
710template<>
711inline BinaryReturn< PScalar<ColMat>, PSpinVector<ColVec,2>, FnSReconDir2PlusProd>::Type_t
713{
716
718 b.elem(0),
719 d.elem(0));
720
722 b.elem(1),
723 d.elem(1));
724
725 inlineSpinReconDir2Plus(&(d.elem(0).elem(0).real()),
726 &(ret.elem(0).elem(0).real()),
727 1);
728
729 return ret;
730
731}
732
733// The actual fused op - Replace this with specialist code
734template<>
735inline BinaryReturn< PScalar<ColMat>, PSpinVector<ColVec,2>, FnSReconDir3MinusProd>::Type_t
737{
740
742 b.elem(0),
743 d.elem(0));
744
746 b.elem(1),
747 d.elem(1));
748
749 inlineSpinReconDir3Minus(&(d.elem(0).elem(0).real()),
750 &(ret.elem(0).elem(0).real()),
751 1);
752
753 return ret;
754}
755
756
757// The actual fused op - Replace this with specialist code
758template<>
759inline BinaryReturn< PScalar<ColMat>, PSpinVector<ColVec,2>, FnSReconDir3PlusProd>::Type_t
761{
764
766 b.elem(0),
767 d.elem(0));
768
770 b.elem(1),
771 d.elem(1));
772
773 inlineSpinReconDir3Plus(&(d.elem(0).elem(0).real()),
774 &(ret.elem(0).elem(0).real()),
775 1);
776
777 return ret;
778}
779
780
781} // namespace QDP
782
783#endif
#define PETE_EMPTY_CONSTRUCTORS(CLASS)
Definition PETE.h:58
Outer grid Lattice type.
Definition qdp_outer.h:264
Outer grid Scalar class *‍/.
Definition qdp_outer.h:37
Primitive color Matrix class.
Primitive color Vector class.
Primitive Scalar.
Primitive spin Vector class.
Expression class for QDP.
Definition qdp_qdpexpr.h:16
QDPType - major type class/container for all QDP objects.
Definition qdp_qdptype.h:29
#define _inline_mult_su3_mat_vec(aa, bb, cc)
OLattice< PScalar< PColorMatrix< RComplexFloat, 3 > > > C
Yet another random number generator.
BinaryReturn< PScalar< T1 >, PSpinVector< T2, N >, FnSReconDir2PlusProd >::Type_t sreconDir2Plus(const PScalar< T1 > &a, const PSpinVector< T2, N > &b)
void inlineSpinReconDir0Minus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin recon (1/2)(1-\gamma_0).
PColorVector< RComplex< REAL >, 3 > ColVec
MakeReturn< UnaryNode< FnSpinReconstructDir2Minus, typenameCreateLeaf< QDPExpr< T1, C1 > >::Leaf_t >, typenameUnaryReturn< C1, FnSpinReconstructDir2Minus >::Type_t >::Expression_t spinReconstructDir2Minus(const QDPExpr< T1, C1 > &l)
Definition qdp.h:5232
PColorMatrix< RComplex< REAL >, 3 > ColMat
void inlineSpinReconDir2Plus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin recon (1/2)(1+\gamma_2).
MakeReturn< UnaryNode< FnSpinReconstructDir2Plus, typenameCreateLeaf< QDPExpr< T1, C1 > >::Leaf_t >, typenameUnaryReturn< C1, FnSpinReconstructDir2Plus >::Type_t >::Expression_t spinReconstructDir2Plus(const QDPExpr< T1, C1 > &l)
Definition qdp.h:5180
void inlineSpinReconDir1Minus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin recon (1/2)(1-\gamma_1).
BinaryReturn< PScalar< T1 >, PSpinVector< T2, N >, FnSReconDir3PlusProd >::Type_t sreconDir3Plus(const PScalar< T1 > &a, const PSpinVector< T2, N > &b)
PSpinVector< ColVec, 4 > Spin4
MakeReturn< UnaryNode< FnSpinReconstructDir0Plus, typenameCreateLeaf< QDPExpr< T1, C1 > >::Leaf_t >, typenameUnaryReturn< C1, FnSpinReconstructDir0Plus >::Type_t >::Expression_t spinReconstructDir0Plus(const QDPExpr< T1, C1 > &l)
Definition qdp.h:5154
PSpinVector< ColVec, 2 > Spin2
BinaryReturn< PScalar< T1 >, PSpinVector< T2, N >, FnSReconDir0MinusProd >::Type_t sreconDir0Minus(const PScalar< T1 > &a, const PSpinVector< T2, N > &b)
MakeReturn< UnaryNode< FnSpinReconstructDir1Plus, typenameCreateLeaf< QDPExpr< T1, C1 > >::Leaf_t >, typenameUnaryReturn< C1, FnSpinReconstructDir1Plus >::Type_t >::Expression_t spinReconstructDir1Plus(const QDPExpr< T1, C1 > &l)
Definition qdp.h:5167
BinaryReturn< PScalar< T1 >, PSpinVector< T2, N >, FnSReconDir3MinusProd >::Type_t sreconDir3Minus(const PScalar< T1 > &a, const PSpinVector< T2, N > &b)
MakeReturn< UnaryNode< FnSpinReconstructDir1Minus, typenameCreateLeaf< QDPExpr< T1, C1 > >::Leaf_t >, typenameUnaryReturn< C1, FnSpinReconstructDir1Minus >::Type_t >::Expression_t spinReconstructDir1Minus(const QDPExpr< T1, C1 > &l)
Definition qdp.h:5219
BinaryReturn< PScalar< T1 >, PSpinVector< T2, N >, FnSReconDir1PlusProd >::Type_t sreconDir1Plus(const PScalar< T1 > &a, const PSpinVector< T2, N > &b)
void inlineSpinReconDir2Minus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin recon (1/2)(1-\gamma_2).
BinaryReturn< PScalar< T1 >, PSpinVector< T2, N >, FnSReconDir0PlusProd >::Type_t sreconDir0Plus(const PScalar< T1 > &a, const PSpinVector< T2, N > &b)
BinaryReturn< PScalar< T1 >, PSpinVector< T2, N >, FnSReconDir1MinusProd >::Type_t sreconDir1Minus(const PScalar< T1 > &a, const PSpinVector< T2, N > &b)
BinaryReturn< PScalar< T1 >, PSpinVector< T2, N >, FnSReconDir2MinusProd >::Type_t sreconDir2Minus(const PScalar< T1 > &a, const PSpinVector< T2, N > &b)
MakeReturn< UnaryNode< FnSpinReconstructDir3Minus, typenameCreateLeaf< QDPExpr< T1, C1 > >::Leaf_t >, typenameUnaryReturn< C1, FnSpinReconstructDir3Minus >::Type_t >::Expression_t spinReconstructDir3Minus(const QDPExpr< T1, C1 > &l)
Definition qdp.h:5245
void inlineSpinReconDir3Minus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin recon (1/2)(1-\gamma3).
void inlineSpinReconDir3Plus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin recon (1/2)(1+\gamma3).
MakeReturn< UnaryNode< FnSpinReconstructDir0Minus, typenameCreateLeaf< QDPExpr< T1, C1 > >::Leaf_t >, typenameUnaryReturn< C1, FnSpinReconstructDir0Minus >::Type_t >::Expression_t spinReconstructDir0Minus(const QDPExpr< T1, C1 > &l)
Definition qdp.h:5206
void inlineSpinReconDir1Plus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin recon (1/2)(1+\gamma_1).
void inlineSpinReconDir0Plus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin recon (1/2)(1+\gamma_0).
MakeReturn< UnaryNode< FnSpinReconstructDir3Plus, typenameCreateLeaf< QDPExpr< T1, C1 > >::Leaf_t >, typenameUnaryReturn< C1, FnSpinReconstructDir3Plus >::Type_t >::Expression_t spinReconstructDir3Plus(const QDPExpr< T1, C1 > &l)
Definition qdp.h:5193
OLattice< PScalar< PColorMatrix< RComplexFloat, 3 > > > C
UnaryReturn< PSpinVector< T2, N >, FnSpinReconstructDir0Minus >::Type_t Type_t
UnaryReturn< PSpinVector< T2, N >, FnSpinReconstructDir0Plus >::Type_t Type_t
UnaryReturn< PSpinVector< T2, N >, FnSpinReconstructDir1Minus >::Type_t Type_t
UnaryReturn< PSpinVector< T2, N >, FnSpinReconstructDir1Plus >::Type_t Type_t
UnaryReturn< PSpinVector< T2, N >, FnSpinReconstructDir2Minus >::Type_t Type_t
UnaryReturn< PSpinVector< T2, N >, FnSpinReconstructDir2Plus >::Type_t Type_t
UnaryReturn< PSpinVector< T2, N >, FnSpinReconstructDir3Minus >::Type_t Type_t
UnaryReturn< PSpinVector< T2, N >, FnSpinReconstructDir3Plus >::Type_t Type_t
Reconstruct Dir0Minus Fused.
BinaryReturn< PScalar< T1 >, PSpinVector< T2, N >, FnSReconDir0MinusProd >::Type_t operator()(const PScalar< T1 > &a, const PSpinVector< T2, N > &b) const
Reconstruct Dir0Plus Fused.
BinaryReturn< PScalar< T1 >, PSpinVector< T2, N >, FnSReconDir0PlusProd >::Type_t operator()(const PScalar< T1 > &a, const PSpinVector< T2, N > &b) const
Reconstruct Dir1Minus Fused.
BinaryReturn< PScalar< T1 >, PSpinVector< T2, N >, FnSReconDir1MinusProd >::Type_t operator()(const PScalar< T1 > &a, const PSpinVector< T2, N > &b) const
Reconstruct Dir1Plus Fused.
BinaryReturn< PScalar< T1 >, PSpinVector< T2, N >, FnSReconDir1PlusProd >::Type_t operator()(const PScalar< T1 > &a, const PSpinVector< T2, N > &b) const
Reconstruct Dir2Minus Fused.
BinaryReturn< PScalar< T1 >, PSpinVector< T2, N >, FnSReconDir2MinusProd >::Type_t operator()(const PScalar< T1 > &a, const PSpinVector< T2, N > &b) const
Reconstruct Dir2Plus Fused.
BinaryReturn< PScalar< T1 >, PSpinVector< T2, N >, FnSReconDir2PlusProd >::Type_t operator()(const PScalar< T1 > &a, const PSpinVector< T2, N > &b) const
Reconstruct Dir3Minus Fused.
BinaryReturn< PScalar< T1 >, PSpinVector< T2, N >, FnSReconDir3MinusProd >::Type_t operator()(const PScalar< T1 > &a, const PSpinVector< T2, N > &b) const
Reconstruct Dir3Plus Fused.
BinaryReturn< PScalar< T1 >, PSpinVector< T2, N >, FnSReconDir3PlusProd >::Type_t operator()(const PScalar< T1 > &a, const PSpinVector< T2, N > &b) const