more ParallelFor in update topology

This commit is contained in:
Joachim Schöberl 2016-08-18 08:00:47 +02:00
parent e009a8b687
commit a7b413944d

View File

@ -282,7 +282,7 @@ namespace netgen
} }
void MeshTopology :: Update(TaskManager tm) void MeshTopology :: Update (TaskManager tm)
{ {
static int timer = NgProfiler::CreateTimer ("topology"); static int timer = NgProfiler::CreateTimer ("topology");
NgProfiler::RegionTimer reg (timer); NgProfiler::RegionTimer reg (timer);
@ -546,10 +546,6 @@ namespace netgen
if (edge.I1() != i) continue; if (edge.I1() != i) continue;
int edgenum = edgenr[edge.I2()]; int edgenum = edgenr[edge.I2()];
/*
if (edgedir) edgenum *= -1;
edges[elnr][k] = edgenum;
*/
edges[elnr][k].nr = edgenum-1; edges[elnr][k].nr = edgenum-1;
edges[elnr][k].orient = edgedir; edges[elnr][k].orient = edgedir;
} }
@ -573,8 +569,6 @@ namespace netgen
if (edge.I1() != i) continue; if (edge.I1() != i) continue;
int edgenum = edgenr[edge.I2()]; int edgenum = edgenr[edge.I2()];
// if (edgedir) edgenum *= -1;
// surfedges.Elem(elnr)[k] = edgenum;
surfedges[elnr][k].nr = edgenum-1; surfedges[elnr][k].nr = edgenum-1;
surfedges[elnr][k].orient = edgedir; surfedges[elnr][k].orient = edgedir;
} }
@ -593,10 +587,6 @@ namespace netgen
if (edge.I1() != i) continue; if (edge.I1() != i) continue;
int edgenum = edgenr[edge.I2()]; int edgenum = edgenr[edge.I2()];
/*
if (edgedir) edgenum *= -1;
segedges.Elem(elnr) = edgenum;
*/
segedges[elnr].nr = edgenum-1; segedges[elnr].nr = edgenum-1;
segedges[elnr].orient = edgedir; segedges[elnr].orient = edgedir;
} }
@ -690,7 +680,6 @@ namespace netgen
}); });
cnt[v] = cnti; cnt[v] = cnti;
} }
cout << "myrange = " << begin << " - " << end << endl;
} ); } );
NgProfiler::StopTimer (timer2b1); NgProfiler::StopTimer (timer2b1);
@ -704,70 +693,78 @@ namespace netgen
} }
face2vert.SetSize(nfa); face2vert.SetSize(nfa);
for (auto v : mesh.Points().Range()) // for (auto v : mesh.Points().Range())
{
int first_fa = cnt[v];
int nfa = first_fa;
vert2face.DeleteData();
for (int j = 0; j < vert2oldface[v].Size(); j++) ParallelForRange
{ (tm, mesh.Points().Size(),
int fnr = vert2oldface[v][j]; [&] (size_t begin, size_t end)
INDEX_3 face (face2vert[fnr].I1(), {
face2vert[fnr].I2(), INDEX_3_CLOSED_HASHTABLE<int> vert2face(2*max_face_on_vertex+10);
face2vert[fnr].I3()); for (PointIndex v = begin+PointIndex::BASE;
vert2face.Set (face, fnr); v < end+PointIndex::BASE; v++)
} {
int first_fa = cnt[v];
int nfa = first_fa;
vert2face.DeleteData();
LoopOverFaces (mesh, *this, v, for (int j = 0; j < vert2oldface[v].Size(); j++)
[&] (INDEX_4 i4, int elnr, int j, bool volume, int facedir) {
{ int fnr = vert2oldface[v][j];
INDEX_3 face(i4.I1(), i4.I2(), i4.I3()); INDEX_3 face (face2vert[fnr].I1(),
if (!vert2face.Used (face)) face2vert[fnr].I2(),
{ face2vert[fnr].I3());
face2vert[nfa] = i4; vert2face.Set (face, fnr);
vert2face.Set (face, nfa); }
nfa++;
} LoopOverFaces (mesh, *this, v,
}); [&] (INDEX_4 i4, int elnr, int j, bool volume, int facedir)
{
INDEX_3 face(i4.I1(), i4.I2(), i4.I3());
if (!vert2face.Used (face))
{
face2vert[nfa] = i4;
vert2face.Set (face, nfa);
nfa++;
}
});
QuickSort (face2vert.Range(first_fa, nfa)); QuickSort (face2vert.Range(first_fa, nfa));
for (int j = first_fa; j < nfa; j++) for (int j = first_fa; j < nfa; j++)
{ {
if (face2vert[j][0] == v) if (face2vert[j][0] == v)
{ {
INDEX_3 face (face2vert[j].I1(), INDEX_3 face (face2vert[j].I1(),
face2vert[j].I2(), face2vert[j].I2(),
face2vert[j].I3()); face2vert[j].I3());
vert2face.Set (face, j); vert2face.Set (face, j);
} }
else else
break; break;
} }
LoopOverFaces (mesh, *this, v, LoopOverFaces (mesh, *this, v,
[&] (INDEX_4 i4, int elnr, int j, bool volume, int facedir) [&] (INDEX_4 i4, int elnr, int j, bool volume, int facedir)
{ {
INDEX_3 face(i4.I1(), i4.I2(), i4.I3()); INDEX_3 face(i4.I1(), i4.I2(), i4.I3());
int facenum = vert2face.Get(face); int facenum = vert2face.Get(face);
if (volume) if (volume)
{ {
faces[elnr][j].fnr = facenum; faces[elnr][j].fnr = facenum;
faces[elnr][j].forient = facedir; faces[elnr][j].forient = facedir;
} }
else else
{ {
surffaces[elnr].fnr = facenum; surffaces[elnr].fnr = facenum;
surffaces[elnr].forient = facedir; surffaces[elnr].forient = facedir;
} }
}); });
} }
});
/* /*
int oldnfa = face2vert.Size(); int oldnfa = face2vert.Size();
int nfa = oldnfa; int nfa = oldnfa;
INDEX_3_CLOSED_HASHTABLE<int> vert2face(2*max_face_on_vertex+10); INDEX_3_CLOSED_HASHTABLE<int> vert2face(2*max_face_on_vertex+10);