Arcane  v4.1.4.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
AMRPatchPosition.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/* AMRPatchPosition.h (C) 2000-2026 */
9/* */
10/* Position d'un patch AMR d'un maillage cartésien. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CARTESIANMESH_AMRPATCHPOSITION_H
13#define ARCANE_CARTESIANMESH_AMRPATCHPOSITION_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/cartesianmesh/CartesianMeshGlobal.h"
18#include "arcane/utils/Vector3.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23namespace Arcane
24{
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29/*!
30 * \ingroup ArcaneCartesianMesh
31 * \brief Classe permettant de définir la position d'un patch dans le maillage
32 * cartésien.
33 *
34 * La position d'un patch est désigné par la position de deux mailles dans la
35 * grille. La position "min" et la position "max" forment une boite englobante.
36 *
37 * \warning La maille à la position "min" est incluse dans la boite, mais la
38 * maille à la position "max" est exclue.
39 *
40 * \note La position du patch est globale pour le maillage cartesien. Le
41 * découpage en sous-domaine n'est pas pris en compte (exemple avec la méthode
42 * \a nbCells() de cette classe qui donne le nombre de mailles du patch sans
43 * tenir compte des sous-domaines).
44 *
45 * Les positions des mailles peuvent être obtenues par le
46 * CartesianMeshNumberingMng.
47 *
48 * \warning Cette classe est valide uniquement pour un pattern de raffinement de
49 * 2 (modifier ça ne devrait pas être complexe, si besoin).
50 */
51class ARCANE_CARTESIANMESH_EXPORT AMRPatchPosition
52{
53 public:
54
55 /*!
56 * \brief Constructeur pour une position nulle.
57 * Une position nulle est définie par un level = -2.
58 */
60 AMRPatchPosition(Int32 level, CartCoord3 min_point, CartCoord3 max_point, Int32 overlap_layer_size);
61
62 /*!
63 * \brief Constructeur de copie.
64 * \param src La position à copier.
65 */
67 AMRPatchPosition& operator=(const AMRPatchPosition&) = default;
68
70
71 public:
72
73 bool operator==(const AMRPatchPosition& other) const = default;
74
75 public:
76
77 /*!
78 * \brief Méthode permettant de récupérer le niveau du patch.
79 * \return Le niveau du patch.
80 */
81 Int32 level() const;
82
83 /*!
84 * \brief Méthode permettant de définir le niveau du patch.
85 * \param level Le niveau du patch.
86 */
87 void setLevel(Int32 level);
88
89 /*!
90 * \brief Méthode permettant de récupérer la position min de la boite
91 * englobante.
92 *
93 * \return La position min.
94 */
95 CartCoord3 minPoint() const;
96
97 /*!
98 * \brief Méthode permettant de définir la position min de la boite
99 * englobante.
100 * \param min_point la position min.
101 */
102 void setMinPoint(CartCoord3 min_point);
103
104 /*!
105 * \brief Méthode permettant de récupérer la position max de la boite
106 * englobante.
107 *
108 * \return La position max.
109 */
110 CartCoord3 maxPoint() const;
111
112 /*!
113 * \brief Méthode permettant de définir la position max de la boite
114 * englobante.
115 * \param max_point la position max.
116 */
117 void setMaxPoint(CartCoord3 max_point);
118
119 /*!
120 * \brief Méthode permettant de récupérer le nombre de couches de mailles de
121 * recouvrement du patch.
122 *
123 * \return le nombre de couches de mailles de recouvrement
124 */
125 Int32 overlapLayerSize() const;
126
127 /*!
128 * \brief Méthode permettant de définir le nombre de couches de mailles de
129 * recouvrement du patch.
130 * \param layer_size le nombre de couches de mailles de recouvrement
131 */
132 void setOverlapLayerSize(Int32 layer_size);
133
134 /*!
135 * \brief Méthode permettant de récupérer la position min de la boite
136 * englobante en incluant la couche de mailles de recouvrement.
137 * \return La position min avec la couche de mailles de recouvrement.
138 */
140
141 /*!
142 * \brief Méthode permettant de récupérer la position max de la boite
143 * englobante en incluant la couche de mailles de recouvrement.
144 * \return La position max avec la couche de mailles de recouvrement.
145 */
147
148 /*!
149 * \brief Méthode permettant de connaitre le nombre de mailles du patch
150 * selon sa position.
151 *
152 * \warning Le nombre de mailles est calculé avec les positions min et max
153 * (sans la couche de recouvrement). Ce nombre est donc le même pour tous
154 * les sous-domaines. Attention à ne pas comparer ce nombre avec le nombre
155 * de mailles du groupe de mailles qui peut être associé à cette classe et
156 * qui peut être différent pour chaque sous-domaine.
157 *
158 * \return Le nombre de maille du patch.
159 */
160 Int64 nbCells() const;
161
162 /*!
163 * \brief Méthode permettant de découper le patch en deux patchs selon un
164 * point de découpe.
165 *
166 * \param cut_point Le point de découpe.
167 * \param dim La dimension qui doit être découpée.
168 * \return Les deux positions de patch résultant de la découpe.
169 */
170 std::pair<AMRPatchPosition, AMRPatchPosition> cut(CartCoord cut_point, Integer dim) const;
171
172 /*!
173 * \brief Méthode permettant de savoir si notre patch peut être fusionné
174 * avec \a other_patch.
175 *
176 * \param other_patch Le patch à verifier.
177 * \return True si la fusion est possible.
178 */
179 bool canBeFusion(const AMRPatchPosition& other_patch) const;
180
181 /*!
182 * \brief Méthode permettant de fusionner \a other_patch avec le nôtre.
183 *
184 * Une vérification de possibilité de fusion (via \a canBeFusion()) est
185 * réalisée avant de fusionner. Si la fusion est impossible, on retourne
186 * false. Sinon, on fusionne et on retourne true.
187 * Si fusion, \a other_patch devient null.
188 *
189 * \param other_patch Le patch avec lequel fusionner.
190 * \return true si la fusion à été réalisé, false si la fusion est
191 * impossible.
192 */
193 bool fusion(AMRPatchPosition& other_patch);
194
195 /*!
196 * \brief Méthode permettant de savoir si la position du patch est nulle.
197 *
198 * \warning On ne vérifie pas la validité de la position.
199 *
200 * \return True si le patch est nulle.
201 */
202 bool isNull() const;
203
204 /*!
205 * \brief Méthode permettant de créer un \a AMRPatchPosition pour le niveau
206 * supérieur.
207 *
208 * \param dim La dimension du maillage.
209 * \param higher_level Le plus haut niveau de raffinement du maillage.
210 * \param overlap_layer_size_top_level Le nombre de couches de mailles de
211 * recouvrement pour les patchs du plus haut niveau de raffinement.
212 * \return Un \a AMRPatchPosition de niveau supérieur.
213 */
214 AMRPatchPosition patchUp(Integer dim, Int32 higher_level, Int32 overlap_layer_size_top_level) const;
215
216 /*!
217 * \brief Méthode permettant de créer un \a AMRPatchPosition pour le niveau
218 * inférieur.
219 *
220 * Si la position min n'est pas divisible par deux, on arrondit à l'entier
221 * inférieur.
222 *
223 * Si la position max n'est pas divisible par deux, on arrondit à l'entier
224 * supérieur.
225 *
226 * Pour la couche de recouvrement, cette méthode s'assure que l'on n'aura
227 * jamais plus d'un niveau de différence entre deux mailles de niveaux
228 * différents.
229 *
230 * \warning patch.patchDown(patch.patchUp(X)) != patch et
231 * patch.patchUp(patch.patchDown(X)) != patch.
232 *
233 * \param dim La dimension du maillage.
234 * \param higher_level Le plus haut niveau de raffinement du maillage.
235 * \param overlap_layer_size_top_level Le nombre de couches de mailles de
236 * recouvrement pour les patchs du plus haut niveau de raffinement.
237 * \return Un \a AMRPatchPosition de niveau inférieur.
238 */
239 AMRPatchPosition patchDown(Integer dim, Int32 higher_level, Int32 overlap_layer_size_top_level) const;
240
241 /*!
242 * \brief Méthode permettant de connaitre la taille du patch (en nombre de
243 * mailles par direction).
244 *
245 * \return La taille du patch.
246 */
247 CartCoord3 length() const;
248
249 /*!
250 * \brief Méthode permettant de savoir si une maille de position x,y,z est
251 * incluse dans ce patch.
252 *
253 * Pour inclure la couche de recouvrement, utiliser la méthode
254 * \a isInWithOverlap().
255 *
256 * \param x Position X de la maille.
257 * \param y Position Y de la maille.
258 * \param z Position Z de la maille.
259 *
260 * \return True si la maille est dans le patch.
261 */
262 bool isIn(CartCoord x, CartCoord y, CartCoord z) const;
263
264 /*!
265 * \brief Méthode permettant de savoir si une maille est incluse dans ce
266 * patch.
267 *
268 * Pour inclure la couche de recouvrement, utiliser la méthode
269 * \a isInWithOverlap().
270 *
271 * \param coord Position de la maille.
272 *
273 * \return True si la maille est dans le patch.
274 */
275 bool isIn(CartCoord3 coord) const;
276
277 /*!
278 * \brief Méthode permettant de savoir si une maille de position x,y,z est
279 * incluse dans ce patch avec couche de recouvrement.
280 *
281 * \param x Position X de la maille.
282 * \param y Position Y de la maille.
283 * \param z Position Z de la maille.
284 *
285 * \return True si la maille est dans le patch.
286 */
287 bool isInWithOverlap(CartCoord x, CartCoord y, CartCoord z) const;
288
289 /*!
290 * \brief Méthode permettant de savoir si une maille est incluse dans ce
291 * patch avec couche de recouvrement.
292 *
293 * \param coord Position de la maille.
294 *
295 * \return True si la maille est dans le patch.
296 */
297 bool isInWithOverlap(CartCoord3 coord) const;
298
299 /*!
300 * \brief Méthode permettant de savoir si une maille de position x,y,z est
301 * incluse dans ce patch avec couche de recouvrement fourni en paramètre.
302 *
303 * \param x Position X de la maille.
304 * \param y Position Y de la maille.
305 * \param z Position Z de la maille.
306 * \param overlap Le nombre de mailles de recouvrement de la couche.
307 *
308 * \return True si la maille est dans le patch.
309 */
310 bool isInWithOverlap(CartCoord x, CartCoord y, CartCoord z, Integer overlap) const;
311
312 /*!
313 * \brief Méthode permettant de savoir si une maille est incluse dans ce
314 * patch avec couche de recouvrement fourni en paramètre.
315 *
316 * \param coord Position de la maille.
317 * \param overlap Le nombre de mailles de recouvrement de la couche.
318 *
319 * \return True si la maille est dans le patch.
320 */
321 bool isInWithOverlap(CartCoord3 coord, Integer overlap) const;
322
323 /*!
324 * \brief Méthode permettant de savoir si notre patch est en contact avec le
325 * patch \a other.
326 *
327 * \param other Le patch à verifier.
328 * \return True si les patchs sont en contact.
329 */
330 bool haveIntersection(const AMRPatchPosition& other) const;
331
332 /*!
333 * \brief Méthode permettant de calculer le nombre de couches de mailles de
334 * recouvrement pour un niveau donné.
335 *
336 * \param level Le niveau demandé.
337 * \param higher_level Le plus haut niveau de raffinement.
338 * \param overlap_layer_size_top_level Le nombre de couches pour le plus
339 * haut niveau de raffinement.
340 * \return Le nombre de couches de mailles de recouvrement pour le niveau
341 * demandé.
342 */
343 static Int32 computeOverlapLayerSize(Int32 level, Int32 higher_level, Int32 overlap_layer_size_top_level);
344
345 /*!
346 * \brief Méthode permettant de calculer le nombre de couches de mailles de
347 * recouvrement pour notre patch.
348 *
349 * \param higher_level Le plus haut niveau de raffinement.
350 * \param overlap_layer_size_top_level Le nombre de couches pour le plus
351 * haut niveau de raffinement.
352 */
353 void computeOverlapLayerSize(Int32 higher_level, Int32 overlap_layer_size_top_level);
354
355 private:
356
357 Int32 m_level;
358 CartCoord3 m_min_point;
359 CartCoord3 m_max_point;
360 Int32 m_overlap_layer_size;
361};
362
363/*---------------------------------------------------------------------------*/
364/*---------------------------------------------------------------------------*/
365
366} // End namespace Arcane
367
368/*---------------------------------------------------------------------------*/
369/*---------------------------------------------------------------------------*/
370
371#endif
372
AMRPatchPosition patchUp(Integer dim, Int32 higher_level, Int32 overlap_layer_size_top_level) const
Méthode permettant de créer un AMRPatchPosition pour le niveau supérieur.
bool isInWithOverlap(CartCoord x, CartCoord y, CartCoord z) const
Méthode permettant de savoir si une maille de position x,y,z est incluse dans ce patch avec couche de...
CartCoord3 minPointWithOverlap() const
Méthode permettant de récupérer la position min de la boite englobante en incluant la couche de maill...
AMRPatchPosition patchDown(Integer dim, Int32 higher_level, Int32 overlap_layer_size_top_level) const
Méthode permettant de créer un AMRPatchPosition pour le niveau inférieur.
bool isIn(CartCoord x, CartCoord y, CartCoord z) const
Méthode permettant de savoir si une maille de position x,y,z est incluse dans ce patch.
bool canBeFusion(const AMRPatchPosition &other_patch) const
Méthode permettant de savoir si notre patch peut être fusionné avec other_patch.
static Int32 computeOverlapLayerSize(Int32 level, Int32 higher_level, Int32 overlap_layer_size_top_level)
Méthode permettant de calculer le nombre de couches de mailles de recouvrement pour un niveau donné.
bool fusion(AMRPatchPosition &other_patch)
Méthode permettant de fusionner other_patch avec le nôtre.
CartCoord3 minPoint() const
Méthode permettant de récupérer la position min de la boite englobante.
void setMinPoint(CartCoord3 min_point)
Méthode permettant de définir la position min de la boite englobante.
CartCoord3 length() const
Méthode permettant de connaitre la taille du patch (en nombre de mailles par direction).
AMRPatchPosition()
Constructeur pour une position nulle. Une position nulle est définie par un level = -2.
void setLevel(Int32 level)
Méthode permettant de définir le niveau du patch.
bool isNull() const
Méthode permettant de savoir si la position du patch est nulle.
CartCoord3 maxPointWithOverlap() const
Méthode permettant de récupérer la position max de la boite englobante en incluant la couche de maill...
CartCoord3 maxPoint() const
Méthode permettant de récupérer la position max de la boite englobante.
bool haveIntersection(const AMRPatchPosition &other) const
Méthode permettant de savoir si notre patch est en contact avec le patch other.
Int64 nbCells() const
Méthode permettant de connaitre le nombre de mailles du patch selon sa position.
Int32 overlapLayerSize() const
Méthode permettant de récupérer le nombre de couches de mailles de recouvrement du patch.
void setOverlapLayerSize(Int32 layer_size)
Méthode permettant de définir le nombre de couches de mailles de recouvrement du patch.
Int32 level() const
Méthode permettant de récupérer le niveau du patch.
std::pair< AMRPatchPosition, AMRPatchPosition > cut(CartCoord cut_point, Integer dim) const
Méthode permettant de découper le patch en deux patchs selon un point de découpe.
void setMaxPoint(CartCoord3 max_point)
Méthode permettant de définir la position max de la boite englobante.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 CartCoord
Représente une coordonnée d'un élément dans la grille cartésienne (en X ou en Y ou en Z).
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
std::int32_t Int32
Type entier signé sur 32 bits.
Int32x3 CartCoord3
Représente les coordonnées 3D d'un élément dans la grille cartésienne {x, y, z}.