Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
SplitSDMeshPartitioner.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/* SplitSDMeshPartitioner.h (C) 2008 */
9/* */
10/* Partitioneur de maillage reprenant le fonctionnement (simplifié) de SplitSD
11 utilisé à Dassault Aviation et développé à l'ONERA par EB en 1996-99
12*/
13/*---------------------------------------------------------------------------*/
14#ifndef ARCANE_FILES_SPLITSDMESHPARTITIONER_H
15#define ARCANE_FILES_SPLITSDMESHPARTITIONER_H
16
17// #define DEBUG_PARTITIONER
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21#include "arcane/std/MeshPartitionerBase.h"
22
23#include "arcane/cea/SplitSDMeshPartitioner_axl.h"
24
25
26#define MPICH_SKIP_MPICXX
27#define OMPI_SKIP_MPICXX
28#include <mpi.h>
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33ARCANE_BEGIN_NAMESPACE
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37#define TAG_MAILLAGEMAITRE 1
38
39#define CHECK_MPI_PACK_ERR(ier) \
40 if (ier != MPI_SUCCESS) { \
41 switch (ier) { \
42 case MPI_ERR_COMM:InfoProc->m_service->pfatal()<<"erreur sur MPI_Pack de type MPI_ERR_COMM"; break; \
43 case MPI_ERR_TYPE: InfoProc->m_service->pfatal()<<"erreur sur MPI_Pack de type MPI_ERR_TYPE"; break; \
44 case MPI_ERR_COUNT: InfoProc->m_service->pfatal()<<"erreur sur MPI_Pack de type MPI_ERR_COUNT"; break; \
45 case MPI_ERR_ARG: InfoProc->m_service->pfatal()<<"erreur sur MPI_Pack de type MPI_ERR_ARG"; break; \
46 default: InfoProc->m_service->pfatal()<<"erreur sur MPI_Pack de type inconnu !"; \
47 } \
48 }
49
50#ifndef CHECK_IF_NOT_NULL
64#define CHECK_IF_NOT_NULL(Ptr) \
65 if (Ptr==NULL) { \
66 InfoProc->m_service->pfatal()<<"Pointeur vaut nil, (On manque peut-etre de place memoire !!! )"; \
67 }
68#endif
69
70#ifndef MAX
71#define MAX(a,b) ((a)<(b)?(b):(a))
72#endif
73#ifndef MIN
74#define MIN(a,b) ((a)>(b)?(b):(a))
75#endif
76/*---------------------------------------------------------------------------*/
77/*---------------------------------------------------------------------------*/
81typedef struct T_InfoProc
82{
85 int me;
90// /** Numéro du processeur maître,
91// c'est sur ce processeur que sont faites l'agglomération,
92// l'insertion et le redécoupage.*/
93// int NoMaitre;
97 MPI_Comm Split_Comm;
98
101
104/*---------------------------------------------------------------------------*/
105/*---------------------------------------------------------------------------*/
125
126
127typedef struct T_BLOC_ETENDU
128{
134 Integer NbElements;
135
137 double PoidsDom;
138
140 Integer NbIntf;
141
144
145
147/*---------------------------------------------------------------------------*/
148/*---------------------------------------------------------------------------*/
153typedef struct T_ListeVoisMail
154{
161 double Delta;
163// int PoidsInterface; pas de signification ici
166
171typedef struct T_ListeDomMail
172{
177 double Poids;
184
195typedef struct T_Maillage
196{
201 double Poids;
202
209
212// /** Liste des processeurs sans sous-domaine */
213// int* ListeNoProcsVides;
214
217/*---------------------------------------------------------------------------*/
218/*---------------------------------------------------------------------------*/
225 //: public MeshPartitionerBase
226{
227 public:
228
230
231 public:
232
233 virtual void build() {}
234
235 public:
236
237 virtual void partitionMesh(bool initial_partition);
238 virtual void partitionMesh(bool initial_partition,Int32 nb_part)
239 {
240 ARCANE_UNUSED(initial_partition);
241 ARCANE_UNUSED(nb_part);
242 throw NotImplementedException(A_FUNCINFO);
243 }
244
245 private:
247 void init(bool initial_partition, StrucInfoProc* &InfoProc, StructureBlocEtendu* &Domaine, StrucMaillage* &Maillage);
248
250 void initPoids(bool initial_partition);
251
253 void fin (StrucInfoProc* &InfoProc, StructureBlocEtendu* &Domaine, StrucMaillage* &Maillage);
254
256 void MAJDomaine(StructureBlocEtendu* Domaine);
257
259 void MAJMaillageMaitre(StrucInfoProc* InfoProc, StructureBlocEtendu* Domaine, StrucMaillage* Maillage);
260
262 void verifMaillageMaitre(StrucMaillage* Maillage);
263
265 void MAJDeltaGlobal(StrucInfoProc* InfoProc, StrucMaillage* Maillage, double tolerance);
267 void MAJDelta(double don, int iDOmTmpPrec,int iDomTmp, StrucListeDomMail* ListeDomaines);
268
270 double CalculDeltaMin(StrucMaillage* Maillage, double deltaMin, int iterEquilibrage, int NbMaxIterEquil);
271
273 void Equilibrage(StrucInfoProc* InfoProc, StructureBlocEtendu* Domaine, StrucMaillage* Maillage);
274
276 void Equil2Dom(int* MasqueDesNoeuds, int* MasqueDesElements, int marqueVu, int marqueNonVu,
277 StrucInfoProc* InfoProc, StructureBlocEtendu* Domaine, StrucMaillage* Maillage,
278 int indDomCharge, int indDomVois, double Delta);
279
281 void SelectElements(int* MasqueDesNoeuds, int* MasqueDesElements, int marqueVu, int marqueNonVu,
282 StrucInfoProc* InfoProc, StructureBlocEtendu* Domaine,
283 double Delta, int indDomVois, Arcane::Array<Arcane::Cell>& ListeElements);
284
286 int ParcoursFrontalDelta (int* MasqueDesNoeuds, int* MasqueDesElements,
287 int marqueVu, int marqueNonVu,
288 double Delta,
289 int *pNbFronts, int NbFrontsMax,
290 Arcane::Array<Arcane::Node>& FrontsNoeuds, int* IndFrontsNoeuds,
291 Arcane::Array<Arcane::Cell>& FrontsElements,int* IndFrontsElements);
292
297 void LissageDuFront (int* MasqueDesNoeuds, int* MasqueDesElements,
298 int marqueVu, int marqueNonVu,
299 int NbFronts,
300 Arcane::Array<Arcane::Node>& FrontsNoeuds, int* IndFrontsNoeuds,
301 Arcane::Array<Arcane::Cell>& FrontsElements,int* IndFrontsElements);
302
304 void ConnexifieDomaine(StrucInfoProc* InfoProc, StructureBlocEtendu* Domaine, StrucMaillage* Maillage, double tolConnexite);
305
307 int getDomVoisMaxFace(Arcane::Array<Arcane::Cell>& ListeElements, int me);
308
310 int* GetMasqueDesNoeuds(StrucInfoProc* InfoProc);
312 int* GetMasqueDesElements(StrucInfoProc* InfoProc);
313
314 void LibereInfoProc(StrucInfoProc* &InfoProc);
315 void LibereDomaine(StructureBlocEtendu* &Domaine);
316 void LibereMaillage(StrucMaillage* &Maillage);
317
318 void AfficheDomaine (int NbDom, StructureBlocEtendu* Domaine);
319 void AfficheMaillage (StrucMaillage* Maillage);
320 void AfficheListeDomaines(StrucListeDomMail* ListeDomaines, int NbDomaines);
321 void AfficheEquilMaillage(StrucMaillage* Maillage);
322
323
324 void* RecoitMessage (StrucInfoProc* InfoProc, int FromProc, int Tag, int *pTailleTMP);
325 void EnvoieMessage (StrucInfoProc* InfoProc, int ToProc, int Tag, void* TabTMP, int TailleTMP);
326// MPI_Request* EnvoieIMessage(StrucInfoProc* InfoProc, int ToProc, int Tag, void* TabTMP, int TailleTMP);
327 void* DiffuseMessage(StrucInfoProc* InfoProc, int FromProc, void* TabTMP, int TailleTMP);
328
329 // taille pour le transfert sans les noeuds, seulement la taille de ListeNoeuds
330 int TailleDom(StructureBlocEtendu* Domaine);
331 // les données sont mise dans un tableau
332 void PackDom(StrucInfoProc* InfoProc, StructureBlocEtendu* Domaine, void* TabTMP, int TailleTMP, MPI_Comm comm);
333 // les données sont extraite d'un tableau
334 void UnpackDom(void* TabTMP, int TailleTMP, MPI_Comm comm, StrucListeDomMail* DomMail);
335
336 // taille pour le transfert des numéros de domaine pour Equilibrage, et du Delta
337 int TailleEquil();
338 // les données sont mise dans un tableau
339 void PackEquil(StrucInfoProc* InfoProc, int indDomCharge, int indDomVois, double Delta, void* TabTMP, int TailleTMP, MPI_Comm comm);
340 // les données sont extraite d'un tableau
341 void UnpackEquil(void* TabTMP, int TailleTMP, MPI_Comm comm, int* indDomCharge, int* indDomVois, double* Delta);
342
343
344private:
345 VariableCellReal m_poids_aux_mailles; // poids que l'on calcul une fois par appel au rééquilibrage et qui suit les cellules
346};
347/*---------------------------------------------------------------------------*/
348/*---------------------------------------------------------------------------*/
349
350ARCANE_END_NAMESPACE
351
352/*---------------------------------------------------------------------------*/
353/*---------------------------------------------------------------------------*/
354
355#endif
Classe de base d'un service.
Generation de la classe de base du Service.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Structure contenant les informations pour créer un service.
Partitioneur de maillage inspiré de la bibliothèque SplitSD, développé initialement à l'ONERA pour Da...
virtual void build()
Construction de niveau build du service.
Exception lorsqu'une fonction n'est pas implémentée.
Arcane::AbstractService * m_service
Pour la gestion des traces (messages, erreurs, fatal ...)
StrucListeVoisMail * ListeVoisins
StrucListeDomMail * ListeDomaines
StructureInterface * Intf
Arcane::UniqueArray< Arcane::Node > ListeNoeuds