Creating a complex setup with AVBP from scratch

This training is dedicated to people who want to learn how to setup a -rather complex- LES run with the AVBP software. For this training we will focus on an imaginary device, the trapped vortex burner. A disclaimer first: this device was not designed to work in real life. Whether it can work or not is totally off-topic here.

The geometry

Understanding the configuration

tpvtx

The full trapped vortex burner geometry

This device is however representative of a Gas turbine Combustion chamber setup. It is a circular burner, 0.2 m long, with a radius of approximatively 0.1 m. Nine holes are present at the mid section, breaking the axi-symmetry of the geometry. Therefore, the geometry can be reduced to nine equivalent sections.

tpvtx_section

A section of the trapped vortex burner geometry

In this la figure, the inlet is at the left, the outlet at the right. Fuel could be injected at several places :

  1. in the small cavity at x=0.05m on the inner wall
  2. in the large holes at x=0.1m on the outer wall
  3. in the small recess of the on the inner wall at x=0.05 m.

To illustrate the case 1, here is what a stabilized flame could look like:

tpvtx_flame

A flame stabilized at the inner wall cavity

A discrete representation of the geometry : the mesh

The geometry is a 3D volume, limited by 2D surfaces we will call patches. The following figure shows a tessellation of the geometry with tetrahedrons, with in yellow a crinkly cross-cut of the volume in the middle plane X-Y.

tpvtx_patches

A tessellation of the geometry showing different patches on the mesh skin

This mesh is homogeneous and very coarse for a Large Eddy Simulation. However it will be sufficient for this tutorial. This last figure highlight in colors the patches constituting the surface. There is for example the Inlet in purple, and the Outlet in pink. We will assign to each patch a different boundary condition.

The mesh details are the following:

mesh trappedvtx.mesh.h5
tetrahedra 177 563
nodes 34 684
x (m) [0, 0.2]
y (m) [0.075175, 0.13]
z (m) [-0.41042, 0.41042]
theta (deg.) [-20, 20]
edges (m) [0.001085, 0.06078]

tpvtx_bcnames

The names of the different patches

The setup

We will set up the following configuration.

The flow will be non-reactive. The gas to use is pure AIR at 300K and 101325Pa, nothing extreme, something that you can find at a beach on a warm day. Use these conditions for both initialization and inlet boundary conditions.

Boundary conditions targets are one main inlet, and three small inlets

patch name B.C. type Target
Inlet INLET_RHOUN_T_Y 0.1 Kg/s
InletHole INLET_RHOUN_T_Y 0.01 Kg/s
InletFilm INLET_FILM 0.01 Kg/s
MultiperfIn WALL_LAW_MULTIPERF_QDM 0.01 Kg/s
Outlet OUTLET_RELAX_P 101325Pa

Step 1, the mesh

Preparing the mesh

If it is missing, you can download the mesh on our gitlab.com template mesh deposit.

The mesh must be prepared, because the axi-periodic nature imply a particular connectivity. Indeed, a node on the PerioLeft patch must know the neighboring cells on the “left” side AND on the “right” side, near its twin node from PerioRight.

To add the periodicity, use “Hip”, the Swiss army knife to hack meshes. You can download it from pipy. Follow the instructions in our HIP quick-start manual in order to ensure periodicity.

The output of HIP , when writing the solution, should look like:

       INFO: found rotation around x by 40 deg for surface pair 00.
     Writing grid level 0 (0 being finest level)
      in hdf format to: trappedvtx2
             including separate boundary grid (-b)
             solution with all variables (-a)
             asciiBound in AVBP 6.X format

         writing grid in hdf5 to trappedvtx2.mesh.h5
       INFO: corrected a maximal periodic mismatch of 2.09389e-09
             between vertices 9, 7.
       INFO: corrected a maximal periodic error in normals of 2.11758e-21.
       INFO: writing estimated bc to trappedvtx2.asciiBound

This proves that your mesh is really involving a rotation of 40 degrees for periodicities.

Moving around with the mesh

The mesh is fully described by the HDF5 : trappedvtx2.mesh.h5. From this mesh, HIP can generate the AVBP Boundary Condition declaration asciiBound and the visualization XDMF helper file xmf.

More about the asciiBound

The boundary conditions are given to AVBP using the trappedvtx2.asciiBound. As you can see, the periodic declaration has already been written in the asciiBound for patches PerioRight and Perioleft. Do no change these lines.

Grid processing by hip version 20.07.2 'Argyranthemum frutescens'.
  15 boundary patches.
---------------------------------------------
  Patch: 1
  Inlet
  NO_BOUNDARY
---------------------------------------------
  Patch: 2
  Outlet
  NO_BOUNDARY
---------------------------------------------
  Patch: 3
  PerioLeft
  PERIODIC_AXI
  -1
  40
---------------------------------------------
  Patch: 4
  PerioRight
  PERIODIC_AXI
  1
  40
---------------------------------------------
  Patch: 5
  WallIn1
  NO_BOUNDARY
---------------------------------------------
  Patch: 6
  WallIn2
  NO_BOUNDARY
---------------------------------------------
  Patch: 7
  WallIn3
  NO_BOUNDARY
---------------------------------------------
  Patch: 8
  MultiperfIn
  NO_BOUNDARY
---------------------------------------------
  Patch: 9
  WallIn4
  NO_BOUNDARY
---------------------------------------------
  Patch: 10
  InletHole
  NO_BOUNDARY
---------------------------------------------
  Patch: 11
  WallOut
  NO_BOUNDARY
---------------------------------------------
  Patch: 12
  CanyonUp
  NO_BOUNDARY
---------------------------------------------
  Patch: 13
  CanyonBottom
  NO_BOUNDARY
---------------------------------------------
  Patch: 14
  CanyonDown
  NO_BOUNDARY
---------------------------------------------
  Patch: 15
  InletFilm
  NO_BOUNDARY
---------------------------------------------
  Xtra-Info: 16
  singular x-axis
  0 nodes
---------------------------------------------
More about the xmf

The trappedvtx2.mesh.xmfis simply an XML file helping the visualization of HDF5 files.

<?xml version="1.0" ?>
<Xdmf xmlns:xi="http://www.w3.org/2003/XInclude" Version="2.0">
  <Domain>
    <Grid Collection="Tetrahedron_Mesh" Name="Tetrahedron">
    <Topology Type="Tetrahedron" NumberOfElements="177563">
      <DataItem ItemType="Function" Dimensions="710252" Function="$0 - 1">
        <DataItem Format="HDF" DataType="Int" Dimensions="710252">
        trappedvtx2.mesh.h5:/Connectivity/tet->node
        </DataItem>
      </DataItem>
    </Topology>
    <Geometry Type="X_Y_Z">
        <DataItem Format="HDF" DataType="Float" Dimensions="34684">
        trappedvtx2.mesh.h5:/Coordinates/x
        </DataItem>
        <DataItem Format="HDF" DataType="Float" Dimensions="34684">
        trappedvtx2.mesh.h5:/Coordinates/y
        </DataItem>
        <DataItem Format="HDF" DataType="Float" Dimensions="34684">
        trappedvtx2.mesh.h5:/Coordinates/z
        </DataItem>
    </Geometry>
  </Grid>
  (...)

CAUTION : the XMF file store relative paths to HDF5 files. Do not change the relative position of XMF and related HDF5 files. In other word, if you move the XMF file without the HDF5, It will not work.

You can view the mesh using for example Paraview:

> paraview trappedvtx2.mesh.xmf

Generating the solutBound

The .solutBound.h5 is preferably generated with the tool gensolutbound.

>gensolutbound will create gensolutbound.choices if missing. This is the base block of the choices. Edit your base reference:

'../MESH/trappedvtx.mesh.h5'             ! Mesh file
'../MESH/trappedvtx.asciiBound'          ! The asciiBound file
'../MESH/mesh.asciiBound_tpf'      ! The asciiBound tpf file (optional)
'./perso.solutBound.h5' ! The Boundary Conditions File (HDF5 format)

>gensolutbound --dir=../RUN --step0 will append to choices file , according to the base block , a new control block. If the gensolutbound.choices pre-exist, control block is reset, and control block is erased!. Edit your controls:

!------------------------------------------------
! Please refrain from modifying BC names, keywords or ordering
! constant ; genprofile ; externalhdf5
genprofile > Patch  1 : Inlet
constant > Patch  2 : Outlet
constant > Patch  3 : PerioLeft
constant > Patch  4 : PerioRight
constant > Patch  5 : WallIn1
constant > Patch  6 : WallIn2
constant > Patch  7 : WallIn3
constant > Patch  8 : MultiperfIn
constant > Patch  9 : WallIn4
genprofile > Patch 10 : InletHole
constant > Patch 11 : WallOut
constant > Patch 12 : CanyonUp
constant > Patch 13 : CanyonBottom
constant > Patch 14 : CanyonDown
constant > Patch 15 : InletFilm
````

`>gensolutbound --dir=../RUN --step1` will append to choices file , according to the *control block*  , a new *target block*. **If the `gensolutbound.choices` pre-exist, *control block* is reset!**. Edit your targets:

```bash
!------------------------------------------------
!    boundary data
!------------------------------------------------
Patch   1 : Inlet
BCtype: INLET_RELAX_RHOUN_T_Y
genprofile      ! mass flow will override velocity magnitude

MASS FLOW (kg/s)
1.0d-2

EXPONENT  (1/n) (2->Poiseuille , 7->Turbulent , 10->Flat)
7

Temperature
300.0d0

CH4
0.0d0

CO2
0.0d0

CO
0.0d0

O2
0.23d0

H2O
0.0d0

N2
0.77d0

!------------------------------------------------
Patch   2 : Outlet
BCtype: OUTLET_RELAX_P_3D
constant      ! all components will be constant

Pressure
1.0d5
(...)

>gensolutbound --dir=../RUN --step2 will finally create your binary solutBound file according to your target block.

Step 2 : the run folder

The run folder should follow this pattern:

├── MESH
│   ├── dummy.mesh.h5
│   └── dummy.mesh.xmf
├── AVE
├── INIT
│   ├── dummy.init.h5
│   └── dummy.init.xmf
├── SOLUT
├── SOLUTBOUND
│   ├── dummy.asciiBound
│   ├── dummy.solutbound.h5
│   └── dummy.solutbound.xmf
├── TEMPORAL
├── dummy_probes.dat
├── run.params
├── keywords.in
├── mixture_database.dat
└── species_database.dat

You can fetch some templates files in your AVBP folder : $AVBP_HOME/WORK/INPUT:

  • keyword.in a file describing the possible keywords (version dependent)
  • run.params the global keywords file.
  • mixture_database.dat, the library of non-reactive and reactive mixtures.
  • species_database.dat, the library of thermodynamic properties for each species.

Do NOT keep the miscog.paramsin your folder. This would switch your setup to a multi-instance setup, which is not what you seek here.

Step 3: the run.params

Fill the run.params according to the documentation on the AVBP run params help.

Now you can use the tool checkrun to keep track of your setup sanity.

Step 4: the initial solution

Use the tool makesolution to generate a solution of AIR at ambient pressure.

Check your initial solution using Paraview.

Step 5: the boundary conditions

Edit your asciiBound file to set up the B.C.s types, using the AVBP Boundary Conditions documentation. Some of the boundary conditions will ask for a relax parameter. For configurations with these dimensions and velocities, we usually use 200s-1 for inlets and 50s-1 for outlets at first, then lower. Since we want to install quickly the run here, use 2000s-1 for inlets and 500s-1 for outlets. This will install the flow motion faster, with the drawback of strong numerical reflexions. For the walls, use WALL_LAW_ADIAB by default.

As we will use a multi-perforated condition i.e. a wall featuring hundreds of micro-perforations creating a cold film to protect the liner from extreme temperatures.

tpvtx_flame

A multi-perforated wall and its local frame

You will be asked to provide several additional parameters:

  • Porosity : 0.04 - 4% of the wall surface is actually an injection of cold air.
  • Compound angle : 60deg. - jets are tilted, inducing a lateral motion of the flow near the wall.
  • Stream-wise angle : 0deg. - there is no angle toward the exit.

Use the tool gensolutbound to generate a B.C.s of AIR at ambient pressure.

Check your boundary condition file using Paraview.

Step 6: the probes file

Provide probes by filing the probe.dat file. It is good practice to set up some probes on the inlet/outlet boundary patches.

And now, run…

Your run should be ready now. In case of trouble, use the tool check_runto remove the obvious mistakes, and pay the utmost attention to the log file, because it was created to help the user. It the run is OK you can set a longer duration, or try a reactive version of the run by changing the boundary conditions and the run.params.

Have fun!

Like this post? Share on: TwitterFacebookEmail


Antoine Dauptain is a research scientist focused on computer science and engineering topics for HPC.

Keep Reading


Published

Category

Tutorials

Tags

Stay in Touch