16#include <Connex_components_FT.h>
17#include <communications.h>
19#include <Connectivite_som_elem.h>
20#include <Maillage_FT_Disc.h>
21#include <Connex_components.h>
22#include <Static_Int_Lists.h>
23#include <TRUSTArray.h>
38int search_connex_components_local_FT(
const Maillage_FT_Disc& mesh, ArrOfInt& num_compo,
39 const int include_virtual)
47 Static_Int_Lists som_elem;
48 const IntTab& facettes = mesh.
facettes();
49 IntTab elems(nbelem, dimension);
51 for (i=0; i < nbelem; i++)
52 for (j=0; j < dimension; j++)
53 elems(i,j) = facettes(i,j);
55 construire_connectivite_som_elem(mesh.
nb_sommets(), elems, som_elem, include_virtual);
58 for (i = 0; i < nbelem; i++)
59 if (num_compo[i] != -1)
62 int start_element = 0;
63 int num_compo_courant = 0;
67 const int nb_som_elem=dimension;
72 while (start_element < nbelem && num_compo[start_element] >= -1)
74 if (start_element == nbelem)
78 liste_elems[0] = start_element;
79 num_compo[start_element] = num_compo_courant;
83 const int liste_elems_size = liste_elems.
size_array();
84 for (
int i_elem = 0; i_elem < liste_elems_size; i_elem++)
86 const int elem = liste_elems[i_elem];
89 for (
int j2 = 0; j2 < nb_som_elem; j2++)
91 const int mon_som= facettes(elem, j2);
93 for(k=0; k< nb_elem_som; k++)
95 const int voisin= som_elem(mon_som,k);
98 const int num = num_compo[voisin];
101 num_compo[voisin] = num_compo_courant;
108 liste_elems = tmp_liste;
114 return num_compo_courant;
125int compute_global_connex_components_FT(
const Maillage_FT_Disc& mesh, ArrOfInt& num_compo,
int nb_local_components)
127 const int nbelem_tot = num_compo.
size_array();
134 for (i = 0; i < nbelem_tot; i++)
135 if (num_compo[i] >= 0)
136 num_compo[i] += decalage;
145 ArrOfInt copie_compo(num_compo);
154 ArrOfBit markers(nb_local_components * nb_total_components);
160 for (i = 0; i < nbelem_tot; i++)
166 int compo = num_compo[i];
169 int compo2 = copie_compo[i];
172 assert(compo >= decalage && compo - decalage < nb_local_components);
174 assert(compo2 < decalage || compo2 - decalage >= nb_local_components);
175 const int index = (compo - decalage) * nb_total_components + compo2;
176 if (!markers.testsetbit(index))
178 graph.
resize(graph_size+1, 2);
186 graph(graph_size, 0) = compo;
187 graph(graph_size, 1) = compo2;
199 for (pe = 1; pe < nproc; pe++)
201 recevoir(tmp, pe, 54 );
203 graph.
resize(graph_size + n2, 2);
204 for (
int i2 = 0; i2 < n2; i2++)
206 graph(graph_size, 0) = tmp(i2, 0);
207 graph(graph_size, 1) = tmp(i2, 1);
213 const int n = compute_graph_connex_components(graph, renum);
214 Process::Journal() <<
"compute_global_connex_components: nb_components=" << n << finl;
220 envoyer(graph, 0, 54 );
223 envoyer_broadcast(renum, 0 );
226 for (i = 0; i < nbelem_tot; i++)
228 const int x = num_compo[i];
231 const int new_x = renum[x];
232 num_compo[i] = new_x;
239 int nb_components = 0;
241 nb_components = max_array(renum) + 1;
242 return nb_components;
void echange_espace_virtuel(ArrOfDouble &tab) const
: class Maillage_FT_Disc Cette classe decrit un maillage:
int nb_sommets() const
renvoie le nombre de sommets (reels et virtuels) (egal a sommets().
int nb_facettes() const
renvoie le nombre de facettes (reelles et virtuelles) (egal a facettes().
int facette_virtuelle(int i) const
Renvoie 0 si la facette m'appartient, 1 sinon.
const Desc_Structure_FT & desc_facettes() const
renvoie le descripteur des facettes (espace_distant/virtuel)
const IntTab & facettes() const
renvoie le tableau des facettes (reelles et virtuelles) dimension(0) = nombre de facettes,
static int check_int_overflow(trustIdType)
static trustIdType mppartial_sum(trustIdType i)
Calul de la somme partielle de i sur les processeurs 0 a me()-1 (renvoie 0 sur le processeur 0).
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
int_t get_list_size(int_t i_liste) const
renvoie le nombre d'elements de la liste i
int_t get_nb_lists() const
renvoie le nombre de listes stockees
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