From 87c866eaed7c8b15a3ac9359d88f06298482466f Mon Sep 17 00:00:00 2001 From: Dimitri Lozeve Date: Mon, 7 Dec 2020 19:26:38 +0100 Subject: [PATCH] Initial commit --- .gitignore | 1 + Makefile | 5 + README.org | 76 +++++++ grayscott.dyalog | 23 +++ img.png | Bin 0 -> 9005 bytes img.pnm | 502 +++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 607 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.org create mode 100644 grayscott.dyalog create mode 100644 img.png create mode 100644 img.pnm diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3f411f0 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*\~ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b595e08 --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +img.png: img.pnm + pnmtopng $< > $@ + +img.pnm: grayscott.dyalog + dyalog -nokbd -script $< diff --git a/README.org b/README.org new file mode 100644 index 0000000..97f0f7a --- /dev/null +++ b/README.org @@ -0,0 +1,76 @@ +* Reaction-Diffusion Model + +Reaction-Diffusion system simulation using the Gray-Scott model, in [[https://www.dyalog.com/][Dyalog APL]]. + +#+begin_src + ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ + ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ + ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ + ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ +⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ +⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ +⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺ ⌺⌺⌺⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺ ⌺⌺⌺⌺⌺ +⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺ +⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ +⌺⌺ ⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ +⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ + ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ + ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ + ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ + ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ + ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ + ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ +⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ +⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺ +⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺ +⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺ +⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺ +⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺ +⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺ ⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺⌺⌺ ⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺ +⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺ +⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺ +⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺ ⌺ +⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ + ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ + ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ ⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺⌺ +#+end_src diff --git a/grayscott.dyalog b/grayscott.dyalog new file mode 100644 index 0000000..81f1b9d --- /dev/null +++ b/grayscott.dyalog @@ -0,0 +1,23 @@ + ⎕IO←0 + ⍝ Discrete Laplacian + lapl←(⊃(+/1 ¯1(⌽+⊖)¨⊂)-(⊂4∘×)) + ⍝ Gray-Scott update + diffa←{dt×(da×lapl ⍺)+(-⍺×⍵*2)+f×1-⍺} + diffb←{dt×(db×lapl ⍵)+(⍺×⍵*2)-⍵×k+f} + update←{⍵+(⊃⍵[0])((⊂diffa),(⊂diffb))⊃⍵[1]} + ⍝ Parameters + dt da db f k←1.0 0.16 0.08 0.060 0.062 + ⍝ Initialization + N←200 + A←0.8+0.2×?N N⍴0 + A[((N÷2)-10)+⍳20;((N÷2)-10)+⍳20]←0.5 + B←0.2×?N N⍴0 + B[((N÷2)-10)+⍳20;((N÷2)-10)+⍳20]←0.25 + ⍝ Run + steps←10000 + Ap Bp←(update⍣steps)A B + ⍝ ' ⌺'[Ap>0.5] + ⍝ Export to image file + mat2pbm←{'P1'(⍕⌽⍴⍵),⍕¨↓⍵>0.5} ⍝ black and white + mat2pgm←{'P2'(⍕⌽⍴⍵),(⊂'255'),⍕¨↓⌊255×⍵} ⍝ grayscale + (⊂mat2pbm Ap)⎕NPUT'img.pnm'1 diff --git a/img.png b/img.png new file mode 100644 index 0000000000000000000000000000000000000000..1032b200e0b7ccee321692d788beff28bfe30d9e GIT binary patch literal 9005 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