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

We can now use Netgen's optimization pass on our own Delaunay meshes. It seems
to work pretty well on small examples, but it definitely requires more
testing :-)
parent 2d8e25a9
Branches
Tags
No related merge requests found
// $Id: 3D_Mesh_Netgen.cpp,v 1.6 2004-06-28 20:36:14 geuzaine Exp $ // $Id: 3D_Mesh_Netgen.cpp,v 1.7 2004-06-30 07:27:19 geuzaine Exp $
// //
// Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
// //
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "Gmsh.h" #include "Gmsh.h"
#include "Mesh.h" #include "Mesh.h"
#include "Create.h"
#include "Numeric.h" #include "Numeric.h"
#include "Context.h" #include "Context.h"
...@@ -52,7 +53,7 @@ void Optimize_Netgen(Volume * v) ...@@ -52,7 +53,7 @@ void Optimize_Netgen(Volume * v)
class Netgen{ class Netgen{
private: private:
List_T *_vertices; List_T *_vertices, *_volverts;
Volume *_vol; Volume *_vol;
Ng_Mesh *_ngmesh; Ng_Mesh *_ngmesh;
public: public:
...@@ -60,22 +61,19 @@ class Netgen{ ...@@ -60,22 +61,19 @@ class Netgen{
Netgen(Surface *s, int importSurfaceMesh = 0); Netgen(Surface *s, int importSurfaceMesh = 0);
~Netgen(); ~Netgen();
void MeshVolume(); void MeshVolume();
void TransferVolumeMesh();
void OptimizeVolume(); void OptimizeVolume();
}; };
Netgen::Netgen(Volume *vol, int importVolumeMesh) Netgen::Netgen(Volume *vol, int importVolumeMesh)
: _vol(vol) : _volverts(0), _vol(vol)
{ {
// creates Netgen mesh structure // creates Netgen mesh structure
Ng_Init(); Ng_Init();
_ngmesh = Ng_NewMesh(); _ngmesh = Ng_NewMesh();
if(importVolumeMesh){ // Get all surface vertices (the same vertex can belong to several
_vertices = Tree2List(_vol->Vertices); // surfaces...)
}
else{
// Transfer all surface vertices we must *not* add 2 times the
// same vertex (the same vertex can belong to several surfaces)
Tree_T *tree = Tree_Create(sizeof(Vertex*), compareVertex); Tree_T *tree = Tree_Create(sizeof(Vertex*), compareVertex);
for(int i = 0; i < List_Nbr(_vol->Surfaces); i++) { for(int i = 0; i < List_Nbr(_vol->Surfaces); i++) {
Surface *s; Surface *s;
...@@ -83,9 +81,17 @@ Netgen::Netgen(Volume *vol, int importVolumeMesh) ...@@ -83,9 +81,17 @@ Netgen::Netgen(Volume *vol, int importVolumeMesh)
Tree_Unit(tree, s->Vertices); Tree_Unit(tree, s->Vertices);
} }
_vertices = Tree2List(tree); _vertices = Tree2List(tree);
}
List_Sort(_vertices, compareVertex); List_Sort(_vertices, compareVertex);
if(importVolumeMesh){
Tree_T *tree2 = Tree_Soustraction(_vol->Vertices, tree);
_volverts = Tree2List(tree2);
List_Sort(_volverts, compareVertex);
Tree_Delete(tree2);
}
Tree_Delete(tree);
// Transfer the vertices // Transfer the vertices
for(int i = 0; i < List_Nbr(_vertices); i++){ for(int i = 0; i < List_Nbr(_vertices); i++){
Vertex *v; Vertex *v;
...@@ -96,6 +102,15 @@ Netgen::Netgen(Volume *vol, int importVolumeMesh) ...@@ -96,6 +102,15 @@ Netgen::Netgen(Volume *vol, int importVolumeMesh)
tmp[2] = v->Pos.Z; tmp[2] = v->Pos.Z;
Ng_AddPoint(_ngmesh, tmp); Ng_AddPoint(_ngmesh, tmp);
} }
for(int i = 0; i < List_Nbr(_volverts); i++){
Vertex *v;
List_Read(_volverts, i, &v);
double tmp[3];
tmp[0] = v->Pos.X;
tmp[1] = v->Pos.Y;
tmp[2] = v->Pos.Z;
Ng_AddPoint(_ngmesh, tmp);
}
// Transfert all surface simplices // Transfert all surface simplices
for(int i = 0; i < List_Nbr(_vol->Surfaces); i++) { for(int i = 0; i < List_Nbr(_vol->Surfaces); i++) {
...@@ -132,11 +147,21 @@ Netgen::Netgen(Volume *vol, int importVolumeMesh) ...@@ -132,11 +147,21 @@ Netgen::Netgen(Volume *vol, int importVolumeMesh)
for(int i = 0; i < List_Nbr(simplist); i++) { for(int i = 0; i < List_Nbr(simplist); i++) {
Simplex *simp; Simplex *simp;
List_Read(simplist, i, &simp); List_Read(simplist, i, &simp);
if(simp->Volume_Simplexe() > 0) { // FIXME: check this!
Vertex *temp = simp->V[0];
simp->V[0] = simp->V[1];
simp->V[1] = temp;
}
int tmp[4]; int tmp[4];
tmp[0] = 1 + List_ISearch(_vertices, &simp->V[0], compareVertex); tmp[0] = 1 + List_ISearch(_vertices, &simp->V[0], compareVertex);
tmp[1] = 1 + List_ISearch(_vertices, &simp->V[1], compareVertex); tmp[1] = 1 + List_ISearch(_vertices, &simp->V[1], compareVertex);
tmp[2] = 1 + List_ISearch(_vertices, &simp->V[2], compareVertex); tmp[2] = 1 + List_ISearch(_vertices, &simp->V[2], compareVertex);
tmp[3] = 1 + List_ISearch(_vertices, &simp->V[3], compareVertex); tmp[3] = 1 + List_ISearch(_vertices, &simp->V[3], compareVertex);
int n = List_Nbr(_vertices) + 1;
if(!tmp[0]) tmp[0] = n + List_ISearch(_volverts, &simp->V[0], compareVertex);
if(!tmp[1]) tmp[1] = n + List_ISearch(_volverts, &simp->V[1], compareVertex);
if(!tmp[2]) tmp[2] = n + List_ISearch(_volverts, &simp->V[2], compareVertex);
if(!tmp[3]) tmp[3] = n + List_ISearch(_volverts, &simp->V[3], compareVertex);
Ng_AddVolumeElement(_ngmesh, NG_TET, tmp); Ng_AddVolumeElement(_ngmesh, NG_TET, tmp);
} }
List_Delete(simplist); List_Delete(simplist);
...@@ -151,6 +176,7 @@ Netgen::Netgen(Surface *sur, int importSurfaceMesh) ...@@ -151,6 +176,7 @@ Netgen::Netgen(Surface *sur, int importSurfaceMesh)
Netgen::~Netgen() Netgen::~Netgen()
{ {
List_Delete(_vertices); List_Delete(_vertices);
List_Delete(_volverts);
Ng_DeleteMesh(_ngmesh); Ng_DeleteMesh(_ngmesh);
Ng_Exit(); Ng_Exit();
} }
...@@ -162,12 +188,15 @@ void Netgen::MeshVolume() ...@@ -162,12 +188,15 @@ void Netgen::MeshVolume()
mp.fineness = 1; mp.fineness = 1;
mp.secondorder = 0; mp.secondorder = 0;
Ng_GenerateVolumeMesh(_ngmesh, &mp); Ng_GenerateVolumeMesh(_ngmesh, &mp);
}
void Netgen::TransferVolumeMesh()
{
// Gets total number of vertices of Netgen's mesh // Gets total number of vertices of Netgen's mesh
int nbv = Ng_GetNP(_ngmesh); int nbv = Ng_GetNP(_ngmesh);
Vertex **vtable = (Vertex **)Malloc(nbv * sizeof(Vertex*)); Vertex **vtable = (Vertex **)Malloc(nbv * sizeof(Vertex*));
// Get existing vertices // Get existing unmodified surface vertices
for(int i = 0; i < List_Nbr(_vertices); i++){ for(int i = 0; i < List_Nbr(_vertices); i++){
List_Read(_vertices, i, &vtable[i]); List_Read(_vertices, i, &vtable[i]);
Tree_Insert(_vol->Vertices, &vtable[i]); Tree_Insert(_vol->Vertices, &vtable[i]);
...@@ -199,17 +228,32 @@ void Netgen::MeshVolume() ...@@ -199,17 +228,32 @@ void Netgen::MeshVolume()
Free(vtable); Free(vtable);
} }
static void suppressSimplex(void *a, void *b)
{
Tree_Suppress(THEM->Simplexes, a);
}
void Netgen::OptimizeVolume() void Netgen::OptimizeVolume()
{ {
Ng_Meshing_Parameters mp; Ng_Meshing_Parameters mp;
mp.maxh = 1; mp.maxh = 1;
mp.fineness = 1; mp.fineness = 1;
mp.secondorder = 0; mp.secondorder = 0;
// remove the pure volume vertices from THEM->Vertices and v->Vertices
// remove the tets from THEM->Simplexes // remove the pure volume vertices from the mesh
// reset v->Simplexes for(int i = 0; i < List_Nbr(_volverts); i++){
Vertex *v;
List_Read(_volverts, i, &v);
Tree_Suppress(_vol->Vertices, &v);
Tree_Suppress(THEM->Vertices, &v);
}
// remove the tets
Tree_Action(_vol->Simplexes, suppressSimplex);
Tree_Action(_vol->Simplexes, Free_Simplex);
Tree_Delete(_vol->Simplexes);
_vol->Simplexes = Tree_Create(sizeof(Simplex*), compareQuality);
NgAddOn_OptimizeVolumeMesh(_ngmesh, &mp); NgAddOn_OptimizeVolumeMesh(_ngmesh, &mp);
// transfer vertices and tets back into v and THEM
} }
int Mesh_Netgen(Volume * v) int Mesh_Netgen(Volume * v)
...@@ -225,6 +269,7 @@ int Mesh_Netgen(Volume * v) ...@@ -225,6 +269,7 @@ int Mesh_Netgen(Volume * v)
Msg(STATUS3, "Meshing volume %d", v->Num); Msg(STATUS3, "Meshing volume %d", v->Num);
Netgen ng(v); Netgen ng(v);
ng.MeshVolume(); ng.MeshVolume();
ng.TransferVolumeMesh();
return 1; return 1;
} }
...@@ -234,6 +279,7 @@ void Optimize_Netgen(Volume * v) ...@@ -234,6 +279,7 @@ void Optimize_Netgen(Volume * v)
Msg(STATUS3, "Optimizing volume %d", v->Num); Msg(STATUS3, "Optimizing volume %d", v->Num);
Netgen ng(v, 1); Netgen ng(v, 1);
ng.OptimizeVolume(); ng.OptimizeVolume();
ng.TransferVolumeMesh();
} }
#endif // !HAVE_NETGEN #endif // !HAVE_NETGEN
// $Id: Generator.cpp,v 1.57 2004-06-29 04:31:50 geuzaine Exp $ // $Id: Generator.cpp,v 1.58 2004-06-30 07:27:20 geuzaine Exp $
// //
// Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
// //
...@@ -250,11 +250,6 @@ void TransferData(void *a, void *b) ...@@ -250,11 +250,6 @@ void TransferData(void *a, void *b)
{ {
Simplex *s = *(Simplex**)a; Simplex *s = *(Simplex**)a;
if(s->iEnt == IVOL->Num){ if(s->iEnt == IVOL->Num){
if(s->Volume_Simplexe() < 0) {
Vertex *temp = s->V[0];
s->V[0] = s->V[1];
s->V[1] = temp;
}
Tree_Add(IVOL->Simplexes, &s); Tree_Add(IVOL->Simplexes, &s);
for(int i = 0; i < 4; i++) for(int i = 0; i < 4; i++)
Tree_Insert(IVOL->Vertices, &s->V[i]); Tree_Insert(IVOL->Vertices, &s->V[i]);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment