16#include <Connex_components.h>
17#include <communications.h>
33int search_connex_components_local(
const IntTab& elem_faces,
const IntTab& faces_elem, IntVect& num_compo)
36 const int nb_voisins = elem_faces.
dimension(1);
40 for (i = 0; i < nbelem; i++)
41 if (num_compo[i] != -1)
44 int start_element = 0;
45 int num_compo_courant = 0;
53 while (start_element < nbelem && num_compo[start_element] >= -1)
55 if (start_element == nbelem)
59 liste_elems[0] = start_element;
60 num_compo[start_element] = num_compo_courant;
64 const int liste_elems_size = liste_elems.
size_array();
65 for (
int i_elem = 0; i_elem < liste_elems_size; i_elem++)
67 const int elem = liste_elems[i_elem];
70 for (
int j = 0; j < nb_voisins; j++)
72 const int face = elem_faces(elem, j);
73 const int voisin = faces_elem(face, 0) + faces_elem(face, 1) - elem;
76 const int num = num_compo[voisin];
79 num_compo[voisin] = num_compo_courant;
85 liste_elems = tmp_liste;
91 return num_compo_courant;
99int compute_graph_connex_components(
const IntTab& graph, ArrOfInt& connex_components)
102 const int nb_sommets = connex_components.
size_array();
108 IntTab renum_data(nb_sommets, 2);
111 for (i_sommet = 0; i_sommet < nb_sommets; i_sommet++)
113 renum_data(i_sommet, 0) = i_sommet;
114 renum_data(i_sommet, 1) = -1;
116 const int nbcouples = graph.
dimension(0);
117 for (
int i_couple = 0; i_couple < nbcouples; i_couple++)
119 const int compo1 = graph(i_couple, 0);
120 const int compo2 = graph(i_couple, 1);
121 assert(compo1 != compo2);
124 if (renum_data(compo1, 0) == renum_data(compo2, 0))
128 int fin_liste1 = compo1;
131 const int next = renum_data(fin_liste1, 1);
137 const int debut_liste2 = renum_data(compo2, 0);
138 renum_data(fin_liste1, 1) = debut_liste2;
140 i_sommet = debut_liste2;
141 const int debut_liste1 = renum_data(compo1, 0);
144 renum_data(i_sommet, 0) = debut_liste1;
145 i_sommet = renum_data(i_sommet, 1);
147 while (i_sommet >= 0);
153 connex_components = -1;
154 for (i_sommet = 0; i_sommet < nb_sommets; i_sommet++)
156 if (connex_components[i_sommet] < 0)
161 for (
int i = renum_data(i_sommet, 0); i >= 0; i = renum_data(i, 1))
162 connex_components[i] = count;
179int compute_global_connex_components(IntVect& num_compo,
int nb_local_components)
181 const int nbelem = num_compo.
size();
188 const int nb_total_components =
static_cast<int>(
Process::mp_sum(nb_local_components));
189 for (
int i = 0; i < nbelem_tot; i++)
190 if (num_compo[i] >= 0)
191 num_compo[i] += decalage;
200 IntVect copie_compo(num_compo);
201 copie_compo.echange_espace_virtuel();
209 ArrOfBit markers(nb_local_components * nb_total_components);
216 for (
int i = nbelem; i < nbelem_tot; i++)
218 int compo = num_compo[i];
221 int compo2 = copie_compo[i];
224 assert(compo >= decalage && compo - decalage < nb_local_components);
226 assert(compo2 < decalage || compo2 - decalage >= nb_local_components);
227 const int index = (compo - decalage) * nb_total_components + compo2;
228 if (!markers.testsetbit(index))
230 graph.
resize(graph_size+1, 2);
238 graph(graph_size, 0) = compo;
239 graph(graph_size, 1) = compo2;
251 for (pe = 1; pe < nproc; pe++)
253 recevoir(tmp, pe, 54 );
255 graph.
resize(graph_size + n2, 2);
256 for (
int i = 0; i < n2; i++)
258 graph(graph_size, 0) = tmp(i, 0);
259 graph(graph_size, 1) = tmp(i, 1);
265 const int n = compute_graph_connex_components(graph, renum);
266 Process::Journal() <<
"compute_global_connex_components: nb_components=" << n << finl;
271 envoyer(graph, 0, 54 );
275 envoyer_broadcast(renum, 0 );
278 for (
int i = 0; i < nbelem_tot; i++)
280 const int x = num_compo[i];
283 const int new_x = renum[x];
284 num_compo[i] = new_x;
291 int nb_components = 0;
295 nb_components = max_array(renum) + 1;
296 return nb_components;
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),...
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_tot(int) const override
_SIZE_ dimension(int d) const
_SIZE_ size_totale() const