Bridge++  Version 1.4.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 
17 
18 #ifdef USE_FACTORY
19 namespace {
20  Source *create_object()
21  {
22  return new Source_Exponential();
23  }
24 
25 
26  bool init = Source::Factory::Register("Exponential", create_object);
27 }
28 #endif
29 
30 
31 
32 const std::string Source_Exponential::class_name = "Source_Exponential";
33 
34 //====================================================================
36 {
37  const string str_vlevel = params.get_string("verbose_level");
38 
39  m_vl = vout.set_verbose_level(str_vlevel);
40 
41  //- fetch and check input parameters
42  std::vector<int> source_position;
43  double slope, power;
44 
45  int err = 0;
46  err += params.fetch_int_vector("source_position", source_position);
47  err += params.fetch_double("slope", slope);
48  err += params.fetch_double("power", power);
49 
50  if (err) {
51  vout.crucial(m_vl, "Error at %s: input parameter not found.\n", class_name.c_str());
52  exit(EXIT_FAILURE);
53  }
54 
55  set_parameters(source_position, slope, power);
56 }
57 
58 
59 //====================================================================
60 void Source_Exponential::set_parameters(const std::vector<int>& source_position,
61  const double slope, const double power)
62 {
63  // #### parameter setup ####
64  int Ndim = CommonParameters::Ndim();
65 
66  //- global lattice size
67  std::vector<int> Lsize(Ndim);
68 
69  Lsize[0] = CommonParameters::Lx();
70  Lsize[1] = CommonParameters::Ly();
71  Lsize[2] = CommonParameters::Lz();
72  Lsize[3] = CommonParameters::Lt();
73 
74  //- local size
75  std::vector<int> Nsize(Ndim);
76  Nsize[0] = CommonParameters::Nx();
77  Nsize[1] = CommonParameters::Ny();
78  Nsize[2] = CommonParameters::Nz();
79  Nsize[3] = CommonParameters::Nt();
80 
81  //- print input parameters
82  vout.general(m_vl, "Source for spinor field - exponential smeared:\n");
83  for (int mu = 0; mu < Ndim; ++mu) {
84  vout.general(m_vl, " source_position[%d] = %d\n",
85  mu, source_position[mu]);
86  }
87  vout.general(m_vl, " slope = %12.6f\n", slope);
88  vout.general(m_vl, " power = %12.6f\n", power);
89 
90  //- range check
91  int err = 0;
92  for (int mu = 0; mu < Ndim; ++mu) {
93  // NB. Lsize[mu] > abs(source_position[mu])
94  err += ParameterCheck::non_negative(Lsize[mu] - abs(source_position[mu]));
95  }
96  // NB. slope,power == 0 is allowed.
97 
98  if (err) {
99  vout.crucial(m_vl, "Error at %s: parameter range check failed.\n", class_name.c_str());
100  exit(EXIT_FAILURE);
101  }
102 
103  assert(source_position.size() == Ndim);
104 
105  //- store values
106  m_source_position.resize(Ndim);
107  for (int mu = 0; mu < Ndim; ++mu) {
108  m_source_position[mu] = (source_position[mu] + Lsize[mu]) % Lsize[mu];
109  }
110 
111  m_slope = slope;
112  m_power = power;
113 
114 
115  //- post-process
116  const int Lvol3 = Lsize[0] * Lsize[1] * Lsize[2];
117  const int Nvol3 = Nsize[0] * Nsize[1] * Nsize[2];
118 
119  m_src_func.reset(1, Nvol3, 1);
120  //m_src_func = 0.0;
121  m_src_func.set(0.0);
122 
123  //- PE location in t-direction.
124  int tpe = m_source_position[3] / Nsize[3];
125 
126  m_in_node = false;
127 
128  if (tpe == Communicator::ipe(3)) {
129  m_in_node = true;
130  }
131 
132  //- fill exponential.
133  // center at source_position,
134  // range -L+1 < (x - x0) < L-1,
135  // tail folded.
136  for (int z = -Lsize[2] + 1; z < Lsize[2]; ++z) {
137  for (int y = -Lsize[1] + 1; y < Lsize[1]; ++y) {
138  for (int x = -Lsize[0] + 1; x < Lsize[0]; ++x) {
139  //- global position
140  int z2 = (m_source_position[2] + z + Lsize[2]) % Lsize[2];
141  int y2 = (m_source_position[1] + y + Lsize[1]) % Lsize[1];
142  int x2 = (m_source_position[0] + x + Lsize[0]) % Lsize[0];
143 
144  //- PE location
145  int xpe = x2 / Nsize[0];
146  int ype = y2 / Nsize[1];
147  int zpe = z2 / Nsize[2];
148 
149  //- local position
150  int xl = x2 % Nsize[0];
151  int yl = y2 % Nsize[1];
152  int zl = z2 % Nsize[2];
153 
154  if (
155  (xpe == Communicator::ipe(0)) &&
156  (ype == Communicator::ipe(1)) &&
157  (zpe == Communicator::ipe(2)) &&
158  (tpe == Communicator::ipe(3)))
159  {
160  double r = sqrt((double)(x * x + y * y + z * z));
161  double ex = pow(r, m_power);
162  double expf = exp(-m_slope * ex);
163 
164  int lsite = xl + Nsize[0] * (yl + Nsize[1] * zl);
165 
166  m_src_func.add(0, lsite, 0, expf);
167  }
168  }
169  }
170  }
171 
172  //- normalize
173  double Fnorm = 0.0;
174  for (int i = 0; i < Nvol3; ++i) {
175  Fnorm += m_src_func.cmp(i) * m_src_func.cmp(i);
176  }
177  double Fnorm_global = Communicator::reduce_sum(Fnorm);
178 
179  //m_src_func *= 1.0 / sqrt(Fnorm_global);
180  scal(m_src_func, 1.0 / sqrt(Fnorm_global));
181 
182  //- check normalization
183  double epsilon_criterion = CommonParameters::epsilon_criterion();
184 
185  Fnorm = 0.0;
186  for (int i = 0; i < Nvol3; i++) {
187  Fnorm += m_src_func.cmp(i) * m_src_func.cmp(i);
188  }
189  Fnorm_global = Communicator::reduce_sum(Fnorm);
190 
191  // assert(abs(sqrt(Fnorm_global) - 1.0) < epsilon_criterion);
192  //- Fluctuation of order of sqrt(NPE) is acceptable. [21 May 2014]
193  double epsilon_criterion2 = epsilon_criterion *
194  sqrt((double)CommonParameters::NPE());
195  // assert(abs(sqrt(Fnorm_global) - 1.0) < epsilon_criterion2);
196  if (abs(sqrt(Fnorm_global) - 1.0) > epsilon_criterion2) {
197  vout.crucial(m_vl, "%s: norm criterion is not satisfied.\n",
198  class_name.c_str());
199  vout.crucial(m_vl, " |sqrt(Fnorm_global) -1| = %e.\n",
200  abs(sqrt(Fnorm_global) - 1.0));
201  vout.crucial(m_vl, " epsilon_criterion2 = %e.\n",
202  epsilon_criterion2);
203  }
204 }
205 
206 
207 //====================================================================
209 {
210  int Ndim = CommonParameters::Ndim();
211 
212  std::vector<int> Nsize(Ndim);
213 
214  Nsize[0] = CommonParameters::Nx();
215  Nsize[1] = CommonParameters::Ny();
216  Nsize[2] = CommonParameters::Nz();
217  Nsize[3] = CommonParameters::Nt();
218 
219  //- clear field
220  src.set(0.0);
221 
222  if (m_in_node) {
223  int t = m_source_position[3] % Nsize[3];
224 
225  for (int z = 0; z < Nsize[2]; ++z) {
226  for (int y = 0; y < Nsize[1]; ++y) {
227  for (int x = 0; x < Nsize[0]; ++x) {
228  int lsite = x + Nsize[0] * (y + Nsize[1] * z);
229 
230  int isite = m_index.site(x, y, z, t);
231 
232  //XXX field layout: complex as two doubles
233  src.set(2 * j, isite, 0, m_src_func.cmp(0, lsite, 0));
234  }
235  }
236  }
237  }
238 }
239 
240 
241 //====================================================================
242 //============================================================END=====
void scal(Field &x, const double a)
scal(x, a): x = a * x
Definition: field.cpp:282
BridgeIO vout
Definition: bridgeIO.cpp:495
static double epsilon_criterion()
void set(const int jin, const int site, const int jex, double v)
Definition: field.h:164
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:195
Container of Field-type object.
Definition: field.h:39
int fetch_double(const string &key, double &value) const
Definition: parameters.cpp:211
double cmp(const int jin, const int site, const int jex) const
Definition: field.h:132
Class for parameters.
Definition: parameters.h:46
static int ipe(const int dir)
logical coordinate of current proc.
void reset(const int Nin, const int Nvol, const int Nex, const element_type cmpl=COMPLEX)
Definition: field.h:84
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:176
void set(Field &v, int j)
Exponentially smeared source for 4-spinor fermion.
Bridge::VerboseLevel m_vl
Definition: source.h:38
int non_negative(const int v)
Definition: checker.cpp:21
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_parameters(const Parameters &params)
Base class of source for a linear solver.
Definition: source.h:35
string get_string(const string &key) const
Definition: parameters.cpp:116
int fetch_int_vector(const string &key, vector< int > &value) const
Definition: parameters.cpp:294
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:131
static int NPE()