Initial commit

This commit is contained in:
Ian Jauslin 2018-10-12 20:24:46 +00:00
commit 0425ca5693
22 changed files with 2215 additions and 0 deletions

View File

@ -0,0 +1,400 @@
\documentclass{ian}
\usepackage{graphicx}
\usepackage{array}
\begin{document}
\hbox{}
\hfil{\bf\LARGE
Solution of the time dependent Schr\"odinger equation\par
\vskip10pt
\hfil leading to Fowler-Nordheim field emission\par
}
\vfill
\hfil{\bf\large Ovidiu Costin}\par
\hfil{\it Department of Mathematics, The Ohio State University}\par
\hfil{\tt\color{blue}\href{mailto:costin.9@osu.edu}{costin.9@osu.edu}}\par
\vskip20pt
\hfil{\bf\large Rodica Costin}\par
\hfil{\it Department of Mathematics, The Ohio State University}\par
\hfil{\tt\color{blue}\href{mailto:costin.10@osu.edu}{costin.10@osu.edu}}\par
\vskip20pt
\hfil{\bf\large Ian Jauslin}\par
\hfil{\it Department of Physics, Princeton University}\par
\hfil{\it School of Mathematics, Institute for Advanced Study}\par
\hfil{\tt\color{blue}\href{mailto:ijauslin@princeton.edu}{ijauslin@princeton.edu}}\par
\vskip20pt
\hfil{\bf\large Joel L. Lebowitz}\par
\hfil{\it Department of Mathematics and Physics, Rutgers University}\par
\hfil{\tt\color{blue}\href{mailto:lebowitz@math.rutgers.edu}{lebowitz@math.rutgers.edu}}\par
\vskip20pt
\vfill
\hfil {\bf Abstract}\par
\medskip
We solve the time-dependent Schr\"odinger equation describing the emission of electrons from a metal surface by an external electric field $E$, turned on at $t=0$. Starting with a wave function $\psi(x,0)$, representing a generalized eigenfunction when $E=0$, we find $\psi(x,t)$ and show that it approaches, as $t\to\infty$, the Fowler-Nordheim tunneling wavefunction $\psi_E$. The deviation of $\psi$ from $\psi_E$ decays asymptotically as a power law $t^{-\frac32}$. The time scales involved for typical metals and fields of several V/nm are of the order of femtoseconds. We plot the short-time evolution of the current and density.
\vfill
\tableofcontents
\vfill
\eject
\setcounter{page}1
\pagestyle{plain}
\section{Introduction}
\indent The emission of electrons from a cold metal surface subjected to a constant (or oscillating) electric field is a subject of great practical and theoretical interest\-~\cite{Je03,Fo16,Je17}. The microscopic theory of such emissions by a constant field was developed by Fowler and Nordheim (FN) in the early days of quantum mechanics\-~\cite{FN28} (referred to then as the ``new mechanics''). They considered an idealized situation in which the electrons in the conduction band are treated, a la Sommerfeld, as free independent particles. Their energies are described by a Fermi distribution with maximum energy $E_F=\hbar^2k_{\mathrm F}^2/2m$; the deviation from this zero-temperature distribution is negligible at room temperatures. In the absence of an external field the electrons are confined by an external potential (caused by the positive ions) of magnitude $U=E_F+W$, where $W$ is the work function, i.e. the energy necessary to extract an electron from the metal.
\bigskip
\indent Considering emissions perpendicular to a flat surface at $x=0$, obtained when applying an external field $E$ for $x\geqslant 0$, assuming that the metal occupies all space $x<0$, leads to a one-dimensional tunneling problem in a triangular potential, see Fig.\-~\ref{fig:potential}. The one-dimensional Schr\"odinger equation describing an electron moving in this potential is then given by
\begin{equation}
\label{schrodinger}
i\partial_t\psi(x,t)=(-{\textstyle\frac12}\partial_x^2+V(x))\psi(x,t)
\end{equation}
where
\begin{equation}
V(x)=\left\{ \begin{array}{ll} 0, & x<0\\
U-E x, & x>0 \end{array}\right.
\label{V}
\end{equation}
in atomic units $(\hbar=m=|e|=1)$.
\bigskip
\begin{figure}
\hfil\includegraphics[width=8cm]{potential.pdf}\hfil\hbox{}\par
\caption{The shape of the potential $V(x)$.}
\label{fig:potential}
\end{figure}
\indent When $E=0$, the potential is, simply, a step function. The Schr\"odinger equation\-~(\ref{schrodinger}) with $E=0$ has stationary solutions with energies $k^2/2<U$, $\psi(x,t)=e^{-i\frac12k^2t}\psi_0(x)$, with $k>0$ and
\begin{equation}
\psi_0(x)=\left\{ \begin{array}{ll} e^{i k x} +R_0 e^{-i k x} & x<0\\
T_0e^{-\sqrt{2U-k^2}x} & x>0 \end{array}\right.
\label{psi0}
\end{equation}
in which $R_0$ and $T_0$ are the {\it reflection} and {\it transmission} coefficients (we use a normalization in which the amplitude of the incoming wave with $k>0$ is 1):
\begin{equation}
R_0=\frac{ik+\sqrt{2U-k^2}}{ik-\sqrt{2U-k^2}}
,\quad
T_0=\frac{2ik}{ik-\sqrt{2U-k^2}}
.
\label{R0T0}
\end{equation}
These constants ensure that $\psi_0(x)$ and $\partial\psi_0(x)$ are continuous at $x=0$. Note that, in this state, the current vanishes:
\begin{equation}
j_0(x)=i(\psi_0\partial_x\psi_0^*-\psi_0^*\partial_x\psi_0)=0
.
\end{equation}
\bigskip
\indent When $E>0$, there is the possibility for an electron moving in the $+x$ direction, with kinetic energy $k^2/2<U$, to tunnel through the potential barrier and be emitted. This will then produce an electron current in the $+x$-direction. To obtain the probability of tunneling, FN computed the stationary solutions $\psi(x,t)=e^{-i\frac12k^2t}\psi_E(x)$ by solving
\begin{equation}
(-{\textstyle\frac12}\partial_x^2+\Theta(x)(U-Ex)-{\textstyle\frac12}k^2)\psi_E(x)=0
\label{eqpsiE}
\end{equation}
($\Theta(x)$ is the Heaviside function, which is equal to 1 if $x\geqslant 0$ and $0$ otherwise) whose solution is
\begin{equation}
\psi_E(x)=
\left\{ \begin{array}{ll}
e^{i k x} +R_E e^{-i k x} & x<0\\
T_E\Phi(x) & x>0.
\end{array}\right.
,\quad
k>0
\label{psiE}
\end{equation}
in which $\Phi(x)$ is proportional to the Airy function Ai$(x)$ (or the equivalent expression in terms of Hankel or Bessel functions), which decays when $x\to\infty$, and yet has a constant positive current for all $x$. This solution, see also\-~\cite{Ro11,Je03}, yielded the tunneling probability $D(k)=1-|R_E|^2$ of the electron as a function of $k,\,U$ and $E$. Integrating $kD(k)$ over the ``supply function'' corresponding to the density of electrons in the Fermi sea moving in the $+x$ direction with energy $k^2/2$, leads to an expression for the total steady state current $j_E$ in a static field $E$. An approximate expression for $j_E$ is~\-\cite{Fo08b,Je17}
\begin{equation}
j_E\approx c_1E^2e^{-\frac{c_2}E}
.
\end{equation}
\bigskip
\indent The FN formula for $j_E$, with various corrections for the idealizations made, e.g. flat surface, independent electrons, neglecting the Schottky effect, {\it etc.}, serves as the backbone of cold electron emission theory and experiment. There is a vast literature on the subject (the original FN paper\-~\cite{FN28} has more than 6000 citations). We cite here only a few\-~\cite{Ro11,Fo08} and refer the reader for more information to the recent book by Jensen\-~\cite{Je17} and references therein.
\bigskip
\indent In this note we shall be concerned with a different problem, which, as far as we know, has not been investigated fully before. As an initial condition, we take a stationary solution of the Schr\"odinger equation at $E=0$, $\psi_0(x)$ in\-~(\ref{psi0}), and, at $t=0$, we turn the field on, and study the time evolution. In particular, we will investigate how long it will take, if ever, for the initial state $\psi(x,0)$ to approach the stationary state $\psi_E(x)$ in\-~(\ref{psiE}). Of course, turning on $E$ instantaneously is an idealization, which we shall accept here. (In\-~\cite{YGR11}, this initial condition is considered, but the analysis then focuses mostly on the stationary solution.)
\bigskip
\indent In what follows, we shall prove that, for $\psi(x,0)=\psi_0(x)$, $\psi (x,t)$ approaches, for long times, the $\psi_E(x)$ of\-~(\ref{psiE}), i.e.,
\begin{equation}
\label{psi_lim}
\psi (x,t)\sim e^{-i\frac12k^2t}\psi_E(x)
\end{equation}
In fact, this holds for a wider class of initial conditions, in which the initial incident wave is $e^{ikx}$ and the initial reflected and transmitted waves are arbitrary. The deviation $\psi(x,t)-\psi_E(x)$ decays asymptotically as $t^{-\frac32}$. The actual time dependence, of course, depends on the exact form of $\psi(x,0)$. We shall calculate this for the $\psi(x,0)=\psi_0(x)$ given in\-~(\ref{psi0}) for different values of the parameters.
\bigskip
\indent Roughly speaking we find that for $U\approx9\ \mathrm{eV}$, $\hbar^2k_{\mathrm F}^2/2m=E_{\mathrm F}\approx 4.5\ \mathrm{eV}$ and $E\approx 4$-$8\ \mathrm{V}\cdot\mathrm{nm}^{-1}$, the time for the density $|\psi|^2$ and the current $j(t)$ to approach its final FN value is of the order of femtoseconds. The exact value depends on the position $x$ where we measure the current: for larger $x$, the time it takes for the current to stabilize is larger, see Fig.\-~\ref{current_density}. Such time scales are of practical relevance for short pulses of the order of femtoseconds or less. These are now common for oscillating laser fields for which the initial value problem will be considered in a later paper. (The ``steady state'' solution for laser fields was investigated in detail by Faisal et al\-~\cite{FKS05}; see also \cite{ZL16}.)
\section{Solution of the initial value problem}
\indent In order to emphasize the role of each term in the initial condition, we will split $\psi(x,0)$ into three terms: an incoming, a reflected, and a transmitted wave.
\begin{equation}
\psi(x,0)=\psi^{(\mathrm I)}(x,0)+\psi^{(\mathrm R)}(x,0)+\psi^{(\mathrm T)}(x,0)
\label{psi_sum}
\end{equation}
with
\begin{equation}
\psi^{(\mathrm I)}(x,0)=\Theta(-x)e^{ikx}
,\quad
\psi^{(\mathrm R)}(x,0)=R_0\Theta(-x)e^{-ikx}
,\quad
\psi^{(\mathrm T)}(x,0)=T_0\Theta(x)e^{-\sqrt{2U-k^2}x}
,\quad
k>0
\end{equation}
(recall that $\Theta(x)$ is the Heaviside function, which is equal to 1 if $x\geqslant 0$ and $0$ otherwise). Since the Schr\"odinger equation is linear, its solution will be the sum of the solutions for each term in $\psi(x,0)$.
\bigskip
\indent To obtain $\psi(x,t)$ we solve for $\hat\psi_p(x)$, the Laplace transform of $\psi(x,t)$,
\begin{equation}
\hat\psi_p(x):=\int_0^\infty dt\ e^{-pt}\psi(x,t)
\end{equation}
which we obtain in closed form. We then compute, by inverting the Laplace transform, the long time asymptotics analytically, and the short time behavior numerically. This method provides an integral representation of the solution which can be evaluated numerically. It is thus better for our purposes than direct computations of the solution of\-~(\ref{schrodinger}). The latter requires cutoffs for the non-square integrable functions we are dealing with and cannot be used for long times. The Laplace transform of $\psi$ satisfies the equation
\begin{equation}
(-{\textstyle\frac12}\partial_x^2+\Theta(x)(U-Ex)-ip)\hat\psi_p(x)=-i\psi(x,0)
.
\label{schrodinger_laplace}
\end{equation}
The physical solution to this equation is
\begin{equation} \label{sol11}
\hat\psi_p(x)=
\left\{\begin{array}{>\displaystyle ll}
C_1(p)e^{\sqrt{-2ip}x}+F^{(\mathrm I)}_p(x)+R_0F^{(\mathrm R)}_p(x)
&\mathrm{if\ }x<0\\[0.5cm]
C_2(p)\varphi_p(x)+T_0F^{(\mathrm T)}_p(x)
&\mathrm{if\ }x> 0
\end{array}\right.
\end{equation}
where $R_0$ and $T_0$ are given in\-~(\ref{R0T0}),
\begin{equation}\label{2p6}
F^{(\mathrm I)}_p(x):=-\frac{2ie^{ikx}}{-2ip+k^2}
,\quad
F^{(\mathrm R)}_p(x):=-\frac{2ie^{-ikx}}{-2ip+k^2}
\end{equation}
\begin{equation}
F^{(\mathrm T)}_p(x):=
\frac{4\pi}{(2E)^{\frac13}}\left(\varphi_p(x)\int_0^x dy\ \eta_p(y)e^{-\sqrt{2U-k^2}y}
+\eta_p(x)\int_x^\infty dy\ \varphi_p(y)e^{-\sqrt{2U-k^2}y}\right)
\end{equation}
and
\begin{equation}
\varphi_p(x)=\mathrm{Ai}\left(2^{\frac13}e^{-\frac{i\pi}3}\left(E^{\frac13}x-E^{-\frac23}(U-ip)\right)\right)
\end{equation}
\begin{equation}
\eta_p(x)=e^{-\frac{i\pi}3}\mathrm{Ai}\left(-2^{\frac13}\left(E^{\frac13}x-E^{-\frac23}(U-ip)\right)\right)
\label{varphi}
\end{equation}
are two independent solutions of $(-\frac12\partial_x^2+U-Ex-ip)f=0$. The phases $e^{-\frac{i\pi}3}$ and $-1$ are cube roots of $-1$. The constants $C_1(p)$ and $C_2(p)$ are set so that $\hat\psi_p$ and $\partial\hat\psi_p$ are continuous at $x=0$:
\begin{equation}
C_1(p)=-\frac{2iT_0}{\sqrt{-2ip}\varphi_p(0)-\partial\varphi_p(0)}\left(
\frac{\sqrt{2U-k^2}\varphi_p(0)+\partial\varphi_p(0)}{-2ip+k^2}
+\int_0^\infty dy\ \varphi_p(y)e^{-\sqrt{2U-k^2}y}
\right)
\end{equation}
and
\begin{equation}\label{formC2}
\begin{array}{>\displaystyle r@{\ }>\displaystyle l}
C_2(p)=-\frac{2iT_0}{\sqrt{-2ip}\varphi_p(0)-\partial\varphi_p(0)}&\Bigg(
\frac{\sqrt{2U-k^2}+\sqrt{-2ip}}{-2ip+k^2}
\\\hfill&\hskip10pt
-\frac{2i\pi}{(2E)^{\frac13}}(\sqrt{-2ip}\eta_p(0)-\partial\eta_p(0))\int_0^\infty dy\ \varphi_p(y)e^{-\sqrt{2U-k^2}y}
\Bigg)
\end{array}
\end{equation}
where $\partial\varphi_p(0)\equiv\frac{\partial\varphi_p(x)}{\partial x}\big|_{x=0}$ and similarly for $\partial\eta_p(0)$. The square root is defined with a branch cut along the positive imaginary axis, in such a way that $\sqrt{-2ip}$ has a branch cut along the real negative axis.
\bigskip
\indent A simple calculation shows that, as expected,
\begin{equation}
\lim_{\displaystyle\mathop{\scriptstyle|p|\to\infty}_{\mathcal Re(p)>0}}p\hat\psi_p(x)=\psi(x,0)
\label{laplace_init}
\end{equation}
which confirms that $\hat\psi_p(x)$ is, indeed, the Laplace transform of a function whose initial condition is $\psi(x,0)$.
\bigskip
\indent We then invert the Laplace transform:
\begin{equation}
\psi(x,t)=\frac1{2i\pi}\int_{\gamma-i\infty}^{\gamma+i\infty}dp\ e^{pt}\hat\psi_p(x)
\label{inv_laplace}
\end{equation}
in which $\gamma>0$ is an arbitrary small parameter taken close to $0$.
\bigskip
\indent As is well known the integral on the right hand side of\-~(\ref{inv_laplace}) can be computed deforming the integration contour as in Fig.\-~\ref{fig:contour}, and studying the singularities, poles and branch points of $\hat\psi_p(x)$, lying in the half plane $\mathcal Re(p)\leq 0$. In particular, the only terms which do not decay as $t\to\infty$ come from poles on the imaginary $p$-axis. Analyzing\-~(\ref{sol11})-(\ref{formC2}) we find that the singularities of $\hat\psi_p(x)$ are, for $k>0$,
\begin{itemize}
\item a pole on the imaginary axis, located at $-ik^2/2$, coming from (\ref{2p6}), (\ref{formC2}) and (\ref{laplace_init})
\item poles with strictly negative real parts corresponding to the roots of $\sqrt{-2ip}\varphi_p(0)-\partial\varphi_p(0)$ appearing in the denominators of $C_1$ and $C_2$,
\item a branch cut along the negative real axis coming from $\sqrt{-2ip}$.
\end{itemize}
\bigskip
\point{\bf Long time behavior.} The residue at $-ik^2/2$ yields the only term which does not decay in time: by an explicit computation, we find that the residue is equal to
\begin{equation}
e^{-i\frac12k^2t}\psi_E(x)
\end{equation}
where $\psi_E$ is the FN solution\-~(\ref{psiE}).
\bigskip
\indent The residues of the poles with a negative real part decay exponentially in time (because of the factor $e^{pt}$ in~\-(\ref{inv_laplace})).
\bigskip
\indent The integral along the branch cut decays algebraically, as $t^{-\frac32}$: we define, for $p-i\epsilon\in\mathbb R_-$,
\begin{equation}
\alpha:=e^{\frac{i\pi}4}\sqrt{-ip}
,\quad
f(\alpha):=\hat\psi_{\alpha^2}(x)
\end{equation}
and write the integral along the branch cut as
\begin{equation}
\psi^{(\mathrm{BC})}(x,t)
:=
\int_{-\infty-i\epsilon}^{-i\epsilon} dp\ e^{pt}\hat\psi_p(x)
+
\int_{i\epsilon}^{-\infty+i\epsilon} dp\ e^{pt}\hat\psi_p(x)
=
2\int_0^\infty d\alpha\ e^{-\alpha^2t}\alpha(f(\alpha)-f(-\alpha))
.
\end{equation}
By Taylor expansion, (in this context, this technique is usually called Watson's lemma)
\begin{equation}
\psi^{(\mathrm{BC})}(x,t)
=
4\int_0^\infty d\alpha\ e^{-\alpha^2t}\alpha^2\partial f(0)
+O(t^{-\frac52})
=\left(\frac{t}{\tau_E(x)}\right)^{-\frac32}+O(t^{-\frac52})
.
\end{equation}
with
\begin{equation}
\tau_E(x)=\left\{\begin{array}{>\displaystyle ll}
\left(c_E(\varphi_0(0)+x\partial\varphi_0(0))\right)^{\frac23}
&\mathrm{if\ }x<0
\\[0.5cm]
\left(c_E\varphi_0(x)\right)^{\frac23}
&\mathrm{if\ }x>0
\end{array}\right.
\end{equation}
and
\begin{equation}
c_E=
-\frac{\sqrt2T_0e^{\frac{i\pi}4}}{\sqrt\pi(\partial\varphi_0(0))^2}
\left(
\frac{\sqrt{2U-k^2}\varphi_0(0)+\partial\varphi_0(0)}{k^2}
+\int_0^\infty dy\ \varphi_0(y)e^{-\sqrt{2U-k^2}y}
\right)
.
\end{equation}
\indent All in all, we find that
\begin{equation}
\psi(x,t)
=e^{-i\frac12k^2t}\psi_E(x)+\left(\frac{t}{\tau_E(x)}\right)^{-\frac32}+O(t^{-\frac52})
.
\end{equation}
Therefore, the wave function tends to the Fowler-Nordheim solution, with a rate $t^{-\frac32}$.
\bigskip
\begin{figure}
\hfil\includegraphics[width=8cm]{contour.pdf}\hfil\hbox{}\par
\caption{The deformed integration contour goes around the poles (one of which is on the imaginary axis, at $-ik^2/2$, while the others are in the negative real half-plane) and goes along the branch cut on the real negative axis.}
\label{fig:contour}
\end{figure}
\point{\bf Short time behavior.} The behavior of $\psi(x,t)$ for small $t$ is more difficult to study analytically, but the inverse Laplace transform\-~(\ref{inv_laplace}) yields an integral formula that can be efficiently approximated numerically using fast Fourier transforms.
\bigskip
In Fig.\-~\ref{current_density} we have plotted the density $|\psi(x,t)|^2$, current
\begin{equation}
j_k(x,t):=i(\psi\partial_x\psi^*-\psi^*\partial_x\psi)
\end{equation}
and integrated current (the current integrated over the supply function at 0 temperature)
\begin{equation}
J_{k_{\mathrm F}}(x,t):=\int_0^{k_{\mathrm F}}dk\ j_k(x,t)
\end{equation}
as a function of time at two different values of $x$: $x_0:=\frac{2U-k_{\mathrm F}^2}{2E}\approx 11\ \mathrm{nm}$ and $10x_0$ ($x_0$ is the point at which $V(x_0)=\frac{k_{\mathrm F}^2}2$), and at two different values of $E$: $4$ and $8\ \mathrm{V}\cdot\mathrm{nm}^{-1}$. We have normalized the current $j$ by $2k$, which is the current of the incoming wave $e^{ikx}$, and the integrated current $J$ by $k_{\mathrm F}^2$, which is the current of the incoming wave integrated over the supply function. We find that there is a transient regime that lasts a few femtoseconds before the system stabilizes to the FN value. There is a delay before the signal reaches $x_0$, and between $x_0$ and $10x_0$. As expected, the asymptotic value of the current is independent of $x$. Note that the current and density depend strongly on the field $E$.
\bigskip
\begin{figure}
\begin{tabular}{c|c}
\includegraphics[width=7cm]{density-4.pdf} {\scriptsize({\bf a})}&
\includegraphics[width=7cm]{density-8.pdf} {\scriptsize({\bf b})}\\
\hline
\includegraphics[width=7cm]{currents-4.pdf} {\scriptsize({\bf c})}&
\includegraphics[width=7cm]{currents-8.pdf} {\scriptsize({\bf d})}\\
\hline
\includegraphics[width=7cm]{integrated_current-4.pdf}{\scriptsize({\bf e})}&
\includegraphics[width=7cm]{integrated_current-8.pdf}{\scriptsize({\bf f})}
\end{tabular}
\caption{The density ({\bf a}),({\bf b}), current ({\bf c}),({\bf d}) and integrated current ({\bf e}),({\bf f}) as a function of time at $x=x_0\equiv\frac{2U-k_{\mathrm F}^2}{2E}$ and $x=10x_0$. We have taken $U=9\ \mathrm{eV}$ and $k^2/2=k_{\mathrm F}^2/2\equiv E_{\mathrm F}=4.5\ \mathrm{eV}$. In ({\bf a}),({\bf c}),({\bf e}), the field is $E=4\ \mathrm{V}\cdot \mathrm{nm}^{-1}$ and $x_0\approx11\ \mathrm{nm}$. In ({\bf b}),({\bf d}),({\bf f}), $E=8\ \mathrm{V}\cdot\mathrm{nm}^{-1}$ and $x_0\approx22\ \mathrm{nm}$. In ({\bf a}),({\bf c}),({\bf e}), the plots seem to indicate that the curves converge to 0, but they actually tend to small finite values.}
\label{current_density}
\end{figure}
\noindent{\bf Remark}: While the time scale of the approach to the FN solution is clearly of order of femtoseconds we have not attempted to compute a ``tunneling time''. This is, as is well known, a tricky business, with many possible definitions, see, e.g. \cite{LM94,LK15}. Defining such a time in terms of the approach of the initial state to some steady state was investigated by McDonald et al.\-~\cite{MOe13}. Pfeifer and Fr\"ohlich\-~\cite{PF95} have computed rigorous bounds on the lifetimes of spatially confined states.
\section{Possible generalizations}
\point{\bf Initial conditions.} As is shown by the computation described above, the long time asymptotic behavior of the wave function is independent of the initial reflected and transmitted waves. That is, the initial condition $\psi(x,0)=\psi^{(\mathrm I)}(x,0)=\Theta(-x)e^{ikx}$ leads to the same asymptotic formula:
\begin{equation}
\psi(x,t)\sim e^{-i\frac12 k^2t}\psi_E(x).
\end{equation}
Indeed, the reflected and transmitted initial conditions do not actually give rise to any poles on the imaginary axis and therefore their contributions decay in time.
\bigskip
This leaves open the possibility to consider much more general initial conditions than\-~(\ref{psi_sum}): one can change the coefficients of the reflected and transmitted waves, add such waves with different wave vectors, or remove them altogether, without changing the asymptotic formula. Only the incoming wave $e^{ikx}$ affects it. In addition, one can add any square-integrable function to the initial condition without changing the long-time behavior. This is a consequence of the RAGE theorem \cite{Ru69,AG73,En78}, which states that whenever the Hamiltonian has absolutely continuous spectrum (as is the case here), the solution of the Schr\"odinger equation with a square-integrable initial condition vanishes point-wise as $t\to\infty$.
\bigskip
With this fact in mind, one can make an easy argument why the asymptotic behavior of the wave function must coincide with the stationary solution. Indeed, once we drop the initial reflected and transmitted waves,
the Laplace transform of the wave function is of the form
\begin{equation}
\hat\psi_p(x)=\frac{-2i}{-2ip+k^2}\left(\left(e^{ikx}+Re^{-\sqrt{-2ip}x}\right)\Theta(-x)+T\varphi_p(x)\Theta(x)\right)
\end{equation}
in which $\varphi_p$ is the solution of
\begin{equation}
\left(-\frac12\partial_x^2+V(x)-ip\right)\varphi_p(x)=0
,\quad
x>0
.
\label{eqvarphi}
\end{equation}
When $p=-ik^2/2$, (\ref{eqvarphi}) coincides with the equation\-~(\ref{eqpsiE}) for $\psi_E$. Assuming that $R$ and $T$ do not introduce any new poles on the imaginary axis (as we showed is the case), this implies that $\psi(x,t)$ converges to $e^{-i\frac12k^2t}\psi_E(x)$ as $t\to\infty$.
\bigskip
\point{\bf Potentials.} The exact form of the potential $V(x)=U-Ex$ was not really used in much of the computation above, so it can be carried out in very much the same way for many other $V(x)$. For instance, one could round off the triangular barrier as occurs in the Schottky effect\-~\cite{Fo08}. We could also consider a square barrier. The only real constraint on the potential is that it not introduce bound states. To make this into a precise statement, one would also have to put constraints on the regularity and asymptotic properties of $V$, which we will not do here.
\bigskip
This leaves open the possibility of studying trains of pulses, in which the field is turned on and off repeatedly. The regime in which the field is off corresponds to a potential $V(x)=U\Theta(x)$, which can be studied using the method described above. Provided the time between the pulses is long enough, the system would stabilize to the stationary state in the time between each field switching.
\bigskip
\point{\bf Time-dependent fields.} It would be very interesting to consider a similar question in the case of an oscillating laser field $E=e_0\cos(\omega t)$. The stationary state of this problem was studied by Faisal et al.\-~\cite{FKS05}, and we are currently working on showing that the solutions of the initial value problem converge to this solution, and studying the short-time behavior.
\bigskip
\vfill
\delimtitle{\bf Acknowledgements}
\noindent This material is based upon work supported by the AFOSR under the award number FA9500-16-1-0037. OC was partially supported by the NSF-DMS grant 1515755. IJ was partially supported by the NSF-DMS grant 1128155. JLL thanks Kevin Jensen and Don Shiffler for useful discussions and the IAS for hospitality during part of this work.
\enddelim
\vfill
\eject
\begin{thebibliography}{WWW99}
\small
\IfFileExists{bibliography/bibliography.tex}{\input bibliography/bibliography.tex}{}
\end{thebibliography}
\end{document}

61
Makefile Normal file
View File

@ -0,0 +1,61 @@
PROJECTNAME=$(basename $(wildcard *.tex))
LIBS=$(notdir $(wildcard libs/*))
FIGS=$(notdir $(wildcard figs/*.fig))
PDFS=$(addsuffix .pdf, $(PROJECTNAME))
SYNCTEXS=$(addsuffix .synctex.gz, $(PROJECTNAME))
all: $(PROJECTNAME)
$(PROJECTNAME): $(LIBS) $(FIGS)
pdflatex -file-line-error $@.tex
pdflatex -file-line-error $@.tex
pdflatex -synctex=1 $@.tex
$(PROJECTNAME).aux: $(LIBS) $(FIGS)
pdflatex -file-line-error -draftmode $(PROJECTNAME).tex
$(SYNCTEXS): $(LIBS) $(FIGS)
pdflatex -synctex=1 $(patsubst %.synctex.gz, %.tex, $@)
libs: $(LIBS)
$(LIBS):
ln -fs libs/$@ ./
bibliography/bibliography.tex: $(PROJECTNAME).aux
BBlog -c bibliography/conf.BBlog -d $(BIBLIOGRAPHY) -b bibliography/bibliography.tex
figs: $(FIGS)
$(FIGS):
make -C figs/$@
for pdf in $$(find figs/$@/ -name '*.pdf'); do ln -fs "$$pdf" ./ ; done
clean-aux: clean-figs-aux
rm -f $(addsuffix .aux, $(PROJECTNAME))
rm -f $(addsuffix .log, $(PROJECTNAME))
rm -f $(addsuffix .out, $(PROJECTNAME))
rm -f $(addsuffix .toc, $(PROJECTNAME))
clean-libs:
rm -f $(LIBS)
clean-figs:
$(foreach fig,$(addprefix figs/, $(FIGS)), make -C $(fig) clean; )
rm -f $(notdir $(wildcard figs/*.fig/*.pdf))
clean-figs-aux:
$(foreach fig,$(addprefix figs/, $(FIGS)), make -C $(fig) clean-aux; )
clean-tex:
rm -f $(PDFS) $(SYNCTEXS)
clean-bibliography:
rm -f bibliography/bibliography.tex
clean: clean-aux clean-tex clean-libs clean-figs

40
README Normal file
View File

@ -0,0 +1,40 @@
This directory contains the source files to typeset the article, and generate
the figures. This can be accomplished by running
make
This document uses a custom class file, located in the 'libs' directory, which
defines a number of commands. Most of these are drop-in replacements for those
defined in the 'article' class.
Some extra functionality is provided in custom style files, located in the
'libs' directory.
* Dependencies:
pdflatex
TeXlive packages:
amsfonts
array
color
graphics
hyperref
latex
marginnote
pgf
standalone
GNU make
python3
julia
* Files:
Costin_Costin_Jauslin_Lebowitz_2018.tex:
main LaTeX file
libs:
custom LaTeX class file
figs:
source code for the figures

View File

@ -0,0 +1,50 @@
\bibitem[AG73]{AG73}W.O. Amrein, V. Georgescu - {\it On the characterization of bound states and scattering states in quantum mechanics}, Helvetica Physica Acta, volume~\-46, issue~\-5, pages~\-635-658, 1973,\par\penalty10000
doi:{\tt\color{blue}\href{http://dx.doi.org/10.5169/seals-114499}{10.5169/seals-114499}}.\par\medskip
\bibitem[En78]{En78}V. Enss - {\it Asymptotic completeness for quantum mechanical potential scattering}, Communications in Mathematical Physics, volume~\-61, issue~\-3, pages~\-285-291, 1978,\par\penalty10000
doi:{\tt\color{blue}\href{http://dx.doi.org/10.1007/BF01940771}{10.1007/BF01940771}}.\par\medskip
\bibitem[FKS05]{FKS05}F.H.M. Faisal, J.Z. Kami\'nski, E. Saczuk - {\it Photoemission and high-order harmonic generation from solid surfaces in intense laser fields}, Physical Review A, volume~\-72, issue~\-2, number~\-023412, 2005,\par\penalty10000
doi:{\tt\color{blue}\href{http://dx.doi.org/10.1103/PhysRevA.72.023412}{10.1103/PhysRevA.72.023412}}.\par\medskip
\bibitem[Fo08]{Fo08}R.G. Forbes - {\it On the need for a tunneling pre-factor in FowlerNordheim tunneling theory}, Journal of Applied Physics, volume~\-103, issue~\-11, number~\-114911, 2008,\par\penalty10000
doi:{\tt\color{blue}\href{http://dx.doi.org/10.1063/1.2937077}{10.1063/1.2937077}}.\par\medskip
\bibitem[Fo08b]{Fo08b}R.G. Forbes - {\it Physics of generalized Fowler-Nordheim-type equations}, Journal of Vacuum Science and Technology B, volume~\-26, issue~\-2, pages~\-788-793, 2008,\par\penalty10000
doi:{\tt\color{blue}\href{http://dx.doi.org/10.1116/1.2827505}{10.1116/1.2827505}}.\par\medskip
\bibitem[Fo16]{Fo16}R.G. Forbes - {\it Field Electron Emission Theory}, Proceedings of Young Researchers in Vacuum Micro/Nano Electronics, IEEE, 2016,\par\penalty10000
doi:{\tt\color{blue}\href{http://dx.doi.org/10.1109/VMNEYR.2016.7880403}{10.1109/VMNEYR.2016.7880403}}, arxiv:{\tt\color{blue}\href{http://arxiv.org/abs/1801.08251}{1801.08251}}.\par\medskip
\bibitem[FN28]{FN28}R.H. Fowler, L. Nordheim - {\it Electron emission in intense electric fields}, Proceedings of the Royal Society of London A, volume~\-119, issue~\-781, pages~\-173-181, 1928,\par\penalty10000
doi:{\tt\color{blue}\href{http://dx.doi.org/10.1098/rspa.1928.0091}{10.1098/rspa.1928.0091}}.\par\medskip
\bibitem[Je03]{Je03}K.L. Jensen - {\it Electron emission theory and its application: Fowler-Nordheim equation and beyond}, Journal of Vacuum Science and Technology B: Microelectronnics and Nanometer Structures Processinf, Measurement and Phenomena, volume~\-21, issue~\-4, number~\-1528, 2003,\par\penalty10000
doi:{\tt\color{blue}\href{http://dx.doi.org/10.1116/1.1573664}{10.1116/1.1573664}}.\par\medskip
\bibitem[Je17]{Je17}K.L. Jensen - {\it Introduction to the Physics of Electron Emission}, Wiley, 2017.\par\medskip
\bibitem[LM94]{LM94}R. Landauer, T. Martin - {\it Barrier interaction time in tunneling}, Reviews of Modern Physics, volume~\-66, issue~\-1, pages~\-217-228, 1994,\par\penalty10000
doi:{\tt\color{blue}\href{http://dx.doi.org/10.1103/RevModPhys.66.217}{10.1103/RevModPhys.66.217}}.\par\medskip
\bibitem[LK15]{LK15}A.S. Landsman, U. Keller - {\it Attosecond science and the tunnelling time problem}, Physics Reports, volume~\-547, pages~\-1-24, 2015,\par\penalty10000
doi:{\tt\color{blue}\href{http://dx.doi.org/10.1016/j.physrep.2014.09.002}{10.1016/j.physrep.2014.09.002}}.\par\medskip
\bibitem[MOe13]{MOe13}C.R. McDonald, G. Orlando, G. Vampa, T. Brabec - {\it Tunnel Ionization Dynamics of Bound Systems in Laser Fields: How Long Does It Take for a Bound Electron to Tunnel?}, Physical Review Letters, volume~\-111, issue~\-9, number~\-090405, 2013,\par\penalty10000
doi:{\tt\color{blue}\href{http://dx.doi.org/10.1103/PhysRevLett.111.090405}{10.1103/PhysRevLett.111.090405}}.\par\medskip
\bibitem[PF95]{PF95}P. Pfeifer, J. Fröhlich - {\it Generalized time-energy uncertainty relations and bounds on lifetimes of resonances}, Reviews of Modern Physics, volume~\-67, issue~\-4, pages~\-759-779, 1995,\par\penalty10000
doi:{\tt\color{blue}\href{http://dx.doi.org/10.1103/RevModPhys.67.759}{10.1103/RevModPhys.67.759}}.\par\medskip
\bibitem[Ro11]{Ro11}A. Rokhlenko - {\it Strong field electron emission and the Fowler-Nordheim-Schottky theory}, Journal of Physics A: Mathematical and Theoretical, volume~\-44, issue~\-5, pages~\-1-10, 2011,\par\penalty10000
doi:{\tt\color{blue}\href{http://dx.doi.org/10.1088/1751-8113/44/5/055302}{10.1088/1751-8113/44/5/055302}}.\par\medskip
\bibitem[Ru69]{Ru69}D. Ruelle - {\it A remark on bound states in potential-scattering theory}, Il Nuovo Cimento, volume~\-61, issue~\-4, pages~\-655-662, 1969,\par\penalty10000
doi:{\tt\color{blue}\href{http://dx.doi.org/10.1007/BF02819607}{10.1007/BF02819607}}.\par\medskip
\bibitem[YGR11]{YGR11}S.V. Yalunin, M. Gulde, C. Ropers - {\it Strong-field photoemission from surfaces: Theoretical approaches}, Physical Review B, volume~\-84, issue~\-19, number~\-195426, 2011,\par\penalty10000
doi:{\tt\color{blue}\href{http://dx.doi.org/10.1103/PhysRevB.84.195426}{10.1103/PhysRevB.84.195426}}.\par\medskip
\bibitem[ZL16]{ZL16}P. Zhang, Y.Y. Lau - {\it Ultrafast strong-field photoelectron emission from biased metal surfaces: exact solution to time-dependent Schr\"odinger Equation}, Scientific Reports, volume~\-6, number~\-19894, 2016,\par\penalty10000
doi:{\tt\color{blue}\href{http://dx.doi.org/10.1038/srep19894}{10.1038/srep19894}}.\par\medskip

30
figs/contour.fig/Makefile Normal file
View File

@ -0,0 +1,30 @@
PROJECTNAME=contour
PDFS=$(addsuffix .pdf, $(PROJECTNAME))
all: $(PDFS)
$(PDFS): poles.tikz.tex
pdflatex -jobname $(basename $@) -file-line-error $(patsubst %.pdf, %.tikz.tex, $@)
poles.tikz.tex:
python3 contour.py > poles.tikz.tex
install: $(PDFS)
cp $^ $(INSTALLDIR)/
$(LIBS):
ln -fs libs/$@ ./
clean-libs:
rm -f $(LIBS)
clean-aux:
rm -f $(addsuffix .aux, $(PROJECTNAME))
rm -f $(addsuffix .log, $(PROJECTNAME))
rm -f poles.tikz.tex
clean-tex:
rm -f $(PDFS)
clean: clean-libs clean-aux clean-tex

View File

@ -0,0 +1,82 @@
#!/usr/bin/env python3
import cmath
import math
import scipy.special as sp
from scipy import optimize as op
import random
import sys
# number of roots
nr_roots=4
# size of plot
plotsize_x=3
plotsize_y=3
# rescale plot (so roots are not too close together)
plotsize_scale_x=1
plotsize_scale_y=6
# numerical values
hbar=6.58e-16 # eV.s
m=9.11e-31 # kg
Vn=9 # eV
En=20e9 # V/m
V=1
E=En*hbar/(Vn**1.5*m**0.5)*math.sqrt(1.60e-19)
# sqrt with branch cut along iR_+
def sqrt_p(x):
r,p=cmath.polar(x)
if(p<cmath.pi/2):
return(cmath.rect(math.sqrt(r),p/2))
else:
return(cmath.rect(math.sqrt(r),(p-2*math.pi)/2))
# solution of (-\Delta+V-ip)phi=0
def phi(p,x,E,V):
return(sp.airy(cmath.exp(-1j*math.pi/3)*(E**(1/3)*x-E**(-2/3)*(V-1j*p)))[0])
# its derivative
def dphi(p,x,E,V):
return(cmath.exp(-1j*math.pi/3)*E**(1/3)*sp.airy(cmath.exp(-1j*math.pi/3)*(E**(1/3)*x-E**(-2/3)*(V-1j*p)))[1])
# the function whose roots are to be computed and its derivative
def f(p):
return(sqrt_p(-1j*p)*phi(p,0,E,V)-dphi(p,0,E,V))
def df(p):
return(-1j/(2*sqrt_p(-1j*p))*phi(p,0,E,V)+sqrt_p(-1j*p)*dp_phi(p,0,E,V)-dp_dphi(p,0,E,V))
# derivatives of phi with respect to p
def dp_phi(p,x,E,V):
return(1j*cmath.exp(-1j*math.pi/3)*E**(-2/3)*sp.airy(cmath.exp(-1j*math.pi/3)*(E**(1/3)*x-E**(-2/3)*(V-1j*p)))[1])
def dp_dphi(p,x,E,V):
return(-1j*(x-(V-1j*p)/E)*phi(p,x,E,V))
# check whether the root was already found
def check(root,roots):
# reject if the root doesn't fit on the plot
if(plotsize_scale_x*root.real<-plotsize_x or abs(plotsize_scale_y*root.imag)>plotsize_y):
return(False)
for x in roots:
if(abs(root-x)<1e-12):
return(False)
return(True)
# find roots
roots=[]
while len(roots)<nr_roots:
try:
root=op.newton(f, -random.random()*plotsize_x/plotsize_scale_x+(2*random.random()-1)*plotsize_y/plotsize_scale_y*1j, fprime=df)
if(check(root,roots)):
roots.append(root)
print("found "+str(len(roots))+" roots of "+str(nr_roots), file=sys.stderr)
except RuntimeError:
root=0
except:
break
# print result
for root in roots:
print("\\pole{(% .3f,% .3f)}" % (plotsize_scale_x*root.real,plotsize_scale_y*root.imag))

View File

@ -0,0 +1,34 @@
\documentclass{standalone}
\usepackage{tikz}
\def\pole#1{
\draw#1++(0.1,0.1)--++(-0.2,-0.2);
\draw#1++(-0.1,0.1)--++(0.2,-0.2);
\draw[color=red, line width=1pt]#1circle(0.3);
}
\begin{document}
\begin{tikzpicture}
% branch cut
\fill[color=gray](-3.3,-0.1)--++(3.3,0)--++(0,0.2)--++(-3.3,0)--cycle;
% axes
\draw(-3.3,0)--++(6.6,0);
\draw(0,-3.3)--++(0,6.6);
% -ik0^2
\pole{(0,-2)}
% other poles
\input{poles.tikz}
% contour
\draw[color=red, line width=1pt](-3.3,-0.3)--++(3.3,0);
\draw[color=red, line width=1pt](0,-0.3)..controls(0.3,-0.3)and(0.3,0.3)..(0,0.3);
\draw[color=red, line width=1pt](-3.3,0.3)--++(3.3,0);
\end{tikzpicture}
\end{document}

28
figs/libs/Makefile Normal file
View File

@ -0,0 +1,28 @@
PROJECTNAME=$(basename $(basename $(wildcard *.tikz.tex)))
LIBS=$(notdir $(wildcard libs/*))
PDFS=$(addsuffix .pdf, $(PROJECTNAME))
all: $(PDFS)
$(PDFS): $(LIBS)
echo $(LIBS)
pdflatex -jobname $(basename $@) -file-line-error $(patsubst %.pdf, %.tikz.tex, $@)
install: $(PDFS)
cp $^ $(INSTALLDIR)/
$(LIBS):
ln -fs libs/$@ ./
clean-libs:
rm -f $(LIBS)
clean-aux:
rm -f $(addsuffix .aux, $(PROJECTNAME))
rm -f $(addsuffix .log, $(PROJECTNAME))
clean-tex:
rm -f $(PDFS)
clean: clean-libs clean-aux clean-tex

170
figs/plots.fig/FN_base.jl Normal file
View File

@ -0,0 +1,170 @@
# fractional power with an arbitrary branch cut
function pow(x,a,cut)
if(angle(x)/cut<=1)
return(abs(x)^a*exp(1im*angle(x)*a))
else
return(abs(x)^a*exp(1im*(angle(x)-sign(cut)*2*pi)*a))
end
end
# asymptotic airy functions
# specify a branch cut for the fractional power
function airyai_asym(x,cut)
if(abs(real(pow(x,3/2,cut)))<airy_threshold)
return(exp(2/3*pow(x,3/2,cut))*airyai(x))
else
ret=0
for n in 0:airy_order
ret+=gamma(n+5/6)*gamma(n+1/6)*(-3/4)^n/(4*pi^(3/2)*factorial(n)*pow(x,3*n/2+1/4,cut))
end
return ret
end
end
function airyaiprime_asym(x,cut)
if(abs(real(pow(x,3/2,cut)))<airy_threshold)
return(exp(2/3*pow(x,3/2,cut))*airyaiprime(x))
else
ret=0
for n in 0:airy_order
ret+=gamma(n+5/6)*gamma(n+1/6)*(-3/4)^n/(4*pi^(3/2)*factorial(n))*(-1/pow(x,3*n/2-1/4,cut)-(3/2*n+1/4)/pow(x,3*n/2+5/4,cut))
end
return ret
end
end
# solutions of (-\Delta+U-ip)phi=0
# assume that p has an infinitesimal real part (and adjust the branch cuts appropriately)
function phi(p,x,E,U)
return(airyai_asym(2^(1/3)*exp(-1im*pi/3)*(E^(1/3)*x-E^(-2/3)*(U-1im*p)),pi))
end
function dphi(p,x,E,U)
return(2^(1/3)*exp(-1im*pi/3)*E^(1/3)*airyaiprime_asym(2^(1/3)*exp(-1im*pi/3)*(E^(1/3)*x-E^(-2/3)*(U-1im*p)),pi))
end
function eta(p,x,E,U)
return(exp(-1im*pi/3)*airyai_asym(-2^(1/3)*(E^(1/3)*x-E^(-2/3)*(U-1im*p)),pi/2))
end
function deta(p,x,E,U)
return(-2^(1/3)*exp(-1im*pi/3)*E^(1/3)*airyaiprime_asym(-2^(1/3)*(E^(1/3)*x-E^(-2/3)*(U-1im*p)),pi/2))
end
# Laplace transform of psi
# assume that p has an infinitesimal real part (and adjust the branch cuts appropriately)
# for example, (1im*p-U)^(3/2) becomes pow(1im*p-U,3/2,-pi/2) because when 1im*p is real negative, its square root should be imaginary positive
function f(p,x,k0,E,U)
T=2im*k0/(1im*k0-sqrt(2*U-k0*k0))
R=T-1
if x>=0
C2=-2im*T/(pow(-2im*p,1/2,pi/2)*phi(p,0,E,U)-dphi(p,0,E,U))*((sqrt(2*U-k0*k0)+pow(-2im*p,1/2,pi/2))/(-2im*p+k0*k0)-2im*(2*E)^(-1/3)*pi*quadgk(y -> (pow(-2im*p,1/2,pi/2)*eta(p,0,E,U)-deta(p,0,E,U))*phi(p,y,E,U)*exp(-sqrt(2*U-k0*k0)*y)*exp(sqrt(2)*2im/3*(pow(E^(1/3)*y+E^(-2/3)*(1im*p-U),3/2,-pi/2)-E^(-1)*pow(1im*p-U,3/2,-pi/2))),0,Inf)[1])
FT=4*(2*E)^(-1/3)*pi*(quadgk(y -> phi(p,x,E,U)*eta(p,y,E,U)*exp(-sqrt(2*U-k0*k0)*y)*exp(sqrt(2)*2im/3*(pow(E^(1/3)*x+E^(-2/3)*(1im*p-U),3/2,-pi/2)-pow(E^(1/3)*y+E^(-2/3)*(1im*p-U),3/2,-pi/2))),0,x)[1]+quadgk(y -> eta(p,x,E,U)*phi(p,y,E,U)*exp(-sqrt(2*U-k0*k0)*y)*exp(sqrt(2)*2im/3*(pow(E^(1/3)*y+E^(-2/3)*(1im*p-U),3/2,-pi/2)-pow(E^(1/3)*x+E^(-2/3)*(1im*p-U),3/2,-pi/2))),x,Inf)[1])
main=C2*phi(p,x,E,U)*exp(sqrt(2)*2im/3*(pow(E^(1/3)*x+E^(-2/3)*(1im*p-U),3/2,-pi/2)-E^(-1)*pow(1im*p-U,3/2,-pi/2)))+T*FT
# subtract the contribution of the pole, which will be added back in after the integration
pole=psi_pole(x,k0,E,U)/(p+1im*k0*k0/2)
return(main-pole)
else
C1=-2im*T*((sqrt(2*U-k0*k0)*phi(p,0,E,U)+dphi(p,0,E,U))/(-2im*p+k0*k0)/(pow(-2im*p,1/2,pi/2)*phi(p,0,E,U)-dphi(p,0,E,U))+quadgk(y -> phi(p,y,E,U)/(pow(-2im*p,1/2,pi/2)*phi(p,0,E,U)-dphi(p,0,E,U))*exp(-sqrt(2*U-k0*k0)*y)*exp(sqrt(2)*2im/3*(pow(E^(1/3)*y+E^(-2/3)*(1im*p-U),3/2,-pi/2)-E^(-1)*pow(1im*p-U,3/2,-pi/2))),0,Inf)[1])
FI=-2im*exp(1im*k0*x)/(-2im*p+k0*k0)
FR=-2im*exp(-1im*k0*x)/(-2im*p+k0*k0)
main=C1*exp(pow(-2im*p,1/2,pi/2)*x)+FI+R*FR
# subtract the contribution of the pole, which will be added back in after the integration
pole=psi_pole(x,k0,E,U)/(p+1im*k0*k0/2)
return(main-pole)
end
end
# its derivative
function df(p,x,k0,E,U)
T=2im*k0/(1im*k0-sqrt(2*U-k0*k0))
R=T-1
if x>=0
C2=-2im*T/(pow(-2im*p,1/2,pi/2)*phi(p,0,E,U)-dphi(p,0,E,U))*((sqrt(2*U-k0*k0)+pow(-2im*p,1/2,pi/2))/(-2im*p+k0*k0)-2im*(2*E)^(-1/3)*pi*quadgk(y -> (pow(-2im*p,1/2,pi/2)*eta(p,0,E,U)-deta(p,0,E,U))*phi(p,y,E,U)*exp(-sqrt(2*U-k0*k0)*y)*exp(sqrt(2)*2im/3*(pow(E^(1/3)*y+E^(-2/3)*(1im*p-U),3/2,-pi/2)-E^(-1)*pow(1im*p-U,3/2,-pi/2))),0,Inf)[1])
dFT=4*(2*E)^(-1/3)*pi*(quadgk(y -> dphi(p,x,E,U)*eta(p,y,E,U)*exp(-sqrt(2*U-k0*k0)*y)*exp(sqrt(2)*2im/3*(pow(E^(1/3)*x+E^(-2/3)*(1im*p-U),3/2,-pi/2)-pow(E^(1/3)*y+E^(-2/3)*(1im*p-U),3/2,-pi/2))),0,x)[1]+quadgk(y -> deta(p,x,E,U)*phi(p,y,E,U)*exp(-sqrt(2*U-k0*k0)*y)*exp(sqrt(2)*2im/3*(pow(E^(1/3)*y+E^(-2/3)*(1im*p-U),3/2,-pi/2)-pow(E^(1/3)*x+E^(-2/3)*(1im*p-U),3/2,-pi/2))),x,Inf)[1])
main=C2*dphi(p,x,E,U)*exp(sqrt(2)*2im/3*(pow(E^(1/3)*x+E^(-2/3)*(1im*p-U),3/2,-pi/2)-E^(-1)*pow(1im*p-U,3/2,-pi/2)))+T*dFT
# subtract the contribution of the pole, which will be added back in after the integration
pole=dpsi_pole(x,k0,E,U)/(p+1im*k0*k0/2)
return(main-pole)
else
C1=-2im*T*((sqrt(2*U-k0*k0)*phi(p,0,E,U)+dphi(p,0,E,U))/(-2im*p+k0*k0)/(pow(-2im*p,1/2,pi/2)*phi(p,0,E,U)-dphi(p,0,E,U))+quadgk(y -> phi(p,y,E,U)/(pow(-2im*p,1/2,pi/2)*phi(p,0,E,U)-dphi(p,0,E,U))*exp(-sqrt(2*U-k0*k0)*y)*exp(sqrt(2)*2im/3*(pow(E^(1/3)*y+E^(-2/3)*(1im*p-U),3/2,-pi/2)-E^(-1)*pow(1im*p-U,3/2,-pi/2))),0,Inf)[1])
dFI=2*k0*exp(1im*k0*x)/(-2im*p+k0*k0)
dFR=-2*k0*exp(-1im*k0*x)/(-2im*p+k0*k0)
main=C1*pow(-2im*p,1/2,pi/2)*exp(pow(-2im*p,1/2,pi/2)*x)+dFI+R*dFR
# subtract the contribution of the pole, which will be added back in after the integration
pole=dpsi_pole(x,k0,E,U)/(p+1im*k0*k0/2)
return(main-pole)
end
end
# psi (returns t,psi(x,t))
function psi(x,k0,E,U,p_npoints,p_cutoff)
fft=fourier_fft(f,x,k0,E,U,p_npoints,p_cutoff)
# add the contribution of the pole
for i in 1:p_npoints
fft[2][i]=fft[2][i]+psi_pole(x,k0,E,U)*exp(-1im*k0*k0/2*fft[1][i])
end
return(fft)
end
# its derivative
function dpsi(x,k0,E,U,p_npoints,p_cutoff)
fft=fourier_fft(df,x,k0,E,U,p_npoints,p_cutoff)
# add the contribution of the pole
for i in 1:p_npoints
fft[2][i]=fft[2][i]+dpsi_pole(x,k0,E,U)*exp(-1im*k0*k0/2*fft[1][i])
end
return(fft)
end
# compute Fourier transform by sampling and fft
function fourier_fft(A,x,k0,E,U,p_npoints,p_cutoff)
fun=zeros(Complex{Float64},p_npoints)
times=zeros(p_npoints)
# prepare fft
for i in 1:p_npoints
fun[i]=p_cutoff/pi*A(1im*(-p_cutoff+2*p_cutoff*(i-1)/p_npoints),x,k0,E,U)
times[i]=(i-1)*pi/p_cutoff
end
ifft!(fun)
# correct the phase
for i in 2:2:p_npoints
fun[i]=-fun[i]
end
return([times,fun])
end
# asymptotic value of psi
function psi_pole(x,k0,E,U)
if x>=0
return(1im*phi(-1im*k0*k0/2,x,E,U)*2*k0/(1im*k0*phi(-1im*k0*k0/2,0,E,U)+dphi(-1im*k0*k0/2,0,E,U))*exp(sqrt(2)*2im/3*(pow(E^(1/3)*x+E^(-2/3)*(k0*k0/2-U),3/2,-pi/2)-E^(-1)*pow(k0*k0/2-U,3/2,-pi/2))))
else
return((1im*k0*phi(-1im*k0*k0/2,0,E,U)-dphi(-1im*k0*k0/2,0,E,U))/(1im*k0*phi(-1im*k0*k0/2,0,E,U)+dphi(-1im*k0*k0/2,0,E,U))*exp(-1im*k0*x)+exp(1im*k0*x))
end
end
function dpsi_pole(x,k0,E,U)
if x>=0
return(1im*dphi(-1im*k0*k0/2,x,E,U)*2*k0/(1im*k0*phi(-1im*k0*k0/2,0,E,U)+dphi(-1im*k0*k0/2,0,E,U))*exp(sqrt(2)*2im/3*(pow(E^(1/3)*x+E^(-2/3)*(k0*k0/2-U),3/2,-pi/2)-E^(-1)*pow(k0*k0/2-U,3/2,-pi/2))))
else
return(-1im*k0*(1im*k0*phi(-1im*k0*k0/2,0,E,U)-dphi(-1im*k0*k0/2,0,E,U))/(1im*k0*phi(-1im*k0*k0/2,0,E,U)+dphi(-1im*k0*k0/2,0,E,U))*exp(-1im*k0*x)+1im*k0*exp(1im*k0*x))
end
end
# current
function J(ps,dps)
return(2*imag(conj(ps)*dps))
end
# complete computation of the current
function current(x,k0,E,U,p_npoints,p_cutoff)
ps=psi(x,k0,E,U,p_npoints,p_cutoff)
dps=dpsi(x,k0,E,U,p_npoints,p_cutoff)
Js=zeros(Complex{Float64},p_npoints)
for i in 1:p_npoints
Js[i]=J(ps[2][i],dps[2][i])
end
return(Js)
end

36
figs/plots.fig/Makefile Normal file
View File

@ -0,0 +1,36 @@
PROJECTNAME=currents-4 currents-8 density-4 density-8 integrated_current-4 integrated_current-8
PDFS=$(addsuffix .pdf, $(PROJECTNAME))
TEXS=$(addsuffix .tikz.tex, $(PROJECTNAME))
all: $(PDFS)
currents-4.pdf density-4.pdf integrated_current-4.pdf: current_density-4.dat
gnuplot $(patsubst %.pdf, %.gnuplot, $@) > $(patsubst %.pdf, %.tikz.tex, $@)
pdflatex -jobname $(basename $@) -file-line-error $(patsubst %.pdf, %.tikz.tex, $@)
currents-8.pdf density-8.pdf integrated_current-8.pdf: current_density-8.dat
gnuplot $(patsubst %.pdf, %.gnuplot, $@) > $(patsubst %.pdf, %.tikz.tex, $@)
pdflatex -jobname $(basename $@) -file-line-error $(patsubst %.pdf, %.tikz.tex, $@)
current_density-4.dat:
julia current_density.jl 4 > $@
current_density-8.dat:
julia current_density.jl 8 > $@
install: $(PDFS)
cp $^ $(INSTALLDIR)/
clean-aux:
rm -f $(addsuffix .tikz.tex, $(PROJECTNAME))
rm -f $(addsuffix .aux, $(PROJECTNAME))
rm -f $(addsuffix .log, $(PROJECTNAME))
clean-dat:
rm -f current_density-4.dat
rm -f current_density-8.dat
clean-tex:
rm -f $(PDFS)
clean: clean-dat clean-aux clean-tex

View File

@ -0,0 +1,60 @@
using QuadGK
using FastGaussQuadrature
using SpecialFunctions
using FFTW
# numerical values
hbar=6.58e-16 # eV.s
m=9.11e-31 # kg
Un=9 # eV
En=parse(Float64,ARGS[1])*1e9 # V/m
Kn=4.5 # eV
# dimensionless quantities
U=1
E=En*hbar/(Un^1.5*m^0.5)*sqrt(1.60e-19)
k0=sqrt(2*Kn/Un)
# cutoffs
p_cutoff=20*k0
p_npoints=4096
# airy approximations
airy_threshold=30
airy_order=5
# order for Gauss-Legendre quadrature
order=10
# compute at these points
X=[(2*U-k0*k0)/(2*E),10*(2*U-k0*k0)/(2*E)]
include("FN_base.jl")
# compute the weights and abcissa for gauss-legendre quadratures
gl_data=gausslegendre(order)
ps=Array{Array{Array{Complex{Float64}}}}(undef,length(X))
dps=Array{Array{Array{Complex{Float64}}}}(undef,length(X))
intJ=Array{Array{Complex{Float64}}}(undef,length(X))
for i in 1:length(X)
# wave function
ps[i]=psi(X[i],k0,E,U,p_npoints,p_cutoff)
dps[i]=dpsi(X[i],k0,E,U,p_npoints,p_cutoff)
# integrated current
intJ[i]=zeros(Complex{Float64},p_npoints)
for l in 1:order
eval=current(X[i],k0/2*(gl_data[1][l]+1),E,U,p_npoints,p_cutoff)
for j in 1:length(eval)
intJ[i][j]=intJ[i][j]+k0/2*gl_data[2][l]*eval[j]
end
end
end
for j in 1:p_npoints
for i in 1:length(X)
print(real(ps[i][1][j])*hbar/Un*1e15,' ',abs(ps[i][2][j])^2,' ',J(ps[i][2][j],dps[i][2][j])/(2*k0),' ',real(intJ[i][j]/k0^2),' ')
end
print('\n')
end

View File

@ -0,0 +1,43 @@
## can also set the following options
set title "$E=4\\ \\mathrm{V}\\cdot\\mathrm{nm}^{-1}$"
set ylabel "$\\displaystyle\\frac j{2k}$" norotate
set xlabel "$t$ (fs)"
#
## start ticks at 0, then every x
#set xtics 0,x
#set ytics 0,x
## puts 4 minor tics between tics (5 intervals, i.e. every 0.01)
set mxtics 5
set mytics 5
# default output canvas size: 12.5cm x 8.75cm
set term lua tikz size 12.5,8.75 standalone
set key spacing 1.5
# 3=1+2 draw bottom and left sides of the box
set border 3
# don't show tics on opposite sides
set xtics nomirror
set ytics nomirror
# My colors
## 4169E1 (pastel blue)
## DC143C (bright red)
## 32CD32 (bright green)
## 4B0082 (deep purple)
## DAA520 (ochre)
# set linestyle
set style line 1 linetype rgbcolor "#4169E1" linewidth 3
set style line 2 linetype rgbcolor "#DC143C" linewidth 3
set style line 3 linetype rgbcolor "#32CD32" linewidth 3
set style line 4 linetype rgbcolor "#4B0082" linewidth 3
set style line 5 linetype rgbcolor "#DAA520" linewidth 3
set pointsize 0.6
set xrange [:12]
plot "current_density-4.dat" using 1:3 every ::1 with lines linestyle 1 title "$x=x_0$",\
"current_density-4.dat" using 5:7 every ::1 with lines linestyle 2 title "$x=10x_0$"

View File

@ -0,0 +1,43 @@
## can also set the following options
set title "$E=8\\ \\mathrm{V}\\cdot\\mathrm{nm}^{-1}$"
set ylabel "$\\displaystyle\\frac j{2k}$" norotate
set xlabel "$t$ (fs)"
#
## start ticks at 0, then every x
#set xtics 0,x
#set ytics 0,x
## puts 4 minor tics between tics (5 intervals, i.e. every 0.01)
set mxtics 5
set mytics 5
# default output canvas size: 12.5cm x 8.75cm
set term lua tikz size 12.5,8.75 standalone
set key spacing 1.5
# 3=1+2 draw bottom and left sides of the box
set border 3
# don't show tics on opposite sides
set xtics nomirror
set ytics nomirror
# My colors
## 4169E1 (pastel blue)
## DC143C (bright red)
## 32CD32 (bright green)
## 4B0082 (deep purple)
## DAA520 (ochre)
# set linestyle
set style line 1 linetype rgbcolor "#4169E1" linewidth 3
set style line 2 linetype rgbcolor "#DC143C" linewidth 3
set style line 3 linetype rgbcolor "#32CD32" linewidth 3
set style line 4 linetype rgbcolor "#4B0082" linewidth 3
set style line 5 linetype rgbcolor "#DAA520" linewidth 3
set pointsize 0.6
set xrange [:12]
plot "current_density-8.dat" using 1:3 every ::1 with lines linestyle 1 title "$x=x_0$",\
"current_density-8.dat" using 5:7 every ::1 with lines linestyle 2 title "$x=10x_0$"

View File

@ -0,0 +1,44 @@
## can also set the following options
set title "$E=4\\ \\mathrm{V}\\cdot\\mathrm{nm}^{-1}$"
set ylabel "$|\\psi|^2$" norotate
set xlabel "$t$ (fs)"
#
## start ticks at 0, then every x
#set xtics 0,x
#set ytics 0,x
## puts 4 minor tics between tics (5 intervals, i.e. every 0.01)
set mxtics 5
set mytics 5
# default output canvas size: 12.5cm x 8.75cm
set term lua tikz size 12.5,8.75 standalone
set key spacing 1.5
# 3=1+2 draw bottom and left sides of the box
set border 3
# don't show tics on opposite sides
set xtics nomirror
set ytics nomirror
# My colors
## 4169E1 (pastel blue)
## DC143C (bright red)
## 32CD32 (bright green)
## 4B0082 (deep purple)
## DAA520 (ochre)
# set linestyle
set style line 1 linetype rgbcolor "#4169E1" linewidth 3
set style line 2 linetype rgbcolor "#DC143C" linewidth 3
set style line 3 linetype rgbcolor "#32CD32" linewidth 3
set style line 4 linetype rgbcolor "#4B0082" linewidth 3
set style line 5 linetype rgbcolor "#DAA520" linewidth 3
set pointsize 0.6
set xrange [:12]
plot \
"current_density-4.dat" using 1:2 every ::1 with lines linestyle 1 title "$x=x_0$",\
"current_density-4.dat" using 5:6 every ::1 with lines linestyle 2 title "$x=10x_0$"

View File

@ -0,0 +1,44 @@
## can also set the following options
set title "$E=8\\ \\mathrm{V}\\cdot\\mathrm{nm}^{-1}$"
set ylabel "$|\\psi|^2$" norotate
set xlabel "$t$ (fs)"
#
## start ticks at 0, then every x
#set xtics 0,x
#set ytics 0,x
## puts 4 minor tics between tics (5 intervals, i.e. every 0.01)
set mxtics 5
set mytics 5
# default output canvas size: 12.5cm x 8.75cm
set term lua tikz size 12.5,8.75 standalone
set key spacing 1.5
# 3=1+2 draw bottom and left sides of the box
set border 3
# don't show tics on opposite sides
set xtics nomirror
set ytics nomirror
# My colors
## 4169E1 (pastel blue)
## DC143C (bright red)
## 32CD32 (bright green)
## 4B0082 (deep purple)
## DAA520 (ochre)
# set linestyle
set style line 1 linetype rgbcolor "#4169E1" linewidth 3
set style line 2 linetype rgbcolor "#DC143C" linewidth 3
set style line 3 linetype rgbcolor "#32CD32" linewidth 3
set style line 4 linetype rgbcolor "#4B0082" linewidth 3
set style line 5 linetype rgbcolor "#DAA520" linewidth 3
set pointsize 0.6
set xrange [:12]
plot \
"current_density-8.dat" using 1:2 every ::1 with lines linestyle 1 title "$x=x_0$",\
"current_density-8.dat" using 5:6 every ::1 with lines linestyle 2 title "$x=10x_0$"

View File

@ -0,0 +1,43 @@
## can also set the following options
set title "$E=4\\ \\mathrm{V}\\cdot\\mathrm{nm}^{-1}$"
set ylabel "$\\displaystyle\\frac J{k^2}$" norotate
set xlabel "$t$ (fs)"
#
## start ticks at 0, then every x
#set xtics 0,x
#set ytics 0,x
## puts 4 minor tics between tics (5 intervals, i.e. every 0.01)
set mxtics 5
set mytics 5
# default output canvas size: 12.5cm x 8.75cm
set term lua tikz size 12.5,8.75 standalone
set key spacing 1.5
# 3=1+2 draw bottom and left sides of the box
set border 3
# don't show tics on opposite sides
set xtics nomirror
set ytics nomirror
# My colors
## 4169E1 (pastel blue)
## DC143C (bright red)
## 32CD32 (bright green)
## 4B0082 (deep purple)
## DAA520 (ochre)
# set linestyle
set style line 1 linetype rgbcolor "#4169E1" linewidth 3
set style line 2 linetype rgbcolor "#DC143C" linewidth 3
set style line 3 linetype rgbcolor "#32CD32" linewidth 3
set style line 4 linetype rgbcolor "#4B0082" linewidth 3
set style line 5 linetype rgbcolor "#DAA520" linewidth 3
set pointsize 0.6
set xrange [:12]
plot "current_density-4.dat" using 1:4 every ::1 with lines linestyle 1 title "$x=x_0$",\
"current_density-4.dat" using 5:8 every ::1 with lines linestyle 2 title "$x=10x_0$"

View File

@ -0,0 +1,43 @@
## can also set the following options
set title "$E=4\\ \\mathrm{V}\\cdot\\mathrm{nm}^{-1}$"
set ylabel "$\\displaystyle\\frac J{k^2}$" norotate
set xlabel "$t$ (fs)"
#
## start ticks at 0, then every x
#set xtics 0,x
#set ytics 0,x
## puts 4 minor tics between tics (5 intervals, i.e. every 0.01)
set mxtics 5
set mytics 5
# default output canvas size: 12.5cm x 8.75cm
set term lua tikz size 12.5,8.75 standalone
set key spacing 1.5
# 3=1+2 draw bottom and left sides of the box
set border 3
# don't show tics on opposite sides
set xtics nomirror
set ytics nomirror
# My colors
## 4169E1 (pastel blue)
## DC143C (bright red)
## 32CD32 (bright green)
## 4B0082 (deep purple)
## DAA520 (ochre)
# set linestyle
set style line 1 linetype rgbcolor "#4169E1" linewidth 3
set style line 2 linetype rgbcolor "#DC143C" linewidth 3
set style line 3 linetype rgbcolor "#32CD32" linewidth 3
set style line 4 linetype rgbcolor "#4B0082" linewidth 3
set style line 5 linetype rgbcolor "#DAA520" linewidth 3
set pointsize 0.6
set xrange [:12]
plot "current_density-8.dat" using 1:4 every ::1 with lines linestyle 1 title "$x=x_0$",\
"current_density-8.dat" using 5:8 every ::1 with lines linestyle 2 title "$x=10x_0$"

1
figs/potential.fig/Makefile Symbolic link
View File

@ -0,0 +1 @@
../libs/Makefile

View File

@ -0,0 +1,22 @@
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw(-3,0)--(3,0);
\draw(0,-1.5)--(0,3);
\draw[line width=1.5pt](-2.5,0)--(0,0)--(0,2.5)--(1.975,-1.25);
\draw(1.5,1.5)node{\small$U-Ex$};
\draw[line width=1pt, densely dotted](-2.5,1)--(0,1);
\draw(-2.8,1)node{\small$E_F$};
\draw(0,3.3)node{\small$V$};
\draw(3.3,0)node{\small$x$};
\end{tikzpicture}
\end{document}

673
libs/ian.cls Normal file
View File

@ -0,0 +1,673 @@
%%
%% Ian's class file
%%
%% TeX format
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
%% class name
\ProvidesClass{ian}[2017/09/29]
%% boolean to signal that this class is being used
\newif\ifianclass
%% options
% no section numbering in equations
\DeclareOption{section_in_eq}{\sectionsineqtrue}
\DeclareOption{section_in_fig}{\sectionsinfigtrue}
\DeclareOption{section_in_theo}{\PassOptionsToPackage{\CurrentOption}{iantheo}}
\DeclareOption{section_in_all}{\sectionsineqtrue\sectionsinfigtrue\PassOptionsToPackage{section_in_theo}{iantheo}}
\DeclareOption{subsection_in_eq}{\subsectionsineqtrue}
\DeclareOption{subsection_in_fig}{\subsectionsinfigtrue}
\DeclareOption{subsection_in_theo}{\PassOptionsToPackage{\CurrentOption}{iantheo}}
\DeclareOption{subsection_in_all}{\subsectionsineqtrue\subsectionsinfigtrue\PassOptionsToPackage{subsection_in_theo}{iantheo}}
\DeclareOption{no_section_in_eq}{\sectionsineqfalse}
\DeclareOption{no_section_in_fig}{\sectionsinfigfalse}
\DeclareOption{no_section_in_theo}{\PassOptionsToPackage{\CurrentOption}{iantheo}}
\DeclareOption{no_section_in_all}{\sectionsineqfalse\sectionsinfigfalse\PassOptionsToPackage{no_section_in_theo}{iantheo}}
\DeclareOption{no_subsection_in_eq}{\subsectionsineqfalse}
\DeclareOption{no_subsection_in_fig}{\subsectionsinfigfalse}
\DeclareOption{no_subsection_in_theo}{\PassOptionsToPackage{\CurrentOption}{iantheo}}
\DeclareOption{no_subsection_in_all}{\subsectionsineqfalse\subsectionsinfigfalse\PassOptionsToPackage{no_subsection_in_theo}{iantheo}}
% reset point
\DeclareOption{point_reset_at_section}{\PassOptionsToPackage{reset_at_section}{point}}
\DeclareOption{point_no_reset_at_section}{\PassOptionsToPackage{no_reset_at_section}{point}}
\DeclareOption{point_reset_at_theo}{\PassOptionsToPackage{reset_at_theo}{point}}
\DeclareOption{point_no_reset_at_theo}{\PassOptionsToPackage{no_reset_at_theo}{point}}
\def\ian@defaultoptions{
\ExecuteOptions{section_in_all, no_subsection_in_all}
\ProcessOptions
%% required packages
\RequirePackage{iantheo}
\RequirePackage{point}
\RequirePackage{color}
\RequirePackage{marginnote}
\RequirePackage{amssymb}
\PassOptionsToPackage{hidelinks}{hyperref}
\RequirePackage{hyperref}
}
%% paper dimensions
\setlength\paperheight{297mm}
\setlength\paperwidth{210mm}
%% fonts
\input{size11.clo}
\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}
\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
%% text dimensions
\hoffset=-50pt
\voffset=-72pt
\textwidth=460pt
\textheight=704pt
%% remove default indentation
\parindent=0pt
%% indent command
\def\indent{\hskip20pt}
%% something is wrong with \thepage, redefine it
\gdef\thepage{\the\c@page}
%% array lines (to use the array environment)
\setlength\arraycolsep{5\p@}
\setlength\arrayrulewidth{.4\p@}
%% correct vertical alignment at the end of a document
\AtEndDocument{
\vfill
\eject
}
%% hyperlinks
% hyperlinkcounter
\newcounter{lncount}
% hyperref anchor
\def\hrefanchor{%
\stepcounter{lncount}%
\hypertarget{ln.\thelncount}{}%
}
%% define a command and write it to aux file
\def\outdef#1#2{%
% define command%
\expandafter\xdef\csname #1\endcsname{#2}%
% hyperlink number%
\expandafter\xdef\csname #1@hl\endcsname{\thelncount}%
% write command to aux%
\immediate\write\@auxout{\noexpand\expandafter\noexpand\gdef\noexpand\csname #1\endcsname{\csname #1\endcsname}}%
\immediate\write\@auxout{\noexpand\expandafter\noexpand\gdef\noexpand\csname #1@hl\endcsname{\thelncount}}%
}
%% can call commands even when they are not defined
\def\safe#1{%
\ifdefined#1%
#1%
\else%
{\color{red}\bf?}%
\fi%
}
%% define a label for the latest tag
%% label defines a command containing the string stored in \tag
\def\deflabel{
\def\label##1{\expandafter\outdef{label@##1}{\safe\tag}}
\def\ref##1{%
% check whether the label is defined (hyperlink runs into errors if this check is omitted)
\ifcsname label@##1@hl\endcsname%
\hyperlink{ln.\csname label@##1@hl\endcsname}{{\color{blue}\safe\csname label@##1\endcsname}}%
\else%
\ifcsname label@##1\endcsname%
{\color{blue}\csname ##1\endcsname}%
\else%
{\bf ??}%
\fi%
\fi%
}
}
%% make a custom link at any given location in the document
\def\makelink#1#2{%
\hrefanchor%
\outdef{label@#1}{#2}%
}
%% section command
% counter
\newcounter{sectioncount}
% space before section
\newlength\secskip
\setlength\secskip{40pt}
% a prefix to put before the section number, e.g. A for appendices
\def\sectionprefix{}
% define some lengths
\newlength\secnumwidth
\newlength\sectitlewidth
\def\section#1{
% reset counters
\stepcounter{sectioncount}
\setcounter{subsectioncount}{0}
\ifsectionsineq
\setcounter{seqcount}0
\fi
\ifsectionsinfig
\setcounter{figcount}0
\fi
% space before section (if not first)
\ifnum\thesectioncount>1
\vskip\secskip
\penalty-1000
\fi
% hyperref anchor
\hrefanchor
% define tag (for \label)
\xdef\tag{\sectionprefix\thesectioncount}
% get widths
\def\@secnum{{\bf\Large\sectionprefix\thesectioncount.\hskip10pt}}
\settowidth\secnumwidth{\@secnum}
\setlength\sectitlewidth\textwidth
\addtolength\sectitlewidth{-\secnumwidth}
% print name
\parbox{\textwidth}{
\@secnum
\parbox[t]{\sectitlewidth}{\Large\bf #1}}
% write to table of contents
\iftoc
% save lncount in aux variable which is written to toc
\immediate\write\tocoutput{\noexpand\expandafter\noexpand\edef\noexpand\csname toc@sec.\thesectioncount\endcsname{\thelncount}}
\write\tocoutput{\noexpand\tocsection{#1}{\thepage}}
\fi
%space
\par\penalty10000
\bigskip\penalty10000
}
%% subsection
% counter
\newcounter{subsectioncount}
% space before subsection
\newlength\subsecskip
\setlength\subsecskip{30pt}
\def\subsection#1{
% counters
\stepcounter{subsectioncount}
\setcounter{subsubsectioncount}{0}
\ifsubsectionsineq
\setcounter{seqcount}0
\fi
\ifsubsectionsinfig
\setcounter{figcount}0
\fi
% space before subsection (if not first)
\ifnum\thesubsectioncount>1
\vskip\subsecskip
\penalty-500
\fi
% hyperref anchor
\hrefanchor
% define tag (for \label)
\xdef\tag{\sectionprefix\thesectioncount.\thesubsectioncount}
% get widths
\def\@secnum{{\bf\large\hskip.5cm\sectionprefix\thesectioncount.\thesubsectioncount.\hskip5pt}}
\settowidth\secnumwidth{\@secnum}
\setlength\sectitlewidth\textwidth
\addtolength\sectitlewidth{-\secnumwidth}
% print name
\parbox{\textwidth}{
\@secnum
\parbox[t]{\sectitlewidth}{\large\bf #1}}
% write to table of contents
\iftoc
% save lncount in aux variable which is written to toc
\immediate\write\tocoutput{\noexpand\expandafter\noexpand\edef\noexpand\csname toc@subsec.\thesectioncount.\thesubsectioncount\endcsname{\thelncount}}
\write\tocoutput{\noexpand\tocsubsection{#1}{\thepage}}
\fi
% space
\par\penalty10000
\medskip\penalty10000
}
%% subsubsection
% counter
\newcounter{subsubsectioncount}
% space before subsubsection
\newlength\subsubsecskip
\setlength\subsubsecskip{20pt}
\def\subsubsection#1{
% counters
\stepcounter{subsubsectioncount}
% space before subsubsection (if not first)
\ifnum\thesubsubsectioncount>1
\vskip\subsubsecskip
\penalty-500
\fi
% hyperref anchor
\hrefanchor
% define tag (for \label)
\xdef\tag{\sectionprefix\thesectioncount.\thesubsectioncount.\thesubsubsectioncount}
% get widths
\def\@secnum{{\bf\hskip1.cm\sectionprefix\thesectioncount.\thesubsectioncount.\thesubsubsectioncount.\hskip5pt}}
\settowidth\secnumwidth{\@secnum}
\setlength\sectitlewidth\textwidth
\addtolength\sectitlewidth{-\secnumwidth}
% print name
\parbox{\textwidth}{
\@secnum
\parbox[t]{\sectitlewidth}{\large\bf #1}}
% write to table of contents
\iftoc
% save lncount in aux variable which is written to toc
\immediate\write\tocoutput{\noexpand\expandafter\noexpand\edef\noexpand\csname toc@subsubsec.\thesectioncount.\thesubsectioncount.\thesubsubsectioncount\endcsname{\thelncount}}
\write\tocoutput{\noexpand\tocsubsubsection{#1}{\thepage}}
\fi
% space
\par\penalty10000
\medskip\penalty10000
}
%% itemize
\newlength\itemizeskip
% left margin for items
\setlength\itemizeskip{20pt}
\newlength\itemizeseparator
% space between the item symbol and the text
\setlength\itemizeseparator{5pt}
% penalty preceding an itemize
\newcount\itemizepenalty
\itemizepenalty=0
% counter counting the itemize level
\newcounter{itemizecount}
% item symbol
\def\itemizept#1{
\ifnum#1=1
\textbullet
\else
$\scriptstyle\blacktriangleright$
\fi
}
\newlength\current@itemizeskip
\setlength\current@itemizeskip{0pt}
\def\itemize{%
\par\expandafter\penalty\the\itemizepenalty\medskip\expandafter\penalty\the\itemizepenalty%
\addtocounter{itemizecount}{1}%
\addtolength\current@itemizeskip{\itemizeskip}%
\leftskip\current@itemizeskip%
}
\def\enditemize{%
\addtocounter{itemizecount}{-1}%
\addtolength\current@itemizeskip{-\itemizeskip}%
\par\expandafter\penalty\the\itemizepenalty\leftskip\current@itemizeskip%
\medskip\expandafter\penalty\the\itemizepenalty%
}
% item, with optional argument to specify the item point
% @itemarg is set to true when there is an optional argument
\newif\if@itemarg
\def\item{%
% check whether there is an optional argument (if there is none, add on empty '[]')
\@ifnextchar [{\@itemargtrue\@itemx}{\@itemargfalse\@itemx[]}%
}
\newlength\itempt@total
\def\@itemx[#1]{
\if@itemarg
\settowidth\itempt@total{#1}
\else
\settowidth\itempt@total{\itemizept\theitemizecount}
\fi
\addtolength\itempt@total{\itemizeseparator}
\par
\medskip
\if@itemarg
\hskip-\itempt@total#1\hskip\itemizeseparator
\else
\hskip-\itempt@total\itemizept\theitemizecount\hskip\itemizeseparator
\fi
}
%% prevent page breaks after itemize
\newcount\previtemizepenalty
\def\nopagebreakafteritemize{
\previtemizepenalty=\itemizepenalty
\itemizepenalty=10000
}
%% back to previous value
\def\restorepagebreakafteritemize{
\itemizepenalty=\previtemizepenalty
}
%% enumerate
\newcounter{enumerate@count}
\def\enumerate{
\setcounter{enumerate@count}0
\let\olditem\item
\let\olditemizept\itemizept
\def\item{
% counter
\stepcounter{enumerate@count}
% set header
\def\itemizept{\theenumerate@count.}
% hyperref anchor
\hrefanchor
% define tag (for \label)
\xdef\tag{\theenumerate@count}
\olditem
}
\itemize
}
\def\endenumerate{
\enditemize
\let\item\olditem
\let\itemizept\olditemizept
}
%% equation numbering
% counter
\newcounter{seqcount}
% booleans (write section or subsection in equation number)
\newif\ifsectionsineq
\newif\ifsubsectionsineq
\def\seqcount{
\stepcounter{seqcount}
% the output
\edef\seqformat{\theseqcount}
% add subsection number
\ifsubsectionsineq
\let\tmp\seqformat
\edef\seqformat{\thesubsectioncount.\tmp}
\fi
% add section number
\ifsectionsineq
\let\tmp\seqformat
\edef\seqformat{\sectionprefix\thesectioncount.\tmp}
\fi
% define tag (for \label)
\xdef\tag{\seqformat}
% write number
\marginnote{\hfill(\seqformat)}
}
%% equation environment compatibility
\def\equation{\hrefanchor$$\seqcount}
\def\endequation{$$\@ignoretrue}
%% figures
% counter
\newcounter{figcount}
% booleans (write section or subsection in equation number)
\newif\ifsectionsinfig
\newif\ifsubsectionsinfig
% width of figures
\newlength\figwidth
\setlength\figwidth\textwidth
\addtolength\figwidth{-2.5cm}
% caption
\def\defcaption{
\long\def\caption##1{
\stepcounter{figcount}
% hyperref anchor
\hrefanchor
% the number of the figure
\edef\figformat{\thefigcount}
% add subsection number
\ifsubsectionsinfig
\let\tmp\figformat
\edef\figformat{\thesubsectioncount.\tmp}
\fi
% add section number
\ifsectionsinfig
\let\tmp\figformat
\edef\figformat{\sectionprefix\thesectioncount.\tmp}
\fi
% define tag (for \label)
\xdef\tag{\figformat}
% write
\hfil fig \figformat: \parbox[t]{\figwidth}{\leavevmode\small##1}
% space
\par\bigskip
}
}
%% short caption: centered
\def\captionshort#1{
\stepcounter{figcount}
% hyperref anchor
\hrefanchor
% the number of the figure
\edef\figformat{\thefigcount}
% add section number
\ifsectionsinfig
\let\tmp\figformat
\edef\figformat{\sectionprefix\thesectioncount.\tmp}
\fi
% define tag (for \label)
\xdef\tag{\figformat}
% write
\hfil fig \figformat: {\small#1}
%space
\par\bigskip
}
%% environment
\def\figure{
\par
\vfil\penalty100\vfilneg
\bigskip
}
\def\endfigure{
\par
\bigskip
}
%% start appendices
\def\appendix{
\vfill
\pagebreak
% counter
\setcounter{sectioncount}0
% prefix
\def\sectionprefix{A}
% write
{\bf \LARGE Appendices}\par\penalty10000\bigskip\penalty10000
% add a mention in the table of contents
\iftoc
\immediate\write\tocoutput{\noexpand\tocappendices}\penalty10000
\fi
%% uncomment for new page for each appendix
%\def\seqskip{\vfill\pagebreak}
}
%% bibliography
% size of header
\newlength\bibheader
\def\thebibliography#1{
\hrefanchor
% add a mention in the table of contents
\iftoc
% save lncount in aux variable which is written to toc
\immediate\write\tocoutput{\noexpand\expandafter\noexpand\edef\noexpand\csname toc@references\endcsname{\thelncount}}
\write\tocoutput{\noexpand\tocreferences{\thepage}}\penalty10000
\fi
% write
{\bf \LARGE References}\par\penalty10000\bigskip\penalty10000
% width of header
\settowidth\bibheader{[#1]}
\leftskip\bibheader
}
% end environment
\def\endthebibliography{
\par\leftskip0pt
}
%% bibitem command
\def\bibitem[#1]#2{%
\hrefanchor%
\outdef{label@cite#2}{#1}%
\hskip-\bibheader%
\makebox[\bibheader]{\cite{#2}\hfill}%
}
%% cite command (adapted from latex.ltx)
% @tempswa is set to true when there is an optional argument
\newif\@tempswa
\def\cite{%
% check whether there is an optional argument (if there is none, add on empty '[]')
\@ifnextchar [{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}%
}
% command with optional argument
\def\@citex[#1]#2{\leavevmode%
% initialize loop
\let\@citea\@empty%
% format
\@cite{%
% loop over ',' separated list
\@for\@citeb:=#2\do{%
% text to add at each iteration of the loop (separator between citations)
\@citea\def\@citea{,\ }%
% add entry to citelist
\@writecitation{\@citeb}%
\ref{cite\@citeb}%
}%
}%
% add optional argument text (as an argument to '\@cite')
{#1}%
}
\def\@cite#1#2{%
[#1\if@tempswa , #2\fi]%
}
%% add entry to citelist after checking it has not already been added
\def\@writecitation#1{%
\ifcsname if#1cited\endcsname%
\else%
\expandafter\newif\csname if#1cited\endcsname%
\immediate\write\@auxout{\string\citation{#1}}%
\fi%
}
%% table of contents
% boolean
\newif\iftoc
\def\tableofcontents{
{\bf \large Table of contents:}\par\penalty10000\bigskip\penalty10000
% copy content from file
\IfFileExists{\jobname.toc}{\input{\jobname.toc}}{{\tt error: table of contents missing}}
% open new toc
\newwrite\tocoutput
\immediate\openout\tocoutput=\jobname.toc
\toctrue
}
%% close file
\AtEndDocument{
% close toc
\iftoc
\immediate\closeout\tocoutput
\fi
}
%% fill line with dots
\def\leaderfill{\leaders\hbox to 1em {\hss. \hss}\hfill}
%% same as sectionprefix
\def\tocsectionprefix{}
%% toc formats
\newcounter{tocsectioncount}
\def\tocsection #1#2{
\stepcounter{tocsectioncount}
\setcounter{tocsubsectioncount}{0}
\setcounter{tocsubsubsectioncount}{0}
% write
\smallskip\hyperlink{ln.\csname toc@sec.\thetocsectioncount\endcsname}{{\bf \tocsectionprefix\thetocsectioncount}.\hskip5pt {\color{blue}#1}\leaderfill#2}\par
}
\newcounter{tocsubsectioncount}
\def\tocsubsection #1#2{
\stepcounter{tocsubsectioncount}
\setcounter{tocsubsubsectioncount}{0}
% write
{\hskip10pt\hyperlink{ln.\csname toc@subsec.\thetocsectioncount.\thetocsubsectioncount\endcsname}{{\bf \thetocsubsectioncount}.\hskip5pt {\color{blue}\small #1}\leaderfill#2}}\par
}
\newcounter{tocsubsubsectioncount}
\def\tocsubsubsection #1#2{
\stepcounter{tocsubsubsectioncount}
% write
{\hskip20pt\hyperlink{ln.\csname toc@subsubsec.\thetocsectioncount.\thetocsubsectioncount.\thetocsubsubsectioncount\endcsname}{{\bf \thetocsubsubsectioncount}.\hskip5pt {\color{blue}\small #1}\leaderfill#2}}\par
}
\def\tocappendices{
\medskip
\setcounter{tocsectioncount}0
{\bf Appendices}\par
\smallskip
\def\tocsectionprefix{A}
}
\def\tocreferences#1{
\medskip
{\hyperlink{ln.\csname toc@references\endcsname}{{\color{blue}\bf References}\leaderfill#1}}\par
\smallskip
}
%% definitions that must be loaded at begin document
\let\ian@olddocument\document
\def\document{
\ian@olddocument
\deflabel
\defcaption
}
%% end
\ian@defaultoptions
\endinput

162
libs/iantheo.sty Normal file
View File

@ -0,0 +1,162 @@
%%
%% iantheorem package:
%% Ian's customized theorem command
%%
%% boolean to signal that this package was loaded
\newif\ifiantheo
%% TeX format
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
%% package name
\ProvidesPackage{iantheo}[2016/11/10]
%% options
\newif\ifsectionintheo
\DeclareOption{section_in_theo}{\sectionintheotrue}
\DeclareOption{no_section_in_theo}{\sectionintheofalse}
\newif\ifsubsectionintheo
\DeclareOption{subsection_in_theo}{\subsectionintheotrue}
\DeclareOption{no_subsection_in_theo}{\subsectionintheofalse}
\def\iantheo@defaultoptions{
\ExecuteOptions{section_in_theo, no_subsection_in_theo}
\ProcessOptions
%%% reset at every new section
\ifsectionintheo
\let\iantheo@oldsection\section
\gdef\section{\setcounter{theocount}{0}\iantheo@oldsection}
\fi
%% reset at every new subsection
\ifsubsectionintheo
\let\iantheo@oldsubsection\subsection
\gdef\subsection{\setcounter{theocount}{0}\iantheo@oldsubsection}
\fi
}
%% delimiters
\def\delimtitle#1{
\par%
\leavevmode%
\raise.3em\hbox to\hsize{%
\lower0.3em\hbox{\vrule height0.3em}%
\hrulefill%
\ \lower.3em\hbox{#1}\ %
\hrulefill%
\lower0.3em\hbox{\vrule height0.3em}%
}%
\par\penalty10000%
}
%% callable by ref
\def\delimtitleref#1{
\par%
%
\ifdefined\ianclass%
% hyperref anchor%
\hrefanchor%
% define tag (for \label)%
\xdef\tag{#1}%
\fi%
%
\leavevmode%
\raise.3em\hbox to\hsize{%
\lower0.3em\hbox{\vrule height0.3em}%
\hrulefill%
\ \lower.3em\hbox{\bf #1}\ %
\hrulefill%
\lower0.3em\hbox{\vrule height0.3em}%
}%
\par\penalty10000%
}
%% no title
\def\delim{
\par%
\leavevmode\raise.3em\hbox to\hsize{%
\lower0.3em\hbox{\vrule height0.3em}%
\hrulefill%
\lower0.3em\hbox{\vrule height0.3em}%
}%
\par\penalty10000%
}
%% end delim
\def\enddelim{
\par\penalty10000%
\leavevmode%
\raise.3em\hbox to\hsize{%
\vrule height0.3em\hrulefill\vrule height0.3em%
}%
\par%
}
%% theorem
% counter
\newcounter{theocount}
% booleans (write section or subsection in equation number)
\def\theo#1{
\stepcounter{theocount}
\ifdefined\ianclass
% hyperref anchor
\hrefanchor
\fi
% the number
\def\formattheo{\thetheocount}
% add subsection number
\ifsubsectionintheo
\let\tmp\formattheo
\edef\formattheo{\thesubsectioncount.\tmp}
\fi
% add section number
\ifsectionintheo
\let\tmp\formattheo
\edef\formattheo{\sectionprefix\thesectioncount.\tmp}
\fi
% define tag (for \label)
\xdef\tag{\formattheo}
% write
\delimtitle{\bf #1 \formattheo}
}
\let\endtheo\enddelim
%% theorem headers with name
\def\theoname#1#2{
\theo{#1}\hfil({\it #2})\par\penalty10000\medskip%
}
%% qed symbol
\def\qedsymbol{$\square$}
\def\qed{\penalty10000\hfill\penalty10000\qedsymbol}
%% compatibility with article class
\ifdefined\ianclasstrue
\relax
\else
\def\thesectioncount{\thesection}
\def\thesubsectioncount{\thesubsection}
\def\sectionprefix{}
\fi
%% prevent page breaks after displayed equations
\newcount\prevpostdisplaypenalty
\def\nopagebreakaftereq{
\prevpostdisplaypenalty=\postdisplaypenalty
\postdisplaypenalty=10000
}
%% back to previous value
\def\restorepagebreakaftereq{
\postdisplaypenalty=\prevpostdisplaypenalty
}
%% end
\iantheo@defaultoptions
\endinput

106
libs/point.sty Normal file
View File

@ -0,0 +1,106 @@
%%
%% Points package:
%% \point commands
%%
%% TeX format
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
%% package name
\ProvidesPackage{point}[2017/06/13]
%% options
\newif\ifresetatsection
\DeclareOption{reset_at_section}{\resetatsectiontrue}
\DeclareOption{no_reset_at_section}{\resetatsectionfalse}
\newif\ifresetatsubsection
\DeclareOption{reset_at_subsection}{\resetatsubsectiontrue}
\DeclareOption{no_reset_at_subsection}{\resetatsubsectionfalse}
\newif\ifresetattheo
\DeclareOption{reset_at_theo}{\resetattheotrue}
\DeclareOption{no_reset_at_theo}{\resetattheofalse}
\def\point@defaultoptions{
\ExecuteOptions{reset_at_section, reset_at_subsection, no_reset_at_theo}
\ProcessOptions
%% reset at every new section
\ifresetatsection
\let\point@oldsection\section
\gdef\section{\resetpointcounter\point@oldsection}
\fi
%% reset at every new subsection
\ifresetatsubsection
\let\point@oldsubsection\subsection
\gdef\subsection{\resetpointcounter\point@oldsubsection}
\fi
%% reset at every new theorem
\ifresetattheo
\ifdefined\iantheotrue
\let\point@oldtheo\theo
\gdef\theo{\resetpointcounter\point@oldtheo}
\fi
\fi
}
%% point
% counter
\newcounter{pointcount}
\def\point{
\stepcounter{pointcount}
\setcounter{subpointcount}{0}
% hyperref anchor (only if the class is 'ian')
\ifdefined\ifianclass
\hrefanchor
% define tag (for \label)
\xdef\tag{\thepointcount}
\fi
% header
\indent{\bf \thepointcount\ - }
}
%% subpoint
% counter
\newcounter{subpointcount}
\def\subpoint{
\stepcounter{subpointcount}
\setcounter{subsubpointcount}0
% hyperref anchor (only if the class is 'ian')
\ifdefined\ifianclass
\hrefanchor
% define tag (for \label)
\xdef\tag{\thepointcount-\thesubpointcount}
\fi
% header
\indent\hskip.5cm{\bf \thepointcount-\thesubpointcount\ - }
}
%% subsubpoint
% counter
\newcounter{subsubpointcount}
\def\subsubpoint{
\stepcounter{subsubpointcount}
% hyperref anchor (only if the class is 'ian')
\ifdefined\ifianclass
\hrefanchor
% define tag (for \label)
\xdef\tag{\thepointcount-\thesubpointcount-\thesubsubpointcount}
\fi
\indent\hskip1cm{\bf \thepointcount-\thesubpointcount-\thesubsubpointcount\ - }
}
%% reset point counters
\def\resetpointcounter{
\setcounter{pointcount}{0}
\setcounter{subpointcount}{0}
\setcounter{subsubpointcount}{0}
}
%% end
\point@defaultoptions
\endinput