Tutorial 3: Circuit QED Parameters — Josephson Junctions, Transmons, and Unit Conversions#
| Author: | Zlatko Minev |
| Purpose: | Demonstrate the circuit QED conversion utilities in pyEPR.calcs: unit conversions, Josephson junction parameters, transmon physics, and physical constants. |
| File Status: | Complete |
References:
Koch et al., Charge-insensitive qubit design derived from the Cooper pair box, PRA 76, 042319 (2007) — the foundational transmon paper.
Minev et al., Energy-participation quantization of Josephson circuits, npj Quantum Information (2021); arXiv:2010.00620 — the EPR framework implemented in pyEPR.
Devoret & Schoelkopf, Superconducting Circuits for Quantum Information: An Outlook, Science 339, 1169 (2013) — broad review of circuit QED.
Introduction: The Key Players in Superconducting Qubit Design#
Superconducting qubits are built from two ingredients: linear electromagnetic resonators (modelled as LC oscillators) and Josephson junctions (JJs), which provide the essential nonlinearity. Without a nonlinear element, a purely harmonic oscillator has equally spaced energy levels and cannot be selectively addressed as a two-level system.
The Josephson Junction#
A Josephson junction is a thin insulating barrier sandwiched between two superconducting electrodes. Its constitutive relation is:
where \(\varphi\) is the gauge-invariant phase difference across the junction, \(I_c\) is the critical current, and \(\Phi_0 = h/(2e)\) is the (superconducting) flux quantum. These two equations together define a purely inductive, nonlinear element.
The potential energy stored in the junction is:
where the Josephson energy \(E_J\) sets the depth of the cosine potential well:
Here \(\phi_0 = \Phi_0/(2\pi) = \hbar/(2e)\) is the reduced flux quantum.
Linearised Josephson Inductance#
For small oscillations around \(\varphi = 0\), the cosine potential is well approximated as a parabola:
This means the junction looks like a linear inductor with inductance:
This linearised Josephson inductance \(L_J\) is the quantity that enters the electromagnetic simulation in HFSS. The EPR method extracts the zero-point fluctuations of the reduced flux \(\varphi_{\text{zpf}}\) across the junction, which then feeds into the full nonlinear analysis.
The Charging Energy#
Each electrode of the junction has a capacitance \(C_\Sigma\) (including the junction self-capacitance and any shunting capacitors). The charging energy is:
which is the energy cost of placing one Cooper pair (\(2e\)) on the capacitor. Note that some references define \(E_C = e^2/(2C)\) while others write \(4E_C\) for the charging energy — the convention used here follows Koch et al. (2007), where \(E_C = e^2/(2C_\Sigma)\).
The Transmon Hamiltonian#
A transmon qubit is a Cooper-pair box shunted with a large capacitor to increase \(C_\Sigma\) and suppress charge noise. The Hamiltonian (in the charge basis, ignoring offset charge) is:
where \(\hat{n}\) is the Cooper-pair number operator conjugate to \(\hat{\varphi}\). The key dimensionless ratio is:
Typically, \(E_J/E_C \sim 50\)–\(100\) for a transmon. In this limit:
The qubit transition frequency approaches the plasma frequency: \(f_{01} \approx \sqrt{8 E_J E_C}/h\).
The anharmonicity (the difference between the \(|1\rangle\to|2\rangle\) and \(|0\rangle\to|1\rangle\) transition frequencies) is approximately \(\alpha \approx -E_C\), which is small but sufficient to address the qubit selectively.
The qubit is exponentially insensitive to charge noise for \(E_J/E_C \gtrsim 50\).
Connection to EPR#
The EPR method (arXiv:2010.00620) links the HFSS eigenmode simulation directly to the quantum Hamiltonian. The zero-point flux fluctuation across junction \(j\) in mode \(m\) is:
or equivalently \(\varphi_{\text{zpf}} = (2E_C/E_J)^{1/4}\) in the transmon limit. The participation ratio \(p_{jm}\) is the fraction of the mode’s inductive energy stored in junction \(j\). Together these give the anharmonicity and cross-Kerr couplings directly from the HFSS solution.
The utilities in this tutorial let you convert between all the representations (\(L_J\), \(I_c\), \(E_J\), \(E_C\), \(C\)) and compute the transmon spectrum, complementing the HFSS-based EPR workflow.
%load_ext autoreload
%autoreload 2
1. Unit Conversions#
Why unit conversions matter#
pyEPR works internally in SI units (metres, henries, farads, joules, radians/second), but circuit QED practitioners invariably think in convenient scaled units:
Quantity |
Practical unit |
SI equivalent |
|---|---|---|
Inductance |
nH (nano-henry) |
\(10^{-9}\) H |
Capacitance |
fF (femto-farad) |
\(10^{-15}\) F |
Frequency / Energy |
GHz |
\(h \times 10^9\) J |
Frequency / Energy |
MHz |
\(h \times 10^6\) J |
Current |
nA (nano-ampere) |
\(10^{-9}\) A |
The Convert class in pyEPR.calcs provides bidirectional conversion between SI and these practical units, as well as conversions between physically equivalent representations (e.g., \(L_J \leftrightarrow E_J \leftrightarrow I_c\), and \(C_\Sigma \leftrightarrow E_C\)).
Note: These conversions are intentionally kept as a lightweight internal implementation — no external dependency is introduced for what are essentially a handful of scaling factors and physical constants.
Elementary SI conversions#
Convert.toSI(value, unit) scales a value into SI (multiply by the unit’s SI prefix factor). Convert.fromSI(value, unit) scales a value out of SI (divide by the prefix). The round-trip (identity) test confirms correctness.
import pyEPR.calcs
from pyEPR.calcs import Convert
print("Convert.toSI(1,'nH') = ", Convert.toSI(1,'nH'), "H")
print("Convert.fromSI(1.0,'nH') = ", Convert.fromSI(1.0,'nH'), "nH")
print("Identity: ", Convert.toSI(Convert.fromSI(1.0,'nH'),'nH'))
2. Josephson Junction Parameters: \(E_J\), \(L_J\), \(E_C\), and \(C_\Sigma\)#
Josephson energy from inductance: \(E_J \leftrightarrow L_J\)#
The Josephson energy and the linearised Josephson inductance are related by:
or in practical units:
For a typical transmon junction with \(L_J = 10\,\text{nH}\):
which is a canonical value you will see throughout the transmon literature.
Charging energy from capacitance: \(E_C \leftrightarrow C_\Sigma\)#
The charging energy follows from:
or in practical units:
For a typical transmon shunting capacitance \(C_\Sigma = 65\,\text{fF}\), this gives \(E_C \approx 300\,\text{MHz}\), so \(E_J/E_C \approx 54\) — solidly in the transmon regime.
The code below exercises both conversions and their inverses.
from IPython.display import Latex
Lj = 10
display(Latex(r"$E_J = %.2f \text{ GHz} \qquad \text{for } L_J=%.2f\text{ nH}$" % (\
Convert.Ej_from_Lj(Lj, 'nH', "GHz"),Lj)))
print('\nConvert back %.2f nH' % Convert.Lj_from_Ej(16.35E3, 'MHz', 'nH'),'\n')
display(Latex(r"$E_C = %.2f \text{ MHz} \qquad \text{for } C_J=%.2f\text{ fF}$" % (\
Convert.Ec_from_Cs(65., 'fF', "MHz"),65.)))
display( 'Convert back:',Latex(r"$C_J = %.2f \text{ fF} \qquad \text{for } E_C=%.2f\text{ MHz}$" % (\
Convert.Cs_from_Ec(300, 'MHz', "fF"),300)))
3. Critical Current: \(I_c \leftrightarrow L_J\)#
The critical current \(I_c\) is the maximum supercurrent the junction can carry. It is related to the linearised inductance by:
where \(\phi_0 = \Phi_0/(2\pi) \approx 3.29 \times 10^{-16}\,\text{Wb}\) is the reduced flux quantum. Numerically, for \(L_J = 10\,\text{nH}\):
This is consistent with the Ambegaokar–Baratoff relation at \(T=0\):
where \(\Delta\) is the superconducting gap and \(R_N\) is the junction’s normal-state resistance. For aluminium (\(\Delta \approx 170\,\mu\text{eV}\)), a critical current of \(30\,\text{nA}\) corresponds to a normal resistance \(R_N \approx 9\,\text{k}\Omega\), which is a typical fabrication target for transmon junctions.
Key point: \(I_c\) is directly measurable and is the primary specification used in junction fabrication. The pyEPR conversion functions let you move fluently between \(I_c\) (a fabrication parameter) and \(L_J\) (the simulation parameter).
print(Convert.Ic_from_Lj(10))
Convert.Lj_from_Ic(32)
4. Physical Constants#
All the conversion formulas above involve a small set of fundamental constants. pyEPR exposes these directly from pyEPR.calcs.convert so that you can write raw physical calculations without relying on external libraries.
Symbol |
Name |
Value |
|---|---|---|
\(h\) ( |
Planck constant |
\(6.626 \times 10^{-34}\) J\(\cdot\)s |
\(\hbar\) ( |
Reduced Planck constant |
\(h/(2\pi) = 1.055 \times 10^{-34}\) J\(\cdot\)s |
\(e\) ( |
Elementary charge |
\(1.602 \times 10^{-19}\) C |
\(\Phi_0\) ( |
Flux quantum (\(h/2e\)) |
\(2.068 \times 10^{-15}\) Wb |
\(\phi_0\) ( |
Reduced flux quantum (\(\Phi_0/2\pi = \hbar/2e\)) |
\(3.291 \times 10^{-16}\) Wb |
\(\pi\) ( |
Pi |
\(3.14159\ldots\) |
The reduced flux quantum \(\phi_0 = \hbar/(2e)\) is particularly important: it is the natural unit for the phase variable \(\varphi\), and it determines both the Josephson inductance (\(L_J = \phi_0^2/E_J\)) and the flux quantisation condition.
The cell below performs a raw calculation of \(E_J\) using these constants, as a cross-check of the formula and the Convert functions.
from pyEPR.calcs.convert import π, pi, ϕ0, fluxQ, Planck, ħ, hbar, elementary_charge, e_el
print("Test EJ raw calculation = %.2f"%( ϕ0**2 / (10E-9 * Planck) *1E-9 ) ,'GHz')
The result \(E_J \approx 16.35\,\text{GHz}\) for \(L_J = 10\,\text{nH}\) is confirmed, matching the Convert.Ej_from_Lj result above. This is the fundamental cross-check: when you type ϕ0**2 / (10E-9 * Planck) you are directly evaluating the defining formula \(E_J = \phi_0^2 / L_J\), expressed in joules, and then converting to GHz by dividing by \(h\) and scaling by \(10^{-9}\).
5. Transmon Qubit Physics#
From nonlinear oscillator to weakly anharmonic qubit#
The transmon Hamiltonian \(\hat{H} = 4E_C \hat{n}^2 - E_J\cos\hat{\varphi}\) can be analysed in the phase basis. In the transmon limit \(E_J/E_C \gg 1\), the junction phase is well localised near \(\varphi = 0\), and the cosine can be expanded:
The first two terms are a harmonic oscillator (the plasma oscillator) with angular frequency:
The third term (\(-E_J\hat{\varphi}^4/24\)) is the leading nonlinear correction. In second-order perturbation theory it shifts the \(|1\rangle \to |2\rangle\) transition relative to \(|0\rangle \to |1\rangle\) by:
where \(f_{01}\) is the qubit frequency and \(\alpha\) is the anharmonicity. For a typical transmon with \(E_C/h \approx 300\,\text{MHz}\), the anharmonicity is about \(-300\,\text{MHz}\), which is sufficient to selectively drive the \(|0\rangle \leftrightarrow |1\rangle\) transition with nanosecond pulses.
Zero-point fluctuations#
Treating the transmon as a quantum harmonic oscillator, the zero-point fluctuation of the reduced flux \(\hat{\varphi}\) is:
This quantity is central to the EPR analysis: it sets the strength of the nonlinearity. In the transmon limit, \(\varphi_{\text{zpf}} \ll 1\) (small oscillations), which is consistent with the perturbative treatment. The full EPR formula for the Kerr nonlinearity is \(\chi \approx -E_C (\varphi_{\text{zpf}})^4 / 2\) per mode.
Charge insensitivity#
The exponential suppression of charge noise in the transmon regime is one of its most important features. The charge dispersion (sensitivity of \(f_{01}\) to offset charge) decays exponentially as:
For \(E_J/E_C = 50\), this suppression is enormous (\(\sim e^{-20}\)), making the transmon essentially charge-insensitive even though it is still formally a charge qubit.
The transmon_print_all_params function#
CalcsTransmon.transmon_print_all_params(Lj_nH, Cs_fF) is a convenience function that takes the junction inductance (in nH) and shunting capacitance (in fF), computes \(E_J\) and \(E_C\), and prints the full set of transmon parameters in a formatted display. This is useful for a quick sanity check during device design.
For the canonical transmon parameters \(L_J = 13\,\text{nH}\), \(C_\Sigma = 65\,\text{fF}\):
pyEPR.calcs.CalcsTransmon.transmon_print_all_params(13, 65);
The displayed quantities include:
\(E_J\), \(E_C\) (in MHz and GHz): the fundamental circuit parameters.
\(f_{01}\) (in GHz): the qubit transition frequency \(\approx \sqrt{8 E_J E_C}/h\).
\(\alpha\) (anharmonicity, in MHz): \(\approx -E_C/h\).
\(\varphi_{\text{zpf}}\) (dimensionless): zero-point fluctuation of the reduced phase, \((2E_C/E_J)^{1/4}\).
\(Z\) (in \(\Omega\)): characteristic impedance of the linearised junction-capacitor circuit, \(Z = \sqrt{L_J/C_\Sigma}\).
Raw dictionary output#
The underlying function transmon_get_all_params(Ej_MHz, Ec_MHz) returns the same quantities as a Python dictionary, which is convenient for programmatic access and post-processing.
pyEPR.calcs.CalcsTransmon.transmon_get_all_params(Convert.Ej_from_Lj(13, 'nH', 'MHz'), Convert.Ec_from_Cs(65, 'fF', 'MHz'))
Some key values from the output to understand:
Phi_ZPF(in Wb): the dimensional zero-point flux fluctuation \(\Phi_{\text{zpf}} = \phi_0 \cdot \varphi_{\text{zpf}}\).Q_ZPF(in C): the zero-point charge fluctuation \(Q_{\text{zpf}} = \hbar / (2\Phi_{\text{zpf}})\).phi_ZPF(dimensionless): the reduced flux ZPF \(\varphi_{\text{zpf}} = (2E_C/E_J)^{1/4}\).n_ZPF: the Cooper-pair number ZPF \(n_{\text{zpf}} = 1/(4\varphi_{\text{zpf}})\).Omega_MHz: the angular plasma frequency \(\omega_p/(2\pi)\) in MHz… wait — this is actually \(\omega_p\) in rad/s divided by \(2\pi\) and converted, i.e. the plasma frequency \(f_p = \sqrt{8E_JE_C}/h\).f_MHz: the qubit frequency \(f_{01} \approx f_p\) in GHz (note units in key name are legacy; value is in GHz).Z_Ohms: the impedance \(Z = \sqrt{L_J/C_\Sigma}\) in ohms, which determines the magnitude of vacuum fluctuations and hence coupling strengths to microwave cavities.
For the parameters here (\(L_J = 13\,\text{nH}\), \(C_\Sigma = 65\,\text{fF}\)): \(E_J/E_C \approx 12574/298 \approx 42\), which is in the transmon regime but on the lower end. Increasing \(C_\Sigma\) (adding more shunting capacitance) would push \(E_J/E_C\) higher, improving charge insensitivity at the cost of reduced anharmonicity.
Summary: Connecting Circuit Parameters to the EPR Workflow#
The conversion utilities in this tutorial sit at the interface between fabrication/design and simulation:
Fabrication target
I_c ──────────────────────────────► L_J (simulation input)
│
▼
HFSS eigenmode simulation
│
EPR analysis extracts
φ_zpf per mode/junction
│
▼
Quantum Hamiltonian
ω_01, α, χ (cross-Kerr)
The workflow is:
Choose \(E_J\) and \(E_C\) to hit a target qubit frequency and anharmonicity, using
transmon_print_all_params.Convert \(E_J \to L_J\) with
Convert.Lj_from_Ejto get the HFSS junction parameter.Convert \(E_J \to I_c\) with
Convert.Ic_from_Ljto specify the junction to your fabrication team.Run HFSS with the linearised inductance \(L_J\), then use
DistributedAnalysis(Tutorial 1) to extract \(p_{jm}\) and \(\varphi_{\text{zpf}}\).Compute the full Hamiltonian with
QuantumAnalysis(Tutorial 1), recovering \(\alpha\), \(\chi\), etc.
For more details, see the EPR paper (arXiv:2010.00620) and Koch et al., PRA 76, 042319 (2007).