48 lines
2.3 KiB
Matlab
48 lines
2.3 KiB
Matlab
function ret = initialVelocitySampling(this, VelocityCutoff, AngularDistribution, NormalizationConstant)
|
|
n = this.NumberOfAtoms;
|
|
|
|
ret = zeros(n,3);
|
|
SampledVelocityMagnitude =zeros(n,1);
|
|
SampledPolarAngle =zeros(n,1);
|
|
SampledAzimuthalAngle =zeros(n,1);
|
|
|
|
MostProbableVelocity = sqrt((3 * Helper.PhysicsConstants.BoltzmannConstant * this.OvenTemperature) / Helper.PhysicsConstants.Dy164Mass); % For v * f(v) distribution
|
|
|
|
if MostProbableVelocity > VelocityCutoff
|
|
MaximumVelocityAllowed = VelocityCutoff;
|
|
else
|
|
MaximumVelocityAllowed = MostProbableVelocity;
|
|
end
|
|
ProbabilityOfMaximumVelocityAllowed = this.velocityDistributionFunction(MaximumVelocityAllowed);
|
|
ProbabilityOfMaximumDivergenceAngleAllowed = NormalizationConstant * max(AngularDistribution);
|
|
|
|
parfor i = 1:n
|
|
% Rejection Sampling of speed
|
|
y = ProbabilityOfMaximumVelocityAllowed * rand(1);
|
|
x = VelocityCutoff * rand(1);
|
|
|
|
while y > this.velocityDistributionFunction(x) %As long as this loop condition is satisfied, reject the corresponding x value
|
|
y = ProbabilityOfMaximumVelocityAllowed * rand(1);
|
|
x = VelocityCutoff * rand(1);
|
|
end
|
|
SampledVelocityMagnitude(i) = x; % When loop condition is not satisfied, accept x value and store as sample
|
|
|
|
% Rejection Sampling of polar angle
|
|
w = ProbabilityOfMaximumDivergenceAngleAllowed * rand(1);
|
|
z = this.MOTExitDivergence * rand(1);
|
|
|
|
while w > (NormalizationConstant * this.angularDistributionFunction(z) * sin(z)) %As long as this loop condition is satisfied, reject the corresponding x value
|
|
w = ProbabilityOfMaximumDivergenceAngleAllowed * rand(1);
|
|
z = this.MOTExitDivergence * rand(1);
|
|
end
|
|
SampledPolarAngle(i) = z; %When loop condition is not satisfied, accept x value and store as sample
|
|
|
|
% Sampling of azimuthal angle
|
|
SampledAzimuthalAngle(i)= 2 * pi * rand(1);
|
|
|
|
ret(i,:)=[SampledVelocityMagnitude(i)*cos(SampledPolarAngle(i)), SampledVelocityMagnitude(i)*sin(SampledPolarAngle(i))*cos(SampledAzimuthalAngle(i)), ...
|
|
SampledVelocityMagnitude(i)*sin(SampledPolarAngle(i))*sin(SampledAzimuthalAngle(i))];
|
|
end
|
|
end
|
|
|