Grid 0.7.0
Cartesian_full.h
Go to the documentation of this file.
1/*************************************************************************************
2
3 Grid physics library, www.github.com/paboyle/Grid
4
5 Source file: ./lib/cartesian/Cartesian_full.h
6
7 Copyright (C) 2015
8
9Author: Peter Boyle <paboyle@ph.ed.ac.uk>
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2 of the License, or
14 (at your option) any later version.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License along
22 with this program; if not, write to the Free Software Foundation, Inc.,
23 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24
25 See the full license in the file "LICENSE" in the top level distribution directory
26*************************************************************************************/
27/* END LEGAL */
28#ifndef GRID_CARTESIAN_FULL_H
29#define GRID_CARTESIAN_FULL_H
30
32
34// Grid Support.
36
37class GridCartesian: public GridBase {
38
39public:
40 int dummy;
41 // Coordinate _checker_dim_mask;
42 virtual int CheckerBoardFromOindexTable (int Oindex) {
43 return 0;
44 }
45 virtual int CheckerBoardFromOindex (int Oindex)
46 {
47 return 0;
48 }
49 virtual int CheckerBoarded(int dim) {
50 return 0;
51 }
52 virtual int CheckerBoard(const Coordinate &site){
53 return 0;
54 }
55 virtual int CheckerBoardDestination(int cb,int shift,int dim){
56 return 0;
57 }
58 virtual int CheckerBoardShiftForCB(int source_cb,int dim,int shift, int ocb){
59 return shift;
60 }
61 virtual int CheckerBoardShift(int source_cb,int dim,int shift, int osite){
62 return shift;
63 }
64
65 // Constructor takes a parent grid and possibly subdivides communicator.
67 GridCartesian(const Coordinate &dimensions,
68 const Coordinate &simd_layout,
69 const Coordinate &processor_grid,
70 const GridCartesian &parent) : GridBase(processor_grid,parent,dummy)
71 {
72 Init(dimensions,simd_layout,processor_grid);
73 }
74 GridCartesian(const Coordinate &dimensions,
75 const Coordinate &simd_layout,
76 const Coordinate &processor_grid,
77 const GridCartesian &parent,int &split_rank) : GridBase(processor_grid,parent,split_rank)
78 {
79 Init(dimensions,simd_layout,processor_grid);
80 }
81
82 // Construct from comm world
84 GridCartesian(const Coordinate &dimensions,
85 const Coordinate &simd_layout,
86 const Coordinate &processor_grid) : GridBase(processor_grid)
87 {
88 Init(dimensions,simd_layout,processor_grid);
89 }
90
91 virtual ~GridCartesian() = default;
92
93 void Init(const Coordinate &dimensions,
94 const Coordinate &simd_layout,
95 const Coordinate &processor_grid)
96 {
98 // Grid information
100 _isCheckerBoarded = false;
101 _ndimension = dimensions.size();
102
109 _checker_dim = -1;
110 _lstart.resize(_ndimension);
111 _lend.resize(_ndimension);
112
113 _ostride.resize(_ndimension);
114 _istride.resize(_ndimension);
115
116 _fsites = _gsites = _osites = _isites = 1;
117
118 for (int d = 0; d < _ndimension; d++)
119 {
121
122 _fdimensions[d] = dimensions[d]; // Global dimensions
123 _gdimensions[d] = _fdimensions[d]; // Global dimensions
124 _simd_layout[d] = simd_layout[d];
127
128 // Use a reduced simd grid
129 _ldimensions[d] = _gdimensions[d] / _processors[d]; //local dimensions
130 //std::cout << _ldimensions[d] << " " << _gdimensions[d] << " " << _processors[d] << std::endl;
131 assert(_ldimensions[d] * _processors[d] == _gdimensions[d]);
132
133 _rdimensions[d] = _ldimensions[d] / _simd_layout[d]; //overdecomposition
134 assert(_rdimensions[d] * _simd_layout[d] == _ldimensions[d]);
135
137 _lend[d] = _processor_coor[d] * _ldimensions[d] + _ldimensions[d] - 1;
138 _osites *= _rdimensions[d];
139 _isites *= _simd_layout[d];
140
141 // Addressing support
142 if (d == 0)
143 {
144 _ostride[d] = 1;
145 _istride[d] = 1;
146 }
147 else
148 {
149 _ostride[d] = _ostride[d - 1] * _rdimensions[d - 1];
150 _istride[d] = _istride[d - 1] * _simd_layout[d - 1];
151 }
152 }
153
155 // subplane information
160
161 int block = 1;
162 int nblock = 1;
163 for (int d = 0; d < _ndimension; d++)
164 nblock *= _rdimensions[d];
165
166 for (int d = 0; d < _ndimension; d++)
167 {
168 nblock /= _rdimensions[d];
169 _slice_block[d] = block;
171 _slice_nblock[d] = nblock;
172 block = block * _rdimensions[d];
173 }
174 };
175
176};
177
179#endif
AcceleratorVector< int, MaxDims > Coordinate
Definition Coordinate.h:95
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
accelerator_inline size_type size(void) const
Definition Coordinate.h:52
Coordinate _lstart
Coordinate _slice_stride
Coordinate _fdimensions
Coordinate _lend
Coordinate _istride
Coordinate _slice_nblock
Coordinate _slice_block
Coordinate _checker_dim_mask
bool _isCheckerBoarded
int64_t _fsites
GridBase(const Coordinate &processor_grid)
Coordinate _rdimensions
Coordinate _simd_layout
Coordinate _ostride
Coordinate _ldimensions
Coordinate _gdimensions
int64_t _gsites
GridCartesian(const Coordinate &dimensions, const Coordinate &simd_layout, const Coordinate &processor_grid)
virtual int CheckerBoard(const Coordinate &site)
virtual int CheckerBoardShift(int source_cb, int dim, int shift, int osite)
virtual ~GridCartesian()=default
virtual int CheckerBoardFromOindexTable(int Oindex)
GridCartesian(const Coordinate &dimensions, const Coordinate &simd_layout, const Coordinate &processor_grid, const GridCartesian &parent)
virtual int CheckerBoarded(int dim)
virtual int CheckerBoardDestination(int cb, int shift, int dim)
virtual int CheckerBoardShiftForCB(int source_cb, int dim, int shift, int ocb)
virtual int CheckerBoardFromOindex(int Oindex)
GridCartesian(const Coordinate &dimensions, const Coordinate &simd_layout, const Coordinate &processor_grid, const GridCartesian &parent, int &split_rank)
void Init(const Coordinate &dimensions, const Coordinate &simd_layout, const Coordinate &processor_grid)