Goals of this Unit:
-
- Set up RIGIDBODY collisions for the CFD letters
The fluid-mechanical problem
The CFD letters are modeled as
RIGIDBODY wherein there can possibly be an interaction between the different letters or also between the letters and the box.
We examine two cases:
-
- The structural rigid body movement without any point cloud is modeled.
- The fluid-structure interaction problem, where the fluid forces are also mapped onto the rigid body.
Setting up the pure rigid body structural movement without any point cloud
The letters fall into the box purely under gravitational forces using the
%MOVE_rigid% flag for the letters. This is triggered in the setup by the alias "ONLY_BEMOVEMENT". If set to true, MESHFREE only computes the geometric movement of the CFD letters without creating a point cloud.
"ONLY_BEMOVEMENT" = "true"
During the simulation, the letters eventually come into contact with the box. To enable contact detection between different rigid bodies, set
RIGIDBODY_UseCollisionModel > 0. In general, collision detection is computationally expensive, since all surface triangulations must be checked for possible intersections at every time step. Alternatively, simplified geometric representations such as line segments or point sets can be used for collision detection, see
RIGIDBODY_UseCollisionModel.
Here, the CFD letters are discretized using surface triangulations. Therefore, the parameter
RIGIDBODY_UseCollisionModel is set to 1, which activates collision detection based on the triangulated surfaces. The governing equations for the contact force evaluation are described in
RIGIDBODY_interaction. Collision parameters can be specified individually for each pair of interacting bodies or defined in a generic (global) manner for all potential interactions.
RIGIDBODY_UseCollisionModel = 1
# enable/disable collision detection
begin_alias{}
"elasticRepulsion" = "0.5"
# Elastic repulsion parameter controlling collision/oscillation damping
"play" = "0.0"
# JOINTS ONLY: maximum clearance between link/contact locations below which no force is applied (F_ij = 0 if x^ij < play)
"contactTime" = "0.01"
# the time within which the user requests resolution of intersections or stressed joints
"ExplicitImplicit" = "1"
# if ==1 then explicit time integration is performed. IMPLICIT TIME INTEGRATION IS EXPERIMENTAL
"frictionCoefficient" = "0.0"
# Coulomb-type friction at collisions/intersections. CURRENTLY NOT USED FOR JOINTS
end_alias
RIGIDBODY_interaction(1) = ( "F", "D",
&elasticRepulsion&,
&play&,
&contactTime&,
&ExplicitImplicit&,
&frictionCoefficient& )
RIGIDBODY_interaction(2) = ( "C", "F",
&elasticRepulsion&,
&play&,
&contactTime&,
&ExplicitImplicit&,
&frictionCoefficient& )
RIGIDBODY_interaction(3) = ( "C", "D",
&elasticRepulsion&,
&play&,
&contactTime&,
&ExplicitImplicit&,
&frictionCoefficient& )
RIGIDBODY_interaction(4) = ( "C", "box*",
&elasticRepulsion&,
&play&,
&contactTime&,
&ExplicitImplicit&,
&frictionCoefficient& )
RIGIDBODY_interaction(5) = ( "F", "box*",
&elasticRepulsion&,
&play&,
&contactTime&,
&ExplicitImplicit&,
&frictionCoefficient& )
RIGIDBODY_interaction(6) = ( "D", "box*",
&elasticRepulsion&,
&play&,
&contactTime&,
&ExplicitImplicit&,
&frictionCoefficient& )
where "*" represent wildcards. The setup defines one-to-one contact for different letters and the box, which allows independent tuning of the contact definitions. The normal and the tangential contact forces can be controlled with the alias definitions of elasticRepulsion, contact time, and frictional coefficients.
Another key aspect for collisions to work are the settings for the rigid body time integration, see
RIGIDBODY_TimeIntegrationVersion. For collision models, only version 2 works, i.e.
RIGIDBODY_TimeIntegrationVersion = 2. It is also possible to define the minimum number of substeps, or the absolute minimum time for the rigid body solver. Here, the following values are chosen.
The letters collide with the box for the first time around t = 0.1s, see the screenshot below.
Figure: Screenshot of the simulation result at t = 0.1s, where the letters are almost in contact with the box
For postprocessing, the minimum and maximum nodal positions in z-direction are examined for the letters and the box with the help of the following
INTEGRATION statements:
INTEGRATION(
$INT_MaxBE_Letters_PositionZ$) = (
%MAXIMUM_BE%, [BEpos(3,1)],
$PPC$,
$PPF$,
$PPD$, %INTEGRATION_Header%, "MaxZ_BECoordinates_Letters" )
INTEGRATION(
$INT_MinBE_Letters_PositionZ$) = (
%MINIMUM_BE%, [BEpos(3,-1)],
$PPC$,
$PPF$,
$PPD$, %INTEGRATION_Header%, "MinZ_BECoordinates_Letters" )
INTEGRATION(
$INT_MaxBE_Box_PositionZ$) = (
%MAXIMUM_BE%, [BEpos(3,1)],
$PPbox$, %INTEGRATION_Header%, "MaxZ_BECoordinates_box" )
INTEGRATION(
$INT_MinBE_Box_PositionZ$) = (
%MINIMUM_BE%, [BEpos(3,-1)],
$PPbox$, %INTEGRATION_Header%, "MinZ_BECoordinates_box" )
INTEGRATION(
$INT_DifferenceZmax$) = (
%PUBLICVALUE%, [integ(
$INT_MaxBE_Box_PositionZ$) - integ(
$INT_MaxBE_Letters_PositionZ$)], %INTEGRATION_Header%, "Zmax_Coordinates_Difference" )
INTEGRATION(
$INT_DifferenceZmin$) = (
%PUBLICVALUE%, [integ(
$INT_MinBE_Box_PositionZ$) - integ(
$INT_MinBE_Letters_PositionZ$)], %INTEGRATION_Header%, "Zmin_Coordinates_Difference" )
Using QuickMonitor (see
PrePostProcessing) or any other postprocessing tool, the result can be visualized. The below figure clearly illustrates the bouncing effect of the letters as they come in contact with the box.
Figure: The difference between the minimum z-coordinate of the box and the letters is plotted over time
The fluid structure interaction (FSI) problem
To study the FSI problem, set "ONLY_BEMOVEMENT" = "false". Then, MESHFREE solves the flow field and maps the resulting fluid forces acting on the structure. The keyword
RIGIDBODY_ForceToApplyOnBody_PC provides a mechanism to control how fluid forces are transferred from the fluid domain to the letters. In particular, it allows temporal filtering of fluctuating pressure fields by specifying what fraction of the instantaneous pressure should be applied at the current time step, while the remaining contribution is obtained from a time-averaged value. Here, 5 percent of the pressure values from the current time step are used, while 95 percent are taken from the filtered (time-averaged) pressure field:
RIGIDBODY_ForceToApplyOnBody_PC(
$MOVE_C$) = ( [Y
%ind_p%], [Y%indU_pdynFilter] )
RIGIDBODY_ForceToApplyOnBody_PC(
$MOVE_F$) = ( [Y
%ind_p%], [Y%indU_pdynFilter] )
RIGIDBODY_ForceToApplyOnBody_PC(
$MOVE_D$) = ( [Y
%ind_p%], [Y%indU_pdynFilter] )
INTEGRATION(
$INT_pdynFilter$) = (
%ASSIGN_FUNCTIONVALUE%, %indU_pdynFilter%, ...
[ (Y%indU_pdynFilter%) * (
&PressureFilteringParameter&) + (Y
%ind_p_dyn%)*(
&PressureFilteringParameter&)],
$Mat1$ )
begin_alias{}
"PressureFilteringParameter" = "0.05"
end_alias