diff --git a/libsrc/geom2d/genmesh2d.cpp b/libsrc/geom2d/genmesh2d.cpp index 6d00f1fe..6efbc39e 100644 --- a/libsrc/geom2d/genmesh2d.cpp +++ b/libsrc/geom2d/genmesh2d.cpp @@ -18,29 +18,43 @@ namespace netgen { double fperel, oldf, f; - int n = 10000; - - NgArray > xi(n); - NgArray hi(n); - - for (int i = 0; i < n; i++) + int n = 1; + NgArray > xi; + NgArray hi; + + bool not_fine_enough = true; + + while(not_fine_enough && n < 10000) + { + not_fine_enough = false; + n*=2; + + xi.SetSize(n); + hi.SetSize(n); + + for (int i = 0; i < n; i++) { - xi[i] = spline.GetPoint ( (i+0.5) / n ); - hi[i] = mesh.GetH (Point<3> (xi[i](0), xi[i](1), 0)); + xi[i] = spline.GetPoint ( (i+0.5) / n ); + hi[i] = mesh.GetH (Point<3> (xi[i](0), xi[i](1), 0)); } - // limit slope - double gradh = min(1/elto0,mp.grading); - for (int i = 0; i < n-1; i++) + // limit slope + double gradh = min(1/elto0,mp.grading); + for (int i = 0; i < n-1; i++) { - double hnext = hi[i] + gradh * (xi[i+1]-xi[i]).Length(); - hi[i+1] = min(hi[i+1], hnext); + double hnext = hi[i] + gradh * (xi[i+1]-xi[i]).Length(); + if(hnext > 2*hi[i]) + not_fine_enough = true; + hi[i+1] = min(hi[i+1], hnext); } - for (int i = n-1; i > 1; i--) + for (int i = n-1; i > 1; i--) { - double hnext = hi[i] + gradh * (xi[i-1]-xi[i]).Length(); - hi[i-1] = min(hi[i-1], hnext); + double hnext = hi[i] + gradh * (xi[i-1]-xi[i]).Length(); + if(hnext > 2*hi[i]) + not_fine_enough = true; + hi[i-1] = min(hi[i-1], hnext); } + } points.SetSize (0); @@ -227,6 +241,10 @@ namespace netgen mesh2d.RestrictLocalHLine (Point<3>(p1(0),p1(1),0), Point<3>(p2(0),p2(1),0), len/mp.segmentsperedge); + // skip curvature restrictions for straight lines + if(spline.MaxCurvature()==0) + continue; + double hcurve = min (spline.hmax, h/spline.reffak); double hl = GetDomainMaxh (spline.leftdom); if (hl > 0) hcurve = min2 (hcurve, hl);