mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-26 22:00:33 +05:00
Boundary layers - interpolate accross "inner" edges
Inner edges meaning that it's adjacent to two moved faces which have the same normal vector (there is no kink at this edge)
This commit is contained in:
parent
8101aa14d9
commit
46461fd166
@ -60,6 +60,7 @@ public:
|
|||||||
BitArray moved_surfaces;
|
BitArray moved_surfaces;
|
||||||
int np, nseg, nse, ne;
|
int np, nseg, nse, ne;
|
||||||
double total_height;
|
double total_height;
|
||||||
|
Array<POINTTYPE, PointIndex> point_types;
|
||||||
|
|
||||||
// These parameters are derived from given BoundaryLayerParameters and the Mesh
|
// These parameters are derived from given BoundaryLayerParameters and the Mesh
|
||||||
Array<double> par_heights;
|
Array<double> par_heights;
|
||||||
|
@ -72,6 +72,10 @@ BuildNeighbors (FlatArray<PointIndex> points, const Mesh& mesh)
|
|||||||
|
|
||||||
void BoundaryLayerTool ::InterpolateGrowthVectors()
|
void BoundaryLayerTool ::InterpolateGrowthVectors()
|
||||||
{
|
{
|
||||||
|
point_types.SetSize(mesh.GetNP());
|
||||||
|
for (auto p : mesh.Points().Range())
|
||||||
|
point_types[p] = mesh[p].Type();
|
||||||
|
|
||||||
int new_max_edge_nr = max_edge_nr;
|
int new_max_edge_nr = max_edge_nr;
|
||||||
for (const auto& seg : segments)
|
for (const auto& seg : segments)
|
||||||
if (seg.edgenr > new_max_edge_nr)
|
if (seg.edgenr > new_max_edge_nr)
|
||||||
@ -117,9 +121,49 @@ void BoundaryLayerTool ::InterpolateGrowthVectors()
|
|||||||
},
|
},
|
||||||
mesh.GetNP());
|
mesh.GetNP());
|
||||||
|
|
||||||
|
for (auto edgenr : Range(1, new_max_edge_nr + 1))
|
||||||
|
{
|
||||||
|
// "inner" edges between two flat faces are not treated as edges for interpolation
|
||||||
|
bool no_angles = true;
|
||||||
|
ArrayMem<SurfaceElementIndex, 4> faces;
|
||||||
|
|
||||||
|
for (auto* p_seg : edgenr2seg[edgenr])
|
||||||
|
{
|
||||||
|
auto& seg = *p_seg;
|
||||||
|
faces.SetSize(0);
|
||||||
|
if (seg[0] <= p2sel.Size())
|
||||||
|
{
|
||||||
|
for (auto sei : p2sel[seg[0]])
|
||||||
|
if (moved_surfaces.Test(mesh[sei].GetIndex()) && p2sel[seg[1]].Contains(sei))
|
||||||
|
faces.Append(sei);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (faces.Size() == 2)
|
||||||
|
{
|
||||||
|
auto n0 = getNormal(mesh[faces[0]]);
|
||||||
|
auto n1 = getNormal(mesh[faces[1]]);
|
||||||
|
if (n0 * n1 < 0.999)
|
||||||
|
no_angles = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
no_angles = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (no_angles)
|
||||||
|
{
|
||||||
|
for (auto* p_seg : edgenr2seg[edgenr])
|
||||||
|
for (auto pi : p_seg->PNums())
|
||||||
|
if (pi <= np && point_types[pi] == EDGEPOINT)
|
||||||
|
point_types[pi] = SURFACEPOINT;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (auto edgenr : Range(max_edge_nr + 1, new_max_edge_nr + 1))
|
for (auto edgenr : Range(max_edge_nr + 1, new_max_edge_nr + 1))
|
||||||
{
|
{
|
||||||
double edge_len = 0.;
|
double edge_len = 0.;
|
||||||
|
bool any_grows = false;
|
||||||
|
|
||||||
auto is_end_point = [&] (PointIndex pi) {
|
auto is_end_point = [&] (PointIndex pi) {
|
||||||
auto segs = point2seg[pi];
|
auto segs = point2seg[pi];
|
||||||
@ -132,8 +176,6 @@ void BoundaryLayerTool ::InterpolateGrowthVectors()
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool any_grows = false;
|
|
||||||
|
|
||||||
Array<PointIndex> points;
|
Array<PointIndex> points;
|
||||||
for (auto* p_seg : edgenr2seg[edgenr])
|
for (auto* p_seg : edgenr2seg[edgenr])
|
||||||
{
|
{
|
||||||
@ -280,7 +322,7 @@ void BoundaryLayerTool ::InterpolateSurfaceGrowthVectors()
|
|||||||
for (const auto& sel : mesh.SurfaceElements())
|
for (const auto& sel : mesh.SurfaceElements())
|
||||||
{
|
{
|
||||||
for (auto pi : sel.PNums())
|
for (auto pi : sel.PNums())
|
||||||
if (mesh[pi].Type() == SURFACEPOINT && hasMoved(pi))
|
if (point_types[pi] == SURFACEPOINT && hasMoved(pi))
|
||||||
points_set.insert(pi);
|
points_set.insert(pi);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -406,7 +448,7 @@ void BoundaryLayerTool ::FixSurfaceElements()
|
|||||||
const auto& sel = mesh[sei];
|
const auto& sel = mesh[sei];
|
||||||
if (sel.GetNP() == 3 && is_boundary_moved[sel.GetIndex()])
|
if (sel.GetNP() == 3 && is_boundary_moved[sel.GetIndex()])
|
||||||
for (auto pi : sel.PNums())
|
for (auto pi : sel.PNums())
|
||||||
if (mesh[pi].Type() == SURFACEPOINT)
|
if (point_types[pi] == SURFACEPOINT)
|
||||||
points_set.insert(pi);
|
points_set.insert(pi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user