{ "cells": [ { "cell_type": "markdown", "id": "2f8d0316-0352-42cf-bcbf-8230e16e741c", "metadata": {}, "source": [ "# Using precompute tables" ] }, { "cell_type": "markdown", "id": "5f9dd18f", "metadata": {}, "source": [ "First lets define our imports, the lookup table file paths, and the parameters of the precompute Bragg pulses. Then we will load in the actual precompute tables." ] }, { "cell_type": "code", "execution_count": 1, "id": "b6e414e8-ddbb-40e2-a8fc-e944e6ff5806", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loading single frequency Bragg precompute table, this could take a while...\n", "Precompute table loaded! Performing checks...\n", "Checks passed!\n", "Loading single frequency Bragg precompute table, this could take a while...\n", "Precompute table loaded! Performing checks...\n", "Checks passed!\n", "Loading multifrequency Bragg precompute table, this could take a while...\n", "Precompute table loaded! Performing checks...\n", "Checks passed!\n" ] } ], "source": [ "import numpy as np\n", "from numba import jit, float64\n", "from mwave.integrate import make_kvec, make_phi, bloch, phase_fnc_constant\n", "from mwave.precompute import load_precomputed_gbragg\n", "\n", "# Define parameters used to generate precompute table, these can optionally be passed into the load_precomputed_gbragg function\n", "nbragg = 4\n", "sigma = 0.259658916\n", "tau_factor = 5\n", "\n", "# Make a kvector\n", "kvec, _, _ = make_kvec(0,nbragg)\n", "\n", "# Try loading just the single frequency precompute table, then the combined single and multifrequency one\n", "lookup_single_fname = 'single_bragg_sig0.260.h5'\n", "lookup_multi_fname = 'multi_bragg_sig0.260.h5'\n", "\n", "pgbragg_single = load_precomputed_gbragg(lookup_single_fname, table_sigma=sigma)\n", "pgbragg_both = load_precomputed_gbragg(lookup_single_fname, lookup_multi_fname, table_sigma=sigma, table_modulation_frequency=8*nbragg)" ] }, { "cell_type": "markdown", "id": "19bae64e", "metadata": {}, "source": [ "Now that we have loaded in our precompute tables, lets construct a function that takes the same arguments as `pgbragg_single` and `pgbragg_both` but directly computes the output wavefunction instead of using the lookup table." ] }, { "cell_type": "code", "execution_count": 2, "id": "85b901f7-34bf-43b2-9c79-0d21c48771b9", "metadata": {}, "outputs": [], "source": [ "def gbragg(kvec, k0, sigma, omega, delta, delta_phase, mod_freq=None, mod_phase=0.0):\n", "\n", " # To stop edge effects effecting us when we compare to the precompute table we should actually use a much larger kvec\n", " inner_kvec = make_kvec(0,0,npad=50)[0]\n", "\n", " tfinal = 2*tau_factor*sigma\n", "\n", " if mod_freq:\n", " # mod_freq not None, use multi-Bragg\n", " \n", " @jit(float64(float64, float64[:]))\n", " def multi_omega_fnc(t, args):\n", " omega, sigma, t0, mod_freq, mod_phase = args\n", " return 2*np.cos(mod_freq*t + mod_phase)*omega*np.exp(-np.square(t-t0)/(2*(sigma**2)))\n", " \n", " sol = bloch(inner_kvec, make_phi(inner_kvec, k0/2), tfinal, delta, multi_omega_fnc, np.array([omega, sigma, tfinal/2, mod_freq, mod_phase]), phase_fnc_constant, np.array([delta_phase]))\n", " \n", " return sol.y[np.isin(inner_kvec, kvec),-1]\n", "\n", " else:\n", " # mod_freq is None, use single Bragg\n", " \n", " @jit(float64(float64, float64[:]))\n", " def omega_fnc_gaussian(t, args):\n", " omega, sigma, t0 = args\n", " return omega*np.exp(-np.square(t-t0)/(2*(sigma**2)))\n", " \n", " sol = bloch(inner_kvec, make_phi(inner_kvec, k0/2), tfinal, delta, omega_fnc_gaussian, np.array([omega, sigma, tfinal/2]), phase_fnc_constant, np.array([delta_phase]))\n", " \n", " return sol.y[np.isin(inner_kvec, kvec),-1]" ] }, { "cell_type": "markdown", "id": "d4c7304d", "metadata": {}, "source": [ "Now that we have the direct and precomputed functions we and print out the differences between them. Lets start with a single frequency pulse." ] }, { "cell_type": "code", "execution_count": 11, "id": "9340cdec-9dc0-4d93-8c1a-c637bbbcb3f6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "directly computed populations\n", "[7.73693526e-28 1.64408211e-26 6.69012041e-26 5.04494003e-25\n", " 1.32733681e-24 6.56453256e-25 4.77292244e-24 3.74553216e-15\n", " 5.11763100e-06 1.71478211e-03 4.99429309e-01 1.22978914e-01\n", " 6.17643911e-02 5.66803520e-02 2.42007799e-01 1.54192069e-02\n", " 1.26301855e-07 4.66194478e-17 4.93461050e-26 3.71251858e-26\n", " 3.61496358e-26 2.61121489e-26 2.13290728e-26 3.63420981e-27\n", " 7.39412202e-28]\n", "pgbragg_single\n", "phase deviations err [ 3.46198814e+00 4.40103642e+00 3.09117904e+00 6.20975992e-01\n", " 2.51852691e-01 5.67958471e-02 1.43584660e-01 -2.71233819e-05\n", " 2.57268540e-06 -2.72409143e-06 1.04484705e-06 -1.43832199e-07\n", " 1.42969206e-06 -2.52064104e-06 -1.46709459e-07 -4.04860789e-06\n", " 4.88389526e-05 4.74291736e-05 2.93782326e+00 2.19176450e+00\n", " -4.17334862e+00 1.85944392e+00 -6.60228378e-01 -4.38346450e+00\n", " -1.69580328e+00]\n", "population err [-1.30244564e-27 -3.65248032e-24 -2.10536952e-25 1.11149705e-25\n", " 1.83284151e-25 7.33429647e-26 -2.94150736e-25 -1.90206410e-19\n", " 3.87883412e-11 3.40942213e-09 -2.40721744e-06 -2.54747354e-07\n", " 9.49739348e-08 3.87778559e-07 3.19901486e-06 4.14241384e-07\n", " 8.88351312e-12 -4.70473960e-21 -7.01075715e-26 -3.66908404e-28\n", " 3.45642530e-27 1.40626575e-26 2.09893035e-26 -1.13502310e-26\n", " 7.39412202e-28]\n", "\n", "pgbragg_both\n", "phase deviations err [ 3.46198814e+00 4.40103642e+00 3.09117904e+00 6.20975992e-01\n", " 2.51852691e-01 5.67958471e-02 1.43584660e-01 -2.71233819e-05\n", " 2.57268540e-06 -2.72409143e-06 1.04484705e-06 -1.43832199e-07\n", " 1.42969206e-06 -2.52064104e-06 -1.46709459e-07 -4.04860789e-06\n", " 4.88389526e-05 4.74291736e-05 2.93782326e+00 2.19176450e+00\n", " -4.17334862e+00 1.85944392e+00 -6.60228378e-01 -4.38346450e+00\n", " -1.69580328e+00]\n", "population err [-1.30244564e-27 -3.65248032e-24 -2.10536952e-25 1.11149705e-25\n", " 1.83284151e-25 7.33429647e-26 -2.94150736e-25 -1.90206410e-19\n", " 3.87883412e-11 3.40942213e-09 -2.40721744e-06 -2.54747354e-07\n", " 9.49739348e-08 3.87778559e-07 3.19901486e-06 4.14241384e-07\n", " 8.88351312e-12 -4.70473960e-21 -7.01075715e-26 -3.66908404e-28\n", " 3.45642530e-27 1.40626575e-26 2.09893035e-26 -1.13502310e-26\n", " 7.39412202e-28]\n" ] } ], "source": [ "# Randomly sample parameters to cehck precompute table against\n", "omega = np.random.rand()*45\n", "k0 = 2*int(np.random.rand()*10-5)\n", "delta = 4*nbragg + np.random.rand()*8 - 4\n", "delta_phase = np.random.rand()*2*np.pi\n", "\n", "# Compare direct computation to precomputed values\n", "gb = gbragg(kvec, k0, sigma, omega, delta, delta_phase, 0.0, 0.0)\n", "gbp = pgbragg_single(kvec, k0, sigma, np.array([omega]), np.array([delta]), delta_phase)\n", "gbbp = pgbragg_both(kvec, k0, sigma, np.array([omega]), np.array([delta]), delta_phase)\n", "\n", "# Print absolute differences\n", "print('directly computed populations')\n", "print(np.abs(gb[:])**2)\n", "print('pgbragg_single')\n", "print(f'phase deviations err {np.angle(gb[:])-np.angle(gbp[0,:])}')\n", "print(f'population err {np.abs(gb[:])**2-np.abs(gbp[0,:])**2}')\n", "print('\\npgbragg_both')\n", "print(f'phase deviations err {np.angle(gb[:])-np.angle(gbbp[0,:])}')\n", "print(f'population err {np.abs(gb[:])**2-np.abs(gbbp[0,:])**2}')" ] }, { "cell_type": "markdown", "id": "4c4a9431", "metadata": {}, "source": [ "This looks good. We have small population errors across the board, and our phase errors are only large when we have zero (i.e. `1e-12`) population.\n", "\n", "Now lets test a multi-frequency pulse." ] }, { "cell_type": "code", "execution_count": 4, "id": "51754498-78b0-4bea-be13-68f6ff113916", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "directly computed populations\n", "[6.51229483e-27 1.42337890e-25 1.03835926e-23 8.99007802e-17\n", " 4.97042019e-11 1.74890545e-06 2.98260346e-02 5.18788503e-01\n", " 1.27193768e-01 2.50302236e-01 6.70009950e-02 2.90726271e-03\n", " 2.32270533e-03 1.48546635e-03 4.89464087e-05 2.55653484e-05\n", " 3.62237932e-06 9.45748110e-06 6.93521332e-05 1.42954031e-05\n", " 3.76057016e-08 2.84426433e-12 9.74848077e-18 1.02040308e-22\n", " 3.00026708e-29]\n", "phase deviations err [-4.26092646e+00 4.57348857e-01 -2.04220612e-01 1.27582364e-03\n", " 6.75143828e-04 1.06487428e-05 5.11554111e-05 -3.62033632e-06\n", " -7.65706056e-07 -2.72753603e-05 1.37881045e-04 3.85593508e-04\n", " -5.90606717e-04 3.06754976e-03 4.53087003e-03 5.34724102e-03\n", " -1.09391735e-02 6.21637377e-02 1.34753156e-02 1.47683890e-01\n", " 3.39391490e-01 3.71658534e-01 8.64316677e-01 -5.05147400e+00\n", " 1.13114902e+00]\n", "population err [-8.07988713e-28 4.01502118e-26 -2.50159970e-25 4.02479076e-19\n", " 7.30890560e-14 6.05804583e-10 2.53960916e-06 6.50810047e-06\n", " 2.56293970e-07 2.21832720e-05 6.17576041e-05 7.59193636e-06\n", " 1.02596731e-05 -9.32421292e-07 1.11665033e-06 1.22015972e-06\n", " 3.83786712e-07 2.04471964e-06 2.19419212e-05 5.15005244e-06\n", " 1.19979719e-08 2.12826809e-12 2.16218882e-18 5.71925680e-23\n", " 6.70548038e-30]\n" ] } ], "source": [ "# Randomly sample parameters to cehck precompute table against\n", "omega = np.random.rand()*45\n", "k0 = 2*int(np.random.rand()*10-5)\n", "nbloch = 0\n", "delta = 4*nbragg + np.random.rand()*8 - 4\n", "delta_phase = np.random.rand()*2*np.pi\n", "mod_freq = 8*nbragg\n", "mod_phase = 0\n", "\n", "# Compare direct computation to precomputed values# Randomly sample parameters to cehck precompute table against\n", "\n", "gb = gbragg(kvec, k0, sigma, omega, delta, delta_phase, mod_freq, mod_phase)\n", "gbp = pgbragg_both(kvec, k0, sigma, np.array([omega]), np.array([delta]), delta_phase, mod_freq, mod_phase)\n", "\n", "# Print absolute differences\n", "print('directly computed populations')\n", "print(np.abs(gb[:])**2)\n", "print(f'phase deviations err {np.angle(gb[:])-np.angle(gbp[0,:])}')\n", "print(f'population err {np.abs(gb[:])**2-np.abs(gbp[0,:])**2}')" ] }, { "cell_type": "markdown", "id": "560bd60c", "metadata": {}, "source": [ "Same deal--our phase errors are only large when we have zero (i.e. `1e-12`) population." ] }, { "cell_type": "markdown", "id": "e73ed72e", "metadata": {}, "source": [] } ], "metadata": { "kernelspec": { "display_name": "lab", "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.0" } }, "nbformat": 4, "nbformat_minor": 5 }