Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
AllCellToAllEnvCellConverter.h
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.h (C) 2000-2024 */
9/* */
10/* Conversion de 'Cell' en 'AllEnvCell'. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_MATERIALS_ALLCELLTOALLENVCELLCONVERTER_H
13#define ARCANE_MATERIALS_ALLCELLTOALLENVCELLCONVERTER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
19#include "arcane/utils/PlatformUtils.h"
20#include "arcane/utils/NumArray.h"
21
22#include "arcane/core/IMesh.h"
23#include "arcane/core/materials/MatItem.h"
24#include "arcane/core/materials/IMeshMaterialMng.h"
26#include "arcane/core/materials/CellToAllEnvCellConverter.h"
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31namespace ArcaneTest
32{
33class MeshMaterialAcceleratorUnitTest;
34}
35
36namespace Arcane::Materials
37{
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
62class ARCANE_MATERIALS_EXPORT AllCellToAllEnvCell
63{
64 friend class CellToAllEnvCellAccessor;
66 friend class MeshMaterialMng;
67 friend class AllEnvData;
69
70 public:
71
72 class Impl;
73
74 private:
75
77
78 public:
79
82
83 private:
84
97 void initialize();
98
100 ARCCORE_HOST_DEVICE Span<ComponentItemLocalId>* internal() const
101 {
102 return m_allcell_allenvcell_ptr;
103 }
104
113 Int32 maxNbEnvPerCell() const;
114
115 /*
116 * On regarde si le nb max d'env par cell à l'instant t a changé,
117 * et si c'est le cas, on force la reconstruction de la table.
118 * Est appelé par le forceRecompute du ImeshMaterialMng
119 */
120 void bruteForceUpdate();
121
122 private:
123
124 void reset();
125
126 private:
127
128 IMeshMaterialMng* m_material_mng = nullptr;
129 Integer m_size = 0;
130 NumArray<Span<ComponentItemLocalId>, MDDim1> m_allcell_allenvcell;
131 Span<ComponentItemLocalId>* m_allcell_allenvcell_ptr = nullptr;
133 Int32 m_current_max_nb_env = 0;
134};
135
136/*---------------------------------------------------------------------------*/
137/*---------------------------------------------------------------------------*/
148class ARCANE_MATERIALS_EXPORT CellToAllEnvCellAccessor
149{
150 public:
151
152 using size_type = Span<ComponentItemLocalId>::size_type;
153
154 public:
155
156 CellToAllEnvCellAccessor() = default;
158
159 ARCCORE_HOST_DEVICE const AllCellToAllEnvCell* getAllCellToAllEnvCell() const
160 {
161 return m_cell_allenvcell;
162 }
163
164 ARCCORE_HOST_DEVICE size_type nbEnvironment(Integer cid) const
165 {
166 return m_cell_allenvcell->internal()[cid].size();
167 }
168
169 private:
170
171 AllCellToAllEnvCell* m_cell_allenvcell = nullptr;
172};
173
174/*---------------------------------------------------------------------------*/
175/*---------------------------------------------------------------------------*/
176
177class ARCANE_MATERIALS_EXPORT CellToAllComponentCellEnumerator
178{
179 friend class EnumeratorTracer;
180
181 public:
182
183 using index_type = Span<ComponentItemLocalId>::index_type;
184 using size_type = Span<ComponentItemLocalId>::size_type;
185
186 public:
187
188 // La version CPU permet de vérifier qu'on a bien fait l'init avant l'ENUMERATE
189 ARCCORE_HOST_DEVICE explicit CellToAllComponentCellEnumerator(Integer cell_id, const CellToAllEnvCellAccessor& acc)
190 : m_cid(cell_id)
191 {
192#if defined(ARCCORE_DEVICE_CODE)
193 m_ptr = &(acc.getAllCellToAllEnvCell()->internal()[cell_id]);
194 m_size = m_ptr->size();
195#else
196 if (acc.getAllCellToAllEnvCell()) {
197 m_ptr = &(acc.getAllCellToAllEnvCell()->internal()[cell_id]);
198 m_size = m_ptr->size();
199 }
200 else
201 ARCANE_FATAL("Must create AllCellToAllEnvCell before using ENUMERATE_ALLENVCELL");
202#endif
203 }
204 ARCCORE_HOST_DEVICE void operator++()
205 {
206 ++m_index;
207 }
208
209 ARCCORE_HOST_DEVICE bool hasNext() const
210 {
211 return m_index < m_size;
212 }
213
214 ARCCORE_HOST_DEVICE ComponentItemLocalId operator*() const
215 {
216 return (*m_ptr)[m_index];
217 }
218
219 private:
220
221 Integer m_cid = 0;
222 index_type m_index = 0;
223 Span<ComponentItemLocalId>* m_ptr = nullptr;
224 size_type m_size = 0;
225};
226
227/*---------------------------------------------------------------------------*/
228/*---------------------------------------------------------------------------*/
239#define RUNCOMMAND_ENUMERATE_CELL_ALLENVCELL(cell_to_allenvcellaccessor, iter_name, cell_group) \
240 A_FUNCINFO << cell_group << [=] ARCCORE_HOST_DEVICE(CellLocalId iter_name)
241
242/*---------------------------------------------------------------------------*/
243/*---------------------------------------------------------------------------*/
244
245// TODO: Très certainement à déplacer ailleurs si on garde ce proto
246#define A_ENUMERATE_CELL_ALLCOMPONENTCELL(_EnumeratorClassName, iname, cid, cell_to_allenvcellaccessor) \
247 for (A_TRACE_COMPONENT(_EnumeratorClassName) iname(::Arcane::Materials::_EnumeratorClassName(cid, cell_to_allenvcellaccessor) A_TRACE_ENUMERATOR_WHERE); iname.hasNext(); ++iname)
248
249/*---------------------------------------------------------------------------*/
250/*---------------------------------------------------------------------------*/
261// TODO: Très certainement à déplacer ailleurs si on garde ce proto
262#define ENUMERATE_CELL_ALLENVCELL(iname, cid, cell_to_allenvcellaccessor) \
263 A_ENUMERATE_CELL_ALLCOMPONENTCELL(CellToAllComponentCellEnumerator, iname, cid, cell_to_allenvcellaccessor)
264
265/*---------------------------------------------------------------------------*/
266/*---------------------------------------------------------------------------*/
267
268} // End namespace Arcane::Materials
269
270/*---------------------------------------------------------------------------*/
271/*---------------------------------------------------------------------------*/
272
273#endif
274
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Table de connectivité des 'Cell' vers leur(s) 'AllEnvCell' destinée à une utilisation sur accélérateu...
ARCCORE_HOST_DEVICE Span< ComponentItemLocalId > * internal() const
Méthode d'accès à la table de "connectivité" cell -> all env cells.
AllCellToAllEnvCell & operator=(const AllCellToAllEnvCell &)=delete
Copies interdites.
Informations sur les valeurs des milieux.
Definition AllEnvData.h:44
Classe d'encapsulation pour accéder à la connectivité équivalente cell -> allenvcell....
Index d'un Item matériaux dans une variable.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
Implémentation d'un gestion des matériaux.
Active toujours les traces dans les parties Arcane concernant les matériaux.