Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
source_Local.cpp
Go to the documentation of this file.
1 
14 #include "source_Local.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_Local();
27  }
28 
29 
30  bool init = Source::Factory::Register("Local", 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.Local", append_entry);
46 #endif
47 }
48 //- end
49 
50 //- parameters class
52 //- end
53 
54 const std::string Source_Local::class_name = "Source_Local";
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  set_parameters(source_position);
75 }
76 
77 
78 //====================================================================
79 void Source_Local::set_parameters(const valarray<int>& source_position)
80 {
81  // #### parameter setup ####
82  int Ndim = CommonParameters::Ndim();
83 
84  valarray<int> Lsize(Ndim);
85  Lsize[0] = CommonParameters::Lx();
86  Lsize[1] = CommonParameters::Ly();
87  Lsize[2] = CommonParameters::Lz();
88  Lsize[3] = CommonParameters::Lt();
89 
90  //- print input parameters
91  vout.general(m_vl, "Source for spinor field - local:\n");
92  for (int mu = 0; mu < Ndim; ++mu) {
93  vout.general(m_vl, " source_position[%d] = %d\n",
94  mu, source_position[mu]);
95  }
96 
97  //- range check
98  int err = 0;
99  for (int mu = 0; mu < Ndim; ++mu) {
100  // NB. Lsize[mu] > abs(source_position[mu])
101  err += ParameterCheck::non_negative(Lsize[mu] - abs(source_position[mu]));
102  }
103 
104  if (err) {
105  vout.crucial(m_vl, "%s: parameter range check failed.\n", class_name.c_str());
106  abort();
107  }
108 
109  assert(source_position.size() == Ndim);
110 
111  //- store values
112  m_source_position.resize(Ndim);
113  m_source_position = source_position;
114 
115  for (int mu = 0; mu < Ndim; ++mu) {
116  while (m_source_position[mu] < 0)
117  {
118  m_source_position[mu] += Lsize[mu];
119  }
120  m_source_position[mu] %= Lsize[mu];
121  }
122 
123 
124  //- post-process
125  valarray<int> Nsize(Ndim);
126  Nsize[0] = CommonParameters::Nx();
127  Nsize[1] = CommonParameters::Ny();
128  Nsize[2] = CommonParameters::Nz();
129  Nsize[3] = CommonParameters::Nt();
130 
131  //- check if source position is in current local node.
132  m_in_node = true;
133  for (int i = 0; i < Ndim; ++i) {
134  int inode = m_source_position[i] / Nsize[i];
135 
136  if (inode != Communicator::ipe(i)) {
137  m_in_node = false;
138  break;
139  }
140  }
141 
142  //- find local coordinate of source position.
143  if (m_in_node) {
144  for (int i = 0; i < Ndim; ++i) {
145  m_source_position[i] %= Nsize[i];
146  }
147  } else {
148  for (int i = 0; i < Ndim; ++i) {
149  m_source_position[i] = -1;
150  }
151  }
152 }
153 
154 
155 //====================================================================
156 void Source_Local::set(Field& src, int j)
157 {
158  //- clear field
159  src = 0.0;
160 
161  if (m_in_node) {
162  int isite = m_index.site(
167  );
168 
169  //XXX complex as two doubles
170  src.set(2 * j, isite, 0, 1.0);
171  }
172 }
173 
174 
175 //====================================================================
176 //============================================================END=====
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
static const std::string class_name
Definition: source_Local.h:43
void general(const char *format,...)
Definition: bridgeIO.cpp:38
Index_lex m_index
Definition: source_Local.h:56
Container of Field-type object.
Definition: field.h:37
std::valarray< int > m_source_position
Definition: source_Local.h:57
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
void set_parameters(const Parameters &params)
Local source for 4-spinor fermion.
Definition: source_Local.h:41
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
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(Field &v, int j)
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:191