14#include "arcane/materials/internal/ConstituentConnectivityList.h"
16#include "arcane/core/IItemFamily.h"
18#include "arcane/utils/ITraceMng.h"
20#include "arcane/core/internal/IDataInternal.h"
21#include "arcane/core/internal/IItemFamilyInternal.h"
23#include "arcane/materials/internal/MeshMaterialMng.h"
25#include "arcane/accelerator/core/RunQueue.h"
27#include "arcane/accelerator/Scan.h"
45 template <
typename DataType>
46 ARCCORE_HOST_DEVICE
void _removeValueAndKeepOrder(ArrayView<DataType> values, DataType value_to_remove)
49#ifndef ARCCORE_DEVICE_CODE
51 ARCANE_FATAL(
"Can not remove item lid={0} because list is empty", value_to_remove);
55 if (values[0] == value_to_remove)
60 if (values[n] == value_to_remove)
62 for (Integer i = 0; i < n; ++i) {
63 if (values[i] == value_to_remove) {
64 for (Integer z = i; z < n; ++z)
65 values[z] = values[z + 1];
70#if defined(ARCCORE_DEVICE_CODE)
73# if !defined(__INTEL_LLVM_COMPILER)
77 ARCANE_FATAL(
"No value to remove '{0}' found in list {1}", value_to_remove, values);
100 : nb_components_view(
c.m_nb_component_as_array.view())
101 , component_indexes_view(
c.m_component_index_as_array.view())
102 , component_list_view(
c.m_component_list_as_array.view())
110 Int16 n = nb_components_view[
item_lid];
111 Int32 index = component_indexes_view[
item_lid];
112 return component_list_view.
subPart(index, n);
128 , m_nb_component_as_array(
m_nb_component._internalTrueData()->_internalDeprecatedValue())
129 , m_component_index_as_array(
m_component_index._internalTrueData()->_internalDeprecatedValue())
130 , m_component_list_as_array(
m_component_list._internalTrueData()->_internalDeprecatedValue())
139 _resetConnectivities();
149 return m_component_list_as_array.subView(index, n);
152 void checkResize(Int64 size)
154 if (MeshUtils::checkResizeArray(m_nb_component_as_array, size,
false))
156 if (MeshUtils::checkResizeArray(m_component_index_as_array, size,
false))
160 void reserve(
Int64 capacity)
162 m_nb_component_as_array.reserve(capacity);
163 m_component_index_as_array.reserve(capacity);
172 void notifyUpdateConnectivityList()
177 void removeAllConnectivities()
179 _resetConnectivities();
199 void _resetConnectivities()
261 void checkResize(Int32
lid)
274 void reserve(Int64 capacity)
276 m_environment.reserve(capacity);
277 m_material.reserve(capacity);
289ConstituentConnectivityList::
297 m_is_force_transform_all_constituants = (v.value() != 0);
298 info() <<
"Force transformation in 'ConstituentConnectivityList' v=" << m_is_force_transform_all_constituants;
305ConstituentConnectivityList::
306~ConstituentConnectivityList()
314void ConstituentConnectivityList::
315endCreate(
bool is_continue)
318 const bool always_build_connectivity =
true;
328 if (use_incremental || always_build_connectivity) {
329 m_cell_family->
_internalApi()->addSourceConnectivity(
this);
331 info() <<
"Activating incremental material connectivities";
336 m_container->checkResize(max_local_id + 1);
337 m_container->m_environment.endCreate(is_continue);
338 m_container->m_material.endCreate(is_continue);
344 ConstArrayView<MeshMaterial*> materials = m_material_mng->trueMaterials();
345 const Int32 nb_mat = materials.size();
347 environment_for_materials.
resize(nb_mat);
348 auto local_view = environment_for_materials.view();
349 for (
Int32 i = 0; i < nb_mat; ++i)
350 local_view[i] = materials[i]->trueEnvironment()->componentId();
357void ConstituentConnectivityList::
358_addCells(
Int16 component_id, SmallSpan<const Int32> cells_local_id,
359 ConstituentContainer& component, RunQueue& queue)
361 const Int32 nb_item = cells_local_id.size();
364 Array<Int16>& nb_component = component.m_nb_component_as_array;
365 Array<Int32>& component_index = component.m_component_index_as_array;
366 Array<Int16>& component_list = component.m_component_list_as_array;
368 SmallSpan<Int16> nb_component_view = component.m_nb_component_as_array.view();
371 NumArray<Int32, MDDim1> new_indexes(nb_item, queue.memoryRessource());
377 Accelerator::GenericScanner scanner(queue);
378 SmallSpan<Int32> new_indexes_view = new_indexes;
379 SmallSpan<Int32> new_indexes_to_add_view = new_indexes_to_add;
380 auto getter = [=] ARCCORE_HOST_DEVICE(
Int32 index) ->
Int32 {
381 return 1 + nb_component_view[cells_local_id[index]];
383 auto setter = [=] ARCCORE_HOST_DEVICE(
Int32 index,
Int32 value) {
384 new_indexes_view[index] = value;
385 if (index == (nb_item - 1))
386 new_indexes_to_add_view[0] = new_indexes_view[index] + nb_component_view[cells_local_id[index]] + 1;
388 Accelerator::ScannerSumOperator<Int32> op;
389 scanner.applyWithIndexExclusive(nb_item, 0, getter, setter, op, A_FUNCINFO);
393 const Int32 nb_indexes_to_add = new_indexes_to_add[0];
394 const Int32 current_list_index = component_list.size();
396 MemoryUtils::checkResizeArrayWithCapacity(component_list, current_list_index + nb_indexes_to_add,
false);
400 SmallSpan<Int16> nb_component_view = nb_component.view();
401 SmallSpan<Int32> component_index_view = component_index.view();
402 SmallSpan<Int16> component_list_view = component_list.view();
403 SmallSpan<const Int32> new_indexes_view = new_indexes;
407 Int32 cell_id = cells_local_id[i];
408 const Int16 n = nb_component_view[cell_id];
409 Int32 new_pos = current_list_index + new_indexes_view[i];
414 Int32 current_pos = component_index_view[cell_id];
415 SmallSpan<const Int16> current_values(&component_list_view[current_pos], n);
416 SmallSpan<Int16> new_values(&component_list_view[new_pos], n);
417 new_values.copy(current_values);
419 component_index_view[cell_id] = new_pos;
420 component_list_view[new_pos + n] = component_id;
421 ++nb_component_view[cell_id];
425 component.notifyUpdateConnectivityList();
431void ConstituentConnectivityList::
432_removeCells(
Int16 component_id, SmallSpan<const Int32> cells_local_id,
433 ConstituentContainer& component, RunQueue& queue)
435 SmallSpan<Int16> nb_component = component.m_nb_component_as_array.view();
436 SmallSpan<Int32> component_index = component.m_component_index_as_array.view();
437 SmallSpan<Int16> component_list = component.m_component_list_as_array.view();
439 const Int32 n = cells_local_id.size();
444 Int32 id = cells_local_id[i];
446 CellLocalId cell_id(
id);
447 const Int32 current_pos = component_index[cell_id];
448 const Int32 n = nb_component[cell_id];
449 ArrayView<Int16> current_values(n, &component_list[current_pos]);
451 _removeValueAndKeepOrder(current_values, component_id);
453 current_values[n - 1] = (-1);
454 --nb_component[cell_id];
461void ConstituentConnectivityList::
462addCellsToEnvironment(
Int16 env_id, SmallSpan<const Int32> cell_ids, RunQueue& queue)
464 _addCells(env_id, cell_ids, m_container->m_environment, queue);
470void ConstituentConnectivityList::
471removeCellsToEnvironment(
Int16 env_id, SmallSpan<const Int32> cell_ids, RunQueue& queue)
473 _removeCells(env_id, cell_ids, m_container->m_environment, queue);
479void ConstituentConnectivityList::
480addCellsToMaterial(
Int16 mat_id, SmallSpan<const Int32> cell_ids, RunQueue& queue)
482 _addCells(mat_id, cell_ids, m_container->m_material, queue);
488void ConstituentConnectivityList::
489removeCellsToMaterial(
Int16 mat_id, SmallSpan<const Int32> cell_ids, RunQueue& queue)
491 _removeCells(mat_id, cell_ids, m_container->m_material, queue);
497ConstArrayView<Int16> ConstituentConnectivityList::
498cellsNbEnvironment()
const
500 return m_container->m_environment.m_nb_component_as_array;
506ConstArrayView<Int16> ConstituentConnectivityList::
507cellsNbMaterial()
const
509 return m_container->m_material.m_nb_component_as_array;
555 cells_nb_material[i] =
nb_mat;
643 info() <<
"Cell index=" << i <<
" lid=" <<
lid
801 Int32
lid = item.localId();
802 m_container->checkResize(
lid + 1);
804 m_container->m_environment.m_nb_component_as_array[
lid] = 0;
805 m_container->m_environment.m_component_index_as_array[
lid] = 0;
807 m_container->m_material.m_nb_component_as_array[
lid] = 0;
808 m_container->m_material.m_component_index_as_array[
lid] = 0;
817 info() <<
"Constituent: reserve=" << n;
818 m_container->reserve(n);
835 return Arccore::makeRef<IIncrementalItemSourceConnectivity>(
this);
844 m_container->m_environment.removeAllConnectivities();
845 m_container->m_material.removeAllConnectivities();
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions utilitaires sur le maillage.
Types et fonctions pour gérer les synchronisations sur les accélérateurs.
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.
Classe pour effectuer une réduction 'somme'.
File d'exécution pour un accélérateur.
eExecutionPolicy executionPolicy() const
Politique d'exécution de la file.
bool isAcceleratorPolicy() const
Indique si l'instance est associée à un accélérateur.
Tableau d'items de types quelconques.
virtual Int32 maxLocalId() const =0
virtual IItemFamilyInternal * _internalApi()=0
API interne à Arcane.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
Interface d'une variable.
virtual void compact(Int32ConstArrayView new_to_old_ids)=0
Compacte les valeurs de la variable.
Index d'un Item dans une variable.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Vue sur une liste de constituants des mailles.
Conteneur des données de connectivité pour un type de constituant.
VariableArrayInt32 m_component_index
Indice dans m_component_list (Dimensionné au nombre de mailles)
VariableArrayInt16 m_nb_component
Nombre de milieux par maille (dimensionné au nombre de mailles)
VariableArrayInt16 m_component_list
Liste des constituants.
Classe pour calculer le nombre de matériaux d'un milieu.
SmallSpan< const Int16 > m_environment_for_materials
Vue indiquant le milieu associé aux matériaux.
void printConstituents(SmallSpan< const Int32 > cells_local_id) const
Affiche les constituants d'une liste d'entités.
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.
void fillModifiedConstituents(SmallSpan< const Int32 > cells_local_id, SmallSpan< bool > is_modified_materials, SmallSpan< bool > is_modified_environments, int modified_mat_id, bool is_add, const RunQueue &queue)
Remplit les constituants concernés par une modification.
void notifySourceItemAdded(ItemLocalId item) override
Notifie la connectivité qu'une entité a été ajoutée à la famille source.
Int16 cellNbMaterial(CellLocalId cell_id, Int16 env_id)
Nombre de matériaux de la maille cell_id pour le milieu d'indice env_id.
void notifyReadFromDump() override
Notifie la connectivité qu'on a effectué une relecture à partir d'une protection.
UniqueArray< Int16 > m_environment_for_materials
Indice du milieu auquel appartient un matériau.
void notifySourceFamilyLocalIdChanged(Int32ConstArrayView new_to_old_ids) override
Notifie la connectivité que la famille source est compactée.
void removeAllConnectivities()
Supprime toutes les entités connectées.
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.
Ref< IIncrementalItemSourceConnectivity > toSourceReference() override
Retourne une référence sur l'instance.
void reserveMemoryForNbSourceItems(Int32 n, bool pre_alloc_connectivity) override
Réserve la mémoire pour n entités sources.
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.
Implémentation d'un gestion des matériaux.
IMesh * mesh() override
Maillage associé.
int modificationFlags() const override
Flags pour paramêtrer les modifications.
Paramètres nécessaires à la construction d'une variable.
void updateFromInternal() override
Mise à jour à partir de la partie interne.
virtual void resize(Integer new_size)
Redimensionne le tableau pour contenir new_size éléments.
IVariable * variable() const
Variable associée.
void fill(const T &o) noexcept
Remplit le tableau avec la valeur o.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
ArrayView< T > view() const
Vue mutable sur ce tableau.
Vue constante d'un tableau de type T.
Interface du gestionnaire de traces.
constexpr ARCCORE_HOST_DEVICE SmallSpan< T, DynExtent > subPart(Int32 abegin, Int32 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Chaîne de caractères unicode.
Classe d'accès aux traces.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage info() const
Flot pour un message d'information.
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
bool isAcceleratorPolicy(eExecutionPolicy exec_policy)
Indique si exec_policy correspond à un accélérateur.
Active toujours les traces dans les parties Arcane concernant les matériaux.
@ IncrementalRecompute
Indique qu'on utilise la version incrémentale de AllEnvData::forceRecompute().
@ HostPinned
Alloue sur l'hôte.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Int32 Integer
Type représentant un entier.