Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
CartesianGridDimension.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 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/* CartesianMeshDimension.h (C) 2000-2023 */
9/* */
10/* Informations sur les dimensions d'une grille cartésienne. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_CARTESIANGRIDDIMENSION_H
13#define ARCANE_CORE_CARTESIANGRIDDIMENSION_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Vector3.h"
18#include "arcane/utils/Vector2.h"
19
21
22#include <array>
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane
28{
29
30// Temporaire pour les classes friend
31namespace mesh
32{
33 class DynamicMeshCartesian2DBuilder;
34 class DynamicMeshCartesian3DBuilder;
35 class CartesianFaceUniqueIdBuilder;
36} // namespace mesh
37
38/*---------------------------------------------------------------------------*/
39/*---------------------------------------------------------------------------*/
40/*!
41 * \brief Informations sur les dimensions d'une grille cartésienne.
42 *
43 * Cette classe permet d'obtenir à partir du nombre de mailles dans
44 * chaque direction les différentes informations sur les dimensions
45 * du maillage.
46 */
47class ARCANE_CORE_EXPORT CartesianGridDimension
48{
49 friend mesh::DynamicMeshCartesian2DBuilder;
50 friend mesh::DynamicMeshCartesian3DBuilder;
51 friend mesh::CartesianFaceUniqueIdBuilder;
52 friend class CartesianMeshUniqueIdRenumbering;
53 friend class CartesianMeshCoarsening;
54 friend class CartesianMeshCoarsening2;
55
56 private:
57
58 /*!
59 * \brief Classe pour calculer en 2D le uniqueId() d'un noeud en fonction
60 * de sa position dans la grille.
61 */
62 class NodeUniqueIdComputer2D
63 {
64 public:
65
66 NodeUniqueIdComputer2D(Int64 base_offset, Int64 nb_node_x)
67 : m_base_offset(base_offset)
68 , m_nb_node_x(nb_node_x)
69 {}
70
71 public:
72
73 Int64 compute(Int64 x, Int64 y)
74 {
75 return m_base_offset + x + y * m_nb_node_x;
76 }
77
78 std::array<Int64, 4> computeForCell(Int64 x, Int64 y)
79 {
80 std::array<Int64, 4> node_uids;
81 node_uids[0] = compute(x + 0, y + 0);
82 node_uids[1] = compute(x + 1, y + 0);
83 node_uids[2] = compute(x + 1, y + 1);
84 node_uids[3] = compute(x + 0, y + 1);
85 return node_uids;
86 }
87
88 private:
89
90 Int64 m_base_offset;
91 Int64 m_nb_node_x;
92 };
93
94 /*!
95 * \brief Classe pour calculer en 2D le uniqueId() d'une maille en fonction
96 * de sa position dans la grille.
97 */
98 class CellUniqueIdComputer2D
99 {
100 public:
101
102 CellUniqueIdComputer2D(Int64 base_offset, Int64 all_nb_cell_x)
103 : m_base_offset(base_offset)
104 , m_all_nb_cell_x(all_nb_cell_x)
105 {}
106
107 public:
108
109 Int64 compute(Int64 x, Int64 y)
110 {
111 return m_base_offset + x + y * m_all_nb_cell_x;
112 }
113 Int64x3 compute(Int64 unique_id)
114 {
115 Int64 uid = unique_id - m_base_offset;
116 const Int64 y = uid / m_all_nb_cell_x;
117 const Int64 x = uid % m_all_nb_cell_x;
118 return Int64x3(x, y, 0);
119 }
120
121 private:
122
123 Int64 m_base_offset;
124 Int64 m_all_nb_cell_x;
125 };
126
127 /*!
128 * \brief Classe pour calculer en 2D le uniqueId() d'une face en fonction
129 * de sa position dans la grille.
130 */
131 class FaceUniqueIdComputer2D
132 {
133 public:
134
135 FaceUniqueIdComputer2D(Int64 base_offset, Int64 nb_cell_x, Int64 nb_face_x, Int64 nb_face_dir_x)
136 : m_base_offset(base_offset)
137 , m_nb_cell_x(nb_cell_x)
138 , m_nb_face_x(nb_face_x)
139 , m_nb_face_dir_x(nb_face_dir_x)
140 {}
141
142 public:
143
144 //! Calcule les uniqueIds() des 4 faces de la mailles de coordonnées topologique (x,y)
145 std::array<Int64, 4> computeForCell(Int64 x, Int64 y)
146 {
147 std::array<Int64, 4> face_uids;
148
149 // Faces selon Y
150 face_uids[0] = m_base_offset + (x + 0) + ((y + 0) * m_nb_cell_x) + m_nb_face_dir_x;
151 face_uids[2] = m_base_offset + (x + 0) + ((y + 1) * m_nb_cell_x) + m_nb_face_dir_x;
152
153 // Faces selon X
154 face_uids[1] = m_base_offset + (x + 1) + (y + 0) * m_nb_face_x;
155 face_uids[3] = m_base_offset + (x + 0) + (y + 0) * m_nb_face_x;
156
157 return face_uids;
158 }
159
160 private:
161
162 Int64 m_base_offset;
163 Int64 m_nb_cell_x;
164 Int64 m_nb_face_x;
165 Int64 m_nb_face_dir_x;
166 };
167
168 /*!
169 * \brief Classe pour calculer en 3D le uniqueId() d'un noeud en fonction
170 * de sa position dans la grille.
171 */
172 class NodeUniqueIdComputer3D
173 {
174 public:
175
176 NodeUniqueIdComputer3D(Int64 base_offset, Int64 nb_node_x, Int64 nb_node_xy)
177 : m_base_offset(base_offset)
178 , m_nb_node_x(nb_node_x)
179 , m_nb_node_xy(nb_node_xy)
180 {}
181
182 public:
183
184 Int64 compute(Int64 x, Int64 y, Int64 z)
185 {
186 return m_base_offset + x + y * m_nb_node_x + z * m_nb_node_xy;
187 }
188
189 std::array<Int64, 8> computeForCell(Int64 x, Int64 y, Int64 z)
190 {
191 std::array<Int64, 8> node_uids;
192 node_uids[0] = compute(x + 0, y + 0, z + 0);
193 node_uids[1] = compute(x + 1, y + 0, z + 0);
194 node_uids[2] = compute(x + 1, y + 1, z + 0);
195 node_uids[3] = compute(x + 0, y + 1, z + 0);
196 node_uids[4] = compute(x + 0, y + 0, z + 1);
197 node_uids[5] = compute(x + 1, y + 0, z + 1);
198 node_uids[6] = compute(x + 1, y + 1, z + 1);
199 node_uids[7] = compute(x + 0, y + 1, z + 1);
200 return node_uids;
201 }
202
203 private:
204
205 Int64 m_base_offset;
206 Int64 m_nb_node_x;
207 Int64 m_nb_node_xy;
208 };
209
210 /*!
211 * \brief Classe pour calculer en 3D le uniqueId() d'une maille en fonction
212 * de sa position dans la grille.
213 */
214 class CellUniqueIdComputer3D
215 {
216 public:
217
218 CellUniqueIdComputer3D(Int64 base_offset, Int64 all_nb_cell_x, Int64 all_nb_cell_xy)
219 : m_base_offset(base_offset)
220 , m_all_nb_cell_x(all_nb_cell_x)
221 , m_all_nb_cell_xy(all_nb_cell_xy)
222 {}
223
224 public:
225
226 //! Calcul le uniqueId() en fonction des coordonnées
227 Int64 compute(Int64 x, Int64 y, Int64 z)
228 {
229 return m_base_offset + x + y * m_all_nb_cell_x + z * m_all_nb_cell_xy;
230 }
231 //! Calcul les coordonnées en fonction du uniqueId().
232 Int64x3 compute(Int64 unique_id)
233 {
234 Int64 uid = unique_id - m_base_offset;
235 Int64 z = uid / m_all_nb_cell_xy;
236 Int64 v = uid - (z * m_all_nb_cell_xy);
237 Int64 y = v / m_all_nb_cell_x;
238 Int64 x = v % m_all_nb_cell_x;
239 return Int64x3(x, y, z);
240 }
241
242 private:
243
244 Int64 m_base_offset;
245 Int64 m_all_nb_cell_x;
246 Int64 m_all_nb_cell_xy;
247 };
248
249 /*!
250 * \brief Classe pour calculer en 2D le uniqueId() d'une face en fonction
251 * de sa position dans la grille.
252 */
253 class FaceUniqueIdComputer3D
254 {
255 public:
256
257 FaceUniqueIdComputer3D(Int64 base_offset, Int64 nb_cell_x, Int64 nb_face_x, Int64x3 nb_face_dir,
258 Int64 total_nb_face_xy, Int64 total_nb_face_x)
259 : m_base_offset(base_offset)
260 , m_nb_cell_x(nb_cell_x)
261 , m_nb_face_x(nb_face_x)
262 , m_nb_face_dir(nb_face_dir)
263 , m_total_nb_face_xy(total_nb_face_xy)
264 , m_total_nb_face_x(total_nb_face_x)
265 {}
266
267 public:
268
269 //! Calcule les uniqueIds() des 6 faces de la mailles de coordonnées topologique (x,y,z)
270 std::array<Int64, 6> computeForCell(Int64 x, Int64 y, Int64 z)
271 {
272 std::array<Int64, 6> face_uids;
273
274 // Faces selon Z
275 face_uids[0] = (x + 0) + ((y + 0) * m_nb_cell_x) + ((z + 0) * m_nb_face_dir.z) + m_total_nb_face_xy;
276 face_uids[3] = (x + 0) + ((y + 0) * m_nb_cell_x) + ((z + 1) * m_nb_face_dir.z) + m_total_nb_face_xy;
277
278 // Faces selon X
279 face_uids[1] = (x + 0) + ((y + 0) * m_nb_face_x) + ((z + 0) * m_nb_face_dir.x);
280 face_uids[4] = (x + 1) + ((y + 0) * m_nb_face_x) + ((z + 0) * m_nb_face_dir.x);
281
282 // Faces selon Y
283 face_uids[2] = (x + 0) + ((y + 0) * m_nb_cell_x) + ((z + 0) * m_nb_face_dir.y) + m_total_nb_face_x;
284 face_uids[5] = (x + 0) + ((y + 1) * m_nb_cell_x) + ((z + 0) * m_nb_face_dir.y) + m_total_nb_face_x;
285
286 for (Int32 i = 0; i < 6; ++i)
287 face_uids[i] += m_base_offset;
288
289 return face_uids;
290 }
291
292 private:
293
294 Int64 m_base_offset;
295 Int64 m_nb_cell_x;
296 Int64 m_nb_face_x;
297 Int64x3 m_nb_face_dir;
298 Int64 m_total_nb_face_xy;
299 Int64 m_total_nb_face_x;
300 };
301
302 public:
303
304 CartesianGridDimension() = default;
305 //! Construit une grille 2D de dimension (nb_cell_x,nb_cell_y)
306 CartesianGridDimension(Int64 nb_cell_x, Int64 nb_cell_y);
307 //! Construit une grille 3D de dimension (nb_cell_x,nb_cell_y,nb_cell_z)
308 CartesianGridDimension(Int64 nb_cell_x, Int64 nb_cell_y, Int64 nb_cell_z);
309 //! Construit une grille 2D de dimension \a dims
310 explicit CartesianGridDimension(const Int64x2& dims);
311 //! Construit une grille 3D de dimension \a dims
312 explicit CartesianGridDimension(const Int64x3& dims);
313 //! Construit une grille 2D de dimension \a dims
314 explicit CartesianGridDimension(const Int32x2& dims);
315 //! Construit une grille 3D de dimension \a dims
316 explicit CartesianGridDimension(const Int32x3& dims);
317
318 public:
319
320 //! Nombre de mailles dans chaque direction
321 constexpr Int64x3 nbCell() const { return m_nb_cell; }
322
323 //! Nombre de noeuds dans chaque direction
324 constexpr Int64x3 nbNode() const { return m_nb_node; }
325
326 //! Nombre de faces dans chaque direction
327 constexpr Int64x3 nbFace() const { return m_nb_face; }
328
329 //! Nombre total de faces parallèles à une direction donnée
330 constexpr Int64x3 nbFaceParallelToDirection() const { return m_nb_face_oriented; }
331
332 //! Nombre total de mailles
333 constexpr Int64 totalNbCell() const { return m_total_nb_cell; }
334
335 private:
336
337 //! Instance pour calculer les uniqueId() des noeuds pour cette grille
338 NodeUniqueIdComputer2D getNodeComputer2D(Int64 offset) const
339 {
340 return { offset, m_nb_node.x };
341 }
342 //! Instance pour calculer les uniqueId() des noeuds pour cette grille
343 NodeUniqueIdComputer3D getNodeComputer3D(Int64 offset) const
344 {
345 return { offset, m_nb_node.x, m_nb_node.x * m_nb_node.y };
346 }
347 //! Instance pour calculer les uniqueId() des mailles pour cette grille
348 CellUniqueIdComputer2D getCellComputer2D(Int64 offset) const
349 {
350 return { offset, m_nb_cell.x };
351 }
352 //! Instance pour calculer les uniqueId() des mailles pour cette grille
353 CellUniqueIdComputer3D getCellComputer3D(Int64 offset) const
354 {
355 return { offset, m_nb_cell.x, m_nb_cell.x * m_nb_cell.y };
356 }
357 //! Instance pour calculer les uniqueId() des faces pour cette grille
358 FaceUniqueIdComputer2D getFaceComputer2D(Int64 offset) const
359 {
360 Int64x3 nb_face_dir = nbFaceParallelToDirection();
361 return { offset, m_nb_cell.x, m_nb_face.x, nb_face_dir.x };
362 }
363 //! Instance pour calculer les uniqueId() des faces pour cette grille
364 FaceUniqueIdComputer3D getFaceComputer3D(Int64 offset) const
365 {
366 Int64x3 nb_face_dir = nbFaceParallelToDirection();
367 Int64 total_nb_face_xy = (nb_face_dir.x + nb_face_dir.y) * m_nb_cell.z;
368 Int64 total_nb_face_x = (nb_face_dir.x * m_nb_cell.z);
369 return { offset, m_nb_cell.x, m_nb_face.x, nb_face_dir, total_nb_face_xy, total_nb_face_x };
370 }
371
372 private:
373
374 //! Nombre de mailles dans chaque direction
375 Int64x3 m_nb_cell;
376 //! Nombre de noeuds dans chaque direction
377 Int64x3 m_nb_node;
378 //! Nombre de faces dans chaque direction
379 Int64x3 m_nb_face;
380 //! Nombre total de faces dans une orientation donnée
381 Int64x3 m_nb_face_oriented;
382
383 Int64 m_nb_cell_xy = 0;
384 Int64 m_total_nb_cell = 0;
385
386 private:
387
388 void _init();
389};
390
391/*---------------------------------------------------------------------------*/
392/*---------------------------------------------------------------------------*/
393
394} // namespace Arcane
395
396/*---------------------------------------------------------------------------*/
397/*---------------------------------------------------------------------------*/
398
399#endif
Déclarations des types généraux de Arcane.
Informations sur les dimensions d'une grille cartésienne.
constexpr Int64x3 nbCell() const
Nombre de mailles dans chaque direction.
constexpr Int64 totalNbCell() const
Nombre total de mailles.
constexpr Int64x3 nbFace() const
Nombre de faces dans chaque direction.
constexpr Int64x3 nbFaceParallelToDirection() const
Nombre total de faces parallèles à une direction donnée.
constexpr Int64x3 nbNode() const
Nombre de noeuds dans chaque direction.
Déraffine un maillage cartésien par 2.
Déraffine un maillage cartésien par 2.
Classe gérant un vecteur de dimension 2 de type T.
Definition Vector2.h:36
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-