Source code for pyEPR.calcs.transmon

"""
Transmon calculations

"""
import math

import numpy as np
from numpy import pi, sqrt, exp
from numpy.linalg import inv

from .constants import e_el, fluxQ
from .convert import Convert
from ..toolbox.pythonic import divide_diagonal_by_2



[docs]class CalcsTransmon(): """ Common calculations and parameter reporting used for transmon qubits. """
[docs] @staticmethod def dispersiveH_params_PT_O1(Pmj, Ωm, Ej): """ First order PT on the 4th power of the JJ cosine. This function applied to an unfrustrated Josephson junction. Pmj : Matrix MxJ Ωm : GHz Matrix MxM Ej : GHz Matrix JxJ returns f_O1, χ_O1 χ_O1 has diagonal divided by 2 so as to give true anharmonicity. Example use: ..codeblock python # PT_01: Calculate 1st order PT results f_O1, χ_O1 = Calc_basic.dispersiveH_params_PT_O1(Pmj, Ωm, Ej) """ Pmj, Ωm, Ej = map(np.array, (Pmj, Ωm, Ej)) assert Ωm.shape[0] == Ωm.shape[1] assert Ej.shape[0] == Ej.shape[1] assert Ωm.shape[1] == Pmj.shape[0] assert Pmj.shape[1] == Ej.shape[0] f_0 = np.diag(Ωm) χ_O1 = 0.25 * Ωm @ Pmj @ inv(Ej) @ Pmj.T @ Ωm * 1000. # GHz to MHz f_O1 = f_0 - 0.5*np.ndarray.flatten(np.array(χ_O1.sum(1))) / \ 1000. # 1st order PT expect freq to be dressed down by alpha # Make the diagonals alpha χ_O1 = divide_diagonal_by_2(χ_O1) return f_O1, χ_O1
[docs] @staticmethod def transmon_get_all_params(Ej_MHz, Ec_MHz): """ Linear harmonic oscillator approximation of transmon. Convenience func """ Ej, Ec = Ej_MHz, Ec_MHz Lj_H, Cs_F = Convert.Lj_from_Ej( Ej, 'MHz', 'H'), Convert.Cs_from_Ec(Ec, 'MHz', 'F') # SI units Phi_ZPF, Q_ZPF = Convert.ZPF_from_LC(Lj_H, Cs_F) Omega_MHz = sqrt(1./(Lj_H*Cs_F)) * 1E-6 # MHz f_MHz = Omega_MHz / (2*pi)*1E-3 Z_Ohms = sqrt(Lj_H/Cs_F) phi_ZPF = Phi_ZPF/fluxQ n_ZPF = Q_ZPF / (2*e_el) return {'Ej_MHz': Ej_MHz, 'Ec_MHz': Ec_MHz, 'Lj_H': Lj_H, 'Cs_F': Cs_F, 'Lj_nH': Lj_H*1E9, 'Cs_fF': Cs_F*1E15, 'Phi_ZPF': Phi_ZPF, 'Q_ZPF': Q_ZPF, 'phi_ZPF': phi_ZPF, 'n_ZPF': n_ZPF, 'Omega_MHz': Omega_MHz, 'f_MHz': f_MHz, 'Z_Ohms': Z_Ohms, }
[docs] @staticmethod def transmon_print_all_params(Lj_nH, Cs_fF): """ Linear harmonic oscillator approximation of transmon. Convenience func """ # Parameters - duplicates with transmon_get_all_params Ej, Ec = Convert.Ej_from_Lj(Lj_nH, 'nH', 'MHz'), Convert.Ec_from_Cs( Cs_fF, 'fF', 'MHz') # MHz Lj_H, Cs_F = Convert.Lj_from_Ej(Ej, 'MHz', 'H'), Convert.Cs_from_Ec( Ec, 'MHz', 'F') # SI units Phi_ZPF, Q_ZPF = Convert.ZPF_from_LC(Lj_H, Cs_F) Omega_MHz = sqrt(1./(Lj_H*Cs_F)) * 1E-6 # MHz # Print text = r""" \begin{align} L_J &=%.1f \mathrm{\ nH} & C_\Sigma &=%.1f \mathrm{\ fF} \\ E_J &=%.2f \mathrm{\ GHz} & E_C &=%.0f \mathrm{\ MHz} \\ \omega_0 &=2\pi\times %.2f \mathrm{\ GHz} & Z_0 &= %.0f \mathrm{\ \Omega} \\ \phi_\mathrm{ZPF} &= %.2f \ \ \phi_0 & n_\mathrm{ZPF} &=%.2f \ \ (2e) \\ \end{align} """ % (Lj_H*1E9, Cs_F*1E15, Ej/1E3, Ec, Omega_MHz / (2*pi)*1E-3, sqrt(Lj_H/Cs_F), Phi_ZPF/fluxQ, Q_ZPF / (2*e_el)) from IPython.display import display, Math display(Math(text)) return text
[docs] @staticmethod def charge_dispersion_approx(m, Ec, Ej): """ Use Eq. (2.5) of Koch's paper. """ return sqrt(2./pi) * Ec * (-1.)**(m) * 2.**(4.*m+5.) * exp(-sqrt(8*Ej/Ec)) * (Ej/(2*Ec))**(m/2.+3./4.)\ / math.factorial(m)