mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-24 21:10:33 +05:00
interpolate tangential part of growth vector along edge
This commit is contained in:
parent
dabb3b9dbf
commit
3a86103392
@ -156,7 +156,7 @@ namespace netgen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
seg.edgenr = topo.GetEdge(segi)+1;
|
// seg.edgenr = topo.GetEdge(segi)+1;
|
||||||
segments.Append(seg);
|
segments.Append(seg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -291,6 +291,8 @@ namespace netgen
|
|||||||
|
|
||||||
// moved segments
|
// moved segments
|
||||||
Array<SegmentIndex> moved_segs;
|
Array<SegmentIndex> moved_segs;
|
||||||
|
BitArray moved_edges(max_edge_nr+1);
|
||||||
|
moved_edges = false;
|
||||||
Array<Segment> new_segments;
|
Array<Segment> new_segments;
|
||||||
|
|
||||||
// boundaries to project endings to
|
// boundaries to project endings to
|
||||||
@ -307,6 +309,7 @@ namespace netgen
|
|||||||
segs_done.SetBit(si);
|
segs_done.SetBit(si);
|
||||||
segmap[si].Append(make_pair(si, 0));
|
segmap[si].Append(make_pair(si, 0));
|
||||||
moved_segs.Append(si);
|
moved_segs.Append(si);
|
||||||
|
moved_edges.SetBit(segi.edgenr);
|
||||||
for(auto sj : Range(segments))
|
for(auto sj : Range(segments))
|
||||||
{
|
{
|
||||||
if(segs_done.Test(sj)) continue;
|
if(segs_done.Test(sj)) continue;
|
||||||
@ -402,6 +405,73 @@ namespace netgen
|
|||||||
Array<int, PointIndex> p2face(mesh.GetNP());
|
Array<int, PointIndex> p2face(mesh.GetNP());
|
||||||
p2face = 0;
|
p2face = 0;
|
||||||
|
|
||||||
|
// interpolate tangential component of growth vector along edge
|
||||||
|
for(auto edgenr : Range(max_edge_nr))
|
||||||
|
{
|
||||||
|
if(!moved_edges[edgenr+1]) continue;
|
||||||
|
// can only interpolate on geometry edges
|
||||||
|
if(!mesh.GetGeometry())
|
||||||
|
break;
|
||||||
|
const auto& geo = *mesh.GetGeometry();
|
||||||
|
if(edgenr >= geo.GetNEdges())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// build sorted list of edge
|
||||||
|
Array<PointIndex> points;
|
||||||
|
// find first vertex on edge
|
||||||
|
for(const auto& seg : segments)
|
||||||
|
{
|
||||||
|
if(seg.edgenr-1 == edgenr && mesh[seg[0]].Type() == FIXEDPOINT)
|
||||||
|
{
|
||||||
|
points.Append(seg[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
for(auto si : meshtopo.GetVertexSegments(points.Last()))
|
||||||
|
{
|
||||||
|
const auto& seg = mesh[si];
|
||||||
|
if(seg.edgenr-1 != edgenr)
|
||||||
|
continue;
|
||||||
|
if(seg[0] == points.Last() &&
|
||||||
|
(points.Size() < 2 || points[points.Size()-2] !=seg[1]))
|
||||||
|
{
|
||||||
|
points.Append(seg[1]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(mesh[points.Last()].Type() == FIXEDPOINT)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// tangential part of growth vectors
|
||||||
|
EdgePointGeomInfo gi;
|
||||||
|
Point<3> p = mesh[points[0]];
|
||||||
|
const auto& edge = geo.GetEdge(edgenr);
|
||||||
|
edge.ProjectPoint(p, &gi);
|
||||||
|
auto tau1 = gi.dist;
|
||||||
|
auto t1 = edge.GetTangent(tau1);
|
||||||
|
t1 *= 1./t1.Length();
|
||||||
|
p = mesh[points.Last()];
|
||||||
|
edge.ProjectPoint(p, &gi);
|
||||||
|
auto tau2 = gi.dist;
|
||||||
|
auto t2 = edge.GetTangent(gi.dist);
|
||||||
|
t2 *= 1./t2.Length();
|
||||||
|
auto gt1 = (growthvectors[points[0]] * t1) * t1;
|
||||||
|
auto gt2 = (growthvectors[points.Last()] * t2) * t2;
|
||||||
|
|
||||||
|
for(size_t i = 1; i < points.Size()-1; i++)
|
||||||
|
{
|
||||||
|
auto pi = points[i];
|
||||||
|
p = mesh[pi];
|
||||||
|
edge.ProjectPoint(p, &gi);
|
||||||
|
auto tau = gi.dist;
|
||||||
|
auto interpol = (1-fabs(tau-tau1)) * gt1 + (1-fabs(tau-tau2))*gt2;
|
||||||
|
growthvectors[pi] += interpol;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// interpolate growth vectors at inner surface points from surrounding edge points
|
// interpolate growth vectors at inner surface points from surrounding edge points
|
||||||
Array<SurfaceElementIndex> surface_els;
|
Array<SurfaceElementIndex> surface_els;
|
||||||
Array<PointIndex> edge_points;
|
Array<PointIndex> edge_points;
|
||||||
|
Loading…
Reference in New Issue
Block a user