Simulación de una cantidad arbitraria (n) de cuerpos en el espacio tridimensional. Se simula algún fenómeno físico, como la atracción gravitacional o el electromagnetismo. Para este proyecto se usará atracción gravitacional usando modelos de física clásica.

1. Modelo físico

Magnitud de la fuerza de atracción gravitacional (fórmula tradicional de educación secundaria):

\[|\vec{F}| = G \frac{m_1 m_2}{|\vec{r}|^2}\]

La fuerza gravitacional que el cuerpo j ejerce sobre el cuerpo i y mantiene la dirección hacia el cuerpo en estudio i:

\[\vec{F_{i,j}} = -G \frac{m_i m_j}{|\vec{r_{i,j}}|^3} \vec{r_{i,j}}\]

\(\vec{r}\) es el vector distancia entre los cuerpos i y j, que se puede calcular a partir del vector posición \(\vec{x}\) del cuerpo, tomando al cuerpo i como el centro del sistema de referencia:

\[\vec{r_{i,j}} = \vec{x_i} - \vec{x_j}\]

La magnitud o norma de un vector cualquiera \(\vec{C}\) en el espacio es la distancia pitagórica al origen de sus componentes cartesianos x, y, z:

\[|\vec{C}| = \sqrt{C_x^2 + C_y^2 + C_z^2}\]

La fuerza gravitacional total (resultante) ejercida por todos los N - 1 cuerpos j sobre el cuerpo en estudio i es:

\[\vec{F_i} = -G \sum_{i \ne j}^{N} \frac{m_i m_j}{|\vec{r_{i,j}}|^3} \vec{r_{i,j}}\]

Para simular nos interesa obtener el vector posición en cada actualización de la simulación. La aceleración que va a sufrir el cuerpo i debido a la fuerza gravitacional total se puede obtener de \(\vec{F} = m \vec{a} \Rightarrow \vec{a} = \vec{F}/m\):

\[\vec{a_i} = -G \sum_{i \ne j}^{N} \frac{m_j}{|\vec{r_{i,j}}|^3} \vec{r_{i,j}}\]

La velocidad se puede obtener por la relación \(\vec{V} = \vec{V_0} + \vec{a} t\). La velocidad del cuerpo depende del tiempo t. La simulación se actualizará cada \(\Delta t\) segundos, lo cual es una constante:

\[\vec{V_{i,t+1}} = \vec{V_{i,t}} + \vec{a_i} \Delta t\]

De la relación \(\vec{V} = \vec{d}/t \Rightarrow \vec{d} = \vec{V}t\) Finalmente la posición que tendrá el cuerpo i en el tiempo t + 1 será:

\[\vec{x_{i,t+1}} = \vec{x_{i,t}} + \vec{V_{i,t+1}} \Delta t\]

Para efectos de la simulación, la posición de un cuerpo no se puede actualizar mientras se están actualizando otros cuerpos. Por lo tanto cada actualización de la simulación tendrá dos fases. En la primera se actualiza el vector de velocidad de cada cuerpo. Luego se actualizará la posición de cada cuerpo. En esta segunda fase podría ocurrir que dos cuerpos colisionen, lo cual se detecta cuando la suma de sus radios es mayor que la distancia que los separa:

\[r_i + r_j \gt |\vec{r_{i,j}}|\]

Cuando dos cuerpos colisionan, supóngase que se fusionan. El cuerpo más grande absorbe al más pequeño. El más pequeño deja de existir para efectos de la simulación, y el más grande continúa su movimiento con su masa incrementada y velocidad se afecta por la cantidad de movimiento (momentum). Esta es una colisión inelástica donde las masas se fusionan y continúan a una velocidad \(\vec{V}\) que conserva la cantidad de movimiento: \(m_a \vec{V_a} + m_b \vec{V_b} = (m_a + m_b)\vec{V}\), por lo que la nueva velocidad del cuerpo incrementado sería

\[\vec{V} = \frac{m_a \vec{V_a} + m_b \vec{V_b}} {m_a + m_b}\]

Para efectos de la simulación, si colisionan dos cuerpos de igual masa, supóngase que el el cuerpo con el índice más pequeño (el que se cargó primero del archivo de datos) absorbe al segundo.

El volumen del cuerpo que absorbe se incrementa en el volumen del cuerpo absorbido. Dado que todos los cuerpos en la simulación son esferas, su volumen V (no confundir con velocidad) se obtiene por la relación \(V = 4/3 \pi r^3\). Si dos cuerpos a y b se fusionan en un cuerpo c, el volumen del nuevo cuerpo sería \(V_c = V_a + V_b\), y su radio puede inferirse como

\[r_c = \sqrt[3]{r_a^3 + r_b^3}\]

2. Problema a resolver (en video)

n Título Video

1

Simulación de n-cuerpos. Fuerza gravitacional

📹

2

Archivo de cuerpos. Archivo de trabajo

📹

3

Modelo físico de fuerzas gravitacionales

📹

4

Cálculo de la aceleración, velocidad, y posición

📹

5

Detalles técnicos de la simulación. Colisiones de masas

📹

3. Evaluación

En todos los rubros se evalúan las buenas prácticas.

  1. [10%] Repositorio (commits equilibrados, ignores, tags). Directorios. Modularización de código y archivos. Clases deben estar en sus .hpp, .cpp.

  2. [10%] Análisis: readme.ext, problema, construcción, manual de usuario con ejemplos de ejecución.

  3. [10%] Casos de prueba manuales pequeño y casos grandes generados con software para mediciones.

  4. [10%] Diseño: documento de diseño, clases en UML o pseudocódigo.

  5. [10%] Procesa archivos de trabajo (job). Carga y escribe simulaciones de archivos.

  6. [10%] Implementa el modelo físico. Detiene la simulación cuando sólo queda un cuerpo o se acaba el tiempo.

  7. [10%] Paraleliza correctamente con hilos de ejecución (OpenMP).

  8. [10%] Distribuye correctamente con paso de mensajes (MPI).

  9. [10%] Comparaciones de rendimiento, gráficas, y discusión de al menos tres mediciones: serial, concurrente con hilos, y distribuida.

  10. [10%] Apego a una convención de estilos (lint). Documentación de interfaces (doxygen) e implementaciones (algoritmos).