KT = 200;
KP = 6;
KY = 80;
steps = KT*KP;

T = KT*KP;
dt = T / steps;
L = 1;
N = 80;
h = 1/N;

D_a = 0.01/KY^2;
D_b = 0.3/KY^2;
D_c = 0.002/KY^2;

r_a = 0.08;
r_b = 0;
r_c = 0.01;

b_a = 0.01;
b_b = 0.08;
b_c = 0;

s_a = 0.1;
s_b = 0;
s_c = 1;

G_a = 1;
G_b = 1;
G_c = 1;


% FIXME: this works only because G_* is 1
a = ones(steps/KP, N);
b = ones(steps/KP, N);
c = ones(steps/KP, N);

na = zeros(1, N);
nb = zeros(1, N);
nc = zeros(1, N);
        
%octave-3.0.3:26> s = r_a * (1 + 0.1 * (rand(1,N)-0.5));
s = r_a * (1 + 0.05 * sin(linspace(0, 10*pi, N)));

e = ones(N,1)/h^2;
Lap = spdiags([e -2*e e], -1:1, N, N);
Lap(1,1) = -e(1);
Lap(N,N) = -e(1);

for n=1:steps/KP
    for k=1:KP
        oa = a(n,:);
        ob = b(n,:);
        oc = c(n,:);
        
        if 0        
        for j=1:N
            ooa = oa(j);
            oob = ob(j);
            ooc = oc(j);
            
            if j == 1
                j_links = j;
            else
                j_links = j - 1;
            end
            if j == N
                j_rechts = j;
            else
                j_rechts = j + 1;
            end
            
            aq = s(j) * oob * ((ooa^2 + b_a) / (1 + s_a * ooa^2)) / (s_b + s_c * ooc);
            olddecaydiffA = -r_a * ooa + D_a / h^2 * (oa(j_links) + oa(j_rechts) - 2 * ooa);
            olddecaydiffB = -r_b * oob + D_b / h^2 * (ob(j_links) + ob(j_rechts) - 2 * oob);
            olddecaydiffC = -r_c * ooc + D_c / h^2 * (oc(j_links) + oc(j_rechts) - 2 * ooc);
            na(j) = olddecaydiffA + aq;
            nb(j) = olddecaydiffB - aq + b_b;
            nc(j) = olddecaydiffC + r_c * ooa;
        end
        else
        aq = s .* ob .* ((oa.^2 + b_a) ./ (1 + s_a * oa.^2)) ./ (s_b + s_c * oc);
        olddecaydiffA = -r_a * oa + D_a * oa * Lap;
        olddecaydiffB = -r_b * ob + D_b * ob * Lap;
        olddecaydiffC = -r_c * oc + D_c * oc * Lap;
        
        na = olddecaydiffA + aq;
        nb = olddecaydiffB - aq + b_b;
        nc = olddecaydiffC + r_c * oa;
        end
        
        a(n,:) = oa + dt * na;
        b(n,:) = ob + dt * nb;
        c(n,:) = oc + dt * nc;
    end
    a(n+1,:) = a(n,:);
    b(n+1,:) = b(n,:);
    c(n+1,:) = c(n,:); 
end

subplot(1,3,1), imagesc(a);
subplot(1,3,2), imagesc(b);
subplot(1,3,3), imagesc(c);

function y = makecolor(x)
% makecolor: return a vector containing 64 steps of the actual color percentage
    if (x == 0)
        y = zeros(64,1);
    else
        y = [0:x/63:x]';
    end
end

colormap([makecolor(0.1), makecolor(0.7), makecolor(1)])
