AdmittanceModels.jl is a package for creating and manipulating linear input-output models of the form `YΦ = Px`

, `y = QᵀΦ`

where `x`

are the inputs and `y`

are the outputs. One example of such a model is a Positive Second Order model, defined in [1]. Such models can capture the equations of motion of a circuit consisting of inductors, capacitors, and resistors.

The scripts in `paper`

were used to generate the figures in [1].

If you use this package in a publication, please cite our paper:

```
@article{ScheerBlock2018,
author = {Michael G. Scheer and Maxwell B. Block},
title = "{Computational modeling of decay and hybridization in superconducting circuits}",
year = "2018",
month = "Oct",
note = {arXiv:1810.11510},
archivePrefix = {arXiv},
eprint = {1810.11510},
primaryClass = {quant-ph},
}
```

[1] Computational modeling of decay and hybridization in superconducting circuits

Clone the repository from GitHub and install Julia 1.1. No build is required beyond the default Julia compilation.

## Example usage: the circuit in Appendix A of [1]

Construct the circuit in Appendix A, with arbitrarily chosen values.

```
using AdmittanceModels
vertices = collect(0:4)
circuit = Circuit(vertices)
set_capacitance!(circuit, 0, 1, 10.0)
set_capacitance!(circuit, 1, 2, 4.0)
set_capacitance!(circuit, 0, 3, 4.0)
set_capacitance!(circuit, 2, 3, 5.0)
set_capacitance!(circuit, 3, 4, 5.0)
set_inv_inductance!(circuit, 1, 2, 3.5)
set_inv_inductance!(circuit, 0, 3, 4.5)
```

Use the spanning tree in Appendix A to find a Positive Second Order model.

```
root = 0
edges = [(1, 0),
(3, 0),
(4, 0),
(2, 1)]
tree = SpanningTree(root, edges)
PSOModel(circuit, [(4, 0)], ["port"], tree)
```

The tree is optional because a change of spanning tree is simply an invertible change of coordinates.

`PSOModel(circuit, [(4, 0)], ["port"])`

The model we will analyze is similar the device shown below, from Manufacturing low dissipation superconducting quantum processors.

Create `CircuitComponent`

objects for the model.

```
using AdmittanceModels
ν = 1.2e8 # propagation_speed
Z0 = 50.0 # characteristic_impedance
δ = 100e-6 # discretization length
resonator = TransmissionLine(["coupler_0", "short"], ν, Z0, 5e-3, δ=δ)
tline = TransmissionLine(["in", "coupler_1", "out"], ν, Z0, 2e-3, locations=[1e-3], δ=δ)
coupler = SeriesComponent("coupler_0", "coupler_1", 0, 0, 10e-15)
components = [resonator, tline, coupler]
```

Use `PSOModel`

objects to compute the frequency and decay rate of quarter wave resonator mode. Include resistors at the ports in order to get the correct decay rate.

```
resistors = [ParallelComponent(name, 0, 1/Z0, 0) for name in ["in", "out"]]
pso = connect(PSOModel.([components; resistors]))
pso = short_ports(pso, "short")
λs, _ = lossy_modes_dense(pso, min_freq=3e9, max_freq=7e9)
freq = imag(λs[1])/(2π)
decay = -2*real(λs[1])/(2π)
```

Compute the transmission scattering parameters `Blackbox`

. This uses a closed form representation of the transmission lines.

```
ω = collect(range(freq - 2 * decay, stop=freq + 2 * decay, length=300)) * 2π
bbox = connect(Blackbox.(Ref(ω), components))
bbox = short_ports(bbox, "short")
bbox = open_ports_except(bbox, ["in", "out"])
S = [x[1,2] for x in scattering_matrices(bbox, [Z0, Z0])]
```

Plot the magnitude of the scattering parameters.

```
using PlotlyJS
plot(scatter(x=ω/(2π*1e9), y=abs.(S)), Layout(xaxis_title="Frequency [GHz]", yaxis_title="|S|"))
```

Plot the phase of the scattering parameters.

`plot(scatter(x=ω/(2π*1e9), y=angle.(S)), Layout(xaxis_title="Frequency [GHz]", yaxis_title="Phase(S)"))`

Plain text files containing RLGC parameters exported by ANSYS® Q3D Extractor®
software can be used to construct a `Circuit`

object via `Circuit(file_path)`

.
Currently only capacitance matrices are supported.

ANSYS and Q3D Extractor are registered trademarks of ANSYS, Inc. or its subsidiaries in the United States or other countries.