CFD calculation of the organ key touch



First, let’s describe what we want to build. Organ pallet is placed inside large box with under long rectangular hole. Pallet’s rotation axis is near hole’s end. Wind chest hole length varies between stops and organs, so let’s take length 300mm and width 12mm. The pallet itself will be 318mm in length and 30mm width, placed below the hole.

Obviously, our case is symmetric along the pallet’s vertical middle plane. It allows using symmetry plane boundary conditions in the case. Also pallet’s bottom surface and space below it can be excluded, if we assume pressure inside the wind chest to be zero.


The case is just a 3x4x6 array of boxes with some ones excluded. The top blocks line is a hole (strictly, the half of hole) in the chest. Three other “floors” are chest internal area. It has 2x1x4 (in blocks) cut that is pallet surface.


The whole mesh is 35mm width and 358mm long. The top blocks are 6mm wide, corresponding to 12mm chest hole. The bottom cut is 15mm wide. As about heights, they vary with the pallet descend value, labelled as d1 on the draw. Rear block height d2 is about 0.1 of d1.


All blocks have non-uniform grading. Cell sizes are smaller near walls and larger in free air.

Boundary conditions

There are four boundaries:
* walls – pallet and chest surfaces
* inlet – air inside chest
* outlet – atmosphere
* symmPl – symmetry plane through pallet’s middle


Air flow is pressure-driven, so inlet and outlet BC have the fixed pressure and zeroGradient velocity. As for other fields, they are token from OpenFOAM tutorials. I am not sure they are absolutely right, but I hope…

Here is the whole boundary condition table:

walls inlet outlet symmPl
p zeroGradient fixedValue -700 zeroGradient symmetryPlane
U fixedValue (0 0 0) zeroGradient symmetryPlane
epsilon epsilonWallFunction 7.65e-4 zeroGradient zeroGradient symmetryPlane
k kqWallFunction zeroGradient zeroGradient symmetryPlane
nut nutkWallFunction calculated 0 calculated 0 symmetryPlane


Our case should be run multiple times with different pallet descend values. OpenFOAM has a family of dynamic mesh solvers, but it is too hard to learn it. Instead, lets create new folder result with standard OpenFOAM case structure. Then just run the solver multiple times. After each run, copy all fields to the folder result/[d], where [d] means pallet’s descend value. Also copy constant/polyMesh/points file to the result/[d]/polyMesh folder. ParaView will read these points and update scene for each time step.

These steps is done with the next script


# Pallet descend values
for d in '0.0125' '0.025' '0.05' '0.075' '0.1'
do  b=$(echo "scale=3;$d/10.0" | bc)

  # Generate mesh
  m4 -D dFront=$d -D dBack=$b constant/polyMesh/blockMeshDict.m4 > constant/polyMesh/blockMeshDict
  blockMesh >blockMesh.log
  if [ "$?" -ne "0" ]; then
    echo 'Error in blockMesh' $?

  # Remove iteration folders except '0'
  ls | grep -P '^[0-9]*[1-9][0-9]*$' | xargs rm -r -d
  simpleFoam >log
  if [ $? -ne 0 ]; then
    echo 'Error in simpleFoam' $?

  # Create resulting folder.
  # -p key created all parent folders if need
  mkdir -p result/$d/polyMesh
  # Find directory of the last iteration
  lastdir=$(ls | grep -P '^[0-9]+' | xargs printf '%05d\n' | sort | tail -n 1)
  # Remove trailing spaces
  ld=$(echo $lastdir | sed 's/^0*//')
  echo "Diameter $d processed with $ld iterations"
  # Copy fields and points
  cp -r $ld/* result/$d
  cp -r constant/polyMesh/points result/$d/polyMesh/

cp -r constant result
echo >result/case.foam



Resulting torque is shown on the plot. Red line represents computation results, green line shows predicted values near pallet closed state. Right axis shows a force in kilograms that is created at the pallet’s free end.

As you can see, the maximum torque 0.46 Nm is achieved at 1mm pallet descend. During further pallet descending, the torque decreases to 0.225 Nm.

As for pallet closing, the simulation is stable only to 0.125mm. But we can find torques for less values by hands.

When pallet is totally closed, the atmosphere pressure is uniformly distributed at the chest hole. The torque is found as
\int_0^l p w z dz = p w \frac{l^2}{2} = 700 \times 0.006 \times 0.3^2 \times \frac{1}{2} = 0.189 N/m

When pallet is almost, but not fully, closed, pressure remains uniformly distributed at the hole, and changes linearly from -700 to 0 between pallet and chest board, as shown on the figure. The torque created can be found as
700\times 0.06\times\frac{0.3^2}{2} + 700\times 0.009\times \frac{1}{2} \times\frac{0.3^2}{2} = 700\times 0.0105\times\frac{0.3^2}{2} = 0.33N/m

To get the force in kg at the pallet’s end, lets divide the torque on the pallet length and gravity acceleration. Also don’t forget to double the result, because we simulated only the half of the pallet:
W = \frac{2\times T}{0.3\times 9.81}

The pallet’s weight is shown on the plot. Red line represents simulation results, green line shows predicted values near pallet closing.

Now we can describe the force at the pallet’s end in different positions:

  • closed: 128g
  • touched: 224g
  • 1mm: 312g
  • open: 152g

Hmm… too large… The only reason I can see is pipe hole influence. Maybe, the pressure above the pallet is not equal to atmosphere, but larger, because pipe holes resists to air escape from the chest.


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s