Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
quarkNumberSusceptibility_Wilson.cpp
Go to the documentation of this file.
1 
15 
16 const std::string QuarkNumberSusceptibility_Wilson::class_name = "QuarkNumberSusceptibility_Wilson";
17 
18 //====================================================================
20 {
21  const string str_vlevel = params.get_string("verbose_level");
22 
23  m_vl = vout.set_verbose_level(str_vlevel);
24 
25  //- fetch and check input parameters
26  int Nnoise;
27 
28  int err = 0;
29  err += params.fetch_int("number_of_noises", Nnoise);
30 
31  if (err) {
32  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
33  abort();
34  }
35 
36 
37  set_parameters(Nnoise);
38 }
39 
40 
41 //====================================================================
43 {
44  //- print input parameters
45  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
46  vout.general(m_vl, " Nnoise = %d\n", Nnoise);
47 
48  //- range check
49  int err = 0;
50  err += ParameterCheck::non_negative(Nnoise);
51 
52  if (err) {
53  vout.crucial(m_vl, "%s: parameter range check failed.\n", class_name.c_str());
54  abort();
55  }
56 
57  //- store values
58  m_Nnoise = Nnoise;
59 }
60 
61 
62 //====================================================================
64 {
65  // measurement of quark number susceptibility:
66  // tr1 = Tr[D1*Sq]
67  // tr2 = Tr[D2*Sq]
68  // tr3 = Tr[D1*Sq*D1*Sq]
69  // For definition, see the implementation note.
70 
71  vout.general(m_vl, "%s:\n", class_name.c_str());
72  vout.general(m_vl, " Number of noise vector = %d\n", m_Nnoise);
73 
74  int dir_t = CommonParameters::Ndim() - 1;
75 
76  int Nconv;
77  double diff;
78 
79  int Nex = m_fopr->field_nex();
80  int Nvol = m_fopr->field_nvol();
81  int Nin = m_fopr->field_nin();
82 
83  Field xi(Nin, Nvol, Nex);
84  Field v1(Nin, Nvol, Nex), v2(Nin, Nvol, Nex), v3(Nin, Nvol, Nex);
85 
86  dcomplex tr1 = 0.0;
87  dcomplex tr2 = 0.0;
88  dcomplex tr3 = 0.0;
89 
90  for (int inoise = 0; inoise < m_Nnoise; ++inoise) {
91  vout.general(m_vl, " noise vector = %d\n", inoise);
92 
93  m_nv->set(xi);
94  // noise vector was set.
95 
96  m_fprop->invert_D(v3, xi, Nconv, diff);
97  vout.general(m_vl, " Nconv = %d diff = %.8e\n", Nconv, diff);
98  // now v3 is M^-1 * xi.
99 
100  // mult D_1 and D_2
101  v1 = 0.0;
102  m_fopr->mult_up(dir_t, v1, v3);
103  v2 = 0.0;
104  m_fopr->mult_dn(dir_t, v2, v3);
105 
106  dcomplex tr_c1 = dotc(xi, v1);
107  dcomplex tr_c2 = dotc(xi, v2);
108 
109  dcomplex tr1_c = tr_c1 - tr_c2;
110  dcomplex tr2_c = tr_c1 + tr_c2;
111 
112  v3 = v1 - v2;
113  // now v3 is D_1 * M^-1 * xi.
114 
115  v1 = v3;
116  m_fprop->invert_D(v3, v1, Nconv, diff);
117  vout.general(m_vl, " Nconv = %d diff = %.8e\n", Nconv, diff);
118  // now v3 is M^-1 * D_1 * M^-1 * xi.
119 
120  // mult D_1
121  v1 = 0.0;
122  m_fopr->mult_up(dir_t, v1, v3);
123  v2 = 0.0;
124  m_fopr->mult_dn(dir_t, v2, v3);
125  v1 -= v2;
126  // now v1 is D_1 * M^-1 * D_1 * M^-1 * xi.
127 
128  dcomplex tr3_c = dotc(xi, v1);
129 
130  vout.general(m_vl, " tr1 = (%f,%f)\n", real(tr1_c), imag(tr1_c));
131  vout.general(m_vl, " tr2 = (%f,%f)\n", real(tr2_c), imag(tr2_c));
132  vout.general(m_vl, " tr3 = (%f,%f)\n", real(tr3_c), imag(tr3_c));
133 
134  tr1 += tr1_c;
135  tr2 += tr2_c;
136  tr3 += tr3_c;
137  }
138 
139  tr1 = tr1 / cmplx(double(m_Nnoise), 0.0);
140  tr2 = tr2 / cmplx(double(m_Nnoise), 0.0);
141  tr3 = tr3 / cmplx(double(m_Nnoise), 0.0);
142 
143  vout.general(m_vl, " averaged over noise vector:\n");
144  vout.general(m_vl, " tr1 = (%f,%f)\n", real(tr1), imag(tr1));
145  vout.general(m_vl, " tr2 = (%f,%f)\n", real(tr2), imag(tr2));
146  vout.general(m_vl, " tr3 = (%f,%f)\n", real(tr3), imag(tr3));
147 
148 
149  return real(tr1);
150 }
151 
152 
153 //====================================================================
154 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:207
void general(const char *format,...)
Definition: bridgeIO.cpp:38
Container of Field-type object.
Definition: field.h:37
Class for parameters.
Definition: parameters.h:40
virtual void set(Field &v)=0
setting a noise vector.
virtual void mult_dn(int mu, Field &, const Field &)
Definition: fopr.h:71
virtual int field_nin()=0
returns the on-site d.o.f. for which the fermion operator is defined.
virtual void invert_D(Field &, const Field &, int &, double &)=0
dcomplex dotc(const Field &y, const Field &x)
Definition: field.cpp:98
virtual int field_nex()=0
returns the external d.o.f. for which the fermion operator is defined.
virtual void mult_up(int mu, Field &, const Field &)
nearest neighbor hopping term: temporary entry [H.Matsufuru]
Definition: fopr.h:70
double measure()
measure tr1 = Tr[D1*Sq], tr2 = Tr[D2*Sq], tr3 = Tr[D1*Sq*D1*Sq].
void crucial(const char *format,...)
Definition: bridgeIO.cpp:26
int non_negative(const int v)
Definition: checker.cpp:21
string get_string(const string &key) const
Definition: parameters.cpp:85
virtual int field_nvol()=0
returns the volume for which the fermion operator is defined.
int fetch_int(const string &key, int &val) const
Definition: parameters.cpp:141
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:191