Arcane  v3.15.3.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MeshUtils.h
Aller à la documentation de ce fichier.
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* MeshUtils.h (C) 2000-2025 */
9/* */
10/* Fonctions utilitaires diverses sur le maillage. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_MESHUTILS_H
13#define ARCANE_CORE_MESHUTILS_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/FunctorUtils.h"
19
20#include "arcane/Item.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24/*!
25 * \file MeshUtils.h
26 *
27 * \brief Fonctions utilitaires sur le maillage.
28 */
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32namespace Arcane
33{
34class XmlNode;
35class IVariableSynchronizer;
36} // namespace Arcane
37
38/*---------------------------------------------------------------------------*/
39/*---------------------------------------------------------------------------*/
40
41namespace Arcane::MeshUtils
42{
43extern "C++" ARCANE_CORE_EXPORT void
44writeMeshItemInfo(ISubDomain*, Cell cell, bool depend_info = true);
45extern "C++" ARCANE_CORE_EXPORT void
46writeMeshItemInfo(ISubDomain*, Node node, bool depend_info = true);
47extern "C++" ARCANE_CORE_EXPORT void
48writeMeshItemInfo(ISubDomain*, Edge edge, bool depend_info = true);
49extern "C++" ARCANE_CORE_EXPORT void
50writeMeshItemInfo(ISubDomain*, Face face, bool depend_info = true);
51
52/*---------------------------------------------------------------------------*/
53/*---------------------------------------------------------------------------*/
54/*!
55 * \brief Réordonne les noeuds d'une face.
56
57 Cette méthode réordonne la liste des noeuds d'une face pour que les
58 propritétés suivantes soient respectées:
59 - le premier noeud de la face est celui dont le numéro global est le plus petit.
60 - le deuxième noeud de la face est celui dont le numéro global est le deuxième plus petit.
61
62 Cela permet:
63 - d'orienter les faces de manière identiques en parallèle.
64 - d'accélerer les recherches sur les recherches entre faces.
65
66 \a before_ids et \a to doivent avoir le même nombre d'éléments
67
68 \param before_ids numéros globaux des noeuds de la face avant renumérotation.
69 \param after_ids en sortie, numéros globaux des noeuds de la face après renumérotation
70
71 \retval true si la face change d'orientation lors de la renumérotation
72 \retval false sinon.
73*/
74extern "C++" ARCANE_CORE_EXPORT bool
76
77/*---------------------------------------------------------------------------*/
78/*---------------------------------------------------------------------------*/
79/*!
80 * \brief Réordonne les noeuds d'une face.
81
82 Cette méthode réordonne la liste des noeuds d'une face pour que les
83 propriétés suivantes soient respectées:
84 - le premier noeud de la face est celui dont le numéro global est le plus petit.
85 - le deuxième noeud de la face est celui dont le numéro global est le deuxième plus petit.
86
87 Cela permet:
88 - d'orienter les faces de manière identiques en parallèle.
89 - d'accélerer les recherches sur les recherches entre faces.
90
91 \a nodes_unique_id et \a new_index doivent avoir le même nombre d'éléments
92
93 \param nodes_unique_id numéros uniques des noeuds de la face.
94 \param new_index en sortie, position des numéros des noeuds après réorientation.
95
96 Par exemple, si une face possède les 4 noeuds de numéros uniques 7 3 2 5,
97 la réorientation donnera le quadruplet (2 3 7 5), soit le tableau d'index
98 suivant (2,1,0,3).
99
100 \retval true si la face change d'orientation lors de la renumérotation
101 \retval false sinon.
102*/
103extern "C++" ARCANE_CORE_EXPORT bool
105
106/*---------------------------------------------------------------------------*/
107/*---------------------------------------------------------------------------*/
108/*!
109 * \brief Recherche une entité face à partir des numéros locaux de ces noeuds.
110 *
111 * Recherche la face donnée par la liste ordonnée des numéros <b>locaux</b> de
112 * ces noeuds \a face_nodes_local_id. \a node doit être le premier noeud de
113 * la face. Les noeuds de la face doivent être correctement orientés, comme
114 * après un appel à reorderNodesOfFace().
115 *
116 * \return la face correspondante ou la face nulle si elle n'est pas trouvé.
117 */
118extern "C++" ARCANE_CORE_EXPORT Face
119getFaceFromNodesLocalId(Node node, Int32ConstArrayView face_nodes_local_id);
120
121ARCANE_DEPRECATED_REASON("Y2025: Use getFaceFromNodesLocalId() instead")
122inline Face
123getFaceFromNodesLocal(Node node, Int32ConstArrayView face_nodes_local_id)
124{
125 return getFaceFromNodesLocalId(node, face_nodes_local_id);
126}
127
128/*---------------------------------------------------------------------------*/
129/*---------------------------------------------------------------------------*/
130/*!
131 * \brief Recherche une entité face à partir des numéros uniques de ces noeuds.
132 *
133 * Recherche la face donnée par la liste ordonnée des numéros <b>unique</b> de
134 * ces noeuds \a face_nodes_unique_id. \a node doit être le premier noeud de
135 * la face. Les noeuds de la face doivent être correctement orientés, comme
136 * après un appel à reorderNodesOfFace().
137 *
138 * \return la face correspondante ou la face nulle si elles n'est pas trouvé.
139 */
140extern "C++" ARCANE_CORE_EXPORT Face
141getFaceFromNodesUniqueId(Node node, Int64ConstArrayView face_nodes_unique_id);
142
143ARCANE_DEPRECATED_REASON("Y2025: Use getFaceFromNodesUniqueId() instead")
144inline Face
145getFaceFromNodesUnique(Node node, Int64ConstArrayView face_nodes_unique_id)
146{
147 return getFaceFromNodesUniqueId(node, face_nodes_unique_id);
148}
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
152/*!
153 * \brief Génère un identifiant unique à partir d'une liste d'identifiants de noeuds.
154 */
155extern "C++" ARCANE_CORE_EXPORT Int64
156generateHashUniqueId(SmallSpan<const Int64> nodes_unique_id);
157
158/*---------------------------------------------------------------------------*/
159/*---------------------------------------------------------------------------*/
160
161/*!
162 * \brief Supprime une entité en conservant l'ordre.
163 *
164 * Supprime l'entité de numéro local \a local_id de la liste \a items.
165 * Les entités situées après l'entité supprimée sont décalées pour remplir le trou.
166 * Si aucune valeur de \a items ne vaut \a local_id, une exception est levée.
167 */
168extern "C++" ARCANE_CORE_EXPORT void
170
171/*---------------------------------------------------------------------------*/
172/*---------------------------------------------------------------------------*/
173/*!
174 * \brief Vérifie que le maillage possède certaines propriétés.
175 *
176 * Si \a is_sorted, vérifie que les entités de maillage sont triées par
177 * ordre croissant de leur uniqueId().
178 * Si \a has_no_hole est vrai, vérifie que si le maillage possède \a n
179 * entité d'un type, leur numéro local varie bien de \a 0 à \a n-1.
180 * Si \a check_faces est vrai, on vérifie pour les faces. Cette option
181 * n'est utilisable que pour les maillages ancienne génération (MeshV1) et
182 * sera supprimée dès que cette option ne sera plus utilisée.
183 */
184extern "C++" ARCANE_CORE_EXPORT void
185checkMeshProperties(IMesh* mesh, bool is_sorted, bool has_no_hole, bool check_faces);
186
187/*!
188 * \brief Ecrit sur le fichier \a file_name les infos du maillage \a mesh
189 *
190 * Les identifiants des entités sont triés pour que le maillage soit
191 * identique quel que soit la numérotation initiale.
192 */
193extern "C++" ARCANE_CORE_EXPORT void
194writeMeshInfosSorted(IMesh* mesh, const String& file_name);
195
196extern "C++" ARCANE_CORE_EXPORT void
197writeMeshInfos(IMesh* mesh, const String& file_name);
198
199/*!
200 * \brief Ecrit sur le fichier \a file_name la connectivité du maillage \a mesh
201 *
202 * La connectivité de chaque entité arête, face et maille est sauvée.
203 */
204extern "C++" ARCANE_CORE_EXPORT void
205writeMeshConnectivity(IMesh* mesh, const String& file_name);
206
207extern "C++" ARCANE_CORE_EXPORT void
208checkMeshConnectivity(IMesh* mesh, const XmlNode& root_node, bool check_sub_domain);
209
210extern "C++" ARCANE_CORE_EXPORT void
211checkMeshConnectivity(IMesh* mesh, const String& file_name, bool check_sub_domain);
212
213/*!
214 * \brief Ecrit dans le flux \a ostr la description des items du groupe \a item_group
215 *
216 * Pour l'affichage, un nom \a name est associé.
217 */
218extern "C++" ARCANE_CORE_EXPORT void
219printItems(std::ostream& ostr, const String& name, ItemGroup item_group);
220
221/*!
222 * \brief Affiche l'utilisation mémoire des groupes du maillage.
223 *
224 * Si \a print_level vaut 0, affiche uniquement l'usage mémoire total.
225 * So \a print_level vaut 1 ou plus, affiche l'usage pour chaque groupe.
226 *
227 * En retour, indique la mémoire consommée en octets.
228 */
229extern "C++" ARCANE_CORE_EXPORT Int64
230printMeshGroupsMemoryUsage(IMesh* mesh, Int32 print_level);
231
232//! Limite au plus juste l'usage mémoire des groupes.
233extern "C++" ARCANE_CORE_EXPORT void
234shrinkMeshGroups(IMesh* mesh);
235
236/*!
237 * \brief Ecrit dans un fichier les informations sur la topologie d'une synchronisation
238 *
239 * Ecrit dans le fichier \a filename les informations sur la topologie de \a var_syncer.
240 * Cette méthode est collective. Seul le rang 0 écrit l'information de la topologie.
241 */
242extern "C++" ARCANE_CORE_EXPORT void
243dumpSynchronizerTopologyJSON(IVariableSynchronizer* var_syncer, const String& filename);
244
245/*!
246 * \internal
247 * \brief Calcul et affiche les patterns communs dans les connectivités.
248 */
249extern "C++" ARCANE_CORE_EXPORT void
250computeConnectivityPatternOccurence(IMesh* mesh);
251
252/*---------------------------------------------------------------------------*/
253/*---------------------------------------------------------------------------*/
254/*!
255 * \brief Indique que les connectivités du maillages ne seront
256 * pas régulièrement modifiées.
257 *
258 * Cette fonction permet d'indiquer que les connectivitées associées aux
259 * entités du maillage (Node, Edge, Face et Cell) sont la plupart du temps
260 * en lecture. A noter que cela ne concerne pas les particules.
261 *
262 * En cas d'utilisation sur accélérateur, cela permet de dupliquer les
263 * informations entre l'accélérateur et l'hôte pour éviter des aller-retour
264 * multiples si les connectivités sont utilisées sur les deux à la fois.
265 *
266 * Si \a q est non nul et que \a do_prefetch vaut \a true, alors
267 * VariableUtils::prefetchVariableAsync() est appelé pour chaque variable
268 * gérant la connectivité.
269 */
270extern "C++" ARCANE_CORE_EXPORT void
271markMeshConnectivitiesAsMostlyReadOnly(IMesh* mesh, RunQueue* q = nullptr,
272 bool do_prefetch = false);
273
274/*---------------------------------------------------------------------------*/
275/*---------------------------------------------------------------------------*/
276/*
277 * \brief Retourne l'entité de la famille \a family de numéro unique \a unique_id.
278 *
279 * Si aucune entité avec cet \a unique_id n'est trouvé, retourne l'entité nulle.
280 *
281 * \pre family->hasUniqueIdMap() == true
282 */
283extern "C++" ARCANE_CORE_EXPORT ItemBase
284findOneItem(IItemFamily* family, Int64 unique_id);
285
286/*---------------------------------------------------------------------------*/
287/*---------------------------------------------------------------------------*/
288/*
289 * \brief Retourne l'entité de la famille \a family de numéro unique \a unique_id.
290 *
291 * Si aucune entité avec cet \a unique_id n'est trouvé, retourne l'entité nulle.
292 *
293 * \pre family->hasUniqueIdMap() == true
294 */
295extern "C++" ARCANE_CORE_EXPORT ItemBase
296findOneItem(IItemFamily* family, ItemUniqueId unique_id);
297
298/*---------------------------------------------------------------------------*/
299/*---------------------------------------------------------------------------*/
300/*!
301 * \brief Visite l'ensemble des groupes de \a family avec le functor \a functor.
302 */
303extern "C++" ARCANE_CORE_EXPORT void
304visitGroups(IItemFamily* family, IFunctorWithArgumentT<ItemGroup&>* functor);
305
306/*---------------------------------------------------------------------------*/
307/*---------------------------------------------------------------------------*/
308/*!
309 * \brief Visite l'ensemble des groupes de \a mesh avec le functor \a functor.
310 */
311extern "C++" ARCANE_CORE_EXPORT void
312visitGroups(IMesh* mesh, IFunctorWithArgumentT<ItemGroup&>* functor);
313
314/*---------------------------------------------------------------------------*/
315/*---------------------------------------------------------------------------*/
316/*!
317 * \brief Visite l'ensemble des groupes de \a family avec la lambda \a f.
318 *
319 * Cette fonction permet d'appliquer un visiteur pour l'ensemble des
320 * groupes de la famille \a family.
321 *
322 * Par exemple:
323 *
324 * \code
325 * IMesh* mesh = ...;
326 * auto xx = [](const ItemGroup& x) { std::cout << "name=" << x.name(); };
327 * MeshUtils::visitGroups(mesh,xx);
328 * \endcode
329 */
330template <typename LambdaType> inline void
332{
334 // Il faut caster en le bon type pour que le compilateur utilise la bonne surcharge.
336 visitGroups(family, sf_addr);
337}
338
339/*---------------------------------------------------------------------------*/
340/*---------------------------------------------------------------------------*/
341/*!
342 * \brief Visite l'ensemble des groupes de \a mesh avec la lambda \a f.
343 *
344 * Cette fonction permet d'appliquer un visiteur pour l'ensemble des
345 * groupes de l'ensemble des familles du maillage \a mesh
346 *
347 * Elle s'utilise comme suit:
348 *
349 * \code
350 * IMesh* mesh = ...;
351 * auto xx = [](const ItemGroup& x) { std::cout << "name=" << x.name(); };
352 * MeshVisitor::visitGroups(mesh,xx);
353 * \endcode
354 */
355template <typename LambdaType> inline void
357{
359 // Il faut caster en le bon pour que le compilateur utilise la bonne surcharge.
361 visitGroups(mesh, sf_addr);
362}
363
364namespace impl
365{
366 inline Int64 computeCapacity(Int64 size)
367 {
368 return Arcane::MemoryUtils::impl::computeCapacity(size);
369 }
370} // namespace impl
371
372/*---------------------------------------------------------------------------*/
373/*---------------------------------------------------------------------------*/
374/*!
375 * \brief Redimensionne un tableau qui est indexé par des 'ItemLocalId'.
376 *
377 * Le tableau \a array est redimensionné uniquement si \a new_size est
378 * supérieure à la taille actuelle du tableau ou si \a force_resize est vrai.
379 *
380 * Si le tableau est redimensionné, on réserve une capacité supplémentaire
381 * pour éviter de réallouer à chaque fois.
382 *
383 * Cette fonction est appelée en général pour les tableaux indexés par un
384 * ItemLocalId et donc cette fonction peut être appelée à chaque fois qu'on
385 * ajoute une entité au maillage.
386 *
387 * \retval true si un redimensionnement a eu lieu
388 * \retval false sinon
389 */
390template <typename DataType> inline bool
395
396/*---------------------------------------------------------------------------*/
397/*---------------------------------------------------------------------------*/
398/*!
399 * \brief Retourne le maximum des uniqueId() des entités standards du maillage.
400 *
401 * Les entités standards sont les noeuds, mailles, faces et arêtes.
402 * L'opération est collective sur mesh->parallelMng().
403 */
404extern "C++" ARCANE_CORE_EXPORT ItemUniqueId
405getMaxItemUniqueIdCollective(IMesh* mesh);
406
407/*---------------------------------------------------------------------------*/
408/*---------------------------------------------------------------------------*/
409/*!
410 * \brief Vérifie le hash des uniqueId() des entités d'une famille.
411 *
412 * Calcule via l'algo \a hash_algo un hash des uniqueId() des entités
413 * d'une famille. Pour ce calcul, le rang 0 récupère l'ensemble des uniqueId()
414 * des entités propres de chaque sous-domaine, les trie et calcul le hash
415 * sur le tableau trié.
416 *
417 * Comme la majorité du travail est effectuée par le rang 0, cette méthode
418 * n'est pas très extensible et ne doit donc être utilisée qu'à des fins
419 * de test.
420 *
421 * \a expected_hash est la valeur attendue du hash sous forme de caractères
422 * hexadécimaux (obtenu via Convert::toHexaString()). Si \a expected_hash
423 * est non nul, compare le résultat avec cette valeur et si elle est différente,
424 * lance une exception FatalErrorException.
425 *
426 * Cette opération est collective.
427 */
428extern "C++" ARCANE_CORE_EXPORT void
429checkUniqueIdsHashCollective(IItemFamily* family, IHashAlgorithm* hash_algo,
431 bool include_ghost);
432
433/*---------------------------------------------------------------------------*/
434/*---------------------------------------------------------------------------*/
435/*!
436 * \brief Rempli \a uids avec les uniqueId() des entités de \a view.
437 */
438extern "C++" ARCANE_CORE_EXPORT void
439fillUniqueIds(ItemVectorView items,Array<Int64>& uids);
440
441/*---------------------------------------------------------------------------*/
442/*---------------------------------------------------------------------------*/
443
444/*!
445 * \brief Créé ou recréé une connectivité noeuds-noeuds via les arêtes.
446 *
447 * La connectivité aura pour nom \a connectivity_name.
448 */
449extern "C++" ARCANE_CORE_EXPORT Ref<IIndexedIncrementalItemConnectivity>
450computeNodeNodeViaEdgeConnectivity(IMesh* mesh, const String& connectivity_name);
451
452/*---------------------------------------------------------------------------*/
453/*---------------------------------------------------------------------------*/
454
455} // namespace Arcane::MeshUtils
456
457/*---------------------------------------------------------------------------*/
458/*---------------------------------------------------------------------------*/
459
460namespace Arcane::mesh_utils
461{
462// Using pour compatibilité avec l'existant.
463// Ces using ont été ajoutés pour la version 3.10 de Arcane (juin 2023).
464// On pourra les rendre obsolètes début 2024.
465using MeshUtils::checkMeshConnectivity;
466using MeshUtils::checkMeshProperties;
467using MeshUtils::computeConnectivityPatternOccurence;
468using MeshUtils::dumpSynchronizerTopologyJSON;
469using MeshUtils::getFaceFromNodesLocal;
470using MeshUtils::getFaceFromNodesUnique;
471using MeshUtils::printItems;
472using MeshUtils::printMeshGroupsMemoryUsage;
473using MeshUtils::removeItemAndKeepOrder;
474using MeshUtils::reorderNodesOfFace;
475using MeshUtils::reorderNodesOfFace2;
476using MeshUtils::shrinkMeshGroups;
477using MeshUtils::writeMeshConnectivity;
478using MeshUtils::writeMeshInfos;
479using MeshUtils::writeMeshInfosSorted;
480using MeshUtils::writeMeshItemInfo;
481
482/*---------------------------------------------------------------------------*/
483/*---------------------------------------------------------------------------*/
484
485} // namespace Arcane::mesh_utils
486
487/*---------------------------------------------------------------------------*/
488/*---------------------------------------------------------------------------*/
489
490#endif
Fonctions de gestion mémoire et des allocateurs.
void shrinkMeshGroups(IMesh *mesh)
Limite au plus juste l'usage mémoire des groupes.
void dumpSynchronizerTopologyJSON(IVariableSynchronizer *var_syncer, const String &filename)
Ecrit dans un fichier les informations sur la topologie d'une synchronisation.
bool checkResizeArray(Array< DataType > &array, Int64 new_size, bool force_resize)
Redimensionne un tableau qui est indexé par des 'ItemLocalId'.
Definition MeshUtils.h:391
void writeMeshInfosSorted(IMesh *mesh, const String &file_name)
Ecrit sur le fichier file_name les infos du maillage mesh.
Definition MeshUtils.cc:522
void writeMeshConnectivity(IMesh *mesh, const String &file_name)
Ecrit sur le fichier file_name la connectivité du maillage mesh.
Definition MeshUtils.cc:828
void printItems(std::ostream &ostr, const String &name, ItemGroup item_group)
Ecrit dans le flux ostr la description des items du groupe item_group.
bool reorderNodesOfFace(Int64ConstArrayView before_ids, Int64ArrayView after_ids)
Réordonne les noeuds d'une face.
Int64 generateHashUniqueId(SmallSpan< const Int64 > nodes_unique_id)
Génère un identifiant unique à partir d'une liste d'identifiants de noeuds.
Int64 printMeshGroupsMemoryUsage(IMesh *mesh, Int32 print_level)
Affiche l'utilisation mémoire des groupes du maillage.
void visitGroups(IItemFamily *family, IFunctorWithArgumentT< ItemGroup & > *functor)
Visite l'ensemble des groupes de family avec le functor functor.
void removeItemAndKeepOrder(Int32ArrayView items, Int32 local_id)
Supprime une entité en conservant l'ordre.
void checkMeshProperties(IMesh *mesh, bool is_sorted, bool has_no_hole, bool check_faces)
Vérifie que le maillage possède certaines propriétés.
Face getFaceFromNodesUniqueId(Node node, Int64ConstArrayView face_nodes_unique_id)
Recherche une entité face à partir des numéros uniques de ces noeuds.
void markMeshConnectivitiesAsMostlyReadOnly(IMesh *mesh, RunQueue *q=nullptr, bool do_prefetch=false)
Indique que les connectivités du maillages ne seront pas régulièrement modifiées.
bool reorderNodesOfFace2(Int64ConstArrayView nodes_unique_id, IntegerArrayView new_index)
Réordonne les noeuds d'une face.
Face getFaceFromNodesLocalId(Node node, Int32ConstArrayView face_nodes_local_id)
Recherche une entité face à partir des numéros locaux de ces noeuds.
Interface d'un algorithme de hashage.
Interface d'une famille d'entités.
Identifiant unique d'une entité.
Vue sur un vecteur d'entités.
Référence à une instance.
Chaîne de caractères unicode.
Int32 checkResizeArrayWithCapacity(Array< DataType > &array, Int64 new_size, bool force_resize)
Redimensionne un tableau en ajoutant une réserve de mémoire.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
ArrayView< Integer > IntegerArrayView
Equivalent C d'un tableau à une dimension d'entiers.
Definition UtilsTypes.h:547
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:572
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:541
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:570
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:543