15 
\section{RayleighTaylor Instability} 
\section{RayleighTaylor Instability} 
16 
\label{LEVELSET CHAP} 
\label{LEVELSET CHAP} 
17 


18 
In this chapter we will implement the Level Set Method in Escript for tracking the interface between two fluids for Computational Fluid Dynamics (CFD). 
In this chapter we will implement the Level Set Method in Escript for tracking the interface between two fluids for Computational Fluid Dynamics (CFD). The method is tested with a RayleighTaylor Instability problem, which is an instability of the interface between two fluids with differing densities. \\ 
19 
Normally in Earth science problems two or more fluids in a system with different properties are of interest. For example, lava dome growth in volcanology, with the contrast of the two mediums as being lava and air. The interface between the two mediums is often referred to as a free surface (free boundary value problem); the problem arises due to the large differences in densities between the lava and air, with their ratio being around 2000, and so the interface between the two fluids move with respect to each other. 
Normally in Earth science problems two or more fluids in a system with different properties are of interest. For example, lava dome growth in volcanology, with the contrast of the two mediums as being lava and air. The interface between the two mediums is often referred to as a free surface (free boundary value problem); the problem arises due to the large differences in densities between the lava and air, with their ratio being around 2000, and so the interface between the two fluids move with respect to each other. 
20 
%and so the lava with the much higher density is able to move independently with respect to the air, and the interface between the two fluids is not constrained. 
%and so the lava with the much higher density is able to move independently with respect to the air, and the interface between the two fluids is not constrained. 
21 
There are a number of numerical techniques to define and track the free surfaces. One of these methods, which is conceptually the simplest, is to construct a Lagrangian grid which moves with the fluid, and so it tracks the free surface. The limitation of this method is that it cannot track surfaces that break apart or intersect. Another limitation is that the elements in the grid can become severely distorted, resulting in numerical instability. The Arbitrary LagrangianEulerian (ALE) method for CFD in moving domains is used to overcome this problem by remeshing, but there is an overhead in computational time, and it results in a loss of accuracy due to the process of mapping the state variables every remesh by interpolation. 
There are a number of numerical techniques to define and track the free surfaces. One of these methods, which is conceptually the simplest, is to construct a Lagrangian grid which moves with the fluid, and so it tracks the free surface. The limitation of this method is that it cannot track surfaces that break apart or intersect. Another limitation is that the elements in the grid can become severely distorted, resulting in numerical instability. The Arbitrary LagrangianEulerian (ALE) method for CFD in moving domains is used to overcome this problem by remeshing, but there is an overhead in computational time, and it results in a loss of accuracy due to the process of mapping the state variables every remesh by interpolation. 
22 


23 
There is a technique to overcome these limitations called the Level Set Method, for tracking interfaces between two fluids. The advantages of the method is that CFD can be performed on a fixed Cartesian mesh, and therefore problems with remeshing can be avoided. The field equations for calculating variables such as velocity and pressure are solved on the the same mesh. The Level Set Method is based upon the implicit representation of the interface by a continuous function. The function takes the form as a signed distance function, $\phi(x)$, of the interface in a Eulerian coordinate system. For example, the zero isocontour of the unit circle $\phi(x)=x^2 + y^2 1$ is the set of all points where $\phi(x)=0$. 
There is a technique to overcome these limitations called the Level Set Method, for tracking interfaces between two fluids. The advantages of the method is that CFD can be performed on a fixed Cartesian mesh, and therefore problems with remeshing can be avoided. The field equations for calculating variables such as velocity and pressure are solved on the the same mesh. The Level Set Method is based upon the implicit representation of the interface by a continuous function. The function takes the form as a signed distance function, $\phi(x)$, of the interface in a Eulerian coordinate system. For example, the zero isocontour of the unit circle $\phi(x)=x^2 + y^2 1$ is the set of all points where $\phi(x)=0$. Refer to Figure \ref{UNITCIRCLE}. 
24 
% 
% 
25 
\begin{figure} 
\begin{figure} 
26 
\center 
\center 
27 
\scalebox{0.5}{\includegraphics{figures/unitcircle.eps}} 
\scalebox{0.7}{\includegraphics{figures/unitcircle.eps}} 
28 
\caption{Implicit representation of the curve $x^2 + y^2 = 1$.} 
\caption{Implicit representation of the curve $x^2 + y^2 = 1$.} 
29 
\label{UNITCIRCLE} 
\label{UNITCIRCLE} 
30 
\end{figure} 
\end{figure} 
31 
% 
% 
32 
The implicit representation can be used to define the interior and exterior of a fluid region. Since the isocontour at $\phi(x)=0$ has been defined as the interface, a point in the domain can be determined if its inside or outside of the interface, by looking at the local sign of $\phi(x)$. A point is inside the interface when $\phi(x)<0$, and outside the interface when $\phi(x)>0$. Parameters values such as density and viscosity can then be defined for two different mediums, depending on which side of the interface they are located. The displacement of the interface at the zero isocontour of $\phi(x)$ is calculated each time step by using the velocity field. This is achieved my solving the advection equation: 
The implicit representation can be used to define the interior and exterior of a fluid region. Since the isocontour at $\phi(x)=0$ has been defined as the interface, a point in the domain can be determined if its inside or outside of the interface, by looking at the local sign of $\phi(x)$. For example, a point is inside the interface when $\phi(x)<0$, and outside the interface when $\phi(x)>0$. Parameters values such as density and viscosity can then be defined for two different mediums, depending on which side of the interface they are located. 
33 


34 


35 

\subsection{Calculation of the Displacement of the Interface} 
36 


37 

The displacement of the interface at the zero isocontour of $\phi(x)$ is calculated each timestep by using the velocity field. This is achieved my solving the advection equation: 
38 

% 
39 
\begin{equation} 
\begin{equation} 
40 
\frac{\partial \phi}{\partial t} + \vec{v} \cdot \nabla \phi = 0, 
\frac{\partial \phi}{\partial t} + \vec{v} \cdot \nabla \phi = 0, 
41 
\label{ADVECTION} 
\label{ADVECTION} 
42 
\end{equation} 
\end{equation} 
43 

% 
44 
where $\vec{v}$ is the velocity field. The advection equation is solved using a midpoint method, which is a two step procedure: 
where $\vec{v}$ is the velocity field. The advection equation is solved using a midpoint, which is a two step procedure: 
45 


46 
Firstly, $\phi^{1/2}$ is calculated solving: 
Firstly, $\phi^{1/2}$ is calculated solving: 
47 

% 
48 
\begin{equation} 
\begin{equation} 
49 
\frac{\phi^{1/2}  \phi^{}}{dt/2} + \vec{v} \cdot \nabla \phi^{} = 0. 
\frac{\phi^{1/2}  \phi^{}}{dt/2} + \vec{v} \cdot \nabla \phi^{} = 0. 
50 
\label{MIDPOINT FIST} 
\label{MIDPOINT FIST} 
51 
\end{equation} 
\end{equation} 
52 

% 
53 
Secondly, using $\phi^{1/2}$, $\phi^{+}$ is calculated solving: 
Secondly, using $\phi^{1/2}$, $\phi^{+}$ is calculated solving: 
54 

% 
55 
\begin{equation} 
\begin{equation} 
56 
\frac{\phi^{+}  \phi^{}}{dt} + \vec{v} \cdot \nabla \phi^{1/2} = 0. 
\frac{\phi^{+}  \phi^{}}{dt} + \vec{v} \cdot \nabla \phi^{1/2} = 0. 
57 
\label{MIDPOINT SECOND} 
\label{MIDPOINT SECOND} 
58 
\end{equation} 
\end{equation} 
59 

% 
60 
For more details on the midpoint procedure see reference \cite{BOURGOUIN2006}. In certain situations the midpoint procedure has been shown to produce artifacts in the numerical solutions. A more robust procedure is to use the TaylorGalerkin scheme with the presence of diffusion, which gives more stable solutions. The expression is derived by either inserting Equation (\ref{MIDPOINT FIST}) into Equation (\ref{MIDPOINT SECOND}), or by expanding $\phi$ into a Taylor series: 
This procedure works provided that the discretization of the lefthand side of Equations (\ref{MIDPOINT FIST}) and (\ref{MIDPOINT SECOND}) is a lumped mass matrix. For more details on the midpoint procedure see reference \cite{BOURGOUIN2006}. In certain situations the midpoint procedure has been shown to produce artifacts in the numerical solutions. A more robust procedure is to use the TaylorGalerkin scheme with the presence of diffusion, which gives more stable solutions. The expression is derived by either inserting Equation (\ref{MIDPOINT FIST}) into Equation (\ref{MIDPOINT SECOND}), or by expanding $\phi$ into a Taylor series: 
61 

% 
62 
\begin{equation} 
\begin{equation} 
63 
\phi^{+} \simeq \phi^{} + dt\frac{\partial \phi^{}}{\partial t} + \frac{dt^2}{2}\frac{\partial^{2}\phi^{}}{\partial t^{2}}, 
\phi^{+} \simeq \phi^{} + dt\frac{\partial \phi^{}}{\partial t} + \frac{dt^2}{2}\frac{\partial^{2}\phi^{}}{\partial t^{2}}, 
64 
\label{TAYLOR EXPANSION} 
\label{TAYLOR EXPANSION} 
65 
\end{equation} 
\end{equation} 
66 

% 
67 
by inserting 
by inserting 
68 

% 
69 
\begin{equation} 
\begin{equation} 
70 
\frac{\partial \phi^{}}{\partial t} =  \vec{v} \cdot \nabla \phi^{}, 
\frac{\partial \phi^{}}{\partial t} =  \vec{v} \cdot \nabla \phi^{}, 
71 
\label{INSERT ADVECTION} 
\label{INSERT ADVECTION} 
72 
\end{equation} 
\end{equation} 
73 

% 
74 
and 
and 
75 

% 
76 
\begin{equation} 
\begin{equation} 
77 
\frac{\partial^{2} \phi^{}}{\partial t^{2}} = \frac{\partial}{\partial t}(\vec{v} \cdot \nabla \phi^{}) = \vec{v}\cdot \nabla (\vec{v}\cdot \nabla \phi^{}), 
\frac{\partial^{2} \phi^{}}{\partial t^{2}} = \frac{\partial}{\partial t}(\vec{v} \cdot \nabla \phi^{}) = \vec{v}\cdot \nabla (\vec{v}\cdot \nabla \phi^{}), 
78 
\label{SECOND ORDER} 
\label{SECOND ORDER} 
79 
\end{equation} 
\end{equation} 
80 

% 
81 
into Equation \ref{TAYLOR EXPANSION} 
into Equation (\ref{TAYLOR EXPANSION}) 
82 

% 
83 
\begin{equation} 
\begin{equation} 
84 
\phi^{+} = \phi^{}  dt\vec{v}\cdot \nabla \phi^{} + \frac{dt^2}{2}\vec{v}\cdot \nabla (\vec{v}\cdot \nabla \phi^{}). 
\phi^{+} = \phi^{}  dt\vec{v}\cdot \nabla \phi^{} + \frac{dt^2}{2}\vec{v}\cdot \nabla (\vec{v}\cdot \nabla \phi^{}). 
85 
\label{TAYLOR GALERKIN} 
\label{TAYLOR GALERKIN} 
86 
\end{equation} 
\end{equation} 



87 



The fluid dynamics is governed by the Stokes equations. In geophysical problems the velocity of fluids are low; that is, the inertial forces are small compared with the viscous forces, therefore the inertial terms in the NavierStokes equations can be ignored. For a body force $f$ the governing equations are given by: 

88 


89 

\subsection{Governing Equations for Fluid Flow} 
90 


91 

The fluid dynamics is governed by the Stokes equations. In geophysical problems the velocity of fluids are low; that is, the inertial forces are small compared with the viscous forces, therefore the inertial terms in the NavierStokes equations can be ignored. For a body force $f$ the governing equations are given by: 
92 

% 
93 
\begin{equation} 
\begin{equation} 
94 
\nabla \cdot (\eta(\nabla \vec{v} + \nabla^{T} \vec{v}))  \nabla p = f, 
\nabla \cdot (\eta(\nabla \vec{v} + \nabla^{T} \vec{v}))  \nabla p = f, 
95 
\label{GENERAL NAVIER STOKES} 
\label{GENERAL NAVIER STOKES} 
96 
\end{equation} 
\end{equation} 
97 

% 
98 
with the incompressibility condition 
with the incompressibility condition 
99 

% 
100 
\begin{equation} 
\begin{equation} 
101 
\nabla \cdot \vec{v} = 0. 
\nabla \cdot \vec{v} = 0. 
102 
\label{INCOMPRESSIBILITY} 
\label{INCOMPRESSIBILITY} 
103 
\end{equation} 
\end{equation} 
104 

% 
105 
where $p$, $\eta$ and $f$ are the pressure, viscosity and body forces, respectively. 
where $p$, $\eta$ and $f$ are the pressure, viscosity and body forces, respectively. 
106 
Alternatively, the Stokes equations can be represented in Einstein summation tensor notation (compact notation): 
Alternatively, the Stokes equations can be represented in Einstein summation tensor notation (compact notation): 
107 

% 
108 
\begin{equation} 
\begin{equation} 
109 
(\eta(v\hackscore{i,j} + v\hackscore{j,i})),\hackscore{j}  p,\hackscore{i} = f\hackscore{i}, 
(\eta(v\hackscore{i,j} + v\hackscore{j,i})),\hackscore{j}  p,\hackscore{i} = f\hackscore{i}, 
110 
\label{GENERAL NAVIER STOKES COM} 
\label{GENERAL NAVIER STOKES COM} 
111 
\end{equation} 
\end{equation} 
112 

% 
113 
with the incompressibility condition 
with the incompressibility condition 
114 

% 
115 
\begin{equation} 
\begin{equation} 
116 
v\hackscore{i,i} = 0. 
v\hackscore{i,i} = 0. 
117 
\label{INCOMPRESSIBILITY COM} 
\label{INCOMPRESSIBILITY COM} 
118 
\end{equation} 
\end{equation} 
119 

% 
120 
The subscript $,i$ denotes the derivative of the function with respect to $x\hackscore{i}$. A linear relationship between the deviatoric stress $\sigma^{'}\hackscore{ij}$ and the stretching $D\hackscore{ij} = \frac{1}{2}(v\hackscore{i,j} + v\hackscore{j,i})$ is defined as \cite{GROSS2006}: 
The subscript comma $i$ denotes the derivative of the function with respect to $x\hackscore{i}$. A linear relationship between the deviatoric stress $\sigma^{'}\hackscore{ij}$ and the stretching $D\hackscore{ij} = \frac{1}{2}(v\hackscore{i,j} + v\hackscore{j,i})$ is defined as \cite{GROSS2006}: 
121 

% 
122 
\begin{equation} 
\begin{equation} 
123 
\sigma^{'}\hackscore{ij} = 2\eta D^{'}\hackscore{ij}, 
\sigma^{'}\hackscore{ij} = 2\eta D^{'}\hackscore{ij}, 
124 
\label{STRESS} 
\label{STRESS} 
125 
\end{equation} 
\end{equation} 
126 

% 
127 
where the deviatoric stretching $D^{'}\hackscore{ij}$ is defined as 
where the deviatoric stretching $D^{'}\hackscore{ij}$ is defined as 
128 

% 
129 
\begin{equation} 
\begin{equation} 
130 
D^{'}\hackscore{ij} = D^{'}\hackscore{ij}  \frac{1}{3}D\hackscore{kk}\delta\hackscore{ij}. 
D^{'}\hackscore{ij} = D^{'}\hackscore{ij}  \frac{1}{3}D\hackscore{kk}\delta\hackscore{ij}. 
131 
\label{DEVIATORIC STRETCHING} 
\label{DEVIATORIC STRETCHING} 
132 
\end{equation} 
\end{equation} 
133 

% 
134 
The $\delta\hackscore{ij}$ is the Kronecker $\delta$symbol, which is a matrix with ones for its diagonal entries ($i = j$) and zeros for the remaining entries ($i \neq j$). The body force $f$ in Equation (\ref{GENERAL NAVIER STOKES COM}) is the gravity acting in the $x\hackscore{3}$ direction and is given as $f = g \rho \delta\hackscore{i3}$. 
where $\delta\hackscore{ij}$ is the Kronecker $\delta$symbol, which is a matrix with ones for its diagonal entries ($i = j$) and zeros for the remaining entries ($i \neq j$). The body force $f$ in Equation (\ref{GENERAL NAVIER STOKES COM}) is the gravity acting in the $x\hackscore{3}$ direction and is given as $f = g \rho \delta\hackscore{i3}$. 



135 
The Stokes equations is a saddle point problem, and can be solved using a Uzawa scheme. A class called StokesProblemCartesian in Escript can be used to solve for velocity and pressure. 
The Stokes equations is a saddle point problem, and can be solved using a Uzawa scheme. A class called StokesProblemCartesian in Escript can be used to solve for velocity and pressure. 
136 
In order to keep numerical stability, the time step size needs to be below a certain value, known as the Courant number. The Courant number is defined as: 
In order to keep numerical stability, the timestep size needs to be below a certain value, known as the Courant number. The Courant number is defined as: 
137 

% 
138 
\begin{equation} 
\begin{equation} 
139 
C = \frac{v \delta t}{h}. 
C = \frac{v \delta t}{h}. 
140 
\label{COURANT} 
\label{COURANT} 
141 
\end{equation} 
\end{equation} 
142 

% 
143 

where $\delta t$, $v$, and $h$ are the timestep, velocity, and the width of an element in the mesh, respectively. The velocity $v$ may be chosen as the maximum velocity in the domain. In this problem the Courant number is taken to be 0.4 \cite{BOURGOUIN2006}. 
144 



where $\delta t$, $v$, and $h$ are the time step, velocity, and the width of an element in the mesh, respectively. The velocity $v$ may be chosen as the maximum velocity in the domain. In this problem the Courant number is taken to be 0.4 \cite{BOURGOUIN2006}. 

145 


146 
As the computation of the distance function progresses, it becomes distorted, and so it needs to be updated in order to stay regular. This process is known as the reinitialization procedure. The aim is to iteratively find a solution to the reinitialization equation: 
\subsection{Reinitialization of Interface} 
147 


148 

As the computation of the distance function progresses, it becomes distorted, and so it needs to be updated in order to stay regular \cite{SUSSMAN1994}. This process is known as the reinitialization procedure. The aim is to iteratively find a solution to the reinitialization equation: 
149 

% 
150 
\begin{equation} 
\begin{equation} 
151 
\frac{\partial \psi}{\partial \tau} + sign(\psi)(1  \nabla \psi) = 0. 
\frac{\partial \psi}{\partial \tau} + sign(\phi)(1  \nabla \psi) = 0. 
152 
\label{REINITIALISATION} 
\label{REINITIALISATION} 
153 
\end{equation} 
\end{equation} 
154 

% 
155 

where $\psi$ shares the same level set with $\phi$, $\tau$ is pseudo time, and $sign(\phi)$ is the smoothed sign function. This equation is solved to meet the definition of the level set function, $\lvert \nabla \psi \rvert = 1$; the normalization condition. Equation (\ref{REINITIALISATION}) can be rewritten in similar form to the advection equation: 
156 

% 
157 

\begin{equation} 
158 

\frac{\partial \psi}{\partial \tau} + \vec{w} \cdot \nabla \psi = sign(\phi), 
159 

\label{REINITIALISATION2} 
160 

\end{equation} 
161 

% 
162 

where 
163 

% 
164 

\begin{equation} 
165 

\vec{w} = sign(\phi)\frac{\nabla \psi}{\nabla \psi}. 
166 

\label{REINITIALISATION3} 
167 

\end{equation} 
168 

% 
169 

$\vec{w}$ is the characteristic velocity pointing outward from the free surface. Equation (\ref{REINITIALISATION2}) can be solved by a similar technique to what was used in the advection step; either by the midpoint technique \cite{BOURGOUIN2006} or the TaylorGalerkin procedure. For the midpoint technique, the reinitialization technique algorithm is: 
170 


171 

1. Calculate 
172 

% 
173 

\begin{equation} 
174 

\vec{w} = sign(\phi)\frac{\nabla \psi}{\nabla \psi}, 
175 

\label{REINITIAL MIDPOINT1} 
176 

\end{equation} 
177 

% 
178 


179 

2. Calculate $\psi^{1/2}$ solving 
180 

% 
181 

\begin{equation} 
182 

\frac{\psi^{1/2}  \psi^{}}{d\tau/2} + \vec{w} \cdot \nabla \psi^{}= sign(\phi), 
183 

\label{REINITIAL MIDPOINT2} 
184 

\end{equation} 
185 

% 
186 


187 

3. using $\psi^{1/2}$, calculate $\psi^{+}$ solving 
188 

% 
189 

\begin{equation} 
190 

\frac{\psi^{+}  \psi^{}}{d\tau} + \vec{w} \cdot \nabla \psi^{1/2}= sign(\phi), 
191 

\label{REINITIAL MIDPOINT3} 
192 

\end{equation} 
193 

% 
194 


195 
where $\tau$ is artificial time. This equation is solved to meet the definition of the level set function, $\lvert \nabla \psi \rvert = 1$; the normalization condition. However, it has been shown that in using this reinitialization procedure it is prone to mass loss and inconsistent positioning of the interface \cite{SUCKALE2008}. 
4. if the convergence criterion has not been met, go back to step 2. Convergence is declared if 
196 

% 
197 

\begin{equation} 
198 

\nabla \psi \hackscore{\infty}  1 < \epsilon \hackscore{\psi}. 
199 

\label{REINITIAL CONVERGE} 
200 

\end{equation} 
201 

% 
202 

where $\epsilon$ is the convergence tolerance. Normally, the reinitialization procedure is performed every third timestep of solving the Stokes equation. 
203 


204 

The midpoint technique works provided that the lefthand side of Equations (\ref{REINITIAL MIDPOINT2}) and (\ref{REINITIAL MIDPOINT3}) is a lumped mass matrix. Alternatively, for a onestep procedure, the reinitialization equation can be given by: 
205 

% 
206 

\begin{equation} 
207 

\psi^{+} = \psi^{}  \tau \vec{w} \cdot \nabla \psi^{} + \frac{d \tau^{2}}{2} \vec{w} \cdot \nabla(\vec{w} \cdot \nabla \psi^{}). 
208 

\label{REINITIAL ONESTEP} 
209 

\end{equation} 
210 

% 
211 

The accuracy of $\phi$ is only needed within the transition zone; and so it can be calculated in a narrow band between the interface of the fluids. 
212 

% 
213 

\begin{figure} 
214 

\center 
215 

\scalebox{0.45}{\includegraphics{figures/LevelSetFlowChart.eps}} 
216 

\caption{Flow chart of level set procedure \cite{LIN2005}.} 
217 

\label{LEVELSET FLOWCHART} 
218 

\end{figure} 
219 

% 
220 

When the distance function, $\phi$, is calculated, the physical parameters, density and viscosity, are updated using the sign of $\phi$. The jump in material properties between two fluids, such as air and water can be extreme, and so the transition of the properties from one medium to another is smoothed. The region of the interface is assumed to be of finite thickness of $\alpha h$, where $h$ is the size of the elements in the computational mesh and $\alpha$ is a smoothing parameter. The parameters are updated by the following expression: 
221 

% 
222 

\begin{equation} 
223 

P = 
224 

\left \{ \begin{array}{l} 
225 

P\hackscore{1} \hspace{5cm} where \ \ \psi <  \alpha h \\ 
226 

P\hackscore{2} \hspace{5cm} where \ \ \psi > \alpha h \\ 
227 

(P\hackscore{2}  P\hackscore{1}) \psi/2\alpha h + (P\hackscore{1} + P\hackscore{2})/2 \ \ \ \ \ \ where \ \ \psi < \alpha h. 
228 

\end{array} 
229 

\right. 
230 

\label{UPDATE PARAMETERS} 
231 

\end{equation} 
232 

% 
233 

where the subscripts $1$ and $2$ denote the different fluids. The procedure of the level set calculation is shown in Figure \ref{LEVELSET FLOWCHART}. 
234 

Further work is needed in the reinitialization procedure, as it has been shown that it is prone to mass loss and inconsistent positioning of the interface \cite{SUCKALE2008}. 
235 


236 
The RayleighTaylor instability problem is used as a benchmark to validate CFD implementations \cite{VANKEKEN1997}. Figure \ref{RT2DSETUP} shows the setup of the problem. A rectangular domain with two different fluids is considered, with the greater density fluid on the top and the lighter density fluid on the bottom. The viscosities of the two fluids are equal (isoviscos). An initial perturbation is given to the interface of $\phi=0.02cos(\frac{\pi x}{\lambda}) + 0.2$. The aspect ratio, $\lambda = L/H = 0.9142$, is chosen such that it gives the greatest disturbance of the fluids. 
\subsection{Benchmark Problem} 
237 


238 

The RayleighTaylor instability problem is used as a benchmark to validate CFD implementations \cite{VANKEKEN1997}. Figure \ref{RT2DSETUP} shows the setup of the problem. A rectangular domain with two different fluids is considered, with the greater density fluid on the top and the lighter density fluid on the bottom. The viscosities of the two fluids are equal (isoviscous). An initial perturbation is given to the interface of $\phi=0.02cos(\frac{\pi x}{\lambda}) + 0.2$. The aspect ratio $\lambda = L/H = 0.9142$ is chosen such that it gives the greatest disturbance of the fluids. 
239 

% 
240 
\begin{figure} 
\begin{figure} 
241 
\center 
\center 
242 
\scalebox{0.7}{\includegraphics{figures/RT2Dsetup.eps}} 
\scalebox{0.7}{\includegraphics{figures/RT2Dsetup.eps}} 
243 
\caption{Parameters, initial interface and boundary conditions for the RayleighTaylor instability problem. The interface is defined as $\phi=0.02cos(\frac{\pi x}{\lambda}) + 0.2$. The fluids have been assigned different densities and equal viscosity (isovisous).} 
\caption{Parameters, initial interface and boundary conditions for the RayleighTaylor instability problem. The interface is defined as $\phi=0.02cos(\frac{\pi x}{\lambda}) + 0.2$. The fluids have been assigned different densities and equal viscosity (isoviscous) \cite{BOURGOUIN2006}.} 
244 
\label{RT2DSETUP} 
\label{RT2DSETUP} 
245 
\end{figure} 
\end{figure} 
246 


247 
%The Level Set Method can be applied to many areas of science, for example simulating subduction zones in geophysics, motion of bubbles, and flame propagation. Its also used in image processing. However, the Level Set Method does have limitations. The level set function can still become irregular after reinitialisation, leading to artifacts in the simulations, requiring more thought into the implementation of the reinitialisation step. 
%The Level Set Method can be applied to many areas of science, for example simulating subduction zones in geophysics, motion of bubbles, and flame propagation. Its also used in image processing. However, the Level Set Method does have limitations. The level set function can still become irregular after reinitialisation, leading to artifacts in the simulations, requiring more thought into the implementation of the reinitialisation step. 
248 


249 

\begin{python} 
250 


251 

from esys.escript import * 
252 

import esys.finley 
253 

from esys.escript.models import StokesProblemCartesian 
254 

from esys.finley import finley 
255 

from LevelSet import * 
256 


257 

#physical properties 
258 

rho1 = 1000 #fluid density on bottom 
259 

rho2 = 1010 #fluid density on top 
260 

eta1 = 100.0 #fluid viscosity on bottom 
261 

eta2 = 100.0 #fluid viscosity on top 
262 

penalty = 100.0 
263 

g=10.0 
264 


265 

#solver settings 
266 

dt = 0.001 
267 

t_step = 0 
268 

t_step_end = 2000 
269 

TOL = 1.0e5 
270 

max_iter=400 
271 

verbose=True 
272 

useUzawa=True 
273 


274 

#define mesh 
275 

l0=0.9142 
276 

l1=1.0 
277 

n0=100 
278 

n1=100 
279 


280 

mesh=esys.finley.Rectangle(l0=l0, l1=l1, order=2, n0=n0, n1=n1) 
281 

#get mesh dimensions 
282 

numDim = mesh.getDim() 
283 

#get element size 
284 

h = Lsup(mesh.getSize()) 
285 

print "element size",h 
286 


287 

#level set parameters 
288 

tolerance = 1.0e6 
289 

reinit_max = 30 
290 

reinit_each = 3 
291 

alpha = 1 
292 

smooth = alpha*h 
293 


294 

#boundary conditions 
295 

x = mesh.getX() 
296 

#left + bottom + right + top 
297 

b_c = whereZero(x[0])*[1.0,0.0] + whereZero(x[1])*[1.0,1.0] + whereZero(x[0]l0)*[1.0,0.0] + whereZero(x[1]l1)*[1.0,1.0] 
298 


299 

velocity = Vector(0.0, ContinuousFunction(mesh)) 
300 

pressure = Scalar(0.0, ContinuousFunction(mesh)) 
301 

Y = Vector(0.0,Function(mesh)) 
302 


303 

#define initial interface between fluids 
304 

xx = mesh.getX()[0] 
305 

yy = mesh.getX()[1] 
306 

func = Scalar(0.0, ContinuousFunction(mesh)) 
307 

h_interface = Scalar(0.0, ContinuousFunction(mesh)) 
308 

h_interface = h_interface + (0.02*cos(math.pi*xx/l0) + 0.2) 
309 

func = yy  h_interface 
310 

func_new = func.interpolate(ReducedSolution(mesh)) 
311 


312 

#Stokes cartesian 
313 

solution=StokesProblemCartesian(mesh,debug=True) 
314 

solution.setTolerance(TOL) 
315 

solution.setSubProblemTolerance(TOL**2) 
316 


317 

#level set 
318 

levelset = LevelSet(mesh, func_new, reinit_max, reinit_each, tolerance, smooth) 
319 


320 

while t_step <= t_step_end: 
321 

#update density and viscosity 
322 

rho = levelset.update_parameter(rho1, rho2) 
323 

eta = levelset.update_parameter(eta1, eta2) 
324 


325 

#get velocity and pressue of fluid 
326 

Y[1] = rho*g 
327 

solution.initialize(fixed_u_mask=b_c,eta=eta,f=Y) 
328 

velocity,pressure=solution.solve(velocity,pressure,max_iter=max_iter,verbose=verbose,useUzawa=useUzawa) 
329 


330 

#update the interface 
331 

func = levelset.update_phi(velocity, dt, t_step) 
332 


333 

print "##########################################################" 
334 

print "time step:", t_step, " completed with dt:", dt 
335 

print "Velocity: min =", inf(velocity), "max =", Lsup(velocity) 
336 

print "##########################################################" 
337 


338 

#save interface, velocity and pressure 
339 

saveVTK("phi2D.%2.4i.vtu"%t_step,interface=func,velocity=velocity,pressure=pressure) 
340 

#courant condition 
341 

dt = 0.4*Lsup(mesh.getSize())/Lsup(velocity) 
342 

t_step += 1 
343 


344 

\end{python} 