Algoritmo di Barnes-Hut

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca
Una simulazione a 100-corpi con l'albero di Barnes–Hut rappresentato visualmente dai riquadri blu.

L'algoritmo di Barnes–Hut, proposto da Josh Barnes e Piet Hut[1], è un algoritmo di approssimazione per eseguire la simulazione a n-corpi. È noto per avere complessità , al contrario del metodo esaustivo che ha ordine .[2]

Lo spazio della simulazione è di solito diviso in celle cubiche attraverso un octree (nello spazio tridimensionale), in modo che solo le particelle dalle celle vicine vengono trattate individualmente, mentre quelle distanti possono essere considerate come una grande particella situata nel centro di massa della cella (o come un troncamento dello sviluppo in multipoli). In questo modo si riduce drammaticamente il numero di interazioni tra le coppie di particelle che si devono calcolare.

Alcuni dei progetti ad alte prestazioni che richiedono un grosso sforzo computazionale utilizzano l'algoritmo ad albero di Barnes-Hut nell'astrofisica computazionale,[3] come DEGIMA.

Algoritmo[modifica | modifica wikitesto]

L'albero di Barnes–Hut[modifica | modifica wikitesto]

In una simulazione a n-corpi, l'algoritmo di Barnes–Hut suddivide ricorsivamente gli corpi in gruppi e li memorizza in un octree (o un quad-tree in due dimensioni). Ogni nodo dell'albero rappresenta una regione dello spazio tridimensionale. La radice rappresenta l'intero spazio, e i suoi otto figli indicano gli otto ottanti del volume. Lo spazio è diviso ricorsivamente in ottanti finché ogni suddivisione non contiene al massimo un corpo (qualche regione non possiede alcun corpo in nessuno dei suoi ottanti). Ci sono due tipi di nodi nell'octree: i nodi interni e le foglie. Le foglie non hanno figli e rappresentano un singolo corpo oppure sono vuoti. Ogni nodo interno invece descrivono il gruppo di corpi al di sotto di esso, memorizzando il centro di massa e la massa totale di tutti i suoi corpi figli.

Galleria d'immagini[modifica | modifica wikitesto]

Calcolare la forza agente su un corpo[modifica | modifica wikitesto]

Per calcolare la forza risultante su di un particolare corpo, si visitano i nodi dell'albero, partendo dalla radice. Se il centro di massa di un nodo interno è abbastanza lontano dal corpo, tutte le particelle contenute in quella parte dell'albero vengono trattate come una sola, la cui posizione e massa sono rispettivamente il centro di massa e la massa totale del nodo. Se invece il nodo interno è sufficientemente vicino, si ripete il processo su ognuno dei suoi figli.

Se un nodo è o non è abbastanza lontano da un corpo dipende dal quoziente , dove è la larghezza dell'ottante rappresentato dal nodo interno, e è la distanza tra il corpo e il centro di massa del nodo. Il nodo è abbastanza lontano se questo rapporto è minore di un valore soglia . Il parametro determina la precisione dell'algoritmo; valori maggiori di aumentano la velocità della simulazione ma diminuiscono la sua precisione. Se , nessun nodo interno viene trattato come una particella unica e l'algoritmo degenera nel metodo esaustivo di somma diretta.

Implementazione[modifica | modifica wikitesto]

C[modifica | modifica wikitesto]

Struttura albero scritta su C utilizzando i costrutti typedef e struct.

typedef struct barnes {
    //coordinate del nodo
    double x, y;
    //massa del nodo
    double massa;
    //puntatori ai sottoalberi
    struct barnes * NW, *NE, *SE, *SW;
} barnes_t;

Note[modifica | modifica wikitesto]

  1. ^ J. Barnes e P. Hut, A hierarchical O(N log N) force-calculation algorithm, in Nature, vol. 324, n. 4, dicembre 1986, pp. 446-449, Bibcode:1986Natur.324..446B, DOI:10.1038/324446a0.
  2. ^ Susanne Pfalzner e Paul Gibbon, Many-body tree methods in physics, Cambridge Univ. Press, 1996, pp. 2-3, ISBN 978-0-521-49564-6.
  3. ^ T. Hamada et al., A novel multiple-walk parallel algorithm for the Barnes-Hut treecode on GPUs – towards cost effective, high performance N-body simulation, in Comp. Sci. Res. Dev, vol. 24, n. 1-2, 2009, pp. 21–31, DOI:10.1007/s00450-009-0089-1.

Bibliografia[modifica | modifica wikitesto]

Voci correlate[modifica | modifica wikitesto]

Collegamenti esterni[modifica | modifica wikitesto]

  Portale Fisica: accedi alle voci di Wikipedia che trattano di fisica