% !TEX root = main.tex
\chapter{Kinematics of fluids}

We will study fluid motion. There are two possible descriptions of the flow, Eulerian (throgh a velocity field) and Lagrangian (following the particles as they move). We will use the first one.

\section{Acceleration of a fluid particle}

The change in velocity of the fluid particle results from the explicit variation of the velocity field with time, if the flow is non-stationary, and the probing of the velocity field by the particle, if the field is non-uniform.

$$ \frac{d \vec{v}}{dt} = \frac{\partial \vec{v}}{\partial t} + (\vec{v} \cdot \vec{\nabla} ) \vec{v} $$

The first term is the Lagrangian derivative (how the velocity of the fluid particle changes in time), the second is the temporal change of the velocity at a fixed location (Eulerian derivative), and the third the temporal change of the velocity at a fixed time (convective derivative).

\section{Some definitions}

\begin{itemize}
  \index{Stream!line}
  \item \textbf{Streamlines:} field lines of the vector field $\vec{v} (\vec{r}, t)$. They are defined as the tangents, at every point, to the velocity vector $\vec{v}$. This condition can be expressed as $d\vec{r} \parallel \vec{v}$. A small displacement along the line is co-linear with $\vec{v}$.

  \index{Stream!tube}
  \item \textbf{Stream tubes:} set of streamlines which pass through a closed space curve. It is a conduct of impermeable walls with infinitessimal cross-section.

  \index{Particle trajectory}
  \item \textbf{Particle trajectories:} path that a fluid particle follows in time. It is also a set of successive positions through which the fluid particle passes as it moves. We obtain the particle trajectories by integrating with respect to time the Lagrangian velocity,

  $$ \vec{r} (t) = \vec{r}_0 + \int_{t_0}^t \vec{v}(\vec{r}_0,t') dt'. $$

  \index{flow,!Stationary}
  \item \textbf{Stationary flow:} the velocity doesn't depend on time, this is,

  $$ \frac{\partial \vec{v}}{\partial t} = 0. $$

  \index{Flow rate}
  \item \textbf{Flow rate:} the flow rate (or rate of flow) in area $A$ is defined as:
  \[ Q := \int_A \vec{v} \cdot \dif \vec{S}. \]
\end{itemize}

\begin{obs}
  If a flow is stationary, then the streamlines and path lines coincide. In general, they don't.
\end{obs}

\section{Deformations in flows}
In fluid mechanics, the concepts of strain rate (change, per unit time, of the quantity under consideration) and rate of rotation replace those, for solids, of strain and rotation.

\begin{defi}[Velocity gradient tensor]
  We define the \textbf{velocity gradient tensor}, $\TT{G}$, as

  $$ G_{ij} = \frac{\partial v_i}{\partial x_j} \to \TT{G} = \operatorname{grad} \vec{v} $$
\end{defi}

We can decompose it into symmetric and antisymmetric parts. $\TT{e}$ gives the rate of strain (pure deformation rate). It is symmetric by definition, and gives information about elongations and dilations.

$\TT{w}$ gives the rate of rotation. It is antisymmetric by definition.

$$ w_{ij} = \frac{1}{2}\left(\frac{\partial v_i}{\partial x_j} - \frac{\partial v_j}{\partial x_i}\right) $$

\begin{defi}[Vortex vector]
  We can associate a dual vector to this antisymmetric part: the \textbf{vortex vector}, which is a local angular velocity of rotation of the fluid element.

  $$ \vec{\Omega} = \frac{1}{2} \vec{\nabla} \times \vec{v} = \frac{1}{2} \vec{w} \to \Omega_i = \frac{1}{2} \varepsilon_{ijk} (-w_{jk}), $$
  where $w = \vec{\nabla} \times \vec{v} $ is the vorticity.
\end{defi}

We can decompose $\TT{e}$ into spherical and deviatoric parts:
$$ \TT{e} = \operatorname{sph} (\TT{e}) + \operatorname{dev} (\TT{e}) = \TT{t} + \TT{d}, $$
where $\TT{t} = \frac{1}{3}\delta_{ij} e_{ll}$ gives the volume rate of expansion of the elements of the fluid, and $\TT{d} = e_{ij} - \frac{1}{3}\delta_{ij} e_{ll}$ gives the deformation rates at constant volume of the flow elements.

In summary, $G_{ij} = t_{ij} + d_{ij} + w_{ij}$. $t_{ij}$ is a diagonal tensor representing the change in volume of fluid elements. It is zero for incompressible fluids. $d_{ij}$ is a non-trace symmetric tensor related to the deformations of fluid elements at constant volume, and $w_{ij}$ is an antisymmetric tensor representing the solid-body rotation of fluid elements.

\section{The stream function}

It allows simplifying the treatment of the vector velocity field $\vec{v}$ of an incompressible fluid for the case where it only depends on two coordinates (2D flows or axisymmetric flows).

\index{Potential vector}
Since $\vec{\nabla} \cdot (\vec{\nabla} \times \vec{A}) = 0$ (all curls are solenoidal) we can introduce a vector function $\vec{A}$ that fulfills $\vec{v} = \vec{\nabla} \times \vec{A}$. This is the potential vector.

Let's see how we can define the stream function in the two cases.

\subsection{2D flows}
We'll suppose that $\vec{v} = (v_x(x, y), v_y(x, y), 0)$, and also that the flow is incompressible. This means:
\[ \div \vec{v} = \partial_x v_x + \partial_y v_y = 0. \]

\index{Stream!function}
This is automatically satisfied if $v_x = \partial_y \psi$ and $v_y = - \partial_x \psi$. The scalar function $\psi(x, y)$ is called the \underline{stream function}.

In this case, the vector potential is $\vec{A} = \psi \hat{e}_z$.

In polar coordinates $(r, \phi)$, incompressibility implies:
\[ \begin{cases}
  v_r = \frac{1}{r} \partial_\phi \psi, \\
  v_\phi = - \partial_r \psi.
\end{cases} \]

\begin{obs}
  Properties:

  \begin{itemize}
    \item The $\psi = \text{const.}$ lines coincide with the streamlines.
    \item $\Delta \psi = \psi_2 - \psi_1$ represents the flow rate of fluid in a stream tube of rectangular cross-section located between streamlines $\psi = \psi_1$ and $\psi = \psi_2$ and unit depth in the $z$-direction.

    This shows the flow rate in such a stream tube is constant everywhere along the tube.
  \end{itemize}
\end{obs}

\subsection{Axisymmetric flows}
\index{Stokes'!stream function}
Axisymmetric flows are flows with an axis of symetry relative to which the velocity field is rotationally invariant. In this context, $\psi$ is called the \underline{Stokes' stream function}.

\begin{itemize}
  \item \underline{Cylindrical symmetry}: In cylindrical coordinates $(r, \phi, z)$, when $\vec{v}$ is independent of $\phi$:
  \[ \div \vec{v} = 0 \implies \begin{cases}
    v_r = \frac{1}{r} \partial_z \psi, \\
    v_z = - \frac{1}{r} \partial_r \psi.
  \end{cases} \]

  \item \underline{Spherical symmetry}: In spherical coordinates $(r, \theta, \phi)$, when $\vec{v}$ is independent of $\phi$:
  \[ \div \vec{v} = 0 \implies \begin{cases}
    v_r = \frac{1}{r^2 \sin \theta} \partial_\theta \psi, \\
    v_\phi = - \frac{1}{r \sin \theta} \partial_r \psi.
  \end{cases} \]
\end{itemize}

\begin{obs}
  Note for axisymmetric flows, $\psi$ has units of $\text{velocity} \cdot \text{area}$ ($\si{\meter\cubed\per\second}$, ``flow rate'') while for 2D flows, it has units of $\text{velocity} \cdot \text{area}$ ($\si{\meter\squared\per\second}$, ``flow rate'' per unit length).
\end{obs}

\section{Circulation and vorticity}
\begin{defi}[Circulation of a velocity field]
  Given vector field $\vec{v}(\vec{r}, t)$, we define its \underline{circulation}, at an instant $t$ along curve $C$ (which could be closed or not) as the line integral of the velocity field:
  \[ \int_C \vec{v} \cdot \dif \vec{l}, \]
  and its value depends, in general, of $C$, and its starting and ending points.
\end{defi}

\begin{prop}
  Let's consider the case in which $C$ is a closed path. In this case:
  \[ \Gamma = \oint_C \vec{v} \cdot \dif \vec{l} \notate[X]{{}={}}{1.25}{\scriptstyle \text{Stokes' theorem}} \int_A (\curl \vec{v}) \cdot \dif \vec{S} = \int_A \vec{\omega} \cdot \dif \vec{S}, \]
  where $A$ is a surface containing the curve $C$ as a boundary.

  The circulation per unit area along a path around a given point equals the component of the vorticity $\vec{\omega}$ normal to the planar surface containing the path. That is, the vorticity $\vec{\omega}$ represents the circulation around the unit area perpendicular to $\vec{\omega}$.
\end{prop}

\begin{defi}[Vorticity tube]
  A vorticity tube is a volume from which vorticity lines (the lines parallel to the vorticity field) don't come in or out.
\end{defi}

\begin{defi}
  \index{flow,!Rotational}\index{flow,!Irrotational}
  If $\vec{\omega} = 0 \, \forall \vec{r}$, the flow is called \underline{irrotational}; otherwise, it is called \underline{rotational}.

  Note that if $\vec{\omega} \neq 0$ but constant, we can use a coordinate system that rotates at angular speed $\vec{\Omega} = \frac{\vec{\omega}}{2}$ in which the flow is irrotational.
\end{defi}

\subsection{Rotational flow}
$\curl \vec{v} = \vec{\omega}(\vec{r}, t)$ is a vector field that can be represented using vorticity lines and tubes.

\[ \div \vec{\omega} = \div (\curl \vec{v}) = 0, \]
which means that $\vec{\omega}$ is solenoidal. There are no sources or sinks of $\vec{\omega}$. Hence, vorticity lines close onto themselves or expand the limits of our system.

Also, we have that the flux across closed surface A is:
\[ \oint_A \vec{\omega} \cdot \dif \vec{S} \notate[X]{{}={}}{1.25}{\scriptstyle \text{Gauss theorem}} \int_V (\div \vec{\omega}) \, \dif V' = 0. \]

Considering a vorticity tube between surface elements $\dif S_1$ and $\dif S_2$, we then see that $\omega_1 \dif S_1 = \omega_2 \dif S_2$. Hence, the vorticity flux is the same across all surface elements of the vorticity tube.

\subsection{Irrotational flow}
\index{Velocity potential}
In this case, $\vec{\omega} = \curl \vec{v} = 0$ everywhere. Since $\curl (\div \Phi) = 0$ always, we can write $\vec{v} = \grad \Phi$. We call $\Phi$ the \underline{velocity potential}.

\begin{prop}
  In irrotational flows, the circulation of the velocity field along a curve can be expressed in terms of the velocity potential as:
  \[ \int_\alpha^\beta \vec{v} \cdot \dif \vec{l} = \Phi_\beta - \Phi_\alpha. \]

  Thus:
  \[ \Phi(\vec{r}) = \Phi(\vec{r_0}) + \int_{\vec{r_0}}^{\vec{r}} \vec{v} \cdot d\vec{l}. \]

  Furthermore, if $A$ is a simply connected surface and its boundary $\partial A$ is a curve $C$, then:
  \[ \oint_{C} \vec{v} \cdot \dif \vec{l} = 0. \]
\end{prop}

\begin{obs}
  Equipotential surfaces ($\Phi = \text{const.}$) are by definition such that $\vec{v}$ is perpendicular to them.
\end{obs}

\begin{prop}
  If the flow is incompressible ($\div \vec{v} = 0$), then $\Phi$ satisfies Laplace's equation:
  \[ 0 = \div \vec{v} = \div (\curl \Phi) = \laplacian \Phi. \]
\end{prop}
