Simulating a Mach-Zehnder interferometer

For the first time, I tried to simulate a Mach-Zhender. It should work in theory since we have all the elementary bricks (mirror, propagation) but the devil is in the details. The implementation was rather simple, the default phase is such that all the power is transmitted toward the node called E_CCD (top figure):

More interestingly is to misalign one of the mirror, for example M2 (bottom figure) and see one advantage of FFT codes with the possibility to ray-trace the beams. Of course, once the interferometer is misaligned, the interferences disappear and both outputs are equal and correspond to half the input power. Here a small animation showing that:

(if someone knows how to resize the video displayed in the page, I am interested)

The code to produce the above results is shown here

clearvars; close all;
addpath(genpath('Classes'));

disp('---------------------------------------------------------------------------')
disp('                  OSCAR V3.30                                   ')
disp('  ')


% Define the grid for the simulation: 256 X 256, 40 cm X 40 cm
G1 = Grid(512,0.02);

E_input = E_Field(G1,'w0',2E-3);

% Let's say, define the components, first BS

BS1_HR = Interface(G1,'RoC',inf,'CA',0.045,'T',0.5);
BS1_AR = Interface(G1,'RoC',inf,'CA',0.045,'T',1);
BS1_M = Mirror(BS1_HR,BS1_AR,0.06);

BS2_HR = Interface(G1,'RoC',inf,'CA',0.045,'T',0.5);
BS2_AR = Interface(G1,'RoC',inf,'CA',0.045,'T',1);
BS2_M = Mirror(BS1_HR,BS1_AR,0.06);

% Then the 2 mirrors
M1 = Interface(G1,'RoC',inf,'CA',0.045,'T',5E-6);
M2 = Interface(G1,'RoC',inf,'CA',0.045,'T',5E-6);

%% tilt one mirror



Tilt_vec = linspace(0,4E-3,51);   % Tilt range in rad
P_trans = zeros(1,length(Tilt_vec));

for ii = 1:length(Tilt_vec)
    
    M2 = Interface(G1,'RoC',inf,'CA',0.045,'T',5E-6);
    M2 = Add_Tilt(M2,Tilt_vec(ii));
    
    E_input = E_Field(G1,'w0',1E-3);

    
    E1 = Propagate_E(E_input,0.2);
    
    % Calculated the transmited and reflected beams from BS1
    [E1_t,E1_r] = Transmit_Reflect_Mirror(E1,BS1_M,'HR');
    
    % propagate to the mirrors
    E2 = Propagate_E(E1_t,0.432); % toward M1
    E3 = Propagate_E(E1_r,0.254); % toward M2
    
    % reflect on the mirrors
    [~,E2r] = Transmit_Reflect_Interface(E2,M1);
    [~,E3r] = Transmit_Reflect_Interface(E3,M2);
    
    % propagate to BS2
    E4 = Propagate_E(E2r,0.254); % from M1
    E5 = Propagate_E(E3r,0.432); % from M2
        
    % Calculated the transmited and reflected beams from BS2 from the 2 beams
    [E4_t,E4_r] = Transmit_Reflect_Mirror(E4,BS2_M,'HR');
    [E5_t,E5_r] = Transmit_Reflect_Mirror(E5,BS2_M,'AR');
    
    E_CCD = E4_r + E5_t;
    E_dump = E4_t + E5_r;
    
    P_trans(ii) = Calculate_Power(E_CCD);
    
    E_Plot(E_CCD);
    title(['Iteration: ' num2str(ii)])
    pause(0.02)
end

plot(Tilt_vec,P_trans)
box on; grid on
xlabel('Tilt angle [rad]')
ylabel('Transmitted power [W]')

Leave a Reply