14#include "arcane/utils/FatalErrorException.h"
15#include "arcane/utils/PlatformUtils.h"
16#include "arcane/utils/NotImplementedException.h"
17#include "arcane/utils/StringBuilder.h"
19#include "arcane/core/IMesh.h"
20#include "arcane/core/IItemFamily.h"
22#include "arcane/core/IParallelMng.h"
23#include "arcane/core/ItemPrinter.h"
24#include "arcane/core/VariableTypes.h"
25#include "arcane/core/Timer.h"
26#include "arcane/core/IItemInternalSortFunction.h"
27#include "arcane/core/ItemFamilyCompactInfos.h"
28#include "arcane/core/IMeshCompacter.h"
29#include "arcane/core/MeshPartInfo.h"
31#include "arcane/mesh/DynamicMeshKindInfos.h"
32#include "arcane/mesh/ItemFamily.h"
57, m_use_new_finalize(
true)
58, m_is_first_finalize(
true)
59, m_has_unique_id_map(
true)
77void DynamicMeshKindInfos::
92 if (!platform::getEnvironmentVariable(
"ARCANE_OLD_FINALIZE").null()){
93 m_use_new_finalize =
false;
96 m_is_first_finalize =
true;
119 info() <<
"Item " << i <<
" lib=" << item->
localId()
166#if defined(ARCANE_DEBUG_MESH)
174#if defined(ARCANE_DEBUG_MESH)
179 m_removed_items.
clear();
180 m_added_items.
clear();
186void DynamicMeshKindInfos::
189 if (!m_has_unique_id_map)
193 for( Integer i=0, s=ids.size(); i<s; ++i ){
199 for( Integer i=0, s=ids.size(); i<s; ++i ){
200 Int64 unique_id = ids[i];
207 for( Integer i=0, s=ids.size(); i<s; ++i ){
208 Int64 unique_id = ids[i];
210 if ((ids[i] == NULL_ITEM_LOCAL_ID) && do_fatal) {
212 error() <<
"DynamicMeshKindInfos::itemsUniqueIdToLocalId() can't find "
214 << unique_id <<
" in the subdomain.";
229void DynamicMeshKindInfos::
233 if (!m_has_unique_id_map)
237 for( Integer i=0, s=unique_ids.size(); i<s; ++i ){
238 Int64 unique_id = unique_ids[i];
239 local_ids[i] = (unique_id == NULL_ITEM_UNIQUE_ID) ? NULL_ITEM_LOCAL_ID :
m_items_map.findLocalId(unique_id);
243 for( Integer i=0, s=unique_ids.size(); i<s; ++i ){
244 Int64 unique_id = unique_ids[i];
251 for( Integer i=0, s=unique_ids.size(); i<s; ++i ){
252 Int64 unique_id = unique_ids[i];
254 if ((local_ids[i] == NULL_ITEM_LOCAL_ID) && do_fatal && unique_id != NULL_ITEM_UNIQUE_ID) {
256 error() <<
"DynamicMeshKindInfos::itemsUniqueIdToLocalId() can't find "
258 << unique_id <<
" in the subdomain.";
273void DynamicMeshKindInfos::
275 ConstArrayView<ItemUniqueId> unique_ids,
bool do_fatal)
const
277 if (!m_has_unique_id_map)
281 for( Integer i=0, s=unique_ids.size(); i<s; ++i ){
282 Int64 unique_id = unique_ids[i];
287 for( Integer i=0, s=unique_ids.size(); i<s; ++i ){
288 Int64 unique_id = unique_ids[i];
295 for( Integer i=0, s=unique_ids.size(); i<s; ++i ){
296 Int64 unique_id = unique_ids[i];
298 if ((local_ids[i] == NULL_ITEM_LOCAL_ID) && do_fatal) {
300 error() <<
"DynamicMeshKindInfos::itemsUniqueIdToLocalId() can't find "
302 << unique_id <<
" in the subdomain.";
332 _updateItemSharedInfoInternalView();
337 m_free_internals_in_multi_buffer.
clear();
359 error() <<
"The local id (" << item->
localId() <<
") of the entity "
361 <<
"consistent with its internal value (" << i <<
")";
370 <<
":uid=" << item->
uniqueId() <<
" belongs to no subdomain";
376 <<
":uid=" << item->
uniqueId() <<
" incoherence between isOwn() and owner()"
377 <<
" " << item->
owner() <<
' ' <<
sid;
385 <<
": incoherence between killed and free entities"
394 ARCANE_FATAL(
"Internal error in the mesh structure mesh={0} part={1}",
409 bool s1 =
item1->isSuppressed();
410 bool s2 =
item2->isSuppressed();
513 for( Integer i=0, is=items.size(); i<is; ++i ){
514 info() <<
"Before Sort: " << i <<
" uid=" << items[i]->uniqueId()
515 <<
" lid=" << items[i]->localId()
516 <<
" destroyed?=" << items[i]->isSuppressed();
524 <<
timer.lastActivationTime()
525 <<
" sort_func_name=" <<
sort_func->name();
526 info(4) <<
"Sort Infos: size=" << items.size() <<
" nb_item=" <<
m_nb_item;
528 for( Integer i=0, n=items.size(); i<n; ++i ){
529 info() <<
"After Sort: " << i <<
" uid=" << items[i]->uniqueId()
530 <<
" lid=" << items[i]->localId()
531 <<
" destroyed?=" << items[i]->isSuppressed();
536#ifdef ARCANE_TEST_ADD_MESH
537 typedef std::set<ItemInternal*,ItemCompare>
ItemSet;
542 ItemSet::const_iterator
b =
items_set.begin();
543 ItemSet::const_iterator e =
items_set.end();
544 for( Integer z=0;
b!=e; ++
b, ++z)
549 for( Integer i=0, n=
m_nb_item; i<n; ++i ){
560 info(4) <<
"USE_OLD_METHOD";
574 for( Integer i=0, n=
total_nb; i<n; ++i ){
587 ARCANE_FATAL(
"Family '{0}' bad indices: expected={1} found={2} (nb_internal={3})",
614 ARCANE_FATAL(
"Family '{0}' bad indices: expected={1} found={2}",
626void DynamicMeshKindInfos::
641 <<
" nb_free" << m_free_internals_in_multi_buffer.
size();
657 info() <<
"DumpItemsBefore:";
669 for( Integer i=0, n=
m_nb_item; i<n; ++i ) {
678 Integer nb_error = 0;
685 ii->setFlags(new_flags[i]);
686 ii->setOwner(new_owners[i],sid);
687 ii->setUniqueId(new_uids[i]);
688 ItemSharedInfo* isi = ItemInternalCompatibility::_getSharedInfo(ii);
689 ii->_setSharedInfo(isi,ItemTypeId(new_typeids[i]));
693 if (ii->isSuppressed()){
695 error() <<
"Entity deleted from the list of created entities "
696 << ItemPrinter(ii) <<
" index=" << i;
711 m_free_internals_in_multi_buffer.
add(removed_item);
716 _updateItemSharedInfoInternalView();
720 info() <<
"DumpItemsAfter:";
725 ARCANE_FATAL(
"Error in compacting nb_error={0}",nb_error);
727 debug() <<
"Compression: old=" << nb_internal <<
" new=" <<
m_nb_item
732 compact_infos.clear();
764 std::sort(std::begin(ids),std::end(ids),_Inverse());
773void DynamicMeshKindInfos::
782 info() <<
"I=" << i <<
" pos=" <<
pos <<
" index=" << index
783 <<
" local_id=" <<
iitem->localId();
796 if (m_has_unique_id_map){
797 for( Integer i=0; i<
nb_item; ++i ){
801 _checkActiveItem(item);
803 _setSuppressed(item);
804 if (uids[
lid] != NULL_ITEM_UNIQUE_ID)
809 for( Integer i=0; i<
nb_item; ++i ){
813 _checkActiveItem(item);
815 _setSuppressed(item);
831void DynamicMeshKindInfos::
832setHasUniqueIdMap(
bool v)
836 m_has_unique_id_map = v;
842void DynamicMeshKindInfos::
846 ARCANE_FATAL(
"Attempting to remove an entity already deleted item={0}",
853void DynamicMeshKindInfos::
857 Integer computed_nb_item = 0;
858 for( Integer i=0; i<nb_internal; ++i ){
860 bool is_suppressed = item->isSuppressed();
863 info() <<
"Item: INDEX=" << i
864 <<
" LID=" << item->localId()
865 <<
" UID=" << item->uniqueId()
866 <<
" KILLED=" << is_suppressed;
868 info() <<
"EndOfDump: "
869 <<
" nb_internal=" << nb_internal
871 <<
" computed_nb_item= " << (nb_internal-computed_nb_item);
877void DynamicMeshKindInfos::
878_badSameUniqueId(
Int64 unique_id)
const
887void DynamicMeshKindInfos::
888_badUniqueIdMap()
const
890 if (m_has_unique_id_map)
899void DynamicMeshKindInfos::
900setItemFamily(ItemFamily* item_family)
903 m_common_item_shared_info = item_family->commonItemSharedInfo();
909void DynamicMeshKindInfos::
910_updateItemSharedInfoInternalView()
912 if (m_common_item_shared_info)
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Interface d'une fonction de tri des entités.
virtual String name() const =0
Nom du maillage.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
virtual ItemGroup findGroup(const String &name)=0
Retourne le groupe de nom name ou le groupe nul s'il n'y en a pas.
virtual const MeshPartInfo & meshPartInfo() const =0
Informations sur les parties du maillage.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
Interface d'un gestionnaire de timer.
bool isSuppressed() const
Vrai si l'entité est supprimée.
ItemUniqueId uniqueId() const
Numéro unique de l'entité
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
bool isOwn() const
Vrai si l'entité appartient au sous-domaine.
Int32 localId() const
Numéro local (au sous-domaine) de l'entité
Informations pour gérer le compactage des entités d'une famille.
Int32ConstArrayView newToOldLocalIds() const
Conversion entre les nouveaux et les anciens id locaux.
Int32ConstArrayView oldToNewLocalIds() const
Conversion entre les anciens et les nouveaux id locaux.
Implémentation d'un groupe d'entités de maillage.
void removeItems(Int32ConstArrayView items_local_id, bool check_if_present)
Supprime les entités items_local_id du groupe.
bool checkNeedUpdate()
Réactualise le groupe si nécessaire.
void removeAddItems(Int32ConstArrayView removed_local_id, Int32ConstArrayView added_local_id, bool check_if_present)
Supprime et ajoute les entités removed_local_id et added_local_id du groupe.
void endTransaction()
Termine une transaction.
void addItems(Int32ConstArrayView items_local_id, bool check_if_present)
Ajoute les entités de numéros locaux items_local_id.
void setIsAllItems()
Indique à ce groupe qu'il s'agit du groupe de toutes les entités de la famille.
Int32ConstArrayView itemsLocalId() const
Liste des numéros locaux des entités de ce groupe.
void beginTransaction()
Débute une transaction.
void setLocalToSubDomain(bool v)
Positionne le booléen indiquant si le groupe est local au sous-domaine.
ItemGroupImpl * internal() const
Retourne l'implémentation du groupe.
void checkValid()
Vérification interne de la validité du groupe.
Structure interne d'une entité de maillage.
Classe utilitaire pour imprimer les infos sur une entité.
ConstArrayView< ItemInternal * > m_items_internal
ItemInternal des entités.
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Tampon pour allocation multiple.
Cell cell() const
Maille à laquelle appartient la particule. Il faut appeler setCell() avant d'appeler cette fonction....
Sentinelle pour le timer. La sentinelle associée à un timer permet de déclancher celui-ci au moment d...
@ TimerReal
Timer utilisant le temps réel.
Integer m_nb_item
Groupe de toutes les entités.
String m_kind_name
Nom du genre des entités (Node, Cell, ...)
Integer maxUsedLocalId() const
Numéro local le plus grand utilisé.
MultiBufferT< ItemInternal > * m_item_internals_buffer
Tampon pour stocker une instance de ItemInternal.
void finalizeMeshChanged()
Réalloue et recalcule les structures après modification du maillage.
void removeMany(Int32ConstArrayView local_ids)
Supprime une liste d'entités.
void prepareForDump()
Prépare les variables pour les sauvegardes.
void beginCompactItems(ItemFamilyCompactInfos &compact_infos)
Calcule les nouveaux id locaux des entités pour qu'ils soient consécutifs.
ARCANE_DEPRECATED_240 Int32ConstArrayView oldToNewLocalIds() const
Conversion entre les anciens et les nouveaux id locaux.
UniqueArray< ItemInternal * > m_internals
ItemInternal des entités.
void readFromDump()
Restaure les infos à partir des dumps.
DynamicMeshKindInfos(IMesh *mesh, eItemKind kind, const String &kind_name)
Créé une instance pour un maillage et un genre donnée.
ARCANE_DEPRECATED_240 Int32ConstArrayView newToOldLocalIds() const
Conversion entre les nouveaux et les anciens id locaux.
ItemFamilyCompactInfos * m_compact_infos
Temporaire tant que oldToNewLocalIds() et newToOldLocalIds() existent.
void checkValid()
Vérifie si les structures internes de l'instance sont valides.
~DynamicMeshKindInfos()
Libère les ressources.
String m_all_group_name
Nom du groupe contenant toutes les entités.
ItemInternalMap m_items_map
Table de hachage conversion uniqueId() -> ItemInternal*.
Int32UniqueArray m_free_internals
Liste des ItemInternal de m_item_internals_buffer libres.
void clear()
Supprime toutes les entités.
IMesh * m_mesh
Maillage associé
ItemFamily * m_item_family
Famille de maillage associée.
ItemGroup createGroup(const String &name, Int32ConstArrayView elements, bool do_override=false) override
Créé un groupe d'entités de nom name contenant les entités local_ids.
IItemInternalSortFunction * itemSortFunction() const override
Fonction de tri des entités.
void notifyItemsOwnerChanged() override
Notifie que les entités propres au sous-domaine de la famille ont été modifiées.
String name() const override
Nom de la famille.
void remove(Int64 key)
Supprime la valeur associée à la clé key.
Int32 tryFindLocalId(Int64 key) const
Retourne le localId() associé à key si trouvé ou NULL_ITEM_LOCAL_ID sinon aucun.
Int32 findLocalId(Int64 uid) const
Retourne le numéro local de l'entité de numéro unique uid.
void _changeLocalIds(ArrayView< ItemInternal * > items_internal, ConstArrayView< Int32 > old_to_new_local_ids)
Change la valeurs des localId()
void clear()
Supprime tous les éléments de la table.
Integer size() const
Nombre d'éléments du vecteur.
Vue modifiable d'un tableau d'un type T.
const T * data() const
Accès à la racine du tableau hors toute protection.
iterator begin()
Itérateur sur le premier élément du tableau.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
ConstArrayView< T > constView() const
Vue constante sur ce tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
void clear()
Supprime les éléments du tableau.
iterator end()
Itérateur sur le premier élément après la fin du tableau.
Vue constante d'un tableau de type T.
Constructeur de chaîne de caractère unicode.
Chaîne de caractères unicode.
Classe d'accès aux traces.
TraceMessage pwarning() const
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage error() const
Flot pour un message d'erreur.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
Positionne une classe de message.
Vecteur 1D de données avec sémantique par valeur (style STL).
ARCCORE_HOST_DEVICE Real2 min(Real2 a, Real2 b)
Retourne le minimum de deux Real2.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
eItemKind
Genre d'entité de maillage.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Int32 Integer
Type représentant un entier.