Grid 0.7.0
ActionModules.h
Go to the documentation of this file.
1/*************************************************************************************
2
3Grid physics library, www.github.com/paboyle/Grid
4
5Source file: ./lib/qcd/modules/ActionModules.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 ACTION_MODULES_H
30#define ACTION_MODULES_H
31
32 /*
33 Define loadable, serializable modules
34 for the HMC execution
35 */
36
38
40// Actions
42
43template <class Product, class R>
44class ActionModuleBase: public HMCModuleBase<Product>{
45public:
46 typedef R Resource;
47 virtual void acquireResource(R& ){};
48
49};
50
51
52template <class ActionType, class APar>
54 : public Parametrized<APar>,
55 public ActionModuleBase< Action<typename ActionType::GaugeField> , GridModule > {
56public:
58 typedef typename Base::Product Product;
59 typedef APar Parameters;
60
61 std::unique_ptr<ActionType> ActionPtr;
62
63 ActionModule(APar Par) : Parametrized<APar>(Par) {}
64
65 template <class ReaderClass>
66 ActionModule(Reader<ReaderClass>& Reader) : Parametrized<APar>(Reader){};
67
68
72
74 if (!ActionPtr) initialize();
75
76 return ActionPtr.get();
77 }
78
79private:
80 virtual void initialize() = 0;
81
82};
83
85// Modules
87
88
89
97
98class RBCGaugeActionParameters : Serializable {
99public:
101 RealD, beta,
102 RealD, c1);
103
104};
105
111
112
113
114
115template <class Impl >
116class WilsonGModule: public ActionModule<WilsonGaugeAction<Impl>, BetaGaugeActionParameters> {
118 using ActionBase::ActionBase; // for constructors
119
120 // acquire resource
121 virtual void initialize(){
122 this->ActionPtr.reset(new WilsonGaugeAction<Impl>(this->Par_.beta));
123 }
124
125};
126
127template <class Impl >
128class PlaqPlusRectangleGModule: public ActionModule<PlaqPlusRectangleAction<Impl>, PlaqPlusRectangleGaugeActionParameters> {
130 using ActionBase::ActionBase; // for constructors
131
132 // acquire resource
133 virtual void initialize(){
134 this->ActionPtr.reset(new PlaqPlusRectangleAction<Impl>(this->Par_.c_plaq, this->Par_.c_rect));
135 }
136
137};
138
139template <class Impl >
140class RBCGModule: public ActionModule<RBCGaugeAction<Impl>, RBCGaugeActionParameters> {
142 using ActionBase::ActionBase; // for constructors
143
144 // acquire resource
145 virtual void initialize(){
146 this->ActionPtr.reset(new RBCGaugeAction<Impl>(this->Par_.beta, this->Par_.c1));
147 }
148
149};
150
151
152
153
154template <class Impl >
155class SymanzikGModule: public ActionModule<SymanzikGaugeAction<Impl>, BetaGaugeActionParameters> {
157 using ActionBase::ActionBase; // for constructors
158
159 // acquire resource
160 virtual void initialize(){
161 this->ActionPtr.reset(new SymanzikGaugeAction<Impl>(this->Par_.beta));
162 }
163
164};
165
166template <class Impl >
167class IwasakiGModule: public ActionModule<IwasakiGaugeAction<Impl>, BetaGaugeActionParameters> {
169 using ActionBase::ActionBase; // for constructors
170
171 // acquire resource
172 virtual void initialize(){
173 this->ActionPtr.reset(new IwasakiGaugeAction<Impl>(this->Par_.beta));
174 }
175
176};
177
178
179template <class Impl >
180class DBW2GModule: public ActionModule<DBW2GaugeAction<Impl>, BetaGaugeActionParameters> {
182 using ActionBase::ActionBase; // for constructors
183
184 // acquire resource
185 virtual void initialize(){
186 this->ActionPtr.reset(new DBW2GaugeAction<Impl>(this->Par_.beta));
187 }
188
189};
190
192// Fermion Actions
194
195
196template <class Impl, template <typename> class FermionA, class Params = NoParameters >
197class PseudoFermionModuleBase: public ActionModule<FermionA<Impl>, Params> {
198protected:
200 using ActionBase::ActionBase; // for constructors
201
202 typedef std::unique_ptr<FermionOperatorModuleBase<FermionOperator<Impl>> > operator_type;
203 typedef std::unique_ptr<HMCModuleBase<OperatorFunction<typename Impl::FermionField> > > solver_type;
204
205 template <class ReaderClass>
206 void getFermionOperator(Reader<ReaderClass>& Reader, operator_type &fo, std::string section_name){
208 Reader.push(section_name);
209 std::string op_name;
210 read(Reader,"name", op_name);
211 fo = FOFactory.create(op_name, Reader);
212 Reader.pop();
213 }
214
215 template <class ReaderClass>
216 void getSolverOperator(Reader<ReaderClass>& Reader, solver_type &so, std::string section_name){
218 Reader.push(section_name);
219 std::string solv_name;
220 read(Reader,"name", solv_name);
221 so = SolverFactory.create(solv_name, Reader);
222 Reader.pop();
223 }
224};
225
226
227template <class Impl >
228class TwoFlavourFModule: public PseudoFermionModuleBase<Impl, TwoFlavourPseudoFermionAction>{
230 using Base::Base;
231
234
235public:
236 virtual void acquireResource(typename Base::Resource& GridMod){
237 fop_mod->AddGridPair(GridMod);
238 }
239
240 // constructor
241 template <class ReaderClass>
242 TwoFlavourFModule(Reader<ReaderClass>& R): Base(R) {
243 this->getSolverOperator(R, solver_mod, "Solver");
244 this->getFermionOperator(R, fop_mod, "Operator");
245 }
246
247 // acquire resource
248 virtual void initialize() {
249 // here temporarily assuming that the force and action solver are the same
250 this->ActionPtr.reset(new TwoFlavourPseudoFermionAction<Impl>(*(this->fop_mod->getPtr()), *(this->solver_mod->getPtr()), *(this->solver_mod->getPtr())));
251 }
252
253};
254
255// very similar, I could have templated this but it is overkilling
256template <class Impl >
257class TwoFlavourEOFModule: public PseudoFermionModuleBase<Impl, TwoFlavourEvenOddPseudoFermionAction>{
259 using Base::Base;
260
263
264public:
265 virtual void acquireResource(typename Base::Resource& GridMod){
266 fop_mod->AddGridPair(GridMod);
267 }
268
269 // constructor
270 template <class ReaderClass>
272 this->getSolverOperator(R, solver_mod, "Solver");
273 this->getFermionOperator(R, fop_mod, "Operator");
274 }
275
276 // acquire resource
277 virtual void initialize() {
278 // here temporarily assuming that the force and action solver are the same
279 this->ActionPtr.reset(new TwoFlavourEvenOddPseudoFermionAction<Impl>(*(this->fop_mod->getPtr()), *(this->solver_mod->getPtr()), *(this->solver_mod->getPtr())));
280 }
281
282};
283
284
285template <class Impl >
286class TwoFlavourRatioFModule: public PseudoFermionModuleBase<Impl, TwoFlavourRatioPseudoFermionAction>{
288 using Base::Base;
289
293
294public:
295 virtual void acquireResource(typename Base::Resource& GridMod){
296 fop_numerator_mod->AddGridPair(GridMod);
297 fop_denominator_mod->AddGridPair(GridMod);
298 }
299
300 // constructor
301 template <class ReaderClass>
303 this->getSolverOperator(R, solver_mod, "Solver");
304 this->getFermionOperator(R, fop_numerator_mod, "Numerator");
305 this->getFermionOperator(R, fop_denominator_mod, "Denominator");
306 }
307
308 // acquire resource
309 virtual void initialize() {
310 // here temporarily assuming that the force and action solver are the same
311 this->ActionPtr.reset(new TwoFlavourRatioPseudoFermionAction<Impl>(*(this->fop_numerator_mod->getPtr()),
312 *(this->fop_denominator_mod->getPtr()), *(this->solver_mod->getPtr()), *(this->solver_mod->getPtr())));
313 }
314
315};
316
317template <class Impl >
318class TwoFlavourRatioEOFModule: public PseudoFermionModuleBase<Impl, TwoFlavourEvenOddRatioPseudoFermionAction>{
320 using Base::Base;
321
325
326public:
327 virtual void acquireResource(typename Base::Resource& GridMod){
328 fop_numerator_mod->AddGridPair(GridMod);
329 fop_denominator_mod->AddGridPair(GridMod);
330 }
331
332 // constructor
333 template <class ReaderClass>
334 TwoFlavourRatioEOFModule(Reader<ReaderClass>& R): Base(R) {
335 this->getSolverOperator(R, solver_mod, "Solver");
336 this->getFermionOperator(R, fop_numerator_mod, "Numerator");
337 this->getFermionOperator(R, fop_denominator_mod, "Denominator");
338 }
339
340 // acquire resource
341 virtual void initialize() {
342 // here temporarily assuming that the force and action solver are the same
343 this->ActionPtr.reset(new TwoFlavourEvenOddRatioPseudoFermionAction<Impl>(*(this->fop_numerator_mod->getPtr()),
344 *(this->fop_denominator_mod->getPtr()), *(this->solver_mod->getPtr()), *(this->solver_mod->getPtr())));
345 }
346
347};
348
349
350template <class Impl >
351class OneFlavourFModule: public PseudoFermionModuleBase<Impl, OneFlavourRationalPseudoFermionAction, OneFlavourRationalParams>{
353 using Base::Base;
354
356
357public:
358 virtual void acquireResource(typename Base::Resource& GridMod){
359 fop_mod->AddGridPair(GridMod);
360 }
361
362 // constructor
363 template <class ReaderClass>
364 OneFlavourFModule(Reader<ReaderClass>& R): Base(R) {
365 this->getFermionOperator(R, fop_mod, "Operator");
366 }
367
368 // acquire resource
369 virtual void initialize() {
370 this->ActionPtr.reset(new OneFlavourRationalPseudoFermionAction<Impl>(*(this->fop_mod->getPtr()), this->Par_ ));
371 }
372
373};
374
375template <class Impl >
377 public PseudoFermionModuleBase<Impl, OneFlavourEvenOddRationalPseudoFermionAction, OneFlavourRationalParams>
378{
380 using Base::Base;
381
383
384public:
385 virtual void acquireResource(typename Base::Resource& GridMod){
386 fop_mod->AddGridPair(GridMod);
387 }
388
389 // constructor
390 template <class ReaderClass>
391 OneFlavourEOFModule(Reader<ReaderClass>& R): Base(R) {
392 this->getFermionOperator(R, fop_mod, "Operator");
393 }
394
395 // acquire resource
396 virtual void initialize() {
397 this->ActionPtr.reset(new OneFlavourEvenOddRationalPseudoFermionAction<Impl>(*(this->fop_mod->getPtr()), this->Par_ ));
398 }
399
400};
401
402
403template <class Impl >
405 public PseudoFermionModuleBase<Impl, OneFlavourRatioRationalPseudoFermionAction, OneFlavourRationalParams>
406{
407
409 using Base::Base;
410
413
414public:
415 virtual void acquireResource(typename Base::Resource& GridMod){
416 fop_numerator_mod->AddGridPair(GridMod);
417 fop_denominator_mod->AddGridPair(GridMod);
418 }
419
420 // constructor
421 template <class ReaderClass>
422 OneFlavourRatioFModule(Reader<ReaderClass>& R): Base(R) {
423 this->getFermionOperator(R, fop_numerator_mod, "Numerator");
424 this->getFermionOperator(R, fop_denominator_mod, "Denominator");
425 }
426
427 // acquire resource
428 virtual void initialize() {
429 this->ActionPtr.reset(new OneFlavourRatioRationalPseudoFermionAction<Impl>( *(this->fop_numerator_mod->getPtr()),
430 *(this->fop_denominator_mod->getPtr()),
431 this->Par_ ));
432 }
433
434};
435
436
437template <class Impl >
439 public PseudoFermionModuleBase<Impl, OneFlavourEvenOddRatioRationalPseudoFermionAction, OneFlavourRationalParams>
440{
441
443 using Base::Base;
444
447
448public:
449 virtual void acquireResource(typename Base::Resource& GridMod){
450 fop_numerator_mod->AddGridPair(GridMod);
451 fop_denominator_mod->AddGridPair(GridMod);
452 }
453
454 // constructor
455 template <class ReaderClass>
456 OneFlavourRatioEOFModule(Reader<ReaderClass>& R): Base(R) {
457 this->getFermionOperator(R, fop_numerator_mod, "Numerator");
458 this->getFermionOperator(R, fop_denominator_mod, "Denominator");
459 }
460
461 // acquire resource
462 virtual void initialize() {
463 this->ActionPtr.reset(new OneFlavourEvenOddRatioRationalPseudoFermionAction<Impl>(*(this->fop_numerator_mod->getPtr()),
464 *(this->fop_denominator_mod->getPtr()),
465 this->Par_ ));
466 }
467
468};
469
471// Factories specialisations
473// use the same classed defined by Antonin, does not make sense to rewrite
474// Factory is perfectly fine
475// Registar must be changed because I do not want to use the ModuleFactory
476// explicit ref to LatticeGaugeField must be changed or put in the factory
477//typedef ActionModuleBase< Action< LatticeGaugeField >, GridModule > HMC_LGTActionModBase;
478//typedef ActionModuleBase< Action< LatticeReal >, GridModule > HMC_ScalarActionModBase;
479
480template <char const *str, class Field, class ReaderClass >
482 : public Factory < ActionModuleBase< Action< Field >, GridModule > , Reader<ReaderClass> > {
483public:
484 typedef Reader<ReaderClass> TheReader;
485 // use SINGLETON FUNCTOR MACRO HERE
487 void operator=(const HMC_ActionModuleFactory& e) = delete;
490 return e;
491 }
492
493private:
494 HMC_ActionModuleFactory(void) = default;
495 std::string obj_type() const {
496 return std::string(str);
497 }
498};
499
500extern char gauge_string[];
501
503
504#endif //HMC_MODULES_H
char gauge_string[]
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
double RealD
Definition Simd.h:61
virtual void acquireResource(R &)
ActionModule(Reader< ReaderClass > &Reader)
ActionModuleBase< Action< typename ActionType::GaugeField >, GridModule > Base
virtual void initialize()=0
Base::Product Product
Product * getPtr()
std::unique_ptr< WilsonGaugeAction< Impl > > ActionPtr
virtual void print_parameters()
ActionModule(APar Par)
GRID_SERIALIZABLE_CLASS_MEMBERS(BetaGaugeActionParameters, RealD, beta)
ActionModule< DBW2GaugeAction< Impl >, BetaGaugeActionParameters > ActionBase
virtual void initialize()
The "doubly blocked from Wilson action in two coupling space" (DBW2 for short), introduced by Takaish...
static HMC_ActionModuleFactory & getInstance(void)
std::string obj_type() const
Reader< ReaderClass > TheReader
void operator=(const HMC_ActionModuleFactory &e)=delete
HMC_ActionModuleFactory(void)=default
HMC_ActionModuleFactory(const HMC_ActionModuleFactory &e)=delete
static HMC_FermionOperatorModuleFactory & getInstance(void)
static HMC_SolverModuleFactory & getInstance(void)
ActionModule< IwasakiGaugeAction< Impl >, BetaGaugeActionParameters > ActionBase
virtual void initialize()
The Iwasaki gauge action, model IM11 in arXiv:1111.7054.
OneFlavourEOFModule(Reader< ReaderClass > &R)
virtual void initialize()
virtual void acquireResource(typename Base::Resource &GridMod)
Base::operator_type fop_mod
PseudoFermionModuleBase< Impl, OneFlavourEvenOddRationalPseudoFermionAction, OneFlavourRationalParams > Base
OneFlavourFModule(Reader< ReaderClass > &R)
virtual void initialize()
Base::operator_type fop_mod
PseudoFermionModuleBase< Impl, OneFlavourRationalPseudoFermionAction, OneFlavourRationalParams > Base
virtual void acquireResource(typename Base::Resource &GridMod)
Base::operator_type fop_denominator_mod
PseudoFermionModuleBase< Impl, OneFlavourEvenOddRatioRationalPseudoFermionAction, OneFlavourRationalParams > Base
virtual void acquireResource(typename Base::Resource &GridMod)
OneFlavourRatioEOFModule(Reader< ReaderClass > &R)
Base::operator_type fop_numerator_mod
PseudoFermionModuleBase< Impl, OneFlavourRatioRationalPseudoFermionAction, OneFlavourRationalParams > Base
virtual void initialize()
virtual void acquireResource(typename Base::Resource &GridMod)
OneFlavourRatioFModule(Reader< ReaderClass > &R)
Base::operator_type fop_denominator_mod
Base::operator_type fop_numerator_mod
void print_parameters()
Definition Modules.h:62
Parametrized(Parameters Par)
Definition Modules.h:51
Plaquette plus rectangle actions.
ActionModule< PlaqPlusRectangleAction< Impl >, PlaqPlusRectangleGaugeActionParameters > ActionBase
GRID_SERIALIZABLE_CLASS_MEMBERS(PlaqPlusRectangleGaugeActionParameters, RealD, c_plaq, RealD, c_rect)
void getFermionOperator(Reader< ReaderClass > &Reader, operator_type &fo, std::string section_name)
ActionModule< FermionA< Impl >, Params > ActionBase
std::unique_ptr< FermionOperatorModuleBase< FermionOperator< Impl > > > operator_type
void getSolverOperator(Reader< ReaderClass > &Reader, solver_type &so, std::string section_name)
std::unique_ptr< HMCModuleBase< OperatorFunction< typename Impl::FermionField > > > solver_type
virtual void initialize()
ActionModule< RBCGaugeAction< Impl >, RBCGaugeActionParameters > ActionBase
GRID_SERIALIZABLE_CLASS_MEMBERS(RBCGaugeActionParameters, RealD, beta, RealD, c1)
Convenience class for common physically defined cases.
virtual void initialize()
ActionModule< SymanzikGaugeAction< Impl >, BetaGaugeActionParameters > ActionBase
The tree-level Symanzik improved gauge action, introduced in Nucl.Phys.B 236 (1984) 397.
virtual void acquireResource(typename Base::Resource &GridMod)
virtual void initialize()
TwoFlavourEOFModule(Reader< ReaderClass > &R)
PseudoFermionModuleBase< Impl, TwoFlavourEvenOddPseudoFermionAction > Base
Base::solver_type solver_mod
Base::operator_type fop_mod
Base::solver_type solver_mod
Base::operator_type fop_mod
TwoFlavourFModule(Reader< ReaderClass > &R)
virtual void initialize()
virtual void acquireResource(typename Base::Resource &GridMod)
PseudoFermionModuleBase< Impl, TwoFlavourPseudoFermionAction > Base
PseudoFermionModuleBase< Impl, TwoFlavourEvenOddRatioPseudoFermionAction > Base
Base::operator_type fop_denominator_mod
virtual void acquireResource(typename Base::Resource &GridMod)
TwoFlavourRatioEOFModule(Reader< ReaderClass > &R)
Base::solver_type solver_mod
Base::operator_type fop_numerator_mod
Base::operator_type fop_numerator_mod
PseudoFermionModuleBase< Impl, TwoFlavourRatioPseudoFermionAction > Base
Base::operator_type fop_denominator_mod
virtual void initialize()
TwoFlavourRatioFModule(Reader< ReaderClass > &R)
Base::solver_type solver_mod
virtual void acquireResource(typename Base::Resource &GridMod)
virtual void initialize()
ActionModule< WilsonGaugeAction< Impl >, BetaGaugeActionParameters > ActionBase
The Wilson gauge action, as introduced in Wilson, Phys. Rev. D 10, 2445. See for example Gattringer a...