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
trueand 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, usewrite_series.pyto 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
Function1object of type scalar. (default: 0)axis : Axis of rotation This object is a
Function1object of type vector. (default: (0 0 0))centerOfRotation : center of rotation (default: (0 0 0))
linearVelocity : translational velocity. This object is a
Function1object 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
truefixes 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
wingletCorrFieldif 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
.
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
.
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.
Home