14#include "arcane/utils/HashTableMap.h"
15#include "arcane/utils/Real3.h"
16#include "arcane/utils/NotImplementedException.h"
17#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/ITraceMng.h"
19#include "arcane/utils/Collection.h"
21#include "arcane/mesh/DynamicMesh.h"
22#include "arcane/mesh/FaceFamily.h"
23#include "arcane/mesh/MapCoordToUid.h"
24#include "arcane/mesh/ParallelAMRConsistency.h"
26#include "arcane/core/IMesh.h"
27#include "arcane/core/IMeshSubMeshTransition.h"
29#include "arcane/core/ItemGroup.h"
30#include "arcane/core/Item.h"
31#include "arcane/core/ISubDomain.h"
32#include "arcane/core/VariableTypes.h"
33#include "arcane/core/IItemFamily.h"
34#include "arcane/core/ItemCompare.h"
35#include "arcane/core/IParallelMng.h"
36#include "arcane/core/GeometricUtilities.h"
37#include "arcane/core/SerializeBuffer.h"
38#include "arcane/core/ItemPrinter.h"
39#include "arcane/core/IMeshUtilities.h"
53#ifdef ACTIVATE_PERF_COUNTER
54const std::string ParallelAMRConsistency::PerfCounter::m_names[ParallelAMRConsistency::PerfCounter::NbCounters] =
72, m_nodes_coord(m_mesh->toPrimaryMesh()->nodesCoordinates())
73, m_nodes_info(1000,
true)
74, m_active_nodes(1000,
true)
75, m_active_faces(5000,
true)
76, m_active_faces2(5000,
true)
85void ParallelAMRConsistency::
88 CHECKPERF( m_perf_counter.start(PerfCounter::INIT) )
92 m_shared_face_uids.
clear() ;
94 m_connected_shared_face_uids.
clear() ;
106 else if (_hasSharedNodes(face)){
111 if (_hasSharedNodes(face)){
112 m_connected_shared_face_uids.
add(face_uid);
116 m_is_updated = true ;
118 CHECKPERF( m_perf_counter.stop(PerfCounter::INIT) )
125void ParallelAMRConsistency::
126_addFaceToList(Face face, FaceInfoMap& face_map)
128 Integer nb_node = face.nbNode();
129 Real3 center(0., 0., 0.);
130 Integer data_index = m_face_info_mng.size();
131 for (Node node : face.nodes()){
132 Real3 node_coord = m_nodes_coord[node];
133 ItemUniqueId uid = node.uniqueId();
134 m_face_info_mng.add(uid);
135 center += node_coord;
140 FaceInfo fi(face.uniqueId(), face.cell(0).uniqueId(), nb_node, face.owner(), data_index, &m_face_info_mng);
141 fi.setCenter(center);
142 face_map.add(face.uniqueId(), fi);
148bool ParallelAMRConsistency::
149_hasSharedNodes(Face face)
152 for ( Node node : face.nodes() ){
170 CHECKPERF( m_perf_counter.start(PerfCounter::COMPUTE) )
176 m_nodes_info.
clear() ;
188 m_active_faces.
clear() ;
189 m_face_info_mng.m_nodes_unique_id.clear() ;
201 typedef std::set<ItemInternal*> Set;
217 for (Integer s = 0; s <
subfaces.size(); s++){
220 Int64 uid =
face2.uniqueId() ;
223 _addFaceToList(
face2, m_active_faces);
230 active_nodes.insert(ItemMapValue(node.uniqueId(),node));
246 typedef std::pair<Real3,Real3>
Edge ;
249 for(Integer i=0;i<
nb_node;++i){
250 Integer next = i==
nb_node-1?0:i+1;
260 for (Integer s = 0; s <
subfaces.size(); s++){
262 Int64 uid =
face2.uniqueId() ;
269 for(Integer
j=0;
j<edges.size();++
j){
276 _addNodeToList(
node_i, m_active_nodes);
292 CHECKPERF( m_perf_counter.stop(PerfCounter::COMPUTE) )
302 CHECKPERF( m_perf_counter.start(PerfCounter::UPDATE) )
313 ARCANE_ASSERT((
face_uid !=
new_uid),(
"AMR CONSISTENCY UPDATE FACE ERROR")) ;
325 Int64 node_uid = *iter ;
333 ARCANE_ASSERT((node_uid !=
new_uid),(
"AMR CONSISTENCY UPDATE NODE ERROR")) ;
341 CHECKPERF( m_perf_counter.stop(PerfCounter::UPDATE) )
343 CHECKPERF( m_perf_counter.start(PerfCounter::ENDUPDATE) )
346 CHECKPERF( m_perf_counter.stop(PerfCounter::ENDUPDATE) )
370 CHECKPERF( m_perf_counter.start(PerfCounter::GATHERFACE) )
376 const Real
tol = 10e-12;
379 sbuf.setMode(ISerializer::ModeReserve);
395 coords.
add(
fi.center().x);
396 coords.
add(
fi.center().y);
397 coords.
add(
fi.center().z);
403 nodes_unique_id.
add(
nuid.asInt64());
410 sbuf.reserveInteger(1);
411 sbuf.reserveInteger(1);
412 sbuf.reserveInteger(1);
415 sbuf.reserveArray(nodes_unique_id);
416 sbuf.reserveArray(coords);
419 sbuf.allocateBuffer();
424 sbuf.putInteger(nodes_unique_id.
size());
427 sbuf.putArray(nodes_unique_id);
428 sbuf.putArray(coords);
439 info() <<
" [\t ParallelAMRConsistency::_gatherFaces] READ nface=" <<
nb_face <<
" FROM sid=" <<
sid<<
" "<<m_face_info_mng.size();
448 for (Integer z = 0; z <
nb_face; ++z){
453 center.
x = coords[z * 3];
454 center.
y = coords[z * 3 + 1];
455 center.
z = coords[z * 3 + 2];
460 error() <<
"face uid not found \n";
467 Integer data_index =
fi_old.getDataIndex();
470 fi.setCenter(center);
495 CHECKPERF( m_perf_counter.stop(PerfCounter::GATHERFACE) )
497 CHECKPERF( m_perf_counter.start(PerfCounter::UPDATE) )
506 _update(m_face_info_mng.m_nodes_unique_id,m_nodes_info) ;
508 CHECKPERF( m_perf_counter.stop(PerfCounter::UPDATE) )
516void ParallelAMRConsistency::
519 for(Integer i=0, n=nodes_unique_id.size();i<n;++i)
522 NodeInfoList::Data
const* data =
nodes_info.lookup(uid);
524 nodes_unique_id[i] = data->value().uniqueId() ;
526 info()<<
"ERROR "<<i<<
" "<<uid<<
" not found";
533void ParallelAMRConsistency::
534_addNodeToList(Node node, NodeInfoList& node_map)
536 Real3 node_coord = m_nodes_coord[node];
537 ItemUniqueId uid = node.uniqueId();
538 NodeInfoList::Data* i = node_map.lookup(uid);
540 NodeInfo node_info(uid, node.owner());
541 node_info.setCoord(node_coord);
542 node_map.add(uid, node_info);
549void ParallelAMRConsistency::
550_addFaceToList2(Face face, FaceInfoMap2& face_map)
552 Integer nb_node = face.nbNode();
553 ItemUniqueId uid = face.uniqueId();
554 FaceInfoMap2::Data* i = face_map.lookup(uid);
556 Real3 center(0., 0., 0.);
557 for (Node node : face.nodes() ){
558 Real3 node_coord = m_nodes_coord[node];
559 center += node_coord;
562 FaceInfo2 fi(face.uniqueId(), face.owner());
563 fi.setCenter(center);
564 face_map.add(uid, fi);
591 typedef std::set<Item> Set;
602 is_sub_domain_boundary_face = true;
605 if (face.cell(0).level() == 0 && face.cell(1).level() == 0){
606 if ((face.cell(0).owner() != sid || face.cell(1).owner() != sid))
607 is_sub_domain_boundary_face = true;
614 for (Integer s = 0; s <
subfaces.size(); s++){
617 _addFaceToList2(
face2, m_active_faces2);
622 _addNodeToList(node, m_active_nodes);
654 _gatherItems(active_nodes_to_send, active_faces_to_send, m_active_nodes, m_active_faces2, node_finder, face_finder);
656 for (Integer index = 0; index < active_faces.size(); index++){
657 Item face = active_faces[index];
658 const Int64 current_uid = face.uniqueId();
659 FaceInfo2& fi = m_active_faces2[face.uniqueId()];
660 if (current_uid != fi.uniqueId()){
661 face.mutableItemBase().setUniqueId(fi.uniqueId());
662 face.mutableItemBase().setOwner(fi.owner(), sid);
666 for (Integer index = 0; index < active_nodes.size(); index++){
667 Item node = active_nodes[index];
668 const Int64 current_uid = node.uniqueId();
669 NodeInfo& ni = m_active_nodes[node.uniqueId()];
670 if (current_uid != ni.uniqueId()){
671 node.mutableItemBase().setUniqueId(ni.uniqueId());
672 node.mutableItemBase().setOwner(ni.owner(), sid);
679 faces_map.notifyUniqueIdsChanged();
681 mesh->nodesMap().notifyUniqueIdsChanged();
696void ParallelAMRConsistency::
709 sbuf.setMode(ISerializer::ModeReserve);
731 coords.
add(
fi.center().x);
732 coords.
add(
fi.center().y);
733 coords.
add(
fi.center().z);
736 sbuf.reserveInteger(1);
737 sbuf.reserveInteger(1);
738 sbuf.reserveInteger(1);
741 sbuf.reserveArray(coords);
744 sbuf.allocateBuffer();
752 sbuf.putArray(coords);
772 const Real
tol = 10e-6;
773 for (Integer z = 0; z <
nb_face; ++z){
777 center.
x = coords[z * 3];
778 center.
y = coords[z * 3 + 1];
779 center.
z = coords[z * 3 + 2];
784 error() <<
"face uid not found \n";
787 fi.setCenter(center);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Cell cell(Int32 i) const
i-ème maille de la face
Int32 nbCell() const
Nombre de mailles de la face (1 ou 2)
void resize(Integer new_size, bool use_prime=false)
Redimensionne la table de hachage.
bool add(KeyTypeConstRef id, const ValueType &value)
Ajoute la valeur value correspondant à la clé id.
void clear()
Supprime tous les éléments de la table.
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual FaceGroup allFaces()=0
Groupe de toutes les faces.
virtual IItemFamily * itemFamily(eItemKind ik)=0
Retourne la famille d'entité de type ik.
virtual IItemFamily * faceFamily()=0
Retourne la famille des faces.
virtual NodeGroup allNodes()=0
Groupe de tous les noeuds.
virtual Integer nbFace()=0
Nombre de faces du maillage.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual void allGather(ConstArrayView< char > send_buf, ArrayView< char > recv_buf)=0
Effectue un regroupement sur tous les processeurs. Il s'agit d'une opération collective....
virtual void barrier()=0
Effectue une barière.
Int32 flags() const
Flags de l'entité
@ II_Shared
L'entité est partagée par un autre sous-domaine.
@ II_SubDomainBoundary
L'entité est à la frontière de deux sous-domaines.
Identifiant unique d'une entité.
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.
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
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é.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
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é
Classe gérant un vecteur de réel de dimension 3.
constexpr ARCCORE_HOST_DEVICE Real squareNormL2() const
Retourne la norme L2 au carré du triplet .
Implémentation d'un tampon pour la sérialisation.
Implémentation d'un maillage.
Infos sur une Face active.
Infos sur une Face active.
Tableau associatif de ItemInternal.
structure de recherche d'un noeud à partir de ses coords La clef de hashage est la position geometriq...
void makeNewItemsConsistent2(MapCoordToUid &node_finder, MapCoordToUid &face_finder)
Détermine les faces à envoyer aux voisins.
void makeNewItemsConsistent(NodeMapCoordToUid &node_finder, FaceMapCoordToUid &face_finder)
Détermine les faces à envoyer aux voisins.
void _gatherFaces(ConstArrayView< ItemUniqueId > faces_to_send, ConstArrayView< ItemUniqueId > nodes_to_send, FaceInfoMap &face_map, MapCoordToUid &node_finder, MapCoordToUid &face_finder, ItemUidSet &updated_face_uids, ItemUidSet &updated_node_uids)
ParallelAMRConsistency(IMesh *mesh)
AMR.
Integer size() const
Nombre d'éléments du vecteur.
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.
void getArray(Array< Real > &values) override
Redimensionne et remplit values.
Integer getInteger() override
Récupère une taille.
void setMode(eMode new_mode) override
Positionne le fonctionnement actuel.
Exception lorsqu'une erreur fatale est survenue.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
Classe d'accès aux traces.
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.
Vecteur 1D de données avec sémantique par valeur (style STL).
ARCCORE_HOST_DEVICE Real3 cross(Real3 v1, Real3 v2)
Produit vectoriel de deux vecteurs à 3 composantes.
bool isZero(const BuiltInProxy< _Type > &a)
Teste si une valeur est exactement égale à zéro.
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
@ IK_Face
Entité de maillage de genre face.
Int32 Integer
Type représentant un entier.
Real y
deuxième composante du triplet
Real z
troisième composante du triplet
Real x
première composante du triplet