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