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