Skip to content
Snippets Groups Projects
Commit e736aaac authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

switch plugin to in-house Delaunay (still slower, but we'll improve)

parent 9d6e3f39
No related branches found
No related tags found
No related merge requests found
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
#include "GmshMessage.h" #include "GmshMessage.h"
#include "Tetrahedralize.h" #include "Tetrahedralize.h"
#if defined(HAVE_TETGEN) #if defined(HAVE_MESH)
#include "tetgen.h" #include "meshGRegionDelaunayInsertion.h"
#endif #endif
StringXNumber TetrahedralizeOptions_Number[] = { StringXNumber TetrahedralizeOptions_Number[] = {
...@@ -45,13 +45,12 @@ StringXNumber *GMSH_TetrahedralizePlugin::getOption(int iopt) ...@@ -45,13 +45,12 @@ StringXNumber *GMSH_TetrahedralizePlugin::getOption(int iopt)
class PointData { class PointData {
public: public:
std::vector<double> v; MVertex *v;
std::vector<double> val;
PointData(double x, double y, double z, int numVal) PointData(double x, double y, double z, int numVal)
{ {
v.resize(3 + numVal); v = new MVertex(x, y, z);
v[0] = x; val.resize(numVal);
v[1] = y;
v[2] = z;
} }
}; };
...@@ -81,7 +80,7 @@ PView *GMSH_TetrahedralizePlugin::execute(PView *v) ...@@ -81,7 +80,7 @@ PView *GMSH_TetrahedralizePlugin::execute(PView *v)
PointData p(x, y, z, numComp * numSteps); PointData p(x, y, z, numComp * numSteps);
for(int step = 0; step < numSteps; step++) for(int step = 0; step < numSteps; step++)
for(int comp = 0; comp < numComp; comp++) for(int comp = 0; comp < numComp; comp++)
data1->getValue(step, ent, ele, 0, comp, p.v[3 + numComp * step + comp]); data1->getValue(step, ent, ele, 0, comp, p.val[numComp * step + comp]);
points.push_back(p); points.push_back(p);
} }
} }
...@@ -91,76 +90,80 @@ PView *GMSH_TetrahedralizePlugin::execute(PView *v) ...@@ -91,76 +90,80 @@ PView *GMSH_TetrahedralizePlugin::execute(PView *v)
return v1; return v1;
} }
#if !defined(HAVE_TETGEN) #if !defined(HAVE_MESH)
Msg::Error("Gmsh has to be compiled with Tetgen support to run " Msg::Error("Gmsh has to be compiled with Mesh support to run "
"Plugin(Tetrahedralize)"); "Plugin(Tetrahedralize)");
return v1; return v1;
#else #else
// fill tetgen structure std::vector<MVertex*> vertices(points.size());
tetgenio in, out;
in.mesh_dim = 3;
in.numberofpoints = points.size();
in.pointlist = new REAL[in.numberofpoints * 3];
for(unsigned int i = 0; i < points.size(); i++){ for(unsigned int i = 0; i < points.size(); i++){
in.pointlist[i * 3 + 0] = points[i].v[0]; MVertex *v = points[i].v;
in.pointlist[i * 3 + 1] = points[i].v[1]; v->setIndex(i);
in.pointlist[i * 3 + 2] = points[i].v[2]; vertices[i] = v;
}
try{
tetrahedralize((char*)"Q", &in, &out);
}
catch (int error){
Msg::Error("Could not tetrahedralize points");
return v1;
}
if(out.numberofpoints != (int)points.size()){
Msg::Error("Tetrahedralization added points (%d -> %d): aborting",
points.size(), out.numberofpoints);
return v1;
} }
std::vector<MTetrahedron*> tets;
delaunayMeshIn3D(vertices, tets);
// create output // create output
PView *v2 = new PView(); PView *v2 = new PView();
PViewDataList *data2 = getDataList(v2); PViewDataList *data2 = getDataList(v2);
for(int i = 0; i < out.numberoftetrahedra; i++){ for(unsigned int i = 0; i < tets.size(); i++){
PointData *p[4]; MTetrahedron *t = tets[i];
p[0] = &points[out.tetrahedronlist[i * 4 + 0]]; int i0 = t->getVertex(0)->getIndex();
p[1] = &points[out.tetrahedronlist[i * 4 + 1]]; int i1 = t->getVertex(1)->getIndex();
p[2] = &points[out.tetrahedronlist[i * 4 + 2]]; int i2 = t->getVertex(2)->getIndex();
p[3] = &points[out.tetrahedronlist[i * 4 + 3]]; int i3 = t->getVertex(3)->getIndex();
int n = points.size();
if(i0 < 0 || i0 >= n || i1 < 0 || i1 >= n ||
i2 < 0 || i2 >= n || i3 < 0 || i3 >= n){
Msg::Warning("Bad vertex in tetrahedralization");
continue;
}
PointData *p[4] = {&points[i0], &points[i1],
&points[i2], &points[i3]};
int numComp = 0; int numComp = 0;
std::vector<double> *vec = 0; std::vector<double> *vec = 0;
if((int)p[0]->v.size() == 3 + 9 * numSteps && if((int)p[0]->val.size() == 9 * numSteps &&
(int)p[1]->v.size() == 3 + 9 * numSteps && (int)p[1]->val.size() == 9 * numSteps &&
(int)p[2]->v.size() == 3 + 9 * numSteps && (int)p[2]->val.size() == 9 * numSteps &&
(int)p[3]->v.size() == 3 + 9 * numSteps){ (int)p[3]->val.size() == 9 * numSteps){
numComp = 9; data2->NbTS++; vec = &data2->TS; numComp = 9; data2->NbTS++; vec = &data2->TS;
} }
else if((int)p[0]->v.size() == 3 + 3 * numSteps && else if((int)p[0]->val.size() == 3 * numSteps &&
(int)p[1]->v.size() == 3 + 3 * numSteps && (int)p[1]->val.size() == 3 * numSteps &&
(int)p[2]->v.size() == 3 + 3 * numSteps && (int)p[2]->val.size() == 3 * numSteps &&
(int)p[2]->v.size() == 3 + 3 * numSteps){ (int)p[3]->val.size() == 3 * numSteps){
numComp = 3; data2->NbVS++; vec = &data2->VS; numComp = 3; data2->NbVS++; vec = &data2->VS;
} }
else{ else if((int)p[0]->val.size() == numSteps &&
(int)p[1]->val.size() == numSteps &&
(int)p[2]->val.size() == numSteps &&
(int)p[3]->val.size() == numSteps){
numComp = 1; data2->NbSS++; vec = &data2->SS; numComp = 1; data2->NbSS++; vec = &data2->SS;
} }
for(int nod = 0; nod < 4; nod++) vec->push_back(p[nod]->v[0]); else{
for(int nod = 0; nod < 4; nod++) vec->push_back(p[nod]->v[1]); Msg::Warning("Bad data in tetrahedralization");
for(int nod = 0; nod < 4; nod++) vec->push_back(p[nod]->v[2]); continue;
}
for(int nod = 0; nod < 4; nod++) vec->push_back(p[nod]->v->x());
for(int nod = 0; nod < 4; nod++) vec->push_back(p[nod]->v->y());
for(int nod = 0; nod < 4; nod++) vec->push_back(p[nod]->v->z());
for(int step = 0; step < numSteps; step++) for(int step = 0; step < numSteps; step++)
for(int nod = 0; nod < 4; nod++) for(int nod = 0; nod < 4; nod++)
for(int comp = 0; comp < numComp; comp++) for(int comp = 0; comp < numComp; comp++)
vec->push_back(p[nod]->v[3 + numComp * step + comp]); vec->push_back(p[nod]->val[numComp * step + comp]);
} }
for(unsigned int i = 0; i < tets.size(); i++)
delete tets[i];
for(unsigned int i = 0; i < vertices.size(); i++)
delete vertices[i];
for(int i = 0; i < data1->getNumTimeSteps(); i++) for(int i = 0; i < data1->getNumTimeSteps(); i++)
data2->Time.push_back(data1->getTime(i)); data2->Time.push_back(data1->getTime(i));
data2->setName(data1->getName() + "_Tetrahedralize"); data2->setName(data1->getName() + "_Tetrahedralize");
data2->setFileName(data1->getName() + "_Tetrahedralize.pos"); data2->setFileName(data1->getName() + "_Tetrahedralize.pos");
data2->finalize(); data2->finalize();
return v2; return v2;
#endif #endif
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment