Arcane  v3.14.10.0
Documentation utilisateur
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/*---------------------------------------------------------------------------*/
41/*!
42 * \ingroup ArcaneMaterials
43 * \brief Table de connectivité des 'Cell' vers leur(s) 'AllEnvCell' destinée
44 * à une utilisation sur accélérateur.
45 *
46 * Classe qui conserve la connectivité de toutes les mailles
47 * \a Cell vers toutes leurs mailles \a AllEnvCell.
48 *
49 * On crée une instance via la méthode create().
50 *
51 * Le coût de l'initialisation est cher, il faut allouer la mémoire et remplir les
52 * structures. On parcours toutes les mailles et pour chaque maille on fait
53 * appel au CellToAllEnvCellConverter.
54 *
55 * Une fois l'instance créée, elle doit être mise à jour à chaque fois que
56 * la topologie des matériaux/environnements change (ce qui est également cher).
57 *
58 * Cette classe est une classe interne et ne doit pas être manipulée directement.
59 * Il faut passer par les helpers associés dans le IMeshMaterialMng et
60 * la classe CellToAllEnvCellAccessor.
61 */
62class ARCANE_MATERIALS_EXPORT AllCellToAllEnvCell
63{
64 friend class CellToAllEnvCellAccessor;
66 friend class MeshMaterialMng;
67 friend class AllEnvData;
68 friend ArcaneTest::MeshMaterialAcceleratorUnitTest;
69
70 public:
71
72 class Impl;
73
74 private:
75
77
78 public:
79
80 //! Copies interdites
82
83 private:
84
85 /*!
86 * \brief Fonction de création alternative. Il faut attendre que les données
87 * relatives aux matériaux soient finalisées.
88 *
89 * La différence réside dans la gestion de la mémoire.
90 * Ici, on applique un compromis sur la taille de la table cid -> envcells
91 * où la taille du tableau pour ranger les envcells d'une cell est égale à la taille
92 * max du nb d'environnement présent à un instant t dans un maille.
93 * Celà permet de ne pas faire les allocations mémoire dans la boucle interne et de
94 * façon systématique.
95 * => Gain de perf à évaluer.
96 */
97 void initialize();
98
99 //! Méthode d'accès à la table de "connectivité" cell -> all env cells
100 ARCCORE_HOST_DEVICE Span<ComponentItemLocalId>* internal() const
101 {
102 return m_allcell_allenvcell_ptr;
103 }
104
105 /*!
106 * \brief Méthode pour donner le nombre maximal d'environnements
107 * présents sur une maille à l'instant t.
108 *
109 * Le fait d'effectuer cette opération à un instant donné, permet
110 * d'avoir une valeur max <= au nombre total d'environnement présents
111 * dans le jdd (et donc d'économiser un peu de mémoire).
112 */
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/*---------------------------------------------------------------------------*/
138/*!
139 * \ingroup ArcaneMaterials
140 * \brief Classe d'encapsulation pour accéder à la connectivité équivalente
141 * cell -> allenvcell. Destinée à être utilisée avec l'API accélérateur
142 * via les RUNCOMMAND_...
143 * \note Aucun interet en soit, mis à part le fait d'obliger l'utilisateur à créer
144 * cet objet en amout de l'appel à un RUNCOMMAND_ENUMERATE_CELL_ALLENVCELL et donc
145 * de garantir la copie du pointeur AllCellToAllEnvCell pour la lambda à executer sur
146 * l'accélérateur
147 */
148class ARCANE_MATERIALS_EXPORT CellToAllEnvCellAccessor
149{
150 public:
151
152 using size_type = Span<ComponentItemLocalId>::size_type;
153
154 public:
155
156 CellToAllEnvCellAccessor() = default;
157 explicit CellToAllEnvCellAccessor(const IMeshMaterialMng* mm);
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/*---------------------------------------------------------------------------*/
229/*!
230 * \brief Macro pour itérer sur un groupe de mailles dans le but d'itérer
231 * sur les allenvcell de chaque maille.
232 *
233 * \note En forçant l'utilisation du CellToAllEnvCellAccessor dans la macro,
234 * on assure la capture par copie du pointeur de AllCellToAllEnvCell, permettant
235 * l'utilisation du ENUMERATE_CELL_ALLENVCELL.
236 *
237 * TODO Très certainement à déplacer ailleurs si on garde ce proto
238 */
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/*---------------------------------------------------------------------------*/
251/*!
252 * \brief Macro pour itérer sur tous les milieux d'une maille à l'intérieur.
253 * Version "brute et légère" ENUMERATE_CELL_ENVCELL, destinée à un
254 * emploi sur accélérateur, i.e. au sein d'un RUN_COMMAND...
255 *
256 * \param iname nom de la variable (type MatVarIndex) permettant l'accès aux
257 * données.
258 * \param cid identifiant de la maille (type Integer).
259 * \param cell_to_allenvcellaccessor connectivité cell->allenvcell (type CellToAllEnvCellAccessor)
260 */
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.
Table de connectivité des 'Cell' vers leur(s) 'AllEnvCell' destinée à une utilisation sur accélérateu...
AllCellToAllEnvCell & operator=(const AllCellToAllEnvCell &)=delete
Copies interdites.
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.
Tableaux multi-dimensionnels pour les types numériques accessibles sur accélérateurs.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:209
Vue d'un tableau d'éléments de type T.
Definition Span.h:510
Active toujours les traces dans les parties Arcane concernant les matériaux.
Real2 operator*(Real sca, const Real2Proxy &vec)
Multiplication par un scalaire.
Definition Real2Proxy.h:241