diff --git a/.gitignore b/.gitignore index 4324113da5c0350bb082a6a6cf356c1bdef63804..a1f0b22b4f21a400d820d7167c625f51ef46f5d6 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ _minted-doc/ *.fls *.bcf *.run.xml +*.md5 +*.auxlock # PDF output - usually a bad idea to keep this in Git *.pdf diff --git a/doc/figures/cover-field.png b/doc/figures/cover-field.png index fa0257b2e615b3115c483fbb546bc2a31fc82d30..73eda5c0d5b89a5257d39a3c86c59b36ae0bb7ff 100644 Binary files a/doc/figures/cover-field.png and b/doc/figures/cover-field.png differ diff --git a/doc/figures/field-lines-2.png b/doc/figures/field-lines-2.png new file mode 100644 index 0000000000000000000000000000000000000000..e3af37cba689cdc90ec308d03acddc16a2b0ba8c Binary files /dev/null and b/doc/figures/field-lines-2.png differ diff --git a/doc/figures/field-lines-4.png b/doc/figures/field-lines-4.png new file mode 100644 index 0000000000000000000000000000000000000000..ae1fe6243c3494573e56d391bbe5abb179397617 Binary files /dev/null and b/doc/figures/field-lines-4.png differ diff --git a/doc/figures/field-lines-6.png b/doc/figures/field-lines-6.png new file mode 100644 index 0000000000000000000000000000000000000000..4584a22b19602eeec4ee38579357f3d621e74046 Binary files /dev/null and b/doc/figures/field-lines-6.png differ diff --git a/doc/figures/heatmap-12.png b/doc/figures/heatmap-12.png new file mode 100644 index 0000000000000000000000000000000000000000..35d8100bf5cdfb05c91d8612ffaea6f9f8a78eae Binary files /dev/null and b/doc/figures/heatmap-12.png differ diff --git a/doc/figures/heatmap-6.png b/doc/figures/heatmap-6.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c9b4be8ddb5ba260ce22050521f56c6dd30666 Binary files /dev/null and b/doc/figures/heatmap-6.png differ diff --git a/doc/figures/vector-field-12.png b/doc/figures/vector-field-12.png new file mode 100644 index 0000000000000000000000000000000000000000..7bd99e05d08b1ce56d12cdcc519d18472b69aaec Binary files /dev/null and b/doc/figures/vector-field-12.png differ diff --git a/doc/figures/vector-field-6.png b/doc/figures/vector-field-6.png new file mode 100644 index 0000000000000000000000000000000000000000..499cb92d83ac018cb52c555030114e06baeff148 Binary files /dev/null and b/doc/figures/vector-field-6.png differ diff --git a/doc/layout/hepia-report.cls b/doc/layout/hepia-report.cls index cf4566beb65c6cac0fcc0bf8188b695b76af526e..243e234d07b49a434685615d7cd99ff0b9c66869 100644 --- a/doc/layout/hepia-report.cls +++ b/doc/layout/hepia-report.cls @@ -23,6 +23,7 @@ \RequirePackage{booktabs} % Publication quality tables \RequirePackage{longtable} % Allow tables to flow over page boundaries \RequirePackage{multirow} % Create tabular cells spanning multiple rows +\RequirePackage{multicol} \RequirePackage{graphicx} % Enhanced support for images \RequirePackage{float} % Improved interface for floating objects @@ -36,6 +37,7 @@ \RequirePackage{tikz} % Create PostScript and PDF graphics \RequirePackage{xspace} % Define commands that appear not to eat spaces \RequirePackage{microtype} % Refinements towards typographical perfection +\RequirePackage{pgfplots} % Advanced ploting \RequirePackage{geometry} % Customize document dimensions \RequirePackage{titlesec} % Select alternative section titles @@ -56,6 +58,9 @@ %% Scaling the margins to be slightly smaller than default (.7) \geometry{a4paper,hscale=0.75,vscale=0.8} +%% Plots configuration +\pgfplotsset{width=10cm,compat=1.9} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% I. Loading the fonts %%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/doc/mainmatter/chapter-3.tex b/doc/mainmatter/chapter-3.tex deleted file mode 100644 index a778ea8f2fda31ff4089caff2edb2c2bc96f8d1f..0000000000000000000000000000000000000000 --- a/doc/mainmatter/chapter-3.tex +++ /dev/null @@ -1,2 +0,0 @@ -%\chapter{Title} -%\label{chapter:title} diff --git a/doc/mainmatter/conclusion.tex b/doc/mainmatter/conclusion.tex index 01f26e519f3c4dd7b37e2342235e23dbf7e97aa9..2478ed5a37754149f67613151466c0d830f247cb 100644 --- a/doc/mainmatter/conclusion.tex +++ b/doc/mainmatter/conclusion.tex @@ -1,4 +1,60 @@ \chapter{Conclusion} \label{chapter:conclusion} -\emph{A conclusion...} +\section{Évolution du temps de calcul} +\label{sec:time-evolution} + +Le temps de calcul varie grandement en fonction du nombre de particules dans l'univers +ainsi que l'espacement fixé entre les points de la grille utilisée pour calculer les lignes de champs. +Comme le graphique ci-dessous le montre, la croissance du temps est presque exponentielle. +Il est clair que la façon dont les lignes sont calculées n'est donc pas efficace et qu'il est +nécessaire de changer de méthode s'il on veut pouvoir avoir un nombre de particules plus élevé et +un espacement entre points de grille plus petit (sachant que moins de 5px les lignes deviennent un +amas illisible tant la distances entre elles est faible). + +\begin{figure}[h] + \centering + \caption{Variance du temps de calcul des lignes de champs} + \begin{tikzpicture}[scale=.7] + \begin{axis}[ + ybar, + bar width=10pt, + ymin=0, + xmin=0, + ylabel=Secondes, + xlabel=Nombre de particules, + xtick={2, 10, 15}, + legend pos=north west + ] + \addlegendimage{empty legend} + \addplot+[error bars/.cd, + y dir=both,y fixed=0.01, + ] + coordinates { + (2, 0.1630385) + (10, 0.2835994) + (15, 0.3111888) + }; + \addplot+[error bars/.cd, + y dir=both,y fixed=0.03, + ] + coordinates { + (2, 0.4662245) + (10, 0.8618891) + (15, 0.733422) + }; + \addplot+[error bars/.cd, + y dir=both,y fixed=0.1, + ] + coordinates { + (2, 1.6592141) + (10, 3.2944945) + (15, 3.4218168) + }; + \addlegendentry{\hspace{-.3cm}\textbf{Espacement}} + \addlegendentry{16px} + \addlegendentry{10px} + \addlegendentry{5px} + \end{axis} + \end{tikzpicture} +\end{figure} \ No newline at end of file diff --git a/doc/mainmatter/experiences.tex b/doc/mainmatter/experiences.tex new file mode 100644 index 0000000000000000000000000000000000000000..699cfac3b68ce1867e99f05125b879f41c509c67 --- /dev/null +++ b/doc/mainmatter/experiences.tex @@ -0,0 +1,212 @@ +\chapter{Expériences} +\label{chapter:experiences} + +Pour représenter de façon graphique le champs électrostatique, il nous faut définir un +univers discret. Cet univers est défini comme $[0,1]\times[0,1]$. Chaque particule du +système aura donc une position dans cet univers, ainsi qu'une charge (mutliple de la charge +élémentaire). + +\section{Ligne de champs} + +Le dessin numérique d'une courbe se fait en l'approximant à l'aide de plusieurs petits +ségments de droite mis bout à bout. Pour dessiner cette courbe, il nous faut trouver un +ensemble de points appartenant à cette lignes. Pour cela on procède ainsi : + +\begin{enumerate} + \item Tirage aléatoire d'un point dans l'univers $P_0$. + \item Assignation $P = P_0$. + \item On calcul ensuite $P_{suivant}$ en fonction de l'intensité et de la direction du champ + en $P$. Ce qui donne l'équation \ref{eqn:next-point}. Cependant, dans notre cas nous + voulons avancer d'une distance identique à chaque fois, et qui ne soit pas trop grande. + Il faut donc commencer par normaliser notre champs, puis le multiplier par une constante + $\delta x$ fixe définie en fonction de la taille de la fenêtre. Ce qui nous donne : + $P_{suivant} = P \pm \delta x \cdot \frac{\vec{E}}{||\vec{E}||}$ avec $\delta x = \frac{1}{\sqrt{largeur^2 + hauteur^2}}$ + et $\vec{E} = \sum_{i=1}^N E_i \frac{\lvec{q_i P_n}}{||\lvec{q_i P_n}||}$. \textit{En fonction du sens du dessin + de la ligne, $+$ ou $-$ $\delta x$}. + \item Si $P$ et $P_{suivant}$ sont à une distance des particules supérieur à un seuil choisi + et qu'ils sont toujours dans notre univers, on trace un segment entre $P$ et $P_{suivant}$. Sinon on quitte la boucle. + \item On assigne $P = P_{suivant}$ et on revient à l'étape 3. +\end{enumerate} + +\begin{figure}[h] + \centering + \caption{Dessin d'une ligne de champs} + \begin{tikzpicture}[line/.style={->,shorten >=0.4cm,shorten <=0.4cm},very thick, scale=0.7] + \coordinate (Plus) at (0, 0); + \coordinate (Minus) at (6, 0); + \coordinate (P) at (3, 2); + + \path [red, line, bend right] (P) edge (Plus); + \path [blue, line, bend left] (P) edge (Minus); + \filldraw (P) circle (3pt); + \filldraw (Plus) node[white] {$+$} circle (0.3); + \filldraw (Minus) node[white] {$-$} circle (0.3); + \end{tikzpicture} \\ + {\fontsize{8}{8} + \textit{Le sens des flèches est seulement indicative du sens du calcul de $P_{suivant}$. Ce n'est + pas le sens de la ligne de champ.} + } +\end{figure} + +\noindent Le résultat est très concluant, quoique lent lorsque beaucoup de lignes doivent être déssinées. \textit{c.f. \ref{sec:time-evolution}}. +Comme les images le montre, les lignes sont clairement visible, mais il se peut que quelquefois il y aie des espaces +plus grand que d'autres entre les lignes. Ceci est dû à la manière dont les points de départ des lignes sont choisie. +Pour ne plus avoir ces espace, il serait possible de prendre des points de départ équidistant. + +\begin{figure}[H] + \centering + \caption{Résultats de simulation} + \begin{subfigure}[t]{.3\linewidth} + \centering + \frame{\includegraphics[width=.7\linewidth]{figures/field-lines-2.png}} + \caption{2 particules} + \end{subfigure} + \begin{subfigure}[t]{.3\linewidth} + \centering + \frame{\includegraphics[width=.7\linewidth]{figures/field-lines-4.png}} + \caption{4 particules} + \end{subfigure} + \begin{subfigure}[t]{.3\linewidth} + \centering + \frame{\includegraphics[width=.7\linewidth]{figures/field-lines-6.png}} + \caption{6 particules} + \end{subfigure} +\end{figure} + +\section{Champs vectoriel} + +En plus des lignes de champs, deux autres représentations sont disponible. (Chacune en appuyant sur +\verb|l|, \verb|v|, \verb|h|). La première est un champs vectoriel. Il est généré de la façon suivante : + +\begin{enumerate} + \item Calcul de la valeur minimum et maximum du champs électrostatique normalisé pour tout $P$ + dans une grille orthogonale à espacement égale, et sauvegarde du champs en $P$ + inséré dans une liste de longueur identique aux points de la grille. + \item Assignation de $P = P_0$ + \item Pour tout $P$ dans la liste de champs électrostatique calculée à l'étape 1. + \item On normalise le champs $\hat{E} = \frac{\vec{E}(P)}{||\vec{E}(P)||}$ et on le multiplie par une valeur fixe + permettant de correctement distinguer les différentes tailles de vecteurs. + \item On dessine le vecteur en $P$. + \item Assignation de $P = P_{i + 1}$ et on revient à l'étape 4. +\end{enumerate} + +\begin{figure}[H] + \centering + \caption{Dessin d'un champs vectoriel} + \begin{tikzpicture}[vecline/.style={green!50!black, ->, thick}, scale=.7] + \coordinate (Plus) at (0, 0); + \newcommand{\VSA}{0.5} + \newcommand{\VA}{1.15} + \newcommand{\VSB}{1.5} + \newcommand{\VB}{2} + \newcommand{\VSC}{2.5} + \newcommand{\VC}{2.8} + + \filldraw (Plus) node[white] {$+$} circle (0.3); + % Right + \draw[vecline] (\VSA, 0) -- (\VA, 0); + \draw[vecline] (\VSB, 0) -- (\VB, 0); + \draw[vecline] (\VSC, 0) -- (\VC, 0); + % Left + \draw[vecline] (-\VSA, 0) -- (-\VA, 0); + \draw[vecline] (-\VSB, 0) -- (-\VB, 0); + \draw[vecline] (-\VSC, 0) -- (-\VC, 0); + % Up + \draw[vecline] (0, \VSA) -- (0, \VA); + \draw[vecline] (0, \VSB) -- (0, \VB); + \draw[vecline] (0, \VSC) -- (0, \VC); + % Down + \draw[vecline] (0, -\VSA) -- (0, -\VA); + \draw[vecline] (0, -\VSB) -- (0, -\VB); + \draw[vecline] (0, -\VSC) -- (0, -\VC); + % Up Right + \draw[vecline] (45:\VSA) -- (45:\VA); + \draw[vecline] (45:\VSB) -- (45:\VB); + \draw[vecline] (45:\VSC) -- (45:\VC); + % Up Left + \draw[vecline] (45:-\VSA) -- (45:-\VA); + \draw[vecline] (45:-\VSB) -- (45:-\VB); + \draw[vecline] (45:-\VSC) -- (45:-\VC); + % Down Right + \draw[vecline] (-45:\VSA) -- (-45:\VA); + \draw[vecline] (-45:\VSB) -- (-45:\VB); + \draw[vecline] (-45:\VSC) -- (-45:\VC); + % Down Left + \draw[vecline] (-45:-\VSA) -- (-45:-\VA); + \draw[vecline] (-45:-\VSB) -- (-45:-\VB); + \draw[vecline] (-45:-\VSC) -- (-45:-\VC); + \end{tikzpicture} +\end{figure} + +\noindent Le résultant que quelque peu décevant sur un point précis. Les vecteur déssinés auraient pu +être plus précis car quelque fois leur taille est trop différente des vecteur voisins, et de ce fait, +créer une représentation un peu erronée. + +\begin{figure}[H] + \centering + \caption{Résultats de simulation} + \begin{subfigure}[t]{.4\linewidth} + \centering + \frame{\includegraphics[width=.7\linewidth]{figures/vector-field-6.png}} + \caption{6 particules} + \end{subfigure} + \begin{subfigure}[t]{.4\linewidth} + \centering + \frame{\includegraphics[width=.7\linewidth]{figures/vector-field-12.png}} + \caption{12 particules} + \end{subfigure} +\end{figure} + +\section{Heatmap} + +La dernière représentation graphique est une heatmap en fonction de l'intensité du champs en tout point +de l'univers. + +\begin{enumerate} + \item Cacule de la valeur minimum et maximum de la norme du champs électrostatique normalisé pour tout les + pixels de l'écran, et sauvegarde de la valeur courante dans une liste de longueur $largeur \cdot hauteur$. + \item Assignation de $P = P_0$. + \item Pour tout $I$ dans la liste d'intensitées sauvegardée à l'étape 1. + \item On dessine un point de couleur en fonction de l'intensité en ce point. + \item Assignation de $I = I_{i + 1}$ et on revient à l'étape 3. +\end{enumerate} + +\begin{figure}[h] + \centering + \caption{Dessin d'une heatmap} + \begin{tikzpicture}[scale=.7] + \filldraw (0, 0) node[white] {$+$} circle (0.3); + \draw[blue] (0, 0) circle (0.5); + \draw[blue!80] (0, 0) circle (0.8); + \draw[blue!60] (0, 0) circle (1.2); + \draw[blue!40] (0, 0) circle (1.8); + \draw[blue!20] (0, 0) circle (2.8); + \end{tikzpicture} +\end{figure} + +\noindent Cette représentation est selon moi la mieux réussie. Combinée aux lignes de champs, il est possible +de voir la puissance du champs électrostatique autour des charges ainsi que leur impact sur leur voisinage, ce qui +est très utile pour avoir une idée macroscoptique du champs. Cependant, le cacul du rendu graphique reste très lent. +Ceci est dû au fait qu'un calcul d'intensité du champs est fait pour tout pixel. + +\begin{figure}[h] + \centering + \caption{Résultats de simulation} + \begin{subfigure}[t]{.4\linewidth} + \centering + \frame{\includegraphics[width=.7\linewidth]{figures/heatmap-6.png}} + \caption{6 particules} + \end{subfigure} + \begin{subfigure}[t]{.4\linewidth} + \centering + \frame{\includegraphics[width=.7\linewidth]{figures/heatmap-12.png}} + \caption{12 particules} + \end{subfigure} +\end{figure} + +\section{Rendu graphique} + +L'utilisation de la librairie graphique OpenGL a été privilégié de part son efficacité de rendu +ainsi que sa flexibilité d'utilisation. Grâce à cela, il a été possible d'afficher du texte +en dessous des particules indicant leur charge respective, utilisation d'antialiasing par défaut +pour un rendu de ligne et de cercle très bon, et calcul graphique fait sur le GPU au lieu du CPU. \ No newline at end of file diff --git a/doc/mainmatter/introduction.tex b/doc/mainmatter/introduction.tex index 5d2986bb8795f0d7a2d2436befbbc73d58184dda..217115b82cda638274f442bbb751b7f4bbe99b59 100644 --- a/doc/mainmatter/introduction.tex +++ b/doc/mainmatter/introduction.tex @@ -1,16 +1,9 @@ \chapter{Introduction} \label{chapter:introduction} -\color{red}Dans le cadre du cours de physique appliquée à l'ingénerie 1 (ISC 123) donné par M. Malaspinas Orestis, -nous devons réaliser une simulation élémentaire de lignes de champs électrostatique de particules. -Cette simulation se base sur les notions vues et pratiquée en cours, et est réalisée en C avec un -répertoire git \cite{git-repo} obligatoire. - -\color{black}Le rendu graphique doit être fait en utilisant la librarie SDL2. Cependant, ne la trouvant pas optimale, -j'opte pour une version utilisant OpenGL, branche \verb|opengl|. La version SDL2 sur la branche \verb|master| -est disponible. - -\textit{\color{red}Plus de blabla... (qu'est ce que l'électrostatique, a quoi ça sert, dans champ d'application, etc)} +L'électrostatique est une branche de la physique étudiant les charges électriques au repos. +Les phénomènes électrostatiques proviennent des forces que les charges électriques produisent entre elles. +Ces forces sont décrites par la loi de Coulomb. La simulation de lignes de champs permet d'avoir une représentation graphique claire de l'impact électrostatique inter-particules dans un univers discret. À plus grande echelle, il est possible diff --git a/doc/mainmatter/chapter-2.tex b/doc/mainmatter/theory.tex similarity index 96% rename from doc/mainmatter/chapter-2.tex rename to doc/mainmatter/theory.tex index af871ecdc4ba5facb39508581698ccd7a26696c0..b6656206ebae361a61c80cc1763520e6b030806b 100644 --- a/doc/mainmatter/chapter-2.tex +++ b/doc/mainmatter/theory.tex @@ -12,7 +12,7 @@ j'utilise deux lois de l'électrostatique qui sont la loi de Coulomb et les cham Pour rappel, toute particule à une charge $Q$ valant $\pm n \cdot e$, où $e = 1.602176634 * 10^{-19}[C]$. } -\section*{Loi de Coulomb} +\section{Loi de Coulomb} Cette loi nous dis que : \begin{center} @@ -38,7 +38,7 @@ $q$ et $Q$ est : Dans le SI, $k_0 = \frac{1}{4 \pi \epsilon_0} \approx 8.987551792*10^{-9} [Nm^2C^{-2}]$ \end{center} -\section*{Champ électrique} +\section{Champ électrique} Le champ électrique, $\vec{E}$, en newton par coulomb, ou volt par mètre, est un champ vectoriel pouvant être défini en tout point, excepté sur la position de la charge. @@ -52,7 +52,7 @@ charge émettant le champ. \end{equation} \end{center} -\subsection*{Lignes de champs} +\section{Lignes de champs} Les lignes de champs sont utiles afin de visualiser le champs électrique. Ces lignes commencent sur des charges négatives et terminent sur des charges positives. @@ -64,6 +64,7 @@ Soit une collection de $N$ charges de charge $q_i$, le champ en $P_{n+1}$ est : \begin{center} \begin{equation} + \label{eqn:next-point} \vec{E}(\vec{P}_{n+1}) = \vec P_n+ \sum_{i=1}^N E_i \frac{\lvec{q_i P_n}}{||\lvec{q_i P_n}||} \end{equation} \end{center} \ No newline at end of file diff --git a/doc/report.tex b/doc/report.tex index f255ddc9f14352e060b8acbae49ff700af3dc6fb..9d6f276c06e4c69b2267b83fbb42748b07831a0a 100644 --- a/doc/report.tex +++ b/doc/report.tex @@ -39,8 +39,8 @@ \input{mainmatter/introduction} -\input{mainmatter/chapter-2} -\input{mainmatter/chapter-3} +\input{mainmatter/theory} +\input{mainmatter/experiences} %\input{mainmatter/chapter-4} % Create file to add \input{mainmatter/conclusion}