Bridge++  Version 1.5.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
source_Exponential.cpp
Go to the documentation of this file.
1 
14 #include "source_Exponential.h"
15 
16 #ifdef USE_FACTORY_AUTOREGISTER
17 namespace {
18  bool init = Source_Exponential::register_factory();
19 }
20 #endif
21 
22 const std::string Source_Exponential::class_name = "Source_Exponential";
23 
24 //====================================================================
26 {
27  const string str_vlevel = params.get_string("verbose_level");
28 
29  m_vl = vout.set_verbose_level(str_vlevel);
30 
31  //- fetch and check input parameters
32  std::vector<int> source_position;
33  double slope, power;
34 
35  int err = 0;
36  err += params.fetch_int_vector("source_position", source_position);
37  err += params.fetch_double("slope", slope);
38  err += params.fetch_double("power", power);
39 
40  if (err) {
41  vout.crucial(m_vl, "Error at %s: input parameter not found.\n", class_name.c_str());
42  exit(EXIT_FAILURE);
43  }
44 
45  set_parameters(source_position, slope, power);
46 }
47 
48 
49 //====================================================================
50 void Source_Exponential::set_parameters(const std::vector<int>& source_position,
51  const double slope, const double power)
52 {
53  // #### parameter setup ####
54  int Ndim = CommonParameters::Ndim();
55 
56  //- global lattice size
57  std::vector<int> Lsize(Ndim);
58 
59  Lsize[0] = CommonParameters::Lx();
60  Lsize[1] = CommonParameters::Ly();
61  Lsize[2] = CommonParameters::Lz();
62  Lsize[3] = CommonParameters::Lt();
63 
64  //- local size
65  std::vector<int> Nsize(Ndim);
66  Nsize[0] = CommonParameters::Nx();
67  Nsize[1] = CommonParameters::Ny();
68  Nsize[2] = CommonParameters::Nz();
69  Nsize[3] = CommonParameters::Nt();
70 
71  //- print input parameters
72  vout.general(m_vl, "Source for spinor field - exponential smeared:\n");
73  for (int mu = 0; mu < Ndim; ++mu) {
74  vout.general(m_vl, " source_position[%d] = %d\n",
75  mu, source_position[mu]);
76  }
77  vout.general(m_vl, " slope = %12.6f\n", slope);
78  vout.general(m_vl, " power = %12.6f\n", power);
79 
80  //- range check
81  int err = 0;
82  for (int mu = 0; mu < Ndim; ++mu) {
83  // NB. Lsize[mu] > abs(source_position[mu])
84  err += ParameterCheck::non_negative(Lsize[mu] - abs(source_position[mu]));
85  }
86  // NB. slope,power == 0 is allowed.
87 
88  if (err) {
89  vout.crucial(m_vl, "Error at %s: parameter range check failed.\n", class_name.c_str());
90  exit(EXIT_FAILURE);
91  }
92 
93  assert(source_position.size() == Ndim);
94 
95  //- store values
96  m_source_position.resize(Ndim);
97  for (int mu = 0; mu < Ndim; ++mu) {
98  m_source_position[mu] = (source_position[mu] + Lsize[mu]) % Lsize[mu];
99  }
100 
101  m_slope = slope;
102  m_power = power;
103 
104 
105  //- post-process
106  const int Lvol3 = Lsize[0] * Lsize[1] * Lsize[2];
107  const int Nvol3 = Nsize[0] * Nsize[1] * Nsize[2];
108 
109  m_src_func.reset(1, Nvol3, 1);
110  //m_src_func = 0.0;
111  m_src_func.set(0.0);
112 
113  //- PE location in t-direction.
114  const int tpe = m_source_position[3] / Nsize[3];
115 
116  m_in_node = false;
117 
118  if (tpe == Communicator::ipe(3)) {
119  m_in_node = true;
120  }
121 
122  //- fill exponential.
123  // center at source_position,
124  // range -L+1 < (x - x0) < L-1,
125  // tail folded.
126  for (int z = -Lsize[2] + 1; z < Lsize[2]; ++z) {
127  for (int y = -Lsize[1] + 1; y < Lsize[1]; ++y) {
128  for (int x = -Lsize[0] + 1; x < Lsize[0]; ++x) {
129  //- global position
130  int z2 = (m_source_position[2] + z + Lsize[2]) % Lsize[2];
131  int y2 = (m_source_position[1] + y + Lsize[1]) % Lsize[1];
132  int x2 = (m_source_position[0] + x + Lsize[0]) % Lsize[0];
133 
134  //- PE location
135  int xpe = x2 / Nsize[0];
136  int ype = y2 / Nsize[1];
137  int zpe = z2 / Nsize[2];
138 
139  //- local position
140  int xl = x2 % Nsize[0];
141  int yl = y2 % Nsize[1];
142  int zl = z2 % Nsize[2];
143 
144  if (
145  (xpe == Communicator::ipe(0)) &&
146  (ype == Communicator::ipe(1)) &&
147  (zpe == Communicator::ipe(2)) &&
148  (tpe == Communicator::ipe(3)))
149  {
150  double r = sqrt((double)(x * x + y * y + z * z));
151  double ex = pow(r, m_power);
152  double expf = exp(-m_slope * ex);
153 
154  int lsite = xl + Nsize[0] * (yl + Nsize[1] * zl);
155 
156  m_src_func.add(0, lsite, 0, expf);
157  }
158  }
159  }
160  }
161 
162  //- normalize
163  double Fnorm = 0.0;
164  for (int i = 0; i < Nvol3; ++i) {
165  Fnorm += m_src_func.cmp(i) * m_src_func.cmp(i);
166  }
167  double Fnorm_global = Communicator::reduce_sum(Fnorm);
168 
169  //m_src_func *= 1.0 / sqrt(Fnorm_global);
170  scal(m_src_func, 1.0 / sqrt(Fnorm_global));
171 
172  //- check normalization
173  const double epsilon_criterion = CommonParameters::epsilon_criterion();
174 
175  Fnorm = 0.0;
176  for (int i = 0; i < Nvol3; i++) {
177  Fnorm += m_src_func.cmp(i) * m_src_func.cmp(i);
178  }
179  Fnorm_global = Communicator::reduce_sum(Fnorm);
180 
181  // assert(abs(sqrt(Fnorm_global) - 1.0) < epsilon_criterion);
182  //- Fluctuation of order of sqrt(NPE) is acceptable. [21 May 2014]
183  const double epsilon_criterion2 = epsilon_criterion * sqrt((double)CommonParameters::NPE());
184 
185  // assert(abs(sqrt(Fnorm_global) - 1.0) < epsilon_criterion2);
186  if (abs(sqrt(Fnorm_global) - 1.0) > epsilon_criterion2) {
187  vout.crucial(m_vl, "%s: norm criterion is not satisfied.\n",
188  class_name.c_str());
189  vout.crucial(m_vl, " |sqrt(Fnorm_global) -1| = %e.\n",
190  abs(sqrt(Fnorm_global) - 1.0));
191  vout.crucial(m_vl, " epsilon_criterion2 = %e.\n",
192  epsilon_criterion2);
193  }
194 }
195 
196 
197 //====================================================================
198 void Source_Exponential::set(Field& src, const int idx)
199 {
200  const int Ndim = CommonParameters::Ndim();
201 
202  std::vector<int> Nsize(Ndim);
203 
204  Nsize[0] = CommonParameters::Nx();
205  Nsize[1] = CommonParameters::Ny();
206  Nsize[2] = CommonParameters::Nz();
207  Nsize[3] = CommonParameters::Nt();
208 
209  //- clear field
210  src.set(0.0);
211 
212  if (m_in_node) {
213  const int t = m_source_position[3] % Nsize[3];
214 
215  for (int z = 0; z < Nsize[2]; ++z) {
216  for (int y = 0; y < Nsize[1]; ++y) {
217  for (int x = 0; x < Nsize[0]; ++x) {
218  int lsite = x + Nsize[0] * (y + Nsize[1] * z);
219 
220  int isite = m_index.site(x, y, z, t);
221 
222  //XXX field layout: complex as two doubles
223  src.set(2 * idx, isite, 0, m_src_func.cmp(0, lsite, 0));
224  }
225  }
226  }
227  }
228 }
229 
230 
231 //====================================================================
232 void Source_Exponential::set(Field& src, const int i_color, const int i_spin)
233 {
234  const int Nc = CommonParameters::Nc();
235  const int idx = i_color + Nc * i_spin;
236 
237  set(src, idx);
238 }
239 
240 
241 //====================================================================
242 void Source_Exponential::set_all_color(Field& src, const int i_spin)
243 {
244  const int Nc = CommonParameters::Nc();
245  const int Ndim = CommonParameters::Ndim();
246 
247  std::vector<int> Nsize(Ndim);
248 
249  Nsize[0] = CommonParameters::Nx();
250  Nsize[1] = CommonParameters::Ny();
251  Nsize[2] = CommonParameters::Nz();
252  Nsize[3] = CommonParameters::Nt();
253 
254  //- clear field
255  src.set(0.0);
256 
257  if (m_in_node) {
258  const int t = m_source_position[3] % Nsize[3];
259 
260  for (int z = 0; z < Nsize[2]; ++z) {
261  for (int y = 0; y < Nsize[1]; ++y) {
262  for (int x = 0; x < Nsize[0]; ++x) {
263  int lsite = x + Nsize[0] * (y + Nsize[1] * z);
264 
265  int isite = m_index.site(x, y, z, t);
266 
267  for (int i_color = 0; i_color < Nc; ++i_color) {
268  int idx = i_color + Nc * i_spin;
269  int idx_r = 2 * idx;
270 
271  //XXX field layout: complex as two doubles
272  src.set(idx_r, isite, 0, m_src_func.cmp(0, lsite, 0));
273  }
274  }
275  }
276  }
277  }
278 }
279 
280 
281 //====================================================================
283 {
284  const int Nc = CommonParameters::Nc();
285  const int Nd = CommonParameters::Nd();
286  const int Ndim = CommonParameters::Ndim();
287 
288  std::vector<int> Nsize(Ndim);
289 
290  Nsize[0] = CommonParameters::Nx();
291  Nsize[1] = CommonParameters::Ny();
292  Nsize[2] = CommonParameters::Nz();
293  Nsize[3] = CommonParameters::Nt();
294 
295  //- clear field
296  src.set(0.0);
297 
298  if (m_in_node) {
299  const int t = m_source_position[3] % Nsize[3];
300 
301  for (int z = 0; z < Nsize[2]; ++z) {
302  for (int y = 0; y < Nsize[1]; ++y) {
303  for (int x = 0; x < Nsize[0]; ++x) {
304  int lsite = x + Nsize[0] * (y + Nsize[1] * z);
305 
306  int isite = m_index.site(x, y, z, t);
307 
308  for (int idx = 0; idx < Nc * Nd; ++idx) {
309  int idx_r = 2 * idx;
310 
311  //XXX field layout: complex as two doubles
312  src.set(idx_r, isite, 0, m_src_func.cmp(0, lsite, 0));
313  }
314  }
315  }
316  }
317  }
318 }
319 
320 
321 //====================================================================
322 //============================================================END=====
void scal(Field &x, const double a)
scal(x, a): x = a * x
Definition: field.cpp:433
BridgeIO vout
Definition: bridgeIO.cpp:503
static double epsilon_criterion()
void set(const int jin, const int site, const int jex, double v)
Definition: field.h:175
int site(const int &x, const int &y, const int &z, const int &t) const
Definition: index_lex.h:53
void general(const char *format,...)
Definition: bridgeIO.cpp:197
Container of Field-type object.
Definition: field.h:45
int fetch_double(const string &key, double &value) const
Definition: parameters.cpp:327
double cmp(const int jin, const int site, const int jex) const
Definition: field.h:143
Class for parameters.
Definition: parameters.h:46
static int ipe(const int dir)
logical coordinate of current proc.
void set(Field &v, const int idx)
void reset(const int Nin, const int Nvol, const int Nex, const element_type cmpl=Element_type::COMPLEX)
Definition: field.h:95
void crucial(const char *format,...)
Definition: bridgeIO.cpp:178
static const std::string class_name
void add(const int jin, const int site, const int jex, double v)
Definition: field.h:187
Bridge::VerboseLevel m_vl
Definition: source.h:40
int non_negative(const int v)
static int reduce_sum(int count, double *recv_buf, double *send_buf, int pattern=0)
make a global sum of an array of double over the communicator. pattern specifies the dimensions to be...
std::vector< int > m_source_position
void set_all_color_spin(Field &v)
void set_parameters(const Parameters &params)
string get_string(const string &key) const
Definition: parameters.cpp:221
int fetch_int_vector(const string &key, vector< int > &value) const
Definition: parameters.cpp:429
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:131
void set_all_color(Field &v, const int i_spin)