Oi Decidi compartilhar com meus leitores minhas pequenas experiências com sistemas de partículas no espaço tridimensional. Tomei como base a publicação em Habré sobre experimentos com partículas no espaço 2D.

Vamos começar com um link para um artigo que me levou à ação. Mas há outro motivo: desde que recentemente mudei cada vez mais para o Ubuntu em meus experimentos, muitas coisas foram boas desde a instalação gratuita do sistema operacional e depois na lista de vantagens. Há desvantagens, tenho problemas com drivers para instalação não padrão do sistema operacional, como duas placas de vídeo e vários monitores.
Tomei o C ++ como base, adicionei suporte ao CUDA como plataforma de computação, existem muitas partículas e o processador central obviamente não consegue lidar com essa carga em tempo real, e o mecanismo gráfico Ogre3D para eles na empresa. Eles fizeram o mingau, vou temperar a narrativa do GIF com animações e citações do artigo na versão 2D da simulação.
"Primeiro, segui os passos do jogo da" vida ": cada partícula tem um contador de" superpopulação ", que é igual à soma dos quadrados inversos das distâncias de outras partículas. Se esse contador é menor que um determinado limite, ou seja, existem poucos vizinhos, a partícula é atraída por outras partículas e se houver muitos vizinhos, repele-se; se as partículas se cruzam, elas se repelem em qualquer caso, para não passar uma pela outra.
Espalhamos aleatoriamente partículas pelo campo e vemos o que acontece ".

Vídeo Avançado
Agora um pouco sobre a lógica do que está acontecendo no programa. Uma matriz de partículas com certos parâmetros é criada. Alguns dos parâmetros são responsáveis pelas propriedades físicas: raio, massa, velocidade etc., parte para criar ligações entre partículas, como: tipo de partículas, número de conexões de partículas com outras partículas, etc. Em média, usei de 700 a 3000 partículas na simulação, pois queria contar em tempo real, um valor maior levou à inibição da imagem devido ao aumento no volume de cálculos. Então, todo esse material é transferido para a memória da placa de vídeo, onde a GPU, no forte modo de paralelização, processa três subprogramas principais: simulação de movimento de partículas, processamento de colisões de partículas e formação e destruição de ligações entre partículas.
"Estamos mudando as regras do jogo. Não contaremos mais os vizinhos. Deixe as partículas simplesmente atrairem ou repelirem, dependendo de seus tipos. Se todas as partículas são do mesmo tipo, então existem apenas duas opções: elas repelem ou atraem".
Tentei várias opções para forças atrativas-repulsivas, dependências lineares das distâncias entre partículas, inversamente proporcional à distância, etc. estabeleceu-se na dependência quadrática inversa, mas com uma restrição no raio de ação, algo como 45 raios de partículas.

"Não mudaremos muito as regras. Em vez disso, adicionaremos um novo recurso. Agora as partículas formarão ligações a uma curta distância. Se as partículas estiverem conectadas, elas serão constantemente atraídas uma pela outra. Essa atração não diminui com a distância. Mas, se a distância estiver acima de um certo limite, então a conexão está interrompida ".
Aqui, a regra mudou um pouco, introduziu a distância de formação de ligações, é a distância de destruição de ligações e a distância de repouso da partícula na ligação, ou seja, a partícula está constantemente tentando tomar uma posição perto da posição de repouso, portanto, em um tempo discreto, a partícula oscila perto da posição zero. Isso é visível em todos os vídeos. É possível aplicar leis mais complexas ao formar um vínculo como a elasticidade, mas por enquanto eu o simplifiquei, ainda temos uma "sopa primária" e não uma substância sólida.

Vídeo Avançado
ou como uma imagem

Em seguida, o processo de tentativa e erro começou. Em primeiro lugar, a programação na GPU requer cuidados extras com as chamadas "corridas na leitura, modificação, gravação e gravação de dados compartilhados", o que significa que pode haver problemas quando vários threads simultaneamente tentam alterar a variável. Instabilidades surgem assim:

Então foi necessário limitar a área de espaço em que o experimento ocorre, a primeira coisa que veio à mente é um cubo. Mas, graças aos bugs das primeiras versões do programa, partículas corajosamente saíam dele, formando algo semelhante às estações espaciais da ficção dos anos 70.

versão estendida do vídeo
Como diz o ditado, se não um cubo, então deixe haver uma bola:
Aqui a lógica é que, após a partida do centro da partícula, uma força começa a agir oposta ao seu movimento, que até se parece com a gravidade.
__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}};
Ele trouxe um pedaço de código como é, são matrizes de interação de três tipos de partículas entre si.
- a primeira linha é o princípio da formação de ligações: 1 existe a oportunidade de estabelecer uma conexão com outra partícula, 0, respectivamente, não.
-a segunda linha é a lei da atração de repulsão de partículas. De fato, nesta modalidade, todos se repelem, exceto pela atração do segundo tipo de partículas para o terceiro. É claro que você pode espelhar a matriz, mas neste caso.
-a terceira linha é o número de ligações de partículas comuns por tipo.
quarta é o número de ligações de partículas com cada tipo de partícula.O primeiro tipo, por exemplo, não pode formar uma ligação consigo mesmo.
Obtemos partículas em um forte movimento browniano:

versão estendida do vídeo
Eu tive que introduzir perda de energia em colisões.

versão estendida do vídeo
Tudo ficou muito estático, reduzimos as forças de interação das partículas.

versão estendida do vídeo
Se você assistir ao vídeo, poderá ver como o quadro está sendo construído. Então ele permanece estático de qualquer maneira.
Mudamos as regras em relação aos coeficientes da matriz.

versão estendida do vídeo
Vemos a formação da semelhança de moléculas orgânicas. Existem até anéis de benzeno.
Outro vídeo demonstra o que acontecerá se você alterar a duração das ligações entre partículas na dinâmica, a partir do segundo minuto do vídeo, isso é especialmente pronunciado.
Mas devemos tentar repetir a versão do autor 2D, cujas citações estão no corpo do artigo. Existe uma variante dessa "vida":
ou tal
O que pode ser adicionado? Em primeiro lugar, as fontes do programa . Em segundo lugar, existem vários artigos no hub que descrevem autômatos celulares ou sistemas livres (em teoria, um autômato celular é equivalente a uma máquina de Turing ) com um cabeçalho renderizado que inclui a palavra "vida", então decidi usá-lo também, como uma tradição. Embora seja apenas um kaledoscópio, regras simples dão origem a comportamentos complexos, como partículas e um sistema de espelhos em brinquedos infantis.
E o vídeo acrescentou, de fato, uma imagem fascinante, parece moléculas, depois redes neurais, mas a vida ainda não está lá. Como opção de desenvolvimento, a genética precisa ser adicionada, mas não está claro o que pode ser uma função de condicionamento físico para essas "criaturas".

Espero que alguém goste e isso se afaste do 3D, pois o autor saiu do 2D. O principal para mim foi repetir as lições sobre CUDA e Ogre3D no Ubuntu.
E haverá idéias para escrever, talvez tenhamos algo interessante :)