Arcane  v3.14.10.0
Documentation développeur
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{
36} // namespace mesh
37
38/*---------------------------------------------------------------------------*/
39/*---------------------------------------------------------------------------*/
47class ARCANE_CORE_EXPORT CartesianGridDimension
48{
53 friend class CartesianMeshCoarsening;
54 friend class CartesianMeshCoarsening2;
55
56 private:
57
63 {
64 public:
65
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
99 {
100 public:
101
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
132 {
133 public:
134
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
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
173 {
174 public:
175
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
215 {
216 public:
217
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
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 }
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
254 {
255 public:
256
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
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;
310 explicit CartesianGridDimension(const Int64x2& dims);
312 explicit CartesianGridDimension(const Int64x3& dims);
314 explicit CartesianGridDimension(const Int32x2& dims);
316 explicit CartesianGridDimension(const Int32x3& dims);
317
318 public:
319
321 constexpr Int64x3 nbCell() const { return m_nb_cell; }
322
324 constexpr Int64x3 nbNode() const { return m_nb_node; }
325
327 constexpr Int64x3 nbFace() const { return m_nb_face; }
328
330 constexpr Int64x3 nbFaceParallelToDirection() const { return m_nb_face_oriented; }
331
333 constexpr Int64 totalNbCell() const { return m_total_nb_cell; }
334
335 private:
336
339 {
340 return { offset, m_nb_node.x };
341 }
344 {
345 return { offset, m_nb_node.x, m_nb_node.x * m_nb_node.y };
346 }
349 {
350 return { offset, m_nb_cell.x };
351 }
354 {
355 return { offset, m_nb_cell.x, m_nb_cell.x * m_nb_cell.y };
356 }
359 {
360 Int64x3 nb_face_dir = nbFaceParallelToDirection();
361 return { offset, m_nb_cell.x, m_nb_face.x, nb_face_dir.x };
362 }
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
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.
Classe pour calculer en 2D le uniqueId() d'une maille en fonction de sa position dans la grille.
Classe pour calculer en 3D le uniqueId() d'une maille en fonction de sa position dans la grille.
Int64 compute(Int64 x, Int64 y, Int64 z)
Calcul le uniqueId() en fonction des coordonnées.
Int64x3 compute(Int64 unique_id)
Calcul les coordonnées en fonction du uniqueId().
Classe pour calculer en 2D le uniqueId() d'une face en fonction de sa position dans la grille.
std::array< Int64, 4 > computeForCell(Int64 x, Int64 y)
Calcule les uniqueIds() des 4 faces de la mailles de coordonnées topologique (x,y)
Classe pour calculer en 2D le uniqueId() d'une face en fonction de sa position dans la grille.
std::array< Int64, 6 > computeForCell(Int64 x, Int64 y, Int64 z)
Calcule les uniqueIds() des 6 faces de la mailles de coordonnées topologique (x,y,...
Classe pour calculer en 2D le uniqueId() d'un noeud en fonction de sa position dans la grille.
Classe pour calculer en 3D le uniqueId() d'un noeud en fonction de sa position dans la grille.
Informations sur les dimensions d'une grille cartésienne.
constexpr Int64x3 nbCell() const
Nombre de mailles dans chaque direction.
Int64x3 m_nb_node
Nombre de noeuds dans chaque direction.
CellUniqueIdComputer2D getCellComputer2D(Int64 offset) const
Instance pour calculer les uniqueId() des mailles pour cette grille.
Int64x3 m_nb_cell
Nombre de mailles dans chaque direction.
constexpr Int64 totalNbCell() const
Nombre total de mailles.
CellUniqueIdComputer3D getCellComputer3D(Int64 offset) const
Instance pour calculer les uniqueId() des mailles pour cette grille.
FaceUniqueIdComputer3D getFaceComputer3D(Int64 offset) const
Instance pour calculer les uniqueId() des faces pour cette grille.
Int64x3 m_nb_face_oriented
Nombre total de faces dans une orientation donnée.
NodeUniqueIdComputer3D getNodeComputer3D(Int64 offset) const
Instance pour calculer les uniqueId() des noeuds pour cette grille.
NodeUniqueIdComputer2D getNodeComputer2D(Int64 offset) const
Instance pour calculer les uniqueId() des noeuds pour cette grille.
constexpr Int64x3 nbFace() const
Nombre de faces dans chaque direction.
Int64x3 m_nb_face
Nombre de faces dans chaque direction.
constexpr Int64x3 nbFaceParallelToDirection() const
Nombre total de faces parallèles à une direction donnée.
FaceUniqueIdComputer2D getFaceComputer2D(Int64 offset) const
Instance pour calculer les uniqueId() des faces pour cette grille.
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.
Renumérotation des uniqueId() pour les maillages cartésiens.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Classe gérant un vecteur de dimension 2 de type T.
Definition Vector2.h:36
Construction des uniqueId() des faces pour un maillage cartésien.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-