Grid 0.7.0
FermionOperator.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/action/fermion/FermionOperator.h
6
7 Copyright (C) 2015
8
9Author: Peter Boyle <pabobyle@ph.ed.ac.uk>
10Author: Peter Boyle <paboyle@ph.ed.ac.uk>
11Author: Peter Boyle <peterboyle@Peters-MacBook-Pro-2.local>
12Author: Vera Guelpers <V.M.Guelpers@soton.ac.uk>
13
14 This program is free software; you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation; either version 2 of the License, or
17 (at your option) any later version.
18
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
23
24 You should have received a copy of the GNU General Public License along
25 with this program; if not, write to the Free Software Foundation, Inc.,
26 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27
28 See the full license in the file "LICENSE" in the top level distribution directory
29*************************************************************************************/
30/* END LEGAL */
31#pragma once
32
34
36// Allow to select between gauge representation rank bc's, flavours etc.
37// and single/double precision.
39
40template<class Impl>
41class FermionOperator : public CheckerBoardedSparseMatrixBase<typename Impl::FermionField>, public Impl
42{
43public:
44
46
47 FermionOperator(const ImplParams &p= ImplParams()) : Impl(p) {};
48 virtual ~FermionOperator(void) = default;
49
50 virtual FermionField &tmp(void) = 0;
51
52 virtual void DirichletBlock(const Coordinate & _Block) { assert(0); };
53
54 GridBase * Grid(void) { return FermionGrid(); }; // this is all the linalg routines need to know
56
57 virtual GridBase *FermionGrid(void) =0;
58 virtual GridBase *FermionRedBlackGrid(void) =0;
59 virtual GridBase *GaugeGrid(void) =0;
60 virtual GridBase *GaugeRedBlackGrid(void) =0;
61
62 // override multiply
63 virtual void M (const FermionField &in, FermionField &out)=0;
64 virtual void Mdag (const FermionField &in, FermionField &out)=0;
65
66 // half checkerboard operaions
67 virtual void Meooe (const FermionField &in, FermionField &out)=0;
68 virtual void MeooeDag (const FermionField &in, FermionField &out)=0;
69 virtual void Mooee (const FermionField &in, FermionField &out)=0;
70 virtual void MooeeDag (const FermionField &in, FermionField &out)=0;
71 virtual void MooeeInv (const FermionField &in, FermionField &out)=0;
72 virtual void MooeeInvDag (const FermionField &in, FermionField &out)=0;
73
74 // non-hermitian hopping term; half cb or both
75 virtual void Dhop (const FermionField &in, FermionField &out,int dag)=0;
76 virtual void DhopOE(const FermionField &in, FermionField &out,int dag)=0;
77 virtual void DhopEO(const FermionField &in, FermionField &out,int dag)=0;
78 virtual void DhopDir(const FermionField &in, FermionField &out,int dir,int disp)=0; // implemented by WilsonFermion and WilsonFermion5D
79
80 // force terms; five routines; default to Dhop on diagonal
81 virtual void MDeriv (GaugeField &mat,const FermionField &U,const FermionField &V,int dag){DhopDeriv(mat,U,V,dag);};
82 virtual void MoeDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag){DhopDerivOE(mat,U,V,dag);};
83 virtual void MeoDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag){DhopDerivEO(mat,U,V,dag);};
84 virtual void MooDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag){mat=Zero();}; // Clover can override these
85 virtual void MeeDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag){mat=Zero();};
86
87 virtual void DhopDeriv (GaugeField &mat,const FermionField &U,const FermionField &V,int dag)=0;
88 virtual void DhopDerivEO(GaugeField &mat,const FermionField &U,const FermionField &V,int dag)=0;
89 virtual void DhopDerivOE(GaugeField &mat,const FermionField &U,const FermionField &V,int dag)=0;
90
91 virtual void Mdiag (const FermionField &in, FermionField &out) { Mooee(in,out);}; // Same as Mooee applied to both CB's
92 virtual void Mdir (const FermionField &in, FermionField &out,int dir,int disp)=0; // case by case Wilson, Clover, Cayley, ContFrac, PartFrac
93 virtual void MdirAll(const FermionField &in, std::vector<FermionField> &out)=0; // case by case Wilson, Clover, Cayley, ContFrac, PartFrac
94
95
96 virtual void MomentumSpacePropagator(FermionField &out,const FermionField &in,RealD _m,std::vector<double> twist) { assert(0);};
97
98 virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass,std::vector<Complex> boundary,std::vector<double> twist)
99 {
100 FFT theFFT((GridCartesian *) in.Grid());
101
102 typedef typename Simd::scalar_type Scalar;
103
104 FermionField in_k(in.Grid());
105 FermionField prop_k(in.Grid());
106
107 //phase for boundary condition
108 ComplexField coor(in.Grid());
109 ComplexField ph(in.Grid()); ph = Zero();
110 FermionField in_buf(in.Grid()); in_buf = Zero();
111
112 Scalar ci(0.0,1.0);
113 assert(twist.size() == Nd);//check that twist is Nd
114 assert(boundary.size() == Nd);//check that boundary conditions is Nd
115 for(unsigned int nu = 0; nu < Nd; nu++)
116 {
117 LatticeCoordinate(coor, nu);
118 double boundary_phase = ::acos(real(boundary[nu]));
119 ph = ph + boundary_phase*coor*((1./(in.Grid()->_fdimensions[nu])));
120 //momenta for propagator shifted by twist+boundary
121 twist[nu] = twist[nu] + boundary_phase/((2.0*M_PI));
122 }
123 in_buf = exp(ci*ph*(-1.0))*in;
124
125 theFFT.FFT_all_dim(in_k,in_buf,FFT::forward);
126 this->MomentumSpacePropagator(prop_k,in_k,mass,twist);
127 theFFT.FFT_all_dim(out,prop_k,FFT::backward);
128
129 //phase for boundary condition
130 out = out * exp(Scalar(2.0*M_PI)*ci*ph);
131
132 };
133
134 virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass) {
135 std::vector<Complex> boundary;
136 for(int i=0;i<Nd;i++) boundary.push_back(1);//default: periodic boundary conditions
137 std::vector<double> twist(Nd,0.0); //default: periodic boundarys in all directions
138 FreePropagator(in,out,mass,boundary,twist);
139 };
140
142 // Updates gauge field during HMC
144 virtual void ImportGauge(const GaugeField & _U)=0;
145
147 // Conserved currents, either contract at sink or insert sequentially.
149 virtual void ContractConservedCurrent(PropagatorField &q_in_1,
150 PropagatorField &q_in_2,
151 PropagatorField &q_out,
152 PropagatorField &phys_src,
153 Current curr_type,
154 unsigned int mu)
155 {assert(0);};
156 virtual void SeqConservedCurrent(PropagatorField &q_in,
157 PropagatorField &q_out,
158 PropagatorField &phys_src,
159 Current curr_type,
160 unsigned int mu,
161 unsigned int tmin,
162 unsigned int tmax,
163 ComplexField &lattice_cmplx)
164 {assert(0);};
165
166 // Only reimplemented in Wilson5D
167 // Default to just a zero correlation function
168 virtual void ContractJ5q(FermionField &q_in ,ComplexField &J5q) { J5q=Zero(); };
169 virtual void ContractJ5q(PropagatorField &q_in,ComplexField &J5q) { J5q=Zero(); };
170
172 // Physical field import/export
174 virtual void Dminus(const FermionField &psi, FermionField &chi) { chi=psi; }
175 virtual void DminusDag(const FermionField &psi, FermionField &chi) { chi=psi; }
176 virtual void ImportPhysicalFermionSource(const FermionField &input,FermionField &imported)
177 {
178 imported = input;
179 };
180 virtual void ImportUnphysicalFermion(const FermionField &input,FermionField &imported)
181 {
182 imported=input;
183 };
184 virtual void ExportPhysicalFermionSolution(const FermionField &solution,FermionField &exported)
185 {
186 exported=solution;
187 };
188 virtual void ExportPhysicalFermionSource(const FermionField &solution,FermionField &exported)
189 {
190 exported=solution;
191 };
192};
193
195
AcceleratorVector< int, MaxDims > Coordinate
Definition Coordinate.h:95
accelerator_inline Grid_simd< S, V > acos(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > exp(const Grid_simd< S, V > &r)
void LatticeCoordinate(Lattice< iobj > &l, int mu)
Lattice< vobj > real(const Lattice< vobj > &lhs)
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
static constexpr int Nd
Definition QCD.h:52
double RealD
Definition Simd.h:61
static INTERNAL_PRECISION U
Definition Zolotarev.cc:230
#define M_PI
Definition Zolotarev.cc:41
Definition FFT.h:105
static const int backward
Definition FFT.h:123
static const int forward
Definition FFT.h:122
void FFT_all_dim(Lattice< vobj > &result, const Lattice< vobj > &source, int sign)
Definition FFT.h:162
INHERIT_IMPL_TYPES(Impl)
virtual void Mdag(const FermionField &in, FermionField &out)=0
virtual void MeeDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
virtual void ImportPhysicalFermionSource(const FermionField &input, FermionField &imported)
virtual void MeoDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
virtual void Dminus(const FermionField &psi, FermionField &chi)
virtual void MoeDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
virtual GridBase * GaugeGrid(void)=0
virtual void DhopEO(const FermionField &in, FermionField &out, int dag)=0
virtual void DhopDir(const FermionField &in, FermionField &out, int dir, int disp)=0
virtual void MooeeDag(const FermionField &in, FermionField &out)=0
virtual void MooeeInvDag(const FermionField &in, FermionField &out)=0
virtual ~FermionOperator(void)=default
virtual GridBase * FermionRedBlackGrid(void)=0
virtual void ContractJ5q(PropagatorField &q_in, ComplexField &J5q)
virtual void ImportGauge(const GaugeField &_U)=0
virtual void MdirAll(const FermionField &in, std::vector< FermionField > &out)=0
virtual GridBase * GaugeRedBlackGrid(void)=0
virtual void DhopDerivOE(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)=0
virtual void SeqConservedCurrent(PropagatorField &q_in, PropagatorField &q_out, PropagatorField &phys_src, Current curr_type, unsigned int mu, unsigned int tmin, unsigned int tmax, ComplexField &lattice_cmplx)
virtual void MDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
GridBase * RedBlackGrid(void)
virtual void DirichletBlock(const Coordinate &_Block)
virtual GridBase * FermionGrid(void)=0
virtual void Meooe(const FermionField &in, FermionField &out)=0
virtual void DhopDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)=0
virtual void MooDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
virtual void FreePropagator(const FermionField &in, FermionField &out, RealD mass, std::vector< Complex > boundary, std::vector< double > twist)
virtual void MooeeInv(const FermionField &in, FermionField &out)=0
virtual void ContractJ5q(FermionField &q_in, ComplexField &J5q)
virtual void DhopDerivEO(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)=0
virtual void Mooee(const FermionField &in, FermionField &out)=0
virtual void ExportPhysicalFermionSource(const FermionField &solution, FermionField &exported)
virtual void ExportPhysicalFermionSolution(const FermionField &solution, FermionField &exported)
virtual void DminusDag(const FermionField &psi, FermionField &chi)
virtual void Dhop(const FermionField &in, FermionField &out, int dag)=0
GridBase * Grid(void)
virtual void DhopOE(const FermionField &in, FermionField &out, int dag)=0
virtual void ContractConservedCurrent(PropagatorField &q_in_1, PropagatorField &q_in_2, PropagatorField &q_out, PropagatorField &phys_src, Current curr_type, unsigned int mu)
virtual void Mdir(const FermionField &in, FermionField &out, int dir, int disp)=0
virtual FermionField & tmp(void)=0
virtual void MomentumSpacePropagator(FermionField &out, const FermionField &in, RealD _m, std::vector< double > twist)
virtual void ImportUnphysicalFermion(const FermionField &input, FermionField &imported)
virtual void FreePropagator(const FermionField &in, FermionField &out, RealD mass)
virtual void M(const FermionField &in, FermionField &out)=0
FermionOperator(const ImplParams &p=ImplParams())
virtual void Mdiag(const FermionField &in, FermionField &out)
virtual void MeooeDag(const FermionField &in, FermionField &out)=0
Definition Simd.h:194