PPLN Crystals

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

PPLN Crystals

mojtaba
I am interested in scripts for PPLN crystals for: constant poling period, chirped poling period, and varying chirped poling period. For the constant poling period case, how can the sign of d_eff be changed for each propagation step in the beginning of its loop? For the chirped and varying chirped cases, the propagation step size has to changed/adjusted in accordance with the poling size. Any suggestions would be appreciated.
Reply | Threaded
Open this post in threaded view
|

Re: PPLN Crystals

tinolang
Administrator
You can assign an individual deff for each propagation step and each element in x and y. Note there is a different nonlinear coefficient for eoo, oeo, ooe type (deff1) and eeo,eoe,oee type (deff2) nonlinear interaction types.

To implement a constant or a chirped poling period simply use a vector with Nz elements for the initialization of the deff. Each element of the vector defines the nonlinear coefficient used for a certain propagation step in the crystal, respectively.

    L=obj.simProp.propagationLength;
    z=linspace(obj.constVars.dz,L,obj.simProp.Nz);
    PPmin=21.5e-6;
    PPmax=21.5e-6;
    deff=16e-12.*(round((sin(2*pi * ( 1/PPmin*z + (1/PPmax-1/PPmin)/L/2*z.^2)) +1  )/2)*2-1);
    
obj( 'deff1',deff);

To simulate a fan-out structured PPLN you can define a 3 dimensional deff-matrix with the dimensions deff[Nx,Ny,Nz], e.g.: (not tested)



    polingPeriod=21.5e-6;
    fanOut= 8e-6; %maxPoling-minPoling
    polingWidth=12e-3; %spatial dimension in x direction

    z=meshgrid(linspace(0,obj.simProp.propagationLength,obj.simProp.Nz),1:obj.simProp.Nx);
    pol=meshgrid(fanOut/polingWidth * obj.constVect.x + polingPeriod , 1:obj.simProp.Nz)';
    deff = 16e-12.*(round((sin(2.*pi./pol.*z)+1)/2)*2-1);   % fan out poling structur in 1+1 dimensions -> array with (Nx,Nz) elements
    
    if(Ny>1)        
        deff = permute(reshape(ndgrid(deff,1,1:obj.simProp.Ny),obj.simProp.Nx,obj.simProp.Nz,obj.simProp.Ny),[1,3,2]); % fan out poling structur in x-direction in 3+1 dimensions with (Nx,Ny,Nz) elements
    end

obj( 'deff1',deff);



To give a rather academic example for a DFG in a chirped PPLN pumped at 1030 nm and broadband seeded at 1300 nm:

%create a new instance of chi3D
obj = chi3D('tag','PPLN example'); 


%set computational parameters
obj( 'Nx',32,'xWindow',0.0005,...
       'Ny',1 ,'yWindow',0.0005,... %use Ny=1 for 2+1D, Ny=2^N for 3+1d
       'Nt',2048, 'tWindow',3e-12,'shiftFreqWindow',0,...
       'Nz',10000, 'propagationLength', 0.005,...
       'GPUOn',0, 'abortIntensity', inf,...
       'showResultEach',1000, 'showProgress',1,...
       'material','LNcMgO','theta',1.5708,'phi',0,'plane','XZ');


% compute the deff-vector
L=obj.simProp.propagationLength;
z=linspace(obj.constVars.dz,L,obj.simProp.Nz);
PPmin=21.5e-6;
PPmax=23.5e-6;
deff=16e-12.*(round((sin(2*pi * ( 1/PPmin*z + (1/PPmax-1/PPmin)/L/2*z.^2)) +1  )/2)*2-1); % simple chirp between PPmin and PPmax

obj( 'deff1',deff,'eoo',0,'oeo',0,'ooo',1,...
     'deff2',0   ,'oee',0,'eeo',0,'eee',0);


%input pulse definition

obj({ 'pulse1','EorI',1e-06,'polarization','o','centerWavelength',1.03e-06,...
                    'pulseDuration',6e-13,'beamShape_t',{'supergauss',10},...
                    'beamRadius_x',0.0001,'beamRadius_y',0.0001,...     %please choose a reasonable values in y
                    });

obj({ 'pulse2','EorI',1e-09,'polarization','o','centerWavelength',1.307e-06,...
                    'pulseDuration',1e-14,'GD',2.5e-13,...
                    'beamRadius_x',0.0001,'beamRadius_y',0.0001,...     %please choose a reasonable values in y
                    });

%define detectors

obj.detectors = rmfield(obj.detectors,fieldnames(obj.detectors)); %delete default detectors

obj.detectors.pump.plotIntegratedProfiles=1;
obj.detectors.pump.polarization='o';
obj.detectors.pump.ftlim=[3e8/1.1e-6,3e8/1e-6];

obj.detectors.signal.plotIntegratedProfiles=1;
obj.detectors.signal.polarization='o';
obj.detectors.signal.ftlim=[3e8/1.7e-6,3e8/1.1e-6];

obj.detectors.idler.plotIntegratedProfiles=1;
obj.detectors.idler.polarization='o';
obj.detectors.idler.ftlim=[3e8/5e-6,3e8/4e-6];


%run simulation

[E_ftfxfy_o,E_ftfxfy_e]=run(obj,{'pulse1'},{'pulse2'});

chirped
chirped

unchirped
unchirped
Tino Lang
Reply | Threaded
Open this post in threaded view
|

Re: PPLN Crystals

pascal
If I take your example, everything works correctly, and dz is 5e-7 which corresponds to propagationLength/Nz.
But if I change the propagationLength to 2mm and Nz to 4000, dz should remain the same (5e-7), however for some reason, dz becomes 4e-6 and I get the error "index exceeds matrix dimensions" somewhere near step 1870. clear does not help.

It seems like a bug?
Reply | Threaded
Open this post in threaded view
|

Re: PPLN Crystals

tinolang
Administrator
You found a bug! Please try the updated version.
chi3D v1.0029
Tino Lang