\documentclass[twocolumn, 10pt]{article} \usepackage{geometry} \geometry{ a4paper, total={6.85in, 9.92in}, top=16mm, bottom=29mm, left=18mm, right=18mm, } % show page frame \usepackage{showframe} \usepackage[utf8]{inputenc} \usepackage{hyperref} \usepackage{listings} \usepackage{float} \usepackage{tikz} \usepackage{forest} \usepackage{scrextend} \usepackage{caption} \usepackage{subfig} \pagenumbering{gobble} \title{Accelerating simulations by clustering bodies using the Barnes-Hut algorithm\vspace{-5mm}} \author{Paged Out!} \makeatletter \newcommand{\fsize}{\f@size pt } \newcommand{\textFontName}{\f@family} \renewcommand{\maketitle}{ \begin{flushleft} {\noindent\Huge\bf\@title}\break \end{flushleft} } \makeatother \begin{document} \twocolumn[ \vspace{-3mm}\maketitle ] In a space with \( n \)-bodies, there are \( n-1 \) forces acting on each body. When simulating the forces acting on all the bodies, \( n \cdot (n-1) \) forces need to be calculated for estimating the new position of the individual bodies. With a big enough amount of bodies, this gets problematic. Let's take a real galaxy with \( 2 \cdot 10^{8} \) Stars. The total amount of forces that need to be calculated are \( 4 \cdot 10^{16} \). The amount of forces that need to be calculated can be reduced by utilizing the Barnes-Hut algorithm clustering the bodies resulting in much less calculations. \begin{figure}[H] \centering \begin{tikzpicture} \tikzstyle{circlestyle}=[shape=circle,thick,fill,draw, inner sep=0cm] \node at (0, 0) {}; \node at (9, 0) {}; % Random seed for RNG \pgfmathsetseed{7}; \foreach \x in {1,...,40} { % Find random numbers \pgfmathrandominteger{\a}{10}{390} \pgfmathrandominteger{\b}{10}{390} % Scale numbers nicely \pgfmathparse{0.005*\a}\let\a\pgfmathresult; \pgfmathparse{0.005*\b}\let\b\pgfmathresult; % draw the circle \fill (\a, \b) circle (0.03); }; % draw a box around the star cluster \draw[] (0,0) rectangle (2, 2); \node[] at (1, 1) (A1) {}; \draw[arrows=<->] (0,-0.2) -- node[midway, align=center, below] {\(d\)} (2,-0.2); % draw a star in the far right of the image \node[circlestyle, minimum size=2pt, label=above:\(s_1\)] at (8, 1) (A2) {}; % draw a line in between the box and the far right of the image \draw[dashed, arrows=<->] (A1) -- node[midway, align=center, above] {\(r\)} (A2); \end{tikzpicture} \end{figure} ~\\[-1.5cm] \begin{figure}[H] \centering \begin{tikzpicture} \tikzstyle{circlestyle}=[shape=circle,thick,fill,draw, inner sep=0cm] \node at (0, 0) {}; \node at (9, 0) {}; % draw a big star in the far left of the image \node[circlestyle, minimum size=2pt, label=above:\(q_1\)] at (1, 0) (B1) {}; % draw the right star \node[circlestyle, minimum size=2pt, label=above:\(s_1\)] at (8, 0) (B2) {}; % draw a line in between the far left star and the right star \draw[dashed, arrows=<->] (B1) -- node[midway, align=center, above] {\(r\)} (B2); \end{tikzpicture} \label{subfig:grouped} \caption{A cluster of stars that is far enough away from a single star can be abstracted as a single point in space.} \end{figure} \begin{equation} \label{eqn:barnes-hut} \theta = \frac{d}{r} \end{equation} The above equation describes how to cluster the stars. If a body is far away (\( >> r\)) from a small cluster (\( << d \) ), \( \theta \) get's very small and the cluster in which the body is located can be abstracted to a single point. By defining a \( \theta \) as a threshold, we can define what clusters we take into effect when calculating the forces acting on a single star. In order to do so, the space in which the objects are defined needs to be subdivided into cells. Such a subdivision can be seen in Figure \ref{fig:cells}. %\begin{figure}[H] %\hspace{1.5cm} %%\begin{minipage}{0.35\linewidth} %\begin{tikzpicture}[level 1/.style={level distance=1.5cm}] % % First Layer % \draw [line width=0.5mm] (0, 0) rectangle (6, 6); % % % Second Layer % \draw [line width=0.25mm] (0, 0) rectangle (3, 3); % \draw [line width=0.25mm] (3, 0) rectangle (6, 3); % \draw [line width=0.25mm] (0, 3) rectangle (3, 6); % \draw [line width=0.25mm] (3, 3) rectangle (6, 6); % % % Third Layer (South West) % \draw [line width=0.125mm] (0, 0) rectangle (1.5, 1.5); % \draw [line width=0.125mm] (1.5, 1.5) rectangle (3, 3); % % % Third Layer (North East) % \draw [line width=0.125mm] (3, 3) rectangle (4.5, 4.5); % \draw [line width=0.125mm] (4.5, 4.5) rectangle (6, 6); % % % Forth Layer (North West) % \draw [line width=0.125mm] (3, 4.5) rectangle (3.75, 5.25); % \draw [line width=0.125mm] (3.75, 5.25) rectangle (4.5, 6); % % % Draw the nodes % \node at (1, 4.5) {$A$}; % \node at (4, 5.5) {$B$}; % \node at (3.5, 5) {$C$}; % \node at (5, 4) {$D$}; % \node at (2.75, 2.75) {$E$}; % \node at (0.75, 0.75) {$F$}; % \node at (2, 0.75) {$G$}; % \node at (3.5, 0.75) {$H$}; %\end{tikzpicture} %%\end{minipage} %\caption{Subdivision of a 2D Space containing some bodies. (\url{http://arborjs.org/docs/barnes-hut})} %\label{fig:cells} %\end{figure} When calculating the forces on let's say the object \( F \), not all other objects need to be taken into effect, only the ones that apply to the Barnes-Hut Principle. For the object \( F \), this means that the Objects \( C \) and \( D \) are not calculated independently, but as one object (The midpoint of the center of gravity is defined as a new abstract object). \begin{figure}[H] \centering \subfloat[some caption 1]{ \begin{tikzpicture}[level 1/.style={level distance=1.5cm}, scale=0.5, every node/.style={scale=0.66}] % First Layer \draw [line width=0.5mm] (0, 0) rectangle (6, 6); % Second Layer \draw [line width=0.25mm] (0, 0) rectangle (3, 3); \draw [line width=0.25mm] (3, 0) rectangle (6, 3); \draw [line width=0.25mm] (0, 3) rectangle (3, 6); \draw [line width=0.25mm] (3, 3) rectangle (6, 6); % Third Layer (South West) \draw [line width=0.125mm] (0, 0) rectangle (1.5, 1.5); \draw [line width=0.125mm] (1.5, 1.5) rectangle (3, 3); % Third Layer (North East) \draw [line width=0.125mm] (3, 3) rectangle (4.5, 4.5); \draw [line width=0.125mm] (4.5, 4.5) rectangle (6, 6); % Forth Layer (North West) \draw [line width=0.125mm] (3, 4.5) rectangle (3.75, 5.25); \draw [line width=0.125mm] (3.75, 5.25) rectangle (4.5, 6); % Draw the nodes \node at (1, 4.5) {$A$}; \node at (4, 5.5) {$B$}; \node at (3.5, 5) {$C$}; \node at (5, 4) {$D$}; \node at (2.75, 2.75) {$E$}; \node at (0.75, 0.75) {$F$}; \node at (2, 0.75) {$G$}; \node at (3.5, 0.75) {$H$}; \end{tikzpicture} } \subfloat[some caption 2]{ \begin{forest} for tree={circle,draw, s sep=0.2em, font=\scriptsize} [ [A] [ [ [] [B] [C] [] ] [] [] [D] ] [ [] [E] [F] [G] ] [H] ] \end{forest} } \caption{The cells defined in Figure \ref{fig:cells} displayed in the form of a quad tree. (\url{http://arborjs.org/docs/barnes-hut})} \label{fig:tree} \end{figure} %In order to simulate the change of position for all objects in the given space, %a tree can be used. The tree in Figure \ref{fig:tree} describes the cells from %Figure \ref{fig:cells} in a form that can be easily programmed. The complete %process of simulating works in the following way: % %\begin{enumerate} % \item Define an empty space. % \item Insert the objects into the tree subdividing the space if necessary. % All the objects need to be places in the leaves of the tree. % \item Calculate the center of mass and the total mass for all inner nodes in the tree. % \item For calculating the force acting on a star, walk through the tree % from the root in direction of the leaves, using the Barnes-Hut % Algorithm (\ref{eqn:barnes-hut}) as an end condition. Use \( \theta \) % as a threshold for controlling how many forces to take into account (\( % \theta = 1 \rightarrow \) all forces, \( \theta = 0.001 \rightarrow \) % almost no forces). %\end{enumerate} %In the end, when simulating a lot of bodies, the runtime is optimized from \( %O(n^2) \) to \( O(n \cdot \log(n)) \). This means that if you've got \( 2 \cdot %10^8 \) bodies and can calculate the forces acting on \( 10^6 \) bodies bodies %per second, the total runtime is reduced from about 1200 Years to 45 minutes %(this is just the calculation of the forces, inserting the bodies into the tree %takes a lot of time!). % %This principle can also be used on other types of problems such as simulating %molecules. If you come to do something with it, write me! %\vfill \texttt{@hanemile} on most platforms. \begin{figure*} %for tree={circle,draw, s sep+=0.25em} % First \begin{minipage}[t]{.24\textwidth} \centering % Cells \begin{tikzpicture} \draw (0, 0) rectangle (2, 2); \end{tikzpicture} ~\\ % Tree \begin{forest} for tree={circle,draw, s sep+=0.25em} [] \end{forest} % Caption \captionof{figure}{Caption} \end{minipage} % Second \begin{minipage}[t]{.24\textwidth} \centering % Cells \begin{tikzpicture} % Layer 0 \draw (0, 0) rectangle (2, 2); % Layer 1 \draw (0, 0) rectangle (1, 1); \draw (1, 0) rectangle (2, 1); \draw (0, 1) rectangle (1, 2); \draw (1, 1) rectangle (2, 2); % Nodes \node at (0.25, 0.25) {A}; \end{tikzpicture} ~\\ % Tree \begin{forest} for tree={circle,draw, s sep=3mm} [ [][][A][] ] \end{forest} % Caption \captionof{figure}{Caption} \end{minipage} % Third \begin{minipage}[t]{.24\textwidth} \centering % Cells \begin{tikzpicture} % Layer 0 \draw (0, 0) rectangle (2, 2); % Layer 1 \draw (0, 0) rectangle (1, 1); \draw (1, 0) rectangle (2, 1); \draw (0, 1) rectangle (1, 2); \draw (1, 1) rectangle (2, 2); % Layer 2.1 \draw (0, 0) rectangle (0.5, 0.5); \draw (0.5, 0) rectangle (1, 0.5); \draw (0, 0.5) rectangle (0.5, 1); \draw (0.5, 0.5) rectangle (1, 1); % Nodes \node at (0.25, 0.25) {A}; \node at (0.75, 0.75) {B}; \end{tikzpicture} ~\\ % Tree %\begin{forest} % for tree={circle,draw, s sep=3mm} % [ % [] % [] % [ % [][][A][] % ] % [] % ] %\end{forest} % Tree (2) \begin{forest} for tree={circle,draw, s sep=3mm} [ [] [] [ [][B][A][] ] [] ] \end{forest} % Caption \captionof{figure}{Caption} \end{minipage} % Fourth \begin{minipage}[t]{.24\textwidth} \centering % Cells \begin{tikzpicture} % Layer 0 \draw (0, 0) rectangle (2, 2); % Layer 1 \draw (0, 0) rectangle (1, 1); \draw (1, 0) rectangle (2, 1); \draw (0, 1) rectangle (1, 2); \draw (1, 1) rectangle (2, 2); % Layer 2.1 \draw (0, 0) rectangle (0.5, 0.5); \draw (0.5, 0) rectangle (1, 0.5); \draw (0, 0.5) rectangle (0.5, 1); \draw (0.5, 0.5) rectangle (1, 1); % Nodes \node at (0.25, 0.25) {A}; \node at (0.75, 0.75) {B}; \node at (1.75, 1.75) {C}; \end{tikzpicture} ~\\ % Tree \begin{forest} for tree={circle,draw, s sep=3mm} [ [] [C] [ [][B][A][] ] [] ] \end{forest} % Caption \captionof{figure}{Caption} \end{minipage} \end{figure*} \end{document}