Arcane  v3.15.0.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/core/materials/MatItem.h"
21#include "arcane/core/materials/CellToAllEnvCellConverter.h"
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane::Materials
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31/*!
32 * \ingroup ArcaneMaterials
33 * \brief Table de connectivité des 'Cell' vers leur(s) 'AllEnvCell' destinée
34 * à une utilisation sur accélérateur.
35 *
36 * Classe qui conserve la connectivité de toutes les mailles
37 * \a Cell vers toutes leurs mailles \a AllEnvCell.
38 *
39 * On crée une instance via la méthode create().
40 *
41 * Le coût de l'initialisation est cher, il faut allouer la mémoire et remplir les
42 * structures. On parcours toutes les mailles et pour chaque maille on fait
43 * appel au CellToAllEnvCellConverter.
44 *
45 * Une fois l'instance créée, elle doit être mise à jour à chaque fois que
46 * la topologie des matériaux/environnements change (ce qui est également cher).
47 *
48 * Cette classe est une classe interne et ne doit pas être manipulée directement.
49 * Il faut passer par les helpers associés dans le IMeshMaterialMng et
50 * la classe CellToAllEnvCellAccessor.
51 */
52class ARCANE_MATERIALS_EXPORT AllCellToAllEnvCell
53{
54 friend class CellToAllEnvCellAccessor;
56 friend AllCellToAllEnvCellContainer;
57
58 private:
59
60 //! Méthode d'accès à la table de "connectivité" cell -> all env cells
61 ARCCORE_HOST_DEVICE Span<ComponentItemLocalId> operator[](Int32 cell_id) const
62 {
63 return m_allcell_allenvcell_ptr[cell_id];
64 }
65
66 private:
67
68 Span<Span<ComponentItemLocalId>> m_allcell_allenvcell_ptr;
69};
70
71/*---------------------------------------------------------------------------*/
72/*---------------------------------------------------------------------------*/
73/*!
74 * \ingroup ArcaneMaterials
75 * \brief Classe d'encapsulation pour accéder à la connectivité équivalente
76 * cell -> allenvcell. Destinée à être utilisée avec l'API accélérateur
77 * via les RUNCOMMAND_...
78 * \note Aucun interet en soit, mis à part le fait d'obliger l'utilisateur à créer
79 * cet objet en amout de l'appel à un RUNCOMMAND_ENUMERATE_CELL_ALLENVCELL et donc
80 * de garantir la copie du pointeur AllCellToAllEnvCell pour la lambda à executer sur
81 * l'accélérateur
82 */
83class ARCANE_MATERIALS_EXPORT CellToAllEnvCellAccessor
84{
86
87 public:
88
89 using size_type = Span<ComponentItemLocalId>::size_type;
90
91 public:
92
93 CellToAllEnvCellAccessor() = default;
95
96 ARCCORE_HOST_DEVICE size_type nbEnvironment(Int32 cid) const
97 {
98 return m_cell_allenvcell[cid].size();
99 }
100
101 private:
102
103 ARCCORE_HOST_DEVICE AllCellToAllEnvCell _getAllCellToAllEnvCell() const
104 {
105 return m_cell_allenvcell;
106 }
107
108 private:
109
110 AllCellToAllEnvCell m_cell_allenvcell;
111};
112
113/*---------------------------------------------------------------------------*/
114/*---------------------------------------------------------------------------*/
115
116class ARCANE_MATERIALS_EXPORT CellToAllComponentCellEnumerator
117{
118 friend class EnumeratorTracer;
119
120 public:
121
122 using index_type = Span<ComponentItemLocalId>::index_type;
123 using size_type = Span<ComponentItemLocalId>::size_type;
124
125 public:
126
127 // La version CPU permet de vérifier qu'on a bien fait l'init avant l'ENUMERATE
128 ARCCORE_HOST_DEVICE explicit CellToAllComponentCellEnumerator(Int32 cell_id, const CellToAllEnvCellAccessor& acc)
129 {
130 AllCellToAllEnvCell all_env_view = acc._getAllCellToAllEnvCell();
131 m_ptr = all_env_view[cell_id];
132 }
133 ARCCORE_HOST_DEVICE void operator++()
134 {
135 ++m_index;
136 }
137
138 ARCCORE_HOST_DEVICE bool hasNext() const
139 {
140 return m_index < m_ptr.size();
141 }
142
143 ARCCORE_HOST_DEVICE ComponentItemLocalId operator*() const
144 {
145 return m_ptr[m_index];
146 }
147
148 private:
149
150 index_type m_index = 0;
152};
153
154/*---------------------------------------------------------------------------*/
155/*---------------------------------------------------------------------------*/
156/*!
157 * \brief Macro pour itérer sur un groupe de mailles dans le but d'itérer
158 * sur les allenvcell de chaque maille.
159 *
160 * \note En forçant l'utilisation du CellToAllEnvCellAccessor dans la macro,
161 * on assure la capture par copie du pointeur de AllCellToAllEnvCell, permettant
162 * l'utilisation du ENUMERATE_CELL_ALLENVCELL.
163 *
164 * TODO Très certainement à déplacer ailleurs si on garde ce proto
165 */
166#define RUNCOMMAND_ENUMERATE_CELL_ALLENVCELL(cell_to_allenvcellaccessor, iter_name, cell_group) \
167 A_FUNCINFO << cell_group << [=] ARCCORE_HOST_DEVICE(CellLocalId iter_name)
168
169/*---------------------------------------------------------------------------*/
170/*---------------------------------------------------------------------------*/
171
172// TODO: Très certainement à déplacer ailleurs si on garde ce proto
173#define A_ENUMERATE_CELL_ALLCOMPONENTCELL(_EnumeratorClassName, iname, cid, cell_to_allenvcellaccessor) \
174 for (A_TRACE_COMPONENT(_EnumeratorClassName) iname(::Arcane::Materials::_EnumeratorClassName(cid, cell_to_allenvcellaccessor) A_TRACE_ENUMERATOR_WHERE); iname.hasNext(); ++iname)
175
176/*---------------------------------------------------------------------------*/
177/*---------------------------------------------------------------------------*/
178/*!
179 * \brief Macro pour itérer sur tous les milieux d'une maille à l'intérieur.
180 * Version "brute et légère" ENUMERATE_CELL_ENVCELL, destinée à un
181 * emploi sur accélérateur, i.e. au sein d'un RUN_COMMAND...
182 *
183 * \param iname nom de la variable (type MatVarIndex) permettant l'accès aux
184 * données.
185 * \param cid identifiant de la maille (type Integer).
186 * \param cell_to_allenvcellaccessor connectivité cell->allenvcell (type CellToAllEnvCellAccessor)
187 */
188// TODO: Très certainement à déplacer ailleurs si on garde ce proto
189#define ENUMERATE_CELL_ALLENVCELL(iname, cid, cell_to_allenvcellaccessor) \
190 A_ENUMERATE_CELL_ALLCOMPONENTCELL(CellToAllComponentCellEnumerator, iname, cid, cell_to_allenvcellaccessor)
191
192/*---------------------------------------------------------------------------*/
193/*---------------------------------------------------------------------------*/
194
195} // End namespace Arcane::Materials
196
197/*---------------------------------------------------------------------------*/
198/*---------------------------------------------------------------------------*/
199
200#endif
201
Table de connectivité des 'Cell' vers leur(s) 'AllEnvCell' destinée à une utilisation sur accélérateu...
Classe d'encapsulation pour accéder à la connectivité équivalente cell -> allenvcell....
Index d'un ConstituentItem dans une variable.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
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