Path: blob/devel/ElmerGUI/netgen/libsrc/meshing/adfront2.cpp
3206 views
/*1Advancing front class for surfaces2*/34#include <mystdlib.h>5#include "meshing.hpp"678namespace netgen9{10AdFront2::FrontPoint2 :: FrontPoint2 (const Point<3> & ap, PointIndex agi,11MultiPointGeomInfo * amgi, bool aonsurface)12{13p = ap;14globalindex = agi;15nlinetopoint = 0;16frontnr = INT_MAX-10;17onsurface = aonsurface;1819if (amgi)20{21mgi = new MultiPointGeomInfo (*amgi);22for (int i = 1; i <= mgi->GetNPGI(); i++)23if (mgi->GetPGI(i).trignum <= 0)24cout << "Add FrontPoint2, illegal geominfo = " << mgi->GetPGI(i).trignum << endl;25}26else27mgi = NULL;28}293031AdFront2 :: AdFront2 (const Box3d & aboundingbox)32: boundingbox(aboundingbox),33linesearchtree(boundingbox.PMin(), boundingbox.PMax()),34pointsearchtree(boundingbox.PMin(), boundingbox.PMax()),35cpointsearchtree(boundingbox.PMin(), boundingbox.PMax())36{37nfl = 0;38allflines = 0;3940minval = 0;41starti = lines.Begin();42}4344AdFront2 :: ~AdFront2 ()45{46delete allflines;47}484950void AdFront2 :: PrintOpenSegments (ostream & ost) const51{52if (nfl > 0)53{54ost << nfl << " open front segments left:" << endl;55for (int i = lines.Begin(); i < lines.End(); i++)56if (lines[i].Valid())57ost << i << ": "58<< GetGlobalIndex (lines[i].L().I1()) << "-"59<< GetGlobalIndex (lines[i].L().I2()) << endl;60}61}6263/*64void AdFront2 :: GetPoints (ARRAY<Point<3> > & apoints) const65{66apoints.Append (points);67// for (int i = 0; i < points.Size(); i++)68// apoints.Append (points[i].P());69}70*/71727374int AdFront2 :: AddPoint (const Point<3> & p, PointIndex globind,75MultiPointGeomInfo * mgi,76bool pointonsurface)77{78// inserts at empty position or resizes array79int pi;8081if (delpointl.Size() != 0)82{83pi = delpointl.Last();84delpointl.DeleteLast ();8586points[pi] = FrontPoint2 (p, globind, mgi, pointonsurface);87}88else89{90pi = points.Append (FrontPoint2 (p, globind, mgi, pointonsurface)) - 1;91}9293if (mgi)94cpointsearchtree.Insert (p, pi);9596pointsearchtree.Insert (p, pi);9798return pi;99}100101102int AdFront2 :: AddLine (int pi1, int pi2,103const PointGeomInfo & gi1, const PointGeomInfo & gi2)104{105int minfn;106int li;107108FrontPoint2 & p1 = points[pi1];109FrontPoint2 & p2 = points[pi2];110111112nfl++;113114p1.AddLine();115p2.AddLine();116117minfn = min2 (p1.FrontNr(), p2.FrontNr());118p1.DecFrontNr (minfn+1);119p2.DecFrontNr (minfn+1);120121if (dellinel.Size() != 0)122{123li = dellinel.Last();124dellinel.DeleteLast ();125lines[li] = FrontLine (INDEX_2(pi1, pi2));126}127else128{129li = lines.Append(FrontLine (INDEX_2(pi1, pi2))) - 1;130}131132133if (!gi1.trignum || !gi2.trignum)134{135cout << "ERROR: in AdFront::AddLine, illegal geominfo" << endl;136}137138lines[li].SetGeomInfo (gi1, gi2);139140Box3d lbox;141lbox.SetPoint(p1.P());142lbox.AddPoint(p2.P());143144linesearchtree.Insert (lbox.PMin(), lbox.PMax(), li);145146if (allflines)147{148if (allflines->Used (INDEX_2 (GetGlobalIndex (pi1),149GetGlobalIndex (pi2))))150{151cerr << "ERROR Adfront2::AddLine: line exists" << endl;152(*testout) << "ERROR Adfront2::AddLine: line exists" << endl;153}154155allflines->Set (INDEX_2 (GetGlobalIndex (pi1),156GetGlobalIndex (pi2)), 1);157}158159return li;160}161162163void AdFront2 :: DeleteLine (int li)164{165int pi;166167nfl--;168169for (int i = 1; i <= 2; i++)170{171pi = lines[li].L().I(i);172points[pi].RemoveLine();173174if (!points[pi].Valid())175{176delpointl.Append (pi);177if (points[pi].mgi)178{179cpointsearchtree.DeleteElement (pi);180delete points[pi].mgi;181points[pi].mgi = NULL;182}183184pointsearchtree.DeleteElement (pi);185}186}187188if (allflines)189{190allflines->Set (INDEX_2 (GetGlobalIndex (lines[li].L().I1()),191GetGlobalIndex (lines[li].L().I2())), 2);192}193194lines[li].Invalidate();195linesearchtree.DeleteElement (li);196197dellinel.Append (li);198}199200201int AdFront2 :: ExistsLine (int pi1, int pi2)202{203if (!allflines)204return 0;205if (allflines->Used (INDEX_2(pi1, pi2)))206return allflines->Get (INDEX_2 (pi1, pi2));207else208return 0;209}210211212/*213void AdFront2 :: IncrementClass (int li)214{215lines[li].IncrementClass();216}217218219void AdFront2 :: ResetClass (int li)220{221lines[li].ResetClass();222}223*/224225int AdFront2 :: SelectBaseLine (Point<3> & p1, Point<3> & p2,226const PointGeomInfo *& geominfo1,227const PointGeomInfo *& geominfo2,228int & qualclass)229{230int baselineindex = -1;231232for (int i = starti; i < lines.End(); i++)233{234if (lines[i].Valid())235{236int hi = lines[i].LineClass() +237points[lines[i].L().I1()].FrontNr() +238points[lines[i].L().I2()].FrontNr();239240if (hi <= minval)241{242minval = hi;243baselineindex = i;244break;245}246}247}248249if (baselineindex == -1)250{251minval = INT_MAX;252for (int i = lines.Begin(); i < lines.End(); i++)253if (lines[i].Valid())254{255int hi = lines[i].LineClass() +256points[lines[i].L().I1()].FrontNr() +257points[lines[i].L().I2()].FrontNr();258259if (hi < minval)260{261minval = hi;262baselineindex = i;263}264}265}266starti = baselineindex+1;267268p1 = points[lines[baselineindex].L().I1()].P();269p2 = points[lines[baselineindex].L().I2()].P();270geominfo1 = &lines[baselineindex].GetGeomInfo(1);271geominfo2 = &lines[baselineindex].GetGeomInfo(2);272273qualclass = lines[baselineindex].LineClass();274275return baselineindex;276}277278279280281int AdFront2 :: GetLocals (int baselineindex,282ARRAY<Point3d> & locpoints,283ARRAY<MultiPointGeomInfo> & pgeominfo,284ARRAY<INDEX_2> & loclines, // local index285ARRAY<INDEX> & pindex,286ARRAY<INDEX> & lindex,287double xh)288{289// baselineindex += 1-lines.Begin();290291int pstind;292Point<3> midp, p0;293294pstind = lines[baselineindex].L().I1();295p0 = points[pstind].P();296297loclines.Append(lines[baselineindex].L());298lindex.Append(baselineindex); // +1-lines.Begin());299300static ARRAY<int> nearlines;301nearlines.SetSize(0);302static ARRAY<int> nearpoints;303nearpoints.SetSize(0);304305linesearchtree.GetIntersecting (p0 - Vec3d(xh, xh, xh),306p0 + Vec3d(xh, xh, xh),307nearlines);308309pointsearchtree.GetIntersecting (p0 - Vec3d(xh, xh, xh),310p0 + Vec3d(xh, xh, xh),311nearpoints);312313314for (int ii = 1; ii <= nearlines.Size(); ii++)315{316int i = nearlines.Get(ii);317if (lines[i].Valid() && i != baselineindex) // + 1-lines.Begin())318{319loclines.Append(lines[i].L());320lindex.Append(i);321}322}323324static ARRAY<int> invpindex;325invpindex.SetSize (points.Size());326// invpindex = -1;327for (int i = 0; i < nearpoints.Size(); i++)328invpindex[nearpoints[i]] = -1;329330for (int i = 0; i < loclines.Size(); i++)331{332invpindex[loclines[i].I1()] = 0;333invpindex[loclines[i].I2()] = 0;334}335336337for (int i = 0; i < loclines.Size(); i++)338{339for (int j = 0; j < 2; j++)340{341int pi = loclines[i][j];342if (invpindex[pi] == 0)343{344pindex.Append (pi);345invpindex[pi] = pindex.Size();346loclines[i][j] = locpoints.Append (points[pi].P());347}348else349loclines[i][j] = invpindex[pi];350}351}352353354// double xh2 = xh*xh;355for (int ii = 0; ii < nearpoints.Size(); ii++)356{357int i = nearpoints[ii];358if (points[i].Valid() &&359points[i].OnSurface() &&360// Dist2 (points.Get(i).P(), p0) <= xh2 &&361invpindex[i] <= 0)362{363invpindex[i] = locpoints.Append (points[i].P());364pindex.Append(i);365}366}367/*368double xh2 = xh*xh;369for (i = 1; i <= points.Size(); i++)370{371if (points.Get(i).Valid() &&372points.Get(i).OnSurface() &&373Dist2 (points.Get(i).P(), p0) <= xh2 &&374invpindex.Get(i) <= 0)375{376invpindex.Elem(i) =377locpoints.Append (points.Get(i).P());378pindex.Append(i);379}380}381*/382383pgeominfo.SetSize (locpoints.Size());384for (int i = 0; i < pgeominfo.Size(); i++)385pgeominfo[i].Init();386387388for (int i = 0; i < loclines.Size(); i++)389for (int j = 0; j < 2; j++)390{391int lpi = loclines[i][j];392393const PointGeomInfo & gi =394lines[lindex[i]].GetGeomInfo (j+1);395pgeominfo.Elem(lpi).AddPointGeomInfo (gi);396397/*398if (pgeominfo.Elem(lpi).cnt == MULTIPOINTGEOMINFO_MAX)399break;400401const PointGeomInfo & gi =402lines.Get(lindex.Get(i)).GetGeomInfo (j);403404PointGeomInfo * pgi = pgeominfo.Elem(lpi).mgi;405406int found = 0;407for (k = 0; k < pgeominfo.Elem(lpi).cnt; k++)408if (pgi[k].trignum == gi.trignum)409found = 1;410411if (!found)412{413pgi[pgeominfo.Elem(lpi).cnt] = gi;414pgeominfo.Elem(lpi).cnt++;415}416*/417}418419for (int i = 0; i < locpoints.Size(); i++)420{421int pi = pindex[i];422423if (points[pi].mgi)424for (int j = 1; j <= points[pi].mgi->GetNPGI(); j++)425pgeominfo[i].AddPointGeomInfo (points[pi].mgi->GetPGI(j));426}427428if (loclines.Size() == 1)429{430cout << "loclines.Size = 1" << endl;431(*testout) << "loclines.size = 1" << endl432<< " h = " << xh << endl433<< " nearline.size = " << nearlines.Size() << endl434<< " p0 = " << p0 << endl;435}436437return lines[baselineindex].LineClass();438}439440441442void AdFront2 :: SetStartFront ()443{444for (int i = lines.Begin(); i < lines.End(); i++)445if (lines[i].Valid())446for (int j = 1; j <= 2; j++)447points[lines[i].L().I(j)].DecFrontNr(0);448}449450451void AdFront2 :: Print (ostream & ost) const452{453ost << points.Size() << " Points: " << endl;454for (int i = points.Begin(); i < points.End(); i++)455if (points[i].Valid())456ost << i << " " << points[i].P() << endl;457458ost << nfl << " Lines: " << endl;459for (int i = lines.Begin(); i < lines.End(); i++)460if (lines[i].Valid())461ost << lines[i].L().I1() << " - " << lines[i].L().I2() << endl;462463ost << flush;464}465}466467468