{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Basic Eigenmode Simulation of Transmon Coupled to a Resonator " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Qiskit Metal Design" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%reload_ext autoreload\n", "%autoreload 2\n", "\n", "import qiskit_metal as metal\n", "from qiskit_metal import designs, draw\n", "from qiskit_metal import MetalGUI, Dict, Headings\n", "import pyEPR as epr\n", "from qiskit_metal.qlibrary.terminations.open_to_ground import OpenToGround\n", "from qiskit_metal.qlibrary.tlines.meandered import RouteMeander\n", "from qiskit_metal.qlibrary.qubits.transmon_pocket import TransmonPocket\n", "\n", "design = designs.DesignPlanar({}, True)\n", "design.chips.main.size.center_x = '0.5mm'\n", "design.chips.main.size.center_y = '0.1mm'\n", "design.chips.main.size['size_x'] = '2.8mm'\n", "design.chips.main.size['size_y'] = '2mm'\n", "\n", "q1 = TransmonPocket(design, 'Q1', options = dict(\n", " pad_width = '425 um',\n", " pocket_height = '650um',\n", " connection_pads=dict(\n", " readout = dict(loc_W=+1,loc_H=+1, pad_width='200um')\n", " )))\n", "\n", "otg = OpenToGround(design, 'open_to_ground', options=dict(pos_x='1.75mm', pos_y='0um', orientation='0'))\n", "RouteMeander(design, 'readout', Dict(\n", " total_length='6 mm',\n", " hfss_wire_bonds = True,\n", " fillet='90 um',\n", " lead = dict(start_straight='100um'),\n", " pin_inputs=Dict(\n", " start_pin=Dict(component='Q1', pin='readout'),\n", " end_pin=Dict(component='open_to_ground', pin='open')), ))\n", "\n", "gui = MetalGUI(design)\n", "gui.rebuild()\n", "gui.autoscale()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Eigenmode Simulation\n", "\n", "Now to run the Palace simulation (*make sure to update the path to the Palace binary first*)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from SQDMetal.PALACE.Eigenmode_Simulation import PALACE_Eigenmode_Simulation\n", "from SQDMetal.Utilities.Materials import MaterialInterface\n", "\n", "#Eigenmode Simulation Options\n", "user_defined_options = {\n", " \"mesh_refinement\": 0, #refines mesh in PALACE - essetially divides every mesh element in half\n", " \"dielectric_material\": \"silicon\", #choose dielectric material - 'silicon' or 'sapphire'\n", " \"starting_freq\": 5.5e9, #starting frequency in Hz \n", " \"number_of_freqs\": 3, #number of eigenmodes to find\n", " \"solns_to_save\": 3, #number of electromagnetic field visualizations to save\n", " \"solver_order\": 2, #increasing solver order increases accuracy of simulation, but significantly increases sim time\n", " \"solver_tol\": 1.0e-8, #error residual tolerance for iterative solver\n", " \"solver_maxits\": 200, #number of solver iterations\n", " \"fillet_resolution\":12, #number of vertices per quarter turn on a filleted path\n", " \"palace_dir\":\"~/spack/opt/spack/linux-ubuntu24.04-zen2/gcc-13.3.0/palace-develop-36rxmgzatchgymg5tcbfz3qrmkf4jnmj/bin/palace\",#\"PATH/TO/PALACE/BINARY\",\n", " \"num_cpus\": 16\n", " }\n", "\n", "#Create the Palace Eigenmode simulation\n", "eigen_sim = PALACE_Eigenmode_Simulation(name ='Test1', #name of simulation\n", " metal_design = design, #feed in qiskit metal design\n", " sim_parent_directory = \"\", #choose directory where mesh file, config file and HPC batch file will be saved\n", " mode = 'simPC', #choose simulation mode 'HPC' or 'simPC' \n", " meshing = 'GMSH', #choose meshing 'GMSH' or 'COMSOL'\n", " user_options = user_defined_options, #provide options chosen above\n", " create_files = True) #create mesh and config files\n", "\n", "#add in metals from the first layer\n", "eigen_sim.add_metallic(1)\n", "\n", "#add ground plane into simulation\n", "eigen_sim.add_ground_plane()\n", "\n", "#Create a lumped element port for the Josephson junction and assign Jospehson inductance and junction capacitance\n", "eigen_sim.create_port_JosephsonJunction('Q1', L_J = 11e-9, C_J = 0e-15)\n", "\n", "#Fine mesh the qubit and resonator - min_size/max_size is the min/max mesh element size\n", "eigen_sim.fine_mesh_components(['Q1'], min_size=12e-6, max_size=100e-6, taper_dist_min=10e-6, metals_only=True)\n", "eigen_sim.fine_mesh_along_path(qObjName='readout', dist_resolution=10e-6, min_size=12e-6, max_size=150e-6, taper_dist_min=10e-6)\n", "\n", "#Lossy participatoin ratios calculated for MA, SA and MS\n", "eigen_sim.setup_EPR_interfaces(metal_air=MaterialInterface('Aluminium-Vacuum'), substrate_air=MaterialInterface('Silicon-Vacuum'), substrate_metal=MaterialInterface('Silicon-Aluminium'))\n", "\n", "#Prepare the simulation files - mesh file (.msh) and config file (.json)\n", "eigen_sim.prepare_simulation()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inspect the mesh before running the simulation" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "eigen_sim.open_mesh_gmsh()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Run the Simulation" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "eigen_sim.run()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Store the Hamiltonian parameters into a variable and print it as well for modes 1 and 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "hamil_params = eigen_sim.calculate_hamiltonian_parameters_EPR([1,2], print_output=True)" ] } ], "metadata": { "kernelspec": { "display_name": "testing_sqdmetal", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.14" } }, "nbformat": 4, "nbformat_minor": 2 }