Skip to content

Commit 7fd4310

Browse files
committed
clean myalgo::assignedgenumbers
1 parent 50e9387 commit 7fd4310

2 files changed

Lines changed: 21 additions & 15 deletions

File tree

src/mesh/myalgorithm.cpp

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -898,7 +898,6 @@ void myalgorithm::assignedgenumbers(std::vector<bool>& isownelem, std::vector<st
898898
int numneighbours = dt->countneighbours();
899899
std::vector<int> neighbours = dt->getneighbours();
900900

901-
902901
std::vector<int> nn(8), ne(8);
903902
for (int i = 0; i < 8; i++)
904903
{
@@ -955,15 +954,10 @@ void myalgorithm::assignedgenumbers(std::vector<bool>& isownelem, std::vector<st
955954
removeduplicates(catcornercoords);
956955
std::vector<int> neighboursnumownedges = appendneighbourvalues(barys, catcornercoords, numownedges);
957956

958-
// Remove duplicated barycenters:
957+
// Find duplicates:
959958
std::vector<int> renumberingvector;
960959
int numunique = removeduplicates(barys, renumberingvector);
961960

962-
// Assign a unique edge number for each edge:
963-
edgenumbers = std::vector<int>(numedges);
964-
for (int i = 0; i < numedges; i++)
965-
edgenumbers[i] = renumberingvector[i];
966-
967961
// Calculate which edges must be split:
968962
std::vector<bool> isanodeatnum(numunique, false);
969963
for (int i = 0; i < barys.size()/3-numedges; i++)
@@ -972,10 +966,21 @@ void myalgorithm::assignedgenumbers(std::vector<bool>& isownelem, std::vector<st
972966
isbarycenteronnode = std::vector<bool>(numedges, false);
973967
for (int i = 0; i < numedges; i++)
974968
{
975-
if (isanodeatnum[edgenumbers[i]])
969+
if (isanodeatnum[renumberingvector[i]])
976970
isbarycenteronnode[i] = true;
977971
}
978972

973+
// Assign a unique edge number for each edge:
974+
edgenumbers = std::vector<int>(numedges);
975+
for (int i = 0; i < numedges; i++)
976+
edgenumbers[i] = renumberingvector[i];
977+
978+
// Make the edges numbers continuous:
979+
std::vector<int> edgerenum;
980+
int numuniqueedges = squeeze(edgenumbers, numunique, edgerenum);
981+
for (int i = 0; i < numedges; i++)
982+
edgenumbers[i] = edgerenum[edgenumbers[i]];
983+
979984
// Harmonize the edges numbers across neighbour ranks:
980985
if (dt->isdefined() == false || numranks == 1)
981986
return;
@@ -988,15 +993,15 @@ void myalgorithm::assignedgenumbers(std::vector<bool>& isownelem, std::vector<st
988993
std::vector<double> ownbarys(3*numownedges);
989994
selectcoordinates(isownedge, barys, ownbarys.data());
990995

991-
// Get edges count on all ranks to create unique edge numbers:
992-
std::vector<int> fragment = {numedges};
993-
std::vector<int> allnumedges;
994-
slmpi::allgather(fragment, allnumedges);
996+
// Get the edges count on all ranks to create unique global edge numbers:
997+
std::vector<int> fragment = {numuniqueedges};
998+
std::vector<int> allnumuniqueedges;
999+
slmpi::allgather(fragment, allnumuniqueedges);
9951000

996-
// Use long long int to allow more edges in the mesh.
1001+
// USE LONG LONG INT TO ALLOW MORE EDGES IN THE MESH.
9971002
std::vector<int> edgenumshift(numranks, 0);
9981003
for (int i = 1; i < numranks; i++)
999-
edgenumshift[i] = edgenumshift[i-1] + allnumedges[i-1];
1004+
edgenumshift[i] = edgenumshift[i-1] + allnumuniqueedges[i-1];
10001005

10011006
for (int i = 0; i < numedges; i++)
10021007
edgenumbers[i] += edgenumshift[rank];

src/mesh/myalgorithm.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ namespace myalgorithm
137137
// Provide the corner coordinates of each element concatenated in each element type.
138138
// This function returns (flattened from lowest type to highest) the edge number of
139139
// each edge in an element as well as a bool whose value is true if the edge barycenter
140-
// is close enough to any node in the corner coordinates.
140+
// is close enough to any node in the corner coordinates. In the DDM framework the own
141+
// elements must include at least one layer of inner cells touching the no-overlap interface.
141142
void assignedgenumbers(std::vector<bool>& isownelem, std::vector<std::vector<double>>& cornercoords, std::vector<int>& edgenumbers, std::vector<bool>& isbarycenteronnode);
142143

143144
// For a vector 'vec' of repeating blocks [b0 b1 b2 ...] the output is [b0[sel[0]] b1[sel[0]] ... b0[sel[1]] b1[sel[1]] ...].

0 commit comments

Comments
 (0)