Bridge++  Version 1.4.4
 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 
17 
18 #ifdef USE_FACTORY
19 namespace {
20  Source *create_object()
21  {
22  return new Source_Local();
23  }
24 
25 
26  bool init = Source::Factory::Register("Local", create_object);
27 }
28 #endif
29 
30 
31 
32 const std::string Source_Local::class_name = "Source_Local";
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 
44  int err = 0;
45  err += params.fetch_int_vector("source_position", source_position);
46 
47  if (err) {
48  vout.crucial(m_vl, "Error at %s: input parameter not found.\n", class_name.c_str());
49  exit(EXIT_FAILURE);
50  }
51 
52  set_parameters(source_position);
53 }
54 
55 
56 //====================================================================
57 void Source_Local::set_parameters(const std::vector<int>& source_position)
58 {
59  // #### parameter setup ####
60  int Ndim = CommonParameters::Ndim();
61 
62  std::vector<int> Lsize(Ndim);
63 
64  Lsize[0] = CommonParameters::Lx();
65  Lsize[1] = CommonParameters::Ly();
66  Lsize[2] = CommonParameters::Lz();
67  Lsize[3] = CommonParameters::Lt();
68 
69  //- print input parameters
70  vout.general(m_vl, "Source for spinor field - local:\n");
71  for (int mu = 0; mu < Ndim; ++mu) {
72  vout.general(m_vl, " source_position[%d] = %d\n",
73  mu, source_position[mu]);
74  }
75 
76  //- range check
77  int err = 0;
78  for (int mu = 0; mu < Ndim; ++mu) {
79  // NB. Lsize[mu] > abs(source_position[mu])
80  err += ParameterCheck::non_negative(Lsize[mu] - abs(source_position[mu]));
81  }
82 
83  if (err) {
84  vout.crucial(m_vl, "Error at %s: parameter range check failed.\n", class_name.c_str());
85  exit(EXIT_FAILURE);
86  }
87 
88  assert(source_position.size() == Ndim);
89 
90  //- store values
91  m_source_position.resize(Ndim);
92  m_source_position = source_position;
93 
94  for (int mu = 0; mu < Ndim; ++mu) {
95  while (m_source_position[mu] < 0)
96  {
97  m_source_position[mu] += Lsize[mu];
98  }
99  m_source_position[mu] %= Lsize[mu];
100  }
101 
102 
103  //- post-process
104  std::vector<int> Nsize(Ndim);
105  Nsize[0] = CommonParameters::Nx();
106  Nsize[1] = CommonParameters::Ny();
107  Nsize[2] = CommonParameters::Nz();
108  Nsize[3] = CommonParameters::Nt();
109 
110  //- check if source position is in current local node.
111  m_in_node = true;
112  for (int i = 0; i < Ndim; ++i) {
113  int inode = m_source_position[i] / Nsize[i];
114 
115  if (inode != Communicator::ipe(i)) {
116  m_in_node = false;
117  break;
118  }
119  }
120 
121  //- find local coordinate of source position.
122  if (m_in_node) {
123  for (int i = 0; i < Ndim; ++i) {
124  m_source_position[i] %= Nsize[i];
125  }
126  } else {
127  for (int i = 0; i < Ndim; ++i) {
128  m_source_position[i] = -1;
129  }
130  }
131 }
132 
133 
134 //====================================================================
135 void Source_Local::set(Field& src, int j)
136 {
137  //- clear field
138  //src = 0.0;
139  src.set(0.0);
140 
141  if (m_in_node) {
142  int isite = m_index.site(
147  );
148 
149  //XXX complex as two doubles
150  src.set(2 * j, isite, 0, 1.0);
151  }
152 }
153 
154 
155 //====================================================================
156 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:495
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
static const std::string class_name
Definition: source_Local.h:36
void general(const char *format,...)
Definition: bridgeIO.cpp:195
Index_lex m_index
Definition: source_Local.h:49
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_parameters(const Parameters &params)
Local source for 4-spinor fermion.
Definition: source_Local.h:34
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
void set(Field &v, int j)
std::vector< int > m_source_position
Definition: source_Local.h:50
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:131