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::
70void CartesianMeshCoarsening::
73 if (m_is_create_coarse_called)
75 m_is_create_coarse_called =
true;
77 const bool is_verbose = m_verbosity_level > 0;
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",
111 Int64 max_cell_uid = _getMaxUniqueId(mesh->
allCells());
112 Int64 max_face_uid = _getMaxUniqueId(mesh->
allFaces());
151 info() <<
"CELLCoarse uid=" << cell_uid <<
" x=" <<
cell_x <<
" y=" <<
cell_y;
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) {
273 String filename = String::format(
"mesh_coarse_{0}.svg",
my_rank);
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);
350 cmgi->setGlobalNbCells(v[0] /
cf, v[1] /
cf, v[2] /
cf);
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.
Classe pour calculer en 2D 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'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.
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.
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é
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é.
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.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
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.
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 -*-