14#include "arcane/utils/NotSupportedException.h"
15#include "arcane/utils/HashTableMap.h"
16#include "arcane/utils/Collection.h"
18#include "arcane/core/VariableTypes.h"
20#include "arcane/core/ItemPrinter.h"
21#include "arcane/core/ISerializer.h"
22#include "arcane/core/IItemFamily.h"
23#include "arcane/core/ItemVector.h"
24#include "arcane/core/MeshToMeshTransposer.h"
25#include "arcane/core/ItemFamilySerializeArgs.h"
26#include "arcane/core/IParallelMng.h"
28#include "arcane/core/IMesh.h"
29#include "arcane/core/IVariableMng.h"
30#include "arcane/core/ISubDomain.h"
32#include "arcane/mesh/ItemFamilyVariableSerializer.h"
47class ItemFamilyExchange;
58const Integer VARIABLE_MAGIC_NUMBER = 0x3a9e4324;
63ItemFamilyVariableSerializer::
64ItemFamilyVariableSerializer(IItemFamily* family)
65: TraceAccessor(family->traceMng())
66, m_item_family(family)
73ItemFamilyVariableSerializer::
74~ItemFamilyVariableSerializer()
81void ItemFamilyVariableSerializer::
94 family_to_exchange.
add(m_item_family);
97 family_to_exchange.
add(child_family);
99 for (
Integer i=0; i<family_to_exchange.
size(); ++i ){
100 IItemFamily* current_family = family_to_exchange[i];
101 info(4) <<
" Serializing family " << current_family->
fullName();
105 for( VariableCollection::Enumerator i_var(used_vars); ++i_var; ){
117 if (var_family==current_family) {
132void ItemFamilyVariableSerializer::
135 switch(sbuf->
mode()){
136 case ISerializer::ModeReserve:
138 sbuf->reserveInteger(1);
139 sbuf->reserveInteger(1);
143 sbuf->
put(VARIABLE_MAGIC_NUMBER);
149 if (magic_number!=VARIABLE_MAGIC_NUMBER)
150 ARCANE_FATAL(
"Internal error: bad magic number expected={0} found={1}",
151 VARIABLE_MAGIC_NUMBER,magic_number);
155 if (local_ids.
size()!=nb_item){
159 ARCANE_FATAL(
"Bad value for received_items family={0} n={1} expected={2}",
160 m_item_family->name(),local_ids,nb_item);
172void ItemFamilyVariableSerializer::
176 switch(sbuf->
mode()){
177 case ISerializer::ModeReserve:
182 sbuf->
put(var_full_name);
187 sbuf->
get(expected_name);
188 if (expected_name!=var_full_name)
189 ARCANE_FATAL(
"Incoherent variable var={0} expected={1}",
190 var_full_name,expected_name);
203void ItemFamilyVariableSerializer::
210 String mode_str = (is_recv) ?
"recv" :
"send";
213 Int32 owner_rank = (is_recv) ? m_item_family->parallelMng()->commRank() : args.
rank();
218 info(4) <<
"-- Serializing variable " << var->fullName()
219 <<
" group=" << var->itemGroup().name()
220 <<
" (n=" << var->itemGroup().size() <<
")"
221 <<
" mode=" << (int)sbuf->
mode()
222 <<
" target_rank=" << args.
rank();
233 if (var->itemFamily() != m_item_family){
237 m_item_family->
view(local_ids),
241 Int32 lid = iitem.localId();
242 if (lid != NULL_ITEM_LOCAL_ID && iitem->owner() == owner_rank) {
248 if (var->isPartial())
251 var->serialize(sbuf,dest_lids);
254 if (var->isPartial())
257 var->serialize(sbuf,local_ids);
282void ItemFamilyVariableSerializer::
290 case ISerializer::ModeReserve:
295 std::set<Int32> items_to_send;
297 items_to_send.insert(local_ids[i]);
300 if (items_to_send.find(iitem.itemLocalId())!=items_to_send.end()){
301 indexes_to_send.
add(iitem.index());
302 unique_ids_to_send.
add((*iitem).uniqueId());
306 if (mode==ISerializer::ModeReserve){
313 sbuf->
putSpan(unique_ids_to_send);
328 unique_ids.
resize(nb_item);
333 unique_ids_to_index.
nocheckAdd((*iitem).uniqueId(),iitem.index());
336 for(
Integer i=0; i<nb_item; ++i ){
343 ARCANE_FATAL(
"Can not find item with unique_id={0} index={1}",unique_ids[i],i);
344 indexes[i] = data->value();
#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.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Table de hachage pour tableaux associatifs.
void nocheckAdd(KeyTypeConstRef id, const ValueType &value)
Ajoute la valeur value correspondant à la clé id.
Data * lookup(KeyTypeConstRef id)
Recherche la valeur correspondant à la clé id.
Interface d'une famille d'entités.
virtual String fullName() const =0
Nom complet de la famille (avec celui du maillage)
virtual ItemVectorView view(Int32ConstArrayView local_ids)=0
Vue sur les entités.
Interface d'un sérialiseur.
void reserveInt64(Int64 n)
Réserve pour n Int64.
virtual void reserve(eBasicDataType dt, Int64 n)=0
Réserve de la mémoire pour n objets de type dt.
virtual Integer getInteger()=0
Récupère une taille.
eMode
Mode de fonctionnement du sérialiseur.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
virtual Int64 getInt64()=0
Récupère une taille.
virtual void put(Span< const Real > values)=0
Ajoute le tableau values.
virtual void putSpan(Span< const Real > values)
Ajoute le tableau values.
virtual eMode mode() const =0
Mode de fonctionnement actuel.
virtual void getSpan(Span< Real > values)
Récupère le tableau values.
virtual void get(ArrayView< Real > values)=0
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 putInt64(Int64 value)=0
Ajoute l'entier value.
Interface du gestionnaire de variables.
virtual VariableCollection usedVariables()=0
Liste des variables utilisées.
Interface d'une variable.
virtual String fullName() const =0
Nom complet de la variable (avec le préfixe de la famille)
@ PNoExchange
Indique que la variable ne doit pas être échangée.
virtual int property() const =0
Retourne les propriétés de la variable.
virtual ItemGroup itemGroup() const =0
Groupe du maillage associé.
virtual void serialize(ISerializer *sbuffer, IDataOperation *operation=0)=0
virtual IItemFamily * itemFamily() const =0
Famille d'entité associée.
Arguments des callbacks de sérialisation des familles d'entités.
Int32 rank() const
Rang de la source ou de la destination.
Int32ConstArrayView localIds() const
Indices locaux des entités. En sérialisation, il s'agit des indices locaux des entités envoyées au ra...
ISerializer * serializer() const
Sérialiseur associé
UniqueArray< IVariable * > m_variables_to_exchange
Liste des variables à échanger.
void _serializePartialVariable(IVariable *var, ISerializer *sbuf, Int32ConstArrayView local_ids)
Serialise une variable partielle.
void _checkSerializationVariable(ISerializer *sbuf, IVariable *var)
Sérialise le nom de la variable pour vérifier que la désérialisation est correcte.
void _checkSerialization(ISerializer *sbuf, Int32ConstArrayView local_ids)
Sérialize un nombre magique et le nombre d'entité afin de vérifier que la désérialisation est correct...
Groupe d'entités de maillage.
Integer size() const
Nombre d'éléments du groupe.
Classe utilitaire pour imprimer les infos sur une entité.
Int32 size() const
Nombre d'éléments du vecteur.
static ItemVector transpose(IMesh *meshA, IMesh *meshB, ItemVectorView itemsA, bool do_fatal=false)
Transpose itemsA from meshB to items on meshB.
Chaîne de caractères unicode.
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).
@ Highest
Niveau le plus élevé
-*- 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.
bool arcaneIsDebug()
Vrai si la macro ARCANE_DEBUG est définie.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
std::int32_t Int32
Type entier signé sur 32 bits.