75 param.
ajouter(
"tolerance", &tolerance);
79 std::vector<Decouper*> v_dec;
80 std::vector<const Domaine*> v_dom;
81 std::vector<Static_Int_Lists> v_se;
82 std::vector<MCAuto<DataArrayDouble>> v_da;
83 std::vector<const DataArrayDouble*> v_pda;
84 std::vector<int> off = { 0 };
85 for (
auto &&dec : decoupeurs)
87 const Domaine& dom = dec.domaine();
89 v_dec.push_back(&dec);
90 v_dom.push_back(&dom);
91 v_se.push_back(Static_Int_Lists());
92 v_da.push_back(DataArrayDouble::New());
93 v_da.back()->useExternalArrayWithRWAccess((
double *) coord.
addr(), coord.
dimension(0), coord.
dimension(1));
94 v_pda.push_back(v_da.back());
95 off.push_back(off.back() + coord.
dimension(0));
97 Partitionneur_base& partitionneur = dec.deriv_partitionneur_.valeur();
99 if (dec.nom_fichier_med_ !=
"?")
100 dec.postraiter_decoupage(dec.nom_fichier_med_);
102 construire_connectivite_som_elem(dom.
nb_som(), dom.
les_elems(), v_se.back(), 1);
107 Cerr <<
"Decouper_multi: searching for coinciding vertices ... ";
108 MCAuto<DataArrayDouble> da(DataArrayDouble::Aggregate(v_pda));
109 DataArrayIdType* S_i =
nullptr, *S =
nullptr;
110 da->findCommonTuples(tolerance, -1, S, S_i);
113 std::vector<std::map<int, std::set<int>>> v_sp(v_dec.size());
114 std::vector<std::set<int>> procs;
115 std::set<int> u_procs;
116 std::vector<std::array<int, 2>> v_ds;
117 int ns, l, d, count = 0;
119 for (mcIdType i = 0; i + 1 < S_i->getNumberOfTuples(); i++)
120 if ((ns =
static_cast<int>(S_i->getIJ(i + 1, 0) - S_i->getIJ(i, 0))) > 1)
126 for (j = S_i->getIJ(i, 0); j < S_i->getIJ(i + 1, 0); j++, k++)
129 for (s = S->getIJ(j, 0), d = 0; s >= off[d + 1]; )
131 const IntVect& elem_part = v_dec[d]->elem_part_;
132 mcIdType som_loc0 = s - off[d];
133 assert(som_loc0 < std::numeric_limits<int>::max());
134 int som_loc =
static_cast<int>(som_loc0);
135 v_ds[k] = {{ d, som_loc }};
137 for (l = 0; l < v_se[d].get_list_size(som_loc); l++)
138 procs[k].insert(elem_part(v_se[d](som_loc, l)));
140 for (u_procs.clear(), k = 0; k < ns; k++)
141 for (
auto &&pr : procs[k])
143 for (k = 0; k < ns; k++)
144 if (procs[k].size() < u_procs.size())
146 std::set<int>& dest = v_sp[v_ds[k][0]][v_ds[k][1]];
147 std::set_difference(u_procs.begin(), u_procs.end(), procs[k].begin(), procs[k].end(), std::inserter(dest, dest.end()));
150 S_i->decrRef(), S->decrRef();
151 Cerr << count <<
" sommets trouves!" << finl;
158 for (d = 0; d < (int) v_dec.size(); d++)
160 Static_Int_Lists som_raccord;
161 ArrOfInt sizes(v_dom[d]->nb_som());
163 for (
auto && s_p : v_sp[d]) sizes[s_p.first] = (int)s_p.second.size();
165 for (
auto && s_p : v_sp[d])
168 for (
auto &&p : s_p.second)
174 v_dec[d]->ecrire(&som_raccord);
const DoubleTab_t & coord_sommets() const
int_t nb_som() const
Renvoie le nombre de sommets du domaine.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.