Rolling

Letters getting flattened by a rolling cylinder

Goals of this Unit:
  • Construct a cylinder.
  • Define its movement (translations and rotations) via curves.
  • A short excursion about BC_TearOffCriterion.
The fluid-mechanical problem The letters are flattened by a huge cylinder rolling back and forth, just like dough getting flattened by a rolling pin. We want to simulate a situation where the pin is coated in flour, thereby preventing the dough from sticking to it. We also have to take into account that the cylinder does not only do a translation but also a simultaneous rotation. Construction of the cylinder First we create an alias for the cylinder. Its boundary conditions will later be referenced by $BC_roll$ and its movement by $MOVE_roll$. We arbitrarily set its radius to 0.5.
begin_alias{} ... "roll" = " BC$BC_roll$ ACTIVE$noinit_always$ IDENT%BND_slip% MAT$Mat1$ TOUCH%TOUCH_liquid% MOVE$MOVE_roll$ LAYER0 CHAMBER1 " ... end_alias ... begin_alias{} "rRoll" = "0.5" end_alias
We need more information on the measurements of our boundary elements to construct the cylinder with the correct length and to define its movement from one edge of the plate to the opposite edge. Therefore we get the points at the lower left and upper right corners of enclosing boxes around the 3 letters and the plate respectively. With these we can define three important values.
begin_construct{} "minALL" = CONSTRUCT( %CONSTRUCT_BoxMidPoint%, 0.0, "C","F","D" ) "maxALL" = CONSTRUCT( %CONSTRUCT_BoxMidPoint%, 1.0, "C","F","D" ) "minPlate" = CONSTRUCT( %CONSTRUCT_BoxMidPoint%, 0.0, "plate" ) "maxPlate" = CONSTRUCT( %CONSTRUCT_BoxMidPoint%, 1.0, "plate" ) "rollCenter" = " [&minALL(1)&-&rRoll&] , [&minPlate(2)&] , [&maxALL(3)&+&rRoll&] " "rollTravelLength" = " [&maxALL(1)&-&minALL(1)&+2*&rRoll&]" "rollOmega" = " [ (2*3.1415926/2)*( &rollTravelLength&/(2*3.1415926*&rRoll&) ) ] " end_construct
The first is "rollCenter", which will be used as the central point of the bottom end piece (with respect to the y-axis) of the cylinder. The second is "rollTravelLength", which is the traveling distance of the cylinder. The third is "rollOmega", the angular velocity of the cylinder. Its definition means that the cylinder will do 0.5*&rollTravelLength&/&rRoll& full rotations every second. With these values we can now easily define the cylinder via the command BND_cylinder.
begin_boundary_elements{} BND_cylinder &roll& &rollCenter(1)& &rollCenter(2)& &rollCenter(3)& 0 1 0 [&maxPlate(2)&-&minPlate(2)&] &rRoll& &rRoll& 40 manipulate{"roll"} revOrient{} end_boundary_elements
It needs an alias ("roll"), the position of the central point of the bottom end piece of the cylinder (&rollCenter(1)& &rollCenter(2)& &rollCenter(3)&), a direction (0 1 0), the length of the cylinder ([&maxPlate(2)&-&minPlate(2)&]) and the radii for the bottom and the top end piece (both &rRoll&). The number 40 is given as an optional argument and determines the fineness of the resolution of the round cylinder. Defining the movement of the cylinder We define the translation and the rotation of the cylinder by two different curves. The first curve $CRV_centerOfRoll$ describes the translation of the point "rollCenter" dependent on time.
begin_curve{$CRV_centerOfRoll$}, nb_functions{4} 0.0 %MOVE_position% 0 0 0 0.1 %MOVE_position% 0 0 -0.25 2.1 %MOVE_position% &rollTravelLength& 0 -0.25 2.2 %MOVE_position% &rollTravelLength& 0 -0.375 4.2 %MOVE_position% 0 0 -0.375 4.3 %MOVE_position% 0 0 -0.4375 6.3 %MOVE_position% &rollTravelLength& 0 -0.4375 6.4 %MOVE_position% &rollTravelLength& 0 -0.46875 8.4 %MOVE_position% 0 0 -0.46875 end_curve
The point is moved from left to right and vice versa. It crosses the distance after two seconds. At the start and every time it reaches an edge, it is lowered a bit. The rotation is described by the curve $CRV_omegaOfRoll$. The direction of the rotation is changed every time "rollCenter" reaches one of the two edges.
begin_curve{$CRV_omegaOfRoll$} 0.0 0 0.1 &rollOmega& 2.1 &rollOmega& 2.2 -&rollOmega& 4.2 -&rollOmega& 4.3 &rollOmega& 6.3 &rollOmega& 6.4 -&rollOmega& 8.4 -&rollOmega& end_curve
The translation statement only concerns "rollCenter". We need to link this movement and the rotation with "roll", the actual rigid body, via a fitting MOVE statement. This can be done with the command %MOVE_TranslationRotation%. As the name suggests, it lets us combine a translational with a rotational movement for a boundary element. It needs a point on the initial center of rotation (&rollCenter(1)&, &rollCenter(2)&, &rollCenter(3)&), a MOVE statement describing the movement of this center ($MOVE_centerOfRoll$) and a vector for the angular velocity (0, curve{$CRV_omegaOfRoll$}{0}, 0).
MOVE($MOVE_centerOfRoll$) = curve{$CRV_centerOfRoll$}{0} MOVE($MOVE_roll$) = ( %MOVE_TranslationRotation%, &rollCenter(1)&, &rollCenter(2)&, &rollCenter(3)&, $MOVE_centerOfRoll$, 0, curve{$CRV_omegaOfRoll$}{0}, 0 )
About tear-off criteria MESHFREE offers its users the opportunity to create their very own tear-off criteria. Tear-off criteria determine when a boundary point becomes a free surface point. This is, for example, important when one is considering gravity effects. Boundary points that experience a strong acceleration away from their boundary elements should not be glued to these possibly stationary boundaries but rather become free surface particles instead.
BC_TearOffCriterion($BC_roll$) = ( [(Y%ind_v(3)%)] , [(Y%ind_act%-3)] )
We can define our own tear-off criteria with BC_TearOffCriterion($BC_roll$). A boundary point of $BC_roll$ becomes a free surface particle when all statements on the right hand side of the expression above are true. In our case it would mean that a boundary particle of the cylinder becomes free, when it is both moving upward and when it was active for more than three time steps. This ensures that our material is not sticking to the cylinder after being flattened. Here should be a picture
Figure 9: Rolling: Mid-simulation results.