| 1 | #ifndef GRID_DIST_KEY_DX_HPP |
| 2 | #define GRID_DIST_KEY_DX_HPP |
| 3 | |
| 4 | #include "Grid/map_grid.hpp" |
| 5 | template<unsigned int dim, typename base_key = grid_key_dx<dim>> |
| 6 | class grid_dist_key_dx; |
| 7 | |
| 8 | template<bool impl, typename grid_key_base, unsigned int dim> |
| 9 | class move_impl |
| 10 | { |
| 11 | public: |
| 12 | static grid_dist_key_dx<dim,grid_key_base> move(grid_key_base & key, size_t sub, size_t i, int s) |
| 13 | { |
| 14 | key.set_d(i,key.get(i) + s); |
| 15 | return grid_dist_key_dx<dim,grid_key_base>(sub,key); |
| 16 | } |
| 17 | }; |
| 18 | |
| 19 | template<typename grid_key_base, unsigned int dim> |
| 20 | class move_impl<false,grid_key_base,dim> |
| 21 | { |
| 22 | public: |
| 23 | static grid_dist_key_dx<dim> move(grid_key_base & key, size_t sub, size_t i, int s) |
| 24 | { |
| 25 | std::cout << __FILE__ << ":" << __LINE__ << " Error move a key is not supported" |
| 26 | " directly acting on the grid key, please use the move function from the grid method" << std::endl; |
| 27 | |
| 28 | grid_key_dx<dim> zero; |
| 29 | zero.zero(); |
| 30 | |
| 31 | return grid_dist_key_dx<dim>(0,zero); |
| 32 | } |
| 33 | }; |
| 34 | |
| 35 | |
| 36 | /*! \brief Grid key for a distributed grid |
| 37 | * |
| 38 | * It contain from which local sub-domain grid come from, and the local grid_key_dx |
| 39 | * |
| 40 | */ |
| 41 | |
| 42 | template<unsigned int dim, typename base_key> |
| 43 | class grid_dist_key_dx |
| 44 | { |
| 45 | //! grid list counter |
| 46 | |
| 47 | size_t g_c; |
| 48 | |
| 49 | //! Local grid iterator |
| 50 | |
| 51 | base_key key; |
| 52 | |
| 53 | public: |
| 54 | |
| 55 | /*! \brief Set the local grid |
| 56 | * |
| 57 | * \param sub local grid |
| 58 | * |
| 59 | */ |
| 60 | inline void setSub(size_t sub) |
| 61 | { |
| 62 | g_c = sub; |
| 63 | } |
| 64 | |
| 65 | /*! \brief Get the local grid |
| 66 | * |
| 67 | * \return the id of the local grid |
| 68 | * |
| 69 | */ |
| 70 | inline size_t getSub() const |
| 71 | { |
| 72 | return g_c; |
| 73 | } |
| 74 | |
| 75 | /*! \brief Get the key |
| 76 | * |
| 77 | * \return the local key |
| 78 | * |
| 79 | */ |
| 80 | inline base_key getKey() const |
| 81 | { |
| 82 | return key; |
| 83 | } |
| 84 | |
| 85 | |
| 86 | /*! \brief Get the reference key |
| 87 | * |
| 88 | * \return the local key |
| 89 | * |
| 90 | */ |
| 91 | inline base_key & getKeyRef() |
| 92 | { |
| 93 | return key; |
| 94 | } |
| 95 | |
| 96 | /*! \brief Get the reference key |
| 97 | * |
| 98 | * \return the local key |
| 99 | * |
| 100 | */ |
| 101 | inline const base_key & getKeyRef() const |
| 102 | { |
| 103 | return key; |
| 104 | } |
| 105 | |
| 106 | /* \brief Check if two key are the same |
| 107 | * |
| 108 | * \param key_t key to check |
| 109 | * |
| 110 | * \return true if the two key are equal |
| 111 | * |
| 112 | */ |
| 113 | |
| 114 | inline bool operator==(const grid_dist_key_dx<dim> & key_t) |
| 115 | { |
| 116 | if (g_c != key_t.g_c) |
| 117 | return false; |
| 118 | |
| 119 | // Check the two key index by index |
| 120 | |
| 121 | return getKey() == key_t.getKey(); |
| 122 | } |
| 123 | |
| 124 | /*! \brief Create a new key moving the old one |
| 125 | * |
| 126 | * \param i dimension id |
| 127 | * \param s number of steps |
| 128 | * |
| 129 | * \return new key |
| 130 | * |
| 131 | */ |
| 132 | inline grid_dist_key_dx<dim,base_key> move(size_t i,int s) const |
| 133 | { |
| 134 | auto key = getKey(); |
| 135 | |
| 136 | return move_impl<has_set_d<base_key>::value, |
| 137 | decltype(this->getKey()), |
| 138 | dim>::move(key,getSub(),i,s); |
| 139 | } |
| 140 | |
| 141 | /*! \brief Create a new key moving the old one |
| 142 | * |
| 143 | * \param c where to move for each component |
| 144 | * |
| 145 | * \return new key |
| 146 | * |
| 147 | */ |
| 148 | inline grid_dist_key_dx<dim> move(const comb<dim> & c) const |
| 149 | { |
| 150 | grid_key_dx<dim> key = getKey(); |
| 151 | for (size_t i = 0 ; i < dim ; i++) |
| 152 | key.set_d(i,key.get(i) + c[i]); |
| 153 | return grid_dist_key_dx<dim>(getSub(),key); |
| 154 | } |
| 155 | |
| 156 | /*! \brief Constructor set the sub-domain grid and the position in local coordinates |
| 157 | * |
| 158 | * \param g_c sub-domain |
| 159 | * \param key key |
| 160 | * |
| 161 | */ |
| 162 | inline grid_dist_key_dx(int g_c, const base_key & key) |
| 163 | :g_c(g_c),key(key) |
| 164 | { |
| 165 | } |
| 166 | |
| 167 | //! Constructor |
| 168 | inline grid_dist_key_dx(){} |
| 169 | |
| 170 | /*! \brief convert the key to string |
| 171 | * |
| 172 | * |
| 173 | */ |
| 174 | std::string to_string() |
| 175 | { |
| 176 | std::stringstream str; |
| 177 | |
| 178 | str << "sub_domain=" << g_c << " " ; |
| 179 | |
| 180 | for (size_t i = 0 ; i < dim ; i++) |
| 181 | str << "x[" << i << "]=" << key.get(i) << " " ; |
| 182 | |
| 183 | str << "\n" ; |
| 184 | |
| 185 | return str.str(); |
| 186 | } |
| 187 | }; |
| 188 | |
| 189 | /*! \brief Distributed linearized key |
| 190 | * |
| 191 | * |
| 192 | * |
| 193 | */ |
| 194 | class grid_dist_lin_dx |
| 195 | { |
| 196 | //! grid list counter |
| 197 | size_t g_c; |
| 198 | |
| 199 | //! Local grid iterator |
| 200 | size_t key; |
| 201 | |
| 202 | public: |
| 203 | |
| 204 | /*! \brief Set the local grid |
| 205 | * |
| 206 | * \param sub local grid |
| 207 | * |
| 208 | */ |
| 209 | inline void setSub(size_t sub) |
| 210 | { |
| 211 | g_c = sub; |
| 212 | } |
| 213 | |
| 214 | /*! \brief Get the local grid |
| 215 | * |
| 216 | * \return the id of the local grid |
| 217 | * |
| 218 | */ |
| 219 | inline size_t getSub() const |
| 220 | { |
| 221 | return g_c; |
| 222 | } |
| 223 | |
| 224 | /*! \brief Get the key |
| 225 | * |
| 226 | * \return the local key |
| 227 | * |
| 228 | */ |
| 229 | inline size_t getKey() const |
| 230 | { |
| 231 | return key; |
| 232 | } |
| 233 | |
| 234 | |
| 235 | /*! \brief Get the reference key |
| 236 | * |
| 237 | * \return the local key |
| 238 | * |
| 239 | */ |
| 240 | inline size_t & getKeyRef() |
| 241 | { |
| 242 | return key; |
| 243 | } |
| 244 | |
| 245 | /* \brief Check if two key are the same |
| 246 | * |
| 247 | * \param key_t key to check |
| 248 | * |
| 249 | * \return true if the two key are equal |
| 250 | * |
| 251 | */ |
| 252 | |
| 253 | inline bool operator==(const grid_dist_lin_dx & key_t) |
| 254 | { |
| 255 | if (g_c != key_t.g_c) |
| 256 | return false; |
| 257 | |
| 258 | // Check the two key index by index |
| 259 | |
| 260 | return getKey() == key_t.getKey(); |
| 261 | } |
| 262 | |
| 263 | |
| 264 | /*! \brief Constructor set the sub-domain grid and the position in local coordinates |
| 265 | * |
| 266 | * \param g_c sub-domain |
| 267 | * \param key key |
| 268 | * |
| 269 | */ |
| 270 | inline grid_dist_lin_dx(int g_c, size_t key) |
| 271 | :g_c(g_c),key(key) |
| 272 | { |
| 273 | } |
| 274 | |
| 275 | //! Constructor |
| 276 | inline grid_dist_lin_dx(){} |
| 277 | |
| 278 | /*! \brief convert the key to string |
| 279 | * |
| 280 | * |
| 281 | */ |
| 282 | std::string to_string() |
| 283 | { |
| 284 | std::stringstream str; |
| 285 | |
| 286 | str << "sub_domain=" << g_c << " " ; |
| 287 | str << "lin_id=" << key << " " ; |
| 288 | |
| 289 | str << "\n" ; |
| 290 | |
| 291 | return str.str(); |
| 292 | } |
| 293 | }; |
| 294 | |
| 295 | /*! \brief Distributed linearized key |
| 296 | * |
| 297 | * instead of having the sub-subdomain index it store directly a pointer to the grid |
| 298 | * |
| 299 | */ |
| 300 | template<typename device_grid> |
| 301 | class grid_dist_g_dx |
| 302 | { |
| 303 | //! grid list counter |
| 304 | device_grid * dg; |
| 305 | |
| 306 | //! Local grid iterator |
| 307 | size_t key; |
| 308 | |
| 309 | public: |
| 310 | |
| 311 | /*! \brief return the sub-domain grid |
| 312 | * |
| 313 | * |
| 314 | */ |
| 315 | inline device_grid * getSub() const |
| 316 | { |
| 317 | return dg; |
| 318 | } |
| 319 | |
| 320 | |
| 321 | /*! \brief Get the key |
| 322 | * |
| 323 | * \return the local key |
| 324 | * |
| 325 | */ |
| 326 | inline size_t getKey() const |
| 327 | { |
| 328 | return key; |
| 329 | } |
| 330 | |
| 331 | |
| 332 | /*! \brief Get the reference key |
| 333 | * |
| 334 | * \return the local key |
| 335 | * |
| 336 | */ |
| 337 | inline size_t & getKeyRef() |
| 338 | { |
| 339 | return key; |
| 340 | } |
| 341 | |
| 342 | /* \brief Check if two key are the same |
| 343 | * |
| 344 | * \param key_t key to check |
| 345 | * |
| 346 | * \return true if the two key are equal |
| 347 | * |
| 348 | */ |
| 349 | |
| 350 | inline bool operator==(const grid_dist_g_dx & key_t) |
| 351 | { |
| 352 | if (dg != key_t.dg) |
| 353 | return false; |
| 354 | |
| 355 | // Check the two key index by index |
| 356 | |
| 357 | return getKey() == key_t.getKey(); |
| 358 | } |
| 359 | |
| 360 | |
| 361 | /*! \brief Constructor |
| 362 | * |
| 363 | * \param dg array of local grid |
| 364 | * \param key actual position linearized |
| 365 | * |
| 366 | */ |
| 367 | inline grid_dist_g_dx(device_grid * dg, size_t key) |
| 368 | :dg(dg),key(key) |
| 369 | { |
| 370 | } |
| 371 | |
| 372 | //! Constructor |
| 373 | inline grid_dist_g_dx(){} |
| 374 | |
| 375 | /*! \brief convert the key to string |
| 376 | * |
| 377 | * \return a string representing the position |
| 378 | * |
| 379 | */ |
| 380 | std::string to_string() |
| 381 | { |
| 382 | std::stringstream str; |
| 383 | |
| 384 | str << "sub_domain=" << dg << " " ; |
| 385 | str << "lin_id=" << key << " " ; |
| 386 | |
| 387 | str << "\n" ; |
| 388 | |
| 389 | return str.str(); |
| 390 | } |
| 391 | }; |
| 392 | |
| 393 | #endif |
| 394 | |