Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
source_MomentumWall.cpp
Go to the documentation of this file.
1 
14 #include "source_MomentumWall.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 using std::valarray;
21 
22 #ifdef USE_FACTORY
23 namespace {
24  Source *create_object()
25  {
26  return new Source_MomentumWall();
27  }
28 
29 
30  bool init = Source::Factory::Register("MomentumWall", create_object);
31 }
32 #endif
33 
34 //- parameter entry
35 namespace {
36  void append_entry(Parameters& param)
37  {
38  param.Register_int_vector("source_position", valarray<int>());
39  param.Register_double_vector("source_momentum", valarray<double>());
40 
41  param.Register_string("verbose_level", "NULL");
42  }
43 
44 
45 #ifdef USE_PARAMETERS_FACTORY
46  bool init_param = ParametersFactory::Register("Source.MomentumWall", append_entry);
47 #endif
48 }
49 //- end
50 
51 //- parameters class
53 //- end
54 
55 const std::string Source_MomentumWall::class_name = "Source_MomentumWall";
56 
57 //====================================================================
59 {
60  const string str_vlevel = params.get_string("verbose_level");
61 
62  m_vl = vout.set_verbose_level(str_vlevel);
63 
64  //- fetch and check input parameters
65  valarray<int> source_position;
66  valarray<double> source_momentum;
67 
68  int err = 0;
69  err += params.fetch_int_vector("source_position", source_position);
70  err += params.fetch_double_vector("source_momentum", source_momentum);
71 
72  if (err) {
73  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
74  abort();
75  }
76 
77  set_parameters(source_position, source_momentum);
78 }
79 
80 
81 //====================================================================
82 void Source_MomentumWall::set_parameters(const valarray<int>& source_position,
83  const valarray<double>& source_momentum)
84 {
85  // #### parameter setup ####
86  int Ndim = CommonParameters::Ndim();
87 
88  //- global lattice size
89  valarray<int> Lsize(Ndim);
90  Lsize[0] = CommonParameters::Lx();
91  Lsize[1] = CommonParameters::Ly();
92  Lsize[2] = CommonParameters::Lz();
93  Lsize[3] = CommonParameters::Lt();
94 
95  //- local size
96  valarray<int> Nsize(Ndim);
97  Nsize[0] = CommonParameters::Nx();
98  Nsize[1] = CommonParameters::Ny();
99  Nsize[2] = CommonParameters::Nz();
100  Nsize[3] = CommonParameters::Nt();
101 
102  const int t_dir = Ndim - 1;
103 
104  //- print input parameters
105  vout.general(m_vl, "Source for spinor field - momentum wall smeared:\n");
106  for (int mu = 0; mu < Ndim; ++mu) {
107  vout.general(m_vl, " source_position[%d] = %d\n",
108  mu, source_position[mu]);
109  }
110  for (int mu = 0; mu < Ndim - 1; ++mu) {
111  vout.general(m_vl, " source_momentum[%d] = %g\n",
112  mu, source_momentum[mu]);
113  }
114 
115 
116  //- range check
117  int err = 0;
118  for (int mu = 0; mu < Ndim; ++mu) {
119  // NB. Lsize[mu] > abs(source_position[mu])
120  err += ParameterCheck::non_negative(Lsize[mu] - abs(source_position[mu]));
121  }
122 
123  if (err) {
124  vout.crucial(m_vl, "%s: parameter range check failed.\n", class_name.c_str());
125  abort();
126  }
127 
128  //- store values
129  m_source_position.resize(Ndim);
130  for (int mu = 0; mu < Ndim; ++mu) {
131  m_source_position[mu] = (source_position[mu] + Lsize[mu]) % Lsize[mu];
132  }
133 
134  m_source_momentum = source_momentum;
135 
136  //- post-process
137 
138  //- PE location in t-direction.
139  int tpe = m_source_position[t_dir] / Nsize[t_dir];
140 
141  m_in_node = false;
142 
143  if (tpe == Communicator::ipe(t_dir)) {
144  m_in_node = true;
145  }
146 }
147 
148 
149 //====================================================================
151 {
152  int Ndim = CommonParameters::Ndim();
153 
154  //- global lattice size
155  int Lx = CommonParameters::Lx();
156  int Ly = CommonParameters::Ly();
157  int Lz = CommonParameters::Lz();
158 
159  const int Lvol3 = Lx * Ly * Lz;
160 
161  //- local size
162  valarray<int> Nsize(Ndim);
163  Nsize[0] = CommonParameters::Nx();
164  Nsize[1] = CommonParameters::Ny();
165  Nsize[2] = CommonParameters::Nz();
166  Nsize[3] = CommonParameters::Nt();
167 
168  //- clear field
169  src = 0.0;
170 
171  if (m_in_node) {
172  int t = m_source_position[3] % Nsize[3];
173 
174  for (int z = 0; z < Nsize[2]; ++z) {
175  for (int y = 0; y < Nsize[1]; ++y) {
176  for (int x = 0; x < Nsize[0]; ++x) {
177  int isite = m_index.site(x, y, z, t);
178 
179  int gX = x + Nsize[0] * Communicator::ipe(0);
180  int gY = y + Nsize[1] * Communicator::ipe(1);
181  int gZ = z + Nsize[2] * Communicator::ipe(2);
182 
183  double theta
184  = double(gX - m_source_position[0]) * m_source_momentum[0]
185  + double(gY - m_source_position[1]) * m_source_momentum[1]
186  + double(gZ - m_source_position[2]) * m_source_momentum[2];
187 
188  //XXX field layout: complex as two doubles
189  src.set(2 * j + 0, isite, 0, cos(theta) / Lvol3);
190  src.set(2 * j + 1, isite, 0, sin(theta) / Lvol3);
191  }
192  }
193  }
194  }
195 }
196 
197 
198 //====================================================================
199 //============================================================END=====
std::valarray< int > m_source_position
BridgeIO vout
Definition: bridgeIO.cpp:207
void Register_string(const string &, const string &)
Definition: parameters.cpp:352
Momentum wall source for 4-spinor fermion.
void set(const int jin, const int site, const int jex, double v)
Definition: field.h:128
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
static const std::string class_name
Container of Field-type object.
Definition: field.h:37
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
int fetch_double_vector(const string &key, std::valarray< double > &val) const
Definition: parameters.cpp:158
void set(Field &v, int j)
void crucial(const char *format,...)
Definition: bridgeIO.cpp:26
static bool Register(const std::string &realm, const creator_callback &cb)
std::valarray< double > m_source_momentum
Bridge::VerboseLevel m_vl
Definition: source.h:39
int non_negative(const int v)
Definition: checker.cpp:21
void Register_double_vector(const string &, const std::valarray< double > &)
Definition: parameters.cpp:338
void Register_int_vector(const string &, const std::valarray< int > &)
Definition: parameters.cpp:345
Base class of sources for a linear solver.
Definition: source.h:36
string get_string(const string &key) const
Definition: parameters.cpp:85
void set_parameters(const Parameters &params)
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:191