Bridge++  Version 1.5.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
index_eo.h
Go to the documentation of this file.
1 
14 #ifndef INDEX_EO_INCLUDED
15 #define INDEX_EO_INCLUDED
16 
17 #include "field.h"
18 #include "index_lex.h"
19 
21 
22 #include "IO/bridgeIO.h"
23 using Bridge::vout;
24 
26 
40 class Index_eo {
41  private:
43  int m_Nx2, m_Nvol2;
44  std::valarray<int> m_yzt_eo;
45  std::valarray<int> m_Site_up;
46  std::valarray<int> m_Site_dn;
48  int m_node_eo; // {0, 1} -- local origin is on even/odd side
49 
51  public:
53  m_Nx(CommonParameters::Nx()),
54  m_Ny(CommonParameters::Ny()),
55  m_Nz(CommonParameters::Nz()),
56  m_Nt(CommonParameters::Nt()),
57  m_Nvol(CommonParameters::Nvol()),
58  m_Nx2(CommonParameters::Nx() / 2),
59  m_Nvol2(CommonParameters::Nvol() / 2),
60  m_vl(CommonParameters::Vlevel())
61  {
62  if ((m_Nx % 2) == 1) {
63  vout.crucial(m_vl, "Error at Index_eo: Nx = %d, which must be even.\n", m_Nx);
64  exit(EXIT_FAILURE);
65  }
66 
67  //- grid coordinate
68  const int ipe_x = Communicator::ipe(0);
69  const int ipe_y = Communicator::ipe(1);
70  const int ipe_z = Communicator::ipe(2);
71  const int ipe_t = Communicator::ipe(3);
72 
73  //- node even/odd
74  m_node_eo = (ipe_x * m_Nx + ipe_y * m_Ny + ipe_z * m_Nz + ipe_t * m_Nt) % 2;
75 
76  m_yzt_eo.resize(m_Ny * m_Nz * m_Nt);
77  m_Site_up.resize(m_Nx2 * m_Ny * m_Nz * m_Nt * 2);
78  m_Site_dn.resize(m_Nx2 * m_Ny * m_Nz * m_Nt * 2);
79 
80  for (int t = 0; t < m_Nt; ++t) {
81  for (int z = 0; z < m_Nz; ++z) {
82  for (int y = 0; y < m_Ny; ++y) {
83  int t_global = t + ipe_t * m_Nt;
84  int z_global = z + ipe_z * m_Nz;
85  int y_global = y + ipe_y * m_Ny;
86 
87  m_yzt_eo[y + m_Ny * (z + m_Nz * t)] = (y_global + z_global + t_global) % 2;
88  }
89  }
90  }
91 
92  for (int t = 0; t < m_Nt; ++t) {
93  for (int z = 0; z < m_Nz; ++z) {
94  for (int y = 0; y < m_Ny; ++y) {
95  int yzt = y + m_Ny * (z + m_Nz * t);
96 
97  for (int x2 = 0; x2 < m_Nx2; ++x2) {
98  int s = x2 + m_Nx2 * (y + m_Ny * (z + m_Nz * t));
99  m_Site_up[s] = ((x2 + m_yzt_eo[yzt]) % m_Nx2) + m_Nx2 * (y + m_Ny * (z + m_Nz * t));
100  m_Site_up[s + m_Nvol2] = ((x2 + 1 - m_yzt_eo[yzt]) % m_Nx2) + m_Nx2 * (y + m_Ny * (z + m_Nz * t));
101  m_Site_dn[s] = ((x2 - 1 + m_yzt_eo[yzt] + m_Nx2) % m_Nx2) + m_Nx2 * (y + m_Ny * (z + m_Nz * t));
102  m_Site_dn[s + m_Nvol2] = ((x2 - m_yzt_eo[yzt] + m_Nx2) % m_Nx2) + m_Nx2 * (y + m_Ny * (z + m_Nz * t));
103  }
104  }
105  }
106  }
107  }
108 
109  int leo(const int y, const int z, const int t) const
110  {
111  return m_yzt_eo[y + m_Ny * (z + m_Nz * t)];
112  }
113 
114  int site(const int x2, const int y, const int z, const int t,
115  const int ieo) const
116  {
117  return x2 + m_Nx2 * (y + m_Ny * (z + m_Nz * t)) + m_Nvol2 * ieo;
118  }
119 
120  int site(const int is, const int ieo) const
121  {
122  return is + m_Nvol2 * ieo;
123  }
124 
125  int site_up(const int x2, const int y, const int z, const int t,
126  const int ieo) const
127  {
128  int s = x2 + m_Nx2 * (y + m_Ny * (z + m_Nz * t)) + m_Nvol2 * ieo;
129 
130  return m_Site_up[s] + m_Nvol2 * (1 - ieo);
131  }
132 
133  int site_xup(const int x2, const int y, const int z, const int t,
134  const int ieo) const
135  {
136  int s = x2 + m_Nx2 * (y + m_Ny * (z + m_Nz * t)) + m_Nvol2 * ieo;
137 
138  return m_Site_up[s] + m_Nvol2 * (1 - ieo);
139  }
140 
141  int site_dn(const int x2, const int y, const int z, const int t,
142  const int ieo) const
143  {
144  int s = x2 + m_Nx2 * (y + m_Ny * (z + m_Nz * t)) + m_Nvol2 * ieo;
145 
146  return m_Site_dn[s] + m_Nvol2 * (1 - ieo);
147  }
148 
149  int site_xdn(const int x2, const int y, const int z, const int t,
150  const int ieo) const
151  {
152  int s = x2 + m_Nx2 * (y + m_Ny * (z + m_Nz * t)) + m_Nvol2 * ieo;
153 
154  return m_Site_dn[s] + m_Nvol2 * (1 - ieo);
155  }
156 
157  int siteh(const int x2, const int y, const int z, const int t)
158  const
159  {
160  return x2 + m_Nx2 * (y + m_Ny * (z + m_Nz * t));
161  }
162 
163  int siteh_up(const int x2, const int y, const int z, const int t,
164  const int ieo) const
165  {
166  int s = x2 + m_Nx2 * (y + m_Ny * (z + m_Nz * t)) + m_Nvol2 * ieo;
167 
168  return m_Site_up[s];
169  }
170 
171  int siteh_xup(const int x2, const int y, const int z, const int t,
172  const int ieo) const
173  {
174  int s = x2 + m_Nx2 * (y + m_Ny * (z + m_Nz * t)) + m_Nvol2 * ieo;
175 
176  return m_Site_up[s];
177  }
178 
179  int siteh_dn(const int x2, const int y, const int z, const int t,
180  const int ieo) const
181  {
182  int s = x2 + m_Nx2 * (y + m_Ny * (z + m_Nz * t)) + m_Nvol2 * ieo;
183 
184  return m_Site_dn[s];
185  }
186 
187  int siteh_xdn(const int x2, const int y, const int z, const int t,
188  const int ieo) const
189  {
190  int s = x2 + m_Nx2 * (y + m_Ny * (z + m_Nz * t)) + m_Nvol2 * ieo;
191 
192  return m_Site_dn[s];
193  }
194 
195  void convertField(Field& eo, const Field& lex);
196  void convertField(Field& eo, const Field& lex, const int ieo);
197 
198  void reverseField(Field& lex, const Field& eo);
199  void reverseField(Field& lex, const Field& eo, const int ieo);
200 
201  void splitField(Field& e, Field& o, const Field& eo);
202 
203  void mergeField(Field& eo, const Field& e, const Field& o);
204 };
205 #endif
Index_eo()
Definition: index_eo.h:52
BridgeIO vout
Definition: bridgeIO.cpp:503
int m_Ny
Definition: index_eo.h:42
int site_xup(const int x2, const int y, const int z, const int t, const int ieo) const
Definition: index_eo.h:133
int siteh(const int x2, const int y, const int z, const int t) const
Definition: index_eo.h:157
int site(const int is, const int ieo) const
Definition: index_eo.h:120
int m_Nx
Definition: index_eo.h:42
Container of Field-type object.
Definition: field.h:45
int site(const int x2, const int y, const int z, const int t, const int ieo) const
Definition: index_eo.h:114
int site_up(const int x2, const int y, const int z, const int t, const int ieo) const
Definition: index_eo.h:125
static int ipe(const int dir)
logical coordinate of current proc.
Even-odd site index.
Definition: index_eo.h:40
std::valarray< int > m_Site_dn
Definition: index_eo.h:46
void convertField(Field &eo, const Field &lex)
Definition: index_eo.cpp:20
int leo(const int y, const int z, const int t) const
Definition: index_eo.h:109
void mergeField(Field &eo, const Field &e, const Field &o)
Definition: index_eo.cpp:171
int siteh_up(const int x2, const int y, const int z, const int t, const int ieo) const
Definition: index_eo.h:163
int siteh_xup(const int x2, const int y, const int z, const int t, const int ieo) const
Definition: index_eo.h:171
int m_Nt
Definition: index_eo.h:42
int m_node_eo
Definition: index_eo.h:48
int siteh_xdn(const int x2, const int y, const int z, const int t, const int ieo) const
Definition: index_eo.h:187
int site_xdn(const int x2, const int y, const int z, const int t, const int ieo) const
Definition: index_eo.h:149
Common parameter class: provides parameters as singleton.
Lexical site index.
Definition: index_lex.h:34
Bridge::VerboseLevel m_vl
Definition: index_eo.h:50
int site_dn(const int x2, const int y, const int z, const int t, const int ieo) const
Definition: index_eo.h:141
void crucial(const char *format,...)
Definition: bridgeIO.cpp:178
std::valarray< int > m_yzt_eo
Definition: index_eo.h:44
int m_Nvol
Definition: index_eo.h:42
Index_lex m_index_lex
Definition: index_eo.h:47
VerboseLevel
Definition: bridgeIO.h:42
int siteh_dn(const int x2, const int y, const int z, const int t, const int ieo) const
Definition: index_eo.h:179
void reverseField(Field &lex, const Field &eo)
Definition: index_eo.cpp:112
void splitField(Field &e, Field &o, const Field &eo)
Definition: index_eo.cpp:143
int m_Nvol2
Definition: index_eo.h:43
int m_Nz
Definition: index_eo.h:42
std::valarray< int > m_Site_up
Definition: index_eo.h:45
int m_Nx2
Definition: index_eo.h:43