111 : m_dualnode_family(
rhs.m_dualnode_family)
112 , m_link_family(
rhs.m_link_family)
113 , m_dualnode_connectivity(
rhs.m_dualnode_connectivity)
114 , m_link_connectivity(
rhs.m_link_connectivity)
115 , m_dualitem_connectivities(
rhs.m_dualitem_connectivities)
116 , m_dualnode_to_connectivity_index(
rhs.m_dualnode_to_connectivity_index)
136 return m_link_connectivity->connectivityAccessor()(
ItemLocalId(link));
160 static const String dualNodeFamilyName() {
return "DualNodes"; }
161 static const String linkFamilyName() {
return "Links"; }
175 return m_graph_connectivity.get();
180 Integer
id = CheckedConvert::toInteger(m_connectivity_observer.size());
181 m_connectivity_observer.push_back(std::unique_ptr<IGraphConnectivityObserver>(
observer));
185 void releaseGraphConnectivityObserver(Integer
observer_id)
override
193 Integer
id = CheckedConvert::toInteger(m_graph_observer.size());
194 m_graph_observer.push_back(std::unique_ptr<IGraphObserver>(
observer));
198 void releaseGraphObserver(Integer
observer_id)
override
204 IItemFamily* dualNodeFamily()
override {
return &m_dual_node_family; }
207 IItemFamily* linkFamily()
override {
return &m_link_family; }
210 inline Integer
nbLink()
const override {
return linkFamily()->nbItem(); }
211 inline Integer
nbDualNode()
const override {
return dualNodeFamily()->nbItem(); }
229 bool isUpdated()
override;
231 void endUpdate()
override;
233 void updateAfterMeshChanged()
override;
235 void printDualNodes()
const override;
236 void printLinks()
const override;
240 String _className()
const {
return "GraphDoFs"; }
241 inline Integer _connectivityIndex(Integer
dual_node_IT)
const
244 (
"dual node item type must be IT_DualNode, IT_DualEdge, IT_DualFace, IT_DualCell or IT_DualParticle"));
252 if (kind == IK_Particle) {
253 return m_mesh->findItemFamily(kind, m_particle_family_name,
false);
256 return m_mesh->itemFamily(kind);
260 Int64 _doFUid(Integer dual_item_kind, Item
const& item)
262 switch (dual_item_kind) {
264 return Arcane::DualUniqueIdMng::uniqueIdOf<Node>(item.toNode());
266 return Arcane::DualUniqueIdMng::uniqueIdOf<Edge>(item.toEdge());
268 return Arcane::DualUniqueIdMng::uniqueIdOf<Face>(item.toFace());
270 return Arcane::DualUniqueIdMng::uniqueIdOf<Cell>(item.toCell());
271 case IT_DualParticle:
272 return Arcane::DualUniqueIdMng::uniqueIdOf<Particle>(item.toParticle());
278 void _allocateGraph();
280 IMesh* m_mesh =
nullptr;
281 IItemFamilyNetwork* m_item_family_network =
nullptr;
282 bool m_graph_allocated =
false;
285 DoFManager m_dof_mng;
286 IItemConnectivityMng* m_connectivity_mng;
287 DoFFamily& m_dual_node_family;
288 DoFFamily& m_link_family;
290 UniqueArray<Arcane::mesh::IncrementalItemConnectivity*> m_incremental_connectivities;
291 UniqueArray<Arcane::mesh::IncrementalItemConnectivity*> m_dual2dof_incremental_connectivities;
294 std::unique_ptr<GraphIncrementalConnectivity> m_graph_connectivity;
295 std::vector<std::unique_ptr<Arcane::IGraphConnectivityObserver>> m_connectivity_observer;
297 std::vector<std::unique_ptr<Arcane::IGraphObserver>> m_graph_observer;
299 std::vector<std::unique_ptr<Arcane::GhostLayerFromConnectivityComputer>> m_ghost_layer_computers;
301 std::array<Integer, NB_BASIC_ITEM_TYPE> m_dualnode_kinds = { IT_DualNode, IT_DualEdge, IT_DualFace, IT_DualCell, IT_DualParticle };
302 ItemScalarProperty<Integer> m_dual_node_to_connectivity_index;
304 UniqueArray<Int32> m_detached_dualnode_lids;
305 UniqueArray<Int32> m_detached_link_lids;
307 bool m_update_sync_info =
false;
309 String m_particle_family_name;