diff --git a/Fltk/highOrderToolsWindow.cpp b/Fltk/highOrderToolsWindow.cpp index 843508804fa5b13d4b10b788779fd5a53c3d3043..6b6a5bcd98a721b030446fd05b5a64d6f0d1cc81 100644 --- a/Fltk/highOrderToolsWindow.cpp +++ b/Fltk/highOrderToolsWindow.cpp @@ -41,6 +41,23 @@ typedef unsigned long intptr_t; #include "Parser.h" #endif + +static void change_completeness_cb(Fl_Widget *w, void *data){ + + highOrderToolsWindow *o = FlGui::instance()->highordertools; + bool onlyVisible = (bool)o->butt[1]->value(); + if (!o->complete){ + SetHighOrderComplete (GModel::current(), onlyVisible); + o->complete = 1; + } + else if (o->complete){ + SetHighOrderInComplete (GModel::current(), onlyVisible); + o->complete = 0; + } + CTX::instance()->mesh.changed |= (ENT_LINE | ENT_SURFACE | ENT_VOLUME); + drawContext::global()->draw(); +} + static void highordertools_runp_cb(Fl_Widget *w, void *data) { highOrderToolsWindow *o = FlGui::instance()->highordertools; @@ -76,18 +93,18 @@ static void chooseopti_cb(Fl_Widget *w, void *data){ if (elastic){ o->butt[4]->value(0); - o->choice[0]->hide(); + o->choice[0]->deactivate(); for (int i=3;i<=6;i++) - o->value[i]->hide(); - o->push[1]->hide(); + o->value[i]->deactivate(); + o->push[1]->deactivate(); } else { o->butt[3]->value(0); - o->push[0]->show(); - o->choice[0]->show(); + o->push[0]->activate(); + o->choice[0]->activate(); for (int i=3;i<=6;i++) - o->value[i]->show(); - o->push[1]->show(); + o->value[i]->activate(); + o->push[1]->activate(); } } @@ -99,22 +116,49 @@ static void chooseopti2_cb(Fl_Widget *w, void *data){ if (elastic){ o->butt[4]->value(0); - o->choice[0]->hide(); + o->choice[0]->deactivate(); for (int i=3;i<=6;i++) - o->value[i]->hide(); - o->push[1]->hide(); + o->value[i]->deactivate(); + o->push[1]->deactivate(); } else { o->butt[3]->value(0); - o->push[0]->show(); - o->choice[0]->show(); + o->push[0]->activate(); + o->choice[0]->activate(); for (int i=3;i<=6;i++) - o->value[i]->show(); - o->push[1]->show(); + o->value[i]->activate(); + o->push[1]->activate(); } } +static void getMeshInfo (GModel *gm, + int &meshOrder, + bool &complete, + bool &CAD){ + meshOrder = -1; + CAD = true; + for (GModel::riter itr = gm->firstRegion(); itr != gm->lastRegion(); ++itr) { + if ((*itr)->getNumMeshElements()){ + meshOrder = (*itr)->getMeshElement(0)->getPolynomialOrder(); + complete = (meshOrder <= 2) ? 1 : (*itr)->getMeshElement(0)->getNumVolumeVertices(); + break; + } + } + for (GModel::fiter itf = gm->firstFace(); itf != gm->lastFace(); ++itf) { + printf("%d\n",(*itf)->getNumMeshElements()); + if ((*itf)->getNumMeshElements()){ + if (meshOrder == -1) { + meshOrder = (*itf)->getMeshElement(0)->getPolynomialOrder(); + complete = (meshOrder <= 2) ? 1 : (*itf)->getMeshElement(0)->getNumFaceVertices(); + if ((*itf)->geomType() == GEntity::DiscreteSurface)CAD = false; + printf("%d %d %d\n",meshOrder,complete, CAD); + break; + } + } + } +} + static void highordertools_runelas_cb(Fl_Widget *w, void *data) { @@ -141,9 +185,10 @@ static void highordertools_runelas_cb(Fl_Widget *w, void *data) p.weightFixed = o->value[5]->value(); p.weightFree = o->value[6]->value(); p.DistanceFactor = o->value[7]->value(); - p.method = (int)o->choice[0]->value(); + p.method = o->CAD ? (int)o->choice[0]->value() : 2; p.filter = (int)o->choice[1]->value(); HighOrderMeshOptimizer (GModel::current(),p); + printf("CPU TIME = %4f seconds\n",p.CPU); } @@ -180,6 +225,13 @@ highOrderToolsWindow::highOrderToolsWindow(int deltaFontSize) int y = WB; int x = 2*WB; + output[0] = new Fl_Output + (x,y, IW, BH, "CAD MODEL"); + output[0]->align(FL_ALIGN_RIGHT); + output[0]->value("AVAILABLE"); + + y += BH; + butt[1] = new Fl_Check_Button (x,y, IW, BH, "Apply to visible entities only"); butt[1]->type(FL_TOGGLE_BUTTON); @@ -207,14 +259,15 @@ highOrderToolsWindow::highOrderToolsWindow(int deltaFontSize) value[0]->maximum(10); value[0]->step(1); value[0]->align(FL_ALIGN_RIGHT); - value[0]->value(1); + value[0]->value(meshOrder); y += BH; butt[0] = new Fl_Check_Button (x,y, IW, BH, "Use Incomplete Elements"); butt[0]->type(FL_TOGGLE_BUTTON); - butt[0]->value(0); + butt[0]->value(!complete); + butt[0]->callback(change_completeness_cb); y += BH; @@ -313,7 +366,7 @@ highOrderToolsWindow::highOrderToolsWindow(int deltaFontSize) }; - static Fl_Menu_Item menu_filter[] = { + static Fl_Menu_Item menu_strategy[] = { {"GLOBAL", 0, 0, 0}, {"BLOBS ", 0, 0, 0}, {0} @@ -328,8 +381,8 @@ highOrderToolsWindow::highOrderToolsWindow(int deltaFontSize) y += BH; choice[1] = new Fl_Choice - (x,y, IW, BH, "Filter"); - choice[1]->menu(menu_filter); + (x,y, IW, BH, "Strategy"); + choice[1]->menu(menu_strategy); choice[1]->align(FL_ALIGN_RIGHT); @@ -382,10 +435,17 @@ highOrderToolsWindow::highOrderToolsWindow(int deltaFontSize) void highOrderToolsWindow::show(bool redrawOnly) { + getMeshInfo (GModel::current(),meshOrder,complete, CAD); + if(win->shown() && redrawOnly) win->redraw(); - else + else { + value[0]->value(meshOrder); + butt[0]->value(!complete); + if (CAD)output[0]->value("AVAILABLE"); + else output[0]->value("NOT AVAILABLE"); win->show(); + } } void highordertools_cb(Fl_Widget *w, void *data) { diff --git a/Fltk/highOrderToolsWindow.h b/Fltk/highOrderToolsWindow.h index 9a1506dd107269060e9a3c925f367a457b866b79..43862d8daa1c4ff2769d8f59ff4648c8de5ca54c 100644 --- a/Fltk/highOrderToolsWindow.h +++ b/Fltk/highOrderToolsWindow.h @@ -13,15 +13,19 @@ #include <FL/Fl_Button.H> #include <FL/Fl_Check_Button.H> #include <FL/Fl_Input.H> +#include <FL/Fl_Output.H> #include "GmshConfig.h" class highOrderToolsWindow{ public: + bool CAD, complete; + int meshOrder; Fl_Window *win; Fl_Check_Button *butt[20]; Fl_Value_Input *value[20]; Fl_Choice *choice[20]; Fl_Button *push[20]; + Fl_Output *output[20]; public: highOrderToolsWindow(int deltaFontSize=0); void show(bool redrawOnly); diff --git a/Mesh/Field.cpp b/Mesh/Field.cpp index addd52d47e0ff9922afe0c38043ee81f511ec5ee..f7c1cec6d4722fa2d1e99911c0150c802e1cda58 100644 --- a/Mesh/Field.cpp +++ b/Mesh/Field.cpp @@ -1961,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,3000)); + _att_fields.push_back(new AttractorField(1,*it,100000)); } for(std::list<int>::iterator it = faces_id.begin(); it != faces_id.end(); ++it) { diff --git a/Mesh/HighOrder.cpp b/Mesh/HighOrder.cpp index fc188427649d5a8f48e8e0fa1bdc710686f6aaeb..43b1f16f2dd34140a3f718cecd1752e6de866ef2 100644 --- a/Mesh/HighOrder.cpp +++ b/Mesh/HighOrder.cpp @@ -1374,3 +1374,97 @@ void computeDistanceFromMeshToGeometry (GModel *m, distanceFromMeshToGeometry_t } } + + +void SetHighOrderComplete (GModel *m, bool onlyVisible){ + faceContainer faceVertices; + for(GModel::fiter it = m->firstFace(); it != m->lastFace(); ++it) { + if (onlyVisible && !(*it)->getVisibility())continue; + std::vector<MTriangle*> newT; + std::vector<MQuadrangle*> newQ; + for (int i=0;i<(*it)->triangles.size();i++){ + MTriangle *t = (*it)->triangles[i]; + std::vector<MVertex*> vf, vt; + int nPts = t->getPolynomialOrder() - 1; + MTriangle TEMP (t->getVertex(0), t->getVertex(1), t->getVertex(2)); + getFaceVertices (*it, t, t, vf, faceVertices, false, nPts); + for (int j=3;j<t->getNumVertices();j++)vt.push_back(t->getVertex(j)); + vt.insert(vt.end(), vf.begin(), vf.end()); + MTriangleN *newTr = new MTriangleN(t->getVertex(0), t->getVertex(1), t->getVertex(2), + vt, nPts + 1); + newT.push_back(newTr); + + delete t; + } + (*it)->triangles = newT; + + for (int i=0;i<(*it)->quadrangles.size();i++){ + MQuadrangle *t = (*it)->quadrangles[i]; + std::vector<MVertex*> vf, vt; + int nPts = t->getPolynomialOrder() - 1; + MQuadrangle TEMP (t->getVertex(0), t->getVertex(1), t->getVertex(2), t->getVertex(3)); + getFaceVertices (*it, t, &TEMP, vf, faceVertices, false, nPts); + for (int j=4;j<t->getNumVertices();j++)vt.push_back(t->getVertex(j)); + vt.insert(vt.end(), vf.begin(), vf.end()); + newQ.push_back(new MQuadrangleN(t->getVertex(0), t->getVertex(1), t->getVertex(2), t->getVertex(3), + vt, nPts + 1)); + + delete t; + } + (*it)->quadrangles = newQ; + + + std::set<MVertex*> newV; + for (int i=0;i<(*it)->getNumMeshElements();++i){ + MElement *e = (*it)->getMeshElement(i); + for (int j=0;j<e->getNumVertices();j++)newV.insert(e->getVertex(j)); + } + (*it)->mesh_vertices.clear(); + (*it)->mesh_vertices.insert((*it)->mesh_vertices.begin(), newV.begin(), newV.end()); + + + } +} + + +void SetHighOrderInComplete (GModel *m, bool onlyVisible){ + std::set<MVertex*> toDelete; + for(GModel::fiter it = m->firstFace(); it != m->lastFace(); ++it) { + if (onlyVisible && !(*it)->getVisibility())continue; + std::vector<MTriangle*> newT; + std::vector<MQuadrangle*> newQ; + for (int i=0;i<(*it)->triangles.size();i++){ + MTriangle *t = (*it)->triangles[i]; + std::vector<MVertex*> vt; + int order = t->getPolynomialOrder(); + for (int j=3;j<t->getNumVertices()-t->getNumFaceVertices();j++)vt.push_back(t->getVertex(j)); + for (int j=t->getNumVertices()-t->getNumFaceVertices();j<t->getNumVertices();j++)toDelete.insert(t->getVertex(j)); + newT.push_back(new MTriangleN(t->getVertex(0), t->getVertex(1), t->getVertex(2), + vt, order)); + + delete t; + } + (*it)->triangles = newT; + + for (int i=0;i<(*it)->quadrangles.size();i++){ + MQuadrangle *t = (*it)->quadrangles[i]; + std::vector<MVertex*> vt; + int nPts = t->getPolynomialOrder() - 1; + for (int j=4;j<t->getNumVertices()-t->getNumFaceVertices();j++)vt.push_back(t->getVertex(j)); + newQ.push_back(new MQuadrangleN(t->getVertex(0), t->getVertex(1), t->getVertex(2), t->getVertex(3), + vt, nPts + 1)); + delete t; + } + (*it)->quadrangles = newQ; + std::vector<MVertex*> newV; + for (int i=0;i<(*it)->mesh_vertices.size();++i){ + if (toDelete.find((*it)->mesh_vertices[i]) == toDelete.end()) + newV.push_back((*it)->mesh_vertices[i]); + else + delete (*it)->mesh_vertices[i]; + } + (*it)->mesh_vertices = newV; + } + +} + diff --git a/Mesh/HighOrder.h b/Mesh/HighOrder.h index f8f5090f0f4f0d8532267aa95e0d71625a9ff067..49be09e410236f4d40eab5a08c280b340f05d402 100644 --- a/Mesh/HighOrder.h +++ b/Mesh/HighOrder.h @@ -22,6 +22,8 @@ typedef std::map<MFace, std::vector<MVertex*>, Less_Face> faceContainer; void SetOrder1(GModel *m, bool onlyVisible = false); void SetOrderN(GModel *m, int order, bool linear=true, bool incomplete=false, bool onlyVisible = false); void ElasticAnalogy ( GModel *m, double threshold, bool onlyVisible); +void SetHighOrderComplete (GModel *m, bool onlyVisible); // generate complete elements +void SetHighOrderInComplete (GModel *m, bool onlyVisible); // generate in-complete elements MTriangle* setHighOrder(MTriangle *t, GFace *gf, edgeContainer &edgeVertices, faceContainer &faceVertices, diff --git a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp index 022e1b00d7d008d4ad4c37386a23771ed241cc24..af13664aa191bd585d37ecf239675e6e27ee2f62 100644 --- a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp +++ b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp @@ -424,6 +424,9 @@ static std::vector<std::set<MElement*> > splitConnex(const std::set<MElement*> & void HighOrderMeshOptimizer (GModel *gm, OptHomParameters &p) { + + clock_t t1 = clock(); + int samples = 20; // int method = Mesh::METHOD_RELAXBND | Mesh::METHOD_PHYSCOORD | Mesh::METHOD_PROJJAC; @@ -437,7 +440,7 @@ void HighOrderMeshOptimizer (GModel *gm, OptHomParameters &p) else if (p.method == 2) method = Mesh::METHOD_FIXBND | Mesh::METHOD_PHYSCOORD | Mesh::METHOD_PROJJAC; - printf("p.method = %d\n",p.method); + // printf("p.method = %d\n",p.method); // int method = Mesh::METHOD_SURFCOORD | Mesh::METHOD_PROJJAC; // int method = Mesh::METHOD_RELAXBND | Mesh::METHOD_SURFCOORD | Mesh::METHOD_PROJJAC; @@ -513,4 +516,6 @@ void HighOrderMeshOptimizer (GModel *gm, OptHomParameters &p) // temp->mesh.writeMSH("final.msh"); } } + clock_t t2 = clock(); + p.CPU = (double)(t2-t2)/CLOCKS_PER_SEC; } diff --git a/contrib/HighOrderMeshOptimizer/OptHomRun.h b/contrib/HighOrderMeshOptimizer/OptHomRun.h index 83e3107bde73ba9f7b943d046433f0396c6fbbce..feac05b006f3b45f0ecac6ad5d0595748b926c85 100644 --- a/contrib/HighOrderMeshOptimizer/OptHomRun.h +++ b/contrib/HighOrderMeshOptimizer/OptHomRun.h @@ -21,7 +21,7 @@ struct OptHomParameters { // OUTPUT ------> int SUCCESS ; // 0 --> success , 1 --> Not converged double minJac, maxJac; // after optimization, range of jacobians - double DT; // Time for optimization + double CPU; // Time for optimization OptHomParameters () // default values