mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-26 13:50:33 +05:00
Move BuildEdgeList to improve2.hpp
This commit is contained in:
parent
59c355dbed
commit
19c86a9f3d
@ -1,6 +1,61 @@
|
|||||||
#ifndef FILE_IMPROVE2
|
#ifndef FILE_IMPROVE2
|
||||||
#define FILE_IMPROVE2
|
#define FILE_IMPROVE2
|
||||||
|
|
||||||
|
template<typename TINDEX>
|
||||||
|
void BuildEdgeList( const Mesh & mesh, const Table<TINDEX, PointIndex> & elementsonnode, Array<std::tuple<PointIndex, PointIndex>> & edges )
|
||||||
|
{
|
||||||
|
static Timer tbuild_edges("Build edges"); RegionTimer reg(tbuild_edges);
|
||||||
|
|
||||||
|
static constexpr int tetedges[6][2] =
|
||||||
|
{ { 0, 1 }, { 0, 2 }, { 0, 3 },
|
||||||
|
{ 1, 2 }, { 1, 3 }, { 2, 3 } };
|
||||||
|
|
||||||
|
int ntasks = 2*ngcore::TaskManager::GetMaxThreads();
|
||||||
|
Array<Array<std::tuple<PointIndex,PointIndex>>> task_edges(ntasks);
|
||||||
|
|
||||||
|
ParallelFor(IntRange(ntasks), [&] (int ti)
|
||||||
|
{
|
||||||
|
auto myrange = mesh.Points().Range().Split(ti, ntasks);
|
||||||
|
ArrayMem<std::tuple<PointIndex,PointIndex>, 100> local_edges;
|
||||||
|
for (auto pi : myrange)
|
||||||
|
{
|
||||||
|
local_edges.SetSize(0);
|
||||||
|
|
||||||
|
for(auto ei : elementsonnode[pi])
|
||||||
|
{
|
||||||
|
const auto & elem = mesh[ei];
|
||||||
|
if (elem.IsDeleted()) continue;
|
||||||
|
|
||||||
|
for (int j = 0; j < 6; j++)
|
||||||
|
{
|
||||||
|
PointIndex pi0 = elem[tetedges[j][0]];
|
||||||
|
PointIndex pi1 = elem[tetedges[j][1]];
|
||||||
|
if (pi1 < pi0) Swap(pi0, pi1);
|
||||||
|
if(pi0==pi)
|
||||||
|
local_edges.Append(std::make_tuple(pi0, pi1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QuickSort(local_edges);
|
||||||
|
|
||||||
|
auto edge_prev = std::make_tuple<PointIndex, PointIndex>(-1,-1);
|
||||||
|
|
||||||
|
for(auto edge : local_edges)
|
||||||
|
if(edge != edge_prev)
|
||||||
|
{
|
||||||
|
task_edges[ti].Append(edge);
|
||||||
|
edge_prev = edge;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, ntasks);
|
||||||
|
|
||||||
|
int num_edges = 0;
|
||||||
|
for (auto & edg : task_edges)
|
||||||
|
num_edges += edg.Size();
|
||||||
|
edges.SetAllocSize(num_edges);
|
||||||
|
for (auto & edg : task_edges)
|
||||||
|
edges.Append(edg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class Neighbour
|
class Neighbour
|
||||||
{
|
{
|
||||||
|
@ -409,60 +409,6 @@ void MeshOptimize3d :: CombineImproveSequential (Mesh & mesh,
|
|||||||
multithread.task = savetask;
|
multithread.task = savetask;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MeshOptimize3d :: BuildEdgeList( const Mesh & mesh, const Table<ElementIndex, PointIndex> & elementsonnode, Array<std::tuple<PointIndex, PointIndex>> & edges )
|
|
||||||
{
|
|
||||||
static Timer tbuild_edges("Build edges"); RegionTimer reg(tbuild_edges);
|
|
||||||
|
|
||||||
static constexpr int tetedges[6][2] =
|
|
||||||
{ { 0, 1 }, { 0, 2 }, { 0, 3 },
|
|
||||||
{ 1, 2 }, { 1, 3 }, { 2, 3 } };
|
|
||||||
|
|
||||||
int ntasks = 2*ngcore::TaskManager::GetMaxThreads();
|
|
||||||
Array<Array<std::tuple<PointIndex,PointIndex>>> task_edges(ntasks);
|
|
||||||
|
|
||||||
ParallelFor(IntRange(ntasks), [&] (int ti)
|
|
||||||
{
|
|
||||||
auto myrange = mesh.Points().Range().Split(ti, ntasks);
|
|
||||||
ArrayMem<std::tuple<PointIndex,PointIndex>, 100> local_edges;
|
|
||||||
for (auto pi : myrange)
|
|
||||||
{
|
|
||||||
local_edges.SetSize(0);
|
|
||||||
|
|
||||||
for(auto ei : elementsonnode[pi])
|
|
||||||
{
|
|
||||||
const Element & elem = mesh[ei];
|
|
||||||
if (elem.IsDeleted()) continue;
|
|
||||||
|
|
||||||
for (int j = 0; j < 6; j++)
|
|
||||||
{
|
|
||||||
PointIndex pi0 = elem[tetedges[j][0]];
|
|
||||||
PointIndex pi1 = elem[tetedges[j][1]];
|
|
||||||
if (pi1 < pi0) Swap(pi0, pi1);
|
|
||||||
if(pi0==pi)
|
|
||||||
local_edges.Append(std::make_tuple(pi0, pi1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QuickSort(local_edges);
|
|
||||||
|
|
||||||
auto edge_prev = std::make_tuple<PointIndex, PointIndex>(-1,-1);
|
|
||||||
|
|
||||||
for(auto edge : local_edges)
|
|
||||||
if(edge != edge_prev)
|
|
||||||
{
|
|
||||||
task_edges[ti].Append(edge);
|
|
||||||
edge_prev = edge;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, ntasks);
|
|
||||||
|
|
||||||
int num_edges = 0;
|
|
||||||
for (auto & edg : task_edges)
|
|
||||||
num_edges += edg.Size();
|
|
||||||
edges.SetAllocSize(num_edges);
|
|
||||||
for (auto & edg : task_edges)
|
|
||||||
edges.Append(edg);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MeshOptimize3d :: CombineImprove (Mesh & mesh,
|
void MeshOptimize3d :: CombineImprove (Mesh & mesh,
|
||||||
OPTIMIZEGOAL goal)
|
OPTIMIZEGOAL goal)
|
||||||
{
|
{
|
||||||
|
@ -12,8 +12,6 @@ class MeshOptimize3d
|
|||||||
{
|
{
|
||||||
const MeshingParameters & mp;
|
const MeshingParameters & mp;
|
||||||
|
|
||||||
void BuildEdgeList( const Mesh & mesh, const Table<ElementIndex, PointIndex> & elementsonnode, Array<std::tuple<PointIndex, PointIndex>> & edges );
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MeshOptimize3d (const MeshingParameters & amp) : mp(amp) { ; }
|
MeshOptimize3d (const MeshingParameters & amp) : mp(amp) { ; }
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user