Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
ItemFamilySerializer.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* ItemFamilySerializer.cc (C) 2000-2018 */
9/* */
10/* Unique Serializer valid for any item family. */
11/* Requires the use of the family graph: ItemFamilyNetwork */
12/*---------------------------------------------------------------------------*/
13/*---------------------------------------------------------------------------*/
14
15#include "arcane/core/IItemFamily.h"
16#include "arcane/core/IParallelMng.h"
17#include "arcane/core/IMesh.h"
19#include "arcane/core/ConnectivityItemVector.h"
20
21#include "arcane/mesh/ItemFamilySerializer.h"
22#include "arcane/mesh/ItemFamilyNetwork.h"
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane::mesh
28{
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
35{
36 m_family->traceMng()->debug(Trace::High) << "_serializeItems : "
37 << m_family->mesh()->name() << " "
38 << m_family->name() << " "
39 << m_family->parentFamilyDepth();
40
41 Int32UniqueArray created_item_lids(local_ids.size()); // todo do not provide the lids because they are not used later
42 // Serialize items along with their dependencies
43 ItemData item_dependencies_data(local_ids.size(), 0, created_item_lids, m_family, m_family_modifier, m_family->parallelMng()->commRank());
44 _fillItemDependenciesData(item_dependencies_data, local_ids);
45 item_dependencies_data.serialize(buf); // ItemData handles the state of the ISerializer
46}
47
48/*---------------------------------------------------------------------------*/
49/*---------------------------------------------------------------------------*/
50
53{
54 _deserializeItemsOrRelations(buf, local_ids);
55}
56
57/*---------------------------------------------------------------------------*/
58/*---------------------------------------------------------------------------*/
59
60void ItemFamilySerializer::
61_deserializeItemsOrRelations(ISerializer* buf, Int32Array* local_ids)
62{
63 // Deserialize items (if m_deserialize_items) or items relations
64 ItemData item_data; // it may be dependencies or relations
65 if (local_ids) {
66 item_data.deserialize(buf, m_family->mesh(), *local_ids);
67 }
68 else {
69 item_data.deserialize(buf, m_family->mesh());
70 }
71
72 // Add items (or append relations to existing items)
73 m_mesh_builder->addFamilyItems(item_data);
74}
75
76/*---------------------------------------------------------------------------*/
77/*---------------------------------------------------------------------------*/
78
81{
82 m_family->traceMng()->debug(Trace::High) << "_serializeItems relations : "
83 << m_family->mesh()->name() << " "
84 << m_family->name() << " "
85 << m_family->parentFamilyDepth();
86
87 Int32UniqueArray created_item_lids(local_ids.size()); // todo do not provide the lids because they are not used later
88 // Serialize items along with their relations
89 ItemData item_relations_data(local_ids.size(), 0, created_item_lids, m_family, m_family_modifier, m_family->parallelMng()->commRank());
90 _fillItemRelationsData(item_relations_data, local_ids);
91 item_relations_data.serialize(buf); // ItemData handles the state of the ISerializer
92}
93
94/*---------------------------------------------------------------------------*/
95/*---------------------------------------------------------------------------*/
96
99{
100 _deserializeItemsOrRelations(buf, local_ids);
101}
102
103/*---------------------------------------------------------------------------*/
104/*---------------------------------------------------------------------------*/
105
106void ItemFamilySerializer::
107_fillItemDependenciesData(ItemData& item_data, Int32ConstArrayView local_ids)
108{
109 Int64Array& item_infos = item_data.itemInfos();
110 Int32ArrayView item_owners = item_data.itemOwners();
111 // Reserve size
112 const Integer nb_item = local_ids.size();
113 item_infos.reserve(1 + nb_item * 32); // Size evaluation for hexa cell (the more data to store) : 1_family_info + nb_item *(2_info_per_family + 6 (faces) + 12 (edges) + 8 (vertices) connected elements) = 1 + nb_item *(6 + 6 + 12 +8)
114 // Fill item data (cf. ItemData.h)
115 IItemFamilyNetwork* family_network = m_family->mesh()->itemFamilyNetwork();
116 auto out_connectivities = family_network->getChildDependencies(m_family); // Only dependencies are needed to create item. Relations are treated separately
117 item_infos.add(out_connectivities.size());
118 ENUMERATE_ITEM (item, m_family->view(local_ids)) {
119 item_infos.add(item->type());
120 item_infos.add(item->uniqueId().asInt64());
121 item_owners[item.index()] = item->owner();
122 for (auto out_connectivity : out_connectivities) {
123 if (out_connectivity) {
124 item_infos.add(out_connectivity->targetFamily()->itemKind());
125 item_infos.add(out_connectivity->nbConnectedItem(ItemLocalId(item)));
126 ConnectivityItemVector connectivity_accessor(out_connectivity);
127 ENUMERATE_ITEM (connected_item, connectivity_accessor.connectedItems(ItemLocalId(item))) {
128 item_infos.add(connected_item->uniqueId().asInt64());
129 }
130 }
131 }
132 }
133}
134
135void ItemFamilySerializer::
136_fillItemRelationsData(ItemData& item_data, Int32ConstArrayView local_ids)
137{
138 // Fill item relations, i.e., upward connectivities and extra connectivities (e.g., dof)
139 Int64Array& item_infos = item_data.itemInfos();
140 Int32ArrayView item_owners = item_data.itemOwners();
141 // Reserve size
142 const Integer nb_item = local_ids.size();
143 item_infos.reserve(1 + nb_item * 32); // Size evaluation for hexa cell (the more data to store) : 1_family_info + nb_item *(2_info_per_family + 6 (faces) + 12 (edges) + 8 (vertices) connected elements) = 1 + nb_item *(6 + 6 + 12 +8)
144 // Fill item data (cf. ItemData.h)
145 IItemFamilyNetwork* family_network = m_family->mesh()->itemFamilyNetwork();
146 auto out_connectivities = family_network->getChildRelations(m_family); // Only relations are taken
147 item_infos.add(out_connectivities.size());
148 ENUMERATE_ITEM (item, m_family->view(local_ids)) {
149 item_infos.add(item->type());
150 item_infos.add(item->uniqueId().asInt64());
151 item_owners[item.index()] = item->owner();
152 for (auto out_connectivity : out_connectivities) {
153 item_infos.add(out_connectivity->targetFamily()->itemKind());
154 item_infos.add(out_connectivity->nbConnectedItem(ItemLocalId(item)));
155 ConnectivityItemVector connectivity_accessor(out_connectivity);
156 ENUMERATE_ITEM (connected_item, connectivity_accessor.connectedItems(ItemLocalId(item))) {
157 item_infos.add(connected_item->uniqueId().asInt64());
158 }
159 }
160 }
161}
162
163/*---------------------------------------------------------------------------*/
164/*---------------------------------------------------------------------------*/
165
167family() const
168{
169 return m_family;
170}
171
172/*---------------------------------------------------------------------------*/
173/*---------------------------------------------------------------------------*/
174
175} // namespace Arcane::mesh
176
177/*---------------------------------------------------------------------------*/
178/*---------------------------------------------------------------------------*/
Types and macros for iterating over mesh entities.
#define ENUMERATE_ITEM(name, group)
Generic enumerator for a node group.
constexpr Integer size() const noexcept
Returns the size of the array.
void add(ConstReferenceType val)
Adds element val to the end of the array.
void reserve(Int64 new_capacity)
Reserves memory for new_capacity elements.
Manages the retrieval of connectivity information.
constexpr Integer size() const noexcept
Number of elements in the array.
virtual SharedArray< IIncrementalItemConnectivity * > getChildDependencies(IItemFamily *source_family)=0
Get the list of all dependencies, children of a family source_family or.
virtual SharedArray< IIncrementalItemConnectivity * > getChildRelations(IItemFamily *source_family)=0
Get the list of all relations, children of a family source_family or parents.
Interface of an entity family.
Definition IItemFamily.h:83
virtual IMesh * mesh() const =0
Associated mesh.
virtual ItemVectorView view(Int32ConstArrayView local_ids)=0
View on the entities.
virtual IItemFamilyNetwork * itemFamilyNetwork()=0
Family network interface (connected families).
Index of an Item in a variable.
Definition ItemLocalId.h:42
void addFamilyItems(ItemData &item_info)
Ajout générique d'items d'une famille, décrite par son ItemInfo.
void serializeItemRelations(ISerializer *buf, Int32ConstArrayView cells_local_id) override
Serializes the relations of the entities of the family family() into buf.
void deserializeItems(ISerializer *buf, Int32Array *local_ids) override
Deserializes the entities of the family family() from buf.
IItemFamily * family() const override
Associated family.
void deserializeItemRelations(ISerializer *buf, Int32Array *cells_local_id) override
Deserializes the relations of the entities of the family family() from buf.
void serializeItems(ISerializer *buf, Int32ConstArrayView local_ids) override
Serializes the entities of the family family() into buf.
Array< Int64 > Int64Array
Dynamic one-dimensional array of 64-bit integers.
Definition UtilsTypes.h:125
Int32 Integer
Type representing an integer.
ConstArrayView< Int32 > Int32ConstArrayView
C equivalent of a 1D array of 32-bit integers.
Definition UtilsTypes.h:482
UniqueArray< Int32 > Int32UniqueArray
Dynamic 1D array of 32-bit integers.
Definition UtilsTypes.h:341
ArrayView< Int32 > Int32ArrayView
C equivalent of a 1D array of 32-bit integers.
Definition UtilsTypes.h:453
Array< Int32 > Int32Array
Dynamic one-dimensional array of 32-bit integers.
Definition UtilsTypes.h:127