Arcane  v4.1.3.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
src/arcane/cartesianmesh/FaceDirectionMng.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* FaceDirectionMng.cc (C) 2000-2026 */
9/* */
10/* Infos sur les faces d'une direction X Y ou Z d'un maillage structuré. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CARTESIANMESH_FACEDIRECTIONMNG_H
13#define ARCANE_CARTESIANMESH_FACEDIRECTIONMNG_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/ArcaneTypes.h"
18#include "arcane/Item.h"
19#include "arcane/VariableTypedef.h"
20#include "arcane/ItemEnumerator.h"
21
22#include "arcane/cartesianmesh/CartesianMeshGlobal.h"
23#include "arcane/cartesianmesh/CartesianItemDirectionInfo.h"
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28namespace Arcane
29{
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33/*!
34 * \ingroup ArcaneCartesianMesh
35 * \brief Infos sur maille avant et après une face suivant une direction.
36 *
37 * Les instances de cette classe sont temporaires et construites via
38 * FaceDirectionMng::face().
39 */
40class ARCANE_CARTESIANMESH_EXPORT DirFace
41{
42 friend FaceDirectionMng;
43
44 private:
45
46 DirFace(Cell n,Cell p) : m_previous(p), m_next(n){}
47
48 public:
49
50 //! Maille avant
51 Cell previousCell() const { return m_previous; }
52 //! Maille avant
53 CellLocalId previousCellId() const { return m_previous.itemLocalId(); }
54 //! Maille après
55 Cell nextCell() const { return m_next; }
56 //! Maille après
57 CellLocalId nextCellId() const { return m_next.itemLocalId(); }
58
59 private:
60
61 Cell m_previous;
62 Cell m_next;
63};
64
65/*---------------------------------------------------------------------------*/
66/*---------------------------------------------------------------------------*/
67/*!
68 * \ingroup ArcaneCartesianMesh
69 * \brief Infos sur maille avant et après une face suivant une direction.
70 *
71 * Les instances de cette classe sont temporaires et construites via
72 * FaceDirectionMng::dirFaceId().
73 */
74class ARCANE_CARTESIANMESH_EXPORT DirFaceLocalId
75{
76 friend FaceDirectionMng;
77
78 private:
79
80 ARCCORE_HOST_DEVICE DirFaceLocalId(CellLocalId n, CellLocalId p)
81 : m_previous(p)
82 , m_next(n)
83 {}
84
85 public:
86
87 //! Maille avant
88 ARCCORE_HOST_DEVICE CellLocalId previousCell() const { return m_previous; }
89 //! Maille avant
90 ARCCORE_HOST_DEVICE CellLocalId previousCellId() const { return m_previous; }
91 //! Maille après
92 ARCCORE_HOST_DEVICE CellLocalId nextCell() const { return m_next; }
93 //! Maille après
94 ARCCORE_HOST_DEVICE CellLocalId nextCellId() const { return m_next; }
95
96 private:
97
98 CellLocalId m_previous;
99 CellLocalId m_next;
100};
101
102/*---------------------------------------------------------------------------*/
103/*---------------------------------------------------------------------------*/
104/*!
105 * \ingroup ArcaneCartesianMesh
106 * \brief Infos sur les face d'une direction spécifique X,Y ou Z
107 * d'un maillage structuré.
108 */
109class ARCANE_CARTESIANMESH_EXPORT FaceDirectionMng
110{
111 friend CartesianMeshImpl;
112 friend CartesianMeshPatch;
113 class Impl;
114
115 private:
116
117 using ItemDirectionInfo = impl::CartesianItemDirectionInfo;
118
119 public:
120
121 /*!
122 * \brief Créé une instance vide.
123 *
124 * L'instance n'est pas valide tant que _internalInit() n'a pas été appelé.
125 */
127
128 public:
129
130 //! Face direction correspondant à la face \a f.
132 {
133 return _face(f.localId());
134 }
135 //! Face direction correspondant à la face \a f.
136 DirFace face(FaceLocalId f) const
137 {
138 return _face(f.localId());
139 }
140
141 //! Face direction correspondant à la face \a f.
142 ARCCORE_HOST_DEVICE DirFaceLocalId dirFaceId(FaceLocalId f) const
143 {
144 return _dirFaceId(f);
145 }
146
147 //! Groupe de toutes les faces dans la direction.
148 FaceGroup allFaces() const;
149
150 /*!
151 * \brief Groupe de toutes les faces de recouvrement dans la direction.
152 *
153 * Ce sont toutes les faces qui ont deux mailles de recouvrement autour.
154 *
155 * 0 1 2 3 4
156 * ┌───┬──┬──┬──┬──┐
157 * │ │ │ │ │ │
158 * │ ├──┼──┼──┼──┤
159 * │ │ │ │ │ │
160 * └───┴──┴──┴──┴──┘
161 *
162 * 0 : level -1
163 * 1 et 2 : Mailles de recouvrements (overlapCells)
164 * 3 : Mailles externes (outerCells)
165 * 4 : Mailles internes (innerCells)
166 *
167 * La couche de mailles de recouvrements désigne la couche de mailles de même
168 * niveau autour du patch. Ces mailles peuvent appartenir à un ou plusieurs
169 * patchs.
170 */
171 FaceGroup overlapFaces() const;
172
173 /*!
174 * \brief Groupe de toutes les faces du patch dans la direction.
175 *
176 * Ce sont toutes les faces qui n'ont pas deux mailles de recouvrement.
177 * (`innerFaces() + outerFaces()` ou simplement `!overlapFaces()`)
178 *
179 * \warning Les faces au bord du domaine (ayant donc une seule
180 * maille "outer") sont incluses dans ce groupe. Il ne faut donc pas supposer
181 * qu'il y a deux mailles autour de chaque face de ce groupe (pour ça, il
182 * faut rester avec le groupe innerFaces()).
183 */
184 FaceGroup inPatchFaces() const;
185
186 /*!
187 * \brief Groupe de toutes les faces internes dans la direction.
188 *
189 * Une face est considérée comme interne si sa maille
190 * devant et derrière n'est pas nulle et n'est pas une maille de
191 * recouvrement.
192 */
193 FaceGroup innerFaces() const;
194
195 /*!
196 * \brief Groupe de toutes les faces externes dans la direction.
197 *
198 * Une face est considérée comme externe si sa maille
199 * devant ou derrière est de recouvrement ou est nulle (si l'on est au bord
200 * du domaine ou s'il n'y a pas de couches de mailles de recouvrements).
201 *
202 * \note Les faces entre patchs ne sont pas dupliquées. Donc certaines faces
203 * de ce groupe peuvent être aussi dans un outerFaces() d'un autre patch.
204 */
205 FaceGroup outerFaces() const;
206
207 //! Face direction correspondant à la face \a f.
209 {
210 return _face(f.localId());
211 }
212
213 //! Face direction correspondant à la face \a f.
214 DirFace operator[](FaceLocalId f) const
215 {
216 return _face(f.localId());
217 }
218
219 //! Face direction correspondant à l'itérateur de la face \a iface
221 {
222 return _face(iface.itemLocalId());
223 }
224
225 //! Valeur de la direction
227 {
228 return m_direction;
229 }
230
231 private:
232
233 //! Face direction correspondant à la face de numéro local \a local_id
234 DirFace _face(Int32 local_id) const
235 {
236 ItemDirectionInfo d = m_infos_view[local_id];
237 return DirFace(m_cells[d.m_next_lid], m_cells[d.m_previous_lid]);
238 }
239
240 //! Face direction correspondant à la face de numéro local \a local_id
241 ARCCORE_HOST_DEVICE DirFaceLocalId _dirFaceId(FaceLocalId local_id) const
242 {
243 ItemDirectionInfo d = m_infos_view[local_id];
244 return DirFaceLocalId(CellLocalId(d.m_next_lid), CellLocalId(d.m_previous_lid));
245 }
246
247 private:
248
249 /*!
250 * \internal
251 * \brief Calcule les informations sur les faces associées aux mailles de
252 * la direction \a cell_dm.
253 * Suppose que _internalInit() a été appelé.
254 */
255 void _internalComputeInfos(const CellDirectionMng& cell_dm,
256 const VariableCellReal3& cells_center,
257 const VariableFaceReal3& faces_center);
258
259 void _internalComputeInfos(const CellDirectionMng& cell_dm);
260
261 /*!
262 * \internal
263 * Initialise l'instance.
264 */
265 void _internalInit(ICartesianMesh* cm, eMeshDirection dir, Integer patch_index);
266
267 /*!
268 * \internal
269 * Détruit les ressources associées à l'instance.
270 */
271 void _internalDestroy();
272
273 /*!
274 * \brief Redimensionne le conteneur contenant les \a ItemDirectionInfo.
275 *
276 * Cela invalide les instances courantes de FaceDirectionMng.
277 */
278 void _internalResizeInfos(Int32 new_size);
279
280 void _computeCellInfos(const CellDirectionMng& cell_dm,
281 const VariableCellReal3& cells_center,
282 const VariableFaceReal3& faces_center);
283 void _computeCellInfos() const;
284 bool _hasFace(Cell cell, Int32 face_local_id) const;
285
286 private:
287
288 SmallSpan<ItemDirectionInfo> m_infos_view;
289 CellInfoListView m_cells;
290 eMeshDirection m_direction;
291 Impl* m_p;
292};
293
294/*---------------------------------------------------------------------------*/
295/*---------------------------------------------------------------------------*/
296
297} // End namespace Arcane
298
299/*---------------------------------------------------------------------------*/
300/*---------------------------------------------------------------------------*/
301
302#endif
303
Maille d'un maillage.
Definition Item.h:1214
Infos sur maille avant et après une face suivant une direction.
__host__ __device__ CellLocalId previousCellId() const
Maille avant.
__host__ __device__ CellLocalId nextCell() const
Maille après.
__host__ __device__ CellLocalId previousCell() const
Maille avant.
__host__ __device__ CellLocalId nextCellId() const
Maille après.
Infos sur maille avant et après une face suivant une direction.
CellLocalId previousCellId() const
Maille avant.
CellLocalId nextCellId() const
Maille après.
DirFace face(Face f) const
Face direction correspondant à la face f.
__host__ __device__ DirFaceLocalId dirFaceId(FaceLocalId f) const
Face direction correspondant à la face f.
DirFace operator[](FaceLocalId f) const
Face direction correspondant à la face f.
FaceDirectionMng()
Créé une instance vide.
DirFace face(FaceLocalId f) const
Face direction correspondant à la face f.
DirFace operator[](Face f) const
Face direction correspondant à la face f.
DirFace operator[](FaceEnumerator iface) const
Face direction correspondant à l'itérateur de la face iface.
eMeshDirection direction() const
Valeur de la direction.
Face d'une maille.
Definition Item.h:964
Int32 itemLocalId() const
localId() de l'entité courante.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Definition Item.h:219
Structure interne contenant l'entité devant et derriére dans une direction.
ItemGroupT< Face > FaceGroup
Groupe de faces.
Definition ItemTypes.h:178
ItemEnumeratorT< Face > FaceEnumerator
Enumérateurs sur des faces.
Definition ItemTypes.h:265
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eMeshDirection
Type de la direction pour un maillage structuré
std::int32_t Int32
Type entier signé sur 32 bits.