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
which is approximated as
where \(\phi\) is the volume-of-fluid.
The pre-factor (inverse of \(We\)) is computed in the initialisation process:
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
In this project, this is directly evaluated using the normal vectors computed at the cell corners, i.e.:
The right-hand-side terms have already been computed in the previous step.
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);
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
Same applies to the other directions.
\(x\) direction:
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;
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:
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;
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:
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.