Arcane  v4.1.1.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
CartesianMeshAMRMng.cc
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.cc (C) 2000-2025 */
9/* */
10/* Gestionnaire de l'AMR pour un maillage cartésien. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/cartesianmesh/CartesianMeshAMRMng.h"
15
16#include "arcane/utils/FatalErrorException.h"
17
18#include "arcane/core/IMesh.h"
19#include "arcane/core/MeshKind.h"
20
21#include "arcane/cartesianmesh/ICartesianMesh.h"
22#include "arcane/cartesianmesh/CartesianPatch.h"
23#include "arcane/cartesianmesh/CartesianMeshCoarsening2.h"
24#include "arcane/cartesianmesh/CartesianMeshPatchListView.h"
25#include "arcane/cartesianmesh/CartesianMeshUtils.h"
26
27#include "arcane/cartesianmesh/internal/ICartesianMeshInternal.h"
28#include "arcane/cartesianmesh/internal/CartesianPatchGroup.h"
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33namespace Arcane
34{
35
36/*---------------------------------------------------------------------------*/
37/*---------------------------------------------------------------------------*/
38
43
44/*---------------------------------------------------------------------------*/
45/*---------------------------------------------------------------------------*/
46
48nbPatch() const
49{
50 return m_cmesh->nbPatch();
51}
52
53/*---------------------------------------------------------------------------*/
54/*---------------------------------------------------------------------------*/
55
57amrPatch(Int32 index) const
58{
59 return m_cmesh->amrPatch(index);
60}
61
62/*---------------------------------------------------------------------------*/
63/*---------------------------------------------------------------------------*/
64
66patches() const
67{
68 return m_cmesh->patches();
69}
70
71/*---------------------------------------------------------------------------*/
72/*---------------------------------------------------------------------------*/
73
75refineZone(const AMRZonePosition& position) const
76{
77 m_cmesh->refinePatch(position);
78}
79
80/*---------------------------------------------------------------------------*/
81/*---------------------------------------------------------------------------*/
82
84coarseZone(const AMRZonePosition& position) const
85{
86 m_cmesh->coarseZone(position);
87}
88
89/*---------------------------------------------------------------------------*/
90/*---------------------------------------------------------------------------*/
91
93adaptMesh() const
94{
95 /*
96 * Dans le cas d'un raffinement niveau par niveau, il est possible de mettre
97 * le paramètre \a clear_refine_flag à false afin de garder les flags des
98 * niveaux inférieurs et d'éviter d'avoir à les recalculer. Pour le dernier
99 * niveau, il est recommandé de mettre le paramètre \a clear_refine_flag à
100 * true pour supprimer les flags devenu inutiles (ou d'appeler la méthode
101 * clearRefineRelatedFlags()).
102 *
103 * Les mailles n'ayant pas de flag "II_Refine" seront déraffinées.
104 *
105 * Afin d'éviter les mailles orphelines, si une maille est marquée
106 * "II_Refine", alors la maille parente est marquée "II_Refine".
107 *
108 * Exemple d'exécution :
109 * ```
110 * CartesianMeshAMRMng amr_mng(cmesh());
111 * amr_mng.clearRefineRelatedFlags();
112 * for (Integer level = 0; level < 2; ++level){
113 * computeInLevel(level); // Va mettre des flags II_Refine sur les mailles
114 * amr_mng.adaptMesh(false);
115 * }
116 * amr_mng.clearRefineRelatedFlags();
117 * ```
118 *
119 * Cette opération est collective.
120 *
121 * \param clear_refine_flag true si l'on souhaite supprimer les flags
122 * II_Refine après adaptation.
123 */
124 auto amr_type = m_cmesh->mesh()->meshKind().meshAMRKind();
125 if (amr_type == eMeshAMRKind::Cell) {
126 ARCANE_FATAL("Method available only with AMR PatchCartesianMeshOnly");
127 }
128 m_cmesh->_internalApi()->cartesianPatchGroup().refine(true);
129}
130
131/*---------------------------------------------------------------------------*/
132/*---------------------------------------------------------------------------*/
133
136{
137 m_cmesh->_internalApi()->cartesianPatchGroup().clearRefineRelatedFlags();
138}
139
140/*---------------------------------------------------------------------------*/
141/*---------------------------------------------------------------------------*/
142
143void CartesianMeshAMRMng::
144enableOverlapLayer(bool enable) const
145{
146 auto amr_type = m_cmesh->mesh()->meshKind().meshAMRKind();
147 if (amr_type == eMeshAMRKind::Cell) {
148 return;
149 }
150 m_cmesh->_internalApi()->cartesianPatchGroup().setOverlapLayerSizeTopLevel(enable ? 2 : 0);
151 m_cmesh->computeDirections();
152}
153
154/*---------------------------------------------------------------------------*/
155/*---------------------------------------------------------------------------*/
156
158reduceNbGhostLayers(Integer level, Integer target_nb_ghost_layers) const
159{
160 return m_cmesh->reduceNbGhostLayers(level, target_nb_ghost_layers);
161}
162
163/*---------------------------------------------------------------------------*/
164/*---------------------------------------------------------------------------*/
165
167mergePatches() const
168{
169 auto amr_type = m_cmesh->mesh()->meshKind().meshAMRKind();
170 if (amr_type == eMeshAMRKind::Cell) {
171 return;
172 }
173
174 m_cmesh->_internalApi()->cartesianPatchGroup().mergePatches();
175 m_cmesh->_internalApi()->cartesianPatchGroup().applyPatchEdit(false);
176}
177
178/*---------------------------------------------------------------------------*/
179/*---------------------------------------------------------------------------*/
180
182createSubLevel() const
183{
184 auto amr_type = m_cmesh->mesh()->meshKind().meshAMRKind();
185 if(amr_type == eMeshAMRKind::Cell) {
187 coarser->createCoarseCells();
188 }
189 else if(amr_type == eMeshAMRKind::PatchCartesianMeshOnly) {
190 m_cmesh->_internalApi()->cartesianMeshAMRPatchMng()->createSubLevel();
191 }
192 else if(amr_type == eMeshAMRKind::Patch) {
193 ARCANE_FATAL("General patch AMR is not implemented. Please use PatchCartesianMeshOnly (3)");
194 }
195 else{
196 ARCANE_FATAL("AMR is not enabled");
197 }
198}
199
200/*---------------------------------------------------------------------------*/
201/*---------------------------------------------------------------------------*/
202
203} // End namespace Arcane
204
205/*---------------------------------------------------------------------------*/
206/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
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.
virtual CartesianPatchGroup & cartesianPatchGroup()=0
Méthode permettant de récupérer le CartesianPatchGroup.
Interface d'un maillage cartésien.
virtual IMesh * mesh() const =0
Maillage associé à ce maillage cartésien.
virtual ICartesianMeshInternal * _internalApi()=0
API interne à Arcane.
virtual void computeDirections()=0
Calcule les infos pour les accès par direction.
virtual const MeshKind meshKind() const =0
Caractéristiques du maillage.
Référence à une instance.
ARCANE_CARTESIANMESH_EXPORT Ref< CartesianMeshCoarsening2 > createCartesianMeshCoarsening2(ICartesianMesh *cm)
Créé une instance pour gérer le déraffinement du maillage (V2).
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
@ Patch
Le maillage est AMR par patch.
Definition MeshKind.h:54
@ Cell
Le maillage est AMR par maille.
Definition MeshKind.h:52
@ PatchCartesianMeshOnly
Le maillage est AMR par patch cartésien (rectangulaire)
Definition MeshKind.h:56
std::int32_t Int32
Type entier signé sur 32 bits.