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/OStringStream.h"
19#include "arcane/utils/MemoryUtils.h"
20#include "arcane/utils/ValueConvert.h"
21#include "arcane/utils/ArraySimdPadder.h"
23#include "arcane/core/IMesh.h"
24#include "arcane/core/IItemFamily.h"
25#include "arcane/core/ItemPrinter.h"
26#include "arcane/core/VariableBuildInfo.h"
27#include "arcane/core/internal/ItemGroupImplInternal.h"
28#include "arcane/core/materials/internal/IMeshMaterialVariableInternal.h"
30#include "arcane/materials/IMeshMaterialVariable.h"
31#include "arcane/materials/CellToAllEnvCellConverter.h"
33#include "arcane/materials/internal/MeshMaterialMng.h"
34#include "arcane/materials/internal/AllEnvData.h"
35#include "arcane/materials/internal/MaterialModifierOperation.h"
36#include "arcane/materials/internal/ConstituentConnectivityList.h"
37#include "arcane/materials/internal/ComponentItemListBuilder.h"
39#include "arcane/accelerator/Scan.h"
57 : env_cell_indexes(
q.allocationOptions())
58 , cells_nb_material(
q.allocationOptions())
77, m_item_internal_data(
mmg)
82 m_component_connectivity_list_ref = m_component_connectivity_list->toSourceReference();
98 m_component_connectivity_list->endCreate(
is_continue);
105_isFullVerbose()
const
114_computeNbEnvAndNbMatPerCell()
121 env->computeNbMatPerCell();
129_computeAndResizeEnvItemsInternal()
133 IMesh* mesh = m_material_mng->
mesh();
134 const IItemFamily* cell_family = mesh->
cellFamily();
135 ConstArrayView<MeshEnvironment*> true_environments(m_material_mng->trueEnvironments());
137 Integer nb_env = true_environments.size();
140 info(4) <<
"NB_ENV = " << nb_env;
141 for (
const MeshEnvironment* env : true_environments) {
143 Integer env_nb_cell = cells.size();
144 info(4) <<
"EnvName=" << cells.name() <<
" nb_env_cell=" << env_nb_cell <<
" nb_mat_cell=" << env->totalNbCellMat();
145 total_env_cell += env_nb_cell;
146 total_mat_cell += env->totalNbCellMat();
150 Int32 max_local_id = cell_family->maxLocalId();
151 info(4) <<
"RESIZE TotalEnvCell=" << total_env_cell
152 <<
" TotalMatCell=" << total_mat_cell
153 <<
" MaxLocalId=" << max_local_id;
161 Int32 computed_nb_mat = 0;
162 Int32 computed_nb_env = 0;
163 ConstArrayView<Int16> cells_nb_env = m_component_connectivity_list->cellsNbEnvironment();
164 ConstArrayView<Int16> cells_nb_mat = m_component_connectivity_list->cellsNbMaterial();
165 ENUMERATE_ (Cell, icell, cell_family->allItems()) {
166 Int32 lid = icell.itemLocalId();
167 computed_nb_env += cells_nb_env[lid];
168 computed_nb_mat += cells_nb_mat[lid];
170 Int32 computed_size = computed_nb_mat + computed_nb_env;
171 Int32 storage_size = total_mat_cell + total_env_cell;
172 info(4) <<
"storage_size=" << storage_size <<
" computed=" << computed_size
173 <<
" max_local_id=" << max_local_id <<
" internal_nb_mat=" << total_mat_cell <<
" internal_nb_env=" << total_env_cell
174 <<
" computed_nb_mat=" << computed_nb_mat <<
" computed_nb_env=" << computed_nb_env;
175 if (storage_size != computed_size)
176 ARCANE_FATAL(
"BAD STORAGE SIZE internal={0} connectivity={1}", storage_size, computed_size);
190 auto clist = m_component_connectivity_list;
191 clist->removeAllConnectivities();
193 clist->addCellsToEnvironment(
env->componentId(),
env->cells().view().localIds(), queue);
195 clist->addCellsToMaterial(
mat->componentId(),
mat->cells().view().localIds(), queue);
203_rebuildMaterialsAndEnvironmentsFromGroups()
220 list_builder.addPartialItem(
icell.itemLocalId());
223 list_builder.addPureItem(
icell.itemLocalId());
227 <<
" nb_in_global=" << list_builder.pureMatVarIndexes().size()
228 <<
" (ids=" << list_builder.pureMatVarIndexes() <<
")"
229 <<
" nb_in_multiple=" << list_builder.partialMatVarIndexes().size()
230 <<
" (ids=" << list_builder.partialLocalIds() <<
")";
234 for (MeshEnvironment* env : true_environments)
235 env->computeItemListForMaterials(*m_component_connectivity_list);
242_computeInfosForAllEnvCells1(RecomputeConstituentCellInfos& work_info)
244 IMesh* mesh = m_material_mng->
mesh();
245 IItemFamily* cell_family = mesh->
cellFamily();
246 CellGroup all_cells = cell_family->allItems();
247 const Int32 nb_cell = all_cells.size();
248 const Int32 max_local_id = cell_family->maxLocalId();
250 SmallSpan<const Int16> cells_nb_env = m_component_connectivity_list->cellsNbEnvironment();
256 work_info.env_cell_indexes.resize(cells_nb_env.size());
258 bool do_old = (max_local_id != nb_cell);
262 Int32 lid = icell.itemLocalId();
263 Int32 nb_env = cells_nb_env[lid];
264 work_info.env_cell_indexes[lid] = env_cell_index;
265 env_cell_index += nb_env;
271 Accelerator::GenericScanner scanner(work_info.m_queue);
272 SmallSpan<Int32> env_cell_indexes_view(work_info.env_cell_indexes);
273 Accelerator::ScannerSumOperator<Int32> op;
274 scanner.applyExclusive(0, cells_nb_env, env_cell_indexes_view, op, A_FUNCINFO);
282_computeInfosForAllEnvCells2(RecomputeConstituentCellInfos& work_info)
286 SmallSpan<const Int16> cells_nb_env = m_component_connectivity_list->cellsNbEnvironment();
289 ComponentItemSharedInfo* all_env_shared_info = m_item_internal_data.allEnvSharedInfo();
291 SmallSpan<Int32> env_cell_indexes_view(work_info.env_cell_indexes);
295 Int16 n = cells_nb_env[lid];
296 matimpl::ConstituentItemBase ref_ii(all_env_shared_info, ConstituentItemIndex(lid));
297 ref_ii._setSuperAndGlobalItem({}, cell_id);
298 ref_ii._setVariableIndex(MatVarIndex(0, lid));
299 ref_ii._setNbSubItem(n);
301 ref_ii._setFirstSubItem(ConstituentItemIndex(env_cell_indexes_view[lid]));
314 RunQueue queue(m_material_mng->runQueue());
327 info(4) <<
"COMPUTE (V2) env_cells env=" <<
env->name() <<
" nb_cell=" << cells.
size()
329 <<
" max_multiple_index=" <<
var_indexer->maxIndexInMultipleArray();
404 ARCANE_FATAL(
"Incoherent localId() matvar_lid={0} direct_lid={1} index={2}",
432 m_material_mng->incrementTimestamp();
438 <<
" mesh_timestamp=" <<
mesh_timestamp <<
" current_mesh_timestamp=" << m_current_mesh_timestamp;
456 _computeNbEnvAndNbMatPerCell();
458 _computeAndResizeEnvItemsInternal();
463 _rebuildMaterialsAndEnvironmentsFromGroups();
473 info(5) <<
"FINAL_INDEXER (V2) name=" << cells.
name() <<
" cells=" <<
my_array;
474 info(4) <<
"FINAL_MAT_NB_MULTIPLE_CELL (V2) mat=" <<
var_indexer->name()
479 RunQueue& queue(m_material_mng->runQueue());
489 _printAllEnvCells(m_material_mng->
mesh()->
allCells().view());
493 info() <<
"CELL IN MAT vindex=" <<
pmc._varIndex();
500 env->componentData()->_rebuildPartData(queue);
502 mat->componentData()->_rebuildPartData(queue);
513 m_material_mng->dumpInfos2(
ostr());
523 if (m_material_mng->isCellToAllEnvCellForRunCommand()) {
536recomputeIncremental()
540 _checkConnectivityCoherency();
563 info() <<
"CELL4 mat_item=" <<
mc._varIndex() <<
" mat_id=" <<
mc.materialId();
573_checkConnectivityCoherency()
575 info() <<
"AllEnvData: checkCoherency()";
576 ConstArrayView<Int16> nb_mat_v2 = m_component_connectivity_list->cellsNbMaterial();
577 ConstArrayView<MeshEnvironment*> true_environments(m_material_mng->trueEnvironments());
579 ItemGroup all_cells = m_material_mng->
mesh()->
allCells();
585 Int32 ref_nb_mat = 0;
586 for (MeshEnvironment* env : true_environments) {
587 Int16 env_id = env->componentId();
588 ref_nb_mat += m_component_connectivity_list->
cellNbMaterial(icell, env_id);
590 Int32 current_nb_mat = nb_mat_v2[icell.itemLocalId()];
591 if (ref_nb_mat != current_nb_mat) {
594 error() <<
"Invalid values for nb_material cell=" << icell->uniqueId()
595 <<
" ref=" << ref_nb_mat <<
" current=" << current_nb_mat;
600 ARCANE_FATAL(
"Invalid values for component connectivity nb_error={0}", nb_error);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Types et macros pour gérer les énumérations des entités sur les accélérateurs.
#define RUNCOMMAND_ENUMERATE(ItemTypeName, iter_name, item_group,...)
Macro pour itérer sur accélérateur sur un groupe d'entités.
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.
Interface d'une famille d'entités.
virtual CellGroup allCells()=0
Groupe de toutes les mailles.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
virtual Int64 timestamp()=0
Compteur indiquant le temps de dernière modification du maillage.
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.
ItemGroupImplInternal * _internalApi() const
API interne à Arcane.
Index d'un Item dans une variable.
Classe utilitaire pour imprimer les infos sur une entité.
Vue sur un tableau typé d'entités.
Int32ConstArrayView localIds() const
Tableau des numéros locaux des entités.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Maille arcane avec info matériaux et milieux.
void _checkLocalIdsCoherency() const
Vérifie la cohérence des localIds() du variableIndexer(). avec la maille globale associée au milieu.
Int32 m_verbose_debug_level
Niveau de verbosité
void _rebuildIncrementalConnectivitiesFromGroups()
Reconstruit les connectivités incrémentales à parties des groupes.
void endCreate(bool is_continue)
Notification de la fin de création des milieux/matériaux.
void forceRecompute(bool compute_all)
Remise à jour des structures suite à une modification des mailles de matériaux ou de milieux.
void _computeInfosForEnvCells(RecomputeConstituentCellInfos &work_info)
Positionne les infos pour les EnvCell.
Représente un composant d'une maille multi-matériau.
void endCreate()
Notification de la fin de création des milieux/matériaux.
void resizeComponentItemInternals(Int32 max_local_id, Int32 total_env_cell)
Redimensionne les structures allouant les 'ComponentItemInternal'.
Classe d'aide à la construction d'une liste de ComponentItem pour un MeshMaterialVariableIndexer.
Informations partagées sur les 'ComponentItem'.
Gestion des listes de connectivité des constituants.
void fillCellsNbMaterial(SmallSpan< const Int32 > cells_local_id, Int16 env_id, SmallSpan< Int16 > cells_nb_material, RunQueue &queue)
Remplit cells_nb_material avec le nombre de matériaux du milieu env_id.
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.
Maille arcane d'un milieu.
virtual ConstArrayView< MeshMaterialVariableIndexer * > variablesIndexer()=0
Liste des infos pour indexer les variables matériaux.
virtual void createAllCellToAllEnvCell()=0
Construit la table de "connectivité" CellLocalId -> AllEnvCell destinée à être utilisée dans un RUNCO...
virtual AllCellToAllEnvCell * getAllCellToAllEnvCell() const =0
Renvoie la table de "connectivité" CellLocalId -> AllEnvCell destinée à être utilisée dans un RUNCOMM...
virtual Accelerator::RunQueuePool & asyncRunQueuePool() const =0
Liste de files asynchrones.
Interface d'un matériau d'un maillage.
Représente un matériau d'une maille multi-matériau.
Représente un index sur les variables matériaux et milieux.
Implémentation d'un gestion des matériaux.
AllEnvCellVectorView view(const CellGroup &cells) final
Vue sur les mailles milieux correspondant au groupe cells.
IMesh * mesh() override
Maillage associé.
ConstArrayView< IMeshMaterial * > materials() const override
Liste des matériaux.
IMeshMaterialMngInternal * _internalApi() const override
API interne à Arcane.
void checkValid() override
Vérifie la validité des structures internes.
void syncVariablesReferences(bool check_resize)
Met à jour les références des variables.
Indexer pour les variables materiaux.
Informations générique sur une entité d'un constituant.
Flot de sortie lié à une String.
Vue constante d'un tableau de type T.
Classe d'accès aux traces.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage error() const
Flot pour un message d'erreur.
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.
RunQueue makeQueue(const Runner &runner)
Créé une file associée à runner.
Active toujours les traces dans les parties Arcane concernant les matériaux.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Int32 Integer
Type représentant un entier.