boundarylayers sides with separate bcnr and option to set surface

index to -1

this fixes 2 issues:

* If extruded outwards in occ and curvature turned on, if sides are
not set to index -1 then they are curved back towards the face again

* If no different facedescriptor is set, blayer.Boundaries() would
wrongly return the whole boundary and not only the layer part of the side.
This commit is contained in:
Christopher Lackner 2023-03-30 17:19:34 +02:00
parent ad6ffaac05
commit 5b4af26d7d
3 changed files with 59 additions and 8 deletions

View File

@ -601,8 +601,11 @@ namespace netgen
p2sel = mesh.CreatePoint2SurfaceElementTable(); p2sel = mesh.CreatePoint2SurfaceElementTable();
nfd_old = mesh.GetNFD(); nfd_old = mesh.GetNFD();
moved_surfaces.SetSize(nfd_old+1);
moved_surfaces.Clear();
si_map.SetSize(nfd_old+1); si_map.SetSize(nfd_old+1);
si_map = -1; for(auto i : Range(nfd_old+1))
si_map[i] = i;
} }
void BoundaryLayerTool :: CreateNewFaceDescriptors() void BoundaryLayerTool :: CreateNewFaceDescriptors()
@ -610,6 +613,9 @@ namespace netgen
surfacefacs.SetSize(nfd_old+1); surfacefacs.SetSize(nfd_old+1);
surfacefacs = 0.0; surfacefacs = 0.0;
// create new FaceDescriptors // create new FaceDescriptors
domain_map.SetSize(mesh.GetNDomains()+1);
for(auto i : Range(mesh.GetNDomains()+1))
domain_map[i] = i;
for(auto i : Range(1, nfd_old+1)) for(auto i : Range(1, nfd_old+1))
{ {
const auto& fd = mesh.GetFaceDescriptor(i); const auto& fd = mesh.GetFaceDescriptor(i);
@ -623,15 +629,53 @@ namespace netgen
// -1 surf nr is so that curving does not do anything // -1 surf nr is so that curving does not do anything
FaceDescriptor new_fd(-1, isIn ? new_mat_nrs[i] : fd.DomainIn(), FaceDescriptor new_fd(-1, isIn ? new_mat_nrs[i] : fd.DomainIn(),
isIn ? fd.DomainOut() : new_mat_nrs[i], -1); isIn ? fd.DomainOut() : new_mat_nrs[i], -1);
domain_map[isIn ? fd.DomainIn() : fd.DomainOut()] = new_mat_nrs[i];
new_fd.SetBCProperty(new_si); new_fd.SetBCProperty(new_si);
mesh.AddFaceDescriptor(new_fd); mesh.AddFaceDescriptor(new_fd);
si_map[i] = new_si; si_map[i] = new_si;
moved_surfaces.SetBit(i);
mesh.SetBCName(new_si-1, "mapped_" + name); mesh.SetBCName(new_si-1, "mapped_" + name);
} }
} }
} }
} }
void BoundaryLayerTool ::CreateFaceDescriptorsSides()
{
BitArray face_done(mesh.GetNFD()+1);
face_done.Clear();
for(const auto& sel : mesh.SurfaceElements())
{
auto facei = sel.GetIndex();
if(face_done.Test(facei))
continue;
bool point_moved = false;
bool point_fixed = false;
for(auto pi : sel.PNums())
{
if(growthvectors[pi].Length() > 0)
point_moved = true;
else
point_fixed = true;
}
if(point_moved && point_fixed)
{
int new_si = mesh.GetNFD()+1;
const auto& fd = mesh.GetFaceDescriptor(facei);
auto isIn = domains.Test(fd.DomainIn());
auto isOut = domains.Test(fd.DomainOut());
int si = params.sides_keep_surfaceindex ? facei : -1;
FaceDescriptor new_fd(si, domain_map[fd.DomainIn()],
domain_map[fd.DomainOut()], si);
new_fd.SetBCProperty(new_si);
mesh.AddFaceDescriptor(new_fd);
si_map[facei] = new_si;
mesh.SetBCName(new_si-1, fd.GetBCName());
face_done.SetBit(facei);
}
}
}
void BoundaryLayerTool :: CalculateGrowthVectors() void BoundaryLayerTool :: CalculateGrowthVectors()
{ {
growthvectors.SetSize(np); growthvectors.SetSize(np);
@ -777,7 +821,7 @@ namespace netgen
{ {
if(segs_done[si]) continue; if(segs_done[si]) continue;
const auto& segi = segments[si]; const auto& segi = segments[si];
if(si_map[segi.si] == -1) continue; if(!moved_surfaces.Test(segi.si)) continue;
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);
@ -791,7 +835,7 @@ namespace netgen
{ {
segs_done.SetBit(sj); segs_done.SetBit(sj);
int type; int type;
if(si_map[segj.si] != -1) if(moved_surfaces.Test(segj.si))
type = 0; type = 0;
else if(const auto& fd = mesh.GetFaceDescriptor(segj.si); domains.Test(fd.DomainIn()) && domains.Test(fd.DomainOut())) else if(const auto& fd = mesh.GetFaceDescriptor(segj.si); domains.Test(fd.DomainIn()) && domains.Test(fd.DomainOut()))
{ {
@ -1067,7 +1111,7 @@ namespace netgen
sel.GeomInfo()[i].u = 0.0; sel.GeomInfo()[i].u = 0.0;
sel.GeomInfo()[i].v = 0.0; sel.GeomInfo()[i].v = 0.0;
} }
sel.SetIndex(segj.si); sel.SetIndex(si_map[segj.si]);
mesh.AddSurfaceElement(sel); mesh.AddSurfaceElement(sel);
// TODO: Too many, would be enough to only add outermost ones // TODO: Too many, would be enough to only add outermost ones
@ -1117,7 +1161,7 @@ namespace netgen
{ {
// copy because surfaceels array will be resized! // copy because surfaceels array will be resized!
auto sel = mesh[si]; auto sel = mesh[si];
if(si_map[sel.GetIndex()] != -1) if(moved_surfaces.Test(sel.GetIndex()))
{ {
Array<PointIndex> points(sel.PNums()); Array<PointIndex> points(sel.PNums());
if(surfacefacs[sel.GetIndex()] > 0) Swap(points[0], points[2]); if(surfacefacs[sel.GetIndex()] > 0) Swap(points[0], points[2]);
@ -1318,7 +1362,7 @@ namespace netgen
void BoundaryLayerTool :: SetDomInOut() void BoundaryLayerTool :: SetDomInOut()
{ {
for(auto i : Range(1, nfd_old+1)) for(auto i : Range(1, nfd_old+1))
if(si_map[i] != -1) if(moved_surfaces.Test(i))
{ {
if(auto dom = mesh.GetFaceDescriptor(si_map[i]).DomainIn(); dom > ndom_old) if(auto dom = mesh.GetFaceDescriptor(si_map[i]).DomainIn(); dom > ndom_old)
mesh.GetFaceDescriptor(i).SetDomainOut(dom); mesh.GetFaceDescriptor(i).SetDomainOut(dom);
@ -1392,6 +1436,7 @@ namespace netgen
{ {
CreateNewFaceDescriptors(); CreateNewFaceDescriptors();
CalculateGrowthVectors(); CalculateGrowthVectors();
CreateFaceDescriptorsSides();
auto segmap = BuildSegMap(); auto segmap = BuildSegMap();
auto in_surface_direction = ProjectGrowthVectorsOnSurface(); auto in_surface_direction = ProjectGrowthVectorsOnSurface();

View File

@ -19,6 +19,7 @@ public:
bool outside = false; // set the boundary layer on the outside bool outside = false; // set the boundary layer on the outside
bool grow_edges = false; bool grow_edges = false;
bool limit_growth_vectors = true; bool limit_growth_vectors = true;
bool sides_keep_surfaceindex = false;
Array<size_t> project_boundaries; Array<size_t> project_boundaries;
}; };
@ -44,6 +45,8 @@ class BoundaryLayerTool
Array<SegmentIndex> moved_segs; Array<SegmentIndex> moved_segs;
int max_edge_nr, nfd_old, ndom_old; int max_edge_nr, nfd_old, ndom_old;
Array<int> new_mat_nrs; Array<int> new_mat_nrs;
Array<int> domain_map;
BitArray moved_surfaces;
int np, nseg, nse, ne; int np, nseg, nse, ne;
double height; double height;
@ -56,6 +59,7 @@ class BoundaryLayerTool
// major steps called in Perform() // major steps called in Perform()
void CreateNewFaceDescriptors(); void CreateNewFaceDescriptors();
void CreateFaceDescriptorsSides();
void CalculateGrowthVectors(); void CalculateGrowthVectors();
Array<Array<pair<SegmentIndex, int>>, SegmentIndex> BuildSegMap(); Array<Array<pair<SegmentIndex, int>>, SegmentIndex> BuildSegMap();

View File

@ -1309,7 +1309,8 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m)
variant<string, map<string, string>> material, variant<string, map<string, string>> material,
variant<string, int> domain, bool outside, variant<string, int> domain, bool outside,
optional<string> project_boundaries, optional<string> project_boundaries,
bool grow_edges, bool limit_growth_vectors) bool grow_edges, bool limit_growth_vectors,
bool sides_keep_surfaceindex)
{ {
BoundaryLayerParameters blp; BoundaryLayerParameters blp;
BitArray boundaries(self.GetNFD()+1); BitArray boundaries(self.GetNFD()+1);
@ -1394,12 +1395,13 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m)
blp.outside = outside; blp.outside = outside;
blp.grow_edges = grow_edges; blp.grow_edges = grow_edges;
blp.limit_growth_vectors = limit_growth_vectors; blp.limit_growth_vectors = limit_growth_vectors;
blp.sides_keep_surfaceindex = sides_keep_surfaceindex;
GenerateBoundaryLayer (self, blp); GenerateBoundaryLayer (self, blp);
self.UpdateTopology(); self.UpdateTopology();
}, py::arg("boundary"), py::arg("thickness"), py::arg("material"), }, py::arg("boundary"), py::arg("thickness"), py::arg("material"),
py::arg("domains") = ".*", py::arg("outside") = false, py::arg("domains") = ".*", py::arg("outside") = false,
py::arg("project_boundaries")=nullopt, py::arg("grow_edges")=true, py::arg("limit_growth_vectors") = true, py::arg("project_boundaries")=nullopt, py::arg("grow_edges")=true, py::arg("limit_growth_vectors") = true, py::arg("sides_keep_surfaceindex")=false,
R"delimiter( R"delimiter(
Add boundary layer to mesh. Add boundary layer to mesh.