From ad08dd6a579b094410329fa758d6de6738709e0a Mon Sep 17 00:00:00 2001 From: Jean-Francois Remacle <jean-francois.remacle@uclouvain.be> Date: Wed, 18 Apr 2012 07:02:27 +0000 Subject: [PATCH] removed bugs in BL --- Fltk/highOrderToolsWindow.cpp | 1 + Mesh/Field.cpp | 10 ++++-- Mesh/meshGFaceBoundaryLayers.cpp | 6 ++-- contrib/HighOrderMeshOptimizer/OptHOM.cpp | 4 +-- contrib/HighOrderMeshOptimizer/OptHOM.h | 2 +- contrib/HighOrderMeshOptimizer/OptHomRun.cpp | 36 +++++++++++--------- 6 files changed, 35 insertions(+), 24 deletions(-) diff --git a/Fltk/highOrderToolsWindow.cpp b/Fltk/highOrderToolsWindow.cpp index cf40d0e66b..de8d0eac70 100644 --- a/Fltk/highOrderToolsWindow.cpp +++ b/Fltk/highOrderToolsWindow.cpp @@ -79,6 +79,7 @@ static void highordertools_runelas_cb(Fl_Widget *w, void *data) p.BARRIER = threshold; p.onlyVisible = onlyVisible; p.dim = GModel::current()->getNumRegions() ? 3 : 2; + p.itMax = (int) o->value[3]->value(); HighOrderMeshOptimizer (GModel::current(),p); } diff --git a/Mesh/Field.cpp b/Mesh/Field.cpp index ae3ead8182..addd52d47e 100644 --- a/Mesh/Field.cpp +++ b/Mesh/Field.cpp @@ -1898,7 +1898,13 @@ void BoundaryLayerField::operator() (AttractorField *cc, double dist, std::pair<AttractorInfo,SPoint3> pp = cc->getAttractorInfo(); if (pp.first.dim ==0){ GVertex *v = GModel::current()->getVertexByTag(pp.first.ent); - SVector3 t1 = SVector3(v->x() -x,v->y() -y,v->z() -z); + SVector3 t1; + if (dist < thickness){ + t1 = SVector3(1,0,0); + } + else { + t1 = SVector3(v->x() -x,v->y() -y,v->z() -z); + } metr = buildMetricTangentToCurve(t1,lc_n,lc_n); return; } @@ -1955,7 +1961,7 @@ void BoundaryLayerField::operator() (double x, double y, double z, } for(std::list<int>::iterator it = edges_id.begin(); it != edges_id.end(); ++it) { - _att_fields.push_back(new AttractorField(1,*it,300000)); + _att_fields.push_back(new AttractorField(1,*it,3000)); } for(std::list<int>::iterator it = faces_id.begin(); it != faces_id.end(); ++it) { diff --git a/Mesh/meshGFaceBoundaryLayers.cpp b/Mesh/meshGFaceBoundaryLayers.cpp index f74e209a3d..cd830de491 100644 --- a/Mesh/meshGFaceBoundaryLayers.cpp +++ b/Mesh/meshGFaceBoundaryLayers.cpp @@ -276,6 +276,7 @@ BoundaryLayerColumns* buidAdditionalPoints2D (GFace *gf) } _columns->addFan (*it,ee[0],ee[1],true); + // printf("fansize = %d\n",fanSize); for (int i=-1; i<=fanSize; i++){ double t = (double)(i+1)/ (fanSize+1); double alpha = t * AMAX + (1.-t)* AMIN; @@ -330,14 +331,14 @@ BoundaryLayerColumns* buidAdditionalPoints2D (GFace *gf) // if (_dirs.size() > 1) printf("l = %g metric = %g %g %g dim %d tag %d \n",l,metric[0],metric[1],metric[2],current->onWhat()->dim(),current->onWhat()->tag()); // printf("%g %g\n",l,LL); if (l >= blf->hfar){ - // printf("stopping %g %g\n",l,LL); + // printf("stopping %g %g\n",l,LL); break; } // printf("%g %g %g \n",current->x(),current->y(),blf->current_distance); if (blf->current_closest != catt || blf -> current_distance < _current_distance){ SVector3 aaa (_close- blf->_closest_point); if (aaa.norm() > 8*blf->hwall_n || blf -> current_distance < _current_distance){ - printf("reaching the skelton %d\n", (int) _column.size()); + // printf("reaching the skelton %d\n", (int) _column.size()); delete _column[_column.size()-1]; _column.erase(--_column.end()); _metrics.erase(--_metrics.end()); @@ -366,6 +367,7 @@ BoundaryLayerColumns* buidAdditionalPoints2D (GFace *gf) if (_column.size() > nbCol)break; // FIXME p = pnew; } + // if (_dirs.size() > 1)printf("adding column with %d nodes\n",_column.size()); _columns->addColumn(n,*it, _column, _metrics); } } diff --git a/contrib/HighOrderMeshOptimizer/OptHOM.cpp b/contrib/HighOrderMeshOptimizer/OptHOM.cpp index ce38c6b41d..4c7dd27eb2 100644 --- a/contrib/HighOrderMeshOptimizer/OptHOM.cpp +++ b/contrib/HighOrderMeshOptimizer/OptHOM.cpp @@ -200,7 +200,7 @@ void OptHOM::OptimPass(alglib::real_1d_array &x, const alglib::real_1d_array &in -int OptHOM::optimize(double weightFixed, double weightFree, double barrier_, int pInt, int itMax) +int OptHOM::optimize(double weightFixed, double weightFree, double barrier_, int pInt, int itMax, double &minJ, double &maxJ) { barrier = barrier_; progressInterv = pInt; @@ -221,7 +221,7 @@ int OptHOM::optimize(double weightFixed, double weightFree, double barrier_, int mesh.getUvw(x.getcontent()); // Calculate initial performance - double minJ, maxJ; + // double minJ, maxJ; getDistances(initMaxD, initAvgD, minJ, maxJ); const double jacBarStart = (minJ > 0.) ? 0.9*minJ : 1.1*minJ; diff --git a/contrib/HighOrderMeshOptimizer/OptHOM.h b/contrib/HighOrderMeshOptimizer/OptHOM.h index 575a5eb3d3..23c7efaab9 100644 --- a/contrib/HighOrderMeshOptimizer/OptHOM.h +++ b/contrib/HighOrderMeshOptimizer/OptHOM.h @@ -23,7 +23,7 @@ public: OptHOM(GEntity *gf, std::set<MVertex*> & toFix, int method); void getDistances(double &distMaxBND, double &distAvgBND, double &minJac, double &maxJac); - int optimize(double lambda, double lambda2, double barrier, int pInt, int itMax); // optimize one list of elements + int optimize(double lambda, double lambda2, double barrier, int pInt, int itMax, double &minJ, double &maxJ); // optimize one list of elements void updateMesh(const alglib::real_1d_array &x); void evalObjGrad(const alglib::real_1d_array &x, double &Obj, alglib::real_1d_array &gradObj); void printProgress(const alglib::real_1d_array &x, double Obj); diff --git a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp index b0d03813eb..ef79978e23 100644 --- a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp +++ b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp @@ -55,8 +55,8 @@ std::set<MVertex*> filter2D(GFace *gf, int nbLayers, double _qual, bool onlythew } } } - printf("FILTER2D : %d bad triangles found among %6d\n", ts.size(), gf->triangles.size()); - printf("FILTER2D : %d bad quads found among %6d\n", qs.size(), gf->quadrangles.size()); + // printf("FILTER2D : %d bad triangles found among %6d\n", ts.size(), gf->triangles.size()); + // printf("FILTER2D : %d bad quads found among %6d\n", qs.size(), gf->quadrangles.size()); // add layers of elements around bad elements for (int layer = 0; layer < nbLayers; layer++) { @@ -113,7 +113,7 @@ std::set<MVertex*> filter2D(GFace *gf, int nbLayers, double _qual, bool onlythew gf->triangles.insert(gf->triangles.begin(), ts.begin(), ts.end()); gf->quadrangles.insert(gf->quadrangles.begin(), qs.begin(), qs.end()); - printf("FILTER2D : AFTER FILTERING %d triangles %d quads remain %d nodes on the boundary\n", gf->triangles.size(), gf->quadrangles.size(), not_touched.size()); + // printf("FILTER2D : AFTER FILTERING %d triangles %d quads remain %d nodes on the boundary\n", gf->triangles.size(), gf->quadrangles.size(), not_touched.size()); return not_touched; } @@ -132,7 +132,7 @@ std::set<MVertex*> filter3D(GRegion *gr, int nbLayers, double _qual) if (ts.size() == 1) break; } - printf("FILTER3D : %d bad tets found among %6d\n", ts.size(), gr->tetrahedra.size()); + // printf("FILTER3D : %d bad tets found among %6d\n", ts.size(), gr->tetrahedra.size()); // add layers of elements around bad elements for (int layer = 0; layer < nbLayers; layer++) { @@ -165,7 +165,7 @@ std::set<MVertex*> filter3D(GRegion *gr, int nbLayers, double _qual) gr->tetrahedra.clear(); gr->tetrahedra.insert(gr->tetrahedra.begin(), ts.begin(), ts.end()); - printf("FILTER3D : AFTER FILTERING %d tets remain %d nodes on the boundary\n", gr->tetrahedra.size(), not_touched.size()); + // printf("FILTER3D : AFTER FILTERING %d tets remain %d nodes on the boundary\n", gr->tetrahedra.size(), not_touched.size()); return not_touched; } @@ -187,6 +187,7 @@ void HighOrderMeshOptimizer (GModel *gm, OptHomParameters &p) if (p.dim == 2) { for (GModel::fiter itf = gm->firstFace(); itf != gm->lastFace(); ++itf) { + if (p.onlyVisible && !(*itf)->getVisibility())continue; std::vector<MTriangle*> tris = (*itf)->triangles; std::vector<MQuadrangle*> quas = (*itf)->quadrangles; std::set<MVertex*> toFix = filter2D(*itf, p.nbLayers, p.BARRIER); @@ -196,33 +197,34 @@ void HighOrderMeshOptimizer (GModel *gm, OptHomParameters &p) double distMaxBND, distAvgBND, minJac, maxJac; temp->getDistances(distMaxBND, distAvgBND, minJac, maxJac); - std::ostringstream ossI; - ossI << "initial_" << (*itf)->tag() << ".msh"; - temp->mesh.writeMSH(ossI.str().c_str()); - printf("--> Mesh Loaded for GFace %d : minJ %12.5E -- maxJ %12.5E\n", (*itf)->tag(), minJac, maxJac); + // std::ostringstream ossI; + // ossI << "initial_" << (*itf)->tag() << ".msh"; + // temp->mesh.writeMSH(ossI.str().c_str()); + // printf("--> Mesh Loaded for GFace %d : minJ %12.5E -- maxJ %12.5E\n", (*itf)->tag(), minJac, maxJac); if (distMaxBND < 1.e-8 * SIZE && minJac > p.BARRIER) continue; - int result = temp->optimize(p.weightFixed, p.weightFree, p.BARRIER, samples, p.itMax); + p.SUCCESS = temp->optimize(p.weightFixed, p.weightFree, p.BARRIER, samples, p.itMax, p.minJac, p.maxJac); temp->mesh.updateGEntityPositions(); - std::ostringstream ossF; - ossF << "final_" << (*itf)->tag() << ".msh"; - temp->mesh.writeMSH(ossF.str().c_str()); + // std::ostringstream ossF; + // ossF << "final_" << (*itf)->tag() << ".msh"; + // temp->mesh.writeMSH(ossF.str().c_str()); } } else if (p.dim == 3) { for (GModel::riter itr = gm->firstRegion(); itr != gm->lastRegion(); ++itr) { + if (p.onlyVisible && !(*itr)->getVisibility())continue; std::vector<MTetrahedron*> tets = (*itr)->tetrahedra; std::set<MVertex*> toFix; filter3D(*itr, p.nbLayers, p.BARRIER); OptHOM *temp = new OptHOM(*itr, toFix, method); double distMaxBND, distAvgBND, minJac, maxJac; temp->getDistances(distMaxBND, distAvgBND, minJac, maxJac); - temp->mesh.writeMSH("initial.msh"); - printf("--> Mesh Loaded for GRegion %d : minJ %12.5E -- maxJ %12.5E\n", (*itr)->tag(), minJac, maxJac); + // temp->mesh.writeMSH("initial.msh"); + // printf("--> Mesh Loaded for GRegion %d : minJ %12.5E -- maxJ %12.5E\n", (*itr)->tag(), minJac, maxJac); if (distMaxBND < 1.e-8 * SIZE && minJac > p.BARRIER) continue; - int result = temp->optimize(p.weightFixed, p.weightFree, p.BARRIER, samples, p.itMax); + p.SUCCESS = temp->optimize(p.weightFixed, p.weightFree, p.BARRIER, samples, p.itMax, p.minJac, p.maxJac); temp->mesh.updateGEntityPositions(); (*itr)->tetrahedra = tets; - temp->mesh.writeMSH("final.msh"); + // temp->mesh.writeMSH("final.msh"); } } } -- GitLab