14#include "arcane/utils/NotImplementedException.h"
15#include "arcane/utils/ITraceMng.h"
16#include "arcane/utils/FunctorUtils.h"
17#include "arcane/utils/ArgumentException.h"
18#include "arcane/utils/PlatformUtils.h"
20#include "arcane/utils/ArraySimdPadder.h"
22#include "arcane/core/IMesh.h"
23#include "arcane/core/IItemFamily.h"
24#include "arcane/core/VariableBuildInfo.h"
25#include "arcane/core/ItemGroupObserver.h"
26#include "arcane/core/internal/ItemGroupImplInternal.h"
27#include "arcane/core/materials/internal/IMeshMaterialVariableInternal.h"
28#include "arcane/core/materials/internal/IMeshMaterialMngInternal.h"
30#include "arcane/materials/IMeshMaterialMng.h"
31#include "arcane/materials/MatItemEnumerator.h"
32#include "arcane/materials/ComponentItemVectorView.h"
33#include "arcane/materials/IMeshMaterialVariable.h"
34#include "arcane/materials/ComponentPartItemVectorView.h"
36#include "arcane/materials/internal/MeshEnvironment.h"
37#include "arcane/materials/internal/MeshMaterial.h"
38#include "arcane/materials/internal/ComponentItemListBuilder.h"
39#include "arcane/materials/internal/ComponentItemInternalData.h"
40#include "arcane/materials/internal/ConstituentConnectivityList.h"
41#include "arcane/materials/internal/ConstituentItemVectorImpl.h"
42#include "arcane/materials/internal/MeshComponentPartData.h"
44#include "arcane/accelerator/RunQueue.h"
45#include "arcane/accelerator/RunCommandLoop.h"
46#include "arcane/accelerator/Scan.h"
47#include "arcane/accelerator/SpanViews.h"
58class MeshEnvironmentObserver
75 if (m_environment->materialMng()->isInMeshMaterialExchange())
76 info() <<
"EXTEND_ENV_IN_LOADBALANCE " << m_environment->name()
77 <<
" ids=" << (*info1);
84 if (m_environment->materialMng()->isInMeshMaterialExchange())
85 info() <<
"REDUCE_ENV_IN_LOADBALANCE " << m_environment->name()
86 <<
" ids=" << (*info1);
91 info(4) <<
"COMPACT_ENV " << m_environment->name();
95 m_environment->notifyLocalIdsChanged(old_to_new_ids);
99 info() <<
"WARNING: invalidate() is invalid on an environment group! partial values may be corrupted"
100 <<
" env=" << m_environment->name();
119, m_data(this, name, env_id, mm->_internalApi()->componentItemSharedInfo(LEVEL_ENVIRONMENT), false)
120, m_non_const_this(this)
121, m_internal_api(this)
138 cells._internalApi()->setAsConstituentGroup();
142 cells.internal()->attachObserver(
this, m_group_observer);
145 m_data._setItems(
cells);
151void MeshEnvironment::
155 m_true_materials.add(mm);
161void MeshEnvironment::
164 m_data._setVariableIndexer(idx);
165 idx->setCells(m_data.items());
166 idx->setIsEnvironment(
true);
173 if (m_true_materials.size() == 1)
174 m_true_materials[0]->componentData()->_setItems(m_data.items());
175 m_data._buildPartData();
177 mat->componentData()->_buildPartData();
186 info(4) <<
"ComputeNbMatPerCell env=" <<
name();
187 Integer nb_mat = m_materials.size();
189 for (
Integer i = 0; i < nb_mat; ++i) {
192 total += mat_cells.
size();
209 info(4) <<
"Compute (V2) indexes for environment name=" <<
name();
215 _computeMaterialIndexes(item_internal_data, queue);
221void MeshEnvironment::
230 cells_index.resize(max_local_id);
232 cells_pos.resize(max_local_id);
237 cells_env.resize(max_local_id);
241 const bool do_old =
false;
244 for (
Integer z = 0, nb = local_ids.
size(); z < nb; ++z) {
245 Int32 lid = local_ids[z];
248 cells_index[lid] = cell_index;
249 cell_index += nb_mat;
254 Int32 nb_id = local_ids.
size();
256 Accelerator::GenericScanner scanner(queue);
257 auto cells_index_view =
viewOut(queue, cells_index);
259 auto getter = [=] ARCCORE_HOST_DEVICE(Int32 index) -> Int32 {
260 return constituent_item_list_view._constituenItemBase(index).
nbSubItem();
262 auto setter = [=] ARCCORE_HOST_DEVICE(
Int32 index,
Int32 value) {
263 Int32 lid = local_ids[index];
264 cells_index_view[lid] = value;
266 Accelerator::ScannerSumOperator<Int32> op;
267 scanner.applyWithIndexExclusive(nb_id, 0, getter, setter, op, A_FUNCINFO);
272 auto cells_env_view =
viewOut(command, cells_env);
273 auto cells_index_view =
viewIn(command, cells_index);
274 auto cells_pos_view =
viewOut(command, cells_pos);
279 Int32 lid = local_ids[z];
280 matimpl::ConstituentItemBase env_item = constituent_item_list_view._constituenItemBase(z);
282 Int32 cell_index = cells_index_view[lid];
283 cells_pos_view[lid] = cell_index;
285 env_item._setFirstSubItem(mat_items_internal_range[cell_index]);
287 cells_env_view[lid] = env_item.constituentItemIndex();
291 Integer nb_mat = m_true_materials.size();
292 ComponentItemInternalRange mat_item_internal_range = m_mat_internal_data_range;
293 for (
Integer i = 0; i < nb_mat; ++i) {
294 MeshMaterial* mat = m_true_materials[i];
295 Int16 mat_id = mat->componentId();
296 const MeshMaterialVariableIndexer* var_indexer = mat->variableIndexer();
298 info(4) <<
"COMPUTE (V2) mat_cells mat=" << mat->name() <<
" nb_cell=" << mat_cells.size()
299 <<
" mat_id=" << mat_id <<
" index=" << var_indexer->index() <<
" is_async=" << queue.
isAsync();
301 mat->resizeItemsInternal(var_indexer->nbItem());
304 auto matvar_indexes =
viewIn(command, var_indexer->matvarIndexes());
305 auto local_ids =
viewIn(command, var_indexer->localIds());
306 SmallSpan<Int32> cells_pos_view(cells_pos);
307 auto cells_env_view =
viewIn(command, cells_env);
308 ComponentItemSharedInfo* mat_shared_info = item_internal_data->matSharedInfo();
309 SmallSpan<ConstituentItemIndex> mat_id_list = mat->componentData()->m_constituent_local_id_list.mutableLocalIds();
311 Span<Int32> mat_cells_local_id = mat_cells._internalApi()->itemsLocalId();
315 MatVarIndex mvi = matvar_indexes[z];
316 Int32 lid = local_ids[z];
317 Int32 pos = cells_pos_view[lid];
318 ++cells_pos_view[lid];
319 ConstituentItemIndex cii = mat_item_internal_range[pos];
320 matimpl::ConstituentItemBase ref_ii(mat_shared_info, cii);
321 mat_id_list[z] = cii;
322 ref_ii._setSuperAndGlobalItem(cells_env_view[lid], ItemLocalId(lid));
323 ref_ii._setComponent(mat_id);
324 ref_ii._setVariableIndex(mvi);
327 ArraySimdPadder::applySimdPaddingView(mat_cells_local_id);
329 mat_cells._internalApi()->notifySimdPaddingDone();
350 const Int16 mat_id = mat->componentId();
353 info(4) <<
"COMPUTE (V2) mat_cells mat=" << mat->
name() <<
" nb_cell=" << mat_cells.
size()
354 <<
" mat_id=" << mat_id <<
" index=" << var_indexer->index();
356 mat->resizeItemsInternal(var_indexer->nbItem());
359 auto matvar_indexes =
viewIn(command, var_indexer->matvarIndexes());
360 auto local_ids =
viewIn(command, var_indexer->localIds());
361 ComponentItemSharedInfo* mat_shared_info = item_internal_data->matSharedInfo();
370 const Int32 lid = local_ids[z];
377 mat_id_list[z] = cii;
378 ref_ii._setSuperAndGlobalItem(env_item.constituentItemIndex(),
ItemLocalId(lid));
379 ref_ii._setComponent(mat_id);
383 ArraySimdPadder::applySimdPaddingView(mat_cells_local_id);
397 info(4) <<
"ComputeItemListForMaterials (V2)";
399 const Int16 env_id = componentId();
409 info(4) <<
"MAT_INDEXER mat=" << mat->name() <<
" NB_CELL=" << var_nb_cell <<
" name=" <<
cells.name();
411 Int32 lid = icell.itemLocalId();
414 if (nb_env_per_cell[lid] > 1 || connectivity_list.
cellNbMaterial(icell, env_id) > 1)
420 if (
traceMng()->verbosityLevel() >= 5)
421 info() <<
"MAT_NB_MULTIPLE_CELL (V2) mat=" << var_indexer->
name()
422 <<
" nb_in_global=" << list_builder.pureMatVarIndexes().size()
423 <<
" (ids=" << list_builder.pureMatVarIndexes() <<
")"
424 <<
" nb_in_multiple=" << list_builder.partialMatVarIndexes().size()
425 <<
" (ids=" << list_builder.partialLocalIds() <<
")";
433void MeshEnvironment::
448 info(4) <<
"Changing (V3) local ids references env=" <<
name();
452 <<
" n=" << variableIndexer()->matvarIndexes().size();
453 Integer nb_mat = m_true_materials.size();
454 info(4) <<
"NotifyLocalIdsChanged env=" <<
name() <<
" nb_mat=" << nb_mat
455 <<
" old_to_new_ids.size=" << old_to_new_ids.
size();
469 _changeIds(true_mat->componentData(), old_to_new_ids);
473 for (
Integer i = 0; i < nb_mat; ++i) {
475 info(4) <<
"ChangeIds MAT i=" << i <<
" MAT=" << true_mat->
name();
476 _changeIds(true_mat->componentData(), old_to_new_ids);
479 _changeIds(componentData(), old_to_new_ids);
486 for (
Integer i = 0; i < nb_mat; ++i) {
487 MeshMaterial* true_mat = m_true_materials[i];
488 true_mat->componentData()->_rebuildPartData(queue);
490 componentData()->_rebuildPartData(queue);
499void MeshEnvironment::
502 info(4) <<
"ChangeIds() (V4) for name=" << cdata->name();
503 info(4) <<
"Use new version for ChangeIds()";
505 cdata->_changeLocalIdsForInternalList(old_to_new_ids);
506 cdata->variableIndexer()->changeLocalIds(old_to_new_ids);
515 Int32 env_id = m_data.componentId();
540 return { m_non_const_this, variableIndexer()->matvarIndexes(),
541 constituentItemListView(), variableIndexer()->localIds() };
556void MeshEnvironment::
557resizeItemsInternal(
Integer nb_item)
559 m_data._resizeItemsInternal(nb_item);
568 return m_data._partData()->pureView();
577 return m_data._partData()->impureView();
586 return m_data._partData()->partView(part);
595 return { m_non_const_this, m_data._partData()->pureView() };
604 return { m_non_const_this, m_data._partData()->impureView() };
613 return { m_non_const_this, m_data._partData()->partView(part) };
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions de gestion mémoire et des allocateurs.
#define RUNCOMMAND_LOOP1(iter_name, x1,...)
Boucle 1D sur accélérateur avec arguments supplémentaires.
File d'exécution pour un accélérateur.
bool isAsync() const
Indique si la file d'exécution est asynchrone.
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.
Interface d'une famille d'entités.
virtual ItemGroup findGroup(const String &name) const =0
Recherche un groupe.
virtual Int32 maxLocalId() const =0
Interface du gestionnaire de traces.
void notifySimdPaddingDone()
Indique que le padding SIMD des entités à été effectué
SmallSpan< Int32 > itemsLocalId()
Liste des localId() des entités du groupe.
const String & name() const
Nom du groupe.
ItemVectorView view() const
Vue sur les entités du groupe.
Integer size() const
Nombre d'éléments du groupe.
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
ItemGroupImplInternal * _internalApi() const
API interne à Arcane.
Index d'un Item dans une variable.
Int32ConstArrayView localIds() const
Tableau des numéros locaux des entités.
Maille arcane avec info matériaux et milieux.
Vue sur la partie impure d'un composant.
Gestion des listes de 'ComponentItemInternal'.
Interval des identifiants des constituants dans la liste des ComponentItemInternal.
Classe d'aide à la construction d'une liste de ComponentItem pour un MeshMaterialVariableIndexer.
void addPureItem(Int32 local_id)
Ajoute l'entité de localId() local_id à la liste des entités pure.
void addPartialItem(Int32 local_id)
Ajoute l'entité de localId() local_id à la liste des entités partielles.
Vue sur un vecteur sur les entités d'un composant.
Vue sur une partie pure ou partielles des entités d'un composant.
Vue sur la partie pure d'un composant.
Gestion des listes de connectivité des constituants.
Int16 cellNbMaterial(CellLocalId cell_id, Int16 env_id)
Nombre de matériaux de la maille cell_id pour le milieu d'indice env_id.
Index d'une entité constituant dans la liste des entités constituants.
Vue sur une instance de ConstituentItemLocalIdList.
Implémentation de ComponentItemVector.
Maille arcane d'un milieu.
__host__ __device__ Int32 environmentId() const
Identifiant du milieu.
Vue sur la partie impure des entités d'un milieu.
Vue sur un vecteur sur les entités d'un milieu.
Vue sur une partie pure ou partielles des entités d'un milieu.
Vue sur la partie pure des entités d'un milieu.
virtual CellGroup cells() const =0
Groupe des mailles de ce matériau.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
Interface d'un matériau d'un maillage.
Représente un index sur les variables matériaux et milieux.
Données d'un constituant (matériau ou milieu) d'un maillage.
void _changeLocalIdsForInternalList(Int32ConstArrayView old_to_new_ids)
Met à jour les m_items_internal du constituant après changement de la numérotation locale.
ConstituentItemLocalIdList m_constituent_local_id_list
Liste des ConstituentItemIndex pour ce constituant.
bool needInfo() const override
Indique si l'observer aura besoin d'information de transition.
void executeReduce(const Int32ConstArrayView *info1) override
Execute l'action associée à l'extension.
void executeInvalidate() override
Execute l'action associée à l'invalidation.
void executeExtend(const Int32ConstArrayView *info1) override
Execute l'action associée à l'extension.
void executeCompact(const Int32ConstArrayView *info1) override
Éxecute l'action associée au compactage.
MeshMaterialVariableIndexer * variableIndexer() const override
Indexeur pour accéder aux variables partielles.
Ref< IConstituentItemVectorImpl > createItemVectorImpl() const override
Créé une instance de l'implémentation de 'ConstituentItemVectorImpl'.
Int32 variableIndexerIndex() const override
Index pour accéder aux variables partielles.
void _computeMaterialIndexesMonoMat(ComponentItemInternalData *item_internal_data, RunQueue &queue)
Calcul les infos sur les matériaux en mono-matériaux.
IMeshMaterialMng * m_material_mng
Gestionnaire de matériaux.
void checkValid() override
Vérifie que le composant est valide.
void build()
Fonctions publiques mais réservées au IMeshMaterialMng.
ComponentItemVectorView view() const override
Vue associée à ce composant.
ComponentPartItemVectorView partItems(eMatPart part) const override
Vue sur la partie pure ou impure des entités du composant.
ComponentImpurePartItemVectorView impureItems() const override
Vue sur la liste des entités impures (partielles) partielles du composant.
EnvImpurePartItemVectorView impureEnvItems() const override
Vue sur la liste des entités impures (partielles) partielles du milieu.
EnvPartItemVectorView partEnvItems(eMatPart part) const override
Vue sur la partie pure ou impure des entités du milieu.
void computeItemListForMaterials(const ConstituentConnectivityList &connectivity_list)
Calcul pour les mailles des matériaux du milieu leur emplacement dans le tableau d'indexation des var...
void computeMaterialIndexes(ComponentItemInternalData *item_internal_data, RunQueue &queue)
Calcul les infos sur les matériaux.
ComponentCell findComponentCell(AllEnvCell c) const override
Maille de ce composant pour la maille c.
Integer totalNbCellMat() const
Nombre total de mailles pour tous les matériaux.
EnvCell findEnvCell(AllEnvCell c) const override
Maille de ce milieu pour la maille c.
CellGroup cells() const override
Groupe des mailles de ce matériau.
void computeNbMatPerCell()
Recalcule le nombre de mailles par matériau et de mailles totales.
ComponentPurePartItemVectorView pureItems() const override
Vue sur la liste des entités pures (associées à la maille globale) du composant.
Integer nbMaterial() const override
Nombre de matériaux dans le milieu.
EnvPurePartItemVectorView pureEnvItems() const override
Vue sur la liste des entités pures (associées à la maille globale) du milieu.
EnvItemVectorView envView() const override
Vue associée à ce milieu.
Integer m_total_nb_cell_mat
Nombre total de mailles pour tous les matériaux.
ITraceMng * traceMng() override
Gestionnaire de trace associé.
bool isMonoMaterial() const
Indique si le milieu est mono-matériau.
String name() const override
Nom du composant.
Indexer pour les variables materiaux.
void endUpdate(const ComponentItemListBuilderOld &builder)
Fonctions privées mais accessibles aux classes 'friend'.
const String & name() const
Nom de l'indexeur.
String name() const override
Nom du composant.
CellGroup cells() const override
Groupe des mailles de ce matériau.
Informations génériques sur une entité d'un constituant.
__host__ __device__ void _setVariableIndex(MatVarIndex index)
Positionne l'indexeur dans les variables matériaux.
__host__ __device__ Int32 nbSubItem() const
Nombre de sous-composants.
__host__ __device__ void _setFirstSubItem(ConstituentItemIndex first_sub_item)
Positionne le premier sous-composant.
Référence à une instance.
Vue d'un tableau d'éléments de type T.
Vue d'un tableau d'éléments de type T.
Chaîne de caractères unicode.
Classe d'accès aux traces.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
ItemGroupT< Cell > CellGroup
Groupe de mailles.
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
auto viewOut(const ViewBuildInfo &vbi, CellMaterialVariableScalarRef< DataType > &var)
Vue en écriture pour les variables materiaux scalaire.
auto viewIn(const ViewBuildInfo &vbi, const CellMaterialVariableScalarRef< DataType > &var)
Vue en lecture pour les variables materiaux scalaire.
Active toujours les traces dans les parties Arcane concernant les matériaux.
eMatPart
Partie d'un composant.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
std::int16_t Int16
Type entier signé sur 16 bits.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.