00001 #include<config.h>
00002 CPS_START_NAMESPACE
00003
00009
00010
00011
00012 #ifndef INCLUDED_ALG_HMD_H
00013 #define INCLUDED_ALG_HMD_H
00014
00015 CPS_END_NAMESPACE
00016 #include <util/lattice.h>
00017 #include <util/smalloc.h>
00018 #include <util/pmalloc.h>
00019 #include <alg/alg_base.h>
00020 #include <alg/common_arg.h>
00021 #include <alg/hmd_arg.h>
00022 CPS_START_NAMESPACE
00023
00024
00025
00027
00031
00032 class AlgHmd : public Alg
00033 {
00034 private:
00035 char *cname;
00036
00037 protected:
00038
00039 HmdArg *hmd_arg;
00041
00042 int g_size;
00044
00049 int Ncb;
00051
00052 Matrix* mom;
00054
00058 int alloc_sum;
00059
00060 public:
00061
00062 AlgHmd(Lattice& latt, CommonArg *c_arg, HmdArg *arg);
00063
00064
00065 virtual ~AlgHmd();
00066
00068 virtual Float run() = 0;
00069
00070 };
00071
00072
00073
00075
00098
00099 class AlgHmcPhi : public AlgHmd
00100 {
00101 private:
00102 char *cname;
00103
00104
00105 protected:
00106
00107 int n_frm_masses;
00109
00113 int n_bsn_masses;
00115
00116 int f_size;
00118
00123 CgArg **frm_cg_arg;
00125
00130 CgArg **bsn_cg_arg;
00132
00137 Vector** phi;
00139
00141 Vector** bsn;
00143
00145 Matrix* gauge_field_init;
00147
00148 Vector** frm1;
00150 Vector** frm2;
00152
00153 Vector** cg_sol_cur;
00155
00156 Vector** cg_sol_prev;
00158
00161 Float *h_f_init;
00163
00165 Float *h_f_final;
00167
00169 Float *delta_h_f;
00171
00173 Float *h_b_init;
00175
00177 Float *h_b_final;
00179
00181 Float *delta_h_b;
00183
00185 public:
00186
00187 AlgHmcPhi(Lattice& latt, CommonArg *c_arg, HmdArg *arg);
00188
00189 virtual ~AlgHmcPhi();
00190
00192 Float run(void);
00193 };
00194
00195
00197
00220
00221 class AlgHmcQPQ : public AlgHmd
00222 {
00223 private:
00224 char *cname;
00225
00226
00227 protected:
00228
00229 int n_frm_masses;
00231
00235 int n_bsn_masses;
00237
00238 int f_size;
00240
00245 CgArg **frm_cg_arg;
00247
00252 CgArg **bsn_cg_arg;
00254
00259 Vector** phi;
00261
00263 Vector** bsn;
00265
00267 Matrix* gauge_field_init;
00269
00270 Vector** frm1;
00272 Vector** frm2;
00274
00275 Vector** cg_sol_prev;
00276 Vector*** cg_sol;
00278 Vector*** vm;
00280
00281 Float *h_f_init;
00283
00285 Float *h_f_final;
00287
00289 Float *delta_h_f;
00291
00293 Float *h_b_init;
00295
00297 Float *h_b_final;
00299
00301 Float *delta_h_b;
00303
00305 public:
00306
00307 AlgHmcQPQ(Lattice& latt, CommonArg *c_arg, HmdArg *arg);
00308
00309 virtual ~AlgHmcQPQ();
00310
00312 Float run(void);
00313 };
00314
00315
00317
00336
00337 class AlgHmcRHMC : public AlgHmd
00338 {
00339 private:
00340 char *cname;
00341
00343 void init();
00344
00346 void massRenormalise(Float *mass, Float *trueMass, int degree,
00347 Float *shift, MassRenormaliseDir direction);
00348
00349 protected:
00350
00351 int n_frm_masses;
00353
00354 int n_bsn_masses;
00356
00357 int f_sites;
00358 int f_vec_count;
00359 int f_count;
00360 int f_size;
00362
00367 CgArg **frm_cg_arg;
00369
00375 CgArg **bsn_cg_arg;
00377
00382 Vector** phi;
00384
00387 Vector** bsn;
00389
00392 Matrix* gauge_field_init;
00394
00395 unsigned int **rng4d_init;
00396 unsigned int **rng5d_init;
00398
00399 Matrix* gauge_field_final;
00401
00402 Vector* frm;
00403
00404 Vector** frmn;
00406
00408 Vector** frmn_d;
00410
00413 Float *h_f_init;
00415
00417 Float *h_f_final;
00419
00422 Float *delta_h_f;
00424
00426 Float *h_b_init;
00428
00430 Float *h_b_final;
00432
00434 Float *delta_h_b;
00436
00438 int total_size;
00440
00441 Float *all_res;
00443
00444 EigArg *eig_arg;
00446
00447 Float **alpha;
00448
00449 public:
00450
00452 AlgHmcRHMC(Lattice& latt, CommonArg *c_arg, HmdArg *arg);
00453
00455 AlgHmcRHMC(Lattice& latt, CommonArg *c_arg, HmdArg *arg, EigArg *e_arg);
00456
00457 virtual ~AlgHmcRHMC();
00458
00460 Float run(void);
00461
00463 void generateApprox(HmdArg*);
00464
00466 void dynamicalApprox();
00467
00468 };
00469
00470
00472
00488
00489 class AlgHmdR : public AlgHmd
00490 {
00491 private:
00492 char *cname;
00493
00494 protected:
00495 int n_frm_masses;
00497
00501 Float *flavor_time_step;
00503
00509 int f_size;
00511
00516 CgArg **frm_cg_arg;
00518
00523 Vector** phi;
00525
00527 Vector* frm1;
00528 Vector* frm2;
00530
00531 public:
00532
00533 AlgHmdR(Lattice& latt, CommonArg *c_arg, HmdArg *arg);
00534
00535 virtual ~AlgHmdR();
00536
00538 Float run(void);
00539 };
00540
00541
00543
00558
00559 class AlgHmdR2 : public AlgHmd
00560 {
00561 private:
00562 char *cname;
00563
00564 protected:
00565 int n_frm_masses;
00567
00571 Float *flavor_time_step;
00573
00579 Float *force_coeff;
00581
00585 int f_sites;
00586 int f_vec_count;
00587 int f_count;
00588 int f_size;
00590
00595 CgArg **frm_cg_arg;
00597
00602 Vector** phi;
00604
00606 Vector** frmn;
00608
00610 Vector** frmn_d;
00612
00615 Float *shift;
00617
00618 int light;
00620
00621 int heavy;
00623
00624 public:
00625
00626 AlgHmdR2(Lattice& latt, CommonArg *c_arg, HmdArg *arg);
00627
00628 virtual ~AlgHmdR2();
00629
00631 Float run(void);
00632 };
00633
00634 #endif
00635
00636 CPS_END_NAMESPACE