Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ParallelAMRConsistency.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/* ParallelAMRConsistency.h (C) 2000-2024 */
9/* */
10/* Gestion de la consistance de l'AMR en parallèle. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_MESH_PARALLELAMRCONSISTENCY_H
13#define ARCANE_MESH_PARALLELAMRCONSISTENCY_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/String.h"
18#include "arcane/utils/HashTableMap.h"
19#include "arcane/utils/Real3.h"
20
21#include "arcane/IMesh.h"
22#include "arcane/ItemGroup.h"
23#include "arcane/Item.h"
24#include "arcane/VariableTypes.h"
25
26#include "arcane/mesh/DynamicMeshKindInfos.h"
27
28#include "arcane/utils/PerfCounterMng.h"
29
30#include <unordered_set>
31#include <unordered_map>
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36namespace Arcane::mesh
37{
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
42
44{
45public:
46 Integer size() const
47 {
48 return m_nodes_unique_id.size();
49 }
51 {
52 m_nodes_unique_id.add(node_unique_id);
53 }
54 void set(Integer i, ItemUniqueId node_unique_id)
55 {
56 m_nodes_unique_id[i] = node_unique_id;
57 }
58public:
59 SharedArray<ItemUniqueId> m_nodes_unique_id;
60};
61
62/*---------------------------------------------------------------------------*/
63/*---------------------------------------------------------------------------*/
64
66{
67 public:
68 NodeInfo() : m_unique_id(NULL_ITEM_ID), m_owner(A_NULL_RANK)
69 {
70 }
71 NodeInfo(ItemUniqueId node_uid, Integer aowner) :
72 m_unique_id(node_uid), m_owner(aowner)
73 {
74 }
75 public:
76 ItemUniqueId uniqueId() const
77 {
78 return m_unique_id;
79 }
80 void addConnectedFace(ItemUniqueId uid)
81 {
82 for (Integer i = 0, is = m_connected_active_faces.size(); i < is; ++i)
83 if (m_connected_active_faces[i] == uid)
84 return;
86 }
87 void setCoord(Real3 coord)
88 {
89 m_coord = coord;
90 }
91 Real3 getCoord() const
92 {
93 return m_coord;
94 }
95 Integer owner() const
96 {
97 return m_owner;
98 }
99private:
103 Integer m_owner;
106
107public:
108
111};
112
113/*---------------------------------------------------------------------------*/
114/*---------------------------------------------------------------------------*/
122{
123public:
124 FaceInfo() :
125 m_unique_id(NULL_ITEM_ID), m_owner(A_NULL_RANK), m_nb_node(0), m_data_index(-1), m_mng(0)
126 {
127 }
128 FaceInfo(
131 Integer nb_node,
132 Integer owner,
133 Integer data_index,
134 FaceInfoMng* mng) :
135 m_unique_id(unique_id), m_cell_unique_id(cell_unique_id), m_owner(owner), m_nb_node(nb_node),
136 m_data_index(data_index), m_mng(mng)
137 {
138 }
139public:
140 ItemUniqueId uniqueId() const
141 {
142 return m_unique_id;
143 }
144 ItemUniqueId cellUniqueId() const
145 {
146 return m_cell_unique_id;
147 }
148 Integer nbNode() const
149 {
150 return m_nb_node;
151 }
152 ItemUniqueId nodeUniqueId(Integer i) const
153 {
154 return m_mng->m_nodes_unique_id[m_data_index + i];
155 }
156 void setNodeUniqueId(Integer i, const ItemUniqueId& uid)
157 {
158 m_mng->m_nodes_unique_id[m_data_index + i] = uid;
159 }
160 Integer owner() const
161 {
162 return m_owner;
163 }
164 void setCenter(Real3 center)
165 {
166 m_center = center;
167 }
168 Real3 center() const
169 {
170 return m_center;
171 }
172 Integer getDataIndex()
173 {
174 return m_data_index;
175 }
176private:
177 ItemUniqueId m_unique_id;
178 ItemUniqueId m_cell_unique_id;
179 Integer m_owner;
180 Integer m_nb_node;
181 Real3 m_center;
182public:
183 Integer m_data_index;
184 FaceInfoMng* m_mng;
185};
186
187/*---------------------------------------------------------------------------*/
188/*---------------------------------------------------------------------------*/
196{
197 public:
198 FaceInfo2()
199 : m_unique_id(NULL_ITEM_ID), m_owner(A_NULL_RANK) { }
201 : m_unique_id(unique_id), m_owner(aowner) { }
202 public:
203 ItemUniqueId uniqueId() const
204 {
205 return m_unique_id;
206 }
207 Integer owner() const
208 {
209 return m_owner;
210 }
211 void setCenter(Real3 center)
212 {
213 m_center = center;
214 }
215 Real3 center() const
216 {
217 return m_center;
218 }
219
220 private:
221 ItemUniqueId m_unique_id;
222 Int32 m_owner;
223 Real3 m_center;
224};
225
226/*---------------------------------------------------------------------------*/
227/*---------------------------------------------------------------------------*/
228
230: public TraceAccessor
231{
232 public:
233
239
240
241 typedef std::unordered_set<Int64> ItemUidSet;
242 typedef std::unordered_map<Int64,Item> ItemMap;
243 typedef std::pair<Int64,Item> ItemMapValue;
244
245
246#ifdef ACTIVATE_PERF_COUNTER
247 struct PerfCounter
248 {
249 typedef enum {
250 INIT,
251 COMPUTE,
253 UPDATE,
254 REHASH,
255 ENDUPDATE,
257 } eType ;
258
259 static const std::string m_names[NbCounters] ;
260 } ;
261#endif
262public:
264
265public:
266 void init() ;
267 void invalidate() ;
268 bool isUpdated() const {
269 return m_is_updated ;
270 }
271 void update() {
272 if(!m_is_updated) init() ;
273 }
277 void changeOwnersOld();
278
279#ifdef ACTIVATE_PERF_COUNTER
281 return m_perf_counter ;
282 }
283#endif
284private:
285
286 IMesh* m_mesh;
287 VariableNodeReal3 m_nodes_coord;
288 FaceInfoMng m_face_info_mng;
289 NodeInfoList m_nodes_info;
290 NodeInfoList m_active_nodes;
291 FaceInfoMap m_active_faces;
292 FaceInfoMap2 m_active_faces2;
293 String m_active_face_name;
294 FaceGroup m_active_face_group;
295
296 bool m_is_updated ;
297 UniqueArray<Int64> m_shared_face_uids ;
298 UniqueArray<Int64> m_connected_shared_face_uids ;
299
300#ifdef ACTIVATE_PERF_COUNTER
301 PerfCounterMng<PerfCounter> m_perf_counter ;
302#endif
303private:
304
305 bool _isInsideFace(const FaceInfo& face, Real3 point);
306
312 ItemUidSet& updated_face_uids,
313 ItemUidSet& updated_node_uids);
314
315 void _update(Array<ItemUniqueId>& nodes_unique_id, NodeInfoList const& nodes_info) ;
316
323
324 void _gatherAllNodesInfo();
325
326 void _printFaces(std::ostream& o, FaceInfoMap& face_map);
327
328 void _addFaceToList(Face face, FaceInfoMap& face_map);
329
330 void _addFaceToList2(Face face, FaceInfoMap2& face_map);
331 void _addNodeToList(Node node, NodeInfoList& node_map);
332 bool _hasSharedNodes(Face face);
333};
334
335/*---------------------------------------------------------------------------*/
336/*---------------------------------------------------------------------------*/
337
338} // End namespace Arcane::mesh
339
340/*---------------------------------------------------------------------------*/
341/*---------------------------------------------------------------------------*/
342
343#endif /* PARALLELAMRCONSISTENCY_H_ */
Face d'une maille.
Definition Item.h:932
Identifiant unique d'une entité.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Noeud d'un maillage.
Definition Dom.h:204
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
Infos sur une Face active.
Infos sur une Face active.
structure de recherche d'un noeud à partir de ses coords La clef de hashage est la position geometriq...
Integer m_owner
propriétaire du noeud
ItemUniqueId m_unique_id
Numéro de ce noeud.
Real3 m_coord
Coordonnées de ce noeud.
SharedArray< ItemUniqueId > m_connected_active_faces
Liste des uniqueId() des faces actives auquel ce noeud peut être connecté
void makeNewItemsConsistent2(MapCoordToUid &node_finder, MapCoordToUid &face_finder)
Détermine les faces à envoyer aux voisins.
void makeNewItemsConsistent(NodeMapCoordToUid &node_finder, FaceMapCoordToUid &face_finder)
Détermine les faces à envoyer aux voisins.
void _gatherFaces(ConstArrayView< ItemUniqueId > faces_to_send, ConstArrayView< ItemUniqueId > nodes_to_send, FaceInfoMap &face_map, MapCoordToUid &node_finder, MapCoordToUid &face_finder, ItemUidSet &updated_face_uids, ItemUidSet &updated_node_uids)
void _gatherItems(ConstArrayView< ItemUniqueId > nodes_to_send, ConstArrayView< ItemUniqueId > faces_to_send, NodeInfoList &node_map, FaceInfoMap2 &face_map, MapCoordToUid &node_finder, MapCoordToUid &face_finder)
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).