diff --git a/Mesh/meshGRegion.cpp b/Mesh/meshGRegion.cpp index bc1350dcb4ef4cde59b1fcc20ba2e7964eac6087..f882267ababce80954ccd15f9caa41cc0569072e 100644 --- a/Mesh/meshGRegion.cpp +++ b/Mesh/meshGRegion.cpp @@ -162,6 +162,7 @@ void TransferTetgenMesh(GRegion *gr, tetgenio &in, tetgenio &out, std::vector<MV // SPoint2 pp = gf->parFromPoint(SPoint3 (v[j]->x(),v[j]->y(),v[j]->z())); SPoint2 pp (0,0); MFaceVertex *v1b = new MFaceVertex (v[j]->x(),v[j]->y(),v[j]->z(),gf,pp.x(),pp.y() ); + gf->mesh_vertices.push_back(v1b); numberedV[out.trifacelist[i * 3 + j] -1] = v1b; delete v[j]; v[j] = v1b; diff --git a/Mesh/meshGRegionDelaunayInsertion.cpp b/Mesh/meshGRegionDelaunayInsertion.cpp index 105e83a3ee2d94d3b80150fab6b0ac4e75924f71..57f367f3d6f46ba4ea1663a707f03377618b1033 100644 --- a/Mesh/meshGRegionDelaunayInsertion.cpp +++ b/Mesh/meshGRegionDelaunayInsertion.cpp @@ -3,6 +3,7 @@ #include "Numeric.h" #include "Message.h" #include <set> +#include <map> #include <algorithm> int MTet4::inCircumSphere ( const double *p ) const @@ -104,11 +105,10 @@ void recurFindCavity ( std::list<faceXtet> & shell, } } -int III; - bool insertVertex (MVertex *v , MTet4 *t , - std::set<MTet4*,compareTet4Ptr> &allTets) + std::set<MTet4*,compareTet4Ptr> &allTets, + std::vector<double> & vSizes) { std::list<faceXtet> shell; std::list<MTet4*> cavity; @@ -132,7 +132,6 @@ bool insertVertex (MVertex *v , double oldVolume = 0; // char name2[245]; - // sprintf(name2,"testv%d.pos",III); // FILE *ff2 = fopen (name2,"w"); // fprintf(ff2,"View\"test\"{\n"); @@ -198,7 +197,7 @@ bool insertVertex (MVertex *v , // it->v[2]->y(), // it->v[2]->z()); - MTet4 *t4 = new MTet4 ( t ); + MTet4 *t4 = new MTet4 ( t , vSizes); newTets[k++]=t4; // all new tets are pushed front in order to // ba able to destroy them if the cavity is not @@ -242,45 +241,58 @@ bool insertVertex (MVertex *v , return false; } } + +static void setLcs ( MTetrahedron *t, std::map<MVertex*,double> &vSizes) +{ + for (int i=0;i<4;i++) + { + for (int j=i+1;j<4;j++) + { + MVertex *vi = t->getVertex(i); + MVertex *vj = t->getVertex(j); + double dx = vi->x()-vj->x(); + double dy = vi->y()-vj->y(); + double dz = vi->z()-vj->z(); + double l = sqrt(dx*dx+dy*dy+dz*dz); + std::map<MVertex*,double>::iterator iti = vSizes.find(vi); + std::map<MVertex*,double>::iterator itj = vSizes.find(vj); + if (iti==vSizes.end() || iti->second > l)vSizes[vi] = l; + if (itj==vSizes.end() || itj->second > l)vSizes[vj] = l; + } + } +} + + void insertVerticesInRegion (GRegion *gr) { std::set<MTet4*,compareTet4Ptr> allTets; + std::map<MVertex*,double> vSizesMap; + std::vector<double> vSizes; - for (int i=0;i<gr->tetrahedra.size();i++) + for (int i=0;i<gr->tetrahedra.size();i++)setLcs ( gr->tetrahedra[i] , vSizesMap); + + int NUM=0; + for (std::map<MVertex*,double>::iterator it = vSizesMap.begin();it!=vSizesMap.end();++it) { - allTets.insert ( new MTet4 ( gr->tetrahedra[i] ) ); + it->first->setNum(NUM++); + vSizes.push_back(it->second); } + + for (int i=0;i<gr->tetrahedra.size();i++) + allTets.insert ( new MTet4 ( gr->tetrahedra[i] ,vSizes ) ); + gr->tetrahedra.clear(); connectTets ( allTets.begin(), allTets.end() ); -// for (std::set<MTet4*,compareTet4Ptr>::iterator it = allTets.begin();it!=allTets.end();++it) -// { -// printf("tet %d %d %d %d neigh %p %p %p %p\n", -// (*it)->tet()->getVertex(0)->getNum(), -// (*it)->tet()->getVertex(1)->getNum(), -// (*it)->tet()->getVertex(2)->getNum(), -// (*it)->tet()->getVertex(3)->getNum(), -// (*it)->getNeigh(0),(*it)->getNeigh(1),(*it)->getNeigh(2),(*it)->getNeigh(3)); -// } - - Msg(INFO,"All %d tets were connected",allTets.size()); // here the classification should be done - III = 0; + int ITER = 0; while (1) { - // connectTets ( allTets.begin(), allTets.end() ); - // for (std::set<MTet4*,compareTet4Ptr>::iterator tit = allTets.begin();tit != allTets.end();++tit) - // if(!(*tit)->assertNeigh())throw; - // double vv = 0; - // for (std::set<MTet4*,compareTet4Ptr>::iterator tit = allTets.begin();tit != allTets.end();++tit) - // if (!(*tit)->isDeleted())vv+=fabs((*tit)->getVolume()); - - MTet4 *worst = *allTets.begin(); if (worst->isDeleted()) @@ -292,8 +304,9 @@ void insertVerticesInRegion (GRegion *gr) } else { - if(III%1000 ==0)Msg(INFO,"%d points created -- Worst tet radius is %g",gr->mesh_vertices.size(),worst->getRadius()); - if (worst->getRadius() < .015) break; + if(ITER++%5000 ==0) + Msg(INFO,"%d points created -- Worst tet radius is %g",vSizes.size(),worst->getRadius()); + if (worst->getRadius() < 1) break; double center[3]; worst->tet()->circumcenter(center); double uvw[3]; @@ -301,19 +314,25 @@ void insertVerticesInRegion (GRegion *gr) if (inside) { MVertex *v = new MVertex (center[0],center[1],center[2]); + v->setNum(NUM++); + double lc = + (1-uvw[0]-uvw[1]-uvw[2])*vSizes[worst->tet()->getVertex(0)->getNum()] + + (uvw[0])*vSizes[worst->tet()->getVertex(1)->getNum()] + + (uvw[1])*vSizes[worst->tet()->getVertex(2)->getNum()] + + (uvw[2])*vSizes[worst->tet()->getVertex(3)->getNum()]; + vSizes.push_back(lc); // compute mesh spacing there - III++; - if (!insertVertex ( v , worst, allTets)) + if (!insertVertex ( v , worst, allTets,vSizes)) { - // this one does not work - // Msg(INFO,"Point is %g %g %g %d",uvw[0], uvw[1], uvw[2],worst->inCircumSphere ( v )); allTets.erase(allTets.begin()); worst->forceRadius(0); allTets.insert(worst); delete v; } - else gr->mesh_vertices.push_back(v); - // if(III == 15) break; + else + { + gr->mesh_vertices.push_back(v); + } } else { diff --git a/Mesh/meshGRegionDelaunayInsertion.h b/Mesh/meshGRegionDelaunayInsertion.h index fcdbac13a2f68fee3343ca5e1a565f4997b6de5b..759bbacf97ad040567426eb581bc3d7b419fe043 100644 --- a/Mesh/meshGRegionDelaunayInsertion.h +++ b/Mesh/meshGRegionDelaunayInsertion.h @@ -17,7 +17,7 @@ class MTet4 void forceRadius (double r){circum_radius=r;} double getRadius ()const {return circum_radius;} - MTet4 ( MTetrahedron * t) : deleted(false), base (t) + MTet4 ( MTetrahedron * t, std::vector<double> & sizes) : deleted(false), base (t) { neigh[0] = neigh[1] = neigh[2] = neigh[3] = 0; double center[3]; @@ -26,6 +26,12 @@ class MTet4 const double dy = base->getVertex(0)->y() - center[1]; const double dz = base->getVertex(0)->z() - center[2]; circum_radius = sqrt ( dx*dx + dy*dy + dz*dz); + + double lc = 0.25*(sizes [base->getVertex(0)->getNum()]+ + sizes [base->getVertex(1)->getNum()]+ + sizes [base->getVertex(2)->getNum()]+ + sizes [base->getVertex(3)->getNum()]); + circum_radius /= lc; } inline MTetrahedron * tet() const {return base;} diff --git a/benchmarks/3d/Cube-04.geo b/benchmarks/3d/Cube-04.geo index 357bd131cff1769057d24fcd49fd61327d15543a..47cc1819d9dbeb57935b629781f42467202c1208 100644 --- a/benchmarks/3d/Cube-04.geo +++ b/benchmarks/3d/Cube-04.geo @@ -7,7 +7,7 @@ Extrude Point {1, {1,0.0,0} }; Extrude Line {1, {0.0,0.0,1} }; aa[] = Extrude Surface {5, {0,1,0} };; -Point(100) = {0.3,0.3,0.3,.02}; +Point(100) = {0.3,0.3,0.3,.1}; Extrude Point {100, {.4,0.0,0} }; Extrude Line {28, {0,0.4,0} }; Coherence; diff --git a/benchmarks/3d/Torus.geo b/benchmarks/3d/Torus.geo index 771b08b3aeca17b904eccd8054e31a098f6a3bd5..f4b965cb73c4e911210b5a384507fddfcf84f1db 100644 --- a/benchmarks/3d/Torus.geo +++ b/benchmarks/3d/Torus.geo @@ -1,4 +1,4 @@ -lc = .2; +lc = .1; Point(1) = {2.0,0.0,0.0,lc}; Point(2) = {2.0,1,0.0,lc}; Point(3) = {1,0,0.0,lc};