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;
 
  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.
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.
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.