% Numerical solution of ternary FRAP model with solvent, bleached and
% unbleached species. Model is assumed to be equilibrated
% (bleached+unbleached=const.=pt). Then bleached species initial
% conditions are introduced. Integration of model via pdepe.

% Still not sure whether this solution is correct. Diffusion seems to slow
% towards the end!

a = -50;
b = 0.1;
c = 1/100000;
u0 = 0.3;
%% Solve pde
x = [linspace(49, 55, 600), linspace(55.01, 200, 300)];
t = linspace(0, 1, 10000);
fh_ic = @(x) flory_ic(x, a, u0);
fh_bc = @(xl, ul, xr, ur, t) flory_bc(xl, ul, xr, ur, t, u0);
fh_pde = @(x, t, u, dudx) flory_hugg_pde(x, t, u, dudx, a, b, c, u0);
sol = pdepe(0, fh_pde, fh_ic, fh_bc, x, t);
%% Plotting
figure(1); hold on;
for i = 1:1000 
    cla; xlim([49, 53]); ylim([0, 1.5]);
    plot(x, phi_tot(x, a, b, u0)); plot(x, sol(i, :)); pause(0.01);
end

%% Plot and check derivatives of pt
figure; hold on;
x = linspace(40, 60, 100);
plot(x, phi_tot(x, -50, 0.25));
plot(x, gradient_analytical(x, -50, 0.25));

%% Function definitions for pde solver
function [c, f ,s] = flory_hugg_pde(x, t, u, dudx, a, b, c_p, u0)  
% Solve with full ternary model. Analytical derivatives.
% pt ... phi_tot
% gra_a ... analytical gradient of phi_tot

pt = phi_tot(x, a, b, u0);
gra_a = gradient_analytical(x, a, b);
c = c_p;
f = ((u0+1)-pt)/pt*(pt*dudx-u*gra_a);
s = 0;
end

function u = flory_ic(x, a, u0)
    if x < -a
        u = 0.0;
    else
        u = u0;
    end
%     u0 = 0.3;
%  u0 = phi_tot(x, -50, 1);
end

function [pl,ql,pr,qr] = flory_bc(xl, ul, xr, ur, t, u0)
    pl = 0;
    ql = 1;
%     % No flux
%     pr = 0;%ur - 0.01;
%     qr = 1;
    % Dirichlet BC
    pr = ur - u0;
    qr = 0;
end

function p = phi_tot(x, a, b, u0)
    p = (tanh(-(x+a)/b)+1)/2+u0;
end

function grad = gradient_analytical(x, a, b)
    grad = -(1-tanh(-(x+a)/b).^2)*1/b*0.5;
end
