Bridge++  Ver.2.1.3
projection_Maximum_SU_N.cpp
Go to the documentation of this file.
1 
13 
14 #ifdef USE_FACTORY_AUTOREGISTER
15 namespace {
16  bool init = Projection_Maximum_SU_N::register_factory();
17 }
18 #endif
19 
21  = "Projection_Maximum_SU_N";
22 
23 //====================================================================
25 {
27 
28  std::string vlevel;
29  if (!params.fetch_string("verbose_level", vlevel)) {
30  m_vl = vout.set_verbose_level(vlevel);
31  } else {
33  }
34 
35  const int Nvol = CommonParameters::Nvol();
36  const int Ndim = CommonParameters::Ndim();
37 
38  vout.general(m_vl, "%s: construction\n", class_name.c_str());
40 
41  set_parameters(params);
42 
43  // to be modified Ndim -> 1.
44  m_At = new Field_G(Nvol, Ndim);
45  m_Dlt = new Field_G(Nvol, Ndim);
46  m_Ut = new Field_G(Nvol, Ndim);
47  m_vt = new Field_G(Nvol, Ndim);
48  m_wt = new Field_G(Nvol, Ndim);
49 
51  vout.general(m_vl, "%s: construction finished.\n",
52  class_name.c_str());
53 
54 }
55 
56 //====================================================================
58 {
59  delete m_At;
60  delete m_Dlt;
61  delete m_Ut;
62  delete m_vt;
63  delete m_wt;
64 }
65 
66 //====================================================================
68 {
69  std::string vlevel;
70  if (!params.fetch_string("verbose_level", vlevel)) {
71  m_vl = vout.set_verbose_level(vlevel);
72  }
73 
74  //- fetch and check input parameters
75  int Niter;
76  double Enorm;
77 
78  int err = 0;
79  err += params.fetch_int("maximum_number_of_iteration", Niter);
80  err += params.fetch_double("convergence_criterion", Enorm);
81 
82  if (err) {
83  vout.crucial(m_vl, "Error at %s: input parameter not found.\n",
84  class_name.c_str());
85  exit(EXIT_FAILURE);
86  }
87 
88  set_parameters(Niter, Enorm);
89 }
90 
91 
92 //====================================================================
94  const double Enorm)
95 {
96  //- range check
97  int err = 0;
98  err += ParameterCheck::non_negative(Niter);
99  err += ParameterCheck::non_zero(Enorm);
100 
101  if (err) {
102  vout.crucial(m_vl, "Error at %s: parameter range check failed.\n",
103  class_name.c_str());
104  exit(EXIT_FAILURE);
105  }
106 
107  int ith = ThreadManager::get_thread_id();
108  if (ith == 0) {
109  m_Niter = Niter;
110  m_Enorm = Enorm;
111  }
112 
113  //- print input parameters
114  vout.general(m_vl, "%s: parameters\n", class_name.c_str());
115  vout.general(m_vl, " Niter = %d\n", m_Niter);
116  vout.general(m_vl, " Enorm = %12.4e\n", m_Enorm);
117 
118 }
119 
120 
121 //====================================================================
123 {
124  params.set_int("maximum_number_of_iteration", m_Niter);
125  params.set_double("convergence_criterion", m_Enorm);
126 
127  params.set_string("verbose_level", vout.get_verbose_level(m_vl));
128 }
129 
130 
131 //====================================================================
133 {
134 #pragma omp barrier
135 
136  const int Nex = Uref.nex();
137  const int Nvol = Uref.nvol();
138 
139  int ith = ThreadManager::get_thread_id();
140  if (ith == 0) {
141  delete m_At;
142  delete m_Dlt;
143  delete m_Ut;
144  delete m_vt;
145  delete m_wt;
146 
147  m_At = new Field_G(Nvol, Nex);
148  m_Dlt = new Field_G(Nvol, Nex);
149  m_Ut = new Field_G(Nvol, Nex);
150  m_vt = new Field_G(Nvol, Nex);
151  m_wt = new Field_G(Nvol, Nex);
152  }
153 #pragma omp barrier
154 
155  vout.general(m_vl, "working fields reset.\n");
156 
157 }
158 
159 //====================================================================
161  const double alpha,
162  const Field_G& Cst,
163  const Field_G& Uorg)
164 {
165  const int Nex = Uorg.nex();
166  const int Nvol = Uorg.nvol();
167  const int Nc = CommonParameters::Nc();
168 
169  assert(Cst.nex() == Nex);
170  assert(Cst.nvol() == Nvol);
171  assert(U.nex() == Nex);
172  assert(U.nvol() == Nvol);
173 
174  if(Nex != m_Ut->nex() || Nvol != m_Ut->nvol()){
175  reset_field(Uorg);
176  }
177 
178  for (int ex = 0; ex < Nex; ++ex) {
179  copy(*m_Ut, ex, Cst, ex);
180  axpy(*m_Ut, ex, 1.0 - alpha, Uorg, ex);
181  }
182 #pragma omp barrier
183 
184  maxTr(U, *m_Ut);
185 
186 }
187 
188 
189 //====================================================================
191  Field_G& iTheta,
192  const double alpha,
193  const Field_G& Sigmap,
194  const Field_G& Cst,
195  const Field_G& Uorg)
196 {
197  vout.crucial(m_vl, "Error at %s: force_recursive() is not available.\n",
198  class_name.c_str());
199  exit(EXIT_FAILURE);
200 }
201 
202 
203 //====================================================================
205 {
206  const int Nc = CommonParameters::Nc();
207  const int Nvol = Cst.nvol();
208  const int Nex = Cst.nex();
209 
210  assert(Nvol == G0.nvol());
211  assert(Nex == G0.nex());
212 
213  const int Nmt = 1; // number of subgroup maximization loop:
214  // seems not important because of outer iter-loop.
215 
216  Mat_SU_N unity(Nc);
217  unity.unit();
218 
219  for (int ex = 0; ex < Nex; ++ex) {
220  copy(*m_At, ex, Cst, ex);
221  }
222 #pragma omp barrier
223 
224  vout.detailed(m_vl, "Maximum projection start.\n");
225 
226  int ith, nth, is, ns;
227  set_threadtask(ith, nth, is, ns, Nvol);
228 
229  for (int ex = 0; ex < Nex; ++ex) {
230  for (int site = is; site < ns; ++site) {
231  G0.set_mat(site, ex, unity);
232  }
233  }
234 #pragma omp barrier
235 
236  for (int iter = 0; iter < m_Niter; ++iter) {
237 
238  for (int ex = 0; ex < Nex; ++ex) {
239  for (int site = is; site < ns; ++site) {
240  m_Dlt->set_mat(site, ex, unity);
241  }
242  }
243 #pragma omp barrier
244 
245  for (int imt = 0; imt < Nmt; ++imt) {
246  for (int i1 = 0; i1 < Nc; ++i1) {
247  int i2 = (i1 + 1) % Nc;
248  maxTr_SU2(i1, i2, G0, *m_At, *m_Dlt);
249  }
250  }
251 
252  //- convergence test
253  double retr1 = 0.0;
254  for (int ex = 0; ex < Nex; ++ex) {
255  for (int site = is; site < ns; ++site) {
256  for (int cc = 0; cc < Nc; ++cc) {
257  retr1 += m_Dlt->cmp_r(cc * (1 + Nc), site, ex);
258  }
259  }
260  }
261 
262  double retr = retr1;
263  ThreadManager::reduce_sum_global(retr, ith, nth);
264 
265  const int Npe = Communicator::size();
266  double deltaV = 1.0 - retr / (Nc * Nvol * Nex * Npe);
267  vout.detailed(m_vl, " iter = %d deltaV = %12.4e\n", iter, deltaV);
268 
269  if (deltaV < m_Enorm) {
270  for (int ex = 0; ex < Nex; ++ex) {
271  for (int site = is; site < ns; ++site) {
272  Mat_SU_N ut(Nc);
273  G0.mat_dag(ut, site, ex);
274  G0.set_mat(site, ex, ut);
275  }
276  }
277 #pragma omp barrier
278 
279  vout.detailed(m_vl, "Maximum projection converged.\n");
280 
281  return;
282  }
283  }
284 
285  vout.crucial(m_vl, "Error at %s: Maximum projection not converged.\n",
286  class_name.c_str());
287  exit(EXIT_FAILURE);
288 }
289 
290 
291 //====================================================================
292 void Projection_Maximum_SU_N::maxTr_SU2(const int i1, const int i2,
293  Field_G& Gmax,
294  Field_G& A, Field_G& Udelta)
295 {
296  const int Nc = CommonParameters::Nc();
297  const int Nvol = A.nvol();
298  const int Nex = A.nex();
299 
300  if(Nex > m_vt->nex()){
301  vout.crucial(m_vl, "too large matrix size in %s\n",
302  class_name.c_str());
303  exit(EXIT_FAILURE);
304  }
305 
306  assert(i1 < Nc);
307  assert(i2 < Nc);
308 
309  const int j1 = mindex(i1, i1, Nc);
310  const int j2 = mindex(i2, i2, Nc);
311  const int k1 = mindex(i1, i2, Nc);
312  const int k2 = mindex(i2, i1, Nc);
313 
314  //----------[ | # # 0 | <i1 ]--------------------------
315  //----------[ V = | # # 0 | <i2 ]--------------------------
316  //----------[ | 0 0 1 | ]--------------------------
317 
318  //Field_G v(Nvol, Nex);
319  int ith, nth, is, ns;
320  set_threadtask(ith, nth, is, ns, Nvol);
321 
322  for (int ex = 0; ex < Nex; ++ex) {
323  for (int site = is; site < ns; ++site) {
324 
325  Mat_SU_N at(Nc);
326  at = A.mat(site, ex);
327 
328  double xlamd =
329  at.r(j1) * at.r(j1) + at.i(j1) * at.i(j1) + 2.0 * at.r(j1) * at.r(j2)
330  + at.r(k1) * at.r(k1) + at.i(k1) * at.i(k1) - 2.0 * at.i(j1) * at.i(j2)
331  + at.r(k2) * at.r(k2) + at.i(k2) * at.i(k2) - 2.0 * at.r(k1) * at.r(k2)
332  + at.r(j2) * at.r(j2) + at.i(j2) * at.i(j2) + 2.0 * at.i(k1) * at.i(k2);
333  xlamd = 1.0 / sqrt(xlamd);
334 
335  Mat_SU_N vt(Nc);
336  vt.unit();
337  vt.set(j1, (at.r(j1) + at.r(j2)) * xlamd, (-at.i(j1) + at.i(j2)) * xlamd);
338  vt.set(k1, (at.r(k2) - at.r(k1)) * xlamd, (-at.i(k2) - at.i(k1)) * xlamd);
339  vt.set(k2, (at.r(k1) - at.r(k2)) * xlamd, (-at.i(k1) - at.i(k2)) * xlamd);
340  vt.set(j2, (at.r(j1) + at.r(j2)) * xlamd, (at.i(j1) - at.i(j2)) * xlamd);
341 
342  m_vt->set_mat(site, ex, vt);
343  }
344  }
345 #pragma omp barrier
346 
347  for (int ex = 0; ex < Nex; ++ex) {
348  mult_Field_Gnn(*m_wt, ex, A, ex, *m_vt, ex);
349  copy(A, ex, *m_wt, ex);
350  }
351 #pragma omp barrier
352 
353  for (int ex = 0; ex < Nex; ++ex) {
354  mult_Field_Gnn(*m_wt, ex, Gmax, ex, *m_vt, ex);
355  copy(Gmax, ex, *m_wt, ex);
356  }
357 #pragma omp barrier
358 
359  for (int ex = 0; ex < Nex; ++ex) {
360  mult_Field_Gnn(*m_wt, ex, Udelta, ex, *m_vt, ex);
361  copy(Udelta, ex, *m_wt, ex);
362  }
363 #pragma omp barrier
364 
365 }
366 
367 //============================================================END=====
Projection_Maximum_SU_N::init
void init(const Parameters &params)
Definition: projection_Maximum_SU_N.cpp:24
Projection_Maximum_SU_N::tidyup
void tidyup()
Definition: projection_Maximum_SU_N.cpp:57
Parameters::set_string
void set_string(const string &key, const string &value)
Definition: parameters.cpp:39
projection_Maximum_SU_N.h
CommonParameters::Ndim
static int Ndim()
Definition: commonParameters.h:117
Parameters
Class for parameters.
Definition: parameters.h:46
Field_G::mat_dag
Mat_SU_N mat_dag(const int site, const int mn=0) const
Definition: field_G.h:127
Parameters::set_double
void set_double(const string &key, const double value)
Definition: parameters.cpp:33
Bridge::BridgeIO::decrease_indent
void decrease_indent()
Definition: bridgeIO.cpp:518
Projection_Maximum_SU_N::m_At
Field_G * m_At
Definition: projection_Maximum_SU_N.h:43
Bridge::BridgeIO::increase_indent
void increase_indent()
Definition: bridgeIO.cpp:508
Bridge::BridgeIO::detailed
void detailed(const char *format,...)
Definition: bridgeIO.cpp:281
Field::nex
int nex() const
Definition: field.h:128
Projection_Maximum_SU_N::m_vt
Field_G * m_vt
Definition: projection_Maximum_SU_N.h:46
Field_G::set_mat
void set_mat(const int site, const int mn, const Mat_SU_N &U)
Definition: field_G.h:160
Communicator::size
static int size()
size of small world.
Definition: communicator.cpp:81
CommonParameters::Nvol
static int Nvol()
Definition: commonParameters.h:109
Projection_Maximum_SU_N::maxTr_SU2
void maxTr_SU2(const int, const int, Field_G &, Field_G &, Field_G &)
maximization by SU(2) subgroup.
Definition: projection_Maximum_SU_N.cpp:292
axpy
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:381
SU_N::Mat_SU_N::unit
Mat_SU_N & unit()
Definition: mat_SU_N.h:419
ParameterCheck::non_negative
int non_negative(const int v)
Definition: parameterCheck.cpp:21
copy
void copy(Field &y, const Field &x)
copy(y, x): y = x
Definition: field.cpp:213
SU_N::Mat_SU_N::set
void set(int c, const double &re, const double &im)
Definition: mat_SU_N.h:137
Projection_Maximum_SU_N::m_vl
Bridge::VerboseLevel m_vl
verbose level
Definition: projection_Maximum_SU_N.h:41
Projection_Maximum_SU_N::get_parameters
void get_parameters(Parameters &params) const
Definition: projection_Maximum_SU_N.cpp:122
CommonParameters::Nc
static int Nc()
Definition: commonParameters.h:115
Projection_Maximum_SU_N::m_Dlt
Field_G * m_Dlt
Definition: projection_Maximum_SU_N.h:44
Projection_Maximum_SU_N::force_recursive
void force_recursive(Field_G &Xi, Field_G &iTheta, const double alpha, const Field_G &Sigmap, const Field_G &C, const Field_G &U)
force calculation: invalid in this class.
Definition: projection_Maximum_SU_N.cpp:190
Projection_Maximum_SU_N::project
void project(Field_G &U, const double alpha, const Field_G &C, const Field_G &Uorg)
projection U = P[alpha, C, Uorg]
Definition: projection_Maximum_SU_N.cpp:160
Projection_Maximum_SU_N::mindex
int mindex(const int i, const int j, const int Nc)
matrix index for convenience.
Definition: projection_Maximum_SU_N.h:87
SU_N::Mat_SU_N
Definition: mat_SU_N.h:36
ThreadManager::reduce_sum_global
static void reduce_sum_global(dcomplex &value, const int i_thread, const int Nthread)
global reduction with summation: dcomplex values are assumed thread local.
Definition: threadManager.cpp:288
threadManager.h
Projection_Maximum_SU_N::reset_field
void reset_field(const Field_G &Uref)
Definition: projection_Maximum_SU_N.cpp:132
SU_N::Mat_SU_N::r
double r(int c) const
Definition: mat_SU_N.h:115
Field::nvol
int nvol() const
Definition: field.h:127
Projection_Maximum_SU_N::set_parameters
void set_parameters(const Parameters &params)
Definition: projection_Maximum_SU_N.cpp:67
Projection_Maximum_SU_N::m_wt
Field_G * m_wt
Definition: projection_Maximum_SU_N.h:47
CommonParameters::Vlevel
static Bridge::VerboseLevel Vlevel()
Definition: commonParameters.h:122
Field_G::cmp_r
double cmp_r(const int cc, const int site, const int mn=0) const
Definition: field_G.h:87
Bridge::BridgeIO::set_verbose_level
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:195
mult_Field_Gnn
void mult_Field_Gnn(Field_G &W, const int ex, const Field_G &U1, const int ex1, const Field_G &U2, const int ex2)
Definition: field_G_imp.cpp:95
ParameterCheck::non_zero
int non_zero(const double v)
Definition: parameterCheck.cpp:32
Projection_Maximum_SU_N::m_Enorm
double m_Enorm
convergence criterion of maximization
Definition: projection_Maximum_SU_N.h:39
SU_N::Mat_SU_N::i
double i(int c) const
Definition: mat_SU_N.h:116
Parameters::set_int
void set_int(const string &key, const int value)
Definition: parameters.cpp:36
Parameters::fetch_string
int fetch_string(const string &key, string &value) const
Definition: parameters.cpp:378
Parameters::fetch_double
int fetch_double(const string &key, double &value) const
Definition: parameters.cpp:327
Projection_Maximum_SU_N::m_Ut
Field_G * m_Ut
Definition: projection_Maximum_SU_N.h:45
field_thread-inc.h
Projection_Maximum_SU_N::maxTr
void maxTr(Field_G &U, const Field_G &V)
maximization of ReTr[U^\dag V].
Definition: projection_Maximum_SU_N.cpp:204
Projection_Maximum_SU_N::class_name
static const std::string class_name
Definition: projection_Maximum_SU_N.h:35
Bridge::BridgeIO::crucial
void crucial(const char *format,...)
Definition: bridgeIO.cpp:242
ThreadManager::get_thread_id
static int get_thread_id()
returns thread id.
Definition: threadManager.cpp:253
Field_G::mat
Mat_SU_N mat(const int site, const int mn=0) const
Definition: field_G.h:114
Field_G
SU(N) gauge field.
Definition: field_G.h:38
Parameters::fetch_int
int fetch_int(const string &key, int &value) const
Definition: parameters.cpp:346
Projection_Maximum_SU_N::m_Niter
int m_Niter
maximum iteration of maximization steps
Definition: projection_Maximum_SU_N.h:38
Bridge::BridgeIO::general
void general(const char *format,...)
Definition: bridgeIO.cpp:262
ThreadManager::assert_single_thread
static void assert_single_thread(const std::string &class_name)
assert currently running on single thread.
Definition: threadManager.cpp:372
Bridge::vout
BridgeIO vout
Definition: bridgeIO.cpp:572
Bridge::BridgeIO::get_verbose_level
static std::string get_verbose_level(const VerboseLevel vl)
Definition: bridgeIO.cpp:216