← Back to team overview

dolfin team mailing list archive

Re: TriTetMesh 0.1

 

On Fri, Mar 14, 2008 at 08:29:05AM +0100, Johan Hake wrote:
> On Friday 14 March 2008 01:37:37 Bartosz Sawicki wrote:
> > > On Thursday 13 March 2008 21:26:38 Anders Logg wrote:
> > >> On Thu, Feb 28, 2008 at 03:08:25PM +0100, Johan Hake wrote:
> > >>> Dear all!
> > >>>
> > >>> I hearby present version 0.1 of TriTetMesh. It is a c++/python wrapper
> > >>> of the high quality mesh generators: Tetgen and Triangle.
> > >>>
> > >>> The output format is dolfin mesh, and dolfin meshfunctions for markers.
> > >>> It is also possible to output the native Tetgen and Triangle formats.
> > >>>
> > >>> For now the code resides in a tarball:
> > >>>
> > >>> <http://folk.uio.no/hake/tritetmesh/tritetmesh.tar.gz>
> > >>>
> > >>> I have not checked if it builds on mac, but it should build on
> > >>> Linux/Ubuntu. You will then need swig, python, python-dev,
> > >>> python-numpy, python-numpy-dev and scons. (I think this is all...)
> > >>>
> > >>> The documentation is sparse but have a look at the provided demos. It
> > >>> can be usefull to look at the docstrings for the python functions too.
> > >>> As TriTetMesh is a more or less complete wrapper of Triangle and Tetgen
> > >>> it is instructive to have a look at their webpages for clues.
> > >>>
> > >>> Tetgen <http://tetgen.berlios.de>
> > >>> Triangle <http://www.cs.cmu.edu/~quake/triangle.html>
> > >>>
> > >>> Please have a try!
> > >>>
> > >>> Send me an email if you encounter problems. Such discussions should
> > >>> probably stay of this list ;)
> > >>>
> > >>> Cheers
> > >>>
> > >>> Johan
> > >>
> > >> Looks very nice!
> > >>
> > >> I've also looked a bit a Netgen as an alternative to Tetgen and it
> > >> seems to have a simple interface that might be simpler to wrap than
> > >> Tetgen. Netgen can also save directly to DOLFIN XML (patch from
> > >> Kent-Andre that is in Netgen CVS).
> > >
> > > I have had a brief look at. It looks like it is much more complex than
> > > tetgen and triangle. Triangle is two files, and tetgen three and the
> > > interface is well documented.
> > >
> > > Netgen is at least... well, many files. I think it will take some digging
> > > to get hte hang of the programing interface to the library.
> > >
> > > As I understand it, netgen can only save dolfin mesh, not MeshFunction
> > > with markers, right?
> >
> > Netgen is much more advanced mesh generator, so it is not suprising that
> >   the code is more complicated. I've use Netgen, Triangle and Tetgen for
> > years, and my experience showed that Netgen is the leader.
> >
> > Triangle and Tetgen are also powerful, but their main advantage is
> > simple API. You can easily embed it in other applications. Just like it
> > is in TriTetMesh.
> >
> > I'm sure that Netgen is supporting subdomains markers. Even if current
> > export into DOLFIN XML this informations is lost, this can be improved.
> >
> > >> Netgen uses input files like these:
> > >>
> > >> # a cube
> > >> solid cube = plane (0, 0, 0; 0, 0, -1)
> > >>          and plane (0, 0, 0; 0, -1, 0)
> > >>          and plane (0, 0, 0; -1, 0, 0)
> > >>          and plane (1, 1, 1; 0, 0, 1)
> > >>          and plane (1, 1, 1; 0, 1, 0)
> > >>          and plane (1, 1, 1; 1, 0, 0);
> > >>
> > >> # two shperes
> > >> solid sph1 = sphere (0.5, 0.5, 0.5; 0.58);
> > >> solid sph2 = sphere (0.5, 0.5, 0.5; 0.75);
> > >>
> > >> # cut cube with inner and outer sphere
> > >> solid main = cube and sph2 and not sph1;
> > >>
> > >> This would be *very* easy to wrap in DOLFIN so one could do things
> > >> like
> > >>
> > >>   s1 = Sphere(...)
> > >>   s2 = Sphere(...)
> > >>   c  = Cube(...)
> > >>
> > >>   mesh = Mesh(c + s2 - s1)
> > >
> > > It looks very nice. It could be cool to get it integrated in to a python
> > > environment. But it wont be done over night...
> > >
> > >> Perhaps this could be done also with Tetgen/Triangle?
> > >
> > > Not straight of. Tetgen uses what they call piecwise linear complexes
> > > (PLC), to define some surface geometry. A PLC can be any polygon in a
> > > plane, so this rules out a strict circular geometry. But it quite easy to
> > > defin circular geometries that is defined by these PLCs in python.
> > >
> > > The Eularian operations, i.e., union, intersection and complement need
> > > it's own geometrical logic, which is not supported in tetgen or triangle.
> > > One could hypotesize that this could be added as a layer on top of
> > > triangle or tetgen.
> >
> > There are two main methods to describe geometry of the model - boundary
> > representation (BR) and constructive solid geometry (CSG).
> >
> > The first use definition of boundary - described by some analitical
> > functions (planes, splines, nurbs) or using set of triangles
> > (3d)/edges(2d) (PLC, STL).
> > http://en.wikipedia.org/wiki/Boundary_representation
> >
> > The second method is called Constructive Solid Geometry. Where
> > primitives such as cubes, spheres are logically combined into more
> > complicated objects.
> > http://en.wikipedia.org/wiki/Constructive_solid_geometry
> >
> > The CSG is very useful for prototyping. You can quickly build geometry,
> > smoothly control mesh quality, and solve some PDE.
> > However, in real problems, more often BR are used. The CAD software
> > generates STL files, which are just a set of triangles on boudary. If
> > you use 3D scanners they also produce BR.
> >
> > Netgen can use both of this methods, CSG and BR. Tetgen/Triangle works
> > only with BR. Thats the big difference.
> 
> Thanks for the nice overview!
> 
> > In my opinion Netgen would be the best canditate for mesh generator for
> > Fenics, but ... it has poor API :(. Netgen was design as a GUI
> > application and the most of its features needs to be clicked.
> 
> I see that one large part of Netgen is gui related, but what I and probably 
> Anders had in mind was not to wrap this part, but rather the interface to the 
> CSG file parser, and potentially also to the BR parser. You could then 
> hopefully just skip the gui related commands.
> 
> Instead of writing a file with e.g. the CSG specifications you have a script 
> where you define the different geometries like Anders did in his example, and 
> then call an appropriate generate function.
> 
> The most straight forward way to do this would probably be to write a thin 
> python application that defines some sort of interface to netgen, a la what 
> Anders wrote above, and then let e.g. his call to 
> 
> Mesh(c + s2 - s1)
> 
> write the information to a .csg file, piping this to netgen and we have a 
> mesh. That depends on Netgen having a commandline interface. Is this the 
> case?

Yes. Install netgen and netgen-doc (from Ubuntu) and then try the
following:

  netgen /usr/share/doc/netgen-doc/examples/cubeandspheres.geo

  netgen -batchmode -meshfile=mesh /usr/share/doc/netgen-doc/examples/cubeandspheres.geo

Don't know how to get the output in DOLFIN format but I think this is
only supported in the CVS version.

Another advantage with Netgen is its license (LGPL). Tetgen is not
free software. I discussed this with Hang Si (who wrote Tetgen) when
we met just a couple of weeks ago. He's a real nice guy but he's still
reluctant to change his license to something which would make Tetgen
available in for example Ubuntu.

> I could have done this with both tetgen and triangle too, but I used it as an 
> excercise to learn more of wrapping a c/c++ library and to get more into 
> swig :)

:-)

-- 
Anders


Follow ups

References