1
1
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2
2
// -----------------------------------------------------------------------------
3
- // Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3
+ // Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4
4
// See the top-level COPYRIGHT file for details.
5
5
// SPDX-License-Identifier: Apache-2.0
6
6
// -----------------------------------------------------------------------------
7
7
/* ---------------------------------------------------------------------------*/
8
- /* ComponentItemInternalData.cc (C) 2000-2023 */
8
+ /* ComponentItemInternalData.cc (C) 2000-2024 */
9
9
/* */
10
10
/* Gestion des listes de 'ComponentItemInternal'. */
11
11
/* ---------------------------------------------------------------------------*/
@@ -33,8 +33,7 @@ ComponentItemInternalData::
33
33
ComponentItemInternalData (MeshMaterialMng* mmg)
34
34
: TraceAccessor(mmg->traceMng ())
35
35
, m_material_mng(mmg)
36
- , m_all_env_items_internal(MemoryUtils::getAllocatorForMostlyReadOnlyData())
37
- , m_env_items_internal(MemoryUtils::getAllocatorForMostlyReadOnlyData())
36
+ , m_component_item_internal_storage(MemoryUtils::getAllocatorForMostlyReadOnlyData())
38
37
, m_shared_infos(MemoryUtils::getAllocatorForMostlyReadOnlyData())
39
38
{
40
39
// Il y a une instance pour les MatCell, les EnvCell et les AllEnvCell
@@ -51,19 +50,18 @@ endCreate()
51
50
{
52
51
const Int32 nb_env = m_material_mng->environments ().size ();
53
52
m_mat_items_internal.clear ();
54
- m_mat_items_internal.reserve (nb_env);
55
- auto allocator = MemoryUtils::getAllocatorForMostlyReadOnlyData ();
56
- for (Int32 i = 0 ; i < nb_env; ++i)
57
- m_mat_items_internal.add (UniqueArray<ComponentItemInternal>(allocator));
53
+ m_mat_items_internal.resize (nb_env);
58
54
59
55
_initSharedInfos ();
60
56
}
61
57
62
58
/* ---------------------------------------------------------------------------*/
63
59
/* ---------------------------------------------------------------------------*/
64
-
60
+ /* !
61
+ * \brief Réinitialise les ComponentItemInternal.
62
+ */
65
63
void ComponentItemInternalData::
66
- _resetEnvItemsInternal ()
64
+ _resetItemsInternal ()
67
65
{
68
66
ComponentItemSharedInfo* all_env_shared_info = allEnvSharedInfo ();
69
67
for (ComponentItemInternal& x : m_all_env_items_internal)
@@ -72,21 +70,13 @@ _resetEnvItemsInternal()
72
70
ComponentItemSharedInfo* env_shared_info = envSharedInfo ();
73
71
for (ComponentItemInternal& x : m_env_items_internal)
74
72
x._reset (env_shared_info);
75
- }
76
-
77
- /* ---------------------------------------------------------------------------*/
78
- /* ---------------------------------------------------------------------------*/
79
73
80
- void ComponentItemInternalData::
81
- _resizeAndResetMatCellForEnvironment (Int32 env_index, Int32 size)
82
- {
83
- m_mat_items_internal[env_index].resize (size);
84
-
85
- ArrayView<ComponentItemInternal> mat_items_internal = matItemsInternal (env_index);
86
- ComponentItemSharedInfo* mat_shared_info = matSharedInfo ();
87
- for (Integer i = 0 ; i < size; ++i) {
88
- ComponentItemInternal& ref_ii = mat_items_internal[i];
89
- ref_ii._reset (mat_shared_info);
74
+ for (const MeshEnvironment* env : m_material_mng->trueEnvironments ()) {
75
+ ArrayView<ComponentItemInternal> mat_items_internal = matItemsInternal (env->id ());
76
+ ComponentItemSharedInfo* mat_shared_info = matSharedInfo ();
77
+ for (ComponentItemInternal& x : mat_items_internal) {
78
+ x._reset (mat_shared_info);
79
+ }
90
80
}
91
81
}
92
82
@@ -96,19 +86,33 @@ _resizeAndResetMatCellForEnvironment(Int32 env_index, Int32 size)
96
86
void ComponentItemInternalData::
97
87
resizeComponentItemInternals (Int32 max_local_id, Int32 total_env_cell)
98
88
{
99
- m_all_env_items_internal.resize (max_local_id);
100
- m_env_items_internal.resize (total_env_cell);
101
-
102
- // Redimensionne les 'ComponentItemInternal' pour les matériaux des milieux.
103
- // Il faut être certain que le nombre de matériaux par milieu a bien été calculé
104
- // (par exemple par un appel à computeNbMatPerCell()).
105
- for (const MeshEnvironment* env : m_material_mng->trueEnvironments ()) {
106
- Integer total_nb_cell_mat = env->totalNbCellMat ();
107
- _resizeAndResetMatCellForEnvironment (env->id (), total_nb_cell_mat);
89
+ // Calcule le nombre total de ComponentItemInternal dont on a besoin
90
+ // Les 'ComponentItemInternal' seront rangés dans 'm_component_item_internal_storage'
91
+ // dans l'ordre suivant: AllEnvCell, EnvCell et chaque MatCell
92
+ // TODO: Réserver de la place entre les vues pour ne pas être obligé de tout réallouer
93
+ // dès qu'un des nombre d'élément change.
94
+ Int32 total_nb_internal = 0 ;
95
+ total_nb_internal += max_local_id; // Pour les AllEnvCell
96
+ total_nb_internal += total_env_cell; // Pour les EnvCell
97
+ for (const MeshEnvironment* env : m_material_mng->trueEnvironments ())
98
+ total_nb_internal += env->totalNbCellMat ();
99
+
100
+ // Redimensionne le conteneur. Il ne faut plus le modifier ensuite
101
+ m_component_item_internal_storage.resize (total_nb_internal);
102
+
103
+ // Maintenant récupère les vues sur chaque partie de 'm_component_item_internal_storage'
104
+ {
105
+ m_all_env_items_internal = m_component_item_internal_storage.subView (0 , max_local_id);
106
+ m_env_items_internal = m_component_item_internal_storage.subView (max_local_id, total_env_cell);
107
+ Int32 index_in_container = max_local_id + total_env_cell;
108
+ for (const MeshEnvironment* env : m_material_mng->trueEnvironments ()) {
109
+ Int32 nb_cell_mat = env->totalNbCellMat ();
110
+ m_mat_items_internal[env->id ()] = m_component_item_internal_storage.subView (index_in_container, nb_cell_mat);
111
+ index_in_container += nb_cell_mat;
112
+ }
108
113
}
109
114
110
- // Initialise à des valeurs invalides pour détecter les erreurs.
111
- _resetEnvItemsInternal ();
115
+ _resetItemsInternal ();
112
116
}
113
117
114
118
/* ---------------------------------------------------------------------------*/
0 commit comments