14#include "arcane/materials/internal/AcceleratorMeshMaterialSynchronizerImpl.h"
16#include "arcane/VariableTypes.h"
17#include "arcane/IParallelMng.h"
18#include "arcane/ItemPrinter.h"
19#include "arcane/IMesh.h"
21#include "arcane/materials/CellToAllEnvCellConverter.h"
22#include "arcane/materials/MatItemEnumerator.h"
23#include "arcane/materials/MeshMaterialModifier.h"
25#include "arcane/core/ItemGenericInfoListView.h"
26#include "arcane/core/internal/IParallelMngInternal.h"
36AcceleratorMeshMaterialSynchronizerImpl::
38: TraceAccessor(material_mng->traceMng())
39, m_material_mng(material_mng)
40, m_mat_presence(VariableBuildInfo(material_mng->mesh(),
"ArcaneMaterialSyncPresence"))
42 IMesh* mesh = m_material_mng->mesh();
43 auto* internal_pm = mesh->parallelMng()->_internalApi();
44 if (!internal_pm->runner().isInitialized()) {
45 Arcane::Runner default_runner(Arcane::Accelerator::eExecutionPolicy::Sequential);
46 internal_pm->setDefaultRunner(default_runner);
58bool AcceleratorMeshMaterialSynchronizerImpl::
59synchronizeMaterialsInCells()
77 if (!
mesh->parallelMng()->isParallel())
80 auto* internal_pm =
mesh->parallelMng()->_internalApi();
85 if ((nb_mat % 8) != 0)
87 m_mat_presence.resize(dim2_size);
89 info(4) <<
"Resize presence variable nb_mat=" << nb_mat <<
" dim2=" << dim2_size;
100 m_idx_selecter.resize(
mesh->allCells().size());
102 command << RUNCOMMAND_ENUMERATE_CELL_ALLENVCELL(cell2allenvcell, cid,
mesh->ownCells())
106 for (
Integer dim2 = 0; dim2 < dim2_size; dim2++) {
107 out_mat_presence[cid][dim2] = 0;
114 _setBit(out_mat_presence[cid][mat_index / 8], mat_index);
119 bool has_changed =
false;
122 m_mat_presence.synchronize();
124 auto out_after_presence = out_mat_presence;
132 for (
Integer imat = 0; imat < nb_mat; ++imat) {
134 to_add[imat] = m_idx_selecter.syncSelectIf(m_queue, [=] ARCCORE_HOST_DEVICE(
Int32 cid) ->
bool {
135 if (cells_info.
isOwn(cid))
137 CellLocalId c{ cid };
139 bool was_here =
false;
145 if (mat_index == imat) {
152 return _hasBit(out_after_presence[c][imat / 8], imat);
156 if (!to_add[imat].empty()) {
163 modifier.
addCells(materials[imat], to_add[imat]);
167 to_remove[imat] = m_idx_selecter.syncSelectIf(m_queue, [=] ARCCORE_HOST_DEVICE(
Int32 cid) ->
bool {
168 if (cells_info.
isOwn(cid))
170 CellLocalId c{ cid };
172 bool was_here =
false;
178 if (mat_index == imat) {
185 return !_hasBit(out_after_presence[c][imat / 8], imat);
189 if (!to_remove[imat].empty()) {
196 modifier.
removeCells(materials[imat], to_remove[imat]);
Construction d'un sous-ensemble d'indexes à partir d'un critère.
File d'exécution pour un accélérateur.
void setAsync(bool v)
Positionne l'asynchronisme de l'instance.
void barrier() const
Bloque tant que toutes les commandes associées à la file ne sont pas terminées.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Vue sur les informations génériques d'une famille d'entités.
constexpr __host__ __device__ bool isOwn(Int32 local_id) const
Indique si l'entité de numéro local local_id appartient au sous-domaine.
Maille arcane avec info matériaux et milieux.
Classe d'encapsulation pour accéder à la connectivité équivalente cell -> allenvcell....
Conversion de 'Cell' en 'AllEnvCell'.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
Représente un matériau d'une maille multi-matériau.
__host__ __device__ Int32 materialId() const
Identifiant du matériau.
Objet permettant de modifier les matériaux ou les milieux.
void addCells(IMeshMaterial *mat, SmallSpan< const Int32 > ids)
Ajoute les mailles d'indices locaux ids au matériau mat.
void removeCells(IMeshMaterial *mat, SmallSpan< const Int32 > ids)
Supprime les mailles d'indices locaux ids au matériau mat.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
auto viewInOut(const ViewBuildInfo &vbi, CellMaterialVariableScalarRef< DataType > &var)
Vue en lecture/écriture pour les variables materiaux scalaire.
Active toujours les traces dans les parties Arcane concernant les matériaux.
Int32 Integer
Type représentant un entier.
std::int32_t Int32
Type entier signé sur 32 bits.