Sin patria ni banderas, ahora vivo a mi manera; y es que me siento extranjero fuera de tus agujeros (Tercer movimiento: Lo de dentro, Extremoduro)
The technique I experimented with in this post is an endless source to obtain amazing images. It is called reaction-diffusion and simulates the evolution of a system where several substances interact chemically transforming into each other (reaction) and spreading out over a surface in space (diffusion). In my case there are just two substances in a 2D space and the evolution of system is simulated using the Gray-Scott algorithm which is ruled by several parameters that, once determined, can produce images like this one:
This article by Karl Sims, is a very clear and comprehensive explanation of the Gray-Scott algorithm. Briefly, the Gray-Scott model simulates the evolution of two substances, A and B in a two dimensional grid. In each cell of the grid, the substance A is added at a given feed rate
f. Then, both substances react following this rule: two particles of B convert a particle of A into a particle of B. To prevent overpopulation, B particles are killed at a given kill rate
k. In the diffusion phase, both substances spread out accross the cells of the grid at a given diffusion rates
Db. The diffusion is performed using a 2D Lapacian operator with a
3x3 convolution matrix
In the article you can find the equations that rule the system, which depend on the parameters described in the previous paragraph. To obtain all the images of this post, I maintained most of them always constant and just changed the following:
- Feed and kill rates (
- The initial proportion of both substances A and B. I always started with A=0 in each cell and B=1 in some (small) amount of them selected randomly or according to some geometrical considerations (and inner circle or square, for example). I let you to try with your own ideas.
Sometimes the system converges and remains stable after a number of iterations. For example, these images are obtained iterating 5000 times:
Before converging you can obtain also nice patterns in between:
The variety of patterns is amazing: tessellations, lattices, caleidoscopic … some more examples:
I used again
Rcpp to iterate efficiently but now I tried
C++ library for linear algebra and scientific computing because it contains a class called cube, which is a 3D matrix that fits perfectly into a 2D grid where the 3rd dimension is the amount of particles A and B.
I like to share my code because I think it may serve as a source of inspiration to someone. You can find the code here with just one of the many configurations I tried to generate the previous images. It may serve you as a good starting point to explore you own ones. Let me know if you reach interesting places.
Happy New Year 2020.
10 thoughts on “Reaction Diffusion”
#Load in libraries
library(Rcpp) #to iterate fast
# Import C++ code
sourceCpp(‘cpp_funcs.cpp’) ####FAILING CODE
Why fails? May you copy the log or clarify the error a bit more? Thanks!
I would love the R code.
Surely this will inspire something…
Very good. I’ve done an animation: https://thumbs.gfycat.com/SeveralIncomparableChupacabra-size_restricted.gif
Nice! Thank you!
Muchas gracias 🙂
I love your code and i would like a “lazy” R function to see inside what the params DA, DB, f, and k are actually doing. But nevertheless, i had fun with your code, and i will continue to explore it. Thanks so much for sharing it. I hope you are well, take care, Monica
Thanks a lot Monica 🙂