mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-24 21:10:33 +05:00
less hash-table searching in buildedges
This commit is contained in:
parent
0605097bdc
commit
054386388e
@ -632,24 +632,16 @@ namespace ngcore
|
|||||||
size_t UsedElements () const
|
size_t UsedElements () const
|
||||||
{
|
{
|
||||||
return used;
|
return used;
|
||||||
/*
|
|
||||||
size_t cnt = 0;
|
|
||||||
for (size_t i = 0; i < size; i++)
|
|
||||||
if (hash[i] != invalid)
|
|
||||||
cnt++;
|
|
||||||
return cnt;
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t Position (const T_HASH ind) const
|
size_t Position (const T_HASH ind) const
|
||||||
{
|
{
|
||||||
size_t i = HashValue2(ind, mask);
|
size_t i = HashValue2(ind, mask);
|
||||||
while (1)
|
while (true)
|
||||||
{
|
{
|
||||||
if (hash[i] == ind) return i;
|
if (hash[i] == ind) return i;
|
||||||
if (hash[i] == invalid) return size_t(-1);
|
if (hash[i] == invalid) return size_t(-1);
|
||||||
i++;
|
i = (i+1) & mask;
|
||||||
if (i >= size) i = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -668,7 +660,7 @@ namespace ngcore
|
|||||||
|
|
||||||
size_t i = HashValue2 (ind, mask);
|
size_t i = HashValue2 (ind, mask);
|
||||||
|
|
||||||
while (1)
|
while (true)
|
||||||
{
|
{
|
||||||
if (hash[i] == invalid)
|
if (hash[i] == invalid)
|
||||||
{
|
{
|
||||||
@ -682,8 +674,7 @@ namespace ngcore
|
|||||||
apos = i;
|
apos = i;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
i++;
|
i = (i+1) & mask;
|
||||||
if (i >= size) i = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -523,32 +523,24 @@ namespace netgen
|
|||||||
v2eht.Set (v2, ednr);
|
v2eht.Set (v2, ednr);
|
||||||
}
|
}
|
||||||
|
|
||||||
int cnti = 0;
|
size_t usedold = v2eht.UsedElements();
|
||||||
|
|
||||||
for (int v2 : vert2vertcoarse[v])
|
for (int v2 : vert2vertcoarse[v])
|
||||||
if (!v2eht.Used(v2))
|
v2eht.Set (v2, 33); // some value
|
||||||
{
|
|
||||||
cnti++;
|
|
||||||
v2eht.Set (v2, 33); // some value
|
|
||||||
}
|
|
||||||
|
|
||||||
LoopOverEdges (*mesh, *this, v,
|
LoopOverEdges (*mesh, *this, v,
|
||||||
[&] (INDEX_2 edge, int elnr, int loc_edge, int element_dim)
|
[&] (INDEX_2 edge, int elnr, int loc_edge, int element_dim)
|
||||||
{
|
{
|
||||||
if (!v2eht.Used (edge.I2()))
|
v2eht.Set (edge[1], 33); // something
|
||||||
{
|
|
||||||
cnti++;
|
|
||||||
v2eht.Set (edge.I2(), 33); // something
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
cnt[v] = cnti;
|
|
||||||
|
cnt[v] = v2eht.UsedElements()-usedold;
|
||||||
}
|
}
|
||||||
}, TasksPerThread(4) );
|
}, TasksPerThread(4) );
|
||||||
|
|
||||||
// accumulate number of edges
|
// accumulate number of edges
|
||||||
int ned = edge2vert.Size();
|
int ned = edge2vert.Size();
|
||||||
|
|
||||||
// for (size_t v = 0; v < mesh->GetNV(); v++)
|
|
||||||
for (size_t v : cnt.Range())
|
for (size_t v : cnt.Range())
|
||||||
{
|
{
|
||||||
auto hv = cnt[v];
|
auto hv = cnt[v];
|
||||||
@ -570,14 +562,15 @@ namespace netgen
|
|||||||
auto begin = r.First();
|
auto begin = r.First();
|
||||||
auto end = r.Next();
|
auto end = r.Next();
|
||||||
// INDEX_CLOSED_HASHTABLE<int> v2eht(2*max_edge_on_vertex+10);
|
// INDEX_CLOSED_HASHTABLE<int> v2eht(2*max_edge_on_vertex+10);
|
||||||
ngcore::ClosedHashTable<int, int> v2eht(2*max_edge_on_vertex+10);
|
ngcore::ClosedHashTable<int, int> v2eht(2*max_edge_on_vertex+10);
|
||||||
|
|
||||||
Array<int> vertex2;
|
Array<int> vertex2;
|
||||||
for (PointIndex v = begin+PointIndex::BASE;
|
for (PointIndex v = begin+PointIndex::BASE;
|
||||||
v < end+PointIndex::BASE; v++)
|
v < end+PointIndex::BASE; v++)
|
||||||
{
|
{
|
||||||
int ned = cnt[v];
|
int ned = cnt[v];
|
||||||
v2eht.DeleteData();
|
v2eht.DeleteData();
|
||||||
vertex2.SetSize (0);
|
vertex2.SetSize0 ();
|
||||||
|
|
||||||
for (int ednr : vert2edge[v])
|
for (int ednr : vert2edge[v])
|
||||||
{
|
{
|
||||||
@ -595,27 +588,42 @@ namespace netgen
|
|||||||
LoopOverEdges (*mesh, *this, v,
|
LoopOverEdges (*mesh, *this, v,
|
||||||
[&](INDEX_2 edge, int elnr, int loc_edge, int element_dim)
|
[&](INDEX_2 edge, int elnr, int loc_edge, int element_dim)
|
||||||
{
|
{
|
||||||
|
size_t pos;
|
||||||
|
if (v2eht.PositionCreate(edge[1], pos))
|
||||||
|
{
|
||||||
|
vertex2.Append (edge[1]);
|
||||||
|
v2eht.SetData (pos, 33);
|
||||||
|
}
|
||||||
|
/*
|
||||||
if (!v2eht.Used(edge.I2()))
|
if (!v2eht.Used(edge.I2()))
|
||||||
{
|
{
|
||||||
vertex2.Append (edge.I2());
|
vertex2.Append (edge.I2());
|
||||||
v2eht.Set (edge.I2(), 33);
|
v2eht.Set (edge.I2(), 33);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
});
|
});
|
||||||
|
|
||||||
QuickSort (vertex2);
|
QuickSort (vertex2);
|
||||||
|
|
||||||
|
/*
|
||||||
for (int j = 0; j < vertex2.Size(); j++)
|
for (int j = 0; j < vertex2.Size(); j++)
|
||||||
{
|
{
|
||||||
v2eht.Set (vertex2[j], ned);
|
v2eht.Set (vertex2[j], ned);
|
||||||
// edge2vert[ned] = INDEX_2 (v, vertex2[j]);
|
|
||||||
edge2vert[ned] = { v, vertex2[j] };
|
edge2vert[ned] = { v, vertex2[j] };
|
||||||
ned++;
|
ned++;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
for (auto v2 : vertex2)
|
||||||
|
{
|
||||||
|
v2eht.Set (v2, ned);
|
||||||
|
edge2vert[ned] = { v, v2 };
|
||||||
|
ned++;
|
||||||
|
}
|
||||||
|
|
||||||
LoopOverEdges (*mesh, *this, v,
|
LoopOverEdges (*mesh, *this, v,
|
||||||
[&](INDEX_2 edge, int elnr, int loc_edge, int element_dim)
|
[&](INDEX_2 edge, int elnr, int loc_edge, int element_dim)
|
||||||
{
|
{
|
||||||
int edgenum = v2eht.Get(edge.I2());
|
int edgenum = v2eht.Get(edge[1]);
|
||||||
switch (element_dim)
|
switch (element_dim)
|
||||||
{
|
{
|
||||||
case 3:
|
case 3:
|
||||||
|
Loading…
Reference in New Issue
Block a user