Reaction Diffusion model leading to pattern formtaion

This model is usually referred to as the Scott-Grey model in the literature. Here I use a Crank-Nicolson scheme for the diffusion and RK4 along with Strang Splitting for the reaction. The RK4 is homemade and is not the built in Matlab version. For more information look for Reaction-Diffusion models.

Contents

Parameters

Grid and constants.

N=256
z=linspace(-1,1,N+1);
z=z(1:end-1);
L=2.5;
[x,y]=meshgrid(L*z,L*z);
t=0;
f=0.038;
kpar=0.06;
ru=2e-5;
rv=1e-5;
N =

   256

RK4 functions.

f1=@(u,v) -u.*v.*v+f*(1-u);
f2=@(u,v) u.*v.*v-(f+kpar)*v;

Initial conditions.

r2=x.*x+y.*y;
u0=ones(size(x)); v0=zeros(size(x));
u0=u0-(0.5).*exp(-(r2.^8)/((0.25*L)^8))+0.02*(rand(size(r2))-0.5);
v0=v0+(0.254).*exp(-(r2.^8)/((0.25*L)^8))+0.02*(rand(size(r2))-0.5);
u=u0;
v=v0;

Spectral parameters.

dk=pi/L;
ksvec(1)=0;
for ii=2:(N/2)
    ksvec(ii)=ii-1;
    ksvec(N/2+ii)=-N/2 + ii -1;
end
ksvec=ksvec*dk;
[k2,l2]=meshgrid(ksvec.^2,ksvec.^2);
ksvec(N/2+1)=0;
[k,l]=meshgrid(ksvec,ksvec);
k2=k.*k; l2=l.*l;
lapu=-ru*(k2+l2);
lapv=-rv*(k2+l2);

Time and output parameters.

dt=0.2;
dto2=dt/2;
dt2=dt*dt;
numsteps=500;
numouts=5;

Plot ICs

figure(1)
clf
set(gcf,'DefaultLineLineWidth',3,'DefaultTextFontSize',12,...
    'DefaultTextFontWeight','bold','DefaultAxesFontSize',12,...
    'DefaultAxesFontWeight','bold');
subplot(2,1,1)
pcolor(x,y,u); shading interp
xlabel('x','fontweight','bold','fontsize',12);
ylabel('y','fontweight','bold','fontsize',12);
colorbar
mystr=['time = ' num2str(t)];
title(mystr);
subplot(2,1,2)
pcolor(x,y,v); shading interp
xlabel('x','fontweight','bold','fontsize',12);
ylabel('y','fontweight','bold','fontsize',12);
colorbar
drawnow

Set up Strang splitting.

myfactue=dt*lapu;
myfactve=dt*lapv;
myfactu=(1+dto2*lapu)./(1-dto2*lapu);
myfactv=(1+dto2*lapv)./(1-dto2*lapv);

Main Loop

for ii=1:numouts
    for jj=1:numsteps
        t=t+dt;

Strang split two steps at a time reversing order.

        u=ifft2(myfactu.*fft2(u));
        v=ifft2(myfactv.*fft2(v));

RK4.

        rkk1=f1(u,v);
        rkl1=f2(u,v);
        rkk2=f1(u+0.5*dt*rkk1,v+0.5*dt*rkl1);
        rkl2=f2(u+0.5*dt*rkk1,v+0.5*dt*rkl1);
        rkk3=f1(u+0.5*dt*rkk2,v+0.5*dt*rkl2);
        rkl3=f2(u+0.5*dt*rkk2,v+0.5*dt*rkl2);
        rkk4=f1(u+dt*rkk3,v+0.5*dt*rkl3);
        rkl4=f2(u+dt*rkk3,v+0.5*dt*rkl3);
        kforrk=(dt/6)*(rkk1+2*rkk2+2*rkk3+rkk4);
        lforrk=(dt/6)*(rkl1+2*rkl2+2*rkl3+rkl4);

First part.

        u=u+kforrk;
        v=v+lforrk;

Second step in reverse order now.

        t=t+dt;
        % RK4
        rkk1=f1(u,v);
        rkl1=f2(u,v);
        rkk2=f1(u+0.5*dt*rkk1,v+0.5*dt*rkl1);
        rkl2=f2(u+0.5*dt*rkk1,v+0.5*dt*rkl1);
        rkk3=f1(u+0.5*dt*rkk2,v+0.5*dt*rkl2);
        rkl3=f2(u+0.5*dt*rkk2,v+0.5*dt*rkl2);
        rkk4=f1(u+dt*rkk3,v+0.5*dt*rkl3);
        rkl4=f2(u+dt*rkk3,v+0.5*dt*rkl3);
        kforrk=(dt/6)*(rkk1+2*rkk2+2*rkk3+rkk4);
        lforrk=(dt/6)*(rkl1+2*rkl2+2*rkl3+rkl4);

Second part.

        u=u+kforrk;
        v=v+lforrk;

Diffusion.

        u=ifft2(myfactu.*fft2(u));
        v=ifft2(myfactv.*fft2(v));
    end

Plot

    figure(1)
    clf
    set(gcf,'DefaultLineLineWidth',3,'DefaultTextFontSize',12,...
        'DefaultTextFontWeight','bold','DefaultAxesFontSize',12,...
        'DefaultAxesFontWeight','bold');
    subplot(2,1,1)
    pcolor(x,y,u); shading interp
    xlabel('x','fontweight','bold','fontsize',12);
    ylabel('y','fontweight','bold','fontsize',12);
    colorbar
    mystr=['time = ' num2str(t)];
    title(mystr);
    subplot(2,1,2)
    pcolor(x,y,v); shading interp
    xlabel('x','fontweight','bold','fontsize',12);
    ylabel('y','fontweight','bold','fontsize',12);
    colorbar
    drawnow
end