mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-25 21:40:33 +05:00
start face-hierarchy in Netgen
This commit is contained in:
parent
2e69b39339
commit
87e472b6fc
@ -174,6 +174,13 @@ namespace ngcore
|
|||||||
{
|
{
|
||||||
return MakeTupleFromInt<N>()(*this);
|
return MakeTupleFromInt<N>()(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Contains (T val)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < N; j++)
|
||||||
|
if (i[j] == val) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// sort 2 integers
|
/// sort 2 integers
|
||||||
|
@ -696,8 +696,8 @@ namespace netgen
|
|||||||
{
|
{
|
||||||
auto verts = edge2vert[i]; // 2 vertices of edge
|
auto verts = edge2vert[i]; // 2 vertices of edge
|
||||||
|
|
||||||
if (verts[0] > mesh->mlbetweennodes.Size()+PointIndex::BASE ||
|
if (verts[0] >= mesh->mlbetweennodes.Size()+PointIndex::BASE ||
|
||||||
verts[1] > mesh->mlbetweennodes.Size()+PointIndex::BASE)
|
verts[1] >= mesh->mlbetweennodes.Size()+PointIndex::BASE)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
auto pa0 = mesh->mlbetweennodes[verts[0]]; // two parent vertices of v0
|
auto pa0 = mesh->mlbetweennodes[verts[0]]; // two parent vertices of v0
|
||||||
@ -1436,6 +1436,61 @@ namespace netgen
|
|||||||
cout << cnt_err << " elements are not matching !!!" << endl;
|
cout << cnt_err << " elements are not matching !!!" << endl;
|
||||||
}
|
}
|
||||||
// NgProfiler::StopTimer (timer2c);
|
// NgProfiler::StopTimer (timer2c);
|
||||||
|
|
||||||
|
|
||||||
|
if (build_hierarchy)
|
||||||
|
{
|
||||||
|
// tets only
|
||||||
|
|
||||||
|
ngcore::ClosedHashTable<INT<3>, int> v2f(nv);
|
||||||
|
for (auto i : Range(face2vert))
|
||||||
|
{
|
||||||
|
auto face = face2vert[i];
|
||||||
|
INT<3> f3(face[0], face[1], face[2]);
|
||||||
|
f3.Sort();
|
||||||
|
v2f[f3] = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
cout << "v2f:" << endl << v2f << endl;
|
||||||
|
|
||||||
|
parent_faces.SetSize (nfa);
|
||||||
|
parent_faces = { -1, { -1, -1, -1, -1 } };
|
||||||
|
|
||||||
|
for (auto i : Range(nfa))
|
||||||
|
{
|
||||||
|
INT<3,PointIndex> f3(face2vert[i][0], face2vert[i][1], face2vert[i][2]);
|
||||||
|
PointIndex vmax = Max(f3);
|
||||||
|
if (vmax >= mesh->mlbetweennodes.Size()+PointIndex::BASE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
auto parents = mesh->mlbetweennodes[vmax];
|
||||||
|
|
||||||
|
// is face part of one parent face (boundary-face) ?
|
||||||
|
for (int j = 0; j < 2; j++)
|
||||||
|
{
|
||||||
|
if (f3.Contains(parents[j]))
|
||||||
|
{
|
||||||
|
PointIndex v0 = parents[j];
|
||||||
|
PointIndex v1 = parents[1-j];
|
||||||
|
|
||||||
|
// the third one, on the tip
|
||||||
|
PointIndex v2 = f3[0]+f3[1]+f3[2] - v0 - v1;
|
||||||
|
|
||||||
|
int classnr = 0;
|
||||||
|
if (v0 > v1) { Swap (v0, v1); classnr += 1; }
|
||||||
|
if (v1 > v2) { Swap (v1, v2); classnr += 2; }
|
||||||
|
if (v0 > v1) { Swap (v0, v1); classnr += 4; }
|
||||||
|
|
||||||
|
INT<3> parentverts(v0, v1, v2);
|
||||||
|
int pafacenr = v2f[parentverts];
|
||||||
|
cout << "parent-face = " << pafacenr << endl;
|
||||||
|
parent_faces[i] = { classnr, { pafacenr, -1, -1, -1 } };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user