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"
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"
38#include "arcane/materials/internal/AllCellToAllEnvCellContainer.h"
40#include "arcane/accelerator/Scan.h"
58 : env_cell_indexes(
q.allocationOptions())
59 , cells_nb_material(
q.allocationOptions())
78, m_item_internal_data(
mmg)
83 m_component_connectivity_list_ref = m_component_connectivity_list->toSourceReference();
99 m_component_connectivity_list->endCreate(
is_continue);
106_isFullVerbose()
const
115_computeNbEnvAndNbMatPerCell()
122 env->computeNbMatPerCell();
130_computeAndResizeEnvItemsInternal()
134 IMesh* mesh = m_material_mng->
mesh();
135 const IItemFamily* cell_family = mesh->
cellFamily();
136 ConstArrayView<MeshEnvironment*> true_environments(m_material_mng->trueEnvironments());
138 Integer nb_env = true_environments.size();
141 info(4) <<
"NB_ENV = " << nb_env;
142 for (
const MeshEnvironment* env : true_environments) {
144 Integer env_nb_cell = cells.size();
145 info(4) <<
"EnvName=" << cells.name() <<
" nb_env_cell=" << env_nb_cell <<
" nb_mat_cell=" << env->totalNbCellMat();
146 total_env_cell += env_nb_cell;
147 total_mat_cell += env->totalNbCellMat();
151 Int32 max_local_id = cell_family->maxLocalId();
152 info(4) <<
"RESIZE TotalEnvCell=" << total_env_cell
153 <<
" TotalMatCell=" << total_mat_cell
154 <<
" MaxLocalId=" << max_local_id;
162 Int32 computed_nb_mat = 0;
163 Int32 computed_nb_env = 0;
164 ConstArrayView<Int16> cells_nb_env = m_component_connectivity_list->cellsNbEnvironment();
165 ConstArrayView<Int16> cells_nb_mat = m_component_connectivity_list->cellsNbMaterial();
166 ENUMERATE_ (Cell, icell, cell_family->allItems()) {
167 Int32 lid = icell.itemLocalId();
168 computed_nb_env += cells_nb_env[lid];
169 computed_nb_mat += cells_nb_mat[lid];
171 Int32 computed_size = computed_nb_mat + computed_nb_env;
172 Int32 storage_size = total_mat_cell + total_env_cell;
173 info(4) <<
"storage_size=" << storage_size <<
" computed=" << computed_size
174 <<
" max_local_id=" << max_local_id <<
" internal_nb_mat=" << total_mat_cell <<
" internal_nb_env=" << total_env_cell
175 <<
" computed_nb_mat=" << computed_nb_mat <<
" computed_nb_env=" << computed_nb_env;
176 if (storage_size != computed_size)
177 ARCANE_FATAL(
"BAD STORAGE SIZE internal={0} connectivity={1}", storage_size, computed_size);
191 auto clist = m_component_connectivity_list;
192 clist->removeAllConnectivities();
194 clist->addCellsToEnvironment(
env->componentId(),
env->cells().view().localIds(), queue);
196 clist->addCellsToMaterial(
mat->componentId(),
mat->cells().view().localIds(), queue);
204_rebuildMaterialsAndEnvironmentsFromGroups()
221 list_builder.addPartialItem(
icell.itemLocalId());
224 list_builder.addPureItem(
icell.itemLocalId());
228 <<
" nb_in_global=" << list_builder.pureMatVarIndexes().size()
229 <<
" (ids=" << list_builder.pureMatVarIndexes() <<
")"
230 <<
" nb_in_multiple=" << list_builder.partialMatVarIndexes().size()
231 <<
" (ids=" << list_builder.partialLocalIds() <<
")";
235 for (MeshEnvironment* env : true_environments)
236 env->computeItemListForMaterials(*m_component_connectivity_list);
243_computeInfosForAllEnvCells1(RecomputeConstituentCellInfos& work_info)
245 IMesh* mesh = m_material_mng->
mesh();
246 IItemFamily* cell_family = mesh->
cellFamily();
247 CellGroup all_cells = cell_family->allItems();
248 const Int32 nb_cell = all_cells.size();
249 const Int32 max_local_id = cell_family->maxLocalId();
251 SmallSpan<const Int16> cells_nb_env = m_component_connectivity_list->cellsNbEnvironment();
259 bool do_old = (max_local_id != nb_cell);
263 Int32 lid = icell.itemLocalId();
264 Int32 nb_env = cells_nb_env[lid];
265 work_info.env_cell_indexes[lid] = env_cell_index;
266 env_cell_index += nb_env;
272 Accelerator::GenericScanner scanner(work_info.m_queue);
273 SmallSpan<Int32> env_cell_indexes_view(work_info.env_cell_indexes);
274 Accelerator::ScannerSumOperator<Int32> op;
275 scanner.applyExclusive(0, cells_nb_env, env_cell_indexes_view, op, A_FUNCINFO);
283_computeInfosForAllEnvCells2(RecomputeConstituentCellInfos& work_info)
287 SmallSpan<const Int16> cells_nb_env = m_component_connectivity_list->cellsNbEnvironment();
290 ComponentItemSharedInfo* all_env_shared_info = m_item_internal_data.allEnvSharedInfo();
292 SmallSpan<Int32> env_cell_indexes_view(work_info.env_cell_indexes);
296 Int16 n = cells_nb_env[lid];
297 matimpl::ConstituentItemBase ref_ii(all_env_shared_info, ConstituentItemIndex(lid));
298 ref_ii._setSuperAndGlobalItem({}, cell_id);
299 ref_ii._setVariableIndex(MatVarIndex(0, lid));
300 ref_ii._setNbSubItem(n);
302 ref_ii._setFirstSubItem(ConstituentItemIndex(env_cell_indexes_view[lid]));
315 RunQueue queue(m_material_mng->runQueue());
328 info(4) <<
"COMPUTE (V2) env_cells env=" <<
env->name() <<
" nb_cell=" << cells.
size()
330 <<
" max_multiple_index=" <<
var_indexer->maxIndexInMultipleArray();
405 ARCANE_FATAL(
"Incoherent localId() matvar_lid={0} direct_lid={1} index={2}",
433 m_material_mng->incrementTimestamp();
439 <<
" mesh_timestamp=" <<
mesh_timestamp <<
" current_mesh_timestamp=" << m_current_mesh_timestamp;
457 _computeNbEnvAndNbMatPerCell();
459 _computeAndResizeEnvItemsInternal();
464 _rebuildMaterialsAndEnvironmentsFromGroups();
474 info(5) <<
"FINAL_INDEXER (V2) name=" << cells.
name() <<
" cells=" <<
my_array;
475 info(4) <<
"FINAL_MAT_NB_MULTIPLE_CELL (V2) mat=" <<
var_indexer->name()
480 RunQueue& queue(m_material_mng->runQueue());
490 _printAllEnvCells(m_material_mng->
mesh()->
allCells().view());
494 info() <<
"CELL IN MAT vindex=" <<
pmc._varIndex();
501 env->componentData()->_rebuildPartData(queue);
503 mat->componentData()->_rebuildPartData(queue);
514 m_material_mng->dumpInfos2(
ostr());
524 if (m_material_mng->isCellToAllEnvCellForRunCommand()) {
537recomputeIncremental()
541 _checkConnectivityCoherency();
564 info() <<
"CELL4 mat_item=" <<
mc._varIndex() <<
" mat_id=" <<
mc.materialId();
574_checkConnectivityCoherency()
576 info() <<
"AllEnvData: checkCoherency()";
577 ConstArrayView<Int16> nb_mat_v2 = m_component_connectivity_list->cellsNbMaterial();
578 ConstArrayView<MeshEnvironment*> true_environments(m_material_mng->trueEnvironments());
580 ItemGroup all_cells = m_material_mng->
mesh()->
allCells();
586 Int32 ref_nb_mat = 0;
587 for (MeshEnvironment* env : true_environments) {
588 Int16 env_id = env->componentId();
589 ref_nb_mat += m_component_connectivity_list->
cellNbMaterial(icell, env_id);
591 Int32 current_nb_mat = nb_mat_v2[icell.itemLocalId()];
592 if (ref_nb_mat != current_nb_mat) {
595 error() <<
"Invalid values for nb_material cell=" << icell->uniqueId()
596 <<
" ref=" << ref_nb_mat <<
" current=" << current_nb_mat;
601 ARCANE_FATAL(
"Invalid values for component connectivity nb_error={0}", nb_error);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions de gestion mémoire et des allocateurs.
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.
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.
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.
Informations partagées sur les 'ComponentItem'.
Représente un composant d'une maille multi-matériau.
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 AllCellToAllEnvCellContainer * getAllCellToAllEnvCellContainer() 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ériques 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.
Int32 checkResizeArrayWithCapacity(Array< DataType > &array, Int64 new_size, bool force_resize)
Redimensionne un tableau en ajoutant une réserve de mémoire.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Int32 Integer
Type représentant un entier.