diff --git a/theory/kernel/kernel.pdf b/theory/kernel/kernel.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b6e540dc61c36dd00e56f02e44ce33f9f91a7f01 Binary files /dev/null and b/theory/kernel/kernel.pdf differ diff --git a/theory/kernel/kernel.tex b/theory/kernel/kernel.tex new file mode 100644 index 0000000000000000000000000000000000000000..7087555d423afbe2745bb91010a17c52a32084f2 --- /dev/null +++ b/theory/kernel/kernel.tex @@ -0,0 +1,155 @@ +\documentclass[a4paper,10pt]{article} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} + +%opening +\title{SPH kernels in SWIFT} +\author{Matthieu Schaller} + +\begin{document} + +\maketitle + +\section{General Definitions} + +The smoothing kernels used in SPH are almost always isotropic and can hence be written in 3D as + +\begin{equation} + W(\vec{x},h) = \frac{1}{h^3}f\left(\frac{|\vec{x}|}{h}\right), +\end{equation} + +where $f(q)$ is a dimensionless function, usually a low-order polynomial, normalized to unity. For computational +reasons, this kernel +usually has a finite support of radius $H$. In other words, + +\begin{equation} + W(\vec{x},h) = 0\quad \forall\quad |\vec{x}| > H. +\end{equation} + One can then define the weighted number of neighbours within $H$ as + +\begin{equation} + N_{ngb} = \frac{4}{3}\pi H^3 \sum_j W(\vec{x}_i - \vec{x}_j,h). +\end{equation} + +The value of $N_{ngb}$ is often used in the codes to find the smoothing length of each particle via Newton iterations +or a bissection algorithm. $H$ is defined as \emph{the smoothing length} in the GADGET code. This definition is useful +for implementation reasons but does not really correspond to a true physical quantity. \\ +The main question is the definition of the smoothing length. The function $W(\vec{x},h)$ is invariant under the +rescaling $h\rightarrow \alpha h,~f(q)\rightarrow\alpha^{-3}f(\alpha q)$, which makes the definition of $h$ difficult. +This ambiguity is present in the litterature with authors using different definition of the \emph{physical} smoothing +length, $h=\frac{1}{2}H$ or $h=H$ for instance. \\ +A more physically motivated estimate is the standard deviation of the kernel: + +\begin{equation} + \sigma^2 = \frac{1}{3} \int \vec{x}^2~W(\vec{x},h)~d^3\vec{x} +\end{equation} + +which then allows us to set $h=2\sigma$. This definition of the smoothing length is more physical as one can +demonstrate that the reconstruction of any smooth field $A(\vec{x})$ using interpolation of particles at the point +$\vec{x}_i$ can be expanded as + +\begin{equation} +A_i \approx A(\vec{x}_i) + \frac{1}{2}\sigma^2 \nabla^2A(\vec{x}_i) + \mathcal{O}\left(\sigma^4\right). +\end{equation} + +The quantity $H/\sigma$ is independant of the choice of $h$ made and is purely a functional of $f(q)$. The number of +neighbours (used in the code to construct the neighborhood of a given particle) can then be expressed as a function of +this \emph{physical} $h$ (or $\sigma$). Or to relate it even more to the particle distribution, we can write +$h=\eta\Delta x$, with $\Delta x$ the mean inter-particle separation: + +\begin{equation} + N_{ngb} = \frac{4}{3}\pi \left(\frac{1}{2}\eta\frac{H}{\sigma}\right)^3 = \frac{4}{3}\pi +\left(\eta\zeta\right)^3 +\end{equation} + +This definition of the number of neighbours only depends on $f(q)$ (via $\zeta$) and on the mean inter-particle +separation. The problem is then fully specified by specifying a form for $f(q)$ and $\eta$. \\ +Experiments suggest that $\eta \approx 1.2 - 1.3$ is a reasonnable choice. The bigger $\eta$, the better the smoothing +and hence the better the reconstruction of the field. This, however, comes at a higher computational cost as more +interactions between neighbours will have to be computed. Also, spline kernels become instable when $\eta>1.5$. + +\section{Kernels available in SWIFT} + +The different kernels available are listed below. +\paragraph{Cubic Spline Kernel} +\begin{equation*} + f(q) = \frac{1}{\pi}\left\lbrace \begin{array}{rcl} + \frac{3}{4}q^3 - 15q^2 + 1 & \mbox{if} & 0 \leq q < 1 \\ + -\frac{1}{4}q^3 + \frac{3}{2}q^2-3q+2 & \mbox{if} & 1 \leq q < 2 \\ + 0 & \mbox{if} & q \geq 2 \\ + \end{array}\right. +\end{equation*} +with $\zeta = \frac{1}{2}\sqrt{\frac{40}{3}} \approx 1.825742$. Thus, for a resolution of $\eta = 1.235$, this kernel +uses $N_{ngb} \approx 48$. The code uses $h = \frac{1}{2}H = \zeta \sigma$ internally. + +\paragraph{Quartic Spline Kernel} +\begin{equation*} + f(q) = \frac{1}{20\pi}\left\lbrace \begin{array}{rcl} + 6q^4 - 15q^2 + \frac{115}{8} & \mbox{if} & 0 \leq q < \frac{1}{2} \\ + -4q^4 + 20q^3-30q^2 + 5q + \frac{55}{4} & \mbox{if} & \frac{1}{2} \leq q < \frac{3}{2} \\ + q^4-10q^3+\frac{75}{2}q^2-\frac{125}{2}q+\frac{625}{16} & \mbox{if} & \frac{3}{2} \leq q < +\frac{5}{2} \\ + 0 & \mbox{if} & q \geq \frac{5}{2} \\ + \end{array}\right. +\end{equation*} +with $\zeta = \frac{1}{2}\sqrt{\frac{375}{23}} \approx 2.018932$. Thus, for a resolution of $\eta = 1.235$, this kernel +uses $N_{ngb} \approx 64.9$. The code uses $h = \frac{2}{5}H =\frac{4}{5}\zeta \sigma$ internally. + +\paragraph{Quintic Spline Kernel} +\begin{equation*} + f(q) = \frac{1}{120\pi}\left\lbrace \begin{array}{rcl} + -10q^5 + 30q^4 - 60q^2 + 66 & \mbox{if} & 0 \leq q < 1 \\ + 5q^5 - 45q^4 + 150q^3 - 210q^2 + 75q + 51 & \mbox{if} & 1 \leq q < 2 \\ + -q^5 + 15q^4 - 90q^3 + 270q^2 - 405q + 243 & \mbox{if} & 2 \leq q < 3 \\ + 0 & \mbox{if} & q \geq 3 \\ + \end{array}\right. +\end{equation*} +with $\zeta = \frac{1}{2}\sqrt{\frac{135}{7}} \approx 2.195775$. Thus, for a resolution of $\eta = 1.235$, this kernel +uses $N_{ngb} \approx 83.5$. The code uses $h = \frac{1}{3}H = \frac{2}{3}\zeta \sigma$ internally. + +\paragraph{Wendland $C2$ Kernel} +\begin{equation*} + f(q) = \frac{21}{2\pi}\left\lbrace \begin{array}{rcl} + 4 q^5-15 q^4+20 q^3-10 q^2+1 & \mbox{if} & 0 \leq q < 1 \\ + 0 & \mbox{if} & q \geq 1 \\ + \end{array}\right. +\end{equation*} + with $\zeta = \frac{1}{2}\sqrt{15} \approx 1.93649$. Thus, for a resolution of $\eta = 1.235$, this kernel +uses $N_{ngb} \approx 57.3$. The code uses $h = H = 2\zeta \sigma$ internally. + + +\paragraph{Wendland $C4$ Kernel} +\begin{equation*} + f(q) = \frac{495}{32\pi}\left\lbrace \begin{array}{rcl} + \frac{35}{3} q^8-64 q^7+ 140 q^6-\frac{448}{3} q^5+70 q^4-\frac{28}{3} q^2+1 & \mbox{if} & 0 +\leq q < 1 \\ + 0 & \mbox{if} & q \geq 1 \\ + \end{array}\right. +\end{equation*} + with $\zeta = \frac{1}{2}\sqrt{\frac{39}{2}} \approx 2.20794$. Thus, for a resolution of $\eta = 1.235$, this kernel +uses $N_{ngb} \approx 84.9$. The code uses $h = H = 2\zeta \sigma$ internally. + +\paragraph{Wendland $C6$ Kernel} +\begin{equation*} + f(q) = \frac{1365}{64\pi}\left\lbrace \begin{array}{rcl} + 32 q^{11}-231 q^{10}+704 q^9-1155 q^8+1056 q^7-462 q^6+66 q^4-11 q^2+1 & \mbox{if} & 0 +\leq q < 1 \\ + 0 & \mbox{if} & q \geq 1 \\ + \end{array}\right. +\end{equation*} + with $\zeta = \frac{1}{2}\sqrt{24} \approx 2.44949$. Thus, for a resolution of $\eta = 1.235$, this kernel +uses $N_{ngb} \approx 116$. The code uses $h = H = 2\zeta \sigma$ internally. + +\section{Kernel Derivatives} + +The derivatives of the kernel function have relatively simple expressions: + +\begin{eqnarray*} + \vec\nabla_x W(\vec{x},h) &=& \frac{1}{h^4}f'\left(\frac{|\vec{x}|}{h}\right) \frac{\vec{x}}{|\vec{x}|} \\ + \frac{\partial W(\vec{x},h)}{\partial h} &=&- \frac{1}{h^4}\left[3f\left(\frac{|\vec{x}|}{h}\right) + +\frac{|\vec{x}|}{h}f'\left(\frac{|\vec{x}|}{h}\right)\right] +\end{eqnarray*} + +Note that for all the kernels listed above, $f'(0) = 0$. + +\end{document}