mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-25 21:40:33 +05:00
more parallelism in netgen-topology
This commit is contained in:
parent
5469356147
commit
789305c3bc
@ -3622,7 +3622,7 @@ namespace netgen
|
||||
mtris.SetAllocSize (mtris.Size());
|
||||
mquads.SetAllocSize (mquads.Size());
|
||||
|
||||
|
||||
(*opt.tracer)("copy tets", false);
|
||||
mesh.ClearVolumeElements();
|
||||
mesh.VolumeElements().SetAllocSize (mtets.Size()+mprisms.Size());
|
||||
for (int i = 1; i <= mtets.Size(); i++)
|
||||
@ -3634,6 +3634,8 @@ namespace netgen
|
||||
el.SetOrder (mtets.Get(i).order);
|
||||
mesh.AddVolumeElement (el);
|
||||
}
|
||||
(*opt.tracer)("copy tets", true);
|
||||
|
||||
for (int i = 1; i <= mprisms.Size(); i++)
|
||||
{
|
||||
Element el(PRISM);
|
||||
@ -3845,7 +3847,10 @@ namespace netgen
|
||||
|
||||
|
||||
mesh.ComputeNVertices();
|
||||
|
||||
(*opt.tracer)("call RebuildSurfElList", false);
|
||||
mesh.RebuildSurfaceElementLists();
|
||||
(*opt.tracer)("call RebuildSurfElList", true);
|
||||
|
||||
|
||||
// update identification tables
|
||||
@ -4027,7 +4032,7 @@ namespace netgen
|
||||
|
||||
NgProfiler::StartTimer (timer3a);
|
||||
(*opt.tracer)("topology from bisect", false);
|
||||
mesh.UpdateTopology(opt.task_manager);
|
||||
mesh.UpdateTopology(opt.task_manager, opt.tracer);
|
||||
(*opt.tracer)("topology from bisect", true);
|
||||
NgProfiler::StopTimer (timer3a);
|
||||
|
||||
|
@ -5768,10 +5768,13 @@ namespace netgen
|
||||
return 1;
|
||||
}
|
||||
|
||||
void Mesh :: UpdateTopology (TaskManager tm)
|
||||
void Mesh :: UpdateTopology (TaskManager tm,
|
||||
Tracer tracer)
|
||||
{
|
||||
topology.Update(tm);
|
||||
topology.Update(tm, tracer);
|
||||
(*tracer)("call update clusters", false);
|
||||
clusters->Update(tm);
|
||||
(*tracer)("call update clusters", true);
|
||||
#ifdef PARALLEL
|
||||
if (paralleltop)
|
||||
{
|
||||
|
@ -705,7 +705,8 @@ namespace netgen
|
||||
const MeshTopology & GetTopology () const
|
||||
{ return topology; }
|
||||
|
||||
DLL_HEADER void UpdateTopology (TaskManager tm = &DummyTaskManager);
|
||||
DLL_HEADER void UpdateTopology (TaskManager tm = &DummyTaskManager,
|
||||
Tracer tracer = &DummyTracer);
|
||||
|
||||
class CurvedElements & GetCurvedElements () const
|
||||
{ return *curvedelems; }
|
||||
|
@ -4,6 +4,11 @@
|
||||
namespace netgen
|
||||
{
|
||||
|
||||
template<typename T>
|
||||
inline atomic<T> & AsAtomic (T & d)
|
||||
{
|
||||
return reinterpret_cast<atomic<T>&> (d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -331,7 +336,7 @@ namespace netgen
|
||||
}
|
||||
|
||||
|
||||
void MeshTopology :: Update (TaskManager tm)
|
||||
void MeshTopology :: Update (TaskManager tm, Tracer tracer)
|
||||
{
|
||||
static int timer = NgProfiler::CreateTimer ("topology");
|
||||
NgProfiler::RegionTimer reg (timer);
|
||||
@ -358,7 +363,8 @@ namespace netgen
|
||||
(*testout) << "nseg = " << nseg << endl;
|
||||
(*testout) << "np = " << np << endl;
|
||||
(*testout) << "nv = " << nv << endl;
|
||||
|
||||
|
||||
(*tracer) ("Topology::Update setup tables", false);
|
||||
Array<int,PointIndex::BASE> cnt(nv);
|
||||
Array<int> vnums;
|
||||
|
||||
@ -369,13 +375,26 @@ namespace netgen
|
||||
vertex to segment
|
||||
*/
|
||||
cnt = 0;
|
||||
/*
|
||||
for (ElementIndex ei = 0; ei < ne; ei++)
|
||||
{
|
||||
const Element & el = (*mesh)[ei];
|
||||
for (int j = 0; j < el.GetNV(); j++)
|
||||
cnt[el[j]]++;
|
||||
}
|
||||
|
||||
*/
|
||||
ParallelForRange
|
||||
(tm, ne,
|
||||
[&] (size_t begin, size_t end)
|
||||
{
|
||||
for (ElementIndex ei = begin; ei < end; ei++)
|
||||
{
|
||||
const Element & el = (*mesh)[ei];
|
||||
for (int j = 0; j < el.GetNV(); j++)
|
||||
AsAtomic(cnt[el[j]])++;
|
||||
}
|
||||
});
|
||||
|
||||
vert2element = TABLE<ElementIndex,PointIndex::BASE> (cnt);
|
||||
for (ElementIndex ei = 0; ei < ne; ei++)
|
||||
{
|
||||
@ -385,12 +404,27 @@ namespace netgen
|
||||
}
|
||||
|
||||
cnt = 0;
|
||||
/*
|
||||
for (SurfaceElementIndex sei = 0; sei < nse; sei++)
|
||||
{
|
||||
const Element2d & el = (*mesh)[sei];
|
||||
for (int j = 0; j < el.GetNV(); j++)
|
||||
cnt[el[j]]++;
|
||||
}
|
||||
*/
|
||||
ParallelForRange
|
||||
(tm, nse,
|
||||
[&] (size_t begin, size_t end)
|
||||
{
|
||||
for (SurfaceElementIndex ei = begin; ei < end; ei++)
|
||||
{
|
||||
const Element2d & el = (*mesh)[ei];
|
||||
for (int j = 0; j < el.GetNV(); j++)
|
||||
AsAtomic(cnt[el[j]])++;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
vert2surfelement = TABLE<SurfaceElementIndex,PointIndex::BASE> (cnt);
|
||||
for (SurfaceElementIndex sei = 0; sei < nse; sei++)
|
||||
@ -430,6 +464,7 @@ namespace netgen
|
||||
const Element0d & pointel = mesh->pointelements[pei];
|
||||
vert2pointelement.AddSave (pointel.pnum, pei);
|
||||
}
|
||||
(*tracer) ("Topology::Update setup tables", true);
|
||||
|
||||
|
||||
if (buildedges)
|
||||
|
@ -83,7 +83,7 @@ public:
|
||||
bool HasFaces () const
|
||||
{ return buildfaces; }
|
||||
|
||||
void Update(TaskManager tm = &DummyTaskManager);
|
||||
void Update(TaskManager tm = &DummyTaskManager, Tracer tracer = &DummyTracer);
|
||||
|
||||
|
||||
int GetNEdges () const { return edge2vert.Size(); }
|
||||
|
Loading…
Reference in New Issue
Block a user