{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "12dee218",
   "metadata": {},
   "source": [
    "# Tunable Mach-Zehnder interferometer based on directional couplers\n",
    "\n",
    "**Author: Arvind Saravanakumar, UC Davis**\n",
    "\n",
    "This notebook demonstrates the design and simulation of a tunable silicon photonic Mach-Zehnder interferometer using Tidy3D. The device consists of two directional couplers (3 dB coupling length) connected by two waveguide arms, with one arm containing a phase-shift section. This optimized coupler is then used to construct the MZI, and the phase-section refractive index is swept to demonstrate tunable power transfer between the two output ports.\n",
    "\n",
    "The notebook highlights how interferometric switching can be modeled using full-wave FDTD simulations and mode monitors. It also connects the device behavior to the 2×2 matrix representation commonly used for programmable photonic circuits.\n",
    "\n",
    "<img src=\"./img/tunable_mzi_transparent_compact.png\" alt=\"Tunable MZI render\" width=\"500\">\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "846e54db",
   "metadata": {},
   "source": [
    "## Simulation Setup\n",
    "\n",
    "Define the optical wavelength range, waveguide cross section, material indices, and simulation domain. The helper functions in this section assemble the directional couplers, straight waveguide arms, source, and monitors into a reusable MZI model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "a89f01bb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MZI geometry summary\n",
      "--------------------\n",
      "Coupler total length: 26.180 um\n",
      "Coupler 1 center x:   -23.090 um\n",
      "Coupler 2 center x:   23.090 um\n",
      "MZI x min:            -36.180 um\n",
      "MZI x max:            36.180 um\n",
      "MZI total length:     72.360 um\n",
      "\n",
      "Simulation domain\n",
      "-----------------\n",
      "x span: 80.360 um\n",
      "y span: 8.000 um\n",
      "z span: 3.000 um\n",
      "source x:  -35.680 um\n",
      "monitor x: 35.680 um\n"
     ]
    }
   ],
   "source": [
    "import tidy3d as td\n",
    "import tidy3d.web as web\n",
    "import numpy as np\n",
    "import gdstk\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# ============================================================\n",
    "# Parameterized tunable MZI in Tidy3D\n",
    "# Two directional couplers + one phase-shifted arm\n",
    "# Units: microns\n",
    "# ============================================================\n",
    "\n",
    "# ------------------------------------------------------------\n",
    "# User parameters\n",
    "# ------------------------------------------------------------\n",
    "\n",
    "# Wavelength settings\n",
    "lambda0 = 1.55\n",
    "lambda_min = 1.50\n",
    "lambda_max = 1.60\n",
    "num_freqs = 10\n",
    "\n",
    "freq0 = td.C_0 / lambda0\n",
    "freqs = td.C_0 / np.linspace(lambda_min, lambda_max, num_freqs)\n",
    "\n",
    "# Waveguide geometry\n",
    "wg_width = 0.45  # um, y direction\n",
    "wg_thickness = 0.22  # um, z direction\n",
    "\n",
    "# Coupler geometry\n",
    "wg_spacing_in = 5.0  # um, center-to-center spacing of separated arms\n",
    "wg_spacing_coup = 0.20  # um, edge-to-edge gap in coupling region\n",
    "wg_length = 3.0  # um, straight input/output length in each coupler\n",
    "coup_length = 12.18  # um, 3 dB coupling length found from Tidy3D\n",
    "bend_length = 4.0  # um, cosine S-bend length\n",
    "sidewall_angle = 0.0\n",
    "\n",
    "# MZI geometry\n",
    "phase_length = 20.0  # um, straight phase-shifter section between couplers\n",
    "phase_arm = \"top\"  # \"top\" or \"bottom\"\n",
    "\n",
    "# Material indices for simple lossless simulation\n",
    "n_sio2 = 1.44\n",
    "n_si = 3.48\n",
    "phase_index = 3.52  # use 3.48 for passive MZI, larger for phase shift\n",
    "\n",
    "# Simulation settings\n",
    "sim_y_span = 8.0\n",
    "sim_z_span = 3.0\n",
    "sim_x_padding = 8.0\n",
    "runtime = 8e-12\n",
    "\n",
    "# Source/monitor settings\n",
    "num_modes = 4\n",
    "mode_plane_y = 2.0\n",
    "mode_plane_z = 1.5\n",
    "\n",
    "# Total length of one directional coupler object\n",
    "dc_total_length = 2 * wg_length + 2 * bend_length + coup_length\n",
    "\n",
    "# Center the two couplers around x = 0\n",
    "dc_spacing = dc_total_length + phase_length\n",
    "dc1_x = -dc_spacing / 2\n",
    "dc2_x = +dc_spacing / 2\n",
    "arm_x = 0.0\n",
    "top_y = +wg_spacing_in / 2\n",
    "bottom_y = -wg_spacing_in / 2\n",
    "\n",
    "mzi_x_min = dc1_x - dc_total_length / 2\n",
    "mzi_x_max = dc2_x + dc_total_length / 2\n",
    "mzi_length = mzi_x_max - mzi_x_min\n",
    "\n",
    "# Source and monitor positions\n",
    "source_x = mzi_x_min + 0.5\n",
    "monitor_x = mzi_x_max - 0.5\n",
    "\n",
    "# ------------------------------------------------------------\n",
    "# Materials\n",
    "# ------------------------------------------------------------\n",
    "\n",
    "sio2 = td.Medium(\n",
    "    name=\"SiO2_lossless\",\n",
    "    permittivity=n_sio2**2,\n",
    ")\n",
    "si = td.Medium(\n",
    "    name=\"Si_lossless\",\n",
    "    permittivity=n_si**2,\n",
    ")\n",
    "\n",
    "# ------------------------------------------------------------\n",
    "# Mode specification\n",
    "# ------------------------------------------------------------\n",
    "\n",
    "mode_spec = td.ModeSpec(\n",
    "    num_modes=num_modes,\n",
    "    sort_spec={\n",
    "        \"filter_reference\": 0,\n",
    "        \"filter_order\": \"over\",\n",
    "        \"sort_key\": \"n_eff\",\n",
    "        \"track_freq\": \"central\",\n",
    "        \"keep_modes\": \"all\",\n",
    "    },\n",
    "    group_index_step=True,\n",
    ")\n",
    "\n",
    "\n",
    "# ------------------------------------------------------------\n",
    "# Directional coupler structure generator\n",
    "# ------------------------------------------------------------\n",
    "\n",
    "\n",
    "def make_directional_coupler(x0, name):\n",
    "    \"\"\"\n",
    "    Creates one symmetric directional coupler centered at x = x0.\n",
    "\n",
    "    The coupler contains:\n",
    "    separated input arms -> cosine S-bend -> parallel coupling region\n",
    "    -> cosine S-bend -> separated output arms.\n",
    "    \"\"\"\n",
    "\n",
    "    cell = gdstk.Cell(name)\n",
    "\n",
    "    # Top path starts on the upper separated arm.\n",
    "    x_start = -wg_length - bend_length - coup_length / 2 + x0\n",
    "    y_start = wg_spacing_in / 2\n",
    "\n",
    "    top_path = gdstk.RobustPath(\n",
    "        (x_start, y_start),\n",
    "        wg_width,\n",
    "        layer=1,\n",
    "        datatype=0,\n",
    "    )\n",
    "\n",
    "    # Left straight section\n",
    "    top_path.segment((-bend_length - coup_length / 2 + x0, y_start))\n",
    "\n",
    "    # The center-to-center spacing in coupling region is:\n",
    "    # wg_width + wg_spacing_coup\n",
    "    A = (wg_spacing_in - wg_spacing_coup - wg_width) / 4\n",
    "\n",
    "    # Bend into coupling region\n",
    "    top_path.segment(\n",
    "        (-coup_length / 2 + x0, y_start),\n",
    "        offset=lambda u: A * np.cos(np.pi * u) - A,\n",
    "    )\n",
    "\n",
    "    # Parallel coupling region\n",
    "    top_path.segment((coup_length / 2 + x0, y_start))\n",
    "\n",
    "    # Bend out of coupling region\n",
    "    top_path.segment(\n",
    "        (bend_length + coup_length / 2 + x0, y_start),\n",
    "        offset=lambda u: -A * np.cos(np.pi * u) - A,\n",
    "    )\n",
    "\n",
    "    # Right straight section\n",
    "    top_path.segment((wg_length + bend_length + coup_length / 2 + x0, y_start))\n",
    "\n",
    "    cell.add(top_path)\n",
    "\n",
    "    # Bottom path is mirrored across y = 0.\n",
    "    bottom_path = top_path.copy().mirror((0, 0), (1, 0))\n",
    "    cell.add(bottom_path)\n",
    "\n",
    "    # Convert GDS paths into a 3D Tidy3D PolySlab.\n",
    "    dc_geo = td.PolySlab.from_gds(\n",
    "        cell,\n",
    "        gds_layer=1,\n",
    "        axis=2,\n",
    "        slab_bounds=(-wg_thickness / 2, wg_thickness / 2),\n",
    "        sidewall_angle=sidewall_angle,\n",
    "    )\n",
    "\n",
    "    return td.Structure(\n",
    "        geometry=td.GeometryGroup(geometries=dc_geo),\n",
    "        medium=si,\n",
    "        name=name,\n",
    "    )\n",
    "\n",
    "\n",
    "# ------------------------------------------------------------\n",
    "# Straight arm generator\n",
    "# ------------------------------------------------------------\n",
    "\n",
    "\n",
    "def make_straight_arm(x_center, y_center, medium, name):\n",
    "    \"\"\"\n",
    "    Creates a straight waveguide section between the two couplers.\n",
    "    \"\"\"\n",
    "\n",
    "    return td.Structure(\n",
    "        geometry=td.Box(\n",
    "            center=(x_center, y_center, 0),\n",
    "            size=(phase_length, wg_width, wg_thickness),\n",
    "        ),\n",
    "        medium=medium,\n",
    "        name=name,\n",
    "    )\n",
    "\n",
    "\n",
    "# ------------------------------------------------------------\n",
    "# Simulation generator\n",
    "# ------------------------------------------------------------\n",
    "\n",
    "\n",
    "def make_mzi_sim(phase_index_value):\n",
    "    \"\"\"\n",
    "    Builds one tunable MZI simulation for a given phase-section material index.\n",
    "    \"\"\"\n",
    "    phase_medium = td.Medium(\n",
    "        name=f\"phase_shift_medium_n_{phase_index_value:.4f}\",\n",
    "        permittivity=phase_index_value**2,\n",
    "    )\n",
    "\n",
    "    # Build couplers\n",
    "    dc1 = make_directional_coupler(dc1_x, \"directional_coupler_1\")\n",
    "    dc2 = make_directional_coupler(dc2_x, \"directional_coupler_2\")\n",
    "\n",
    "    # Choose which arm is phase shifted\n",
    "    if phase_arm.lower() == \"top\":\n",
    "        top_medium = phase_medium\n",
    "        bottom_medium = si\n",
    "        top_name = \"top_phase_shifter\"\n",
    "        bottom_name = \"bottom_connector\"\n",
    "\n",
    "    elif phase_arm.lower() == \"bottom\":\n",
    "        top_medium = si\n",
    "        bottom_medium = phase_medium\n",
    "        top_name = \"top_connector\"\n",
    "        bottom_name = \"bottom_phase_shifter\"\n",
    "\n",
    "    else:\n",
    "        raise ValueError(\"phase_arm must be either 'top' or 'bottom'.\")\n",
    "\n",
    "    top_arm = make_straight_arm(\n",
    "        x_center=arm_x,\n",
    "        y_center=top_y,\n",
    "        medium=top_medium,\n",
    "        name=top_name,\n",
    "    )\n",
    "    bottom_arm = make_straight_arm(\n",
    "        x_center=arm_x,\n",
    "        y_center=bottom_y,\n",
    "        medium=bottom_medium,\n",
    "        name=bottom_name,\n",
    "    )\n",
    "    waveguides = [\n",
    "        make_straight_arm(\n",
    "            x_center=(dc_total_length + phase_length) * sign,\n",
    "            y_center=y,\n",
    "            medium=si,\n",
    "            name=f\"waveguide_{ii}_{jj}\",\n",
    "        )\n",
    "        for ii, y in enumerate([top_y, bottom_y])\n",
    "        for jj, sign in enumerate([-1, 1])\n",
    "    ]\n",
    "\n",
    "    structures = [dc1, dc2, top_arm, bottom_arm] + waveguides\n",
    "\n",
    "    source = td.ModeSource(\n",
    "        name=\"input_mode_source\",\n",
    "        center=(source_x, bottom_y, 0),\n",
    "        size=(0, mode_plane_y, mode_plane_z),\n",
    "        source_time=td.GaussianPulse(\n",
    "            freq0=freq0,\n",
    "            fwidth=freq0 / 10,\n",
    "        ),\n",
    "        direction=\"+\",\n",
    "        mode_spec=mode_spec,\n",
    "    )\n",
    "\n",
    "    top_monitor = td.ModeMonitor(\n",
    "        name=\"top_output_mode_monitor\",\n",
    "        center=(monitor_x, top_y, 0),\n",
    "        size=(0, mode_plane_y, mode_plane_z),\n",
    "        freqs=freqs,\n",
    "        mode_spec=mode_spec,\n",
    "    )\n",
    "    bottom_monitor = td.ModeMonitor(\n",
    "        name=\"bottom_output_mode_monitor\",\n",
    "        center=(monitor_x, bottom_y, 0),\n",
    "        size=(0, mode_plane_y, mode_plane_z),\n",
    "        freqs=freqs,\n",
    "        mode_spec=mode_spec,\n",
    "    )\n",
    "    field_monitor = td.FieldMonitor(\n",
    "        name=\"field_xy\",\n",
    "        center=(0, 0, 0),\n",
    "        size=(mzi_length, sim_y_span - 1.0, 0),\n",
    "        freqs=[freq0],\n",
    "        fields=[\"Ex\", \"Ey\", \"Ez\"],\n",
    "    )\n",
    "\n",
    "    sim = td.Simulation(\n",
    "        center=(0, 0, 0),\n",
    "        size=(mzi_length + sim_x_padding, sim_y_span, sim_z_span),\n",
    "        grid_spec=td.GridSpec.auto(wavelength=lambda0),\n",
    "        run_time=runtime,\n",
    "        medium=sio2,\n",
    "        structures=structures,\n",
    "        sources=[source],\n",
    "        monitors=[top_monitor, bottom_monitor, field_monitor],\n",
    "    )\n",
    "    return sim\n",
    "\n",
    "\n",
    "print(\"MZI geometry summary\")\n",
    "print(\"--------------------\")\n",
    "print(f\"Coupler total length: {dc_total_length:.3f} um\")\n",
    "print(f\"Coupler 1 center x:   {dc1_x:.3f} um\")\n",
    "print(f\"Coupler 2 center x:   {dc2_x:.3f} um\")\n",
    "print(f\"MZI x min:            {mzi_x_min:.3f} um\")\n",
    "print(f\"MZI x max:            {mzi_x_max:.3f} um\")\n",
    "print(f\"MZI total length:     {mzi_length:.3f} um\")\n",
    "\n",
    "print()\n",
    "print(\"Simulation domain\")\n",
    "print(\"-----------------\")\n",
    "print(f\"x span: {mzi_length + sim_x_padding:.3f} um\")\n",
    "print(f\"y span: {sim_y_span:.3f} um\")\n",
    "print(f\"z span: {sim_z_span:.3f} um\")\n",
    "print(f\"source x:  {source_x:.3f} um\")\n",
    "print(f\"monitor x: {monitor_x:.3f} um\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1dc83ca3",
   "metadata": {},
   "source": [
    "### Geometry Preview\n",
    "\n",
    "Plot the baseline device layout before launching the sweep. This check confirms the couplers, arms, phase-shifting section, source, and output monitors are positioned as expected."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "78b508a1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABKQAAADiCAYAAABwbR+yAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAcYxJREFUeJzt3Qd8G/X5P/CPhvfeI05sZ+9BgAxmISVhQymU/Cl7lQKF0pY2lL3Cahkts2W2UCDsQgiFMLPJIIMMsmwn3nsvSfd/PV9z/smKpi3Jsv15v15KrNNJOt3d93T36Pk+X4OmaRqIiIiIiIiIiIiCxBisNyIiIiIiIiIiIhIMSBERERERERERUVAxIEVEREREREREREHFgBQREREREREREQUVA1JERERERERERBRUDEgREREREREREVFQMSBFRERERERERERBxYAUEREREREREREFFQNSREREREREREQUVAxIERERDXHHH3+8ugXTl19+CYPBoP4fiPLy8nDaaacN+s9J5K1LLrlEtQt7su/feeedXIlEROQUA1JERDQgvPTSS+riRr9FRkZi7NixuO6661BeXo7BbNWqVeqirq6uDkPNUP7szhQUFHS3gXvvvdfpPBdccIF6PDY21mX7cXWT17eff/369UH7bKHs/vvvx3vvvdffi0FERDSomPt7AYiIiHxx9913Iz8/H21tbVixYgWefvppLF26FNu2bUN0dPSgDcrcddddKgMhMTHR76//v//9D0P1sw9UEpD9z3/+g1tvvbXH9ObmZrz//vvqcXvHHnss/vWvfzl9reLiYixatEhlt6Snpwd0uQdyQOrnP/85zjrrrP5elAGltbUVZjMvN4iIyDl+QxAR0YBy8skn4/DDD1d/X3HFFUhJScFf//pXdRG+cOHCXr+uzWZDR0fHIRfyg1lLS4sK4oWHh/f3opCPTjnlFLzzzjvYvHkzpk2b1j1d2oHsxwsWLMDnn3/ePX3kyJHq5shqteKEE05QQQMJcA3WoG4wSVAwJiamvxcjJAyl4ykREfmOXfaIiGhAk4tpsX//fvX/I488grlz56pAVVRUFGbOnIm33nrrkOdJdyTp7vfqq69i0qRJiIiIwLJly3r1GkuWLMHEiRPVvHPmzMHWrVvV488++yxGjx6tLsqkRpPeHcre2rVrVfAgISFBBQOOO+44rFy5svtx6a72hz/8Qf0tmWGOXavEv//9b7WM8v7Jyck4//zzceDAgR7vI+8/efJkbNiwQWXLyHvdcsstTmtISaaMqy5d9rWQJLPmsssuQ0ZGhlp/sh5feOGFQz7jwYMHVWaJXKRLBs5vf/tbtLe3u92unj673nVNupY52y72dWvkb5m2Z8+e7kwrWd+XXnqpCsrZe/HFF9U+Jcspn0m2q2Thucsumz59utrGMq8Eibzhabt7IvuZrJPXXnutx3TZn+V1ZT/whmSfff3116r736xZs9AbW7ZsUcsv+19OTo56LVmPjvup+Pjjj3HMMceofSEuLg6nnnoqvv/++0NeU4Jp+nyyvc4880zs2LGjxzz6dv3hhx/wy1/+Uq3LtLQ03HbbbdA0TbUBeV58fDwyMzPxl7/85ZD3kf3wjjvuUO1Utvfw4cNx880399g/5T0kyPTyyy9374OyH9kvw/bt2/H//t//Q1JSEo4++ujuz79p0yan2VYmk0m1H1/IchqNRixfvrzH9KuuukoFlSU46Upfl6exsRE33nijOjbIepL28dOf/hQbN250u8zOakjJ+1x++eXIzs5WryX78TXXXKMCqTrpoivvJ9tD5pHt8+CDD6ofDoiIaPBghhQREQ1oe/fuVf9L8Eg8/vjjOOOMM1QdHbnAef3113Huuefiww8/VBe/jhe9b775pgoqpaamdhfk9eU1vvnmG3zwwQe49tpr1f3FixerYtdyUfvUU0/h17/+NWpra/HQQw+p4I191or8LRlfEkzSLzb1gIi87pFHHomf/exn6oJbslceffRRtZxCLrzFfffdpy7AzzvvPJUxVllZib/97W8q6CQXn/bd3Kqrq9X7ScBKLuAlkOTMY489hqamph7T5L2/++677vUsdbtmz57dHZST5ZFgg1xoNjQ0qItJvcvOiSeeiKKiIvzmN79RF6HSdcx+Pbji7rPL5/SVrCO5+JVtJBfS//znP9WFtVzo6iT4JIE12f6SNfTf//5XbUO5ENa3sW737t34xS9+gV/96le4+OKL1baT/UQCm3Kx7oo3290bkhEowcgHHnhAbYeqqioVIJP1qwdX3ZHlkP1n/vz53YE/X0lw4Sc/+Yl6f+n2JwEkWa8SRHAkyyXrSd5P1rkEA2V9SwBH9lW9/X322Wdq/UhGlwQzZB+Sffqoo45S282xcLZsgwkTJqj18NFHH6mAmATkJCAs61TeSwJ1v//973HEEUeotiFkm8p2lq6/EtSR15Bgsuxrst/pNaNkuaVtyXaR+cSoUaN6LINs9zFjxqjgjgTDpHuf7C/yvjNmzOgxr0yTAPCwYcN8WtfSPVP2R2ljspwS0Pvkk0/wj3/8A/fcc0+PTDlHfV0e2cclKC9tXQKvciyR9SZBwsMOO8zrz1BSUqLWowScZF2OHz9e7UPy2rI/SGBN/pcAp0y/+uqrMWLECNV1V/av0tJSdXwiIqJBQiMiIhoAXnzxRU2+tj777DOtsrJSO3DggPb6669rKSkpWlRUlHbw4EE1X0tLS4/ndXR0aJMnT9ZOOOGEHtPltYxGo/b9998f8l6+vEZERIS2f//+7mnPPvusmp6Zmak1NDR0T1+0aJGars9rs9m0MWPGaPPnz1d/2793fn6+9tOf/rR72sMPP9zjubqCggLNZDJp9913X4/pW7du1cxmc4/pxx13nHqNZ5555pDPK4/JzZU333xTPffuu+/unnb55ZdrWVlZWlVVVY95zz//fC0hIaF7HT722GPqufIauubmZm306NFq+hdffOHyfd19drkv02W/cCTT77jjju778rdMu+yyy3rMd/bZZ6v9x922F7KNRo4c2WNabm6ues233367e1p9fb1aJzNmzOieJp/P/nP6st2d0T+3rJdt27apv7/55hv12JNPPqnFxsaq9XvxxRdrMTExLl+nvLxcLavsp/K3q/b27bfful2e66+/XjMYDNqmTZu6p1VXV2vJyck9tltjY6OWmJioXXnllT2eX1ZWpvYX++nTp0/X0tPT1evoNm/erNrrRRdddMh2veqqq7qnWSwWLScnRy3TAw880D29trZWHSdkvej+9a9/qdfU159O2oi87sqVK7unybq0f67jMixcuPCQx2Radna2ZrVau6dt3LjR5X7rDWnb4eHh2hVXXKE+07Bhw7TDDz9c6+zs9PjcviyPbKNrr73W7TyyfqRduGuLsv1knTvbr/T2cM8996j1/cMPP/R4/E9/+pM63hUVFXn4pERENFCwyx4REQ0o8+bNUxky0pVDMn1kJLF33323+9d96Takk8yk+vp61fXHWdcS+RVefu135MtrSPaPfcaG3u3pnHPOURkMjtP37dun/pdsI8mwkW4+km0g2S1yk65B8prSjcpT9xTpHibzSOaP/ny5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kv6Sul/84heorKzE7bffrrq1TZ8+HcuWLetR6PzRRx9VK0yCXdLda/78+Xjqqad8Wj55fk5Ojlfz+rvmFA0e3DeI+wXxeEH8LiGeYxDPPam/8bqEerNf+CszKuQypAZLVFE2kNRFYkCKuG8QjxnE7xLieQbx/JP6A69LiPsGDYRjRr+NskdEREREREREREMTA1J+JF0L77jjjh5dDIm4bxCPGcTvEuJ5BgUKzz+J+wXxmEED9buEXfaIiIiIiIiIiCiomCFFRERERERERERBxYAUEREREREREREFFQNSREREREREREQUVAxIERERERERERFRUDEg5cavfvUrGAwGPPbYYz2m19TU4IILLkB8fDwSExNx+eWXo6mpye2Kbmtrw7XXXouUlBTExsbinHPOQXl5eY95ioqKcOqppyI6Ohrp6en4wx/+AIvF0pftS35y5513Yvz48YiJiUFSUhLmzZuHtWvX9piH+8XQ0tnZiT/+8Y+YMmWK2i+ys7Nx0UUXoaSkpMd83C+GpnfeeQcnnXSSOubL98h3333Xq+8FR5qm4fbbb0dWVhaioqLUsWj37t193ueofzz55JPIy8tDZGQkZs2ahXXr1rmdf8mSJeq7SOaXY8/SpUt93j8otHz99dc4/fTT1XeIHCvee+89v2xTT/tWb44/FDyLFy/GEUccgbi4OHVNcNZZZ2HXrl095uF3yNDz9NNPY+rUqer7XW5z5szBxx9/3P049wkSDzzwgPo+ufHGGzEg9g2NnHrnnXe0adOmadnZ2dqjjz7a47EFCxaox9asWaN988032ujRo7WFCxe6XZO/+tWvtOHDh2vLly/X1q9fr82ePVubO3du9+MWi0WbPHmyNm/ePG3Tpk3a0qVLtdTUVG3RokXcQiHg1Vdf1T799FNt79692rZt27TLL79ci4+P1yoqKrrn4X4xtNTV1an2+sYbb2g7d+7UVq9erR155JHazJkze8zH/WJoeuWVV7S77rpL+8c//qHJV60c1339XnDmgQce0BISErT33ntP27x5s3bGGWdo+fn5Wmtra5/2OQq+119/XQsPD9deeOEF7fvvv9euvPJKLTExUSsvL3c6/8qVKzWTyaQ99NBD2vbt27Vbb71VCwsL07Zu3erT/kGhRc73/vznP6vzTjlWvPvuuz0e78029Wbf6s3xh4Jn/vz52osvvqjOOb/77jvtlFNO0UaMGKE1NTV1z8PvkKHngw8+0D766CPthx9+0Hbt2qXdcsst6ntA9hPBfYLWrVun5eXlaVOnTtVuuOGG7hUSyvsGA1JOHDx4UBs2bJhq3Lm5uT0CUnISKCcM3377bfe0jz/+WDMYDFpxcbHLC1c5WCxZsqR72o4dO9TryEWsfkJiNBq1srKy7nmefvppFfRob2/3aaNS4NXX16vt99lnn6n73C9I/xKQ/aKwsJD7BSn79+93GpDy5nvBkc1m0zIzM7WHH364x+tERERo//nPf3q9z1H/kAD2tdde233farWqH8EWL17sdP7zzjtPO/XUU3tMmzVrlnb11Vd7vX9QaHMMSPV2m3rat3pz/KH+JT+Ayvb56quv1H1+h5AuKSlJ++c//8l9grTGxkZtzJgxKoniuOOO6w5Ihfrxgl32HNhsNlx44YWqu9ykSZMOyShbvXq1Skc7/PDDu6dJ+prRaDykC5duw4YNqnuPzKeTlPsRI0ao19NfV9LvMzIyuueZP38+Ghoa8P333/uW9kYB1dHRgeeeew4JCQmYNm2amsb9gkR9fb1KkZVjBPcLcseb7wVH+/fvR1lZWY/nyHFIuuPYf5f4+h1F/fM9IvuA/baUbST3XW1/mW4/v36eoM/vzf5BA0tvtqk3+1Zvjj/U/+cXIjk5Wf3P7xCyWq14/fXX0dzcrLrucZ+ga6+9VpX/cTxXCPV9w8xN19ODDz4Is9mM3/zmN05XjWwY6cvdYyWazeoLQh5z9Zzw8PDui1SdBJ/058j/9sEo/XH9Mep/H374Ic4//3y0tLSovrSffvopUlNT1WPcL0j6ZktNqYULF6p+1NwvyB1vvhecPUefx9VzenMsouCrqqpSFxPOtuXOnTudPsfVeYL9ttenuZqHBpbebFNv9q3eHH+of38sl1owRx11FCZPnqym8Ttk6Nq6dasKQMl5p9QCevfddzFx4kRVq5LnFUPX66+/jo0bN+Lbb7895LFQP14M6QypV199VTVk/fbVV1/h8ccfx0svvaSyHGhoctwvvvnmGzX9Jz/5iTrYr1q1CgsWLMB5552HioqK/l5c6uf9QsivDrI/SI8LKThJQ4u7fYOIiKivWQ/btm1TF5xE48aNU9cjkoFyzTXX4OKLL8b27du5YoawAwcO4IYbblDnozKQxUAzpANSZ5xxhmrQ+k0CDRJgkPQ1ie7JrbCwEL/73e/USCUiMzPzkCCEjIQnFeblMWdkuqRQ19XV9Zgule3158j/jpXu9fuuXpeCs1/oaYgyktro0aMxe/ZsPP/882r/kP/1bcT9YmjuF3owSo4VkjWnZ0cJ7hdDe99wx5vvBWfP0edx9Zze7HMUfJJdazKZ3G5LR67OE+y3vT7N29ek0NabberNvtWb4w/1j+uuu05l6H/xxRfIycnpns7vkKFLMl3kemTmzJlqNEYpHyIJFdwnhq4NGzaoc7/DDjusO4YhiTZPPPGE+luymkL5nHNIB6RkKFVp0PrtqquuwpYtW3pcWMgwvFJP6pNPPlHPkRRJ2Ziy4XWff/65SqeVPpXOyAEjLCwMy5cv754mQ7cWFRWp19NfV1Iw7TeqfnEraZjUf/uFDHPpjGzz9vZ29Tf3i6G5X+jBKBkC9bPPPlNDqdrjfjE0eHvM8PV7wVF+fr76grd/jtQZlF9J7b9LfP2Oov65oJB9wH5byjaS+662v0y3n18/T9Dn92b/oIGlN9vUm32rN8cfCi7JuJZglHTHkmO47Av2+B1Cjtcj3CeGrhNPPFHFERx/HL3gggu6/w7pc04WpHfPcZQ9fXjDGTNmaGvXrtVWrFihqtnbD28oo/SNGzdOPW4/1KIM1/r555+roRbnzJmjbjqLxaJNnjxZO+mkk9TwrsuWLdPS0tK0RYsWcRP1MxliV7aDjEJQUFCgtt+ll16qRhnQh1kV3C+Glo6ODjX8aU5OjmqzpaWl3Tf7kTG5XwxN1dXVamQ9GZ5ZvmplGHa5L/uHt98LQr5LZDh4+yF4Zfj2999/X9uyZYt25plnOh2C1913FIUG2Sfke+Sll15SI9VcddVVatvqo+1eeOGF2p/+9Kfu+VeuXKmZzWbtkUceUaPj3HHHHWrUnK1bt/q0f1DojYokxwa5ybHir3/9q/pbH63Vm216wgknaH/729+83re8Pf5Q/7nmmmvUcOtffvllj/OLlpaW7nn4HTL0yHeCjLQoI/jK8UDuy4hm//vf/9Tj3CdIZz/KXqjvGwxI9SIgJRcasqJjY2O1+Ph4FZyQEwrHYb6/+OKL7mmy4X7961+roTmjo6O1s88+u8eFiZBgx8knn6xFRUVpqamp2u9+9zuts7PTpw1K/ifbTraXDJkcHh6uZWVlqUDEunXreszH/WJo0du5s5t92+d+MTS9+OKLTvcNCSL48r0gz5HXsh+G97bbbtMyMjLUBeeJJ56o7dq1q8dzPO1zFDokiCAniPLdcuSRR2pr1qzpcTJ58cUX95j/zTff1MaOHavmnzRpkgp42vNm/6DQIt8Xzo4V+rb3ZpvKuar9scXTvuXt8Yf6j6vzC/vvA36HDD2XXXaZau/SriVxQY4HejBKcJ8gVwGpUN43DD++ORERERERERERUVAM6RpSREREREREREQUfAxIERERERERERFRUDEgRUREREREREREQcWAFBERERERERERBRUDUkREREREREREFFQMSBERERERERERUVAxIEVEREREREREREHFgBQREREREREREQUVA1JEREREIeL555/HSSedFPD3WbZsGaZPnw6bzRbw9yIiIiJyhgEpIiIiohDQ1taG2267DXfccUfA32vBggUICwvDq6++GvD3IiIiInKGASkiIiKiEPDWW28hPj4eRx11VFDe75JLLsETTzwRlPciIiIicsSAFBEREZEfVVZWIjMzE/fff3/3tFWrViE8PBzLly93+bzXX38dp59+eo9pxx9/PG688cYe08466ywVTNLl5eXh3nvvxUUXXYTY2Fjk5ubigw8+UMtx5plnqmlTp07F+vXre7yOvJdM27t3rx8+NREREZFvGJAiIiIi8qO0tDS88MILuPPOO1XAp7GxERdeeCGuu+46nHjiiS6ft2LFChx++OG9es9HH31UZVZt2rQJp556qno/CVD98pe/xMaNGzFq1Ch1X9O07ueMGDECGRkZ+Oabb3r1nkRERER9wYAUERERkZ+dcsopuPLKK3HBBRfgV7/6FWJiYrB48WKX89fV1aG+vh7Z2dm9fr+rr74aY8aMwe23346GhgYcccQROPfcczF27Fj88Y9/xI4dO1BeXt7jefJ+hYWFvXpPIiIior5gQIqIiIgoAB555BFYLBYsWbJEFQ+PiIhwOW9ra6v6PzIyslfvJV3ydJL1JKZMmXLItIqKih7Pi4qKQktLS6/ek4iIiKgvGJAiIiIiCgCpzVRSUgKbzYaCggK386akpMBgMKC2ttbj61qt1kOmyYh5OnkdV9NkWezV1NSoLoZEREREwcaAFBEREZGfdXR0qPpNv/jFL3DPPffgiiuuOCQ7yZ4UPJ84cSK2b99+yGOO3ez27dvnl2Vsa2tTQbMZM2b45fWIiIiIfMGAFBEREZGf/fnPf1Y1oZ544glVv0nqOF122WVunzN//nxV2NzR+++/j3feeUcFj+677z4VtJK6T8XFxX1axjVr1qhuhHPmzOnT6xARERH1BgNSRERERH705Zdf4rHHHsO//vUvxMfHw2g0qr9lNLunn37a5fMuv/xyLF26VAWy7MmoeQ899JDKoPr666/x1FNPYd26deo1++I///mPKroeHR3dp9chIiIi6g2DZj/+LxERERH1GxkV77DDDsOiRYvU/eOPPx7Tp09XAS5/qqqqwrhx47B+/Xrk5+f79bWJiIiIvMEMKSIiIqIQ8fDDDyM2Njbg7yNF1iXTisEoIiIi6i/MkCIiIiIKUYHKkCIiIiLqbwxIERERERERERFRULHLHhERERERERERBRUDUkREREREREREFFQMSBERERERERERUVAxIEVEREREREREREHFgBQREREREREREQUVA1JERERERERERBRUDEgREREREREREVFQMSBFREREREREREQIpv8PJSjhi/E+ks8AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1200x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sim_base = make_mzi_sim(phase_index_value=phase_index)\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(12, 4))\n",
    "sim_base.plot(z=0, ax=ax)\n",
    "ax.set_title(\"Parameterized tunable MZI geometry, x-y slice\")\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "52a40d04",
   "metadata": {},
   "source": [
    "The post-processing helpers extract the quantities used to compare devices across the sweep. `get_mode_power` returns the forward-propagating TE0 modal power at the selected wavelength, and `approximate_phase_shift_rad` estimates the accumulated phase shift from the phase-section index change."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "00741a16",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_mode_power(sim_data, monitor_name, wavelength=1.55, mode_index=0):\n",
    "    \"\"\"\n",
    "    Returns |a|^2 for a selected mode at the chosen wavelength.\n",
    "    \"\"\"\n",
    "\n",
    "    freq = td.C_0 / wavelength\n",
    "    amps = sim_data[monitor_name].amps\n",
    "\n",
    "    # Select string/integer coordinates exactly first\n",
    "    selected = amps.sel(\n",
    "        direction=\"+\",\n",
    "        mode_index=mode_index,\n",
    "    )\n",
    "\n",
    "    # Select nearest numeric frequency separately\n",
    "    amp_at_freq = selected.sel(\n",
    "        f=freq,\n",
    "        method=\"nearest\",\n",
    "    )\n",
    "    return float(np.abs(amp_at_freq.values) ** 2)\n",
    "\n",
    "\n",
    "def approximate_phase_shift_rad(\n",
    "    phase_index_value,\n",
    "    base_index=3.48,\n",
    "    phase_length_um=20.0,\n",
    "    wavelength_um=1.55,\n",
    "    effective_index_sensitivity=0.7,\n",
    "):\n",
    "    \"\"\"\n",
    "    Approximate MZI phase shift in radians.\n",
    "\n",
    "    effective_index_sensitivity approximates dneff/dncore.\n",
    "    It is not exact. For a silicon strip waveguide, values around 0.5–0.8\n",
    "    are reasonable for a first estimate.\n",
    "    \"\"\"\n",
    "    delta_n_material = phase_index_value - base_index\n",
    "    delta_n_eff_approx = effective_index_sensitivity * delta_n_material\n",
    "    delta_phi = 2 * np.pi * delta_n_eff_approx * phase_length_um / wavelength_um\n",
    "    return delta_phi"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c32d86be",
   "metadata": {},
   "source": [
    "## Run Batch Simulations\n",
    "\n",
    "Sweep the phase-section material index and submit the resulting simulations as a Tidy3D batch. Each simulation uses the same geometry and monitors, with only the phase-section index updated."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "837b2a86",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "7cdf90b00314494caf3bb08c807027d5",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">14:45:35 KST </span>Started working on Batch containing <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">5</span> tasks.                       \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m14:45:35 KST\u001b[0m\u001b[2;36m \u001b[0mStarted working on Batch containing \u001b[1;36m5\u001b[0m tasks.                       \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">14:45:42 KST </span>Maximum FlexCredit cost: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">3.123</span> for the whole batch.                \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m14:45:42 KST\u001b[0m\u001b[2;36m \u001b[0mMaximum FlexCredit cost: \u001b[1;36m3.123\u001b[0m for the whole batch.                \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>Use <span style=\"color: #008000; text-decoration-color: #008000\">'Batch.real_cost()'</span> to get the billed FlexCredit cost after    \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>completion.                                                        \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mUse \u001b[32m'Batch.real_cost\u001b[0m\u001b[32m(\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m to get the billed FlexCredit cost after    \n",
       "\u001b[2;36m             \u001b[0mcompletion.                                                        \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "96728da3994c496fb94348e2e1c3c3d6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">14:47:45 KST </span>Batch complete.                                                    \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m14:47:45 KST\u001b[0m\u001b[2;36m \u001b[0mBatch complete.                                                    \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pathlib\n",
    "\n",
    "pathlib.Path(\"data\").mkdir(exist_ok=True)\n",
    "\n",
    "phase_index_values = np.array(\n",
    "    [\n",
    "        3.510,\n",
    "        3.515,\n",
    "        3.520,\n",
    "        3.525,\n",
    "        3.530,\n",
    "    ]\n",
    ")\n",
    "\n",
    "# Build all simulations up front\n",
    "sims_dict = {\n",
    "    f\"mzi_phase_index_{str(n).replace('.', 'p')}\": make_mzi_sim(n)\n",
    "    for n in phase_index_values\n",
    "}\n",
    "\n",
    "# Submit and run all in parallel\n",
    "batch_data = web.run_async(\n",
    "    simulations=sims_dict,\n",
    "    path_dir=\"./data\",\n",
    "    verbose=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1a3dd04a",
   "metadata": {},
   "source": [
    "## Results and Analysis\n",
    "\n",
    "### Switching Condition for a Balanced MZI\n",
    "\n",
    "For an ideal balanced Mach-Zehnder interferometer built from two identical 3 dB directional couplers, the output state is determined by the relative phase difference between the two arms. Up to a port-dependent phase convention, the normalized output powers can be written as\n",
    "\n",
    "$$\n",
    "P_1 = \\cos^2\\left(\\frac{\\Delta \\phi}{2}\\right),\n",
    "\\qquad\n",
    "P_2 = \\sin^2\\left(\\frac{\\Delta \\phi}{2}\\right).\n",
    "$$\n",
    "\n",
    "Therefore, when the arms have no relative phase shift,\n",
    "\n",
    "$$\n",
    "\\Delta \\phi = 0,\n",
    "$$\n",
    "\n",
    "the output is ideally\n",
    "\n",
    "$$\n",
    "(P_1, P_2) = (1, 0).\n",
    "$$\n",
    "\n",
    "When the relative phase shift reaches\n",
    "\n",
    "$$\n",
    "\\Delta \\phi = \\pi,\n",
    "$$\n",
    "\n",
    "the interference condition is reversed and the output switches to\n",
    "\n",
    "$$\n",
    "(P_1, P_2) = (0, 1).\n",
    "$$\n",
    "\n",
    "More generally, one output state occurs when\n",
    "\n",
    "$$\n",
    "\\Delta \\phi = 2m\\pi,\n",
    "$$\n",
    "\n",
    "and the switched state occurs when\n",
    "\n",
    "$$\n",
    "\\Delta \\phi = (2m+1)\\pi,\n",
    "$$\n",
    "\n",
    "where \\(m\\) is an integer.\n",
    "\n",
    "The phase shift introduced by changing the effective index of one arm is approximately\n",
    "\n",
    "$$\n",
    "\\Delta \\phi =\n",
    "\\frac{2\\pi}{\\lambda_0}\n",
    "\\Delta n_\\mathrm{eff}\n",
    "L_\\mathrm{phase}.\n",
    "$$\n",
    "\n",
    "For a full switch, we set $\\Delta \\phi = \\pi$. Therefore,\n",
    "\n",
    "$$\n",
    "\\pi =\n",
    "\\frac{2\\pi}{\\lambda_0}\n",
    "\\Delta n_\\mathrm{eff}\n",
    "L_\\mathrm{phase}.\n",
    "$$\n",
    "\n",
    "Solving for the required effective-index change gives\n",
    "\n",
    "$$\n",
    "\\Delta n_\\mathrm{eff}\n",
    "=\n",
    "\\frac{\\lambda_0}{2L_\\mathrm{phase}}.\n",
    "$$\n",
    "\n",
    "For this design, $\\lambda_0 = 1.55~\\mu\\mathrm{m}$ and $L_\\mathrm{phase} = 20~\\mu\\mathrm{m}$, so\n",
    "\n",
    "$$\n",
    "\\Delta n_\\mathrm{eff}\n",
    "=\n",
    "\\frac{1.55}{2(20)}\n",
    "\\approx 0.03875.\n",
    "$$\n",
    "\n",
    "Thus, the phase-shifted arm should have an effective index approximately \\(0.039\\) larger than the unperturbed arm to produce a full $\\pi$-phase shift."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a35fe332",
   "metadata": {},
   "source": [
    "### Matrix Form of the MZI Transfer Function\n",
    "\n",
    "The same switching behavior can also be written in matrix form. This is useful because photonic circuits act on complex optical field amplitudes, not just optical powers. An ideal 3 dB directional coupler can be represented as\n",
    "\n",
    "$$\n",
    "C =\n",
    "\\frac{1}{\\sqrt{2}}\n",
    "\\begin{bmatrix}\n",
    "1 & i \\\\\n",
    "i & 1\n",
    "\\end{bmatrix}\n",
    "$$\n",
    "\n",
    "A phase shifter in one arm can be represented as\n",
    "\n",
    "$$\n",
    "P(\\Delta \\phi) =\n",
    "\\begin{bmatrix}\n",
    "1 & 0 \\\\\n",
    "0 & e^{i\\Delta \\phi}\n",
    "\\end{bmatrix}\n",
    "$$\n",
    "\n",
    "For an ideal MZI made from two identical 3 dB couplers, the field transfer matrix is\n",
    "\n",
    "$$\n",
    "U_\\mathrm{MZI}(\\Delta \\phi)\n",
    "=\n",
    "C P(\\Delta \\phi) C\n",
    "$$\n",
    "\n",
    "Substituting the matrices gives\n",
    "\n",
    "$$\n",
    "U_\\mathrm{MZI}(\\Delta \\phi)\n",
    "=\n",
    "\\frac{1}{2}\n",
    "\\begin{bmatrix}\n",
    "1 - e^{i\\Delta \\phi} & i\\left(1 + e^{i\\Delta \\phi}\\right) \\\\\n",
    "i\\left(1 + e^{i\\Delta \\phi}\\right) & -1 + e^{i\\Delta \\phi}\n",
    "\\end{bmatrix}\n",
    "$$\n",
    "\n",
    "This matrix maps the input field amplitudes to the output field amplitudes:\n",
    "\n",
    "$$\n",
    "\\begin{bmatrix}\n",
    "E_{\\mathrm{top,out}} \\\\\n",
    "E_{\\mathrm{bottom,out}}\n",
    "\\end{bmatrix}\n",
    "=\n",
    "U_\\mathrm{MZI}\n",
    "\\begin{bmatrix}\n",
    "E_{\\mathrm{top,in}} \\\\\n",
    "E_{\\mathrm{bottom,in}}\n",
    "\\end{bmatrix}.\n",
    "$$\n",
    "\n",
    "The measurable output powers are obtained from the squared magnitude of the complex field amplitudes. For example, if light is injected into only one input port, the ideal normalized output powers vary as\n",
    "\n",
    "$$\n",
    "P_1 = \\cos^2\\left(\\frac{\\Delta \\phi}{2}\\right),\n",
    "\\qquad\n",
    "P_2 = \\sin^2\\left(\\frac{\\Delta \\phi}{2}\\right),\n",
    "$$\n",
    "\n",
    "depending on the output-port labeling convention. Therefore, changing the phase shift by approximately $\\pi$ switches the MZI between its two routing states.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "d7032d00",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ideal MZI field matrix for Δφ = 0:\n",
      "[[0.+0.j 0.+1.j]\n",
      " [0.+1.j 0.+0.j]]\n",
      "\n",
      "Power transfer matrix |U|² for Δφ = 0:\n",
      "[[0. 1.]\n",
      " [1. 0.]]\n",
      "\n",
      "Ideal MZI field matrix for Δφ = π:\n",
      "[[ 1.-0.j -0.+0.j]\n",
      " [-0.+0.j -1.+0.j]]\n",
      "\n",
      "Power transfer matrix |U|² for Δφ = π:\n",
      "[[1. 0.]\n",
      " [0. 1.]]\n"
     ]
    }
   ],
   "source": [
    "# Ideal 2x2 MZI matrix calculation\n",
    "def ideal_mzi_matrix(delta_phi):\n",
    "    \"\"\"Return the ideal 2x2 MZI field transfer matrix for a phase shift delta_phi.\"\"\"\n",
    "    C = (1 / np.sqrt(2)) * np.array(\n",
    "        [\n",
    "            [1, 1j],\n",
    "            [1j, 1],\n",
    "        ],\n",
    "        dtype=complex,\n",
    "    )\n",
    "\n",
    "    P = np.array(\n",
    "        [\n",
    "            [1, 0],\n",
    "            [0, np.exp(1j * delta_phi)],\n",
    "        ],\n",
    "        dtype=complex,\n",
    "    )\n",
    "    return C @ P @ C\n",
    "\n",
    "\n",
    "U_0 = ideal_mzi_matrix(0)\n",
    "U_pi = ideal_mzi_matrix(np.pi)\n",
    "\n",
    "print(\"Ideal MZI field matrix for Δφ = 0:\")\n",
    "print(np.round(U_0, 3))\n",
    "\n",
    "print(\"\\nPower transfer matrix |U|² for Δφ = 0:\")\n",
    "print(np.round(np.abs(U_0) ** 2, 3))\n",
    "\n",
    "print(\"\\nIdeal MZI field matrix for Δφ = π:\")\n",
    "print(np.round(U_pi, 3))\n",
    "\n",
    "print(\"\\nPower transfer matrix |U|² for Δφ = π:\")\n",
    "print(np.round(np.abs(U_pi) ** 2, 3))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5ee14665",
   "metadata": {},
   "source": [
    "### Relevance to Photonic Computation\n",
    "\n",
    "The matrix representation is also why the MZI is a fundamental building block for programmable photonic circuits. In linear optics, the optical field amplitudes at the outputs are linear combinations of the input field amplitudes. Therefore, an MZI implements a tunable $2\\times2$ linear transformation.\n",
    "\n",
    "By adjusting the phase shift, the same physical device can be programmed to route power between ports or to implement intermediate splitting ratios. Larger photonic processors can be built by cascading many tunable MZI blocks into an interferometer mesh. In that setting, each MZI acts as a programmable matrix element, and the full mesh implements a larger matrix-vector multiplication on optical signals. This is the basic connection between tunable interferometers and photonic computing: computation is performed through controlled interference and linear optical transformations.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5acfbd06",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Required Δneff for π phase shift: 0.03875\n",
      "If neff_phase ≈ 2.350, implied neff_base ≈ 2.31125\n"
     ]
    }
   ],
   "source": [
    "# Analytical estimate for the effective-index change needed for a full MZI switch\n",
    "lambda0_est = lambda0\n",
    "phase_length_est = phase_length\n",
    "neff_phase_example = 2.35  # example guided-mode effective index near the switched state\n",
    "\n",
    "required_delta_neff_pi = lambda0_est / (2 * phase_length_est)\n",
    "neff_base_implied = neff_phase_example - required_delta_neff_pi\n",
    "\n",
    "print(f\"Required Δneff for π phase shift: {required_delta_neff_pi:.5f}\")\n",
    "print(\n",
    "    f\"If neff_phase ≈ {neff_phase_example:.3f}, implied neff_base ≈ {neff_base_implied:.5f}\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "aa981c8f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "phase_index=3.5100 | top=0.0451 | bottom=0.9549 | Δφ=1.703 rad = 0.542π\n",
      "phase_index=3.5150 | top=0.0001 | bottom=0.9999 | Δφ=1.986 rad = 0.632π\n",
      "phase_index=3.5200 | top=0.0470 | bottom=0.9530 | Δφ=2.270 rad = 0.723π\n",
      "phase_index=3.5250 | top=0.1894 | bottom=0.8106 | Δφ=2.554 rad = 0.813π\n",
      "phase_index=3.5300 | top=0.3775 | bottom=0.6225 | Δφ=2.838 rad = 0.903π\n"
     ]
    }
   ],
   "source": [
    "# Extract results from BatchData\n",
    "results = []\n",
    "\n",
    "for name, n_phase in zip(sims_dict.keys(), phase_index_values):\n",
    "    sim_data = batch_data[name]\n",
    "\n",
    "    p_top = get_mode_power(\n",
    "        sim_data, \"top_output_mode_monitor\", wavelength=lambda0, mode_index=0\n",
    "    )\n",
    "    p_bottom = get_mode_power(\n",
    "        sim_data, \"bottom_output_mode_monitor\", wavelength=lambda0, mode_index=0\n",
    "    )\n",
    "\n",
    "    p_sum = p_top + p_bottom\n",
    "    top_frac = p_top / p_sum if p_sum > 0 else np.nan\n",
    "    bottom_frac = p_bottom / p_sum if p_sum > 0 else np.nan\n",
    "    phase_rad = approximate_phase_shift_rad(\n",
    "        phase_index_value=n_phase,\n",
    "        base_index=n_si,\n",
    "        phase_length_um=phase_length,\n",
    "        wavelength_um=lambda0,\n",
    "        effective_index_sensitivity=0.7,\n",
    "    )\n",
    "    phase_pi = phase_rad / np.pi\n",
    "    results.append(\n",
    "        {\n",
    "            \"phase_index\": n_phase,\n",
    "            \"p_top\": p_top,\n",
    "            \"p_bottom\": p_bottom,\n",
    "            \"top_frac\": top_frac,\n",
    "            \"bottom_frac\": bottom_frac,\n",
    "            \"phase_rad\": phase_rad,\n",
    "            \"phase_pi\": phase_pi,\n",
    "        }\n",
    "    )\n",
    "    print(\n",
    "        f\"phase_index={n_phase:.4f} | top={top_frac:.4f} | bottom={bottom_frac:.4f} | Δφ={phase_rad:.3f} rad = {phase_pi:.3f}π\"\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d7bd357",
   "metadata": {},
   "source": [
    "Collect the batch results into NumPy arrays for plotting. The arrays keep the phase-section indices, normalized output fractions, and estimated phase shifts aligned point by point."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "89da3b78",
   "metadata": {},
   "outputs": [],
   "source": [
    "phase_indices = np.array([r[\"phase_index\"] for r in results])\n",
    "top_fracs = np.array([r[\"top_frac\"] for r in results])\n",
    "bottom_fracs = np.array([r[\"bottom_frac\"] for r in results])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "790885fe",
   "metadata": {},
   "source": [
    "The final plot compares the normalized TE0 power at the two output ports. As the phase-section index changes, the MZI interference condition shifts and power transfers between the top and bottom outputs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "d83552d4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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X7686kSt11bopJZCRocqU6ZMTqaPiIiIiIicsY+FBBYykpMlGQZWthERERERUf6T5cBC7z9h6e7du/D29s6pdBERERERkTM2hZLJ7IQEFe+//z58fX2N26ST9vbt29U8FERERERElP9YHVjs3bvXWGNx8OBBeHp6GrfJ/+vWrYu33347d1JJRERERETOEVjoo0ENGTIEX331Ffz9/XMzXURERERE5MyjQs2cOTN3UkJERERERPknsGjXrl2G29euXZud9BARERERUX4ILKQvhanExETs27cPhw4dwuDBg3MybURERERE5KyBxeTJk9NcP27cODXkLBERERER5T9ZnsciPU899RRmzJiRU4cjIiIiIqL8GFhs3bqVE+QREREREeVTWW4K1bdvX7PnMq/F1atXsWvXLjVxHhERERER5T9ZDiwCAgLMnru6uqJq1ar44IMP0KlTp5xMGxEREREROQjOY0FERERERHkfWOh2796No0ePqv/XrFkT9evXz35qiIiIiIgofwQW169fx+OPP47Q0FAUKlRIrYuIiEDbtm3x119/oVixYrmRTiIiIiIicqZRoV577TXcuXMHhw8fxq1bt9Qik+NFRUXh9ddfz51UEhERERGRc9VYLF++HKtXr0b16tWN62rUqIHvvvuOnbeJiIiIiPKpLNdYpKSkwMPDI9V6WSfbiIiIiIgo/8lyYNGuXTsMHz4cV65cMa67fPkyRowYgfbt2+d0+oiIiIiIyAFkObD49ttvVX+KcuXKoWLFimopX768WvfNN9/kTiqJiIiIiMi5+liEhIRgz549qp/FsWPH1Drpb9GhQ4fcSB8RERERETnrPBYuLi7o2LGjWoiIiIiIiLLcFIqIiIiIiMgSAwsiIiIiIso2BhZERERERJRtDCyIiIiIiCjvO2+HhYVh+/bt6lEUL14cTZo0UY9ERERERJQ/WR1YREdH48UXX8Rff/2lRoUqXLiwWn/r1i0YDAYMHDgQ06ZNg6+vb26ml4iIiIiIHLkplMy2vWPHDixZsgRxcXG4du2aWuT/S5cuVdtkHyIiIiIiyn+sDizmzp2LWbNmoXPnznBzczOul/936tQJM2bMwL///ptb6SQiIiIiImcILFJSUuDp6Znudtkm+xARERERUf5jdWDRo0cPvPDCC9i7d2+qbbLu5ZdfRs+ePXM6fURERERE5EyBxbfffovg4GA0bNgQRYoUQfXq1dUi/2/UqBGCgoLUPkRERERElP9YPSpUYGAgli1bhmPHjmHr1q1mw802bdoU1apVy810EhERERGRM81jIQEEgwgiIiIiInqgplCvvPIK7t69a3z+559/qrktdBEREejWrZu1hyMiIiIiovwYWMjkdzExMcbnMlmezGOhi4+Px4oVK3I+hURERERE5DyBhcyundFzIiIiIiLKv6wOLIiIiIiIiNLDwIKIiIiIiPJ2VKgxY8bA19dX/T8hIQEff/wxAgIC1HPT/hdERERERJS/WB1YtGrVCsePHzc+b9asGc6cOZNqHyIiIiIiyn+sDixCQ0NzNyVEREREROT8fSwqVKiAmzdv5m5qiIiIiIjIuQOLc+fOITk5OXdTQ0REREREDomjQhERERERUd6OCiUza+ujQKWnV69e2U0TERERERE5c2AxePDgDLe7uLiwuRQRERERUT6UpaZQYWFhSElJSXdhHwwiIiIiovzJ6sBCaiOIiIiIiIiyFVgYDAZrdyUiIiIionzGNSv9K3x8fHI3NURERERE5Nydt2fOnJm7KSEiIiIiIofFeSyIiIiIiCjbGFgQEREREVG2MbAgIiIiIqJsY2BBRERERER503m7b9++Vh9w3rx52UkPERERERE5a41FQECAcfH398eaNWuwa9cu4/bdu3erdbL9QXz33XcoV64cvL290aRJE+zYscOq1/31119q4r4+ffo80HmJiIiIiCgPayxMh5p955130L9/f0ydOhVubm5qXXJyMl555RUVdGTVnDlz8Oabb6rjSVAxZcoUdO7cGcePH0dQUFC6rzt37hzefvtttGzZMsvnJCIiIiIiG/exmDFjhrqg14MKIf+X4EC2ZdWkSZMwdOhQDBkyBDVq1FABhq+vb4bHkkDmySefxPjx41GhQoUsn5OIiIiIiGw0QZ4uKSkJx44dQ9WqVc3Wy7qUlJQsHSshIUE1oxo9erRxnaurKzp06ICtW7em+7oPPvhA1WY899xz2LhxY4bniI+PV4suKipKPSYmJqrFFvTz2ur8zoL5yDy0FyyLzEd7wbLIfLQnLI/OkYdZOXeWAwupWZAL+tOnT6Nx48Zq3fbt2/Hpp5+qbVlx48YNVfsQHBxstl6eS6CSlk2bNmH69OnYt2+fVeeYMGGCqtmwtHLlSlUzYkurVq2y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",
      "text/plain": [
       "<Figure size 800x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 5))\n",
    "plt.plot(phase_indices, top_fracs, \"o-\", label=\"Top output\")\n",
    "plt.plot(phase_indices, bottom_fracs, \"o-\", label=\"Bottom output\")\n",
    "plt.xlabel(\"Phase-section material index\")\n",
    "plt.ylabel(\"Normalized TE0 output fraction\")\n",
    "plt.title(\"Tunable MZI output versus phase-section index\")\n",
    "plt.grid(True)\n",
    "plt.legend()\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "554dd162",
   "metadata": {},
   "source": [
    "### Comparison Between Analytical Switching Condition and Simulated Effective Index\n",
    "\n",
    "For an ideal balanced MZI, full switching occurs when the relative phase shift between the two arms reaches approximately $\\pi$. The required effective-index change is\n",
    "\n",
    "$$\n",
    "\\Delta n_\\mathrm{eff}\n",
    "=\n",
    "\\frac{\\lambda_0}{2L_\\mathrm{phase}}.\n",
    "$$\n",
    "\n",
    "For this design, $\\lambda_0 = 1.55~\\mu\\mathrm{m}$ and $L_\\mathrm{phase} = 20~\\mu\\mathrm{m}$, giving\n",
    "\n",
    "$$\n",
    "\\Delta n_\\mathrm{eff}\n",
    "=\n",
    "\\frac{1.55}{2(20)}\n",
    "\\approx 0.03875.\n",
    "$$\n",
    "\n",
    "A separate mode calculation gave an effective index of approximately\n",
    "\n",
    "$$\n",
    "n_{\\mathrm{eff,base}} \\approx 2.35\n",
    "$$\n",
    "\n",
    "for the unmodified waveguide and\n",
    "\n",
    "$$\n",
    "n_{\\mathrm{eff,phase}} \\approx 2.39\n",
    "$$\n",
    "\n",
    "for the phase-shifted waveguide. Therefore, the simulated effective-index change is\n",
    "\n",
    "$$\n",
    "\\Delta n_\\mathrm{eff}\n",
    "=\n",
    "2.39 - 2.35\n",
    "=\n",
    "0.04.\n",
    "$$\n",
    "\n",
    "The corresponding phase shift is\n",
    "\n",
    "$$\n",
    "\\Delta \\phi =\n",
    "\\frac{2\\pi}{1.55}(0.04)(20)\n",
    "\\approx 3.24~\\mathrm{rad}\n",
    "\\approx 1.03\\pi.\n",
    "$$\n",
    "\n",
    "This agrees closely with the analytical switching condition. The FDTD sweep showed nearly complete transfer to the opposite output port near this phase-shifter setting, consistent with the expected $\\pi$-phase shift required to switch a balanced MZI from one output state to the other.\n",
    "\n",
    "### Note on Phase-Axis Calibration\n",
    "\n",
    "It should also be noted that the calibrated phase axis used in the sweep is approximate. In the initial estimate, the material-index change in the phase-shifter section was converted to an effective-index change using an assumed sensitivity factor,\n",
    "\n",
    "$$\n",
    "\\Delta n_\\mathrm{eff} \\approx 0.7\\Delta n_\\mathrm{material}.\n",
    "$$\n",
    "\n",
    "This factor is only a rough approximation. The true relationship between material index and effective index depends on the waveguide geometry, modal confinement, wavelength, polarization, and surrounding cladding. Since the optical mode is not entirely confined to the silicon core, the effective-index change is smaller than the applied material-index change, but the exact scaling factor should not be assumed universally.\n",
    "\n",
    "The most accurate way to determine the phase shift is to directly compute the guided-mode effective index for both the unmodified waveguide and the phase-shifted waveguide. The phase difference can then be calculated from\n",
    "\n",
    "$$\n",
    "\\Delta \\phi =\n",
    "\\frac{2\\pi}{\\lambda_0}\n",
    "\\left(\n",
    "n_{\\mathrm{eff,phase}} -\n",
    "n_{\\mathrm{eff,base}}\n",
    "\\right)\n",
    "L_\\mathrm{phase}.\n",
    "$$\n",
    "\n",
    "Using separately simulated effective indices, $n_{\\mathrm{eff,base}}\\approx 2.35$ and $n_{\\mathrm{eff,phase}}\\approx 2.39$, gives\n",
    "\n",
    "$$\n",
    "\\Delta n_\\mathrm{eff} \\approx 0.04,\n",
    "$$\n",
    "\n",
    "which corresponds to\n",
    "\n",
    "$$\n",
    "\\Delta \\phi =\n",
    "\\frac{2\\pi}{1.55}(0.04)(20)\n",
    "\\approx 3.24~\\mathrm{rad}\n",
    "\\approx 1.03\\pi.\n",
    "$$\n",
    "\n",
    "This direct effective-index calculation agrees closely with the ideal $\\pi$-phase switching condition and is more reliable than the approximate $0.7\\Delta n_\\mathrm{material}$ estimate."
   ]
  }
 ],
 "metadata": {
  "applications": [
   "Active photonic integrated circuit components"
  ],
  "description": "This notebook demonstrates the design and simulation of a tunable silicon photonic Mach-Zehnder interferometer using Tidy3D FDTD. The device consists of two 3 dB directional couplers connected by two waveguide arms, with one arm containing a phase-shift section. The notebook sweeps the phase-section refractive index to show tunable power transfer between the output ports and connects the simulated switching behavior to the 2x2 matrix representation used in programmable photonic circuits.",
  "feature_image": "./img/tunable_mzi_transparent_compact.png",
  "features": [
   "Parameter sweep"
  ],
  "kernelspec": {
   "display_name": "flex",
   "language": "python",
   "name": "python3"
  },
  "keywords": "tunable Mach-Zehnder interferometer, MZI, silicon photonics, directional coupler, phase shifter, photonic switch, programmable photonics, matrix transfer function, Tidy3D, FDTD",
  "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.12.12"
  },
  "title": "How to simulate a tunable Mach-Zehnder interferometer in Tidy3D FDTD | Flexcompute"
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
