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 {
89 CellLocalId lid(local_ids[i]);
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)
118 mem_pool[offset + x] = ComponentItemLocalId();
122 mem_pool[offset + i] = ComponentItemLocalId(ev._varIndex());
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);
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) {
194 if (current_max_nb_env != m_current_max_nb_env) {
196 m_current_max_nb_env = current_max_nb_env;
198 Int32 pool_size = CheckedConvert::multiply(m_current_max_nb_env, m_size);
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::
255 return m_p->computeMaxNbEnvPerCell();
273 m_p->bruteForceUpdate();
291CellToAllEnvCellAccessor::
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.
ItemGroupImpl * internal() const
Retourne l'implémentation du groupe.
Table de connectivité des 'Cell' vers leur(s) 'AllEnvCell' destinée à une utilisation sur accélérateu...
Int32 computeMaxNbEnvPerCell() 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...
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__ CellEnvCellEnumerator subEnvItems() const
Enumérateur sur les mailles milieux de cette maille.
__host__ __device__ Int32 nbEnvironment() const
Nombre de milieux présents dans la maille.
Conversion de 'Cell' en 'AllEnvCell'.
Maille arcane d'un milieu.
virtual RunQueue & runQueue() const =0
File d'exécution par défaut.
virtual AllCellToAllEnvCellContainer * getAllCellToAllEnvCellContainer() const =0
Renvoie la table de "connectivité" CellLocalId -> AllEnvCell destinée à être utilisée dans un RUNCOMM...
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
Adresse 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.
auto viewOut(const ViewBuildInfo &vbi, CellMaterialVariableScalarRef< DataType > &var)
Vue en écriture pour les variables materiaux scalaire.
Active toujours les traces dans les parties Arcane concernant les matériaux.
Int32 Integer
Type représentant un entier.
ExtentsV< Int32, DynExtent > MDDim1
Constante pour un tableau dynamique de rang 1.
std::int32_t Int32
Type entier signé sur 32 bits.