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