Purpose

Implementation of the Immersed Boundary Method for arbitrary geometries moving with pre-defined mootion.

Warning

GPU support for this model or solver has not been tested and may not work as expected.

IBMeshMotion

Syntax

Defined in couplingProperties dictionary.

meshMotionModel IBMeshMotion;
IBMeshMotionProps
{
    permeability         scalar;
    integrateForce       Switch;
    alpha                scalar;
    postProcessing       Switch;
    postProcessingInterval scalar;
    applyExistingSmoothing Switch;
    verbose              Switch;

    meshes
    {
        mesh1
        {
            surfaceName      word;
            enableVolumeMeshCorrection Switch;
            rotations        dictionaryList;
            linearVelocity   Function1<vector>;
            wigglePeriod     scalarList;
            wigglePhaseShift scalarList;
            wiggleAmplitude  vectorList;
            volumeMesh       scalar;
            invariant        Switch;
            startMotionAtTime scalar;
            stopMotionAtTime  scalar;
            periodicLength   vector;

            wingletRmin      scalar;
            pitchAngle       scalar;
        }
    }
}
  • permeability : Additional permeability for the IB body. Scales the force with the invese of this parameter. This parameter is only considered if integrateForce false. This parameter may severely affect stability. (default: 1)

  • integrateForce : Switch how the IB force is calculated. (default: true)

  • alpha : relaxation parameter in the range [0; 1]. This parameter determines blending between current force field and the force field required to force the fluid into motion with the geometry. This parameter may severely affect stability. (default: 0.5)

  • postProcessing : set if to compute forces and torques on the surface(s) (default: true)

  • postProcessingInterval : set interval of force/ torque computation in simulation time units (default: 10 time steps)

  • applyExistingSmoothing : if set true and if constDiffSmoothing model is used, then the IB body field is smoothed. The same smoothing length as defined for the particles will be applied. (default: true)

  • verbose : flag for output of additional fields, mostly for debugging (default: false)

  • writeMeshes : flag to write (moving) meshes for visualization. All moving meshes are written in to a folder meshesOverTime, use write_series.py to create a time series easily usable in ParaView. (default: false)

The sub-dict meshes contains settings for all defined surfaces, one subdict per surface is required. Each sub-dict must have a unique name. Possible settings for each surface:

  • surfaceName : STL file defining the surface, including the path to a file.

  • enableVolumeMeshCorrection : sets if to correct the mesh volume (default: false)

  • rotations : list of dictionaries decribing mesh rotations. In case of several entries rotations are superposed. Each dictionary in this list may contain the following settings:

    • omega : Angular velocity in RPM This object is a Function1 object of type scalar. (default: 0)

    • axis : Axis of rotation This object is a Function1 object of type vector. (default: (0 0 0))

    • centerOfRotation : center of rotation (default: (0 0 0))

  • linearVelocity : translational velocity. This object is a Function1 object of type vector. (default: (0 0 0))

  • wigglePeriod : period of a wiggle motion x = x_start + wiggleAmplitude * sin(2*pi/wigglePeriod*t + wigglePhaseShiftDeg*pi/180) (default: (0)) Note: this property is a list allowing for superposition of a series of wiggle motions. Note: the same motion can be done in DEM using the ‘viblin’ mesh_module with pi/2 phase shift,, or the ‘wiggle’ mesh_module.

  • wigglePhaseShift : phase shift of a wiggle motion in degrees (default: (0))

  • wiggleAmplitude : displacement amplitude of a wiggle motion (default: ((0 0 0)))

  • volumeMesh : volume enclosed by the STL (default: 0)

  • invariant : switch if mesh moves. Setting to true fixes the mesh in space and eliminates the computational effort resulting from mesh movement. (default: false)

  • startMotionAtTime : start mesh motion at this point in time, i.e. mesh is invariant before (default: simulation startTime)

  • stopMotionAtTime : stop mesh motion at this point in time, i.e. mesh is invariant after (default: simulation endTime)

  • periodicLength : Sets if a linear mesh motion is mapped across periodic boundaries (default: (0 0 0))

  • wingletRmin : Minimum radius for winglet. Below the radius there is no correction, above the radius the pitch correction is applied. (default: 0)

  • pitchAngle : Pitch angle of the winglet in degrees. (double check by looking at wingletCorrField if you produce upward or downward velocity! Otherwise adapt the sign of the angle). (default: 0)

Examples

meshMotionModel IBMeshMotion;
IBMeshMotionProps
{
    alpha         0.5;
    postProcessing true;
    postProcessingInterval 0.01;

    meshes
    {
        sphere
        {
            surfaceName  "constant/triSurface/sphere.stl";
            rotations
            (
                {
                omega        60;
                axis         (1 0 0);
                centerOfRotation (5 5 5);
                }
            );
        }
    }
}

An Example with two meshes moving with different settings:

meshMotionModel IBMeshMotion;
IBMeshMotionProps
{
    meshes
    {
        sphere1
        {
            surfaceName  "constant/triSurface/sphere.stl";
            rotations
            (
                {
                omega        60;
                axis         (1 0 0);
                centerOfRotation (5 5 5);
                }
            );
        }
        sphere2
        {
            surfaceName  "constant/triSurface/sphere.stl";
            rotations
            (
                {
                omega        20;
                axis         (0 0 1);
                centerOfRotation (0 0 0);
                }
            );
        }
    }
}

An Example using the winglet correction:

meshMotionModel IBMeshMotion;
IBMeshMotionProps
{
    meshes
    {
        wing
        {
            surfaceName "constant/triSurface/wing.stl";
            rotations
            (
                {
                omega        60;
                axis         (1 0 0);
                centerOfRotation (5 5 5);
                }
            );
            wingletRmin 0.1;
            pitchAngle  -20;
        }
    }
}

Description

The IBMeshMotionModel resolves a moving object in the domain using the Immersed Boundary Method.

Depending on the setting for integrateForce, this model will calculate the IB force differently:

  • integrateForce true: Integrate the force over time:

    Uo = inside * ( ((-body) + 1.) * U + body * Uo)
    f  = inside * f + body * alpha / dt * (Uo - U)

    This formulation of the force term performs well for low Reynolds numbers.

  • integrateForce false: Under-relax the calucalted force term for this time step:

    f = (1. - alpha) * f + alpha * body * (Uo - U) / ( dt * permeability )

    This formulation of the force term performs well for high Reynolds numbers.

The additional winglet correction adds a lift component, which is calculated as \vec{\omega} \tan(\mathit{pitchAngle}).

With the postProcessing switch being active, this model will ouptut the forces and torques acting on each mesh at the given postProcessingInterval. Data is written to postProcessing/IBMeshMotion/<simStartTime>/logForces_<meshName>.dat.

The periodicLength sets if and when meshes are mapped across periodic boundaries. For non-zero components the mesh is snapped back by the periodic length once it has been translated by a value equal or larger than the periodic length. Both, check and snapping, are applied componentwise.

Note

For the periodicLength setting, there are no checks in place if the boundaries are set to cyclic.

The applied mapping considers only translational motion components.

The translated mesh is assumed to extend beyond the simulation domain by at least the periodic length. If the mesh extent is too small, mesh sections may suddenly appear and disappear.

Restrictions

Note

The winglet correction in its current implementation is only valid for rotating meshes. It is therefore only applied to meshes with \left| \vec{\omega} \right| > 0.

Note

cfdemSolverChem requires binary STL files. These can be created by running the OpenFOAM command:

surfaceConvert mesh.stl mesh.stlb

Consequently, mesh.stlb must then be used as surface definition in the IBmeshMotionProps dictionary.

Warning

In case the CFD mesh is fine enough to properly resolve the winglet’s geometry, using the winglet correction might lead to an overestimation of the winglet’s aerodynamic force.

Warning

When using in combination with turbulence models, the user is advised to set the turbulence fields (e.g., k and epsilon for the k-epsilon model) equal to zero inside the immersed body. This can be done using the fvConstraints dictionary as follows:

limitTurbulence
{
    type            limitField;
    selectionMode   all;
    limitFieldName  "body";
    limitAboveValue 0.5;
    fieldValues
    {
        epsilon     0.0;
        k         0.0;
    }
 }

Without this adjustment, it has been demonstrated that the aerodynamic force experienced by a rapidly-rotating immersed body (e.g., impeller) is considerably overestimated in comparison to an equivalent simulation performed using the Arbitrary Mesh Interface (AMI) method.