mercredi 25 décembre 2013

Building hexagonal meshes with Gmsh

OpenFOAM's blockMesh is rather simple and efficient way of building meshes but it has certain annoying features:
  1. Entities numbering. To construct a block, an edge or a boundary one has to know its vertices numbers, they are numbered automatically stating with 0. So while constructing a mesh one can, for example, use vim with +relativenumber and blockMeshDict opened in two splits (see screenshot). But when blockMesh reports about errors in the mesh description it also uses these automatic numbers of entities. Soon it becomes rather annoying to look for the block #4 or #17 to correct gradings or densities.
  2. Mesh grading is a good thing but for example to make a cube mesh with a higher density near the walls, one has to cut the cube into 4 blocks and make consistent grading in each block.
  3. Curved edges is something special. For a 2D case it's rather simple to make an utility to calculate coordinates of a point on the arc of a given radius passing through two vertices, in a 3D case it's less obvious.
  4. And finally workflow vim -> blockMesh -> paraFoam is rather slow.
Gmsh usually used with the finite-element code GetDP so by default it generates tetrahedral meshes, like one below.
Tetrahedral mesh
But it is possible to make hexagonal meshes with it. All GEO files from the sections below can be found in the repository.

dimanche 22 décembre 2013

Building OpenFOAM 2.2.2 on OS X with clang

NB! Updated version of the guide can be found in the post Building OpenFOAM on OS X

There are several instructions for building OpenFOAM on OS X (1, 2). They assume that you are using Macports which was not a case with me. So I've decided to build OpenFOAM with clang as it comes with developer tools. My patches are based upon ones by Bernhard Gschaider, basically I've applied his patches, removed Macports stuff and added clang stuff. Patches and build process was tested on OS X 10.9 with clang --version:

Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.0.0
Thread model: posix

So, to build OpenFOAM you need:
  1. Download OpenFOAM and Third-Party source packs here.
  2. Create a disk image with Disk Utility. One needs this image to create case sensitive file system (see 1 or 2 for instructions with pictures).
  3. Download patches for OpenFOAM and Third-Party source packs. They assume you are building 64-bit version of the code as there're no wmake rules for 32-bit compilation.
  4. Mount created disk image to $HOME/OpenFOAM
  5. Unpack source packs to $HOME/OpenFOAM
  6. Copy patch files to source folders (OpenFOAM-2.2.2-1387556919.patch to OpenFOAM-2.2.2, ThirdParty-2.2.2-1387556964.patch to ThirdParty-2.2.2).
  7. Apply patches with git apply [patch file name] command. In addition to changing contents of the files git sets modes so you won't need to do chmod 0755 [file] on executable files created by the patches.
  8. Edit $HOME/OpenFOAM/OpenFOAM-2.2.2/ets/bashrc file to correspond to your system. I've tested build with OPENMPI (1.6.3, in ThirdParty source pack), and with SYSTEMOPENMPI (1.7.3, installed with Homebrew, I guess if you're using Macports you'll need to modify wmake rules).
  9. Source bashrc with source etc/bashrc
  10. Now you can execute Allwmake script to build OpenFOAM.
To mount disk image and source OpenFOAM's bashrc file automatically each time you launch Terminal one can add following lines to $HOME/.profile file:
# OpenFOAM
if [ -f $HOME/.OpenFOAM ]; then
    OF_VER=$(cat $HOME/.OpenFOAM)
    if [ ! -f $HOME/OpenFOAM/OpenFOAM-$OF_VER/etc/bashrc ]; then
        hdiutil attach -quiet -mountpoint $HOME/OpenFOAM OpenFOAM-$OF_VER.dmg &&
            . $HOME/OpenFOAM/OpenFOAM-$OF_VER/etc/bashrc
        . $HOME/OpenFOAM/OpenFOAM-$OF_VER/etc/bashrc
And create $HOME/.OpenFOAM file with OpenFOAM version in it with:
echo '2.2.2' > $HOME/.OpenFOAM
Now you can test installation with standard icoFoam run:
$ mkdir -p $FOAM_RUN
$ run
$ cp -r $FOAM_TUTOTALS/incompressible/icoFoam/cavity .
$ cd cavity
$ blockMesh
$ icoFoam
Also maybe it's worth to move $FOAM_RUN folder somewhere outside of disk image and create symlink.

That's it.