Grid 0.7.0
ScalarImpl.h
Go to the documentation of this file.
1#pragma once
2
3#define CPS_MD_TIME
4
5#ifdef CPS_MD_TIME
6#define HMC_MOMENTUM_DENOMINATOR (2.0)
7#else
8#define HMC_MOMENTUM_DENOMINATOR (1.0)
9#endif
10
12
13template <class S>
15public:
16 typedef S Simd;
17
18 template <typename vtype>
20
24
29
30 static inline void generate_momenta(Field& P, GridSerialRNG &sRNG, GridParallelRNG& pRNG){
31 RealD scale = ::sqrt(HMC_MOMENTUM_DENOMINATOR); // CPS/UKQCD momentum rescaling
32 gaussian(pRNG, P);
33 P *= scale;
34 }
35
36 static inline Field projectForce(Field& P){return P;}
37
38 static inline void update_field(Field& P, Field& U, double ep) {
39 U += P*ep;
40 }
41
42 static inline RealD FieldSquareNorm(Field& U) {
43 return (- sum(trace(U*U))/2.0);
44 }
45
46 static inline void HotConfiguration(GridParallelRNG &pRNG, Field &U) {
47 gaussian(pRNG, U);
48 }
49
50 static inline void TepidConfiguration(GridParallelRNG &pRNG, Field &U) {
51 gaussian(pRNG, U);
52 }
53
54 static inline void ColdConfiguration(GridParallelRNG &pRNG, Field &U) {
55 U = 1.0;
56 }
57
58 static inline void Project(Field &U) {
59 return;
60 }
61
62 static void MomentumSpacePropagator(Field &out, RealD m)
63 {
64 GridBase *grid = out.Grid();
65 Field kmu(grid), one(grid);
66 const unsigned int nd = grid->_ndimension;
67 Coordinate &l = grid->_fdimensions;
68
69 one = Complex(1.0,0.0);
70 out = m*m;
71 for(int mu = 0; mu < nd; mu++)
72 {
73 Real twoPiL = M_PI*2./l[mu];
74
75 LatticeCoordinate(kmu,mu);
76 kmu = 2.*sin(.5*twoPiL*kmu);
77 out = out + kmu*kmu;
78 }
79 out = one/out;
80 }
81
82 static void FreePropagator(const Field &in, Field &out,
83 const Field &momKernel)
84 {
85 FFT fft((GridCartesian *)in.Grid());
86 Field inFT(in.Grid());
87
88 fft.FFT_all_dim(inFT, in, FFT::forward);
89 inFT = inFT*momKernel;
90 fft.FFT_all_dim(out, inFT, FFT::backward);
91 }
92
93 static void FreePropagator(const Field &in, Field &out, RealD m)
94 {
95 Field momKernel(in.Grid());
96
97 MomentumSpacePropagator(momKernel, m);
98 FreePropagator(in, out, momKernel);
99 }
100
101};
102
103 #ifdef USE_FFT_ACCELERATION
104 #ifndef FFT_MASS
105 #error "USE_FFT_ACCELERATION is defined but not FFT_MASS"
106 #endif
107 #endif
108
109template <class S, unsigned int N>
111public:
112 typedef S Simd;
113 typedef SU<N> Group;
114
115 template <typename vtype>
117 template <typename vtype>
119
123
128
129 static void MomentaSquare(ComplexField &out)
130 {
131 GridBase *grid = out.Grid();
132 const Coordinate &l = grid->FullDimensions();
133 ComplexField kmu(grid);
134
135 for (int mu = 0; mu < grid->Nd(); mu++)
136 {
137 Real twoPiL = M_PI * 2.0 / l[mu];
138 LatticeCoordinate(kmu, mu);
139 kmu = 2.0 * sin(0.5 * twoPiL * kmu);
140 out += kmu * kmu;
141 }
142 }
143
145 {
146 GridBase *grid = out.Grid();
147 ComplexField one(grid);
148 one = Complex(1.0, 0.0);
149 out = m * m;
150 MomentaSquare(out);
151 out = one / out;
152 }
153
154 static inline void generate_momenta(Field &P, GridSerialRNG & sRNG, GridParallelRNG &pRNG)
155 {
156 RealD scale = ::sqrt(HMC_MOMENTUM_DENOMINATOR); // CPS/UKQCD momentum rescaling
157#ifndef USE_FFT_ACCELERATION
159
160#else
161
162 Field Pgaussian(P.Grid()), Pp(P.Grid());
163 ComplexField p2(P.Grid()); p2 = zero;
164 RealD M = FFT_MASS;
165
166
168
169 FFT theFFT((GridCartesian*)P.Grid());
170 theFFT.FFT_all_dim(Pp, Pgaussian, FFT::forward);
171 MomentaSquare(p2);
172 p2 += M * M;
173 p2 = sqrt(p2);
174 Pp *= p2;
175 theFFT.FFT_all_dim(P, Pp, FFT::backward);
176#endif //USE_FFT_ACCELERATION
177 P *= scale;
178 }
179
180 static inline Field projectForce(Field& P) {return Ta(P);}
181
182 static inline void update_field(Field &P, Field &U, double ep)
183 {
184#ifndef USE_FFT_ACCELERATION
185 double t0=usecond();
186 U += P*ep;
187 double t1=usecond();
188 double total_time = (t1-t0)/1e6;
189 std::cout << GridLogIntegrator << "Total time for updating field (s) : " << total_time << std::endl;
190#else
191 // FFT transform P(x) -> P(p)
192 // divide by (M^2+p^2) M external parameter (how to pass?)
193 // P'(p) = P(p)/(M^2+p^2)
194 // Transform back -> P'(x)
195 // U += P'(x)*ep
196
197 Field Pp(U.Grid()), P_FFT(U.Grid());
198 static ComplexField p2(U.Grid());
199 RealD M = FFT_MASS;
200
201 FFT theFFT((GridCartesian*)U.Grid());
202 theFFT.FFT_all_dim(Pp, P, FFT::forward);
203
204 static bool first_call = true;
205 if (first_call)
206 {
207 // avoid recomputing
209 first_call = false;
210 }
211 Pp *= p2;
212 theFFT.FFT_all_dim(P_FFT, Pp, FFT::backward);
213 U += P_FFT * ep;
214
215#endif //USE_FFT_ACCELERATION
216 }
217
218 static inline RealD FieldSquareNorm(Field &U)
219 {
220#ifndef USE_FFT_ACCELERATION
221 return (TensorRemove(sum(trace(U*U))).real());
222#else
223 // In case of Fourier acceleration we have to:
224 // compute U(p)*U(p)/(M^2+p^2)) Parseval theorem
225 // 1 FFT needed U(x) -> U(p)
226 // M to be passed
227
228 FFT theFFT((GridCartesian*)U.Grid());
229 Field Up(U.Grid());
230
231 theFFT.FFT_all_dim(Up, U, FFT::forward);
232 RealD M = FFT_MASS;
233 ComplexField p2(U.Grid());
235 Field Up2 = Up * p2;
236 // from the definition of the DFT we need to divide by the volume
237 return (-TensorRemove(sum(trace(adj(Up) * Up2))).real() / U.Grid()->gSites());
238#endif //USE_FFT_ACCELERATION
239 }
240
241 static inline void Project(Field &U) {
242 return;
243 }
244
248
249 static inline void TepidConfiguration(GridParallelRNG &pRNG, Field &U) {
251 }
252
253 static inline void ColdConfiguration(GridParallelRNG &pRNG, Field &U) {
254 U = Zero();
255 }
256
257};
258
265
266// Hardcoding here the size of the matrices
270
274
276
#define one
Definition BGQQPX.h:108
AcceleratorVector< int, MaxDims > Coordinate
Definition Coordinate.h:95
GaugeGroup< ncolour, GroupName::SU > SU
Definition GaugeGroup.h:453
#define HMC_MOMENTUM_DENOMINATOR
accelerator_inline Grid_simd2< S, V > trace(const Grid_simd2< S, V > &arg)
accelerator_inline Grid_simd< S, V > sin(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > sqrt(const Grid_simd< S, V > &r)
void LatticeCoordinate(Lattice< iobj > &l, int mu)
Lattice< vobj > real(const Lattice< vobj > &lhs)
Lattice< vobj > adj(const Lattice< vobj > &lhs)
vobj::scalar_object sum(const vobj *arg, Integer osites)
void gaussian(GridParallelRNG &rng, Lattice< vobj > &l)
GridLogger GridLogIntegrator(1, "Integrator", GridLogColours, "BLUE")
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
ScalarImplTypes< vRealF > ScalarImplF
Definition ScalarImpl.h:260
ScalarAdjMatrixImplTypes< vComplex, Nc > ScalarAdjImplR
Definition ScalarImpl.h:267
ScalarAdjMatrixImplTypes< vComplexD, Nc > ScalarAdjImplD
Definition ScalarImpl.h:269
ScalarAdjMatrixImplTypes< vComplexD, Colours > ScalarNxNAdjImplD
Definition ScalarImpl.h:273
ScalarAdjMatrixImplTypes< vComplexF, Nc > ScalarAdjImplF
Definition ScalarImpl.h:268
ScalarImplTypes< vComplex > ScalarImplCR
Definition ScalarImpl.h:262
ScalarImplTypes< vRealD > ScalarImplD
Definition ScalarImpl.h:261
ScalarImplTypes< vComplexF > ScalarImplCF
Definition ScalarImpl.h:263
ScalarAdjMatrixImplTypes< vComplex, Colours > ScalarNxNAdjImplR
Definition ScalarImpl.h:271
ScalarImplTypes< vComplexD > ScalarImplCD
Definition ScalarImpl.h:264
ScalarImplTypes< vReal > ScalarImplR
Definition ScalarImpl.h:259
ScalarAdjMatrixImplTypes< vComplexF, Colours > ScalarNxNAdjImplF
Definition ScalarImpl.h:272
RealF Real
Definition Simd.h:65
std::complex< Real > Complex
Definition Simd.h:80
double RealD
Definition Simd.h:61
accelerator_inline iScalar< vtype > Ta(const iScalar< vtype > &r)
Definition Tensor_Ta.h:45
accelerator_inline std::enable_if<!isGridTensor< T >::value, T >::type TensorRemove(T arg)
double usecond(void)
Definition Timer.h:50
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
static void GaussianFundamentalLieAlgebraMatrix(GridParallelRNG &pRNG, LatticeMatrix &out, Real scale=1.0)
Definition GaugeGroup.h:227
Coordinate _fdimensions
int Nd(void) const
const Coordinate & FullDimensions(void)
GridBase * Grid(void) const
static void update_field(Field &P, Field &U, double ep)
Definition ScalarImpl.h:182
iImplComplex< Simd > SiteComplex
Definition ScalarImpl.h:122
Lattice< SiteField > Field
Definition ScalarImpl.h:124
static void Project(Field &U)
Definition ScalarImpl.h:241
static RealD FieldSquareNorm(Field &U)
Definition ScalarImpl.h:218
Lattice< SiteComplex > ComplexField
Definition ScalarImpl.h:125
static void generate_momenta(Field &P, GridSerialRNG &sRNG, GridParallelRNG &pRNG)
Definition ScalarImpl.h:154
iScalar< iScalar< iScalar< vtype > > > iImplComplex
Definition ScalarImpl.h:118
static void TepidConfiguration(GridParallelRNG &pRNG, Field &U)
Definition ScalarImpl.h:249
iScalar< iScalar< iMatrix< vtype, N > > > iImplField
Definition ScalarImpl.h:116
static void ColdConfiguration(GridParallelRNG &pRNG, Field &U)
Definition ScalarImpl.h:253
static void HotConfiguration(GridParallelRNG &pRNG, Field &U)
Definition ScalarImpl.h:245
static void MomentumSpacePropagator(ComplexField &out, RealD m)
Definition ScalarImpl.h:144
static Field projectForce(Field &P)
Definition ScalarImpl.h:180
iImplField< Simd > SiteField
Definition ScalarImpl.h:120
static void MomentaSquare(ComplexField &out)
Definition ScalarImpl.h:129
Lattice< SiteField > Field
Definition ScalarImpl.h:25
static Field projectForce(Field &P)
Definition ScalarImpl.h:36
Field PropagatorField
Definition ScalarImpl.h:28
static void update_field(Field &P, Field &U, double ep)
Definition ScalarImpl.h:38
static void ColdConfiguration(GridParallelRNG &pRNG, Field &U)
Definition ScalarImpl.h:54
SiteField SitePropagator
Definition ScalarImpl.h:22
SiteField SiteComplex
Definition ScalarImpl.h:23
static void TepidConfiguration(GridParallelRNG &pRNG, Field &U)
Definition ScalarImpl.h:50
static void generate_momenta(Field &P, GridSerialRNG &sRNG, GridParallelRNG &pRNG)
Definition ScalarImpl.h:30
static void MomentumSpacePropagator(Field &out, RealD m)
Definition ScalarImpl.h:62
iImplField< Simd > SiteField
Definition ScalarImpl.h:21
static RealD FieldSquareNorm(Field &U)
Definition ScalarImpl.h:42
static void Project(Field &U)
Definition ScalarImpl.h:58
iScalar< iScalar< iScalar< vtype > > > iImplField
Definition ScalarImpl.h:19
static void FreePropagator(const Field &in, Field &out, const Field &momKernel)
Definition ScalarImpl.h:82
static void HotConfiguration(GridParallelRNG &pRNG, Field &U)
Definition ScalarImpl.h:46
static void FreePropagator(const Field &in, Field &out, RealD m)
Definition ScalarImpl.h:93
Definition Simd.h:194