Bridge++  Version 1.4.4
 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 
17 
18 #ifdef USE_FACTORY
19 namespace {
20  Source *create_object()
21  {
22  return new Source_MomentumWall();
23  }
24 
25 
26  bool init = Source::Factory::Register("MomentumWall", create_object);
27 }
28 #endif
29 
30 
31 
32 const std::string Source_MomentumWall::class_name = "Source_MomentumWall";
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  std::vector<int> source_momentum;
44 
45  int err = 0;
46  err += params.fetch_int_vector("source_position", source_position);
47  err += params.fetch_int_vector("source_momentum", source_momentum);
48 
49  if (err) {
50  vout.crucial(m_vl, "Error at %s: input parameter not found.\n", class_name.c_str());
51  exit(EXIT_FAILURE);
52  }
53 
54  set_parameters(source_position, source_momentum);
55 }
56 
57 
58 //====================================================================
59 void Source_MomentumWall::set_parameters(const std::vector<int>& source_position,
60  const std::vector<int>& source_momentum)
61 {
62  // #### parameter setup ####
63  const int Ndim = CommonParameters::Ndim();
64  const int t_dir = Ndim - 1;
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  const int Nt = CommonParameters::Nt();
76 
77  //- print input parameters
78  vout.general(m_vl, "Source for spinor field - momentum wall smeared:\n");
79  for (int mu = 0; mu < Ndim; ++mu) {
80  vout.general(m_vl, " source_position[%d] = %d\n",
81  mu, source_position[mu]);
82  }
83  for (int mu = 0; mu < Ndim - 1; ++mu) {
84  vout.general(m_vl, " source_momentum[%d] = %d\n",
85  mu, source_momentum[mu]);
86  }
87 
88 
89  //- range check
90  int err = 0;
91  for (int mu = 0; mu < Ndim; ++mu) {
92  // NB. Lsize[mu] > abs(source_position[mu])
93  err += ParameterCheck::non_negative(Lsize[mu] - abs(source_position[mu]));
94  }
95 
96  if (err) {
97  vout.crucial(m_vl, "Error at %s: parameter range check failed.\n", class_name.c_str());
98  exit(EXIT_FAILURE);
99  }
100 
101  //- store values
102  m_source_position.resize(Ndim);
103  for (int mu = 0; mu < Ndim; ++mu) {
104  m_source_position[mu] = (source_position[mu] + Lsize[mu]) % Lsize[mu];
105  }
106 
107  m_source_momentum = source_momentum;
108 
109  //- post-process
110 
111  //- PE location in t-direction.
112  int tpe = m_source_position[t_dir] / Nt;
113 
114  m_in_node = false;
115 
116  if (tpe == Communicator::ipe(t_dir)) {
117  m_in_node = true;
118  }
119 }
120 
121 
122 //====================================================================
123 void Source_MomentumWall::set(Field& src, int idx)
124 {
125  const int Ndim = CommonParameters::Ndim();
126 
127  const int x_dir = 0;
128  const int y_dir = 1;
129  const int z_dir = 2;
130  const int t_dir = Ndim - 1;
131 
132  //- global lattice size
133  const int Lx = CommonParameters::Lx();
134  const int Ly = CommonParameters::Ly();
135  const int Lz = CommonParameters::Lz();
136 
137  const int Lvol3 = Lx * Ly * Lz;
138 
139  //- local size
140  const int Nx = CommonParameters::Nx();
141  const int Ny = CommonParameters::Ny();
142  const int Nz = CommonParameters::Nz();
143  const int Nt = CommonParameters::Nt();
144 
145  static const double PI = 4.0 * atan(1.0);
146  std::vector<double> p_unit(Ndim - 1);
147 
148  p_unit[x_dir] = (2.0 * PI / Lx) * m_source_momentum[x_dir];
149  p_unit[y_dir] = (2.0 * PI / Ly) * m_source_momentum[y_dir];
150  p_unit[z_dir] = (2.0 * PI / Lz) * m_source_momentum[z_dir];
151 
152  std::vector<int> ipe(Ndim - 1);
153  ipe[x_dir] = Communicator::ipe(x_dir);
154  ipe[y_dir] = Communicator::ipe(y_dir);
155  ipe[z_dir] = Communicator::ipe(z_dir);
156 
157  //- clear field
158  src.set(0.0);
159 
160  if (m_in_node) {
161  int t = m_source_position[t_dir] % Nt;
162 
163  for (int z = 0; z < Nz; ++z) {
164  for (int y = 0; y < Ny; ++y) {
165  for (int x = 0; x < Nx; ++x) {
166  int site = m_index.site(x, y, z, t);
167 
168  int x_global = x + ipe[x_dir] * Nx;
169  int y_global = y + ipe[y_dir] * Ny;
170  int z_global = z + ipe[z_dir] * Nz;
171 
172  double p_x = p_unit[x_dir] * (x_global - m_source_position[x_dir]);
173  double p_y = p_unit[y_dir] * (y_global - m_source_position[y_dir]);
174  double p_z = p_unit[z_dir] * (z_global - m_source_position[z_dir]);
175 
176  double theta = p_x + p_y + p_z;
177 
178  //XXX field layout: complex as two doubles
179  src.set(2 * idx + 0, site, 0, cos(theta) / Lvol3);
180  src.set(2 * idx + 1, site, 0, sin(theta) / Lvol3);
181  }
182  }
183  }
184  }
185 }
186 
187 
188 //====================================================================
189 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:495
Momentum wall source for 4-spinor fermion.
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
std::vector< int > m_source_momentum
void general(const char *format,...)
Definition: bridgeIO.cpp:195
static const std::string class_name
Container of Field-type object.
Definition: field.h:39
Class for parameters.
Definition: parameters.h:46
static int ipe(const int dir)
logical coordinate of current proc.
void set(Field &v, int j)
void crucial(const char *format,...)
Definition: bridgeIO.cpp:178
Bridge::VerboseLevel m_vl
Definition: source.h:38
int non_negative(const int v)
Definition: checker.cpp:21
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
std::vector< int > m_source_position
void set_parameters(const Parameters &params)
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:131