Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
src/arcane/cartesianmesh/CartesianConnectivity.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/* CartesianConnectivity.h (C) 2000-2023 */
9/* */
10/* Informations de connectivité d'un maillage cartésien. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CARTESIANMESH_CARTESIANCONNECTIVITY_H
13#define ARCANE_CARTESIANMESH_CARTESIANCONNECTIVITY_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/TraceAccessor.h"
18#include "arcane/core/Item.h"
20#include "arcane/cartesianmesh/CartesianMeshGlobal.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30/*!
31 * \ingroup ArcaneCartesianMesh
32 * \brief Informations de connectivité d'un maillage cartésien.
33 *
34 * Comme tous les objets liés au maillage cartésien, ces instances ne
35 * sont valides que tant que la topologie du maillage n'évolue pas.
36 *
37 * Cette classe sert à la fois pour les connectivités 2D et les connectivités
38 * 3D. Les méthodes qui commencent par topZ ne sont valides que en 3D.
39 *
40 * Le nom des méthodes suit la nomenclature suivante:
41 * - topZ/.: pour la direction Z
42 * - upper/lower: pour la direction Y
43 * - left/right: pour la direction X
44 *
45 * Pour la connectivité des noeuds autour d'une maille de coordonnées (X0,Y0,Z0),
46 * le noeud de coordonnées (X,Y,Z) se récupère comme suit:
47 * - En 3D, topZ si Z>Z0, sinon pas de préfixe. en 2D, jamais de préfixe.
48 * - upper si Y>Y0, lower sinon,
49 * - right si X>X0, left sinon,
50 *
51 * Donc par exemple, si Z>Z0, Y<Y0 et X>X0, le nom de la méthode est topZLowerRight().
52 * Si Z<Z0, Y>Y0 et X>X0, le nom est upperRight().
53 *
54 * Le fonctionnement est le même pour les connectivités des mailles autour d'un noeud.
55 */
56class ARCANE_CARTESIANMESH_EXPORT CartesianConnectivity
57{
58 // NOTE: Pour l'instant, on doit conserver par entité les entités connectées par
59 // direction, car la numérotation ne permet pas de les retrouver simplement.
60 // À terme, on pourra le déduire directement.
61
63 friend class CartesianMeshImpl;
64
65 /*!
66 * \brief Type énuméré indiquant la position.
67 * \warning Les valeurs exactes ne doivent pas être utilisées car elles sont
68 * susceptibles de changer.
69 */
70 enum ePosition
71 {
72 P_UpperLeft = 0,
73 P_UpperRight = 1,
74 P_LowerRight = 2,
75 P_LowerLeft = 3,
76
77 P_TopZUpperLeft = 4,
78 P_TopZUpperRight = 5,
79 P_TopZLowerRight = 6,
80 P_TopZLowerLeft = 7
81 };
82
83 private:
84
85 //! Liste des 8 entités autout d'une autre entité
86 struct Index
87 {
88 friend class CartesianConnectivity;
89
90 private:
91
92 void fill(Int32 i) { v[0] = v[1] = v[2] = v[3] = v[4] = v[5] = v[6] = v[7] = i; }
93 Int32 v[8];
94 };
95
96 //! Permutation dans Index pour chaque direction
97 struct Permutation
98 {
99 friend class CartesianConnectivity;
100
101 public:
102
103 void compute();
104
105 private:
106
107 ePosition permutation[3][8];
108 };
109
110 public:
111
112 //! Maille en haut à gauche du noeud \a n
113 Cell upperLeft(Node n) const { return _nodeToCell(n, P_UpperLeft); }
114 //! Maille en haut à droite du noeud \a n
115 Cell upperRight(Node n) const { return _nodeToCell(n, P_UpperRight); }
116 //! Maille en bas à droite du noeud \a n
117 Cell lowerRight(Node n) const { return _nodeToCell(n, P_LowerRight); }
118 //! Maille en bas à gauche du noeud \a n
119 Cell lowerLeft(Node n) const { return _nodeToCell(n, P_LowerLeft); }
120
121 //! Maille en haut à gauche du noeud \a n
122 ARCCORE_HOST_DEVICE CellLocalId upperLeftId(NodeLocalId n) const { return _nodeToCellLocalId(n, P_UpperLeft); }
123 //! Maille en haut à droite du noeud \a n
124 ARCCORE_HOST_DEVICE CellLocalId upperRightId(NodeLocalId n) const { return _nodeToCellLocalId(n, P_UpperRight); }
125 //! Maille en bas à droite du noeud \a n
126 ARCCORE_HOST_DEVICE CellLocalId lowerRightId(NodeLocalId n) const { return _nodeToCellLocalId(n, P_LowerRight); }
127 //! Maille en bas à gauche du noeud \a n
128 ARCCORE_HOST_DEVICE CellLocalId lowerLeftId(NodeLocalId n) const { return _nodeToCellLocalId(n, P_LowerLeft); }
129
130 //! Maille en haut à gauche du noeud \a n pour la direction \a dir
131 ARCCORE_HOST_DEVICE CellLocalId upperLeftId(NodeLocalId n, Int32 dir) const { return _nodeToCellLocalId(n, dir, P_UpperLeft); }
132 //! Maille en haut à droite du noeud \a n pour la direction \a dir
133 ARCCORE_HOST_DEVICE CellLocalId upperRightId(NodeLocalId n, Int32 dir) const { return _nodeToCellLocalId(n, dir, P_UpperRight); }
134 //! Maille en bas à droite du noeud \a n pour la direction \a dir
135 ARCCORE_HOST_DEVICE CellLocalId lowerRightId(NodeLocalId n, Int32 dir) const { return _nodeToCellLocalId(n, dir, P_LowerRight); }
136 //! Maille en bas à gauche du noeud \a n pour la direction \a dir
137 ARCCORE_HOST_DEVICE CellLocalId lowerLeftId(NodeLocalId n, Int32 dir) const { return _nodeToCellLocalId(n, dir, P_LowerLeft); }
138
139 //! En 3D, maille en haut à gauche du noeud \a n
140 Cell topZUpperLeft(Node n) const { return _nodeToCell(n, P_TopZUpperLeft); }
141 //! En 3D, maille en haut à droite du noeud \a n
142 Cell topZUpperRight(Node n) const { return _nodeToCell(n, P_TopZUpperRight); }
143 //! En 3D, maille en bas à droite du noeud \a n
144 Cell topZLowerRight(Node n) const { return _nodeToCell(n, P_TopZLowerRight); }
145 //! En 3D, maille en bas à gauche du noeud \a n
146 Cell topZLowerLeft(Node n) const { return _nodeToCell(n, P_TopZLowerLeft); }
147
148 //! En 3D, maille en haut à gauche du noeud \a n
149 ARCCORE_HOST_DEVICE CellLocalId topZUpperLeftId(NodeLocalId n) const { return _nodeToCellLocalId(n, P_TopZUpperLeft); }
150 //! En 3D, maille en haut à droite du noeud \a n
151 ARCCORE_HOST_DEVICE CellLocalId topZUpperRightId(NodeLocalId n) const { return _nodeToCellLocalId(n, P_TopZUpperRight); }
152 //! En 3D, maille en bas à droite du noeud \a n
153 ARCCORE_HOST_DEVICE CellLocalId topZLowerRightId(NodeLocalId n) const { return _nodeToCellLocalId(n, P_TopZLowerRight); }
154 //! En 3D, maille en bas à gauche du noeud \a n
155 ARCCORE_HOST_DEVICE CellLocalId topZLowerLeftId(NodeLocalId n) const { return _nodeToCellLocalId(n, P_TopZLowerLeft); }
156
157 //! En 3D, maille en haut à gauche du noeud \a n pour la direction \a dir
158 ARCCORE_HOST_DEVICE CellLocalId topZUpperLeftId(NodeLocalId n, Int32 dir) const { return _nodeToCellLocalId(n, dir, P_TopZUpperLeft); }
159 //! En 3D, maille en haut à droite du noeud \a n pour la direction \a dir
160 ARCCORE_HOST_DEVICE CellLocalId topZUpperRightId(NodeLocalId n, Int32 dir) const { return _nodeToCellLocalId(n, dir, P_TopZUpperRight); }
161 //! En 3D, maille en bas à droite du noeud \a n pour la direction \a dir
162 ARCCORE_HOST_DEVICE CellLocalId topZLowerRightId(NodeLocalId n, Int32 dir) const { return _nodeToCellLocalId(n, dir, P_TopZLowerRight); }
163 //! En 3D, maille en bas à gauche du noeud \a n pour la direction \a dir
164 ARCCORE_HOST_DEVICE CellLocalId topZLowerLeftId(NodeLocalId n, Int32 dir) const { return _nodeToCellLocalId(n, dir, P_TopZLowerLeft); }
165
166 //! Noeud en haut à gauche de la maille \a c
167 Node upperLeft(Cell c) const { return _cellToNode(c, P_UpperLeft); }
168 //! Noeud en haut à droite de la maille \a c
169 Node upperRight(Cell c) const { return _cellToNode(c, P_UpperRight); }
170 //! Noeud en bas à droite de la maille \a c
171 Node lowerRight(Cell c) const { return _cellToNode(c, P_LowerRight); }
172 //! Noeud en bad à gauche de la maille \a c
173 Node lowerLeft(Cell c) const { return _cellToNode(c, P_LowerLeft); }
174
175 //! Noeud en haut à gauche de la maille \a c
176 ARCCORE_HOST_DEVICE NodeLocalId upperLeftId(CellLocalId c) const { return _cellToNodeLocalId(c, P_UpperLeft); }
177 //! Noeud en haut à droite de la maille \a c
178 ARCCORE_HOST_DEVICE NodeLocalId upperRightId(CellLocalId c) const { return _cellToNodeLocalId(c, P_UpperRight); }
179 //! Noeud en bas à droite de la maille \a c
180 ARCCORE_HOST_DEVICE NodeLocalId lowerRightId(CellLocalId c) const { return _cellToNodeLocalId(c, P_LowerRight); }
181 //! Noeud en bad à gauche de la maille \a c
182 ARCCORE_HOST_DEVICE NodeLocalId lowerLeftId(CellLocalId c) const { return _cellToNodeLocalId(c, P_LowerLeft); }
183
184 //! Noeud en haut à gauche de la maille \a c pour la direction \a dir
185 ARCCORE_HOST_DEVICE NodeLocalId upperLeftId(CellLocalId c, Int32 dir) const { return _cellToNodeLocalId(c, dir, P_UpperLeft); }
186 //! Noeud en haut à droite de la maille \a c pour la direction \a dir
187 ARCCORE_HOST_DEVICE NodeLocalId upperRightId(CellLocalId c, Int32 dir) const { return _cellToNodeLocalId(c, dir, P_UpperRight); }
188 //! Noeud en bas à droite de la maille \a c pour la direction \a dir
189 ARCCORE_HOST_DEVICE NodeLocalId lowerRightId(CellLocalId c, Int32 dir) const { return _cellToNodeLocalId(c, dir, P_LowerRight); }
190 //! Noeud en bad à gauche de la maille \a c pour la direction \a dir
191 ARCCORE_HOST_DEVICE NodeLocalId lowerLeftId(CellLocalId c, Int32 dir) const { return _cellToNodeLocalId(c, dir, P_LowerLeft); }
192
193 //! En 3D, noeud au dessus en haut à gauche de la maille \a c
194 Node topZUpperLeft(Cell c) const { return _cellToNode(c, P_TopZUpperLeft); }
195 //! En 3D, noeud au dessus en haut à droite de la maille \a c
196 Node topZUpperRight(Cell c) const { return _cellToNode(c, P_TopZUpperRight); }
197 //! En 3D, noeud au dessus en bas à droite de la maille \a c
198 Node topZLowerRight(Cell c) const { return _cellToNode(c, P_TopZLowerRight); }
199 //! En 3D, noeud au dessus en bas à gauche de la maille \a c
200 Node topZLowerLeft(Cell c) const { return _cellToNode(c, P_TopZLowerLeft); }
201
202 //! En 3D, noeud au dessus en haut à gauche de la maille \a c
203 ARCCORE_HOST_DEVICE NodeLocalId topZUpperLeftId(CellLocalId c) const { return _cellToNodeLocalId(c, P_TopZUpperLeft); }
204 //! En 3D, noeud au dessus en haut à droite de la maille \a c
205 ARCCORE_HOST_DEVICE NodeLocalId topZUpperRightId(CellLocalId c) const { return _cellToNodeLocalId(c, P_TopZUpperRight); }
206 //! En 3D, noeud au dessus en bas à droite de la maille \a c
207 ARCCORE_HOST_DEVICE NodeLocalId topZLowerRightId(CellLocalId c) const { return _cellToNodeLocalId(c, P_TopZLowerRight); }
208 //! En 3D, noeud au dessus en bas à gauche de la maille \a c
209 ARCCORE_HOST_DEVICE NodeLocalId topZLowerLeftId(CellLocalId c) const { return _cellToNodeLocalId(c, P_TopZLowerLeft); }
210
211 //! En 3D, noeud au dessus en haut à gauche de la maille \a c pour la direction \a dir
212 ARCCORE_HOST_DEVICE NodeLocalId topZUpperLeftId(CellLocalId c, Int32 dir) const { return _cellToNodeLocalId(c, dir, P_TopZUpperLeft); }
213 //! En 3D, noeud au dessus en haut à droite de la maille \a c pour la direction \a dir
214 ARCCORE_HOST_DEVICE NodeLocalId topZUpperRightId(CellLocalId c, Int32 dir) const { return _cellToNodeLocalId(c, dir, P_TopZUpperRight); }
215 //! En 3D, noeud au dessus en bas à droite de la maille \a c pour la direction \a dir
216 ARCCORE_HOST_DEVICE NodeLocalId topZLowerRightId(CellLocalId c, Int32 dir) const { return _cellToNodeLocalId(c, dir, P_TopZLowerRight); }
217 //! En 3D, noeud au dessus en bas à gauche de la maille \a c pour la direction \a dir
218 ARCCORE_HOST_DEVICE NodeLocalId topZLowerLeftId(CellLocalId c, Int32 dir) const { return _cellToNodeLocalId(c, dir, P_TopZLowerLeft); }
219
220 private:
221
222 //! Calcule les infos de connectivité.
223 void _computeInfos(IMesh* mesh, VariableNodeReal3& nodes_coord, VariableCellReal3& cells_coord);
224 //! Positionne les tableaux contenant les infos de connectivité
225 void _setStorage(ArrayView<Index> nodes_to_cell, ArrayView<Index> cells_to_node,
226 const Permutation* permutation);
227
228 private:
229
230 ARCCORE_HOST_DEVICE CellLocalId _nodeToCellLocalId(NodeLocalId n, ePosition p) const
231 {
232 return CellLocalId(m_nodes_to_cell[n].v[p]);
233 }
234 ARCCORE_HOST_DEVICE NodeLocalId _cellToNodeLocalId(CellLocalId c, ePosition p) const
235 {
236 return NodeLocalId(m_cells_to_node[c].v[p]);
237 }
238 ARCCORE_HOST_DEVICE CellLocalId _nodeToCellLocalId(NodeLocalId n, Int32 dir, ePosition p) const
239 {
240 ARCCORE_CHECK_AT(dir, 3);
241 return _nodeToCellLocalId(n, m_permutation->permutation[dir][p]);
242 }
243 ARCCORE_HOST_DEVICE NodeLocalId _cellToNodeLocalId(CellLocalId c, Int32 dir, ePosition p) const
244 {
245 ARCCORE_CHECK_AT(dir, 3);
246 return _cellToNodeLocalId(c, m_permutation->permutation[dir][p]);
247 }
248 Cell _nodeToCell(Node n, ePosition p) const { return m_cells[m_nodes_to_cell[n.localId()].v[p]]; }
249 Node _cellToNode(Cell c, ePosition p) const { return m_nodes[m_cells_to_node[c.localId()].v[p]]; }
250
251 private:
252
253 // Ces deux méthodes sont pour les tests
254 Index& _index(Node n) { return m_nodes_to_cell[n.localId()]; }
255 Index& _index(Cell c) { return m_cells_to_node[c.localId()]; }
256
257 private:
258
259 ArrayView<Index> m_nodes_to_cell;
260 ArrayView<Index> m_cells_to_node;
261 CellInfoListView m_cells;
262 NodeInfoListView m_nodes;
263 const Permutation* m_permutation = nullptr;
264
265 private:
266
267 void _computeInfos2D(IMesh* mesh, VariableNodeReal3& nodes_coord, VariableCellReal3& cells_coord);
268 void _computeInfos3D(IMesh* mesh, VariableNodeReal3& nodes_coord, VariableCellReal3& cells_coord);
269};
270
271/*---------------------------------------------------------------------------*/
272/*---------------------------------------------------------------------------*/
273/*!
274 * \brief Classe d'accès aux connectivités cartésiennes.
275 *
276 * \sa CartesianConnectivity.
277 */
278class ARCANE_CARTESIANMESH_EXPORT CartesianConnectivityLocalId
280{
281 private:
282
283 using Index = CartesianConnectivity::Index;
284
285 public:
286
289 {
290 }
291};
292
293/*---------------------------------------------------------------------------*/
294/*---------------------------------------------------------------------------*/
295
296} // End namespace Arcane
297
298/*---------------------------------------------------------------------------*/
299/*---------------------------------------------------------------------------*/
300
301#endif
302
Classe d'accès aux connectivités cartésiennes.
Informations de connectivité d'un maillage cartésien.
__host__ __device__ NodeLocalId upperLeftId(CellLocalId c) const
Noeud en haut à gauche de la maille c.
__host__ __device__ CellLocalId topZLowerLeftId(NodeLocalId n, Int32 dir) const
En 3D, maille en bas à gauche du noeud n pour la direction dir.
__host__ __device__ CellLocalId lowerRightId(NodeLocalId n, Int32 dir) const
Maille en bas à droite du noeud n pour la direction dir.
Node topZLowerLeft(Cell c) const
En 3D, noeud au dessus en bas à gauche de la maille c.
Cell lowerRight(Node n) const
Maille en bas à droite du noeud n.
Node upperRight(Cell c) const
Noeud en haut à droite de la maille c.
__host__ __device__ NodeLocalId upperRightId(CellLocalId c, Int32 dir) const
Noeud en haut à droite de la maille c pour la direction dir.
__host__ __device__ NodeLocalId topZUpperRightId(CellLocalId c, Int32 dir) const
En 3D, noeud au dessus en haut à droite de la maille c pour la direction dir.
__host__ __device__ NodeLocalId topZUpperLeftId(CellLocalId c) const
En 3D, noeud au dessus en haut à gauche de la maille c.
__host__ __device__ NodeLocalId lowerLeftId(CellLocalId c) const
Noeud en bad à gauche de la maille c.
__host__ __device__ CellLocalId topZUpperLeftId(NodeLocalId n) const
En 3D, maille en haut à gauche du noeud n.
Cell upperLeft(Node n) const
Maille en haut à gauche du noeud n.
__host__ __device__ NodeLocalId upperRightId(CellLocalId c) const
Noeud en haut à droite de la maille c.
__host__ __device__ NodeLocalId topZLowerRightId(CellLocalId c, Int32 dir) const
En 3D, noeud au dessus en bas à droite de la maille c pour la direction dir.
Node upperLeft(Cell c) const
Noeud en haut à gauche de la maille c.
__host__ __device__ CellLocalId topZUpperLeftId(NodeLocalId n, Int32 dir) const
En 3D, maille en haut à gauche du noeud n pour la direction dir.
__host__ __device__ CellLocalId topZUpperRightId(NodeLocalId n, Int32 dir) const
En 3D, maille en haut à droite du noeud n pour la direction dir.
__host__ __device__ NodeLocalId topZLowerLeftId(CellLocalId c) const
En 3D, noeud au dessus en bas à gauche de la maille c.
Cell topZUpperRight(Node n) const
En 3D, maille en haut à droite du noeud n.
__host__ __device__ CellLocalId topZUpperRightId(NodeLocalId n) const
En 3D, maille en haut à droite du noeud n.
__host__ __device__ CellLocalId lowerLeftId(NodeLocalId n) const
Maille en bas à gauche du noeud n.
__host__ __device__ CellLocalId upperRightId(NodeLocalId n) const
Maille en haut à droite du noeud n.
__host__ __device__ NodeLocalId topZUpperRightId(CellLocalId c) const
En 3D, noeud au dessus en haut à droite de la maille c.
__host__ __device__ CellLocalId lowerRightId(NodeLocalId n) const
Maille en bas à droite du noeud n.
__host__ __device__ NodeLocalId topZLowerRightId(CellLocalId c) const
En 3D, noeud au dessus en bas à droite de la maille c.
Cell lowerLeft(Node n) const
Maille en bas à gauche du noeud n.
Cell topZLowerRight(Node n) const
En 3D, maille en bas à droite du noeud n.
__host__ __device__ NodeLocalId lowerRightId(CellLocalId c) const
Noeud en bas à droite de la maille c.
__host__ __device__ NodeLocalId lowerLeftId(CellLocalId c, Int32 dir) const
Noeud en bad à gauche de la maille c pour la direction dir.
Cell topZLowerLeft(Node n) const
En 3D, maille en bas à gauche du noeud n.
Node topZUpperRight(Cell c) const
En 3D, noeud au dessus en haut à droite de la maille c.
__host__ __device__ CellLocalId topZLowerRightId(NodeLocalId n, Int32 dir) const
En 3D, maille en bas à droite du noeud n pour la direction dir.
Node lowerLeft(Cell c) const
Noeud en bad à gauche de la maille c.
__host__ __device__ NodeLocalId topZUpperLeftId(CellLocalId c, Int32 dir) const
En 3D, noeud au dessus en haut à gauche de la maille c pour la direction dir.
Cell upperRight(Node n) const
Maille en haut à droite du noeud n.
__host__ __device__ NodeLocalId upperLeftId(CellLocalId c, Int32 dir) const
Noeud en haut à gauche de la maille c pour la direction dir.
Node topZUpperLeft(Cell c) const
En 3D, noeud au dessus en haut à gauche de la maille c.
__host__ __device__ CellLocalId lowerLeftId(NodeLocalId n, Int32 dir) const
Maille en bas à gauche du noeud n pour la direction dir.
Node lowerRight(Cell c) const
Noeud en bas à droite de la maille c.
Node topZLowerRight(Cell c) const
En 3D, noeud au dessus en bas à droite de la maille c.
__host__ __device__ NodeLocalId lowerRightId(CellLocalId c, Int32 dir) const
Noeud en bas à droite de la maille c pour la direction dir.
Cell topZUpperLeft(Node n) const
En 3D, maille en haut à gauche du noeud n.
__host__ __device__ CellLocalId upperLeftId(NodeLocalId n, Int32 dir) const
Maille en haut à gauche du noeud n pour la direction dir.
__host__ __device__ NodeLocalId topZLowerLeftId(CellLocalId c, Int32 dir) const
En 3D, noeud au dessus en bas à gauche de la maille c pour la direction dir.
__host__ __device__ CellLocalId topZLowerRightId(NodeLocalId n) const
En 3D, maille en bas à droite du noeud n.
__host__ __device__ CellLocalId topZLowerLeftId(NodeLocalId n) const
En 3D, maille en bas à gauche du noeud n.
__host__ __device__ CellLocalId upperLeftId(NodeLocalId n) const
Maille en haut à gauche du noeud n.
__host__ __device__ CellLocalId upperRightId(NodeLocalId n, Int32 dir) const
Maille en haut à droite du noeud n pour la direction dir.
Infos spécifiques à un maillage cartésien.
Maille d'un maillage.
Definition Item.h:1178
Noeud d'un maillage.
Definition Dom.h:204
Vue modifiable d'un tableau d'un type T.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-