Contents

Scalar Difference Frequency Generation

Simulates DFG for monochromatic, CW, plane waves.

Input: TolAbs Absolute tolerence used in RungeKutta45 TolRel Relative tolerence used in RungeKutta45 Pp1 Signal seed power Pp2 Idler seed power Pp3 Pump power zsteps Number of steps that shall be returned from the RungeKutta45 zlength Length of crystal QPM Order of QPM structure QPMtype Type of QPM simulation; 'eff' (effeective) or 'domain'

Output: output0 z axis output1 Signal power; output2 Idler power; output3 Pump power output4 Total power output5 Signal photon number output6 Idler photon number output7 Pump photon number output8 Total photon number

function [output0, output1, output2, output3, output4, output5, output6,...
                    output7, output8] = ScalarDFG(TolAbs, TolRel,Pp1,...
                    Pp2, Pp3, zsteps,zlength, QPM, QPMtype)

Independent Parameters

Idler.Lambda  = 1.570e-6;           %wavelength of idler in [m]
Pump.Lambda   = 1.064e-6;           %wavelength of pump in [m]
Param.Length  = zlength;            %Length of nonlinear crystal in [m]
Param.Area    = pi*(40e-6)^2;       %Area of the nonlinear crystal in [m^2]
Param.Temp    = 88;                 %Temperature in degree
Param.QPM     = QPM;                %QPM: 0=NON, 1=1st order, 2=2th order,...
Param.QPMtype = QPMtype;            %Type of QPM: domain og eff.
Param.zsteps  = zsteps;             %Number of z-steps
Error using ScalarDFG (line 34)
Not enough input arguments.

Boundary conditions

Signal.PeakPower    = Pp1;          %power in watt - signal
Idler.PeakPower     = Pp2;          %power in watt - idler
Pump.PeakPower      = Pp3;          %power in watt - pump

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;       %eff. nonlinear suceptibility in [m/V]

Dependent Parameters

Idler.Omega     = 2*pi*const.c / Idler.Lambda;
Pump.Omega      = 2*pi*const.c / Pump.Lambda;
Signal.Omega    = Pump.Omega - Idler.Omega;
Signal.Lambda   = 2*pi*const.c / Signal.Omega;

Signal.Omega / Pump.Omega;
Pump.Lambda / Signal.Lambda;

Refractive index from Sellmeier equations

[n , kVector] = sellmeier([Signal.Lambda Idler.Lambda Pump.Lambda],Param.Temp);
% k vector
Signal.kVector  = kVector(1);
Idler.kVector   = kVector(2);
Pump.kVector    = kVector(3);
% refractive index
Signal.n        = n(1);
Idler.n         = n(2);
Pump.n          = n(3);

deltak  = Pump.kVector - Signal.kVector - Idler.kVector;
lcoh    = 2 * pi / deltak;
if( strcmp(Param.QPMtype , 'eff') )
   const.chi  = 2/(pi*Param.QPM)*const.chi;
   lcoh       = 1e10;
   deltak     = 0;
end

Nonlinear parameters

eta             = sqrt( const.mu0 / const.epsilon0 ) / nthroot(Signal.n*Idler.n*Pump.n,3);
g               = const.epsilon0 * const.chi * sqrt(1/2 * const.hbar * eta^3 ...
            * Signal.Omega * Idler.Omega * Pump.Omega);

%calculate amplitudes
Signal.A    = sqrt(Signal.PeakPower / (const.hbar*Signal.Omega)/Param.Area);
Idler.A     = sqrt(Idler.PeakPower  / (const.hbar*Idler.Omega)/Param.Area);
Pump.A      = 1i*sqrt(Pump.PeakPower   / (const.hbar*Pump.Omega)/Param.Area);

Solve set of ODEs

Sets the global and local maximum fault tolerance.

options = odeset('AbsTol',TolAbs,'RelTol',TolRel);
    % Solve ODE: ode45(solve for , interval , init.values , options).

[z, A]  = ode45(@(z,A) ode45equation(z,A,g,deltak,Param.QPM,lcoh), ...
    linspace(0,Param.Length,Param.zsteps), [Signal.A, Idler.A, Pump.A], options);

Find number of photons instead of amplitudes

Signal.N    = A(:,1).*conj(A(:,1)) ;
Idler.N     = A(:,2).*conj(A(:,2)) ;
Pump.N      = A(:,3).*conj(A(:,3)) ;
Total.N     = Signal.N + Idler.N + Pump.N;

Find electric fields

Signal.E    = A(:,1) * sqrt( 2 * eta * const.hbar * Signal.Omega) .* exp(1i .* Signal.kVector .* z);
Idler.E     = A(:,1) * sqrt( 2 * eta * const.hbar * Idler.Omega ) .* exp(1i .* Idler.kVector .* z);
Pump.E     = A(:,1) * sqrt( 2 * eta * const.hbar * Pump.Omega ) .* exp(1i .* Pump.kVector .* z);

Find powers instead of amplitudes

Signal.P    = Signal.N .* Param.Area .* const.hbar .* Signal.Omega;
Idler.P     = Idler.N .* Param.Area .* const.hbar .* Idler.Omega;
Pump.P      = Pump.N .* Param.Area .* const.hbar .* Pump.Omega;
Total.P     = Signal.P + Idler.P + Pump.P;

Z axis

Axis.zmili  = z*1e3;

output0 = Axis.zmili;
output1 = Signal.P;
output2 = Idler.P;
output3 = Pump.P;
output4 = Total.P;
output5 = Signal.N;
output6 = Idler.N;
output7 = Pump.N;
output8 = Total.N;
end