14#include "arcane/cartesianmesh/CartesianMeshCoarsening.h"
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/ValueConvert.h"
19#include "arcane/core/IMesh.h"
20#include "arcane/core/ItemGroup.h"
21#include "arcane/core/IParallelMng.h"
22#include "arcane/core/CartesianGridDimension.h"
23#include "arcane/core/IMeshModifier.h"
24#include "arcane/core/SimpleSVGMeshExporter.h"
25#include "arcane/core/ItemPrinter.h"
26#include "arcane/core/MeshStats.h"
28#include "arcane/cartesianmesh/ICartesianMesh.h"
29#include "arcane/cartesianmesh/CellDirectionMng.h"
31#include <unordered_set>
42CartesianMeshCoarsening::
43CartesianMeshCoarsening(ICartesianMesh* m)
44: TraceAccessor(m->traceMng())
47 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_CARTESIANMESH_COARSENING_VERBOSITY_LEVEL",
true))
48 m_verbosity_level = v.value();
55Int64 CartesianMeshCoarsening::
56_getMaxUniqueId(
const ItemGroup& group)
61 if (max_offset < item.uniqueId())
62 max_offset = item.uniqueId();
70void CartesianMeshCoarsening::
73 if (m_is_create_coarse_called)
75 m_is_create_coarse_called =
true;
78 IMesh* mesh = m_cartesian_mesh->mesh();
79 Integer
nb_patch = m_cartesian_mesh->nbPatch();
83 if (!mesh->isAmrActivated())
96 info() <<
"CoarseCartesianMesh nb_direction=" <<
nb_dir;
103 ARCANE_FATAL(
"Invalid number of cells ({0}) for direction {1}. Should be a multiple of 2",
165 for (Int32 z = 0; z < 4; ++z) {
177 for (Int32 z = 0; z < 4; ++z)
239 if (!(
coarse_cell.itemBase().flags() & ItemFlags::II_UserMark1))
242 coarse_cell.mutableItemBase().removeFlags(ItemFlags::II_UserMark1);
254 for (Int32 z = 0; z < 4; ++z) {
283void CartesianMeshCoarsening::
286 if (!m_is_create_coarse_called)
287 ARCANE_FATAL(
"You need to call createCoarseCells() before");
288 if (m_is_remove_refined_called)
290 m_is_remove_refined_called =
true;
292 IMesh* mesh = m_cartesian_mesh->mesh();
298 for (Int32
cell_lid : m_coarse_cells)
303 Int32 local_id =
icell.itemLocalId();
322 _recomputeMeshGenerationInfo();
325 m_cartesian_mesh->computeDirections();
333void CartesianMeshCoarsening::
334_recomputeMeshGenerationInfo()
336 IMesh* mesh = m_cartesian_mesh->mesh();
337 auto*
cmgi = ICartesianMeshGenerationInfo::getReference(mesh,
false);
346 cmgi->setOwnCellOffsets(v[0] /
cf, v[1] /
cf, v[2] /
cf);
349 ConstArrayView<Int64> v = cmgi->globalNbCells();
350 cmgi->setGlobalNbCells(v[0] / cf, v[1] / cf, v[2] / cf);
353 ConstArrayView<Int32> v = cmgi->ownNbCells();
354 cmgi->setOwnNbCells(v[0] / cf, v[1] / cf, v[2] / cf);
356 cmgi->setFirstOwnCellUniqueId(m_first_own_cell_unique_id_offset);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Informations sur les dimensions d'une grille cartésienne.
Infos sur les mailles d'une direction spécifique X,Y ou Z d'un maillage structuré.
Vue sur les informations des mailles.
Interface d'une famille d'entités.
virtual CellGroup ownCells()=0
Groupe de toutes les mailles propres au domaine.
virtual FaceGroup allFaces()=0
Groupe de toutes les faces.
virtual Integer dimension()=0
Dimension du maillage (1D, 2D ou 3D).
virtual IItemFamily * faceFamily()=0
Retourne la famille des faces.
virtual CellGroup allCells()=0
Groupe de toutes les mailles.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
Interface de modification du maillage.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
virtual IMeshModifier * modifier()=0
Interface de modification associée.
Interface du gestionnaire de parallélisme pour un sous-domaine.
Classe utilitaire pour imprimer les infos sur une entité.
Informations locales sur une face d'une maille.
Infos sur un type d'entité du maillage.
Node node(Int32 i) const
i-ème noeud de l'entité
const ItemTypeInfo * typeInfo() const
Infos sur le type de l'entité.
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
bool isOwn() const
true si l'entité est appartient au sous-domaine
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Arguments pour IMeshModifier::addCells().
Arguments pour IMeshModifier::addFaces().
void setOwner(Integer suid, Int32 current_sub_domain)
Positionne le numéro du sous-domaine propriétaire de l'entité.
void addFlags(Int32 added_flags)
Ajoute les flags \added_flags à ceux de l'entité
Exportation d'un maillage au format SVG.
Référence à une instance.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-