1 \documentclass[12pt]{article}
4 \usepackage{amsmath,amssymb}
8 \title{Two Dimensional Euler Simulation}
11 S.J. Montgomery-Smith\\
12 Department of Mathematics\\
13 University of Missouri\\
14 Columbia, MO 65211, U.S.A.\\
15 stephen@math.missouri.edu\\
16 http://www.math.missouri.edu/\~{}stephen}
18 \date{September 10, 2000}
22 This document describes a program I wrote to simulate the
23 two dimensional Euler Equation --- a program that is part
24 of the {\tt xlock} screensaver as the {\tt euler2d}
25 mode. A similar explanation may also be found in the
26 book by Chorin \cite{C}.
28 \section{The Euler Equation}
30 The Euler Equation describes the motion of an incompressible
31 fluid that has no viscosity. If the fluid is contained
32 in a domain $\Omega$ with boundary $\partial \Omega$, then
33 the equation is in the vector field $u$ (the velocity)
35 scalar field $p$ (the pressure):
37 \frac{\partial}{\partial t} u &=& -u \cdot \nabla u + \nabla p \\
38 \nabla \cdot u &=& 0 \\
39 u \cdot n &=& 0 \quad \text{on $\partial \Omega$}
41 where $n$ is the unit normal to $\partial \Omega$.
45 It turns out that it can be easier write these equations
46 in terms of the vorticity. In two dimensions the vorticity
47 is the scalar $w = \partial u_2/\partial x - \partial u_1/\partial y$.
48 The equation for vorticity becomes
49 \[ \frac{\partial}{\partial t} w = -u \cdot \nabla w .\]
50 A solution to this equation can be written as follows. The velocity
51 $u$ causes a flow, that is, a function $\varphi(t,x)$ that tells where
52 the particle initially at $x$ ends up at time $t$, that is
54 \frac\partial{\partial t} \varphi(t,x)
55 = u(t,\varphi(t,x)) .\]
57 for $w$ tells us that the vorticity is ``pushed'' around by the flow,
58 that is, $w(t,\varphi(t,x)) = w(0,x)$.
60 \section{The Biot-Savart Kernel}
62 Now, once we have the vorticity, we can recover the velocity $u$ by
65 \partial u_2/\partial x - \partial u_1/\partial y &=& w \\
66 \nabla \cdot u &=& 0 \\
67 u \cdot n &=& 0 \quad \text{on $\partial \Omega$}.
69 This equation is solved by using a Biot-Savart kernel $K(x,y)$:
70 $$ u(x) = \int_\Omega K(x,y) w(y) \, dy .$$
71 The function $K$ depends upon the choice of domain. First let us consider
72 the case when $\Omega$ is the whole plane (in which case the boundary
73 condition $u \cdot n = 0$ is replaced by saying that $u$ decays at infinity).
76 K(x,y) = K_1(x,y) = c \frac{(x-y)^\perp}{|x-y|^2} .
78 Here $x^\perp = (-x_2,x_1)$, and $c$ is a constant, probably something
79 like $1/2\pi$. In any case we will set it to be one, which in effect
80 is rescaling the time variable, so we don't need to worry about it.
82 We can use this as a basis to find $K$ on the unit disk
83 $\Omega = \Delta = \{x:|x|<1\}$. It turns out to be
85 K_2(x,y) = K_1(x,y) - K_1(x,y^*) ,
87 where $y^* = y/|y|^2$ is called the reflection of $y$ about the
88 boundary of the unit disk.
90 Another example is if we have a bijective analytic function
91 $p:\Delta \to {\mathbb C}$, and we let $\Omega = p(\Delta)$.
92 (Here we think of $\Delta$ as a subset of $\mathbb C$, that is,
93 we are identifying the plane with the set of complex numbers.)
95 \[ K_p(p(x),p(y)) = K_2(x,y)/|p'(x)|^2 .\]
96 Our simulation considers the last case. Examples of such
97 analytic functions include series
98 $p(x) = x + \sum_{n=2}^\infty c_n x^n$, where
99 $\sum_{n=2}^\infty n |c_n| \le 1$.
100 (Thanks to David Ullrich for pointing this out to me.)
102 \section{The Simulation}
104 Now let's get to decribing the simulation. We assume a rather
105 unusual initial distribution for the vorticity --- that the
106 vorticity is a finite sum of dirac delta masses.
107 \[ w(0,x) = \sum_{k=1}^N w_k \delta(x-x_k(0)) .\]
108 Here $x_k(0)$ is the initial place where the points
109 of vorticity are concentrated, with values $w_k$.
110 Then at time $t$, the vorticity becomes
111 \[ w(t,x) = \sum_{k=1}^N w_k \delta(x-x_k(t)) .\]
112 The points of fluid $x_k(t)$ are pushed by the
113 flow, that is, $x_k(t) = \varphi(t,x_k(0))$, or
114 \[ \frac{\partial}{\partial t} x_k(t) = u(t,x_k(t)) .\]
115 Putting this all together, we finally obtain the equations
116 \[ \frac{\partial}{\partial t} x_k = \alpha_k \]
118 \[ \alpha_k = \sum_{l=1}^N w_l K(x_k,x_l) .\]
119 This is the equation that our simulation solves.
121 In fact, in our case, where the domain is $p(\Delta)$,
122 the points are described by points
123 $\tilde x_k$, where $x_k = p(\tilde x_k)$. Then
127 \frac{\partial}{\partial t} \tilde x_k &=& \tilde\alpha_k \\
129 \tilde\alpha_k &=& \frac1{|p'(\tilde x_k)|^2}
130 \sum_{l=1}^N w_l K_2(\tilde x_k,\tilde x_l) .
133 We solve this $2N$ system of equations using standard
134 numerical methods, in our case, using the second order midpoint method
135 for the first step, and thereafter using the second order Adams-Bashforth
136 method. (See for example the book
137 by Burden and Faires \cite{BF}).
139 \section{The Program - Data Structures}
141 The computer program solves equation (\ref{tildex-p1}), and displays
142 the results on the screen, with a boundary. All the information
143 for solving the equation and displaying the output is countained
144 in the structure {\tt euler2dstruct}. Let us describe some of
145 the fields in {\tt euler2dstruct}.
146 The points $\tilde x_k$ are contained
147 in {\tt double *x}: with the coordinates of
148 $\tilde x_k$ being the two numbers
149 {\tt x[2*k+0]}, {\tt x[2*k+1]}. The values $w_k$ are contained
150 in {\tt double *w}. The total number of points is
151 {\tt int N}. (But only the first {\tt int Nvortex} points
152 have $w_k \ne 0$.) The coefficients of the analytic function
153 (in our case a polynomial) $p$
154 are contained in {\tt double p\_coef[2*(deg\_p-1)]} --- here
155 {\tt deg\_p} is the degree of $p$, and the real and imaginary
156 parts of the coefficient
157 $c_n$ is contained in {\tt p\_coef[2*(n-2)+0]} and {\tt p\_coef[2*(n-2)+1]}.
159 \section{Data Initialization}
161 The program starts in the function {\tt init\_euler2d}. After allocating
162 the memory for the data, and initialising some of the temporary variables
163 required for the numerical solving program, it randomly assigns the
164 coefficients of $p$, making sure that $\sum_{n=2}^{\tt deg\_p} n |c_n| = 1$.
165 Then the program figures out how to draw the boundary, and what rescaling
166 of the data is required to draw it on the screen. (This uses the
167 function {\tt calc\_p} which calculates $p(x)$.)
169 Next, it randomly assigns the initial values of $\tilde x_k$. We want
170 to do this in such a way so that the points are uniformly spread over the
171 domain. Let us first consider the case when the domain is the unit circle
172 $\Delta$. In that case the proportion of points that we would expect
173 inside the circle of radius $r$ would be proportional to $r^2$. So
175 \[ r = \sqrt{R_{0,1}},\quad \theta = R_{-\pi,\pi}, \quad
176 \tilde x_k = r (\cos \theta, \sin \theta) .\]
177 Here, and in the rest of this discussion, $R_{a,b}$ is a function
178 that returns a random variable uniformly distributed over the interval
181 This works fine for $\Delta$, but for $p(\Delta)$, the points
182 $p(\tilde x_k)$ are not uniformly distributed over $p(\Delta)$,
183 but are distributed with a density proportional to
184 $1/|p'(\tilde x_k)|^2$. So to restore the uniform density we need
185 to reject this value of $\tilde x_k$ with probability proportional
186 to $|p'(\tilde x_k)|^2$. Noticing that the condition
187 $\sum_{n=2}^{\tt deg\_p} n |c_n| = 1$ implies that
188 $|p'(\tilde x_k)| \le 2$, we
189 do this by rejecting if $|p'(\tilde x_k)|^2 < R_{0,4}$.
190 (This makes use of the function {\tt calc\_mod\_dp2} which calculates
193 \section{Solving the Equation}
195 The main loop of the program is in the function {\tt draw\_euler2d}.
196 Most of the drawing operations are contained in this function, and
197 the numerical aspects are sent to the function {\tt ode\_solve}.
198 But there is an aspect of this that I would like
199 to discuss in the next section, and so we will look at a simple method for
200 numerically solving differential equations.
203 (nothing to do with the Euler Equation), is as
204 follows. Pick a small number $h$ --- the time step (in
205 the program call {\tt delta\_t}). Then we approximate
206 the solution of the equation:
208 \label{method-simple}
209 \tilde x_k(t+h) = \tilde x_k(t) + h \tilde\alpha_k(t) .
211 The more sophisticated methods we use are variations of
212 the Euler Method, and so the discussion in the following section
215 In the program, the quantities $\tilde\alpha_k$, given by
216 equations (\ref{tildex-p2}) are calculated by the function
218 (which in turns calls {\tt calc\_all\_mod\_dp2} to
219 calculate $|p'(\tilde x_k)|^2$ at all the points).
222 \section{Subtle Perturbation}
224 Added later: the scheme described here seems to not be that effective,
225 so now it is not used.
227 One problem using a numerical scheme such as the Euler Method occurs
228 when the points $\tilde x_k$ get close to the boundary
229 of $\Delta$. In that case, it is possible that the new
230 points will be pushed outside of the boundary. Even if they
231 are not pushed out of the boundary, they may be much closer
232 or farther from the boundary than they should be.
233 Our system of equations is very sensitive to how close points
234 are to the boundary --- points with non-zero vorticity
235 (``vortex points'') that are close to the boundary travel
236 at great speed alongside the boundary, with speed that is
237 inversely proportional to the distance from the boundary.
239 A way to try to mitigate this problem is something that I call
240 ``subtle perturbation.''
242 the unit disk to points in the plane using the map
244 F(x) = f(|x|) \frac x{|x|} ,
246 where $f:[0,1]\to[0,\infty]$ is an increasing continuous
247 bijection. It turns out that a good choice is
251 (The reason for this is that points close to each other
253 about $r$ from the boundary will be pushed around so that
254 their distance from each other is about multiplied by the
255 derivative of $\log r$, that is, $1/r$.)
256 Note that the inverse of this function is given by
258 F^{-1}(x) = f^{-1}(|x|) \frac x{|x|} ,
262 f^{-1}(t) = 1-e^{-t} .
265 So what we could do is the following: instead of working with
266 the points $\tilde x_k$, we could work instead with the points
267 $y_k = F(\tilde x_k)$. In effect this is what we do.
268 Instead of performing the computation (\ref{method-simple}),
269 we do the calculation
271 y_k = F(\tilde x_k(t)) + h {\cal A}(\tilde x_k) \tilde\alpha_k(t)
274 ${\cal A}(x)$ is the matrix of partial derivatives of $F$:
285 \left(\frac{f'(|x|)}{|x|} - \frac{f(|x|)}{|x|^2}\right)
288 x_{1}^2 & x_{1} x_{2}\\
289 x_{1} x_{2} & x_{2}^2
295 \tilde x_k(t+h) = F^{-1}(y_k).
297 These calculations are done in the function {\tt perturb}, if
298 the quantity {\tt SUBTLE\_PERTURB} is set.
300 \section{Drawing the Points}
302 As we stated earlier, most of the drawing functions are contained
303 in the function {\tt draw\_euler2d}. If the variable
304 {\tt hide\_vortex} is set (and the function {\tt init\_euler2d}
305 will set this with probability $3/4$), then we only display
306 the points $\tilde x_k$ for ${\tt Nvortex} < k \le N$. If
307 {\tt hide\_vortex} is not set, then the ``vortex points''
308 $\tilde x_k$ ($1 \le k \le {\tt Nvortex}$) are displayed in white.
309 In fact the points $p(\tilde x_k)$ are what are put onto the screen,
310 and for this we make use of the function {\tt calc\_all\_p}.
312 \section{Addition to Program: Changing the Power Law}
314 A later addition to the program adds an option {\tt eulerpower},
315 which allows one to change the power law that describes how
316 the vortex points influence other points. In effect, if this
317 option is set with the value $m$, then the Biot-Savart Kernel
319 $$ K_1(x,y) = \frac{(x-y)^\perp}{|x-y|^{m+1}}, $$
321 $$ K_2(x,y) = K_1(x,y) - |y|^{1-m} K_1(x,y) .$$
322 So for example, setting $m=2$ corresponds to the
323 quasi-geostrophic equation. (I haven't yet figured out
324 what $K_p$ should be, so if $m \ne 1$ we use the unit circle
327 \begin{thebibliography}{9}
329 \bibitem{BF} Richard L. Burden, J. Douglas Faires, Numerical Analysis,
330 sixth edition, Brooks/Cole, 1996.
332 \bibitem{C} Alexandre J. Chorin, Vorticity and Turbulence,
333 Applied Mathematical Sciences, Vol 103, Springer Verlag, 1994.
335 \end{thebibliography}