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"
46#include "arcane/accelerator/Scan.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();
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();
347 const Int16 mat_id = mat->componentId();
350 info(4) <<
"COMPUTE (V2) mat_cells mat=" << mat->
name() <<
" nb_cell=" << mat_cells.
size()
351 <<
" mat_id=" << mat_id <<
" index=" << var_indexer->index();
353 mat->resizeItemsInternal(var_indexer->nbItem());
356 auto matvar_indexes =
viewIn(command, var_indexer->matvarIndexes());
357 auto local_ids =
viewIn(command, var_indexer->localIds());
358 ComponentItemSharedInfo* mat_shared_info = item_internal_data->matSharedInfo();
367 const Int32 lid = local_ids[z];
374 mat_id_list[z] = cii;
375 ref_ii._setSuperAndGlobalItem(env_item.constituentItemIndex(),
ItemLocalId(lid));
376 ref_ii._setComponent(mat_id);
380 ArraySimdPadder::applySimdPaddingView(mat_cells_local_id);
394 info(4) <<
"ComputeItemListForMaterials (V2)";
396 const Int16 env_id = componentId();
406 info(4) <<
"MAT_INDEXER mat=" << mat->name() <<
" NB_CELL=" << var_nb_cell <<
" name=" <<
cells.name();
408 Int32 lid = icell.itemLocalId();
411 if (nb_env_per_cell[lid] > 1 || connectivity_list.
cellNbMaterial(icell, env_id) > 1)
417 if (
traceMng()->verbosityLevel() >= 5)
418 info() <<
"MAT_NB_MULTIPLE_CELL (V2) mat=" << var_indexer->
name()
419 <<
" nb_in_global=" << list_builder.pureMatVarIndexes().size()
420 <<
" (ids=" << list_builder.pureMatVarIndexes() <<
")"
421 <<
" nb_in_multiple=" << list_builder.partialMatVarIndexes().size()
422 <<
" (ids=" << list_builder.partialLocalIds() <<
")";
430void MeshEnvironment::
445 info(4) <<
"Changing (V3) local ids references env=" <<
name();
449 <<
" n=" << variableIndexer()->matvarIndexes().size();
450 Integer nb_mat = m_true_materials.size();
451 info(4) <<
"NotifyLocalIdsChanged env=" <<
name() <<
" nb_mat=" << nb_mat
452 <<
" old_to_new_ids.size=" << old_to_new_ids.
size();
466 _changeIds(true_mat->componentData(), old_to_new_ids);
470 for (
Integer i = 0; i < nb_mat; ++i) {
472 info(4) <<
"ChangeIds MAT i=" << i <<
" MAT=" << true_mat->
name();
473 _changeIds(true_mat->componentData(), old_to_new_ids);
476 _changeIds(componentData(), old_to_new_ids);
483 for (
Integer i = 0; i < nb_mat; ++i) {
484 MeshMaterial* true_mat = m_true_materials[i];
485 true_mat->componentData()->_rebuildPartData(queue);
487 componentData()->_rebuildPartData(queue);
496void MeshEnvironment::
499 info(4) <<
"ChangeIds() (V4) for name=" << cdata->name();
500 info(4) <<
"Use new version for ChangeIds()";
502 cdata->_changeLocalIdsForInternalList(old_to_new_ids);
503 cdata->variableIndexer()->changeLocalIds(old_to_new_ids);
512 Int32 env_id = m_data.componentId();
537 return { m_non_const_this, variableIndexer()->matvarIndexes(),
538 constituentItemListView(), variableIndexer()->localIds() };
553void MeshEnvironment::
554resizeItemsInternal(
Integer nb_item)
556 m_data._resizeItemsInternal(nb_item);
565 return m_data._partData()->pureView();
574 return m_data._partData()->impureView();
583 return m_data._partData()->partView(part);
592 return { m_non_const_this, m_data._partData()->pureView() };
601 return { m_non_const_this, m_data._partData()->impureView() };
610 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.
Types et macros pour gérer les boucles sur les accélérateurs.
#define RUNCOMMAND_LOOP1(iter_name, x1,...)
Boucle sur accélérateur avec arguments supplémentaires pour les réductions.
File d'exécution pour un accélérateur.
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
Execute 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.