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,...
This is the simplest descriptor, used for arrays of values at vertices, elements, faces,...
: This class is an OWN_PTR but the pointed object is shared among multiple
class Nom: a character string for naming TRUST objects.
Base class for TRUST objects (Objet_U).
const Nom & que_suis_je() const
Returns the string identifying the class.
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
static int nproc()
Returns the number of processors in the current group. See Comm_Group::nproc() and PE_Groups::current...
static void barrier()
Synchronizes all processors in the current group (waits until all processors have reached the barrier...
static int me()
Returns the rank of the local processor in the current communication group. See Comm_Group::rank() an...
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
static int je_suis_maitre()
Returns 1 if on the master processor of the current group (i.e. me() == 0), 0 otherwise.
Base class for output streams.
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
Resets the object to the state obtained by the default constructor.
virtual void ref(const TRUSTVect &)