Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
source_4spinor_Local.cpp
Go to the documentation of this file.
1 
14 #include "source_4spinor_Local.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 using std::valarray;
21 
22 //- parameter entry
23 namespace {
24  void append_entry(Parameters& param)
25  {
26  param.Register_int_vector("source_position", std::valarray<int>());
27 
28  param.Register_string("verbose_level", "NULL");
29  }
30 
31 
32 #ifdef USE_PARAMETERS_FACTORY
33  bool init_param = ParametersFactory::Register("Source_4spinor_Local", append_entry);
34 #endif
35 }
36 //- end
37 
38 //- parameters class
40 //- end
41 
42 //====================================================================
44 {
45  const string str_vlevel = params.get_string("verbose_level");
46 
47  m_vl = vout.set_verbose_level(str_vlevel);
48 
49  //- fetch and check input parameters
50  valarray<int> source_position;
51 
52  int err = 0;
53  err += params.fetch_int_vector("source_position", source_position);
54 
55  if (err) {
56  vout.crucial(m_vl, "Source_4spinor_Local: fetch error, input parameter not found.\n");
57  abort();
58  }
59 
60 
61  set_parameters(source_position);
62 }
63 
64 
65 //====================================================================
66 void Source_4spinor_Local::set_parameters(valarray<int>& source_position)
67 {
68  int Ndim = CommonParameters::Ndim();
69 
70  valarray<int> Lsize(Ndim);
71  Lsize[0] = CommonParameters::Lx();
72  Lsize[1] = CommonParameters::Ly();
73  Lsize[2] = CommonParameters::Lz();
74  Lsize[3] = CommonParameters::Lt();
75 
76  //- print input parameters
77  vout.general(m_vl, "Source for 4-spinor field - local:\n");
78  for (int mu = 0; mu < Ndim; ++mu) {
79  vout.general(m_vl, " source_position[%d] = %d\n",
80  mu, source_position[mu]);
81  }
82 
83  //- range check
84  int err = 0;
85  for (int mu = 0; mu < Ndim; ++mu) {
86  // NB. Lsize[mu] > abs(source_position[mu])
87  err += ParameterCheck::non_negative(Lsize[mu] - abs(source_position[mu]));
88  }
89 
90  if (err) {
91  vout.crucial(m_vl, "Source_4spinor_Local: parameter range check failed.\n");
92  abort();
93  }
94 
95  assert(source_position.size() == Ndim);
96 
97  //- store values
98  m_source_position.resize(Ndim);
99  for (int mu = 0; mu < Ndim; ++mu) {
100  m_source_position[mu] = (source_position[mu] + Lsize[mu]) % Lsize[mu];
101  }
102 }
103 
104 
105 //====================================================================
106 void Source_4spinor_Local::set(Field_F& src, int ic, int id)
107 {
108  int Nvol = CommonParameters::Nvol();
109  int Ndim = CommonParameters::Ndim();
110 
111  valarray<int> Nsz(Ndim);
112  Nsz[0] = CommonParameters::Nx();
113  Nsz[1] = CommonParameters::Ny();
114  Nsz[2] = CommonParameters::Nz();
115  Nsz[3] = CommonParameters::Nt();
116 
117  assert(ic < CommonParameters::Nc());
118  assert(id < CommonParameters::Nd());
119  assert(src.nvol() == Nvol);
120  assert(src.nex() == 1);
121 
122  src = 0.0;
123 
124  valarray<int> site_src(4);
125  valarray<int> node_src(4);
126  for (int mu = 0; mu < Ndim; ++mu) {
127  site_src[mu] = m_source_position[mu] % Nsz[mu];
128  node_src[mu] = m_source_position[mu] / Nsz[mu];
129  }
130 
131  if (node_src[0] == Communicator::ipe(0)) {
132  if (node_src[1] == Communicator::ipe(1)) {
133  if (node_src[2] == Communicator::ipe(2)) {
134  if (node_src[3] == Communicator::ipe(3)) {
135  int site = m_index.site(site_src[0], site_src[1],
136  site_src[2], site_src[3]);
137  src.set_ri(ic, id, site, 0, 1.0, 0.0);
138  }
139  }
140  }
141  }
142 }
143 
144 
145 //====================================================================
146 //============================================================END=====