Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
ItemFamilyNetwork.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/* ItemFamilyNetwork.cc (C) 2000-2024 */
9/* */
10/* ItemFamily relations through their connectivities. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/mesh/ItemFamilyNetwork.h"
15
16/*---------------------------------------------------------------------------*/
17/*---------------------------------------------------------------------------*/
18
19namespace Arcane::mesh
20{
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
26addDependency(IItemFamily* master_family, IItemFamily* slave_family,
27 IIncrementalItemConnectivity* master_to_slave_connectivity, bool is_deep_connectivity)
28{
29 m_dependency_graph.addEdge(master_family, slave_family, master_to_slave_connectivity);
30 if (master_to_slave_connectivity) {
31 m_connectivity_list.add(master_to_slave_connectivity);
32 m_connectivity_status[master_to_slave_connectivity] = std::make_pair(false, is_deep_connectivity); // connectivity not stored by default
33 }
34 m_families.insert(master_family);
35 m_families.insert(slave_family);
36
37 m_is_activated = true;
38}
39
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42
44addRelation(IItemFamily* source_family, IItemFamily* target_family, IIncrementalItemConnectivity* source_to_target_connectivity)
45{
46 m_relation_graph.addEdge(source_family, target_family, source_to_target_connectivity);
47 m_connectivity_list.add(source_to_target_connectivity);
48 if (m_connectivity_status.find(source_to_target_connectivity) == m_connectivity_status.end())
49 m_connectivity_status[source_to_target_connectivity] = std::make_pair(false, true); // connectivity not stored by default
50 m_families.insert(source_family);
51 m_families.insert(target_family);
52 m_is_activated = true;
53}
54
55/*---------------------------------------------------------------------------*/
56/*---------------------------------------------------------------------------*/
57
59getConnectivity(IItemFamily* source_family, IItemFamily* target_family, const String& name)
60{
61 bool is_dependency;
62 return getConnectivity(source_family, target_family, name, is_dependency);
63}
64
65/*---------------------------------------------------------------------------*/
66/*---------------------------------------------------------------------------*/
67
69getDependency(IItemFamily* source_family, IItemFamily* target_family)
70{
71 auto* dependency = m_dependency_graph.getEdge(source_family, target_family);
72 if (dependency)
73 return *dependency;
74 else
75 return nullptr;
76}
77
78/*---------------------------------------------------------------------------*/
79/*---------------------------------------------------------------------------*/
80
81IIncrementalItemConnectivity* ItemFamilyNetwork::
82getRelation(IItemFamily* source_family, IItemFamily* target_family)
83{
84 auto* relation = m_relation_graph.getEdge(source_family, target_family);
85 if (relation)
86 return *relation;
87 else
88 return nullptr;
89}
90
91/*---------------------------------------------------------------------------*/
92/*---------------------------------------------------------------------------*/
93
95getConnectivity(IItemFamily* source_family, IItemFamily* target_family, const String& name, bool& is_dependency)
96{
97 // Up to now DirectedGraph and DirectedAcyclicGraph are not hypergraph, we cannot have multiple edges between two same nodes.
98 // => we just check the name is OK
99 auto* connectivity = m_dependency_graph.getEdge(source_family, target_family);
100 is_dependency = false;
101 if (connectivity) {
102 _checkConnectivityName(*connectivity, name);
103 is_dependency = true;
104 return *connectivity;
105 }
106 connectivity = m_relation_graph.getEdge(source_family, target_family);
107 if (connectivity) {
108 _checkConnectivityName(*connectivity, name);
109 return *connectivity;
110 }
111 else
112 return nullptr;
113}
114
115/*---------------------------------------------------------------------------*/
116/*---------------------------------------------------------------------------*/
117
119getStoredConnectivity(IItemFamily* source_family, IItemFamily* target_family, const String& name)
120{
121 bool is_dependency;
122 return getStoredConnectivity(source_family, target_family, name, is_dependency);
123}
124
125/*---------------------------------------------------------------------------*/
126/*---------------------------------------------------------------------------*/
127
129getStoredConnectivity(IItemFamily* source_family, IItemFamily* target_family, const String& name, bool& is_dependency)
130{
131 IIncrementalItemConnectivity* con = getConnectivity(source_family, target_family, name, is_dependency);
132 if (con) {
133 if (!isStored(con))
134 con = nullptr;
135 }
136 return con;
137}
138/*---------------------------------------------------------------------------*/
139/*---------------------------------------------------------------------------*/
140
143{
144 return m_connectivity_list;
145}
146
147/*---------------------------------------------------------------------------*/
148/*---------------------------------------------------------------------------*/
149
151getChildDependencies(IItemFamily* source_family)
152{
153 return _getConnectivitiesFromGraph(m_dependency_graph.outEdges(source_family));
154}
155
156/*---------------------------------------------------------------------------*/
157/*---------------------------------------------------------------------------*/
158
160getParentDependencies(IItemFamily* target_family)
161{
162 return _getConnectivitiesFromGraph(m_dependency_graph.inEdges(target_family));
163}
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
169getChildRelations(IItemFamily* source_family)
170{
171 return _getConnectivitiesFromGraph(m_relation_graph.outEdges(source_family));
172}
173
174/*---------------------------------------------------------------------------*/
175/*---------------------------------------------------------------------------*/
176
178getParentRelations(IItemFamily* target_family)
179{
180 return _getConnectivitiesFromGraph(m_relation_graph.inEdges(target_family));
181}
182
183/*---------------------------------------------------------------------------*/
184/*---------------------------------------------------------------------------*/
185
188{
189 return _getConnectivitiesFromGraph(m_relation_graph.outEdges(source_family), m_dependency_graph.outEdges(source_family));
190}
191
192/*---------------------------------------------------------------------------*/
193/*---------------------------------------------------------------------------*/
194
196getParentConnectivities(IItemFamily* target_family)
197{
198 return _getConnectivitiesFromGraph(m_relation_graph.inEdges(target_family), m_dependency_graph.inEdges(target_family));
199}
200
201/*---------------------------------------------------------------------------*/
202/*---------------------------------------------------------------------------*/
203
205_getConnectivitiesFromGraph(const ConnectivityGraph::ConnectedEdgeSet& connectivity_edges)
206{
207 SharedArray<IIncrementalItemConnectivity*> connectivities(connectivity_edges.size());
208 Integer index(0);
209 for (const auto& connectivity_edge : connectivity_edges) {
210 connectivities[index++] = connectivity_edge;
211 }
212 return connectivities;
213}
214
215/*---------------------------------------------------------------------------*/
216/*---------------------------------------------------------------------------*/
217
218SharedArray<IIncrementalItemConnectivity*> ItemFamilyNetwork::
219_getConnectivitiesFromGraph(const ConnectivityGraph::ConnectedEdgeSet& connectivity_edges1, const ConnectivityGraph::ConnectedEdgeSet& connectivity_edges2)
220{
221 SharedArray<IIncrementalItemConnectivity*> connectivities(connectivity_edges1.size() + connectivity_edges2.size());
222 Integer index(0);
223 for (const auto& connectivity_edge : connectivity_edges1) {
224 connectivities[index++] = connectivity_edge;
225 }
226 for (const auto& connectivity_edge : connectivity_edges2) {
227 connectivities[index++] = connectivity_edge;
228 }
229 return connectivities;
230}
231
232/*---------------------------------------------------------------------------*/
233/*---------------------------------------------------------------------------*/
234
237{
238 _getConnectivityStatus(connectivity).second.first = true;
239}
240
241/*---------------------------------------------------------------------------*/
242/*---------------------------------------------------------------------------*/
243
246{
247 return _getConnectivityStatus(connectivity).second.first;
248}
249
252{
253 return _getConnectivityStatus(connectivity).second.second;
254}
255/*---------------------------------------------------------------------------*/
256/*---------------------------------------------------------------------------*/
257
258void ItemFamilyNetwork::
259_checkConnectivityName(IIncrementalItemConnectivity* connectivity, const String& name)
260{
261 if (connectivity->name() != name)
262 throw FatalErrorException(String::format("Found connectivity ({0}) has not the expected name ({1}) ", connectivity->name(), name));
263}
264
265/*---------------------------------------------------------------------------*/
266/*---------------------------------------------------------------------------*/
267
269getFamilies(eSchedulingOrder order) const
270{
272
273 switch (order) {
274 case TopologicalOrder:
275 for (const auto& family : m_dependency_graph.topologicalSort())
276 families.add(family);
277 break;
278 case InverseTopologicalOrder:
279 for (const auto& family : m_dependency_graph.topologicalSort().reverseOrder())
280 families.add(family);
281 break;
282 case Unknown:
283 ARCANE_FATAL("Cannot schedule task, scheduling order is unkwnown. Set Scheduling order");
284 break;
285 }
286 return families;
287}
288
290schedule(IItemFamilyNetworkTask task, eSchedulingOrder scheduling_order)
291{
292 switch (scheduling_order) {
293 case TopologicalOrder:
294 for (const auto& family : m_dependency_graph.topologicalSort())
295 task(family);
296 break;
297 case InverseTopologicalOrder:
298 for (const auto& family : m_dependency_graph.topologicalSort().reverseOrder())
299 task(family);
300 break;
301 case Unknown:
302 ARCANE_FATAL("Cannot schedule task, scheduling order is unkwnown. Set Scheduling order");
303 break;
304 }
305}
306
307/*---------------------------------------------------------------------------*/
308/*---------------------------------------------------------------------------*/
309
310std::pair<IIncrementalItemConnectivity* const, std::pair<bool, bool>>& ItemFamilyNetwork::
311_getConnectivityStatus(IIncrementalItemConnectivity* connectivity)
312{
313 auto connectivity_iterator = m_connectivity_status.find(connectivity);
314 if (connectivity_iterator == m_connectivity_status.end())
315 ARCANE_FATAL("Cannot find connectivity {0} between families {1} and {2}",
316 connectivity->name(), connectivity->sourceFamily(), connectivity->targetFamily());
317 return *(connectivity_iterator);
318}
319
320/*---------------------------------------------------------------------------*/
321/*---------------------------------------------------------------------------*/
322
324{
325 Integer graph_id = m_registred_graphs.size();
326 m_registred_graphs.add(graph);
327 return graph_id;
328}
329
331{
332 m_registred_graphs[graph_id] = nullptr;
333}
334
336{
337 for (auto graph : m_registred_graphs) {
338 graph->modifier()->removeConnectedItemsFromCells(local_ids);
339 }
340}
341
342/*---------------------------------------------------------------------------*/
343/*---------------------------------------------------------------------------*/
344
345} // End namespace Arcane::mesh
346
347/*---------------------------------------------------------------------------*/
348/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
void add(ConstReferenceType val)
Adds element val to the end of the array.
Mesh graph interface.
Definition IGraph2.h:106
Interface for managing an incremental connectivity.
virtual String name() const =0
Name of the connectivity.
virtual IItemFamily * targetFamily() const =0
Target family.
virtual IItemFamily * sourceFamily() const =0
Source family.
Interface of an entity family.
Definition IItemFamily.h:83
Implementation of a collection of elements in vector form.
1D vector of data with reference semantics.
void setIsStored(IIncrementalItemConnectivity *connectivity) override
Marks a connectivity as stored. When added, connectivities are described as not stored.
List< IIncrementalItemConnectivity * > getConnectivities() override
Get the list of all connectivities, whether they are relations or dependencies.
void addRelation(IItemFamily *source_family, IItemFamily *target_family, IIncrementalItemConnectivity *source_to_target_connectivity) override
SharedArray< IIncrementalItemConnectivity * > getChildRelations(IItemFamily *source_family) override
Get the list of all relations, children of a family source_family or parents of a family target_famil...
SharedArray< IIncrementalItemConnectivity * > getChildConnectivities(IItemFamily *source_family) override
Get the list of all connectivities (dependencies or relations), children of a family source_family or...
bool isStored(IIncrementalItemConnectivity *connectivity) override
Retrieves information regarding the storage of the connectivity.
Integer registerConnectedGraph(IGraph2 *graph) override
Registers a graph managing DOFs connected to the mesh.
const std::set< IItemFamily * > & getFamilies() const override
Get the list of all families.
void addDependency(IItemFamily *master_family, IItemFamily *slave_family, IIncrementalItemConnectivity *master_to_slave_connectivity, bool is_deep_connectivity) override
SharedArray< IIncrementalItemConnectivity * > getChildDependencies(IItemFamily *source_family) override
Get the list of all dependencies, children of a family source_family or parents of a family target_fa...
bool isDeep(IIncrementalItemConnectivity *connectivity) override
Retrieves information regarding the storage of the connectivity.
void removeConnectedDoFsFromCells(Int32ConstArrayView local_ids) override
Removes DOFs and links between DOFs connected to deleted cells.
IIncrementalItemConnectivity * getConnectivity(IItemFamily *source_family, IItemFamily *target_family, const String &name) override
Get a connectivity between the families source_family and target_family named name,...
IIncrementalItemConnectivity * getStoredConnectivity(IItemFamily *source_family, IItemFamily *target_family, const String &name) override
Returns, if associated with storage, the connectivity between the families source_family and target_f...
void releaseConnectedGraph(Integer graph_id) override
Deregisters a graph managing DOFs connected to the mesh.
IIncrementalItemConnectivity * getDependency(IItemFamily *source_family, IItemFamily *target_family) override
Returns the dependency connectivity between the families source_family.
void schedule(IItemFamilyNetworkTask task, eSchedulingOrder order=TopologicalOrder) override
Schedules the execution of a task, in topological or reverse topological order of the family dependen...
Int32 Integer
Type representing an integer.
ConstArrayView< Int32 > Int32ConstArrayView
C equivalent of a 1D array of 32-bit integers.
Definition UtilsTypes.h:482