Bridge++  Ver. 1.2.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 const std::string Source_4spinor_Exp::class_name = "Source_4spinor_Exp";
45 
46 //====================================================================
48 {
49  const string str_vlevel = params.get_string("verbose_level");
50 
51  m_vl = vout.set_verbose_level(str_vlevel);
52 
53  //- fetch and check input parameters
54  valarray<int> source_position;
55  double slope, power;
56 
57  int err = 0;
58  err += params.fetch_int_vector("source_position", source_position);
59  err += params.fetch_double("slope", slope);
60  err += params.fetch_double("power", power);
61 
62  if (err) {
63  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
64  abort();
65  }
66 
67 
68  set_parameters(source_position, slope, power);
69 }
70 
71 
72 //====================================================================
73 void Source_4spinor_Exp::set_parameters(valarray<int>& source_position,
74  double slope, double power)
75 {
76  int Ndim = CommonParameters::Ndim();
77 
78  valarray<int> Lsize(Ndim);
79  Lsize[0] = CommonParameters::Lx();
80  Lsize[1] = CommonParameters::Ly();
81  Lsize[2] = CommonParameters::Lz();
82  Lsize[3] = CommonParameters::Lt();
83 
84  //- print input parameters
85  vout.general(m_vl, "Source for 4-spinor field - exponential smeared:\n");
86  for (int mu = 0; mu < Ndim; ++mu) {
87  vout.general(m_vl, " source_position[%d] = %d\n",
88  mu, source_position[mu]);
89  }
90  vout.general(m_vl, " slope = %12.6f\n", slope);
91  vout.general(m_vl, " power = %12.6f\n", power);
92 
93  //- range check
94  int err = 0;
95  for (int mu = 0; mu < Ndim; ++mu) {
96  // NB. Lsize[mu] > abs(source_position[mu])
97  err += ParameterCheck::non_negative(Lsize[mu] - abs(source_position[mu]));
98  }
99  // NB. slope,power == 0 is allowed.
100 
101  if (err) {
102  vout.crucial(m_vl, "%s: parameter range check failed.\n", class_name.c_str());
103  abort();
104  }
105 
106  assert(source_position.size() == Ndim);
107 
108  //- store values
109  m_source_position.resize(Ndim);
110  for (int mu = 0; mu < Ndim; ++mu) {
111  m_source_position[mu] = (source_position[mu] + Lsize[mu]) % Lsize[mu];
112  }
113 
114  m_slope = slope;
115  m_power = power;
116 
117 
118  //- post-process
119  int Lvol3 = Lsize[0] * Lsize[1] * Lsize[2];
120  m_src_func.reset(1, Lvol3, 1);
121  m_src_func = 0.0;
122 
123  for (int z = -Lsize[2] + 1; z < Lsize[2]; ++z) {
124  for (int y = -Lsize[1] + 1; y < Lsize[1]; ++y) {
125  for (int x = -Lsize[0] + 1; x < Lsize[0]; ++x) {
126  int z2 = (m_source_position[2] + z + Lsize[2]) % Lsize[2];
127  int y2 = (m_source_position[1] + y + Lsize[1]) % Lsize[1];
128  int x2 = (m_source_position[0] + x + Lsize[0]) % Lsize[0];
129  int sites = x2 + Lsize[0] * (y2 + Lsize[1] * z2);
130  double r = sqrt((double)(x * x + y * y + z * z));
131  double ex = pow(r, m_power);
132  double expf = exp(-m_slope * ex);
133  m_src_func.add(0, sites, 0, expf);
134  }
135  }
136  }
137 
138 
139  double Fnorm = 0.0;
140  for (int i = 0; i < Lvol3; i++) {
141  Fnorm += m_src_func.cmp(i) * m_src_func.cmp(i);
142  }
143  m_src_func *= 1.0 / sqrt(Fnorm);
144 
145 
146  double epsilon_criterion = CommonParameters::epsilon_criterion();
147 
148  Fnorm = 0.0;
149  for (int i = 0; i < Lvol3; i++) {
150  Fnorm += m_src_func.cmp(i) * m_src_func.cmp(i);
151  }
152 
153  if (!(abs(sqrt(Fnorm) - 1.0) < epsilon_criterion)) {
154  vout.crucial(m_vl, "%s: norm check failed.\n", class_name.c_str());
155  abort();
156  }
157 }
158 
159 
160 //====================================================================
161 void Source_4spinor_Exp::set(Field_F& src, int ic, int id)
162 {
163  int Nvol = CommonParameters::Nvol();
164  int Ndim = CommonParameters::Ndim();
165 
166  valarray<int> Lsize(Ndim);
167  Lsize[0] = CommonParameters::Lx();
168  Lsize[1] = CommonParameters::Ly();
169  Lsize[2] = CommonParameters::Lz();
170  Lsize[3] = CommonParameters::Lt();
171 
172  valarray<int> Nsize(Ndim);
173  Nsize[0] = CommonParameters::Nx();
174  Nsize[1] = CommonParameters::Ny();
175  Nsize[2] = CommonParameters::Nz();
176  Nsize[3] = CommonParameters::Nt();
177 
178  int IPEx = Communicator::ipe(0);
179  int IPEy = Communicator::ipe(1);
180  int IPEz = Communicator::ipe(2);
181 
182  assert(ic < CommonParameters::Nc());
183  assert(id < CommonParameters::Nd());
184  assert(src.nvol() == Nvol);
185  assert(src.nex() == 1);
186 
187  src = 0.0;
188 
189  valarray<int> site_src(Ndim);
190  valarray<int> node_src(Ndim);
191  for (int mu = 0; mu < Ndim; ++mu) {
192  site_src[mu] = m_source_position[mu] % Nsize[mu];
193  node_src[mu] = m_source_position[mu] / Nsize[mu];
194  }
195 
196  if (node_src[3] == Communicator::ipe(3)) {
197  int t = site_src[3];
198 
199  for (int z = 0; z < Nsize[2]; ++z) {
200  int z2 = z + Nsize[2] * IPEz;
201  for (int y = 0; y < Nsize[1]; ++y) {
202  int y2 = y + Nsize[1] * IPEy;
203  for (int x = 0; x < Nsize[0]; ++x) {
204  int x2 = x + Nsize[0] * IPEx;
205  int sites = x2 + Lsize[0] * (y2 + Lsize[1] * z2);
206  int site = m_index.site(x, y, z, t);
207  src.set_ri(ic, id, site, 0, m_src_func.cmp(0, sites, 0), 0.0);
208  }
209  }
210  }
211  }
212 }
213 
214 
215 //====================================================================
216 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:207
void Register_string(const string &, const string &)
Definition: parameters.cpp:352
static double epsilon_criterion()
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:38
int nvol() const
Definition: field.h:101
double cmp(const int jin, const int site, const int jex) const
Definition: field.h:108
Bridge::VerboseLevel m_vl
Class for parameters.
Definition: parameters.h:40
static int ipe(const int dir)
logical coordinate of current proc.
int fetch_int_vector(const string &key, std::valarray< int > &val) const
Definition: parameters.cpp:176
Wilson-type fermion field.
Definition: field_F.h:37
void set_parameters(const Parameters &params)
void reset(const int Nin, const int Nvol, const int Nex, const element_type cmpl=COMPLEX)
Definition: field.h:82
int nex() const
Definition: field.h:102
static const std::string class_name
void crucial(const char *format,...)
Definition: bridgeIO.cpp:26
static bool Register(const std::string &realm, const creator_callback &cb)
void add(const int jin, const int site, const int jex, double v)
Definition: field.h:140
int non_negative(const int v)
Definition: checker.cpp:21
void Register_double(const string &, const double)
Definition: parameters.cpp:324
std::valarray< int > m_source_position
void Register_int_vector(const string &, const std::valarray< int > &)
Definition: parameters.cpp:345
void set(Field_F &src, int ic, int id)
int fetch_double(const string &key, double &val) const
Definition: parameters.cpp:124
string get_string(const string &key) const
Definition: parameters.cpp:85
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:191