Arcane  v3.16.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/*---------------------------------------------------------------------------*/
108
109
110typedef struct T_INTERFACE
111{
115
120
122
123
124typedef struct T_BLOC_ETENDU
125{
129
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/*---------------------------------------------------------------------------*/
220class SplitSDMeshPartitioner
222 //: public MeshPartitionerBase
223{
224 public:
225
226 SplitSDMeshPartitioner(const ServiceBuildInfo& sbi);
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.
ArcaneSplitSDMeshPartitionerObject(const Arcane::ServiceBuildInfo &sbi)
Constructeur.
Tableau d'items de types quelconques.
Exception lorsqu'une fonction n'est pas implémentée.
Structure contenant les informations pour créer un service.
virtual void build()
Construction de niveau build du service.
Vecteur 1D de données avec sémantique par valeur (style STL).
std::int32_t Int32
Type entier signé sur 32 bits.
Arcane::AbstractService * m_service
Pour la gestion des traces (messages, erreurs, fatal ...)
StrucListeVoisMail * ListeVoisins
StrucListeDomMail * ListeDomaines
StructureInterface * Intf
Arcane::UniqueArray< Arcane::Node > ListeNoeuds