Static Analysis

1-static-analysis

Finding theoretical quantum parameters of a superconducting cavity-transmon-readout system🥳

We use the program HFSS by Ansys, in addition with the pyEPR python library to find the parameters of the system. Without getting to much into details, the system can be divided into three main parts:

  • The superconducting cavity - A Superconducting Radio Frequency (SRF) cavity (half of an SRF cavity, to be precise), inside of which our system is stored. The electromagnetic modes in the cavity are used to store quantum information for a long time.
  • The Transmon - The Transmon is a device based on the Josephson effect, it is used to add non-linearity to the enregy spectrum of the cavity to allow universal control.
  • The read-out resonator - The read-out (RO) resonator is simply a strip-line of a superconductor that is coupled to the transmon dispersivly, this way you can use it's frequency to measure the state of the qubit.

There are many parameters we may care about in our system, and in this notebook we'll find them with the help of HFSS and pyEPR. The most basic parameters we may care about are the frequencies of our devices, the cavity and read-out have resonating frequencies based on the geometry we set in HFSS while the transmon frequency emarges from the Josephson effect, and since it's on a scale much smaller than HFSS can handle, we need to define the junction parameters in code, and from that get the frequency.

Note: Each device can have many resonating frequencies and it might be a bit difficult to distinguish which mode coresponds to which device, if you do want to find the corespondens (and we do) there are a couple of ways you can go about it. The first is to simply plot the magnitude of each mode and see where the field is the strongest. If your'e devices are close to one another they might be difficult to distinguish so another mehod is use the pyEPR module and find the precage of energy of the mode near each device and using this to determine the modes.

Another set of parameters we may care about are the coupling between the modes, denoted $\chi_{ij}$ for the coupling between the modes $\omega_i$ and $\omega_j$, this is sometimes called the cross-kerr frequencies if $i \ne j$. In the case where $i=j$, $\chi_{ii}$ is the anharmonicity of the mode $\omega_i$, usually denoted $\alpha_i$.

In [1]:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import pyEPR as epr

plt.style.use('ggplot')
plt.style.use('seaborn-darkgrid')

🔹 Connecting to HFSS

In [2]:
pinfo = epr.Project_Info(project_path = '.', 
                         project_name = 'transmon-cavity-ro',  # File name
                         design_name  = 'design')
INFO 09:39PM [connect]: Connecting to Ansys Desktop API...
INFO 09:39PM [load_ansys_project]: 	File path to HFSS project found.
INFO 09:39PM [load_ansys_project]: 	Opened Ansys App
INFO 09:39PM [load_ansys_project]: 	Opened Ansys Desktop v2020.2.0
INFO 09:39PM [load_ansys_project]: 	Opened Ansys Project
	Folder:    C:/Users/danie/Desktop/Projects/cavity-analysis/quantum-parameters/
	Project:   transmon-cavity-ro
INFO 09:39PM [connect]: 	Opened active design
	Design:    design [Solution type: Eigenmode]
INFO 09:39PM [get_setup]: 	Opened setup `Setup1`  (<class 'pyEPR.ansys.HfssEMSetup'>)
INFO 09:39PM [connect]: 	Connection to Ansys established successfully. 😀 

🔹 Run setup (Find modes and Q-factors in HFSS)

In [3]:
pinfo.setup.analyze()
INFO 09:39PM [analyze]: Analyzing setup Setup1

🔹 Define the junction (and any other non-linear component)

In [5]:
pinfo.junctions['j1'] = {'Lj_variable' : 'Lj_1',
                         'rect'        : 'rect_jj1', 
                         'line'        : 'line_jj1', 
                         'length'      : epr.parse_units('100um')}

# Check that valid names of variables and objects have been supplied.
# An error is raised with a message if something is wrong.
pinfo.validate_junction_info()

🔹 Distributed Analysis (not quantum)

Note that 3 modes is the maximum we can analyze fully❗ See this issue

In [6]:
eprh = epr.DistributedAnalysis(pinfo)

eprh.do_EPR_analysis(modes=[0,1,4]);
Design "design" info:
	# eigenmodes    5
	# variations    1

Variation 0  [1/1]

  Mode 0 at 4.55 GHz   [1/5]
    Calculating ℰ_magnetic,ℰ_electric
       (ℰ_E-ℰ_H)/ℰ_E       ℰ_E       ℰ_H
               97.4%   2.08e-24 5.316e-26

    Calculating junction energy participation ration (EPR)
	method=`line_voltage`. First estimates:
	junction        EPR p_0j   sign s_0j    (p_capacitive)
		Energy fraction (Lj over Lj&Cj)= 98.71%
	j1              0.971922  (+)        0.0127188
		(U_tot_cap-U_tot_ind)/mean=0.76%

  Mode 1 at 4.85 GHz   [2/5]
    Calculating ℰ_magnetic,ℰ_electric
       (ℰ_E-ℰ_H)/ℰ_E       ℰ_E       ℰ_H
                0.1%  1.238e-20 1.237e-20

    Calculating junction energy participation ration (EPR)
	method=`line_voltage`. First estimates:
	junction        EPR p_1j   sign s_1j    (p_capacitive)
		Energy fraction (Lj over Lj&Cj)= 98.54%
	j1              0.000143285  (+)        2.12839e-06
		(U_tot_cap-U_tot_ind)/mean=0.04%

  Mode 4 at 7.61 GHz   [5/5]
    Calculating ℰ_magnetic,ℰ_electric
       (ℰ_E-ℰ_H)/ℰ_E       ℰ_E       ℰ_H
                2.2%  3.309e-22 3.237e-22

    Calculating junction energy participation ration (EPR)
	method=`line_voltage`. First estimates:
	junction        EPR p_4j   sign s_4j    (p_capacitive)
		Energy fraction (Lj over Lj&Cj)= 96.47%
	j1              0.000965039  (+)        3.53277e-05
		(U_tot_cap-U_tot_ind)/mean=1.05%

ANALYSIS DONE. Data saved to:

C:\Users\danie\Desktop\Projects\data-pyEPR\transmon-cavity-ro\design\2020-09-22 21-43-53.npz


🔹 Quantum Analysis (yes quantum)

In [8]:
epra = epr.QuantumAnalysis(eprh.data_filename)
epra.analyze_all_variations(cos_trunc = 8, fock_trunc = 15);
WARNING 09:46PM [__init__]: <p>Error: <class 'IndexError'></p>
	 Differences in variations:



 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 
Variation 0

Starting the diagonalization
Finished the diagonalization
Pm_norm=
modes
0     1.015487
1     3.447517
4    11.873372
dtype: float64

Pm_norm idx =
      j1
0   True
1  False
4  False
*** P (participation matrix, not normlz.)
         j1
0  0.959716
1  0.000143
4  0.000965

*** S (sign-bit matrix)
   s_j1
0     1
1     1
4     1
*** P (participation matrix, normalized.)
      0.97
   0.00014
   0.00097

*** Chi matrix O1 PT (MHz)
    Diag is anharmonicity, off diag is full cross-Kerr.
       120   0.0377    0.399
    0.0377 2.95e-06 6.25e-05
     0.399 6.25e-05  0.00033

*** Chi matrix ND (MHz) 
       128   0.0154    0.377
    0.0154 6.78e-07 2.95e-05
     0.377 2.95e-05 0.000291

*** Frequencies O1 PT (MHz)
0    4431.032293
1    4849.360976
2    7612.620103
dtype: float64

*** Frequencies ND (MHz)
0    4427.665644
1    4849.366160
2    7612.622273
dtype: float64

*** Q_coupling
Empty DataFrame
Columns: []
Index: [0, 1, 4]

We can look at the results from HFSS in the notebook with pyEPR with the code

In [9]:
eprh.get_freqs_bare_pd(eprh.variations[0])
Out[9]:
Freq. (GHz)Quality Factor
mode
04.5516304.652389e+07
14.8493803.856528e+12
27.0317181.114255e+07
37.0334791.025469e+07
47.6128201.980471e+05

🎶 Understanding the Modes

Looking around in HFSS using the method mentioned in the begining we can find that the modes and their coresponding object (device) are

indexobjectFrequency (GHz)Quality Factor
0transmon$4.55$$4.65 \cdot 10^7$
1cavity$4.85$$3.85 \cdot 10^{12}$
2cavity$7.03$$1.11 \cdot 10^7$
3cavity$7.03$$1.03 \cdot 10^7$
4readout$7.61$$1.98 \cdot 10^5$

If you rememver the shape of the cavity was symetric along the $\hat{x}$-$\hat{y}$ plena (it is circular in that plane), and is not symetric in the $\hat{z}$ direction, this is why excpect degeneret modes to come in pairs, these are the modes we don't care about, and the modes we care about are those in the $\hat{z}$ direction. In this case modes 2 and 3 are degeneret so we'll ignore them. The modes we care about are 0, 1 and 4

🎉 Cross-kerr and anharmonicities

pyEPR just calculated for us all the elemets of $\chi_{ij}$ ($3\times 3$ matrix), let's understand this data

In [10]:
chis = epra.get_chis()
chis
Out[10]:
012
variation
00128.4442901.535640e-020.376752
10.0153566.777248e-070.000029
20.3767522.945257e-050.000291

The diagonal elements of the matrix are the anharmonicities $\alpha_i$ and the off-diagonal elements are the coupling between the modes (this is why is symetric, since the coupling between mode 1 and mode 2 is the same as the coupling between mode 2 and mode 1)

In [11]:
# anharmonicities
alphas = np.diag(chis)
alpha_t, alpha_c, alpha_r = alphas

# Couplings
chi_ct = chis[1][0]  # cavity-transmon
chi_tr = chis[0][2]  # transmon-readout
chi_cr = chis[1][2]  # cavity-readout

pd.DataFrame({'Anharmonicity (MHz)': alphas})
Out[11]:
Anharmonicity (MHz)
01.284443e+02
16.777248e-07
22.907582e-04
In [12]:
pd.DataFrame({'Coupling (MHz)': [chi_ct, chi_tr, chi_cr]}, index=['cavity-transmon', 'transmon-readout', 'cavity-readout'])
Out[12]:
Coupling (MHz)
cavity-transmon0.015356
transmon-readout0.376752
cavity-readout0.000029

Do these results make sense? 🤔

First the anharmonicities, we can see that the transmon anharmonicity is around ~$128$ MHz and the cavity and readout have basicly no anharmonicity, which is exactly what we expect❗ Another thing we expect (and want) is that the transmon would have a strong coupling to the cavity and readout, while the coupling between the cavity and readout should be negligible, and this is again exactly what we see😍 We may also want to check that the frequencies and couplings have correct values (order of magnitude), to do so we'll compare to other experimental results, mainly Philip Reinhold's Thesis table 5.1 page 85, these results are in fact exactly what we want!🎉🎉💃🥳🎈

In [ ]: