mirror of
https://github.com/NGSolve/netgen.git
synced 2025-01-12 22:20:35 +05:00
fixes for parallel refinement
This commit is contained in:
parent
4dad700c87
commit
5994bf798d
@ -23,7 +23,6 @@ namespace netgen
|
|||||||
|
|
||||||
void ParallelMeshTopology :: Reset ()
|
void ParallelMeshTopology :: Reset ()
|
||||||
{
|
{
|
||||||
cout << "ParallelMeshTopology::Reset called" << endl;
|
|
||||||
*testout << "ParallelMeshTopology::Reset" << endl;
|
*testout << "ParallelMeshTopology::Reset" << endl;
|
||||||
|
|
||||||
if ( ntasks == 1 ) return;
|
if ( ntasks == 1 ) return;
|
||||||
@ -47,7 +46,6 @@ namespace netgen
|
|||||||
SetNV(mesh.GetNV());
|
SetNV(mesh.GetNV());
|
||||||
SetNE(mesh.GetNE());
|
SetNE(mesh.GetNE());
|
||||||
}
|
}
|
||||||
cout << "ParallelMeshTopology::Reset complete" << endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -205,7 +203,7 @@ namespace netgen
|
|||||||
|
|
||||||
void ParallelMeshTopology :: UpdateCoarseGrid ()
|
void ParallelMeshTopology :: UpdateCoarseGrid ()
|
||||||
{
|
{
|
||||||
cout << "updatecoarsegrid called, is_updated = " << is_updated << endl;
|
cout << "UpdateCoarseGrid" << endl;
|
||||||
// if (is_updated) return;
|
// if (is_updated) return;
|
||||||
|
|
||||||
Reset();
|
Reset();
|
||||||
@ -237,13 +235,16 @@ namespace netgen
|
|||||||
|
|
||||||
const MeshTopology & topology = mesh.GetTopology();
|
const MeshTopology & topology = mesh.GetTopology();
|
||||||
|
|
||||||
cout << "update refined vertices" << endl;
|
Array<int> cnt_send(ntasks-1);
|
||||||
|
|
||||||
|
|
||||||
// update new vertices after mesh-refinement
|
// update new vertices after mesh-refinement
|
||||||
if (mesh.mlbetweennodes.Size() > 0)
|
if (mesh.mlbetweennodes.Size() > 0)
|
||||||
{
|
{
|
||||||
// int oldnv = loc2distvert.Size();
|
cout << "UpdateCoarseGrid - vertices" << endl;
|
||||||
int newnv = mesh.mlbetweennodes.Size();
|
int newnv = mesh.mlbetweennodes.Size();
|
||||||
loc2distvert.ChangeSize(mesh.mlbetweennodes.Size());
|
loc2distvert.ChangeSize(mesh.mlbetweennodes.Size());
|
||||||
|
/*
|
||||||
for (PointIndex pi = PointIndex::BASE; pi < newnv+PointIndex::BASE; pi++)
|
for (PointIndex pi = PointIndex::BASE; pi < newnv+PointIndex::BASE; pi++)
|
||||||
{
|
{
|
||||||
PointIndex v1 = mesh.mlbetweennodes[pi][0];
|
PointIndex v1 = mesh.mlbetweennodes[pi][0];
|
||||||
@ -253,21 +254,86 @@ namespace netgen
|
|||||||
if (IsExchangeVert (dest, v1) && IsExchangeVert (dest, v2))
|
if (IsExchangeVert (dest, v1) && IsExchangeVert (dest, v2))
|
||||||
SetDistantPNum(dest, pi);
|
SetDistantPNum(dest, pi);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
cnt_send = 0;
|
||||||
|
int v1, v2;
|
||||||
|
for (PointIndex pi = PointIndex::BASE; pi < newnv+PointIndex::BASE; pi++)
|
||||||
|
{
|
||||||
|
PointIndex v1 = mesh.mlbetweennodes[pi][0];
|
||||||
|
PointIndex v2 = mesh.mlbetweennodes[pi][1];
|
||||||
|
if (mesh.mlbetweennodes[pi][0] != PointIndex::BASE-1)
|
||||||
|
for (int dest = 1; dest < ntasks; dest++)
|
||||||
|
if (dest != id)
|
||||||
|
if (IsExchangeVert (dest, v1) && IsExchangeVert (dest, v2))
|
||||||
|
cnt_send[dest-1]+=2;
|
||||||
|
}
|
||||||
|
|
||||||
|
TABLE<int> send_verts(cnt_send);
|
||||||
|
|
||||||
|
Array<int, PointIndex::BASE> loc2exchange(mesh.GetNV());
|
||||||
|
for (int dest = 1; dest < ntasks; dest++)
|
||||||
|
if (dest != id)
|
||||||
|
{
|
||||||
|
loc2exchange = -1;
|
||||||
|
int cnt = 0;
|
||||||
|
for (PointIndex pi : mesh.Points().Range())
|
||||||
|
if (IsExchangeVert(dest, pi))
|
||||||
|
loc2exchange[pi] = cnt++;
|
||||||
|
|
||||||
|
|
||||||
|
for (PointIndex pi = PointIndex::BASE; pi < newnv+PointIndex::BASE; pi++)
|
||||||
|
{
|
||||||
|
PointIndex v1 = mesh.mlbetweennodes[pi][0];
|
||||||
|
PointIndex v2 = mesh.mlbetweennodes[pi][1];
|
||||||
|
if (mesh.mlbetweennodes[pi][0] != PointIndex::BASE-1)
|
||||||
|
if (IsExchangeVert (dest, v1) && IsExchangeVert (dest, v2))
|
||||||
|
{
|
||||||
|
send_verts.Add (dest-1, loc2exchange[v1]);
|
||||||
|
send_verts.Add (dest-1, loc2exchange[v2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TABLE<int> recv_verts(ntasks-1);
|
||||||
|
MyMPI_ExchangeTable (send_verts, recv_verts, MPI_TAG_MESH+9, MPI_LocalComm);
|
||||||
|
|
||||||
|
for (int dest = 1; dest < ntasks; dest++)
|
||||||
|
if (dest != id)
|
||||||
|
{
|
||||||
|
loc2exchange = -1;
|
||||||
|
int cnt = 0;
|
||||||
|
for (PointIndex pi : mesh.Points().Range())
|
||||||
|
if (IsExchangeVert(dest, pi))
|
||||||
|
loc2exchange[pi] = cnt++;
|
||||||
|
|
||||||
|
FlatArray<int> recvarray = recv_verts[dest-1];
|
||||||
|
for (int ii = 0; ii < recvarray.Size(); ii+=2)
|
||||||
|
for (PointIndex pi = PointIndex::BASE; pi < newnv+PointIndex::BASE; pi++)
|
||||||
|
{
|
||||||
|
PointIndex v1 = mesh.mlbetweennodes[pi][0];
|
||||||
|
PointIndex v2 = mesh.mlbetweennodes[pi][1];
|
||||||
|
if (mesh.mlbetweennodes[pi][0] != PointIndex::BASE-1)
|
||||||
|
{
|
||||||
|
INDEX_2 re(recvarray[ii], recvarray[ii+1]);
|
||||||
|
INDEX_2 es(loc2exchange[v1], loc2exchange[v2]);
|
||||||
|
if (es == re)
|
||||||
|
SetDistantPNum(dest, pi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
cout << "update refined vertices done" << endl;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Array<int> sendarray, recvarray;
|
Array<int> sendarray, recvarray;
|
||||||
|
cout << "UpdateCoarseGrid - edges" << endl;
|
||||||
|
|
||||||
// static int timerv = NgProfiler::CreateTimer ("UpdateCoarseGrid - ex vertices");
|
// static int timerv = NgProfiler::CreateTimer ("UpdateCoarseGrid - ex vertices");
|
||||||
static int timere = NgProfiler::CreateTimer ("UpdateCoarseGrid - ex edges");
|
static int timere = NgProfiler::CreateTimer ("UpdateCoarseGrid - ex edges");
|
||||||
static int timerf = NgProfiler::CreateTimer ("UpdateCoarseGrid - ex faces");
|
static int timerf = NgProfiler::CreateTimer ("UpdateCoarseGrid - ex faces");
|
||||||
|
|
||||||
|
|
||||||
Array<int> cnt_send(ntasks-1);
|
|
||||||
|
|
||||||
NgProfiler::StartTimer (timere);
|
NgProfiler::StartTimer (timere);
|
||||||
|
|
||||||
|
|
||||||
@ -310,7 +376,7 @@ namespace netgen
|
|||||||
for (int dest = 1; dest < ntasks; dest++)
|
for (int dest = 1; dest < ntasks; dest++)
|
||||||
{
|
{
|
||||||
loc2exchange = -1;
|
loc2exchange = -1;
|
||||||
cnt = 0;
|
int cnt = 0;
|
||||||
for (PointIndex pi : mesh.Points().Range())
|
for (PointIndex pi : mesh.Points().Range())
|
||||||
if (IsExchangeVert(dest, pi))
|
if (IsExchangeVert(dest, pi))
|
||||||
loc2exchange[pi] = cnt++;
|
loc2exchange[pi] = cnt++;
|
||||||
@ -320,10 +386,8 @@ namespace netgen
|
|||||||
topology.GetEdgeVertices (edge, v1, v2);
|
topology.GetEdgeVertices (edge, v1, v2);
|
||||||
if (IsExchangeVert (dest, v1) && IsExchangeVert (dest, v2))
|
if (IsExchangeVert (dest, v1) && IsExchangeVert (dest, v2))
|
||||||
{
|
{
|
||||||
INDEX_2 es(loc2exchange[v1], loc2exchange[v2]);
|
send_edges.Add (dest-1, loc2exchange[v1]);
|
||||||
es.Sort();
|
send_edges.Add (dest-1, loc2exchange[v2]);
|
||||||
send_edges.Add (dest-1, es[0]);
|
|
||||||
send_edges.Add (dest-1, es[1]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -331,7 +395,8 @@ namespace netgen
|
|||||||
TABLE<int> recv_edges(ntasks-1);
|
TABLE<int> recv_edges(ntasks-1);
|
||||||
MyMPI_ExchangeTable (send_edges, recv_edges, MPI_TAG_MESH+9, MPI_LocalComm);
|
MyMPI_ExchangeTable (send_edges, recv_edges, MPI_TAG_MESH+9, MPI_LocalComm);
|
||||||
|
|
||||||
for (int sender = 1; sender < ntasks; sender ++)
|
/*
|
||||||
|
for (int sender = 1; sender < ntasks; sender ++)
|
||||||
if (id != sender)
|
if (id != sender)
|
||||||
{
|
{
|
||||||
FlatArray<int> recvarray = recv_edges[sender-1];
|
FlatArray<int> recvarray = recv_edges[sender-1];
|
||||||
@ -342,17 +407,38 @@ namespace netgen
|
|||||||
SetDistantEdgeNum (sender, gv2e.Get(gv12));
|
SetDistantEdgeNum (sender, gv2e.Get(gv12));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
for (int dest = 1; dest < ntasks; dest++)
|
||||||
|
{
|
||||||
|
loc2exchange = -1;
|
||||||
|
int cnt = 0;
|
||||||
|
for (PointIndex pi : mesh.Points().Range())
|
||||||
|
if (IsExchangeVert(dest, pi))
|
||||||
|
loc2exchange[pi] = cnt++;
|
||||||
|
|
||||||
|
FlatArray<int> recvarray = recv_edges[dest-1];
|
||||||
|
for (int ii = 0; ii < recvarray.Size(); ii+=2)
|
||||||
|
for (int edge = 1; edge <= ned; edge++)
|
||||||
|
{
|
||||||
|
topology.GetEdgeVertices (edge, v1, v2);
|
||||||
|
INDEX_2 re(recvarray[ii], recvarray[ii+1]);
|
||||||
|
INDEX_2 es(loc2exchange[v1], loc2exchange[v2]);
|
||||||
|
if (es == re)
|
||||||
|
SetDistantEdgeNum(dest, edge);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
NgProfiler::StopTimer (timere);
|
NgProfiler::StopTimer (timere);
|
||||||
|
|
||||||
// MPI_Barrier (MPI_LocalComm);
|
// MPI_Barrier (MPI_LocalComm);
|
||||||
|
|
||||||
|
cout << "UpdateCoarseGrid - faces" << endl;
|
||||||
if (mesh.GetDimension() == 3)
|
if (mesh.GetDimension() == 3)
|
||||||
{
|
{
|
||||||
NgProfiler::StartTimer (timerf);
|
NgProfiler::StartTimer (timerf);
|
||||||
Array<int> verts;
|
Array<int> verts;
|
||||||
|
|
||||||
|
/*
|
||||||
// exchange faces
|
// exchange faces
|
||||||
cnt_send = 0;
|
cnt_send = 0;
|
||||||
for (int face = 1; face <= nfa; face++)
|
for (int face = 1; face <= nfa; face++)
|
||||||
@ -405,7 +491,71 @@ namespace netgen
|
|||||||
SetDistantFaceNum (sender, gv2f.Get(gv123));
|
SetDistantFaceNum (sender, gv2f.Get(gv123));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
// exchange faces
|
||||||
|
|
||||||
|
cnt_send = 0;
|
||||||
|
for (int face = 1; face <= nfa; face++)
|
||||||
|
{
|
||||||
|
topology.GetFaceVertices (face, verts);
|
||||||
|
for (int dest = 1; dest < ntasks; dest++)
|
||||||
|
if (dest != id)
|
||||||
|
if (IsExchangeVert (dest, verts[0]) &&
|
||||||
|
IsExchangeVert (dest, verts[1]) &&
|
||||||
|
IsExchangeVert (dest, verts[2]))
|
||||||
|
cnt_send[dest-1]+=3;
|
||||||
|
}
|
||||||
|
|
||||||
|
TABLE<int> send_faces(cnt_send);
|
||||||
|
Array<int, PointIndex::BASE> loc2exchange(mesh.GetNV());
|
||||||
|
for (int dest = 1; dest < ntasks; dest++)
|
||||||
|
if (dest != id)
|
||||||
|
{
|
||||||
|
loc2exchange = -1;
|
||||||
|
int cnt = 0;
|
||||||
|
for (PointIndex pi : mesh.Points().Range())
|
||||||
|
if (IsExchangeVert(dest, pi))
|
||||||
|
loc2exchange[pi] = cnt++;
|
||||||
|
|
||||||
|
for (int face = 1; face <= nfa; face++)
|
||||||
|
{
|
||||||
|
topology.GetFaceVertices (face, verts);
|
||||||
|
if (IsExchangeVert (dest, verts[0]) &&
|
||||||
|
IsExchangeVert (dest, verts[1]) &&
|
||||||
|
IsExchangeVert (dest, verts[2]))
|
||||||
|
{
|
||||||
|
send_faces.Add (dest-1, loc2exchange[verts[0]]);
|
||||||
|
send_faces.Add (dest-1, loc2exchange[verts[1]]);
|
||||||
|
send_faces.Add (dest-1, loc2exchange[verts[2]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TABLE<int> recv_faces(ntasks-1);
|
||||||
|
MyMPI_ExchangeTable (send_faces, recv_faces, MPI_TAG_MESH+9, MPI_LocalComm);
|
||||||
|
|
||||||
|
for (int dest = 1; dest < ntasks; dest++)
|
||||||
|
if (dest != id)
|
||||||
|
{
|
||||||
|
loc2exchange = -1;
|
||||||
|
int cnt = 0;
|
||||||
|
for (PointIndex pi : mesh.Points().Range())
|
||||||
|
if (IsExchangeVert(dest, pi))
|
||||||
|
loc2exchange[pi] = cnt++;
|
||||||
|
|
||||||
|
FlatArray<int> recvarray = recv_faces[dest-1];
|
||||||
|
for (int ii = 0; ii < recvarray.Size(); ii+=3)
|
||||||
|
for (int face = 1; face <= nfa; face++)
|
||||||
|
{
|
||||||
|
topology.GetFaceVertices (face, verts);
|
||||||
|
INDEX_3 re(recvarray[ii], recvarray[ii+1], recvarray[ii+2]);
|
||||||
|
INDEX_3 es(loc2exchange[verts[0]], loc2exchange[verts[1]], loc2exchange[verts[2]]);
|
||||||
|
if (es == re)
|
||||||
|
SetDistantFaceNum(dest, face);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Array<int,1> glob2loc;
|
Array<int,1> glob2loc;
|
||||||
@ -475,6 +625,7 @@ namespace netgen
|
|||||||
|
|
||||||
NgProfiler::StopTimer (timerf);
|
NgProfiler::StopTimer (timerf);
|
||||||
}
|
}
|
||||||
|
cout << "UpdateCoarseGrid - done" << endl;
|
||||||
|
|
||||||
is_updated = true;
|
is_updated = true;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user