14#include "arcane/materials/internal/IncrementalComponentModifier.h"
16#include "arcane/utils/ITraceMng.h"
17#include "arcane/utils/FunctorUtils.h"
18#include "arcane/utils/ValueConvert.h"
20#include "arcane/core/IItemFamily.h"
21#include "arcane/core/materials/IMeshMaterialVariable.h"
23#include "arcane/materials/internal/MeshMaterialMng.h"
24#include "arcane/materials/internal/ConstituentConnectivityList.h"
25#include "arcane/materials/internal/AllEnvData.h"
27#include "arcane/accelerator/core/ProfileRegion.h"
38IncrementalComponentModifier::
39IncrementalComponentModifier(
AllEnvData* all_env_data,
const RunQueue& queue)
40: TraceAccessor(all_env_data->traceMng())
41, m_all_env_data(all_env_data)
42, m_material_mng(all_env_data->m_material_mng)
43, m_work_info(queue.allocationOptions(), queue.memoryRessource())
49 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_USE_GENERIC_COPY_BETWEEN_PURE_AND_PARTIAL",
true)) {
50 m_use_generic_copy_between_pure_and_partial = v.value();
55 if (queue.executionPolicy() != Accelerator::eExecutionPolicy::Sequential)
56 m_use_generic_copy_between_pure_and_partial = 2;
58 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_FORCE_MULTIPLE_COMMAND_FOR_MATERIAL_RESIZE",
true)) {
59 m_force_multiple_command_for_resize = (v.value());
60 info() <<
"Force using multiple command for resize = " << m_force_multiple_command_for_resize;
67void IncrementalComponentModifier::
68initialize(
bool is_debug)
70 m_is_debug = is_debug;
71 Int32 max_local_id = m_material_mng->mesh()->cellFamily()->maxLocalId();
72 Int32 nb_mat = m_material_mng->materials().size();
73 Int32 nb_env = m_material_mng->environments().size();
74 m_work_info.initialize(max_local_id, nb_mat, nb_env, m_queue);
75 m_work_info.is_verbose = is_debug || (traceMng()->verbosityLevel() >= 5);
81void IncrementalComponentModifier::
100void IncrementalComponentModifier::
101_switchCellsForMaterials(
const MeshMaterial* modified_mat,
104 const bool is_add = m_work_info.isAdd();
105 const bool is_device = m_queue.isAcceleratorPolicy();
111 if (mat == modified_mat)
114 if (!is_materials_modified[mat->id()])
118 m_work_info.pure_local_ids.clearHost();
119 m_work_info.partial_indexes.clearHost();
124 info(4) <<
"MatTransformCells is_add?=" << is_add <<
" indexer=" << indexer->
name()
125 <<
" mat_id=" << mat->id();
128 info(4) <<
"nb_transformed=" << nb_transformed;
129 if (nb_transformed == 0)
132 _resetTransformedCells(ids);
134 auto pure_local_ids = m_work_info.pure_local_ids.view(is_device);
135 auto partial_indexes = m_work_info.partial_indexes.view(is_device);
137 Int32 nb_pure = pure_local_ids.size();
138 Int32 nb_partial = partial_indexes.size();
139 info(4) <<
"NB_MAT_TRANSFORM pure=" << nb_pure
140 <<
" partial=" << nb_partial <<
" name=" << mat->name()
141 <<
" is_device?=" << is_device
142 <<
" is_modified?=" << is_materials_modified[mat->id()];
146 m_do_copy_between_partial_and_pure,
168void IncrementalComponentModifier::
172 const bool is_add = m_work_info.isAdd();
173 const bool is_device = m_queue.isAcceleratorPolicy();
180 const bool is_copy = is_add || !(m_material_mng->isUseMaterialValueWhenRemovingPartialValue());
183 info(4) <<
"Compute Cells for environments nb_transformed=" << nb_transformed;
184 if (nb_transformed == 0)
187 for (
const MeshEnvironment* env : m_material_mng->trueEnvironments()) {
189 if (env == modified_env)
192 if (env->isMonoMaterial())
195 const Int32 env_id = env->id();
197 if (!is_environments_modified[env_id])
201 m_work_info.pure_local_ids.clearHost();
202 m_work_info.partial_indexes.clearHost();
207 info(4) <<
"EnvTransformCells is_add?=" << is_add
208 <<
" env_id=" << env_id
209 <<
" indexer=" << indexer->
name() <<
" nb_item=" << ids.
size();
215 const Int32 nb_pure = pure_local_ids.
size();
217 info(4) <<
"NB_ENV_TRANSFORM nb_pure=" << nb_pure <<
" name=" << env->name()
218 <<
" is_modified=" << is_environments_modified[env_id];
223 m_do_copy_between_partial_and_pure, is_add,
229 _resetTransformedCells(ids);
241 const Int16 env_id = env->componentId();
242 bool is_add = m_work_info.isAdd();
264void IncrementalComponentModifier::
268 info(4) <<
"MeshEnvironment::removeItemsDirect mat=" << mat->
name();
273 env->addToTotalNbCellMat(-nb_to_remove);
275 mat->variableIndexer()->endUpdateRemove(m_work_info, nb_to_remove, m_queue);
277 if (update_env_indexer) {
282 env->variableIndexer()->endUpdateRemove(m_work_info, nb_to_remove, m_queue);
296void IncrementalComponentModifier::
300 info(4) <<
"MeshEnvironment::addItemsDirect"
301 <<
" mat=" << mat->
name();
304 const Int32 nb_to_add = local_ids.
size();
307 env->addToTotalNbCellMat(nb_to_add);
309 const Int16 env_id = env->componentId();
310 m_work_info.m_cells_is_partial.resize(nb_to_add);
312 connectivity->
fillCellsIsPartial(local_ids, env_id, m_work_info.m_cells_is_partial.to1DSmallSpan(), m_queue);
314 _addItemsToIndexer(var_indexer, local_ids);
316 if (update_env_indexer) {
321 _addItemsToIndexer(env->variableIndexer(), local_ids);
328void IncrementalComponentModifier::
334 list_builder.setIndexer(var_indexer);
337 list_builder.preAllocate(nb_id);
339 _computeItemsToAdd(list_builder, local_ids);
341 if (traceMng()->verbosityLevel() >= 5)
342 info() <<
"ADD_MATITEM_TO_INDEXER component=" << var_indexer->
name()
343 <<
" nb_pure=" << list_builder.pureIndexes().
size()
344 <<
" nb_partial=" << list_builder.partialIndexes().
size()
345 <<
"\n pure=(" << list_builder.pureIndexes() <<
")"
346 <<
"\n partial=(" << list_builder.partialIndexes() <<
")";
351 var_indexer->endUpdateAdd(list_builder, m_queue);
354 _resizeVariablesIndexer(var_indexer->index());
358 if (m_do_init_new_items) {
365 if (init_with_zero) {
369 bool do_one_command = (m_use_generic_copy_between_pure_and_partial == 2);
371 if (do_one_command) {
373 copy_data.
reserve(m_material_mng->nbVariable());
374 init_args.m_copy_data = ©_data;
378 mv->_internalApi()->initializeNewItemsWithZero(init_args);
380 functor::apply(mm, &IMeshMaterialMng::visitVariables, func_zero);
383 MDSpan<CopyBetweenDataInfo, MDDim1> x(copy_data.
data(), MDIndex<1>(copy_data.
size()));
384 m_work_info.m_variables_copy_data.copy(x, &m_queue);
385 _applyInitializeWithZero(init_args);
390 SmallSpan<Int32> partial_local_ids = list_builder.partialLocalIds();
392 CopyBetweenPartialAndGlobalArgs args(var_indexer->index(), partial_local_ids,
393 partial_indexes,
true,
true, m_queue);
394 _copyBetweenPartialsAndGlobals(args);
404void IncrementalComponentModifier::
405_resizeVariablesIndexer(
Int32 var_index)
415 do_one_command =
false;
418 if (do_one_command) {
420 copy_data.
reserve(m_material_mng->nbVariable());
432 auto* mvi = mv->_internalApi();
433 mvi->resizeForIndexer(resize_args);
441 auto* mvi = mv->_internalApi();
442 mvi->resizeForIndexer(resize_args);
447 if (do_one_command) {
450 m_work_info.m_variables_copy_data.copy(x, &m_queue);
466void IncrementalComponentModifier::
469 if (args.m_local_ids.
empty())
471 const bool do_copy = args.m_do_copy_between_partial_and_pure;
472 const bool is_add_operation = args.m_is_global_to_partial;
483 if (is_add_operation) {
491 copy_data.
reserve(m_material_mng->nbVariable());
499 auto* mvi = mv->_internalApi();
501 args2.m_queue = queue_pool[index];
502 mvi->copyBetweenPartialAndGlobal(args2);
506 if (do_one_command) {
509 m_work_info.m_variables_copy_data.copy(x, &queue);
Integer size() const
Nombre d'éléments du vecteur.
Région pour le profiling.
void barrier() const
Force l'attente de toutes les RunQueue.
Permet de modifier l'asynchronisme de la file pendant la durée de vie de l'instance.
File d'exécution pour un accélérateur.
void clear()
Supprime les éléments du tableau.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
const T * data() const
Accès à la racine du tableau hors toute protection.
Classe de base des vues multi-dimensionnelles.
Informations sur les valeurs des milieux.
Classe d'aide à la construction d'une liste de ComponentItem pour un MeshMaterialVariableIndexer.
Gestion des listes de connectivité des constituants.
Int32 fillCellsToTransform(SmallSpan< const Int32 > cells_local_id, Int16 env_id, SmallSpan< bool > cells_do_transform, bool is_add, RunQueue &queue)
Replit cells_do_transform en indiquant is la maille passe de pure à partielle.
void fillCellsIsPartial(SmallSpan< const Int32 > cells_local_id, Int16 env_id, SmallSpan< bool > cells_is_partial, RunQueue &queue)
Replit cells_is_partial en indiquant is la maille est partielle pour le milieu env_id.
Arguments des méthodes de copie entre valeurs partielles et globales.
Interface d'un milieu d'un maillage.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
virtual bool isDataInitialisationWithZero() const =0
Indique comment initialiser les nouvelles valeurs dans les mailles matériaux et milieux.
Interface d'une variable matériau d'un maillage.
Int32 _computeCellsToTransformForEnvironments(SmallSpan< const Int32 > ids)
Calcule les mailles à transformer lorsqu'on modifie les mailles d'un milieu.
void _applyCopyVariableViews(RunQueue &queue)
Effectue la copie des vues pour les variables.
bool m_force_multiple_command_for_resize
Vrai si on force à utiliser une seule commande pour le redimensionnement.
void _applyCopyBetweenPartialsAndGlobals(const CopyBetweenPartialAndGlobalArgs &args, RunQueue &queue)
Effectue la copie entre les valeurs partielles et globales.
void _resizeVariablesIndexer(Int32 var_index)
Redimensionne l'index var_index des variables.
void _copyBetweenPartialsAndGlobals(const CopyBetweenPartialAndGlobalArgs &args)
Copie entre les valeurs partielles et les valeurs globales.
Int32 m_use_generic_copy_between_pure_and_partial
1 ou 2 si on utilise une version générique pour les copies entre pure et partiel
Int32 _computeCellsToTransformForMaterial(const MeshMaterial *mat, SmallSpan< const Int32 > ids)
Calcule les mailles à transformer pour le matériau \at mat.
Arguments des méthodes de copie entre valeurs partielles et globales.
void visitVariables(IFunctorWithArgumentT< IMeshMaterialVariable * > *functor) override
Applique le fonctor functor sur l'ensemble des variables matériaux.
Indexer pour les variables materiaux.
void transformCells(ConstituentModifierWorkInfo &args, RunQueue &queue, bool is_from_env)
Transforme des mailles entre pure et partielle.
const String & name() const
Nom de l'indexeur.
String name() const override
Nom du composant.
Arguments des méthodes de copie entre valeurs partielles et globales.
UniqueArray< CopyBetweenDataInfo > * m_copy_data
Informations de copie si on n'utilise qu'une seule commande.
Vue d'un tableau d'éléments de type T.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
constexpr __host__ __device__ bool empty() const noexcept
Retourne true si le tableau est vide (dimension nulle)
Active toujours les traces dans les parties Arcane concernant les matériaux.
std::int16_t Int16
Type entier signé sur 16 bits.
std::int32_t Int32
Type entier signé sur 32 bits.