14#include "arcane/materials/AllCellToAllEnvCellConverter.h"
16#include "arcane/utils/NumArray.h"
18#include "arcane/core/IItemFamily.h"
20#include "arcane/core/ItemGroup.h"
21#include "arcane/core/materials/internal/IMeshMaterialMngInternal.h"
23#include "arcane/materials/internal/AllCellToAllEnvCellContainer.h"
47 m_mem_pool.setDebugName(
"AllCellToAllEnvCellMemPool");
48 m_envcell_container.setDebugName(
"AllCellToAllEnvCellCells");
53 Int32 computeMaxNbEnvPerCell();
55 void bruteForceUpdate();
72 Int32 m_current_max_nb_env = 0;
79Int32 AllCellToAllEnvCellContainer::Impl::
80computeMaxNbEnvPerCell()
87 Int32 nb_item = local_ids.size();
88 auto select_func = [=] ARCCORE_HOST_DEVICE(Int32 i) -> Int32 {
90 AllEnvCell all_env_cell = allenvcell_converter[lid];
93 reducer.applyMaxWithIndex(nb_item, select_func);
94 Int32 max_nb_env = reducer.reducedValue();
101void AllCellToAllEnvCellContainer::Impl::
113 AllEnvCell all_env_cell = all_env_cell_converter[cid];
114 Integer offset = cid * max_nb_env;
117 for (Int32 x = 0; x < max_nb_env; ++x)
121 for (
EnvCell ev : all_env_cell.subEnvItems()) {
125 allcell_allenvcell[cid] = Span<ComponentItemLocalId>(mem_pool.
ptrAt(offset), nb_env);
128 allcell_allenvcell[cid] = {};
136void AllCellToAllEnvCellContainer::Impl::
139 IMeshMaterialMng* mm = m_material_mng;
140 RunQueue queue = mm->_internalApi()->runQueue();
141 m_size = mm->mesh()->cellFamily()->maxLocalId() + 1;
143 m_envcell_container.resize(m_size);
144 m_all_cell_to_all_env_cell.m_allcell_allenvcell_ptr = m_envcell_container.to1DSpan();
148 m_envcell_container.fill(Span<ComponentItemLocalId>(), &queue);
150 m_current_max_nb_env = computeMaxNbEnvPerCell();
152 Int32 pool_size = m_current_max_nb_env * m_size;
153 m_mem_pool.resize(pool_size);
154 m_mem_pool.fill(ComponentItemLocalId(), &queue);
156 Span<ComponentItemLocalId> mem_pool_view(m_mem_pool.to1DSpan());
157 CellToAllEnvCellConverter all_env_cell_converter(mm);
159 auto mem_pool =
viewOut(command, m_mem_pool);
160 auto allcell_allenvcell =
viewOut(command, m_envcell_container);
161 const Int32 max_nb_env = m_current_max_nb_env;
164 AllEnvCell all_env_cell = all_env_cell_converter[CellLocalId(cid)];
165 Integer nb_env(all_env_cell.nbEnvironment());
168 Integer offset(cid * max_nb_env);
170 EnvCell ev = *ienvcell;
171 mem_pool[offset + i] = ComponentItemLocalId(ev._varIndex());
174 allcell_allenvcell[cid] = Span<ComponentItemLocalId>(mem_pool_view.ptrAt(offset), nb_env);
182void AllCellToAllEnvCellContainer::Impl::
186 if (m_size != m_material_mng->mesh()->allCells().itemFamily()->maxLocalId() + 1) {
191 Int32 current_max_nb_env(computeMaxNbEnvPerCell());
194 if (current_max_nb_env != m_current_max_nb_env) {
196 m_current_max_nb_env = current_max_nb_env;
199 m_mem_pool.resize(pool_size);
202 updateValues(m_material_mng, m_mem_pool.to1DSpan(), m_all_cell_to_all_env_cell.m_allcell_allenvcell_ptr, m_current_max_nb_env);
208void AllCellToAllEnvCellContainer::Impl::
211 m_envcell_container.resize(0);
212 m_all_cell_to_all_env_cell.m_allcell_allenvcell_ptr = {};
213 m_mem_pool.resize(0);
214 m_material_mng =
nullptr;
216 m_current_max_nb_env = 0;
225AllCellToAllEnvCellContainer::
226AllCellToAllEnvCellContainer(IMeshMaterialMng* mm)
234AllCellToAllEnvCellContainer::
235~AllCellToAllEnvCellContainer()
243void AllCellToAllEnvCellContainer::
252Int32 AllCellToAllEnvCellContainer::
253computeMaxNbEnvPerCell()
const
255 return m_p->computeMaxNbEnvPerCell();
261void AllCellToAllEnvCellContainer::
270void AllCellToAllEnvCellContainer::
273 m_p->bruteForceUpdate();
279AllCellToAllEnvCell AllCellToAllEnvCellContainer::
291CellToAllEnvCellAccessor::
292CellToAllEnvCellAccessor(
const IMeshMaterialMng* mm)
294 AllCellToAllEnvCellContainer* c = mm->_internalApi()->getAllCellToAllEnvCellContainer();
296 m_cell_allenvcell = c->view();
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.
File d'exécution pour un accélérateur.
virtual CellGroup allCells()=0
Groupe de toutes les mailles.
Int32ConstArrayView itemsLocalId() const
Liste des numéros locaux des entités de ce groupe.
Table de connectivité des 'Cell' vers leur(s) 'AllEnvCell' destinée à une utilisation sur accélérateu...
Maille arcane avec info matériaux et milieux.
__host__ __device__ Int32 nbEnvironment() const
Nombre de milieux présents dans la maille.
Conversion de 'Cell' en 'AllEnvCell'.
Index d'un ConstituentItem 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é.
virtual IMeshMaterialMngInternal * _internalApi() const =0
API interne à Arcane.
Tableaux multi-dimensionnels pour les types numériques accessibles sur accélérateurs.
constexpr __host__ __device__ pointer ptrAt(SizeType index) const
Addresse du index-ème élément.
Vue d'un tableau d'éléments de type T.
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
Integer multiply(Integer x, Integer y, Integer z)
Multiplie trois 'Integer' et vérifie que le résultat peut être contenu dans un 'Integer'.
Active toujours les traces dans les parties Arcane concernant les matériaux.
auto viewOut(MeshVariableScalarRefT< ItemType, DataType > &var)
Vue en écriture.
Int32 Integer
Type représentant un entier.