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
60 slaves_node_uid.add(
tn.node().uniqueId());
68 slaves_face_uid.add(
tf.face().uniqueId());
93 info() <<
"DESERIALIZE_INFO rank=" << m_rank <<
" nb_face=" << uids.largeSize();
97 info() <<
"NODES: " << slaves_node_uid;
99 info() <<
"FACES: " << slaves_face_uid;
158 Integer face_index = 0;
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];
170 m_sdi_array.add(
sdi);
173 void convertUniqueIds()
175 for(Integer z=0, n=m_sdi_array.size(); z<n; ++ z){
180 sdi->slaves_face_local_id.resize(
sdi->slaves_face_uid.size());
181 m_face_family->itemsUniqueIdToLocalId(
sdi->slaves_face_local_id,
sdi->slaves_face_uid);
185 sdi->slaves_node_local_id.resize(
sdi->slaves_node_uid.size());
186 m_node_family->itemsUniqueIdToLocalId(
sdi->slaves_node_local_id,
sdi->slaves_node_uid);
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())
271 OneSubDomainInfo* sdi =
new OneSubDomainInfo(
traceMng(),rank);
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 ){
336 Int32 rank = args.
rank();
339 case ISerializer::ModeReserve:
340 sdi->serializeReserve(buf);
343 sdi->serializePut(buf);
346 sdi->deserialize(buf);
370 m_deserialized_info->convertUniqueIds();
379 FaceFamily&
face_family = m_mesh->trueFaceFamily();
380 for( Integer i=0, n=tied_interfaces.size(); i<n; ++i ){
409 return m_mesh->faceFamily();
415ARCANE_MESH_END_NAMESPACE
Interface d'une famille d'entités.
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual IItemFamily * faceFamily()=0
Retourne la famille des faces.
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é
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Classe gérant un vecteur de réel de dimension 2.
Face semi-conforme du maillage.
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.
Noeud semi-conforme du maillage.
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 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'un sérialiseur.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
virtual void getArray(Array< Real > &values)=0
Redimensionne et remplit values.
virtual void putArray(Span< const Real > values)=0
Sauve le nombre d'éléments et les values éléments.
virtual eMode mode() const =0
Mode de fonctionnement actuel.
virtual void reserveArray(Span< const Real > values)=0
Réserve pour sauver le nombre d'éléments et les values éléments.
Interface du gestionnaire de traces.
Classe d'accès aux traces.
ITraceMng * traceMng() const
Gestionnaire de trace.
Vecteur 1D de données avec sémantique par valeur (style STL).
ConstArrayView< Real > RealConstArrayView
Equivalent C d'un tableau à une dimension de réels.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Int32 Integer
Type représentant un entier.
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.