{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Visualising modes\n",
"In this example, we use a simple approach to search for the modes of a split ring resonator, and visualise the corresponding current and charge distribution. These modes exist at complex frequencies (ie. values of $s$ with nonzero real parts), and are found using iterative search techniques"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# the numpy library contains useful mathematical functions\n",
"import numpy as np\n",
"\n",
"# import useful python libraries\n",
"import os.path as osp\n",
"\n",
"# import the openmodes packages\n",
"import openmodes\n",
"\n",
"# setup 2D plotting \n",
"%matplotlib inline\n",
"from openmodes.ipython import matplotlib_defaults\n",
"matplotlib_defaults()\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setup simulation\n",
"\n",
"First we load the geometry of a split ring from a file. Note how the geometric parameter `inner_radius` has been overriden to make the ring is slightly wider than in the previous example, for nicer plots."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Pruned cell types: vertex, line\n"
]
}
],
"source": [
"sim = openmodes.Simulation(notebook=True)\n",
"mesh = sim.load_mesh(osp.join(openmodes.geometry_dir, \"SRR.geo\"), parameters={'inner_radius': 2.5e-3}, mesh_tol=0.5e-3)\n",
"ring = sim.place_part(mesh)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Search for modes\n",
"Now we ask OpenModes to find the values of the complex frequency parameter `s` for which the system becomes singular. This is how we find the modes of the system, using an iterative search. Note that we need to specify a frequency at which to perform some intial estimations. The choice of this frequency is not too critical, but it should be somewhere in the frequency range of interest. Here we will calculate the 4 lowest order modes.\n",
"\n",
"Notice that this is a 3 step process. First estimates are given for the location of the modes. Then they are iteratively refined. Finally, the complex conjugate modes are added (at negative $\\omega$), as required for any physically realisable resonator."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9cbf25ecc2144563b9adb390022180ee",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(Label(value='Refining modes'), FloatProgress(value=0.0, max=3.0)))"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"start_freq = 2e9\n",
"start_s = 2j*np.pi*start_freq\n",
"\n",
"num_modes = 4\n",
"estimates = sim.estimate_poles(start_s, modes=num_modes, cauchy_integral=False)\n",
"refined = sim.refine_poles(estimates)\n",
"modes = refined.add_conjugates()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let us now plot the location of the modes in the complex s plane. The frequency of each mode is represented by their position on the $j\\omega$ axis, while the $\\Omega$ axis gives the damping, which is related to the width of the resonance."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"