Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
action_F_Overlap_Nf2.cpp
Go to the documentation of this file.
1 
14 #include "action_F_Overlap_Nf2.h"
15 
16 //====================================================================
18 {
20 
22 }
23 
24 
25 //====================================================================
27 {
28  // #### parameter setup ####
29  int Ndim = CommonParameters::Ndim();
30  int Nc = CommonParameters::Nc();
31  int Nd = CommonParameters::Nd();
32  int Nvol = CommonParameters::Nvol();
33  int NinG = 2 * Nc * Nc;
34 
35  m_index = new Index_lex;
36 
37  // setting Wilson fermion operator
38  m_fopr_w = new Fopr_Wilson;
39  m_M0 = 1.6;
40  m_kappa = 0.5 / (4.0 - m_M0);
41 
42  m_boundary.resize(Ndim);
43  m_boundary[0] = 1;
44  m_boundary[1] = 1;
45  m_boundary[2] = 1;
46  m_boundary[3] = 1;
47 
50 
51 
52  // setting overlap fermion operator
54  m_mq = 0.2;
55  m_Np = 16;
56  m_x_min = 0.01;
57  m_x_max = 8.0;
58  m_Niter_ms = 1000;
59  m_Stop_cond_ms = 1.0e-20;
60 
63  m_boundary);
64 
65  // Zolotarev coefficients
66  m_sigma.resize(m_Np);
67  m_cl.resize(2 * m_Np);
68  m_bl.resize(m_Np);
69 
70  // low-modes
71  int Nmm = 100;
72  m_TDa.resize(Nmm);
73  m_vk.resize(Nmm);
74 
75  m_Nsbt = 0;
76 
77  int NinF = 2 * Nc * Nd;
78  for (int k = 0; k < Nmm; ++k) {
79  m_vk[k].reset(NinF, Nvol, 1);
80  }
81 
84  int Nk = 20;
85  int Np = 50;
86  double Enorm_eigen = 1.e-22;
87  int Niter_eigen = 500;
88  double Vthreshold = 0.15;
89  m_eigen->set_parameters(Nk, Np, Enorm_eigen, Niter_eigen, Vthreshold);
90 
91  // force saved
92  m_force.reset(NinG, Nvol, Ndim);
93 
94  m_status_linkv = 0;
95 }
96 
97 
98 //====================================================================
100 {
101  int Nc = CommonParameters::Nc();
102  int Nd = CommonParameters::Nd();
103  int Lvol = CommonParameters::Lvol();
104  int size_psf = Lvol * Nc * Nd;
105 
106  Field_F xi;
107 
108  rand->gauss_lex_global(xi);
109 
110  // m_psf = (Field_F) m_fopr_ov->Ddag(xi);
111  //m_psf = (Field_F) m_fopr_ov->H(xi);
112 
113  m_fopr_ov->set_mode("H");
114  m_psf = (Field_F)m_fopr_ov->mult(xi);
115 
116  double xi2 = xi.norm();
117  double H_psf = xi2 * xi2;
118 
119  vout.general(m_vl, "H_Foverlap = %18.8f\n", H_psf);
120  vout.general(m_vl, "H_F/dof = %18.8f\n", H_psf / size_psf);
121 
122  m_status_linkv = 0;
123 
124  return H_psf;
125 }
126 
127 
128 //====================================================================
130 {
131  int Nc = CommonParameters::Nc();
132  int Nd = CommonParameters::Nd();
133  int Lvol = CommonParameters::Lvol();
134  int size_psf = Lvol * Nc * Nd;
135 
136  int Niter = 500;
137  double Stop_cond = 1.0e-24;
138 
139  int Nconv;
140  double diff;
141 
142  Field_F v1;
143 
144  Solver *solver = new Solver_CG(m_fopr_ov);
145 
146  solver->set_parameters(Niter, Stop_cond);
147 
148  m_fopr_ov->set_mode("DdagD");
149  solver->solve(v1, m_psf, Nconv, diff);
150 
151  vout.general(m_vl, " Nconv = %d\n", Nconv);
152  vout.general(m_vl, " diff = %.8e\n", diff);
153 
154  double H_psf = v1 * m_psf;
155 
156  vout.general(m_vl, "H_F_overlap = %18.8f\n", H_psf);
157  vout.general(m_vl, "H_F/dof = %18.8f\n", H_psf / size_psf);
158 
159  delete solver;
160 
161  return H_psf;
162 }
163 
164 
165 //====================================================================
167 {
168  if (m_status_linkv == 0) {
169  int Nc = CommonParameters::Nc();
170  int Nd = CommonParameters::Nd();
171  int Nvol = CommonParameters::Nvol();
172  int Lvol = CommonParameters::Lvol();
173  int Ndim = CommonParameters::Ndim();
174  int NinG = 2 * Nc * Nc;
175  int size_psf = Lvol * Nc * Nd;
176 
177  //- solving psi = (H^2)^(-1) phi
178  Field_F psi(Nvol, 1);
179 
180  int Niter = 500;
181  double Stop_cond = 1.0e-24;
182 
183  int Nconv;
184  double diff;
185 
186  Solver *solver = new Solver_CG(m_fopr_ov);
187  solver->set_parameters(Niter, Stop_cond);
188 
189  m_fopr_ov->set_mode("DdagD");
190  solver->solve(psi, m_psf, Nconv, diff);
191 
192  vout.general(m_vl, " Solver(ov): Nconv = %d diff = %.8e\n", Nconv, diff);
193  delete solver;
194 
195  Force_F_Overlap_Nf2 force_ov;
196  force_ov.set_parameters(m_M0, m_mq,
197  m_Np, m_x_min, m_x_max,
199  m_boundary);
200  force_ov.set_config(m_U);
201 
202  Field force(NinG, Nvol, Ndim);
203  force = force_ov.force_core(psi);
204 
205  m_force = force;
206  ++m_status_linkv;
207 
208  return m_force;
209  } else {
210  vout.general(m_vl, " F_overlap_Nf2 returns previous force.\n");
211  return m_force;
212  }
213 }
214 
215 
216 //====================================================================
217 //===========================================================END======