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