grid_dist_id_iterator.hpp 7.24 KB
Newer Older
incardon's avatar
incardon committed
1
/*
incardon's avatar
incardon committed
2
 * grid_dist_id_iterator_sub.hpp
incardon's avatar
incardon committed
3 4 5 6 7 8 9 10
 *
 *  Created on: Feb 4, 2015
 *      Author: Pietro Incardona
 */

#ifndef GRID_DIST_ID_ITERATOR_HPP_
#define GRID_DIST_ID_ITERATOR_HPP_

incardon's avatar
incardon committed
11 12 13
#define FREE 1
#define FIXED 2

incardon's avatar
incardon committed
14
#include "Grid/grid_dist_key.hpp"
incardon's avatar
incardon committed
15
#include "VCluster/VCluster.hpp"
incardon's avatar
Working  
incardon committed
16
#include "util/GBoxes.hpp"
incardon's avatar
incardon committed
17 18


incardon's avatar
incardon committed
19 20
/*! \brief Distributed grid iterator
 *
incardon's avatar
incardon committed
21
 * Iterator across the local elements of the distributed grid
incardon's avatar
incardon committed
22
 *
incardon's avatar
incardon committed
23 24 25 26
 * \tparam dim dimensionality of the grid
 * \tparam device_grid type of basic grid
 * \tparam impl implementation
 *
incardon's avatar
incardon committed
27
 */
incardon's avatar
incardon committed
28 29 30 31 32 33
template<unsigned int dim, typename device_grid, int impl >
class grid_dist_iterator
{

};

incardon's avatar
incardon committed
34

incardon's avatar
incardon committed
35 36 37 38 39 40 41 42 43
/*! \brief Distributed grid iterator
 *
 * Iterator across the local elements of the distributed grid
 *
 * \tparam dim dimensionality of the grid
 * \tparam device_grid type of basic grid
 * \tparam impl implementation
 *
 */
incardon's avatar
incardon committed
44
template<unsigned int dim, typename device_grid>
incardon's avatar
incardon committed
45
class grid_dist_iterator<dim,device_grid,FREE>
incardon's avatar
incardon committed
46 47 48 49 50
{
	//! grid list counter
	size_t g_c;

	//! List of the grids we are going to iterate
51
	const openfpm::vector<device_grid> & gList;
incardon's avatar
incardon committed
52

incardon's avatar
incardon committed
53
	//! Extension of each grid: domain and ghost + domain
54
	const openfpm::vector<GBoxes<device_grid::dims>> & gdb_ext;
incardon's avatar
incardon committed
55

incardon's avatar
incardon committed
56
	//! Actual iterator
incardon's avatar
incardon committed
57 58
	grid_key_dx_iterator_sub<dim> a_it;

Pietro Incardona's avatar
Pietro Incardona committed
59 60
	//! stop point (is the grid size)
	grid_key_dx<dim> stop;
incardon's avatar
incardon committed
61

incardon's avatar
incardon committed
62 63 64 65 66 67
	/*! \brief from g_c increment g_c until you find a valid grid
	 *
	 */
	void selectValidGrid()
	{
		// When the grid has size 0 potentially all the other informations are garbage
68
		while (g_c < gList.size() && (gList.get(g_c).size() == 0 || gdb_ext.get(g_c).Dbox.isValid() == false ) ) g_c++;
incardon's avatar
incardon committed
69 70 71 72

		// get the next grid iterator
		if (g_c < gList.size())
		{
73
			a_it.reinitialize(gList.get(g_c).getIterator(gdb_ext.get(g_c).Dbox.getKP1(),gdb_ext.get(g_c).Dbox.getKP2()));
incardon's avatar
incardon committed
74 75 76
		}
	}

incardon's avatar
incardon committed
77 78
	public:

incardon's avatar
incardon committed
79
	/*! \brief Constructor of the distributed grid iterator
incardon's avatar
incardon committed
80 81
	 *
	 * \param gk std::vector of the local grid
Pietro Incardona's avatar
Pietro Incardona committed
82 83
	 * \param gdb_ext set of local subdomains
	 * \param stop end point
incardon's avatar
incardon committed
84 85
	 *
	 */
Pietro Incardona's avatar
Pietro Incardona committed
86
	grid_dist_iterator(const openfpm::vector<device_grid> & gk, const openfpm::vector<GBoxes<device_grid::dims>> & gdb_ext, const grid_key_dx<dim> & stop)
Pietro Incardona's avatar
Pietro Incardona committed
87
	:g_c(0),gList(gk),gdb_ext(gdb_ext),stop(stop)
incardon's avatar
incardon committed
88
	{
incardon's avatar
incardon committed
89
		// Initialize the current iterator
incardon's avatar
incardon committed
90
		// with the first grid
incardon's avatar
incardon committed
91
		selectValidGrid();
incardon's avatar
incardon committed
92 93 94 95
	}

	// Destructor
	~grid_dist_iterator()
incardon's avatar
incardon committed
96 97
	{
	}
incardon's avatar
incardon committed
98

incardon's avatar
incardon committed
99
	/*! \brief Get the next element
incardon's avatar
incardon committed
100
	 *
incardon's avatar
incardon committed
101
	 * \return the next grid_key
incardon's avatar
incardon committed
102 103
	 *
	 */
incardon's avatar
incardon committed
104

incardon's avatar
incardon committed
105
	inline grid_dist_iterator<dim,device_grid,FREE> operator++()
incardon's avatar
incardon committed
106
	{
incardon's avatar
incardon committed
107 108 109 110 111 112 113 114 115 116 117
		++a_it;

		// check if a_it is at the end

		if (a_it.isNext() == true)
			return *this;
		else
		{
			// switch to the new grid
			g_c++;

incardon's avatar
incardon committed
118
			selectValidGrid();
incardon's avatar
incardon committed
119
		}
incardon's avatar
incardon committed
120 121

		return *this;
incardon's avatar
incardon committed
122 123 124 125 126 127 128
	}

	/*! \brief Check if there is the next element
	 *
	 * \return true if there is the next, false otherwise
	 *
	 */
incardon's avatar
incardon committed
129
	inline bool isNext()
incardon's avatar
incardon committed
130 131 132 133 134 135 136 137 138 139 140 141 142 143
	{
		// If there are no other grid stop

		if (g_c >= gList.size())
			return false;

		return true;
	}

	/*! \brief Get the actual key
	 *
	 * \return the actual key
	 *
	 */
incardon's avatar
incardon committed
144
	inline grid_dist_key_dx<dim> get()
incardon's avatar
incardon committed
145 146 147
	{
		return grid_dist_key_dx<dim>(g_c,a_it.get());
	}
Pietro Incardona's avatar
Pietro Incardona committed
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175

	/*! \brief it return the stop point of the iterator
	 *
	 * The stop point of the iterator is just the grid size
	 *
	 * \return the stop point
	 *
	 */
	inline grid_key_dx<dim> getStop() const
	{
		return stop;
	}

	/*! \brief it return the start point of the iterator
	 *
	 * The start point of the iterator is the point with all coordinates zeros
	 *
	 * \return the start point
	 *
	 */
	inline grid_key_dx<dim> getStart() const
	{
		grid_key_dx<dim> start;

		start.zero();

		return start;
	}
Pietro Incardona's avatar
Pietro Incardona committed
176 177 178 179 180 181 182 183 184 185 186 187

	/*! \brief Get the boxes
	 *
	 *  Get the boxes that define the local grids
	 *
	 * \return Vector of local boxes
	 *
	 */
	inline const openfpm::vector<GBoxes<device_grid::dims>> & getGBoxes()
	{
		return gdb_ext;
	}
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208

	/*! \brief Convert a g_dist_key_dx into a global key
	 *
	 * \see grid_dist_key_dx
	 * \see grid_dist_iterator
	 *
	 * \return the global position in the grid
	 *
	 */
	inline grid_key_dx<dim> getGKey(const grid_dist_key_dx<dim> & k)
	{
		// Get the sub-domain id
		size_t sub_id = k.getSub();

		grid_key_dx<dim> k_glob = k.getKey();

		// shift
		k_glob = k_glob + gdb_ext.get(sub_id).origin;

		return k_glob;
	}
incardon's avatar
incardon committed
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
};


/*! \brief Distributed grid iterator
 *
 * Iterator across the local elements of the distributed grid
 *
 * \tparam dim dimensionality of the grid
 * \tparam device_grid type of basic grid
 * \tparam impl implementation
 *
 */
template<unsigned int dim, typename device_grid>
class grid_dist_iterator<dim,device_grid,FIXED>
{
	//! grid list counter
	size_t g_c;

	//! List of the grids we are going to iterate
228
	const openfpm::vector<device_grid> & gList;
incardon's avatar
incardon committed
229 230 231 232 233 234 235

	//! Extension of each grid: domain and ghost + domain
	const openfpm::vector<GBoxes<device_grid::dims>> & gdb_ext;

	//! Actual iterator
	grid_key_dx_iterator<dim> a_it;

236 237 238 239 240 241
	/*! \brief from g_c increment g_c until you find a valid grid
	 *
	 */
	void selectValidGrid()
	{
		// When the grid has size 0 potentially all the other informations are garbage
242
		while (g_c < gList.size() && (gList.get(g_c).size() == 0 || gdb_ext.get(g_c).Dbox.isValid() == false ) ) g_c++;
243 244 245 246

		// get the next grid iterator
		if (g_c < gList.size())
		{
247
			a_it.reinitialize(gList.get(g_c).getIterator(gdb_ext.get(g_c).Dbox.getKP1(),gdb_ext.get(g_c).Dbox.getKP2()));
248 249 250
		}
	}

incardon's avatar
incardon committed
251 252
	public:

incardon's avatar
incardon committed
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268
	/*! \brief Copy operator=
	*
	* \param tmp iterator to copy
	*
	*/
	grid_dist_iterator<dim,device_grid,FIXED> & operator=(const grid_dist_iterator<dim,device_grid,FIXED> & tmp)
	{
		g_c = tmp.g_c;
		gList = tmp.gList;
		gdb_ext = tmp.gdb_ext;
		a_it.reinitialize(tmp.a_it);

		return *this;
	}

	/*! \brief Constructor of the distributed grid iterator
incardon's avatar
incardon committed
269 270 271 272
	 *
	 * \param gk std::vector of the local grid
	 *
	 */
273
	grid_dist_iterator(const openfpm::vector<device_grid> & gk, const openfpm::vector<GBoxes<device_grid::dims>> & gdb_ext)
incardon's avatar
incardon committed
274 275 276 277
	:g_c(0),gList(gk),gdb_ext(gdb_ext)
	{
		// Initialize the current iterator
		// with the first grid
278
		selectValidGrid();
incardon's avatar
incardon committed
279 280 281 282 283 284
	}

	// Destructor
	~grid_dist_iterator()
	{
	}
incardon's avatar
incardon committed
285

incardon's avatar
incardon committed
286 287 288 289 290 291
	/*! \brief Get the next element
	 *
	 * \return the next grid_key
	 *
	 */

incardon's avatar
incardon committed
292
	grid_dist_iterator<dim,device_grid,FIXED> operator++()
incardon's avatar
incardon committed
293
	{
incardon's avatar
incardon committed
294
		++a_it;
incardon's avatar
incardon committed
295 296 297

		// check if a_it is at the end

incardon's avatar
incardon committed
298
		if (a_it.isNext() == true)
incardon's avatar
incardon committed
299 300 301 302 303
			return *this;
		else
		{
			// switch to the new grid
			g_c++;
304
			selectValidGrid();
incardon's avatar
incardon committed
305 306 307 308 309 310 311 312 313 314
		}

		return *this;
	}

	/*! \brief Check if there is the next element
	 *
	 * \return true if there is the next, false otherwise
	 *
	 */
incardon's avatar
incardon committed
315
	bool isNext()
incardon's avatar
incardon committed
316 317 318 319
	{
		// If there are no other grid stop

		if (g_c >= gList.size())
incardon's avatar
incardon committed
320 321 322
			return false;

		return true;
incardon's avatar
incardon committed
323 324 325 326 327 328 329 330 331
	}

	/*! \brief Get the actual key
	 *
	 * \return the actual key
	 *
	 */
	grid_dist_key_dx<dim> get()
	{
incardon's avatar
incardon committed
332
		return grid_dist_key_dx<dim>(g_c,a_it.get());
incardon's avatar
incardon committed
333
	}
Pietro Incardona's avatar
Pietro Incardona committed
334 335 336 337 338 339 340 341 342 343 344 345

	/*! \brief Get the boxes
	 *
	 *  Get the boxes that define the local grids
	 *
	 * \return Vector of local boxes
	 *
	 */
	inline const openfpm::vector<GBoxes<device_grid::dims>> & getGBoxes()
	{
		return gdb_ext;
	}
346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366

	/*! \brief Convert a g_dist_key_dx into a global key
	 *
	 * \see grid_dist_key_dx
	 * \see grid_dist_iterator
	 *
	 * \return the global position in the grid
	 *
	 */
	inline grid_key_dx<dim> getGKey(const grid_dist_key_dx<dim> & k)
	{
		// Get the sub-domain id
		size_t sub_id = k.getSub();

		grid_key_dx<dim> k_glob = k.getKey();

		// shift
		k_glob = k_glob + gdb_ext.get(sub_id).origin;

		return k_glob;
	}
incardon's avatar
incardon committed
367 368
};

incardon's avatar
incardon committed
369
#endif /* GRID_DIST_ID_ITERATOR_SUB_HPP_ */