00001
00011
00012 #ifndef _ALG_SMEAR_CD_
00013 #define _ALG_SMEAR_CD_
00014 #include <config.h>
00015 #include <alg/alg_base.h>
00016 #include <alg/ape_smear_arg.h>
00017 #include <alg/kinetic_smear_arg.h>
00018 #include <alg/hyp_smear_arg.h>
00019
00020
00021 CPS_START_NAMESPACE
00022
00024
00038 class AlgSmear:public Alg
00039 {
00040 private:
00041 char *cname;
00042
00043 int bool_su3_proj;
00044 Float tolerance ;
00045 int orthog ;
00046 Matrix* lat_back ;
00047
00048 public:
00049
00050 AlgSmear( Lattice& lat,
00051 CommonArg* ca ,
00052 int su3_proj );
00053
00054 virtual ~AlgSmear();
00055
00057 void run();
00058
00060
00064 void set_orthog( int i ) { orthog=i; }
00065
00067
00070 int get_orthog() const { return orthog; }
00071
00073 void set_tol( Float x ) { tolerance = x; }
00074
00076 Float get_tol() const { return tolerance; }
00077
00078
00079 int ifSu3Proj() const {return bool_su3_proj;}
00080
00081 protected:
00082
00084
00089 virtual void smear_link( Matrix& link,
00090 int* pos,
00091 int mu )=0;
00092
00093
00094 };
00095
00097 void three_staple(Lattice& latt, Matrix& link, int *pos, int u, int orth);
00098
00100 void five_staple (Lattice& latt, Matrix& link, int *pos, int u, int orth);
00101
00103 void seven_staple (Lattice& latt, Matrix& link, int *pos, int u, int orth);
00104
00106 void lepage_staple(Lattice& latt, Matrix& link, int *pos, int u, int orth);
00107
00109 int su3_proj( Matrix& x , Float tolerance );
00110
00111
00113
00121 class AlgApeSmear:public AlgSmear
00122 {
00123 private:
00124
00126 Float c;
00127 char *cname;
00128
00129 public:
00130
00137 AlgApeSmear(Lattice& lat,
00138 CommonArg* ca ,
00139 ApeSmearArg* asa,
00140 int in_bool_su3_proj=1);
00141
00142 ~AlgApeSmear()
00143 {;}
00144
00149 void run();
00150
00151 void set_coef( Float x ) { c = x ; }
00152
00153 protected:
00154
00155 void smear_link( Matrix& mat,
00156 int* pos,
00157 int mu );
00158 };
00159
00160
00162
00175 class AlgKineticSmear:public AlgSmear
00176 {
00177
00178 private:
00179
00180 char *cname;
00181 Float _coef[5];
00182
00183 public:
00184
00191 AlgKineticSmear(Lattice& lat,
00192 CommonArg* ca ,
00193 KineticSmearArg* ksa );
00194
00195 ~AlgKineticSmear()
00196 {;}
00197
00199 void run();
00200
00201 void single_link( Float coef ) { _coef[0] = coef; }
00202 void three_link ( Float coef ) { _coef[1] = coef; }
00203 void five_link ( Float coef ) { _coef[2] = coef; }
00204 void seven_link ( Float coef ) { _coef[3] = coef; }
00205 void lepage ( Float coef ) { _coef[4] = coef; }
00206
00207 protected:
00208
00209 void smear_link( Matrix& link,
00210 int* pos,
00211 int mu );
00212
00213 };
00214
00215
00216
00218
00230 class AlgHypSmear:public AlgSmear
00231 {
00232 private:
00233
00234 char *cname;
00235 Float c1, c2, c3;
00236
00237 const Matrix GetLink( Lattice& lat, const int* x, int mu );
00238 void get_vtilde( Matrix& , int*, int, int );
00239 void get_vbar ( Matrix& , int*, int, int, int );
00240
00241 public:
00247 AlgHypSmear(Lattice& lat,
00248 CommonArg* ca,
00249 HypSmearArg* hsa );
00250
00251 ~AlgHypSmear()
00252 {;}
00253
00255 void run();
00256
00258 void set_c1( Float x ) { c1=x; }
00260 void set_c2( Float x ) { c2=x; }
00262 void set_c3( Float x ) { c3=x; }
00263
00264 protected:
00265
00266 void smear_link( Matrix& link,
00267 int* pos,
00268 int mu );
00269
00270 };
00271
00272 class AlgOlegSmear:public AlgApeSmear {
00273
00274 private:
00275
00276 char *cname;
00277 Matrix* lat_back2 ;
00278
00279 public:
00280 AlgOlegSmear(Lattice& lat,
00281 CommonArg* ca,
00282 ApeSmearArg* asa);
00283 ~AlgOlegSmear();
00284
00285 Float coef;
00286 void run();
00287 };
00288
00289 CPS_END_NAMESPACE
00290 #endif
00291