16#include <Descripteur_FT.h>
17#include <Comm_Group.h>
19#include <communications.h>
20#include <Array_tools.h>
21#include <MD_Vector_std.h>
32 const int n_proc =
nproc();
34 pe_voisins_.resize_array(n_proc);
35 pe_voisins_.resize_array(0);
36 elements_.dimensionner(n_proc);
41 const int n =
nproc();
43 for (
int i = 0; i < n; i++)
44 elements_[i] = src.elements_[i];
45 pe_voisins_ = src.pe_voisins_;
56 Cerr <<
"Erreur dans Descripteur_FT::readOn\n";
57 Cerr <<
" On attendait le motcle " <<
que_suis_je();
58 Cerr <<
"\n On a trouve " << motlu << finl;
63 const int nb_pe_voisins = pe_voisins_.size_array();
64 for (i = 0; i < nb_pe_voisins; i++)
66 int pe = pe_voisins_[i];
74 const int nb_pe_voisins = pe_voisins_.size_array();
78 for (i = 0; i < nb_pe_voisins; i++)
80 int pe = pe_voisins_[i];
89 const int n = elements_.size();
90 for (i = 0; i < n; i++)
92 elements_[i].resize_array(0);
94 pe_voisins_.resize_array(0);
105 ArrOfInt& elements_voisins = elements_[PE_voisin];
118 ArrOfInt& elements_voisins = elements_[PE_voisin];
119 append_array_to_array(elements_voisins, NVelements);
128 const ArrOfInt& new_elements)
130 ArrOfInt& elements_voisins = elements_[PE_voisin];
131 elements_voisins = new_elements;
140 const ArrOfInt& elems = elements_[pe];
143 for (i = 0; i < n ; i++)
144 if (elems[i] == element)
return 1;
155 pe_voisins_.resize_array(0);
156 const int n = elements_.size();
159 for (
int i = 0; i < n; i++)
160 if (elements_[i].size_array() > 0)
161 pe_voisins_.append_array(i);
179 static ArrOfIntFT new_elements;
181 elements_retires.
reset();
184 int nb_voisins = pe_voisins_.size_array();
186 for (index_pe = 0; index_pe < nb_voisins; index_pe++)
189 int pe = pe_voisins_[index_pe];
190 const ArrOfInt& elements_voisins = elements_[pe];
191 ArrOfInt& elem_retires = elements_retires.elements_[pe];
195 for (i = 0; i < n; i++)
197 const int element = elements_voisins[i];
198 const int new_pe = nouveau_pe[element];
229 Cerr <<
"Erreur dans Desc_Structure_FT::readOn\n";
230 Cerr <<
" On attendait le motcle " <<
que_suis_je();
231 Cerr <<
"\n On a trouve " << motlu << finl;
307 const int nb_proc =
nproc();
318 int max_num_element = 0;
322 for (i = 0; i < npe; i++)
324 const int pe_voisin = pe_list[i];
326 if (valeur_max > max_num_element)
327 max_num_element = valeur_max;
333 for (i = 0; i < npe; i++)
335 const int pe_voisin = pe_list[i];
337 if (valeur_max > max_num_element)
338 max_num_element = valeur_max;
341 ArrOfInt nb_tableaux_distants(max_num_element+1);
342 nb_tableaux_distants = 0;
347 for (i = 0; i < npe; i++)
349 const int pe_voisin = pe_list[i];
352 for (
int j = 0; j < n; j++)
354 const int elem = elements[j];
355 ++nb_tableaux_distants[elem];
363 for (i = 0; i < npe; i++)
365 const int pe_voisin = pe_list[i];
368 for (
int j = 0; j < n; j++)
370 const int elem = elements[j];
371 const int x = nb_tableaux_distants[elem];
377 Cerr <<
") l'element " << elem;
378 Cerr <<
" apparait dans ";
380 Cerr <<
" des espaces distants et un espace virtuel" << finl;
382 Cerr <<
" plusieurs espaces virtuels" << finl;
387 nb_tableaux_distants[elem] = -1;
394 VECT(IntTab) procs_distants(nb_proc);
395 VECT(IntTab) procs_virtuels(nb_proc);
402 IntTab& procs_dist = procs_distants[moi];
404 int nb_procs_distants = pe_distants.
size_array();
405 procs_dist.
resize(nb_procs_distants, 2);
406 for (i = 0; i < nb_procs_distants; i++)
408 int pe_voisin = pe_distants[i];
409 procs_dist(i, 0) = pe_voisin;
413 IntTab& procs_virt = procs_virtuels[moi];
415 int nb_procs_virtuels = pe_virtuels.
size_array();
416 procs_virt.
resize(nb_procs_virtuels, 2);
417 for (i = 0; i < nb_procs_virtuels; i++)
419 int pe_voisin = pe_virtuels[i];
420 procs_virt(i, 0) = pe_voisin;
428 envoyer(procs_distants[moi], 0, 0);
429 envoyer(procs_virtuels[moi], 0, 1);
433 for (i = 1; i < nb_proc; i++)
435 recevoir(procs_distants[i], i, 0);
436 recevoir(procs_virtuels[i], i, 1);
451 ArrOfInt curseurs(nb_proc);
454 for (i = 0; i < nb_proc; i++)
458 const IntTab& procs_dist = procs_distants[i];
459 int nb_pe_voisins = procs_dist.
dimension(0);
461 for (
int j = 0; j < nb_pe_voisins; j++)
464 int pe_voisin = procs_dist(j, 0);
465 int nb_elements = procs_dist(j, 1);
467 const int index = curseurs[pe_voisin];
468 curseurs[pe_voisin]++;
469 const IntTab& procs_virt = procs_virtuels[pe_voisin];
470 if (index >= procs_virt.
dimension(0) || procs_virt(index, 0) != i)
472 Cerr <<
"Descripteur_FT::check : erreur sur le graphe de voisinage.\n";
473 Cerr <<
" Les espaces distants et virtuels ne se correspondent pas.\n";
474 Cerr << pe_voisin << finl;
477 if (procs_virt(index, 1) != nb_elements)
479 Cerr <<
"Descripteur_FT::check : erreur sur une liste d'elements.\n";
480 Cerr <<
" Espace distant du PE " << i <<
" : PE voisin " << pe_voisin;
481 Cerr <<
", nombre d'elements " << nb_elements;
482 Cerr <<
"\n Espace virtuel du PE " << pe_voisin <<
" : PE voisin " << i;
483 Cerr <<
", nombre d'elements " << procs_virt(index, 1) << finl;
489 for (i = 0; i < nb_proc; i++)
491 const int n1 = curseurs[i];
492 const int n2 = procs_virtuels[i].
dimension(0);
495 Cerr <<
"Descripteur_FT::check : erreur sur le graphe de voisinage.\n";
496 Cerr <<
" Les espaces distants et virtuels ne se correspondent pas." << finl;
525 static ArrOfInt cles;
527 const int moi =
me();
538 espace_distant_.retirer_elements(nouveau_pe, elements_distants_retires);
539 espace_virtuel_.retirer_elements(nouveau_pe, elements_virtuels_retires);
549 const ArrOfInt& pe_voisins = elements_virtuels_retires.
pe_voisins();
550 const int nb_voisins = pe_voisins.
size_array();
551 for (
int index_pe = 0; index_pe < nb_voisins; index_pe++)
553 const int pe_origine = pe_voisins[index_pe];
554 const ArrOfInt& elements = elements_virtuels_retires.
elements(pe_origine);
555 const int nb_elements = elements.
size_array();
556 for (
int i = 0; i < nb_elements; i++)
558 const int element = elements[i];
559 int pe_destination = nouveau_pe[element];
560 if (pe_destination == moi)
582 const ArrOfInt& pe_voisins = elements_distants_retires.
pe_voisins();
583 const int nb_voisins = pe_voisins.
size_array();
584 for (
int index_pe = 0; index_pe < nb_voisins; index_pe++)
586 const int pe_distant = pe_voisins[index_pe];
587 const ArrOfInt& elements = elements_distants_retires.
elements(pe_distant);
588 const int nb_elements = elements.
size_array();
589 for (
int i = 0; i < nb_elements; i++)
591 const int element = elements[i];
592 const int pe_destination = nouveau_pe[element];
593 if (pe_destination == pe_distant)
595 const int cle = elements_envoyes.
ajoute_element(pe_distant, element);
596 assert(cles[element] < 0);
615 const ArrOfInt& pe_voisins = elements_distants_retires.
pe_voisins();
616 const int nb_voisins = pe_voisins.
size_array();
617 for (
int index_pe = 0; index_pe < nb_voisins; index_pe++)
619 const int pe_distant = pe_voisins[index_pe];
620 const ArrOfInt& elements = elements_distants_retires.
elements(pe_distant);
621 const int nb_elements = elements.
size_array();
622 for (
int i = 0; i < nb_elements; i++)
624 const int element = elements[i];
625 const int pe_destination = nouveau_pe[element];
626 if (pe_destination != pe_distant)
628 const int cle = cles[element];
630 schema_comm_.send_buffer(pe_destination) << cle << pe_distant;
641 const ArrOfInt& pe_voisins = elements_recus.
pe_voisins();
642 const int nb_voisins = pe_voisins.
size_array();
643 for (
int index_pe = 0; index_pe < nb_voisins; index_pe++)
645 const int pe_origine = pe_voisins[index_pe];
647 const ArrOfInt& elements = elements_recus.
elements(pe_origine);
651 recv_buffer >> cle >> pe_distant;
652 if (recv_buffer.
eof())
654 const int element = elements[cle];
664 const ArrOfInt& pe_voisins = elements_virtuels_retires.
pe_voisins();
665 const int nb_voisins = pe_voisins.
size_array();
666 for (
int index_pe = 0; index_pe < nb_voisins; index_pe++)
668 const int pe_distant = pe_voisins[index_pe];
669 const ArrOfInt& elements = elements_virtuels_retires.
elements(pe_distant);
670 const int nb_elements = elements.
size_array();
671 for (
int i = 0; i < nb_elements; i++)
673 const int element = elements[i];
674 int pe_destination = nouveau_pe[element];
675 if (pe_destination == moi)
705 const int nb_voisins = pe_voisins.
size_array();
706 for (
int i = 0; i < nb_voisins; i++)
708 const int pe = pe_voisins[i];
710 const int nb_elements = elements.
size_array();
711 for (
int j = 0; j < nb_elements; j++)
713 int element = elements[j];
714 element_pe[element] = pe;
721 const int n =
nproc();
725 blocs_to_recv_.dimensionner(n);
726 for (
int i = 0; i < n; i++)
744 schema_comm_.set_send_recv_pe_list(send_procs, recv_procs);
786 IntVect* intV =
dynamic_cast<IntVect*
>(&x);
788 if (intV) y.
ref(*intV);
800 DoubleVect* doubleV =
dynamic_cast<DoubleVect*
>(&x);
802 if (doubleV) y.
ref(*doubleV);
static int check_enabled()
: class Desc_Structure_FT
void collecter_espace_virtuel(ArrOfDouble &tab, MD_Vector_tools::Operations_echange op) const
int check() const
Verification de la coherence de la structure (graphe des voisins et taille des espaces virtuels et di...
void echange_espace_virtuel(ArrOfDouble &tab) const
Descripteur_FT & espace_virtuel()
Renvoie une reference non-const a l'espace virtuel.
void echanger_elements(const ArrOfInt &nouveau_pe)
Correction des espaces distants et virtuels lors d'un changement de proprietaire (noeud ou facette).
VECT(ArrOfInt) blocs_to_recv_
DoubleVect tmp_doublevect_
const MD_Vector & get_md_vector() const
Descripteur_FT espace_virtuel_
Descripteur_FT & espace_distant()
Renvoie une reference non-const a l'espace distant.
void calcul_schema_comm(const int nb_items_tot)
const Schema_Comm & schema_comm() const
const Schema_Comm & schema_comm_inverse() const
enum Desc_Structure_FT::Status status_md_
Schema_Comm schema_comm_inverse_
Descripteur_FT espace_distant_
void remplir_element_pe(ArrOfInt &element_pe) const
remplit le tableau qui donne pour chaque element le numero du pe proprietaire.
: class Descripteur_FT Descripteur_FT stocke pour chaque PE une liste de numeros d'elements.
int contient_element(int pe, int element) const
Renvoie "pas zero" si l'element est deja dans le descripteur pour le pe donne, 0 sinon.
Descripteur_FT & operator=(const Descripteur_FT &)
void set_elements(int PE_voisin, const ArrOfInt &elements)
Remplace la liste des elements par celle en parametre.
void retirer_elements(const ArrOfInt &nouveau_pe, Descripteur_FT &elements_retires)
Pour chaque PE du descripteur, et pour 0 <= i < elements_[pe].
int ajoute_element(int PE_voisin, int element)
Ajoute l'element au tableau du PE_voisin.
const ArrOfInt & elements(int pe_voisin) const
Renvoie la liste des elements distants/virtuels du pe en parametre.
const ArrOfInt & pe_voisins() const
Renvoie la liste des PE pour lesquels la liste d'elements est non vide, dans l'ordre croissant des nu...
void calcul_liste_pe_voisins()
Calcule la liste des PEs dont la liste d'elements est non vide, tries dans l'ordre croissant de numer...
int ajoute_elements(int PE_voisin, const ArrOfInt &elements)
Ajoute l'element au tableau du PE_voisin.
Class defining operators and methods for all reading operation in an input flow (file,...
C'est le plus simple des descripteurs, utilise pour les tableaux de valeurs aux sommets,...
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
class Nom Une chaine de caractere pour nommer les objets de TRUST
classe Objet_U Cette classe est la classe de base des Objets de TRUST
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static void barrier()
Synchronise tous les processeurs du groupe courant (attend que tous les processeurs soient arrives a ...
static int me()
renvoie mon rang dans le groupe de communication courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Classe de base des flux de sortie.
void append_array(_TYPE_ valeur)
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
virtual void set_md_vector(const MD_Vector &)
void ref_array(TRUSTArray< _TYPE_, _SIZE_ > &, _SIZE_ start=0, _SIZE_ sz=-1) override
void reset() override
met l'objet dans l'etat obtenu par le constructeur par defaut.
virtual void ref(const TRUSTVect &)