{ "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": "code", "execution_count": 1, "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": "markdown", "metadata": {}, "source": [ "If you have access to a GPU, uncomment the following two lines before any DESC or JAX related imports. You should see about an order of magnitude speed improvement with only these two lines of code!" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# from desc import set_device\n", "# set_device(\"gpu\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As mentioned in [DESC Documentation on performance tips](https://desc-docs.readthedocs.io/en/latest/performance_tips.html), one can use compilation cache directory to reduce the compilation overhead time. Note: One needs to create `jax-caches` folder manually." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# import jax\n", "\n", "# jax.config.update(\"jax_compilation_cache_dir\", \"../jax-caches\")\n", "# jax.config.update(\"jax_persistent_cache_min_entry_size_bytes\", -1)\n", "# jax.config.update(\"jax_persistent_cache_min_compile_time_secs\", 0)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "An NVIDIA GPU may be present on this machine, but a CUDA-enabled jaxlib is not installed. Falling back to cpu.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "DESC version 0.13.0+702.ge6b8a02dc.dirty,using JAX backend, jax version=0.4.33, jaxlib version=0.4.33, dtype=float64\n", "Using device: CPU, with 48.53 GB available memory\n" ] } ], "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 = 552 ms\n", "Timer: Objective build = 1.39 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 = 872 ms\n", "Timer: Linear constraint projection build = 5.06 sec\n", "Number of parameters: 856\n", "Number of objectives: 5346\n", "Timer: Initializing the optimization = 7.37 sec\n", "\n", "Starting optimization\n", "Using method: lsq-exact\n", " Iteration Total nfev Cost Cost reduction Step norm Optimality \n", " 0 1 8.133e-03 4.417e-02 \n", " 1 4 5.389e-04 7.594e-03 9.344e-02 1.577e-02 \n", " 2 5 1.230e-04 4.159e-04 1.292e-01 7.423e-03 \n", " 3 7 5.177e-05 7.123e-05 9.991e-02 5.108e-03 \n", " 4 8 1.029e-05 4.148e-05 8.118e-02 1.355e-03 \n", " 5 10 1.955e-06 8.335e-06 3.413e-02 3.363e-04 \n", " 6 12 1.040e-06 9.146e-07 1.924e-02 2.155e-04 \n", " 7 14 8.142e-07 2.259e-07 8.804e-03 7.844e-05 \n", " 8 15 7.655e-07 4.865e-08 1.597e-02 9.577e-05 \n", " 9 16 6.887e-07 7.684e-08 1.585e-02 1.683e-04 \n", " 10 17 6.137e-07 7.495e-08 1.630e-02 1.110e-04 \n", " 11 18 5.330e-07 8.071e-08 1.683e-02 1.205e-04 \n", " 12 19 4.294e-07 1.036e-07 1.729e-02 9.057e-05 \n", " 13 21 3.795e-07 4.991e-08 8.852e-03 2.436e-05 \n", " 14 22 3.550e-07 2.456e-08 1.724e-02 8.022e-05 \n", " 15 23 3.160e-07 3.896e-08 1.711e-02 8.099e-05 \n", " 16 24 2.829e-07 3.305e-08 1.708e-02 8.322e-05 \n", " 17 25 2.548e-07 2.815e-08 1.704e-02 8.526e-05 \n", " 18 26 2.313e-07 2.349e-08 1.700e-02 8.822e-05 \n", " 19 27 2.121e-07 1.921e-08 1.696e-02 9.137e-05 \n", " 20 28 1.967e-07 1.544e-08 1.692e-02 9.341e-05 \n", " 21 29 1.841e-07 1.254e-08 1.683e-02 9.284e-05 \n", " 22 30 1.736e-07 1.047e-08 1.665e-02 8.847e-05 \n", " 23 31 1.648e-07 8.820e-09 1.633e-02 7.896e-05 \n", " 24 32 1.579e-07 6.903e-09 1.573e-02 6.173e-05 \n", " 25 33 1.546e-07 3.286e-09 1.478e-02 4.372e-05 \n", " 26 34 1.434e-07 1.127e-08 3.668e-03 2.439e-06 \n", " 27 35 1.433e-07 1.202e-10 6.968e-03 1.317e-05 \n", " 28 36 1.420e-07 1.261e-09 1.766e-03 7.229e-07 \n", "Optimization terminated successfully.\n", "`ftol` condition satisfied.\n", " Current function value: 1.420e-07\n", " Total delta_x: 5.309e-01\n", " Iterations: 28\n", " Function evaluations: 36\n", " Jacobian evaluations: 29\n", "Timer: Solution time = 1.33 min\n", "Timer: Avg time per step = 2.76 sec\n", "==============================================================================================================\n", " Start --> End\n", "Total (sum of squares): 8.133e-03 --> 1.420e-07, \n", "Maximum absolute Force error: 6.965e+07 --> 5.438e+05 (N)\n", "Minimum absolute Force error: 2.392e-01 --> 5.723e+00 (N)\n", "Average absolute Force error: 5.326e+06 --> 3.297e+04 (N)\n", "Maximum absolute Force error: 1.576e-02 --> 1.230e-04 (normalized)\n", "Minimum absolute Force error: 5.413e-11 --> 1.295e-09 (normalized)\n", "Average absolute Force error: 1.205e-03 --> 7.460e-06 (normalized)\n", "R boundary error: 0.000e+00 --> 1.807e-15 (m)\n", "Z boundary error: 0.000e+00 --> 3.294e-16 (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" ] } ], "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": { "image/png": "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", "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 = 842 ms\n", "Timer: Objective build = 1.53 sec\n", "Building objective: force\n", "Precomputing transforms\n", "Timer: Precomputing transforms = 59.3 ms\n", "Timer: Objective build = 83.9 ms\n", "Timer: Proximal projection build = 6.72 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 = 262 ms\n", "Timer: Linear constraint projection build = 2.79 sec\n", "Number of parameters: 7\n", "Number of objectives: 16\n", "Timer: Initializing the optimization = 9.83 sec\n", "\n", "Starting optimization\n", "Using method: proximal-lsq-exact\n", " Iteration Total nfev Cost Cost reduction Step norm Optimality \n", " 0 1 1.135e-02 1.416e-01 \n", " 1 2 3.300e-05 1.132e-02 1.753e+07 6.683e-03 \n", " 2 3 1.268e-06 3.173e-05 3.493e+07 6.175e-04 \n", " 3 4 8.387e-07 4.289e-07 6.939e+07 4.352e-04 \n", " 4 5 7.104e-07 1.283e-07 2.068e+07 1.602e-04 \n", " 5 6 6.900e-07 2.039e-08 1.932e+06 8.287e-05 \n", " 6 7 6.831e-07 6.911e-09 6.306e+05 3.310e-05 \n", " 7 8 6.803e-07 2.763e-09 9.909e+05 2.269e-05 \n", "Optimization terminated successfully.\n", "`ftol` condition satisfied.\n", " Current function value: 6.803e-07\n", " Total delta_x: 1.305e+08\n", " Iterations: 7\n", " Function evaluations: 8\n", " Jacobian evaluations: 8\n", "Timer: Solution time = 2.49 min\n", "Timer: Avg time per step = 18.6 sec\n", "==============================================================================================================\n", " Start --> End\n", "Total (sum of squares): 1.135e-02 --> 6.803e-07, \n", "Maximum absolute Bootstrap current self-consistency error: 2.861e+06 --> 3.816e+04 (T A m^-2)\n", "Minimum absolute Bootstrap current self-consistency error: 1.687e+05 --> 3.592e+03 (T A m^-2)\n", "Average absolute Bootstrap current self-consistency error: 1.804e+06 --> 1.237e+04 (T A m^-2)\n", "Maximum absolute Bootstrap current self-consistency error: 2.143e-01 --> 2.858e-03 (normalized)\n", "Minimum absolute Bootstrap current self-consistency error: 1.263e-02 --> 2.690e-04 (normalized)\n", "Average absolute Bootstrap current self-consistency error: 1.351e-01 --> 9.267e-04 (normalized)\n", "Fixed atomic number profile error: 0.000e+00 --> 0.000e+00 (dimensionless)\n", "R boundary error: 0.000e+00 --> 1.752e-18 (m)\n", "Z boundary error: 0.000e+00 --> 2.173e-19 (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: 5.438e+05 --> 1.563e+06 (N)\n", "Minimum absolute Force error: 5.723e+00 --> 4.336e+00 (N)\n", "Average absolute Force error: 3.297e+04 --> 7.910e+04 (N)\n", "Maximum absolute Force error: 1.230e-04 --> 3.537e-04 (normalized)\n", "Minimum absolute Force error: 1.295e-09 --> 9.810e-10 (normalized)\n", "Average absolute Force error: 7.460e-06 --> 1.790e-05 (normalized)\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=10,\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": { "image/png": "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", "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 = 60.0 ms\n", "Timer: Objective build = 81.2 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 = 326 ms\n", "Timer: Linear constraint projection build = 376 ms\n", "Number of parameters: 856\n", "Number of objectives: 5346\n", "Timer: Initializing the optimization = 807 ms\n", "\n", "Starting optimization\n", "Using method: lsq-exact\n", " Iteration Total nfev Cost Cost reduction Step norm Optimality \n", " 0 1 4.316e-03 7.380e-02 \n", " 1 2 6.062e-04 3.709e-03 1.787e-01 1.457e-02 \n", " 2 3 8.345e-05 5.228e-04 1.160e-01 5.285e-03 \n", " 3 5 4.531e-06 7.892e-05 2.265e-02 6.459e-04 \n", " 4 7 2.080e-06 2.451e-06 1.281e-02 2.150e-04 \n", " 5 9 1.825e-06 2.557e-07 6.214e-03 2.159e-05 \n", " 6 10 1.824e-06 1.059e-09 1.104e-02 8.529e-05 \n", " 7 11 1.714e-06 1.098e-07 3.190e-03 8.634e-06 \n", " 8 12 1.690e-06 2.351e-08 6.080e-03 2.522e-05 \n", " 9 13 1.686e-06 4.460e-09 1.223e-02 7.575e-05 \n", " 10 14 1.642e-06 4.433e-08 3.476e-03 6.591e-06 \n", " 11 15 1.632e-06 9.743e-09 6.202e-03 1.806e-05 \n", "Optimization terminated successfully.\n", "`ftol` condition satisfied.\n", " Current function value: 1.632e-06\n", " Total delta_x: 2.174e-01\n", " Iterations: 11\n", " Function evaluations: 15\n", " Jacobian evaluations: 12\n", "Timer: Solution time = 32.4 sec\n", "Timer: Avg time per step = 2.70 sec\n", "==============================================================================================================\n", " Start --> End\n", "Total (sum of squares): 4.316e-03 --> 1.632e-06, \n", "Maximum absolute Force error: 6.338e+07 --> 1.411e+06 (N)\n", "Minimum absolute Force error: 1.530e+02 --> 4.526e+01 (N)\n", "Average absolute Force error: 4.041e+06 --> 9.982e+04 (N)\n", "Maximum absolute Force error: 1.434e-02 --> 3.192e-04 (normalized)\n", "Minimum absolute Force error: 3.463e-08 --> 1.024e-08 (normalized)\n", "Average absolute Force error: 9.143e-04 --> 2.259e-05 (normalized)\n", "R boundary error: 0.000e+00 --> 1.752e-18 (m)\n", "Z boundary error: 0.000e+00 --> 2.170e-19 (m)\n", "Fixed Psi error: 0.000e+00 --> 0.000e+00 (Wb)\n", "Fixed current profile error: 0.000e+00 --> 2.982e-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", "Building objective: force\n", "Precomputing transforms\n", "Timer: Precomputing transforms = 61.9 ms\n", "Timer: Objective build = 83.2 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 = 236 ms\n", "Timer: Linear constraint projection build = 346 ms\n", "Number of parameters: 856\n", "Number of objectives: 5346\n", "Timer: Initializing the optimization = 673 ms\n", "\n", "Starting optimization\n", "Using method: lsq-exact\n", " Iteration Total nfev Cost Cost reduction Step norm Optimality \n", " 0 1 2.297e-04 1.434e-02 \n", " 1 2 3.563e-06 2.262e-04 5.152e-02 7.821e-04 \n", " 2 3 1.217e-06 2.345e-06 1.572e-02 9.091e-05 \n", " 3 5 1.150e-06 6.753e-08 7.105e-03 2.866e-05 \n", " 4 7 1.142e-06 7.311e-09 3.896e-03 5.647e-06 \n", "Optimization terminated successfully.\n", "`ftol` condition satisfied.\n", " Current function value: 1.142e-06\n", " Total delta_x: 5.435e-02\n", " Iterations: 4\n", " Function evaluations: 7\n", " Jacobian evaluations: 5\n", "Timer: Solution time = 10.0 sec\n", "Timer: Avg time per step = 2.01 sec\n", "==============================================================================================================\n", " Start --> End\n", "Total (sum of squares): 2.297e-04 --> 1.142e-06, \n", "Maximum absolute Force error: 1.791e+07 --> 1.301e+06 (N)\n", "Minimum absolute Force error: 6.347e+00 --> 2.539e+00 (N)\n", "Average absolute Force error: 9.465e+05 --> 8.112e+04 (N)\n", "Maximum absolute Force error: 4.052e-03 --> 2.944e-04 (normalized)\n", "Minimum absolute Force error: 1.436e-09 --> 5.745e-10 (normalized)\n", "Average absolute Force error: 2.142e-04 --> 1.835e-05 (normalized)\n", "R boundary error: 0.000e+00 --> 2.711e-20 (m)\n", "Z boundary error: 0.000e+00 --> 6.986e-21 (m)\n", "Fixed Psi error: 0.000e+00 --> 0.000e+00 (Wb)\n", "Fixed current profile error: 0.000e+00 --> 2.107e-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", "Building objective: force\n", "Precomputing transforms\n", "Timer: Precomputing transforms = 61.2 ms\n", "Timer: Objective build = 81.8 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 = 225 ms\n", "Timer: Linear constraint projection build = 388 ms\n", "Number of parameters: 856\n", "Number of objectives: 5346\n", "Timer: Initializing the optimization = 712 ms\n", "\n", "Starting optimization\n", "Using method: lsq-exact\n", " Iteration Total nfev Cost Cost reduction Step norm Optimality \n", " 0 1 7.983e-06 2.380e-03 \n", " 1 2 1.727e-06 6.255e-06 2.300e-02 5.136e-04 \n", " 2 3 1.441e-06 2.859e-07 1.791e-02 3.753e-04 \n", " 3 5 1.183e-06 2.584e-07 1.051e-02 5.586e-05 \n", " 4 7 1.139e-06 4.430e-08 4.935e-03 9.875e-06 \n", " 5 9 1.132e-06 6.331e-09 2.533e-03 2.903e-06 \n", "Optimization terminated successfully.\n", "`ftol` condition satisfied.\n", " Current function value: 1.132e-06\n", " Total delta_x: 2.154e-02\n", " Iterations: 5\n", " Function evaluations: 9\n", " Jacobian evaluations: 6\n", "Timer: Solution time = 15.1 sec\n", "Timer: Avg time per step = 2.52 sec\n", "==============================================================================================================\n", " Start --> End\n", "Total (sum of squares): 7.983e-06 --> 1.132e-06, \n", "Maximum absolute Force error: 3.109e+06 --> 1.440e+06 (N)\n", "Minimum absolute Force error: 1.218e+02 --> 7.819e+00 (N)\n", "Average absolute Force error: 1.859e+05 --> 8.172e+04 (N)\n", "Maximum absolute Force error: 7.035e-04 --> 3.258e-04 (normalized)\n", "Minimum absolute Force error: 2.757e-08 --> 1.769e-09 (normalized)\n", "Average absolute Force error: 4.207e-05 --> 1.849e-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" ] } ], "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": { "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": { "image/png": "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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": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0.00000000e+00 0.00000000e+00 -6.30160671e+03 4.08854743e+06 1.56695263e+07 -6.53752503e+07 9.52881073e+07 -5.75991584e+07 1.02645085e+07]\n", "[ 0.00000000e+00 0.00000000e+00 4.45156650e+05 -1.55399717e+06 4.20378770e+07 -1.24735194e+08 1.64818692e+08 -9.79245665e+07 1.92579542e+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-env", "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.8" } }, "nbformat": 4, "nbformat_minor": 4 }