13
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
15
* GNU General Public License for more details.
16
- *
16
+ *
17
17
* You should have received a copy of the GNU General Public License
18
18
* along with tmLQCD. If not, see <http://www.gnu.org/licenses/>.
19
19
***********************************************************************/
28
28
#include "global.h"
29
29
#include "monomial/monomial.h"
30
30
#include "update_momenta.h"
31
+ #include "update_momenta_fg.h"
31
32
#include "update_gauge.h"
32
33
#include "hamiltonian_field.h"
33
34
#include "integrator.h"
@@ -43,6 +44,8 @@ static const double omf4_lamb = 0.6822365335719091;
43
44
void integrate_2mn (const double tau , const int S , const int halfstep , const double tau2 );
44
45
/* second order minimal norm integration scheme in velocity version */
45
46
void integrate_2mnp (const double tau , const int S , const int halfstep , const double tau2 );
47
+ /* fourth order force gradient integration scheme */
48
+ void integrate_2mnfg (const double tau , const int S , const int halfstep , const double tau2 );
46
49
/* Leap Frog integration scheme */
47
50
void integrate_leap_frog (const double tau , const int S , const int halfstep , const double tau2 );
48
51
/* fourth order OMF scheme */
@@ -77,6 +80,9 @@ int init_integrator() {
77
80
else if (Integrator .type [i ] == OMF4 ) {
78
81
Integrator .integrate [i ] = & integrate_omf4 ;
79
82
}
83
+ else if (Integrator .type [i ] == MN2FG ) {
84
+ Integrator .integrate [i ] = & integrate_2mnfg ;
85
+ }
80
86
}
81
87
}
82
88
@@ -224,12 +230,12 @@ void integrate_2mn(const double tau, const int S, const int halfstep, const doub
224
230
}
225
231
else {
226
232
for (i = 1 ; i < itgr -> n_int [S ]; i ++ ){
227
- itgr -> integrate [S - 1 ](eps /2. , S - 1 , 0 , eps /2. );
233
+ itgr -> integrate [S - 1 ](eps /2. , S - 1 , 0 , eps /2 );
228
234
update_momenta (itgr -> mnls_per_ts [S ], oneminus2lambda * eps , itgr -> no_mnls_per_ts [S ], & itgr -> hf );
229
- itgr -> integrate [S - 1 ](eps /2. , S - 1 , 0 , eps /2. );
235
+ itgr -> integrate [S - 1 ](eps /2. , S - 1 , 0 , eps /2 );
230
236
update_momenta (itgr -> mnls_per_ts [S ], 2 * itgr -> lambda [S ]* eps , itgr -> no_mnls_per_ts [S ], & itgr -> hf );
231
237
}
232
- itgr -> integrate [S - 1 ](eps /2. , S - 1 , 0 , eps /2. );
238
+ itgr -> integrate [S - 1 ](eps /2. , S - 1 , 0 , eps /2 );
233
239
update_momenta (itgr -> mnls_per_ts [S ], oneminus2lambda * eps , itgr -> no_mnls_per_ts [S ], & itgr -> hf );
234
240
if (S == itgr -> no_timescales - 1 ) {
235
241
itgr -> integrate [S - 1 ](eps /2. , S - 1 , 1 , eps /2. );
@@ -278,6 +284,55 @@ void integrate_2mnp(const double tau, const int S, const int halfstep, const dou
278
284
}
279
285
}
280
286
287
+ /* For 2MNFG lamda MUST be equal to 1/6 */
288
+ void integrate_2mnfg (const double tau , const int S , const int halfstep , const double tau2 ) {
289
+ int i ,j = 0 ;
290
+ integrator * itgr = & Integrator ;
291
+ double eps ,eps2 , oneminus2lambda = (1. - 2. * itgr -> lambda [S ]);
292
+
293
+ if (S == itgr -> no_timescales - 1 ) {
294
+ dohalfstep (tau , S );
295
+ }
296
+
297
+ eps = tau /((double )itgr -> n_int [S ]);
298
+ eps2 = tau2 /((double )itgr -> n_int [S ]);
299
+ if (S == 0 ) {
300
+
301
+ for (j = 1 ; j < itgr -> n_int [0 ]; j ++ ) {
302
+ update_gauge (0.5 * eps , & itgr -> hf );
303
+ update_momenta_fg (itgr -> mnls_per_ts [0 ], oneminus2lambda * eps , itgr -> no_mnls_per_ts [0 ], & itgr -> hf , eps );
304
+ update_gauge (0.5 * eps , & itgr -> hf );
305
+ update_momenta (itgr -> mnls_per_ts [0 ], 2. * itgr -> lambda [0 ]* eps , itgr -> no_mnls_per_ts [0 ], & itgr -> hf );
306
+ }
307
+ update_gauge (0.5 * eps , & itgr -> hf );
308
+ update_momenta_fg (itgr -> mnls_per_ts [0 ], oneminus2lambda * eps , itgr -> no_mnls_per_ts [0 ], & itgr -> hf , eps );
309
+ update_gauge (0.5 * eps , & itgr -> hf );
310
+ if (halfstep != 1 ) {
311
+ update_momenta (itgr -> mnls_per_ts [0 ], itgr -> lambda [0 ]* (eps + eps2 ), itgr -> no_mnls_per_ts [0 ], & itgr -> hf );
312
+ }
313
+ }
314
+ else {
315
+ for (i = 1 ; i < itgr -> n_int [S ]; i ++ ){
316
+ itgr -> integrate [S - 1 ](eps /2. , S - 1 , 0 , eps /2 );
317
+ update_momenta_fg (itgr -> mnls_per_ts [S ], oneminus2lambda * eps , itgr -> no_mnls_per_ts [S ], & itgr -> hf , eps );
318
+ itgr -> integrate [S - 1 ](eps /2. , S - 1 , 0 , eps /2 );
319
+ update_momenta (itgr -> mnls_per_ts [S ], 2 * itgr -> lambda [S ]* eps , itgr -> no_mnls_per_ts [S ], & itgr -> hf );
320
+ }
321
+ itgr -> integrate [S - 1 ](eps /2. , S - 1 , 0 , eps /2 );
322
+ update_momenta_fg (itgr -> mnls_per_ts [S ], oneminus2lambda * eps , itgr -> no_mnls_per_ts [S ], & itgr -> hf , eps );
323
+ if (S == itgr -> no_timescales - 1 ) {
324
+ itgr -> integrate [S - 1 ](eps /2. , S - 1 , 1 , eps /2. );
325
+ }
326
+ else itgr -> integrate [S - 1 ](eps /2. , S - 1 , halfstep , eps2 /2. );
327
+ if (halfstep != 1 && S != itgr -> no_timescales - 1 ) {
328
+ update_momenta (itgr -> mnls_per_ts [S ], itgr -> lambda [S ]* (eps + eps2 ), itgr -> no_mnls_per_ts [S ], & itgr -> hf );
329
+ }
330
+ }
331
+
332
+ if (S == itgr -> no_timescales - 1 ) {
333
+ dohalfstep (tau , S );
334
+ }
335
+ }
281
336
282
337
void integrate_leap_frog (const double tau , const int S , const int halfstep ,const double tau2 ) {
283
338
int i ;
@@ -329,7 +384,7 @@ void dohalfstep(const double tau, const int S) {
329
384
update_momenta (itgr -> mnls_per_ts [i ], 0.5 * eps , itgr -> no_mnls_per_ts [i ], & itgr -> hf );
330
385
eps /= ((double )itgr -> n_int [i - 1 ]);
331
386
}
332
- else if (itgr -> type [i ] == MN2 ){
387
+ else if (( itgr -> type [i ] == MN2 ) || ( itgr -> type [ i ] == MN2FG ) ){
333
388
update_momenta (itgr -> mnls_per_ts [i ], itgr -> lambda [i ]* eps , itgr -> no_mnls_per_ts [i ], & itgr -> hf );
334
389
eps /= ((double )itgr -> n_int [i - 1 ])* 2 ;
335
390
}
@@ -341,7 +396,7 @@ void dohalfstep(const double tau, const int S) {
341
396
if (itgr -> type [0 ] == LEAPFROG ) {
342
397
update_momenta (itgr -> mnls_per_ts [0 ], 0.5 * eps , itgr -> no_mnls_per_ts [0 ], & itgr -> hf );
343
398
}
344
- else if (itgr -> type [0 ] == MN2 ) {
399
+ else if (( itgr -> type [0 ] == MN2 ) || ( itgr -> type [ 0 ] == MN2FG ) ) {
345
400
update_momenta (itgr -> mnls_per_ts [0 ], itgr -> lambda [0 ]* eps , itgr -> no_mnls_per_ts [0 ], & itgr -> hf );
346
401
}
347
402
else if (itgr -> type [0 ] == OMF4 ) {
0 commit comments