{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Bootstrap Current Self-Consistency" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This tutorial demonstrates how to optimize a quasi-symmetric equilibrium to have a self-consistent bootstrap current profile. \n", "This is performed by minimizing the difference between the toroidal currents $\\langle J \\cdot B \\rangle$ computed from the MHD equilibrium and from the Redl formula. \n", "The Redl formula is only valid in the limit of perfect quasi-symmetry, so this procedure will not work for other configurations that are not quasi-symmetric. \n", "\n", "There are two methods that can be used, and both will be shown: \n", "\n", "1. Optimize the current profile for self-consistency\n", "2. Iteratively solve the equilibrium with new current profiles\n", "\n", "These methods should be equivalent, although one might be faster than the other depending on the particular problem. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you have access to a GPU, uncomment the following two lines: " ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "import sys\n", "import os\n", "\n", "sys.path.insert(0, os.path.abspath(\".\"))\n", "sys.path.append(os.path.abspath(\"../../../\"))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# from desc import set_device\n", "# set_device(\"gpu\")" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "np.set_printoptions(linewidth=np.inf)\n", "import matplotlib.pyplot as plt\n", "\n", "plt.rcParams[\"font.size\"] = 14\n", "\n", "from desc.compat import rescale\n", "from desc.equilibrium import EquilibriaFamily\n", "from desc.examples import get\n", "from desc.grid import LinearGrid\n", "from desc.objectives import (\n", " BootstrapRedlConsistency,\n", " FixAtomicNumber,\n", " FixBoundaryR,\n", " FixBoundaryZ,\n", " FixCurrent,\n", " FixElectronDensity,\n", " FixElectronTemperature,\n", " FixIonTemperature,\n", " FixPsi,\n", " ForceBalance,\n", " ObjectiveFunction,\n", ")\n", "from desc.plotting import plot_1d\n", "from desc.profiles import PowerSeriesProfile" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As an example, we will reproduce the QA results from [Landreman et al. (2022)](https://doi.org/10.1063/5.0098166). \n", "\n", "We will start with the \"precise QA\" example equilibrium, scaled to the ARIES-CS reactor size. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "eq0 = get(\"precise_QA\")\n", "eq0 = rescale(eq0, L=(\"R0\", 10), B=(\"B0\", 5.86))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This equilibrium has the vacuum profiles $p = 0 ~\\text{Pa}$ and $\\frac{2\\pi}{\\mu_0} I = 0 ~\\text{A}$. \n", "Calculating the bootstrap current requires knowledge of the temperature and density profiles for each species in the plasma. \n", "We replace the pressure profile with the following kinetic profiles corresponding to $\\langle\\beta\\rangle=2.5\\%$: \n", "\n", "$n_e = n_i = 2.38\\times10^{20} (1 - \\rho^{10}) ~\\text{m}^{-3}$\n", "\n", "$T_e = T_i = 9.45\\times10^{3} (1 - \\rho^{2}) ~\\text{eV}$\n", "\n", "The temperature profiles must be given for both ions and electrons, but only the electron density profile is specified. \n", "The ion density profile is given by the effective atomic number $Z_{eff}$ as $n_i = n_e / Z_{eff}$. \n", "The plasma pressure will then be computed as \n", "\n", "$p = e (n_e T_e + n_i T_i)$." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "eq0.pressure = None # must remove the pressure profile before setting kinetic profiles\n", "eq0.atomic_number = PowerSeriesProfile([1])\n", "eq0.electron_density = PowerSeriesProfile(params=[1, -1], modes=[0, 10]) * 2.38e20\n", "eq0.electron_temperature = PowerSeriesProfile(params=[1, -1], modes=[0, 2]) * 9.45e3\n", "eq0.ion_temperature = PowerSeriesProfile(params=[1, -1], modes=[0, 2]) * 9.45e3\n", "# the existing current profile is the vacuum case eq0.current = PowerSeriesProfile([0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We need to re-solve the equilibrium force balance with the new profiles. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Building objective: force\n", "Precomputing transforms\n", "Timer: Precomputing transforms = 801 ms\n", "Timer: Objective build = 2.35 sec\n", "Building objective: lcfs R\n", "Building objective: lcfs Z\n", "Building objective: fixed Psi\n", "Building objective: fixed current\n", "Building objective: fixed electron density\n", "Building objective: fixed electron temperature\n", "Building objective: fixed ion temperature\n", "Building objective: fixed atomic number\n", "Building objective: fixed sheet current\n", "Building objective: self_consistency R\n", "Building objective: self_consistency Z\n", "Building objective: lambda gauge\n", "Building objective: axis R self consistency\n", "Building objective: axis Z self consistency\n", "Timer: Objective build = 1.34 sec\n", "Timer: Linear constraint projection build = 3.40 sec\n", "Number of parameters: 856\n", "Number of objectives: 5346\n", "Timer: Initializing the optimization = 7.20 sec\n", "\n", "Starting optimization\n", "Using method: lsq-exact\n", " Iteration Total nfev Cost Cost reduction Step norm Optimality \n", " 0 1 1.506e-02 7.619e+00 \n", " 1 3 1.196e-02 3.103e-03 2.975e-01 6.507e+00 \n", " 2 4 2.203e-04 1.174e-02 8.648e-02 3.337e-01 \n", " 3 6 1.711e-05 2.032e-04 4.625e-02 1.520e-01 \n", " 4 8 5.909e-06 1.120e-05 1.668e-02 2.508e-02 \n", " 5 10 4.441e-06 1.468e-06 8.001e-03 7.463e-03 \n", " 6 11 3.839e-06 6.015e-07 2.055e-02 2.546e-02 \n", " 7 12 3.360e-06 4.792e-07 2.028e-02 2.861e-02 \n", " 8 13 3.001e-06 3.594e-07 1.845e-02 2.635e-02 \n", " 9 15 2.756e-06 2.450e-07 8.907e-03 6.321e-03 \n", " 10 16 2.579e-06 1.769e-07 1.607e-02 2.225e-02 \n", " 11 18 2.426e-06 1.526e-07 7.525e-03 5.589e-03 \n", " 12 19 2.273e-06 1.530e-07 1.335e-02 1.947e-02 \n", " 13 20 2.254e-06 1.983e-08 2.330e-02 5.610e-02 \n", " 14 21 1.849e-06 4.050e-07 5.738e-03 4.613e-03 \n", " 15 22 1.728e-06 1.208e-07 1.118e-02 1.359e-02 \n", " 16 23 1.627e-06 1.004e-07 2.244e-02 2.536e-02 \n", " 17 24 1.346e-06 2.812e-07 2.317e-02 1.270e-02 \n", " 18 26 1.171e-06 1.750e-07 1.183e-02 2.474e-03 \n", " 19 27 1.042e-06 1.295e-07 2.464e-02 5.236e-03 \n", " 20 29 9.268e-07 1.149e-07 1.257e-02 1.812e-03 \n", " 21 30 8.259e-07 1.009e-07 2.577e-02 6.983e-03 \n", " 22 31 7.120e-07 1.139e-07 2.613e-02 7.499e-03 \n", " 23 33 6.255e-07 8.650e-08 1.320e-02 2.110e-03 \n", " 24 34 5.794e-07 4.612e-08 2.638e-02 7.704e-03 \n", " 25 35 5.209e-07 5.850e-08 2.635e-02 8.874e-03 \n", " 26 36 4.842e-07 3.668e-08 2.630e-02 9.469e-03 \n", " 27 37 4.613e-07 2.295e-08 2.610e-02 1.021e-02 \n", " 28 38 3.546e-07 1.067e-07 6.709e-03 7.225e-04 \n", " 29 39 3.456e-07 8.929e-09 1.307e-02 2.583e-03 \n", " 30 40 3.316e-07 1.403e-08 1.275e-02 2.728e-03 \n", " 31 41 3.204e-07 1.125e-08 1.252e-02 2.679e-03 \n", " 32 42 3.114e-07 8.976e-09 1.224e-02 3.403e-03 \n", " 33 43 3.049e-07 6.469e-09 1.192e-02 4.521e-03 \n", " 34 44 3.016e-07 3.289e-09 1.153e-02 6.147e-03 \n", " 35 45 2.897e-07 1.192e-08 2.935e-03 5.602e-04 \n", " 36 46 2.885e-07 1.213e-09 5.539e-03 2.663e-03 \n", "Optimization terminated successfully.\n", "`ftol` condition satisfied.\n", " Current function value: 2.885e-07\n", " Total delta_x: 5.223e-01\n", " Iterations: 36\n", " Function evaluations: 46\n", " Jacobian evaluations: 37\n", "Timer: Solution time = 3.87 min\n", "Timer: Avg time per step = 6.27 sec\n", "\n", "==============================================================================================================\n", "\n", " Start --> End\n", "Total (sum of squares): 1.506e-02 --> 2.885e-07, \n", "Maximum absolute Force error: 6.502e+07 --> 8.548e+05 (N)\n", "Minimum absolute Force error: 2.968e-01 --> 2.348e+00 (N)\n", "Average absolute Force error: 5.342e+06 --> 3.282e+04 (N)\n", "Maximum absolute Force error: 2.008e-02 --> 2.640e-04 (normalized)\n", "Minimum absolute Force error: 9.164e-11 --> 7.252e-10 (normalized)\n", "Average absolute Force error: 1.650e-03 --> 1.013e-05 (normalized)\n", "R boundary error: 0.000e+00 --> 2.776e-17 (m)\n", "Z boundary error: 0.000e+00 --> 6.939e-18 (m)\n", "Fixed Psi error: 0.000e+00 --> 0.000e+00 (Wb)\n", "Fixed current profile error: 0.000e+00 --> 0.000e+00 (A)\n", "Fixed electron density profile error: 0.000e+00 --> 0.000e+00 (m^-3)\n", "Fixed electron temperature profile error: 0.000e+00 --> 0.000e+00 (eV)\n", "Fixed ion temperature profile error: 0.000e+00 --> 0.000e+00 (eV)\n", "Fixed atomic number profile error: 0.000e+00 --> 0.000e+00 (dimensionless)\n", "Fixed sheet current error: 0.000e+00 --> 0.000e+00 (~)\n", "\n", "==============================================================================================================\n", "\n" ] } ], "source": [ "eq0, _ = eq0.solve(objective=\"force\", optimizer=\"lsq-exact\", verbose=3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we have our initial equilibrium, which does not have a self-consistent bootstrap current: " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Initial Equilibrium')" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAF2CAYAAAB6XrNlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA7FAAAOxQFHbOz/AABFRElEQVR4nO3deXxMV/8H8M9IQhZJhDRiTSiNUELbiFISinqqlCpSe3e1VNES1T6WUkFRtZS2T2318ERpeao/rUctTasJiqjUFlnsEhIkk8h2fn8csyQSWWYmd+bO5/16zcu5M5N7v3ck35yce+73aIQQAkREpBrVlA6AiIjMi4mdiEhlmNiJiFSGiZ2ISGWY2ImIVIaJnYhIZZjYiYhUhomdiEhlmNiJiFSGiZ0s4sSJEwgLC4NGo0GLFi2wcOHCcn/t+PHjMX78+DLf17ZtW0RFRZVrn7Nnz4a/vz/CwsJKfc/kyZPh7+8PZ2dnhIWFFXn4+voiKSmpnGdQtgsXLuChhx7ChQsXAAAvvPACatWqhZkzZ+rfY/w57NixA23btoVGo6nU8T755BP07dvX5LjJRggiCwIg1qxZU6GvycrKEllZWfrtvXv3ipK+VW/cuCHy8/PLvd8ZM2aI0NDQMt/j5+d33/MjR44UiYmJ5T5WeVy/fr3IdmhoqJgxY4Z+u7yfQ3ncvXtXZGRkVOpryfY4Kvx7heg+rq6u5Xpf7dq1LRyJweTJk1G3bl2z7vOhhx564Ovl/RzKo3r16qhevbrZ9kfWjUMxVGVSUlL0wzOffvopXnzxRbRo0QKDBg1CXl4eAGD58uVFhkyio6PxzjvvAIB+WOTEiRN47bXX7hu6+Oyzz9CtWzd0794dTz75JD7//HOzxB0WFobWrVvDxcUFAJCXl4dJkyahZcuW6NGjBz766CP4+/ujRYsW+OKLLzBt2jT4+vpi1KhRAIBdu3ahRYsW8Pf3BwBkZmbqP4d9+/aVeMzin4Oxf//733j22WfRqlUrjBo1CpmZmQCAMWPGwNfXF0OGDMH48ePRpUsXVKtWDZ988kmR458+fRodOnSARqPRDy+Fh4fD2dkZa9euBQB88cUX+q9ZtmwZnn76aTRv3hy7du3C1q1b0bt3bzRp0gQbNmwwx0dM5qb0nwykbihhKAaAGDlypBBCDjd4eXmJLVu26F8vPmRS2hBE8aGLxYsXC61WK4QQIicnRzRr1kz89ttvpe63JDNmzBA1atQQoaGhRR7GZs+eLZo1a6Yf2ti4caPQaDRFznPkyJH6cxRCiDVr1tw3xANA7N27t9TzKe1zWLx4sRBCDq906tRJvP7660WOW6dOHZGUlCSEEOLDDz8UV65cue/4iYmJAkCR4SU/P78i57BmzRrh5OQk9uzZI4QQ4pNPPhH16tUTGzduFEIIERUVJTw9PUVBQUFJHyUpiD12UkS/fv0AyOGGRx55BGfPnjV5n23btsULL7yAp556Cs888wxSU1Px22+/VXg/vr6+2Ldvn/5R3Pr16zF48GB4enoCAIYMGWLWYZOyjBgxAoAcXhk1ahTWr1+PwsJC/eudOnWCn58fAHnR2NfXt9LHcnNzQ7du3QAAQUFBuHLlCnr37g1Aft63bt3CtWvXKr1/sgwmdlJErVq19G1nZ2fcvXvXpP0lJibiH//4BwYOHIjo6Gjs27cPbdu2RVZWlomR4r7kfvHiRfj4+BR5rk6dOiYfp7yMj+Xj44O7d+8iLS1N/5yXl5fZjqX75QUAjo6ORZ5zcnICAJP/78j87Daxnzx5EmFhYYiMjHzg+woKCjBv3jwsWbIEQ4YM0Y9BknU5cuQI7t69i/79++ufy83NNdv+4+PjkZqaCgBo1KgRrl+/rn9NCIEbN24UeX/16tWLJLz09HSzxWJ8rGvXrqFGjRrw9vau0D50F1ItFSMpy24T+19//YXOnTuX+b41a9agYcOGmDhxIr7++ms89dRTVRAdGdP1ELOysvCf//wHn3322X3vCQgIAAAcOHAAAJCUlITjx4+bLYaoqCicPHkSADBq1Chs3rwZGRkZAIBNmzbd90ukefPmOH78OAoKCpCfn48ffvjBbLF8/fXXAGRSXrNmDUaOHIlq1Sr2o1y3bl14eHjgzz//BCAv8Obk5JgtRlKY0oP8SpoxY4aYN2+efnvy5Mli9uzZYvTo0SImJkYIIUT37t3FwoULxZIlS8RHH31UZF4xlS4uLk6EhoYKACIgIEAsWLBAZGRk6J8LCgoSR48eFRMmTBCenp7Cz89PfPrpp2LZsmXCz89PeHp6ihdffFEIIUR+fr7o3bu3aNeunejQoYM4ffq0ePXVV/VfN2fOHCGEEJ9++qlo3Lix6N69u3j99ddFmzZt9PudNWvWffstbtasWSIwMFC4urqKAQMGFHkEBgbqL3Tm5uaKSZMmiRYtWogePXqIRYsW3Xfh8ebNm6J79+7i0UcfFeHh4WLWrFn6i7LFP4cffvhB9O/fv8j5FP8ctm/fLoKCggQAsXLlStGjRw/RsmVLMWLECHHnzh0hhBARERGibt26om7dukUuum7ZskUEBAToj6+b+79u3TrRpEkT0b17d/3xAgICxFdffSU2b96s/5rBgweLo0eP6o8fGhoqrly5IkJCQgQAERISIk6dOmXm7yAyhUYI+13zdObMmXB2dkZERAR27tyJzZs3Y8OGDbh+/Tr69OmDmJgYBAYGYsSIEZg2bRrWr1+Pw4cPl9hjJPvm7++PmTNn6qc4EimJNyjdc/LkSVy7dk0/5q67GcXd3R2PP/44ACAkJARLly5VLEYiovJgYr+nVatWSExMREREBABg8+bNAIDOnTsjOTkZgJwN0axZM8ViJOsUFhaGq1evIjIyErm5uXjjjTeUDonsnN0m9q1bt+LAgQNwcnJCYGAgnn/+efz666+YOXMmcnNzERwcDAB4//33MXnyZKSmpuLs2bOYP3++wpGTtSnt7lEipdj1GDsRkRrZ7XRHIiK1srvELoRAdnY2+IcKEamV3SX2nJwcuLq68mYMIlItu0vsRERqx8RORKQyTOxERCrDxE5EpDJM7EREKmO3d56WRgiBgoICFBQUKB2KTXNwcICDgwM0Go3SoRDZHSZ2I3l5ebhy5YpZVt0huaxavXr19CvtEFHVYGK/RwiBxMREODg4oGHDhnBycmJvs5KEEMjLy8P169eRmJiI5s2b87MkqkJM7Pfk5uaioKAAjRo1gouLi9Lh2DxnZ2c4OjoiKSkJeXl5+qXYiMjyePG0mIouMUal032WLN9AVLWYxYiIVIZDMURUIXfvAsePA+fOARcuAJcvy+dr1ABcXYFmzYDAQPlwdVU2VnvFxG7DTpw4gfHjx2P//v0ICAiAr68vsrOzkZaWhuHDh2PmzJkV3ufatWsRGRmJnJwcJCUlITY2Fm+//TZiYmKQmJgIf39/s58HWTchZCLftg3Yuxc4dEgm97I4OQG9egHh4UDfvkDNmpaPle5RahVtpWi1WgFAaLXaIs/n5OSI+Ph4kZOTo1BklQdArFmzRr+9e/duAUB88803ldrfmjVrhJ+fn347MTFRABCJiYkV2o8tf6YkRHKyEB98IESTJkLI9F75R61aQixYIER2ttJnZR/YY1eh7t27o3bt2jh48CCGDh2qdDhkQ4QA9u8HFi8Gdu4ECguLvu7iAoSEAB07Am3aAI0bAw0aAA4OshefkQGcPg3ExwM//wzExsqvy8gApkwBVqyQ+37hhao+M/vCxF6Gn34CZswA7tyx/LHc3YFZs4BnnjF9X/n5+fDz8wMAXLt2DRMmTMDFixcBAI899hjmz5+vn9YZGxuLcePGoVq1amjYsCFat25tegBkU4SQifzjj4GDB4u+VquWTMQvvAA8/TTg7PzgfT32mPz3o4+A8+eBtWtlMs/KApKTgQEDgIkTgfnz5XANWYDSfzJUtYoOxXTvbvqfoRV59OhR8XNCsaGYb7/9VowYMUJkZWWJgoICERISIsaMGSOEECI/P1/07dtXjB8/XgghREZGhqhdu7ZYsWKFEEKIrKws0b59ew7F2JFffxXiySfv/14MCRFi7Vohiv2oVMrVq0K8+aYQGo1h/126yOfJ/NhjL8O778reelX12CdPrtzXRkZGYu3atTh//jwKCwuxefNmuLq6IjY2FjExMVi3bh0AWcNlxIgRGD58OJYuXYoffvgBGRkZePXVVwEArq6uePHFF7FixQpznRZZqXPn5Pfbjh1Fn3/2WWDaNOCpp8x3rLp1gVWrgH79gCFDgPR04MABoEsXYN8+oF498x2LOBRTpmeeMc/QiKVFRERg1KhRSE9PR+fOnfHaa68hPj4eSUlJAIDXX39df8NQTk4OfHx8kJqaiosXL8LT0xM1atTQ78vb21uJU6AqkpUFzJsHLFwI5OYann/mGfl8u3aWO3avXsCRI3JY59gx4MwZoFs3OdvG19dyx7U3TOwq4+XlheXLl6Nr16749ttv9dMTN2/ejPr16+vfd/36dfj4+KBRo0a4desW7t69q0/uaWlpSoROVWDXLmD0aDnWrdO2LfDJJ3L8vCo0aSIv0D7zDPDHH8CpU/LYe/cCPj5VE4Pa8c5TFQoLC0OPHj0wb948PPHEE2jfvj1WrVqlf33v3r3o27cvAOC5555D7dq18cUXXwAAtFotNm3apEjcZDmpqcDQocA//mFI6rVry+GRw4erLqnreHjIXzLBwXI7Ph4YNAjIz6/aOFRL6UH+qqameexxcXEiNDRUABABAQHivffe07926NAhAUB06NBBbN68Wbz00kviySefFF27dhXPP/+8SElJ0b83NjZWBAcHi/bt24vevXuLKVOmiBo1aojQ0FARExMjQkJCBAAREhIiDh8+XO74bPEzVaOtW4V46KGiF0ZfeUWItDSlIxMiPV2IoCBDXFOnKh2ROmiEsK8KTdnZ2XB1dYVWqy1SxfHu3bs4f/48mjZtWmS8mSqPn6my0tOB8eOBjRsNzzVvDqxeDXTtqlxcxZ0/L6dI3rolt7dvl3eqUuVxKIZIhfbvB4KCDEldowEmTZKlAawpqQNA06bA+vWG7REjgJQU5eJRAyZ2IhXJywPef18m7wsX5HNNm8pEv2iRvHPUGvXtK+9MBWTPffx4ZeOxdUzsRCqRlCTnhc+bJ0esAeDll+W0ws6dlYysfObOlX9lAHJu/fbtysZjy5jYiVTgu+/k/PM//pDbtWoBUVHA11/LG99sgaOjnKWjW0Vx/HggM1PZmGwVEzuRDcvLk2PnL7wgC20BskDX8ePAwIGKhlYpHToAb7wh2xcuyNpJVHFM7EQ26uJFIDQUWLLE8FxEhLxFv3FjxcIy2bx5hhuVliyRpQ+oYpjYiWzQL7/IKYK6Soy1awM//iiToq1XTPTykpUfAaCgAJg9W9l4bBETO5ENEULWeOnRQ95NCsj66EePyrtK1WLYMCAgQLY3bpRlB6j8mNhtWHR0NMLCwqDRaPBMKZXK8vLy4O/vj1q1aiEsLAwbNmxA27ZtodFo0KFDB+zevRsAcPPmTYSFhcHZ2Rn+/v6YfK/M5OTJk+Hv7w9nZ2eEhYUhNDQU7dq1w5tvvomEhIQqO1eSxbvCw+W0QN0CGGPHyiqJtjz0UhJHR7kOAiDPlb32ClL61teqpqaSAjqurq4CgDh06NB9r3311VfCzc1NhIaG6p/bu3dvqfXV/fz8xIwZM4o8N2PGjCL12XNzc8X8+fOFh4eH2LdvX6lx2fJnam0SEoRo3dpw672zsxDr1ikdlWUVFAjRqpU8X41GiBMnlI7IdrDHrgLBwcF47LHHMGfOnCLPFxQUYP369ejTp49Zj+fk5IQpU6Zg+PDhGDJkCLKzs826fypqzx5ZLOvECbnt5wf8/ru8Q1PNqlUzzIoRgjNkKoKJXSU++OAD7NixA3/99Zf+uc2bN6Nfv34Wq9Pyxhtv4PLly/rhHDIvIYBly2R525s35XNdu8pqjJasmW5N+vc33LS0bVvRcsNUOtZjL4uNLHrar18/tGrVCnPnzsWmTZsghMBXX32FnTt3YsyYMSV+TXh4OJyLLWB59erVch/zkUceAQCcPn26wvHSg+XmyvHzr74yPPf227IsgKMd/dRWqybn6Y8cKcfaV640zJih0tnRt0glffIJEBNTdcdbtKhSiV2j0WD69OkYNmwYZs+ejbi4OPTs2ROurq6lfs3mzZv1C3HoFN9+EGFfhUGrTFqaXPD5wAG57eQEfP45cG/1QrszeDDw3nvA9evAl1/KftYDvq0JTOxls5VFTwEMGjQIM2fOxLx585CcnIzvvvvOjMHd7++//wYAtGjRwqLHsSfx8UCfPrKULSBv1Nm61bzrj9qaGjXk3ahz5shSxBs3Aq+/rnRU1o2JvSy2sugpgGrVqmHatGl4+eWX8eGHH8LDw8Oix/viiy9Qr149dO/e3aLHsRc//yzLANy+Lbdbtwb++195sdTejR4NREbKFZaWLQNee81QU4bux4unKjN06FB8/PHHmDBhgsWOkZeXh/nz52Pjxo3YuHFjkQVLqHJWrQKefdaQ1Pv0AX77jUldp0EDOTwFyNlB+/crG4/VU3q+ZVVT0zx23dJ4np6eReapGxs8eLCoW7eu/j3r168XQUFB+qXufv75ZyGEEDdu3BChoaGiRo0aws/PT0yaNEkIIcSkSZOEn5+ffqm8zp07i6CgIPHaa6+JM2fOPDA+W/xMq1pBgRCTJhVdtm7yZCHy85WOzPr89pvhMxo8WOlorBuXxruHy7iZHz/TB9NqgeHD5TQ+AHBwkLM+dNUNqSgh5NTHEycAZ2fg6lXA01PpqKyTVQ7FJCQkYNiwYfjkk0/wyiuvYNeuXfe9p0OHDggLC0NYWBg++OADBaIkqrzr1+WcdF1S9/AA/u//mNQfRKORvwgBICcH+PZbZeOxZlZ58fTmzZsYMWIEevbsidTUVAQHByMpKanIe3r16oWZM2cqEh+RKc6ckQW7dDNfGjUCdu6UF0vpwYYOlaWJCwuBDRvsdwpoWawysQcHB+vbhYWFcHNzu+89J06cwIIFC5CZmYmXXnoJgYGBJe4rLy8P+fn5+m3e/k5K+v13ub7njRtyu1074IcfgPr1lY3LVtSvDzz9NLB7t7yAmpQEVODWC7thlUMxxpYtW4bIyMj7np82bRqmTJmCiRMnYsCAAcjJySnx6+fOnQtXV1f9o06dOpYOmahE338vk5IuqffqJW9CYlKvGOMaORs3KheHNbPqxL5x40bUr1+/xCJWTzzxBADAy8sLnp6eOFfKMivTp0+HVqvVP27ofqpKYWfXki2Kn6XBqlVyup6u//Hqq3LB5po1lY3LFvXvD+j+iF+/3rBwNxlYbWKPiopCeno6xowZg59++gnZ2dlISUkBAJw6dQpr164FICsYXr16FQ0aNChxP05OTnBxcSnyKO19AKDVas1/MnZK91k62fqSPiYQAvjnP4G33jLUUJ85U94ab8cfi0nc3Axz2s+cAQ4dUjYea2SVY+yHDx/GG2+8gbZt2+Lbb79FSkoKoqOjERoainPnzsHDwwM7duzApUuXcOHCBcyePRteXl4mHbNatWqoXbs2rl27BgBwdXWFhre2VYoQAlqtFteuXUPt2rVRrZrV9h8sqqAAGDMG+OILuV2tGrB6tbxrkkwzfLjsrQPAli1A+/bKxmNtOI/diBAC169fx01djVQySe3ateHj42OXvyBzcuQMDt10RmdnICpK3lFKpsvPB+rWleWMmzaVC17b4bdZqZjYS1BYWIi8vLwqjkxdnJyc7LanfucO0K+fXHAaAGrVkjNfOnVSMir1efll4N6ILI4fB9q0UTQcq2KVQzFKq1atGu+UpEpJS5M1X3TjvvXry5L+jz6qbFxq9MILhsS+bRsTuzH77FIRWcClS0CXLoak3qyZLOTFpG4ZPXoYZsdYuEK1zWFiJzKD8+eBzp2BeyXqERQEREfz5hlLcnaWfx0BQFwckJCgbDzWhImdyETx8XIhjMREud2xI7Bvn7y4R5b1wguGNnvtBkzsRCY4dgwIDQWuXJHb3bvLBTNq1VIyKvvx7LNA9eqyrZuBREzsRJUWGysrNKalye2+feWKRyWUNiIL8fCQv0wB4OBBwy9Ye8fETlQJv/0mE0pGhtwOD5dlZJ2dFQ3LLj3/vKH988/KxWFNmNiJKujAAbkMrm5981GjgG++YYkApfTqZWiXsHSDXWJiJ6qAfftkLfWsLLn95pvAv/4lVz8iZTRuDOiqdv/8syzlYO+Y2InK6Zdf5MU6XZ24ceOAzz+XNWBIWc88I/+9eRM4ckTZWKwBvyWJyuGXX4DnngN067RMmAB89hnrk1gLDscUxcROVIb9+4sm9YkTgSVLmNStSZcuhgvXP/2kbCzWgImd6AGio4HevYv21BctYlK3Ni4u8n4CAPjjDyA9Xdl4lMbETlSKmJiiF0rHj2dP3ZrpxtkLC4E9e5SNRWlM7EQl+PNPmSgyM+X2W28BS5cyqVszjrMbMLETFXPyJNCzJ3Drltx+5RVg+XImdWvXogXQqJFs//STfa+FysROZOTcOXlHqW7N8yFD5NJ2nNJo/TQaWcoXAC5elBU37RW/XYnuuXhRJvWrV+V2//7AunW8+ciW6C6gAnI2k71iYicCkJoqe3vJyXK7Z09g0ybAkWuM2RQmdomJnezenTvyjtJTp+T2U0/J2t5cHdH2+PkZFjfZt0/JSJTFxE527e5dufD04cNyu21bufC0q6uSUZEpdL32lBQgKUnRUBTDxE52q6AAGDZMlgsA5Bqlu3YBnp7KxkWm4XAMEzvZKSHkXaTffiu369UDdu/mcnZqEBZmaNvrcAwTO9mlefOAFStk29NTznvmwtPq4O9vmM/OHjuRnVi7Fpg+XbZr1AC2bwdat1Y0JDIjjcYwHJOYKMfa7Q0TO9mV3buB11+XbY0G2Lix6JgsqYPxcIw99tqZ2MluxMUBAwYA+flye+lSuU3qY+8XUJnYyS5cvCjnquvWKZ08WVZrJHV6+GF5QRwAfv9d2ViUwMROqpeZCfTpA1y6JLdffBFYsEDZmMiyNBrgySdl+++/7a8+OxM7qVpBgSzkdeyY3H7ySWD9ehb1sge6xA7I2vr2hN/epGrvvQf897+y3aSJnAHj4qJsTFQ1OnQwtA8eVC4OJTCxk2p9+aVc8QiQc9V/+AF46CFlY6Kq8/jjhiJuTOxEKrB/PzBmjGw7OABbtgAtWyobE1UtFxegXTvZjomRS+bZCyZ2Up3z54tOa/zsM8MCDGRfdOPst2/Li6j2gomdVOXOHaBvX8MKSG+9Zei5k/0xvoBqT8MxTOykGoWFwMiRcs1SAOjWTd6ERPaLiZ3Ixs2ZIxfIAOQMmKgowMlJ2ZhIWY0bG25UYmInsjE7dgAzZsi2q6uc1linjrIxkfI0GsO0R3u6UYmJnWzemTPA8OGG7XXrWK2RDOzxRiWrXKo3ISEBM2bMQNu2bREfH49BgwahV69eRd4TFRWF2NhYaLVahIeHo0uXLgpFS0rKzAT695ezHgBg2jRZMoBIp3hiL5ZKVEkjhBBKB1HcoUOHkJ6ejp49eyI1NRXBwcFIMlq88Pbt2wgLC8ORI0eQk5OD4OBgxMXFoVo57hPPzs6Gq6srtFotXHgLok0TAggPl2PpgJzS+H//J+etE+lotYC7u7y43qePHLZTO6vssQcHB+vbhYWFcHNzK/J6TEwMAgICoNFo4OLiAjc3NyQkJKB58+b37SsvLw/5ugnNkImd1GHpUkNS9/MDNm1iUqf7ubrKm9P++suwaLnaWf0Y+7JlyxAZGVnkubS0NNSsWVO/7e7ujrS0tBK/fu7cuXB1ddU/6vCKmir8/rusAwPIVZC2buXFUirdE0/If69cAS5fVjaWqmDViX3jxo2oX78++vTpU+R5b29vZGZm6rfv3LkDb2/vEvcxffp0aLVa/eOG7s4VslmpqcCgQYY7S5cvl3VBiEqjS+wAcOSIcnFUFatN7FFRUUhPT8eYMWPw008/ITs7Gyn3Fi8MCQnB6dOnIYRAdnY2srKy8PDDD5e4HycnJ7i4uBR5kO0qKACGDjXUVh8xAnj1VWVjIutn/IvfHoZjrPLi6eHDh9G9e3e0bdsWAJCSkoLo6Gh06tQJ586dg4ODA6KionDw4EFotVoMGTIEoeVcuJIXT23bnDnAhx/K9qOPAn/8ARS7BEN0n+xseQG1oECupLVzp9IRWZZVJnZLYmK3XQcOAF27ytkNbm6y59WihdJRka1o2xY4fhzw8QGuXpU3L6mV1Q7FEBlLTQVeeslQenXVKiZ1qhjdOPv164ahPLViYierV1gIjBplmM3wyivAsGGKhkQ2yJ7G2ZnYyep99hnw44+y3bIlsGyZsvGQbTKeGcPETqSgo0eBKVNk29kZ+M9/5A0nRBXVpo2h2qfapzwysZPVysqS4+p5eXJ7yRI5E4aoMmrUMBSHO3xYlqRQKyZ2slrvvAOcPi3b/foBb76pZDSkBrpx9rQ04N5tMarExE5W6bvvgK++ku0GDWRbzdPTqGoYX0A9elS5OCyNiZ2szpUrwOuvy7ZGA2zYwDowZB737nkEABw7plQUlsfETlZFCODllw2LUU+eLG9KIjKH1q0BXXVvJnaiKrJyJfDTT7Ldpo0sIUBkLq6uwCOPyPbx48rGYklM7GQ1zpwpWop340b5L5E56YZjkpKAjAwFA7EgkxfayM3Nxfbt27Fr1y6cPHkSGRkZ8PDwQMOGDdG1a1f069cPjRo1MkespGL5+bJSo24dlI8/5tRGsoygIGDzZtk+fhwoZ/1Am2JSYt+yZQuioqLQpUsXjBs3Dg0bNoSXlxe0Wi3S0tJw+PBhzJ07F+7u7pgxY0aRxTGIjC1YYFhoODRUTnUksoTiF1DVmNgrXd1x1apVaNKkCZ555pky33vlyhWsXr0aEydOhKenZ2UOZzas7mh9jh8HgoPljUg1awJxcUCTJkpHRWp19SpQr55sjxoFrFmjaDgWUenEfvXqVfj6+pb7/UIIpKamwsfHpzKHMxsmduuSlwe0b2+YofDll8BrrykaEtkBX1/g2jWgXTvgzz+Vjsb8Kn3xVJfUMzIyEB8fX+b7NRqN4kmdrM+8eYak/o9/cDUkqhq64ZiTJ4HcXEVDsYhKJfYJEyagffv22Lt3L3r06IGXXnoJH3/8sbljI5U7fhz46CPZ9vAAvviCd5dS1QgKkv/m5gKnTikbiyVUKrE/9dRTiI6OxsGDB3Ho0CEcP34czZs3N3dspGJ5eXJ8U7cg9ZIlQMOGioZEdkTtd6BWKrFnZ2dj5cqVePnllwEA27dvh4ODg1kDI3VbuLDoEMy9byWiKmGc2NV4o1KlEnufPn0QFBSEevcuLcfHx6Np06ZmDYzU69QpYNYs2XZ3B1av5hAMVa1HHgF0cyfU2GPnYtZUpQoLgc6dgd9/l9uffw6MHq1sTGSf2rcHDh0CateWZXzV1LmwSEmBW7duIS4uzhK7Jhu3cqUhqXfpArzxhrLxkP3SXUC9eVNWFFUTsyX2a9euYcuWLThx4gQ8PT2RkZGB9evXm2v3pAIXLgDTpsm2s7OssV6N1YpIIcYlK/76S7k4LMHkWjE67733HurXr48vv/wSly5dQr9+/ZCTk2Ou3ZONEwIYOxbIzJTbM2cCnEhFSiqe2Hv2VC4WczNbYu/ZsyeGDRsGALhx4wZ27NjBC6qkt20b8N//ynZQEDBpkrLxEOnWPwXYYy9VYWEh0tPT4eXlhTp16uinQhJlZADjx8u2RiPLBuhWiydSio8P8NBDQGoqcOKE0tGYl9lGOJ2cnBAcHIwPPvgAe/bs4TAM6b3/vuHi1Ntvy4JfRNZANxxz8qScsaUWZkvsf/75J7766iv4+Phg+fLlaNq0Kfr27Wuu3ZONio0FVq2S7YYNDSUEiKyBLrFnZwOJicrGYk5mG4oJCAhAWFgYwsLC8Pbbb0MIgZSUFHPtnmxQfr6co667U2LZMnlDEpG1KH4B9eGHlYvFnMzWY2/ZsiX27t2r39ZoNPDz8zPX7skGrVgBHD0q2889Bzz/vLLxEBWn1imPZuuxL1myBL/99hvq1q2Lrl27IiwsDKGhoYovrEHKuHQJ+PBD2XZxkb11Nd3ZR+qg1sRuth57x44dkZKSgi1btiAwMBCbN29G7969zbV7sjHvvgvcuSPbM2YA/v6KhkNUIg8PoHFj2VbTzBiz1YrJyMjA9u3b8cILL8DdigdSWSvG8vbuBbp1k+3AQFlkqXp1RUMiKlXv3sCPPwKOjkBWljq+VyvVYz948CCmTp2K3bt3Q/d7oVatWhg5cqRVJ3WyvLw8eYepzvLl6vhBIfXSDcfk5wNnzigbi7lUaoz9ySefREhICP73v/9h6tSpcHZ2xvPPP4/HH3/c3PGRjVm6FPj7b9kePNjQcyeyVsXH2Y23bZVZhmKys7Oxfft2HDp0CD4+Phg4cKDVlhPgUIzlXL4MBATIejBubrLuOldFImt37Jhc1BoApk8H5sxRNByzMMusGBcXF4SHhyM8PBxpaWmIiopCQkICmjVrhkGDBqFOnTrmOAxZualTDUW+/vlPJnWyDS1ayCqjhYXquYBq0YU2zp8/j6ioKKSmpqJDhw4YOHCgpQ5VbuyxW8bvvwOdOsn2I4/IHxCOrZOtCAiQ4+vNmgFnzyodjelMSuwbN27E0KFDy/Xe+Ph4tGzZsrKHMhsmdvMrKABCQoAjR+T2jz/KdUyJbEW/fsD27bLnnpUl1wuwZSbNY1++fDlu3LhRrvdaQ1Iny1izxpDUn3uOSZ1sjy49FRaqY2aMSWPsNWvWxK5du5CWlgaNRoMmTZqgS5cuZrnb9OTJkxg7dix69eqFiIiI+17v0KEDnO/9Wn3qqacwRw1XPGzQrVuyeiMgh16WLFE2HqLKCAw0tP/+G2jTRrlYzMGkxL5o0SK0MfoEEhMT8f333yMlJQV37txBt27d0KtXr0rt+6+//kLnzp1Lfb1Xr16YOXNmpfZN5jN3rqxnDQDvvCPHKIlsTfHEbutMSuxtSvi1duzYMaxZswbNmjUzafhl8ODB+PsBn/CJEyewYMECZGZm4qWXXkKg8f+Mkby8POTn5+u3s7OzKx0TFXXuHPDpp7Lt4yOnihHZohYtDO34eOXiMBezTHfcvXs3PvvsM+zbtw8DBw7E7t27EWzh1RSmTZuGJ554Aunp6ejUqRP+/PNP/dCMsblz52LWrFkWjcVeTZki7zQFZM/dw0PZeIgqq2ZNWTMmJUUdPXaTLp5+/vnnCAwMxNixY9G1a1ekpKTg66+/tnhSB4AnnngCAODl5QVPT0+cO3euxPdNnz4dWq1W/yjvxV56sL17ge++k+2gIIArIZKt0/3Rf/q0LC9gy0xK7O+//z6mTJmCM2fOYNKkSfDy8jJXXCXSLdxx6tQprF27FgBQUFCAq1evokGDBiV+jZOTE1xcXIo8yDQFBUUXo16yBHBwUC4eInPQjRzn5QHnzysbi6lMGop5+eWXUb9+fXz55ZcQQsDd3R0dO3bUL7CxdetWDBgwoFL73rp1Kw4cOAAnJycEBgaiR48eCA0Nxblz5+Dh4YEdO3bg0qVLuHDhAmbPnm3xXypk8M038jZsQC6e0bWrouEQmUXxC6iPPKJcLKYy6QalhIQEPGy0llRmZiZ+/fVXJCYmIi8vD6tWrXrgBVAl8AYl02i18hv+0iVZ5vTkSdv+ASDSiY4GdBPxPv4YmDZN2XhMYVKP/eFiCwTWrFkT/zC6OyUmJsaU3ZMVWrxYJnUAeOstJnVSDzVNebRorZiYmBiEhIRYaveVwh575V29KuepZ2UBnp5yuqO3t9JREZlP3brA9evA448Dhw8rHU3lVeriaXJyMnJycsp8n3FSt7YhGaq4WbNkUgfknHUmdVIb3QXUU6dkeQFbVanE3qBBAyxevBh/lWP114KCAvzrX/9CQkJCZQ5FVuL0aeDLL2W7cWNg/Hhl4yGyBN1wTFYWcOGCsrGYolJj7I6OjoiIiMCqVaswd+5cBAcHIzg4GN7e3qhRowbS09Nx8eJFHDhwAJcuXcI777yDDh06mDt2qkLvvy+nOQJyIQJbr35HVJLi4+z3JvjZHJPH2HNycrB7927s2bMHFy9eRGZmJh566CEEBASgV69e+huJrAXH2Cvu4EGgY0fZDgoC/vxTljclUps9e4Du3WV70aKi92vYEpNLCjg7O6NPnz7o06ePOeIhKyOELB2gM38+kzqpl3GP/dQp5eIwFX9E6YF27pTzewHg6aeBnj2VjYfIkurVk3VjAHldyVYxsVOpCgqK3qQRGQloNMrFQ2RpGo1cJg9gYieV2rQJ0E18GjgQsLLLJUQWoSvhe+0akJGhaCiVxsROJcrNBf75T9l2cAA++kjZeIiqiq7HDthur52JnUr05ZdAYqJsv/JK0W92IjVTQ2I3eVbM7du3sXHjRpw8eRKFhYVo1aoVhg0bZpZ1T0kZWVmGHrqzs6HnTmQPjFdTstWZMZVO7AcOHMD3338PNzc3vPTSS3jrrbcAAPHx8ViwYAG0Wi369euH0NBQswVLVWP5cjm+CADjxgENGyobD1FVat5cXkQVwnZ77BW6QSk1NRXr1q1DcnIyunTpgn79+sHJyanE9+bl5eG7777D/v374e/vj5EjR8LHx8dsgVcWb1B6sFu3gCZNgPR0wN1dLjjAmjBkb5o0AZKSgFatDBMIbEm5e+wffvghatSogeHDh+sX0ngQJycnDBo0CIMGDUJycjJWr16Nu3fvYs6cOSYFTJa1eLFM6gAwcSKTOtmngACZ2M+eldN+bW2FMIuW7bVG7LGXLi0NaNoUuHMH8PKSF095qYTs0YQJwGefyfa5c0CxpSesHmfFkN6CBTKpA7KMAJM62SvjC6i2OM5ucmKPj4/Htm3bkHFvJv+2bdvQv39/fPDBB7h7966pu6cqcu2avGgKAD4+LMtL9s14yqMtzowxabrjv//9b4wYMQJCCDRu3Bjr1q3DoEGDUFhYiB07duDmzZtYuXKluWIlC1qwAMjOlu1p0wA3N2XjIVKSrc9lN2mMPTAwEB4eHmjSpAliYmLg6OiIESNGIDg4GMePH8fKlSuRnJxsznhNxjH2+125IsfWc3JkEaSEBIAfDdkzIQAPDyAzEwgNBfbtUzqiijGpx+7n54ddu3YBkAnzlVdewYcffggA6NWrFw4ePGh6hGRxkZEyqQOyt86kTvZOVwzsyBHbHIoxaYzd1dVV33ZxcUGTJk2KvF69enVTdk9V4NIlYPVq2W7QAHj9dWXjIbIWxsXAbt1SNpaKMqnHfvLkSbz//vv67f379xfZLs+aqKSsyEhAd417+nQueUekU/wCakiIcrFUlElj7NXKWEpHo9GgQLdQppXgGLvBpUtybD03F2jUSN6MUaOG0lERWYeoKGDwYNnesAEYNkzZeCrCpB57p06dSr2TVAiBmTNnmrJ7srD582VSB+TYOpM6kcEjjxjaZ84oF0dlmJTYx40b98AiX2PHjjVl92RBly8DX3wh2w0bytK8RGTQrJmhbWuJ3aSLp4N1f6eUYuDAgabsnixo/nzD2HpEBHvrRMXVrCknFAB2ltjJNl25YuitN2gAvPqqsvEQWSvdcMyZM3Juu61gYrdDn3ximLceEcGZMESl0SX2rCzZIbIVZk3s8fHxWK2bFE1WKTUVWLVKtn192VsnehBbvYBq1sR+9uxZ7Ny505y7JDNbsgTQamX7vfd4lynRg9hqzRjWY7cjN28C/v6yNK+3t1xIgMW+iEp39qyh1z5pErBokbLxlBfH2O3IsmWGeuuTJjGpE5XF3x9wvDcp3G6HYsh63bkDLF0q27VqAbzFgKhsTk7y7mzAjhK7tZXkpdKtWmVYy/Ttt2VJUiIqm24o5vx5IC9P2VjKy6Q7T4cPH465c+eipGH6hg0boqnuVx0pKjvbMDbo5iYTOxGVjy6x5+fL61LNmysaTrmYlNijo6MRFhZW4msajQbr16/HkCFDTDkEmcGaNbL0KAC89RZQp46y8RDZkuJTHm0hsZs0K8bPzw/dunUr8bWkpCRkZmbi0KFDlQ7OEuxtVkxenvxGTE4GqleXPY569ZSOish27N0L6NLc4sXAxInKxlMeJvXYH3vsMaxZs6bE1zIzM/WrKZFyNm2SSR2Qhb6Y1IkqxhZvUjLp4mlpJXsXLFgALy8vHDt2rNL7PnnyJMLCwhAZGVni61FRUXj33XcxZswYHDhwoNLHUbPCQrmQBgA4OMgbkoioYurXB3SLxdlKYjepx96qVasSn3d3d0fNmjXx2muvVXrff/31Fzp37lzia7dv30ZkZCSOHDmCnJwcBAcHIy4ursyFP+zNjh3A33/Ldni4YdoWEZWfRiN77ceO2U5iL3cmPFOBM3rrrbeQnp6OoUOHFnn+7Nmz5d7H4MGD4eDgUOJrMTExCAgIgEajgYuLC9zc3JCQkFDie/Py8pCdnV3kYQ+EAObNM2xPnapcLES2Tjccc/GiLAhm7cqd2A8fPoyxY8dixYoVyMjIKPcBbt26heXLl2Ps2LGIjY2tTIz3SUtLQ82aNfXb7u7uSEtLK/G9c+fOhaurq/5Rx06mhOzfD+g+7ueeA1q3VjYeIltmPBOmlD6kVSn3UMyQIUMwZMgQnD59GosWLUJWVhb69u1b6nTHvXv3Yvv27XB3d8eQIUMwbtw4c8UMb29vZGZm6rfv3LkDb2/vEt87ffp0TDXqrmZnZ9tFcje+NBERoVwcRGpQ/AJqmzbKxVIeFR5jDwgIwEcffYT8/Hxs374d48ePR+PGjTF8+HBoNBqsXbsWKSkp6Nq1KxYuXAgnJyezBZuSkoLGjRsjJCQEU6dOhRACOTk5yMrKwsMPP1zi1zg5OZk1Bltw9Cjw00+y/dRTQKdOysZDZOuMe+wVGFFWTKUvnjo6OmLAgAEYMGAALly4gK+//hqFhYUYPnw4/Pz8TA5s69atOHDgAJycnBAYGIgePXogNDQU586dg4eHByIiIjBp0iRotVqsWLGCF06NLFhgaLO3TmQ6W5vyyLK9KnP+vOxdFBYCjz4KxMXJq/pEZJratWW9pU6dgOhopaN5MHZzVWbxYpnUAWDKFCZ1InMxXv/U2jGxq0hqKvD117LdqJGcu05E5qEbZ09NBSowMVARTOwqsmKFrOQIyIU07OyaMZFFGY+zW/sFVCZ2lcjKApYvl20vL8CEm36JqAS2NDOGiV0l1qwBbtyQ7TFjAKP7t4jIDGxpZgwTuwoUFMiLpgBQowYwfryy8RCpkXGPnYmdLG7bNiAxUbZHjgTq1lU2HiI1cncHfH1lm0MxZFFCAAsXyrZGIy+aEpFl6HrtZ87Inz1rxcRu4379FdAtUtW3LxAQoGw8RGqmG2e/fVtOe7RWTOw2TtdbB4B331UuDiJ7YCvj7EzsNuzUKeCHH2S7QwcW+yKyNFuZy87EbsN0M2EAYPJklg8gsjT22Mmirl8H1q+X7aZNgf79lY2HyB48/LChA8UeO5ndypXA3buy/c47crFqIrIsFxegcWPZZo+dzCo7W9aFAYBatYCXX1Y0HCK7ohtnP3fOUEnV2jCx26D16wHdEq+jR7N8AFFV0o2zZ2cDly4pG0tpmNhtTGEhsGSJbDs5sXwAUVWzhZoxTOw25scfgdOnZfull4D69ZWNh8jeMLGT2RlPcWT5AKKqx8ROZnX0KLB3r2w//TQQFKRsPET2yM/PsIgNEzuZTDe2DrC3TqQUR0c5nx1gYicTXboEbNok24GBQK9eysZDZM90wzGJiUBurrKxlISJ3UYsXw7k58v2xIlANf7PESlGl9gLCgxrIVgTpgcbkJUFrF4t297ewLBhysZDZO+s/QIqE7sNWLcOSE+X7bfekrc1E5FymNjJJIWFwKefynb16nKhaiJSFhM7mWTnTkMVuaFDDWsuEpFyfH0NpTyY2KnCjKc4TpyoXBxEZKDRGHrtTOxUIceOGW5I6t4daN1a0XCIyIgusV++DGRmKhtLcUzsVoy9dSLrZc3L5DGxW6krVww3JAUE8IYkImtjzRdQmdit1IoVQF6ebPOGJCLrw8ROFZKdDaxaJdu1awPDhysbDxHdzzixnzqlXBwlYWK3Qhs2ADduyPbo0YCrq7LxENH9PD0N0491ayRYCyZ2K2N8Q5KTEzB2rKLhENEDtGgh/z11ChBC2ViMMbFbmZ9+Av7+W7YHD+YKSUTWTJfYs7Ksa/1TJnYrwymORLZDl9gB6xpnZ2K3IidOALt3y3ZoKPDYY8rGQ0QPFhBgaFvTODsTuxXRja0DXCGJyBawx04PdO0a8M03st2sGfDcc8rGQ0Rla9wYcHaWbWtK7I5KB1CaqKgoxMbGQqvVIjw8HF26dCnyur+/P/z9/QEAL774IsaNG6dAlObz+eeGJbbeeYc3JBHZgmrV5HDM8ePWldg1QljTJB3p9u3bCAsLw5EjR5CTk4Pg4GDExcWhmlG2mzlzJmbOnFnhfWdnZ8PV1RVarRYuVrJiRXa2XPk8NRWoVQu4cMFQEpSIrFt4OPCf/8j27duAu7uy8QBWOhQTExODgIAAaDQauLi4wM3NDQkJCUXe8+uvv2LhwoWYMWMGLl68WOq+8vLykJ2dXeRhbTZulEkdAN54g0mdyJYYj7NbS2kBq0zsaWlpqGmU3dzd3ZGWllbkPfPnz8d7772H4cOHo3///qXua+7cuXB1ddU/6tSpY7G4K6OwEFi8WLYdHYHx45WNh4gqxhovoFplYvf29kamUYHjO3fuwNvbu8h7nnjiCQBAs2bNcPHixSLvNzZ9+nRotVr944buXn0rYXxDUng40LChsvEQUcUYJ3ZrmfJolYk9JCQEp0+fhhAC2dnZyMrKQtOmTXHhwgUAwJ49e7D73oTvW7duwcHBoUgP35iTkxNcXFyKPKyJrrcO8IYkIltkjcXArHJWjIeHByIiIjBp0iRotVqsWLECiYmJGDp0KGJiYuDj44NZs2bh0KFDOHv2LP71r38pHXKlHD8O/O9/sh0WxhuSiGyRq6uc/JCcbD2J3SpnxViSNc2KGTUKWLdOtv/7X85dJ7JVzzwD/PwzUKOGrBvj4KBsPFY5FGMPLl0C/v1v2X7kEeDZZ5WNh4gqTzfOfveu7LkrjYldIcuWGVZImjyZNyQR2TLjC6i6yRBKYjpRwJ07hhWSHnqIKyQR2brAQEM7Pl65OHSY2BXw1VfArVuyPW4cYGUTdYiogh591ND+6y/l4tBhYq9ieXmGKo4uLsCYMYqGQ0Rm4O1tWCaPid0OffstkJIi2y+/LL8hiMj26Xrt8fFAQYGysTCxVyEhgPnzZVuj4Q1JRGqiS+w5OcD588rGwsRehX7+Wd6UBAADBsi660SkDsbj7CdOKBcHwMRepXS9dQCYOlW5OIjI/KzpAioTexU5dAjYu1e2u3UD7tUwIyKVaNnS0GZitxPsrROpm7s7cG9RNyZ2e3DmDLBtm2y3awf06KFsPERkGbrhmDNnZHkBpTCxV4HISDkjBgCmTJEzYohIfVq3lv8WFChbm52J3cKSk4ENG2S7eXNg4EBl4yEiy7GWmTFM7Ba2YAGQny/bERHKl/MkIsuxlpkxTOwWdOUKoFsDpFEjYNgwZeMhIssKCDB03pjYVWrRIsMFlClTgOrVlY2HiCyrRg3DUnlM7Cp0/bqhNG/dusCrryobDxFVDd1wTFIScPu2MjEwsVvIwoVyiSwAePddluYlshdBQYb20aPKxMDEbgHXrgErVsh23boszUtkT4KDDe1Dh5SJgYndAubPB7KzZXvqVLmKORHZB+NyIbGxysSgEUJ364x9yM7OhqurK7RaLVwsMD5y5QrQtKks3enrK8t3chiGyL40bw6cOydLDCQmVv3x2WM3s3nzZFIHgPffZ1Inskft28t/k5KA1NSqPz4TuxmdP2+YCdOgAfD668rGQ0TKUHqcnYndjKZPl2uaAsCsWYCzs7LxEJEydD12QJlxdiZ2Mzl8GNi8WbZbtgRGjlQ2HiJSTtu2hjtQ2WO3UUIUrbEeGQk4OioXDxEpy9XVUOkxNtZQ3bWqMLGbwa5dwC+/yHbnzsBzzykbDxEpTzfOnpYmq7xWJSZ2E929C0yYYNhesID11olI2XF2JnYTLVoEnD0r28OGAR06KBsPEVkHJWfG8AYlEyQnA4GB8i5TDw+5Yoqvr5kCJSKblp8v80J2NtClC7B/f9Udmz12E0ycaCgdMHs2kzoRGTg6Gnrtf/wB3LlTdcdmYq+k776TD0Be/R47Vtl4iMj69O4t/83NBX76qeqOy8ReCVevGu4q1WiAlSs5vZGI7te3r6G9fXvVHZeJvYKEkItm3LghtydPBp56StmYiMg6tWhhWFFp507D+seWxsReQatXAz/+KNutWwNz5igbDxFZN12vPT0diI6ummMysVeAEMBHH8l29erAN9/INQ6JiErz/POGdlUNxzCxV1DLlrIGxNKlQJs2SkdDRNbuyScBb2/Z3r69asoLMLFXgEYD/PyzrK88erTS0RCRLXBwMJQZSUwETp60/DGZ2CtIowG8vJSOgohsifFwzI4dlj+e1U7Si4qKQmxsLLRaLcLDw9GlS5ciry9duhQ3b97E5cuXMXHiRLRs2VKhSImIHqxHD9khTE8HtFrLH88qE/vt27cRGRmJI0eOICcnB8HBwYiLi0O1avIPjISEBOzcuRM///wzkpOTMXLkSOzbt0/ZoImUohu0FcL8D+P9Fj9WeWg0hofxdrVqhn9Lejg4GN6jAm5usgrsgQPAW29Z/nhWmdhjYmIQEBAAjUYDFxcXuLm5ISEhAc2bNwcA/PLLL3j88ccBAH5+fjh16hRyc3NRvXr1+/aVl5eHfKPJo9m6GgAVERUFTJokSznWrCkXMn3QN5zxN31JPwClvV5Su6QfrrK+rqT3lvQDWdFjVCSG4s8Zq+jzllJW0jA1qZT3+6A8/1+lJW+102hkkjd+ODrKh65t/FxJj9K+Rvcw/kWiexj/QtJ9Hxh/7oWF8lFQYHjk5xseeXlFt/Pz0f7eA2vufW2rVsCaNYC7u9k/NqtM7GlpaahZs6Z+293dHWlpafrEXvz1mjVr4saNG6hXr959+5o7dy5mzZplWkDffANcuqQLzrR9EVH5CWFIjmpz6hQwfHjRAXgzscrE7u3tjczMTP32nTt34K2bL3Tv9fPnz+u3MzMzUadOnRL3NX36dEw1Wt4oOzu71PeWatYsOWH92jUgK8tQ+au40np4xs+X9J7SXi/eYyjPe42fL+v18h6jrP0+qF3Zz8TSyurtmtIbrsg5l/dzL2n7Qa8V73UWf29FHiUd80HnqVPakI5xr1f3b0GBbBcUFO0JF+8V63rGxdt5eUV7zbq28fPGbd2+zUmjkX8NODnJvwCcnOTD+DnjvxLatAG6dTNvDPdYZWIPCQnB1KlTIYRATk4OsrKy0LRpU1y4cAGNGjVCt27dsGXLFgBAcnIyWrRoUeIwDAA4OTnBycnJtIDatQPuHY+IVMJ4SEX3C8T4l43uF1DxX7i6X5rGwzgODlZ1PcBq67FHRUXh4MGD0Gq1GDJkCBo0aIChQ4ciJiYGgJwVc/36dVy9ehWTJ08u96wYc9ZjJyKyRlab2C2FiZ2I1I43KBERqQwTOxGRyjCxExGpDBM7EZHKMLETEakMEzsRkcowsRMRqQwTOxGRylhlSQFL0t2PVakqj0REVsDZ2RmaB5QwsLvEnpOTAwAVLwRGRGQlyrpz3u5KChQWFiIjI6PM33jF6apC3rhxQ3WlCHhutknN5wao+/xMPTf22IupVq0aateuXemvd3FxUd03mQ7PzTap+dwAdZ+fpc6NF0+JiFSGiZ2ISGWY2MvJ0dERM2bMgKOj+kaveG62Sc3nBqj7/Cx9bnZ38ZSISO3YYyciUhkmdiIilWFiJyJSGfVdlTCDqKgoxMbGQqvVIjw8HF26dCny+tKlS3Hz5k1cvnwZEydOLPdC2tbgQecWGxuLlStXolWrVoiLi8OECRPwxBNPKBhtxZT1/wYAf/zxBzp37owLFy7A19dXgSgrr6zz27NnD6Kjo1FQUIATJ07gu+++UyjSinvQuRUUFGDMmDFo0KABkpOT0a1bNwwdOlTBaCvm5MmTGDt2LHr16oWIiIj7Xi/P922FCSri1q1bol27dqKwsFBotVrRqlUrUVBQoH/93LlzokePHkIIIZKSkkRoaKhCkVZcWee2fft2ERcXJ4QQIjY2VlXnJoQQmZmZYuzYscLPz09cuXJFoUgrp6zzu3nzpnj++ef127r/R1tQ1rnt3r1bf27p6emibt26CkVaOZs3bxYffPCBmDdv3n2vlef7tjI4FFNMTEwMAgICoNFo4OLiAjc3NyQkJOhf/+WXX/D4448DAPz8/HDq1Cnk5uYqFW6FlHVuffv2RevWrQHI0gtubm5KhVphZZ0bAMyZMwfTpk1TKELTlHV+P/74I9zc3LB48WJ88MEHKCwsVDDaiinr3Ly9vXHjxg0AQGpqKoKCgpQKtVIGDx4MBweHEl8rz/dtZTCxF5OWloaaNWvqt93d3ZGWllbq6zVr1tR/01m7ss7N2OrVqzF79uyqCs1kZZ3bzp070aZNGzRo0ECJ8ExW1vldvHgRx44dw4QJEzBlyhQMHjzYZiqYlnVubdu2RUhICEaPHo3Ro0fjzTffVCJMi6jIz2RFMLEX4+3tjczMTP32nTt34O3tXerrmZmZNlMpsqxz01m4cCH69u2r/8vEFpR1br/88guSk5MRGRmJW7duYfny5YiLi1Mi1Eop6/zc3d0RFBQEBwcHeHh4wMvLC+fOnVMi1Aor69y2bt2KtLQ0rFq1Ctu2bcPo0aORlZWlRKhmV96fyYpiYi8mJCQEp0+fhhAC2dnZyMrKQtOmTXHhwgUAQLdu3XDkyBEAQHJyMlq0aIHq1asrGXK5lXVugLww3KRJE/Tr1w/ff/+9csFWUFnntmjRIkRERCAiIgKenp4YN24c2rRpo3DU5VfW+XXu3BnJyckA5JoDN27cQMOGDZUMudzKOrfLly/Dx8cHgPwF5uTkpGS4ZpGSkgKg5HN/+OGHTd4/7zwtQVRUFA4ePAitVoshQ4agQYMGGDp0KGJiYgDI5Hf9+nVcvXoVkydPtrlZMaWd2/fff4/XXnsNjz76KADg+vXriI+PVzji8ivr/w0AFixYgHnz5uHNN9/ExIkTUbduXQUjrpiyzi8yMhLp6enIyclB+/btbWrmyIPO7datWxg9ejQCAwNx7do1tG7dGqNHj1Y65HLbunUrVqxYAScnJ4wZMwY9evRAq1atcO7cOTg4ONx37qGhoSYfk4mdiEhlOBRDRKQyTOxERCrDxE5EpDJM7EREKsPETkSkMkzsREQqw8RORKQyTOxERCrDeuxEZnTs2DEcP34ct2/fxujRo1Vx+zvZHvbYiczk119/xYYNGzBy5EjUqlUL8+bNUzokslPssROZQUFBAcaOHYvo6GgAgJeXF9atW6dwVGSv2GMnMoNff/0VTZo0gYeHBwDg+PHj+oqERFWNiZ3IDPbt21dkrcrvvvtOVQtCkG1hYicyg+joaOTn5wMANm3ahI4dO5ql/CpRZbBsL5GJCgoK0KBBA2zbtg1nz56Fo6OjTdVCJ/XhxVMiEx09ehStWrVCx44d0bFjR6XDIeJQDJGpoqOj0alTJ6XDINJjj53IRL6+vujZs6fSYRDpcYydiEhlOBRDRKQyTOxERCrDxE5EpDJM7EREKsPETkSkMkzsREQqw8RORKQyTOxERCrDxE5EpDJM7EREKvP/wnN4U8ybJWwAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plot_1d(eq0, \" Redl\", linecolor=\"b\", lw=2, label=\"Redl\")\n", "fig, ax = plot_1d(eq0, \"\", linecolor=\"r\", lw=2, label=\"MHD\", ax=ax)\n", "ax.legend(loc=\"best\")\n", "ax.set_title(\"Initial Equilibrium\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We need to create a grid on which to evaluate the boootstrap current self-consistency. \n", "The bootstrap current is a radial profile, but the grid must have finite poloidal and toroidal resolution to accurately compute flux surface quantities. \n", "The Redl formula is undefined where the kinetic profiles vanish, so in our example we do not include points at $\\rho=0$ or $\\rho=1$. " ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "grid = LinearGrid(\n", " M=eq0.M_grid,\n", " N=eq0.N_grid,\n", " NFP=eq0.NFP,\n", " sym=eq0.sym,\n", " rho=np.linspace(1 / eq0.L_grid, 1, eq0.L_grid) - 1 / (2 * eq0.L_grid),\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our current profile will be represented as a power series of the form: \n", "\n", "$I = c_0 + c_1 \\rho + c_2 \\rho^2 + \\mathcal{O}(\\rho^3)$\n", "\n", "Physically, the current should vanish on the magnetic axis so $c_0 = 0$. \n", "And in order for the MHD equilibrium to be analytic, it should scale as $\\mathcal{O}(\\rho^2)$ near the magnetic axis so $c_1 = 0$ also. \n", "However, the Redl bootstrap current formula scales as $\\mathcal{O}(\\sqrt{\\rho})$ near the magnetic axis. \n", "This is incorrect, because the drift-kinetic equation from the Redl formula does not account for finite orbit width effects that become important near the axis. \n", "\n", "Typically, we use even power series with `sym=True` for all equilibrium profiles to give the desired analycity conditions. \n", "For bootstrap current optimizations, it is recommended to use the full power series with `sym=False` while also enforcing $c_0 = c_1 = 0$. \n", "This prevents getting good self-consistency near the magnetic axis, but allows for good agreement throughout the rest of the plasma volume and results in high quality equilibria overall. \n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "eq0.current = PowerSeriesProfile(np.zeros((eq0.L + 1,)), sym=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Optimization" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this method, we will optimize the current profile to minimize the self-consistency errors evaluated by the `BootstrapRedlConsistency` objective. \n", "This objective requires the helicity, which for QA is $(M, N) = (1, 0)$. \n", "\n", "In this example we will only optimize the current profile, so all other profiles and the plasma boundary are constrained to be fixed. \n", "It is recommended to use a very small value for `gtol` when optimizing the bootstrap current. " ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "eq1 = eq0.copy()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Building objective: Bootstrap current self-consistency (Redl)\n", "Precomputing transforms\n", "Timer: Precomputing transforms = 778 ms\n", "Timer: Objective build = 1.81 sec\n", "Building objective: force\n", "Precomputing transforms\n", "Timer: Precomputing transforms = 48.4 ms\n", "Timer: Objective build = 169 ms\n", "Timer: Proximal projection build = 7.69 sec\n", "Building objective: fixed atomic number\n", "Building objective: lcfs R\n", "Building objective: lcfs Z\n", "Building objective: fixed current\n", "Building objective: fixed electron density\n", "Building objective: fixed electron temperature\n", "Building objective: fixed ion temperature\n", "Building objective: fixed Psi\n", "Timer: Objective build = 914 ms\n", "Timer: Linear constraint projection build = 1.14 sec\n", "Number of parameters: 7\n", "Number of objectives: 16\n", "Timer: Initializing the optimization = 9.79 sec\n", "\n", "Starting optimization\n", "Using method: proximal-lsq-exact\n", " Iteration Total nfev Cost Cost reduction Step norm Optimality \n", " 0 1 2.247e-02 1.912e-08 \n", " 1 2 6.983e-05 2.240e-02 1.240e+07 8.642e-10 \n", " 2 3 2.308e-06 6.752e-05 2.478e+07 2.717e-12 \n", " 3 4 1.756e-06 5.518e-07 4.869e+07 7.449e-12 \n", " 4 5 1.472e-06 2.842e-07 6.806e+07 8.706e-12 \n", "Warning: Maximum number of iterations has been exceeded.\n", " Current function value: 1.472e-06\n", " Total delta_x: 1.415e+08\n", " Iterations: 4\n", " Function evaluations: 5\n", " Jacobian evaluations: 5\n", "Timer: Solution time = 2.47 min\n", "Timer: Avg time per step = 29.7 sec\n", "\n", "==============================================================================================================\n", "\n", " Start --> End\n", "Total (sum of squares): 2.247e-02 --> 1.472e-06, \n", "Maximum absolute Bootstrap current self-consistency error: 2.834e+06 --> 3.997e+04 (T A m^-2)\n", "Minimum absolute Bootstrap current self-consistency error: 1.649e+05 --> 3.325e+03 (T A m^-2)\n", "Average absolute Bootstrap current self-consistency error: 1.782e+06 --> 1.283e+04 (T A m^-2)\n", "Maximum absolute Bootstrap current self-consistency error: 3.021e-01 --> 4.262e-03 (normalized)\n", "Minimum absolute Bootstrap current self-consistency error: 1.758e-02 --> 3.545e-04 (normalized)\n", "Average absolute Bootstrap current self-consistency error: 1.900e-01 --> 1.368e-03 (normalized)\n", "Fixed atomic number profile error: 0.000e+00 --> 0.000e+00 (dimensionless)\n", "R boundary error: 0.000e+00 --> 0.000e+00 (m)\n", "Z boundary error: 0.000e+00 --> 0.000e+00 (m)\n", "Fixed current profile error: 0.000e+00 --> 0.000e+00 (A)\n", "Fixed electron density profile error: 0.000e+00 --> 0.000e+00 (m^-3)\n", "Fixed electron temperature profile error: 0.000e+00 --> 0.000e+00 (eV)\n", "Fixed ion temperature profile error: 0.000e+00 --> 0.000e+00 (eV)\n", "Fixed Psi error: 0.000e+00 --> 0.000e+00 (Wb)\n", "Maximum absolute Force error: 8.548e+05 --> 2.073e+06 (N)\n", "Minimum absolute Force error: 2.348e+00 --> 1.686e+01 (N)\n", "Average absolute Force error: 3.282e+04 --> 8.041e+04 (N)\n", "Maximum absolute Force error: 2.670e-04 --> 6.476e-04 (normalized)\n", "Minimum absolute Force error: 7.335e-10 --> 5.265e-09 (normalized)\n", "Average absolute Force error: 1.025e-05 --> 2.512e-05 (normalized)\n", "\n", "==============================================================================================================\n", "\n" ] } ], "source": [ "objective = ObjectiveFunction(\n", " BootstrapRedlConsistency(eq=eq1, grid=grid, helicity=(1, 0)),\n", ")\n", "constraints = (\n", " FixAtomicNumber(eq=eq1),\n", " FixBoundaryR(eq=eq1),\n", " FixBoundaryZ(eq=eq1),\n", " FixCurrent(eq=eq1, indices=[0, 1]), # fix c_0=c_1=0 current profile coefficients\n", " FixElectronDensity(eq=eq1),\n", " FixElectronTemperature(eq=eq1),\n", " FixIonTemperature(eq=eq1),\n", " FixPsi(eq=eq1),\n", " ForceBalance(eq=eq1),\n", ")\n", "eq1, _ = eq1.optimize(\n", " objective=objective,\n", " constraints=constraints,\n", " optimizer=\"proximal-lsq-exact\",\n", " maxiter=4,\n", " gtol=1e-16, # it is recommended to use a very small gtol\n", " verbose=3,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When plotting the bootstrap current profiles, we see the MHD equilibrium now has very good agreement with the Redl formula. " ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Method 1: Optimization')" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAF2CAYAAAB6XrNlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA7FAAAOxQFHbOz/AABPEklEQVR4nO3deXxM1//H8ddkIXuCEHtCEcROrM1CafXbWlo7RbVailK0ltJSpUIXtCitVlFtai2/arVqKWk1Qe1bLRH7kiCSTPac3x8jI6kl6+TOTD7PxyOPx8ydyb2fm8jbmXPPPUenlFIIIYSwGjZaFyCEEKJwSbALIYSVkWAXQggrI8EuhBBWRoJdCCGsjAS7EEJYGQl2IYSwMhLsQghhZSTYhRDCykiwi0cKCwsjODgYnU7HU0899cD3pKam4uPjg4eHB8HBwSQmJubrWBs3bqRRo0bodLqClJxNSEgIPj4+BAcH5/jeDRs2UKlSJaZOnZrv4507d46BAwfSqlUrgoODad68OePHj+fOnTv53mdWnTt35qOPPirQPho1asSqVasKpZ4HSU5OplKlSuzevdtkxxA5UELkgpOTkwLUnj177nttyZIlytnZWQUFBeVpn97e3mrp0qXZtm3fvl0V9j/LKVOm5Fjb66+/rt566y1VsWJFNWXKlHwd59ixY6p8+fJq9erVxm2pqalqzJgxqn79+io2NjbX+4qMjFSAioyMzLb99u3bKjk5OV/1ZYqJiVFpaWkF2kempUuXKm9v7/u237hxo1D2L/JHWuwiV/z9/WnSpAnTp0/Ptj09PZ3ly5fTqVMnjSorHGPHjmX27NnY29vnex8DBw6ke/fudO/e3bjNzs6ODz/8kIyMDN55550C1+nu7k6JEiUKtI/SpUtja2tb4FoexdPT06T7F48mwS5ybfLkyWzcuJEjR44Yt4WGhtK1a1dKlix53/v37dtH27ZtCQoKonXr1nz++efG15599lmuXr1KSEgIwcHBfPjhh9m+NzQ0lGeeeYbq1asTEhKS7bUDBw7QoUMHAgMDadWqFVOnTiU1NdX4+qZNm2jYsCFt2rRhwIAB3Lp1K8dz8/b2zvXP4UGOHDnCnj176NKly32v2djY0LlzZ1auXIlSimHDhlG+fHm6d+/OSy+9REBAAPXq1eObb74B4PTp0/Tu3RuA3r17ExwczJYtW5g8eTLly5fnxRdfBLJ3XYWGhvL0009TrVo1li1bxo4dO3j++eepXr06s2bNMtYyePBgPDw8jN1NO3bsMHZVBQcH06xZM3Q6HXPnzgXg+++/54knnqB9+/a0bt06WzfVmjVrCAkJ4erVq8bvv3HjBs8++ywODg7G8wGIjIykS5cuBAYG0rp1a0aOHElCQgIA06ZNM9YwZcoUgoODqVmzJr/99luBfifFmtYfGYRlCAoKUhkZGapevXqqd+/eSimlMjIyVHBwsEpISFADBw7M1t1x+fJl5ebmplatWqWUMnz8r1Klilq7dq3xPY/qisnc/tdffylbW1t19epVpZRSV65cUe7u7mrNmjVKKaUSEhKUv7+/Gj9+vFJKqdOnTyt7e3u1adMmpZShS8DHxyfX3UTe3t4P7IpZvXq1Kl269H1dI5l++OEHBaiTJ08+8PVFixYpQF2/fl0ppdTAgQOVi4uLOnv2rFJKqYMHDypbW1v1559/KqUe3hUzcOBANXDgQOPzzJ/XihUrlFJKrVmzRjk5OanPPvtMKaVUREREtp+fUobfZeY57tq1S82cOdP4Ws+ePZW/v7+xu+eLL74w1pyenq4CAwPVypUrje9/WFdM1t9tQkKCqlatmvroo4+UUkqlpaWpLl26qF69ehnfP2XKFOXk5KSOHDmilFLqgw8+UH5+fg/8WYqcSYtd5JpOp2PSpEmsXr2aU6dOsW7dOp588kmcnJzue++KFStwcnKiR48egOHjf5cuXfjiiy9ydayuXbsC0KRJE9LT0zl79iwAy5cvx9nZmW7dugHg5OTE4MGDmT9/PkopQkNDKVeuHP/73/8AQ5dA5uOC8PT0pHbt2jg7Oxd4X5mCg4OpVq0aAA0aNKBly5bZWrl5kdkV1rBhQ/R6PQEBAYDhQmnWn99/Pf7440yYMAGAzz77jC1btrBq1Spjd0+zZs0YMmQIbdq0oV27dpw8eZI///wzT7X99NNPREVFMXz4cABsbW0ZNmwYP/zwA9evXze+r2bNmvj5+QHQuHFjTp06lafjiHvstC5AWJaePXsydepUZs6cSVRUFOvXr3/g+86dO0dCQkK20Si3b9+mdOnSuTqOh4cHgLGLJzk52bhfLy+vbO/18vIiISGB6OhoLl68SLly5bK9Xhj9vcHBwY8MtDp16gBw/vx5atWqdd/r58+fx9PTM1stZcqUyfaecuXKcfHixXzV5+7uDhj69LM+z7xmkPnze5iIiAjeeustVq9ejY+PDwBxcXF06NCB4cOHs27dOgBefPFFYxdKbp07dw53d3ccHByM2zJ/h1FRUcbfV+bvHMDBwYGUlJQ8HUfcIy32Bzh69CjBwcH39e3+V3p6OjNnzmTOnDn07ds3360tS2JjY8PEiRP55ptvePzxx3Fzc3vg+3x8fChfvjw7duwwfu3du5c1a9YU6Pg+Pj5cvXo127Zr167h7OyMp6cnVapUydYKBIiOji7QMXOjfv36NG3alI0bN973mlKKjRs3MmDAgGxDOWNiYrK979q1a1SuXNnktf7XzZs36dmzJ2+88Ua2i+AnT54kJibG+OkJyFfY+vj4EBsbS1JSknHbtWvXgIJf2xAPJsH+AEeOHDF+lH2UpUuXUrlyZUaPHs3XX3/N448/XgTVaa9fv3588MEHjBo16qHv6d+/P9evX2fr1q3GbdOnT892Ic/d3Z2EhASSkpJ44okncnXs/v37k5CQwNq1awHQ6/V89dVXDBs2DJ1OR9++fblx4wb/93//BxhCfcOGDfk5zWx27NhBmzZt7vtPI6vly5ezevVqY+sWIC0tjfHjx+Pg4MC0adOyvT8sLIzIyEjAcEE4PDzceGE0s8WdkJDAn3/+ybhx4wp8Dg+ilGLAgAF4e3szY8YMwPDpYujQofj4+FCyZEl27twJwK1bt4yPM2X+DgE++eQT4+8lq2effZYqVaqwYMECwNAgWrhwIT169Ljv05UoJBr38ZutKVOmZLuoNHbsWDVt2jQ1dOhQFR4erpRSqn379urDDz9Uc+bMUe+//75KSEjQqlyTOXTokAoKClLu7u4PvQDZq1cv5eXldd979u7dq9q1a6cCAgLU448/rkaMGJFtDPZXX32latSoofz9/dX8+fPVjh07VMOGDRVg3E9QUJACVMOGDdWOHTuUUkrt27dPPfHEEyogIEC1aNFCvfPOO9n2+/PPP6sGDRqoVq1aqeeff169+uqryt3dXT333HMPPc+FCxeqoKAgVbJkSeXt7a2CgoLUiRMnjK/ndPE005kzZ1S/fv1UixYtVFBQkGrevLmaMGGCio+Pz/a+gQMHqj59+qghQ4aogIAAVbdu3fsuJL/yyiuqXr16yt/fX4WFhalJkyYpLy8v5eXlpUaMGHHfz+vKlSuqRYsWClAtWrRQV65cue/n9/LLLyt3d3fl7e2tpk+frlasWKEAFRAQoLp166a6deumnn76aeMF2tDQUFW9enUVGBioXnjhBdW2bVvl5eWlJkyYoJRS6s6dO6pVq1aqRYsWKiAgQEVHR6tnnnlGlSxZUvn6+qolS5YopQwXtTt16qQef/xx1bJlSzVs2DB1584dpZRSc+fOVd7e3srd3V2NGjVK7d+/P9t53b59+5E/c3E/nVKy5umDTJ06FQcHByZMmMCmTZsIDQ1lxYoVXL9+nU6dOhEeHk6dOnUYMGAAEydOZPny5ezdu5dPP/1U69KFBchsmReH7jtR9OTiaS4cPXqUa9euGfvcMy/8uLq60rRpUwBatGjBvHnzNKtRCCEySbDngp+fH5GRkcZhYaGhoQAEBAQQFRUFwMWLF6lRo4ZmNQrLMWzYMDZv3gzAG2+8YbwZSIjCIl0xD7B27VoWLFiAvb09w4YNo0uXLkyYMME4BMvf35/nnnuOmJgYxo4dS61atTh16hRTpkwxDhUTQgitSLALIYSVkeGOQghhZSTYs1BKkZiYiHyIEUJYMgn2LJKSknBycsp2h5wQQlgaCXYhhLAyEuxCCGFlJNiFEMLKSLALIYSVkWAXQggrI1MK5JFSivT0dNLT07UuxaLZ29tjYyPtCiFMQYI9D1JTU7ly5UqeV5AR97OxsaFKlSoPXFZPCFEwEuy5pJQiMjISW1tbKleujL29fbbVcETuKaWIjo7mwoUL1KxZU1ruQhQyCfZcSklJIT09nSpVquDo6Kh1ORbP09OTuLg4UlNTjeuaCiEKhzSV8khal4VDPu0IYTqSUkIIYWWkK0YIYRoZGaRevsHZ/bGcvujAvxccuaz3IEXZk5YG5ctDzZpQqxY0bAi2tloXbD0k2K3U4cOHef311/njjz/w9fWlfPnyJCYmEh0dTf/+/Zk6dWqe9/nNN98QEhJCUlIS586dIyIigpEjRxIeHk5kZKQsMlKcpabCrl3w118k7Ywgdc9+nGKvYK/S8QV8gWeAFOw5Th0O0pBttONjuhKLB15e8Pzz0KsXBAaC9NQVkEaLaJslvV6vAKXX6+97LSkpSR07dkwlJSVpUFn+AWrp0qXG51u2bFGA+vbbb/O1v6VLlypvb2/j88jISAWoyMjIPO3HUn+eIovUVKU2blSqXz+V4eGhFOT5K4kS6kc6q0B2GDcHBysVHq71yVk2abEXM+3bt6d06dLs3r2bfv36aV2OsERXr8KiRbBkCVy6BEDWBnY6NhyjLmd4jLQy5Sn1WCm8SqXg6aTH/eY5Spw4iO21KwCUJIUubKQLG/mNDkxiBjt2+NOiBfTrBwsXgpubBudo4STYC+DXX2HKFIiLK5rjubrCe+/BU08VbD9paWl4e3sDcO3aNUaNGsXFixcBaNKkCbNmzTIO6YyIiGDEiBHY2NhQuXJl6tevX7CDC8t17hx8+CF89RUkJ2d76Ti12UAXNtMRhzbN6P6iC126QNmyD9nXhQuwZg18/z3s2QPAk2zhSbbwIW8yiRmsXFmCvXth3TqoW9e0p2Z1tP7IYE7y2hXTvn2+Pn0W6KtDh7ydE//pilmzZo0aMGCASkhIUOnp6apFixZq2LBhSiml0tLSVOfOndXrr7+ulFLq9u3bqnTp0mrBggVKKaUSEhJU8+bNpSumuLl2TakRI5Sys8v2j/EW7moer6t6HFKurkqNHq3UmTP52P8ffyjVpk22fR8q0VTV5KQCpZydldqwodDPyqpJi70A3nzT0Fovyhb72LF5/76QkBC++eYbzp49S0ZGBqGhoTg5OREREUF4eDjLli0DwNbWlgEDBtC/f3/mzZvHTz/9xO3bt3n55ZcBcHJyonv37ixYsKAwT0uYq6Qk+OQTmDkT4uONm6OoymzGsZRBOJVx4q23YOhQcHfP53ECAw0XXtetg1dfhZs3qZ+yj/12/nRM+4mwhAC6d4cNG+Dppwvn1KydBHsBPPVUwbtFisKECRN48cUXuXXrFgEBAQwePJhjx45x7tw5AF555RXjjVdJSUmUK1eOGzducPHiRdzd3bPdGerp6anFKYii9ssv8PrrcOaMcdMFKjOVqSxnAE5u9kwaByNHGhocBabTQbdu0LIl9O8P27fjnHaHrXZP0TltHb+mduT55w1lBQcXwvGsnAR7MVKqVCnmz59P27ZtWbNmjXF4YmhoKBUrVjS+7/r165QrV44qVaoQGxtLcnKyMdyjo6O1KF0UlStXDIG+dq1xUyxufMDbfMpIUm0dGTIEpk59RP95QVSqBFu2GGr4/HNKpCXyk01nemaEsj7peTp1gj/+gCZNTHBsKyJ3nhYzwcHBdOjQgZkzZ9KsWTOaN2/OokWLjK9v376dzp07A/Dss89SunRpvvjiCwD0ej3ff/+9JnULE1MKli41XKXMEurLGEAt/mU242nV1pGDB2HBAhOFeiZbW8NBJk4EwC4jlR9s+9KKv4iPh5494c4dEx7fGmjdyW9OrGkc+6FDh1RQUJAClK+vr3rrrbeMr+3Zs0cBqmXLlio0NFT16dNHtWrVSrVt21Z16dJFnT9/3vjeiIgI5e/vr5o3b66eeeYZNW7cOFWyZEkVFBSkwsPDVYsWLRSgWrRoofbu3Zvr+izt52nVLl1S6umns128PEod9Tg7FShVoYJSoaFKZWRoUNu0acaabpfwVNU4o0CpPn00qsdC6JRSStv/WsxHYmIiTk5O6PX6+2ZwTE5O5uzZs1SvXl1mIywE8vM0E6GhMGwY3LoFQCp2fMDbfMDbpOpK8tpr8MEHBbgwWlBKwSuvGIZYAqfta+Of+he3KcXXX8OgQRrVZeakK0aI4ig21nCRsk8fY6gfoCFN2cdU3uOxOiUJCzP0iGgW6mC4qPr55/DEEwDUSD3Bl7pXAcWIERAZqWFtZkyCXYjiZvduaNQIvv0WMNwpOoO3aU4Ex2wbMGkS7N8PrVtrW6aRvb3hZqYaNQDortbQnxXo9TBmjMa1mSkJdiGKi4wMw5j0gADDXaRAJD4EsIvJzKBOgxLs2QPTp4PZ9Y55eMDKlcYpIBfajMCbc/z4o+EOcJGdBLsQxcG1a4abLt5+G+4uxL6SvjTiAHvsWvPuu4Y7+xs31rjOR2neHN59FwCXjDiWMwAb0hk5ElJSNK7NzEiwC2Httm83dL38/jsACTgxkG94gZVU8XMnPNwwB1GJEtqWmStvv224iQkIZBeDWMq//8K8eRrXZWYk2IWwVhkZ8P770L69YUZGDBdIm/AP39oMZPx42LfPwm72sbODZcuM/wuFMBEPbjFjhuF6sDCQYBfCGt24YZhY5d13DQEPLGIILfkbVdOXsDAICTHDvvTcqFXLeNXUk2imMpXYWMMIHmEgwS6EtfnrL0Nn+W+/ARCHC334jtdYxCsjHNi/H1q10rjGgpo0Ce5OgzGcBfhxhE8+gYQEjesyExLsViosLIzg4GB0Oh1PPWSmstTUVHx8fPDw8CA4OJgVK1bQqFEjdDodLVu2ZMuWLQDcvHmT4OBgHBwc8PHxYezdKSbHjh2Lj48PDg4OBAcHExQUROPGjRkyZAhnskweJYqIUjB3LiooyLgAxhH8aMZe/qzSh99/h88+A2dnjessDC4uMHs2AHakM5c3iImBxYs1rstcaH3rqzmxpikFMjk5OSlA7dmz577XlixZopydnVVQUJBx2/bt2x86v7q3t7eaMmVKtm1TpkzJNj97SkqKmjVrlnJzc1M7dux4aF2W+vM0W7GxSnXvnm1agGX0V07Eq0GDlLp9W+sCTSAjQ6nWrY3nG8Afqnx5pRITtS5Me9Jit3L+/v40adKE6dOnZ9uenp7O8uXL6dSpU6Eez97ennHjxtG/f3/69u1LYmJioe5fPMDhw2Q08zfcxAMkUZJX+ILxXsv44f+c+fprje8eNRWdzjDfwV1TeI+rVw1zmRV3EuzFwOTJk9m4cSNHjhwxbgsNDaVr164mm6fl1Vdf5fLly8buHGEiK1aQ7t8Cm1P/AnCWarTmL+J7v8KRozqefVbj+kwtKAjatgXgCbYRwE7mzzc04Yszi5yP/cyZM0yZMoVGjRpx7NgxevbsSceOHbO9Z9WqVURERKDX6+nduzeBgYGFX4iFLHratWtX/Pz8mDFjBt9//z1KKZYsWcKmTZsYNmzYA7+nd+/eODg4ZNt29e6QudyoVasWACdPnsxTrSKXkpJIf/0NbJcsxvbupo10YkzpZcxcVIoePTStrmhNmWIYq4+h1d7+2FbCwgw32BZXFhnsN2/eZMCAATz55JPcuHEDf39/42pAAHfu3CEkJIR9+/aRlJSEv78/hw4dMq4SVGg++gjCwwt3nzn5+OM8B7tOp2PSpEm88MILTJs2jUOHDvHkk0/i5OT00O8JDQ01LsSR6b/PH0UV9yaTKUVGkvBMD5yP7wMMc71MYganuo7jz0U2eHlpXF9Ry2y1b9/OE2zjcXaxeHGABLul8ff3Nz7OyMjA+T+X+cPDw/H19UWn0+Ho6IizszNnzpyhZs2a2d6XmppKWlqa8Xme+4MtZdFToGfPnkydOpWZM2cSFRXF+vXrC7m47I4fPw5A7dq1TXqc4iZ1/U+k9h2Ac5JhRsZrlOMVl1B6L27LzD6GbudiKUurfTyz6LY6gLlzobiu5GiRwZ7VZ599RkhISLZt0dHRuLi4GJ+7uroSHR19X7DPmDGD9957L/8Ht5RFTwEbGxsmTpzIoEGDeOedd3BzczPp8b744gsqVKhA+/btTXqcYiMtjcsvTaLiitnY3920kwCWPhnK4m8qUqGCptVpLyjIMB3lX3/xLJuomnKKZctq5rcdZPEs+uLpypUrqVix4n0jOzw9PYnPsqp6XFzcAxdhnjRpEnq93vgVExNj8pq11K9fPz744ANGjRplsmOkpqYya9YsVq5cycqVK+9bsETkXeLpS5yt1o6KK2Ybt31a8i0ufrOVrzdLqBuNHGl8OJwFLF5svOm2+NF6vGV+/fDDD+qzzz5TSim1efNmpdfrVVRUlFJKqdjYWNW4cWOVkZGh9Hq98vPzU+np6Tnu05rGsWcujefu7p5tnHpWvXr1Ul5eXsb3LF++XDVs2NC41N1vv/2mlFIqJiZGBQUFqZIlSypvb281ZswYpZRSY8aMUd7e3sal8gICAlTDhg3V4MGD1b///vvI+izt56mVwx9tVjG2nsax2jfxUDNabFBXrmhdmRlKSVGqYkWlQMXiqly4o7Zt07oobVjk0nh79+6lffv2NGrUCIDz588TFhZGmzZtOH36NLa2tqxatYrdu3ej1+vp27cvQUFBOe5XlsYrOvLzfLS4W2n81WEKHfbNxAbDn+h+u2Zc/HgVz75erfj2pedkxgyYPBmA1/mU5Fde5+5a7MWKRQa7qUiwFx35eT7cjm8v4jS4D82Tw4zbfqk1kmZbZ1O2svysHunGDVSVKuiSk/mXmrQudYLLV20sY0riQmTRfexCWJOYGPjkiZ+o17+RMdRjde5EjFvD0yfnSajnRtmy6Pr0AaAWp2h6a0vmNPTFigS7EBpTCtasTGZtlTcYs60Tnhgu4kd6+qPbv5/ms7ppXKGFGT7c+PBFviE0VMNaNCLBLoSGLl6EYU+cpPoLrXg18d4yQFHdx1DtUhhuDatpWJ2FatoUVa8eAM+xnu3rb1PcpiySYM8juSRROIr7zzEjAxZ9rgipsYSPtjehCfsBiHMsS9K6n/Fe/bGFrFVnhnQ6dC++CIADyfwv/gd++UXbkoqaBHsu2dsbbgvR6/UaV2IdUlNTAbCzs/h75PLsxAno1DqGssO6Mz/5FZwx/JuKbd4e19MHcHjuaY0rtAL9+qFsDbPoFMfumOL3V5VPNjY2lC5dmmvXrgHg5OSETsac5UtGRgbXr1/H2dm58OfvMWMpKYa1IcLe28pXaQOoxGUA0m3sUNM/wH38WChGPw+TKl8e3dNPw08/0Yq/eW3jCfT62jxieiSrIsGeB+XKlQMwhrvIP1tbW6pWrVps/nMMD4dhLyXR79jbbGaOcXuyTy1Krl4JzZppWJ2VevFF+OknAHolL2PbtpnWP43xXTKOPYtHjWPPKiMjw9iVIPJOp9Nhb29fLEI9Pt5wv8wf8w7wLf3w45jxNfXKq+jmfGIla9WZoeRk0rwqYhd7k0tUZPqrF/h8cfH4RCQt9nywsbGRm2pEjn79FYa9mkbv87OIYCr2GGYSTS9TFtuvl6Dr3FnjCq1cyZLY9u0Nny+kEpe5uu4v1KLHi8Vdu8Xjvy8hilB0NAwYACM7nmTl+ceZwWRjqKtOnbA9ehgk1IuErldP4+Og6DUcPKhhMUVIgl2IQqIU/PAD+NXJoPSKuRygES0xLMSiXFzgq6/QbdhA8VsJQ0OPP06Sh+Hn3Z01/LSxeEz3KMEuRCG4fBm6doW3e59hVXRb5jIaR5IMLwYGojt0CF56qRivhKERW1tsezwPQGUuce6HIl7xTCMS7EIUgFLw1VeGVnrVjZ9xiAYEsdPwmqMjzJ1rWNmnmtxBqhX73t2Nj/2OraY4DGqTYBcin86dgyefhJmDT/PjnbZ8xkjjzUa0aoXuwAEYNUrGpmstMJBEl7IAdGMNP2+y/oGA8i9OiDzKyIDPP4cGfunU+31O9la6g4NhkfNdu6BWLY0rFQDY2ZHe+TkAqnKBk9/u0bgg05NgFyIPIiOhfXv4dNhxNusDmMMYnLg7w1RmK33sWLh7O7swDy4v3uuOqbR7tdUvmSfBLkQuZLbSG9dLpeX2DzhAI1qzG7jblz5njqGV7uurcaXigdq2JcGhNABPJm20+mGPEuxC5ODCBXjqKfhi2H626VvwAZMoSYrhxaAgw4iXN96QVro5s7PjVvOOAPjyL/t+OK1xQaYlwS7EQygFy5dDU78kgn+fxB78jdPrKldXQxN+2zaoUUPjSkVulHrhGePjtI0/a1iJ6clcMVnkdq4YYf1u3IAhQ+DK+t18zUvU4cS9Fzt2hMWLoWpV7QoUeXfzpmE6BzL43fZJAvW/Wu2U99JiF+I/fv4ZWtRLIGD9aP6kjTHUValShib8zz9LqFui0qW5ULkVAAHpO9j3R7zGBZmOBLsQdyUmwogR8OEz29lyvQGjmYsNdz/Qdu+O7vhx6N9f7h61YGkd/gdASVKIWrpV42pMR4JdCODQIQhsHIffgtfYTjse4ywAqpwXrFkDq1fLHC9WoPKQe/3szts3aViJaUkfexbSx178KAXz58MvY7bwedpgvDl/78UBAwzDGEuX1q5AUbiU4rpjVcolX+QilSgdfwEnZ+v7BCYtdlFsRUdD72fisB85lJ/TnjSGenqFSoaVd5Ytk1C3NjodF+sbumMqc4mDy61zQLsEuyiWwsJgWJ3tzPqlPkNZbNyuBr2E7bEj8Mwzj/huYckcu/3P+Dhuza8aVmI6EuyiWMnIgI/f1/NP4ChWRbfDhygAUspVgl9+Qff1V+DhoW2RwqSqv9yWNAw3k5Xeb50XUCXYRbFx8ya8GRjBs+82ZqT61Lg99YUXKXHyiGF8urB6Jcu6ccLVH4C6t8JIjU/WuKLCJ8EuioV94Wl889g0Zv/ZGl/+BSDRzQs2bsR+xVJppRcz1+o9AYATiZxZ+bfG1RQ+CXZh9VbPOktKq0DG3J6CHekAxHbohuOZI9Cpk8bVCS04/O8J4+PYddbXHSPBLqxWSgp83f47nprQiFbKMBOj3s6VxEXLcP91NXh6alyh0Irvi61IxAEA933bNK6m8EmwC6t0/Ww8v1d+kZe29sONOAAuVWuD47+HcBwyQO4eLeY8Kzuw36kNAI/FhKPirGt6AQl2YXWO/nCYWF9//ndjGQDp2BD54lQq/bsDXTUfbYsTZuNKHUN3jD1pXF+7S+NqCpcEu7AqEa8tpXrv5tRMM0zcddW+MtGrd1Bt6RSws9O4OmFO7Dve62ePWW1d/ewS7MIqqMQk/mn6Cs0XvYQjSQDsq/gsbmcO4NU9QOPqhDmq1bsJsbgB4BohwS6EWUk6GcW5ym1o8s8SANKwZWvHD2lyYSNOVcpoXJ0wV75+dvxlHwxAlegDEBOjaT2FSYJdWLQ7G3eQVK8Z1W7+A8BVyvPn+9t54pc30dnIBVLxcDodXKoZbHyu//0v7YopZBLswjIpRfSUz3Dq0h6PtGgA/i4RwNVf9hM0WbpeRO7YBT9ufHzjxzANKylcEuzC8qSmcqPHMDynjTTecPRd6eFUPLaVRh3La1ycsCRVOjUiAScAbHdLsAuhjVu3uNniacquXQRACvZ8XPtL/ndmPlUfs9e4OGFpmra0529aAuB1YS8kJWlcUeGQYBeWIyqK2PptjDPyRVOGWe1/5/WDg2WqF5EvHh5wvLShO8Y+IwX27tW2oEJikcF+9OhRgoODCQkJeeDrLVu2JDg4mODgYCZPnlzE1QmT+Ocf9A1a4n7pOADHqc0XL4Uz6ddAq11pXhSNuIb3+tnjf7WO7hiLvGPjyJEjBAQ8/AJZx44dmTp1atEVJExryxZSnn0epxTDbd87COLglPW8PbWUxoUJa+D2ZEvSt9tgSwb6X8NweV/rigrOIlvsvXr1wtbW9qGvHz58mNmzZ/Puu+9y/Pjxh74vNTWVxMTEbF/CvKhVq0nr+Awl7ob69/TmzIJfGSWhLgpJowBXDtAIANfDfxpWY7FwFhnsOZk4cSLjxo1j9OjRdOvWjaSHXBCZMWMGTk5Oxq8yZeRmFnOivvgS1asXdhmpAMzRjcHmu5W8PKykxpUJa9K4MfypM3THOCbdhmPHtC2oEFhlsDdr1gyAUqVK4e7uzunTpx/4vkmTJqHX641fMVZ055mlU5/MQTfkVWxQAEyynUmNHz+iVx+r/CcrNOTkBOer3OtnV7ssv5/dav5Kzp83rDB/4sQJvvnmGwDS09O5evUqlSpVeuD32Nvb4+jomO1LaE/NDEE3dgwAGegYbreYoJ8n0Kmz3EkqTEO1bmN8rN/yp4aVFA6LvHi6du1adu7cib29PXXq1KFDhw4EBQVx+vRp3Nzc2LhxI5cuXeLChQtMmzaNUqWkP9ZSqGnvo5vyLmCY8+WVEssZsLkvbdtqXJiwajWDKnI2tBrViUT9ZflTC+iUUkrrIsxFYmIiTk5O6PV6ab1rQM34AN3kSQCkYsfAEt/z6q/dCQ7Wti5h/fbtg3+b9aEPoYYNN25Y9ApbVtMVIyzchx8aQz0Fe/rar2HwLxLqomjUrw//2Da/t2HPHu2KKQQS7EJ7n34K48YBhu6XF+x+4NVNXWjXTuO6RLFRogTcqnkv2FV4hIbVFJwEu9DW8uUwahRgWMLuBZvv6b/uOTp00LguUew4tGpMGob7Y5J2SbALkT8bNpAx6CXj05d03/Dcdz3o1EnDmkSxVbeZE4epD4DN3giw4MuPEuxCG3/8QXqPXthkGKbdfZ1PCfyyP716aVyXKLYaNYIIDN0xJe9Ew7lzmtZTEBLsougdPUpap67YpiYD8C7vUTnkdV5+WeO6RLHWoAHsIcsF1AjL7Y6RYBdF69Il0jp0xC7uNgALGIZ+zDuZ106F0IyLC1zzlmAXIm/i4kh76n/YXbkIwHq68nefT5n9oQ6d3FQqzICzf13icQYg7S8JdiEeLT2d9N59sTt6CIC/aMUXQd/x1Te22Mi/QmEmGjaxZR9NAdDt3wdpaRpXlD/yJyWKhBo3HtuffwLgDNWZWGcDoRscZZEMYVayXkC1TU6Eo0e1LSifJNiF6X31FbpPPgbgNu4M8vyJb38ti7u7xnUJ8R9Zgx2A8HDNaikICXZhWrt3kz50GGC4q7R/iVXM2VyHKlU0rkuIByhfHs6VaXZvwz//aFdMAUiwC9O5fJmUzt2wTUsBYDRzGPT9kzRtqnFdQjyETgelm/hwCw8AMv7Zr21B+STBLkwjOZmULt0pEX0FgKW8SMUZI3j+eY3rEiIHjZvojEvlceiQRV5AlWAXJpE++k1K7N0NQAT+bO/xORMmyphGYf4aNYL9NAbAJjkJTp7UtqB8kGAXhS80FNvP5wNwnbJM8VvLom8cZKy6sAgNG94LdgD2W153jAS7KFwnTpD64mDAsKzda27fsfjnKjg5aVyXELlUsyYctbfsYC/w0ngpKSls2LCBzZs3c/ToUW7fvo2bmxuVK1embdu2dO3alSoyBKJ40OtJfLY7jskJAEzVvcfw9e2pWlXjuoTIAzs7sKlbm8SDDjiSVPyCffXq1axatYrAwEBGjBhB5cqVKVWqFHq9nujoaPbu3cuMGTNwdXVlypQpuLi4FFbdwgwlDx+D4xnDDR2beQqXDybJYhnCItWpb8fhg/Vpzh4y/tmPjVJYUl9ivtc8XbRoEdWqVeOpp57K8b1Xrlxh8eLFjB49GnczvitF1jzNP7VmLboe3QG4TAUmPXOQr/+vrCX9LQhhNGsWeEwYwhC+MGyIjAQfH01ryot8t9i7du1K+fLlc/XeChUqMGXKFG7cuJHfwwlzFhVF8oDBOGDoVx9X4VsWfiehLixX/fqwMesF1AMHLCrY833xNDPUb9++zbFjx3J8v06no1y5cvk9nDBX6enEdXkBh8TbAHxoO5Gxm9rh5qZtWUIURL16lj0yJl/BPmrUKJo3b8727dvp0KEDffr04YMPPijs2oQFSJr+Ea4HwwDYTUtKzZtK48Y5fJMQZq5KFYhyrU96ZkQWh2B//PHHCQsLY/fu3ezZs4eDBw9Ss2bNwq5NmLsDB7Cb9g4A8Tjz/f++5ZVh9hoXJUTB6XTwWH0nTlAbAFUcgj0xMZGFCxcyaNAgADZs2ICtrW2hFibMXFISt599AbuMVADeLz2XaSsfk351YTXq17/XHaO7eBEs6BphvoK9U6dONGzYkAoVKgBw7NgxqlevXqiFCfN2+/V38LhkGNr4f3Siy8aX8fDQtiYhClO9etybMwYM88ZYiHwFe6lSpWjbtq3x+cSJE2nUqFFh1STMXNqu3bgu+QSAG3hyatyXtG4jTXVhXerXh8PUv7fhyBHtiskjk0wpEBsbyyEL+t9N5EFiIrHPD8KWDAA+9V3IqA+8NC5KiMJXr95/gv3wYe2KyaNCC/Zr166xevVqDh8+jLu7O7dv32b58uWFtXthJq4NnUKZaMNsd+vsejDo5x7I5RVhjcqUAcpX4CalDBssqMVe4LliMr311ltUrFiRL7/8kkuXLtG1a1eSkpIKa/fCDCSH7cFzuWGJuxt4kjh7PnJpRVizevV1HL5anyB2oo4cQZeRgSWsvl5owf7kk0/ywgsvABATE8PGjRvlgqo1SU3l5vODqXC3C2Zpk/m89YbccCasW/36cHiLIdh1CQkQFQXVqmldVo4KLdgzMjK4desWpUqVokyZMsahkMI6XBj1EVVuGK6bbLbvxMBNPWVoo7B6fn4QQb17Gw4ftohgL7TPFPb29vj7+zN58mS2bt0q3TBWJPnIKcoteg+AO7iSPGchXuUl1YX1q1PHMi+gFlqw//PPPyxZsoRy5coxf/58qlevTufOnQtr90IrSnHxmSGUVMkA/NBwJp2HVda4KCGKRp06cCRri91CLqAWWleMr68vwcHBBAcHM3LkSJRSnD9/vrB2LzRybsZKHju/HYAIu1Z0/uU16YIRxYaHB7hUdOf85SpU5ULxa7HXrVuX7du3G5/rdDq8vb0La/dCA2k3buH63ljDY2y5MW0RXhXMf0SAEIUpa3eMOnkSUlI0rihnhfZXOmfOHPr160fjxo0ZM2YMGzduJDY2trB2LzRwuMskyqRdB2BDtTf434QGGlckRNGrW/desOvS0uDkSY0rylmhBXvr1q05f/48q1evpk6dOoSGhvLMM88U1u5FEbu4fg8Ndy8yPNZVxv+nqdIFI4qlunUtr5+90IJ90KBBrFy5Ei8vL1555RW+++47wsLCCmv3ogip9AwSXhyODYZVEw8OmkfVurJerSieLHFkTL6Cfffu3YwfP54tW7aQuWSqh4cHAwcOxNXVtVALFEVvz7Cl+N7ZA8Bf7h3puPg5jSsSQjt168IJapPG3bkzLCDY872YdUZGBr///ju///47Dg4OdOnShaZNmxZ2fUVKFrOG2KjbpFavhWfGDVKw5/T6I9TtWkvrsoTQVNmy8Ed0Xepy3LD2aWSk1iU9Ur6DPavExEQ2bNjAnj17KFeuHD169LDI6QQk2GFHo1EEH/wUgK1Nx/HE3lkaVySE9gIDYeSu7nRnLUqnQxcfD05OWpf1UIUS7FlFR0ezatUqzpw5Q40aNejZsydlypQpzENw9OhRhg8fTseOHZkwYcJ9r69atYqIiAj0ej29e/cmMDAwV/st7sF+fM1RavZoiB3pXLWpgNP5k7hVkq41IYYOhUqL3+Edphs2/PMP5ry4b6HdoJTJ09OTYcOGAXD27Fm+/PJLbty4QcuWLenRo0ehHOPIkSMEBAQ88LU7d+4QEhLCvn37SEpKwt/fn0OHDmFjATOyaSkjXRE3eDR2pAMQNfxDWkioCwEYLqCGU+fehhMnzDrYC5R2K1eufOTr1atXZ8KECXz88cf4+fkV5FDZ9OrV66FrrIaHh+Pr64tOp8PR0RFnZ2fOnDnzwPempqaSmJiY7au42v7WzzSP3QLAMfeWNJ/bV+OKhDAfmRdQjY4f166YXChQsM+fP5+YmJhcvbdu3boFOVSuRUdH4+Jyb2ieq6sr0dHRD3zvjBkzcHJyMn4VdpeRpYiNTqXqp2ONzx0XzUVnI4PWhchUty6cxPfeBjMP9gJ1xbi4uLB582aio6PR6XRUq1aNwMBA3N3dC6u+PPP09CQ+Pt74PC4uDk9Pzwe+d9KkSYwfP974PDExsViG+7Yen/NcuuFuun11+tG0dwuNKxLCvFSsCLauzpyL88aHKOsO9o8//pgGDe7dZh4ZGcmPP/7I+fPniYuLo127dnTs2LHARebG+fPnqVq1Ki1atGD8+PEopUhKSiIhIYHHHnvsgd9jb2+Pvb19kdRnrv4Nv0XQjqkAJOJIrTUztS1ICDOk0xla7cfD6xiC/dQpSEsDu0K/TFkoClRV1lDPdODAAZYuXUqNGjVM1v2ydu1adu7cib29PXXq1KFDhw4EBQVx+vRp3NzcmDBhAmPGjEGv17NgwQK5cPoIR/rM4HluAfBvlzdpWLeKxhUJYZ5q14YT4bV5ms2GicAiI6FmTa3LeqBCGe64ZcsWPv30U3bs2EGPHj147bXX8Pf3L4z6ilRxG+74xzeRtBxUm5KkEGPnRamY09i4ydQBQjxISAicnfgFXzDEsGHDBjDTNScK1JT9/PPPqVOnDsOHD6dt27acP3+er7/+2iJDvbhJTYW4UZMoiWEK0tuj35NQF+IRateG41mHPJpxP3uBumLefvttPvnkE1nf1AKtf3sPPe98D8BFtzo89sHLGlckhHkrNsE+aNAgKlasyJdffolSCldXV1q3bm1cYGPt2rV069atUAoVhSf2tqLi3HHG5yXnzDLbi0BCmIvHHoNYO0+i08rgSYzhJiUzVaA+9jNnzmQbcRIfH8+uXbuIjIwkNTWVRYsWcdyM/1f7r+LSx/5Vz195ebVhtFJk1UCqnduBTLYuRM5q14YvTwYQQBi4ucHt22b5t1OgZtp/hxG6uLjw9NNPG5+Hh4cXZPfCBM6fy6Dpmnvz65T7epZZ/sMUwhzVrg3HT9YxBPudO3DlimGQu5kx6TjAUaNGmXL3Ih/+74UfaKQOAHC2YVecn2ipbUFCWJDatS1jaoF8BXtUVBRJSUk5vq9Fi3t3MFpSl4y12h+eQsc/JwOQjg1Vln+gcUVCWJb7LqCaaT97voK9UqVKfPLJJxzJxdp/6enpfPXVVw+diEsUnbBBX/EYZwG4+MSL2Deok8N3CCGy8vW1jJExBVpBadGiRezatQt/f3/8/f3x9PSkZMmS3Lp1i4sXL7Jz504uXbrEG2+8QcuW5v+R35ovnu74JZFa/3uMilwhWVeSEudOoasqd5kKkRc3b4JnmQz0OOFAMjz5JPz6q9Zl3afAd54mJSWxZcsWtm7dysWLF4mPj6ds2bL4+vrSsWNHmjVrVli1mpy1BrtS8GnVjxh18S0ALvV4g0qr5mhclRCWycsLtl6vRz2Omu0yeYW+gpIls9Zg37DiDm0GVMeTGBJtnXG8fBbKldO6LCEsUlAQvLHzOZ7jR5SNDTq9HkqW1LqsbGR2LCuXlgZRo+cabqgA4gaNklAXogBq14Z/MSzwrsvIgLNnNa7ofhLsVu6Hz28yMOZjABLs3Sk3+02NKxLCstWuDafIMqvjv/9qV8xDSLBbsZQUuDn5E9y5A0Dy629BqVIaVyWEZbsv2E+d0q6Yh5Bgt2Lfzo3mxTvzAIh3KEPpqSM1rkgIy5e1KwaQFrsoOomJoJ/2Ea4YlglMGzMOXF01rkoIy1e1KtwqUZ447k5zbYYt9gJP6Xfnzh1WrlzJ0aNHycjIwM/PjxdeeEHTdU8FLJ11nUEJnwEQ51gWj7eHa1yRENbB1hZq1tJx6khNmrDfuoJ9586d/Pjjjzg7O9OnTx9ee+01AI4dO8bs2bPR6/V07dqVoKCgQitW5E5CAjB7Ns7oDRsmTABnZ01rEsKa1K7NvWC/dMnwR2dGf2N5Gsd+48YNli1bRlRUFIGBgXTt2vWhi0Gnpqayfv16/vjjD3x8fBg4cCDlzHyYnbWMY5//zjVeml4NJxK541wet+tnwMlJ67KEsBqTJ0PJGe/wDtMNGw4cgIYNNa0pq1y32N955x1KlixJ//79jQtpPIq9vT09e/akZ8+eREVFsXjxYpKTk5k+fXqBChaPFh8PfPwRTiQCYDNhvIS6EIXM1xe2/HfIoxkFu9x5moU1tNg/e+c6L0/3uddav3EWLPRchDBXEREwqsVudtPasGHGDHj7bW2LykJGxViRuDjgo3utddsJ4yTUhTABX9//DHk0swuoBQ72Y8eOsW7dOm7fvg3AunXreO6555g8eTLJyckF3b3Ig6Wzb/BS0gIA4py9cB4zROOKhLBO7u5QonwZbnL3hj8zG8teoOGO3333HQMGDEApRdWqVVm2bBk9e/YkIyODjRs3cvPmTRYuXFhYtYpHSEgAPv7YOBLGZvw46VsXwoR8feHfq7VoSTjq1CnMaYHJAvWx16lTBzc3N6pVq0Z4eDh2dnYMGDAAf39/Dh48yMKFC4mKiirMek3KkvvYF0yLYcAUH1yJJ96pLC7XI81q+JUQ1mbIEHj8i/7051vDhlu3wMND05oyFajF7u3tzebNmwFDKL700ku88847AHTs2JHdu3cXvEKRo8RESJ4913iXKWPflFAXwsTum1rg1Cnw99euoCwK1MfulOWjvqOjI9WqVcv2eokSJQqye5FLy+bd5uWETwFIcCiNy1uvaVyRENbP1xdOU+PeBjNa/rNALfajR4/ydpYhPn/88Ue257lZE1UUTHIyxH3wmXEGx4yRo2VOGCGKgK8vnOGxexvMKNgL1MduY/PoBr9OpyM9PT2/uy9yltjH/vW8OLq+4U1pbqEv4Y7T9SjDJXshhEmlp0MVx2gup5Y1bHjpJfjqK22LuqtALfY2bdo89E5SpRRTp04tyO5FDtLS4Pp7n1OaW4bnr42UUBeiiNjaQumaZYg95mb4xGxGLfYCBfuIESMeOcnX8OEyo6AprV6mZ9Atw+pISfYuuL0zSuOKhChefGvrOHusOo05QMaZs2Zzx2eB6ujVq9cjX+/Ro0dBdi8eISMDIictwYvrACQOGgZlymhclRDFi68vnKU6ALpLFw0XvcyAufwHI/Jo4+pk+l/7EIAUWwdKTRujcUVCFD+1a9+7gKpTCs6d07aguyTYLZBScGTccqpwEYC4Xq+Al5fGVQlR/GRtsQNw9qx2xWRRqMF+7NgxFi9eXJi7FA+w9dc0+pwPASBVZ0+ZkLc0rkiI4slchzwWarCfOnWKTZs2FeYuxQNEjP2BxzC0DG51GghVqmhckRDFk4cHxHmaX4td5mPPwhLGsUf8nYFzq/r4cYx0bLA9dRJq1Mj5G4UQJtE+KJXNOx2xIx3VuTO6DRu0Lkn62C3Ntjc24scxAK637S2hLoTGata15zxVAUg7aR4tdgl2C3L8mOKJ8BnG5+XnTdSwGiEEGEbGZF5AtYk6axjdoLECBbslTclrDTa9sQV/9gJw2b8Luvr1NK5ICJH1Aqptkh6uXdO4ogLeedq/f39mzJjBg7rpK1euTPXq1R/wXSI/LlwA/98/MD73mmc+6ysKUZzVrg3bsw55PHMGypfXriAKGOxhYWEEBwc/8DWdTsfy5cvp27dvQQ7xUKtWrSIiIgK9Xk/v3r0JDAzM9rqPjw8+Pj4AdO/enREjRpikjqKy/s0/Gan+AOBSnfZUatVc44qEEABVq8IF+8cg9e6Gs2ehTRtNaypQsFepUoV27do98LVz584xZ84ckwT7nTt3CAkJYd++fSQlJeHv78+hQ4eyzTb54osvWs0kZDdvQs21M43Py86dpGE1QoisbGwgw6c6ZK5nbQZDHgsU7E2aNGHp0qUPfC0+Pt64mlJhCw8Px9fXF51Oh6OjI87Ozpw5c4aaNWsa37Nr1y4+/PBD4uPjeeWVV6hcufJ9+0lNTSUtLc34PDEx0ST1FtTadw7wSrrh/oBLVVtRqcPDJ14TQhQ9x3qPGYM99eQZ7LUtp2AXTx82Ze/s2bMpVaoUBw4cKMjuHyo6OhoXFxfjc1dXV6Kjo7O9Z9asWbz11lv079+f55577oH7mTFjBk5OTsavMmY4iZZeD2W/utda95j9NujMadlcIUTV+u7EUBqA5GPat9gLFOx+fn4P3O7q6oqLiwuDBw8uyO4fytPTk/j4eOPzuLg4PD09s72nWbNmANSoUYOLFy9me3+mSZMmodfrjV8xMTEmqbcg1s/6l87JqwG4UrYBzj2f0bgiIcR/ZZ0MzDZK+2kFch3s//77b653+tprr3Hr1i369euXbfupU6ce8h1506JFC06ePIlSisTERBISEqhevToXLlwAYOvWrWzZsgWA2NhYbG1ts7XwM9nb2+Po6Jjty5ykpUGJT0KwwTDqyOG9idJaF8IM1a4NkRjWfHa8fdWwwryGct3HvnfvXubNm0fdunXp168fHh4eufq+2NhYVqxYwfHjx2ndunW2fvD8cnNzY8KECYwZMwa9Xs+CBQuIjIykX79+hIeHU65cOd577z327NnDqVOn+MpMlqvKq18Wn6dr/AoArrnVwOtVmd9eCHNUqxb8hs+9DefPGwa4ayTPc8WcPHmSb7/9loSEBDp37vzQ4Y7bt29nw4YNuLq60rdvX+rUqVMY9ZqUOc0VoxSEeo2kz43PALg6fQnlJ72saU1CiIebVPpzZtwaZniyeTM89ZRmteR7ErC0tDQ2bNjAjh07qFq1Kv3790en0/HNN99w/vx52rZtS5cuXbC31/r6cO6ZU7DvXH0N/54+OJJEtGNlPG+fgRIlNK1JCPFwk5r8woz9/wMgY+EibF4bolkt+R7uaGdnR7du3ejWrRsXLlzg66+/JiMjg/79++Pt7V2YNRZLl8bNJZAkABJeewtPCXUhzJqLnzfsNzy+feDc3TEy2pBpe7Mwlxb7ge23qN7OGzfiuGVfllK3z4GTk2b1CCFytnR+AoNeNwzSuBjQh8o7v9OsFpnd0Qz9+/pnuBEHwI1+oyXUhbAAtRo7c52yhidR5zStRYLdzJw9GMcTR+cBcMfWg5pzh2tckRAiN/z84NzdkTHON85pWosEu5k5MHQRZbgJQFSn19G5u2lckRAiNzw84LqD4fpiqcQrkJSkWS0S7Gbk2rlEWv/9MQAJOmfqLBqlcUVCiLzQe/kYH6efu6BZHRLsZiRiyFeUxzBJ/8m2r2HnZX5z1wghHs6mmo/x8dW/z2lXh2ZHFtncuZFM4y2zAEiiJLW/GKNxRUKIvHKp52N8fGPPOc3qkGA3E7uHLqOyugjAoeaDcXqsgsYVCSHyyqv5vXt4Eo6e06wOCXYzkBSXSp0Nhql5U7Cn1pLxGlckhMiPasH3gl1puCa0BLsZ+Pv1lVRNPwfAvvqD8KhfRduChBD54lHFlZs2hmtjWg55lGDXWFpSGt7fGRapTsOWaosnaFyREKIgop19ACiXcI70dG1qkGDX2J43f6BaqmGe+r9rDqB8q2oaVySEKIjEcobumApc5uyJFE1qkGDXUEZqOuW/nAYYWuuV5k/UuCIhREHp7g55tEFxbpc2Y9kl2DW0f3wo1VIMK1P96fMC1Z4s+CIkQghtmcOQRwl2jai0dDwX3mutl58/WeOKhBCFoVxzH+Pj+CPnNKlBgl0jhyeF4p1saK3vrPICvs/U0LgiIURhcPG7N+Qx/cw5TWqQYNeASkvH/bP3AUNrvew8aa0LYTV8fIwPXWLOkZBQ9CVIsGvg+OSVeCeeBGB7hX7Uf05a60JYDTc3khzcAajCBQ4eLPoSJNiLmEpJxWPuVABSsaP03He1LUgIUehSylcFoCrn+eefoj++BHsROz5uKRWTIwHYUvklmvZ8TOOKhBCFrUR1w93jlbnIgX8yivz4EuxFSCUmUeZzQ996MiWosED61oWwRiVrGlrsJUglKuJakR9fgr0InRjzBV4phhkcN3sPoXFnmRNGCGukq3rvbzvhxAWSk4v2+BLsRSQjNg6vJdMB0OOI9+dyl6kQVqtqVePDiunnOXKkaA8vwV5Ejg/+mNJpNwD4ucZIGj0t860LYbWq3GuxV+FCkV9AlWAvAqkXr+Gz9iMAblKKustkBkchrJoEu/U7/sJ0nJXhLoUtzd6mbmsPbQsSQphWpUoonQ4wDHncv79oDy/BbmIJh85Q549FAFygCq2/G6FxRUIIkytZEp2XF3DvJqW0tKI7vAS7iUX2HI89ht/oX09Po0pNB40rEkIUiar3blJKSoITJ4ru0BLsJnThu53UO7kWgCO2DeiwrL/GFQkhiszdfvYKXKUEyfz9d9EdWoLdRFR6BkmvjTY+P/f6J5Qua6thRUKIIpVlyGMlLvH770V3aAl2E9k/ejk17xguhe9078TTHz2hcUVCiCL1n5ExW7ZQZGugSrCbQPyVOCotfBswTPTlseQjbKWxLkTxkiXYq3KemzcpstExEuwm8FfH9/BKvwLADr/hNOheS+OKhBBFLktXTBUMa5/+9lvRHFqCvZDtXHCYdofmAnDdxotm/zdV03qEEBrJ0mL3tpFgt1g3rmVQcvRr2GHoSLv25keUquahbVFCCG14eYG9PQANPc4D8NdfEBdn+kNLsBeiX/osp0XqnwCcqhRE/ZB+GlckhNCMjQ1UrgxA9RKGFntqKuzYUQSHNv0hiomkJJ7ZPQkwXDCtvGEh3L2lWAhRTN3tZy8df964qSi6YyTYC8uSJZRJugxAxpBhODatq3FBQgjN3e1nt4uPxaf0HUCC3XIkJ0NIiOFxyZKUfHe8tvUIIcxDlguoPVsZumMuXgSlTHtYO9Pu3nRWrVpFREQEer2e3r17ExgYmO31efPmcfPmTS5fvszo0aOpW9eELeivv4ZLlwyPX30VKlY03bGEEJYjy5DHN3tdINLJjyeeMH0vrUUG+507dwgJCWHfvn0kJSXh7+/PoUOHsLExfAA5c+YMmzZt4rfffiMqKoqBAweyw1RXLJKTYeZMw+MSJWC8tNaFEHdlabGXTbrAqlVFc1iL7IoJDw/H19cXnU6Ho6Mjzs7OnDlzxvj6tm3baNq0KQDe3t6cOHGClJSU+/aTmppKYmJitq88W78eLhg+YvHKK1CpUr7OSQhhhbLmQean+iJgkcEeHR2Ni4uL8bmrqyvR0dEPfd3FxYWYmJj79jNjxgycnJyMX2XKlMl7MZmfqdzdpbUuhMju7nBHQII9J56ensTHxxufx8XF4enp+dDX4+PjHxjakyZNQq/XG78eFP456tkTfv8d9u7N9rFLCCEoUwZKljQ8vnixyA5rkcHeokULTp48iVKKxMREEhISqF69Ohfudom0a9eOffv2ARAVFUXt2rUpUaLEffuxt7fH0dEx21ee6XTwxBNQo0aBzkkIYYV0unuDKYqwxa5TytQDb0xj1apV7N69G71eT9++falUqRL9+vUjPDwcMIyKuX79OlevXmXs2LG5GhWTmJiIk5MTer0+fyEvhBD/FRgIu3ZB6dKQn16BfLDYYDcFCXYhRKHr0wdCQw2P9XoogmyxyK4YIYSwGBqMjJFgF0IIU9JgZIwEuxBCmJK02IUQwspkDfYiGvIowS6EEKYkLXYhhLAyFSrcu0Ndgl0IIaxAiRJQrpzhsXTFCCGElcjsjpEWuxBCWInMIY9XrkB6uskPJ8EuhBCmltliT0+H69dNfjgJdiGEMLUiHvIowS6EEKZWxHefSrALIYSpFfFYdgl2IYQwNemKEUIIKyNdMUIIYWVcXQ1fIMEuhBBWowhvUpJgF0KIopDZHXPxIph44ToJdiGEKAqZLfaEBLhzx6SHkmAXQoiiULHivcdXrpj0UBLsQghRFCpUuPf48mWTHkqCXQghikLWYJcWuxBCWAHpihFCCCsjXTFCCGFlpCtGCCGsjIMDlCpleCwtdiGEsBKZrXZpsQshhJXIvIAqLXYhhLASmS32hASIizPZYSTYhRCiqBTRkEcJdiGEKCpFNORRgl0IIYpKEQ15lGAXQoiikrUrRlrsQghhBaTFLoQQVkb62IUQwso4OYG7u+GxtNiFEMJKFMHdpxLsQghRlIrg7lMJdiGEKEqZLfa4OIiPN8khJNiFEKIoFcHdpxLsQghRlIpgyKNFBvvkyZOZMWMGgwcP5vID+ql27NhBo0aNCA4OJjg4mLCwMA2qFEKIByiCIY92JtmrCW3bto1r167x5Zdf8scffzBx4kSWLVt23/vmzp1LcHBw0RcohBCPUgRdMRYX7Fu3bqVZs2YANG/enL59+z7wfd9++y179+4lPT2dUaNG4eDgcN97UlNTSUtLMz5PTEw0TdFCCJFJumLuFx0djYuLCwCOjo7cvn37vvfUrVuXd999lzfffJOyZcvy9ttvP3BfM2bMwMnJyfhVpkwZU5YuhBDFtysmPT2doKCg+7Y3aNAAT09P4u8OEUpMTMTDw+O+95UrV874uE2bNixcuPCBx5k0aRLjx483Pk9MTJRwF0KYlosLuLnBnTtw65ZJDmGWwW5ra/vQC57btm3j+++/Z8iQIURERNC+fXsA9Ho9er0eT09PQkJCGDp0KB4eHpw9e5Zq1ao9cF/29vbY29ub7DyEEOKBRo6EOXOgVy+T7F6nlFIm2bMJTZo0iRIlShAVFcX06dOpWLEiy5cvZ//+/cyZM4fQ0FA2b95MrVq1OHr0KO+//z7Vq1fPcb+JiYk4OTmh1+txdHQsgjMRQhRb6elga2uSXVtksJuKBLsQwhpY3MVTIYQQjybBLoQQVkaCXQghrIwEuxBCWBkJdiGEsDIS7EIIYWUk2IUQwspIsAshhJWRYBdCCCtjlnPFaCXzJlyZvlcIYc4cHBzQ6XQPfV2CPYukpCQAmeFRCGHWcpr2ROaKySIjI4Pbt2/n+L/hf2VO9xsTE2NVc8zIeVkWazwvazwnKPh5SYs9D2xsbChdunS+v9/R0dGq/vFlkvOyLNZ4XtZ4TmC685KLp0IIYWUk2IUQwspIsBcCOzs7pkyZgp2ddfVsyXlZFms8L2s8JzD9ecnFUyGEsDLSYhdCCCsjwS6EEFZGgl0IIayMdV2RKAKrVq0iIiICvV5P7969CQwMzPb6vHnzuHnzJpcvX2b06NHUrVtXo0rz5lHnFRERwcKFC/Hz8+PQoUOMGjWKZs2aaVht7uX0+wL4+++/CQgI4MKFC5QvX16DKvMup/PaunUrYWFhpKenc/jwYdavX69RpXnzqPNKT09n2LBhVKpUiaioKNq1a0e/fv00rDZ3jh49yvDhw+nYsSMTJky47/Xc/BvNMyVyLTY2VjVu3FhlZGQovV6v/Pz8VHp6uvH106dPqw4dOiillDp37pwKCgrSqNK8yem8NmzYoA4dOqSUUioiIsJqzksppeLj49Xw4cOVt7e3unLlikaV5k1O53Xz5k3VpUsX4/PM3525y+m8tmzZYjyvW7duKS8vL40qzZvQ0FA1efJkNXPmzPtey82/0fyQrpg8CA8Px9fXF51Oh6OjI87Ozpw5c8b4+rZt22jatCkA3t7enDhxgpSUFK3KzbWczqtz587Ur18fMEy74OzsrFWpeZLTeQFMnz6diRMnalRh/uR0Xj///DPOzs588sknTJ48mYyMDA2rzb2czsvT05OYmBgAbty4QcOGDbUqNU969eqFra3tA1/Lzb/R/JBgz4Po6GhcXFyMz11dXYmOjn7o6y4uLsZ/iOYsp/PKavHixUybNq2oSiuQnM5r06ZNNGjQgEqVKmlRXr7ldF4XL17kwIEDjBo1inHjxtGrVy+LmLE0p/Nq1KgRLVq0YOjQoQwdOpQhQ4ZoUWahysvfXl5IsOeBp6cn8fHxxudxcXF4eno+9PX4+HiLmCkyp/PK9OGHH9K5c2fjpxJzl9N5bdu2jaioKEJCQoiNjWX+/PkcOnRIi1LzJKfzcnV1pWHDhtja2uLm5kapUqU4ffq0FqXmSU7ntXbtWqKjo1m0aBHr1q1j6NChJCQkaFFqocnt315eSbDnQYsWLTh58iRKKRITE0lISKB69epcuHABgHbt2rFv3z4AoqKiqF27NiVKlNCy5FzJ6bzAcFG4WrVqdO3alR9//FG7YvMgp/P6+OOPmTBhAhMmTMDd3Z0RI0bQoEEDjavOWU7nFRAQQFRUFGBYYyAmJobKlStrWXKu5HRely9fply5coDhPy97e3styy2Q8+fPAw8+58cee6zA+5c7T/No1apV7N69G71eT9++falUqRL9+vUjPDwcMATg9evXuXr1KmPHjrWoUTEPO68ff/yRwYMHU69ePQCuX7/OsWPHNK44d3L6fQHMnj2bmTNnMmTIEEaPHo2Xl5eGFedOTucVEhLCrVu3SEpKonnz5hYxegQefV6xsbEMHTqUOnXqcO3aNerXr8/QoUO1LjlHa9euZcGCBdjb2zNs2DA6dOiAn58fp0+fxtbW9r5zDgoKKvAxJdiFEMLKSFeMEEJYGQl2IYSwMhLsQghhZSTYhRDCykiwCyGElZFgF0IIKyPBLoQQVkaCXQghrIzMxy6ECR04cICDBw9y584dhg4datG3wQvLIS12IUxk165drFixgoEDB+Lh4cHMmTO1LkkUE9JiF8IE0tPTGT58OGFhYQCUKlWKZcuWaVyVKC6kxS6ECezatYtq1arh5uYGwMGDB40zEwphahLsQpjAjh07sq1duX79eqtYGEJYBgl2IUwgLCyMtLQ0AL7//ntat25dKNOxCpEbMm2vEIUsPT2dSpUqsW7dOk6dOoWdnZ3FzIcurINcPBWikO3fvx8/Pz9at25N69attS5HFEPSFSNEIQsLC6NNmzZalyGKMWmxC1HIypcvz5NPPql1GaIYkz52IYSwMtIVI4QQVkaCXQghrIwEuxBCWBkJdiGEsDIS7EIIYWUk2IUQwspIsAshhJWRYBdCCCsjwS6EEFZGgl0IIazM/wM1znfN+nBVSgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plot_1d(eq1, \" Redl\", linecolor=\"b\", lw=2, label=\"Redl\")\n", "fig, ax = plot_1d(eq1, \"\", linecolor=\"r\", lw=2, label=\"MHD\", ax=ax)\n", "ax.legend(loc=\"best\")\n", "ax.set_title(\"Method 1: Optimization\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Iterative Solves" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this method, we iteratively solve the equilibrium with updated guesses for the current profile. \n", "The current profile is computed such that the parallel current is consistent with the Redl formula, according to Equation C3 in [Landreman & Catto (2012)](https://doi.org/10.1063/1.3693187). \n", "This is the same approach as STELLOPT VBOOT with SFINCS, and it usually converges in only a few iterations. " ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "eq2 = eq0.copy()\n", "fam2 = EquilibriaFamily(eq2)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Building objective: force\n", "Precomputing transforms\n", "Timer: Precomputing transforms = 44.2 ms\n", "Timer: Objective build = 162 ms\n", "Building objective: lcfs R\n", "Building objective: lcfs Z\n", "Building objective: fixed Psi\n", "Building objective: fixed current\n", "Building objective: fixed electron density\n", "Building objective: fixed electron temperature\n", "Building objective: fixed ion temperature\n", "Building objective: fixed atomic number\n", "Building objective: fixed sheet current\n", "Building objective: self_consistency R\n", "Building objective: self_consistency Z\n", "Building objective: lambda gauge\n", "Building objective: axis R self consistency\n", "Building objective: axis Z self consistency\n", "Timer: Objective build = 966 ms\n", "Timer: Linear constraint projection build = 2.63 sec\n", "Number of parameters: 856\n", "Number of objectives: 5346\n", "Timer: Initializing the optimization = 3.82 sec\n", "\n", "Starting optimization\n", "Using method: lsq-exact\n", " Iteration Total nfev Cost Cost reduction Step norm Optimality \n", " 0 1 6.170e-03 5.162e+00 \n", " 1 2 1.056e-03 5.114e-03 1.791e-01 1.817e+00 \n", " 2 3 1.779e-04 8.786e-04 1.410e-01 5.540e-01 \n", " 3 4 1.505e-04 2.734e-05 8.612e-02 9.140e-01 \n", " 4 5 3.028e-06 1.475e-04 2.305e-02 3.681e-02 \n", " 5 7 2.385e-06 6.428e-07 1.156e-02 1.749e-02 \n", " 6 9 2.304e-06 8.161e-08 5.826e-03 3.472e-03 \n", " 7 11 2.287e-06 1.701e-08 3.115e-03 1.096e-03 \n", "Optimization terminated successfully.\n", "`ftol` condition satisfied.\n", " Current function value: 2.287e-06\n", " Total delta_x: 2.212e-01\n", " Iterations: 7\n", " Function evaluations: 11\n", " Jacobian evaluations: 8\n", "Timer: Solution time = 43.2 sec\n", "Timer: Avg time per step = 5.40 sec\n", "\n", "==============================================================================================================\n", "\n", " Start --> End\n", "Total (sum of squares): 6.170e-03 --> 2.287e-06, \n", "Maximum absolute Force error: 6.013e+07 --> 2.553e+06 (N)\n", "Minimum absolute Force error: 2.202e+02 --> 4.271e+01 (N)\n", "Average absolute Force error: 4.010e+06 --> 9.606e+04 (N)\n", "Maximum absolute Force error: 1.663e-02 --> 7.063e-04 (normalized)\n", "Minimum absolute Force error: 6.091e-08 --> 1.181e-08 (normalized)\n", "Average absolute Force error: 1.109e-03 --> 2.657e-05 (normalized)\n", "R boundary error: 0.000e+00 --> 0.000e+00 (m)\n", "Z boundary error: 0.000e+00 --> 0.000e+00 (m)\n", "Fixed Psi error: 0.000e+00 --> 0.000e+00 (Wb)\n", "Fixed current profile error: 0.000e+00 --> 0.000e+00 (A)\n", "Fixed electron density profile error: 0.000e+00 --> 0.000e+00 (m^-3)\n", "Fixed electron temperature profile error: 0.000e+00 --> 0.000e+00 (eV)\n", "Fixed ion temperature profile error: 0.000e+00 --> 0.000e+00 (eV)\n", "Fixed atomic number profile error: 0.000e+00 --> 0.000e+00 (dimensionless)\n", "Fixed sheet current error: 0.000e+00 --> 0.000e+00 (~)\n", "\n", "==============================================================================================================\n", "\n", "Building objective: force\n", "Precomputing transforms\n", "Timer: Precomputing transforms = 42.8 ms\n", "Timer: Objective build = 163 ms\n", "Building objective: lcfs R\n", "Building objective: lcfs Z\n", "Building objective: fixed Psi\n", "Building objective: fixed current\n", "Building objective: fixed electron density\n", "Building objective: fixed electron temperature\n", "Building objective: fixed ion temperature\n", "Building objective: fixed atomic number\n", "Building objective: fixed sheet current\n", "Building objective: self_consistency R\n", "Building objective: self_consistency Z\n", "Building objective: lambda gauge\n", "Building objective: axis R self consistency\n", "Building objective: axis Z self consistency\n", "Timer: Objective build = 898 ms\n", "Timer: Linear constraint projection build = 2.07 sec\n", "Number of parameters: 856\n", "Number of objectives: 5346\n", "Timer: Initializing the optimization = 3.19 sec\n", "\n", "Starting optimization\n", "Using method: lsq-exact\n", " Iteration Total nfev Cost Cost reduction Step norm Optimality \n", " 0 1 3.509e-04 1.656e+00 \n", " 1 2 1.267e-05 3.382e-04 6.220e-02 2.198e-01 \n", " 2 3 2.039e-06 1.063e-05 1.667e-02 3.465e-02 \n", " 3 5 1.710e-06 3.291e-07 6.982e-03 5.559e-03 \n", " 4 7 1.695e-06 1.521e-08 3.750e-03 1.036e-03 \n", "Optimization terminated successfully.\n", "`ftol` condition satisfied.\n", " Current function value: 1.695e-06\n", " Total delta_x: 6.429e-02\n", " Iterations: 4\n", " Function evaluations: 7\n", " Jacobian evaluations: 5\n", "Timer: Solution time = 20.6 sec\n", "Timer: Avg time per step = 4.13 sec\n", "\n", "==============================================================================================================\n", "\n", " Start --> End\n", "Total (sum of squares): 3.509e-04 --> 1.695e-06, \n", "Maximum absolute Force error: 1.715e+07 --> 2.228e+06 (N)\n", "Minimum absolute Force error: 3.463e+00 --> 1.075e+01 (N)\n", "Average absolute Force error: 9.504e+05 --> 7.794e+04 (N)\n", "Maximum absolute Force error: 4.824e-03 --> 6.268e-04 (normalized)\n", "Minimum absolute Force error: 9.743e-10 --> 3.025e-09 (normalized)\n", "Average absolute Force error: 2.674e-04 --> 2.192e-05 (normalized)\n", "R boundary error: 0.000e+00 --> 0.000e+00 (m)\n", "Z boundary error: 0.000e+00 --> 0.000e+00 (m)\n", "Fixed Psi error: 0.000e+00 --> 0.000e+00 (Wb)\n", "Fixed current profile error: 0.000e+00 --> 0.000e+00 (A)\n", "Fixed electron density profile error: 0.000e+00 --> 0.000e+00 (m^-3)\n", "Fixed electron temperature profile error: 0.000e+00 --> 0.000e+00 (eV)\n", "Fixed ion temperature profile error: 0.000e+00 --> 0.000e+00 (eV)\n", "Fixed atomic number profile error: 0.000e+00 --> 0.000e+00 (dimensionless)\n", "Fixed sheet current error: 0.000e+00 --> 0.000e+00 (~)\n", "\n", "==============================================================================================================\n", "\n", "Building objective: force\n", "Precomputing transforms\n", "Timer: Precomputing transforms = 42.2 ms\n", "Timer: Objective build = 162 ms\n", "Building objective: lcfs R\n", "Building objective: lcfs Z\n", "Building objective: fixed Psi\n", "Building objective: fixed current\n", "Building objective: fixed electron density\n", "Building objective: fixed electron temperature\n", "Building objective: fixed ion temperature\n", "Building objective: fixed atomic number\n", "Building objective: fixed sheet current\n", "Building objective: self_consistency R\n", "Building objective: self_consistency Z\n", "Building objective: lambda gauge\n", "Building objective: axis R self consistency\n", "Building objective: axis Z self consistency\n", "Timer: Objective build = 890 ms\n", "Timer: Linear constraint projection build = 1.35 sec\n", "Number of parameters: 856\n", "Number of objectives: 5346\n", "Timer: Initializing the optimization = 2.46 sec\n", "\n", "Starting optimization\n", "Using method: lsq-exact\n", " Iteration Total nfev Cost Cost reduction Step norm Optimality \n", " 0 1 1.213e-05 2.995e-01 \n", " 1 2 1.797e-06 1.033e-05 1.387e-02 1.622e-02 \n", " 2 4 1.673e-06 1.246e-07 5.317e-03 1.632e-03 \n", " 3 6 1.667e-06 5.670e-09 2.445e-03 4.088e-04 \n", "Optimization terminated successfully.\n", "`ftol` condition satisfied.\n", " Current function value: 1.667e-06\n", " Total delta_x: 1.234e-02\n", " Iterations: 3\n", " Function evaluations: 6\n", " Jacobian evaluations: 4\n", "Timer: Solution time = 20.3 sec\n", "Timer: Avg time per step = 5.09 sec\n", "\n", "==============================================================================================================\n", "\n", " Start --> End\n", "Total (sum of squares): 1.213e-05 --> 1.667e-06, \n", "Maximum absolute Force error: 3.367e+06 --> 2.204e+06 (N)\n", "Minimum absolute Force error: 4.522e+01 --> 1.374e+01 (N)\n", "Average absolute Force error: 1.838e+05 --> 7.970e+04 (N)\n", "Maximum absolute Force error: 9.430e-04 --> 6.174e-04 (normalized)\n", "Minimum absolute Force error: 1.267e-08 --> 3.850e-09 (normalized)\n", "Average absolute Force error: 5.150e-05 --> 2.232e-05 (normalized)\n", "R boundary error: 0.000e+00 --> 0.000e+00 (m)\n", "Z boundary error: 0.000e+00 --> 0.000e+00 (m)\n", "Fixed Psi error: 0.000e+00 --> 0.000e+00 (Wb)\n", "Fixed current profile error: 0.000e+00 --> 1.490e-08 (A)\n", "Fixed electron density profile error: 0.000e+00 --> 0.000e+00 (m^-3)\n", "Fixed electron temperature profile error: 0.000e+00 --> 0.000e+00 (eV)\n", "Fixed ion temperature profile error: 0.000e+00 --> 0.000e+00 (eV)\n", "Fixed atomic number profile error: 0.000e+00 --> 0.000e+00 (dimensionless)\n", "Fixed sheet current error: 0.000e+00 --> 0.000e+00 (~)\n", "\n", "==============================================================================================================\n", "\n" ] } ], "source": [ "niters = 3\n", "for k in range(niters):\n", " eq2 = eq2.copy()\n", " # compute new guess for the current profile, consistent with Redl formula\n", " data = eq2.compute(\"current Redl\", grid)\n", " current = grid.compress(data[\"current Redl\"])\n", " rho = grid.compress(data[\"rho\"])\n", " # fit the current profile to a power series, with c_0=c_1=0\n", " XX = np.fliplr(np.vander(rho, eq2.L + 1)[:, :-2])\n", " eq2.c_l = np.pad(np.linalg.lstsq(XX, current, rcond=None)[0], (2, 0))\n", " # re-solve the equilibrium\n", " eq2, _ = eq2.solve(objective=\"force\", optimizer=\"lsq-exact\", verbose=3)\n", " fam2.append(eq2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can plot the current profile at each iteration to visualize how it changed: " ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plot_1d(fam2[0], \"current\", linecolor=\"k\", lw=2, label=\"0\")\n", "fig, ax = plot_1d(fam2[1], \"current\", linecolor=\"g\", lw=2, label=\"1\", ax=ax)\n", "fig, ax = plot_1d(fam2[2], \"current\", linecolor=\"b\", lw=2, label=\"2\", ax=ax)\n", "fig, ax = plot_1d(fam2[3], \"current\", linecolor=\"r\", lw=2, label=\"3\", ax=ax)\n", "ax.legend(loc=\"best\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With this method the MHD equilibrium also has very good agreement with the Redl formula. " ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Method 2: Iterative Solves')" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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pGLFiiQnJxMbG8vZs2fx9fXN9X5+25eTkpLo1asX77//Pq1bt8713hNPPMGaNWtwcnLK175u59SpUxw/fjzXz+bkyZMYjcZc25UtWzbX661bt9K7d2/GjRvH5s2b2bBhA5UqVSI5OblAx3dwcOC5554zh+rcuXMZOnSouTaAN99801zbiBEj8PPzu2WwZwsICOCtt95i165d/PrrryxcuJCNGzea91upUqVc21esWJHo6GiL11itWjX++usvoqKiqFOnDt26dcvVfCg0DnoXUBIdOHCA8PBwunbtypgxY265XWZmJtOmTcPFxYXt27fTpUsXnn766eIr1MLs7OwYO3YsgwYN4s0338TLyyvP7fz9/alUqRIbNmwwr7t+/TqJiYmFOr6/vz/Lly/Pte7SpUu4u7vj4+ND9erV+eWXX3K9Hxsbe8f9Xrt2jZ49e/LKK6/QtWtX0tLSOH36NHXq1ClUvXnx9/fn+vXr/Pnnn+Z1aWlppKam3vb7tm7diqenJx07djSvy+8fyv967rnnePfdd/nrr7/YsWMHH3zwgbk2gI8++oi2bduat4+LizP/sf2vjz/+mLp169KlSxfzum7dulG+fHlzu7e/vz8XL17M9X2XLl2iadOmFq/RaDRSvXp15s2bR1paGlOmTKFz585cunQpz0+XpZVcsedh//79BAcH33G7b775hmrVqjFy5Ei+/vpr2rdvXwzVFa3+/fvz3nvvMWLEiFtuM2DAAGJiYli7dq153bvvvsvUqVPNr729vUlOTiY1NZX77rsvX8ceMGAAycnJ5puGRqORr776iuHDh2MwGOjXrx+XL182h3tsbCwrVqy47T6vXbvGQw89xHPPPUdwcDBJSUkcP36cyZMnm7dZtGgRnTt3LnCQZp8jwIcffsjSpUsZOnQo27Zt4+DBg4B2Y3HYsGF8//33t91X3bp1SUxMZPfu3QBERkbeFJY5j9enTx/Onj2b576qVKnCww8/zBNPPMHjjz9uXu/r68vjjz/OF198gclkAuDQoUO0adPG/Pq/4uPjmTlzZq7nF37//XcyMjJo06YNAOHh4SxatIi4uDhA67u+c+dOhg0bdsvzvdsao6KieOaZZ1BK4ezsTEhICBkZGRZ9PsIm6NzGX2JNmDBBTZkyxfx69OjR6p133lHDhg0z3zzq1KmTev/999WMGTPUpEmTct0M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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plot_1d(eq2, \" Redl\", linecolor=\"b\", lw=2, label=\"Redl\")\n", "fig, ax = plot_1d(eq2, \"\", linecolor=\"r\", lw=2, label=\"MHD\", ax=ax)\n", "ax.legend(loc=\"best\")\n", "ax.set_title(\"Method 2: Iterative Solves\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Comparison" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Even though both methods give good self-consistency for the bootstrap current, they do result in slightly different coefficients for the current profile: " ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0.00000000e+00 0.00000000e+00 1.41145084e+04 3.91874870e+06 1.65848986e+07 -6.90484352e+07 1.02895864e+08 -6.49192642e+07 1.28802983e+07]\n", "[ 0.00000000e+00 0.00000000e+00 4.33389142e+05 -1.65188950e+06 4.24588245e+07 -1.25903135e+08 1.66425745e+08 -9.90338248e+07 1.95848806e+07]\n" ] } ], "source": [ "print(eq1.c_l)\n", "print(eq2.c_l)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example, the first method of optimization gave better self-consistency but was noticeably slower than the second method of iterative solves. " ] } ], "metadata": { "kernelspec": { "display_name": "desc", "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.12.0" } }, "nbformat": 4, "nbformat_minor": 2 }