Hola Decidí compartir con mis lectores mis pequeños experimentos con sistemas de partículas en un espacio tridimensional. Tomé como base la publicación en Habré sobre experimentos con partículas en el espacio 2D.

Comencemos con un enlace a un artículo que me empujó a la acción. Pero hay otra razón, ya que recientemente me he mudado cada vez más a Ubuntu en mis experimentos, muchas cosas han sido buenas desde la instalación gratuita del sistema operativo y luego en la lista de ventajas. Hay desventajas, tengo problemas con los controladores para la instalación de sistemas operativos no estándar, como dos tarjetas de video y varios monitores.
Tomé C ++ como base, agregué soporte para CUDA como plataforma informática, hay muchas partículas y el procesador central obviamente no puede hacer frente a tal carga en tiempo real, y el motor de gráficos Ogre3D para ellos en la empresa. Hicieron la papilla, sazonaré la narrativa Gif con animaciones y citas del artículo sobre la versión 2D de la simulación.
"Primero, seguí los pasos del juego de la" vida ": cada partícula tiene un contador de" sobrepoblación ", que es igual a la suma de los cuadrados inversos de las distancias a otras partículas. Si este contador es menor que cierto límite, es decir, hay pocos vecinos, entonces la partícula es atraída por otras partículas, y si hay muchos vecinos, se repele, si las partículas se cruzan, entonces se repelen en cualquier caso, para que no se crucen entre sí.
Dispersamos al azar partículas alrededor del campo y vemos qué sucede ".

Video avanzado
Ahora un poco sobre la lógica de lo que está sucediendo en el programa. Se crea una matriz de partículas con ciertos parámetros. Algunos de los parámetros son responsables de las propiedades físicas: radio, masa, velocidad, etc., parte de la creación de enlaces entre partículas, tales como: tipo de partículas, número de conexiones de partículas con otras partículas, etc. En promedio, utilicé de 700 a 3000 partículas en la simulación, ya que quería contar en tiempo real, un valor mayor condujo a la inhibición de la imagen debido al aumento en el volumen de los cálculos. Luego, todo esto se transfiere a la memoria de la tarjeta de video, donde la GPU, en el modo de paralelización fuerte, procesa tres subprogramas principales: simulación del movimiento de partículas, procesamiento de colisiones de partículas (colisiones) y la formación y destrucción de enlaces entre partículas.
"Estamos cambiando las reglas del juego. Ya no contaremos vecinos. Dejemos que las partículas simplemente se atraigan o rechacen según sus tipos. Si todas las partículas son del mismo tipo, entonces solo hay 2 opciones: todas se repelen o todas se atraen".
Probé varias opciones para fuerzas atractivas-repulsivas, dependencias lineales de las distancias entre partículas, inversamente proporcionales a la distancia, etc. se decidió por la dependencia cuadrática inversa, pero con una restricción en el radio de acción, algo así como un radio de 45 partículas.

"No cambiaremos mucho las reglas. En cambio, agregaremos una nueva característica. Ahora las partículas formarán enlaces a una corta distancia. Si las partículas están conectadas, se atraen constantemente entre sí. Esta atracción no se debilita con la distancia. Pero, si la distancia está por encima de cierto umbral, entonces la conexión está rota ".
Aquí, la regla cambió un poco, introdujo la distancia de formación del enlace, es la distancia de destrucción del enlace y la distancia de reposo de la partícula en el enlace, es decir, la partícula está constantemente tratando de tomar una posición cerca de la posición de descanso, por lo tanto, en un momento discreto, la partícula oscila cerca de la posición cero. Esto es visible en todos los videos. Es posible aplicar leyes más complejas al formar un vínculo como la elasticidad, pero por ahora lo he simplificado, pero tenemos una "sopa primaria" y no una sustancia sólida.

Video avanzado
o como una foto

Entonces comenzó el proceso de prueba y error. En primer lugar, la programación en la GPU requiere un cuidado especial con respecto a las llamadas "carreras en lectura-modificación-escritura de datos compartidos", lo que significa que puede haber problemas cuando varios hilos intentan simultáneamente cambiar la variable. Las inestabilidades surgen así:

Luego fue necesario limitar el área de espacio en la que se lleva a cabo el experimento, lo primero que se me ocurrió es un cubo. Pero gracias a los errores de las primeras versiones del programa, las partículas se arrastraron audazmente, formando algo similar a las estaciones espaciales de la ficción de los años 70.

versión extendida de video
Como dice el refrán, si no es un cubo, que haya una bola:
Aquí la lógica es que después de la partida desde el centro de la partícula, una fuerza comienza a actuar opuesta a su movimiento, que incluso parece gravedad.
__device__ static int Links[3][3] = {{1,0,1},{1,0,0},{1,1,0}}; __device__ static int LinksField[3][3] = {{0,0,0},{0,0,1},{0,0,0}}; __device__ static int LinkTypeSize[3] = {3,8,2}; __device__ static int LinkTypePP[3][3] = {{0,1,1},{8,1,6},{0,1,1}};
Él trajo una pieza de código tal como es, estas son matrices de interacción de tres tipos de partículas entre sí.
-la primera línea es el principio de formación de enlaces: 1 existe la oportunidad de establecer una conexión con otra partícula, 0 en consecuencia no.
-la segunda línea es la ley de atracción de repulsión de partículas. De hecho, en esta realización, todos se repelen entre sí, excepto por la atracción del segundo tipo de partículas hacia el tercero. Por supuesto, puede reflejar la matriz, pero en este caso.
La tercera línea es el número de enlaces de partículas comunes por tipo.
-el cuarto es el número de enlaces de partículas con cada tipo de partícula. El primer tipo, por ejemplo, no puede formar un enlace consigo mismo.
Obtenemos partículas en un fuerte movimiento browniano:

versión extendida de video
Tuve que introducir la pérdida de energía en colisiones.

versión extendida de video
Todo se ha vuelto demasiado estático, reducimos las fuerzas de interacción de partículas.

versión extendida de video
Si mira el video, puede ver cómo se está construyendo el marco. Entonces permanece estático de todos modos.
Cambiamos las reglas con respecto a los coeficientes de la matriz.

versión extendida de video
Vemos la formación de la semejanza de moléculas orgánicas. Incluso hay anillos de benceno.
Otro video muestra lo que sucederá si cambia la longitud de los enlaces entre las partículas en la dinámica, desde el segundo minuto del video esto es especialmente pronunciado.
Pero debemos intentar repetir la versión del autor 2D, cuyas citas están en el cuerpo del artículo. Hay una variante de tal "vida":
o tal
¿Qué se puede agregar? En primer lugar, las fuentes del programa . En segundo lugar, hay varios artículos en el centro que describen autómatas celulares o sistemas libres (en teoría, un autómata celular es el equivalente de una máquina de Turing ) con un encabezado que incluye la palabra "vida", así que decidí usarlo también, como una tradición. Aunque es más bien un simple caleidoscopio, las reglas simples dan lugar a comportamientos complejos como partículas y un sistema de espejos en el juguete de un niño.
Y el video agregó, de hecho, una imagen fascinante, parece moléculas, luego redes neuronales, pero la vida aún no está allí. Como una opción de desarrollo, es necesario agregar la genética, pero no está claro qué función física pueden tener estas "criaturas".

Espero que a alguien le guste y se alejará de 3D a medida que el autor haya pasado de 2D. Lo principal para mí fue repetir las lecciones sobre CUDA y Ogre3D en Ubuntu.
Y habrá ideas para escribir, tal vez se nos ocurra algo interesante :)