Calculations/+Simulator/@Oven/Oven.m

178 lines
6.6 KiB
Matlab

classdef Oven < Simulator.MOTCaptureProcess & matlab.mixin.Copyable
properties (Access = private)
OvenDefaults = struct('NozzleLength', 60e-3, ...
'NozzleRadius', 2.60e-3, ...
'OvenTemperature', 1000);
end
properties (Access = public)
NozzleLength;
NozzleRadius;
OvenTemperature;
VelocityCutoff;
ClausingFactor;
ReducedClausingFactor;
ReducedFlux;
end
properties (Dependent)
ExitDivergence;
Beta;
OvenDistance;
OvenTemperatureinKelvin;
AverageVelocity;
AtomicBeamDensity;
MeanFreePath;
CollisionTime;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%- Methods
methods
function this = Oven(varargin)
this@Simulator.MOTCaptureProcess('SimulationMode', '2D', varargin{:});
this.NozzleLength = this.OvenDefaults.NozzleLength;
this.NozzleRadius = this.OvenDefaults.NozzleRadius;
this.OvenTemperature = this.OvenDefaults.OvenTemperature;
this.ClausingFactor = this.calculateClausingFactor();
[this.ReducedClausingFactor, ~] = this.calculateReducedClausingFactor();
end
function restoreDefaults(this)
this.NozzleLength = this.OvenDefaults.NozzleLength;
this.NozzleRadius = this.OvenDefaults.NozzleRadius;
this.OvenTemperature = this.OvenDefaults.OvenTemperature;
this.ClausingFactor = this.calculateClausingFactor();
[this.ReducedClausingFactor, ~] = this.calculateReducedClausingFactor();
end
end % - lifecycle
methods
function set.NozzleLength(this,val)
this.NozzleLength = val;
end
function ret = get.NozzleLength(this)
ret = this.NozzleLength;
end
function set.NozzleRadius(this,val)
this.NozzleRadius = val;
end
function ret = get.NozzleRadius(this)
ret = this.NozzleRadius;
end
function set.OvenTemperature(this,val)
this.OvenTemperature = val;
end
function ret = get.OvenTemperature(this)
ret = this.OvenTemperature;
end
function set.VelocityCutoff(this,val)
this.VelocityCutoff = val;
end
function ret = get.VelocityCutoff(this)
ret = this.VelocityCutoff;
end
function set.ClausingFactor(this,val)
this.ClausingFactor = val;
end
function ret = get.ClausingFactor(this)
ret = this.ClausingFactor;
end
function set.ReducedClausingFactor(this,val)
this.ReducedClausingFactor = val;
end
function ret = get.ReducedClausingFactor(this)
ret = this.ReducedClausingFactor;
end
function set.ReducedFlux(this,val)
this.ReducedFlux = val;
end
function ret = get.ReducedFlux(this)
ret = this.ReducedFlux;
end
end % - setters and getters
methods
function ret = get.Beta(this)
ret = 2 * (this.NozzleRadius/this.NozzleLength);
end
function ret = get.OvenDistance(this)
ApertureCut = max(2.5e-3,this.NozzleRadius);
ret = (25+12.5)*1e-3 + (this.NozzleRadius + ApertureCut) / tan(15/360 * 2 * pi);
end
function ret = get.ExitDivergence(this)
Theta_Nozzle = atan((this.NozzleRadius + 0.035/sqrt(2))/this.OvenDistance); % The angle of capture region towards the oven nozzle
Theta_Aperture = 15/360*2*pi; % The limitation angle of the second aperture in the oven
ret = min(Theta_Nozzle,Theta_Aperture);
end
function ret = get.OvenTemperatureinKelvin(this)
ret = this.OvenTemperature + Helper.PhysicsConstants.ZeroKelvin;
end
function ret = get.AverageVelocity(this)
%See Background collision probability section in Barbiero
ret = sqrt((8 * pi * Helper.PhysicsConstants.BoltzmannConstant*this.OvenTemperatureinKelvin)/ (9 * Helper.PhysicsConstants.Dy164Mass));
end
function ret = get.AtomicBeamDensity(this)
%See Background collision probability section in Barbiero
ret = this.calculateFreeMolecularRegimeFlux() / (this.AverageVelocity * pi * (this.Beta*this.NozzleLength/2)^2);
end
function ret = get.MeanFreePath(this)
% Cross section = pi ( 2 * Van-der-waals radius of Dy)^2;
% Van-der-waals radius of Dy = 281e-12
%See Expected atomic flux section and Background collision probability section in Barbiero
ret = 1/(sqrt(2) * ( pi * (2*281e-12)^2) * this.AtomicBeamDensity);
end
function ret = get.CollisionTime(this)
ret = 3 * this.MeanFreePath/this.AverageVelocity; %See Background collision probability section in Barbiero
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(varargin)
% Creates an Instance of Class, ensures singleton behaviour
persistent localObj;
if isempty(localObj) || ~isvalid(localObj)
localObj = Simulator.Oven();
end
singleObj = localObj;
end
end
end