14#include "arcane/utils/ArcanePrecomp.h"
16#include "arcane/utils/NotSupportedException.h"
17#include "arcane/utils/ArgumentException.h"
19#include "arcane/mesh/TiedInterfaceExchanger.h"
20#include "arcane/mesh/DynamicMesh.h"
21#include "arcane/mesh/TiedInterface.h"
22#include "arcane/mesh/FaceFamily.h"
24#include "arcane/SerializeBuffer.h"
25#include "arcane/IParallelMng.h"
26#include "arcane/ItemPrinter.h"
27#include "arcane/ItemFamilySerializeArgs.h"
37ARCANE_MESH_BEGIN_NAMESPACE
56 nb_items.add(nb_tied_node);
57 nb_items.add(nb_tied_face);
58 for(
Integer z=0; z<nb_tied_node; ++z ){
66 for(
Integer z=0; z<nb_tied_face; ++z ){
93 info() <<
"DESERIALIZE_INFO rank=" << m_rank <<
" nb_face=" << uids.largeSize();
97 info() <<
"NODES: " << slaves_node_uid;
99 info() <<
"FACES: " << slaves_face_uid;
160 info(4) <<
"BUILD_AFTER_DESERIALIZE_INFO rank=" << sdi->m_rank <<
" nb_face=" << nb_uid;
161 for(
Integer i=0; i<nb_uid; ++i ){
162 Int64 uid = sdi->uids[i];
163 Integer nb_slave_node = sdi->nb_items[i*2];
164 Integer nb_slave_face = sdi->nb_items[(i*2)+1];
166 m_index_map.insert(std::make_pair(uid,
FaceInfo(sdi,i,face_index,node_index)));
167 face_index += nb_slave_face;
168 node_index += nb_slave_node;
170 m_sdi_array.add(sdi);
173 void convertUniqueIds()
175 for(
Integer z=0, n=m_sdi_array.size(); z<n; ++ z){
178 Integer nb_total_slave_face = sdi->slaves_face_uid.
size();
179 info(4) <<
"CONVERT_UID nb_slave_face=" << nb_total_slave_face;
183 Integer nb_total_slave_node = sdi->slaves_node_uid.
size();
184 info(4) <<
"CONVERT_UID nb_slave_node=" << nb_total_slave_node;
190 const FaceInfo& _getInfo(Int64 uid)
192 std::map<Int64,FaceInfo>::const_iterator iter = m_index_map.find(uid);
193 if (iter==m_index_map.end())
194 throw ArgumentException(A_FUNCINFO,String::format(
"Can not find uid '{0}'",uid));
198 void getNbSlave(Int64 uid,Integer* nb_node,Integer* nb_face)
200 const FaceInfo& fi = _getInfo(uid);
201 Integer face_index = fi.face_index;
202 *nb_node = fi.sd_info->nb_items[face_index*2];
203 *nb_face = fi.sd_info->nb_items[(face_index*2)+1];
206 virtual void fillTiedInfos(Face face,
207 Int32ArrayView tied_nodes_lid,
208 Real2ArrayView tied_nodes_isos,
209 Int32ArrayView tied_faces_lid)
211 const FaceInfo& fi = _getInfo(face.uniqueId());
212 OneSubDomainInfo* sdi = fi.sd_info;
215 Integer face_index = fi.face_index;
216 Integer nb_node = sdi->nb_items[face_index*2];
217 Integer nb_face = sdi->nb_items[(face_index*2)+1];
221 tied_nodes_lid.copy(nodes_lid);
222 tied_faces_lid.copy(faces_lid);
223 for( Integer z=0; z<nb_node; ++z )
224 tied_nodes_isos[z] = Real2(isos[(z*2)],isos[(z*2)+1]);
229 IItemFamily* m_face_family;
230 IItemFamily* m_node_family;
231 std::map<Int64,FaceInfo> m_index_map;
232 UniqueArray<OneSubDomainInfo*> m_sdi_array;
241TiedInterfaceExchanger::
242TiedInterfaceExchanger(DynamicMesh* mesh)
243: TraceAccessor(mesh->traceMng())
245, m_sub_domain(mesh->subDomain())
246, m_deserialized_info(new DeserializedInfo(mesh,traceMng()))
247, m_my_rank(mesh->parallelMng()->commRank())
254TiedInterfaceExchanger::
255~TiedInterfaceExchanger()
257 for( SubDomainInfoMap::const_iterator iter(m_infos.begin()); iter!=m_infos.end(); ++iter )
259 delete m_deserialized_info;
265inline TiedInterfaceExchanger::OneSubDomainInfo* TiedInterfaceExchanger::
268 SubDomainInfoMap::const_iterator iter = m_infos.find(rank);
269 if (iter!=m_infos.end())
272 m_infos.insert(std::make_pair(rank,sdi));
299 FaceFamily& face_family = m_mesh->trueFaceFamily();
301 for(
Integer i=0, n=tied_interfaces.
size(); i<n; ++i ){
304 TiedInterfaceNodeList tied_nodes = ti->
tiedNodes();
305 TiedInterfaceFaceList tied_faces = ti->
tiedFaces();
309 Int32 owner = new_owners[iface];
314 sdi->addOne(face,face_tied_nodes,face_tied_faces);
317 face_family.removeTiedInterface(ti);
339 case ISerializer::ModeReserve:
340 sdi->serializeReserve(buf);
343 sdi->serializePut(buf);
346 sdi->deserialize(buf);
347 m_deserialized_info->buildAfterDeserializeInfo(sdi);
365 m_deserialized_info->buildAfterDeserializeInfo(sdi);
370 m_deserialized_info->convertUniqueIds();
379 FaceFamily& face_family = m_mesh->trueFaceFamily();
380 for(
Integer i=0, n=tied_interfaces.
size(); i<n; ++i ){
384 nb_slave_nodes.
resize(nb_master_face);
385 nb_slave_faces.
resize(nb_master_face);
392 m_deserialized_info->getNbSlave(face.
uniqueId(),&nb_node,&nb_face);
393 nb_slave_nodes[index] = nb_node;
394 nb_slave_faces[index] = nb_face;
397 ti->rebuild(m_deserialized_info,nb_slave_nodes,nb_slave_faces);
398 face_family.applyTiedInterface(ti);
409 return m_mesh->faceFamily();
415ARCANE_MESH_END_NAMESPACE
Integer size() const
Nombre d'éléments du vecteur.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
Vue constante d'un tableau de type T.
constexpr ConstArrayView< T > subView(Integer abegin, Integer asize) const noexcept
Sous-vue (constante) à partir de l'élément abegin et contenant asize éléments.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
constexpr ConstArrayView< T > subConstView(Integer abegin, Integer asize) const noexcept
Sous-vue (constante) à partir de l'élément abegin et contenant asize éléments.
Interface d'une famille d'entités.
Interface d'un sérialiseur.
virtual void putArray(Span< const Real > values)=0
Sauve le nombre d'éléments et les values éléments.
virtual void reserveArray(Span< const Real > values)=0
Réserve pour sauver le nombre d'éléments et les values éléments.
virtual void getArray(Array< Real > &values)=0
Redimensionne et remplit values.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
virtual eMode mode() const =0
Mode de fonctionnement actuel.
Interface du gestionnaire de traces.
Arguments des callbacks de sérialisation des familles d'entités.
Int32 rank() const
Rang de la source ou de la destination.
ISerializer * serializer() const
Sérialiseur associé
Integer size() const
Nombre d'éléments du groupe.
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Classe gérant un vecteur de réel de dimension 2.
constexpr __host__ __device__ Real2 & add(Real2 b)
Ajoute b au couple.
Face semi-conforme du maillage.
Face face() const
Face soudée.
void buildAfterDeserializeInfo(OneSubDomainInfo *sdi)
Construit les infos après déserialisation.
Int32UniqueArray slaves_node_local_id
Uniquement après désérialisation, contient le localId() de chaque entité de slaves_node_uid.
Int32UniqueArray slaves_face_local_id
Uniquement après désérialisation, contient le localId() de chaque entité de slaves_face_uid.
void serialize(const ItemFamilySerializeArgs &args) override
Sérialise les faces dans le tampon buf.
void initialize() override
Initialise l'instance avant le début des échanges.
IItemFamily * family() const override
Famille associée.
void finalize() override
Effectue les traitements de fin d'échange.
Informations sur les semi-conformitées du maillage.
virtual TiedInterfaceFaceList tiedFaces() const
Liste des informations sur les faces esclaves d'une face maître.
virtual FaceGroup masterInterface() const
Groupe contenant les faces maîtres.
virtual TiedInterfaceNodeList tiedNodes() const
Liste des informations sur les noeuds esclaves d'une face maître.
Noeud semi-conforme du maillage.
Node node() const
Noeud lié
Real2 isoCoordinates() const
Coordonnées iso-barycentriques du noeud.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessage info() const
Flot pour un message d'information.
ITraceMng * traceMng() const
Gestionnaire de trace.
ItemGroupT< Face > FaceGroup
Groupe de faces.
ItemVariableScalarRefT< Int32 > VariableItemInt32
Grandeur de type entier 32 bits.
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
UniqueArray< Real > RealUniqueArray
Tableau dynamique à une dimension de réels.
UniqueArray< Integer > IntegerUniqueArray
Tableau dynamique à une dimension d'entiers.
std::int32_t Int32
Type entier signé sur 32 bits.
ConstArrayView< Real > RealConstArrayView
Equivalent C d'un tableau à une dimension de réels.
Real y
deuxième composante du couple
Real x
première composante du couple
Integer slave_node_index
Indice dans isos et slaves_node_uid du première noeud esclave.
Integer slave_face_index
Indice dans slaves_face_uid de la première face esclave.
OneSubDomainInfo * sd_info
Instance contenant l'info.
Integer face_index
Indice de la face dans le tableau uid.