diff --git a/slides/cours_21.md b/slides/cours_21.md index e30a97edb41536171440d903f5b47082115fb8af..8afc677bad2b73ec786e55e06ea0e3c4b4015250 100644 --- a/slides/cours_21.md +++ b/slides/cours_21.md @@ -375,8 +375,6 @@ rien iteration_temporelle(étoiles, dt) +--------+-------+-------+-----------+ | 10 | 10^2 | 1e-4 | | +--------+-------+-------+-----------+ -| 10^2 | 10^4 | 1e-2 | | -+--------+-------+-------+-----------+ | 10^4 | 10^8 | 1e+2 | ~1min | +--------+-------+-------+-----------+ | 10^6 | 10^12 | 1e+6 | ~11j | @@ -384,7 +382,7 @@ rien iteration_temporelle(étoiles, dt) | 10^9 | 10^18 | 1e+12 | ~30k ans | +--------+-------+-------+-----------+ | 10^11 | 10^22 | 1e+16 | ~300M ans | -+--------+-------+-------+ ----------+ ++--------+-------+-------+-----------+ * Typiquement il y a des milliers-millions d'itérations. * Il y a $10^{11}$ étoiles dans la galaxie. @@ -483,7 +481,7 @@ rien iteration_temporelle(étoiles, dt) * 2: ID * 3: SG -# Algorithme d'insertion +# Exemple d'insertion ::: columns @@ -497,7 +495,7 @@ rien iteration_temporelle(étoiles, dt) :::: {.column width=50%} -## Arbre +## Arbre, niveau 1 {width=100%} @@ -508,7 +506,7 @@ rien iteration_temporelle(étoiles, dt) ::: -# Algorithme d'insertion +# Exemple d'insertion ::: columns @@ -522,7 +520,7 @@ rien iteration_temporelle(étoiles, dt) :::: {.column width=50%} -## Arbre +## Arbre, niveau 1 {width=100%} @@ -533,7 +531,7 @@ rien iteration_temporelle(étoiles, dt) ::: -# Algorithme d'insertion +# Exemple d'insertion ::: columns @@ -547,7 +545,7 @@ rien iteration_temporelle(étoiles, dt) :::: {.column width=50%} -## Arbre +## Arbre, niveau 1 {width=100%} @@ -558,7 +556,7 @@ rien iteration_temporelle(étoiles, dt) ::: -# Algorithme d'insertion +# Exemple d'insertion ::: columns @@ -572,7 +570,7 @@ rien iteration_temporelle(étoiles, dt) :::: {.column width=50%} -## Arbre +## Arbre, niveau 2 {width=100%} @@ -584,7 +582,7 @@ rien iteration_temporelle(étoiles, dt) ::: -# Algorithme d'insertion +# Exemple d'insertion ::: columns @@ -598,7 +596,7 @@ rien iteration_temporelle(étoiles, dt) :::: {.column width=50%} -## Arbre +## Arbre, niveau 3 {width=100%} @@ -610,7 +608,11 @@ rien iteration_temporelle(étoiles, dt) ::: -# Algorithme d'insertion +# Exemple d'insertion + +::: columns + +:::: {.column width=50%} ## Que fait-on avec les noeuds intérieurs? @@ -618,6 +620,161 @@ rien iteration_temporelle(étoiles, dt) * stocker la masse totale; * stocker le centre de masse. -## Les feuilles contiennent les étoiles. +\begin{align} +m&=m_2+m_3,\\ +\vec x &= \frac{m_2\vec x_2+m_3+\vec x_3}{m}. +\end{align} + +## Chaque feuille contient **une étoile** + +:::: + +:::: {.column width=50%} + +## Arbre + +{width=100%} + +:::: + +::: + +# Résumé + +* Insertion du corps `c` dans le noeud `n` en partant de la racine. +* Si le noeud `n` + * ne contient pas de corps, on y dépose `c`, + * est interne, on met à jour masse et centre de masse. `c` est inséré récursivement dans le bon quadrant. + * est est externe, on subdivise `n`, on met à jour la masse et centre de masse, on insère récursivement les deux noeuds dans les quadrants appropriés. + +## Remarque + +* Il faut stocker les coordonnées des quadrants. +* Un noeud a un comportement différent s'il est interne ou externe. + +# Algorithme d'insertion + +## Structure de données + +```C +struct node + etoile e // externe: pour stocker + etoile sup_etoile // interne: pour stocker m, x + quadrant q // coordonnées du quadrant + node enfants[4] +``` + +## Remarque: + +* On fait une simplification "moche": `sup_etoile` pourrait juste avoir une masse et une position. + +# Algorithme d'insertion + +\footnotesize + +## Algorithme d'insertion, pseudo-code (15min, matrix) + +. . . + +```C +rien insertion_etoile(arbre, e) + si (!est_vide(arbre) && dans_le_quadrant(arbre.q, e.x)) { + si (est_feuille(arbre)) + si (est_vide(arbre)) + arbre.e = e + sinon + // on crée enfants et arbre.sup_etoile est initialisée + subdivision_arbre(arbre, e) + pour enfant dans arbre.enfants + insertion_etoile(enfant, arbre.e) + pour enfant dans arbre.enfants + insertion_etoile(enfant, e) + destruction(etoile) + sinon + maj_masse_cdm(arbre.sup_etoile, e) + pour enfant dans arbre.enfants + insertion_etoile(enfant, e) +``` + +# Utilisation de l'arbre + +* L'arbre est rempli: comment on calcule la force sur le corps 1? +* Parcours de l'arbre: + * si la distance entre 1 et le centre de masse est suffisante, on utilise la masse totale et centre de masse pour calculer la force. + * sinon, on continue le parcours + +# Calcul de la force + +## Calcul de la force sur `1` + + + +* Le cadrant ID ne contient que `1`, rien à faire. + +# Calcul de la force + +## Calcul de la force sur `1` + + + +* Le cadrant SG ne contient `5` corps. + +# Calcul de la force + +## Calcul de la force sur `1` + + + +* La distance entre `1` et le centre de masse de SG est `d`. + +# Calcul de la force + +## Calcul de la force sur `1` + + + +* La distance entre `1` et le centre de masse de SG est `d`. +* Est-ce que `d` est assez grand? +* On va comparer avec la distance `d` avec la taille du quadrant `s`. + +# Critère $\theta$ + +* On compare $d=||\vec x_1-\vec x_{cm}||$ avec $s$ la taille du quadrant. +* Le domain est assez éloigné si + + $$ + \frac{s}{d}<\theta, + $$ +* $\theta$ est la valeur de seuil. +* Une valeur typique est $\theta=0.5$, donc la condition devient + + $$ + d>2s. + $$ + +# Calcul de la force + +## Calcul de la force sur `1` + + + +* Ici $d<2s$, domaine rejeté. +* ON descend dans l'arbre. + +# Calcul de la force + +## Calcul de la force sur `1` + + + +* `s` est plus petit, mais.... +* Cela ne suffit pas $d<2s$, domaine rejeté. + +# Calcul de la force + +## Calcul de la force sur `1` + +* Les noeuds sont des feuilles, ils sont acceptés. +* On ajoute la force qu'ils exercent sur `1`. diff --git a/slides/figs/force_1.png b/slides/figs/force_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e04dab8bf3fa363b2931a5625f752635021cef88 Binary files /dev/null and b/slides/figs/force_1.png differ diff --git a/slides/figs/force_2.png b/slides/figs/force_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9b9050c9c54c905d1a0b257b9acf5bb59d311c77 Binary files /dev/null and b/slides/figs/force_2.png differ diff --git a/slides/figs/force_3.png b/slides/figs/force_3.png new file mode 100644 index 0000000000000000000000000000000000000000..e83e68e3440c1e8f261e67fa511693dc7d99a9bc Binary files /dev/null and b/slides/figs/force_3.png differ diff --git a/slides/figs/force_4.png b/slides/figs/force_4.png new file mode 100644 index 0000000000000000000000000000000000000000..d3582f03e43f7e591d28de4fcd3a6247390534c2 Binary files /dev/null and b/slides/figs/force_4.png differ diff --git a/slides/figs/force_5.png b/slides/figs/force_5.png new file mode 100644 index 0000000000000000000000000000000000000000..67f2a8c6ea47e40bf25f2f0f45c2ba4d9ee791d2 Binary files /dev/null and b/slides/figs/force_5.png differ diff --git a/slides/figs/force_6.png b/slides/figs/force_6.png new file mode 100644 index 0000000000000000000000000000000000000000..6b6837fdeb3fd1dae92d73e11bac878dbf52d9a6 Binary files /dev/null and b/slides/figs/force_6.png differ