{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Eigenmode Simulation of a X-Mon Qubit" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Qiskit Metal Design" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2\n", "import os\n", "os.environ[\"KMP_DUPLICATE_LIB_OK\"]=\"TRUE\"\n", "os.environ[\"PMIX_MCA_gds\"]=\"hash\"\n", "\n", "# Import useful packages\n", "import qiskit_metal as metal\n", "from qiskit_metal import designs, draw\n", "from qiskit_metal import MetalGUI, Dict, open_docs\n", "from qiskit_metal.toolbox_metal import math_and_overrides\n", "from qiskit_metal.qlibrary.core import QComponent\n", "from collections import OrderedDict\n", "\n", "# To create plots after geting solution data.\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "# Packages for the simple design\n", "from SQDMetal.Comps.Xmon import Xmon\n", "from SQDMetal.Comps.Junctions import JunctionDolanPinStretch\n", "\n", "# Set up chip design as planar, multiplanar also available\n", "design = designs.DesignPlanar({}, overwrite_enabled=True)\n", "\n", "# Set up chip dimensions \n", "design.chips.main.size.size_x = '500um'\n", "design.chips.main.size.size_y = '500um'\n", "design.chips.main.size.size_z = '500um'\n", "design.chips.main.size.center_x = '0mm'\n", "design.chips.main.size.center_y = '0mm'\n", "\n", "# Create the x-mon\n", "xmon = Xmon(design, 'x-mon', options=Dict(pos_x=0, pos_y=0,\n", " vBar_width='24um', hBar_width='24um', vBar_gap=f'{16}um', hBar_gap=f'{16}um',\n", " cross_width=f'{60*2+24}um', cross_height=f'{60*2+24}um',\n", " gap_up='24um', gap_left='24um', gap_right='24um', gap_down='24um'))\n", "\n", "# Create the Josephson junction\n", "JunctionDolanPinStretch(design, 'junction', options=Dict(pin_inputs=Dict(start_pin=Dict(component=f'x-mon',pin='right')),\n", " dist_extend='24um',\n", " layer=2,\n", " finger_width='0.4um', t_pad_size='0.385um',\n", " squid_width='5.4um', prong_width='0.9um'));\n", "\n", "# Rebuild the GUI\n", "gui = MetalGUI(design)\n", "gui.rebuild()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Palace Eigenmode Simulation \n", "(make sure to replace the entry to 'palace_dir' with the location of the binary for palace)" ] }, { "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\": 5e9, #starting frequency in Hz \n", " \"number_of_freqs\": 1, #number of eigenmodes to find\n", " \"solns_to_save\": 1, #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 foriterative 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 ='x-mon_test', #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, config and HPC batch files\n", "\n", "#Add in metals from layer 1 of the design file\n", "eigen_sim.add_metallic(1)\n", "\n", "#Add in ground plane for simulation\n", "eigen_sim.add_ground_plane()\n", "\n", "#Add in the Josephson junction as a lumped port\n", "eigen_sim.create_port_JosephsonJunction('junction', L_J=4.3e-9, C_J=10e-15)\n", "\n", "#Fine-mesh x-mon\n", "eigen_sim.fine_mesh_components(['x-mon'], min_size=8e-6, max_size=100e-6, taper_dist_min=10e-6, metals_only=False)\n", "\n", "#Sets up the lossy interfaces for MA, SA and MS interfaces \n", "eigen_sim.setup_EPR_interfaces(metal_air=MaterialInterface('Aluminium-Vacuum'), substrate_air=MaterialInterface('Silicon-Vacuum'), substrate_metal=MaterialInterface('Silicon-Aluminium'))\n", "\n", "#Prepares the mesh file and config file\n", "eigen_sim.prepare_simulation()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "#inspect the mesh before running the simulation\n", "eigen_sim.open_mesh_gmsh()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#run the simulation\n", "eigen_sim.run()" ] } ], "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 }