some tryout

This commit is contained in:
Matthias Hochsteger 2024-02-20 10:25:31 +01:00
parent 86d47b5614
commit cc8d6a3a35

View File

@ -542,6 +542,7 @@ struct GrowthVectorLimiter {
void BoundaryLayerTool :: LimitGrowthVectorLengths() void BoundaryLayerTool :: LimitGrowthVectorLengths()
{ {
return;
static Timer tall("BoundaryLayerTool::LimitGrowthVectorLengths"); RegionTimer rtall(tall); static Timer tall("BoundaryLayerTool::LimitGrowthVectorLengths"); RegionTimer rtall(tall);
limits.SetSize(mesh.Points().Size()); limits.SetSize(mesh.Points().Size());
limits = 1.0; limits = 1.0;
@ -994,29 +995,32 @@ struct GrowthVectorLimiter {
if(is_point_on_bl_surface[pi]) if(is_point_on_bl_surface[pi])
{ {
points.Append(pi); points.Append(pi);
getGW(pi) = 0.0;
} }
if(is_point_on_other_surface[pi]) else if(is_point_on_other_surface[pi])
{ {
points.Append(pi); points.Append(pi);
getGW(pi) = 0.0;
} }
// else
// getGW(pi) = 0.0;
} }
auto p2sel = mesh.CreatePoint2SurfaceElementTable(); auto p2sel = mesh.CreatePoint2SurfaceElementTable();
// smooth tangential part of growth vectors from edges to surface elements // smooth tangential part of growth vectors from edges to surface elements
RegionTimer rtsmooth(tsmooth); RegionTimer rtsmooth(tsmooth);
for([[maybe_unused]] auto i : Range(10)) for([[maybe_unused]] auto i : Range(3))
{ {
for(auto pi : points) for(auto pi : points)
{ {
auto sels = p2sel[pi]; auto sels = p2sel[pi];
Vec<3> new_gw = getGW(pi); Vec<3> new_gw = getGW(pi);
if(pi == 35) cout << "average " << pi << " " << new_gw << endl;
new_gw = 0.; new_gw = 0.;
// int cnt = 1; // int cnt = 1;
std::set<PointIndex> suround; std::set<PointIndex> suround;
suround.insert(pi); suround.insert(pi);
double total_weight = 0; double total_weight = 0;
auto normal = normals[pi]; // auto normal = normals[pi];
for(auto sei: sels) for(auto sei: sels)
{ {
const auto & sel = mesh[sei]; const auto & sel = mesh[sei];
@ -1032,7 +1036,7 @@ struct GrowthVectorLimiter {
if(is_point_on_bl_surface[pi]) { if(is_point_on_bl_surface[pi]) {
if(mesh[pi1].Type() == FIXEDPOINT) if(mesh[pi1].Type() == FIXEDPOINT)
weight *= 13-i; weight *= 1.0; //13-i;
else else
weight = 1.0; weight = 1.0;
new_gw += weight * tangent_part; new_gw += weight * tangent_part;
@ -1046,11 +1050,12 @@ struct GrowthVectorLimiter {
// total_weight += suround.size(); // total_weight += suround.size();
getGW(pi) = 1.0/total_weight * new_gw; getGW(pi) = 1.0/total_weight * new_gw;
cout << "average " << pi << " " << getGW(pi) << endl;
} }
} }
for(auto pi : points) // for(auto pi : points)
getGW(pi) += normals[pi]; // getGW(pi) += normals[pi];
// for(auto pi : mesh.Points().Range()) // for(auto pi : mesh.Points().Range())
// cout << "point " << pi << " has type " << (int)(mesh[pi].Type()) << endl; // cout << "point " << pi << " has type " << (int)(mesh[pi].Type()) << endl;
} }
@ -1099,6 +1104,8 @@ struct GrowthVectorLimiter {
mesh.UpdateTopology(); mesh.UpdateTopology();
have_single_segments = HaveSingleSegments(mesh); have_single_segments = HaveSingleSegments(mesh);
cout << "HAVE_SINGLE_SEGMENTS " << have_single_segments << endl;
if(have_single_segments) if(have_single_segments)
segments = BuildSegments(mesh); segments = BuildSegments(mesh);
else else
@ -1241,7 +1248,7 @@ struct GrowthVectorLimiter {
growthvectors[pi] = CalcGrowthVector(ns); growthvectors[pi] = CalcGrowthVector(ns);
} }
catch(const Exception & e) { catch(const Exception & e) {
cout << "caught excption for point " << pi << ":\t" << e.what() << endl; cout << "caught exception for point " << pi << ":\t" << e.what() << endl;
special_boundary_points.emplace(pi, normals); special_boundary_points.emplace(pi, normals);
growthvectors[pi] = special_boundary_points[pi].growth_groups[0].growth_vector; growthvectors[pi] = special_boundary_points[pi].growth_groups[0].growth_vector;
} }
@ -1383,6 +1390,7 @@ struct GrowthVectorLimiter {
void BoundaryLayerTool :: InterpolateGrowthVectors() void BoundaryLayerTool :: InterpolateGrowthVectors()
{ {
// mesh.Save("interpolate.vol");
// cout << "new number of line segments " << mesh.LineSegments().Size() << endl; // cout << "new number of line segments " << mesh.LineSegments().Size() << endl;
int new_max_edge_nr = max_edge_nr; int new_max_edge_nr = max_edge_nr;
for(const auto& seg : mesh.LineSegments()) for(const auto& seg : mesh.LineSegments())
@ -1488,7 +1496,7 @@ struct GrowthVectorLimiter {
if(getGW(points[0]).Length2() == 0 && if(getGW(points[0]).Length2() == 0 &&
getGW(points.Last()).Length2() == 0) getGW(points.Last()).Length2() == 0)
continue; continue;
// cout << "Points to average " << points << endl; // cout << "Points to average " << endl << points << endl;
// tangential part of growth vectors // tangential part of growth vectors
auto t1 = (mesh[points[1]]-mesh[points[0]]).Normalize(); auto t1 = (mesh[points[1]]-mesh[points[0]]).Normalize();
@ -1523,6 +1531,7 @@ struct GrowthVectorLimiter {
// cout << getGW(pi) << endl; // cout << getGW(pi) << endl;
// } // }
cout << "add gw " << pi << " " << interpol << endl;
getGW(pi) += interpol; getGW(pi) += interpol;
} }
} }
@ -1536,6 +1545,11 @@ struct GrowthVectorLimiter {
mapto.SetSize(0); mapto.SetSize(0);
mapto.SetSize(np); mapto.SetSize(np);
auto changed_domains = domains;
if(!params.outside)
changed_domains.Invert();
auto & identifications = mesh.GetIdentifications(); auto & identifications = mesh.GetIdentifications();
const int identnr = identifications.GetNr("boundarylayer"); const int identnr = identifications.GetNr("boundarylayer");
@ -1639,6 +1653,7 @@ struct GrowthVectorLimiter {
s.edgenr = getEdgeNr(segj.edgenr); s.edgenr = getEdgeNr(segj.edgenr);
s.si = si_map[segj.si]; s.si = si_map[segj.si];
new_segments.Append(s); new_segments.Append(s);
// cout << __LINE__ <<"\t" << s << endl;
return s; return s;
}; };
@ -1675,6 +1690,7 @@ struct GrowthVectorLimiter {
s0.edgenr = segj.edgenr; s0.edgenr = segj.edgenr;
s0.si = segj.si; s0.si = segj.si;
new_segments.Append(s0); new_segments.Append(s0);
// cout << __LINE__ <<"\t" << s0 << endl;
for(auto i : Range(params.heights)) for(auto i : Range(params.heights))
{ {
@ -1701,7 +1717,8 @@ struct GrowthVectorLimiter {
auto pair = make_pair(p2, p3); auto pair = make_pair(p2, p3);
s1.edgenr = getEdgeNr(segj.edgenr); s1.edgenr = getEdgeNr(segj.edgenr);
s1.si = segj.si; s1.si = segj.si;
new_segments.Append(s1); // new_segments.Append(s1);
// cout << __LINE__ <<"\t" << s1 << endl;
Segment s2; Segment s2;
s2[0] = p4; s2[0] = p4;
s2[1] = p1; s2[1] = p1;
@ -1709,7 +1726,8 @@ struct GrowthVectorLimiter {
pair = make_pair(p1, p4); pair = make_pair(p1, p4);
s2.edgenr = getEdgeNr(segj.edgenr); s2.edgenr = getEdgeNr(segj.edgenr);
s2.si = segj.si; s2.si = segj.si;
new_segments.Append(s2); // new_segments.Append(s2);
// cout << __LINE__ <<"\t" << s2 << endl;
p1 = p4; p1 = p4;
p2 = p3; p2 = p3;
} }
@ -1721,6 +1739,7 @@ struct GrowthVectorLimiter {
s3.edgenr = getEdgeNr(segj.edgenr); s3.edgenr = getEdgeNr(segj.edgenr);
s3.si = segj.si; s3.si = segj.si;
new_segments.Append(s3); new_segments.Append(s3);
// cout << __LINE__ << "\t" << s3 << endl;
} }
} }
} }
@ -1916,7 +1935,7 @@ struct GrowthVectorLimiter {
} }
bool do_move, do_insert; bool do_move, do_insert;
if(domains.Test(el.GetIndex())) if(changed_domains.Test(el.GetIndex()))
{ {
do_move = fixed.Size() && moved_bnd; do_move = fixed.Size() && moved_bnd;
do_insert = do_move; do_insert = do_move;
@ -2040,11 +2059,17 @@ struct GrowthVectorLimiter {
else if(moved.Size() == 1) else if(moved.Size() == 1)
throw Exception("This case is not implemented yet!"); throw Exception("This case is not implemented yet!");
} }
else else if(do_move) {
cout << "have moved " << moved << endl;
cout << "do_insert " << do_insert << endl;
cout << "do_move " << do_move << endl;
cout << "el " << el << endl;
cout << "bl domain " << domains.Test(el.GetIndex()) << endl;
throw Exception("Boundarylayer only implemented for tets and pyramids outside yet!"); throw Exception("Boundarylayer only implemented for tets and pyramids outside yet!");
} }
} }
} }
}
void BoundaryLayerTool :: SetDomInOut() void BoundaryLayerTool :: SetDomInOut()
{ {
@ -2150,46 +2175,63 @@ struct GrowthVectorLimiter {
{ {
CreateNewFaceDescriptors(); CreateNewFaceDescriptors();
CalculateGrowthVectors(); CalculateGrowthVectors();
cout << "growthvectors " << __LINE__ << endl << growthvectors << endl;
CreateFaceDescriptorsSides(); CreateFaceDescriptorsSides();
auto segmap = BuildSegMap(); auto segmap = BuildSegMap();
auto in_surface_direction = ProjectGrowthVectorsOnSurface(); auto in_surface_direction = ProjectGrowthVectorsOnSurface();
cout << "growthvectors " << __LINE__ << endl << growthvectors << endl;
auto fout = ofstream("growthvectors.txt"); // auto fout = ofstream("growthvectors.txt");
for (auto pi : Range(mesh.Points())) // for (auto pi : Range(mesh.Points()))
{ // {
for(auto i : Range(3)) // for(auto i : Range(3))
fout << mesh[pi][i] << " "; // fout << mesh[pi][i] << " ";
for(auto i : Range(3)) // for(auto i : Range(3))
fout << mesh[pi][i]+height*growthvectors[pi][i] << " "; // fout << mesh[pi][i]+height*growthvectors[pi][i] << " ";
} // }
fout << endl; // fout << endl;
FixVolumeElements(); // FixVolumeElements();
// mesh.Save("before_insert.vol");
InsertNewElements(segmap, in_surface_direction); InsertNewElements(segmap, in_surface_direction);
cout << "growthvectors " << __LINE__ << endl << growthvectors << endl;
SetDomInOut(); SetDomInOut();
cout << "growthvectors " << __LINE__ << endl << growthvectors << endl;
AddSegments(); AddSegments();
cout << "growthvectors " << __LINE__ << endl << growthvectors << endl;
mesh.CalcSurfacesOfNode(); mesh.CalcSurfacesOfNode();
cout << "growthvectors " << __LINE__ << endl << growthvectors << endl;
topo.SetBuildVertex2Element(true); topo.SetBuildVertex2Element(true);
mesh.UpdateTopology(); mesh.UpdateTopology();
cout << "growthvectors " << __LINE__ << endl << growthvectors << endl;
InterpolateGrowthVectors(); InterpolateGrowthVectors();
cout << "growthvectors " << __LINE__ << endl << growthvectors << endl;
// cout << "growthvectors before " << endl<< growthvectors << endl; // cout << "growthvectors before " << endl<< growthvectors << endl;
// cout << "growthvectors after " << endl << growthvectors << endl; // cout << "growthvectors after " << endl << growthvectors << endl;
if(params.limit_growth_vectors) if(params.limit_growth_vectors)
LimitGrowthVectorLengths(); LimitGrowthVectorLengths();
cout << "growthvectors " << __LINE__ << endl << growthvectors << endl;
for(PointIndex pi : Range(PointIndex::BASE, this->np + PointIndex::BASE))
{
cout << "move " << pi << " by " << 1.0 << " * " << growthvectors[pi] << endl;
mesh[pi] += growthvectors[pi];
}
for (auto [pi, data] : growth_vector_map) { for (auto [pi, data] : growth_vector_map) {
auto [gw, height] = data; auto [gw, height] = data;
cout << "move " << pi << " by " << height << " * " << (*gw) << endl;
mesh[pi] += height * (*gw); mesh[pi] += height * (*gw);
} }
mesh.GetTopology().ClearEdges(); mesh.GetTopology().ClearEdges();
mesh.SetNextMajorTimeStamp(); mesh.SetNextMajorTimeStamp();
mesh.UpdateTopology(); mesh.UpdateTopology();