Code covered by the BSD License  

Highlights from
OSCAR

image thumbnail
from OSCAR by Jerome Degallaix
An optical FFT code to simulate Fabry Perot cavities with arbitrary mirror profiles

E_Field
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

Contact us at files@mathworks.com