Arcane  v3.16.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
IMeshUtilities.h
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/* IMeshUtilities.h (C) 2000-2025 */
9/* */
10/* Interface d'une classe proposant des fonctions utilitaires sur maillage. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_IMESHUTILITIES_H
13#define ARCANE_CORE_IMESHUTILITIES_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Real3.h"
18
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31/*!
32 * \brief Interface d'une classe proposant des fonctions utilitaires sur maillage.
33 */
34class ARCANE_CORE_EXPORT IMeshUtilities
35{
36 public:
37
38 virtual ~IMeshUtilities() {} //!< Libère les ressources.
39
40 public:
41
42 /*!
43 * \brief Recherche les identifiants locaux des entités à partir
44 * de leur connectivité.
45 *
46 * Prend en entrée une liste d'entités décrite par les identifiants uniques
47 * (Item::uniqueId()) de leurs noeuds et recherche les identifiants locaux (Item::localId())
48 * de ces entités.
49 *
50 * \param item_kind Genre de l'entité (IK_Cell ou IK_Face)
51 * \param items_nb_node tableau du nombre de noeuds de l'entité
52 * \param items_connectivity tableau contenant les indices uniques des noeuds des entités.
53 * \param local_ids en retour, contient les identificants locaux des
54 * entités. Le nombre d'éléments de \a local_ids doit être égal à
55 * celui de \a items_nb_node.
56 *
57 * Le tableau \a items_connectivity contient les identifiants des noeuds des entités,
58 * rangés consécutivement. Par exemple, si \c items_nb_node[0]==3 et
59 * \c items_node[1]==4, alors \a items_connectivity[0..2] contiendra les
60 * noeuds de l'entité 0, et items_connectivity[3..6] ceux de l'entité 1.
61 *
62 * Si \a allow_null est faux, une erreur fatale est générée si
63 * une entité n'est pas trouvée, sinon NULL_ITEM_LOCAL_ID est
64 * retourné pour l'entité correspondante
65 */
66 virtual void localIdsFromConnectivity(eItemKind item_kind,
67 IntegerConstArrayView items_nb_node,
68 Int64ConstArrayView items_connectivity,
69 Int32ArrayView local_ids,
70 bool allow_null=false) =0;
71
72 /*!
73 * \brief Calcule la normale d'un groupe de face.
74 *
75 * Cette méthode calcule la normale à un groupe de face en considérant que
76 * cette surface est un plan. Pour le calcul, l'algorithme essaie de
77 * déterminer les noeuds aux extrémités de cette surface, et calcule une
78 * normale à partir de ces noeuds. L'orientation de la normale (rentrante
79 * ou sortante) est indéfinie.
80 *
81 * Si la surface n'est pas plane, le résultat est indéfini.
82 *
83 * L'algorithme actuel ne fonctionne pas toujours sur une surface composée
84 * uniquement de triangles.
85 *
86 * Cette méthode est collective. L'algorithme utilisé garantit les
87 * mêmes résultats en séquentiel et en parallèle.
88 *
89 * La variable \a nodes_coord est utilisée comme coordonnées pour les noeuds.
90 * En général, il s'agit de IMesh::nodesCoordinates().
91 */
92 virtual Real3 computeNormal(const FaceGroup& face_group,
93 const VariableNodeReal3& nodes_coord) =0;
94
95 /*!
96 * \brief Calcule le vecteur directeur d'une ligne.
97 *
98 * Cette méthode calcule le vecteur directeur d'un groupe de noeuds
99 * en considérant qu'il forme une ligne. Pour le calcul, l'algorithme essaie de
100 * déterminer les noeuds aux extrémités de cette ligne, et calcule un
101 * vecteur à partir de ces noeuds. Le sens du vecteur est indéfini.
102 *
103 * Si le groupe ne forme pas une ligne, le résultat est indéfini.
104 *
105 * Cette méthode est collective. L'algorithme utilisé garantit les
106 * mêmes résultats en séquentiel et en parallèle.
107 *
108 * Si \a n1 et \a n2 ne sont pas nuls, ils contiendront en sortie
109 * les coordonnées extrèmes à partir desquelles la direction est calculée.
110 *
111 * La variable \a nodes_coord est utilisée comme coordonnées pour les noeuds.
112 * En général, il s'agit de IMesh::nodesCoordinates().
113 */
114 virtual Real3 computeDirection(const NodeGroup& node_group,
115 const VariableNodeReal3& nodes_coord,
116 Real3* n1,Real3* n2) =0;
117
118 //! Calcul des adjacences, rangées dans \a adjacency_array
119 ARCANE_DEPRECATED_REASON("Y2020: Use computeAdjacency() instead")
120 virtual void computeAdjency(ItemPairGroup adjacency_array, eItemKind link_kind,
121 Integer nb_layer) =0;
122
123 //! Calcul des adjacences, rangées dans \a adjacency_array
124 virtual void computeAdjacency(const ItemPairGroup& adjacency_array, eItemKind link_kind,
125 Integer nb_layer);
126
127 /*!
128 * \brief Positionne les nouveaux propriétaires des noeuds, arêtes
129 * et faces à partir des mailles.
130 *
131 * En considérant que les nouveaux propriétaires des mailles sont
132 * connus (et synchronisés), détermine les nouveaux propriétaires des autres
133 * entités et les synchronise.
134 *
135 * Cette méthode est collective.
136 *
137 * \note Cette méthode nécessite que les informations de synchronisations soient
138 * valides. Si on souhaite déterminer les propriétaires des entités sans
139 * information préalable, il faut utiliser computeAndSetOwnersForNodes()
140 * ou computeAndSetOwnersForFaces().
141 */
142 virtual void changeOwnersFromCells() =0;
143
144 /*!
145 * \brief Détermine les propriétaires des noeuds.
146 *
147 * La détermination se fait en fonction des propriétaires des mailles.
148 * Il ne doit pas y avoir de couches de mailles fantômes.
149 *
150 * Cette opération est collective.
151 */
153
154 /*!
155 * \brief Détermine les propriétaires des faces.
156 *
157 * La détermination se fait en fonction des propriétaires des mailles.
158 * Il ne doit pas y avoir de couches de mailles fantômes.
159 *
160 * Cette opération est collective.
161 */
163
164 /*!
165 * \brief Ecrit le maillage dans un fichier.
166 *
167 * Ecrit le maillage dans le fichier \a file_name en utilisant
168 * le service implémentant l'interface 'IMeshWriter' et de nom \a service_name.
169 *
170 * \retval true si le service spécifié n'est pas disponible.
171 * \retval false si tout est ok.
172 */
173 virtual bool writeToFile(const String& file_name,const String& service_name) =0;
174
175
176 /*!
177 * \brief Repartitionne et échange le maillage en gérant la réplication.
178 *
179 * Cette méthode effectue un repartitionnement du maillage via
180 * l'appel à IMeshPartitioner::partitionMesh(bool) et procède à l'échange
181 * des entités via IPrimaryMesh::exchangeItems().
182 *
183 * Elle mais gère aussi la réplication en s'assurant que tous les réplica
184 * ont le même maillage.
185 * Le principe est le suivant:
186 * - seul le réplica maître effectue le repartitionnement en
187 * appelant IMeshPartitioner::partitionMesh() avec \a partitioner comme partitionneur
188 * - les valeurs des IItemFamily::itemsNewOwner() sont ensuite
189 * synchronisées avec les autres réplicas.
190 * - les échanges d'entités sont effectués via IPrimaryMesh::exchangeItems().
191 *
192 * Cette méthode est collective sur l'ensemble des réplicas.
193 *
194 * \pre Tous les réplicas doivent avoir le même maillage, c'est à dire
195 * que toutes les familles d'entités doivent être identiques à l'exception
196 * des familles de particules qui ne sont pas concernées.
197 * \pre Le maillage doit être une instance de IPrimaryMesh.
198 *
199 * \post Tous les réplicas ont le même maillage à l'exception des familles
200 * de particules.
201 *
202 * \param partitioner Instance du partitionneur à utiliser
203 * \param initial_partition Indique s'il s'agit du partitionnement initial.
204 */
206 bool initial_partition) =0;
207
208 /*!
209 * \brief Fusionne des noeuds.
210 *
211 * Fusionne deux à deux les noeuds de \a nodes_to_merge_local_id avec ceux
212 * de \a nodes_local_id. Chaque noeud \a nodes_to_merge_local_id[i] est
213 * fusionné avec \a nodes_local_id[i].
214 *
215 * Les noeuds \a nodes_to_merge_local_id sont détruits après fusion. Les entités
216 * reposant entièrement sur ces noeuds fusionnés sont aussi détruites.
217 *
218 * Il est interdit de fusionner deux noeuds d'une même maille ou d'une même face
219 * (après fusion, une face ou une maille ne peut pas avoir deux fois le
220 * même noeud).
221 */
222 virtual void mergeNodes(Int32ConstArrayView nodes_local_id,
223 Int32ConstArrayView nodes_to_merge_local_id) =0;
224
225 /*!
226 * \brief Recalcule les uniqueId() des arêtes, faces et mailles en fonction
227 * des uniqueId() des noeuds.
228 *
229 * \warning Cette méthode est expérimentale et ne doit être utilisée que
230 * dans Arcane. Elle suppose que les uniqueId() des entités sont construit
231 * à partir de generateHashUniqueId().
232 */
234};
235
236/*---------------------------------------------------------------------------*/
237/*---------------------------------------------------------------------------*/
238
239} // End namespace Arcane
240
241/*---------------------------------------------------------------------------*/
242/*---------------------------------------------------------------------------*/
243
244#endif
245
Déclarations des types généraux de Arcane.
Déclarations de types sur les entités.
Interface d'un partitionneur de maillage.
Interface d'une classe proposant des fonctions utilitaires sur maillage.
virtual void changeOwnersFromCells()=0
Positionne les nouveaux propriétaires des noeuds, arêtes et faces à partir des mailles.
virtual Real3 computeNormal(const FaceGroup &face_group, const VariableNodeReal3 &nodes_coord)=0
Calcule la normale d'un groupe de face.
virtual void computeAdjency(ItemPairGroup adjacency_array, eItemKind link_kind, Integer nb_layer)=0
Calcul des adjacences, rangées dans adjacency_array.
virtual void computeAndSetOwnersForFaces()=0
Détermine les propriétaires des faces.
virtual void computeAdjacency(const ItemPairGroup &adjacency_array, eItemKind link_kind, Integer nb_layer)
Calcul des adjacences, rangées dans adjacency_array.
virtual void computeAndSetOwnersForNodes()=0
Détermine les propriétaires des noeuds.
virtual void localIdsFromConnectivity(eItemKind item_kind, IntegerConstArrayView items_nb_node, Int64ConstArrayView items_connectivity, Int32ArrayView local_ids, bool allow_null=false)=0
Recherche les identifiants locaux des entités à partir de leur connectivité.
virtual void partitionAndExchangeMeshWithReplication(IMeshPartitionerBase *partitioner, bool initial_partition)=0
Repartitionne et échange le maillage en gérant la réplication.
virtual Real3 computeDirection(const NodeGroup &node_group, const VariableNodeReal3 &nodes_coord, Real3 *n1, Real3 *n2)=0
Calcule le vecteur directeur d'une ligne.
virtual bool writeToFile(const String &file_name, const String &service_name)=0
Ecrit le maillage dans un fichier.
virtual void recomputeItemsUniqueIdFromNodesUniqueId()=0
Recalcule les uniqueId() des arêtes, faces et mailles en fonction des uniqueId() des noeuds.
virtual ~IMeshUtilities()
Libère les ressources.
virtual void mergeNodes(Int32ConstArrayView nodes_local_id, Int32ConstArrayView nodes_to_merge_local_id)=0
Fusionne des noeuds.
Tableau de listes d'entités.
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
Chaîne de caractères unicode.
ItemGroupT< Face > FaceGroup
Groupe de faces.
Definition ItemTypes.h:178
ItemGroupT< Node > NodeGroup
Groupe de noeuds.
Definition ItemTypes.h:167
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:569
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:567
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:540
eItemKind
Genre d'entité de maillage.
ConstArrayView< Integer > IntegerConstArrayView
Equivalent C d'un tableau à une dimension d'entiers.
Definition UtilsTypes.h:573