External Flux Distribution

In the SQcircuit original paper, we show that the Hamiltonian of any circuit (without any transformation of coordinates) can be written as the following form

\begin{equation} {{H}} = \frac{1}{2} \hat{{\mathbf{Q}}}^T {\mathbf{C}}^{-1}\hat{{\mathbf{Q}}} + \frac{1}{2} \hat{{\mathbf\Phi}}^T {\mathbf{L}}^{*} \hat{{\mathbf\Phi}} +\sum_{k\in \mathcal{S}_L}\left(\frac{\Phi_0}{2\pi}\frac{\mathbf{b}_k^T\mathbf{\varphi}_{\text{ext}}}{l_k}\right){\mathbf{w}}^T_k{\hat{\mathbf{\Phi}}}-\sum_{k\in \mathcal{S}_J} E_{J_k} \cos \left(\frac{2\pi}{\Phi_0}{\mathbf{w}}^T_k{\hat{\mathbf{\Phi}}}+\mathbf{b}_k^T\mathbf{\varphi}_{\text{ext}}\right)\end{equation}

where distribution of external fluxes for each inductive element is specified by \(n_L\) (number of loops) dimensional vector \(\mathbf{b}_k\). We also showed in the paper that the correct description for external fluxes depends on the capacitors associated to each inductive element (see the paper for the details).

We use the following circuit as an example to demonstrate the SQcircuit functionalities.

296bd0e551fc443a813df627fcb9842c

Firstly, we build our circuit by assigning three equal capacitors to each inductive elements( Josephson junctions and inductors).

[1]:
import SQcircuit as sq

C = sq.Capacitor(1)

loop1 = sq.Loop(id_str="loop1")

JJ1 = sq.Junction(1, loops=[loop1], cap=C, id_str="JJ1")
JJ2 = sq.Junction(1, loops=[loop1], cap=C, id_str="JJ2")
L = sq.Inductor(1, loops=[loop1], cap=C, id_str="ind")

elements = {(0, 1): [JJ1],
            (0, 2): [JJ2],
            (1, 2): [L]}

Note that in the construction of circuit elements, we set id_str for the loop and inductive elements, which makes it easier later to identify the assignment of loop distributions. If we do not pick the id_str for the interested elements, SQcircuit assigns auto-generated id_str for elements.

In SQcircuit, we provided flux_dist option in circuit construction that specifies the method for assigning external fluxes to inductive elements. If flux_dist is set to "all", SQcircuit automatically assigns the external fluxes to junctions and inductors based on their capacitors. However, if it is set to "junction" or "inductor", SQcircuit discards the capacitor assignment of inductive elements and assumes that junction capacitors are much smaller than inductor capacitors for "junction" option and otherwise for "inductor" option.

By using loop_description() method, we can find the loop description for our circuit. Here, we expect the distribution of the flux to be equal among the elements since we set equal capacitors for each element.

[2]:
cr = sq.Circuit(elements, flux_dist='all')
cr.loop_description()
             loop1
----------------------------
JJ1, b1:     0.33333
JJ2, b2:     0.33333
ind, b3:     0.33333

For junction assignment (the default option in SQcircuit):

[3]:
cr = sq.Circuit(elements, flux_dist="junctions")
cr.loop_description()
             loop1
----------------------------
JJ1, b1:     0.5
JJ2, b2:     0.5
ind, b3:     0.0

and for inductor assignment:

[4]:
cr = sq.Circuit(elements, flux_dist="inductors")
cr.loop_description()
             loop1
----------------------------
JJ1, b1:     0.0
JJ2, b2:     0.0
ind, b3:     1.0