-
Notifications
You must be signed in to change notification settings - Fork 1
/
emission_rate_functions.py
137 lines (95 loc) · 3.82 KB
/
emission_rate_functions.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
""" FN_functions.py
These are a set of convenience functions for modeling of FN
emission from surfaces.
Functions that offer the derivative of the emission rate are also provided
for convenience when performing small-signal sampling analysis.
"""
import numpy as np
def J_FN_atomic(F, phi):
"""
J_FN_atomic(F, phi)
Description
------------------
Calculates the Fowler-Nordheim emission rate as a function
of the work function (phi) and field strength (F) at a surface.
Note that the emission is in arbitrary units and is not intended
to provide absolute current density output.
Inputs
-----------
F --> electric field strength (atomic units)
phi --> work function (energy in atomic units)
Outputs
-------------
Current density (relative current density...i.e. to within a constant factor).
"""
F_valid_range = np.where(F < 0)
F_valid = F[F_valid_range]
J = np.zeros(F.shape)
J[F_valid_range] = F_valid**2*np.exp(-4*np.sqrt(2)*phi**1.5/(-3*F_valid))
return J
def J_FN_SI(F, phi):
"""
J_FN_SI(
Simplified Standard Fowler-Nordheim-type equation for calculating current density.
The point of this function is to provide output in SI units. As such, all inputs
are expected in SI units as specified below.
Likewise, the current density is returned in units of A/nm^2.
Inputs
---------
F -- field (V/nm)
phi -- work function (eV)
Outputs
---------
Current density (A/nm^2)
"""
# Calculates physical current density
# https://en.wikipedia.org/wiki/Field_electron_emission#Recommended_form_for_simple_Fowler%E2%80%93Nordheim-type_calculations
J = np.zeros(F.shape)
#We need to invert F here as electron emission only occurs for negative fields.
#The following formulas were defined assuming F is positive to emit the particle.
F = -1*F
#The FN function is only defined over regions where the field is nonzero. We now
#find the indices of those regions and only perform our calculations in those
#regions. Everywhere else will be left as 0.
F_valid_range = np.where(F > 0)
F_valid = F[F_valid_range]
a_const = 1.541534e-6
b_const = 6.83089
f = 1.43996453529595*F_valid/phi**2
v_f = 1 - f + 1/6*f*np.log(abs(f))
J[F_valid_range] = a_const/phi*F_valid**2*np.exp(-v_f*b_const*phi**(3/2)/F_valid)
return J
def dJ_dF_FN_SI(F, phi):
"""
dJ_dF_FN_SI(
Derivative of Simplified Standard Fowler-Nordheim-type equation with respect to field.
This function is useful for determining the true transfer function of the emitter in the context of small-signal analysis.
The point of this function is to provide output in SI units. As such, all inputs
are expected in SI units as specified below.
Inputs
---------
F -- field (V/nm)
phi -- work function (eV)
Outputs
---------
Derivative of current density with respect to field (A/V/nm)
"""
# Calculates physical current density
# https://en.wikipedia.org/wiki/Field_electron_emission#Recommended_form_for_simple_Fowler%E2%80%93Nordheim-type_calculations
dJ_dF = np.zeros(F.shape)
#We need to invert F here as electron emission only occurs for negative fields.
#The following formulas were defined assuming F is positive to emit the particle.
F = -1*F
#The FN function is only defined over regions where the field is nonzero. We now
#find the indices of those regions and only perform our calculations in those
#regions. Everywhere else will be left as 0.
F_valid_range = np.where(F > 0)
F_valid = F[F_valid_range]
a_const = 1.541534e-6
b_const = 6.83089
f = 1.43996453529595*F_valid/phi**2
v_f = 1 - f + 1/6*f*np.log(abs(f))
alpha = a_const/phi
beta = v_f*b_const*phi**(3/2)
dJ_dF[F_valid_range] = (2*a_const/phi*F_valid + a_const*v_f*b_const*phi**(1/2))*np.exp(-v_f*b_const*phi**(3/2)/F_valid)
return dJ_dF