diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp index 97a0d34f74a16cfacccf97b007deab5d90ca56b6..089fb42dab7bc2310591edfebecc8305f2c2bce6 100644 --- a/Geo/GModel.cpp +++ b/Geo/GModel.cpp @@ -568,6 +568,7 @@ int GModel::adaptMesh(int technique, simpleFunction<double> *f, std::vector<doub for (fiter fit = firstFace(); fit != lastFace(); ++fit){ if((*fit)->geomType() != GEntity::DiscreteSurface){ opt_mesh_lc_from_points(0, GMSH_SET, 0); + meshGFaceBamg(*fit); laplaceSmoothing(*fit,CTX::instance()->mesh.nbSmoothing); } diff --git a/Mesh/meshGFaceBamg.cpp b/Mesh/meshGFaceBamg.cpp index 8146aac4feb23242d120c3d0137eed5f0fe57e00..1b24017ea7fdfb83ebd022bc58d3f8eeed4854d5 100644 --- a/Mesh/meshGFaceBamg.cpp +++ b/Mesh/meshGFaceBamg.cpp @@ -27,8 +27,7 @@ Mesh2 *Bamg(Mesh2 *Thh, double * args,double *mm11,double *mm12,double *mm22, bo static void computeMeshMetricsForBamg(GFace *gf, int numV, Vertex2 *bamgVertices, - double *mm11, double *mm12, double *mm22, - int iter) + double *mm11, double *mm12, double *mm22) { // char name[245]; // sprintf(name,"bgmBamg-%d-%d.pos",gf->tag(),iter); @@ -64,8 +63,9 @@ static void computeMeshMetricsForBamg(GFace *gf, int numV, } } -static void meshGFaceBamg_(GFace *gf, int iter, bool initialMesh) -{ + +void meshGFaceBamg(GFace *gf){ + std::set<MVertex*> all; std::map<int,MVertex*> recover; for (unsigned int i = 0; i < gf->triangles.size(); i++){ @@ -134,30 +134,48 @@ static void meshGFaceBamg_(GFace *gf, int iter, bool initialMesh) bamgBoundary[count++].lab = count; } } - Mesh2 bamgMesh ( all.size(), gf->triangles.size(), numEdges, - bamgVertices, bamgTriangles, bamgBoundary); - double *mm11 = new double[all.size()]; - double *mm12 = new double[all.size()]; - double *mm22 = new double[all.size()]; - double args[256]; - for (int i=0;i<256;i++)args[i] = -1.1e100; - args[16] = CTX::instance()->mesh.anisoMax; - args[ 7] = CTX::instance()->mesh.smoothRatio; - computeMeshMetricsForBamg (gf,all.size(),bamgVertices,mm11,mm12,mm22,iter); + Mesh2 *bamgMesh = new Mesh2 ( all.size(), gf->triangles.size(), numEdges, + bamgVertices, bamgTriangles, bamgBoundary); + + //*************** refine loop here Mesh2 *refinedBamgMesh = 0; - try{ - refinedBamgMesh = Bamg(&bamgMesh, args, mm11, mm12, mm22, initialMesh); - Msg::Info("bamg succeeded %d vertices %d triangles", - refinedBamgMesh->nv, refinedBamgMesh->nt); - } - catch(...){ - Msg::Error("bamg failed"); - return; + int iterMax = 11; + for (int k= 0; k < iterMax; k++){ + + int nbVert = bamgMesh->nv;// all.size(); + + double *mm11 = new double[nbVert]; + double *mm12 = new double[nbVert]; + double *mm22 = new double[nbVert]; + double args[256]; + for (int i=0;i<256;i++)args[i] = -1.1e100; + args[16] = CTX::instance()->mesh.anisoMax; + args[ 7] = CTX::instance()->mesh.smoothRatio; + computeMeshMetricsForBamg (gf, nbVert, bamgMesh->vertices , mm11,mm12,mm22); //bamgVertices + + try{ + refinedBamgMesh = Bamg(bamgMesh, args, mm11, mm12, mm22, false); + Msg::Info("bamg succeeded %d vertices %d triangles", + refinedBamgMesh->nv, refinedBamgMesh->nt); + } + catch(...){ + Msg::Error("bamg failed"); + return; + } + delete [] mm11; + delete [] mm12; + delete [] mm22; + + int nT = bamgMesh->nt; + int nTnow = refinedBamgMesh->nt; + + delete bamgMesh; + bamgMesh = refinedBamgMesh; + if (fabs((double)(nTnow - nT)) < 0.01 * nT) break; } - delete [] mm11; - delete [] mm12; - delete [] mm22; + //*************** end for loop refine + std::map<int,MVertex*> yetAnother; for (int i = 0; i < refinedBamgMesh->nv; i++){ Vertex2 &v = refinedBamgMesh->vertices[i]; @@ -189,26 +207,6 @@ static void meshGFaceBamg_(GFace *gf, int iter, bool initialMesh) if (refinedBamgMesh) delete refinedBamgMesh; } -void meshGFaceBamg(GFace *gf) -{ - int nT = gf->triangles.size(); - // meshGFaceBamg_ ( gf , 0, true); - for (int i = 1; i < 14; i++){ - //char name[245]; - //sprintf(name,"hop%d.msh",i); - //GModel::current()->writeMSH(name); - meshGFaceBamg_(gf, i, false); - //sprintf(name,"hap%d.msh",i); - //GModel::current()->writeMSH(name); - - int nTnow = gf->triangles.size(); - if (fabs((double)(nTnow - nT)) < 0.01 * nT) break; - nT = nTnow; - } - // lloydAlgorithm lloyd (20); - // lloyd(gf); -} - #else void meshGFaceBamg(GFace *gf)