Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
AllCellToAllEnvCellConverter.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* AllCellToAllEnvCellConverter.cc (C) 2000-2024 */
9/* */
10/* Conversion de 'Cell' en 'AllEnvCell'. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/materials/AllCellToAllEnvCellConverter.h"
15
16#include "arcane/core/IItemFamily.h"
18#include "arcane/core/ItemGroup.h"
19#include "arcane/core/materials/internal/IMeshMaterialMngInternal.h"
20
23
24#include <algorithm>
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29namespace Arcane::Materials
30{
31
33{
34 public:
35
36 static Int32 _computeMaxNbEnvPerCell(IMeshMaterialMng* material_mng);
37 static void _updateValues(IMeshMaterialMng* material_mng,
40 Int32 max_nb_env);
41};
42
43/*---------------------------------------------------------------------------*/
44/*---------------------------------------------------------------------------*/
45
46Int32 AllCellToAllEnvCell::Impl::
47_computeMaxNbEnvPerCell(IMeshMaterialMng* material_mng)
48{
50 RunQueue& queue = material_mng->_internalApi()->runQueue();
52 auto local_ids = material_mng->mesh()->allCells().internal()->itemsLocalId();
53 Int32 nb_item = local_ids.size();
54 auto select_func = [=] ARCCORE_HOST_DEVICE(Int32 i) -> Int32 {
57 return all_env_cell.nbEnvironment();
58 };
59 reducer.applyMaxWithIndex(nb_item, select_func);
60 Int32 max_nb_env = reducer.reducedValue();
61 return max_nb_env;
62}
63
64/*---------------------------------------------------------------------------*/
65/*---------------------------------------------------------------------------*/
66
67void AllCellToAllEnvCell::Impl::
68_updateValues(IMeshMaterialMng* material_mng,
71 Int32 max_nb_env)
72{
73 // mise a jour des valeurs
75 RunQueue& queue = material_mng->_internalApi()->runQueue();
76 auto command = makeCommand(queue);
77 command << RUNCOMMAND_ENUMERATE (CellLocalId, cid, material_mng->mesh()->allCells())
78 {
80 Int32 nb_env = all_env_cell.nbEnvironment();
81 if (nb_env != 0) {
82 Integer i = 0;
83 Integer offset = cid * max_nb_env;
84 for (EnvCell ev : all_env_cell.subEnvItems()) {
85 mem_pool[offset + i] = ComponentItemLocalId(ev._varIndex());
86 ++i;
87 }
88 allcell_allenvcell[cid] = Span<ComponentItemLocalId>(mem_pool + offset, nb_env);
89 }
90 else {
91 allcell_allenvcell[cid] = Span<ComponentItemLocalId>();
92 }
93 };
94}
95
96/*---------------------------------------------------------------------------*/
97/*---------------------------------------------------------------------------*/
98
99AllCellToAllEnvCell::
100AllCellToAllEnvCell(IMeshMaterialMng* mm)
101: m_material_mng(mm)
102{
103}
104
105/*---------------------------------------------------------------------------*/
106/*---------------------------------------------------------------------------*/
107
108void AllCellToAllEnvCell::
109reset()
110{
111 if (m_allcell_allenvcell_ptr) {
112 m_allcell_allenvcell.resize(0);
113 m_allcell_allenvcell_ptr = nullptr;
114 m_mem_pool.resize(0);
115 }
116 m_material_mng = nullptr;
117 m_size = 0;
118 m_current_max_nb_env = 0;
119}
120
121/*---------------------------------------------------------------------------*/
122/*---------------------------------------------------------------------------*/
123
125maxNbEnvPerCell() const
126{
127 return Impl::_computeMaxNbEnvPerCell(m_material_mng);
128}
129
130/*---------------------------------------------------------------------------*/
131/*---------------------------------------------------------------------------*/
132
135{
136 IMeshMaterialMng* mm = m_material_mng;
137 m_size = mm->mesh()->cellFamily()->maxLocalId() + 1;
138
139 m_allcell_allenvcell.resize(m_size);
140 m_allcell_allenvcell_ptr = m_allcell_allenvcell.to1DSpan().data();
141
142 // On force la valeur initiale sur tous les elmts car dans le ENUMERATE_CELL ci-dessous
143 // il se peut que m_size (qui vaut maxLocalId()+1) soit different de allCells().size()
144 m_allcell_allenvcell.fill(Span<ComponentItemLocalId>());
145
146 m_current_max_nb_env = maxNbEnvPerCell();
147 // TODO: vérifier débordement
148 Int32 pool_size = m_current_max_nb_env * m_size;
149 m_mem_pool.resize(pool_size);
150 m_mem_pool.fill(ComponentItemLocalId());
151
152 Span<ComponentItemLocalId> mem_pool_view(m_mem_pool.to1DSpan());
154 ENUMERATE_CELL (icell, mm->mesh()->allCells()) {
155 Int32 cid = icell->itemLocalId();
157 Integer nb_env(all_env_cell.nbEnvironment());
158 if (nb_env != 0) {
159 Integer i = 0;
160 Integer offset(cid * m_current_max_nb_env);
163 m_mem_pool[offset + i] = ComponentItemLocalId(ev._varIndex());
164 ++i;
165 }
166 m_allcell_allenvcell[cid] = Span<ComponentItemLocalId>(mem_pool_view.ptrAt(offset), nb_env);
167 }
168 }
169}
170
171/*---------------------------------------------------------------------------*/
172/*---------------------------------------------------------------------------*/
173
174void AllCellToAllEnvCell::
175bruteForceUpdate()
176{
177 // Si les ids ont changé, on doit tout refaire
178 if (m_size != m_material_mng->mesh()->allCells().itemFamily()->maxLocalId() + 1) {
179 initialize();
180 return;
181 }
182
184 // Si les ids n'ont pas changé, on regarde si à cet instant, le nb max d'env par maille a changé
185 // Si ca a changé, refaire le mem pool, sinon, juste update les valeurs
186 if (current_max_nb_env != m_current_max_nb_env) {
187 // On n'oublie pas de mettre a jour la nouvelle valeur !
188 m_current_max_nb_env = current_max_nb_env;
189 // Si le nb max d'env pour les mailles a changé à cet instant, on doit refaire le memory pool
190 ARCANE_ASSERT((m_allcell_allenvcell_ptr), ("Trying to change memory pool within a null structure"));
191 // on reinit a un span vide
192 m_allcell_allenvcell.fill(Span<ComponentItemLocalId>());
193 // on recrée le pool
194 auto pool_size(m_current_max_nb_env * m_size);
195 m_mem_pool.resize(pool_size);
196 m_mem_pool.fill(ComponentItemLocalId());
197 }
198 // Mise a jour des valeurs
199 Impl::_updateValues(m_material_mng, m_mem_pool.to1DSpan().data(), m_allcell_allenvcell_ptr, m_current_max_nb_env);
200}
201
202/*---------------------------------------------------------------------------*/
203/*---------------------------------------------------------------------------*/
204
205CellToAllEnvCellAccessor::
206CellToAllEnvCellAccessor(const IMeshMaterialMng* mmmng)
207: m_cell_allenvcell(mmmng->_internalApi()->getAllCellToAllEnvCell())
208{
209}
210
211/*---------------------------------------------------------------------------*/
212/*---------------------------------------------------------------------------*/
213
214} // End namespace Arcane::Materials
215
216/*---------------------------------------------------------------------------*/
217/*---------------------------------------------------------------------------*/
Types et macros pour itérer sur les entités du maillage.
#define ENUMERATE_CELL(name, group)
Enumérateur générique d'un groupe de mailles.
Types et fonctions pour gérer les synchronisations sur les accélérateurs.
Types et macros pour gérer les énumérations des entités sur les accélérateurs.
#define RUNCOMMAND_ENUMERATE(ItemTypeName, iter_name, item_group,...)
Macro pour itérer sur accélérateur sur un groupe d'entités.
Algorithme générique de réduction sur accélérateur.
Definition Reduce.h:1086
File d'exécution pour un accélérateur.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Int32 maxNbEnvPerCell() const
Méthode pour donner le nombre maximal d'environnements présents sur une maille à l'instant t.
void initialize()
Fonction de création alternative. Il faut attendre que les données relatives aux matériaux soient fin...
Maille arcane avec info matériaux et milieux.
Index d'un Item matériaux dans une variable.
Maille arcane d'un milieu.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
virtual IMesh * mesh()=0
Maillage associé.
#define ENUMERATE_CELL_ENVCELL(iname, all_env_cell)
Macro pour itérer sur tous les milieux d'une maille.
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
Active toujours les traces dans les parties Arcane concernant les matériaux.