22      struct StructIndexMapping;
 
   29      struct StructIndexMapping<1, 1, 0>
 
   31        static Index compute(Index i, Index j, 
const Index [])
 
   42      struct StructIndexMapping<2, 1, 0>
 
   44        static Index compute(Index i, Index j, 
const Index num_slices[])
 
   47          if(i < num_slices[0] * (num_slices[1] + 1))
 
   49            return i + j + i / num_slices[0];
 
   53            return ((i - num_slices[0] * (num_slices[1] + 1)) / num_slices[1])
 
   54                   + ((i - num_slices[0] * (num_slices[1] + 1)) % num_slices[1])
 
   55                   * (num_slices[0] + 1) + j * (num_slices[0] + 1);
 
   62      struct StructIndexMapping<2, 2, 0>
 
   64        static Index compute(Index i, Index j, 
const Index num_slices[])
 
   67          return ((i / num_slices[0]) + ((j >> 1) & 0x1)) * (num_slices[0] + 1) + (i % num_slices[0]) + (j & 0x1);
 
   73      struct StructIndexMapping<2, 2, 1>
 
   75        static Index compute(Index i, Index j, 
const Index num_slices[])
 
   78          return ((3 - j) / 2) * (i + j * num_slices[0]) + (j / 2) * (num_slices[0] * (num_slices[1] + 1)
 
   79                  + ((i % num_slices[0]) + (j / 3)) * num_slices[1] + (i / num_slices[0]));
 
   88      struct StructIndexMapping<3, 1, 0>
 
   90        static Index compute(Index i, Index j, 
const Index num_slices[])
 
   98          if( i >= num_slices[1] * (num_slices[0] + 1) * (num_slices[2] + 1) +
 
   99            (num_slices[2] + 1) * (num_slices[1] + 1) * num_slices[0])
 
  101            pos = i - num_slices[1] * (num_slices[0] + 1) * (num_slices[2] + 1) - (num_slices[2] + 1)
 
  102                  * (num_slices[1] + 1) * num_slices[0];
 
  103            return (pos / num_slices[2]) + (pos % num_slices[2] + j) * (num_slices[0] + 1)*(num_slices[1] + 1);
 
  106          else if( i >= (num_slices[2] + 1) * (num_slices[1] + 1) * num_slices[0])
 
  108            pos = i - (num_slices[2] + 1) * (num_slices[1] + 1) * num_slices[0];
 
  109            Index x = (pos / num_slices[1]) % (num_slices[0] + 1);
 
  110            Index y = pos % num_slices[1];
 
  111            Index z = (pos / num_slices[1]) / (num_slices[0] + 1);
 
  112            return z * (num_slices[0] + 1) * (num_slices[1] + 1) + (y + j) * (num_slices[0] + 1) + x;
 
  117          return i + j + i / num_slices[0];
 
  124      struct StructIndexMapping<3, 2, 0>
 
  126        static Index compute(Index i, Index j, 
const Index num_slices[])
 
  130          if( i < num_slices[0] * num_slices[1] * (num_slices[2] + 1))
 
  132            return i + (i / num_slices[0]) + (i / (num_slices[0] * num_slices[1])) * (num_slices[0] + 1)
 
  133                   + (j % 2) + (j / 2) * (num_slices[0] + 1);
 
  135          else if( i >= num_slices[0] * num_slices[1] * (num_slices[2] + 1)
 
  136                   && i < num_slices[0] * (num_slices[1] * (num_slices[2] + 1) + num_slices[2] * (num_slices[1] + 1)))
 
  138            pos = i - num_slices[0] * num_slices[1] * (num_slices[2] + 1);
 
  139            return pos % num_slices[0] + (pos / (num_slices[0] * num_slices[2])) * (num_slices[0] + 1)
 
  140                   + (pos % (num_slices[0] * num_slices[2])) / num_slices[0]
 
  141                   *(num_slices[0] + 1)*(num_slices[1] + 1) + (j % 2) + (j / 2) * (num_slices[0] + 1) * (num_slices[1] + 1);
 
  145            pos = i - num_slices[0] * (num_slices[1] * (num_slices[2] + 1) + num_slices[2] * (num_slices[1] + 1));
 
  146            return pos / (num_slices[1] * num_slices[2]) + (pos % num_slices[1]) * (num_slices[0] + 1) + ((pos / num_slices[1]) % num_slices[2])
 
  147                   * (num_slices[0] + 1) * (num_slices[1] + 1) + (j % 2) * (num_slices[0] + 1) + (j / 2)
 
  148                   * (num_slices[0] + 1) * (num_slices[1] + 1);
 
  155      struct StructIndexMapping<3, 3, 0>
 
  157        static Index compute(Index i, Index j, 
const Index num_slices[])
 
  160          return (i / (num_slices[0] * num_slices[1]) + j / 4) * ((num_slices[0] + 1)*(num_slices[1] + 1))
 
  161                 + ((i % (num_slices[0] * num_slices[1])) / num_slices[0] + (j % 4) / 2) * (num_slices[0] + 1)
 
  162                 + (i % (num_slices[0] * num_slices[1])) % num_slices[0] + j % 2;
 
  168      struct StructIndexMapping<3, 2, 1>
 
  170        static Index compute(Index i, Index j, 
const Index num_slices[])
 
  173          Index pos, node_0, node_0_x, node_0_y, node_0_z;
 
  176          if( i < num_slices[0] * num_slices[1] * (num_slices[2] + 1))
 
  179            node_0 = i + (i / num_slices[0]) + (i / (num_slices[0] * num_slices[1])) * (num_slices[0] + 1);
 
  183              return node_0 - (node_0 / (num_slices[0] + 1)) + (j % 2) * num_slices[0];
 
  188              node_0_x = node_0 % (num_slices[0] + 1);
 
  189              node_0_y = (node_0 / (num_slices[0] + 1)) % (num_slices[1] + 1);
 
  190              node_0_z = node_0 / ((num_slices[0] + 1) * (num_slices[1] + 1));
 
  191              return num_slices[0] * (num_slices[1] + 1) * (num_slices[2] + 1) + node_0_y + (node_0_x + j - 2)
 
  192                     * num_slices[1] + node_0_z * (num_slices[0] + 1) * num_slices[1];
 
  196          else if( i >= num_slices[0] * num_slices[1] * (num_slices[2]+1)
 
  197                   && i < num_slices[0] * (num_slices[1] * (num_slices[2] + 1) + num_slices[2] * (num_slices[1] + 1)))
 
  200            pos = i - num_slices[0] * num_slices[1] * (num_slices[2] + 1);
 
  201            node_0 = pos % num_slices[0] + (pos / (num_slices[0] * num_slices[2])) * (num_slices[0] + 1)
 
  202                     + (pos % (num_slices[0] * num_slices[2])) / num_slices[0]
 
  203                     * (num_slices[0] + 1) * (num_slices[1] + 1);
 
  207              return node_0 - (node_0 / (num_slices[0] + 1)) + (j % 2) * num_slices[0] * (num_slices[1] + 1);
 
  212              node_0_x = node_0 % (num_slices[0] + 1);
 
  213              node_0_y = (node_0 / (num_slices[0] + 1)) % (num_slices[1] + 1);
 
  214              node_0_z = node_0 / ((num_slices[0] + 1) * (num_slices[1] + 1));
 
  215              return num_slices[0] * (num_slices[1] + 1) * (num_slices[2] + 1)
 
  216                     + num_slices[1] * (num_slices[0] + 1) * (num_slices[2] + 1)
 
  217                     + node_0_z + (node_0_x + j - 2) * num_slices[2] + node_0_y * (num_slices[0] + 1) * num_slices[2];
 
  224            pos = i - num_slices[0] * (num_slices[1] * (num_slices[2] + 1) + num_slices[2] * (num_slices[1] + 1));
 
  225            node_0 = pos / (num_slices[1] * num_slices[2]) + (pos % num_slices[1]) * (num_slices[0] + 1)
 
  226                     + ((pos / num_slices[1]) % num_slices[2]) * (num_slices[0] + 1) * (num_slices[1] + 1);
 
  229            node_0_x = node_0 % (num_slices[0] + 1);
 
  230            node_0_y = (node_0 / (num_slices[0] + 1)) % (num_slices[1] + 1);
 
  231            node_0_z = node_0 / ((num_slices[0] + 1) * (num_slices[1] + 1));
 
  235              return num_slices[0] * (num_slices[1] + 1) * (num_slices[2] + 1) + node_0_y + node_0_x * num_slices[1]
 
  236                     + (node_0_z + j) * (num_slices[0] + 1) * num_slices[1];
 
  240              return num_slices[0] * (num_slices[1] + 1) * (num_slices[2] + 1) + num_slices[1] * (num_slices[0] + 1) * (num_slices[2] + 1)
 
  241                     + node_0_z + node_0_x * num_slices[2] + (node_0_y + j - 2) * (num_slices[0] + 1) * num_slices[2];
 
  251      struct StructIndexMapping<3, 3, 1>
 
  253        static Index compute(Index i, Index j, 
const Index num_slices[])
 
  256          Index x = i % (num_slices[0] * num_slices[1]) % num_slices[0];
 
  257          Index y = i % (num_slices[0] * num_slices[1]) / num_slices[0];
 
  258          Index z = i / (num_slices[0] * num_slices[1]);
 
  261            return (z + j / 2) * num_slices[0] * (num_slices[1] + 1) + (y + j % 2) * num_slices[0] + x;
 
  265            return (num_slices[2] + 1) * (num_slices[1] + 1) * num_slices[0] + (z + j / 6) * num_slices[1] * (num_slices[0]+1)
 
  266                    + (x + j % 2) * num_slices[1] + y;
 
  270            return (num_slices[2] + 1) * (num_slices[1] + 1) * num_slices[0] + num_slices[1] * (num_slices[0] + 1)
 
  271                   * (num_slices[2] + 1) + (y + j / 10) * num_slices[2] * (num_slices[0] + 1) + (x + j % 2) * num_slices[2] + z;
 
  278      struct StructIndexMapping<3, 3, 2>
 
  280        static Index compute(Index i, Index j, 
const Index num_slices[])
 
  285            return i + j*num_slices[0] * num_slices[1];
 
  290            Index x = i % (num_slices[0] * num_slices[1]) % num_slices[0];
 
  291            Index y = i % (num_slices[0] * num_slices[1]) / num_slices[0];
 
  292            Index z = i / (num_slices[0] * num_slices[1]);
 
  293            return num_slices[0] * num_slices[1] * (num_slices[2] + 1)
 
  294                   + x + z * num_slices[0] + (y + j - 2) * num_slices[0] * num_slices[2];
 
  299            Index x = i % (num_slices[0] * num_slices[1]) % num_slices[0];
 
  300            Index y = i % (num_slices[0] * num_slices[1]) / num_slices[0];
 
  301            Index z = i / (num_slices[0] * num_slices[1]);
 
  302            return num_slices[0] * (num_slices[1] * (num_slices[2]+1) + num_slices[2] * (num_slices[1]+1))
 
  303                   + y + z * num_slices[1] + (x + j - 4) * num_slices[1] * num_slices[2];
 
std::uint64_t Index
Index data type.