Bridge++  Ver. 2.0.2
fieldIO.cpp
Go to the documentation of this file.
1 
14 #include "fieldIO.h"
15 
17 #include "bridgeIO.h"
18 using Bridge::vout;
19 
20 #include "Tools/file_utils.h"
21 
22 //#include <errno.h>
23 #ifdef HAVE_ENDIAN
24 #include <endian.h>
25 #endif
26 
27 const std::string FieldIO::class_name = "FieldIO";
28 
29 //====================================================================
30 void FieldIO::deliver(Field *vlocal, Field *vglobal)
31 {
32  const int nin = vlocal->nin();
33  const int nvol = vlocal->nvol();
34  const int nex = vlocal->nex();
35 
36  const int Lx = CommonParameters::Lx();
37  const int Ly = CommonParameters::Ly();
38  const int Lz = CommonParameters::Lz();
39  const int Lt = CommonParameters::Lt();
40  const long_t Lvol = CommonParameters::Lvol();
41 
42  const int Nx = CommonParameters::Nx();
43  const int Ny = CommonParameters::Ny();
44  const int Nz = CommonParameters::Nz();
45  const int Nt = CommonParameters::Nt();
46  const int Nvol = CommonParameters::Nvol();
47 
48  const int NPEx = CommonParameters::NPEx();
49  const int NPEy = CommonParameters::NPEy();
50  const int NPEz = CommonParameters::NPEz();
51  const int NPEt = CommonParameters::NPEt();
52  const int NPE = CommonParameters::NPE();
53 
55  if ((nin != vglobal->nin()) ||
56  (nex != vglobal->nex()) ||
57  (Lvol != vglobal->nvol())) {
58  vout.crucial(m_vl, "%s: %s: size mismatch.\n", class_name.c_str(), __func__);
59  exit(EXIT_FAILURE);
60  }
61  }
62 
63  Index_lex gindex(Lx, Ly, Lz, Lt);
64 
65  Field vtmp(nin, nvol, nex);
66 
68 
69  for (int iblock = 0; iblock < NPE; ++iblock) {
70  int ipx = (iblock) % NPEx;
71  int ipy = (iblock / NPEx) % NPEy;
72  int ipz = (iblock / NPEx / NPEy) % NPEz;
73  int ipt = (iblock / NPEx / NPEy / NPEz) % NPEt;
74 
76  for (int j = 0; j < nex; ++j) {
77  for (int t = 0; t < Nt; ++t) {
78  int t2 = t + Nt * ipt;
79 
80  for (int z = 0; z < Nz; ++z) {
81  int z2 = z + Nz * ipz;
82 
83  for (int y = 0; y < Ny; ++y) {
84  int y2 = y + Ny * ipy;
85 
86  for (int x = 0; x < Nx; ++x) {
87  int x2 = x + Nx * ipx;
88 
89  int lsite = idx.site(x, y, z, t);
90  int gsite = gindex.site(x2, y2, z2, t2);
91 
92  for (int i = 0; i < nin; ++i) {
93  vtmp.set(i, lsite, j, vglobal->cmp(i, gsite, j));
94  }
95  }
96  }
97  }
98  }
99  }
100  }
101 
102  const int size = nin * nvol * nex;
103 
104  int ipe;
105  int coord[4] = { ipx, ipy, ipz, ipt, };
106 
107  Communicator::grid_rank(&ipe, coord);
108 
109  //send_1to1(size, vlocal, &vtmp, ipe, 0, ipe);
110  Communicator::send_1to1(size, vlocal->ptr(0), vtmp.ptr(0),
111  ipe, 0, ipe);
112 
114  }
115 
117 }
118 
119 
120 //====================================================================
121 void FieldIO::gather(Field *vglobal, Field *vlocal)
122 {
123  const int nin = vlocal->nin();
124  const int nvol = vlocal->nvol();
125  const int nex = vlocal->nex();
126 
127  const int Lx = CommonParameters::Lx();
128  const int Ly = CommonParameters::Ly();
129  const int Lz = CommonParameters::Lz();
130  const int Lt = CommonParameters::Lt();
131  const long_t Lvol = CommonParameters::Lvol();
132 
133  const int Nx = CommonParameters::Nx();
134  const int Ny = CommonParameters::Ny();
135  const int Nz = CommonParameters::Nz();
136  const int Nt = CommonParameters::Nt();
137  const int Nvol = CommonParameters::Nvol();
138 
139  const int NPEx = CommonParameters::NPEx();
140  const int NPEy = CommonParameters::NPEy();
141  const int NPEz = CommonParameters::NPEz();
142  const int NPEt = CommonParameters::NPEt();
143  const int NPE = CommonParameters::NPE();
144 
145  if (Communicator::is_primary()) {
146  if ((nin != vglobal->nin()) ||
147  (nex != vglobal->nex()) ||
148  (Lvol != vglobal->nvol())) {
149  vout.crucial(m_vl, "%s: %s: size mismatch.\n", class_name.c_str(), __func__);
150  exit(EXIT_FAILURE);
151  }
152  }
153 
154  Index_lex gindex(Lx, Ly, Lz, Lt);
155 
156  Field vtmp(nin, nvol, nex);
157 
159 
160  for (int iblock = 0; iblock < NPE; ++iblock) {
161  int ipx = (iblock) % NPEx;
162  int ipy = (iblock / NPEx) % NPEy;
163  int ipz = (iblock / NPEx / NPEy) % NPEz;
164  int ipt = (iblock / NPEx / NPEy / NPEz) % NPEt;
165 
166  int ipe;
167  int coord[4] = { ipx, ipy, ipz, ipt, };
168 
169  Communicator::grid_rank(&ipe, coord);
170 
171  const int size = nin * nvol * nex;
172 
173  // send_1to1(size, &vtmp, vlocal, 0, ipe, ipe);
174  Communicator::send_1to1(size, vtmp.ptr(0), vlocal->ptr(0),
175  0, ipe, ipe);
176 
178 
179  if (Communicator::is_primary()) {
180  for (int j = 0; j < nex; ++j) {
181  for (int t = 0; t < Nt; ++t) {
182  int t2 = t + Nt * ipt;
183  for (int z = 0; z < Nz; ++z) {
184  int z2 = z + Nz * ipz;
185  for (int y = 0; y < Ny; ++y) {
186  int y2 = y + Ny * ipy;
187  for (int x = 0; x < Nx; ++x) {
188  int x2 = x + Nx * ipx;
189 
190  int site = idx.site(x, y, z, t);
191  int gsite = gindex.site(x2, y2, z2, t2);
192 
193  for (int i = 0; i < nin; ++i) {
194  vglobal->set(i, gsite, j, vtmp.cmp(i, site, j));
195  }
196  }
197  }
198  }
199  }
200  }
201  }
202  }
203 
205 }
206 
207 
208 //====================================================================
209 
211 {
212 #if defined(__BYTE_ORDER)
213  return __BYTE_ORDER == __BIG_ENDIAN;
214 #else
215  union
216  {
217  int l;
218  char c[sizeof(int)];
219  }
220  u;
221 
222  u.l = 1;
223 
224  return (u.c[sizeof(int) - 1] == 1) ? true : false;
225 #endif
226 }
227 
228 
229 //====================================================================
230 
231 void FieldIO::convert_endian(void *ptr, size_t size, size_t nmemb)
232 {
233  switch (size)
234  {
235  case 1: // bytes: do nothing.
236  break;
237 
238  case 2:
239  { // uint16_t (short)
240  uint16_t *p = (uint16_t *)ptr;
241 
242  for (unsigned int i = 0; i < nmemb; ++i) {
243  uint16_t v = p[i];
244  uint16_t w;
245 
246  w = v >> 8 & 0x00ff;
247  w |= v << 8 & 0xff00;
248 
249  p[i] = w;
250  }
251 
252  break;
253  }
254 
255  case 4:
256  { // uint32_t
257  uint32_t *p = (uint32_t *)ptr;
258 
259  for (unsigned int i = 0; i < nmemb; ++i) {
260  uint32_t v = p[i];
261  uint32_t w;
262 
263  w = v >> 24 & 0x000000ff;
264  w |= v >> 8 & 0x0000ff00;
265  w |= v << 8 & 0x00ff0000;
266  w |= v << 24 & 0xff000000;
267 
268  p[i] = w;
269  }
270 
271  break;
272  }
273 
274  case 8:
275  { // uint64_t
276  uint32_t *p = (uint32_t *)ptr;
277 
278  for (unsigned int i = 0; i < nmemb; ++i) {
279  uint32_t v1 = *p;
280  uint32_t v2 = *(p + 1);
281  uint32_t w1, w2;
282 
283  w1 = v1 >> 24 & 0x000000ff;
284  w1 |= v1 >> 8 & 0x0000ff00;
285  w1 |= v1 << 8 & 0x00ff0000;
286  w1 |= v1 << 24 & 0xff000000;
287 
288  w2 = v2 >> 24 & 0x000000ff;
289  w2 |= v2 >> 8 & 0x0000ff00;
290  w2 |= v2 << 8 & 0x00ff0000;
291  w2 |= v2 << 24 & 0xff000000;
292 
293  *p = w2;
294  *(p + 1) = w1;
295 
296  p += 2;
297  }
298 
299  break;
300  }
301 
302  default:
303 // return EINVAL;
304  vout.crucial("%s: %s: unsupported word size.\n", class_name.c_str(), __func__);
305  exit(EXIT_FAILURE);
306  }
307 
308 // return 0;
309 }
310 
311 
312 //====================================================================
313 //============================================================END=====
CommonParameters::Ny
static int Ny()
Definition: commonParameters.h:106
Communicator::sync
static int sync()
synchronize within small world.
Definition: communicator.cpp:140
CommonParameters::Nz
static int Nz()
Definition: commonParameters.h:107
bridgeIO.h
CommonParameters::Lvol
static long_t Lvol()
Definition: commonParameters.h:95
Index_lex
Lexical site index.
Definition: index_lex.h:34
Field::set
void set(const int jin, const int site, const int jex, double v)
Definition: field.h:175
Field::nex
int nex() const
Definition: field.h:128
CommonParameters::Ly
static int Ly()
Definition: commonParameters.h:92
CommonParameters::Nvol
static int Nvol()
Definition: commonParameters.h:109
FieldIO::is_bigendian
static bool is_bigendian()
Definition: fieldIO.cpp:210
FieldIO::m_vl
Bridge::VerboseLevel m_vl
Definition: fieldIO.h:64
FieldIO::gather
void gather(Field *vglobal, Field *vlocal)
gather data on parallel nodes to primary node.
Definition: fieldIO.cpp:121
Field::nin
int nin() const
Definition: field.h:126
FieldIO::class_name
static const std::string class_name
Definition: fieldIO.h:56
CommonParameters::Nx
static int Nx()
Definition: commonParameters.h:105
fieldIO.h
CommonParameters::Lt
static int Lt()
Definition: commonParameters.h:94
CommonParameters::Lx
static int Lx()
Definition: commonParameters.h:91
FieldIO::deliver
void deliver(Field *vlocal, Field *vglobal)
distribute data on primary node over parallel nodes.
Definition: fieldIO.cpp:30
CommonParameters::Lz
static int Lz()
Definition: commonParameters.h:93
FieldIO::convert_endian
static void convert_endian(void *buf, size_t size, size_t nmemb)
check if machine byte order is big-endian.
Definition: fieldIO.cpp:231
CommonParameters::Nt
static int Nt()
Definition: commonParameters.h:108
CommonParameters::NPEz
static int NPEz()
Definition: commonParameters.h:99
file_utils.h
Field::nvol
int nvol() const
Definition: field.h:127
CommonParameters::NPE
static int NPE()
Definition: commonParameters.h:101
Index_lex::site
int site(const int &x, const int &y, const int &z, const int &t) const
Definition: index_lex.h:55
Communicator::send_1to1
static int send_1to1(int count, dcomplex *recv_buf, dcomplex *send_buf, int p_to, int p_from, int tag)
send array of dcomplex from rank p_from to rank p_to. communication distinguished by tag.
Definition: communicator.cpp:238
FieldIO::idx
Index_lex idx
Definition: fieldIO.h:59
CommonParameters::NPEy
static int NPEy()
Definition: commonParameters.h:98
Field::cmp
double cmp(const int jin, const int site, const int jex) const
Definition: field.h:143
Field::ptr
const double * ptr(const int jin, const int site, const int jex) const
Definition: field.h:153
Communicator::is_primary
static bool is_primary()
check if the present node is primary in small communicator.
Definition: communicator.cpp:60
CommonParameters::NPEx
static int NPEx()
Definition: commonParameters.h:97
CommonParameters::NPEt
static int NPEt()
Definition: commonParameters.h:100
Bridge::BridgeIO::crucial
void crucial(const char *format,...)
Definition: bridgeIO.cpp:180
Field
Container of Field-type object.
Definition: field.h:46
communicator.h
Communicator::grid_rank
static int grid_rank(int *rank, const int *grid_coord)
find rank number from grid coordinate.
Definition: communicator.cpp:119
Bridge::vout
BridgeIO vout
Definition: bridgeIO.cpp:512