Arcane  v3.14.10.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-2022 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-2021 */
9/* */
10/* Interface d'une classe proposant des fonctions utilitaires sur maillage. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_IMESHUTILITIES_H
13#define ARCANE_IMESHUTILITIES_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Real3.h"
18
19#include "arcane/ArcaneTypes.h"
20#include "arcane/ItemTypes.h"
21#include "arcane/VariableTypedef.h"
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 adjency_array
119 virtual void computeAdjency(ItemPairGroup adjency_array,eItemKind link_kind,
120 Integer nb_layer) =0;
121
122 /*!
123 * \brief Positionne les nouveaux propriétaires des noeuds, arêtes
124 * et faces à partir des mailles.
125 *
126 * En considérant que les nouveaux propriétaires des mailles sont
127 * connus (et synchronisés), détermine les nouveaux propriétaires des autres
128 * entités et les synchronise.
129 */
130 virtual void changeOwnersFromCells() =0;
131
132 /*!
133 * \brief Ecrit le maillage dans un fichier.
134 *
135 * Ecrit le maillage dans le fichier \a file_name en utilisant
136 * le service implémentant l'interface 'IMeshWriter' et de nom \a service_name.
137 *
138 * \retval true si le service spécifié n'est pas disponible.
139 * \retval false si tout est ok.
140 */
141 virtual bool writeToFile(const String& file_name,const String& service_name) =0;
142
143
144 /*!
145 * \brief Repartitionne et échange le maillage en gérant la réplication.
146 *
147 * Cette méthode effectue un repartitionnement du maillage via
148 * l'appel à IMeshPartitioner::partitionMesh(bool) et procède à l'échange
149 * des entités via IPrimaryMesh::exchangeItems().
150 *
151 * Elle mais gère aussi la réplication en s'assurant que tous les réplica
152 * ont le même maillage.
153 * Le principe est le suivant:
154 * - seul le réplica maître effectue le repartitionnement en
155 * appelant IMeshPartitioner::partitionMesh() avec \a partitioner comme partitionneur
156 * - les valeurs des IItemFamily::itemsNewOwner() sont ensuite
157 * synchronisées avec les autres réplicas.
158 * - les échanges d'entités sont effectués via IPrimaryMesh::exchangeItems().
159 *
160 * Cette méthode est collective sur l'ensemble des réplicas.
161 *
162 * \pre Tous les réplicas doivent avoir le même maillage, c'est à dire
163 * que toutes les familles d'entités doivent être identiques à l'exception
164 * des familles de particules qui ne sont pas concernées.
165 * \pre Le maillage doit être une instance de IPrimaryMesh.
166 *
167 * \post Tous les réplicas ont le même maillage à l'exception des familles
168 * de particules.
169 *
170 * \param partitioner Instance du partitionneur à utiliser
171 * \param initial_partition Indique s'il s'agit du partitionnement initial.
172 */
174 bool initial_partition) =0;
175
176 /*!
177 * \brief Fusionne des noeuds.
178 *
179 * Fusionne deux à deux les noeuds de \a nodes_to_merge_local_id avec ceux
180 * de \a nodes_local_id. Chaque noeud \a nodes_to_merge_local_id[i] est
181 * fusionné avec \a nodes_local_id[i].
182 *
183 * Les noeuds \a nodes_to_merge_local_id sont détruits après fusion. Les entités
184 * reposant entièrement sur ces noeuds fusionnés sont aussi détruites.
185 *
186 * Il est interdit de fusionner deux noeuds d'une même maille ou d'une même face
187 * (après fusion, une face ou une maille ne peut pas avoir deux fois le
188 * même noeud).
189 */
190 virtual void mergeNodes(Int32ConstArrayView nodes_local_id,
191 Int32ConstArrayView nodes_to_merge_local_id) =0;
192};
193
194/*---------------------------------------------------------------------------*/
195/*---------------------------------------------------------------------------*/
196
197} // End namespace Arcane
198
199/*---------------------------------------------------------------------------*/
200/*---------------------------------------------------------------------------*/
201
202#endif
203
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 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 computeAdjency(ItemPairGroup adjency_array, eItemKind link_kind, Integer nb_layer)=0
Calcul des adjacences, rangées dans adjency_array.
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 ~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
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.