Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
CartesianNumbering.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* CartesianNumbering.h (C) 2000-2021 */
9/* */
10/* Gestion d'une numérotation cartésienne sur une grille d'entités. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CARTESIANMESH_CARTESIANNUMBERING_H
13#define ARCANE_CARTESIANMESH_CARTESIANNUMBERING_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/cartesianmesh/CartesianMeshGlobal.h"
18#include "arcane/cartesianmesh/v2/CartesianTypes.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23namespace Arcane::CartesianMesh::V2
24{
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
44template <typename IdType>
46{
47 public:
49 using IdType3 = IdType[3];
50
51 public:
53
54 ARCCORE_HOST_DEVICE CartesianNumbering(const CartesianNumbering<IdType>& rhs)
55 {
56 m_dimension = rhs.m_dimension;
57 for (Integer d(0); d < 3; ++d) {
58 m_nitems_dir[d] = rhs.m_nitems_dir[d];
59 m_coef[d] = rhs.m_coef[d];
60 }
61 m_nitems = rhs.m_nitems;
62 m_first_item_id = rhs.m_first_item_id;
63 }
64
65 void initNumbering(const IdType3& nitems_dir, Integer dimension, IdType first_item_id = 0)
66 {
67 m_dimension = dimension;
68 m_nitems = 1;
69 m_first_item_id = first_item_id;
70
71 for (Integer d(0); d < m_dimension; ++d) {
72 m_nitems_dir[d] = nitems_dir[d];
73 m_nitems *= m_nitems_dir[d];
74 }
75
76 for (Integer d(m_dimension); d < 3; ++d) {
77 m_nitems_dir[d] = 1;
78 }
79
80 m_coef[0] = m_coef[1] = m_coef[2] = 1;
81
82 // Numerotation selon i, puis j, puis k
83 m_coef[0] = 1;
84 for (Integer d(1); d < m_dimension; ++d) {
85 m_coef[d] = m_coef[d - 1] * m_nitems_dir[d - 1];
86 }
87 }
88
90 Integer dimension() const
91 {
92 return m_dimension;
93 }
94
96 const IdType3& nbItem3() const
97 {
98 return m_nitems_dir;
99 }
100
102 // Egal à nbItem3()[dir]
103 IdType nbItemDir(Integer dir) const
104 {
105 return m_nitems_dir[dir];
106 }
107
110 {
111 return m_nitems;
112 }
113
116 {
117 return m_first_item_id;
118 }
119
121 // Egal à delta3()[dir]
122 // id(item_ijk) + deltaDir(1) = id({item_ijk[0],item_ijk[1]+1,item_ijk[0]})
123 IdType deltaDir(Integer dir) const
124 {
125 return m_coef[dir];
126 }
127
129 const IdType3& delta3() const
130 {
131 return m_coef;
132 }
133
135 ARCCORE_HOST_DEVICE inline IdType id(IdType i, IdType j, IdType k) const
136 {
137 // m_coef[0] vaut 1
138 // TODO : specialisation via template
140 if (m_dimension < 3) {
141 item_id = m_first_item_id + i /*m_coef[0]*/ + j * m_coef[1];
142 }
143 else {
144 item_id = m_first_item_id + i /*m_coef[0]*/ + j * m_coef[1] + k * m_coef[2];
145 }
146 return item_id;
147 }
148
150 inline IdType id(const IdType3& item_ijk) const
151 {
152 return id(item_ijk[0], item_ijk[1], item_ijk[2]);
153 }
154
156 // NOTE : IdxType est un triplet de Int64 alors qu'IdType peut-être un Int32 ou un Int64
157 ARCCORE_HOST_DEVICE inline IdType id(IdxType idx) const
158 {
159 return id(static_cast<IdType>(idx[0]), static_cast<IdType>(idx[1]), static_cast<IdType>(idx[2]));
160 }
161
164 {
165 item_id -= m_first_item_id;
166 // TODO : specialisation via template
167 if (m_dimension < 3) {
168 item_ijk[2] = 0;
169 item_ijk[1] = item_id / m_coef[1];
170 item_ijk[0] = item_id % m_coef[1];
171 }
172 else {
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];
177 }
178 }
179
181 ARCCORE_HOST_DEVICE IdxType ijk(IdType item_id) const
182 {
183 item_id -= m_first_item_id;
184 Int64 i, j, k;
185 // TODO : specialisation via template
186 if (m_dimension < 3) {
187 k = 0;
188 j = item_id / m_coef[1];
189 i = item_id % m_coef[1];
190 }
191 else {
192 k = item_id / m_coef[2];
193 IdType tmp = item_id % m_coef[2];
194 j = tmp / m_coef[1];
195 i = tmp % m_coef[1];
196 }
197 return { i, j, k };
198 }
199
200 // TODO : utiliser template spécialisée
203 {
204 return (item_id - m_first_item_id) % m_coef[1];
205 }
206
209 {
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]);
211 }
212
215 {
216 return (item_id - m_first_item_id) / m_coef[2];
217 }
218
219 protected:
220 Integer m_dimension = 0;
221
222 IdType3 m_nitems_dir = { 1, 1, 1 }; // Nb d'elements par direction
223 IdType m_nitems = 0; // Nb total d'elements
224
225 IdType m_first_item_id = 0;
226
227 IdType3 m_coef = { 0, 0, 0 };
228};
229
230/*---------------------------------------------------------------------------*/
231/*---------------------------------------------------------------------------*/
232
233} // namespace Arcane::CartesianMesh::V2
234
235/*---------------------------------------------------------------------------*/
236/*---------------------------------------------------------------------------*/
237
238#endif
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...
ARCCORE_HOST_DEVICE IdType id(IdType i, IdType j, IdType k) const
Passage (i,j,k) => numero.
ARCCORE_HOST_DEVICE IdType id(IdxType idx) const
Passage (i,j,k) => numero.
ARCCORE_HOST_DEVICE IdxType ijk(IdType item_id) const
Passage de numero => (i,j,k)
void ijk(IdType item_id, IdType3 &item_ijk) const
Passage de numero => (i,j,k)
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.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120