Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
ItemProperty.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/* ItemProperty.h (C) 2000-2024 */
9/* */
10/* Property on item to handle new connectivities and future mesh properties */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_DOF_ITEMPROPERTY_H
13#define ARCANE_DOF_ITEMPROPERTY_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include <algorithm>
18
19#include "arcane/utils/Array.h"
20#include "arcane/utils/Array2.h"
21#include "arcane/utils/MultiArray2.h"
23#include "arcane/core/IItemFamily.h"
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28namespace Arcane
29{
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
34template <class DataType>
36{
37 public:
38
41 : m_default_value(DataType())
42 {}
43
44 public:
45
46 template <class AbstractFamily>
47 void resize(AbstractFamily* item_family, const DataType default_value) // SDC Template AbstractFamily necessary for IFPEN applications
48 {
49 m_data.resize(item_family->maxLocalId(), default_value);
50 m_default_value = default_value;
51 }
52
53 Integer size() const { return m_data.size(); }
54
55 template <class AbstractItem>
56 DataType& operator[](const AbstractItem item) { return m_data[item.localId()]; }
57
58 template <class AbstractItem>
59 DataType operator[](const AbstractItem item) const { return m_data[item.localId()]; }
60
61 void print() const
62 {
63 std::cout << "== CONNECTIVITY ITEM PROPERTY CONTAINS " << std::endl;
64 for (Arcane::Integer i = 0; i < m_data.size(); ++i) {
65 std::cout << "\"" << m_data[i] << "\"" << std::endl;
66 }
67 std::cout << std::endl;
68 }
69
70 ConstArrayView<DataType> view() { return m_data.constView(); }
71
72 void updateSupport(Int32ConstArrayView new_to_old_ids)
73 {
74 if (new_to_old_ids.size() == 0)
75 return;
76 UniqueArray<DataType> old_data(m_data);
77 Integer new_size = new_to_old_ids.size();
78 m_data.resize(new_size);
79 // resize old_data with item recently added and not yet in connectivity
80 // this max size can be greater than new size if they were add and remove
81 Integer max_size = *(std::max_element(new_to_old_ids.begin(), new_to_old_ids.end())) + 1;
82 if (max_size > old_data.size())
83 old_data.resize(max_size, m_default_value); // padd new items
84 for (Integer i = 0; i < new_size; ++i) {
85 m_data[i] = old_data[new_to_old_ids[i]];
86 }
87 }
88
89 void copy(const ItemScalarProperty<DataType>& item_property_from)
90 {
91 m_data.copy(item_property_from.m_data); // copy values
92 m_default_value = item_property_from.m_default_value;
93 }
94
95 private:
96
97 // UniqueArray<DataType> m_data;
98 SharedArray<DataType> m_data; // ItemProperty used in IFPEN applications as a shared object (Arcane-like...).
99 DataType m_default_value;
100};
101
102/*---------------------------------------------------------------------------*/
103/*---------------------------------------------------------------------------*/
104
105template <class DataType>
107{
108 public:
109
112
113 public:
114
115 template <class AbstractFamily>
116 void resize(AbstractFamily* item_family, const Integer nb_element_per_item, const DataType default_value) // SDC Template AbstractFamily necessary for IFPEN applications
117 {
118 Integer dim1_old_size = m_data.dim1Size();
119 Integer dim2_old_size = m_data.dim2Size();
120 Integer dim1_new_size = item_family->maxLocalId();
121 Integer dim2_new_size = nb_element_per_item;
122 m_data.resize(dim1_new_size, dim2_new_size);
123 // Fill new data
124 // if new dim 1 larger, enter loop
125 for (Integer i = dim1_old_size; i < dim1_new_size; ++i) {
126 for (Integer j = 0; j < dim2_new_size; ++j)
127 m_data[i][j] = default_value;
128 }
129 // test if dim2 larger before loop
130 if (dim2_new_size > dim2_old_size) {
131 for (Arcane::Integer i = 0; i < dim1_old_size; ++i) {
132 for (Integer j = dim2_old_size; j < dim2_new_size; ++j)
133 m_data[i][j] = default_value;
134 }
135 }
136 }
137
138 Integer dim1Size() const { return m_data.dim1Size(); }
139 Integer dim2Size() const { return m_data.dim2Size(); }
140
141 template <class AbstractItem>
142 ArrayView<DataType> operator[](AbstractItem item) { return m_data[item.localId()]; }
143
144 template <class AbstractItem>
145 ConstArrayView<DataType> operator[](AbstractItem item) const { return m_data[item.localId()]; }
146
147 void updateSupport(Int32ConstArrayView new_to_old_ids)
148 {
149 if (new_to_old_ids.size() == 0)
150 return;
151 UniqueArray2<DataType> old_data(m_data);
152 Integer new_dim1_size = new_to_old_ids.size();
153 Integer dim2_size = m_data.dim2Size();
154 m_data.resize(new_dim1_size);
155 // resize old_data with item recently added and not yet in connectivity
156 // this max_dim1_size size can be greater than new_dim1_size if they were add and remove
157 auto max_dim1_size = *(std::max_element(new_to_old_ids.begin(), new_to_old_ids.end())) + 1;
158 old_data.resize(max_dim1_size); // padd for new items with 0 (not connected)
159 for (Integer i = 0; i < new_dim1_size; ++i) {
160 for (Integer j = 0; j < dim2_size; ++j)
161 m_data[i][j] = old_data[new_to_old_ids[i]][j];
162 }
163 }
164
165 void copy(const ItemArrayProperty<DataType>& item_property_from)
166 {
167 m_data.copy(item_property_from.m_data); // copy values
168 }
169
170 private:
171
172 UniqueArray2<DataType> m_data;
173};
174
175/*---------------------------------------------------------------------------*/
176/*---------------------------------------------------------------------------*/
177
178template <class DataType>
180{
181 public:
182
185
186 public:
187
188 typedef MultiArray2<DataType> InternalArray2;
189
190 // nb_element per item est de taille IItemFamily::maxLocalId
191 template <class AbstractFamily>
192 void resize([[maybe_unused]] AbstractFamily* item_family,
193 const Arcane::IntegerConstArrayView nb_element_per_item,
194 const DataType default_value) // SDC Template AbstractFamily necessary for IFPEN applications
195 {
196 ARCANE_ASSERT((nb_element_per_item.size() == item_family->maxLocalId()),
197 ("In item property resize : nb_element_per_item must have size IItemFamilyy::maxLocalId"))
198 Integer dim1_old_size = m_data.dim1Size();
199 Integer dim1_new_size = nb_element_per_item.size();
200 IntegerUniqueArray dim2_old_sizes(m_data.dim2Sizes());
201 IntegerConstArrayView dim2_new_sizes(nb_element_per_item);
202 m_data.resize(nb_element_per_item);
203 // Fill new data with default value
204 // Dim1 size larger
205 for (Arcane::Integer i = dim1_old_size; i < dim1_new_size; ++i) {
206 for (Arcane::Integer j = 0; j < dim2_new_sizes[i]; ++j) {
207 m_data[i][j] = default_value;
208 }
209 }
210 // Dim2 size larger (eventually, cannot know a priori, need to loop).
211 for (Arcane::Integer i = 0; i < dim1_old_size; ++i) {
212 for (Arcane::Integer j = dim2_old_sizes[i]; j < dim2_new_sizes[i]; ++j) {
213 m_data[i][j] = default_value;
214 }
215 }
216 }
217
218 Integer dim1Size() const { return m_data.dim1Size(); }
219 IntegerConstArrayView dim2Sizes() const { return m_data.dim2Sizes(); }
220
221 template <class AbstractItem>
222 ArrayView<DataType> operator[](const AbstractItem item) { return m_data[item.localId()]; }
223
224 template <class AbstractItem>
225 ConstArrayView<DataType> operator[](const AbstractItem item) const { return m_data[item.localId()]; }
226
227 void updateSupport(Int32ConstArrayView new_to_old_ids)
228 {
229 if (new_to_old_ids.size() == 0)
230 return;
231 UniqueMultiArray2<DataType> old_data(m_data);
232 Integer new_dim1_size = new_to_old_ids.size();
233 // new_to_old_ids may refer to items newly added and not yet in m_data (ie old_data) if there is add and removal in the same event
234 // compute max_dim1_size to take this into account
235 Integer max_dim1_size = *(std::max_element(new_to_old_ids.begin(), new_to_old_ids.end())) + 1;
236 IntegerUniqueArray dim2_sizes(m_data.dim2Sizes());
237 dim2_sizes.resize(max_dim1_size, 1); // padd for unknown items with 1 (connected with empty)
238 old_data.resize(dim2_sizes); // take into account unknown items. Recall these items are compacted but were not yet in m_data
239 IntegerUniqueArray new_dim2_sizes(new_dim1_size);
240 // Compute new sizes
241 for (Integer i = 0; i < new_dim1_size; ++i) {
242 new_dim2_sizes[i] = dim2_sizes[new_to_old_ids[i]];
243 }
244 m_data.resize(new_dim2_sizes);
245 for (Integer i = 0; i < new_dim1_size; ++i) {
246 for (Integer j = 0; j < new_dim2_sizes[i]; ++j)
247 m_data[i][j] = old_data[new_to_old_ids[i]][j];
248 }
249 }
250
251 void copy(const ItemMultiArrayProperty<DataType>& item_property_from)
252 {
253 m_data = item_property_from.m_data.constView(); // copy values
254 }
255
256 private:
257
258 // UniqueMultiArray2<DataType> m_data;
259 SharedMultiArray2<DataType> m_data; // ItemProperty used in IFPEN applications as a shared object (Arcane-like...).
260};
261
262/*---------------------------------------------------------------------------*/
263/*---------------------------------------------------------------------------*/
264
265} // namespace Arcane
266
267/*---------------------------------------------------------------------------*/
268/*---------------------------------------------------------------------------*/
269
270#endif
Declarations of Arcane's general types.
Integer size() const
Number of elements in the vector.
void resize(Int64 new_size)
Resizes only the first dimension, leaving the second dimension unchanged.
void resize(Int64 s)
Changes the number of elements in the array to s.
constexpr Integer size() const noexcept
Number of elements in the array.
Base class for multi-sized 2D arrays.
Definition MultiArray2.h:60
-- 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
UniqueArray< Integer > IntegerUniqueArray
Dynamic 1D array of integers.
Definition UtilsTypes.h:347
ConstArrayView< Integer > IntegerConstArrayView
C equivalent of a 1D array of integers.
Definition UtilsTypes.h:486