14#include "arcane/utils/PlatformUtils.h"
15#include "arcane/utils/ScopedPtr.h"
16#include "arcane/utils/ITraceMng.h"
17#include "arcane/utils/OStringStream.h"
18#include "arcane/utils/CheckedConvert.h"
20#include "arcane/core/IMeshUniqueIdMng.h"
21#include "arcane/core/IParallelExchanger.h"
22#include "arcane/core/IParallelMng.h"
23#include "arcane/core/ISerializeMessage.h"
24#include "arcane/core/ISerializer.h"
25#include "arcane/core/ParallelMngUtils.h"
27#include "arcane/mesh/DynamicMesh.h"
28#include "arcane/mesh/OneMeshItemAdder.h"
29#include "arcane/mesh/GhostLayerBuilder.h"
30#include "arcane/mesh/FaceUniqueIdBuilder.h"
31#include "arcane/mesh/ItemTools.h"
32#include "arcane/mesh/ItemsOwnerBuilder.h"
34#include <unordered_set>
46_computeFaceUniqueIdVersion3(DynamicMesh* mesh);
48_computeFaceUniqueIdVersion5(DynamicMesh* mesh);
50arcaneComputeCartesianFaceUniqueId(DynamicMesh* mesh);
66void FaceUniqueIdBuilder::
67computeFacesUniqueIds()
74 <<
" mesh=" << m_mesh->
name() <<
" is_parallel=" << is_parallel;
80 _computeFaceUniqueIdVersion5(m_mesh);
82 arcaneComputeCartesianFaceUniqueId(m_mesh);
84 _computeFaceUniqueIdVersion3(m_mesh);
86 info() <<
"No face renumbering";
93 info() <<
"Use new mesh init in FaceUniqueIdBuilder";
106 Real end_time = platform::getRealTime();
107 Real diff = (
Real)(end_time - begin_time);
108 info() <<
"TIME to compute face unique ids=" << diff;
113 ItemInternalMap& faces_map = m_mesh->facesMap();
117 if (face_version != 0)
120 bool is_verbose = m_mesh_builder->isVerbose();
122 info() <<
"NEW FACES_MAP after re-indexing";
123 faces_map.eachItem([&](Item face) {
124 info() <<
"Face uid=" << face.uniqueId() <<
" lid=" << face.localId();
129 if (face_version == 0 || face_version == 5) {
130 ItemsOwnerBuilder owner_builder(m_mesh);
131 owner_builder.computeFacesOwner();
143 info() <<
"Check no duplicate face uniqueId";
150 pwarning() <<
"Duplicate Face UniqueId=" << uid;
151 ARCANE_FATAL(
"Duplicate Face uniqueId={0}",uid);
177 : m_unique_id(NULL_ITEM_ID), m_nb_back_face(0), m_nb_true_boundary_face(0)
185 return m_unique_id<
ci.m_unique_id;
191 Int64 m_nb_back_face;
192 Int64 m_nb_true_boundary_face;
219 Integer
nb_local_face = m_mesh_builder->oneMeshItemAdder()->nbFace();
220 Integer
nb_local_cell = m_mesh_builder->oneMeshItemAdder()->nbCell();
221 bool is_verbose = m_mesh_builder->isVerbose();
351 if (face_type==IT_NullType){
382 info() <<
"Number of faces on the subdomain interface: "
387 Int64 max_cell_uid = 0;
390 Int64 cell_uid = cell.
uniqueId().asInt64();
392 if (cell_uid>max_cell_uid)
393 max_cell_uid = cell_uid;
407 Int64 cell_uid = cell.
uniqueId().asInt64();
411 for(
Face face : cell.faces() ){
413 if (face.backCell()==cell)
490 for(
Face face : cell.faces() ){
493 if (face.backCell()==cell){
495 fatal() <<
"NO KEY 0 for cell_uid=" << cell_uid;
500 else if (face.nbCell()==1){
504 fatal() <<
"NO KEY 1 for cell_uid=" << cell_uid;
530 error() <<
"The face lid=" << i <<
" has not been re-indexed.";
540 Int64 cell_uid = cell.
uniqueId().asInt64();
541 Integer face_index = 0;
547 if (face.backCell()==cell){
549 else if (face.nbCell()==1){
559 ostr() <<
"NEW UNIQUE ID FOR FACE"
560 <<
" lid=" << face.localId()
561 <<
" cell=" << cell_uid
562 <<
" face=" << face.uniqueId()
563 <<
" nbcell=" << face.nbCell()
564 <<
" cellindex=" << face_index <<
" (";
565 for(
Node node : face.nodes() )
566 ostr() <<
' ' << node.uniqueId();
569 ostr() <<
" internal-other";
571 ostr() <<
" true-boundary";
576 ostr() <<
" (shared)";
599 Int32
sd =
i_map.data()->key();
607 Integer
global_total = exchanger->parallelMng()->reduce(Parallel::ReduceSum,total);
611 for( Integer i=0, ns=exchanger->
nbSender(); i<ns; ++i ){
613 Int32 rank =
sm->destination().value();
617 s->
setMode(ISerializer::ModeReserve);
627 debug() <<
"END EXCHANGE";
630template<
typename DataType>
639 MyInfo(
const DataType& d,Integer n) : data(d), next_index(n) {}
646 ItemInfoMultiList() : m_last_index(5000,true) {}
650 void add(
Int64 node_uid,
const DataType& data)
652 Integer current_index = m_values.size();
655 HashTableMapT<Int64,Int32>::Data* d = m_last_index.
lookupAdd(node_uid,-1,is_add);
657 m_values.add(MyInfo(data,d->value()));
658 d->value() = current_index;
662 UniqueArray<MyInfo> m_values;
663 HashTableMapT<Int64,Int32> m_last_index;
682 Integer
nb_local_face = m_mesh_builder->oneMeshItemAdder()->nbFace();
769 v.add(NULL_ITEM_UNIQUE_ID);
773 v.add(NULL_ITEM_UNIQUE_ID);
776 for( Integer z=0,
zs=face.
nbNode(); z<
zs; ++z )
819 Int32 face_type = (Int32)a[z+3];
840 Int64 node_uid = a[z+0];
843 Int32 face_type = (Int32)a[z+3];
887 for (Int64 z=0; z<nb_item; ++z ){
902 debug() <<
"END OF TEST NEW FACE COMPUTE";
916 bool is_verbose = m_mesh_builder->isVerbose();
924 Int32 cell_uid = cell.
uniqueId().asInt32();
935 Int32 cell_uid = cell.
uniqueId().asInt32();
938 for(
Face face : cell.faces() ){
939 if (face.backCell()==cell)
941 else if (face.nbCell()==1){
957 Int32 i = cell.
uniqueId().asInt32();
958 info() <<
"Recv: Cell FaceInfo celluid=" << i
966 Int32 cell_uid = cell.
uniqueId().asInt32();
969 for(
Face face : cell.faces() ){
971 if (face.backCell()==cell){
975 else if (face.nbCell()==1){
988 Integer face_index = 0;
993 if (face.backCell()==cell){
995 else if (face.nbCell()==1){
1002 ostr() <<
"NEW LOCAL ID FOR CELLFACE cell_uid=" << cell.
uniqueId() <<
' '
1003 << face_index <<
" uid=" << face.uniqueId() <<
" (";
1004 for(
Node node : face.nodes() )
1005 ostr() <<
' ' << node.uniqueId();
1008 ostr() <<
" internal-other";
1010 ostr() <<
" true-boundary";
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Tableau d'items de types quelconques.
FaceConnectedListViewType faces() const
Liste des faces de la maille.
Vue sur les informations des faces.
Cell frontCell() const
Maille devant la face (maille nulle si aucune)
Cell cell(Int32 i) const
i-ème maille de la face
Int32 nbCell() const
Nombre de mailles de la face (1 ou 2)
bool isSubDomainBoundary() const
Indique si la face est au bord du sous-domaine (i.e nbCell()==1)
Cell backCell() const
Maille derrière la face (maille nulle si aucune)
Table de hachage pour tableaux associatifs.
Data * lookupAdd(KeyTypeConstRef id, const ValueType &value, bool &is_add)
Recherche ou ajoute la valeur correspondant à la clé id.
Interface d'une famille d'entités.
virtual void notifyItemsUniqueIdChanged()=0
Notifie que les numéros uniques des entités ont été modifiées.
virtual Integer faceBuilderVersion() const =0
Version de la numérotation des faces.
Echange d'informations entre processeurs.
virtual void addSender(Int32 rank)=0
Ajoute un processeur à envoyer.
virtual Integer nbSender() const =0
Nombre de processeurs auquel on envoie.
virtual Integer nbReceiver() const =0
Nombre de processeurs dont on va réceptionner les messages.
virtual bool initializeCommunicationsMessages()=0
Calcule les communications.
virtual ISerializeMessage * messageToSend(Integer i)=0
Message destiné au ième processeur.
virtual void processExchange()=0
Effectue l'échange avec les options par défaut de ParallelExchangerOptions.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual void allGatherVariable(ConstArrayView< char > send_buf, Array< char > &recv_buf)=0
Effectue un regroupement sur tous les processeurs.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
virtual void barrier()=0
Effectue une barière.
Int32 flags() const
Flags de l'entité
bool null() const
Vrai si l'entité est l'entité nulle.
@ II_Shared
L'entité est partagée par un autre sous-domaine.
@ II_HasBackCell
L'entité a une maille derrière.
@ II_SubDomainBoundary
L'entité est à la frontière de deux sous-domaines.
Infos sur un type d'entité du maillage.
Gestionnaire des types d'entités de maillage.
Identifiant unique d'une entité.
Node node(Int32 i) const
i-ème noeud de l'entité
NodeConnectedListViewType nodes() const
Liste des noeuds de l'entité
Int32 nbNode() const
Nombre de noeuds de l'entité
Classe de base d'un élément de maillage.
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.
constexpr bool null() const
true si l'entité est nul (i.e. non connecté au maillage)
impl::ItemBase itemBase() const
Partie interne de l'entité.
Int16 type() const
Type de l'entité
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Méthodes permettant de modifier ItemBase.
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é
Flot de sortie lié à une String.
Construction d'un maillage de manière incrémentale.
IItemFamily * nodeFamily() override
Retourne la famille des noeuds.
IParallelMng * parallelMng() override
Gestionnaire de parallèlisme.
String name() const override
Nom du maillage.
ItemTypeMng * itemTypeMng() const override
Gestionnaire de types d'entités associé
IItemFamily * faceFamily() override
Retourne la famille des faces.
IMeshUniqueIdMng * meshUniqueIdMng() const override
Gestionnare de la numérotation des identifiants uniques.
void _computeFacesUniqueIdsParallelV2()
Calcul les numéros uniques de chaque face en parallèle V2.
void _computeFacesUniqueIdsSequential()
Calcul les numéros uniques de chaque face en séquentiel.
FaceUniqueIdBuilder(DynamicMeshIncrementalBuilder *mesh_builder)
Construit une instance pour le maillage mesh.
void _exchangeData(IParallelExchanger *exchanger, BoundaryInfosMap &boundary_infos_to_send)
void _checkNoDuplicate()
Vérifie qu'on n'a pas deux fois le même uniqueId().
void _computeFacesUniqueIdsParallelV1()
Calcul les numéros uniques de chaque face en parallèle.
Tableau associatif de ItemInternal.
Classe d'aide pour la détermination en parallèle des unique_id des faces.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
void clear()
Supprime les éléments du tableau.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface d'un sérialiseur.
virtual void allocateBuffer()=0
Alloue la mémoire du sérialiseur.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
void reserveInt64(Int64 n)
Réserve pour n Int64.
virtual void reserveSpan(eDataType dt, Int64 n)=0
Réserve de la mémoire pour n valeurs de dt.
virtual void putSpan(Span< const Real > values)
Ajoute le tableau values.
virtual void getSpan(Span< Real > values)
Récupère le tableau values.
virtual Int64 getInt64()=0
Récupère une taille.
virtual void setMode(eMode new_mode)=0
Positionne le fonctionnement actuel.
virtual void putInt64(Int64 value)=0
Ajoute l'entier value.
virtual void flush()=0
Flush tous les flots.
Interface d'un message de sérialisation entre IMessagePassingMng.
Chaîne de caractères unicode.
Classe d'accès aux traces.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage error() const
Flot pour un message d'erreur.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage fatal() const
Flot pour un message d'erreur fatale.
Vecteur 1D de données avec sémantique par valeur (style STL).
T max(const T &a, const T &b, const T &c)
Retourne le maximum de trois éléments.
Integer toInteger(Real r)
Converti un Int64 en un Integer.
Ref< IParallelExchanger > createExchangerRef(IParallelMng *pm)
Retourne une interface pour transférer des messages entre rangs.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Int32 Integer
Type représentant un entier.