7#include "plumbing/lattice.h"
13const static int prime[NPRIMES] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
19void lattice_struct::setup_layout() {
20 int nfactors[NPRIMES];
23 hila::print_dashed_line();
43 for (
int n = 0; n < NPRIMES; n++) {
45 while (i % prime[n] == 0) {
51 hila::out0 <<
"Cannot factorize " << nn <<
" nodes with primes up to " << prime[NPRIMES - 1]
64 int64_t cosize = l_volume / l_size[d];
65 int64_t n = l_size[d];
66 while ((n * cosize) % nn != 0)
69 ghosts[d] = (n - l_size[d]) * cosize;
74 bool secondtime =
false;
78 foralldir(j)
if (ghosts[mdir] > ghosts[j]) mdir = j;
84 nodesiz[i] = (i == mdir) ? nsize[i] : l_size[i];
85 nodes.n_divisions[i] = 1;
88 for (
int n = NPRIMES - 1; n >= 0; n--)
89 for (
int i = 0; i < nfactors[n]; i++) {
96 for (dir = 0; dir < NDIM; dir++)
97 if (nodesiz[dir] > msize && nodesiz[dir] % prime[n] == 0)
109 for (dir = NDIM - 1; dir >= 0; dir--)
110 if (nodesiz[dir] == msize && nodes.n_divisions[dir] > 1 &&
111 nodesiz[dir] % prime[n] == 0)
116 for (dir = NDIM - 1; dir >= 0; dir--)
117 if (nodesiz[dir] == msize && nodesiz[dir] % prime[n] == 0)
122 hila::out0 <<
"CANNOT HAPPEN! in setup_layout_generic.c\n";
127 nodesiz[dir] /= prime[n];
128 nodes.n_divisions[dir] *= prime[n];
133 foralldir(dir)
if (nodesiz[dir] < 2) fail =
true;
134 if (fail && !secondtime) {
139 hila::out0 <<
"Could not successfully lay out the lattice with "
144 }
while (secondtime);
151 int ghost_slices = nsize[mdir] - l_size[mdir];
152 if (ghost_slices > 0) {
153 hila::out0 <<
"\nUsing uneven node division to direction " << mdir <<
":\n";
154 hila::out0 <<
"Lengths: " << nodes.n_divisions[mdir] - ghost_slices <<
" * ("
155 << nodesiz[mdir] <<
" sites) + " << ghost_slices <<
" * (" << nodesiz[mdir] - 1
158 for (
int i = 0; i < nodes.n_divisions[mdir]; i++) {
161 hila::out0 << nodes.divisors[mdir][i + 1] - nodes.divisors[mdir][i];
163 hila::out0 <<
"\nFilling efficiency: " << (100.0 * l_size[mdir]) / nsize[mdir] <<
"%\n";
165 if (ghost_slices > nodes.n_divisions[mdir] / 2)
166 hila::out0 <<
"NOTE: number of smaller nodes > large nodes \n";
175 if (dir == mdir && ghost_slices > 0)
176 hila::out0 <<
'(' << nodesiz[dir] - 1 <<
'-' << nodesiz[dir] <<
')';
182 if (ghost_slices > 0) {
183 int ns2 = ns * (nodesiz[mdir] - 1) / nodesiz[mdir];
184 hila::out0 <<
" = " << ns2 <<
" - " << ns <<
'\n';
207 hila::print_dashed_line();
void setup_node_divisors()
#define foralldir(d)
Macro to loop over (all) Direction(s)
This file defines all includes for HILA.
int number_of_nodes()
how many nodes there are
std::ostream out0
This writes output only from main process (node 0)
void finishrun()
Normal, controlled exit - all nodes must call this. Prints timing information and information about c...