14#include "arcane/cartesianmesh/CartesianMeshCoarsening2.h"
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/ValueConvert.h"
18#include "arcane/utils/SmallArray.h"
20#include "arcane/core/IMesh.h"
21#include "arcane/core/ItemGroup.h"
22#include "arcane/core/IParallelMng.h"
23#include "arcane/core/CartesianGridDimension.h"
24#include "arcane/core/IMeshModifier.h"
25#include "arcane/core/SimpleSVGMeshExporter.h"
26#include "arcane/core/ItemPrinter.h"
27#include "arcane/core/MeshStats.h"
28#include "arcane/core/IGhostLayerMng.h"
30#include "arcane/mesh/CellFamily.h"
32#include "arcane/cartesianmesh/ICartesianMesh.h"
33#include "arcane/cartesianmesh/CellDirectionMng.h"
34#include "arcane/cartesianmesh/internal/ICartesianMeshInternal.h"
36#include <unordered_set>
47CartesianMeshCoarsening2::
48CartesianMeshCoarsening2(ICartesianMesh* m)
49: TraceAccessor(m->traceMng())
52 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_CARTESIANMESH_COARSENING_VERBOSITY_LEVEL",
true))
53 m_verbosity_level = v.value();
60Int64 CartesianMeshCoarsening2::
75void CartesianMeshCoarsening2::
76_writeMeshSVG(
const String& name)
78 if (m_verbosity_level <= 0)
80 IMesh* mesh = m_cartesian_mesh->mesh();
86 info() <<
"WriteMesh name=" << filename;
100void CartesianMeshCoarsening2::
101_doDoubleGhostLayers()
103 IMesh* mesh = m_cartesian_mesh->mesh();
108 Int32 version =
gm->builderVersion();
110 gm->setBuilderVersion(3);
119 m_cartesian_mesh->computeDirections();
122 _writeMeshSVG(
"double_ghost");
128void CartesianMeshCoarsening2::
131 if (m_is_create_coarse_called)
133 m_is_create_coarse_called =
true;
135 const bool is_verbose = m_verbosity_level > 0;
136 IMesh* mesh = m_cartesian_mesh->mesh();
138 Integer
nb_patch = m_cartesian_mesh->nbPatch();
142 if (!mesh->isAmrActivated())
149 info() <<
"CoarseCartesianMesh nb_direction=" <<
nb_dir;
156 ARCANE_FATAL(
"Invalid number of cells ({0}) for direction {1}. Should be a multiple of 2",
160 _writeMeshSVG(
"orig");
163 _doDoubleGhostLayers();
173 for (Int32 i = 0; i <
nb_node; ++i)
175 info() <<
"Orig cell_uid=" << cell.
uniqueId() <<
" Nodes=" << uids;
178 for (Int32 i = 0; i <
nb_face; ++i)
180 info() <<
"Orig cell_uid=" << cell.
uniqueId() <<
" Faces=" << uids;
188 Int64 max_cell_uid = _getMaxUniqueId(mesh->
allCells());
189 Int64 max_face_uid = _getMaxUniqueId(mesh->
allFaces());
192 info() <<
"FirstCellUniqueIdOffset=" << m_first_own_cell_unique_id_offset;
194 _createCoarseCells3D();
196 _createCoarseCells2D();
210 _recomputeMeshGenerationInfo();
221 m_cartesian_mesh->_internalApi()->addPatchFromExistingChildren(
parent_cells.view().localIds());
232 m_cartesian_mesh->computeDirections();
234 _writeMeshSVG(
"coarse");
240void CartesianMeshCoarsening2::
241_createCoarseCells2D()
243 const bool is_verbose = m_verbosity_level > 0;
244 IMesh* mesh = m_cartesian_mesh->mesh();
291 info() <<
"CellToCoarse refined_uid=" << cell_uid <<
" x=" <<
cell_x <<
" y=" <<
cell_y;
306 for (Int32 z = 0; z < 4; ++z) {
329 for (Int32 z = 0; z < 4; ++z)
364 for (Int32 i = 0; i < 4; ++i)
403 for (Int32 z = 0; z < 4; ++z) {
421 for (Int32 z = 0; z < 4; ++z) {
434void CartesianMeshCoarsening2::
435_createCoarseCells3D()
437 const bool is_verbose = m_verbosity_level > 0;
438 IMesh* mesh = m_cartesian_mesh->mesh();
497 info() <<
"CellToCoarse refined_uid=" << cell_uid <<
" x=" <<
cell_x <<
" y=" <<
cell_y <<
" z=" <<
cell_z;
678void CartesianMeshCoarsening2::
679_recomputeMeshGenerationInfo()
681 IMesh* mesh = m_cartesian_mesh->mesh();
682 auto*
cmgi = ICartesianMeshGenerationInfo::getReference(mesh,
false);
691 cmgi->setOwnCellOffsets(v[0] /
cf, v[1] /
cf, v[2] /
cf);
695 cmgi->setGlobalNbCells(v[0] /
cf, v[1] /
cf, v[2] /
cf);
699 cmgi->setOwnNbCells(v[0] /
cf, v[1] /
cf, v[2] /
cf);
701 cmgi->setFirstOwnCellUniqueId(m_first_own_cell_unique_id_offset);
707void CartesianMeshCoarsening2::
710 if (!m_is_create_coarse_called)
711 ARCANE_FATAL(
"You need to call createCoarseCells() before");
712 if (m_is_remove_refined_called)
714 m_is_remove_refined_called =
true;
716 const bool is_verbose = m_verbosity_level > 0;
718 IMesh* mesh = m_cartesian_mesh->mesh();
721 info() <<
"RemoveRefinedCells nb_coarse_cell=" << m_coarse_cells_uid.size();
723 info() <<
"CoarseCells=" << m_coarse_cells_uid;
728 for (Int64 cell_uid : m_coarse_cells_uid)
732 Int32 local_id =
icell.itemLocalId();
738 info() <<
"CellsToRemove n=" << cells_to_remove.size() <<
" list=" << cells_to_remove;
749 MeshStats ms(traceMng(), mesh, mesh->
parallelMng());
754 m_cartesian_mesh->computeDirections();
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Classe pour calculer en 2D le uniqueId() d'une maille en fonction de sa position dans la grille.
Classe pour calculer en 3D le uniqueId() d'une maille en fonction de sa position dans la grille.
Classe pour calculer en 2D le uniqueId() d'une face en fonction de sa position dans la grille.
Classe pour calculer en 2D le uniqueId() d'une face en fonction de sa position dans la grille.
Classe pour calculer en 2D le uniqueId() d'un noeud en fonction de sa position dans la grille.
Classe pour calculer en 3D le uniqueId() d'un noeud en fonction de sa position dans la grille.
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.
Face face(Int32 i) const
i-ème face de la maille
Int32 nbFace() const
Nombre de faces de la maille.
Interface d'une famille d'entités.
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 void updateGhostLayers()=0
Mise à jour de la couche fantôme.
virtual void setDynamic(bool v)=0
Positionne la propriété indiquant si le maillage peut évoluer.
virtual void removeCells(Int32ConstArrayView cells_local_id)=0
Supprime des mailles.
virtual void endUpdate()=0
Notifie l'instance de la fin de la modification du maillage.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
virtual IMeshModifier * modifier()=0
Interface de modification associée.
virtual CellGroup allLevelCells(const Integer &level)=0
Groupe de toutes les mailles de niveau level.
virtual void computeSynchronizeInfos()=0
Recalcule les informations de synchronisation.
virtual IGhostLayerMng * ghostLayerMng() const =0
Gestionnare de couche fantômes associé
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Groupe d'entités de maillage.
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é
Int32 nbNode() const
Nombre de noeuds de l'entité
Classe de base d'un élément de maillage.
const ItemTypeInfo * typeInfo() const
Infos sur le type de l'entité.
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Arguments pour IMeshModifier::addCells().
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.
Chaîne de caractères unicode.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-