38 lines
1.3 KiB
Mathematica
38 lines
1.3 KiB
Mathematica
|
function ret = angularDistributionFunction(this, theta)
|
||
|
%This function calculate the angle distribution of atoms coming out
|
||
|
%from a single channel.
|
||
|
|
||
|
KnudsenNumber = this.MeanFreePath/this.NozzleLength;
|
||
|
|
||
|
alpha=0.5 - (3*this.Beta^2)^-1 * ...
|
||
|
((1 - (2*this.Beta^3) + ((2*this.Beta^2) - 1) * sqrt(1+this.Beta^2)) / ...
|
||
|
(sqrt(1+this.Beta^2) - (this.Beta^2 * asinh((this.Beta^2)^-1))));
|
||
|
|
||
|
eta0 = alpha;
|
||
|
eta1 = 1 - alpha;
|
||
|
|
||
|
delta = (eta0./sqrt(2*KnudsenNumber*(eta1-eta0)))./sqrt(cos(theta));
|
||
|
|
||
|
F = 2/sqrt(pi)* (1-eta1)/eta0 * delta.* exp( -(delta*eta1/eta0).^2 );
|
||
|
q = this.Beta^-1 * tan(theta);
|
||
|
R = acos(q) - (q .* sqrt(1-q.^2));
|
||
|
|
||
|
if abs(q) >= 1
|
||
|
t = linspace(0,1,10000);
|
||
|
S = sum(sqrt(1-t.^2).* ( erf(delta.*(1 + (t.*(eta1-eta0)./(q.*eta0)) ))-erf(delta)))*(t(2)-t(1));
|
||
|
if S == 0 || isnan(S)
|
||
|
ret = eta0*cos(theta);
|
||
|
else
|
||
|
ret = eta0*cos(theta)+ 2/sqrt(pi)*eta0*cos(theta) * (exp(delta.^2)/delta) * S;
|
||
|
end
|
||
|
else
|
||
|
t = linspace(0,q,10000);
|
||
|
S = sum(sqrt(1-t.^2).* ( erf(delta.*(1 + (t.*(eta1-eta0)./(q.*eta0)) ))-erf(delta)))*(t(2)-t(1));
|
||
|
if isnan(S)
|
||
|
S=0;
|
||
|
end
|
||
|
ret = 2/sqrt(pi)*eta0*cos(theta)*(exp(delta.^2)/delta) * (R./2*(erf(delta*eta1/eta0)-erf(delta)+F)+S)+eta0*cos(theta);
|
||
|
end
|
||
|
end
|
||
|
|