/************************************************************************************* Grid physics library, www.github.com/paboyle/Grid Source file: ./lib/qcd/QCD.h Copyright (C) 2015 Author: Azusa Yamaguchi Author: Peter Boyle Author: Peter Boyle Author: neo Author: paboyle This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. See the full license in the file "LICENSE" in the top level distribution directory *************************************************************************************/ /* END LEGAL */ #ifndef GRID_QCD_BASE_H #define GRID_QCD_BASE_H NAMESPACE_BEGIN(Grid); static const int Xdir = 0; static const int Ydir = 1; static const int Zdir = 2; static const int Tdir = 3; static const int Xp = 0; static const int Yp = 1; static const int Zp = 2; static const int Tp = 3; static const int Xm = 4; static const int Ym = 5; static const int Zm = 6; static const int Tm = 7; static const int Nc=3; static const int Ns=4; static const int Nd=4; static const int Nhs=2; // half spinor static const int Nds=8; // double stored gauge field static const int Ngp=2; // gparity index range ////////////////////////////////////////////////////////////////////////////// // QCD iMatrix types // Index conventions: Lorentz x Spin x Colour // note: static const int or constexpr will work for type deductions // with the intel compiler (up to version 17) ////////////////////////////////////////////////////////////////////////////// #define ColourIndex 2 #define SpinIndex 1 #define LorentzIndex 0 // Also should make these a named enum type static const int DaggerNo=0; static const int DaggerYes=1; static const int InverseNo=0; static const int InverseYes=1; // Useful traits is this a spin index //typename std::enable_if,SpinorIndex>::value,iVector >::type *SFINAE; const int SpinorIndex = 2; template struct isSpinor { static const bool value = (SpinorIndex==T::TensorLevel); }; template using IfSpinor = Invoke::value,int> > ; template using IfNotSpinor = Invoke::value,int> > ; // ChrisK very keen to add extra space for Gparity doubling. // // Also add domain wall index, in a way where Wilson operator // naturally distributes across the 5th dimensions. // // That probably makes for GridRedBlack4dCartesian grid. // s,sp,c,spc,lc template using iSinglet = iScalar > >; template using iSpinMatrix = iScalar, Ns> >; template using iColourMatrix = iScalar > > ; template using iSpinColourMatrix = iScalar, Ns> >; template using iLorentzColourMatrix = iVector >, Nd > ; template using iDoubleStoredColourMatrix = iVector >, Nds > ; template using iSpinVector = iScalar, Ns> >; template using iColourVector = iScalar > >; template using iSpinColourVector = iScalar, Ns> >; template using iHalfSpinVector = iScalar, Nhs> >; template using iHalfSpinColourVector = iScalar, Nhs> >; template using iGparitySpinColourVector = iVector, Ns>, Ngp >; template using iGparityHalfSpinColourVector = iVector, Nhs>, Ngp >; // Spin matrix typedef iSpinMatrix SpinMatrix; typedef iSpinMatrix SpinMatrixF; typedef iSpinMatrix SpinMatrixD; typedef iSpinMatrix vSpinMatrix; typedef iSpinMatrix vSpinMatrixF; typedef iSpinMatrix vSpinMatrixD; // Colour Matrix typedef iColourMatrix ColourMatrix; typedef iColourMatrix ColourMatrixF; typedef iColourMatrix ColourMatrixD; typedef iColourMatrix vColourMatrix; typedef iColourMatrix vColourMatrixF; typedef iColourMatrix vColourMatrixD; // SpinColour matrix typedef iSpinColourMatrix SpinColourMatrix; typedef iSpinColourMatrix SpinColourMatrixF; typedef iSpinColourMatrix SpinColourMatrixD; typedef iSpinColourMatrix vSpinColourMatrix; typedef iSpinColourMatrix vSpinColourMatrixF; typedef iSpinColourMatrix vSpinColourMatrixD; // LorentzColour typedef iLorentzColourMatrix LorentzColourMatrix; typedef iLorentzColourMatrix LorentzColourMatrixF; typedef iLorentzColourMatrix LorentzColourMatrixD; typedef iLorentzColourMatrix vLorentzColourMatrix; typedef iLorentzColourMatrix vLorentzColourMatrixF; typedef iLorentzColourMatrix vLorentzColourMatrixD; // DoubleStored gauge field typedef iDoubleStoredColourMatrix DoubleStoredColourMatrix; typedef iDoubleStoredColourMatrix DoubleStoredColourMatrixF; typedef iDoubleStoredColourMatrix DoubleStoredColourMatrixD; typedef iDoubleStoredColourMatrix vDoubleStoredColourMatrix; typedef iDoubleStoredColourMatrix vDoubleStoredColourMatrixF; typedef iDoubleStoredColourMatrix vDoubleStoredColourMatrixD; // Spin vector typedef iSpinVector SpinVector; typedef iSpinVector SpinVectorF; typedef iSpinVector SpinVectorD; typedef iSpinVector vSpinVector; typedef iSpinVector vSpinVectorF; typedef iSpinVector vSpinVectorD; // Colour vector typedef iColourVector ColourVector; typedef iColourVector ColourVectorF; typedef iColourVector ColourVectorD; typedef iColourVector vColourVector; typedef iColourVector vColourVectorF; typedef iColourVector vColourVectorD; // SpinColourVector typedef iSpinColourVector SpinColourVector; typedef iSpinColourVector SpinColourVectorF; typedef iSpinColourVector SpinColourVectorD; typedef iSpinColourVector vSpinColourVector; typedef iSpinColourVector vSpinColourVectorF; typedef iSpinColourVector vSpinColourVectorD; // HalfSpin vector typedef iHalfSpinVector HalfSpinVector; typedef iHalfSpinVector HalfSpinVectorF; typedef iHalfSpinVector HalfSpinVectorD; typedef iHalfSpinVector vHalfSpinVector; typedef iHalfSpinVector vHalfSpinVectorF; typedef iHalfSpinVector vHalfSpinVectorD; // HalfSpinColour vector typedef iHalfSpinColourVector HalfSpinColourVector; typedef iHalfSpinColourVector HalfSpinColourVectorF; typedef iHalfSpinColourVector HalfSpinColourVectorD; typedef iHalfSpinColourVector vHalfSpinColourVector; typedef iHalfSpinColourVector vHalfSpinColourVectorF; typedef iHalfSpinColourVector vHalfSpinColourVectorD; // singlets typedef iSinglet TComplex; // FIXME This is painful. Tensor singlet complex type. typedef iSinglet TComplexF; // FIXME This is painful. Tensor singlet complex type. typedef iSinglet TComplexD; // FIXME This is painful. Tensor singlet complex type. typedef iSinglet vTComplex ; // what if we don't know the tensor structure typedef iSinglet vTComplexF; // what if we don't know the tensor structure typedef iSinglet vTComplexD; // what if we don't know the tensor structure typedef iSinglet TReal; // Shouldn't need these; can I make it work without? typedef iSinglet TRealF; // Shouldn't need these; can I make it work without? typedef iSinglet TRealD; // Shouldn't need these; can I make it work without? typedef iSinglet vTReal; typedef iSinglet vTRealF; typedef iSinglet vTRealD; typedef iSinglet vTInteger; typedef iSinglet TInteger; // Lattices of these typedef Lattice LatticeColourMatrix; typedef Lattice LatticeColourMatrixF; typedef Lattice LatticeColourMatrixD; typedef Lattice LatticeSpinMatrix; typedef Lattice LatticeSpinMatrixF; typedef Lattice LatticeSpinMatrixD; typedef Lattice LatticeSpinColourMatrix; typedef Lattice LatticeSpinColourMatrixF; typedef Lattice LatticeSpinColourMatrixD; typedef Lattice LatticeLorentzColourMatrix; typedef Lattice LatticeLorentzColourMatrixF; typedef Lattice LatticeLorentzColourMatrixD; // DoubleStored gauge field typedef Lattice LatticeDoubleStoredColourMatrix; typedef Lattice LatticeDoubleStoredColourMatrixF; typedef Lattice LatticeDoubleStoredColourMatrixD; typedef Lattice LatticeSpinVector; typedef Lattice LatticeSpinVectorF; typedef Lattice LatticeSpinVectorD; typedef Lattice LatticeColourVector; typedef Lattice LatticeColourVectorF; typedef Lattice LatticeColourVectorD; typedef Lattice LatticeSpinColourVector; typedef Lattice LatticeSpinColourVectorF; typedef Lattice LatticeSpinColourVectorD; typedef Lattice LatticeHalfSpinVector; typedef Lattice LatticeHalfSpinVectorF; typedef Lattice LatticeHalfSpinVectorD; typedef Lattice LatticeHalfSpinColourVector; typedef Lattice LatticeHalfSpinColourVectorF; typedef Lattice LatticeHalfSpinColourVectorD; typedef Lattice LatticeReal; typedef Lattice LatticeRealF; typedef Lattice LatticeRealD; typedef Lattice LatticeComplex; typedef Lattice LatticeComplexF; typedef Lattice LatticeComplexD; typedef Lattice LatticeInteger; // Predicates for "where" /////////////////////////////////////////// // Physical names for things /////////////////////////////////////////// typedef LatticeHalfSpinColourVector LatticeHalfFermion; typedef LatticeHalfSpinColourVectorF LatticeHalfFermionF; typedef LatticeHalfSpinColourVectorF LatticeHalfFermionD; typedef LatticeSpinColourVector LatticeFermion; typedef LatticeSpinColourVectorF LatticeFermionF; typedef LatticeSpinColourVectorD LatticeFermionD; typedef LatticeSpinColourMatrix LatticePropagator; typedef LatticeSpinColourMatrixF LatticePropagatorF; typedef LatticeSpinColourMatrixD LatticePropagatorD; typedef LatticeLorentzColourMatrix LatticeGaugeField; typedef LatticeLorentzColourMatrixF LatticeGaugeFieldF; typedef LatticeLorentzColourMatrixD LatticeGaugeFieldD; typedef LatticeDoubleStoredColourMatrix LatticeDoubledGaugeField; typedef LatticeDoubleStoredColourMatrixF LatticeDoubledGaugeFieldF; typedef LatticeDoubleStoredColourMatrixD LatticeDoubledGaugeFieldD; template using LorentzScalar = Lattice >; // Uhgg... typing this hurt ;) // (my keyboard got burning hot when I typed this, must be the anti-Fermion) typedef Lattice LatticeStaggeredFermion; typedef Lattice LatticeStaggeredFermionF; typedef Lattice LatticeStaggeredFermionD; typedef Lattice LatticeStaggeredPropagator; typedef Lattice LatticeStaggeredPropagatorF; typedef Lattice LatticeStaggeredPropagatorD; ////////////////////////////////////////////////////////////////////////////// // Peek and Poke named after physics attributes ////////////////////////////////////////////////////////////////////////////// //spin template auto peekSpin(const vobj &rhs,int i) -> decltype(PeekIndex(rhs,0)) { return PeekIndex(rhs,i); } template auto peekSpin(const vobj &rhs,int i,int j) -> decltype(PeekIndex(rhs,0,0)) { return PeekIndex(rhs,i,j); } template auto peekSpin(const Lattice &rhs,int i) -> decltype(PeekIndex(rhs,0)) { return PeekIndex(rhs,i); } template auto peekSpin(const Lattice &rhs,int i,int j) -> decltype(PeekIndex(rhs,0,0)) { return PeekIndex(rhs,i,j); } //colour template auto peekColour(const vobj &rhs,int i) -> decltype(PeekIndex(rhs,0)) { return PeekIndex(rhs,i); } template auto peekColour(const vobj &rhs,int i,int j) -> decltype(PeekIndex(rhs,0,0)) { return PeekIndex(rhs,i,j); } template auto peekColour(const Lattice &rhs,int i) -> decltype(PeekIndex(rhs,0)) { return PeekIndex(rhs,i); } template auto peekColour(const Lattice &rhs,int i,int j) -> decltype(PeekIndex(rhs,0,0)) { return PeekIndex(rhs,i,j); } //lorentz template auto peekLorentz(const vobj &rhs,int i) -> decltype(PeekIndex(rhs,0)) { return PeekIndex(rhs,i); } template auto peekLorentz(const Lattice &rhs,int i) -> decltype(PeekIndex(rhs,0)) { return PeekIndex(rhs,i); } ////////////////////////////////////////////// // Poke lattice ////////////////////////////////////////////// template void pokeColour(Lattice &lhs, const Lattice(lhs[0],0))> & rhs, int i) { PokeIndex(lhs,rhs,i); } template void pokeColour(Lattice &lhs, const Lattice(lhs[0],0,0))> & rhs, int i,int j) { PokeIndex(lhs,rhs,i,j); } template void pokeSpin(Lattice &lhs, const Lattice(lhs[0],0))> & rhs, int i) { PokeIndex(lhs,rhs,i); } template void pokeSpin(Lattice &lhs, const Lattice(lhs[0],0,0))> & rhs, int i,int j) { PokeIndex(lhs,rhs,i,j); } template void pokeLorentz(Lattice &lhs, const Lattice(lhs[0],0))> & rhs, int i) { PokeIndex(lhs,rhs,i); } ////////////////////////////////////////////// // Poke scalars ////////////////////////////////////////////// template void pokeSpin(vobj &lhs,const decltype(peekIndex(lhs,0)) & rhs,int i) { pokeIndex(lhs,rhs,i); } template void pokeSpin(vobj &lhs,const decltype(peekIndex(lhs,0,0)) & rhs,int i,int j) { pokeIndex(lhs,rhs,i,j); } template void pokeColour(vobj &lhs,const decltype(peekIndex(lhs,0)) & rhs,int i) { pokeIndex(lhs,rhs,i); } template void pokeColour(vobj &lhs,const decltype(peekIndex(lhs,0,0)) & rhs,int i,int j) { pokeIndex(lhs,rhs,i,j); } template void pokeLorentz(vobj &lhs,const decltype(peekIndex(lhs,0)) & rhs,int i) { pokeIndex(lhs,rhs,i); } ////////////////////////////////////////////// // Fermion <-> propagator assignements ////////////////////////////////////////////// template void FermToProp(Prop &p, const Ferm &f, const int s, const int c) { for(int j = 0; j < Ns; ++j) { auto pjs = peekSpin(p, j, s); auto fj = peekSpin(f, j); for(int i = 0; i < Nc; ++i) { pokeColour(pjs, peekColour(fj, i), i, c); } pokeSpin(p, pjs, j, s); } } template void PropToFerm(Ferm &f, const Prop &p, const int s, const int c) { for(int j = 0; j < Ns; ++j) { auto pjs = peekSpin(p, j, s); auto fj = peekSpin(f, j); for(int i = 0; i < Nc; ++i) { pokeColour(fj, peekColour(pjs, i, c), i); } pokeSpin(f, fj, j); } } ////////////////////////////////////////////// // transpose array and scalar ////////////////////////////////////////////// template inline Lattice transposeSpin(const Lattice &lhs){ return transposeIndex(lhs); } template inline Lattice transposeColour(const Lattice &lhs){ return transposeIndex(lhs); } template inline vobj transposeSpin(const vobj &lhs){ return transposeIndex(lhs); } template inline vobj transposeColour(const vobj &lhs){ return transposeIndex(lhs); } ////////////////////////////////////////// // Trace lattice and non-lattice ////////////////////////////////////////// template inline auto traceSpin(const Lattice &lhs) -> Lattice(lhs[0]))> { return traceIndex(lhs); } template inline auto traceColour(const Lattice &lhs) -> Lattice(lhs[0]))> { return traceIndex(lhs); } template inline auto traceSpin(const vobj &lhs) -> Lattice(lhs))> { return traceIndex(lhs); } template inline auto traceColour(const vobj &lhs) -> Lattice(lhs))> { return traceIndex(lhs); } ////////////////////////////////////////// // Current types ////////////////////////////////////////// GRID_SERIALIZABLE_ENUM(Current, undef, Vector, 0, Axial, 1, Tadpole, 2); NAMESPACE_END(Grid); #endif