12#ifndef ARCANE_CARTESIANMESH_CARTESIANNUMBERING_H
13#define ARCANE_CARTESIANMESH_CARTESIANNUMBERING_H
17#include "arcane/cartesianmesh/CartesianMeshGlobal.h"
18#include "arcane/cartesianmesh/v2/CartesianTypes.h"
23namespace Arcane::CartesianMesh::V2
44template <
typename IdType>
45class CartesianNumbering
52 CartesianNumbering() {}
56 m_dimension = rhs.m_dimension;
57 for (
Integer d(0); d < 3; ++d) {
58 m_nitems_dir[d] = rhs.m_nitems_dir[d];
61 m_nitems = rhs.m_nitems;
62 m_first_item_id = rhs.m_first_item_id;
69 m_first_item_id = first_item_id;
71 for (
Integer d(0); d < m_dimension; ++d) {
72 m_nitems_dir[d] = nitems_dir[d];
73 m_nitems *= m_nitems_dir[d];
76 for (
Integer d(m_dimension); d < 3; ++d) {
84 for (
Integer d(1); d < m_dimension; ++d) {
105 return m_nitems_dir[dir];
117 return m_first_item_id;
135 ARCCORE_HOST_DEVICE
inline IdType
id(IdType i, IdType j, IdType k)
const
140 if (m_dimension < 3) {
141 item_id = m_first_item_id + i + j *
m_coef[1];
144 item_id = m_first_item_id + i + j *
m_coef[1] + k *
m_coef[2];
152 return id(item_ijk[0], item_ijk[1], item_ijk[2]);
157 ARCCORE_HOST_DEVICE
inline IdType
id(IdxType idx)
const
159 return id(
static_cast<IdType
>(idx[0]),
static_cast<IdType
>(idx[1]),
static_cast<IdType
>(idx[2]));
165 item_id -= m_first_item_id;
167 if (m_dimension < 3) {
169 item_ijk[1] = item_id /
m_coef[1];
170 item_ijk[0] = item_id %
m_coef[1];
173 item_ijk[2] = item_id /
m_coef[2];
174 IdType tmp = item_id %
m_coef[2];
175 item_ijk[1] = tmp /
m_coef[1];
176 item_ijk[0] = tmp %
m_coef[1];
181 ARCCORE_HOST_DEVICE IdxType
ijk(IdType item_id)
const
183 item_id -= m_first_item_id;
186 if (m_dimension < 3) {
193 IdType tmp = item_id %
m_coef[2];
204 return (item_id - m_first_item_id) %
m_coef[1];
210 return (m_dimension == 3 ? ((item_id - m_first_item_id) %
m_coef[2] /
m_coef[1]) : (item_id - m_first_item_id) /
m_coef[1]);
216 return (item_id - m_first_item_id) /
m_coef[2];
222 IdType3 m_nitems_dir = { 1, 1, 1 };
225 IdType m_first_item_id = 0;
Gestion d'une numerotation cartesienne sur une grille d'items d'une dimension au plus 3 Permet le pas...
IdType deltaDir(Integer dir) const
Offset à ajouter à id() pour obtenir l'id de l'item suivant dans la direction dir (si cet item existe...
__host__ __device__ IdType id(IdType i, IdType j, IdType k) const
Passage (i,j,k) => numero.
void ijk(IdType item_id, IdType3 &item_ijk) const
Passage de numero => (i,j,k)
__host__ __device__ IdxType ijk(IdType item_id) const
Passage de numero => (i,j,k)
__host__ __device__ IdType id(IdxType idx) const
Passage (i,j,k) => numero.
IdType idxDir0(IdType item_id) const
Passage numéro => i.
IdType3 m_coef
item_id = m_first_item_id + numéro_cartésien(i,j,k), permet un décallage dans la numérotation
const IdType3 & nbItem3() const
Triplet du nb d'items dans chaque direction (définition de la grille)
IdType idxDir1(IdType item_id) const
Passage numéro => j.
IdType[3] IdType3
Type pour les triplets cartésiens (i,j,k) et les triplets des dimensions (ni,nj,nk)
IdType idxDir2(IdType item_id) const
Passage numéro => k.
IdType id(const IdType3 &item_ijk) const
Passage (i,j,k) => numero.
Integer dimension() const
Dimension de la grille cartésienne sur laquelle s'appuit la numérotation.
IdType nbItem() const
Nb total d'items dans la grille cartésienne (produit du nb d'items dans chaque direction)
IdType nbItemDir(Integer dir) const
Nb d'items dans la grille cartésienne selon la direction dir (< dimension())
const IdType3 & delta3() const
Triplet des offsets dans toutes les directions pour passer aux items suivants dans chacune des direct...
IdType firstId() const
Plus petit identifiant de la numérotation cartésienne de la grille.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.