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/mesh/DynamicMesh.h"
21#include "arcane/mesh/OneMeshItemAdder.h"
22#include "arcane/mesh/GhostLayerBuilder.h"
23#include "arcane/mesh/FaceUniqueIdBuilder.h"
24#include "arcane/mesh/ItemTools.h"
26#include "arcane/core/IMeshUniqueIdMng.h"
27#include "arcane/core/IParallelExchanger.h"
28#include "arcane/core/IParallelMng.h"
29#include "arcane/core/ISerializeMessage.h"
30#include "arcane/core/ISerializer.h"
31#include "arcane/core/ParallelMngUtils.h"
33#include <unordered_set>
45_computeFaceUniqueIdVersion3(DynamicMesh* mesh);
47_computeFaceUniqueIdVersion5(DynamicMesh* mesh);
49arcaneComputeCartesianFaceUniqueId(DynamicMesh* mesh);
65void FaceUniqueIdBuilder::
66computeFacesUniqueIds()
73 <<
" mesh=" << m_mesh->
name() <<
" is_parallel=" << is_parallel;
79 _computeFaceUniqueIdVersion5(m_mesh);
81 arcaneComputeCartesianFaceUniqueId(m_mesh);
83 _computeFaceUniqueIdVersion3(m_mesh);
88 info() <<
"Use new mesh init in FaceUniqueIdBuilder";
105 Real end_time = platform::getRealTime();
106 Real diff = (
Real)(end_time - begin_time);
107 info() <<
"TIME to compute face unique ids=" << diff;
112 ItemInternalMap& faces_map = m_mesh->facesMap();
118 bool is_verbose = m_mesh_builder->isVerbose();
120 info() <<
"NEW FACES_MAP after re-indexing";
121 faces_map.eachItem([&](Item face) {
122 info() <<
"Face uid=" << face.uniqueId() <<
" lid=" << face.localId();
135 info() <<
"Check no duplicate face uniqueId";
142 pwarning() <<
"Duplicate Face UniqueId=" << uid;
143 ARCANE_FATAL(
"Duplicate Face uniqueId={0}",uid);
169 : m_unique_id(NULL_ITEM_ID), m_nb_back_face(0), m_nb_true_boundary_face(0)
177 return m_unique_id<
ci.m_unique_id;
183 Int64 m_nb_back_face;
184 Int64 m_nb_true_boundary_face;
211 Integer
nb_local_face = m_mesh_builder->oneMeshItemAdder()->nbFace();
212 Integer
nb_local_cell = m_mesh_builder->oneMeshItemAdder()->nbCell();
213 bool is_verbose = m_mesh_builder->isVerbose();
374 info() <<
"Number of faces on the subdomain interface: "
379 Int64 max_cell_uid = 0;
382 Int64 cell_uid = cell.
uniqueId().asInt64();
384 if (cell_uid>max_cell_uid)
385 max_cell_uid = cell_uid;
399 Int64 cell_uid = cell.
uniqueId().asInt64();
403 for(
Face face : cell.faces() ){
405 if (face.backCell()==cell)
482 for(
Face face : cell.faces() ){
485 if (face.backCell()==cell){
487 fatal() <<
"NO KEY 0 for cell_uid=" << cell_uid;
492 else if (face.nbCell()==1){
496 fatal() <<
"NO KEY 1 for cell_uid=" << cell_uid;
522 error() <<
"The face lid=" << i <<
" has not been re-indexed.";
532 Int64 cell_uid = cell.
uniqueId().asInt64();
533 Integer face_index = 0;
539 if (face.backCell()==cell){
541 else if (face.nbCell()==1){
551 ostr() <<
"NEW UNIQUE ID FOR FACE"
552 <<
" lid=" << face.localId()
553 <<
" cell=" << cell_uid
554 <<
" face=" << face.uniqueId()
555 <<
" nbcell=" << face.nbCell()
556 <<
" cellindex=" << face_index <<
" (";
557 for(
Node node : face.nodes() )
558 ostr() <<
' ' << node.uniqueId();
561 ostr() <<
" internal-other";
563 ostr() <<
" true-boundary";
568 ostr() <<
" (shared)";
591 Int32
sd =
i_map.data()->key();
599 Integer
global_total = exchanger->parallelMng()->reduce(Parallel::ReduceSum,total);
603 for( Integer i=0, ns=exchanger->
nbSender(); i<ns; ++i ){
605 Int32 rank =
sm->destination().value();
609 s->
setMode(ISerializer::ModeReserve);
619 debug() <<
"END EXCHANGE";
622template<
typename DataType>
631 MyInfo(
const DataType& d,Integer n) : data(d), next_index(n) {}
638 ItemInfoMultiList() : m_last_index(5000,true) {}
642 void add(
Int64 node_uid,
const DataType& data)
644 Integer current_index = m_values.size();
647 HashTableMapT<Int64,Int32>::Data* d = m_last_index.
lookupAdd(node_uid,-1,is_add);
649 m_values.add(MyInfo(data,d->value()));
650 d->value() = current_index;
654 UniqueArray<MyInfo> m_values;
655 HashTableMapT<Int64,Int32> m_last_index;
674 Integer
nb_local_face = m_mesh_builder->oneMeshItemAdder()->nbFace();
761 v.add(NULL_ITEM_UNIQUE_ID);
765 v.add(NULL_ITEM_UNIQUE_ID);
768 for( Integer z=0,
zs=face.
nbNode(); z<
zs; ++z )
832 Int64 node_uid = a[z+0];
879 for (Int64 z=0; z<
nb_item; ++z ){
894 debug() <<
"END OF TEST NEW FACE COMPUTE";
908 bool is_verbose = m_mesh_builder->isVerbose();
916 Int32 cell_uid = cell.
uniqueId().asInt32();
927 Int32 cell_uid = cell.
uniqueId().asInt32();
930 for(
Face face : cell.faces() ){
931 if (face.backCell()==cell)
933 else if (face.nbCell()==1){
949 Int32 i = cell.
uniqueId().asInt32();
950 info() <<
"Recv: Cell FaceInfo celluid=" << i
958 Int32 cell_uid = cell.
uniqueId().asInt32();
961 for(
Face face : cell.faces() ){
963 if (face.backCell()==cell){
967 else if (face.nbCell()==1){
980 Integer face_index = 0;
985 if (face.backCell()==cell){
987 else if (face.nbCell()==1){
994 ostr() <<
"NEW LOCAL ID FOR CELLFACE cell_uid=" << cell.
uniqueId() <<
' '
995 << face_index <<
" uid=" << face.uniqueId() <<
" (";
996 for(
Node node : face.nodes() )
997 ostr() <<
' ' << node.uniqueId();
1000 ostr() <<
" internal-other";
1002 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 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()
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 reserve(eDataType dt, Int64 n)=0
Réserve de la mémoire pour n objets de type dt.
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.
TraceMessage pwarning() const
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.
@ DT_Int64
Donnée de type entier 64 bits.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Int32 Integer
Type représentant un entier.