[Gmsh] connecting structured to unstructured meshed volumes in 3D

Trevor Strickler trevor.strickler at gmail.com
Tue Jan 31 03:43:58 CET 2012


Philip Simons,

I wrote some code into Gmsh to handle hex to tet interfaces.  The
interfaces can be accomplished with extruded or transfinite volumes.  If I
had the time I would improve the work I have done--I know a way to
accomplish the interface with better element quality and more simplicity.
Still, what is there now will give you a hex to tet interface.

I've attached a set of (poorly written) instructions to help you use the
interface.  You'll have to download the nightly build of Gmsh to use the
features.  Also, I've attached an example file that shows the Quad To Tri
interfaces in action.

Basically, the two methods:

1. Extrusions. You can extrude quads as hexahedra and apply the QuadTriSngl
or QuadTriDbl keywords (as shown in the attached instructions).  This will
divide all the faces of the extrusion (except for the source surface) into
triangles and the underlying elements are divided into pyramids and/or
prisms accordingly to create the interface.  So, to interface a surface to
tets, extrude a few layers from a quad face with the QuadTri options and
you'll cover your quads with an interface to triangles.

So you know, the QuadTriSngl method is more of an academic exercise and
gives the lowest element quality.  The Dbl method gives better quality
elements but requires two extrusion  layers.    Also, read the instructions
about how side lateral interfaces are handled.  For instance, you might not
want to divide the laterals of an extrusion and there are options to
prevent that.

2. Transfinite Volumes.  This is conceptually easier than the extrusion
approach.  Simply create a transfinite volume and arbitrarily leave some
faces NOT recombined.  Then, use the QuadTri keyword on the volume (see
instructions).  The elements in the volume adjacent to any divided surface
will be divided into pyramids and the rest of the elements will be
hexahedra.

Anyway, have fun experimenting with this.  And if something goes wrong,
please email me! (Note that there is a mild bug when you extrude an
ustructured quad-triangle surface and try to use QuadTriSngl on a single
extruded layer...you'll get a lot of error messages, but the mesh will
still be valid.  Again, just use QuadTriDbl or the transfinite method for
best results, anyway).

-Trevor Strickler


---------- Forwarded message ----------
> From: Philip Simons <kasjoeb at gmail.com>
> To: gmsh at geuz.org
> Cc:
> Date: Mon, 30 Jan 2012 14:04:27 +0100
> Subject: [Gmsh] connecting structured to unstructured meshed volumes in 3D
> Hello all,
>
> I saw several messages in the archive stating the (im)possibility to
> connect structured volumes (HEX elements) to unstructured ones (TET
> elements). I succeeded in coupling layered wedge (PRISM) elements to TET
> elements, which already is quite nice for CFD boundary layers, but does
> anyone know the status of the HEX to TET coupling, where pyramids should be
> inserted in the unstructured volume to make the connections from QUADS
> (side of the structured volume) to TETs?
>
> thanks,
>
> Philip
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.geuz.org/pipermail/gmsh/attachments/20120130/b5d47083/attachment.html>
-------------- next part --------------
INFORMATION FOR QUADTRI PATCH VERSION 1.0 (May 31, 2011) 

All new code is written by Trevor S. Strickler 
<trevor.strickler at gmail.com>

Trevor S. Strickler hereby transfers copyright of QuadTri files to 
Christophe Geuzaine and J.-F. Remacle with the understanding that 
his contribution shall be cited appropriately.

All code reused from Gmsh is Copyright (C) 1997-2011 C. Geuzaine, 
J.-F. Remacle 

Gmsh is available at: www.geuz.org/gmsh

See licensing information below.


CONTENTS:

1. Introduction

2. Copyright and Licensing

3. How QuadTri works.
   a. For Transfinite Volumes.
   b. For Structured Extrusions.

4. Invoking QuadTri.
   a. For Transfinite Volumes.
   b. For Structured Extrusions.

5. How to modify Gmsh to use QuadTri.

6. Other information/suggestions.



INTRODUCTION
----------------------------

The Quadrangle-to-Triangle interface allows the user to conformally 
subdivide elements along the top and lateral surfaces of an extruded, 
structured mesh region OR along any boundary of a transfinite mesh region 
so that the region has all triangles on these boundaries.  Both the 2D 
surface elements and the 3D volume elements adjacent to the boundary 
surfaces are divided. This allows the convenient connection of regions 
with quadrangle-faced mesh elements to regions (structured or unstructured) 
that may be all tetrahedra.



COPYRIGHT AND LICENSING
-----------------------

QuadTri was written by Trevor S. Strickler 
<trevor.strickler at gmail.com>. It is written as an addition to the
meshing code Gmsh, which is copyrighted by C. Geuzaine and J.-F. 
Remacle and distributed under the GNU Public License version 2 with 
an exception. QuadTri is released under the GNU Public License 
Version 2 with the SAME exceptions as for the current release of Gmsh 
as of April 21, 2011.  See LICENSE.txt for more information.

Trevor S. Strickler hereby transfers copyright of QuadTri files to 
Christophe Geuzaine and J.-F. Remacle with the understanding that 
his contribution shall be cited appropriately.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, Version 2,
as published by the Free Software Foundation, or (at your option) 
any later version, with or without the exception given in the 
LICENSE.txt file supplied with this code and with Gmsh.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.



HOW QUADTRI WORKS
-----------------

The Quadrangle-to-Triangle interface (from here on referred to as
QuadTri) allows the user to conformally subdivide elements along the top 
and lateral surfaces of an extruded, structured mesh region OR along any boundary 
of a transfinite mesh region so that the region has all triangles on 
these boundaries. Unstructured or structured tetrahedral regions can 
then be interfaced to these boundaries. QuadTri accomplishes by using 
a combination of pyramids, prisms, and tetrahedra to divide hexahedra, 
prisms, and possibly pyramids.


a. FOR TRANSFINITE VOLUMES:  

The QuadTri algorithm for transfinite volumes
is very simple. Any mesh elements in the transfinite volume that are adjacent 
to unrecombined, 2D boundary surface elements will be divided with a body-centered 
internal vertex, conformal to the surface mesh. Any mesh elements NOT 
needing division will be meshed as hexahedra or prisms. A transfinite volume
with any combination of recombined and un-recombined transfinite boundary surfaces 
is valid when meshed with TransfQuadTri. This method works for both 5- and 
6-sided transfinite volumes. 


b. STRUCTURED EXTRUSIONS: 

The QuadTri algorithm for structured extrusions ( from here on referred to 
as 'QuadTriExtruded') tries to make as few divisions as possible in order 
to keep the element number as low as possible. QuadTriExtruded works for 
regions having source surfaces that are all quads, all triangles, or mixed. 
Also, the user can choose to keep lateral boundaries recombined (where 
possible) and only divide the top surface into triangles.

For structured extrusions, QuadTriExtruded is 'smart' about the boundary 
requirements of neighboring regions and will resolve lateral surface 
mesh conflicts where ever necessary. In other words, do not worry about 
conformality with lateral neighbors--QuadTriExtruded will not divide a lateral
surface that must remain meshed as quadrangles, nor will it recombine 
a lateral surface that must remain as triangles. NOTE: The 'top' 
surface of a structured region is always divided by QuadTriExtruded. Also, 
laterals between two QuadTriExtruded regions are always recombined.

There are actually two main QuadTriExtruded methods available to the user:
the single-layer method and the double-layer method.


Single-Layer method: This method attempts to subdivide the elements in an
extruded, structured mesh region that are adjacent to the region's top and 
lateral surfaces WITHOUT adding any additional vertices. However, if, 
due to certain lateral boundary conditions, an element cannot be divided 
without additional vertices, an internal vertex is created at the 
vertex-based centroid of the element. The element is then divided using 
that vertex. When an internal vertex is created, a warning message is sent
for each to alert the user. Because this subdivision method only 
requires one layer to interface quad faces to triangles, it is called 
the single-layer method.

Double-Layer method: This method attempts to subdivide the elements in an
extruded, structured mesh region that are adjacent to the region's top and 
lateral surfaces by creating additional face-centered vertices for each 
of the elements. The face-centered vertices are added at the 
centroids of horizontal, non-boundary element faces to allow the creation 
of pyramids with apexes at the added vertices ('horizontal' is 
referenced to the extrusion direction, which is vertical). This method 
requires that there be at least TWO layers in the extrusion so that these 
face-centered vertices are not added on external boundaries of the region. For 
this reason, the method is called the double-layer method.  For extruded 
regions with more than two layers, there may be mesh elements having a 
face-centered vertex in both the top and bottom face.  These elements 
are divided by creating prisms around a central 'axis' formed by the two 
face-centered vertices. These prisms may themselves be divided depending 
on lateral boundary conditions.


There are advantages and disadvantages to each of these two methods:

The single-layer method creates the least number of mesh elements,
but the quality of the elements is slightly worse than for the double-
layer method.  Also, the single-layer method, in rare instances, may 
be unable to divide an element without adding a body-centered vertex;
however, this is rare and *should* only be possible when the 
source surface has 2D elements with all vertices on a boundary AND
if there are both recombined and unrecombined lateral surfaces in the
extrusion--but even then it is unlikely. Even if a new vertex is
created by the single-layer method, the mesh will still be conformal--
but some users may not want an irregular vertex pattern in their
structured extrusions.



INVOKING QUADTRI 
----------------

a. FOR TRANSFINITE VOLUMES:

The transfinite QuadTri algorithm may be applied by using the following
command:

TransfQuadTri { expression-list } | "*";

Where 'expression-list' is a list of volume numbers to apply QuadTri to.
"*" is used to apply TransfQuadTri to all existing volumes.  A transfinite volume
with any combination of recombined and un-recombined transfinite boundary surfaces is 
valid when meshed with TransfQuadTri. When applied to non-Transfinite volumes, 
TransfQuadTri has NO effect on those volumes.



b. FOR STRUCTURED EXTRUSIONS:

QuadTri for structured extrusions (QuadTriExtruded) is invoked by using 
the appropriate keywords in the 'extrude-list layers' part of an 'Extrude' 
command for structured meshes. (see Gmsh manual for description of the 
'Extrude' command for structured meshes). Note that the QuadTriExtruded 
commands only have an effect for the extrusion of a surface to create a 
region, AND only if the 'Recombine' option is used (there is no point 
in applying QuadTriExtruded to a fully subdivided region). 

The keywords (note that only the first letter must be capitalized):

     QuadTriSngl; (for the single-layer method)
     QuadTriDbl;  (for the double-layer method)

Permissible variants (shown here as regular expressions (regexp) ):

     Quad[tT]ri[sS]ngl;
     Quad[tT]ri[dD]bl;

Optionally, for each of the two QuadTriExtruded methods, the user may choose
to keep lateral surfaces of the region recombined (where possible) by
using:

     QuadTriSngl Recomblaterals; 
     QuadTriDbl Recomblaterals;


Examples of Usage:

single-layer method, recombine laterals:

     Extrude {0.0, 0.0, 1.0} {Surface {surf_num}; Layers {10}; Recombine; 
                              QuadTriSngl Recomblaterals; };

double-layer method, not using the recombine laterals option:

     Extrude {0.0, 0.0, 1.0} {Surface {surf_num}; Layers {10}; QuadTriDbl;
                              Recombine; };
 
Let it be repeated: If the QuadTriExtruded region shares a lateral with another 
region, QuadTriExtruded will only divide (or not divide) that surface in a way 
that does not create conflicts between the regions, regardless of 
whether Recomblaterals was used or not. In other words, do not worry
about conformality with lateral neighbors--QuadTriExtruded will not divide 
a lateral surface that must remain quadrangles, nor will it recombine
a lateral surface that must remain triangles.




HOW TO MODIFY GMSH TO USE QUADTRI
---------------------------------------

One may simply merge the other files distributed with the QuadTri patch 
directly into the appropriate Gmsh directories and the changes to 
the source will be complete. The user can then
compile the source as for the regular Gmsh version. Be careful
not to get the /Mesh/CMakeLists.txt file confused with the 
CMakeLists.txt file in other directories!!!!	


7. OTHER INFORMATION/SUGGESTIONS

Volume sign of elements: Does it matter if the volume sign of the 
elements is positive or negative?  I hope not. It is hard to 
make sure the elements are created with negative volume sign, and 
post-creation revert() costs execution speed.

std::vector allocation: I have given some thought to memory management 
with respect to the allocation of certain std::vectors in Gmsh.  After some 
testing, I found that execution time can be reduced for structured mesh
generation by as much as 20% in some cases if certain vectors
are allocated manually instead of automatically when the capacity
is exceeded. Also, automatic reallocation sometimes allocates
twice as much memory as needed in the end. 
The std::vectors I looked at include the hexahedra, prisms, pyramids,
and tetrahedra pointer vectors.  Also, the std::map _extrudedElements in 
ExtrudeParams::ExtrusionElementMap could be allocated and filled all at 
once AFTER all elements are created for a geometrical entity. I have found
this does increase execution speed.  Please consider the following function 
for ExtrudeParams:

*****************************************
// This is a member function for the element map in ExtrudeParams.
// This allows insertion of a whole vector at once.
void ExtrudeParams::
ExtrusionElementMap::addExtrudedElemVector(MElement* source, std::vector<MElement*> *extrudedVector )
{
  std::map<MElement*,std::vector<MElement*> >::iterator it = _extrudedElements.find(source);

  if(it != _extrudedElements.end()){
    it->second.reserve(it->second.size()+extrudedVector->size());
    it->second.insert(it->second.end(), extrudedVector->begin(), extrudedVector->end());
  }
  else {
    int totalNbElems = 0;
    for (int i = 0; i <_parent->mesh.NbLayer;i++)
      totalNbElems += _parent->mesh.NbElmLayer[i];
    unsigned int new_cap = totalNbElems > extrudedVector->size() ? totalNbElems : extrudedVector->size();
    // automatically creates source key in map (single argument 'insert' is also logarithmic too, just like this).
    std::vector<MElement*> *vec = &(_extrudedElements[source]);
    vec->reserve( new_cap );
    vec->insert( vec->end(), extrudedVector->begin(), extrudedVector->end());
  }
  
}
******************************************[Gmsh Main Directory]/Geo/ExtrudeParams.cpp


-------------- next part --------------
A non-text attachment was scrubbed...
Name: tunnel_test.geo
Type: application/octet-stream
Size: 6404 bytes
Desc: not available
URL: <http://www.geuz.org/pipermail/gmsh/attachments/20120130/b5d47083/attachment.geo>