Simulation of SFG and DFG for a Gaussian beam profile

General: omega_3 > omega_2 > omega_1

SFG: omega_1 + omega_2 = omega_3 Fundamental + Idler = signal

DFG: omega_3 - omega_2 = omega_1 Fundamental - Idler = signal

Contents

Initialize

clear all;
close all;
clc;

Settings

setting.Plot         	= true; %either true/false or vector [1 2]
setting.SaveFigure   	= true;
setting.Movie        	= false;
setting.Depletion       = true;

check for workspace

Checks if there is workspace files in the working directory if so, then choose to stop, ignore, or overwrite the workspace file

if(FindNewestWorkspace('Workspace-2','mat',false) == true)
    choice = questdlg('Do you wish to simulate anyway?', ...
    'There is already a workspace file present.', ...
    'No','Yes - do not save','Yes - override','No');
    % Handle response
    switch choice
        case 'No'
            disp('Not simulating - loading existing workspace');
            setting.runSimulation = false;
            setting.SaveWorkspace = false;
            file = FindNewestWorkspace('Workspace-2','mat',true);
            disp(['Loading file: ' file]);
            load( file );
        case 'Yes - do not save'
            disp('Simulating even though there is an existing workspace');
            setting.runSimulation = true;
            setting.SaveWorkspace = false;
        case 'Yes - override'
            disp('Simulating and deleting old workspace');
            delete('Workspace-2*.mat')
            setting.runSimulation = true;
            setting.SaveWorkspace = true;
    end
else
    setting.runSimulation = true;
    setting.SaveWorkspace = false;
end

Simulation

ticAll = tic;
if(setting.runSimulation == true)
    progressbar

Create a complete Gaussian basis

    % Define parameters
    Param.rsteps        = 5003;
    Param.zsteps        = 1000;
    Param.Lmax          = 10;
    Param.z0            = 20e-3;

    % Independent Parameters
    Pump.lambda         = 1.064e-6;         %wavelength of pump in [m]
    Idler.lambda        = 1.570e-6;         %wavelength of idler in [m]
    omega0pumpmicro     = 1000e-6;          %Beam wais of pump [m]
    Temp                = 88;               %Temperature in degree
    Lqpm                = 30.49e-6;         %Periode of QPM structure

Boundary conditions

    Pump.I0             = 1500e9;           %power in watt
    Signal.I0           = 1e6;              %power in watt
    Idler.I0            = 1e6;              %power in watt

    % Constants
    Const.c             = 299792458;        %Speed of light in [m/s]
    Const.hbar          = 1.05457173e-34;   %Const.hbar in [m2*kg/s]
    Const.epsilon0      = 8.854187817e-12;  %in [F/m]
    Const.mu0           = pi*4e-7;          %in [V*s/A*m]
    Const.chi           = 22e-12;           %effective nonlinear suceptibility in [m/V]

    % Dependent Parameters
    Pump.omega          = 2*pi*Const.c/Pump.lambda;
    Idler.omega         = 2*pi*Const.c/Idler.lambda;
    Signal.omega        = Pump.omega - Idler.omega;
    Signal.lambda       = 2*pi*Const.c/Signal.omega;
    omega0              = [1 1/sqrt(2) 1/(1+sqrt(2))]...
                        .* omega0pumpmicro ./ sqrt(2); %beam waist in [m]

    % Refractive index from Sellmeier equations
    [temp.n , temp.kVector ] = sellmeier([Pump.lambda, Idler.lambda, Signal.lambda],Temp);
    Pump.kVector        = temp.kVector(1);
    Idler.kVector       = temp.kVector(2);
    Signal.kVector      = temp.kVector(3);
    Pump.n              = temp.n(1);
    Idler.n             = temp.n(2);
    Signal.n            = temp.n(3);

    deltak              = Pump.kVector-Idler.kVector-Signal.kVector;
    lcoh                = 2 * pi / deltak;
    rayleigh            = pi.*[omega0(1)^2 / Pump.lambda , omega0(2)^2 / Signal.lambda];

Using effective 1st order QPM structure

    deltak = 0;
    Const.chi = 2/pi * Const.chi;

    %Nonlinear parameters
    Pump.eta    = sqrt(Const.mu0 / Const.epsilon0) / Pump.n;
    Idler.eta   = sqrt(Const.mu0 / Const.epsilon0) / Idler.n;
    Signal.eta  = sqrt(Const.mu0 / Const.epsilon0) / Signal.n;
    eta         = nthroot(Pump.eta * Idler.eta * Signal.eta, 3);
    g           = Const.epsilon0 * Const.chi .* sqrt(1/2 * Const.hbar * eta^3 * Pump.omega * Idler.omega * Signal.omega);

    %Find the radial vector and the propagation vector
    z       = linspace(-Param.z0,Param.z0,Param.zsteps);
    zmili   = z.*1e3;
    r       = linspace(0,10*max(omega0),Param.rsteps);
    deltaz  = z(2)-z(1);
    deltar  = r(2)-r(1);

    disp(['Time spend defining: ' sprintf('%0.2f',toc(ticAll))]);
Time spend defining: 0.12

Propagate electric field

    ticPropagating  = tic;

    % Initialize matrices
    Pump.E          = zeros(Param.rsteps    ,Param.zsteps);
    Pump.C          = zeros(Param.Lmax      ,Param.zsteps);
    Idler.E         = zeros(Param.rsteps    ,Param.zsteps);
    Idler.C         = zeros(Param.Lmax      ,Param.zsteps);
    Signal.E        = zeros(Param.rsteps    ,Param.zsteps);
    Signal.C        = zeros(Param.Lmax      ,Param.zsteps);

    Pump.E(:,1)     = sqrt(2*Pump.I0 /(Const.c*Const.epsilon0*Pump.n))...
                .* GaussianMode(1,r, z(1),Pump.lambda,omega0(1),Pump.n) ./ max(abs(GaussianMode(1,r, z(1),Pump.lambda,omega0(1),Pump.n)));
    Idler.E(:,1)    = sqrt(2*Idler.I0       /(Const.c*Const.epsilon0*Idler.n))...
                .* GaussianMode(1,r, z(1),Idler.lambda,omega0(2),Idler.n) ./ max(abs(GaussianMode(1,r, z(1),Idler.lambda,omega0(2),Idler.n)));
    Signal.E(:,1)   = 1i.*sqrt(2*Signal.I0  /(Const.c*Const.epsilon0*Signal.n))...
                .* GaussianMode(1,r, z(1),Signal.lambda,omega0(3),Signal.n) ./ max(abs(GaussianMode(1,r, z(1),Signal.lambda,omega0(3),Signal.n)));

    PowerChange = zeros(1,Param.zsteps-1);
    for countk=1:Param.zsteps-1

        Pump.C(:,countk)     = GaussianBasis(Param.Lmax,r,z(countk),Pump.lambda,omega0(1),Pump.n,deltar)    * Pump.E(:,countk);
        Idler.C(:,countk)    = GaussianBasis(Param.Lmax,r,z(countk),Idler.lambda,omega0(2),Idler.n,deltar)  * Idler.E(:,countk);
        Signal.C(:,countk)   = GaussianBasis(Param.Lmax,r,z(countk),Signal.lambda,omega0(3),Signal.n,deltar)* Signal.E(:,countk);

        Pump.Eprime          = 0;
        Idler.Eprime         = 0;
        Signal.Eprime        = 0;

        for countn=1:Param.Lmax
            Pump.Eprime      = Pump.Eprime   + Pump.C(countn,countk)   * transpose(GaussianMode(countn,r, z(countk+1),Pump.lambda,omega0(1),Pump.n));
            Idler.Eprime     = Idler.Eprime  + Idler.C(countn,countk)  * transpose(GaussianMode(countn,r, z(countk+1),Idler.lambda,omega0(2),Idler.n));
            Signal.Eprime    = Signal.Eprime + Signal.C(countn,countk) * transpose(GaussianMode(countn,r, z(countk+1),Signal.lambda,omega0(3),Signal.n));
        end

        Pump.A               = Pump.Eprime   ./ sqrt(2*Pump.eta*Const.hbar*Pump.omega)  ;%  .* exp(-1i*Pump.kVector*z(countk+1));
        Idler.A              = Idler.Eprime  ./ sqrt(2*Idler.eta*Const.hbar*Idler.omega) ;%  .* exp(-1i*Idler.kVector*z(countk+1));
        Signal.A             = Signal.Eprime ./ sqrt(2*Signal.eta*Const.hbar*Signal.omega);%  .* exp(-1i*Signal.kVector*z(countk+1));

        if( setting.Depletion == true )
            Pump.deltaA      = 1i.*g.*deltaz.*(Signal.A.* Idler.A).* exp(-1i * deltak*z(countk+1));
        else
            Pump.deltaA      = 0;
        end
        Idler.deltaA         = 1i.*g.*deltaz .* ( Pump.A  .* conj( Signal.A) )    .* exp(1i * deltak*z(countk+1));
        Signal.deltaA        = 1i.*g.*deltaz .* ( Pump.A  .* conj( Idler.A) )     .* exp(1i * deltak*z(countk+1));

        Pump.A               = Pump.A   + Pump.deltaA;
        Idler.A              = Idler.A  + Idler.deltaA;
        Signal.A             = Signal.A + Signal.deltaA;

        PowerChange(countk)  = Const.hbar .* Pump.omega .* 2*pi*deltar*sum(transpose(r).*(conj(Pump.deltaA).*Pump.deltaA)) - Const.hbar .* Signal.omega .* 2*pi*deltar*sum(transpose(r).*(conj(Signal.deltaA).*Signal.deltaA));

        Pump.E(:,countk+1)   = sqrt(2*Pump.eta*Const.hbar*Pump.omega)  .* Pump.A   ;% .* exp(1i*Pump.kVector*z(countk+1));
        Idler.E(:,countk+1)  = sqrt(2*Idler.eta*Const.hbar*Idler.omega) .* Idler.A         ;% .* exp(1i*Signal.kVector*z(countk+1));
        Signal.E(:,countk+1) = sqrt(2*Signal.eta*Const.hbar*Signal.omega).* Signal.A        ;% .* exp(1i*Signal.kVector*z(countk+1));

        progressbar(countk/(Param.zsteps-1));
    end

    Pump.C(:,Param.zsteps)   = GaussianBasis(Param.Lmax,r,z(Param.zsteps),Pump.lambda,omega0(1),Pump.n,deltar)      * Pump.E(:,Param.zsteps);
    Idler.C(:,Param.zsteps)  = GaussianBasis(Param.Lmax,r,z(Param.zsteps),Idler.lambda,omega0(2),Idler.n,deltar)    * Idler.E(:,Param.zsteps);
    Signal.C(:,Param.zsteps) = GaussianBasis(Param.Lmax,r,z(Param.zsteps),Signal.lambda,omega0(2),Signal.n,deltar)  * Signal.E(:,Param.zsteps);
    clearvars Pump.A Idler.A Signal.A Pump.Eprime Idler.Eprime Signal.Eprime;

Calculating intensity to plot

    rplot               = floor(Param.rsteps/4);
    raxis               = [fliplr(-r(1:rplot)) r(1:rplot)] .* 1e3;
    Pump.Eplot          = [fliplr( transpose(Pump.E(1:rplot,:)) )    transpose(Pump.E(1:rplot,:))];
    Idler.Eplot         = [fliplr( transpose(Idler.E(1:rplot,:)) )   transpose(Idler.E(1:rplot,:))];
    Signal.Eplot        = [fliplr( transpose(Signal.E(1:rplot,:)) )  transpose(Signal.E(1:rplot,:))];
    Pump.Iplot          = Const.c*Const.epsilon0/2 * Pump.n    * abs(Pump.Eplot).^2;
    Idler.Iplot         = Const.c*Const.epsilon0/2 * Idler.n   * abs(Idler.Eplot).^2;
    Signal.Iplot        = Const.c*Const.epsilon0/2 * Signal.n  * abs(Signal.Eplot).^2;

    % Calculate power
    Pump.Power          = zeros(Param.zsteps,1);
    Idler.Power         = zeros(Param.zsteps,1);
    Signal.Power        = zeros(Param.zsteps,1);
    Power               = zeros(Param.zsteps,1);
    for countn=1:Param.zsteps
        Pump.Power(countn)        = Const.c*Const.epsilon0/2 * Pump.n       * 2*pi*deltar*sum(transpose(r).* ( Pump.E(:,countn)   .* conj(Pump.E(:,countn)) ) );
        Idler.Power(countn)       = Const.c*Const.epsilon0/2 * Idler.n      * 2*pi*deltar*sum(transpose(r).* ( Idler.E(:,countn)  .* conj(Idler.E(:,countn))      ) );
        Signal.Power(countn)      = Const.c*Const.epsilon0/2 * Signal.n     * 2*pi*deltar*sum(transpose(r).* ( Signal.E(:,countn) .* conj(Signal.E(:,countn))      ) );
        Power(countn)             = Pump.Power(countn)+Idler.Power(countn)+Signal.Power(countn);
    end

    Pump.ModePower                = zeros(Param.Lmax,Param.zsteps);
    Idler.ModePower               = zeros(Param.Lmax,Param.zsteps);
    Signal.ModePower              = zeros(Param.Lmax,Param.zsteps);
    EaendMode                     = zeros(Param.rsteps,Param.Lmax);

    for countn=1:Param.Lmax
        EaendMode(:,countn)       = Pump.C(countn,end) * transpose(GaussianMode(countn,r, z(end),Pump.lambda,omega0(1),Pump.n));
        Pump.ModePower(countn,:)  = sum( abs(Pump.C(1:countn,:)).^2 ,1);
        Idler.ModePower(countn,:) = sum( abs(Idler.C(1:countn,:)).^2 ,1 );
        Signal.ModePower(countn,:)= sum( abs(Signal.C(1:countn,:)).^2 ,1 );
    end
    IaendMode = Const.c*Const.epsilon0*Pump.n/2 * abs(EaendMode).^2;

    % Calculate FWHM of both fields
    Pump.FWHM                     = zeros(Param.zsteps,3);
    Idler.FWHM                    = zeros(Param.zsteps,3);
    Signal.FWHM                   = zeros(Param.zsteps,3);
    for countn=1:Param.zsteps
%        [Pump.FWHM(countn,1), Pump.FWHM(countn,2), Pump.FWHM(countn,3)]    = fwhm(raxis,Pump.Iplot(countn,:));
%        [Idler.FWHM(countn,1), Idler.FWHM(countn,2), Idler.FWHM(countn,3)]                      = fwhm(raxis,Idler.Iplot(countn,:));
%        [Signal.FWHM(countn,1), Signal.FWHM(countn,2), Signal.FWHM(countn,3)]                   = fwhm(raxis,Signal.Iplot(countn,:));
    end

    disp(['Max power gain/loss in percentage: ' sprintf('%0.2f',max(abs(Power(:)-Power(1)))/Power(1)*100)]);
    disp(['Time spend propagating: ' sprintf('%0.2f',toc(ticPropagating)) '(' sprintf('%0.2f',toc(ticAll)) ')']);
Max power gain/loss in percentage: 0.19
Time spend propagating: 88.73(88.87)
end

Save

if(setting.SaveWorkspace == true)
   ticSave = tic;
   save(['Workspace-',datestr(now, 'yyyy-mm-dd-HH-MM-SS')], '-regexp', '^(?!(setting|Ea|Eb|)$).');
   disp(['Time spend saving: ' sprintf('%0.2f',toc(ticSave)) '(' sprintf('%0.2f',toc(ticAll)) ')']);
end

Plots figures

GaussianBasisPlot

save(['Gaussiandata-',datestr(now, 'yyyy-mm-dd-HH-MM-SS-'),int2str(omega0pumpmicro*1e6),'mumI',int2str(Pump.I0*1e-9),'GW']);

disp(['Time spend TOTAL: ' sprintf('%0.2f',toc(ticAll))]);
Time spend making figures: 79.17(168.10)
Time spend making video: 0.00(168.10)
Time spend TOTAL: 182.33