Bridge++  Ver. 1.1.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 //====================================================================
56 {
57  const string str_vlevel = params.get_string("verbose_level");
58 
59  m_vl = vout.set_verbose_level(str_vlevel);
60 
61  //- fetch and check input parameters
62  valarray<int> source_position;
63 
64  int err = 0;
65  err += params.fetch_int_vector("source_position", source_position);
66 
67  if (err) {
68  vout.crucial(m_vl, "Source_Wall: fetch error, input parameter not found.\n");
69  abort();
70  }
71 
72 
73  set_parameters(source_position);
74 }
75 
76 
77 //====================================================================
78 void Source_Wall::set_parameters(const valarray<int>& source_position)
79 {
80  // #### parameter setup ####
81  int Ndim = CommonParameters::Ndim();
82 
83  //- global lattice size
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  //- local size
91  valarray<int> Nsize(Ndim);
92  Nsize[0] = CommonParameters::Nx();
93  Nsize[1] = CommonParameters::Ny();
94  Nsize[2] = CommonParameters::Nz();
95  Nsize[3] = CommonParameters::Nt();
96 
97  const int t_dir = Ndim - 1;
98 
99  //- print input parameters
100  vout.general(m_vl, "Source for spinor field - Wall smeared:\n");
101  vout.general(m_vl, " source_position[t] = %d\n", source_position[t_dir]);
102 
103  //- range check
104  int err = 0;
105  // NB. Lsize[t_dir] > abs(source_position[t_dir])
106  err += ParameterCheck::non_negative(Lsize[t_dir] - abs(source_position[t_dir]));
107 
108  if (err) {
109  vout.crucial(m_vl, "Source_Staggered_Wall: parameter range check failed.\n");
110  abort();
111  }
112 
113  //- store values
114  m_source_position.resize(Ndim);
115  for (int mu = 0; mu < Ndim; ++mu) {
116  m_source_position[mu] = 0;
117  }
118  m_source_position[t_dir] = (source_position[t_dir] + Lsize[t_dir]) % Lsize[t_dir];
119 
120 
121  //- post-process
122 
123  //- PE location in t-direction.
124  int tpe = m_source_position[t_dir] / Nsize[t_dir];
125 
126  m_in_node = false;
127 
128  if (tpe == Communicator::ipe(t_dir)) {
129  m_in_node = true;
130  }
131 }
132 
133 
134 //====================================================================
135 void Source_Wall::set(Field& src, int j)
136 {
137  int Ndim = CommonParameters::Ndim();
138 
139  //- global lattice size
140  int Lx = CommonParameters::Lx();
141  int Ly = CommonParameters::Ly();
142  int Lz = CommonParameters::Lz();
143 
144  const int Lvol3 = Lx * Ly * Lz;
145 
146  //- local size
147  valarray<int> Nsize(Ndim);
148  Nsize[0] = CommonParameters::Nx();
149  Nsize[1] = CommonParameters::Ny();
150  Nsize[2] = CommonParameters::Nz();
151  Nsize[3] = CommonParameters::Nt();
152 
153  //- clear field
154  src = 0.0;
155 
156  if (m_in_node) {
157  int t = m_source_position[3] % Nsize[3];
158 
159  for (int z = 0; z < Nsize[2]; ++z) {
160  for (int y = 0; y < Nsize[1]; ++y) {
161  for (int x = 0; x < Nsize[0]; ++x) {
162  int isite = m_index.site(x, y, z, t);
163 
164  //XXX field layout: complex as two doubles
165  src.set(2 * j, isite, 0, 1.0 / Lvol3);
166  }
167  }
168  }
169  }
170 }
171 
172 
173 //====================================================================
174 //============================================================END=====