Arcane  v3.15.0.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-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/* SplitSDMeshPartitioner.h (C) 2000-2024 */
9/* */
10/* Partitioneur de maillage reprenant le fonctionnement de SplitSD. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_FILES_SPLITSDMESHPARTITIONER_H
13#define ARCANE_FILES_SPLITSDMESHPARTITIONER_H
14
15// #define DEBUG_PARTITIONER
16
17/*---------------------------------------------------------------------------*/
18/*---------------------------------------------------------------------------*/
19#include "arcane/std/MeshPartitionerBase.h"
20
21#include "arcane/std/SplitSDMeshPartitioner_axl.h"
22
23#define MPICH_SKIP_MPICXX
24#define OMPI_SKIP_MPICXX
25#include <mpi.h>
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30ARCANE_BEGIN_NAMESPACE
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34#define TAG_MAILLAGEMAITRE 1
35
36#define CHECK_MPI_PACK_ERR(ier) \
37 if (ier != MPI_SUCCESS) { \
38 switch (ier) { \
39 case MPI_ERR_COMM:InfoProc->m_service->pfatal()<<"erreur sur MPI_Pack de type MPI_ERR_COMM"; break; \
40 case MPI_ERR_TYPE: InfoProc->m_service->pfatal()<<"erreur sur MPI_Pack de type MPI_ERR_TYPE"; break; \
41 case MPI_ERR_COUNT: InfoProc->m_service->pfatal()<<"erreur sur MPI_Pack de type MPI_ERR_COUNT"; break; \
42 case MPI_ERR_ARG: InfoProc->m_service->pfatal()<<"erreur sur MPI_Pack de type MPI_ERR_ARG"; break; \
43 default: InfoProc->m_service->pfatal()<<"erreur sur MPI_Pack de type inconnu !"; \
44 } \
45 }
46
47#ifndef CHECK_IF_NOT_NULL
61#define CHECK_IF_NOT_NULL(Ptr) \
62 if (Ptr==NULL) { \
63 InfoProc->m_service->pfatal()<<"Pointeur vaut nil, (On manque peut-etre de place memoire !!! )"; \
64 }
65#endif
66
67#ifndef MAX
68#define MAX(a,b) ((a)<(b)?(b):(a))
69#endif
70#ifndef MIN
71#define MIN(a,b) ((a)>(b)?(b):(a))
72#endif
73/*---------------------------------------------------------------------------*/
74/*---------------------------------------------------------------------------*/
78typedef struct T_InfoProc
79{
82 int me;
87// /** Numéro du processeur maître,
88// c'est sur ce processeur que sont faites l'agglomération,
89// l'insertion et le redécoupage.*/
90// int NoMaitre;
94 MPI_Comm Split_Comm;
95
98
101/*---------------------------------------------------------------------------*/
102/*---------------------------------------------------------------------------*/
122
123
124typedef struct T_BLOC_ETENDU
125{
131 Integer NbElements;
132
134 double PoidsDom;
135
137 Integer NbIntf;
138
141
142
144/*---------------------------------------------------------------------------*/
145/*---------------------------------------------------------------------------*/
150typedef struct T_ListeVoisMail
151{
158 double Delta;
160// int PoidsInterface; pas de signification ici
163
168typedef struct T_ListeDomMail
169{
174 double Poids;
181
192typedef struct T_Maillage
193{
198 double Poids;
199
206
209// /** Liste des processeurs sans sous-domaine */
210// int* ListeNoProcsVides;
211
214/*---------------------------------------------------------------------------*/
215/*---------------------------------------------------------------------------*/
222 //: public MeshPartitionerBase
223{
224 public:
225
227
228 public:
229
230 virtual void build() {}
231
232 public:
233
234 virtual void partitionMesh(bool initial_partition);
235 virtual void partitionMesh(bool initial_partition,Int32 nb_part)
236 {
237 ARCANE_UNUSED(initial_partition);
238 ARCANE_UNUSED(nb_part);
239 throw NotImplementedException(A_FUNCINFO);
240 }
241
242 private:
244 void init(bool initial_partition, StrucInfoProc* &InfoProc, StructureBlocEtendu* &Domaine, StrucMaillage* &Maillage);
245
247 void initPoids(bool initial_partition);
248
250 void fin (StrucInfoProc* &InfoProc, StructureBlocEtendu* &Domaine, StrucMaillage* &Maillage);
251
253 void MAJDomaine(StructureBlocEtendu* Domaine);
254
256 void MAJMaillageMaitre(StrucInfoProc* InfoProc, StructureBlocEtendu* Domaine, StrucMaillage* Maillage);
257
259 void verifMaillageMaitre(StrucMaillage* Maillage);
260
262 void MAJDeltaGlobal(StrucInfoProc* InfoProc, StrucMaillage* Maillage, double tolerance);
264 void MAJDelta(double don, int iDOmTmpPrec,int iDomTmp, StrucListeDomMail* ListeDomaines);
265
267 double CalculDeltaMin(StrucMaillage* Maillage, double deltaMin, int iterEquilibrage, int NbMaxIterEquil);
268
270 void Equilibrage(StrucInfoProc* InfoProc, StructureBlocEtendu* Domaine, StrucMaillage* Maillage);
271
273 void Equil2Dom(int* MasqueDesNoeuds, int* MasqueDesElements, int marqueVu, int marqueNonVu,
274 StrucInfoProc* InfoProc, StructureBlocEtendu* Domaine, StrucMaillage* Maillage,
275 int indDomCharge, int indDomVois, double Delta);
276
278 void SelectElements(int* MasqueDesNoeuds, int* MasqueDesElements, int marqueVu, int marqueNonVu,
279 StrucInfoProc* InfoProc, StructureBlocEtendu* Domaine,
280 double Delta, int indDomVois, Arcane::Array<Arcane::Cell>& ListeElements);
281
283 int ParcoursFrontalDelta (int* MasqueDesNoeuds, int* MasqueDesElements,
284 int marqueVu, int marqueNonVu,
285 double Delta,
286 int *pNbFronts, int NbFrontsMax,
287 Arcane::Array<Arcane::Node>& FrontsNoeuds, int* IndFrontsNoeuds,
288 Arcane::Array<Arcane::Cell>& FrontsElements,int* IndFrontsElements);
289
294 void LissageDuFront (int* MasqueDesNoeuds, int* MasqueDesElements,
295 int marqueVu, int marqueNonVu,
296 int NbFronts,
297 Arcane::Array<Arcane::Node>& FrontsNoeuds, int* IndFrontsNoeuds,
298 Arcane::Array<Arcane::Cell>& FrontsElements,int* IndFrontsElements);
299
301 void ConnexifieDomaine(StrucInfoProc* InfoProc, StructureBlocEtendu* Domaine, StrucMaillage* Maillage, double tolConnexite);
302
304 int getDomVoisMaxFace(Arcane::Array<Arcane::Cell>& ListeElements, int me);
305
307 int* GetMasqueDesNoeuds(StrucInfoProc* InfoProc);
309 int* GetMasqueDesElements(StrucInfoProc* InfoProc);
310
311 void LibereInfoProc(StrucInfoProc* &InfoProc);
312 void LibereDomaine(StructureBlocEtendu* &Domaine);
313 void LibereMaillage(StrucMaillage* &Maillage);
314
315 void AfficheDomaine (int NbDom, StructureBlocEtendu* Domaine);
316 void AfficheMaillage (StrucMaillage* Maillage);
317 void AfficheListeDomaines(StrucListeDomMail* ListeDomaines, int NbDomaines);
318 void AfficheEquilMaillage(StrucMaillage* Maillage);
319
320
321 void* RecoitMessage (StrucInfoProc* InfoProc, int FromProc, int Tag, int *pTailleTMP);
322 void EnvoieMessage (StrucInfoProc* InfoProc, int ToProc, int Tag, void* TabTMP, int TailleTMP);
323// MPI_Request* EnvoieIMessage(StrucInfoProc* InfoProc, int ToProc, int Tag, void* TabTMP, int TailleTMP);
324 void* DiffuseMessage(StrucInfoProc* InfoProc, int FromProc, void* TabTMP, int TailleTMP);
325
326 // taille pour le transfert sans les noeuds, seulement la taille de ListeNoeuds
327 int TailleDom(StructureBlocEtendu* Domaine);
328 // les données sont mise dans un tableau
329 void PackDom(StrucInfoProc* InfoProc, StructureBlocEtendu* Domaine, void* TabTMP, int TailleTMP, MPI_Comm comm);
330 // les données sont extraite d'un tableau
331 void UnpackDom(void* TabTMP, int TailleTMP, MPI_Comm comm, StrucListeDomMail* DomMail);
332
333 // taille pour le transfert des numéros de domaine pour Equilibrage, et du Delta
334 int TailleEquil();
335 // les données sont mise dans un tableau
336 void PackEquil(StrucInfoProc* InfoProc, int indDomCharge, int indDomVois, double Delta, void* TabTMP, int TailleTMP, MPI_Comm comm);
337 // les données sont extraite d'un tableau
338 void UnpackEquil(void* TabTMP, int TailleTMP, MPI_Comm comm, int* indDomCharge, int* indDomVois, double* Delta);
339
340
341private:
342 VariableCellReal m_poids_aux_mailles; // poids que l'on calcul une fois par appel au rééquilibrage et qui suit les cellules
343};
344/*---------------------------------------------------------------------------*/
345/*---------------------------------------------------------------------------*/
346
347ARCANE_END_NAMESPACE
348
349/*---------------------------------------------------------------------------*/
350/*---------------------------------------------------------------------------*/
351
352#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:149
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