14#include "arcane/mesh/ItemFamilyNetwork.h"
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);
34 m_families.insert(master_family);
35 m_families.insert(slave_family);
37 m_is_activated =
true;
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);
50 m_families.insert(source_family);
51 m_families.insert(target_family);
52 m_is_activated =
true;
62 return getConnectivity(source_family, target_family, name, is_dependency);
71 auto* dependency = m_dependency_graph.getEdge(source_family, target_family);
84 auto* relation = m_relation_graph.getEdge(source_family, target_family);
99 auto* connectivity = m_dependency_graph.getEdge(source_family, target_family);
100 is_dependency =
false;
102 _checkConnectivityName(*connectivity, name);
103 is_dependency =
true;
104 return *connectivity;
106 connectivity = m_relation_graph.getEdge(source_family, target_family);
108 _checkConnectivityName(*connectivity, name);
109 return *connectivity;
144 return m_connectivity_list;
153 return _getConnectivitiesFromGraph(m_dependency_graph.outEdges(source_family));
162 return _getConnectivitiesFromGraph(m_dependency_graph.inEdges(target_family));
171 return _getConnectivitiesFromGraph(m_relation_graph.outEdges(source_family));
180 return _getConnectivitiesFromGraph(m_relation_graph.inEdges(target_family));
189 return _getConnectivitiesFromGraph(m_relation_graph.outEdges(source_family), m_dependency_graph.outEdges(source_family));
198 return _getConnectivitiesFromGraph(m_relation_graph.inEdges(target_family), m_dependency_graph.inEdges(target_family));
205_getConnectivitiesFromGraph(
const ConnectivityGraph::ConnectedEdgeSet& connectivity_edges)
209 for (
const auto& connectivity_edge : connectivity_edges) {
210 connectivities[index++] = connectivity_edge;
212 return connectivities;
218SharedArray<IIncrementalItemConnectivity*> ItemFamilyNetwork::
219_getConnectivitiesFromGraph(
const ConnectivityGraph::ConnectedEdgeSet& connectivity_edges1,
const ConnectivityGraph::ConnectedEdgeSet& connectivity_edges2)
221 SharedArray<IIncrementalItemConnectivity*> connectivities(connectivity_edges1.size() + connectivity_edges2.size());
223 for (
const auto& connectivity_edge : connectivity_edges1) {
224 connectivities[index++] = connectivity_edge;
226 for (
const auto& connectivity_edge : connectivity_edges2) {
227 connectivities[index++] = connectivity_edge;
229 return connectivities;
238 _getConnectivityStatus(connectivity).second.first =
true;
247 return _getConnectivityStatus(connectivity).second.first;
253 return _getConnectivityStatus(connectivity).second.second;
258void ItemFamilyNetwork::
261 if (connectivity->
name() != name)
262 throw FatalErrorException(String::format(
"Found connectivity ({0}) has not the expected name ({1}) ", connectivity->
name(), name));
274 case TopologicalOrder:
275 for (
const auto& family : m_dependency_graph.topologicalSort())
276 families.
add(family);
278 case InverseTopologicalOrder:
279 for (
const auto& family : m_dependency_graph.topologicalSort().reverseOrder())
280 families.
add(family);
283 ARCANE_FATAL(
"Cannot schedule task, scheduling order is unkwnown. Set Scheduling order");
290schedule(IItemFamilyNetworkTask task, eSchedulingOrder scheduling_order)
292 switch (scheduling_order) {
293 case TopologicalOrder:
294 for (
const auto& family : m_dependency_graph.topologicalSort())
297 case InverseTopologicalOrder:
298 for (
const auto& family : m_dependency_graph.topologicalSort().reverseOrder())
302 ARCANE_FATAL(
"Cannot schedule task, scheduling order is unkwnown. Set Scheduling order");
310std::pair<IIncrementalItemConnectivity* const, std::pair<bool, bool>>& ItemFamilyNetwork::
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}",
317 return *(connectivity_iterator);
325 Integer graph_id = m_registred_graphs.size();
326 m_registred_graphs.add(graph);
332 m_registred_graphs[graph_id] =
nullptr;
337 for (
auto graph : m_registred_graphs) {
338 graph->modifier()->removeConnectedItemsFromCells(local_ids);
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
void add(ConstReferenceType val)
Adds element val to the end of the array.
Exception when a fatal error has occurred.
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.
Implementation of a collection of elements in vector form.
1D vector of data with reference semantics.
Unicode character string.
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.