| 1 | /* | 
| 2 |  * grid_dist_util.hpp | 
| 3 |  * | 
| 4 |  *  Created on: Jan 28, 2016 | 
| 5 |  *      Author: i-bird | 
| 6 |  */ | 
| 7 |  | 
| 8 | #ifndef SRC_GRID_GRID_DIST_UTIL_HPP_ | 
| 9 | #define SRC_GRID_GRID_DIST_UTIL_HPP_ | 
| 10 |  | 
| 11 | #include "NN/CellList/CellDecomposer.hpp" | 
| 12 | #include "Decomposition/common.hpp" | 
| 13 |  | 
| 14 | /*! \brief get cellDecomposer parameters | 
| 15 |  * | 
| 16 |  * \tparam dim dimensionality | 
| 17 |  * | 
| 18 |  * \param c_g get the parameters of the cell decomposer | 
| 19 |  * \param g_sz global grid parameters | 
| 20 |  * | 
| 21 |  */ | 
| 22 | template<unsigned int dim> void getCellDecomposerPar(size_t (& c_g)[dim], const size_t (& g_sz)[dim], const size_t (& bc)[dim]) | 
| 23 | { | 
| 24 | 	for (size_t i = 0 ; i < dim ; i++) | 
| 25 | 	{ | 
| 26 | 		if (bc[i] == NON_PERIODIC) | 
| 27 | 			c_g[i] = (g_sz[i]-1 > 0)?(g_sz[i]-1):1; | 
| 28 | 		else | 
| 29 | 			c_g[i] = g_sz[i]; | 
| 30 | 	} | 
| 31 | } | 
| 32 |  | 
| 33 |  | 
| 34 | /*! \brief Create NON_PERIODIC data structure | 
| 35 |  * | 
| 36 |  * \tparam dim Dimensionality | 
| 37 |  * | 
| 38 |  * \return structure that define the non periodicity of the grid | 
| 39 |  * | 
| 40 |  */ | 
| 41 | template<unsigned int dim> periodicity<dim> create_non_periodic() | 
| 42 | { | 
| 43 | 	periodicity<dim> p; | 
| 44 |  | 
| 45 | 	for(size_t i = 0 ; i < dim ; i++) | 
| 46 | 		p.bc[i] = NON_PERIODIC; | 
| 47 |  | 
| 48 | 	return p; | 
| 49 | } | 
| 50 |  | 
| 51 | template<unsigned int dim> | 
| 52 | size_t get_gdb_ext(const openfpm::vector<GBoxes<dim>> & gdb_ext, size_t start , size_t stop, size_t k) | 
| 53 | { | 
| 54 | 	for (size_t i = start ; i < stop ; i++) | 
| 55 | 	{ | 
| 56 | 		if (gdb_ext.get(i).k == k) | 
| 57 | 		{return i;} | 
| 58 | 	} | 
| 59 |  | 
| 60 | 	// not found | 
| 61 | 	return (size_t)-1; | 
| 62 | } | 
| 63 |  | 
| 64 | /*! \brief Add a box to gdb_ext | 
| 65 |  * | 
| 66 |  * \param on which gdb_ext array add the box | 
| 67 |  * \param k from which definition box it come from | 
| 68 |  *        This parameter make sense only when the grid is not defined everywhere | 
| 69 |  * \param grid of the sub-domain | 
| 70 |  * \param grid of the sub-domain inclusive of ghost | 
| 71 |  * | 
| 72 |  */ | 
| 73 | template<unsigned int dim> | 
| 74 | void add_to_gdb_ext(openfpm::vector<GBoxes<dim>> & gdb_ext, size_t k, Box<dim,long int> & sp_t, Box<dim,long int> & sp_tg) | 
| 75 | { | 
| 76 | 	// Add gdb_ext | 
| 77 | 	gdb_ext.add(); | 
| 78 |  | 
| 79 | 	//! Save the origin of the sub-domain of the local grid | 
| 80 | 	gdb_ext.last().origin = sp_tg.getP1(); | 
| 81 |  | 
| 82 | 	// save information about the local grid: domain box seen inside the domain + ghost box (see GDBoxes for a visual meaning) | 
| 83 | 	// and where the GDBox start, or the origin of the local grid (+ghost) in global coordinate | 
| 84 | 	gdb_ext.last().Dbox = sp_t; | 
| 85 | 	gdb_ext.last().Dbox -= sp_tg.getP1(); | 
| 86 |  | 
| 87 | 	gdb_ext.last().GDbox = sp_tg; | 
| 88 | 	gdb_ext.last().GDbox -= sp_tg.getP1(); | 
| 89 |  | 
| 90 | 	gdb_ext.last().k = k; | 
| 91 | } | 
| 92 |  | 
| 93 | /*! \brief Create the gdb_ext | 
| 94 |  * | 
| 95 |  * It is a fundamental function, because it create the structure that store the information of the local grids. In | 
| 96 |  * particular from the continuous decomposed domain it calculate the grid that each sub-domain store | 
| 97 |  * | 
| 98 |  * \param gdb_ext output Vector of Boxes that define the local grids extension | 
| 99 |  * \param dec Decomposition | 
| 100 |  * \param cd_sm CellDecomposer the size of cell is equal to the distance between grid points | 
| 101 |  * | 
| 102 |  */ | 
| 103 | template<int dim, typename Decomposition> | 
| 104 | inline void create_gdb_ext(openfpm::vector<GBoxes<Decomposition::dims>> & gdb_ext, | 
| 105 | 						   openfpm::vector<size_t> & gdb_ext_markers, | 
| 106 | 		                   Decomposition & dec, | 
| 107 | 						   CellDecomposer_sm<Decomposition::dims,typename Decomposition::stype,shift<dim,typename Decomposition::stype>> & cd_sm, | 
| 108 | 						   openfpm::vector<Box<Decomposition::dims,long int>> & bx_create, | 
| 109 | 						   const Ghost<Decomposition::dims,long int> & exp, | 
| 110 | 						   bool use_bx_def) | 
| 111 | { | 
| 112 | 	gdb_ext.clear(); | 
| 113 | 	gdb_ext_markers.clear(); | 
| 114 |  | 
| 115 | 	// Get the number of local grid needed | 
| 116 | 	size_t n_grid = dec.getNSubDomain(); | 
| 117 |  | 
| 118 | 	// Allocate the grids | 
| 119 | 	for (size_t i = 0 ; i < n_grid ; i++) | 
| 120 | 	{ | 
| 121 | 		gdb_ext_markers.add(gdb_ext.size()); | 
| 122 |  | 
| 123 | 		// Get the local sub-domain (Grid conversion must be done with the domain P1 equivalent to 0.0) | 
| 124 | 		// consider that the sub-domain with point P1 equivalent to the domain P1 is a (0,0,0) in grid unit | 
| 125 | 		SpaceBox<Decomposition::dims, typename Decomposition::stype> sp = dec.getSubDomain(i); | 
| 126 | 		SpaceBox<Decomposition::dims, typename Decomposition::stype> sp_g = dec.getSubDomainWithGhost(i); | 
| 127 |  | 
| 128 | 		// Because of round off we expand for safety the ghost area | 
| 129 | 		// std::nextafter return the next bigger or smaller representable floating | 
| 130 | 		// point number | 
| 131 | 		for (size_t i = 0 ; i < Decomposition::dims ; i++) | 
| 132 | 		{ | 
| 133 | 			sp_g.setLow(i,std::nextafter(sp_g.getLow(i),sp_g.getLow(i) - 1.0)); | 
| 134 | 			sp_g.setHigh(i,std::nextafter(sp_g.getHigh(i),sp_g.getHigh(i) + 1.0)); | 
| 135 | 		} | 
| 136 |  | 
| 137 | 		// Convert from SpaceBox<dim,St> to SpaceBox<dim,long int> | 
| 138 | 		SpaceBox<Decomposition::dims,long int> sp_t = cd_sm.convertDomainSpaceIntoGridUnits(sp,dec.periodicity()); | 
| 139 | 		SpaceBox<Decomposition::dims,long int> sp_tg = cd_sm.convertDomainSpaceIntoGridUnits(sp_g,dec.periodicity()); | 
| 140 |  | 
| 141 | 		for (size_t i = 0 ; i < Decomposition::dims ; i++) | 
| 142 | 		{ | 
| 143 | 			if (sp_t.getLow(i) < sp_tg.getLow(i)) | 
| 144 | 			{sp_tg.setLow(i,sp_t.getLow(i));} | 
| 145 | 			if (sp_t.getHigh(i) > sp_tg.getHigh(i)) | 
| 146 | 			{sp_tg.setHigh(i,sp_t.getHigh(i));} | 
| 147 | 		} | 
| 148 |  | 
| 149 | 		if (use_bx_def == true) | 
| 150 | 		{ | 
| 151 | 			// intersect the sub-domain with all the boxes | 
| 152 |  | 
| 153 | 			for (size_t k = 0 ; k < bx_create.size() ; k++) | 
| 154 | 			{ | 
| 155 | 				Box<Decomposition::dims, long int> inte; | 
| 156 |  | 
| 157 | 				if (sp_t.Intersect(bx_create.get(k),inte) == true) | 
| 158 | 				{ | 
| 159 | 					// Ok we have a sub-domain now we have to create the ghost part. | 
| 160 | 					// The ghost part is created converting the bx_def into a continuous | 
| 161 | 					// box expanding this box by the ghost and intersecting this box | 
| 162 | 					// with the sub-domain. This is one way to get a ghost area consistent | 
| 163 | 					// with the construction of the external and internal ghost boxes, | 
| 164 | 					// always calculated in continuous from the decomposition. | 
| 165 | 					// | 
| 166 |  | 
| 167 | 					Box<Decomposition::dims,typename Decomposition::stype> output; | 
| 168 | 					Box<Decomposition::dims,typename Decomposition::stype> bx_wg = cd_sm.convertCellUnitsIntoDomainSpaceMiddle(bx_create.get(k)); | 
| 169 | 					bx_wg.enlarge(dec.getGhost()); | 
| 170 | 					bx_wg.Intersect(sp_g,output); | 
| 171 |  | 
| 172 | 					SpaceBox<Decomposition::dims,long int> sp_t2 = inte; | 
| 173 | 					SpaceBox<Decomposition::dims,long int> sp_tg2 =  cd_sm.convertDomainSpaceIntoGridUnits(output,dec.periodicity()); | 
| 174 |  | 
| 175 | 					add_to_gdb_ext(gdb_ext,k,sp_t2,sp_tg2); | 
| 176 | 				} | 
| 177 | 			} | 
| 178 | 		} | 
| 179 | 		else | 
| 180 | 		{ | 
| 181 | 			add_to_gdb_ext(gdb_ext,0,sp_t,sp_tg); | 
| 182 | 		} | 
| 183 | 	} | 
| 184 |  | 
| 185 | 	gdb_ext_markers.add(gdb_ext.size()); | 
| 186 | } | 
| 187 |  | 
| 188 | /*! \brief Create the gdb_ext | 
| 189 |  * | 
| 190 |  * \param gdb_ext Vector of Boxes that define the local grids extension | 
| 191 |  * \param gdb_ext_markers filled with sub-domain markers | 
| 192 |  *                see gdb_ext_markers in grid_dist_id for an explanation | 
| 193 |  * \param dec Decomposition | 
| 194 |  * \param sz Global grid grid size | 
| 195 |  * \param domain Domain where the grid is defined | 
| 196 |  * \param spacing Define the spacing of the grid | 
| 197 |  * \param bc boundary conditions | 
| 198 |  * | 
| 199 |  */ | 
| 200 | template<int dim, typename Decomposition> | 
| 201 | inline void create_gdb_ext(openfpm::vector<GBoxes<dim>> & gdb_ext, | 
| 202 | 		                   Decomposition & dec, | 
| 203 | 						   const size_t (& sz)[dim], | 
| 204 | 						   const Box<Decomposition::dims,typename Decomposition::stype> & domain, | 
| 205 | 						   typename Decomposition::stype (& spacing)[dim]) | 
| 206 | { | 
| 207 | 	// Create the cell decomposer | 
| 208 | 	CellDecomposer_sm<Decomposition::dims,typename Decomposition::stype, shift<Decomposition::dims,typename Decomposition::stype>> cd_sm; | 
| 209 |  | 
| 210 | 	size_t cdp[dim]; | 
| 211 |  | 
| 212 | 	// Get the parameters to create a Cell-decomposer | 
| 213 | 	getCellDecomposerPar<Decomposition::dims>(cdp,sz,dec.periodicity()); | 
| 214 |  | 
| 215 | 	// Careful cd_sm require the number of cell | 
| 216 | 	cd_sm.setDimensions(domain,cdp,0); | 
| 217 |  | 
| 218 | 	// create an empty vector of boxes | 
| 219 | 	openfpm::vector<Box<Decomposition::dims,long int>> empty; | 
| 220 | 	Ghost<Decomposition::dims,long int> zero(0); | 
| 221 |  | 
| 222 | 	//! We are not interested on the markers | 
| 223 | 	openfpm::vector<size_t> unused; | 
| 224 | 	create_gdb_ext<dim,Decomposition>(gdb_ext,unused,dec,cd_sm,empty,zero,false); | 
| 225 |  | 
| 226 | 	// fill the spacing | 
| 227 | 	for (size_t i = 0 ; i < dim ; i++) | 
| 228 | 	{spacing[i] = cd_sm.getCellBox().getP2()[i];} | 
| 229 | } | 
| 230 |  | 
| 231 | /*! \brief It store the information about the external ghost box | 
| 232 |  * | 
| 233 |  * | 
| 234 |  */ | 
| 235 | template <unsigned int dim> struct e_box_id | 
| 236 | { | 
| 237 | 	//! Box defining the external ghost box in global coordinates | 
| 238 | 	::Box<dim,long int> g_e_box; | 
| 239 |  | 
| 240 | 	//! Box defining the external ghost box in local coordinates for gdb_ext | 
| 241 | 	::Box<dim,long int> l_e_box; | 
| 242 |  | 
| 243 | 	//! Box defining the external box in local coordinates for received box | 
| 244 | 	::Box<dim,long int> lr_e_box; | 
| 245 |  | 
| 246 | 	//! Sector position of the external ghost | 
| 247 | 	comb<dim> cmb; | 
| 248 |  | 
| 249 | 	//! Id | 
| 250 | 	size_t g_id; | 
| 251 |  | 
| 252 | 	//! sub_id in which sub-domain this box live | 
| 253 | 	size_t sub; | 
| 254 | }; | 
| 255 |  | 
| 256 | /*! \brief flip box just convert and internal ghost box into an external ghost box and the other way around | 
| 257 |  * | 
| 258 |  * \param box to convert | 
| 259 |  * \param cmb sector position of the box | 
| 260 |  * | 
| 261 |  * \return the converted box | 
| 262 |  * | 
| 263 |  */ | 
| 264 | template<unsigned int dim, typename T, typename idT> | 
| 265 | Box<dim,long int> flip_box(const Box<dim,idT> & box, const comb<dim> & cmb, const grid_sm<dim,T> & ginfo) | 
| 266 | { | 
| 267 | 	Box<dim,long int> flp; | 
| 268 |  | 
| 269 | 	for (size_t i = 0 ; i < dim; i++) | 
| 270 | 	{ | 
| 271 | 		if (cmb[i] == 0) | 
| 272 | 		{ | 
| 273 | 			flp.setLow(i,box.getLow(i)); | 
| 274 | 			flp.setHigh(i,box.getHigh(i)); | 
| 275 | 		} | 
| 276 | 		else if (cmb[i] == 1) | 
| 277 | 		{ | 
| 278 | 			flp.setLow(i,box.getLow(i) + ginfo.size(i)); | 
| 279 | 			flp.setHigh(i,box.getHigh(i) + ginfo.size(i)); | 
| 280 | 		} | 
| 281 | 		else if (cmb[i] == -1) | 
| 282 | 		{ | 
| 283 | 			flp.setLow(i,box.getLow(i) - ginfo.size(i)); | 
| 284 | 			flp.setHigh(i,box.getHigh(i) - ginfo.size(i)); | 
| 285 | 		} | 
| 286 | 	} | 
| 287 |  | 
| 288 | 	return flp; | 
| 289 | } | 
| 290 |  | 
| 291 | /*! \brief convert to sub-domain id | 
| 292 |  * | 
| 293 |  * In case the grid is not defined everywhere the ids returned by getProcessorIGhostSub | 
| 294 |  * or any function that return a sub-domain id does not match the ids in gdb_ext. This | 
| 295 |  * function convert it to the correct one | 
| 296 |  * | 
| 297 |  * \param k sub-domain id to convert | 
| 298 |  * \param def_id id of the box that define the real allocated grid | 
| 299 |  * \param gdb_ext_markers markers for sub-domain id gdb_ext | 
| 300 |  * | 
| 301 |  */ | 
| 302 | template<unsigned int dim> | 
| 303 | inline size_t convert_to_gdb_ext(size_t sub_id, | 
| 304 | 		                         size_t def_id, | 
| 305 | 								 openfpm::vector<GBoxes<dim>> & gdb_ext, | 
| 306 | 								 openfpm::vector<size_t> & gdb_ext_markers) | 
| 307 | { | 
| 308 | 	size_t start = gdb_ext_markers.get(sub_id); | 
| 309 | 	size_t stop = gdb_ext_markers.get(sub_id+1); | 
| 310 | 	return get_gdb_ext(gdb_ext,start,stop,def_id); | 
| 311 | } | 
| 312 |  | 
| 313 | /*! \brief It store the information about the local external ghost box | 
| 314 |  * | 
| 315 |  * | 
| 316 |  */ | 
| 317 | template <unsigned int dim> struct e_lbox_id | 
| 318 | { | 
| 319 | 	//! Box defining the external ghost box in local coordinates | 
| 320 | 	::Box<dim,long int> ebox; | 
| 321 |  | 
| 322 | 	//! Has this external ghost box initialized | 
| 323 | 	bool initialized = false; | 
| 324 |  | 
| 325 | 	//! sub-domain id of the non-extended sub-domain | 
| 326 | 	size_t sub; | 
| 327 |  | 
| 328 | 	//! to which gdb_ext this external ghost box is linked with | 
| 329 | 	//! (in case of grid defined everywhere these two number match) | 
| 330 | 	size_t sub_gdb_ext; | 
| 331 |  | 
| 332 | 	//! external ghost box linked to this internal ghost box | 
| 333 | 	size_t k; | 
| 334 |  | 
| 335 | 	//! Sector position of the local external ghost box | 
| 336 | 	comb<dim> cmb; | 
| 337 | }; | 
| 338 |  | 
| 339 |  | 
| 340 | /*! \brief Add a local external ghost box | 
| 341 |  * | 
| 342 |  * \param le_sub sub-domain id | 
| 343 |  * \param s id of the external ghost box | 
| 344 |  * \param j id of the domain not expanded | 
| 345 |  * \param k id of the grid (gdb_ext) this external ghost box is linked with | 
| 346 |  * \param bid where to add the local external ghost box | 
| 347 |  * \param box the box to add | 
| 348 |  * \param cmb quadrant in which the external ghost box live | 
| 349 |  * | 
| 350 |  */ | 
| 351 | template<unsigned int dim> inline void add_loc_eg_box(size_t le_sub, | 
| 352 | 											   size_t se, | 
| 353 | 											   size_t j, | 
| 354 | 											   size_t k, | 
| 355 | 		                                       openfpm::vector<e_lbox_id<dim>> & bid, | 
| 356 | 		                                       const Box<dim,long int> & ebox, | 
| 357 | 											   comb<dim> & cmb) | 
| 358 | { | 
| 359 | 	bid.add(); | 
| 360 |  | 
| 361 | 	bid.last().ebox = ebox; | 
| 362 |  | 
| 363 | 	bid.last().sub = se; | 
| 364 | 	bid.last().sub_gdb_ext = k; | 
| 365 |  | 
| 366 | 	bid.last().cmb = cmb; | 
| 367 | 	bid.last().k = j; | 
| 368 | 	bid.last().initialized = true; | 
| 369 | } | 
| 370 |  | 
| 371 | /*! Add an entry of for an external ghost box | 
| 372 |  * | 
| 373 |  * \param k sub-domain id to which this external ghost box is linked | 
| 374 |  * \param cmb quadrant where the received linked internal ghost box live | 
| 375 |  * \param output external ghost box | 
| 376 |  * \param g_id global id of the external ghost box, in general this id is communicated | 
| 377 |  *             by the processor that has the linked internal ghost-box | 
| 378 |  * \param origin domain where this external ghost box is linked | 
| 379 |  * \param p1 origin of the received internal ghost box | 
| 380 |  * | 
| 381 |  */ | 
| 382 | template<unsigned int dim> inline void add_eg_box(size_t k, | 
| 383 | 		                                   const comb<dim> & cmb, | 
| 384 | 										   const Box<dim,long int> & output, | 
| 385 | 										   size_t g_id, | 
| 386 | 										   const Point<dim,long int> & origin, | 
| 387 | 										   const Point<dim,long int> & p1, | 
| 388 | 										   openfpm::vector<e_box_id<dim>> & bid) | 
| 389 | { | 
| 390 | 	// link | 
| 391 |  | 
| 392 | 	size_t sub_id = k; | 
| 393 |  | 
| 394 | 	e_box_id<dim> bid_t; | 
| 395 | 	bid_t.sub = sub_id; | 
| 396 | 	bid_t.cmb = cmb; | 
| 397 | 	bid_t.cmb.sign_flip(); | 
| 398 | 	::Box<dim,long int> ib = output; | 
| 399 | 	bid_t.g_e_box = ib; | 
| 400 | 	bid_t.g_id = g_id; | 
| 401 |  | 
| 402 | 	// Translate in local coordinate for gdb_ext | 
| 403 | 	Box<dim,long int> tb = ib; | 
| 404 | 	tb -= origin; | 
| 405 | 	bid_t.l_e_box = tb; | 
| 406 |  | 
| 407 | 	// Translate in local coordinates for the received box | 
| 408 | 	Box<dim,long int> tbr = ib; | 
| 409 | 	bid_t.lr_e_box = tbr; | 
| 410 |  | 
| 411 | 	bid.add(bid_t); | 
| 412 | } | 
| 413 |  | 
| 414 | /*! \brief Result of the itersection of a box with an array of boxes | 
| 415 |  * | 
| 416 |  * | 
| 417 |  */ | 
| 418 | template<unsigned int dim> | 
| 419 | struct result_box | 
| 420 | { | 
| 421 | 	//! id of the box in the array that produced an non-empty intersection | 
| 422 | 	size_t id; | 
| 423 |  | 
| 424 | 	//! valid result of the itersection | 
| 425 | 	Box<dim,long int> bx; | 
| 426 | }; | 
| 427 |  | 
| 428 | /*! \brief Intersect a box with an array of boxes | 
| 429 |  * | 
| 430 |  * \param bx_def array of boxes | 
| 431 |  * \param bx box to intersect with | 
| 432 |  * \param use_bx_def in case of false the box bx is added to the result array | 
| 433 |  *        and nothing is performed | 
| 434 |  * \param result results of the intersections | 
| 435 |  * | 
| 436 |  */ | 
| 437 | template<unsigned int dim> | 
| 438 | void bx_intersect(openfpm::vector<Box<dim,long int>> & bx_def, | 
| 439 | 		          bool use_bx_def, | 
| 440 | 				  Box<dim,long int> & bx, | 
| 441 | 				  openfpm::vector_std<result_box<dim>> & result) | 
| 442 | { | 
| 443 | 	result.clear(); | 
| 444 |  | 
| 445 | 	if (use_bx_def == false) | 
| 446 | 	{ | 
| 447 | 		result_box<dim> tmp; | 
| 448 | 		tmp.bx = bx; | 
| 449 | 		tmp.id = 0; | 
| 450 |  | 
| 451 | 		result.add(tmp); | 
| 452 | 		return; | 
| 453 | 	} | 
| 454 |  | 
| 455 | 	for (size_t i = 0 ; i < bx_def.size() ; i++) | 
| 456 | 	{ | 
| 457 | 		result_box<dim> inte; | 
| 458 | 		if (bx.Intersect(bx_def.get(i),inte.bx)) | 
| 459 | 		{ | 
| 460 | 			inte.id = i; | 
| 461 | 			result.add(inte); | 
| 462 | 		} | 
| 463 | 	} | 
| 464 | } | 
| 465 |  | 
| 466 | /*! \brief it store a box, its unique id and the sub-domain from where it come from | 
| 467 |  * | 
| 468 |  */ | 
| 469 | template<unsigned int dim> struct i_box_id | 
| 470 | { | 
| 471 | 	//! Box | 
| 472 | 	::Box<dim,long int> box; | 
| 473 |  | 
| 474 | 	//! id | 
| 475 | 	size_t g_id; | 
| 476 |  | 
| 477 | 	//! r_sub id of the sub-domain in the sent list | 
| 478 | 	size_t r_sub; | 
| 479 |  | 
| 480 | 	//! Sector where it live the linked external ghost box | 
| 481 | 	comb<dim> cmb; | 
| 482 |  | 
| 483 |  | 
| 484 |  | 
| 485 | 	//! sub | 
| 486 | 	size_t sub; | 
| 487 | }; | 
| 488 |  | 
| 489 | /*! \brief set of internal ghost box to send | 
| 490 |  * | 
| 491 |  * | 
| 492 |  */ | 
| 493 | template<unsigned int dim> | 
| 494 | struct ibox_send | 
| 495 | { | 
| 496 | 	//! global id | 
| 497 | 	size_t gid; | 
| 498 |  | 
| 499 | 	//! internal ghost box | 
| 500 | 	Box<dim,long int> ibox; | 
| 501 | }; | 
| 502 |  | 
| 503 |  | 
| 504 |  | 
| 505 | /*! \brief it store an internal ghost box, the linked external ghost box and the sub-domain from where | 
| 506 |  *  it come from as internal ghost box | 
| 507 |  * | 
| 508 |  */ | 
| 509 | template<unsigned int dim> struct i_lbox_id | 
| 510 | { | 
| 511 | 	//! Box | 
| 512 | 	::Box<dim,long int> box; | 
| 513 |  | 
| 514 | 	//! sub-domain id (of the extended sub-domain). | 
| 515 | 	//! sub and sub_gdb_ext match if use_bx_def is not used in the | 
| 516 | 	//! distributed grid | 
| 517 | 	size_t sub; | 
| 518 |  | 
| 519 | 	//! to which gdb_ext this internal ghost box is linked with | 
| 520 | 	size_t sub_gdb_ext; | 
| 521 |  | 
| 522 | 	//! external ghost box linked to this internal ghost box | 
| 523 | 	openfpm::vector<size_t> k; | 
| 524 |  | 
| 525 | 	//! combination | 
| 526 | 	comb<dim> cmb; | 
| 527 | }; | 
| 528 |  | 
| 529 |  | 
| 530 | /*! \brief For each external ghost id, it contain a set of sub-domain at which this | 
| 531 |  *         external box is linked | 
| 532 |  * | 
| 533 |  * | 
| 534 |  */ | 
| 535 | template<unsigned int dim> | 
| 536 | struct e_box_multi | 
| 537 | { | 
| 538 | 	//! set sub-domain at which with external ghost is linked | 
| 539 | 	//! The eb_list are id for the eb_box list | 
| 540 | 	openfpm::vector<size_t> eb_list; | 
| 541 |  | 
| 542 | 	//! This is the id in eb_list that contain an external ghost box | 
| 543 | 	//! able to store the full received box | 
| 544 | 	size_t full_match; | 
| 545 |  | 
| 546 | 	//! It store the id of linked eg_box (eg_box.get(e_id) is valid, this mean that e_id store processor id information) | 
| 547 | 	//! \see ProctoID function | 
| 548 | 	size_t e_id; | 
| 549 | }; | 
| 550 |  | 
| 551 |  | 
| 552 | /*! \brief Per-processor Internal ghost box | 
| 553 |  * | 
| 554 |  */ | 
| 555 | template <unsigned int dim> struct ip_box_grid | 
| 556 | { | 
| 557 | 	// ghost in grid units | 
| 558 | 	openfpm::vector<i_box_id<dim>> bid; | 
| 559 |  | 
| 560 | 	//! processor id | 
| 561 | 	size_t prc; | 
| 562 | }; | 
| 563 |  | 
| 564 | /*! \brief local Internal ghost box | 
| 565 |  * | 
| 566 |  */ | 
| 567 | template <unsigned int dim> struct i_lbox_grid | 
| 568 | { | 
| 569 | 	// ghost in grid units | 
| 570 | 	openfpm::vector<i_lbox_id<dim>> bid; | 
| 571 | }; | 
| 572 |  | 
| 573 | /*! \brief Per-processor external ghost box | 
| 574 |  * | 
| 575 |  */ | 
| 576 | template <unsigned int dim>struct ep_box_grid | 
| 577 | { | 
| 578 | 	// ghost in grid units | 
| 579 | 	openfpm::vector<e_box_id<dim>> bid; | 
| 580 |  | 
| 581 | 	//! processor id | 
| 582 | 	size_t prc; | 
| 583 |  | 
| 584 | 	//! total number of received points | 
| 585 | 	size_t recv_pnt; | 
| 586 |  | 
| 587 | 	//! Number of received boxes | 
| 588 | 	size_t n_r_box; | 
| 589 | }; | 
| 590 |  | 
| 591 | /*! \brief Per-processor external ghost box | 
| 592 |  * | 
| 593 |  */ | 
| 594 | template <unsigned int dim> struct e_lbox_grid | 
| 595 | { | 
| 596 | 	// ghost in grid units | 
| 597 | 	openfpm::vector<e_lbox_id<dim>> bid; | 
| 598 | }; | 
| 599 |  | 
| 600 |  | 
| 601 | #endif /* SRC_GRID_GRID_DIST_UTIL_HPP_ */ | 
| 602 |  |