grid_dist_id_iterator.hpp 8.63 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
template<unsigned int dim, typename device_grid, int impl,typename stencil = no_stencil >
incardon's avatar
incardon committed
29 30 31 32 33
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 45
template<unsigned int dim, typename device_grid, typename stencil>
class grid_dist_iterator<dim,device_grid,FREE,stencil>
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
incardon's avatar
incardon committed
51
	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
	grid_key_dx_iterator_sub<dim,stencil> a_it;
incardon's avatar
incardon committed
58

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
incardon's avatar
incardon committed
68 69 70
		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
71 72 73
		// get the next grid iterator
		if (g_c < gList.size())
		{
74
			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
75 76 77
		}
	}

incardon's avatar
incardon committed
78 79
	public:

incardon's avatar
incardon committed
80
	/*! \brief Constructor of the distributed grid iterator
incardon's avatar
incardon committed
81 82
	 *
	 * \param gk std::vector of the local grid
Pietro Incardona's avatar
Pietro Incardona committed
83 84
	 * \param gdb_ext set of local subdomains
	 * \param stop end point
incardon's avatar
incardon committed
85 86
	 *
	 */
incardon's avatar
incardon committed
87
	grid_dist_iterator(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
88
	:g_c(0),gList(gk),gdb_ext(gdb_ext),stop(stop)
incardon's avatar
incardon committed
89
	{
incardon's avatar
incardon committed
90
		// Initialize the current iterator
incardon's avatar
incardon committed
91
		// with the first grid
incardon's avatar
incardon committed
92
		selectValidGrid();
incardon's avatar
incardon committed
93 94
	}

incardon's avatar
incardon committed
95 96 97 98 99 100 101 102 103
	/*! \brief Constructor of the distributed grid iterator with
	 *         stencil support
	 *
	 * \param gk std::vector of the local grid
	 * \param gdb_ext set of local subdomains
	 * \param stop end point
	 * \param stencil_pnt stencil points
	 *
	 */
incardon's avatar
incardon committed
104
	grid_dist_iterator(openfpm::vector<device_grid> & gk,
incardon's avatar
incardon committed
105 106 107 108 109 110 111 112 113 114
			           const openfpm::vector<GBoxes<device_grid::dims>> & gdb_ext,
					   const grid_key_dx<dim> & stop,
					   const grid_key_dx<dim> (& stencil_pnt)[stencil::nsp])
	:g_c(0),gList(gk),gdb_ext(gdb_ext),a_it(stencil_pnt),stop(stop)
	{
		// Initialize the current iterator
		// with the first grid
		selectValidGrid();
	}

incardon's avatar
incardon committed
115 116
	// Destructor
	~grid_dist_iterator()
incardon's avatar
incardon committed
117 118
	{
	}
incardon's avatar
incardon committed
119

incardon's avatar
incardon committed
120
	/*! \brief Get the next element
incardon's avatar
incardon committed
121
	 *
incardon's avatar
incardon committed
122
	 * \return the next grid_key
incardon's avatar
incardon committed
123 124
	 *
	 */
incardon's avatar
incardon committed
125

incardon's avatar
incardon committed
126
	inline grid_dist_iterator<dim,device_grid,FREE,stencil> & operator++()
incardon's avatar
incardon committed
127
	{
incardon's avatar
incardon committed
128 129 130 131 132 133 134 135 136 137 138
		++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
139
			selectValidGrid();
incardon's avatar
incardon committed
140
		}
incardon's avatar
incardon committed
141 142

		return *this;
incardon's avatar
incardon committed
143 144 145 146 147 148 149
	}

	/*! \brief Check if there is the next element
	 *
	 * \return true if there is the next, false otherwise
	 *
	 */
incardon's avatar
incardon committed
150
	inline bool isNext()
incardon's avatar
incardon committed
151 152 153 154
	{
		// If there are no other grid stop

		if (g_c >= gList.size())
incardon's avatar
incardon committed
155
		{return false;}
incardon's avatar
incardon committed
156 157 158 159 160 161 162 163 164

		return true;
	}

	/*! \brief Get the actual key
	 *
	 * \return the actual key
	 *
	 */
incardon's avatar
incardon committed
165
	inline grid_dist_key_dx<dim> get()
incardon's avatar
incardon committed
166 167 168
	{
		return grid_dist_key_dx<dim>(g_c,a_it.get());
	}
Pietro Incardona's avatar
Pietro Incardona committed
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196

	/*! \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
197 198 199 200 201 202 203 204 205 206 207 208

	/*! \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;
	}
209 210 211 212 213 214

	/*! \brief Convert a g_dist_key_dx into a global key
	 *
	 * \see grid_dist_key_dx
	 * \see grid_dist_iterator
	 *
incardon's avatar
incardon committed
215 216
	 * \param k key position in local coordinates
	 *
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
	 * \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
232 233 234 235 236 237 238 239 240 241

	/*! \brief Return the stencil point offset
	 *
	 * \tparam id
	 *
	 * \return linearized distributed key
	 *
	 */
	template<unsigned int id> inline grid_dist_lin_dx getStencil()
	{
incardon's avatar
incardon committed
242
		return grid_dist_lin_dx(g_c,a_it.template getStencil<id>());
incardon's avatar
incardon committed
243
	}
incardon's avatar
incardon committed
244 245 246 247 248 249 250 251 252 253 254 255
};


/*! \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
256 257
template<unsigned int dim, typename device_grid,typename stencil>
class grid_dist_iterator<dim,device_grid,FIXED,stencil>
incardon's avatar
incardon committed
258 259 260 261 262
{
	//! grid list counter
	size_t g_c;

	//! List of the grids we are going to iterate
263
	const openfpm::vector<device_grid> & gList;
incardon's avatar
incardon committed
264 265 266 267 268

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

	//! Actual iterator
incardon's avatar
incardon committed
269
	grid_key_dx_iterator<dim,stencil> a_it;
incardon's avatar
incardon committed
270

271 272 273 274 275 276
	/*! \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
277
		while (g_c < gList.size() && (gList.get(g_c).size() == 0 || gdb_ext.get(g_c).Dbox.isValid() == false ) ) g_c++;
278 279 280 281

		// get the next grid iterator
		if (g_c < gList.size())
		{
282
			a_it.reinitialize(gList.get(g_c).getIterator(gdb_ext.get(g_c).Dbox.getKP1(),gdb_ext.get(g_c).Dbox.getKP2()));
283 284 285
		}
	}

incardon's avatar
incardon committed
286 287
	public:

incardon's avatar
incardon committed
288 289 290 291
	/*! \brief Copy operator=
	*
	* \param tmp iterator to copy
	*
incardon's avatar
incardon committed
292 293
	* \return itself
	*
incardon's avatar
incardon committed
294 295 296 297 298 299 300 301 302 303 304 305
	*/
	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
306 307
	 *
	 * \param gk std::vector of the local grid
incardon's avatar
incardon committed
308
	 * \param gdb_ext information about the local grids
incardon's avatar
incardon committed
309 310
	 *
	 */
311
	grid_dist_iterator(const openfpm::vector<device_grid> & gk, const openfpm::vector<GBoxes<device_grid::dims>> & gdb_ext)
incardon's avatar
incardon committed
312 313 314 315
	:g_c(0),gList(gk),gdb_ext(gdb_ext)
	{
		// Initialize the current iterator
		// with the first grid
316
		selectValidGrid();
incardon's avatar
incardon committed
317 318 319 320 321 322
	}

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

incardon's avatar
incardon committed
324 325 326 327 328 329
	/*! \brief Get the next element
	 *
	 * \return the next grid_key
	 *
	 */

incardon's avatar
incardon committed
330
	grid_dist_iterator<dim,device_grid,FIXED> &  operator++()
incardon's avatar
incardon committed
331
	{
incardon's avatar
incardon committed
332
		++a_it;
incardon's avatar
incardon committed
333 334 335

		// check if a_it is at the end

incardon's avatar
incardon committed
336
		if (a_it.isNext() == true)
incardon's avatar
incardon committed
337 338 339 340 341
			return *this;
		else
		{
			// switch to the new grid
			g_c++;
342
			selectValidGrid();
incardon's avatar
incardon committed
343 344 345 346 347 348 349 350 351 352
		}

		return *this;
	}

	/*! \brief Check if there is the next element
	 *
	 * \return true if there is the next, false otherwise
	 *
	 */
incardon's avatar
incardon committed
353
	bool isNext()
incardon's avatar
incardon committed
354 355 356 357
	{
		// If there are no other grid stop

		if (g_c >= gList.size())
incardon's avatar
incardon committed
358 359 360
			return false;

		return true;
incardon's avatar
incardon committed
361 362 363 364 365 366 367 368 369
	}

	/*! \brief Get the actual key
	 *
	 * \return the actual key
	 *
	 */
	grid_dist_key_dx<dim> get()
	{
incardon's avatar
incardon committed
370
		return grid_dist_key_dx<dim>(g_c,a_it.get());
incardon's avatar
incardon committed
371
	}
Pietro Incardona's avatar
Pietro Incardona committed
372 373 374 375 376 377 378 379 380 381 382 383

	/*! \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;
	}
384 385 386 387 388 389

	/*! \brief Convert a g_dist_key_dx into a global key
	 *
	 * \see grid_dist_key_dx
	 * \see grid_dist_iterator
	 *
incardon's avatar
incardon committed
390 391
	 * \param k local coordinates to convert into global
	 *
392 393 394 395 396 397 398 399 400 401 402 403 404 405 406
	 * \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
407 408 409 410 411 412 413 414 415 416

	/*! \brief Return the stencil point offset
	 *
	 * \tparam id
	 *
	 * \return linearized distributed key
	 *
	 */
	template<unsigned int id> inline grid_dist_lin_dx getStencil()
	{
incardon's avatar
incardon committed
417
		return grid_dist_lin_dx(g_c,a_it.template getStencil<id>());
incardon's avatar
incardon committed
418
	}
incardon's avatar
incardon committed
419 420
};

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