Arcane  v3.15.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-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/* IMeshUtilities.h (C) 2000-2024 */
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 virtual void changeOwnersFromCells() =0;
136
137 /*!
138 * \brief Ecrit le maillage dans un fichier.
139 *
140 * Ecrit le maillage dans le fichier \a file_name en utilisant
141 * le service implémentant l'interface 'IMeshWriter' et de nom \a service_name.
142 *
143 * \retval true si le service spécifié n'est pas disponible.
144 * \retval false si tout est ok.
145 */
146 virtual bool writeToFile(const String& file_name,const String& service_name) =0;
147
148
149 /*!
150 * \brief Repartitionne et échange le maillage en gérant la réplication.
151 *
152 * Cette méthode effectue un repartitionnement du maillage via
153 * l'appel à IMeshPartitioner::partitionMesh(bool) et procède à l'échange
154 * des entités via IPrimaryMesh::exchangeItems().
155 *
156 * Elle mais gère aussi la réplication en s'assurant que tous les réplica
157 * ont le même maillage.
158 * Le principe est le suivant:
159 * - seul le réplica maître effectue le repartitionnement en
160 * appelant IMeshPartitioner::partitionMesh() avec \a partitioner comme partitionneur
161 * - les valeurs des IItemFamily::itemsNewOwner() sont ensuite
162 * synchronisées avec les autres réplicas.
163 * - les échanges d'entités sont effectués via IPrimaryMesh::exchangeItems().
164 *
165 * Cette méthode est collective sur l'ensemble des réplicas.
166 *
167 * \pre Tous les réplicas doivent avoir le même maillage, c'est à dire
168 * que toutes les familles d'entités doivent être identiques à l'exception
169 * des familles de particules qui ne sont pas concernées.
170 * \pre Le maillage doit être une instance de IPrimaryMesh.
171 *
172 * \post Tous les réplicas ont le même maillage à l'exception des familles
173 * de particules.
174 *
175 * \param partitioner Instance du partitionneur à utiliser
176 * \param initial_partition Indique s'il s'agit du partitionnement initial.
177 */
178 virtual void partitionAndExchangeMeshWithReplication(IMeshPartitionerBase* partitioner,
179 bool initial_partition) =0;
180
181 /*!
182 * \brief Fusionne des noeuds.
183 *
184 * Fusionne deux à deux les noeuds de \a nodes_to_merge_local_id avec ceux
185 * de \a nodes_local_id. Chaque noeud \a nodes_to_merge_local_id[i] est
186 * fusionné avec \a nodes_local_id[i].
187 *
188 * Les noeuds \a nodes_to_merge_local_id sont détruits après fusion. Les entités
189 * reposant entièrement sur ces noeuds fusionnés sont aussi détruites.
190 *
191 * Il est interdit de fusionner deux noeuds d'une même maille ou d'une même face
192 * (après fusion, une face ou une maille ne peut pas avoir deux fois le
193 * même noeud).
194 */
195 virtual void mergeNodes(Int32ConstArrayView nodes_local_id,
196 Int32ConstArrayView nodes_to_merge_local_id) =0;
197};
198
199/*---------------------------------------------------------------------------*/
200/*---------------------------------------------------------------------------*/
201
202} // End namespace Arcane
203
204/*---------------------------------------------------------------------------*/
205/*---------------------------------------------------------------------------*/
206
207#endif
208
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 Real3 computeNormal(const FaceGroup &face_group, const VariableNodeReal3 &nodes_coord)=0
Calcule la normale d'un groupe de face.
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 Real3 computeDirection(const NodeGroup &node_group, const VariableNodeReal3 &nodes_coord, Real3 *n1, Real3 *n2)=0
Calcule le vecteur directeur d'une ligne.
virtual ~IMeshUtilities()
Libère les ressources.
Tableau de listes d'entités.
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
Vue modifiable d'un tableau d'un type T.
Vue constante d'un tableau de type T.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eItemKind
Genre d'entité de maillage.