cleanup parent_edges

This commit is contained in:
Joachim Schoeberl 2021-02-10 19:39:52 +01:00
parent 39063eb961
commit 2e69b39339

View File

@ -683,74 +683,49 @@ namespace netgen
{ {
static Timer t("build_hierarchy"); RegionTimer reg(t); static Timer t("build_hierarchy"); RegionTimer reg(t);
cnt = 0; cnt = 0;
for (size_t i = 0; i < edge2vert.Size(); i++) for (auto verts : edge2vert) cnt[verts[0]]++;
cnt[edge2vert[i][0]]++;
TABLE<int,PointIndex::BASE> vert2edge (cnt); TABLE<int,PointIndex::BASE> vert2edge (cnt);
for (size_t i = 0; i < edge2vert.Size(); i++) for (auto i : edge2vert.Range())
vert2edge.AddSave (edge2vert[i][0], i); vert2edge.AddSave (edge2vert[i][0], i);
// build edge hierarchy: // build edge hierarchy:
parent_edges.SetSize (ned); parent_edges.SetSize (ned);
parent_edges = { -1, { -1, -1, -1 } }; parent_edges = { -1, { -1, -1, -1 } };
/*
cout << "mlbetween = " << mesh->mlbetweennodes.Size() << endl;
cout << "mlbetween = " << endl << mesh->mlbetweennodes << endl;
cout << "v2e = " << endl << vert2edge << endl;
cout << "e2v = " << endl << edge2vert << endl;
cout << "ned = " << ned << endl;
*/
for (size_t i = 0; i < ned; i++) for (size_t i = 0; i < ned; i++)
{ {
// cout << " ref edge " << i << "/" << ned << endl; auto verts = edge2vert[i]; // 2 vertices of edge
/*
int pa1[2], pa2[2];
ma->GetParentNodes (i2[0], pa1);
ma->GetParentNodes (i2[1], pa2);
*/
auto i2 = edge2vert[i]; // 2 vertices of edge
if (i2[0] > mesh->mlbetweennodes.Size()+PointIndex::BASE || if (verts[0] > mesh->mlbetweennodes.Size()+PointIndex::BASE ||
i2[1] > mesh->mlbetweennodes.Size()+PointIndex::BASE) verts[1] > mesh->mlbetweennodes.Size()+PointIndex::BASE)
continue; continue;
// cout << "i2 = " << i2 << endl; auto pa0 = mesh->mlbetweennodes[verts[0]]; // two parent vertices of v0
auto pa1 = mesh->mlbetweennodes[i2[0]]; // two parent vertices of v0 auto pa1 = mesh->mlbetweennodes[verts[1]]; // two parent vertices of v1
auto pa2 = mesh->mlbetweennodes[i2[1]]; // two parent vertices of v1
// cout << "pa1 = " << pa1 << endl;
// cout << "pa2 = " << pa2 << endl;
//if (pa1[0] == -1 && pa2[0] == -1)
// continue;
// both vertices are on coarsest mesh // both vertices are on coarsest mesh
if (!pa1[0].IsValid() && !pa2[0].IsValid()) if (!pa0[0].IsValid() && !pa1[0].IsValid())
continue; continue;
int issplitedge = 0; int issplitedge = 0;
if (pa1[0] == i2[1] || pa1[1] == i2[1]) if (pa0[0] == verts[1] || pa0[1] == verts[1])
issplitedge = 1; issplitedge = 1;
if (pa2[0] == i2[0] || pa2[1] == i2[0]) if (pa1[0] == verts[0] || pa1[1] == verts[0])
issplitedge = 2; issplitedge = 2;
if (issplitedge) if (issplitedge)
{ {
// cout << "split edge " << endl; // cout << "split edge " << endl;
// edge is obtained by splitting one edge into two parts: // edge is obtained by splitting one edge into two parts:
INT<2> paedge; auto paedge = issplitedge == 1 ? pa0 : pa1;
if (issplitedge == 1)
paedge = INT<2> (pa1[0], pa1[1]);
else
paedge = INT<2> (pa2[0], pa2[1]);
if (paedge[0] > paedge[1]) if (paedge[0] > paedge[1])
Swap (paedge[0], paedge[1]); Swap (paedge[0], paedge[1]);
for (int ednr : vert2edge[paedge[0]]) for (int ednr : vert2edge[paedge[0]])
if (auto ic2 = edge2vert[ednr]; ic2[1] == paedge[1]) if (auto cverts = edge2vert[ednr]; cverts[1] == paedge[1])
{ {
// cout << "matching: " << ednr << endl; int orient = (paedge[0] == verts[0] || paedge[1] == verts[1]) ? 1 : 0;
int orient = (paedge[0] == i2[0] || paedge[1] == i2[1]) ? 1 : 0;
parent_edges[i] = { orient, { ednr, -1, -1 } }; parent_edges[i] = { orient, { ednr, -1, -1 } };
} }
} }
@ -763,16 +738,16 @@ namespace netgen
int orient_inner = 0; int orient_inner = 0;
if (j == 1) if (j == 1)
{ {
paedge1 = INT<2> (pa1[0], i2[1]); paedge1 = INT<2> (pa0[0], verts[1]);
paedge2 = INT<2> (pa1[1], i2[1]); paedge2 = INT<2> (pa0[1], verts[1]);
paedge3 = INT<2> (pa1[0], pa1[1]); paedge3 = INT<2> (pa0[0], pa0[1]);
orient_inner = 0; orient_inner = 0;
} }
else else
{ {
paedge1 = INT<2> (pa2[0], i2[0]); paedge1 = INT<2> (pa1[0], verts[0]);
paedge2 = INT<2> (pa2[1], i2[0]); paedge2 = INT<2> (pa1[1], verts[0]);
paedge3 = INT<2> (pa2[0], pa2[1]); paedge3 = INT<2> (pa1[0], pa1[1]);
orient_inner = 1; orient_inner = 1;
} }
if (paedge1[0] > paedge1[1]) if (paedge1[0] > paedge1[1])
@ -782,35 +757,27 @@ namespace netgen
if (paedge3[0] > paedge3[1]) if (paedge3[0] > paedge3[1])
Swap (paedge3[0], paedge3[1]); Swap (paedge3[0], paedge3[1]);
// cout << "paedge1 = " << paedge1 << ", paedge2 = " << paedge2 << endl;
// if first vertex number is -1, then don't try to find entry in node2edge hash table // if first vertex number is -1, then don't try to find entry in node2edge hash table
if ( paedge1[0] == PointIndex::BASE-1 || paedge2[0] == PointIndex::BASE-1 ) if ( paedge1[0] == PointIndex::BASE-1 || paedge2[0] == PointIndex::BASE-1 )
continue; continue;
int paedgenr1=-1, paedgenr2=-1, paedgenr3=-1, orient1 = 0, orient2 = 0; int paedgenr1=-1, paedgenr2=-1, paedgenr3=-1, orient1 = 0, orient2 = 0;
for (int ednr : vert2edge[paedge1[0]]) for (int ednr : vert2edge[paedge1[0]])
if (auto ic2 = edge2vert[ednr]; ic2[1] == paedge1[1]) if (auto cverts = edge2vert[ednr]; cverts[1] == paedge1[1])
{ {
paedgenr1 = ednr; paedgenr1 = ednr;
// cout << "ednr = " << ednr << ", i2 = " << i2 << endl; orient1 = (paedge1[0] == verts[0] || paedge1[1] == verts[1]) ? 1 : 0;
orient1 = (paedge1[0] == i2[0] || paedge1[1] == i2[1]) ? 1 : 0;
// cout << "orient1 = " << orient1 << endl;
} }
for (int ednr : vert2edge[paedge2[0]]) for (int ednr : vert2edge[paedge2[0]])
if (auto ic2 = edge2vert[ednr]; ic2[1] == paedge2[1]) if (auto cverts = edge2vert[ednr]; cverts[1] == paedge2[1])
{ {
paedgenr2 = ednr; paedgenr2 = ednr;
// cout << "ednr = " << ednr << ", i2 = " << i2 << endl; orient2 = (paedge2[0] == verts[0] || paedge2[1] == verts[1]) ? 1 : 0;
orient2 = (paedge2[0] == i2[0] || paedge2[1] == i2[1]) ? 1 : 0;
// cout << "orient2 = " << orient2 << endl;
} }
for (int ednr : vert2edge[paedge3[0]]) for (int ednr : vert2edge[paedge3[0]])
if (auto ic2 = edge2vert[ednr]; ic2[1] == paedge3[1]) if (auto cverts = edge2vert[ednr]; cverts[1] == paedge3[1])
{ paedgenr3 = ednr;
paedgenr3 = ednr;
// cout << "ednr = " << ednr << ", i2 = " << i2 << endl;
}
if (paedgenr1 != -1 && paedgenr2 != -1) if (paedgenr1 != -1 && paedgenr2 != -1)
parent_edges[i] = { orient1+2*orient2+4*orient_inner, { paedgenr1, paedgenr2, paedgenr3 } }; parent_edges[i] = { orient1+2*orient2+4*orient_inner, { paedgenr1, paedgenr2, paedgenr3 } };