Grid 0.7.0
FermionOperatorModules.h
Go to the documentation of this file.
1/*************************************************************************************
2
3Grid physics library, www.github.com/paboyle/Grid
4
5Source file: ./lib/qcd/modules/FermionOperatorModules.h
6
7Copyright (C) 2016
8
9Author: Guido Cossu <guido.cossu@ed.ac.uk>
10
11This program is free software; you can redistribute it and/or modify
12it under the terms of the GNU General Public License as published by
13the Free Software Foundation; either version 2 of the License, or
14(at your option) any later version.
15
16This program is distributed in the hope that it will be useful,
17but WITHOUT ANY WARRANTY; without even the implied warranty of
18MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19GNU General Public License for more details.
20
21You should have received a copy of the GNU General Public License along
22with this program; if not, write to the Free Software Foundation, Inc.,
2351 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24
25See the full license in the file "LICENSE" in the top level distribution
26directory
27*************************************************************************************/
28 /* END LEGAL */
29#ifndef FERMIONOPERATOR_MODULES_H
30#define FERMIONOPERATOR_MODULES_H
31
33
35// Fermion operators
37template < class Product>
39public:
40 virtual void AddGridPair(GridModule&) = 0;
41};
42
43template <template <typename> class FOType, class FermionImpl, class FOPar>
45 : public Parametrized<FOPar>,
46 public FermionOperatorModuleBase<FermionOperator<FermionImpl> > {
47
48protected:
49 std::unique_ptr< FOType<FermionImpl> > FOPtr;
50 std::vector< GridModule* > GridRefs;
51public:
53 typedef typename Base::Product Product;
54
55 FermionOperatorModule(FOPar Par) : Parametrized<FOPar>(Par) {}
56
57 template <class ReaderClass>
58 FermionOperatorModule(Reader<ReaderClass>& Reader) : Parametrized<FOPar>(Reader){};
59
61 if (GridRefs.size()>1){
62 std::cout << GridLogError << "Adding too many Grids to the FermionOperatorModule" << std::endl;
63 exit(1);
64 }
65 GridRefs.push_back(&Mod);
66
67 if (Ls()){
68 GridRefs.push_back(new GridModule());
69 GridRefs[1]->set_full(SpaceTimeGrid::makeFiveDimGrid(Ls(),GridRefs[0]->get_full()));
70 GridRefs[1]->set_rb(SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls(),GridRefs[0]->get_full()));
71 }
72 }
73
74 virtual unsigned int Ls(){
75 return 0;
76 }
77
78 virtual void print_parameters(){
79 std::cout << this->Par_ << std::endl;
80 }
81
83 if (!FOPtr) initialize();
84
85 return FOPtr.get();
86 }
87
88private:
89 virtual void initialize() = 0;
90};
91
92
93
94// Factory
95template <char const *str, class FermionImpl, class ReaderClass >
97 : public Factory < FermionOperatorModuleBase<FermionOperator<FermionImpl> > , Reader<ReaderClass> > {
98public:
99 // use SINGLETON FUNCTOR MACRO HERE
100 typedef Reader<ReaderClass> TheReader;
101
106 return e;
107 }
108
109private:
111 std::string obj_type() const {
112 return std::string(str);
113 }
114};
115
116
117
118
119extern char fermionop_string[];
120
121
122// Modules
128
129
130template <class FermionImpl >
131class WilsonFermionModule: public FermionOperatorModule<WilsonFermion, FermionImpl, WilsonFermionParameters> {
133 using FermBase::FermBase; // for constructors
134
135 // acquire resource
136 virtual void initialize(){
137 auto GridMod = this->GridRefs[0];
138 typename FermionImpl::GaugeField U(GridMod->get_full());
139 this->FOPtr.reset(new WilsonFermion<FermionImpl>(U, *(GridMod->get_full()), *(GridMod->get_rb()), this->Par_.mass));
140 }
141};
142
143
144
145class MobiusFermionParameters : Serializable {
146public:
148 RealD, mass,
149 RealD, M5,
150 RealD, b,
151 RealD, c,
152 unsigned int, Ls);
153};
154
155template <class FermionImpl >
156class MobiusFermionModule: public FermionOperatorModule<MobiusFermion, FermionImpl, MobiusFermionParameters> {
158 using FermBase::FermBase; // for constructors
159
160 virtual unsigned int Ls(){
161 return this->Par_.Ls;
162 }
163
164 // acquire resource
165 virtual void initialize(){
166 auto GridMod = this->GridRefs[0];
167 auto GridMod5d = this->GridRefs[1];
168 typename FermionImpl::GaugeField U(GridMod->get_full());
169 this->FOPtr.reset(new MobiusFermion<FermionImpl>( U, *(GridMod->get_full()), *(GridMod->get_rb()),
170 *(GridMod5d->get_full()), *(GridMod5d->get_rb()),
171 this->Par_.mass, this->Par_.M5, this->Par_.b, this->Par_.c));
172 }
173};
174
175
176class DomainWallFermionParameters : Serializable {
177public:
179 RealD, mass,
180 RealD, M5,
181 unsigned int, Ls);
182};
183
184template <class FermionImpl >
185class DomainWallFermionModule: public FermionOperatorModule<DomainWallFermion, FermionImpl, DomainWallFermionParameters> {
187 using FermBase::FermBase; // for constructors
188
189 virtual unsigned int Ls(){
190 return this->Par_.Ls;
191 }
192
193 // acquire resource
194 virtual void initialize(){
195 auto GridMod = this->GridRefs[0];
196 auto GridMod5d = this->GridRefs[1];
197 typename FermionImpl::GaugeField U(GridMod->get_full());
198 this->FOPtr.reset(new DomainWallFermion<FermionImpl>( U, *(GridMod->get_full()), *(GridMod->get_rb()),
199 *(GridMod5d->get_full()), *(GridMod5d->get_rb()),
200 this->Par_.mass, this->Par_.M5));
201 }
202};
203
204
206public:
208 RealD, mq1,
209 RealD, mq2,
210 RealD, mq3,
211 RealD, shift,
212 int, pm,
213 RealD, M5,
214 unsigned int, Ls);
215};
216
217template <class FermionImpl >
218class DomainWallEOFAFermionModule: public FermionOperatorModule<DomainWallEOFAFermion, FermionImpl, DomainWallEOFAFermionParameters> {
220 using FermBase::FermBase; // for constructors
221
222 virtual unsigned int Ls(){
223 return this->Par_.Ls;
224 }
225
226 // acquire resource
227 virtual void initialize(){
228 auto GridMod = this->GridRefs[0];
229 auto GridMod5d = this->GridRefs[1];
230 typename FermionImpl::GaugeField U(GridMod->get_full());
231 this->FOPtr.reset(new DomainWallEOFAFermion<FermionImpl>( U, *(GridMod->get_full()), *(GridMod->get_rb()),
232 *(GridMod5d->get_full()), *(GridMod5d->get_rb()),
233 this->Par_.mq1, this->Par_.mq2, this->Par_.mq3,
234 this->Par_.shift, this->Par_.pm, this->Par_.M5));
235 }
236};
237
239
240#endif //FERMIONOPERATOR_MODULES_H
char fermionop_string[]
GridLogger GridLogError(1, "Error", GridLogColours, "RED")
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
double RealD
Definition Simd.h:61
static INTERNAL_PRECISION U
Definition Zolotarev.cc:230
FermionOperatorModule< DomainWallEOFAFermion, FermionImpl, DomainWallEOFAFermionParameters > FermBase
GRID_SERIALIZABLE_CLASS_MEMBERS(DomainWallEOFAFermionParameters, RealD, mq1, RealD, mq2, RealD, mq3, RealD, shift, int, pm, RealD, M5, unsigned int, Ls)
FermionOperatorModule< DomainWallFermion, FermionImpl, DomainWallFermionParameters > FermBase
GRID_SERIALIZABLE_CLASS_MEMBERS(DomainWallFermionParameters, RealD, mass, RealD, M5, unsigned int, Ls)
virtual void AddGridPair(GridModule &)=0
void AddGridPair(GridModule &Mod)
virtual void initialize()=0
HMCModuleBase< FermionOperator< FermionImpl > > Base
virtual unsigned int Ls()
FermionOperatorModule(Reader< ReaderClass > &Reader)
FermionOperator< FermionImpl > Product
Definition Modules.h:97
HMC_FermionOperatorModuleFactory(const HMC_FermionOperatorModuleFactory &e)=delete
void operator=(const HMC_FermionOperatorModuleFactory &e)=delete
HMC_FermionOperatorModuleFactory(void)=default
static HMC_FermionOperatorModuleFactory & getInstance(void)
virtual unsigned int Ls()
FermionOperatorModule< MobiusFermion, FermionImpl, MobiusFermionParameters > FermBase
GRID_SERIALIZABLE_CLASS_MEMBERS(MobiusFermionParameters, RealD, mass, RealD, M5, RealD, b, RealD, c, unsigned int, Ls)
Parametrized(Parameters Par)
Definition Modules.h:51
static GridCartesian * makeFiveDimGrid(int Ls, const GridCartesian *FourDimGrid)
static GridRedBlackCartesian * makeFiveDimRedBlackGrid(int Ls, const GridCartesian *FourDimGrid)
FermionOperatorModule< WilsonFermion, FermionImpl, WilsonFermionParameters > FermBase
GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonFermionParameters, RealD, mass)