Bridge++  Ver. 1.3.x
action_F_Ratio.cpp
Go to the documentation of this file.
1 
14 #include "action_F_Ratio.h"
15 
16 const std::string Action_F_Ratio::class_name = "Action_F_Ratio";
17 
18 //====================================================================
20 {
22 
24 }
25 
26 
27 //====================================================================
29 {
30  int Nc = CommonParameters::Nc();
31  int Nvol = CommonParameters::Nvol();
32  int Ndim = CommonParameters::Ndim();
33  int NinG = 2 * Nc * Nc;
34 
35  vout.general(m_vl, "%s:\n", class_name.c_str());
36 
37  int Niter = 2000;
38  double Stop_cond_MD = 1.0e-24;
39  double Stop_cond_H = 1.0e-24;
40 
41  string str_solver_type = "CG";
42  m_solver_H_prec = Solver::New(str_solver_type, m_fopr_prec);
43  m_solver_MD = Solver::New(str_solver_type, m_fopr);
44  m_solver_H = Solver::New(str_solver_type, m_fopr);
45 
46  m_solver_H_prec->set_parameters(Niter, Stop_cond_H);
47  m_solver_MD->set_parameters(Niter, Stop_cond_MD);
48  m_solver_H->set_parameters(Niter, Stop_cond_H);
49 }
50 
51 
52 //====================================================================
54 {
55  int Nvol = CommonParameters::Nvol();
56  int Ndim = CommonParameters::Ndim();
57 
58  int NinF = m_fopr_prec->field_nin();
59  int NvolF = m_fopr_prec->field_nvol();
60  int NexF = m_fopr_prec->field_nex();
61  int size_psf = NinF * NvolF * NexF * CommonParameters::NPE();
62 
63  assert(NvolF == Nvol);
64  m_psf.reset(NinF, NvolF, NexF);
65 
66  vout.general(m_vl, " %s: %s\n", class_name.c_str(), m_label.c_str());
67 
68  Field xi(NinF, NvolF, NexF);
69  rand->gauss_lex_global(xi);
70 
73 
74  Field v1(NinF, NvolF, NexF), v2(NinF, NvolF, NexF);
75 
76  /*
77  m_fopr->set_mode("H");
78  v1 = m_fopr->mult(xi);
79 
80  int Nconv;
81  double diff;
82  m_fopr_prec->set_mode("DdagD");
83  m_solver_H_prec->solve(v2,v1,Nconv,diff);
84  vout.general(m_vl, " Nconv = %d diff = %.8e\n",Nconv,diff);
85 
86  m_fopr_prec->set_mode("H");
87  m_psf = m_fopr_prec->mult(v2);
88  */
89 
90  m_fopr->set_mode("H");
91  m_fopr->mult_dag(v2, xi);
92 
93  m_fopr_prec->set_mode("H");
94  m_fopr_prec->mult_dag(v1, v2);
95 
96  int Nconv;
97  double diff;
98  m_fopr_prec->set_mode("DdagD");
99  m_solver_H_prec->solve(m_psf, v1, Nconv, diff);
100  vout.general(m_vl, " Nconv = %d diff = %.8e\n", Nconv, diff);
101 
102  double xi2 = xi.norm();
103  double H_psf = xi2 * xi2;
104 
105  vout.general(m_vl, " H_Fratio = %18.8f\n", H_psf);
106  vout.general(m_vl, " H_F/dof = %18.8f\n", H_psf / size_psf);
107 
108  return H_psf;
109 }
110 
111 
112 //====================================================================
114 {
115  int Nvol = CommonParameters::Nvol();
116  int Ndim = CommonParameters::Ndim();
117 
118  int NinF = m_fopr_prec->field_nin();
119  int NvolF = m_fopr_prec->field_nvol();
120  int NexF = m_fopr_prec->field_nex();
121  int size_psf = NinF * NvolF * NexF * CommonParameters::NPE();
122 
123  Field v1(NinF, NvolF, NexF), v2(NinF, NvolF, NexF);
124 
125  vout.general(m_vl, " %s: %s\n", class_name.c_str(), m_label.c_str());
126 
129 
130  m_fopr_prec->set_mode("H");
131  m_fopr_prec->mult(v1, m_psf);
132 
133  int Nconv;
134  double diff;
135  m_fopr->set_mode("DdagD");
136  m_solver_H->solve(v2, v1, Nconv, diff);
137  vout.general(m_vl, " Nconv = %d diff = %.8e\n", Nconv, diff);
138 
139  double H_psf = dot(v1, v2);
140 
141  vout.general(m_vl, " H_Fratio = %18.8f\n", H_psf);
142  vout.general(m_vl, " H_F/dof = %18.8f\n", H_psf / size_psf);
143 
144  return H_psf;
145 }
146 
147 
148 //====================================================================
150 {
151  int Nin = m_U->nin();
152  int Nvol = m_U->nvol();
153  int Nex = m_U->nex();
154  int Nc = CommonParameters::Nc();
155  int Ndim = CommonParameters::Ndim();
156 
157  assert(force.nin() == Nin);
158  assert(force.nvol() == Nvol);
159  assert(force.nex() == Nex);
160 
161  int NinF = m_fopr_prec->field_nin();
162  int NvolF = m_fopr_prec->field_nvol();
163  int NexF = m_fopr_prec->field_nex();
164  Field eta(NinF, NvolF, NexF);
165 
166  vout.general(m_vl, " %s: %s\n", class_name.c_str(), m_label.c_str());
167 
172 
173  Field v1(NinF, NvolF, NexF), v2(NinF, NvolF, NexF);
174 
175  m_fopr_prec->set_mode("H");
176  m_fopr_prec->mult(v1, m_psf);
177 
178  int Nconv;
179  double diff;
180  m_fopr->set_mode("DdagD");
181  m_solver_MD->solve(v2, v1, Nconv, diff);
182  vout.general(m_vl, " Solver: Nconv = %6d diff = %12.6e\n", Nconv, diff);
183 
184  Field force1(Nin, Nvol, Nex);
185 
186  m_fopr_force->force_core(force, v2);
187 
189  m_fopr_prec_force->force_core1(force1, v2, m_psf);
190  axpy(force, -1.0, force1);
191 
192  m_fopr_prec_force->set_mode("Hdag");
193  m_fopr_prec_force->force_core1(force1, m_psf, v2);
194  axpy(force, -1.0, force1);
195 
196  double Fave, Fmax, Fdev;
197  force.stat(Fave, Fmax, Fdev);
198  vout.general(m_vl, " Fratio_ave = %12.6f Fratio_max = %12.6f Fratio_dev = %12.6f\n",
199  Fave, Fmax, Fdev);
200 }
201 
202 
203 //====================================================================
204 //============================================================END=====
Solver * m_solver_MD
BridgeIO vout
Definition: bridgeIO.cpp:278
double dot(const Field &y, const Field &x)
Definition: field.cpp:46
double langevin(RandomNumbers *)
Langevis step.
void general(const char *format,...)
Definition: bridgeIO.cpp:65
virtual void set_config(Field *)=0
setting pointer to the gauge configuration.
Container of Field-type object.
Definition: field.h:39
virtual void set_config(Field *)=0
int nvol() const
Definition: field.h:116
Class for parameters.
Definition: parameters.h:38
virtual void force_core1(Field &, const Field &, const Field &)
Definition: force.cpp:35
static const std::string class_name
virtual void gauss_lex_global(Field &)
gaussian random number defined on global lattice.
virtual int field_nin()=0
returns the on-site d.o.f. for which the fermion operator is defined.
Force * m_fopr_prec_force
void set_parameter_verboselevel(const Bridge::VerboseLevel vl)
Definition: action.h:59
virtual void set_parameters(const Parameters &params)=0
int nin() const
Definition: field.h:115
Solver * m_solver_H_prec
virtual void set_mode(const std::string &mode)
in Force, setting the mode is optional when H is nonhermitian.
Definition: force.h:54
void reset(const int Nin, const int Nvol, const int Nex, const element_type cmpl=COMPLEX)
Definition: field.h:84
double norm() const
Definition: field.h:240
virtual int field_nex()=0
returns the external d.o.f. for which the fermion operator is defined.
int nex() const
Definition: field.h:117
virtual void force_core(Field &, const Field &)
Definition: force.cpp:19
Bridge::VerboseLevel get_VerboseLevel() const
Definition: parameters.cpp:117
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:168
std::string m_label
Bridge::VerboseLevel m_vl
Definition: action.h:81
Base class of random number generators.
Definition: randomNumbers.h:39
Bridge::VerboseLevel vl
Definition: checker.cpp:18
VerboseLevel
Definition: bridgeIO.h:39
virtual void mult(Field &, const Field &)=0
multiplies fermion operator to a given field (2nd argument)
virtual void set_mode(std::string mode)
setting the mode of multiplication if necessary. Default implementation here is just to avoid irrelev...
Definition: fopr.h:85
void stat(double &Fave, double &Fmax, double &Fdev) const
determines the statistics of the field. average, maximum value, and deviation is determined over glob...
Definition: field.cpp:516
virtual void mult_dag(Field &, const Field &)
hermitian conjugate of mult(Field&, const Field&).
Definition: fopr.h:77
virtual int field_nvol()=0
returns the volume for which the fermion operator is defined.
Solver * m_solver_H
virtual void solve(Field &solution, const Field &source, int &Nconv, double &diff)=0
void force(Field &)
returns force for molcular dynamical update of conjugate momenta.
static int NPE()
double calcH()
calculate Hamiltonian of this action term.
Force * m_fopr_force