classdef E_Field
% E_Field, this class represents an electric field defined on a grid
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% E = E_Field( Grid_name , size of the waist ) Create a fundamental
% Gaussian beam at the waist
% E = E_Field( Grid_name , size of the waist, wavefront radius of
% curvature) Create a fundamental mode with a defined beam size and
% wavefront radius of curvature
% E = E_Field( Grid_name , size of the waist, wavefront radius of
% curvature,'HG',m,n) Create a mode Hermitte Gauss of order m,n
% E = E_Field( Grid_name , size of the waist, wavefront radius of
% curvature,'LG',p,l) Create a mode Laguerre Gauss helicoidal d'ordre
% p,l
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
properties
Grid
Field
Field_SBl
Field_SBu
Refractive_index = 1;
Wavelength = 1064E-9;
Frequency_Offset = 0;
Mode_name
k_prop
end
% events
% Nan_present
% end
methods
function E = E_Field(varargin)
E.k_prop = (2*pi/E.Wavelength);
switch nargin
case {0,1}
disp('E_Field(): at least 2 arguments must be given: the grid and the waist size of the fundamental Gaussian beam, laser beam not created')
return
case 2
if ~isa(varargin{1}, 'Grid')
disp('E_Field(): the first argument must be an instance of the class grid')
return
end
E.Grid = varargin{1};
E.Field = exp(-E.Grid.D2_square/varargin{2}^2);
E = Normalise_E(E);
E.Mode_name = Write_mode_name('HG',0,0);
case 3
E.Grid = varargin{1};
E.Field = exp(-E.Grid.D2_square/varargin{2}^2) .*...
exp(-1i*E.k_prop.*E.Grid.D2_square/(2*varargin{3}));
E = Normalise_E(E);
E.Mode_name = Write_mode_name('HG',0,0);
case 6
if strcmp(varargin{4},'HG')
E.Grid = varargin{1};
E.Field = exp(-E.Grid.D2_square/varargin{2}^2).*...
exp(-1i*E.k_prop.*E.Grid.D2_square/(2*varargin{3}));
E.Field = E.Field .* HermitePolynomial(varargin{5}, sqrt(2)/varargin{2} * E.Grid.D2_X) .*...
HermitePolynomial(varargin{6}, sqrt(2)/varargin{2} * E.Grid.D2_Y);
E = Normalise_E(E);
E.Mode_name = Write_mode_name('HG',varargin{5},varargin{6});
elseif strcmp(varargin{4},'LG')
E.Grid = varargin{1};
tmp_r2_over_w2 = E.Grid.D2_square / varargin{2}^2;
E.Field = exp(- tmp_r2_over_w2).*...
exp(-1i*E.k_prop.*E.Grid.D2_square/(2*varargin{3}));
E.Field = E.Field .* (2*tmp_r2_over_w2) .^ (abs(varargin{6})/2);
E.Field = E.Field .* LaguerrePolynomial(varargin{5}, abs(varargin{6}), 2*tmp_r2_over_w2);
E.Field = E.Field .* exp(1i * varargin{6}*atan2(E.Grid.D2_Y,E.Grid.D2_X));
E = Normalise_E(E);
E.Mode_name = Write_mode_name('LG',varargin{5},varargin{6});
else
disp('E_Field(): the fourth argument must be HG or LG')
end
otherwise
disp('E_Field(): invalid number of input arguments, laser beam not created')
return
end
end
function value = get.Field(obj)
value = obj.Field;
end
end
end