Arcane  v4.1.1.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-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/* CartesianMeshAMRMng.h (C) 2000-2025 */
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 d'adapter le raffinement du maillage selon les
108 * mailles à raffiner.
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 * Avant d'appeler cette méthode, il faut ajouter le flag "II_Refine" sur les
117 * mailles qui doivent être raffinées. Il est possible de le faire niveau par
118 * niveau ou plusieurs niveaux d'un coup (si plusieurs niveaux existent
119 * déjà).
120 * Pour être sûr de n'avoir aucun flag déjà présent sur le maillage, il est
121 * possible d'appeler la méthode \a clearRefineRelatedFlags().
122
123 * Les mailles n'ayant pas de flag "II_Refine" seront déraffinées.
124 *
125 * Afin d'éviter les mailles orphelines, si une maille est marquée
126 * "II_Refine", alors la maille parente est marquée "II_Refine".
127 *
128 * Exemple d'exécution :
129 * ```
130 * CartesianMeshAMRMng amr_mng(cmesh());
131 * amr_mng.clearRefineRelatedFlags();
132 * for (Integer level = 0; level < 2; ++level){
133 * // Va faire ses calculs et mettre des flags II_Refine sur les mailles
134 * // du niveau 0 jusqu'au niveau level.
135 * computeInLevel(0, level);
136 * amr_mng.adaptMesh();
137 * }
138 * ```
139 *
140 * Cette opération est collective.
141 */
142 void adaptMesh() const;
143
144 /*!
145 * \brief Méthode permettant de supprimer les flags liés au raffinement de
146 * toutes les mailles.
147 *
148 * Les flags concernés sont :
149 * - ItemFlags::II_Coarsen
150 * - ItemFlags::II_Refine
151 * - ItemFlags::II_JustCoarsened
152 * - ItemFlags::II_JustRefined
153 * - ItemFlags::II_JustAdded
154 * - ItemFlags::II_CoarsenInactive
155 */
156 void clearRefineRelatedFlags() const;
157
158 void enableOverlapLayer(bool enable) const;
159
160 /*!
161 * \brief Méthode permettant de supprimer une ou plusieurs couches
162 * de mailles fantômes sur un niveau de raffinement défini.
163 *
164 * Le nombre de couches de mailles fantômes souhaité peut être augmenté
165 * par la méthode. Il est nécessaire de récupérer la valeur retournée
166 * pour avoir le nombre de couches de mailles fantômes final.
167 *
168 * \param level Le niveau de raffinement concerné par la suppression
169 * des mailles fantômes.
170 *
171 * \param target_nb_ghost_layers Le nombre de couches souhaité après
172 * appel à cette méthode. ATTENTION : Il peut être ajusté par la méthode.
173 *
174 * \return Le nombre de couches de mailles fantômes final.
175 */
176 Integer reduceNbGhostLayers(Integer level, Integer target_nb_ghost_layers) const;
177
178 /*!
179 * \brief Méthode permettant de fusionner les patchs qui peuvent l'être.
180 *
181 * Cette méthode ne peut être appelée que si le maillage est un maillage
182 * AMR (IMesh::isAmrActivated()==true).
183 * Si le type de l'AMR n'est pas 3 (PatchCartesianMeshOnly), la méthode ne
184 * fait rien.
185 *
186 * Cette méthode peut être utile après plusieurs appels à \a refineZone() et à
187 * \a coarseZone(). En revanche, un appel à cette méthode est inutile après
188 * un appel à \a adaptMesh() car \a adaptMesh() s'en occupe.
189 */
190 void mergePatches() const;
191
192 /*!
193 * \brief Méthode permettant de créer un sous-niveau ("niveau -1").
194 *
195 * Cette méthode ne peut être appelée que si le maillage est un maillage
196 * AMR (IMesh::isAmrActivated()==true).
197 *
198 * Dans le cas d'utilisation de l'AMR type 3 (PatchCartesianMeshOnly), il est
199 * possible d'appeler cette méthode en cours de calcul et autant de fois que
200 * nécessaire (tant qu'il est possible de diviser la taille du niveau 0 par
201 * 2).
202 * Une fois le niveau -1 créé, tous les niveaux sont "remontés" (donc le
203 * niveau -1 devient le niveau 0 "ground").
204 */
205 void createSubLevel() const;
206
207 private:
208
209 ICartesianMesh* m_cmesh;
210};
211
212/*---------------------------------------------------------------------------*/
213/*---------------------------------------------------------------------------*/
214
215} // End namespace Arcane
216
217/*---------------------------------------------------------------------------*/
218/*---------------------------------------------------------------------------*/
219
220#endif //ARCANE_CARTESIANMESH_CARTESIANMESHAMRMNG_H
Déclarations de types sur les entités.
Classe permettant de définir une zone d'un maillage.
void coarseZone(const AMRZonePosition &position) const
Dé-raffine un bloc du maillage cartésien.
CartesianMeshPatchListView patches() const
Vue sur la liste des patchs.
void adaptMesh() const
Méthode permettant d'adapter le raffinement du maillage selon les mailles à raffiner.
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.
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...
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.