Calculations/+Simulator/@Beams/Beams.m

204 lines
10 KiB
Matlab

classdef Beams < handle & matlab.mixin.Copyable
properties (Access = private)
BlueBeamDefault = struct('Alias', 'Blue', ...
'Power', 400e-3, ...
'Detuning', -1.39*Helper.PhysicsConstants.BlueLinewidth, ...
'Radius', 35e-3, ...
'Waist', 16.67e-3, ...
'WaveNumber',2*pi/Helper.PhysicsConstants.BlueWavelength, ...
'Linewidth', Helper.PhysicsConstants.BlueLinewidth, ...
'SaturationIntensity', 0.1 * (2 * pi^2 / 3) * ...
((Helper.PhysicsConstants.PlanckConstantReduced * ...
Helper.PhysicsConstants.SpeedOfLight * ...
Helper.PhysicsConstants.BlueLinewidth) / (Helper.PhysicsConstants.BlueWavelength)^3));
BlueSidebandBeamDefault = struct('Alias', 'BlueSideband', ...
'Power', 200e-3, ...
'Detuning', -3*Helper.PhysicsConstants.BlueLinewidth, ...
'Radius', 35e-3, ...
'Waist', 16.67e-3, ...
'WaveNumber',2*pi/Helper.PhysicsConstants.BlueWavelength, ...
'Linewidth', Helper.PhysicsConstants.BlueLinewidth, ...
'SaturationIntensity', 0.1 * (2 * pi^2 / 3) * ...
((Helper.PhysicsConstants.PlanckConstantReduced * ...
Helper.PhysicsConstants.SpeedOfLight * ...
Helper.PhysicsConstants.BlueLinewidth) / (Helper.PhysicsConstants.BlueWavelength)^3));
PushBeamDefault = struct('Alias', 'Push', ...
'Power', 10e-3 , ...
'Detuning', 0*Helper.PhysicsConstants.RedLinewidth, ...
'Radius', 1.2e-03, ...
'Waist', 20.001e-3, ...
'WaveNumber',2*pi/Helper.PhysicsConstants.RedWavelength, ...
'Linewidth', Helper.PhysicsConstants.RedLinewidth, ...
'SaturationIntensity', 0.1 * (2 * pi^2 / 3) * ...
((Helper.PhysicsConstants.PlanckConstantReduced * ...
Helper.PhysicsConstants.SpeedOfLight * ...
Helper.PhysicsConstants.RedLinewidth) / (Helper.PhysicsConstants.RedWavelength)^3));
RedBeamDefault = struct('Alias', 'Red', ...
'Power', 100e-3 , ...
'Detuning', -1*Helper.PhysicsConstants.RedLinewidth, ...
'Radius', 1.2e-3, ...
'Waist', 12e-3 , ...
'WaveNumber',2*pi/Helper.PhysicsConstants.RedWavelength, ...
'Linewidth', Helper.PhysicsConstants.RedLinewidth, ...
'SaturationIntensity', 0.1 * (2 * pi^2 / 3) * ...
((Helper.PhysicsConstants.PlanckConstantReduced * ...
Helper.PhysicsConstants.SpeedOfLight * ...
Helper.PhysicsConstants.RedLinewidth) / (Helper.PhysicsConstants.RedWavelength)^3));
end
properties
Alias
Power;
Detuning;
Radius;
Waist;
WaveNumber;
SaturationIntensity;
Linewidth;
end
properties (Dependent)
SaturationParameter;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%- Methods
methods
%% Class Constructor
function this = Beams(BeamName)
input = inputParser;
addRequired(input,'BeamName', @ischar);
parse(input, BeamName);
this.Alias = input.Results.BeamName;
switch this.Alias
case this.BlueBeamDefault.Alias
this.Power = this.BlueBeamDefault.Power;
this.Detuning = this.BlueBeamDefault.Detuning;
this.Radius = this.BlueBeamDefault.Radius;
this.Waist = this.BlueBeamDefault.Waist;
this.WaveNumber = this.BlueBeamDefault.WaveNumber;
this.Linewidth = this.BlueBeamDefault.Linewidth;
this.SaturationIntensity = this.BlueBeamDefault.SaturationIntensity;
case this.BlueSidebandBeamDefault.Alias
this.Power = this.BlueSidebandBeamDefault.Power;
this.Detuning = this.BlueSidebandBeamDefault.Detuning;
this.Radius = this.BlueSidebandBeamDefault.Radius;
this.Waist = this.BlueSidebandBeamDefault.Waist;
this.WaveNumber = this.BlueSidebandBeamDefault.WaveNumber;
this.Linewidth = this.BlueSidebandBeamDefault.Linewidth;
this.SaturationIntensity = this.BlueSidebandBeamDefault.SaturationIntensity;
case this.PushBeamDefault.Alias
this.Power = this.PushBeamDefault.Power;
this.Detuning = this.PushBeamDefault.Detuning;
this.Radius = this.PushBeamDefault.Radius;
this.Waist = this.PushBeamDefault.Waist;
this.WaveNumber = this.PushBeamDefault.WaveNumber;
this.Linewidth = this.PushBeamDefault.Linewidth;
this.SaturationIntensity = this.PushBeamDefault.SaturationIntensity;
case this.RedBeamDefault.Alias
this.Power = this.RedBeamDefault.Power;
this.Detuning = this.RedBeamDefault.Detuning;
this.Radius = this.RedBeamDefault.Radius;
this.Waist = this.RedBeamDefault.Waist;
this.WaveNumber = this.RedBeamDefault.WaveNumber;
this.Linewidth = this.RedBeamDefault.Linewidth;
this.SaturationIntensity = this.RedBeamDefault.SaturationIntensity;
otherwise
error('No such beam!')
end
end
end % - lifecycle
methods
function set.Power(this,val)
this.Power = val;
end
function ret = get.Power(this)
ret = this.Power;
end
function set.Detuning(this, val)
this.Detuning = val;
end
function ret = get.Detuning(this)
ret = this.Detuning;
end
function set.Radius(this, val)
this.Radius = val;
end
function ret = get.Radius(this)
ret = this.Radius;
end
function set.Waist(this, val)
this.Waist = val;
end
function ret = get.Waist(this)
ret = this.Waist;
end
function set.WaveNumber(this, val)
this.WaveNumber = val;
end
function ret = get.WaveNumber(this)
ret = this.WaveNumber;
end
function set.SaturationIntensity(this, val)
this.SaturationIntensity = val;
end
function ret = get.SaturationIntensity(this)
ret = this.SaturationIntensity;
end
function set.Linewidth(this, val)
this.Linewidth = val;
end
function ret = get.Linewidth(this)
ret = this.Linewidth;
end
end % - setters and getters
methods
function ret = get.SaturationParameter(this)
ret = 0.1 * (4 * this.Power) / (pi*this.Waist^2 * this.SaturationIntensity); % two beams are reflected
end
end % - getters for dependent properties
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%- Methods
methods(Access = protected)
function cp = copyElement(this)
% Shallow copy object
cp = copyElement@matlab.mixin.Copyable(this);
% Forces the setter to redefine the function handles to the new copied object
pl = properties(this);
for k = 1:length(pl)
sc = superclasses(this.(pl{k}));
if any(contains(sc,{'matlab.mixin.Copyable'}))
cp.(pl{k}) = this.(pl{k}).copy();
end
end
end
end
methods (Static)
% Creates an Instance of Class, ensures singleton behaviour (that there
% can only be one Instance of this class
function singleObj = getInstance(BeamName)
% Creates an Instance of Class, ensures singleton behaviour
persistent localObj;
if isempty(localObj) || ~isvalid(localObj)
localObj = Simulator.Beams(BeamName);
end
singleObj = localObj;
end
end
end