HPC - Oscillatori accoppiati

Moreno Marzolla moreno.marzolla@unibo.it

Ultimo aggiornamento: 2021-11-18

Consideriamo \(n\) punti di massa \(m\) disposti lungo una retta alle coordinate \(x_0, x_1, \ldots, x_{n-1}\). Masse adiacenti sono collegate da una molla di costante elastica \(k\) e lunghezza a riposo \(L\). Il primo e l'ultimo punto (quelli in posizione \(x_0\) e \(x_{n-1}\) occupano una posizione fissa e non possono muoversi.

Figura 1: Oscillatori accoppiati
Figura 1: Oscillatori accoppiati

Se all'istante iniziale una delle molle non è a riposo, si innescano delle oscillazioni che, in mancanza di attrito, proseguiranno indefinitamente. Sfruttando la seconda legge della dinamica di Newton \(F = ma\) e la legge di Hooke che afferma che una molla di costante \(k\) compressa di una quantità \(\Delta x\) esercita una forza \(k \Delta x\), sviluppiamo un programma che, date le posizioni e le velocità iniziali delle masse, calcoli posizioni e velocità al tempo \(t > 0\). Il programma si basa su un algoritmo iterativo che partendo dalle posizioni e velocità delle masse al tempo \(t\), determina le nuove posizioni e le nuove velocità al tempo \(t + \Delta t\). In particolare, la funzione

step(double *x, double *v, double *xnext, double *vnext, int n)

calcola posizione xnext[i] e velocità vnext[i] della massa \(i\)-esima al tempo \(t + \Delta t\), \(0 \le i < n\), date le posizioni x[i] e velocità v[i] al tempo \(t\).

  1. Per ogni \(i = 1, \ldots, n-2\) si calcola la forza \(F_i\) che agisce sulla massa \(i\)-esima come \(F_i := k \times (x_{i-1} -2x_i + x_{i+1})\); si noti come la forza non dipenda dalla lunghezza \(L\) delle molle a riposo. Le masse 0 e \(n-1\) rimangono in posizione fissa, quindi le forze che agiscono su di esse possono essere omesse.

  2. Per ogni \(i = 1, \ldots, n-2\) si calcola la nuova velocità \(v'_i\) della massa \(i\)-esima al tempo \(t + \Delta t\) come \(v'_i := v_i + (F_i / m) \Delta t\). Le masse 0 e \(n-1\) restano fisse, quindi la loro velocità sarà sempre zero.

  3. Per ogni \(i = 1, \ldots, n-2\) si calcola la nuova posizione \(x'i\) della massa \(i\)-esima al tempo \(t + \Delta t\) come \(x'_i := x_i + v'_i \Delta t\). Le masse 0 e \(n-1\) restano ferme quindi la loro posizione al tempo \(t + \Delta t\) sarà uguale a quella al tempo \(t\): \(x'_0 := x_0\), \(x'_{n-1} := x_{n-1}\).

Il file cuda-coupled-oscillators.cu contiene una versione seriale del programma che calcola l'evoluzione di un insieme di oscillatori accoppiati. Il programma produce una immagine bidimensionale in cui ogni riga mostra le energie potenziali delle \(n-1\) molle in ogni istante di tempo. Al termine dell'esecuzione il programma dovrebbe produrre un file coupled-oscillators.ppm contenente una immagine simile alla Figura 2:

Figura 2: energia potenziale delle molle
Figura 2: energia potenziale delle molle

Parallelizzare la funzione step() trasformandola (in tutto o in parte) in un kernel CUDA.

Per compilare:

    nvcc cuda-coupled-oscillators.cu -o cuda-coupled-oscillators -lm

Per eseguire:

    ./cuda-coupled-oscillators [N]

Esempio:

    ./cuda-coupled-oscillators 1024

File