Contrib gmsh2ToFoam

From OpenFOAMWiki

Valid versions: OF version 13.png OF version 14.png OF version 141.png

1 Short Description

A modified gmshToFoam with .msh file format version 2.0 (ASCII type only) support which became the standard in Gmsh 2.0. Gmsh2ToFoam can also automatically detect and handle the conventional version 1.0 format.

This page describes gmsh2ToFoam that comes with the gmshFoam package.

You typically don't need gmsh2ToFoam because the genuine gmshToFoam that comes with recent versions of OF works a lot better than before. This page is kept mostly only for archival reasons.

2 Usage

gmsh2ToFoam <root> <case> <.geo or .msh> [options]

If a .geo file is given as the third argument, gmsh2ToFoam automatically runs Gmsh with the -3 option and the given .geo file as arguments, then converts the produced .msh file.

Options are (for details, see the Features section below):

  • -noAutoInvert: disables automatic point ordering correction.
  • -noCheckMesh: disables simplified checkMesh test.
  • -noRenumberMesh: disables renumberMesh matrix bandwidth compression.
  • -noUnusedPointRemoval: disables removal of unreferred points.
  • -verbosity verborsity (0-5; defaults to 3): sets verbosity of gmsh2ToFoam.

3 Features

Other than the .msh version 2.0 format handling, gmsh2ToFoam has several features highly focused on practical usability over the original gmshToFoam that comes with OF 1.3:

3.1 Patch and cell/face-Zone/Set labeling

  • Assignment of physical region names (inlet, outlet, ...) defined in a .geo file insted of automatically generated names (patch0, patch1, ...) for patches and cell/face-Zones/Sets. Base patch types (patch, wall, symmetryPlane, empty, wedge, cyclic) can also be specified.
  • Assignment of suffix numbers of automatically generated names (patch1, ...) based on the region numbers defined in a .geo file, instead of the order of their appearance in a .msh file, if the physical regions are to be labeled by numbers.

The above two should contribute easy correspondence between the original .geo file and the final converted mesh. For details see the example below.

3.2 Mesh data structure optimizations

  • Automatic correction of wrongly ordered points in node connectivities. (Note: the genuine gmshToFoam also has this feature.) To disable this feature, use the -noAutoInvert option.
  • Testing of the converted mesh by simplified checkMesh test similar to the one that blockMesh does. To disable this feature, use the -noCheckMesh option.
  • Matrix bandwidth compression. This is basically what the renumberMesh utility does, plus cell/face-Zone/Set handling and minus field file renumbering. To disable this feature, use the -noRenumberMesh option.
  • Removal of unreferred points (points which do not belong to any of faces nor cells; e. g. spline control points or the center of a circular arc). CheckMesh test of the converted mesh will no longer fail due to "Unused points" error. To disable this feature, use the -noUnusedPointRemoval option.
  • Removal of zero-sized defaultFaces and faceZones from polyMesh/boundary. You don't have to write dummy defaultFaces or faceZone entries in boundary description.

3.3 Others

  • Automatic running of Gmsh if .geo is given instead of a .msh as input.
  • Compatibility with .msh files generated by Windows versions of Gmsh.
  • Refined text message outputs. Reflecting my own support experience on the Message Board, error messages are written as suggestive as possible for typical user pitfalls. For example, gmsh2ToFoam complains "No volumetric cells found ... Check your mesh carefully particularly whether your physical volume definition is correct" when the converted mesh contains no volumetric cells, instead of cryptic and mysterious "Faces deallocated."
  • Verbosity control along with Gmsh's General.Verbosity variable.

4 Technical

  • Be sure to label at least one physical region by a number other than 0 (zero) if all the physical regions are to be labeled by numbers. This restriction comes from gmsh2ToFoam following one of the Gmsh authors' suggestion. See Gmsh mailing list archive for details.
  • Beware that if physical regions are defined in a .geo file, Gmsh writes .msh file only with those elements that belong to the physical regions. Read Section 4.1 of Gmsh 2.0 Reference Manual including footnotes carefully before using the labeling features of gmsh2ToFoam.
  • Gmsh2ToFoam still has not been well tested.

For feedback and discussion go to this thread on the Message Board.

5 Example

First write a .geo file called cubeHexa.geo as follows and put it under any suitable case directory. Especially note that at the last part surface patches and a volume are given their names (not numbers) of inlet, outlet, bottomTop and internalField except the two lateral surfaces given a common number of 10. In addition, the bottomTop patch is given a base patch type of symmetryPlane by the second word of its string label. Other patches where the second words are omitted default to the patch type.

// A cube of side lengths 1

// Create base line
lc = 0.099;
Point(1) = {-0.5, -0.5, -0.5, lc};Point(2) = {0.5, -0.5, -0.5, lc};
Line(3) = {1, 2};
// Create base surface and extrude it to volume
e1[] = Extrude{0, 1, 0}{Line{3}; Layers{10}; Recombine;};
e2[] = Extrude{0, 0, 1}{Surface{e1[1]}; Layers{10}; Recombine;};

// Naming physical entities is a new key feature in Gmsh 2.0.
// To use the feature you really do need to read the Section 4.1 of Gmsh 2.0
// Reference Manual, including footnotes, carefully.

// Generate surface patches with string labels.
// Base patch types (patch, wall, symmetryPlane, empty, wedge, cyclic) can be
// specified by second words of the string labels. If omitted the type
// defaults to patch. If a surface is generated inside of the volume it will be
// recognized as a faceZone/faceSet.
Physical Surface("inlet") = {e2[5]};
Physical Surface("outlet") = {e2[3]};
Physical Surface("bottomTop symmetryPlane") = {e1[1],e2[0]};

// You can also use numbers for physical region definition. This patch will be
// named "patch10."
Physical Surface(10) = {e2[2], e2[4]}; // lateral patches

// Generate volume with cellZone/cellSet definition.
// Don't forget to make the entire volume defined because Gmsh writes only
// parts of the mesh where physical regions are defined.
Physical Volume("internalField") = {e2[1]};

Next generate a 3D mesh and convert it to the OpenFOAM polyMesh format by executing the following command under the case directory.

$ gmsh2ToFoam . . cubeHexa.geo

With this gmsh2ToFoam automatically runs gmsh -3 cubeHexa.geo and converts the produced cubeHexa.msh to the polyMesh format under the constant subdirectory. After that you can access the patches named inlet, outlet and bottomTop by their names instead of automatically generated patch0, patch1, ... names. The patches labeled by the number of 10 are named patch10, which means the number is retained in the suffix of automatically generated name. The bottomTop patch must have the symmetryPlane boundary condition because it has been given the base patch type of symmetryPlane. Taking all these into consideration, for example you can write the boundaryField of cubeHexa/0/U as follows.

boundaryField
{
    inlet
    {
        type            fixedValue;
	value           uniform (1.0 0.0 0.0);
    }
    outlet
    {
        type            convectiveOutlet;
	convectiveVelocity uniform 343.704;
    }
    bottomTop
    {
        type            symmetryPlane;
    }
    patch10
    {
        type            fixedValue;
	value           uniform (0.0 0.0 0.0);
    }
}

Similarly the internalField is accessible with its name as a cellZone or a cellSet instead of automatically generated name of cellZone_0.

6 Download

Current version:

  • No current version available.


Past versions (will not work with the current OpenFOAM versions):

7 History

7islands 06:51, 27 Oct 2007 (CEST) (Takuya Oshima):

  • Update of the documentation (this page) to match the current gmsh2ToFoam.

7islands 09:25, 12 Mar 2007 (CET):

  • RenumberMesh matrix bandwidth compression with cell/face-Zone/Set handling.
  • Deletes zero-sized patches (internal faceZones).
  • Base patch types can be defined by the second word of the string labels.

7islands 15:19, 5 Mar 2007 (CET):

  • Following one of the Gmsh authors' suggestion, another modification is made to physical/elementary region (entity) number handling. See Gmsh mailing list archive for details.
  • Automatically generated patche/cellZone/faceZone names ("patch1," ...) are now labeled by numbers based on original region numbers given in a .geo file, instead of the order of their appearence in a .msh file.
  • Deletes the defaultFaces patch if its size is determined to be zero.
  • Removes unreferred points.

7islands 08:10, 19 Feb 2007 (CET):

  • Assign physical entity names instead of automatically generating them (such as "patch0") for patches / cellZones / faceZones if a $PhysicalNames section is present in a version 2.0 .msh file.

7islands 03:32, 18 Feb 2007 (CET):

  • Incorporated primitivePatch::meshPointMap() call optimization from Bernhard's gmshToFoamMod.
  • Fixed correspondence between OpenFOAM cellZone/patch numbering and Gmsh physical/elementary entity tagging. The meaning of physical entity tag seems to be different between .msh file format versions.

7islands 03:30, 17 Feb 2007 (CET): Improved compatibility with .msh files generated by Windows versions of Gmsh.

7islands 13:28, 16 Feb 2007 (CET): First upload.