Bridge++  Ver. 1.3.x
fopr_Wilson_Isochemical.cpp
Go to the documentation of this file.
1 
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 
21 #ifdef USE_FACTORY
22 namespace {
23  Fopr *create_object()
24  {
25  return new Fopr_Wilson_Isochemical();
26  }
27 
28 
29  Fopr *create_object_with_repr(const std::string& repr)
30  {
31  return new Fopr_Wilson_Isochemical(repr);
32  }
33 
34 
35  bool init1 = Fopr::Factory_noarg::Register("Wilson_Isochemical", create_object);
36  bool init2 = Fopr::Factory_string::Register("Wilson_Isochemical", create_object_with_repr);
37 }
38 #endif
39 
40 //- parameter entries
41 namespace {
42  void append_entry(Parameters& param)
43  {
44  param.Register_double("hopping_parameter", 0.0);
45  param.Register_double("isospin_chemical_potential", 0.0);
46  param.Register_int_vector("boundary_condition", std::vector<int>());
47 
48  param.Register_string("verbose_level", "NULL");
49  }
50 
51 
52 #ifdef USE_PARAMETERS_FACTORY
53  bool init_param = ParametersFactory::Register("Fopr.Wilson_Isochemical", append_entry);
54 #endif
55 }
56 //- end
57 
58 //- parameters class
60 //- end
61 
62 const std::string Fopr_Wilson_Isochemical::class_name = "Fopr_Wilson_Isochemical";
63 
64 //====================================================================
66 {
67  const std::string str_vlevel = params.get_string("verbose_level");
68 
69  m_vl = vout.set_verbose_level(str_vlevel);
70 
71  //- fetch and check input parameters
72  double kappa, mu;
73  std::vector<int> bc;
74 
75  int err = 0;
76  err += params.fetch_double("hopping_parameter", kappa);
77  err += params.fetch_double("isospin_chemical_potential", mu);
78  err += params.fetch_int_vector("boundary_condition", bc);
79 
80  if (err) {
81  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
82  exit(EXIT_FAILURE);
83  }
84 
85 
86  set_parameters(kappa, mu, bc);
87 }
88 
89 
90 //====================================================================
92  const double mu,
93  const std::vector<int> bc)
94 {
95  //- print input parameters
96  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
97  vout.general(m_vl, " kappa = %8.4f\n", kappa);
98  vout.general(m_vl, " mu = %8.4f\n", mu);
99  for (int dir = 0; dir < m_Ndim; ++dir) {
100  vout.general(m_vl, " boundary[%d] = %2d\n", dir, bc[dir]);
101  }
102 
103  //- range check
104  // NB. kappa,mu = 0 is allowed.
105  assert(bc.size() == m_Ndim);
106 
107  //- store values
108  m_kappa = kappa;
109  m_mu = mu;
110  m_exp_mu = exp(mu);
111 
112  m_boundary.resize(m_Ndim);
113  for (int dir = 0; dir < m_Ndim; ++dir) {
114  m_boundary[dir] = bc[dir];
115  }
116 
117  //- propagate parameters
118  m_fopr_w->set_parameters(kappa, bc);
119 }
120 
121 
122 //====================================================================
123 void Fopr_Wilson_Isochemical::init(std::string repr)
124 {
126 
127  int Nc = CommonParameters::Nc();
128  int Nd = CommonParameters::Nd();
129  int NinF = 2 * Nc * Nd;
130  int Nvol = CommonParameters::Nvol();
131 
132  m_boundary.resize(m_Ndim);
133  m_U = 0;
134 
135  m_fopr_w = new Fopr_Wilson(repr);
136 
137  m_vt.reset(NinF, Nvol, 1);
138  m_w2.reset(NinF, Nvol, 1);
139 }
140 
141 
142 //====================================================================
144 {
145  delete m_fopr_w;
146 }
147 
148 
149 //====================================================================
151 {
152  int Nvol = field_nvol();
153  int Nin = field_nin();
154  int Nex = field_nex();
155  Field v(Nin, Nvol, Nex);
156 
157  Dspc(w, f);
158 
159  v.set(0.0); // v = 0.0;
160  m_fopr_w->mult_up(3, v, f);
161  w.addpart_ex(0, v, 0, -m_kappa * m_exp_mu);
162 
163  v.set(0.0); // v = 0.0;
164  m_fopr_w->mult_dn(3, v, f);
165  w.addpart_ex(0, v, 0, -m_kappa / m_exp_mu);
166 
167 #pragma omp barrier
168 }
169 
170 
171 //====================================================================
173 {
174  int Nvol = field_nvol();
175  int Nin = field_nin();
176  int Nex = field_nex();
177  Field v(Nin, Nvol, Nex);
178 
179  Dspc(w, f);
180 
181  v.set(0.0); // v = 0.0;
182  m_fopr_w->mult_up(3, v, f);
183  w.addpart_ex(0, v, 0, -m_kappa / m_exp_mu);
184 
185  v.set(0.0); // v = 0.0;
186  m_fopr_w->mult_dn(3, v, f);
187  w.addpart_ex(0, v, 0, -m_kappa * m_exp_mu);
188 
189 #pragma omp barrier
190 }
191 
192 
193 //====================================================================
195 {
196  w.set(0.0); // w = 0.0;
197 
198  m_fopr_w->mult_up(0, w, f);
199  m_fopr_w->mult_dn(0, w, f);
200 
201  m_fopr_w->mult_up(1, w, f);
202  m_fopr_w->mult_dn(1, w, f);
203 
204  m_fopr_w->mult_up(2, w, f);
205  m_fopr_w->mult_dn(2, w, f);
206 
207  scal(w, -m_kappa); // w *= -m_kappa;
208  axpy(w, 1.0, f); // w += f;
209 
210 #pragma omp barrier
211 }
212 
213 
214 //====================================================================
216 {
217  m_fopr_w->mult_gm5(v, f);
218 }
219 
220 
221 //====================================================================
223 {
224  m_vt.set(0.0); // vt = 0.0;
225 
226  m_fopr_w->mult_up(mu, m_vt, (Field)w);
227  m_fopr_w->mult_gm5(v, m_vt);
228 }
229 
230 
231 //====================================================================
233 {
234  D(m_w2, f);
235  mult_gm5(w, m_w2);
236  Dminmu(m_w2, w);
237  mult_gm5(w, m_w2);
238 }
239 
240 
241 //====================================================================
243 {
244  mult_gm5(w, f);
245  Dminmu(m_w2, w);
246  mult_gm5(w, m_w2);
247 }
248 
249 
250 //====================================================================
252 {
253  D(m_w2, f);
254  mult_gm5(w, m_w2);
255 }
256 
257 
258 //====================================================================
260 {
261  Dminmu(m_w2, f);
262  mult_gm5(w, m_w2);
263 }
264 
265 
266 //====================================================================
268 {
269  //- Counting of floating point operations.
270  // not implemented, yet.
271 
272  double flop = 0.0;
273 
274  return flop;
275 }
276 
277 
278 //====================================================================
279 //============================================================END=====
void Register_int_vector(const string &, const std::vector< int > &)
Definition: parameters.cpp:344
void scal(Field &x, const double a)
scal(x, a): x = a * x
Definition: field.cpp:282
void Hdag(Field &, const Field &)
BridgeIO vout
Definition: bridgeIO.cpp:278
double m_kappa
hopping parameter
void Register_string(const string &, const string &)
Definition: parameters.cpp:351
void set(const int jin, const int site, const int jex, double v)
Definition: field.h:155
void general(const char *format,...)
Definition: bridgeIO.cpp:65
void mult_gm5(Field &, const Field &)
Container of Field-type object.
Definition: field.h:39
int field_nvol()
returns the volume for which the fermion operator is defined.
double flop_count()
this returns the number of floating point operations.
void mult_up(int mu, Field &w, const Field &v)
adding the hopping to nearest neighbor site in mu-th direction.
Class for parameters.
Definition: parameters.h:38
void mult_gm5p(int mu, Field_F &v, const Field_F &w)
void Ddag(Field &, const Field &)
void addpart_ex(int ex, const Field &w, int exw)
Definition: field.h:189
Wilson-type fermion field.
Definition: field_F.h:37
int field_nex()
returns the external d.o.f. for which the fermion operator is defined.
void D(Field &, const Field &)
Bridge::VerboseLevel m_vl
Definition: fopr.h:113
void mult_dn(int mu, Field &w, const Field &v)
void reset(const int Nin, const int Nvol, const int Nex, const element_type cmpl=COMPLEX)
Definition: field.h:84
void set_parameters(const Parameters &params)
Definition: fopr_Wilson.cpp:65
void set_parameters(const Parameters &params)
void Dminmu(Field &, const Field &)
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:168
void crucial(const char *format,...)
Definition: bridgeIO.cpp:48
void mult_gm5(Field &w, const Field &v)
static bool Register(const std::string &realm, const creator_callback &cb)
double m_mu
isospin chemical potential
void H(Field &, const Field &)
void Dspc(Field &, const Field &)
void DdagD(Field &, const Field &)
void Register_double(const string &, const double)
Definition: parameters.cpp:323
Base class of fermion operator family.
Definition: fopr.h:49
int fetch_double(const string &key, double &val) const
Definition: parameters.cpp:124
string get_string(const string &key) const
Definition: parameters.cpp:87
static const std::string class_name
int field_nin()
returns the on-site d.o.f. for which the fermion operator is defined.
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:28
int fetch_int_vector(const string &key, std::vector< int > &val) const
Definition: parameters.cpp:176