319 {
320 const int nel = *NEL;
321 const size_t nspmd = (size_t)*NSPMD;
322 const int nodesPerElt = *NODES_PER_ELT;
323 const int offset = *OFFSET;
324 const int lda = *
LDA;
325
326
329 vector<Adjacency> adjacencies(
nspmd);
330 vector<vector<Vint>> node2Elts(
nspmd);
331 vector<Vint> elt2LocalNodes(
nspmd);
332
333 splitPerDomain(nel, nodesPerElt,
nspmd, domain, lda, offset, elt2Nodes, nodesMapping, eltsParition);
334
335 for (
size_t p = 0; p <
nspmd; p++)
336 {
337 const int nb_local_elts = eltsParition.
globalId[p].size();
338 const int nb_local_nodes = nodesMapping[p].size();
339 node2Elts[p].resize(nb_local_nodes);
340 adjacencies[p].setNbVertices(nb_local_elts);
341 adjacencies[p].reserve(30);
342 elt2LocalNodes[p].resize(nb_local_elts * nodesPerElt);
343 }
344
345
346
347 for (int i = 0; i < nel; i++)
348 {
349 const int p = domain[i];
350
351 const int e = eltsParition.
localId[i];
352 for (int j = 0; j < nodesPerElt; j++)
353 {
354
355 const int local_node_id = nodesMapping[p].getCompactId(elt2Nodes[i * lda + j + offset]);
356 elt2LocalNodes[p][nodesPerElt * e + j] = local_node_id;
357 node2Elts[p][local_node_id].push_back(e);
358 }
359 }
360
361
362 for(
size_t p = 0; p <
nspmd; p++)
363 {
364 const size_t nel_local = eltsParition.
globalId[p].size();
365 Vint last(nel_local, -1);
366 for(size_t e1 = 0 ; e1 < nel_local ; e1++)
367 {
368 for(size_t j = 0 ; j < nodesPerElt ; j++)
369 {
370 const int n = elt2LocalNodes[p][nodesPerElt * e1 + j];
371 for(
auto & e2 : node2Elts[p][
n])
372 {
373 if(last[e2] != e1)
374 {
375 last[e2] = e1;
376 adjacencies[p].addEdge(e1, e2);
377 }
378 }
379 }
380 }
381 }
382
383
384
385 int start = 0;
386 for (
size_t p = 0; p <
nspmd; ++p)
387 {
388 Vint index = adjacencies[p].CuthillMckee();
389
390 for (size_t i = 0; i < index.size(); ++i)
391 {
392
394 }
395 start += index.size();
396 }
397 };
void splitPerDomain(int nel, int nodesPerElt, size_t nspmd, int *domain, int lda, int offset, int *elt2Nodes, Vorder &nodes, ElementPartition &elts)
vector< NodeMapping > Vorder
integer, dimension(:), allocatable offset
type(reorder_struct_) permutation