Arcane  v4.1.3.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
CartesianMeshAMRMng.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/* CartesianMeshAMRMng.h (C) 2000-2026 */
9/* */
10/* Gestionnaire de l'AMR pour un maillage cartésien. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#ifndef ARCANE_CARTESIANMESH_CARTESIANMESHAMRMNG_H
15#define ARCANE_CARTESIANMESH_CARTESIANMESHAMRMNG_H
16
17/*---------------------------------------------------------------------------*/
18/*---------------------------------------------------------------------------*/
19
21
22#include "arcane/cartesianmesh/CartesianMeshGlobal.h"
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane
28{
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33/*!
34 * \brief Classe permettant d'accéder aux méthodes spécifiques AMR du maillage
35 * cartesien.
36 *
37 * Une instance de cette classe est valide tant que le ICartesianMesh passé en
38 * paramètre du constructeur est valide.
39 */
40class ARCANE_CARTESIANMESH_EXPORT CartesianMeshAMRMng
41{
42 public:
43
44 /*!
45 * \brief Constructeur.
46 */
47 explicit CartesianMeshAMRMng(ICartesianMesh* cmesh);
48
49 public:
50
51 /*!
52 * \brief Nombre de patchs du maillage.
53 *
54 * Il y a toujours au moins un patch qui représente le maillage cartésien.
55 */
56 Int32 nbPatch() const;
57
58 /*!
59 * \brief Retourne le \a index-ième patch du maillage.
60 *
61 * Si le maillage est cartésien, il n'y a qu'un seul patch.
62 *
63 * L'instance retournée reste valide tant que cette instance n'est pas détruite.
64 */
65 CartesianPatch amrPatch(Int32 index) const;
66
67 /*!
68 * \brief Vue sur la liste des patchs.
69 */
71
72 /*!
73 * \brief Raffine un bloc du maillage cartésien.
74 *
75 * Cette méthode ne peut être appelée que si le maillage est un maillage
76 * AMR (IMesh::isAmrActivated()==true).
77 *
78 * Les mailles dont les positions des centres sont comprises entre
79 * \a position et \a (position+length) sont raffinées et les informations
80 * de connectivité correspondantes sont mises à jour.
81 *
82 * Cette opération est collective.
83 */
84 void refineZone(const AMRZonePosition& position) const;
85
86 /*!
87 * \brief Dé-raffine un bloc du maillage cartésien.
88 *
89 * Cette méthode ne peut être appelée que si le maillage est un maillage
90 * AMR (IMesh::isAmrActivated()==true).
91 *
92 * Les mailles dont les positions des centres sont comprises entre
93 * \a position et \a (position+length) sont dé-raffinées et les informations
94 * de connectivité correspondantes sont mises à jour.
95 *
96 * Toutes les mailles dans la zone de dé-raffinement doivent être du même
97 * niveau.
98 *
99 * Les patchs ne contenant plus de mailles après l'appel à cette méthode
100 * seront supprimés.
101 *
102 * Cette opération est collective.
103 */
104 void coarseZone(const AMRZonePosition& position) const;
105
106 /*!
107 * \brief Méthode permettant de commencer le raffinement du maillage.
108 *
109 * \warning Méthode expérimentale.
110 *
111 * Cette méthode ne peut être appelée que si le maillage est un maillage
112 * AMR (IMesh::isAmrActivated()==true) et que le type de l'AMR est 3
113 * (PatchCartesianMeshOnly).
114 *
115 * Cette méthode est la première d'un trio de méthodes nécessaires pour
116 * raffiner le maillage :
117 * - \a void beginAdaptMesh(Int32 max_nb_levels, Int32 level_to_refine_first)
118 * - \a void adaptLevel(Int32 level_to_adapt)
119 * - \a void endAdaptMesh()
120 *
121 * Cette première méthode va permettre de préparer le maillage au
122 * raffinement.
123 *
124 * Il est nécessaire de passer en paramètre de la méthode le nombre de
125 * niveaux de raffinements qui va y avoir pendant cette phase de
126 * raffinement (\a max_nb_levels).
127 *
128 * Il est recommandé de mettre le nombre exact de niveaux pour éviter un
129 * ajustement du nombre de couches de mailles de recouvrements lors de
130 * l'appel à la troisième méthode qui est couteux en calcul.
131 *
132 *
133 * Il est aussi nécessaire de passer en paramètre le premier niveau à être
134 * raffiné.
135 * Si deux niveaux sont déjà présent sur le maillage (0 et 1) et que vous
136 * souhaitez uniquement créer un troisième niveau (niveau 2) à partir du
137 * second niveau (niveau 1), vous pouvez mettre 1 au paramètre
138 * \a level_to_refine_first.
139 *
140 *
141 * Si deux niveaux sont déjà présent sur le maillage (0 et 1) et que vous
142 * souhaitez repartir de zéro, vous pouvez mettre 0 au paramètre
143 * \a level_to_refine_first.
144 * Dans ce cas, les patchs du niveau 1 seront supprimés, mais pas les
145 * mailles/faces/noeuds. Une fois les nouveaux patchs de niveau 1 créés à
146 * l'aide de la deuxième méthode, la troisième méthode s'occupera de
147 * supprimer les items en trop.
148 * Cela permet de conserver les valeurs des variables pour les
149 * mailles/faces/noeuds qui étaient dans un patch avant et qui sont
150 * conservés dans un nouveau patch.
151 *
152 *
153 * Exemple d'exécution :
154 * ```
155 * CartesianMeshAMRMng amr_mng(cmesh());
156 * amr_mng.clearRefineRelatedFlags();
157 *
158 * amr_mng.beginAdaptMesh(2, 0);
159 * for (Integer level = 0; level < 2; ++level){
160 * // Va faire ses calculs et mettre des flags II_Refine sur les mailles
161 * // du niveau level.
162 * computeInLevel(level);
163 * amr_mng.adaptLevel(level);
164 * }
165 * amr_mng.endAdaptMesh();
166 * ```
167 *
168 * Cette opération est collective.
169 *
170 * \param max_nb_levels Le nombre de niveaux de raffinement désiré.
171 * \param level_to_refine_first Le niveau qui sera raffiné en premier.
172 */
173 void beginAdaptMesh(Int32 max_nb_levels, Int32 level_to_refine_first);
174
175 /*!
176 * \brief Méthode permettant de créer un niveau de raffinement du maillage.
177 *
178 * \warning Méthode expérimentale.
179 *
180 * Cette méthode ne peut être appelée que si le maillage est un maillage
181 * AMR (IMesh::isAmrActivated()==true) et que le type de l'AMR est 3
182 * (PatchCartesianMeshOnly).
183 *
184 * Cette méthode est la seconde d'un trio de méthodes nécessaires pour
185 * raffiner le maillage :
186 * - \a void beginAdaptMesh(Int32 max_nb_levels, Int32 level_to_refine_first)
187 * - \a void adaptLevel(Int32 level_to_adapt)
188 * - \a void endAdaptMesh()
189 *
190 * Cette seconde méthode va permettre de raffiner le maillage niveau par
191 * niveau.
192 *
193 * Attention, le paramètre \a level_to_adapt désigne bien le niveau à
194 * raffiner, donc la création du niveau \a level_to_adapt +1 (si on veut
195 * raffiner le niveau 0, alors il y aura création du niveau 1).
196 *
197 * Avant d'appeler cette méthode, il faut ajouter le flag "II_Refine" sur les
198 * mailles qui doivent être raffinées, sur le niveau \a level_to_adapt uniquement.
199 * Pour être sûr de n'avoir aucun flag déjà présent sur le maillage, il est
200 * possible d'appeler la méthode \a clearRefineRelatedFlags().
201 *
202 * Pour le raffinement des mailles hors niveau 0 (ce niveau "ground" ayant
203 * un statut particulier), les mailles pouvant être raffinées doivent
204 * posséder le flag "II_InPatch". Les mailles n'ayant pas le flag
205 * "II_InPatch" ne peuvent pas être raffinés.
206 * \todo Ajouter le flag "II_InPatch" à toutes les mailles de niveau 0 ?
207 *
208 * Les mailles du niveau \a level_to_adapt déjà raffinées, mais n'ayant pas
209 * de flag "II_Refine" pourront être supprimées lors de l'appel à la
210 * troisième méthode.
211 * Cette méthode redessine les patchs et créée les nouvelles mailles enfant
212 * si nécessaire, mais ne supprime pas de mailles. La troisième méthode se
213 * chargera de supprimer toutes les mailles n'appartenant à aucun patch.
214 *
215 * Une fois cette méthode appelée, le niveau \a level_to_adapt +1 est prêt à
216 * être utilisé, notamment pour marquer les mailles "II_Refine", et rappeler
217 * cette méthode pour créer un autre niveau, &c.
218 *
219 * Cette méthode est faite pour être appelé itérativement, niveau par niveau
220 * (du niveau le plus bas au niveau le plus haut). Si des patchs de niveaux
221 * supérieurs à \a level_to_adapt sont détectés, ils seront supprimés.
222 * Il est donc possible d'appeler cette méthode pour un niveau n, puis de la
223 * rappeler pour un niveau n-1 par exemple (attention néanmoins au nombre de
224 * nouvelles mailles créées).
225 *
226 * Cette opération est collective.
227 *
228 * \param level_to_adapt Le niveau à adapter.
229 */
230 void adaptLevel(Int32 level_to_adapt) const;
231
232 /*!
233 * \brief Méthode permettant de terminer le raffinement du maillage.
234 *
235 * \warning Méthode expérimentale.
236 *
237 * Cette méthode ne peut être appelée que si le maillage est un maillage
238 * AMR (IMesh::isAmrActivated()==true) et que le type de l'AMR est 3
239 * (PatchCartesianMeshOnly).
240 *
241 * Cette méthode est la troisième d'un trio de méthodes nécessaires pour
242 * raffiner le maillage :
243 * - \a void beginAdaptMesh(Int32 max_nb_levels, Int32 level_to_refine_first)
244 * - \a void adaptLevel(Int32 level_to_adapt)
245 * - \a void endAdaptMesh()
246 *
247 * Cette troisième méthode va permettre de terminer le raffinement du
248 * maillage, notamment de supprimer les mailles n'appartenant plus à aucun patch.
249 *
250 * Si le plus haut niveau raffiné avec la seconde méthode ne correspond pas
251 * au paramètre \a max_nb_levels de la première méthode, il y aura
252 * ajustement du nombre de couches de mailles de recouvrement.
253 *
254 * Cette opération est collective.
255 */
256 void endAdaptMesh();
257
258 /*!
259 * \brief Méthode permettant de supprimer les flags liés au raffinement de
260 * toutes les mailles.
261 *
262 * Les flags concernés sont :
263 * - ItemFlags::II_Coarsen
264 * - ItemFlags::II_Refine
265 * - ItemFlags::II_JustCoarsened
266 * - ItemFlags::II_JustRefined
267 * - ItemFlags::II_JustAdded
268 * - ItemFlags::II_CoarsenInactive
269 */
270 void clearRefineRelatedFlags() const;
271
272 /*!
273 * \brief Méthode permettant de modifier le nombre de couches de mailles de
274 * recouvrement sur le niveau de raffinement le plus haut.
275 *
276 * Un appel à cette méthode va déclencher l'ajustement du nombre de couches
277 * pour tous les patchs déjà présent.
278 *
279 * Le paramètre \a new_size doit être un nombre pair (sinon, il sera modifié
280 * au nombre pair supérieur).
281 *
282 * \param new_size Le nouveau nombre de couches de mailles de recouvrement.
283 */
284 void setOverlapLayerSizeTopLevel(Int32 new_size) const;
285
286 /*!
287 * \brief Méthode permettant de désactiver les couches de mailles de
288 * recouvrement (et de les détruire si présentes).
289 *
290 * \warning Sans cette couche, il peut y avoir plus d'un niveau de
291 * raffinement entre deux mailles. C'est à l'utilisateur de gérer lui-même
292 * cette contrainte.
293 *
294 * \note Pour réactiver ces couches, un appel à
295 * \a setOverlapLayerSizeTopLevel() est suffisant.
296 */
297 void disableOverlapLayer();
298
299 /*!
300 * \brief Méthode permettant de supprimer une ou plusieurs couches
301 * de mailles fantômes sur un niveau de raffinement défini.
302 *
303 * Le nombre de couches de mailles fantômes souhaité peut être augmenté
304 * par la méthode. Il est nécessaire de récupérer la valeur retournée
305 * pour avoir le nombre de couches de mailles fantômes final.
306 *
307 * \param level Le niveau de raffinement concerné par la suppression
308 * des mailles fantômes.
309 *
310 * \param target_nb_ghost_layers Le nombre de couches souhaité après
311 * appel à cette méthode. ATTENTION : Il peut être ajusté par la méthode.
312 *
313 * \return Le nombre de couches de mailles fantômes final.
314 */
315 Integer reduceNbGhostLayers(Integer level, Integer target_nb_ghost_layers) const;
316
317 /*!
318 * \brief Méthode permettant de fusionner les patchs qui peuvent l'être.
319 *
320 * Cette méthode ne peut être appelée que si le maillage est un maillage
321 * AMR (IMesh::isAmrActivated()==true).
322 * Si le type de l'AMR n'est pas 3 (PatchCartesianMeshOnly), la méthode ne
323 * fait rien.
324 *
325 * Cette méthode peut être utile après plusieurs appels à \a refineZone() et à
326 * \a coarseZone(). En revanche, un appel à cette méthode est inutile après
327 * un appel à \a adaptLevel() car \a adaptLevel() s'en occupe.
328 */
329 void mergePatches() const;
330
331 /*!
332 * \brief Méthode permettant de créer un sous-niveau ("niveau -1").
333 *
334 * Cette méthode ne peut être appelée que si le maillage est un maillage
335 * AMR (IMesh::isAmrActivated()==true).
336 *
337 * Dans le cas d'utilisation de l'AMR type 3 (PatchCartesianMeshOnly), il est
338 * possible d'appeler cette méthode en cours de calcul et autant de fois que
339 * nécessaire (tant qu'il est possible de diviser la taille du niveau 0 par
340 * 2).
341 * Une fois le niveau -1 créé, tous les niveaux sont "remontés" (donc le
342 * niveau -1 devient le niveau 0 "ground").
343 */
344 void createSubLevel() const;
345
346 private:
347
348 ICartesianMesh* m_cmesh;
349};
350
351/*---------------------------------------------------------------------------*/
352/*---------------------------------------------------------------------------*/
353
354} // End namespace Arcane
355
356/*---------------------------------------------------------------------------*/
357/*---------------------------------------------------------------------------*/
358
359#endif //ARCANE_CARTESIANMESH_CARTESIANMESHAMRMNG_H
Déclarations de types sur les entités.
Classe permettant de définir une zone d'un maillage.
void setOverlapLayerSizeTopLevel(Int32 new_size) const
Méthode permettant de modifier le nombre de couches de mailles de recouvrement sur le niveau de raffi...
void coarseZone(const AMRZonePosition &position) const
Dé-raffine un bloc du maillage cartésien.
CartesianMeshPatchListView patches() const
Vue sur la liste des patchs.
void mergePatches() const
Méthode permettant de fusionner les patchs qui peuvent l'être.
void clearRefineRelatedFlags() const
Méthode permettant de supprimer les flags liés au raffinement de toutes les mailles.
CartesianMeshAMRMng(ICartesianMesh *cmesh)
Constructeur.
Int32 nbPatch() const
Nombre de patchs du maillage.
void endAdaptMesh()
Méthode permettant de terminer le raffinement du maillage.
void disableOverlapLayer()
Méthode permettant de désactiver les couches de mailles de recouvrement (et de les détruire si présen...
Integer reduceNbGhostLayers(Integer level, Integer target_nb_ghost_layers) const
Méthode permettant de supprimer une ou plusieurs couches de mailles fantômes sur un niveau de raffine...
void beginAdaptMesh(Int32 max_nb_levels, Int32 level_to_refine_first)
Méthode permettant de commencer le raffinement du maillage.
CartesianPatch amrPatch(Int32 index) const
Retourne le index-ième patch du maillage.
void refineZone(const AMRZonePosition &position) const
Raffine un bloc du maillage cartésien.
void adaptLevel(Int32 level_to_adapt) const
Méthode permettant de créer un niveau de raffinement du maillage.
void createSubLevel() const
Méthode permettant de créer un sous-niveau ("niveau -1").
Patch AMR d'un maillage cartésien.
Interface d'un maillage cartésien.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
std::int32_t Int32
Type entier signé sur 32 bits.