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]')