IBM
This section describes how the immersed boundary method (IBM) can be activated in TOSCA. The code supports both static or dynamic IBM, where the latter means that the body can move without limitations inside the computational domain. The IBM has been fully parallelized and it features fast algorithms to perform both topology tests (inside-outside) or the search that finds, at every iteration, the closest fluid mesh cell for each IBM surface triangle. TOSCA’s IBM is referred to as a sharp-interface method, where boundary conditions are not applied by means of momentum source terms, but rather by directly recunstructing the boundary condition at the IBM fluid cells. These cells are selected through the following algorithm. First, all cells whose center lies inside the IBM body are marked as IBM solid cells. These cells are blanked when solving the governing equations. Then, wherever an IBM solid cell is adjacent to a fluid cell, this fluid cell is transformed into an IBM fluid cell, where BCs are reconstructed, so that IBM solid cells are always enclosed in a layer of IBM fluid cells. This distinction, which can be seen as a cell coloring algorithm, is saved in the nv field, which marks each cell based on its IBM coloring. For instance, nv is 0, 1 and 2 for fluid cells, IBM fluid cells and IBM solid cells, respectively.
Both boundary conditions and wall models can be applied to the IBM fluid cells. BCs are reconstructed by first creating a fictitious ghost point on the surface normal (pointing outward) through the center of the fluid cell. The field of interest is then interpolated at this point using trilinear or triangular interpolation from the surrounding cells. This is then used to apply the boundary condition at the fluid cell, also considering the velocity of the IBM body. For wall models, theoretical laws are used, while for slip and no-slip BCs a linear interpolation is employed. Optionally, one can also use two fictitious ghost points, which lead to a quadratic interpolation instead.
The body surface mesh is read from an UCD file, which is a standard format for surface meshes (this format can be generated e.g. by PointWise). Notably, to read the UCD file in ParaView, the extension must be changed to .inp. Finally, in TOSCA only the name of the file should be specified, thereby dropping the extension. Below is an example of a UCD file for a cuboid, where each face is split in two triangles:
# UCD Geometry file crated by custom python script
#
#
8 12 0 0 0
1 -6.83333e+02 -4.33333e+02 0.00000e+00
2 6.83333e+02 -4.33333e+02 0.00000e+00
3 6.83333e+02 1.13333e+03 0.00000e+00
4 -6.83333e+02 1.13333e+03 0.00000e+00
5 -6.83333e+02 -4.33333e+02 1.20000e+02
6 6.83333e+02 -4.33333e+02 1.20000e+02
7 6.83333e+02 1.13333e+03 1.20000e+02
8 -6.83333e+02 1.13333e+03 1.20000e+02
1 0 tri 1 2 3
2 0 tri 1 3 4
3 0 tri 5 6 7
4 0 tri 5 7 8
5 0 tri 1 2 6
6 0 tri 1 6 5
7 0 tri 2 3 7
8 0 tri 2 7 6
9 0 tri 3 4 8
10 0 tri 3 8 7
11 0 tri 4 1 5
12 0 tri 4 5 8
Notably, there are 8 vertices and 12 triangles in the example above.
In order to activate the IBM in TOSCA, the -ibm
flag has to be set to 1 in the control.dat file. TOSCA is prompted to read additional
inputs inside the IBM
directory. These are the IBMProperties.dat file and at least one IBM body in the above format, whose name is
specified in the IBMProperties.dat file.
IBMProperties.dat
The following tables summarize all available entries for each of the IBMProperties.dat file.
entry |
entry type |
description |
|
integer |
Number of bodies. |
|
bool |
If set to 1, the code will print additional information about the IBM. This is useful for debugging purposes. |
|
bool |
0 for static IBM, 1 for dynamic IBM. |
|
bool |
if set to 1 checks that all normals are pointing outward and flips them if necessary. This option is always recommended. |
|
bool |
averages the normal across more IBM triangles, recommended for irregular bodies or bodies that are under-resolved by the triangular mesh. |
|
bool |
computes forces on the IBM body. Moments are only calculated if the IBM is dynamic. This will be corrected in the future. |
|
bool |
writies the IBM body in STL format based on the writeSettings. Useful with dynamic IBM, to visualize the body motion. |
|
bool |
directly computes the wall shear and applies within the momentum equation. Recommended for terrains. Requires interpolationDistance. |
|
scalar |
Distance from the body surface where the ghost point is placed. This parameter should be set according to the mean mesh size at the wall and it it is uniform to avoid spikes in the stress produced by variable IBM fluid cell to surface distance. |
|
bool |
if set to 1 allows to set groundLevel. |
|
scalar |
Allows to set a user-defined ground level. This used at differet levels in the code when evaluating heigh-dipendend BCs and models. |
|
dictionary |
Required when computeForce is set to 1. Contains entries for the IBM force writing. It is defined as follows: writeSettings
{
timeStart scalar // start time for writing
intervalType string // timeStep or adjustableTime
timeInterval scalar // number of iters or seconds
}
|
|
string |
CURVIB (preferred, requires CURVIBInterpolationType) or MSL (Moving Least Squares). The first method is preferred while the last is only recommended for simple geometries and for no-slip BCs only. |
|
string |
CurvibTrilinear (recommended) or CurvibTriangular. The first interpolates the velocity at the ghost node using tri-linera interpolation from the 8 surrounding fluid cells. The second uses a triangular interpolation from 3 surrounding fluid cells. The first method is recommended and it is the most tested, although it is a bit more expensive. |
|
string |
Only required for CurvibTrilinear, can be linear (more stable) or quadratic (less stable). The latter is recommended for smooth terrain or smooth static bodies. It referst to how many fictitious ghost points are projected from the surface mesh into the fluid domain. |
|
dictionary |
specifies the object-specific properties. There are as meny dictionaries as the number of bodies. The name of the dictionary is object followed by the body index. The body index is an integer starting from 0. |
Object<N> Dictionary
The object-specific properties are defined in the object<N>
dictionary. The following table summarizes the mandatory
entries that are required for each object when the bodyMotion flag is set to static. For non-static body motion,
additional entries are required, which are summarized below in table Non-Static IBM.
Static IBM
entry |
entry type |
description |
|
string |
Name of the body. This is the name of the file without the extension. The file must be in the IBM directory. |
|
string |
This is the type of body, can be closedBody or surfaceBody. In the first case, the body is a closed watertight body, in the second case, the is one or more open surfaces, and additional entries are required. |
|
integer |
Number of surfaces that make up the body. Only required for surfaceBody. |
|
string or vector of string |
Can be ucd, grd, ascii, inp or ucd2 for closedBody. Can be ucd, grd, inp or ucd2 for surfaceBody. For closedBody, this is a single string, while for surfaceBody this is a vector of strings, .e.g (ucd grd inp). The size of the vector must be equal to numSurfaces. |
|
vector of string |
Names of the surface files that make up a body. This is a vecotor whose elements are the names of the files. The size of the vector must be equal to numSurfaces. The files must be in the IBM directory. |
|
string |
Used for both closedBody and surfaceBody when the |
|
vector |
Translation vector that allows to translate each point coordinate by this amount in the x, y and z direction. This is useful to move the body directly within TOSCA if this is defined with a different coordinate system. |
|
string |
Type of body motion, can be static, rotation, sinusoidal or pitchingOscillation. Moving cases required additional entries (see table below). |
|
scalar |
Factor that multiplies the average cell size, indicating how far away from a given surface triangle to go, when performing the search for the closest fluid cell. A value of 3 is recommended for most cases. |
|
string |
mode used to set the velocity boundary condition.
Match-type boundary conditions are useful for terrain simulations, where the IBM body may merge with the bottom patch, in order to ensure that the same boundary condition is applied. |
|
string |
mode used to set the temperature boundary condition. Requires -potentialT to be set to 1 in the control.dat file.
Match-type boundary conditions are useful for terrain simulations, where the IBM body may merge with the bottom patch, in order to ensure that the same boundary condition is applied. |
|
string |
Only required with velocityBCSetType set to setHere. Name of the IBM velocity boundary condition. Available entries are noSlip, slip and velocityWallFunction. The latter requires additional entries, depending on wallFunctionTypeU, detailed in the next table. |
|
integer |
Requires velocityBC to be set to velocityWallFunction. Used to select the type of wall function for the velocity (-1, -3, -4 or -5). |
|
string |
Only required with temperatureBCSetType set to setHere. Name of the IBM velocity boundary condition. Available entries are zeroGradient, fixedValue (requires fixedValueT entry) and thetaWallFunction. The latter requires additional entries, depending on wallFunctionTypeT, detailed in the next table. |
|
integer |
Requires temperatureBC to be set to thetaWallFunction. Used to select the type of wall function for the potential temperature (-2, -3 or -4). |
|
scalar |
Fixed value for the temperature BC. Only required with temperatureBCSetType set to setHere and temperatureBC set to fixedValue. |
The following table summarizes the velocity wall functions selectable from the IBMProperties.dat file and their entries.
entry |
entry type |
description |
wallFunctionTypeU -1: Cabot wall model |
||
|
scalar |
equivalent roughness height in meters. |
|
scalar |
von Karman constant. |
wallFunctionTypeU -3: Shumann wall model |
||
|
string |
averaged for laterally-homogeneous flows, localized otherwise. |
|
scalar |
von Karman constant. |
|
scalar |
reference potential temperature in Kelvin. |
|
scalar |
equivalent roughness height in meters. |
|
scalar |
Shumann model constant. |
wallFunctionTypeU -4: Power law wall model |
||
|
scalar |
equivalent roughness height in meters. |
|
scalar |
von Karman constant. |
wallFunctionTypeU -5: Log law wall model |
||
|
scalar |
eqivalent roughness height in meters. |
|
scalar |
von Karman constant. |
The following table summarizes the temperature wall functions selectable from the IBMProperties.dat file and their entries.
entry |
entry type |
description |
wallFunctionTypeT -2: Shumann wall model - wall heat flux prescribed |
||
|
scalar |
wall heat flux in J/m2. |
wallFunctionTypeT -3: Shumann wall model - constant heating rate |
||
|
string |
averaged for laterally-homogeneous flows, localized otherwise. |
|
scalar |
von Karman constant. |
|
scalar |
reference potential temperature in Kelvin. |
|
scalar |
equivalent roughness height in meters. |
|
scalar |
Shumann model constant. |
|
scalar |
Shumann model constant. |
|
scalar |
Shumann model constant. |
|
scalar |
heating rate in K/s. |
wallFunctionTypeT -4: Shumann wall model - variable heating rate |
||
|
string |
averaged for laterally-homogeneous flows, localized otherwise. |
|
scalar |
von Karman constant. |
|
scalar |
reference potential temperature in Kelvin. |
|
scalar |
equivalent roughness height in meters. |
|
scalar |
Shumann model constant. |
|
scalar |
Shumann model constant. |
Theta wall function type -4 requires look up tables of time (s), surface temperature (K), and Obhukhov length (m),
stored in inflowDatabase/mesoscaleData/time
, inflowDatabase/mesoscaleData/surfTemp
and inflowDatabase/mesoscaleData/L
, respectively.
All vectors should have the same size. Notably, these wall functions are the same as the ones described in boundary.
Non-Static IBM
When the bodyMotion flag is not set to static inside a body’s specific dictionary, it means that the IBM can move within the domain. In this case, the additional entries reported in the following table are required. The first two entries are mandatory for all motions, while the remaining entries are specific to the type of motion.
entry |
entry type |
description |
|
vector |
center of the box enclosing the body and its motion throughout the entire simulation. |
|
vector |
size of the box enclosing the body and its motion throughout the entire simulation. |
rotation |
||
|
scalar |
angular speed in rpm. |
|
scalar |
angular acceleration in rpm per second. |
|
vector |
rotation axis (normalized by TOSCA). |
|
vector |
base of the rotation axis. |
|
scalar |
maximum radius of the body, used to compute an equivalent tip speed far from the center of rotation, thus limiting the time step so that the fastest triangular elements of the body only crosse one cell per time step. |
sinusoidal |
||
|
scalar |
motion amplitude in meters. |
|
scalar |
frequency in Hz. |
|
vector |
direction of the motion (normalized by TOSCA). |
pitchingOscillation |
||
|
scalar |
angular amplitude in degrees. |
|
scalar |
frequency in Hz. |
|
scalar |
initial angle in degrees. |
|
vector |
pitching axis (normalized by TOSCA). |
|
vector |
base of the pitching axis. |