Curvature and surface tension force

Interfacial curvature is often needed to describe the surface tension force. Although not directly relevant to the volume-of-fluid method, here I briefly explain how it is computed.

Mathematically speaking, the surface tension force (only normal component is considered, and the tangential components are ignored) is given by

\[\frac{1}{We} \kappa \delta n_i,\]

which is approximated as

\[\frac{1}{We} \kappa \der{\phi}{x_i},\]

where \(\phi\) is the volume-of-fluid.

The pre-factor (inverse of \(We\)) is computed in the initialisation process:

src/interface/init.c
78double We = 0.;
79if(0 != config.get_double("We", &We)) return 1;
80interface->tension = 1. / We;

\(\kappa\) is the local mean curvature, whose definition is

\[\kappa \equiv -\der{n_i}{x_i}.\]

In this project, this is directly evaluated using the normal vectors computed at the cell corners, i.e.:

\[\begin{split}\vat{\kappa}{\pic, \pjc} & = -\vat{\der{n_x}{x}}{\pic, \pjc} -\vat{\der{n_y}{y}}{\pic, \pjc} \\ & \approx -\frac{\vat{n_x}{\pip, \pjc} - \vat{n_x}{\pim, \pjc}}{\vat{\Delta x}{\pic}} -\frac{\vat{n_y}{\pic, \pjp} - \vat{n_y}{\pic, \pjm}}{ \Delta y }.\end{split}\]

The right-hand-side terms have already been computed in the previous step.

src/interface/curvature_tensor.c
312const double dnxdx = 1. / dx * (
313    - DVOF(i  , j  )[0] + DVOF(i+1, j  )[0]
314    - DVOF(i  , j+1)[0] + DVOF(i+1, j+1)[0]
315);
316const double dnydy = 1. / dy * (
317    - DVOF(i  , j  )[1] - DVOF(i+1, j  )[1]
318    + DVOF(i  , j+1)[1] + DVOF(i+1, j+1)[1]
319);
320CURV(i, j) = 0.5 * (
321  - dnxdx
322  - dnydy
323);
src/interface/curvature_tensor.c
332const double dnxdx = 1. / dx * (
333    - DVOF(i  , j  , k  )[0] + DVOF(i+1, j  , k  )[0]
334    - DVOF(i  , j+1, k  )[0] + DVOF(i+1, j+1, k  )[0]
335    - DVOF(i  , j  , k+1)[0] + DVOF(i+1, j  , k+1)[0]
336    - DVOF(i  , j+1, k+1)[0] + DVOF(i+1, j+1, k+1)[0]
337);
338const double dnydy = 1. / dy * (
339    - DVOF(i  , j  , k  )[1] - DVOF(i+1, j  , k  )[1]
340    + DVOF(i  , j+1, k  )[1] + DVOF(i+1, j+1, k  )[1]
341    - DVOF(i  , j  , k+1)[1] - DVOF(i+1, j  , k+1)[1]
342    + DVOF(i  , j+1, k+1)[1] + DVOF(i+1, j+1, k+1)[1]
343);
344const double dnzdz = 1. / dz * (
345    - DVOF(i  , j  , k  )[2] - DVOF(i+1, j  , k  )[2]
346    - DVOF(i  , j+1, k  )[2] - DVOF(i+1, j+1, k  )[2]
347    + DVOF(i  , j  , k+1)[2] + DVOF(i+1, j  , k+1)[2]
348    + DVOF(i  , j+1, k+1)[2] + DVOF(i+1, j+1, k+1)[2]
349);
350CURV(i, j, k) = 0.25 * (
351  - dnxdx
352  - dnydy
353  - dnzdz
354);

As a result, the surface tension force in the \(x\) direction is described as

\[\vat{f_x^{st}}{\pip, \pjc} \approx \frac{1}{We} \frac{ \vat{\kappa}{\pipp, \pjc} + \vat{\kappa}{\pic, \pjc} }{2} \frac{ \vat{\phi}{\pipp, \pjc} - \vat{\phi}{\pic, \pjc} }{\vat{\Delta x}{\pip}}.\]

Same applies to the other directions.

\(x\) direction:

src/interface/force.c
29const double dx = DXC(i  );
30const double grad = 1. / dx * (
31    - VOF(i-1, j  )
32    + VOF(i  , j  )
33);
34const double kappa = 0.5 * (
35    + CURV(i-1, j  )
36    + CURV(i  , j  )
37);
38IFRCX(i, j) = tension * grad * kappa;
src/interface/force.c
46const double dx = DXC(i  );
47const double grad = 1. / dx * (
48    - VOF(i-1, j  , k  )
49    + VOF(i  , j  , k  )
50);
51const double kappa = 0.5 * (
52    + CURV(i-1, j  , k  )
53    + CURV(i  , j  , k  )
54);
55IFRCX(i, j, k) = tension * grad * kappa;

\(y\) direction:

src/interface/force.c
81const double grad = 1. / dy * (
82    - VOF(i  , j-1)
83    + VOF(i  , j  )
84);
85const double kappa = 0.5 * (
86    + CURV(i  , j-1)
87    + CURV(i  , j  )
88);
89IFRCY(i, j) = tension * grad * kappa;
src/interface/force.c
 97const double grad = 1. / dy * (
 98    - VOF(i  , j-1, k  )
 99    + VOF(i  , j  , k  )
100);
101const double kappa = 0.5 * (
102    + CURV(i  , j-1, k  )
103    + CURV(i  , j  , k  )
104);
105IFRCY(i, j, k) = tension * grad * kappa;

\(z\) direction:

src/interface/force.c
130const double grad = 1. / dz * (
131    - VOF(i  , j  , k-1)
132    + VOF(i  , j  , k  )
133);
134const double kappa = 0.5 * (
135    + CURV(i  , j  , k-1)
136    + CURV(i  , j  , k  )
137);
138IFRCZ(i, j, k) = tension * grad * kappa;

Note

Here I adopt a very simple approach, but more accurate evaluation of the surface curvature is a challenging problem and not conclusive at all. See Popinet, Annu. Rev. Fluid Mech. (50), 2018 for instance.