Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
ItemConnectivity.h
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/* ItemConnectivity.h (C) 2000-2023 */
9/* */
10/* External connectivities. First version with DoF */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_MESH_ITEMCONNECTIVITY_H
13#define ARCANE_MESH_ITEMCONNECTIVITY_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/FatalErrorException.h"
18#include "arcane/utils/ITraceMng.h"
19
20#include "arcane/core/IItemFamily.h"
21#include "arcane/core/ItemVector.h"
22#include "arcane/core/VariableTypes.h"
23#include "arcane/core/ItemInternal.h"
24#include "arcane/core/IItemConnectivity.h"
25#include "arcane/core/ConnectivityItemVector.h"
26
27#include "arcane/mesh/DoFFamily.h"
28#include "arcane/mesh/ItemProperty.h"
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33namespace Arcane
34{
35
36/*---------------------------------------------------------------------------*/
37/*---------------------------------------------------------------------------*/
44class ARCANE_MESH_EXPORT AbstractConnectivity
45: public IItemConnectivity
46{
47 public:
48
49 AbstractConnectivity(IItemFamily* source_family, IItemFamily* target_family, const String& connectivity_name)
50 : m_source_family(source_family)
51 , m_target_family(target_family)
52 , m_name(connectivity_name)
53 {
54 m_families.add(m_source_family);
55 m_families.add(m_target_family);
56 }
57
58 public:
59
60 virtual const String& name() const
61 {
62 return m_name;
63 }
64
65 public:
66
67 virtual ConstArrayView<IItemFamily*> families() const { return m_families.constView(); }
68 virtual IItemFamily* sourceFamily() const { return m_source_family; }
69 virtual IItemFamily* targetFamily() const { return m_target_family; }
70 virtual void _initializeStorage(ConnectivityItemVector*)
71 {
72 // For now does nothing. Eventually, this can be used, for example,
73 // to dimension the storage based on the maximum number of connected entities
74 // to avoid reallocations when retrieving entities via _connectedItems().
75 }
76
77 protected:
78
79 ConstArrayView<IItemFamily*> _families() const { return m_families.constView(); }
80 IItemFamily* _sourceFamily() const { return m_source_family; }
81 IItemFamily* _targetFamily() const { return m_target_family; }
82
83 private:
84
85 IItemFamily* m_source_family;
86 IItemFamily* m_target_family;
87 SharedArray<IItemFamily*> m_families;
88 String m_name;
89};
90
91/*---------------------------------------------------------------------------*/
92/*---------------------------------------------------------------------------*/
96class ARCANE_MESH_EXPORT ItemConnectivity
97: public AbstractConnectivity
98{
99 public:
100
101 typedef ItemScalarProperty<Int32> ItemPropertyType;
102
103 public:
104
105 ItemConnectivity(IItemFamily* source_family, IItemFamily* target_family, const String& aname)
106 : AbstractConnectivity(source_family, target_family, aname)
107 {
108 compute();
109 }
110
111 ItemConnectivity(IItemFamily* source_family, IItemFamily* target_family, const ItemPropertyType& item_property, const String& aname)
112 : AbstractConnectivity(source_family, target_family, aname) // IFPEN: see the own parameter of GE...
113 {
114 m_item_property.copy(item_property);
115 }
116
117 public:
118
120 {
121 ARCANE_ASSERT((con_items.accessor() == this), ("Bad connectivity"));
122 return con_items.setItem(m_item_property[item]);
123 }
124
125 virtual ConnectivityItemVectorCatalyst _connectedItems(ItemLocalId item) const
126 {
127 auto set = [this](ConnectivityItemVector& civ) mutable { civ = ConnectivityItemVector((ItemConnectivity*)this); };
128 auto apply = [this, item](ConnectivityItemVector& civ) { this->_connectedItems(item, civ); };
129 return { set, apply };
130 }
131
132 virtual void updateConnectivity(Int32ConstArrayView from_items, Int32ConstArrayView to_items);
133
134 public:
135
136 const Item operator()(ItemLocalId item) const
137 {
138 /*
139 ARCANE_ASSERT((m_item_property[item] != NULL_ITEM_LOCAL_ID),
140 ("Item must be connected to one item in ItemConnectivity."));
141 //TODO: keep ItemInternalList for performance reasons.
142 return Item(_targetFamily()->itemsInternal()[m_item_property[item]]);
143 */
144 // Needed for IFPEN applicative test: eventually returns a null item (reasonable for perf ?)
145 if (m_item_property[item] != NULL_ITEM_LOCAL_ID)
146 return _targetFamily()->itemInfoListView()[m_item_property[item]];
147 return Item();
148 }
149
150 ItemScalarProperty<Int32>& itemProperty() { return m_item_property; }
151
152 void updateItemProperty(const ItemScalarProperty<Int32>& item_property) { m_item_property.copy(item_property); }
153
155 {
156 ARCANE_UNUSED(lid);
157 return 1;
158 }
159
160 virtual Int32 connectedItemLocalId(ItemLocalId lid, [[maybe_unused]] Integer index) const
161 {
162 ARCANE_ASSERT((index == 0), ("Invalid value for index"))
163 return m_item_property[lid];
164 }
165
168 {
169 m_item_property.updateSupport(new_to_old_ids);
170 }
171
173 virtual void notifyTargetFamilyLocalIdChanged(Int32ConstArrayView old_to_new_ids);
174
175 private:
176
177 ItemScalarProperty<Int32> m_item_property;
178 SharedArray<ItemInternal*> m_item_internals;
179
180 private:
181
182 void compute();
183};
184
185/*---------------------------------------------------------------------------*/
186/*---------------------------------------------------------------------------*/
187
188template <class FromItemType, class ToItemType>
189class ItemConnectivityT
190: public ItemConnectivity
191{
192 public:
193
194 typedef typename FromItemType::LocalIdType FromLocalIdType;
195
196 public:
197
198 ItemConnectivityT(IItemFamily* source_family, IItemFamily* target_family, const String& connectivity_name)
199 : ItemConnectivity(source_family, target_family, connectivity_name)
200 {}
201
202 ItemConnectivityT(IItemFamily* source_family, IItemFamily* target_family, const ItemPropertyType& item_property, const String& connectivity_name)
203 : ItemConnectivity(source_family, target_family, item_property, connectivity_name)
204 {}
205
206 public:
207
208 const ToItemType operator()(FromLocalIdType item) const
209 {
210 return ItemConnectivity::operator()(item).itemBase();
211 }
212};
213
214/*---------------------------------------------------------------------------*/
215/*---------------------------------------------------------------------------*/
216
217class ARCANE_MESH_EXPORT ItemArrayConnectivity
218: public AbstractConnectivity
219{
220 public:
221
222 typedef ItemArrayProperty<Int32> ItemPropertyType;
223
224 public:
225
226 ItemArrayConnectivity(IItemFamily* source_family, IItemFamily* target_family, Integer nb_dof_per_item, const String& name)
227 : AbstractConnectivity(source_family, target_family, name)
228 , m_nb_dof_per_item(nb_dof_per_item)
229 {
230 compute();
231 }
232
233 ItemArrayConnectivity(IItemFamily* source_family, IItemFamily* target_family, const ItemPropertyType& item_property, const String& name)
234 : AbstractConnectivity(source_family, target_family, name)
235 , m_nb_dof_per_item(item_property.dim2Size())
236 {
237 m_item_property.copy(item_property);
238 }
239
240 public:
241
243 {
244 return this->operator()(item, con_items);
245 }
246
247 virtual ConnectivityItemVectorCatalyst _connectedItems(ItemLocalId item) const
248 {
249 return this->operator()(item);
250 }
251
252 virtual void updateConnectivity(Int32ConstArrayView from_items, Int32ConstArrayView to_items);
253
254 public:
255
256 ItemArrayProperty<Int32>& itemProperty() { return m_item_property; }
257
258 void updateItemProperty(const ItemArrayProperty<Int32>& item_property) { m_item_property.copy(item_property); }
259
260 ItemVectorView operator()(ItemLocalId item, ConnectivityItemVector& con_items) const
261 {
262 ARCANE_ASSERT((con_items.accessor() == this), ("Bad connectivity"));
263 return con_items.resizeAndCopy(m_item_property[item]);
264 }
265
266 ConnectivityItemVectorCatalyst operator()(ItemLocalId item) const
267 {
268 auto set = [this](ConnectivityItemVector& civ) mutable { civ = ConnectivityItemVector((ItemConnectivity*)this); };
269 auto apply = [this, item](ConnectivityItemVector& civ) { this->operator()(item, civ); };
270 return { set, apply };
271 }
272
274 {
275 ARCANE_UNUSED(lid);
276 return m_nb_dof_per_item;
277 }
278
280 {
281 return m_item_property[lid][index];
282 }
283
286 {
287 m_item_property.updateSupport(new_to_old_ids);
288 }
289
291 virtual void notifyTargetFamilyLocalIdChanged(Int32ConstArrayView old_to_new_ids);
292
293 private:
294
295 Integer m_nb_dof_per_item;
296 ItemArrayProperty<Int32> m_item_property;
297
298 private:
299
300 void compute();
301};
302
303/*---------------------------------------------------------------------------*/
304/*---------------------------------------------------------------------------*/
305
306template <class FromItemType, class ToItemType>
307class ItemArrayConnectivityT
308: public ItemArrayConnectivity
309{
310 public:
311
312 typedef typename FromItemType::LocalIdType FromLocalIdType;
313
314 public:
315
316 ItemArrayConnectivityT(IItemFamily* source_family, IItemFamily* target_family, Integer nb_dof_per_item, const String& connectivity_name)
317 : ItemArrayConnectivity(source_family, target_family, nb_dof_per_item, connectivity_name)
318 {}
319
320 ItemArrayConnectivityT(IItemFamily* source_family, IItemFamily* target_family, const ItemPropertyType& item_property, const String& connectivity_name)
321 : ItemArrayConnectivity(source_family, target_family, item_property, connectivity_name)
322 {}
323
324 ItemVectorView operator()(FromLocalIdType item, ConnectivityItemVector& con_items) const
325 {
326 return ItemArrayConnectivity::operator()(item, con_items);
327 }
328
329 ConnectivityItemVectorCatalyst operator()(FromLocalIdType item) const
330 {
331 return ItemArrayConnectivity::operator()(item);
332 }
333};
334
335/*---------------------------------------------------------------------------*/
336/*---------------------------------------------------------------------------*/
337
338class ARCANE_MESH_EXPORT ItemMultiArrayConnectivity
339: public AbstractConnectivity
340{
341 public:
342
343 typedef ItemMultiArrayProperty<Int32> ItemPropertyType;
344
345 public:
346
347 ItemMultiArrayConnectivity(IItemFamily* source_family, IItemFamily* target_family, IntegerConstArrayView nb_dof_per_item, const String& name)
348 : AbstractConnectivity(source_family, target_family, name)
349 {
350 compute(nb_dof_per_item);
351 }
352
353 ItemMultiArrayConnectivity(IItemFamily* source_family, IItemFamily* target_family, const ItemPropertyType& item_property, const String& name)
354 : AbstractConnectivity(source_family, target_family, name)
355 {
356 m_item_property.copy(item_property);
357 }
358
359 public:
360
362 {
363 return this->operator()(item, con_items);
364 }
365
366 virtual ConnectivityItemVectorCatalyst _connectedItems(ItemLocalId item) const
367 {
368 return this->operator()(item);
369 }
370
371 virtual void updateConnectivity(Int32ConstArrayView from_items, Int32ConstArrayView to_items);
372
373 public:
374
375 ItemMultiArrayProperty<Int32>& itemProperty() { return m_item_property; }
376
377 void updateItemProperty(ItemMultiArrayProperty<Int32>& item_property) { m_item_property.copy(item_property); }
378
379 ItemVectorView operator()(ItemLocalId item, ConnectivityItemVector& con_items) const
380 {
381 ARCANE_ASSERT((con_items.accessor() == this), ("Bad connectivity"));
382 return con_items.resizeAndCopy(m_item_property[item]);
383 }
384
385 ConnectivityItemVectorCatalyst operator()(ItemLocalId item) const
386 {
387 auto set = [this](ConnectivityItemVector& civ) mutable { civ = ConnectivityItemVector((ItemConnectivity*)this); };
388 auto apply = [this, item](ConnectivityItemVector& civ) { this->operator()(item, civ); };
389 return { set, apply };
390 }
391
393 {
394 return m_item_property[lid].size();
395 }
396
398 {
399 return m_item_property[lid][index];
400 }
401
404 {
405 m_item_property.updateSupport(new_to_old_ids);
406 }
407
409 virtual void notifyTargetFamilyLocalIdChanged(Int32ConstArrayView old_to_new_ids);
410
411 private:
412
413 ItemMultiArrayProperty<Int32> m_item_property;
414
415 private:
416
417 void compute(IntegerConstArrayView nb_dof_per_item);
418};
419
420/*---------------------------------------------------------------------------*/
421/*---------------------------------------------------------------------------*/
422
423template <class FromItemType, class ToItemType>
424class ItemMultiArrayConnectivityT
425: public ItemMultiArrayConnectivity
426{
427 public:
428
429 typedef typename FromItemType::LocalIdType FromLocalIdType;
430
431 public:
432
433 ItemMultiArrayConnectivityT(IItemFamily* source_family, IItemFamily* target_family, const IntegerConstArrayView nb_dof_per_item, const String& connectivity_name)
434 : ItemMultiArrayConnectivity(source_family, target_family, nb_dof_per_item, connectivity_name)
435 {}
436
437 ItemMultiArrayConnectivityT(IItemFamily* source_family, IItemFamily* target_family, const ItemPropertyType& item_property, const String& connectivity_name)
438 : ItemMultiArrayConnectivity(source_family, target_family, item_property, connectivity_name)
439 {}
440
441 public:
442
443 ItemVectorViewT<ToItemType> operator()(FromLocalIdType item, ConnectivityItemVector& con_items) const
444 {
445 return ItemMultiArrayConnectivity::operator()(item, con_items);
446 }
447
448 ConnectivityItemVectorCatalyst operator()(ItemLocalId item) const
449 {
450 return ItemMultiArrayConnectivity::operator()(item);
451 }
452};
453
454/*---------------------------------------------------------------------------*/
455/*---------------------------------------------------------------------------*/
456
457} // namespace Arcane
458
459/*---------------------------------------------------------------------------*/
460/*---------------------------------------------------------------------------*/
461
462#endif
virtual ConstArrayView< IItemFamily * > families() const
List of families (sourceFamily() + targetFamily()).
virtual void _initializeStorage(ConnectivityItemVector *)
Implements the initialization of civ for this connectivity.
virtual IItemFamily * sourceFamily() const
Source family.
virtual const String & name() const
Name of the connectivity.
virtual IItemFamily * targetFamily() const
Target family.
Manages the retrieval of connectivity information.
ItemVectorView setItem(Int32 id)
Positions the connectivity list with the entity of localId() id.
IItemConnectivityAccessor * accessor() const
Associated connectivity.
Constant view of an array of type T.
Interface to manage connectivity.
Interface of an entity family.
Definition IItemFamily.h:83
virtual void notifySourceFamilyLocalIdChanged(Int32ConstArrayView new_to_old_ids)
Notifies the connectivity that the source family has been compacted.
virtual Int32 connectedItemLocalId(ItemLocalId lid, Integer index) const
localId() of the index-th entity connected to the source entity with local ID lid
virtual Integer nbConnectedItem(ItemLocalId lid) const
Number of entities connected to the source entity with local ID lid.
virtual ItemVectorView _connectedItems(ItemLocalId item, ConnectivityItemVector &con_items) const
Fills con_items with the entities connected to item.
Item->item connectivity, exactly 1 item connected per item (0 not allowed).
virtual void notifySourceFamilyLocalIdChanged(Int32ConstArrayView new_to_old_ids)
Notifies the connectivity that the source family has been compacted.
virtual Integer nbConnectedItem(ItemLocalId lid) const
Number of entities connected to the source entity with local ID lid.
virtual Int32 connectedItemLocalId(ItemLocalId lid, Integer index) const
localId() of the index-th entity connected to the source entity with local ID lid
virtual ItemVectorView _connectedItems(ItemLocalId item, ConnectivityItemVector &con_items) const
Fills con_items with the entities connected to item.
Index of an Item in a variable.
Definition ItemLocalId.h:42
virtual Int32 connectedItemLocalId(ItemLocalId lid, Integer index) const
localId() of the index-th entity connected to the source entity with local ID lid
virtual ItemVectorView _connectedItems(ItemLocalId item, ConnectivityItemVector &con_items) const
Fills con_items with the entities connected to item.
virtual Integer nbConnectedItem(ItemLocalId lid) const
Number of entities connected to the source entity with local ID lid.
virtual void notifySourceFamilyLocalIdChanged(Int32ConstArrayView new_to_old_ids)
Notifies the connectivity that the source family has been compacted.
View on a typed array of entities.
View on a vector of entities.
1D vector of data with reference semantics.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Int32 Integer
Type representing an integer.
ConstArrayView< Int32 > Int32ConstArrayView
C equivalent of a 1D array of 32-bit integers.
Definition UtilsTypes.h:482
ConstArrayView< Integer > IntegerConstArrayView
C equivalent of a 1D array of integers.
Definition UtilsTypes.h:486
std::int32_t Int32
Signed integer type of 32 bits.
Temporary type automatically cast to ConnectivityItemVector.