mirror of
https://github.com/NGSolve/netgen.git
synced 2025-01-19 01:10:33 +05:00
some tryout
This commit is contained in:
parent
86d47b5614
commit
cc8d6a3a35
@ -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;
|
||||||
@ -992,31 +993,34 @@ struct GrowthVectorLimiter {
|
|||||||
for(PointIndex pi : mesh.Points().Range())
|
for(PointIndex pi : mesh.Points().Range())
|
||||||
{
|
{
|
||||||
if(is_point_on_bl_surface[pi])
|
if(is_point_on_bl_surface[pi])
|
||||||
{
|
|
||||||
points.Append(pi);
|
|
||||||
getGW(pi) = 0.0;
|
|
||||||
}
|
|
||||||
if(is_point_on_other_surface[pi])
|
|
||||||
{
|
{
|
||||||
points.Append(pi);
|
points.Append(pi);
|
||||||
}
|
}
|
||||||
|
else if(is_point_on_other_surface[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,8 +2059,14 @@ 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) {
|
||||||
throw Exception("Boundarylayer only implemented for tets and pyramids outside yet!");
|
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!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2150,45 +2175,62 @@ 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();
|
||||||
|
Loading…
Reference in New Issue
Block a user