Path: blob/devel/ElmerGUI/netgen/libsrc/meshing/geomsearch.cpp
3206 views
#include <mystdlib.h>1#include "meshing.hpp"234namespace netgen5{6GeomSearch3d :: GeomSearch3d()7{8size.i1 = 0; size.i2 = 0; size.i3 = 0;9};1011GeomSearch3d :: ~GeomSearch3d()12{13//delete old Hashtable:14if (size.i1 != 0)15{16for (int i = 0; i < size.i1*size.i2*size.i3; i++)17delete hashtable[i];18}19}2021void GeomSearch3d :: Init (ARRAY <FrontPoint3,PointIndex::BASE> *pointsi, ARRAY <FrontFace> *facesi)22{23points = pointsi;24faces = facesi;25size.i1 = 0; size.i2 = 0; size.i3 = 0;26reset = 1;27hashcount = 1;28}2930void GeomSearch3d :: ElemMaxExt(Point3d& minp, Point3d& maxp, const MiniElement2d& elem)31{32maxp.X()=(*points)[elem.PNum(1)].P()(0);33maxp.Y()=(*points)[elem.PNum(1)].P()(1);34maxp.Z()=(*points)[elem.PNum(1)].P()(2);35minp.X()=(*points)[elem.PNum(1)].P()(0);36minp.Y()=(*points)[elem.PNum(1)].P()(1);37minp.Z()=(*points)[elem.PNum(1)].P()(2);3839for (int i=2; i <= 3; i++)40{41maxp.X()=max2((*points)[elem.PNum(i)].P()(0),maxp.X());42maxp.Y()=max2((*points)[elem.PNum(i)].P()(1),maxp.Y());43maxp.Z()=max2((*points)[elem.PNum(i)].P()(2),maxp.Z());44minp.X()=min2((*points)[elem.PNum(i)].P()(0),minp.X());45minp.Y()=min2((*points)[elem.PNum(i)].P()(1),minp.Y());46minp.Z()=min2((*points)[elem.PNum(i)].P()(2),minp.Z());47}48}4950void GeomSearch3d :: MinCoords(const Point3d& p1, Point3d& p2)51{52p2.X()=min2(p1.X(),p2.X());53p2.Y()=min2(p1.Y(),p2.Y());54p2.Z()=min2(p1.Z(),p2.Z());55}5657void GeomSearch3d :: MaxCoords(const Point3d& p1, Point3d& p2)58{59p2.X()=max2(p1.X(),p2.X());60p2.Y()=max2(p1.Y(),p2.Y());61p2.Z()=max2(p1.Z(),p2.Z());62}6364void GeomSearch3d :: Create()65{66INDEX i,j,k;67if (reset)68{69const double hashelemsizefactor = 4;70reset = 0;71/*72minext=Point3d(MAXDOUBLE, MAXDOUBLE, MAXDOUBLE);73maxext=Point3d(MINDOUBLE, MINDOUBLE, MINDOUBLE);74*/75ElemMaxExt(minext, maxext, faces->Get(1).Face());76Point3d maxp, minp;77Vec3d midext(0,0,0);7879//get max Extension of Frontfaces80for (i = 1; i <= faces->Size(); i++)81{82ElemMaxExt(minp, maxp, faces->Get(i).Face());83MinCoords(minp, minext);84MaxCoords(maxp, maxext);85midext+=maxp-minp;86}878889maxextreal = maxext;90maxext = maxext + 1e-4 * (maxext - minext);9192midext*=1./faces->Size();93Vec3d boxext = maxext - minext;9495//delete old Hashtable:96if (size.i1 != 0)97{98for (i = 1; i <= size.i1*size.i2*size.i3; i++)99{100delete hashtable.Get(i);101}102}103104size.i1 = int (boxext.X()/midext.X()/hashelemsizefactor+1);105size.i2 = int (boxext.Y()/midext.Y()/hashelemsizefactor+1);106size.i3 = int (boxext.Z()/midext.Z()/hashelemsizefactor+1);107// PrintMessage (5, "hashsizes = ", size.i1, ", ", size.i2, ", ", size.i3);108109elemsize.X()=boxext.X()/size.i1;110elemsize.Y()=boxext.Y()/size.i2;111elemsize.Z()=boxext.Z()/size.i3;112113//create Hasharrays:114hashtable.SetSize(size.i1*size.i2*size.i3);115for (i = 1; i <= size.i1; i++)116{117for (j = 1; j <= size.i2; j++)118{119for (k = 1; k <= size.i3; k++)120{121INDEX ind=i+(j-1)*size.i1+(k-1)*size.i2*size.i1;122hashtable.Elem(ind) = new ARRAY <int> ();123}124}125}126}127else128{129//Clear all Hash-Arrays130for (i = 1; i <= size.i1; i++)131{132for (j = 1; j <= size.i2; j++)133{134for (k = 1; k <= size.i3; k++)135{136INDEX ind=i+(j-1)*size.i1+(k-1)*size.i2*size.i1;137hashtable.Elem(ind)->SetSize(0);138}139}140}141}142143//Faces in Hashtable einfuegen:144for (i = 1; i <= faces->Size(); i++)145{146AddElem(faces->Get(i).Face(),i);147}148149}150151void GeomSearch3d :: AddElem(const MiniElement2d& elem, INDEX elemnum)152{153Point3d minp, maxp;154ElemMaxExt(minp, maxp, elem);155int sx = int ((minp.X()-minext.X())/elemsize.X()+1.);156int ex = int ((maxp.X()-minext.X())/elemsize.X()+1.);157int sy = int ((minp.Y()-minext.Y())/elemsize.Y()+1.);158int ey = int ((maxp.Y()-minext.Y())/elemsize.Y()+1.);159int sz = int ((minp.Z()-minext.Z())/elemsize.Z()+1.);160int ez = int ((maxp.Z()-minext.Z())/elemsize.Z()+1.);161162for (int ix = sx; ix <= ex; ix++)163for (int iy = sy; iy <= ey; iy++)164for (int iz = sz; iz <= ez; iz++)165{166INDEX ind=ix+(iy-1)*size.i1+(iz-1)*size.i2*size.i1;167if (ind < 1 || ind > size.i1 * size.i2 * size.i3)168{169cerr << "Illegal hash-position";170cerr << "Position: " << ix << "," << iy << "," << iz << endl;171throw NgException ("Illegal position in Geomsearch");172}173hashtable.Elem(ind)->Append(elemnum);174}175}176177void GeomSearch3d :: GetLocals(ARRAY<MiniElement2d> & locfaces, ARRAY<INDEX> & findex,178INDEX fstind, const Point3d& p0, double xh)179{180hashcount++;181182Point3d minp, maxp, midp;183184minp=p0-Vec3d(xh,xh,xh); //lay cube over sphere185maxp=p0+Vec3d(xh,xh,xh);186187MaxCoords(minext,minp); //cube may not be out of hash-region188MinCoords(maxextreal,maxp);189190191int cluster = faces->Get(fstind).Cluster();192193int sx = int((minp.X()-minext.X())/elemsize.X()+1.);194int ex = int((maxp.X()-minext.X())/elemsize.X()+1.);195int sy = int((minp.Y()-minext.Y())/elemsize.Y()+1.);196int ey = int((maxp.Y()-minext.Y())/elemsize.Y()+1.);197int sz = int((minp.Z()-minext.Z())/elemsize.Z()+1.);198int ez = int((maxp.Z()-minext.Z())/elemsize.Z()+1.);199int ix,iy,iz,i,k;200201int cnt1 = 0; // test, how efficient hashtable is202int cnt2 = 0;203int cnt3 = 0;204205for (ix = sx; ix <= ex; ix++)206{207for (iy = sy; iy <= ey; iy++)208{209for (iz = sz; iz <= ez; iz++)210{211INDEX ind=ix+(iy-1)*size.i1+(iz-1)*size.i2*size.i1;212213//go through all elements in one hash area214const ARRAY <int> & area = *hashtable.Elem(ind);215for (k = 1; k <= area.Size(); k++)216{217cnt2++;218i = area.Get(k);219if (faces->Get(i).Cluster() == cluster &&220faces->Get(i).Valid() &&221faces->Get(i).HashValue() != hashcount &&222i != fstind)223{224cnt1++;225const MiniElement2d & face = faces->Get(i).Face();226227const Point3d & p1 = (*points)[face.PNum(1)].P();228const Point3d & p2 = (*points)[face.PNum(2)].P();229const Point3d & p3 = (*points)[face.PNum(3)].P();230231midp = Center (p1, p2, p3);232233// if (Dist2 (midp, p0) <= xh*xh)234if((Dist2 (p1, p0) <= xh*xh) ||235(Dist2 (p2, p0) <= xh*xh) ||236(Dist2 (p3, p0) <= xh*xh) ||237(Dist2 (midp, p0) <= xh*xh) ) // by Jochen Wild238{239cnt3++;240locfaces.Append(faces->Get(i).Face());241findex.Append(i);242faces->Elem(i).SetHashValue(hashcount);243}244}245}246}247}248}249/*250if (faces->Size() != 0 && hashcount % 200 == 0)251{252(*mycout) << "n.o.f= " << faces->Size();253(*mycout) << ", n.o.lf= " << locfaces.Size();254(*mycout) << ", hashf= " << (double)cnt2/(double)faces->Size();255(*mycout) << " (" << (double)cnt1/(double)faces->Size();256(*mycout) << ", " << (double)cnt3/(double)faces->Size() << ")" << endl;257}258*/259260}261262}263264265