Arcane  v3.14.10.0
Documentation utilisateur
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,
38 ComponentItemLocalId* mem_pool,
39 Span<ComponentItemLocalId>* allcell_allenvcell,
40 Int32 max_nb_env);
41};
42
43/*---------------------------------------------------------------------------*/
44/*---------------------------------------------------------------------------*/
45
46Int32 AllCellToAllEnvCell::Impl::
47_computeMaxNbEnvPerCell(IMeshMaterialMng* material_mng)
48{
49 CellToAllEnvCellConverter allenvcell_converter(material_mng);
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 {
55 CellLocalId lid(local_ids[i]);
56 AllEnvCell all_env_cell = allenvcell_converter[lid];
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,
69 ComponentItemLocalId* mem_pool,
70 Span<ComponentItemLocalId>* allcell_allenvcell,
71 Int32 max_nb_env)
72{
73 // mise a jour des valeurs
74 CellToAllEnvCellConverter all_env_cell_converter(material_mng);
75 RunQueue& queue = material_mng->_internalApi()->runQueue();
76 auto command = makeCommand(queue);
77 command << RUNCOMMAND_ENUMERATE (CellLocalId, cid, material_mng->mesh()->allCells())
78 {
79 AllEnvCell all_env_cell = all_env_cell_converter[cid];
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
124Int32 AllCellToAllEnvCell::
125maxNbEnvPerCell() const
126{
127 return Impl::_computeMaxNbEnvPerCell(m_material_mng);
128}
129
130/*---------------------------------------------------------------------------*/
131/*---------------------------------------------------------------------------*/
132
133void AllCellToAllEnvCell::
134initialize()
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());
153 CellToAllEnvCellConverter all_env_cell_converter(mm);
154 ENUMERATE_CELL (icell, mm->mesh()->allCells()) {
155 Int32 cid = icell->itemLocalId();
156 AllEnvCell all_env_cell = all_env_cell_converter[CellLocalId(cid)];
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);
161 ENUMERATE_CELL_ENVCELL (ienvcell, all_env_cell) {
162 EnvCell ev = *ienvcell;
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
183 Int32 current_max_nb_env(maxNbEnvPerCell());
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.
virtual Int32 maxLocalId() const =0
virtual CellGroup allCells()=0
Groupe de toutes les mailles.
Int32ConstArrayView itemsLocalId() const
Liste des numéros locaux des entités de ce groupe.
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
Definition ItemGroup.h:123
Maille arcane avec info matériaux et milieux.
__host__ __device__ Int32 nbEnvironment() const
Nombre de milieux présents dans la maille.
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é.
virtual IMeshMaterialMngInternal * _internalApi() const =0
API interne à Arcane.
Vue d'un tableau d'éléments de type T.
Definition Span.h:510
#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.
Int32 Integer
Type représentant un entier.