Path: blob/devel/ElmerGUI/netgen/libsrc/csg/singularref.cpp
3206 views
#include <mystdlib.h>1#include <myadt.hpp>23#include <linalg.hpp>4#include <csg.hpp>5#include <meshing.hpp>67namespace netgen8{910SingularEdge :: SingularEdge (double abeta, int adomnr,11const CSGeometry & ageom,12const Solid * asol1,13const Solid * asol2, double sf,14const double maxh_at_initialization)15: geom(ageom), domnr(adomnr)16{17beta = abeta;18maxhinit = maxh_at_initialization;1920if (beta > 1)21{22beta = 1;23cout << "Warning: beta set to 1" << endl;24}25if (beta <= 1e-3)26{27beta = 1e-3;28cout << "Warning: beta set to minimal value 0.001" << endl;29}3031sol1 = asol1;32sol2 = asol2;33factor = sf;34}3536void SingularEdge :: FindPointsOnEdge (class Mesh & mesh)37{38(*testout) << "find points on edge" << endl;39points.SetSize(0);40segms.SetSize(0);414243ARRAY<int> si1, si2;44sol1->GetSurfaceIndices (si1);45sol2->GetSurfaceIndices (si2);4647for (int i = 0; i < si1.Size(); i++)48si1[i] = geom.GetSurfaceClassRepresentant(si1[i]);49for (int i = 0; i < si2.Size(); i++)50si2[i] = geom.GetSurfaceClassRepresentant(si2[i]);515253for (SegmentIndex si = 0; si < mesh.GetNSeg(); si++)54{55INDEX_2 i2 (mesh[si].p1, mesh[si].p2);56/*5758bool onedge = 1;59for (j = 1; j <= 2; j++)60{61const Point<3> p = mesh[ PointIndex (i2.I(j)) ];62if (sol1->IsIn (p, 1e-3) && sol2->IsIn(p, 1e-3) &&63!sol1->IsStrictIn (p, 1e-3) && !sol2->IsStrictIn(p, 1e-3))64{65;66}67else68onedge = 0;69}70*/7172if (domnr != -1 && domnr != mesh[si].domin && domnr != mesh[si].domout)73continue;7475/*76bool onedge = 1;77for (int j = 0; j < 2; j++)78{79int surfi = (j == 0) ? mesh[si].surfnr1 : mesh[si].surfnr2;80surfi = geom.GetSurfaceClassRepresentant(surfi);81if (!si1.Contains(surfi) && !si2.Contains(surfi))82onedge = 0;83}84*/85int surfi1 = geom.GetSurfaceClassRepresentant(mesh[si].surfnr1);86int surfi2 = geom.GetSurfaceClassRepresentant(mesh[si].surfnr2);8788if (si1.Contains(surfi1) && si2.Contains(surfi2) ||89si1.Contains(surfi2) && si2.Contains(surfi1))9091// if (onedge)92{93segms.Append (i2);94// PrintMessage (5, "sing segment ", i2.I1(), " - ", i2.I2());95points.Append (mesh[ PointIndex (i2.I1())]);96points.Append (mesh[ PointIndex (i2.I2())]);97mesh[si].singedge_left = factor;98mesh[si].singedge_right = factor;99}100}101102/*103(*testout) << "Singular edge points:" << endl;104for (int i = 0; i < points.Size(); i++)105(*testout) << points[i] << endl;106*/107108}109110void SingularEdge :: SetMeshSize (class Mesh & mesh, double globalh)111{112double hloc = pow (globalh, 1/beta);113if(maxhinit > 0 && maxhinit < hloc)114{115hloc = maxhinit;116if(points.Size() > 1)117{118for (int i = 0; i < points.Size()-1; i++)119mesh.RestrictLocalHLine(points[i],points[i+1],hloc);120}121else122{123for (int i = 0; i < points.Size(); i++)124mesh.RestrictLocalH (points[i], hloc);125}126}127else128{129for (int i = 0; i < points.Size(); i++)130mesh.RestrictLocalH (points[i], hloc);131}132}133134135136SingularPoint :: SingularPoint (double abeta,137const Solid * asol1,138const Solid * asol2,139const Solid * asol3, double sf)140{141beta = abeta;142sol1 = asol1;143sol2 = asol2;144sol3 = asol3;145factor = sf;146}147148149void SingularPoint :: FindPoints (class Mesh & mesh)150{151points.SetSize(0);152ARRAY<int> surfk, surf;153154155for (PointIndex pi = PointIndex::BASE;156pi < mesh.GetNP()+PointIndex::BASE; pi++)157{158if (mesh[pi].Type() != FIXEDPOINT) continue;159const Point<3> p = mesh[pi];160161(*testout) << "check singular point" << p << endl;162163if (sol1->IsIn (p) && sol2->IsIn(p) && sol3->IsIn(p) &&164!sol1->IsStrictIn (p) && !sol2->IsStrictIn(p) && !sol3->IsStrictIn(p))165{166surf.SetSize (0);167for (int k = 1; k <= 3; k++)168{169const Solid * solk(NULL);170Solid *tansol;171switch (k)172{173case 1: solk = sol1; break;174case 2: solk = sol2; break;175case 3: solk = sol3; break;176}177178solk -> TangentialSolid (p, tansol, surfk, 1e-3);179(*testout) << "Tansol = " << *tansol << endl;180181if (!tansol) continue;182183ReducePrimitiveIterator rpi(Box<3> (p-Vec<3> (1e-3,1e-3,1e-3),184p+Vec<3> (1e-3,1e-3,1e-3)));185UnReducePrimitiveIterator urpi;186187tansol -> IterateSolid (rpi);188tansol->GetSurfaceIndices (surfk);189tansol -> IterateSolid (urpi);190191(*testout) << "surfinds = " << surfk << endl;192193for (int i = 0; i < surfk.Size(); i++)194if (!surf.Contains (surfk[i]))195surf.Append (surfk[i]);196197delete tansol;198}199200if (surf.Size() < 3) continue;201202points.Append (p);203PrintMessage (5, "Point (", p(0), ", ", p(1), ", ", p(2), ") is singular");204mesh[pi].Singularity(factor);205}206}207}208209210void SingularPoint :: SetMeshSize (class Mesh & mesh, double globalh)211{212double hloc = pow (globalh, 1/beta);213for (int i = 1; i <= points.Size(); i++)214mesh.RestrictLocalH (points.Get(i), hloc);215}216}217218219