Arcane  v4.1.2.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-2025 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-2025 */
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, CartCoord3Type min_point, CartCoord3Type 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 /*!
73 * \brief Méthode permettant de récupérer le niveau du patch.
74 * \return Le niveau du patch.
75 */
76 Int32 level() const;
77
78 /*!
79 * \brief Méthode permettant de définir le niveau du patch.
80 * \param level Le niveau du patch.
81 */
82 void setLevel(Int32 level);
83
84 /*!
85 * \brief Méthode permettant de récupérer la position min de la boite
86 * englobante.
87 *
88 * \return La position min.
89 */
90 CartCoord3Type minPoint() const;
91
92 /*!
93 * \brief Méthode permettant de définir la position min de la boite
94 * englobante.
95 * \param min_point la position min.
96 */
97 void setMinPoint(CartCoord3Type min_point);
98
99 /*!
100 * \brief Méthode permettant de récupérer la position max de la boite
101 * englobante.
102 *
103 * \return La position max.
104 */
105 CartCoord3Type maxPoint() const;
106
107 /*!
108 * \brief Méthode permettant de définir la position max de la boite
109 * englobante.
110 * \param max_point la position max.
111 */
112 void setMaxPoint(CartCoord3Type max_point);
113
114 /*!
115 * \brief Méthode permettant de récupérer le nombre de couches de mailles de
116 * recouvrement du patch.
117 *
118 * \return le nombre de couches de mailles de recouvrement
119 */
120 Int32 overlapLayerSize() const;
121
122 /*!
123 * \brief Méthode permettant de définir le nombre de couches de mailles de
124 * recouvrement du patch.
125 * \param layer_size le nombre de couches de mailles de recouvrement
126 */
127 void setOverlapLayerSize(Int32 layer_size);
128
129 /*!
130 * \brief Méthode permettant de récupérer la position min de la boite
131 * englobante en incluant la couche de mailles de recouvrement.
132 * \return La position min avec la couche de mailles de recouvrement.
133 */
134 CartCoord3Type minPointWithOverlap() const;
135
136 /*!
137 * \brief Méthode permettant de récupérer la position max de la boite
138 * englobante en incluant la couche de mailles de recouvrement.
139 * \return La position max avec la couche de mailles de recouvrement.
140 */
141 CartCoord3Type maxPointWithOverlap() const;
142
143 /*!
144 * \brief Méthode permettant de connaitre le nombre de mailles du patch
145 * selon sa position.
146 *
147 * \warning Le nombre de mailles est calculé avec les positions min et max
148 * (sans la couche de recouvrement). Ce nombre est donc le même pour tous
149 * les sous-domaines. Attention à ne pas comparer ce nombre avec le nombre
150 * de mailles du groupe de mailles qui peut être associé à cette classe et
151 * qui peut être différent pour chaque sous-domaine.
152 *
153 * \return Le nombre de maille du patch.
154 */
155 Int64 nbCells() const;
156
157 /*!
158 * \brief Méthode permettant de découper le patch en deux patchs selon un
159 * point de découpe.
160 *
161 * \param cut_point Le point de découpe.
162 * \param dim La dimension qui doit être découpée.
163 * \return Les deux positions de patch résultant de la découpe.
164 */
165 std::pair<AMRPatchPosition, AMRPatchPosition> cut(CartCoordType cut_point, Integer dim) const;
166
167 /*!
168 * \brief Méthode permettant de savoir si notre patch peut être fusionné
169 * avec \a other_patch.
170 *
171 * \param other_patch Le patch à verifier.
172 * \return True si la fusion est possible.
173 */
174 bool canBeFusion(const AMRPatchPosition& other_patch) const;
175
176 /*!
177 * \brief Méthode permettant de fusionner \a other_patch avec le nôtre.
178 *
179 * Une vérification de possibilité de fusion (via \a canBeFusion()) est
180 * réalisée avant de fusionner. Si la fusion est impossible, on retourne
181 * false. Sinon, on fusionne et on retourne true.
182 *
183 * \param other_patch Le patch avec lequel fusionner.
184 * \return true si la fusion à été réalisé, false si la fusion est
185 * impossible.
186 */
187 bool fusion(const AMRPatchPosition& other_patch);
188
189 /*!
190 * \brief Méthode permettant de savoir si la position du patch est nulle.
191 *
192 * \warning On ne vérifie pas la validité de la position.
193 *
194 * \return True si le patch est nulle.
195 */
196 bool isNull() const;
197
198 /*!
199 * \brief Méthode permettant de créer un \a AMRPatchPosition pour le niveau
200 * supérieur.
201 *
202 * \param dim La dimension du maillage.
203 * \return Un \a AMRPatchPosition de niveau supérieur.
204 */
206
207 /*!
208 * \brief Méthode permettant de créer un \a AMRPatchPosition pour le niveau
209 * inférieur.
210 *
211 * Si la position min n'est pas divisible par deux, on arrondit à l'entier
212 * inférieur.
213 *
214 * Si la position max n'est pas divisible par deux, on arrondit à l'entier
215 * supérieur.
216 *
217 * Pour la couche de recouvrement, cette méthode s'assure que l'on n'aura
218 * jamais plus d'un niveau de différence entre deux mailles de niveaux
219 * différents.
220 *
221 * \warning patch.patchDown(patch.patchUp(X)) != patch et
222 * patch.patchUp(patch.patchDown(X)) != patch.
223 *
224 * \param dim La dimension du maillage.
225 * \return Un \a AMRPatchPosition de niveau inférieur.
226 */
228
229 /*!
230 * \brief Méthode permettant de connaitre la taille du patch (en nombre de
231 * mailles par direction).
232 *
233 * \return La taille du patch.
234 */
235 CartCoord3Type length() const;
236
237 /*!
238 * \brief Méthode permettant de savoir si une maille de position x,y,z est
239 * incluse dans ce patch.
240 *
241 * Pour inclure la couche de recouvrement, utiliser la méthode
242 * \a isInWithOverlap().
243 *
244 * \param x Position X de la maille.
245 * \param y Position Y de la maille.
246 * \param z Position Z de la maille.
247 *
248 * \return True si la maille est dans le patch.
249 */
250 bool isIn(CartCoordType x, CartCoordType y, CartCoordType z) const;
251
252 /*!
253 * \brief Méthode permettant de savoir si une maille est incluse dans ce
254 * patch.
255 *
256 * Pour inclure la couche de recouvrement, utiliser la méthode
257 * \a isInWithOverlap().
258 *
259 * \param coord Position de la maille.
260 *
261 * \return True si la maille est dans le patch.
262 */
263 bool isIn(CartCoord3Type coord) const;
264
265 /*!
266 * \brief Méthode permettant de savoir si une maille de position x,y,z est
267 * incluse dans ce patch avec couche de recouvrement.
268 *
269 * \param x Position X de la maille.
270 * \param y Position Y de la maille.
271 * \param z Position Z de la maille.
272 *
273 * \return True si la maille est dans le patch.
274 */
275 bool isInWithOverlap(CartCoordType x, CartCoordType y, CartCoordType z) const;
276
277 /*!
278 * \brief Méthode permettant de savoir si une maille est incluse dans ce
279 * patch avec couche de recouvrement.
280 *
281 * \param coord Position de la maille.
282 *
283 * \return True si la maille est dans le patch.
284 */
285 bool isInWithOverlap(CartCoord3Type coord) const;
286
287 /*!
288 * \brief Méthode permettant de savoir si une maille de position x,y,z est
289 * incluse dans ce patch avec couche de recouvrement fourni en paramètre.
290 *
291 * \param x Position X de la maille.
292 * \param y Position Y de la maille.
293 * \param z Position Z de la maille.
294 * \param overlap Le nombre de mailles de recouvrement de la couche.
295 *
296 * \return True si la maille est dans le patch.
297 */
298 bool isInWithOverlap(CartCoordType x, CartCoordType y, CartCoordType z, Integer overlap) const;
299
300 /*!
301 * \brief Méthode permettant de savoir si une maille est incluse dans ce
302 * patch avec couche de recouvrement fourni en paramètre.
303 *
304 * \param coord Position 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(CartCoord3Type coord, Integer overlap) const;
310
311 /*!
312 * \brief Méthode permettant de savoir si notre patch est en contact avec le
313 * patch \a other.
314 *
315 * \param other Le patch à verifier.
316 * \return True si les patchs sont en contact.
317 */
318 bool haveIntersection(const AMRPatchPosition& other) const;
319
320 private:
321
322 Int32 m_level;
323 CartCoord3Type m_min_point;
324 CartCoord3Type m_max_point;
325 Int32 m_overlap_layer_size;
326};
327
328/*---------------------------------------------------------------------------*/
329/*---------------------------------------------------------------------------*/
330
331} // End namespace Arcane
332
333/*---------------------------------------------------------------------------*/
334/*---------------------------------------------------------------------------*/
335
336#endif
337
CartCoord3Type minPointWithOverlap() const
Méthode permettant de récupérer la position min de la boite englobante en incluant la couche de maill...
CartCoord3Type length() const
Méthode permettant de connaitre la taille du patch (en nombre de mailles par direction).
void setMaxPoint(CartCoord3Type max_point)
Méthode permettant de définir la position max de la boite englobante.
bool canBeFusion(const AMRPatchPosition &other_patch) const
Méthode permettant de savoir si notre patch peut être fusionné avec other_patch.
AMRPatchPosition patchDown(Integer dim) const
Méthode permettant de créer un AMRPatchPosition pour le niveau inférieur.
AMRPatchPosition()
Constructeur pour une position nulle. Une position nulle est définie par un level = -2.
std::pair< AMRPatchPosition, AMRPatchPosition > cut(CartCoordType cut_point, Integer dim) const
Méthode permettant de découper le patch en deux patchs selon un point de découpe.
void setLevel(Int32 level)
Méthode permettant de définir le niveau du patch.
CartCoord3Type maxPoint() const
Méthode permettant de récupérer la position max de la boite englobante.
bool isNull() const
Méthode permettant de savoir si la position du patch est nulle.
void setMinPoint(CartCoord3Type min_point)
Méthode permettant de définir la position min de la boite englobante.
bool fusion(const AMRPatchPosition &other_patch)
Méthode permettant de fusionner other_patch avec le nôtre.
AMRPatchPosition patchUp(Integer dim) const
Méthode permettant de créer un AMRPatchPosition pour le niveau supérieur.
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.
bool isIn(CartCoordType x, CartCoordType y, CartCoordType z) const
Méthode permettant de savoir si une maille de position x,y,z est incluse dans ce patch.
void setOverlapLayerSize(Int32 layer_size)
Méthode permettant de définir le nombre de couches de mailles de recouvrement du patch.
bool isInWithOverlap(CartCoordType x, CartCoordType y, CartCoordType z) const
Méthode permettant de savoir si une maille de position x,y,z est incluse dans ce patch avec couche de...
Int32 level() const
Méthode permettant de récupérer le niveau du patch.
CartCoord3Type maxPointWithOverlap() const
Méthode permettant de récupérer la position max de la boite englobante en incluant la couche de maill...
CartCoord3Type minPoint() const
Méthode permettant de récupérer la position min de la boite englobante.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
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.