Hai! Saya memutuskan untuk membagikan kepada para pembaca eksperimen kecil saya dengan sistem partikel dalam ruang tiga dimensi. Saya mengambil sebagai dasar publikasi tentang Habré tentang eksperimen dengan partikel dalam ruang 2D.

Mari kita mulai dengan tautan ke artikel yang mendorong saya untuk bertindak. Tetapi ada alasan lain, karena baru-baru ini saya telah semakin banyak pindah ke Ubuntu dalam percobaan saya, banyak hal telah baik sejak instalasi OS gratis dan kemudian pada daftar plus. Ada beberapa kekurangan, saya mengalami kesulitan dengan driver untuk instalasi OS non-standar seperti dua kartu video dan beberapa monitor.
Saya mengambil C ++ sebagai dasar, menambahkan dukungan untuk CUDA sebagai platform komputasi, ada banyak partikel dan prosesor pusat jelas tidak dapat mengatasi beban seperti itu secara real time, dan mesin grafis Ogre3D untuk mereka di perusahaan. Mereka membuat bubur, saya akan membumbui narasi Gif dengan animasi dan kutipan dari artikel pada versi 2D dari simulasi.
"Pertama saya mengikuti jejak" hidup "permainan: setiap partikel memiliki counter" overpopulation ", yang sama dengan jumlah kuadrat terbalik dari jarak ke partikel lain. Jika penghitung ini kurang dari batas tertentu, yaitu, ada beberapa tetangga, maka partikel tertarik pada partikel lain, dan jika ada banyak tetangga, ia menolak, jika partikel-partikel berpotongan, maka mereka menolak dalam hal apa pun, agar tidak saling melewati.
Kami secara acak menyebarkan partikel di sekitar lapangan dan melihat apa yang terjadi. "

Video Tingkat Lanjut
Sekarang sedikit tentang logika apa yang terjadi dalam program ini. Susunan partikel dengan parameter tertentu dibuat. Beberapa parameter bertanggung jawab atas sifat fisik: jari-jari, massa, kecepatan, dll., Bagian untuk menciptakan ikatan antar partikel, seperti: jenis partikel, jumlah koneksi partikel dengan partikel lain, dll. Rata-rata, saya menggunakan 700 hingga 3.000 partikel dalam simulasi, karena saya ingin menghitung secara real time, nilai yang lebih besar menyebabkan penghambatan gambar karena peningkatan volume perhitungan. Kemudian semua hal ini ditransfer ke memori kartu video, di mana GPU, dalam mode paralelisasi yang kuat, memproses tiga subprogram utama: simulasi gerakan partikel, pemrosesan tumbukan partikel (tumbukan) dan pembentukan dan penghancuran ikatan antar partikel.
"Kami mengubah aturan permainan. Kami tidak akan lagi menghitung tetangga. Biarkan partikel hanya menarik atau menolak tergantung pada jenisnya. Jika semua partikel dari jenis yang sama, maka hanya ada 2 pilihan: mereka semua mengusir atau semua menarik."
Saya mencoba beberapa opsi untuk gaya menarik-tolak, ketergantungan linear pada jarak antar partikel, berbanding terbalik dengan jarak, dll. menetap pada ketergantungan kuadrat terbalik, tetapi dengan batasan pada jari-jari aksi, sekitar 45 jari-jari partikel.

"Kami tidak akan banyak mengubah aturan. Sebaliknya, kami akan menambahkan fitur baru. Sekarang partikel akan membentuk ikatan pada jarak pendek. Jika partikel-partikel tersebut saling terhubung, maka mereka akan saling tertarik secara konstan. Daya tarik ini tidak melemah dengan jarak. Tapi, jika jaraknya berada di atas ambang batas tertentu, maka koneksi terputus. "
Di sini, aturan berubah sedikit, memperkenalkan jarak pembentukan ikatan, itu adalah jarak penghancuran ikatan dan jarak istirahat partikel dalam ikatan, yaitu, partikel terus berusaha mengambil posisi di dekat posisi istirahat, oleh karena itu, pada waktu yang terpisah, partikel berosilasi di dekat posisi nol. Ini terlihat di semua video. Dimungkinkan untuk menerapkan hukum yang lebih rumit ketika membentuk ikatan seperti elastisitas, tetapi untuk sekarang saya telah menyederhanakannya, namun kami memiliki "sup primer" dan bukan zat padat.

Video Tingkat Lanjut
atau seperti gambar

Kemudian proses coba-coba dimulai. Pertama, pemrograman pada GPU memerlukan perhatian ekstra terhadap apa yang disebut "balapan baca-modifikasi-tulis data bersama", yang berarti bahwa mungkin ada masalah ketika beberapa utas secara bersamaan mencoba mengubah variabel. Ketidakstabilan muncul seperti ini:

Maka perlu untuk membatasi area ruang di mana eksperimen berlangsung, hal pertama yang terlintas dalam pikiran adalah kubus. Tetapi berkat bug dari versi pertama program, partikel-partikel dengan berani merangkak keluar darinya, membentuk sesuatu yang mirip dengan stasiun ruang angkasa dari fiksi tahun 70-an.

versi video yang diperpanjang
Seperti kata pepatah, jika bukan kubus, maka biarkan ada bola:
Di sini logikanya adalah bahwa setelah kepergian dari pusat partikel, suatu gaya mulai bertindak berlawanan dengan gerakannya, yang bahkan tampak seperti gravitasi.
__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}};
Dia membawa sepotong kode apa adanya, ini adalah matriks interaksi tiga jenis partikel satu sama lain.
-lini pertama adalah prinsip pembentukan ikatan: 1 ada peluang untuk membangun hubungan dengan partikel lain, 0 karenanya tidak.
- baris kedua adalah hukum tarik-menarik tolakan partikel. Faktanya, dalam perwujudan ini, semua saling tolak, kecuali tarik partikel tipe kedua hingga ketiga. Anda tentu saja dapat mencerminkan matriks, tetapi dalam kasus ini.
-Lini ketiga adalah jumlah ikatan partikel umum berdasarkan jenis.
-4 adalah jumlah ikatan partikel dengan masing-masing jenis partikel.Jenis pertama, misalnya, tidak dapat membentuk ikatan dengan dirinya sendiri.
Kami mendapatkan partikel dalam gerakan Brown yang kuat:

versi video yang diperpanjang
Saya harus memperkenalkan kehilangan energi dalam tabrakan.

versi video yang diperpanjang
Semuanya menjadi terlalu statis, kita mengurangi kekuatan interaksi partikel.

versi video yang diperpanjang
Jika Anda menonton video, Anda dapat melihat bagaimana frame dibuat. Maka itu tetap statis.
Kami mengubah aturan tentang koefisien matriks.

versi video yang diperpanjang
Kami melihat pembentukan persamaan molekul organik. Bahkan ada cincin benzena.
Video lain menunjukkan apa yang akan terjadi jika Anda mengubah panjang ikatan antara partikel dalam dinamika, sejak menit kedua video ini terutama diucapkan.
Tetapi kita harus mencoba mengulangi versi penulis 2D, yang kutipannya ada di badan artikel. Ada varian "kehidupan" seperti itu:
atau semacamnya
Apa yang bisa ditambahkan? Pertama, sumber program . Kedua, ada beberapa artikel di hub yang menggambarkan automata seluler atau sistem bebas (secara teori, otomat seluler adalah setara dengan mesin Turing ) dengan judul yang diberikan yang mencakup kata "hidup", jadi saya memutuskan untuk menggunakannya juga, semacam tradisi. Meskipun ini lebih dari sekadar kaledoskop, aturan sederhana memunculkan perilaku kompleks seperti partikel dan sistem cermin pada mainan anak-anak.
Dan video menambahkan, pada kenyataannya, gambar yang menyihir, tampaknya molekul, kemudian jaringan saraf, tetapi kehidupan belum ada di sana. Sebagai opsi pengembangan, genetika perlu ditambahkan, tetapi tidak jelas apa yang mungkin menjadi fungsi kebugaran untuk "makhluk" ini.

Saya harap seseorang akan menyukainya dan akan melangkah lebih jauh dari 3D karena penulis telah melangkah dari 2D. Hal utama bagi saya adalah mengulang pelajaran tentang CUDA dan Ogre3D di bawah Ubuntu.
Dan akan ada ide menulis, mungkin kita akan datang dengan sesuatu yang menarik :)