Computer Simulations in Physics. Numerical modelling of natural phenomena. All written by me in C/C++/HTML5. Most of them are with the code available from me,
1) Fill the array with values 0/1 with probability 0.5.
2)
Loop over entire array, calculate the sum from the 8 neighbors (plus
the given node) and change the value according to the rule:
sum = 0 1 2 3 4 5 6 7 8 9 new value = 0 0 0 0 1 0 1 1 1
3)
Apply the ping-pong rule, that is, for two buffers in which we keep the
data A and B and creating new values we write into the second one so as
not to overwrite those from which we are to draw data in a given
iteration. Then we replace A with B and so on over and over again.
1) Wypełnij tablicę wartościami 0/1 z prawdopodobieństwem 0.5
2) Przejdź całą tablicę, oblicz sumę z 8 sąsiadów (plus dany węzeł) i zmień wartość wg reguły:
suma = 0 1 2 3 4 5 6 7 8 9
nowa wartość = 0 0 0 0 1 0 1 1 1 1
3) Zastosuj regułę ping-pong, to znaczy dla dwóch buforów, w których trzymamy dane A i B i tworząc nowe wartości z jednego z nich odczytujemy dane, a wpisujemy do drugiego po to, żeby nie nadpisywać tych, z których mamy czerpać dane w danej iteracji. Potem zamieniamy A z B i tak w kółko.
Przedstawiam kilka symulacji, które mogą pomóc zrozumieć podstawowe
zjawiska z fizyki fal. To, co je wyróżnia (tak mi się przynajmniej
wydaje ;) to, że są to symulacje trójwymiarowe z wizualizacją 4D (x,y,z i
kolor dla amplitudy. Zjawiska o których mówię, to:
Fala w pudełku 3D z pojedynczego źródła
Dyfrakcja fali na pojedynczej szczelinie
Dyfrakcja na podwójnej szczelinie + interferencja = eksperyment Younga (powstają prążki i tu je dobrze widać)
Ten
projekt to wynik mojej pracy z shaderami obliczeniowymi. Jest to
trójwymiarowa wersja różnic skonczonych, gdzie rozwiązywane jest
równanie falowe. W sumie to nic trudnego, sam model jest dobrze opisany w
mojej książce o symulacjach (Helion 2021). Najwięcej problemów sprawiła
tu wizualizacja, bo nie jest łatwo wizualizować dane wolumetryczne.
Porzuciłem jednak pomysł raymarchingu i wykonałem po prostu wizualizację
na cząsteczkach z alpha-blendingiem. Nie jest idealnie, ale coś
wreszcie widać.
Jeśli ktoś woli - można obejrzeć to samo w formie kompilacji z muzyką.
Zainteresowanych techniczną stroną programowania shaderów zapraszam do wysłuchania wykładu na ich temat - świeży, z tego tygodnia.
This sound small but takes me some time to find out.
My colleague asked me how to access (read or write) GPU buffer on the CPU side.
This is simple, you have to use mapping from OpenGL, so we basically do:
float *data = A.map<float>(GL_READ_ONLY);
// now you can read from data[] table on CPU side
This was trivial, what was not trivial (and I found it out from some examples as my program crashed all the time) - you have to.. unmap this as well after you use it, so you basically do: