Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 using std::valarray;
21 
22 #ifdef USE_FACTORY
23 namespace {
24  Source *create_object()
25  {
26  return new Source_Wall();
27  }
28 
29 
30  bool init = Source::Factory::Register("Wall", 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 
40  param.Register_string("verbose_level", "NULL");
41  }
42 
43 
44 #ifdef USE_PARAMETERS_FACTORY
45  bool init_param = ParametersFactory::Register("Source.Wall", append_entry);
46 #endif
47 }
48 //- end
49 
50 //- parameters class
52 //- end
53 
54 const std::string Source_Wall::class_name = "Source_Wall";
55 
56 //====================================================================
58 {
59  const string str_vlevel = params.get_string("verbose_level");
60 
61  m_vl = vout.set_verbose_level(str_vlevel);
62 
63  //- fetch and check input parameters
64  valarray<int> source_position;
65 
66  int err = 0;
67  err += params.fetch_int_vector("source_position", source_position);
68 
69  if (err) {
70  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
71  abort();
72  }
73 
74 
75  set_parameters(source_position);
76 }
77 
78 
79 //====================================================================
80 void Source_Wall::set_parameters(const valarray<int>& source_position)
81 {
82  // #### parameter setup ####
83  int Ndim = CommonParameters::Ndim();
84 
85  //- global lattice size
86  valarray<int> Lsize(Ndim);
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  valarray<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  abort();
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  valarray<int> Nsize(Ndim);
150  Nsize[0] = CommonParameters::Nx();
151  Nsize[1] = CommonParameters::Ny();
152  Nsize[2] = CommonParameters::Nz();
153  Nsize[3] = CommonParameters::Nt();
154 
155  //- clear field
156  src = 0.0;
157 
158  if (m_in_node) {
159  int t = m_source_position[3] % Nsize[3];
160 
161  for (int z = 0; z < Nsize[2]; ++z) {
162  for (int y = 0; y < Nsize[1]; ++y) {
163  for (int x = 0; x < Nsize[0]; ++x) {
164  int isite = m_index.site(x, y, z, t);
165 
166  //XXX field layout: complex as two doubles
167  src.set(2 * j, isite, 0, 1.0 / Lvol3);
168  }
169  }
170  }
171  }
172 }
173 
174 
175 //====================================================================
176 //============================================================END=====
std::valarray< int > m_source_position
Definition: source_Wall.h:54
BridgeIO vout
Definition: bridgeIO.cpp:207
void Register_string(const string &, const string &)
Definition: parameters.cpp:352
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
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:37
Class for parameters.
Definition: parameters.h:40
static int ipe(const int dir)
logical coordinate of current proc.
bool m_in_node
Definition: source_Wall.h:55
int fetch_int_vector(const string &key, std::valarray< int > &val) const
Definition: parameters.cpp:176
void set_parameters(const Parameters &params)
Definition: source_Wall.cpp:57
void crucial(const char *format,...)
Definition: bridgeIO.cpp:26
static bool Register(const std::string &realm, const creator_callback &cb)
Bridge::VerboseLevel m_vl
Definition: source.h:39
int non_negative(const int v)
Definition: checker.cpp:21
void Register_int_vector(const string &, const std::valarray< int > &)
Definition: parameters.cpp:345
Index_lex m_index
Definition: source_Wall.h:53
Base class of sources for a linear solver.
Definition: source.h:36
string get_string(const string &key) const
Definition: parameters.cpp:85
Wall source for 4-spinor fermion.
Definition: source_Wall.h:39
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:191