14#include "arcane/mesh/ItemsExchangeInfo2.h"
16#include "arcane/utils/NotSupportedException.h"
17#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/ValueConvert.h"
20#include "arcane/core/IMesh.h"
21#include "arcane/core/VariableTypes.h"
24#include "arcane/core/ISubDomain.h"
25#include "arcane/core/IParticleFamily.h"
26#include "arcane/core/IParallelMng.h"
27#include "arcane/core/ItemPrinter.h"
28#include "arcane/core/IParallelExchanger.h"
29#include "arcane/core/ISerializer.h"
30#include "arcane/core/ISerializeMessage.h"
31#include "arcane/core/SerializeBuffer.h"
32#include "arcane/core/MeshToMeshTransposer.h"
33#include "arcane/core/IItemFamilyPolicyMng.h"
34#include "arcane/core/IItemFamilySerializer.h"
35#include "arcane/core/ItemFamilySerializeArgs.h"
36#include "arcane/core/ParallelMngUtils.h"
37#include "arcane/core/internal/IItemFamilyInternal.h"
39#include "arcane/mesh/ItemGroupsSerializer2.h"
40#include "arcane/mesh/TiedInterfaceExchanger.h"
41#include "arcane/mesh/ItemFamilyVariableSerializer.h"
44#include "arcane/mesh/DynamicMesh.h"
45#include "arcane/mesh/DynamicMeshIncrementalBuilder.h"
47#include "arcane/IVariableAccessor.h"
54class ItemFamilyExchange;
64const Integer GROUPS_MAGIC_NUMBER = 0x3a9e4325;
70ItemsExchangeInfo2(IItemFamily* item_family)
71: TraceAccessor(item_family->traceMng())
72, m_item_family(item_family)
73, m_groups_serializers()
75, m_family_serializer(nullptr)
80 m_exchanger->setName(item_family->name());
83 addSerializeStep(
new ItemFamilyVariableSerializer(item_family));
92 for( IItemFamilySerializeStep* step : m_serialize_steps )
94 delete m_family_serializer;
95 for(Integer i=0;i<m_groups_serializers.size(); ++i)
96 delete m_groups_serializers[i];
102inline void ItemsExchangeInfo2::
103_addItemToSend(Int32 sub_domain_id,Item item)
105 if (m_send_local_ids[sub_domain_id].empty())
108 m_exchanger->addSender(sub_domain_id);
109 m_send_local_ids[sub_domain_id].add(item.localId());
115bool ItemsExchangeInfo2::
116computeExchangeInfos()
131 if (current_family->hasUniqueIdMap())
140 bool r = m_exchanger->initializeCommunicationsMessages();
115bool ItemsExchangeInfo2:: {
…}
148void ItemsExchangeInfo2::
151 Int32 nb_part = m_item_family->mesh()->meshPartInfo().nbPart();
154 for(
Integer i=0, is=items_to_send.size(); i<is; ++i ){
155 Int64 n = items_to_send[i].size();
157 m_exchanger->addSender(i);
159 std::set<Int32>::const_iterator iids = items_to_send[i].begin();
160 std::set<Int32>::const_iterator ids_end = items_to_send[i].end();
162 for( ; iids!=ids_end; ++iids ){
148void ItemsExchangeInfo2:: {
…}
184void ItemsExchangeInfo2::
185computeExchangeItems()
188 ARCANE_FATAL(
"This call is only valid for ParticleFamily. family={0}",
191 Int32 nb_part = m_item_family->mesh()->meshPartInfo().nbPart();
205 Int32 new_owner = items_owner[item];
207 if (item.
isOwn() && new_owner!=current_owner){
208 _addItemToSend(new_owner,item);
184void ItemsExchangeInfo2:: {
…}
216void ItemsExchangeInfo2::
219 info(4) <<
"ItemsExchangeInfo2::prepareToSend() for " <<
itemFamily()->name();
225 if (groups_serializer->itemFamily() ==
itemFamily()){
234 Int32Array & current_subitem_lids = subitems_to_send[i_dest];
236 if (iitem.localId() != NULL_ITEM_LOCAL_ID)
237 current_subitem_lids.
add(iitem.localId());
239 groups_serializer->prepareData(subitems_to_send);
247 const Integer nb_send = m_exchanger->nbSender();
254 for(
Integer i=0; i<nb_send; ++i ){
259 info(5) <<
"Processing message to " << dest_sub_domain
260 <<
" for family " <<
itemFamily()->fullName();
267 sbuf->
setMode(ISerializer::ModeReserve);
270 m_family_serializer->serializeItems(sbuf,dest_items_local_id);
271 m_family_serializer->serializeItemRelations(sbuf,dest_items_local_id);
274 for(
IItemFamily* child_family : child_families ) {
277 Integer sub_dest_item_count = 0;
279 Int32 lid = iitem.localId();
280 if (lid != NULL_ITEM_LOCAL_ID)
281 ++sub_dest_item_count;
287 _applySerializeStep(IItemFamilySerializeStep::PH_Item,serialize_args);
289 sbuf->reserveInteger(1);
295 _applySerializeStep(IItemFamilySerializeStep::PH_Group,serialize_args);
300 _applySerializeStep(IItemFamilySerializeStep::PH_Variable,serialize_args);
307 m_family_serializer->serializeItems(sbuf,dest_items_local_id);
308 m_family_serializer->serializeItemRelations(sbuf,dest_items_local_id);
311 for(
IItemFamily* child_family : child_families ) {
317 Int32 lid = iitem.localId();
318 if (lid != NULL_ITEM_LOCAL_ID)
319 sub_dest_uids.
add(iitem->uniqueId());
325 _applySerializeStep(IItemFamilySerializeStep::PH_Item,serialize_args);
327 sbuf->
put(GROUPS_MAGIC_NUMBER);
333 _applySerializeStep(IItemFamilySerializeStep::PH_Group,serialize_args);
336 _applySerializeStep(IItemFamilySerializeStep::PH_Variable,serialize_args);
216void ItemsExchangeInfo2:: {
…}
346void ItemsExchangeInfo2::
349 for(
Integer i=0, is=m_exchanger->senderRanks().size(); i<is; ++i ) {
356 sbuf->releaseBuffer();
363void ItemsExchangeInfo2::
366 info(4) <<
"ItemsExchangeInfo2::readAndAllocItems() " <<
itemFamily()->name();
372 for(
Integer i=0, is=m_exchanger->nbReceiver(); i<is; ++i ){
376 <<
" for family " <<
itemFamily()->fullName();
363void ItemsExchangeInfo2:: {
…}
384void ItemsExchangeInfo2::
385readAndAllocSubMeshItems()
388 for(
Integer i=0, is=m_exchanger->nbReceiver(); i<is; ++i ){
392 for(
IItemFamily* child_family : child_families ) {
395 sub_dest_uids.
resize(sub_dest_item_count);
398 itemFamily()->itemsUniqueIdToLocalId(parent_sub_dest_lids,sub_dest_uids,
true);
399 ItemVectorView parent_sub_dest_items(itemFamily()->view(parent_sub_dest_lids));
403 dn->incrementalBuilder()->
addParentItems(parent_sub_dest_items, child_family->itemKind());
407 _applyDeserializePhase(IItemFamilySerializeStep::PH_Item);
414void ItemsExchangeInfo2::
415readAndAllocItemRelations()
417 info(4) <<
"ItemsExchangeInfo2::readAndAllocItemRelations() " << itemFamily()->name();
423 for( Integer i=0, is=m_exchanger->nbReceiver(); i<is; ++i ){
424 ISerializeMessage* comm = m_exchanger->messageToReceive(i);
425 ISerializer* sbuf = comm->serializer();
426 info(5) <<
"Processing item message from " << comm->destination()
427 <<
" for family " << itemFamily()->fullName();
428 m_family_serializer->deserializeItemRelations(sbuf,&m_receive_local_ids[i]);
435void ItemsExchangeInfo2::
438 info(4) <<
"ItemsExchangeInfo2::readGroups() for "
439 << m_item_family->name();
444 for(
Integer i=0, is=m_exchanger->nbReceiver(); i<is; ++i ){
449 <<
" for family " <<
itemFamily()->fullName();
453 if (magic_number!=GROUPS_MAGIC_NUMBER)
454 ARCANE_FATAL(
"Internal error: bad magic number expected={0} found={1}",
455 GROUPS_MAGIC_NUMBER,magic_number);
462 _applyDeserializePhase(IItemFamilySerializeStep::PH_Group);
435void ItemsExchangeInfo2:: {
…}
468void ItemsExchangeInfo2::
471 info(4) <<
"ItemsExchangeInfo2::readVariables() for " << m_item_family->name();
478 family->_internalApi()->resizeVariables(
true);
480 _applyDeserializePhase(IItemFamilySerializeStep::PH_Variable);
468void ItemsExchangeInfo2:: {
…}
486void ItemsExchangeInfo2::
494 ARCANE_FATAL(
"This call is only valid for ParticleFamily. family={0}",
497 ARCANE_FATAL(
"This call is only valid for ParticleFamily without ghost",
500 info(4) <<
"ItemsExchangeInfo2::removeSentItems(): " << family->
name();
502 for(
Integer i=0, is=m_exchanger->nbSender(); i<is; ++i ){
515 child_pfamily->removeParticles(sub_dest_items.
view().
localIds());
516 child_family->endUpdate();
518 pfamily->removeParticles(dest_items_local_id);
486void ItemsExchangeInfo2:: {
…}
526void ItemsExchangeInfo2::
529 m_exchanger->processExchange(m_exchanger_option);
526void ItemsExchangeInfo2:: {
…}
535void ItemsExchangeInfo2::
535void ItemsExchangeInfo2:: {
…}
546void ItemsExchangeInfo2::
549 m_serialize_steps.add(step);
555void ItemsExchangeInfo2::
559 if (step->
phase()==phase)
567void ItemsExchangeInfo2::
568_applyDeserializePhase(IItemFamilySerializeStep::ePhase phase)
570 for( IItemFamilySerializeStep* step : m_serialize_steps ){
571 if (step->
phase()!=phase)
574 Integer nb_receive = m_exchanger->nbReceiver();
576 auto action = IItemFamilySerializeStep::eAction::AC_BeginReceive;
577 step->
notifyAction(IItemFamilySerializeStep::NotifyActionArgs(action,nb_receive));
579 for( Integer i=0; i<nb_receive; ++i ){
580 ISerializeMessage* comm = m_exchanger->messageToReceive(i);
581 ISerializer* sbuf = comm->serializer();
583 ItemFamilySerializeArgs serialize_args(sbuf,comm->destination().value(),local_ids,i);
587 auto action = IItemFamilySerializeStep::eAction::AC_EndReceive;
588 step->
notifyAction(IItemFamilySerializeStep::NotifyActionArgs(action,nb_receive));
596void ItemsExchangeInfo2::
599 m_exchanger_option = option;
596void ItemsExchangeInfo2:: {
…}
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Integer size() const
Nombre d'éléments du vecteur.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
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.
Vue constante d'un tableau de type T.
Interface d'une étape de la sérialisation des familles d'entités.
virtual void notifyAction(const NotifyActionArgs &args)=0
Notifie l'instance qu'on entre dans une certaine phase de l'échange.
ePhase
Phase de la sérialisation.
virtual ePhase phase() const =0
Phase de la sérialisation où cette instance intervient.
@ AC_EndPrepareSend
Fin de la préparation de l'envoie.
@ AC_BeginPrepareSend
Début de la préparation de l'envoie.
virtual void serialize(const ItemFamilySerializeArgs &args)=0
Sérialise dans/depuis buf.
Interface d'une famille d'entités.
virtual IParticleFamily * toParticleFamily()=0
Retourne l'interface de la famille de particule de cette famille.
virtual String name() const =0
Nom de la famille.
virtual ItemVectorView view(Int32ConstArrayView local_ids)=0
Vue sur les entités.
virtual void endUpdate()=0
Notifie la fin de modification de la liste des entités.
Interface d'une famille de particules.
virtual bool getEnableGhostItems() const =0
récupère le flag pour gérer les particules ghost de la famille
Interface d'un sérialiseur.
void reserveInt64(Int64 n)
Réserve pour n Int64.
virtual Integer getInteger()=0
Récupère une taille.
@ ModePut
Le sérialiseur attend des reserve()
virtual Int64 getInt64()=0
Récupère une taille.
virtual void allocateBuffer()=0
Alloue la mémoire du sérialiseur.
virtual void put(Span< const Real > values)=0
Ajoute le tableau values.
virtual void putSpan(Span< const Real > values)
Ajoute le tableau values.
virtual void getSpan(Span< Real > values)
Récupère le tableau values.
virtual void reserveSpan(eBasicDataType dt, Int64 n)=0
Réserve de la mémoire pour n valeurs de dt.
virtual void setMode(eMode new_mode)=0
Positionne le fonctionnement actuel.
virtual void putInt64(Int64 value)=0
Ajoute l'entier value.
Arguments des callbacks de sérialisation des familles d'entités.
Sérialise les entités des groupes.
Vue sur une liste pour obtenir des informations sur les entités.
Vue sur un vecteur d'entités.
Int32ConstArrayView localIds() const
Tableau des numéros locaux des entités.
ItemVectorView view() const
Vue sur le vecteur.
Int32 size() const
Nombre d'éléments du vecteur.
Classe de base d'un élément de maillage.
bool isOwn() const
true si l'entité est appartient au sous-domaine
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
static ItemVector transpose(IMesh *meshA, IMesh *meshB, ItemVectorView itemsA, bool do_fatal=false)
Transpose itemsA from meshB to items on meshB.
Interface d'un message de sérialisation entre IMessagePassingMng.
virtual MessageRank destination() const =0
Rang du destinataire (si isSend() est vrai) ou de l'envoyeur.
virtual ISerializer * serializer()=0
Sérialiseur.
Int32 value() const
Valeur du rang.
Options pour IParallelMng::processExchange().
Int32 verbosityLevel() const
Niveau de verbosité
void setVerbosityLevel(Int32 v)
Positionne le niveau de verbosité
Implémentation d'un tampon pour la sérialisation.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
void addParentItems(const ItemVectorView &items, const eItemKind submesh_kind)
Ajout au maillage courant d'item venant d'un maillage parent.
Implémentation d'un maillage.
UniqueArray< ItemGroupsSerializer2 * > m_groups_serializers
Sérialiseur des groupes.
UniqueArray< IItemFamily * > m_families_to_exchange
Liste des familles intégrées à l'échange.
UniqueArray< SharedArray< Int32 > > m_receive_local_ids
Liste des numéros locaux des entités reçues.
UniqueArray< SharedArray< Int32 > > m_send_local_ids
Liste des entités à envoyer à chaque processeur.
IItemFamily * itemFamily() override
Famille associée.
ItemVariableScalarRefT< Int32 > VariableItemInt32
Grandeur de type entier 32 bits.
Ref< IParallelExchanger > createExchangerRef(IParallelMng *pm)
Retourne une interface pour transférer des messages entre rangs.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
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.
@ Int64
Donnée de type entier 64 bits.
Collection< IItemFamily * > IItemFamilyCollection
Collection de familles d'entités.
@ IK_Particle
Entité de maillage de genre particule.
ARCCORE_SERIALIZE_EXPORT Ref< ISerializer > createSerializer()
Créé une instance de ISerializer.
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
UniqueArray< Integer > IntegerUniqueArray
Tableau dynamique à une dimension d'entiers.
std::int32_t Int32
Type entier signé sur 32 bits.