% m-file to simulate non-linear effects due to gain in microrings
% Kuldeep Amarnath , 14 Dec 2005.
function Iout = nonlin

% ************ define constants **************

k = 0.4; t = sqrt(1-k^2); % coupling parameter
Gamma = 0.05; % overlap factor
g0 = 550; % unsaturated material gain (/cm)
alpha = 15; % unsaturable loss (scattering)
phi0 = -0.3; % round-trip phase for unsaturated case (rad)
L  = 2*pi*20e-04; % round-trip length (cm)
b = 3; % linewidth-enhancement factor
lambda = 1.55e-04; % wavelength (cm)
% *******************************************

% set input intensity and plot scaling
%Iin = logspace(-4,0,100);
Iin = linspace(0,.1,100);
plotscale='lin';

% solve for ring intensity on the way up: Ir(1,:)

for i = 1:length(Iin)
    % starting guess
    if i == 1
        Ir0 = 0;
    else 
        Ir0 = Ir(1,i-1); % use the previous value
    end
    % solve for Ir(i)
    [Ir(1,i),FVAL,EXITFLAG] = fzero(@residue,Ir0,[],Iin(i),k,t,Gamma,g0,alpha,phi0,L,b);
end

% solve for ring intensity on the way down: Ir(2,:)

for i = length(Iin):-1:1
    % starting guess
    if i == length(Iin)
        Ir0 = Ir(1,i);
    else 
        Ir0 = Ir(2,i+1); % use the previous value
    end
    % solve for Ir(i)
    [Ir(2,i),FVAL,EXITFLAG] = fzero(@residue,Ir0,[],Iin(i),k,t,Gamma,g0,alpha,phi0,L,b);
end


% calculate all relevant parameters for ring intensity

for i = 1:2
    gm(i,:) = g0./(1+Ir(i,:));
    a(i,:) = exp((Gamma*gm(i,:)-alpha)*L/2);
    dn(i,:) = g0*b*lambda*Gamma/(4*pi) * Ir(i,:)./(1+Ir(i,:));
    dphi(i,:) = g0*L*b*Gamma/2 * Ir(i,:)./(Ir(i,:)+1);
    Iout(i,:) = Iin.*(a(i,:).^2 + t^2 - 2*t*a(i,:).*cos(phi0+dphi(i,:)))./(1 + t^2*a(i,:).^2 - 2*t*a(i,:).*cos(phi0+dphi(i,:)));
end

% plot em all

switch plotscale
    case 'lin'
        % linear plot
        subplot(2,2,1), plot(Iin,Ir(1,:),'b-',Iin,Ir(2,:),'r-'), title('I_{R}') ;
        subplot(2,2,2), plot(Iin,a(1,:),'b-',Iin,a(2,:),'r-'), line([min(Iin) max(Iin)], [1/t 1/t]), title('a') ;
        subplot(2,2,3), plot(Iin,phi0+dphi(1,:),'b-',Iin,phi0+dphi(2,:),'r-'), title('\phi');
        subplot(2,2,4), plot(Iin,Iout(1,:),'b-',Iin,Iout(2,:),'r-'), title('I_{T}');
        
    case 'log'
        % log plot
        subplot(2,2,1), loglog(Iin,Ir(1,:),'b-',Iin,Ir(2,:),'r-'), title('I_{R}') ;
        subplot(2,2,2), semilogx(Iin,a(1,:),'b-',Iin,a(2,:),'r-'), line([min(Iin) max(Iin)], [1/t 1/t]), title('a') ;
        subplot(2,2,3), semilogx(Iin,phi0+dphi(1,:),'b-',Iin,phi0+dphi(2,:),'r-'), title('\Delta \phi');
        subplot(2,2,4), semilogx(Iin,Iout(1,:),'b-',Iin,Iout(2,:),'r-'), title('I_{T}');
end

figure(1);

% residue function calculates [Ir - f(Ir,Iin)]
function val = residue(Ir,Iin,k,t,Gamma,g0,alpha,phi0,L,b)

gm = g0/(1+Ir); % material gain
a = exp((Gamma*gm-alpha)*L/2); % round-trip intensity gain factor
phi = phi0 + g0*L*b*Gamma/2 * Ir/(Ir+1); % net round-trip phase
Irf = Iin * k^2/(1+a^2*t^2-2*a*t*cos(phi)); % expected intensity in ring
val = Ir - Irf; % difference between expected and assumed intensity
