Arcane  v3.14.10.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-2024 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-2024 */
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"
18#include "arcane/utils/MemoryUtils.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 0 si la face n'est pas trouvé.
117*/
118extern "C++" ARCANE_CORE_EXPORT Face
119getFaceFromNodesLocal(Node node, Int32ConstArrayView face_nodes_local_id);
120
121/*---------------------------------------------------------------------------*/
122/*---------------------------------------------------------------------------*/
123/*!
124 \brief Recherche une entité face à partir des numéros uniques de ces noeuds.
125
126 Recherche la face donnée par la liste ordonnée des numéros <b>unique</b> de
127 ces noeuds \a face_nodes_unique_id. \a node doit être le premier noeud de
128 la face. Les noeuds de la face doivent être correctement orientés, comme
129 après un appel à reorderNodesOfFace().
130
131 \return la face correspondante ou 0 si la face n'est pas trouvé.
132*/
133extern "C++" ARCANE_CORE_EXPORT Face
134getFaceFromNodesUnique(Node node, Int64ConstArrayView face_nodes_unique_id);
135
136/*---------------------------------------------------------------------------*/
137/*---------------------------------------------------------------------------*/
138/*!
139 * \brief Génère un identifiant unique à partir d'une liste d'identifiants de noeuds.
140 */
141extern "C++" ARCANE_CORE_EXPORT Int64
142generateHashUniqueId(SmallSpan<const Int64> nodes_unique_id);
143
144/*---------------------------------------------------------------------------*/
145/*---------------------------------------------------------------------------*/
146
147/*!
148 * \brief Supprime une entité en conservant l'ordre.
149 *
150 * Supprime l'entité de numéro local \a local_id de la liste \a items.
151 * Les entités situées après l'entité supprimée sont décalées pour remplir le trou.
152 * Si aucune valeur de \a items ne vaut \a local_id, une exception est levée.
153 */
154extern "C++" ARCANE_CORE_EXPORT void
155removeItemAndKeepOrder(Int32ArrayView items, Int32 local_id);
156
157/*---------------------------------------------------------------------------*/
158/*---------------------------------------------------------------------------*/
159/*! \brief Vérifie que le maillage possède certaines propriétés.
160 *
161 * Si \a is_sorted, vérifie que les entités de maillage sont triées par
162 * ordre croissant de leur uniqueId().
163 * Si \a has_no_hole est vrai, vérifie que si le maillage possède \a n
164 * entité d'un type, leur numéro local varie bien de \a 0 à \a n-1.
165 * Si \a check_faces est vrai, on vérifie pour les faces. Cette option
166 * n'est utilisable que pour les maillages ancienne génération (MeshV1) et
167 * sera supprimée dès que cette option ne sera plus utilisée.
168 */
169extern "C++" ARCANE_CORE_EXPORT void
170checkMeshProperties(IMesh* mesh, bool is_sorted, bool has_no_hole, bool check_faces);
171
172/*!
173 * \brief Ecrit sur le fichier \a file_name les infos du maillage \a mesh
174 *
175 * Les identifiants des entités sont triés pour que le maillage soit
176 * identique quel que soit la numérotation initiale.
177 */
178extern "C++" ARCANE_CORE_EXPORT void
179writeMeshInfosSorted(IMesh* mesh, const String& file_name);
180
181extern "C++" ARCANE_CORE_EXPORT void
182writeMeshInfos(IMesh* mesh, const String& file_name);
183
184/*!
185 * \brief Ecrit sur le fichier \a file_name la connectivité du maillage \a mesh
186 *
187 * La connectivité de chaque entité arête, face et maille est sauvée.
188 */
189extern "C++" ARCANE_CORE_EXPORT void
190writeMeshConnectivity(IMesh* mesh, const String& file_name);
191
192extern "C++" ARCANE_CORE_EXPORT void
193checkMeshConnectivity(IMesh* mesh, const XmlNode& root_node, bool check_sub_domain);
194
195extern "C++" ARCANE_CORE_EXPORT void
196checkMeshConnectivity(IMesh* mesh, const String& file_name, bool check_sub_domain);
197
198/*!
199 * \brief Ecrit dans le flux \a ostr la description des items du groupe \a item_group
200 *
201 * Pour l'affichage, un nom \a name est associé.
202 */
203extern "C++" ARCANE_CORE_EXPORT void
204printItems(std::ostream& ostr, const String& name, ItemGroup item_group);
205
206/*!
207 * \brief Affiche l'utilisation mémoire des groupes du maillage.
208 *
209 * Si \a print_level vaut 0, affiche uniquement l'usage mémoire total.
210 * So \a print_level vaut 1 ou plus, affiche l'usage pour chaque groupe.
211 *
212 * En retour, indique la mémoire consommée en octets.
213 */
214extern "C++" ARCANE_CORE_EXPORT Int64
215printMeshGroupsMemoryUsage(IMesh* mesh, Int32 print_level);
216
217//! Limite au plus juste l'usage mémoire des groupes.
218extern "C++" ARCANE_CORE_EXPORT void
219shrinkMeshGroups(IMesh* mesh);
220
221/*!
222 * \brief Ecrit dans un fichier les informations sur la topologie d'une synchronisation
223 *
224 * Ecrit dans le fichier \a filename les informations sur la topologie de \a var_syncer.
225 * Cette méthode est collective. Seul le rang 0 écrit l'information de la topologie.
226 */
227extern "C++" ARCANE_CORE_EXPORT void
228dumpSynchronizerTopologyJSON(IVariableSynchronizer* var_syncer, const String& filename);
229
230/*!
231 * \interne
232 * \brief Calcul et affiche les patterns communs dans les connectivités.
233 */
234extern "C++" ARCANE_CORE_EXPORT void
236
237/*---------------------------------------------------------------------------*/
238/*---------------------------------------------------------------------------*/
239/*!
240 * \brief Indique que les connectivités du maillages ne seront
241 * pas régulièrement modifiées.
242 *
243 * Cette fonction permet d'indiquer que les connectivitées associées aux
244 * entités du maillage (Node, Edge, Face et Cell) sont la plupart du temps
245 * en lecture. A noter que cela ne concerne pas les particules.
246 *
247 * En cas d'utilisation sur accélérateur, cela permet de dupliquer les
248 * informations entre l'accélérateur et l'hôte pour éviter des aller-retour
249 * multiples si les connectivités sont utilisées sur les deux à la fois.
250 *
251 * Si \a q est non nul et que \a do_prefetch vaut \a true, alors
252 * VariableUtils::prefetchVariableAsync() est appelé pour chaque variable
253 * gérant la connectivité.
254 */
255extern "C++" ARCANE_CORE_EXPORT void
256markMeshConnectivitiesAsMostlyReadOnly(IMesh* mesh,RunQueue* q = nullptr,
257 bool do_prefetch = false);
258
259/*---------------------------------------------------------------------------*/
260/*---------------------------------------------------------------------------*/
261/*
262 * \brief Retourne l'entité de la famille \a family de numéro unique \a unique_id.
263 *
264 * Si aucune entité avec cet \a unique_id n'est trouvé, retourne l'entité nulle.
265 *
266 * \pre family->hasUniqueIdMap() == true
267 */
268extern "C++" ARCANE_CORE_EXPORT impl::ItemBase
269findOneItem(IItemFamily* family, Int64 unique_id);
270
271/*---------------------------------------------------------------------------*/
272/*---------------------------------------------------------------------------*/
273/*
274 * \brief Retourne l'entité de la famille \a family de numéro unique \a unique_id.
275 *
276 * Si aucune entité avec cet \a unique_id n'est trouvé, retourne l'entité nulle.
277 *
278 * \pre family->hasUniqueIdMap() == true
279 */
280extern "C++" ARCANE_CORE_EXPORT impl::ItemBase
281findOneItem(IItemFamily* family, ItemUniqueId unique_id);
282
283/*---------------------------------------------------------------------------*/
284/*---------------------------------------------------------------------------*/
285/*!
286 * \brief Visite l'ensemble des groupes de \a family avec le functor \a functor.
287 */
288extern "C++" ARCANE_CORE_EXPORT void
289visitGroups(IItemFamily* family, IFunctorWithArgumentT<ItemGroup&>* functor);
290
291/*---------------------------------------------------------------------------*/
292/*---------------------------------------------------------------------------*/
293/*!
294 * \brief Visite l'ensemble des groupes de \a mesh avec le functor \a functor.
295 */
296extern "C++" ARCANE_CORE_EXPORT void
297visitGroups(IMesh* mesh, IFunctorWithArgumentT<ItemGroup&>* functor);
298
299/*---------------------------------------------------------------------------*/
300/*---------------------------------------------------------------------------*/
301/*!
302 * \brief Visite l'ensemble des groupes de \a family avec la lambda \a f.
303 *
304 * Cette fonction permet d'appliquer un visiteur pour l'ensemble des
305 * groupes de la famille \a family.
306 *
307 * Par exemple:
308 *
309 * \code
310 * IMesh* mesh = ...;
311 * auto xx = [](const ItemGroup& x) { std::cout << "name=" << x.name(); };
312 * MeshUtils::visitGroups(mesh,xx);
313 * \endcode
314 */
315template <typename LambdaType> inline void
316visitGroups(IItemFamily* family, const LambdaType& f)
317{
319 // Il faut caster en le bon type pour que le compilateur utilise la bonne surcharge.
321 visitGroups(family, sf_addr);
322}
323
324/*---------------------------------------------------------------------------*/
325/*---------------------------------------------------------------------------*/
326/*!
327 * \brief Visite l'ensemble des groupes de \a mesh avec la lambda \a f.
328 *
329 * Cette fonction permet d'appliquer un visiteur pour l'ensemble des
330 * groupes de l'ensemble des familles du maillage \a mesh
331 *
332 * Elle s'utilise comme suit:
333 *
334 * \code
335 * IMesh* mesh = ...;
336 * auto xx = [](const ItemGroup& x) { std::cout << "name=" << x.name(); };
337 * MeshVisitor::visitGroups(mesh,xx);
338 * \endcode
339 */
340template <typename LambdaType> inline void
341visitGroups(IMesh* mesh, const LambdaType& f)
342{
344 // Il faut caster en le bon pour que le compilateur utilise la bonne surcharge.
346 visitGroups(mesh, sf_addr);
347}
348
349namespace impl
350{
351 inline Int64 computeCapacity(Int64 size)
352 {
353 return Arcane::MemoryUtils::impl::computeCapacity(size);
354 }
355} // namespace impl
356
357/*---------------------------------------------------------------------------*/
358/*---------------------------------------------------------------------------*/
359/*!
360 * \brief Redimensionne un tableau qui est indexé par des 'ItemLocalId'.
361 *
362 * Le tableau \a array est redimensionné uniquement si \a new_size est
363 * supérieure à la taille actuelle du tableau ou si \a force_resize est vrai.
364 *
365 * Si le tableau est redimensionné, on réserve une capacité supplémentaire
366 * pour éviter de réallouer à chaque fois.
367 *
368 * Cette fonction est appelée en général pour les tableaux indexés par un
369 * ItemLocalId et donc cette fonction peut être appelée à chaque fois qu'on
370 * ajoute une entité au maillage.
371 *
372 * \retval true si un redimensionnement a eu lieu
373 * \retval false sinon
374 */
375template <typename DataType> inline bool
376checkResizeArray(Array<DataType>& array, Int64 new_size, bool force_resize)
377{
378 return Arcane::MemoryUtils::checkResizeArrayWithCapacity(array, new_size, force_resize);
379}
380
381/*---------------------------------------------------------------------------*/
382/*---------------------------------------------------------------------------*/
383/*!
384 * \brief Retourne le maximum des uniqueId() des entités standards du maillage.
385 *
386 * Les entités standards sont les noeuds, mailles, faces et arêtes.
387 * L'opération est collective sur mesh->parallelMng().
388 */
389extern "C++" ARCANE_CORE_EXPORT ItemUniqueId
390getMaxItemUniqueIdCollective(IMesh* mesh);
391
392/*---------------------------------------------------------------------------*/
393/*---------------------------------------------------------------------------*/
394/*!
395 * \brief Vérifie le hash des uniqueId() des entités d'une famille.
396 *
397 * Calcule via l'algo \a hash_algo un hash des uniqueId() des entités
398 * d'une famille. Pour ce calcul, le rang 0 récupère l'ensemble des uniqueId()
399 * des entités propres de chaque sous-domaine, les trie et calcul le hash
400 * sur le tableau trié.
401 *
402 * Comme la majorité du travail est effectuée par le rang 0, cette méthode
403 * n'est pas très extensible et ne doit donc être utilisée qu'à des fins
404 * de test.
405 *
406 * \a expected_hash est la valeur attendue du hash sous forme de caractères
407 * hexadécimaux (obtenu via Convert::toHexaString()). Si \a expected_hash
408 * est non nul, compare le résultat avec cette valeur et si elle est différente,
409 * lance une exception FatalErrorException.
410 *
411 * Cette opération est collective.
412 */
413extern "C++" ARCANE_CORE_EXPORT void
414checkUniqueIdsHashCollective(IItemFamily* family, IHashAlgorithm* hash_algo,
415 const String& expected_hash, bool print_hash_value,
416 bool include_ghost);
417
418/*---------------------------------------------------------------------------*/
419/*---------------------------------------------------------------------------*/
420/*!
421 * \brief Rempli \a uids avec les uniqueId() des entités de \a view.
422 */
423extern "C++" ARCANE_CORE_EXPORT void
424fillUniqueIds(ItemVectorView items,Array<Int64>& uids);
425
426/*---------------------------------------------------------------------------*/
427/*---------------------------------------------------------------------------*/
428
429/*!
430 * \brief Créé ou recréé une connectivité noeuds-noeuds via les arêtes.
431 *
432 * La connectivité aura pour nom \a connectivity_name.
433 */
434extern "C++" ARCANE_CORE_EXPORT Ref<IIndexedIncrementalItemConnectivity>
435computeNodeNodeViaEdgeConnectivity(IMesh* mesh, const String& connectivity_name);
436
437/*---------------------------------------------------------------------------*/
438/*---------------------------------------------------------------------------*/
439
440} // namespace Arcane::MeshUtils
441
442/*---------------------------------------------------------------------------*/
443/*---------------------------------------------------------------------------*/
444
445namespace Arcane::mesh_utils
446{
447// Using pour compatibilité avec l'existant.
448// Ces using ont été ajoutés pour la version 3.10 de Arcane (juin 2023).
449// On pourra les rendre obsolètes début 2024.
450using MeshUtils::checkMeshConnectivity;
451using MeshUtils::checkMeshProperties;
452using MeshUtils::computeConnectivityPatternOccurence;
453using MeshUtils::dumpSynchronizerTopologyJSON;
454using MeshUtils::getFaceFromNodesLocal;
455using MeshUtils::getFaceFromNodesUnique;
456using MeshUtils::printItems;
457using MeshUtils::printMeshGroupsMemoryUsage;
458using MeshUtils::removeItemAndKeepOrder;
459using MeshUtils::reorderNodesOfFace;
460using MeshUtils::reorderNodesOfFace2;
461using MeshUtils::shrinkMeshGroups;
462using MeshUtils::writeMeshConnectivity;
463using MeshUtils::writeMeshInfos;
464using MeshUtils::writeMeshInfosSorted;
465using MeshUtils::writeMeshItemInfo;
466
467/*---------------------------------------------------------------------------*/
468/*---------------------------------------------------------------------------*/
469
470} // namespace Arcane::mesh_utils
471
472/*---------------------------------------------------------------------------*/
473/*---------------------------------------------------------------------------*/
474
475#endif
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:376
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 getFaceFromNodesLocal(Node node, Int32ConstArrayView face_nodes_local_id)
Recherche une entité face à partir des numéros locaux 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.
Face getFaceFromNodesUnique(Node node, Int64ConstArrayView face_nodes_unique_id)
Recherche une entité face à partir des numéros uniques de ces noeuds.
void computeConnectivityPatternOccurence(IMesh *mesh)
Calcul et affiche les patterns communs dans les connectivités.
bool reorderNodesOfFace2(Int64ConstArrayView nodes_unique_id, IntegerArrayView new_index)
Réordonne les noeuds d'une face.
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.
Classe de base des vecteurs 1D de données.
Interface d'un fonctor avec argument mais sans valeur de retour.
Chaîne de caractères unicode.
-*- 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:615
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:640
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:609
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:638
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:611