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"
46class ItemFamilyExchange;
57 const Integer VARIABLE_MAGIC_NUMBER = 0x3a9e4324;
62ItemFamilyVariableSerializer::
63ItemFamilyVariableSerializer(IItemFamily* family)
64: TraceAccessor(family->traceMng())
65, m_item_family(family)
72ItemFamilyVariableSerializer::
73~ItemFamilyVariableSerializer()
80void ItemFamilyVariableSerializer::
93 family_to_exchange.
add(m_item_family);
96 family_to_exchange.
add(child_family);
98 for (
Integer i = 0; i < family_to_exchange.
size(); ++i) {
99 IItemFamily* current_family = family_to_exchange[i];
100 info(4) <<
" Serializing family " << current_family->
fullName();
104 for (VariableCollection::Enumerator i_var(used_vars); ++i_var;) {
116 if (var_family == current_family) {
131void ItemFamilyVariableSerializer::
134 switch (sbuf->
mode()) {
135 case ISerializer::ModeReserve:
137 sbuf->reserveInteger(1);
138 sbuf->reserveInteger(1);
142 sbuf->
put(VARIABLE_MAGIC_NUMBER);
148 if (magic_number != VARIABLE_MAGIC_NUMBER)
149 ARCANE_FATAL(
"Internal error: bad magic number expected={0} found={1}",
150 VARIABLE_MAGIC_NUMBER, magic_number);
154 if (local_ids.
size() != nb_item) {
158 ARCANE_FATAL(
"Bad value for received_items family={0} n={1} expected={2}",
159 m_item_family->name(), local_ids, nb_item);
171void ItemFamilyVariableSerializer::
175 switch (sbuf->
mode()) {
176 case ISerializer::ModeReserve:
181 sbuf->
put(var_full_name);
185 sbuf->
get(expected_name);
186 if (expected_name != var_full_name)
187 ARCANE_FATAL(
"Incoherent variable var={0} expected={1}",
188 var_full_name, expected_name);
200void ItemFamilyVariableSerializer::
207 String mode_str = (is_recv) ?
"recv" :
"send";
210 Int32 owner_rank = (is_recv) ? m_item_family->parallelMng()->commRank() : args.
rank();
215 info(4) <<
"-- Serializing variable " << var->fullName()
216 <<
" group=" << var->itemGroup().name()
217 <<
" (n=" << var->itemGroup().size() <<
")"
218 <<
" mode=" << (int)sbuf->
mode()
219 <<
" target_rank=" << args.
rank();
230 if (var->itemFamily() != m_item_family) {
234 m_item_family->
view(local_ids),
239 Int32 lid = iitem.localId();
240 if (lid != NULL_ITEM_LOCAL_ID && iitem->owner() == owner_rank) {
246 if (var->isPartial())
249 var->serialize(sbuf, dest_lids);
252 if (var->isPartial())
255 var->serialize(sbuf, local_ids);
280void ItemFamilyVariableSerializer::
288 case ISerializer::ModeReserve:
292 std::set<Int32> items_to_send;
293 for (
Integer i = 0, n = local_ids.
size(); i < n; ++i) {
294 items_to_send.insert(local_ids[i]);
297 if (items_to_send.find(iitem.itemLocalId()) != items_to_send.end()) {
298 indexes_to_send.
add(iitem.index());
299 unique_ids_to_send.
add((*iitem).uniqueId());
303 if (mode == ISerializer::ModeReserve) {
310 sbuf->
putSpan(unique_ids_to_send);
323 unique_ids.
resize(nb_item);
328 unique_ids_to_index.
nocheckAdd((*iitem).uniqueId(), iitem.index());
331 for (
Integer i = 0; i < nb_item; ++i) {
338 ARCANE_FATAL(
"Can not find item with unique_id={0} index={1}", unique_ids[i], i);
339 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é
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).
void _serializePartialVariable(IVariable *var, ISerializer *sbuf, Int32ConstArrayView local_ids)
Serialise une variable partielle.
void _checkSerializationVariable(ISerializer *sbuf, IVariable *var)
Serializes the variable name to verify that deserialization is correct.
void _checkSerialization(ISerializer *sbuf, Int32ConstArrayView local_ids)
Serializes a magic number and the number of entities to verify that deserialization is correct.
UniqueArray< IVariable * > m_variables_to_exchange
List of variables to exchange.
@ 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.