grayscott.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. # -----------------------------------------------------------------------------
  2. # From Numpy to Python
  3. # Copyright (2017) Nicolas P. Rougier - BSD license
  4. # More information at https://github.com/rougier/numpy-book
  5. # https://www.labri.fr/perso/nrougier/from-python-to-numpy/code/gray_scott.py
  6. # Parameters from http://www.aliensaint.com/uo/java/rd
  7. # Adapted for vedo by Marco Musy (2020)
  8. # -----------------------------------------------------------------------------
  9. """Grey-Scott reaction-diffusion system"""
  10. import numpy as np
  11. from vedo import Plotter, Grid
  12. # ---------------------------------------------------------------
  13. Nsteps = 300
  14. n = 200 # grid subdivisions
  15. #Du, Dv, F, k, name = 0.16, 0.08, 0.035, 0.065, 'Bacteria 1'
  16. #Du, Dv, F, k, name = 0.14, 0.06, 0.035, 0.065, 'Bacteria 2'
  17. #Du, Dv, F, k, name = 0.16, 0.08, 0.060, 0.062, 'Coral'
  18. #Du, Dv, F, k, name = 0.19, 0.05, 0.060, 0.062, 'Fingerprint'
  19. #Du, Dv, F, k, name = 0.10, 0.10, 0.018, 0.050, 'Spirals'
  20. #Du, Dv, F, k, name = 0.12, 0.08, 0.020, 0.050, 'Spirals Dense'
  21. #Du, Dv, F, k, name = 0.10, 0.16, 0.020, 0.050, 'Spirals Fast'
  22. #Du, Dv, F, k, name = 0.16, 0.08, 0.020, 0.055, 'Unstable'
  23. #Du, Dv, F, k, name = 0.16, 0.08, 0.050, 0.065, 'Worms 1'
  24. #Du, Dv, F, k, name = 0.16, 0.08, 0.054, 0.063, 'Worms 2'
  25. Du, Dv, F, k, name = 0.16, 0.08, 0.035, 0.060, 'Zebrafish'
  26. # ---------------------------------------------------------------
  27. Z = np.zeros((n+2, n+2), [('U', np.double), ('V', np.double)])
  28. U, V = Z['U'], Z['V']
  29. u, v = U[1:-1, 1:-1], V[1:-1, 1:-1]
  30. r = 20
  31. u[...] = 1.0
  32. U[n//2-r:n//2+r, n//2-r:n//2+r] = 0.50
  33. V[n//2-r:n//2+r, n//2-r:n//2+r] = 0.25
  34. u += 0.05*np.random.uniform(-1, 1, (n, n))
  35. v += 0.05*np.random.uniform(-1, 1, (n, n))
  36. sy, sx = V.shape
  37. grd = Grid(s=[sx,sy], res=[sx,sy])
  38. grd.linewidth(0).wireframe(False).lighting(ambient=0.5)
  39. formula = r'(u,v)=(D_u\cdot\Delta u -u v v+F(1-u), D_v\cdot\Delta v +u v v -(F+k)v)'
  40. print('Du, Dv, F, k, name =', Du, Dv, F, k, name)
  41. def loop_func(event):
  42. global u, v
  43. for _ in range(25):
  44. Lu = ( U[0:-2, 1:-1] +
  45. U[1:-1, 0:-2] - 4*U[1:-1, 1:-1] + U[1:-1, 2:] +
  46. U[2: , 1:-1])
  47. Lv = ( V[0:-2, 1:-1] +
  48. V[1:-1, 0:-2] - 4*V[1:-1, 1:-1] + V[1:-1, 2:] +
  49. V[2: , 1:-1])
  50. uvv = u*v*v
  51. u += Du*Lu - uvv + F*(1-u)
  52. v += Dv*Lv + uvv - (F+k)*v
  53. grd.cmap('ocean_r', V.ravel(), on='cells', name="escals")
  54. grd.map_cells_to_points() # interpolate cell data to point data
  55. z = grd.pointdata['escals']*25
  56. newverts = grd.points.copy() # get the original points
  57. newverts[:,2] = z # assign z elevation
  58. grd.points = newverts # update the mesh points
  59. plt.render()
  60. plt = Plotter(bg='linen')
  61. plt.add_callback("timer", loop_func)
  62. plt.timer_callback("start")
  63. plt.show(grd, __doc__, zoom=1.25, elevation=-30)
  64. plt.close()