Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
source_4spinor_Exp.cpp
Go to the documentation of this file.
1 
14 #include "source_4spinor_Exp.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 using std::valarray;
21 
22 //- parameter entry
23 namespace {
24  void append_entry(Parameters& param)
25  {
26  param.Register_int_vector("source_position", std::valarray<int>());
27  param.Register_double("slope", 0.0);
28  param.Register_double("power", 0.0);
29 
30  param.Register_string("verbose_level", "NULL");
31  }
32 
33 
34 #ifdef USE_PARAMETERS_FACTORY
35  bool init_param = ParametersFactory::Register("Source_4spinor_Exp", append_entry);
36 #endif
37 }
38 //- end
39 
40 //- parameters class
42 //- end
43 
44 //====================================================================
46 {
47  const string str_vlevel = params.get_string("verbose_level");
48 
49  m_vl = vout.set_verbose_level(str_vlevel);
50 
51  //- fetch and check input parameters
52  valarray<int> source_position;
53  double slope, power;
54 
55  int err = 0;
56  err += params.fetch_int_vector("source_position", source_position);
57  err += params.fetch_double("slope", slope);
58  err += params.fetch_double("power", power);
59 
60  if (err) {
61  vout.crucial(m_vl, "Source_4spinor_Exp: fetch error, input parameter not found.\n");
62  abort();
63  }
64 
65 
66  set_parameters(source_position, slope, power);
67 }
68 
69 
70 //====================================================================
71 void Source_4spinor_Exp::set_parameters(valarray<int>& source_position,
72  double slope, double power)
73 {
74  int Ndim = CommonParameters::Ndim();
75 
76  valarray<int> Lsize(Ndim);
77  Lsize[0] = CommonParameters::Lx();
78  Lsize[1] = CommonParameters::Ly();
79  Lsize[2] = CommonParameters::Lz();
80  Lsize[3] = CommonParameters::Lt();
81 
82  //- print input parameters
83  vout.general(m_vl, "Source for 4-spinor field - exponential smeared:\n");
84  for (int mu = 0; mu < Ndim; ++mu) {
85  vout.general(m_vl, " source_position[%d] = %d\n",
86  mu, source_position[mu]);
87  }
88  vout.general(m_vl, " slope = %12.6f\n", slope);
89  vout.general(m_vl, " power = %12.6f\n", power);
90 
91  //- range check
92  int err = 0;
93  for (int mu = 0; mu < Ndim; ++mu) {
94  // NB. Lsize[mu] > abs(source_position[mu])
95  err += ParameterCheck::non_negative(Lsize[mu] - abs(source_position[mu]));
96  }
97  // NB. slope,power == 0 is allowed.
98 
99  if (err) {
100  vout.crucial(m_vl, "Source_4spinor_Exp: parameter range check failed.\n");
101  abort();
102  }
103 
104  assert(source_position.size() == Ndim);
105 
106  //- store values
107  m_source_position.resize(Ndim);
108  for (int mu = 0; mu < Ndim; ++mu) {
109  m_source_position[mu] = (source_position[mu] + Lsize[mu]) % Lsize[mu];
110  }
111 
112  m_slope = slope;
113  m_power = power;
114 
115 
116  //- post-process
117  int Lvol3 = Lsize[0] * Lsize[1] * Lsize[2];
118  m_src_func.reset(1, Lvol3, 1);
119  m_src_func = 0.0;
120 
121  for (int z = -Lsize[2] + 1; z < Lsize[2]; ++z) {
122  for (int y = -Lsize[1] + 1; y < Lsize[1]; ++y) {
123  for (int x = -Lsize[0] + 1; x < Lsize[0]; ++x) {
124  int z2 = (m_source_position[2] + z + Lsize[2]) % Lsize[2];
125  int y2 = (m_source_position[1] + y + Lsize[1]) % Lsize[1];
126  int x2 = (m_source_position[0] + x + Lsize[0]) % Lsize[0];
127  int sites = x2 + Lsize[0] * (y2 + Lsize[1] * z2);
128  double r = sqrt((double)(x * x + y * y + z * z));
129  double ex = pow(r, m_power);
130  double expf = exp(-m_slope * ex);
131  m_src_func.add(0, sites, 0, expf);
132  }
133  }
134  }
135 
136 
137  double Fnorm = 0.0;
138  for (int i = 0; i < Lvol3; i++) {
139  Fnorm += m_src_func.cmp(i) * m_src_func.cmp(i);
140  }
141  m_src_func *= 1.0 / sqrt(Fnorm);
142 
143 
144  double epsilon_criterion = CommonParameters::epsilon_criterion();
145 
146  Fnorm = 0.0;
147  for (int i = 0; i < Lvol3; i++) {
148  Fnorm += m_src_func.cmp(i) * m_src_func.cmp(i);
149  }
150 
151  if (!(abs(sqrt(Fnorm) - 1.0) < epsilon_criterion)) {
152  vout.crucial(m_vl, "Source_4spinor_Exp: norm check failed.\n");
153  abort();
154  }
155 }
156 
157 
158 //====================================================================
159 void Source_4spinor_Exp::set(Field_F& src, int ic, int id)
160 {
161  int Nvol = CommonParameters::Nvol();
162  int Ndim = CommonParameters::Ndim();
163 
164  valarray<int> Lsize(Ndim);
165  Lsize[0] = CommonParameters::Lx();
166  Lsize[1] = CommonParameters::Ly();
167  Lsize[2] = CommonParameters::Lz();
168  Lsize[3] = CommonParameters::Lt();
169 
170  valarray<int> Nsize(Ndim);
171  Nsize[0] = CommonParameters::Nx();
172  Nsize[1] = CommonParameters::Ny();
173  Nsize[2] = CommonParameters::Nz();
174  Nsize[3] = CommonParameters::Nt();
175 
176  int IPEx = Communicator::ipe(0);
177  int IPEy = Communicator::ipe(1);
178  int IPEz = Communicator::ipe(2);
179 
180  assert(ic < CommonParameters::Nc());
181  assert(id < CommonParameters::Nd());
182  assert(src.nvol() == Nvol);
183  assert(src.nex() == 1);
184 
185  src = 0.0;
186 
187  valarray<int> site_src(Ndim);
188  valarray<int> node_src(Ndim);
189  for (int mu = 0; mu < Ndim; ++mu) {
190  site_src[mu] = m_source_position[mu] % Nsize[mu];
191  node_src[mu] = m_source_position[mu] / Nsize[mu];
192  }
193 
194  if (node_src[3] == Communicator::ipe(3)) {
195  int t = site_src[3];
196 
197  for (int z = 0; z < Nsize[2]; ++z) {
198  int z2 = z + Nsize[2] * IPEz;
199  for (int y = 0; y < Nsize[1]; ++y) {
200  int y2 = y + Nsize[1] * IPEy;
201  for (int x = 0; x < Nsize[0]; ++x) {
202  int x2 = x + Nsize[0] * IPEx;
203  int sites = x2 + Lsize[0] * (y2 + Lsize[1] * z2);
204  int site = m_index.site(x, y, z, t);
205  src.set_ri(ic, id, site, 0, m_src_func.cmp(0, sites, 0), 0.0);
206  }
207  }
208  }
209  }
210 }
211 
212 
213 //====================================================================
214 //============================================================END=====