Skip to content
Snippets Groups Projects
Commit 7e43711f authored by Jean-François Remacle's avatar Jean-François Remacle
Browse files

High order tools enhanced ...

parent 22656201
No related branches found
No related tags found
No related merge requests found
......@@ -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)
{
......
......@@ -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);
......
......@@ -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) {
......
......@@ -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;
}
}
......@@ -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,
......
......@@ -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;
}
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment