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 * Cette méthode n'est implémentée que pour les faces d'ordre 1.
47 *
48 * \deprecated Utiliser getFacesLocalIdFromConnectivity() à la place.
49 */
50 ARCANE_DEPRECATED_REASON("Y2025: Use getFacesLocalIdFromConnectivity() instead")
51 virtual void localIdsFromConnectivity(eItemKind item_kind,
52 IntegerConstArrayView items_nb_node,
53 Int64ConstArrayView items_connectivity,
54 Int32ArrayView local_ids,
55 bool allow_null=false) =0;
56
57 /*!
58 * \brief Recherche les identifiants locaux des faces à partir
59 * de leur connectivité.
60 *
61 * Prend en entrée une liste d'entités décrite par les identifiants uniques
62 * (Item::uniqueId()) de leurs noeuds et recherche les identifiants locaux (Item::localId())
63 * de ces entités.
64 *
65 * \param items_type tableau des ItemTypeId des entités
66 * \param items_connectivity tableau contenant les indices uniques des noeuds des entités.
67 * \param local_ids en retour, contient les identifiants locaux des
68 * entités. Le nombre d'éléments de \a local_ids doit être égal à
69 * celui de \a items_nb_node.
70 *
71 * Le tableau \a items_connectivity contient les identifiants des noeuds des faces,
72 * rangés consécutivement. Par exemple, si \c items_type[0]==IT_Triangle3 et
73 * \c items_type[1]==IT_Quad4, alors \a items_connectivity[0..2] contiendra les
74 * noeuds de l'entité 0, et items_connectivity[3..6] ceux de l'entité 1.
75 *
76 * Si \a allow_null est faux, une erreur fatale est générée si
77 * une entité n'est pas trouvée, sinon NULL_ITEM_LOCAL_ID est
78 * retourné pour l'entité correspondante.
79 */
81 ConstArrayView<Int64> items_connectivity,
82 ArrayView<Int32> local_ids,
83 bool allow_null = false) = 0;
84
85 /*!
86 * \brief Calcule la normale d'un groupe de face.
87 *
88 * Cette méthode calcule la normale à un groupe de face en considérant que
89 * cette surface est un plan. Pour le calcul, l'algorithme essaie de
90 * déterminer les noeuds aux extrémités de cette surface, et calcule une
91 * normale à partir de ces noeuds. L'orientation de la normale (rentrante
92 * ou sortante) est indéfinie.
93 *
94 * Si la surface n'est pas plane, le résultat est indéfini.
95 *
96 * L'algorithme actuel ne fonctionne pas toujours sur une surface composée
97 * uniquement de triangles.
98 *
99 * Cette méthode est collective. L'algorithme utilisé garantit les
100 * mêmes résultats en séquentiel et en parallèle.
101 *
102 * La variable \a nodes_coord est utilisée comme coordonnées pour les noeuds.
103 * En général, il s'agit de IMesh::nodesCoordinates().
104 */
105 virtual Real3 computeNormal(const FaceGroup& face_group,
106 const VariableNodeReal3& nodes_coord) =0;
107
108 /*!
109 * \brief Calcule le vecteur directeur d'une ligne.
110 *
111 * Cette méthode calcule le vecteur directeur d'un groupe de noeuds
112 * en considérant qu'il forme une ligne. Pour le calcul, l'algorithme essaie de
113 * déterminer les noeuds aux extrémités de cette ligne, et calcule un
114 * vecteur à partir de ces noeuds. Le sens du vecteur est indéfini.
115 *
116 * Si le groupe ne forme pas une ligne, le résultat est indéfini.
117 *
118 * Cette méthode est collective. L'algorithme utilisé garantit les
119 * mêmes résultats en séquentiel et en parallèle.
120 *
121 * Si \a n1 et \a n2 ne sont pas nuls, ils contiendront en sortie
122 * les coordonnées extrèmes à partir desquelles la direction est calculée.
123 *
124 * La variable \a nodes_coord est utilisée comme coordonnées pour les noeuds.
125 * En général, il s'agit de IMesh::nodesCoordinates().
126 */
127 virtual Real3 computeDirection(const NodeGroup& node_group,
128 const VariableNodeReal3& nodes_coord,
129 Real3* n1,Real3* n2) =0;
130
131 //! Calcul des adjacences, rangées dans \a adjacency_array
132 ARCANE_DEPRECATED_REASON("Y2020: Use computeAdjacency() instead")
133 virtual void computeAdjency(ItemPairGroup adjacency_array, eItemKind link_kind,
134 Integer nb_layer) =0;
135
136 //! Calcul des adjacences, rangées dans \a adjacency_array
137 virtual void computeAdjacency(const ItemPairGroup& adjacency_array, eItemKind link_kind,
138 Integer nb_layer);
139
140 /*!
141 * \brief Positionne les nouveaux propriétaires des noeuds, arêtes
142 * et faces à partir des mailles.
143 *
144 * En considérant que les nouveaux propriétaires des mailles sont
145 * connus (et synchronisés), détermine les nouveaux propriétaires des autres
146 * entités et les synchronise.
147 *
148 * Cette méthode est collective.
149 *
150 * \note Cette méthode nécessite que les informations de synchronisations soient
151 * valides. Si on souhaite déterminer les propriétaires des entités sans
152 * information préalable, il faut utiliser computeAndSetOwnersForNodes()
153 * ou computeAndSetOwnersForFaces().
154 */
155 virtual void changeOwnersFromCells() =0;
156
157 /*!
158 * \brief Détermine les propriétaires des noeuds.
159 *
160 * La détermination se fait en fonction des propriétaires des mailles.
161 * Il ne doit pas y avoir de couches de mailles fantômes.
162 *
163 * Cette opération est collective.
164 */
166
167 /*!
168 * \brief Détermine les propriétaires des faces.
169 *
170 * La détermination se fait en fonction des propriétaires des mailles.
171 * Il ne doit pas y avoir de couches de mailles fantômes.
172 *
173 * Cette opération est collective.
174 */
176
177 /*!
178 * \brief Ecrit le maillage dans un fichier.
179 *
180 * Ecrit le maillage dans le fichier \a file_name en utilisant
181 * le service implémentant l'interface 'IMeshWriter' et de nom \a service_name.
182 *
183 * \retval true si le service spécifié n'est pas disponible.
184 * \retval false si tout est ok.
185 */
186 virtual bool writeToFile(const String& file_name,const String& service_name) =0;
187
188
189 /*!
190 * \brief Repartitionne et échange le maillage en gérant la réplication.
191 *
192 * Cette méthode effectue un repartitionnement du maillage via
193 * l'appel à IMeshPartitioner::partitionMesh(bool) et procède à l'échange
194 * des entités via IPrimaryMesh::exchangeItems().
195 *
196 * Elle mais gère aussi la réplication en s'assurant que tous les réplica
197 * ont le même maillage.
198 * Le principe est le suivant:
199 * - seul le réplica maître effectue le repartitionnement en
200 * appelant IMeshPartitioner::partitionMesh() avec \a partitioner comme partitionneur
201 * - les valeurs des IItemFamily::itemsNewOwner() sont ensuite
202 * synchronisées avec les autres réplicas.
203 * - les échanges d'entités sont effectués via IPrimaryMesh::exchangeItems().
204 *
205 * Cette méthode est collective sur l'ensemble des réplicas.
206 *
207 * \pre Tous les réplicas doivent avoir le même maillage, c'est à dire
208 * que toutes les familles d'entités doivent être identiques à l'exception
209 * des familles de particules qui ne sont pas concernées.
210 * \pre Le maillage doit être une instance de IPrimaryMesh.
211 *
212 * \post Tous les réplicas ont le même maillage à l'exception des familles
213 * de particules.
214 *
215 * \param partitioner Instance du partitionneur à utiliser
216 * \param initial_partition Indique s'il s'agit du partitionnement initial.
217 */
219 bool initial_partition) =0;
220
221 /*!
222 * \brief Fusionne des noeuds.
223 *
224 * Fusionne deux à deux les noeuds de \a nodes_to_merge_local_id avec ceux
225 * de \a nodes_local_id. Chaque noeud \a nodes_to_merge_local_id[i] est
226 * fusionné avec \a nodes_local_id[i].
227 *
228 * Les noeuds \a nodes_to_merge_local_id sont détruits après fusion. Les entités
229 * reposant entièrement sur ces noeuds fusionnés sont aussi détruites.
230 *
231 * Il est interdit de fusionner deux noeuds d'une même maille ou d'une même face
232 * (après fusion, une face ou une maille ne peut pas avoir deux fois le
233 * même noeud).
234 */
235 virtual void mergeNodes(Int32ConstArrayView nodes_local_id,
236 Int32ConstArrayView nodes_to_merge_local_id) =0;
237
238 /*!
239 * \brief Recalcule les uniqueId() des arêtes, faces et mailles en fonction
240 * des uniqueId() des noeuds.
241 *
242 * \warning Cette méthode est expérimentale et ne doit être utilisée que
243 * dans Arcane. Elle suppose que les uniqueId() des entités sont construit
244 * à partir de generateHashUniqueId().
245 */
247};
248
249/*---------------------------------------------------------------------------*/
250/*---------------------------------------------------------------------------*/
251
252} // End namespace Arcane
253
254/*---------------------------------------------------------------------------*/
255/*---------------------------------------------------------------------------*/
256
257#endif
258
Déclarations des types généraux de Arcane.
Déclarations de types sur les entités.
Vue modifiable d'un tableau d'un type T.
Vue constante d'un tableau de type T.
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 getFacesLocalIdFromConnectivity(ConstArrayView< ItemTypeId > items_type, ConstArrayView< Int64 > items_connectivity, ArrayView< Int32 > local_ids, bool allow_null=false)=0
Recherche les identifiants locaux des faces à 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.
Type d'une entité (Item).
Definition ItemTypeId.h:32
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 -*-
std::int64_t Int64
Type entier signé sur 64 bits.
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
std::int32_t Int32
Type entier signé sur 32 bits.