{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-59152712-8\"></script>\n",
    "<script>\n",
    "  window.dataLayer = window.dataLayer || [];\n",
    "  function gtag(){dataLayer.push(arguments);}\n",
    "  gtag('js', new Date());\n",
    "\n",
    "  gtag('config', 'UA-59152712-8');\n",
    "</script>\n",
    "\n",
    "# LaTeX Interface Example: BSSN (Cartesian)\n",
    "\n",
    "## Author: Ken Sible\n",
    "\n",
    "## This notebook demonstrates parsing BSSN (Cartesian) and validating against NRPy+.\n",
    "[comment]: <> (**Notebook Status:** <font color='red'><b> Not Validated </b></font>)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Covariant Formulation of BSSN\n",
    "\n",
    "\\begin{align}\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "    \\partial_t K &= \\left[\\beta^k \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j} \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
    "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] + \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_j \\beta^j + \\frac{1}{3} \\bar{D}^i \\bar{D}_j \\beta^j \\\\\n",
    "    &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\partial_j \\phi \\right) + 2 \\alpha \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
    "    \\partial_t \\bar{A}_{i j} &= \\left[\\beta^k \\partial_k \\bar{A}_{i j} + \\partial_i \\beta^k \\bar{A}_{k j} + \\partial_j \\beta^k \\bar{A}_{i k} \\right] - \\frac{2}{3} \\bar{A}_{i j} \\bar{D}_k \\beta^k - 2 \\alpha \\bar{A}_{i k} \\bar{A}^k{}_j + \\alpha \\bar{A}_{i j} K \\\\\n",
    "    &\\qquad + e^{-4 \\phi} \\left\\{-2 \\alpha \\bar{D}_i \\bar{D}_j \\phi + 4 \\alpha \\bar{D}_i \\phi \\bar{D}_j \\phi + 4 \\bar{D}_{(i} \\alpha \\bar{D}_{j)} \\phi - \\bar{D}_i \\bar{D}_j \\alpha + \\alpha \\bar{R}_{i j} \\right\\}^{\\text{TF}} \\\\\n",
    "    \\partial_t \\alpha &= \\left[\\beta^k \\partial_k \\alpha \\right] - 2 \\alpha K \\\\\n",
    "    \\partial_t \\beta^i &= \\left[\\beta^k \\bar{D}_k \\beta^i \\right] + B^i \\\\\n",
    "    \\partial_t B^i &= \\left[\\beta^k \\bar{D}_k B^i \\right] + \\frac{3}{4} \\left(\\partial_t \\bar{\\Lambda}^i - \\left[\\beta^k \\bar{D}_k \\bar{\\Lambda}^i \\right] \\right) - \\eta B^i \\\\\n",
    "    \\mathcal{H} &= \\frac{2}{3} K^2 - \\bar{A}_{ij} \\bar{A}^{ij} + e^{-4\\phi} \\left(\\bar{R} - 8 \\bar{D}^i \\phi \\bar{D}_i \\phi - 8 \\bar{D}^2 \\phi \\right) \\\\\n",
    "    \\mathcal{M}^i &= e^{-4\\phi} \\left(\\hat{D}_j \\bar{A}^{ij} + 6 \\bar{A}^{ij}\\partial_j \\phi - \\frac{2}{3} \\bar{\\gamma}^{ij} \\partial_j K + \\bar{A}^{jk} \\Delta^i_{jk} + \\bar{A}^{ik} \\Delta^j_{jk} \\right) \\\\\n",
    "    \\bar{R}_{i j} &= - \\frac{1}{2} \\bar{\\gamma}^{k l} \\hat{D}_k \\hat{D}_l \\bar{\\gamma}_{i j} + \\bar{\\gamma}_{k(i} \\hat{D}_{j)} \\bar{\\Lambda}^k + \\Delta^k \\Delta_{(i j) k} + \\bar{\\gamma}^{k l} \\left(2 \\Delta_{k(i}^m \\Delta_{j) m l} + \\Delta_{i k}^m \\Delta_{m j l} \\right)\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='top'></a>\n",
    "\n",
    "# Table of Contents\n",
    "$$\\label{toc}$$\n",
    "\n",
    "- [Step 1](#step_1): Evolution Equation for $\\partial_t \\bar{\\gamma}_{ij}$\n",
    "- [Step 2](#step_2): Evolution Equation for $\\partial_t \\phi$\n",
    "- [Step 3](#step_3): Evolution Equation for $\\partial_t K$\n",
    "- [Step 4](#step_4): Evolution Equation for $\\partial_t \\bar{\\Lambda}^i$\n",
    "- [Step 5](#step_5): Evolution Equation for $\\partial_t \\bar{A}_{ij}$\n",
    "- [Step 6](#step_6): Gauge Evolution Equation(s)\n",
    "- [Step 7](#step_7): Constraint Equation(s)\n",
    "- [Step 8](#step_8): Output Notebook to PDF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:57:51.221023Z",
     "iopub.status.busy": "2023-04-18T16:57:51.220634Z",
     "iopub.status.idle": "2023-04-18T16:57:54.566160Z",
     "shell.execute_reply": "2023-04-18T16:57:54.565262Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "nrpylatex==1.0.8\r\n"
     ]
    }
   ],
   "source": [
    "!pip install nrpylatex==1.0.8 > /dev/null\n",
    "!pip freeze | grep nrpylatex\n",
    "%load_ext nrpylatex.extension"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:57:54.571023Z",
     "iopub.status.busy": "2023-04-18T16:57:54.570582Z",
     "iopub.status.idle": "2023-04-18T16:57:56.160743Z",
     "shell.execute_reply": "2023-04-18T16:57:56.159948Z"
    }
   },
   "outputs": [],
   "source": [
    "from UnitTesting.assert_equal import assert_equal\n",
    "\n",
    "import NRPy_param_funcs as par, reference_metric as rfm\n",
    "import BSSN.BSSN_quantities as Bq\n",
    "import BSSN.BSSN_RHSs as Brhs\n",
    "import BSSN.BSSN_gauge_RHSs as gaugerhs\n",
    "import BSSN.BSSN_constraints as bssncon\n",
    "\n",
    "par.set_parval_from_str('reference_metric::CoordSystem', 'Cartesian')\n",
    "par.set_parval_from_str('BSSN.BSSN_quantities::LeaveRicciSymbolic', 'True')\n",
    "rfm.reference_metric()\n",
    "Brhs.BSSN_RHSs()\n",
    "gaugerhs.BSSN_gauge_RHSs()\n",
    "bssncon.BSSN_constraints()\n",
    "par.set_parval_from_str('BSSN.BSSN_quantities::LeaveRicciSymbolic', 'False')\n",
    "Bq.RicciBar__gammabarDD_dHatD__DGammaUDD__DGammaU()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We formatted the notebook in the following pedagogical scheme, shown below, to encourage a *learned* approach to parsing tensorial LaTeX.\n",
    "```\n",
    "(1) attempt to parse equation\n",
    "(2) if ParseError or TensorError\n",
    "        debug error and goto (1)\n",
    "(3) change equation and goto (1)\n",
    "```\n",
    "[YouTube Tutorial](https://www.youtube.com/watch?v=A9IWYpQe6Fo) (Notebook Walkthrough)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='step_1'></a>\n",
    "\n",
    "## Step 1: Evolution Equation for $\\partial_t \\bar{\\gamma}_{ij}$ [ [^](#top) ]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\\begin{equation}\n",
    "    \\partial_t \\bar{\\gamma}_{i j} = \\left[\\beta^k \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j}\n",
    "\\end{equation}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:57:56.164628Z",
     "iopub.status.busy": "2023-04-18T16:57:56.164445Z",
     "iopub.status.idle": "2023-04-18T16:57:56.173430Z",
     "shell.execute_reply": "2023-04-18T16:57:56.172662Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ParseError: \\partial_t \\bar{\\gamma}_{i j} = [\\beta^k \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
      "                       ^\n",
      "cannot index undefined tensor 'gammabarDD' at position 29\n"
     ]
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha\n",
    "        \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, attempt to parse the equation without any modification, and notice the `ParseError` for indexing an `undefined tensor 'gammabarDD'`.\n",
    "\n",
    "`gammabarDD :=` $ \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij} $ where `hDD` is the deviation from the flat 3D Cartesian metric `gammahatDD :=` $ \\hat{\\gamma}_{ij} = \\delta_{ij} $.\n",
    "\n",
    "`vardef`: define a variable, including a derivative option and a (anti)symmetry option.<br>\n",
    "`assign`: assign a `vardef` option to an already existing variable in the namespace.<br>\n",
    "`parse`:&nbsp;&nbsp; parse an equation without rendering that equation in a `.tex` document or a Jupyter Notebook.\n",
    "\n",
    "`-metric` can assign the symmetry `sym01` and automatically generate the metric inverse and determinant.\n",
    "\n",
    "1. Define the Kronecker delta `deltaDD` using the `vardef` macro.\n",
    "1. Parse the equation $\\hat{\\gamma}_{ij} = \\delta_{ij}$ using the `parse` macro.\n",
    "1. Assign the `-metric` option to `gammahatDD` using the `assign` macro.\n",
    "\n",
    "```\n",
    "% vardef -kron 'deltaDD'\n",
    "% parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "% assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "```\n",
    "\n",
    "**Remark:** If a derivative option should also apply to the metric inverse and determinant, then that option should precede `-metric`. Moreover, you need not define a scalar quantity. However, should a scalar quantity require a `vardef` option, you may assign one using either the `vardef` or `assign` macro.\n",
    "\n",
    "1. Define the deviation `hDD` using the `vardef` macro.\n",
    "1. Parse the equation $\\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}$ using the `parse` macro.\n",
    "1. Assign the `-metric` option to `gammabarDD` using the `assign` macro.\n",
    "\n",
    "```\n",
    "% vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "% parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "% assign -diff_type=dD -metric 'gammabarDD'\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:57:56.175948Z",
     "iopub.status.busy": "2023-04-18T16:57:56.175762Z",
     "iopub.status.idle": "2023-04-18T16:57:56.373657Z",
     "shell.execute_reply": "2023-04-18T16:57:56.372884Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ParseError: \\partial_t \\bar{\\gamma}_{i j} = [\\beta^k \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
      "                                                                                                ^\n",
      "cannot index undefined tensor 'betaU' at position 386\n"
     ]
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha\n",
    "        \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, replace every instance of `betaU` with `vetU`, a different variable name chosen for the SymPy output, using the `srepl` macro, and then define the variable `vetU` using the `vardef` macro. The `srepl` macro can preserve the original LaTeX representation while changing the variable name internally.\n",
    "\n",
    "**Remark:** If you require a variable name longer than one Latin or Greek letter, you should surround that variable name in the `\\text` command.\n",
    "\n",
    "`srepl`: string replacement given the assumption that string `A` and string `B` are equal whenever they are equivalent syntactically\n",
    "\n",
    "Therefore, for example, `S_{a b} T^{b c}` and `S_{ab}T^{bc}` are considered equal according to the `srepl` macro.\n",
    "\n",
    "```\n",
    "% srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "% vardef -diff_type=dD 'vetU'\n",
    "```\n",
    "\n",
    "**Remark**: You can check \"syntactic equivalence\" for the `srepl` macro using the code snippet provided below.\n",
    "\n",
    "```\n",
    "lexer = Lexer()\n",
    "lexer.initialize(A)\n",
    "syntax_A = [(lexer.lexeme, token) for token in lexer.tokenize()]\n",
    "lexer.initialize(B)\n",
    "syntax_B = [(lexer.lexeme, token) for token in lexer.tokenize()]\n",
    "assert syntax_A == syntax_B\n",
    "```\n",
    "\n",
    "`-persist` will apply the replacement rule `\"...\" -> \"...\"` to every subsequent input (internal or external) of the `parse` function.\n",
    "\n",
    "**Remark:** The `srepl` macro will *not* replace any text inside of a future `srepl` or `ignore` macro."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:57:56.377371Z",
     "iopub.status.busy": "2023-04-18T16:57:56.377186Z",
     "iopub.status.idle": "2023-04-18T16:57:56.537115Z",
     "shell.execute_reply": "2023-04-18T16:57:56.536337Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ParseError: \\bar{A}^k_k - \\bar{D}_k \\text{vet}^k) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
      "            ^\n",
      "cannot index undefined tensor 'AbarUD' at position 598\n"
     ]
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha\n",
    "        \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. Replace every instance of `AbarDD` with `aDD` using the `srepl` macro.\n",
    "1. Define the variable `aDD` (with symmetry `sym01`) using the `vardef` macro.\n",
    "1. Generate the variable `aUD` by assigning the metric `gammabar` to `aDD`.\n",
    "\n",
    "\\begin{equation}\n",
    "    \\bar{A}^i{}_j = \\bar{\\gamma}^{ik} \\bar{A}_{kj}\n",
    "\\end{equation}\n",
    "\n",
    "```\n",
    "% srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "% vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "% assign -metric='gammabar' 'aDD'\n",
    "```\n",
    "\n",
    "**Remark**: The default metric for a variable is the metric associated with the diacritic (or lack thereof) in the variable name. In the current situation, we need to explicitly associate that metric since we removed the `bar` diacritic from the variable `AbarDD` using the `srepl` macro."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:57:56.540624Z",
     "iopub.status.busy": "2023-04-18T16:57:56.540441Z",
     "iopub.status.idle": "2023-04-18T16:57:56.729659Z",
     "shell.execute_reply": "2023-04-18T16:57:56.728893Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TensorError: unbalanced free index {'t'} in gammabarDD_dD\n"
     ]
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha\n",
    "        \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, replace the partial derivative $\\partial_t \\bar{\\gamma}$ on the LHS with the variable name `h_rhs` using the `srepl` macro.\n",
    "\n",
    "```\n",
    "% srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "```\n",
    "\n",
    "**Remark**: We received a `TensorError` that resulted from interpreting `t` as an index in the partial derivative $\\partial_t \\bar{\\gamma}$ on the LHS. However, if the `basis` included the symbol `t`, then numeric indexing would have occurred, i.e. `t -> 0` provided that `basis = [t, x, y, z]` for example."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:57:56.733178Z",
     "iopub.status.busy": "2023-04-18T16:57:56.732955Z",
     "iopub.status.idle": "2023-04-18T16:57:56.933527Z",
     "shell.execute_reply": "2023-04-18T16:57:56.932786Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "\\[\n",
       "\\begin{align}\n",
       "    % vardef -kron 'deltaDD'\n",
       "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
       "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
       "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
       "    % assign -diff_type=dD -metric 'gammabarDD'\n",
       "\n",
       "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
       "    % vardef -diff_type=dD 'vetU'\n",
       "\n",
       "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
       "    % assign -metric='gammabar' 'aDD'\n",
       "\n",
       "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
       "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
       "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha\n",
       "        \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
       "\\end{align}\n",
       "\\]"
      ],
      "text/plain": [
       "('hDD_dD',\n",
       " 'GammahatUDD',\n",
       " 'h_rhsDD',\n",
       " 'gammahatDD',\n",
       " 'epsilonUUU',\n",
       " 'aDD',\n",
       " 'deltaDD',\n",
       " 'gammahatdet',\n",
       " 'aUD',\n",
       " 'gammahatUU',\n",
       " 'gammabarUU',\n",
       " 'hDD',\n",
       " 'alpha',\n",
       " 'gammabarDD_dD',\n",
       " 'gammabarDD',\n",
       " 'gammabardet',\n",
       " 'vetU',\n",
       " 'GammabarUDD',\n",
       " 'vetU_cdbarD',\n",
       " 'vetU_dD')"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha\n",
    "        \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`keydef`: define a keyword, i.e. define a `basis` or coordinate system, or define an `index` range (for looping or summation).\n",
    "\n",
    "```\n",
    "% keydef basis [x, y, z]\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:57:56.937343Z",
     "iopub.status.busy": "2023-04-18T16:57:56.937021Z",
     "iopub.status.idle": "2023-04-18T16:57:57.135657Z",
     "shell.execute_reply": "2023-04-18T16:57:57.134927Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "\\[\n",
       "\\begin{align}\n",
       "    % keydef basis [x, y, z]\n",
       "\n",
       "    % vardef -kron 'deltaDD'\n",
       "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
       "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
       "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
       "    % assign -diff_type=dD -metric 'gammabarDD'\n",
       "\n",
       "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
       "    % vardef -diff_type=dD 'vetU'\n",
       "\n",
       "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
       "    % assign -metric='gammabar' 'aDD'\n",
       "\n",
       "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
       "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
       "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha\n",
       "        \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
       "\\end{align}\n",
       "\\]"
      ],
      "text/plain": [
       "('hDD_dD',\n",
       " 'GammahatUDD',\n",
       " 'h_rhsDD',\n",
       " 'gammahatDD',\n",
       " 'epsilonUUU',\n",
       " 'aDD',\n",
       " 'deltaDD',\n",
       " 'gammahatdet',\n",
       " 'aUD',\n",
       " 'gammahatUU',\n",
       " 'gammabarUU',\n",
       " 'hDD',\n",
       " 'alpha',\n",
       " 'gammabarDD_dD',\n",
       " 'gammabarDD',\n",
       " 'gammabardet',\n",
       " 'vetU',\n",
       " 'GammabarUDD',\n",
       " 'vetU_cdbarD',\n",
       " 'vetU_dD')"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha\n",
    "        \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:57:57.139351Z",
     "iopub.status.busy": "2023-04-18T16:57:57.139043Z",
     "iopub.status.idle": "2023-04-18T16:58:00.264460Z",
     "shell.execute_reply": "2023-04-18T16:58:00.263679Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assertion Failed!\n"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    assert_equal(h_rhsDD, Brhs.h_rhsDD)\n",
    "except AssertionError:\n",
    "    print('Assertion Failed!')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, we upwind every partial derivative in each instance of the pattern `\\beta^{...} \\partial_{...}`. To enforce upwinding inside of the bracketed term on the RHS where that pattern occurs, use the `vphantom` command to dynamically change the derivative type to upwinded.\n",
    "\n",
    "```\n",
    "\\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k ...\n",
    "```\n",
    "\n",
    "**Remark**: You could, alternatively, replace the bracketed term with the Lie derivative `\\mathcal{L}_\\beta \\bar{\\gamma}_{i j}`, allow automatic generation of that Lie derivative, and then use an `srepl` macro with the `-persist` option and (advanced) capture group syntax to upwind the aforementioned pattern.\n",
    "\n",
    "```\n",
    "% srepl -persist \"\\text{vet}^<1> \\partial_<1>\" -> \"\\text{vet}^<1> \\vphantom{dupD} \\partial_<1>\"\n",
    "```\n",
    "\n",
    "To simplify the calculation of $\\bar{D}_k \\beta^k$, substitute a useful tensor identity for that contraction and apply the `-persist` option.\n",
    "$$ \\bar{D}_k \\beta^k = \\partial_k \\beta^k + \\beta^k \\frac{\\partial_k \\hat{\\gamma}}{2 \\hat{\\gamma}} $$\n",
    "```\n",
    "%% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "% srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:00.268482Z",
     "iopub.status.busy": "2023-04-18T16:58:00.268171Z",
     "iopub.status.idle": "2023-04-18T16:58:00.482221Z",
     "shell.execute_reply": "2023-04-18T16:58:00.481508Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "\\[\n",
       "\\begin{align}\n",
       "    % keydef basis [x, y, z]\n",
       "\n",
       "    % vardef -kron 'deltaDD'\n",
       "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
       "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
       "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
       "    % assign -diff_type=dD -metric 'gammabarDD'\n",
       "\n",
       "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
       "    % vardef -diff_type=dD 'vetU'\n",
       "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
       "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
       "\n",
       "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
       "    % assign -metric='gammabar' 'aDD'\n",
       "\n",
       "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
       "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
       "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha\n",
       "        \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
       "\\end{align}\n",
       "\\]"
      ],
      "text/plain": [
       "('hDD_dD',\n",
       " 'hDD_dupD',\n",
       " 'GammahatUDD',\n",
       " 'h_rhsDD',\n",
       " 'gammahatDD',\n",
       " 'epsilonUUU',\n",
       " 'aDD',\n",
       " 'deltaDD',\n",
       " 'gammabarDD_dupD',\n",
       " 'gammahatdet',\n",
       " 'aUD',\n",
       " 'gammahatUU',\n",
       " 'gammabarUU',\n",
       " 'hDD',\n",
       " 'alpha',\n",
       " 'gammabarDD_dD',\n",
       " 'gammabarDD',\n",
       " 'gammabardet',\n",
       " 'vetU',\n",
       " 'GammabarUDD',\n",
       " 'vetU_dD')"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha\n",
    "        \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:00.485717Z",
     "iopub.status.busy": "2023-04-18T16:58:00.485529Z",
     "iopub.status.idle": "2023-04-18T16:58:01.723955Z",
     "shell.execute_reply": "2023-04-18T16:58:01.723391Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assertion Passed!\n"
     ]
    }
   ],
   "source": [
    "assert_equal(h_rhsDD, Brhs.h_rhsDD)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='step_2'></a>\n",
    "\n",
    "## Step 2: Evolution Equation for $\\partial_t \\phi$ [ [^](#top) ]\n",
    "\n",
    "\\begin{equation}\n",
    "    \\partial_t \\phi = \\left[\\beta^k \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right)\n",
    "\\end{equation}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:01.728170Z",
     "iopub.status.busy": "2023-04-18T16:58:01.727861Z",
     "iopub.status.idle": "2023-04-18T16:58:01.864070Z",
     "shell.execute_reply": "2023-04-18T16:58:01.863537Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TensorError: unbalanced free index {'t'} in phi_dD\n"
     ]
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha\n",
    "        \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, replace every instance of `phi` with the conformal factor `cf = W = e^{-2\\phi}`, including every derivative (partial or covariant) of `phi`.\n",
    "\n",
    "\\begin{equation}\n",
    "    \\partial_t W = \\partial_t e^{-2 \\phi} = -2 e^{-2\\phi} \\partial_t \\phi = -2 W \\partial_t \\phi \\Rightarrow \\partial_t \\phi = - \\frac{1}{2W} \\partial_t W\n",
    "\\end{equation}\n",
    "\n",
    "```\n",
    "%% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "% srepl \"e^{-4\\phi}\" -> \"\\text{cf}^2\"\n",
    "% srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "% srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "% srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "```\n",
    "\n",
    "**Remark**: We assigned the `-persist` option to the third `srepl` macro to replace the partial derivative inside of each covariant derivative of `phi`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:01.867363Z",
     "iopub.status.busy": "2023-04-18T16:58:01.867250Z",
     "iopub.status.idle": "2023-04-18T16:58:02.004423Z",
     "shell.execute_reply": "2023-04-18T16:58:02.003913Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "\\[\n",
       "\\begin{align}\n",
       "    % keydef basis [x, y, z]\n",
       "\n",
       "    % vardef -kron 'deltaDD'\n",
       "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
       "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
       "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
       "    % assign -diff_type=dD -metric 'gammabarDD'\n",
       "\n",
       "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
       "    % vardef -diff_type=dD 'vetU'\n",
       "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
       "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
       "\n",
       "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
       "    % assign -metric='gammabar' 'aDD'\n",
       "\n",
       "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
       "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
       "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha\n",
       "        \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
       "\n",
       "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
       "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
       "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
       "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "\n",
       "    \\partial_t \\phi &= \\left[\\beta^k \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
       "\\end{align}\n",
       "\\]"
      ],
      "text/plain": [
       "('hDD_dD',\n",
       " 'K',\n",
       " 'cf_rhs',\n",
       " 'hDD_dupD',\n",
       " 'GammahatUDD',\n",
       " 'h_rhsDD',\n",
       " 'cf',\n",
       " 'gammahatDD',\n",
       " 'epsilonUUU',\n",
       " 'aDD',\n",
       " 'deltaDD',\n",
       " 'gammabarDD_dupD',\n",
       " 'gammahatdet',\n",
       " 'aUD',\n",
       " 'gammahatUU',\n",
       " 'gammabarUU',\n",
       " 'hDD',\n",
       " 'alpha',\n",
       " 'gammabarDD_dD',\n",
       " 'gammabarDD',\n",
       " 'gammabardet',\n",
       " 'vetU',\n",
       " 'GammabarUDD',\n",
       " 'vetU_dD')"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha\n",
    "        \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:02.008343Z",
     "iopub.status.busy": "2023-04-18T16:58:02.008025Z",
     "iopub.status.idle": "2023-04-18T16:58:02.026053Z",
     "shell.execute_reply": "2023-04-18T16:58:02.025541Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assertion Failed!\n"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    assert_equal(cf_rhs, Brhs.cf_rhs)\n",
    "except AssertionError:\n",
    "    print('Assertion Failed!')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, enforce upwinding on the contracted partial derivative inside of the bracketed term using the `vphantom` command.\n",
    "\n",
    "```\n",
    "\\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k ...\n",
    "```\n",
    "\n",
    "Finally, replace every instance of `K` with `trK` using the `srepl` macro.\n",
    "\n",
    "```\n",
    "% srepl \"K\" -> \"\\text{trK}\"\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:02.030300Z",
     "iopub.status.busy": "2023-04-18T16:58:02.029984Z",
     "iopub.status.idle": "2023-04-18T16:58:02.165069Z",
     "shell.execute_reply": "2023-04-18T16:58:02.164562Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "\\[\n",
       "\\begin{align}\n",
       "    % keydef basis [x, y, z]\n",
       "\n",
       "    % vardef -kron 'deltaDD'\n",
       "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
       "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
       "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
       "    % assign -diff_type=dD -metric 'gammabarDD'\n",
       "\n",
       "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
       "    % vardef -diff_type=dD 'vetU'\n",
       "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
       "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
       "\n",
       "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
       "    % assign -metric='gammabar' 'aDD'\n",
       "\n",
       "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
       "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
       "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha\n",
       "        \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
       "\n",
       "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
       "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
       "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
       "    % srepl -persist \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "\n",
       "    % srepl \"K\" -> \"\\text{trK}\"\n",
       "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
       "\\end{align}\n",
       "\\]"
      ],
      "text/plain": [
       "('hDD_dD',\n",
       " 'cf_rhs',\n",
       " 'hDD_dupD',\n",
       " 'GammahatUDD',\n",
       " 'h_rhsDD',\n",
       " 'cf',\n",
       " 'gammahatDD',\n",
       " 'epsilonUUU',\n",
       " 'aDD',\n",
       " 'deltaDD',\n",
       " 'gammabarDD_dupD',\n",
       " 'gammahatdet',\n",
       " 'aUD',\n",
       " 'gammahatUU',\n",
       " 'gammabarUU',\n",
       " 'hDD',\n",
       " 'alpha',\n",
       " 'gammabarDD_dD',\n",
       " 'trK',\n",
       " 'gammabarDD',\n",
       " 'gammabardet',\n",
       " 'vetU',\n",
       " 'cf_dupD',\n",
       " 'GammabarUDD',\n",
       " 'vetU_dD')"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j} \\left(\\alpha\n",
    "        \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:02.168075Z",
     "iopub.status.busy": "2023-04-18T16:58:02.167957Z",
     "iopub.status.idle": "2023-04-18T16:58:02.179739Z",
     "shell.execute_reply": "2023-04-18T16:58:02.179230Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assertion Passed!\n"
     ]
    }
   ],
   "source": [
    "assert_equal(cf_rhs, Brhs.cf_rhs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='step_3'></a>\n",
    "\n",
    "## Step 3: Evolution Equation for $\\partial_t K$ [ [^](#top) ]\n",
    "\n",
    "\\begin{equation}\n",
    "    \\partial_t K = \\left[\\beta^k \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
    "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right)\n",
    "\\end{equation}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:02.183802Z",
     "iopub.status.busy": "2023-04-18T16:58:02.183676Z",
     "iopub.status.idle": "2023-04-18T16:58:02.994831Z",
     "shell.execute_reply": "2023-04-18T16:58:02.994321Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TensorError: unbalanced free index {'t'} in trK_dD\n"
     ]
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
    "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\n",
    "    \\partial_t K &= \\left[\\beta^k \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
    "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, replace the partial derivative $\\partial_t K$ on the LHS with the variable name `trK_rhs` using the `srepl` macro.\n",
    "\n",
    "```\n",
    "% srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:02.998040Z",
     "iopub.status.busy": "2023-04-18T16:58:02.997921Z",
     "iopub.status.idle": "2023-04-18T16:58:03.739052Z",
     "shell.execute_reply": "2023-04-18T16:58:03.738626Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "\\[\n",
       "\\begin{align}\n",
       "    % keydef basis [x, y, z]\n",
       "\n",
       "    % vardef -kron 'deltaDD'\n",
       "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
       "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
       "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
       "    % assign -diff_type=dD -metric 'gammabarDD'\n",
       "\n",
       "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
       "    % vardef -diff_type=dD 'vetU'\n",
       "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
       "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
       "\n",
       "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
       "    % assign -metric='gammabar' 'aDD'\n",
       "\n",
       "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
       "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
       "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
       "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
       "\n",
       "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
       "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
       "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
       "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "\n",
       "    % srepl \"K\" -> \"\\text{trK}\"\n",
       "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
       "\n",
       "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
       "    \\partial_t K &= \\left[\\beta^k \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
       "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
       "\\end{align}\n",
       "\\]"
      ],
      "text/plain": [
       "('hDD_dD',\n",
       " 'gammabardet_dD',\n",
       " 'phi_cdbarD',\n",
       " 'alpha_dD',\n",
       " 'cf_rhs',\n",
       " 'hDD_dupD',\n",
       " 'alpha_cdbarU_dD',\n",
       " 'alpha_dDD',\n",
       " 'GammahatUDD',\n",
       " 'h_rhsDD',\n",
       " 'cf',\n",
       " 'gammahatDD',\n",
       " 'epsilonUUU',\n",
       " 'trK_rhs',\n",
       " 'aDD',\n",
       " 'deltaDD',\n",
       " 'alpha_cdbarU',\n",
       " 'alpha_cdbarD_dD',\n",
       " 'alpha_cdbarUD',\n",
       " 'gammabarDD_dupD',\n",
       " 'gammahatdet',\n",
       " 'aUD',\n",
       " 'gammahatUU',\n",
       " 'gammabarUU_dD',\n",
       " 'gammabarUU',\n",
       " 'phi',\n",
       " 'hDD',\n",
       " 'alpha',\n",
       " 'gammabarDD_dD',\n",
       " 'trK',\n",
       " 'gammabarDD',\n",
       " 'aUU',\n",
       " 'gammabardet',\n",
       " 'alpha_cdbarD',\n",
       " 'vetU',\n",
       " 'cf_dupD',\n",
       " 'GammabarUDD',\n",
       " 'vetU_dD')"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
    "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\n",
    "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
    "    \\partial_t K &= \\left[\\beta^k \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
    "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:03.742389Z",
     "iopub.status.busy": "2023-04-18T16:58:03.742276Z",
     "iopub.status.idle": "2023-04-18T16:58:04.925559Z",
     "shell.execute_reply": "2023-04-18T16:58:04.925052Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assertion Failed!\n"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    assert_equal(trK_rhs, Brhs.trK_rhs)\n",
    "except AssertionError:\n",
    "    print('Assertion Failed!')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, enforce upwinding on the contracted partial derivative inside of the bracketed term using the `vphantom` command.\n",
    "\n",
    "```\n",
    "\\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K ...\n",
    "```\n",
    "\n",
    "Finally, assign the property `-diff_type=dD` to `cf`, `trK`, and `alpha` using the `assign` macro."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:04.928621Z",
     "iopub.status.busy": "2023-04-18T16:58:04.928510Z",
     "iopub.status.idle": "2023-04-18T16:58:05.677227Z",
     "shell.execute_reply": "2023-04-18T16:58:05.676740Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "\\[\n",
       "\\begin{align}\n",
       "    % keydef basis [x, y, z]\n",
       "\n",
       "    % vardef -kron 'deltaDD'\n",
       "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
       "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
       "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
       "    % assign -diff_type=dD -metric 'gammabarDD'\n",
       "\n",
       "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
       "    % vardef -diff_type=dD 'vetU'\n",
       "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
       "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
       "\n",
       "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
       "    % assign -metric='gammabar' 'aDD'\n",
       "\n",
       "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
       "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
       "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
       "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
       "\n",
       "    % assign -diff_type=dD 'cf'\n",
       "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
       "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
       "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
       "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "\n",
       "    % srepl \"K\" -> \"\\text{trK}\"\n",
       "    % assign -diff_type=dD 'trK'\n",
       "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
       "\n",
       "    % assign -diff_type=dD 'alpha'\n",
       "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
       "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
       "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
       "\\end{align}\n",
       "\\]"
      ],
      "text/plain": [
       "('hDD_dD',\n",
       " 'gammabardet_dD',\n",
       " 'phi_cdbarD',\n",
       " 'alpha_dD',\n",
       " 'cf_rhs',\n",
       " 'hDD_dupD',\n",
       " 'alpha_cdbarU_dD',\n",
       " 'alpha_dDD',\n",
       " 'GammahatUDD',\n",
       " 'h_rhsDD',\n",
       " 'cf',\n",
       " 'gammahatDD',\n",
       " 'epsilonUUU',\n",
       " 'trK_rhs',\n",
       " 'aDD',\n",
       " 'cf_dD',\n",
       " 'deltaDD',\n",
       " 'alpha_cdbarU',\n",
       " 'alpha_cdbarD_dD',\n",
       " 'alpha_cdbarUD',\n",
       " 'gammabarDD_dupD',\n",
       " 'gammahatdet',\n",
       " 'aUD',\n",
       " 'gammahatUU',\n",
       " 'gammabarUU_dD',\n",
       " 'gammabarUU',\n",
       " 'phi',\n",
       " 'hDD',\n",
       " 'alpha',\n",
       " 'gammabarDD_dD',\n",
       " 'trK',\n",
       " 'gammabarDD',\n",
       " 'aUU',\n",
       " 'gammabardet',\n",
       " 'alpha_cdbarD',\n",
       " 'vetU',\n",
       " 'cf_dupD',\n",
       " 'GammabarUDD',\n",
       " 'trK_dupD',\n",
       " 'vetU_dD')"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
    "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'cf'\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    % assign -diff_type=dD 'trK'\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'alpha'\n",
    "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
    "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
    "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:05.680168Z",
     "iopub.status.busy": "2023-04-18T16:58:05.680052Z",
     "iopub.status.idle": "2023-04-18T16:58:06.944858Z",
     "shell.execute_reply": "2023-04-18T16:58:06.944343Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assertion Passed!\n"
     ]
    }
   ],
   "source": [
    "assert_equal(trK_rhs, Brhs.trK_rhs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='step_4'></a>\n",
    "\n",
    "## Step 4: Evolution Equation for $\\partial_t \\bar{\\Lambda}^i$ [ [^](#top) ]\n",
    "\n",
    "\\begin{align}\n",
    "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] + \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_j \\beta^j + \\frac{1}{3} \\bar{D}^i \\bar{D}_j \\beta^j \\\\\n",
    "    &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\partial_j \\phi \\right) + 2 \\alpha \\bar{A}^{j k} \\Delta_{j k}^i - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:06.949109Z",
     "iopub.status.busy": "2023-04-18T16:58:06.948793Z",
     "iopub.status.idle": "2023-04-18T16:58:07.696088Z",
     "shell.execute_reply": "2023-04-18T16:58:07.695577Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ParseError: \\partial_t \\bar{\\Lambda}^i = [\\text{vet}^k \\partial_k \\bar{\\Lambda}^i - \\partial_k \\text{vet}^i \\bar{\\Lambda}^k ] +\n",
      "                       ^\n",
      "cannot index undefined tensor 'LambdabarU' at position 2099\n"
     ]
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
    "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'cf'\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    % assign -diff_type=dD 'trK'\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'alpha'\n",
    "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
    "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
    "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
    "\n",
    "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
    "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\\n",
    "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
    "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, replace every instance of `LambdabarU` with `lambdaU` using the `srepl` macro, and then define the variable `lambdaU` using the `vardef` macro.\n",
    "\n",
    "```\n",
    "% srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
    "% vardef -diff_type=dD 'lambdaU'\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:07.700231Z",
     "iopub.status.busy": "2023-04-18T16:58:07.699546Z",
     "iopub.status.idle": "2023-04-18T16:58:08.761622Z",
     "shell.execute_reply": "2023-04-18T16:58:08.761055Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TensorError: unbalanced free index {'t'} in lambdaU_dD\n"
     ]
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
    "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'cf'\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    % assign -diff_type=dD 'trK'\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'alpha'\n",
    "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
    "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
    "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
    "\n",
    "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
    "    % vardef -diff_type=dD 'lambdaU'\n",
    "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
    "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\\n",
    "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
    "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. Parse $ \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij} $ using the `parse` macro to define `DeltaUDD`.\n",
    "1. Parse $ \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij} $ (contraction of `DeltaUDD`) using the `parse` macro to define `DeltaU`.\n",
    "\n",
    "```\n",
    "% parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
    "% parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:08.764647Z",
     "iopub.status.busy": "2023-04-18T16:58:08.764518Z",
     "iopub.status.idle": "2023-04-18T16:58:09.801701Z",
     "shell.execute_reply": "2023-04-18T16:58:09.801131Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TensorError: unbalanced free index {'t'} in lambdaU_dD\n"
     ]
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
    "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'cf'\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    % assign -diff_type=dD 'trK'\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'alpha'\n",
    "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
    "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
    "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
    "\n",
    "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
    "    % vardef -diff_type=dD 'lambdaU'\n",
    "\n",
    "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
    "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij} \\\\\n",
    "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
    "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\\n",
    "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
    "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, replace the partial derivative $\\partial_t \\bar{\\Lambda}$ on the LHS with the variable name `Lambdabar_rhs` using the `srepl` macro.\n",
    "\n",
    "```\n",
    "% srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:09.805104Z",
     "iopub.status.busy": "2023-04-18T16:58:09.804976Z",
     "iopub.status.idle": "2023-04-18T16:58:10.885847Z",
     "shell.execute_reply": "2023-04-18T16:58:10.885287Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ParseError: \\qquad - 2 \\text{a}^{i j} (\\partial_j \\alpha - 6 \\alpha \\partial_j \\text{cf} \\frac{-1}{2 \\text{cf}} ) + 2 \\alpha\n",
      "            ^\n",
      "unsupported operator '\\qquad' at position 2793\n"
     ]
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
    "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'cf'\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    % assign -diff_type=dD 'trK'\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'alpha'\n",
    "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
    "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
    "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
    "\n",
    "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
    "    % vardef -diff_type=dD 'lambdaU'\n",
    "\n",
    "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
    "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
    "    % srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
    "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
    "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\\n",
    "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
    "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, internally remove the formatting command `\\qquad` using the `ignore` macro.\n",
    "\n",
    "`ignore`: remove a LaTeX command or substring; equivalent to `srepl \"...\" -> \"\"` (empty replacement).\n",
    "\n",
    "```\n",
    "% ignore \"\\qquad\"\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:10.889631Z",
     "iopub.status.busy": "2023-04-18T16:58:10.889317Z",
     "iopub.status.idle": "2023-04-18T16:58:11.972021Z",
     "shell.execute_reply": "2023-04-18T16:58:11.971437Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ParseError: - 2 \\text{a}^{i j} (\\partial_j \\alpha - 6 \\alpha \\partial_j \\text{cf} \\frac{-1}{2 \\text{cf}} ) + 2 \\alpha\n",
      "            ^\n",
      "unsupported operator '-' at position 2816\n"
     ]
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "    % ignore \"\\qquad\"\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
    "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'cf'\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    % assign -diff_type=dD 'trK'\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'alpha'\n",
    "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
    "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
    "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
    "\n",
    "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
    "    % vardef -diff_type=dD 'lambdaU'\n",
    "\n",
    "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
    "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
    "    % srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
    "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
    "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\\n",
    "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
    "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, append a percent symbol `%` to the end of the line break preceding `\\qquad`, and then remove that custom line break `\\\\%` using the `ignore` macro.\n",
    "\n",
    "```\n",
    "% ignore \"\\\\%\"\n",
    "```\n",
    "\n",
    "**Remark**: You cannot split an equation across a line break, and hence we removed that line break internally using the `ignore` macro."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:11.975989Z",
     "iopub.status.busy": "2023-04-18T16:58:11.975642Z",
     "iopub.status.idle": "2023-04-18T16:58:13.082293Z",
     "shell.execute_reply": "2023-04-18T16:58:13.081752Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "\\[\n",
       "\\begin{align}\n",
       "    % keydef basis [x, y, z]\n",
       "    % ignore \"\\\\%\", \"\\qquad\"\n",
       "\n",
       "    % vardef -kron 'deltaDD'\n",
       "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
       "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
       "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
       "    % assign -diff_type=dD -metric 'gammabarDD'\n",
       "\n",
       "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
       "    % vardef -diff_type=dD 'vetU'\n",
       "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
       "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
       "\n",
       "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
       "    % assign -metric='gammabar' 'aDD'\n",
       "\n",
       "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
       "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
       "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
       "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
       "\n",
       "    % assign -diff_type=dD 'cf'\n",
       "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
       "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
       "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
       "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "\n",
       "    % srepl \"K\" -> \"\\text{trK}\"\n",
       "    % assign -diff_type=dD 'trK'\n",
       "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
       "\n",
       "    % assign -diff_type=dD 'alpha'\n",
       "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
       "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
       "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
       "\n",
       "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
       "    % vardef -diff_type=dD 'lambdaU'\n",
       "\n",
       "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
       "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
       "    % srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
       "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
       "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\%\n",
       "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
       "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
       "\\end{align}\n",
       "\\]"
      ],
      "text/plain": [
       "('vetU_cdhatD_dD',\n",
       " 'hDD_dD',\n",
       " 'gammabardet_dD',\n",
       " 'phi_cdbarD',\n",
       " 'alpha_dD',\n",
       " 'cf_rhs',\n",
       " 'hDD_dupD',\n",
       " 'alpha_cdbarU_dD',\n",
       " 'alpha_dDD',\n",
       " 'GammahatUDD',\n",
       " 'h_rhsDD',\n",
       " 'cf',\n",
       " 'gammahatDD',\n",
       " 'epsilonUUU',\n",
       " 'trK_rhs',\n",
       " 'DeltaU',\n",
       " 'aDD',\n",
       " 'gammahatdet_cdbarU',\n",
       " 'cf_dD',\n",
       " 'deltaDD',\n",
       " 'alpha_cdbarU',\n",
       " 'alpha_cdbarD_dD',\n",
       " 'alpha_cdbarUD',\n",
       " 'vetU_cdhatD',\n",
       " 'gammabarDD_dupD',\n",
       " 'DeltaUDD',\n",
       " 'vetU_cdhatDD',\n",
       " 'gammahatdet',\n",
       " 'aUD',\n",
       " 'gammahatdet_dD_cdbarU',\n",
       " 'gammahatUU',\n",
       " 'gammabarUU_dD',\n",
       " 'gammahatdet_dD_cdbarD',\n",
       " 'gammabarUU',\n",
       " 'lambdaU_dD',\n",
       " 'trK_dD',\n",
       " 'phi',\n",
       " 'hDD',\n",
       " 'alpha',\n",
       " 'gammabarDD_dD',\n",
       " 'trK',\n",
       " 'vetU_dD_cdbarD',\n",
       " 'gammabarDD',\n",
       " 'aUU',\n",
       " 'lambdaU',\n",
       " 'gammabardet',\n",
       " 'alpha_cdbarD',\n",
       " 'vetU_dDD',\n",
       " 'vetU',\n",
       " 'gammahatdet_cdbarD',\n",
       " 'vetU_dD_cdbarU',\n",
       " 'Lambdabar_rhsU',\n",
       " 'cf_dupD',\n",
       " 'GammabarUDD',\n",
       " 'trK_dupD',\n",
       " 'vetU_cdbarD',\n",
       " 'gammahatdet_dD',\n",
       " 'vetU_dD',\n",
       " 'vetU_cdbarU')"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "    % ignore \"\\\\%\", \"\\qquad\"\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
    "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'cf'\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    % assign -diff_type=dD 'trK'\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'alpha'\n",
    "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
    "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
    "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
    "\n",
    "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
    "    % vardef -diff_type=dD 'lambdaU'\n",
    "\n",
    "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
    "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
    "    % srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
    "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
    "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\%\n",
    "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
    "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:13.087025Z",
     "iopub.status.busy": "2023-04-18T16:58:13.086714Z",
     "iopub.status.idle": "2023-04-18T16:58:15.824524Z",
     "shell.execute_reply": "2023-04-18T16:58:15.823970Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assertion Failed!\n"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    assert_equal(Lambdabar_rhsU, Brhs.Lambdabar_rhsU)\n",
    "except AssertionError:\n",
    "    print('Assertion Failed!')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, enforce upwinding on the contracted partial derivative inside of the bracketed term using the `vphantom` command.\n",
    "\n",
    "```\n",
    "\\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\vphantom{dupD} \\partial_k ...\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:15.826790Z",
     "iopub.status.busy": "2023-04-18T16:58:15.826674Z",
     "iopub.status.idle": "2023-04-18T16:58:16.936737Z",
     "shell.execute_reply": "2023-04-18T16:58:16.936247Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "\\[\n",
       "\\begin{align}\n",
       "    % keydef basis [x, y, z]\n",
       "    % ignore \"\\\\%\", \"\\qquad\"\n",
       "\n",
       "    % vardef -kron 'deltaDD'\n",
       "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
       "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
       "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
       "    % assign -diff_type=dD -metric 'gammabarDD'\n",
       "\n",
       "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
       "    % vardef -diff_type=dD 'vetU'\n",
       "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
       "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
       "\n",
       "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
       "    % assign -metric='gammabar' 'aDD'\n",
       "\n",
       "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
       "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
       "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
       "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
       "\n",
       "    % assign -diff_type=dD 'cf'\n",
       "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
       "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
       "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
       "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "\n",
       "    % srepl \"K\" -> \"\\text{trK}\"\n",
       "    % assign -diff_type=dD 'trK'\n",
       "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
       "\n",
       "    % assign -diff_type=dD 'alpha'\n",
       "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
       "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
       "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
       "\n",
       "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
       "    % vardef -diff_type=dD 'lambdaU'\n",
       "\n",
       "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
       "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
       "    % srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
       "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
       "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\%\n",
       "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
       "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
       "\\end{align}\n",
       "\\]"
      ],
      "text/plain": [
       "('vetU_cdhatD_dD',\n",
       " 'hDD_dD',\n",
       " 'gammabardet_dD',\n",
       " 'phi_cdbarD',\n",
       " 'alpha_dD',\n",
       " 'cf_rhs',\n",
       " 'hDD_dupD',\n",
       " 'alpha_cdbarU_dD',\n",
       " 'alpha_dDD',\n",
       " 'GammahatUDD',\n",
       " 'h_rhsDD',\n",
       " 'cf',\n",
       " 'gammahatDD',\n",
       " 'lambdaU_dupD',\n",
       " 'epsilonUUU',\n",
       " 'trK_rhs',\n",
       " 'DeltaU',\n",
       " 'aDD',\n",
       " 'gammahatdet_cdbarU',\n",
       " 'cf_dD',\n",
       " 'deltaDD',\n",
       " 'alpha_cdbarU',\n",
       " 'alpha_cdbarD_dD',\n",
       " 'alpha_cdbarUD',\n",
       " 'vetU_cdhatD',\n",
       " 'gammabarDD_dupD',\n",
       " 'DeltaUDD',\n",
       " 'vetU_cdhatDD',\n",
       " 'gammahatdet',\n",
       " 'aUD',\n",
       " 'gammahatdet_dD_cdbarU',\n",
       " 'gammahatUU',\n",
       " 'gammabarUU_dD',\n",
       " 'gammahatdet_dD_cdbarD',\n",
       " 'gammabarUU',\n",
       " 'trK_dD',\n",
       " 'phi',\n",
       " 'hDD',\n",
       " 'alpha',\n",
       " 'gammabarDD_dD',\n",
       " 'trK',\n",
       " 'vetU_dD_cdbarD',\n",
       " 'gammabarDD',\n",
       " 'aUU',\n",
       " 'lambdaU',\n",
       " 'gammabardet',\n",
       " 'alpha_cdbarD',\n",
       " 'vetU_dDD',\n",
       " 'vetU',\n",
       " 'gammahatdet_cdbarD',\n",
       " 'vetU_dD_cdbarU',\n",
       " 'Lambdabar_rhsU',\n",
       " 'cf_dupD',\n",
       " 'GammabarUDD',\n",
       " 'trK_dupD',\n",
       " 'vetU_cdbarD',\n",
       " 'gammahatdet_dD',\n",
       " 'vetU_dD',\n",
       " 'vetU_cdbarU')"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "    % ignore \"\\\\%\", \"\\qquad\"\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
    "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'cf'\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    % assign -diff_type=dD 'trK'\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'alpha'\n",
    "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
    "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
    "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
    "\n",
    "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
    "    % vardef -diff_type=dD 'lambdaU'\n",
    "\n",
    "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
    "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
    "    % srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
    "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
    "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\%\n",
    "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
    "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:16.940354Z",
     "iopub.status.busy": "2023-04-18T16:58:16.940042Z",
     "iopub.status.idle": "2023-04-18T16:58:19.664414Z",
     "shell.execute_reply": "2023-04-18T16:58:19.663910Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assertion Passed!\n"
     ]
    }
   ],
   "source": [
    "assert_equal(Lambdabar_rhsU, Brhs.Lambdabar_rhsU)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='step_5'></a>\n",
    "\n",
    "## Step 5: Evolution Equation for $\\partial_t \\bar{A}_{ij}$ [ [^](#top) ]\n",
    "\n",
    "\\begin{align}\n",
    "    \\partial_t \\bar{A}_{i j} &= \\left[\\beta^k \\partial_k \\bar{A}_{i j} + \\partial_i \\beta^k \\bar{A}_{k j} + \\partial_j \\beta^k \\bar{A}_{i k} \\right] - \\frac{2}{3} \\bar{A}_{i j} \\bar{D}_k \\beta^k - 2 \\alpha \\bar{A}_{i k} \\bar{A}^k{}_j + \\alpha \\bar{A}_{i j} K \\\\\n",
    "    &\\qquad + e^{-4 \\phi} \\left\\{-2 \\alpha \\bar{D}_i \\bar{D}_j \\phi + 4 \\alpha \\bar{D}_i \\phi \\bar{D}_j \\phi + 4 \\bar{D}_{(i} \\alpha \\bar{D}_{j)} \\phi - \\bar{D}_i \\bar{D}_j \\alpha + \\alpha \\bar{R}_{i j} \\right\\}^{\\text{TF}}\n",
    "\\end{align}\n",
    "\n",
    "**Remark**: We must manually expand the trace-free term $ \\{\\ldots\\}^{TF} $ and the symmetric term $ \\bar{D}_{(i} \\alpha \\bar{D}_{j)} $ since neither notation is currenlty supported.\n",
    "\n",
    "\\begin{gather}\n",
    "    \\bar{D}_{(i} \\alpha \\bar{D}_{j)} = \\frac{1}{2} \\left(\\bar{D}_i \\alpha \\bar{D}_j + \\bar{D}_j \\alpha \\bar{D}_i \\right) \\\\\n",
    "    X_{i j} = -2 \\alpha \\bar{D}_i \\bar{D}_j \\phi + 4 \\alpha \\bar{D}_i \\phi \\bar{D}_j \\phi + 2 \\bar{D}_i \\alpha \\bar{D}_j \\phi + 2 \\bar{D}_j \\alpha \\bar{D}_i \\phi - \\bar{D}_i \\bar{D}_j \\alpha + \\alpha \\bar{R}_{i j} \\\\\n",
    "    \\hat{X}_{i j} = X_{i j} - \\frac{1}{3} \\bar{\\gamma}_{i j} \\bar{\\gamma}^{k l} X_{k l} \\\\\n",
    "    \\partial_t \\bar{A}_{i j} = \\left[\\beta^k \\partial_k \\bar{A}_{i j} + \\partial_i \\beta^k \\bar{A}_{k j} + \\partial_j \\beta^k \\bar{A}_{i k} \\right] - \\frac{2}{3} \\bar{A}_{i j} \\bar{D}_k \\beta^k - 2 \\alpha \\bar{A}_{i k} \\bar{A}^k{}_j + \\alpha \\bar{A}_{i j} K + e^{-4 \\phi} \\hat{X}_{i j}\n",
    "\\end{gather}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:19.668747Z",
     "iopub.status.busy": "2023-04-18T16:58:19.668442Z",
     "iopub.status.idle": "2023-04-18T16:58:20.812813Z",
     "shell.execute_reply": "2023-04-18T16:58:20.812301Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ParseError: \\bar{D}_j \\phi + 2 \\bar{D}_j \\alpha \\bar{D}_i \\phi - \\bar{D}_i \\bar{D}_j \\alpha + \\alpha \\bar{R}_{i j} \\\\\n",
      "                                                                                                     ^\n",
      "cannot index undefined tensor 'RbarDD' at position 3255\n"
     ]
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "    % ignore \"\\\\%\", \"\\qquad\"\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
    "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'cf'\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    % assign -diff_type=dD 'trK'\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'alpha'\n",
    "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
    "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
    "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
    "\n",
    "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
    "    % vardef -diff_type=dD 'lambdaU'\n",
    "\n",
    "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
    "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
    "    % srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
    "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
    "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\%\n",
    "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
    "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
    "\n",
    "    X_{i j} &= -2 \\alpha \\bar{D}_i \\bar{D}_j \\phi + 4 \\alpha \\bar{D}_i \\phi \\bar{D}_j \\phi + 2 \\bar{D}_i \\alpha\n",
    "        \\bar{D}_j \\phi + 2 \\bar{D}_j \\alpha \\bar{D}_i \\phi - \\bar{D}_i \\bar{D}_j \\alpha + \\alpha \\bar{R}_{i j} \\\\\n",
    "    \\hat{X}_{i j} &= X_{i j} - \\frac{1}{3} \\bar{\\gamma}_{i j} \\bar{\\gamma}^{k l} X_{k l} \\\\\n",
    "    \\partial_t \\bar{A}_{i j} &= \\left[\\beta^k \\partial_k \\bar{A}_{i j} + \\partial_i \\beta^k \\bar{A}_{k j} + \\partial_j \\beta^k\n",
    "        \\bar{A}_{i k} \\right] - \\frac{2}{3} \\bar{A}_{i j} \\bar{D}_k \\beta^k - 2 \\alpha \\bar{A}_{i k}\n",
    "        \\bar{A}^k{}_j + \\alpha \\bar{A}_{i j} K + e^{-4 \\phi} \\hat{X}_{i j} \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, define the variable `RbarDD` (with symmetry `sym01`) using the `vardef` macro.\n",
    "\n",
    "```\n",
    "% vardef -diff_type=dD -symmetry=sym01 'RbarDD'\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:20.816034Z",
     "iopub.status.busy": "2023-04-18T16:58:20.815918Z",
     "iopub.status.idle": "2023-04-18T16:58:21.970653Z",
     "shell.execute_reply": "2023-04-18T16:58:21.970082Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TensorError: unbalanced free index {'t'} in aDD_dD\n"
     ]
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "    % ignore \"\\\\%\", \"\\qquad\"\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
    "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'cf'\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    % assign -diff_type=dD 'trK'\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'alpha'\n",
    "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
    "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
    "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
    "\n",
    "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
    "    % vardef -diff_type=dD 'lambdaU'\n",
    "\n",
    "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
    "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
    "    % srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
    "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
    "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\%\n",
    "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
    "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
    "\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'RbarDD'\n",
    "    X_{i j} &= -2 \\alpha \\bar{D}_i \\bar{D}_j \\phi + 4 \\alpha \\bar{D}_i \\phi \\bar{D}_j \\phi + 2 \\bar{D}_i \\alpha\n",
    "        \\bar{D}_j \\phi + 2 \\bar{D}_j \\alpha \\bar{D}_i \\phi - \\bar{D}_i \\bar{D}_j \\alpha + \\alpha \\bar{R}_{i j} \\\\\n",
    "    \\hat{X}_{i j} &= X_{i j} - \\frac{1}{3} \\bar{\\gamma}_{i j} \\bar{\\gamma}^{k l} X_{k l} \\\\\n",
    "    \\partial_t \\bar{A}_{i j} &= \\left[\\beta^k \\partial_k \\bar{A}_{i j} + \\partial_i \\beta^k \\bar{A}_{k j} + \\partial_j \\beta^k\n",
    "        \\bar{A}_{i k} \\right] - \\frac{2}{3} \\bar{A}_{i j} \\bar{D}_k \\beta^k - 2 \\alpha \\bar{A}_{i k}\n",
    "        \\bar{A}^k{}_j + \\alpha \\bar{A}_{i j} K + e^{-4 \\phi} \\hat{X}_{i j} \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, replace the partial derivative $\\partial_t \\bar{A}_{i j}$ on the LHS with the variable name `a_rhs` using the `srepl` macro.\n",
    "\n",
    "```\n",
    "% srepl \"\\partial_t \\bar{A}_{i j}\" -> \"\\text{a_rhs}\"\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:21.975040Z",
     "iopub.status.busy": "2023-04-18T16:58:21.974722Z",
     "iopub.status.idle": "2023-04-18T16:58:23.142395Z",
     "shell.execute_reply": "2023-04-18T16:58:23.141856Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "\\[\n",
       "\\begin{align}\n",
       "    % keydef basis [x, y, z]\n",
       "    % ignore \"\\\\%\", \"\\qquad\"\n",
       "\n",
       "    % vardef -kron 'deltaDD'\n",
       "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
       "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
       "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
       "    % assign -diff_type=dD -metric 'gammabarDD'\n",
       "\n",
       "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
       "    % vardef -diff_type=dD 'vetU'\n",
       "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
       "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
       "\n",
       "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
       "    % assign -metric='gammabar' 'aDD'\n",
       "\n",
       "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
       "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
       "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
       "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
       "\n",
       "    % assign -diff_type=dD 'cf'\n",
       "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
       "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
       "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
       "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "\n",
       "    % srepl \"K\" -> \"\\text{trK}\"\n",
       "    % assign -diff_type=dD 'trK'\n",
       "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
       "\n",
       "    % assign -diff_type=dD 'alpha'\n",
       "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
       "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
       "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
       "\n",
       "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
       "    % vardef -diff_type=dD 'lambdaU'\n",
       "\n",
       "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
       "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
       "    % srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
       "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
       "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\%\n",
       "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
       "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
       "\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'RbarDD'\n",
       "    X_{i j} &= -2 \\alpha \\bar{D}_i \\bar{D}_j \\phi + 4 \\alpha \\bar{D}_i \\phi \\bar{D}_j \\phi + 2 \\bar{D}_i \\alpha\n",
       "        \\bar{D}_j \\phi + 2 \\bar{D}_j \\alpha \\bar{D}_i \\phi - \\bar{D}_i \\bar{D}_j \\alpha + \\alpha \\bar{R}_{i j} \\\\\n",
       "    \\hat{X}_{i j} &= X_{i j} - \\frac{1}{3} \\bar{\\gamma}_{i j} \\bar{\\gamma}^{k l} X_{k l} \\\\\n",
       "    % srepl \"\\partial_t \\text{a}\" -> \"\\text{a_rhs}\"\n",
       "    \\partial_t \\bar{A}_{i j} &= \\left[\\beta^k \\partial_k \\bar{A}_{i j} + \\partial_i \\beta^k \\bar{A}_{k j} + \\partial_j \\beta^k\n",
       "        \\bar{A}_{i k} \\right] - \\frac{2}{3} \\bar{A}_{i j} \\bar{D}_k \\beta^k - 2 \\alpha \\bar{A}_{i k}\n",
       "        \\bar{A}^k{}_j + \\alpha \\bar{A}_{i j} K + e^{-4 \\phi} \\hat{X}_{i j} \\\\\n",
       "\\end{align}\n",
       "\\]"
      ],
      "text/plain": [
       "('vetU_cdhatD_dD',\n",
       " 'hDD_dD',\n",
       " 'gammabardet_dD',\n",
       " 'phi_cdbarD',\n",
       " 'phi_cdbarDD',\n",
       " 'aDD_dD',\n",
       " 'alpha_dD',\n",
       " 'cf_rhs',\n",
       " 'hDD_dupD',\n",
       " 'alpha_cdbarU_dD',\n",
       " 'alpha_dDD',\n",
       " 'GammahatUDD',\n",
       " 'h_rhsDD',\n",
       " 'cf',\n",
       " 'gammahatDD',\n",
       " 'lambdaU_dupD',\n",
       " 'cf_dDD',\n",
       " 'epsilonUUU',\n",
       " 'trK_rhs',\n",
       " 'DeltaU',\n",
       " 'aDD',\n",
       " 'gammahatdet_cdbarU',\n",
       " 'cf_dD',\n",
       " 'deltaDD',\n",
       " 'alpha_cdbarU',\n",
       " 'alpha_cdbarD_dD',\n",
       " 'alpha_cdbarUD',\n",
       " 'vetU_cdhatD',\n",
       " 'alpha_cdbarDD',\n",
       " 'gammabarDD_dupD',\n",
       " 'DeltaUDD',\n",
       " 'vetU_cdhatDD',\n",
       " 'gammahatdet',\n",
       " 'aUD',\n",
       " 'a_rhsDD',\n",
       " 'gammahatdet_dD_cdbarU',\n",
       " 'gammahatUU',\n",
       " 'gammabarUU_dD',\n",
       " 'gammahatdet_dD_cdbarD',\n",
       " 'gammabarUU',\n",
       " 'trK_dD',\n",
       " 'phi',\n",
       " 'hDD',\n",
       " 'alpha',\n",
       " 'gammabarDD_dD',\n",
       " 'trK',\n",
       " 'vetU_dD_cdbarD',\n",
       " 'gammabarDD',\n",
       " 'aUU',\n",
       " 'lambdaU',\n",
       " 'gammabardet',\n",
       " 'alpha_cdbarD',\n",
       " 'vetU_dDD',\n",
       " 'vetU',\n",
       " 'gammahatdet_cdbarD',\n",
       " 'vetU_dD_cdbarU',\n",
       " 'Lambdabar_rhsU',\n",
       " 'cf_dupD',\n",
       " 'GammabarUDD',\n",
       " 'trK_dupD',\n",
       " 'vetU_cdbarD',\n",
       " 'gammahatdet_dD',\n",
       " 'vetU_dD',\n",
       " 'phi_cdbarD_dD',\n",
       " 'vetU_cdbarU',\n",
       " 'XDD',\n",
       " 'XhatDD',\n",
       " 'RbarDD')"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "    % ignore \"\\\\%\", \"\\qquad\"\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
    "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'cf'\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    % assign -diff_type=dD 'trK'\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'alpha'\n",
    "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
    "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
    "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
    "\n",
    "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
    "    % vardef -diff_type=dD 'lambdaU'\n",
    "\n",
    "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
    "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
    "    % srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
    "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
    "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\%\n",
    "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
    "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
    "\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'RbarDD'\n",
    "    X_{i j} &= -2 \\alpha \\bar{D}_i \\bar{D}_j \\phi + 4 \\alpha \\bar{D}_i \\phi \\bar{D}_j \\phi + 2 \\bar{D}_i \\alpha\n",
    "        \\bar{D}_j \\phi + 2 \\bar{D}_j \\alpha \\bar{D}_i \\phi - \\bar{D}_i \\bar{D}_j \\alpha + \\alpha \\bar{R}_{i j} \\\\\n",
    "    \\hat{X}_{i j} &= X_{i j} - \\frac{1}{3} \\bar{\\gamma}_{i j} \\bar{\\gamma}^{k l} X_{k l} \\\\\n",
    "    % srepl \"\\partial_t \\text{a}\" -> \"\\text{a_rhs}\"\n",
    "    \\partial_t \\bar{A}_{i j} &= \\left[\\beta^k \\partial_k \\bar{A}_{i j} + \\partial_i \\beta^k \\bar{A}_{k j} + \\partial_j \\beta^k\n",
    "        \\bar{A}_{i k} \\right] - \\frac{2}{3} \\bar{A}_{i j} \\bar{D}_k \\beta^k - 2 \\alpha \\bar{A}_{i k}\n",
    "        \\bar{A}^k{}_j + \\alpha \\bar{A}_{i j} K + e^{-4 \\phi} \\hat{X}_{i j} \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:23.146662Z",
     "iopub.status.busy": "2023-04-18T16:58:23.146336Z",
     "iopub.status.idle": "2023-04-18T16:58:32.271926Z",
     "shell.execute_reply": "2023-04-18T16:58:32.271403Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assertion Failed!\n"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    assert_equal(a_rhsDD, Brhs.a_rhsDD)\n",
    "except AssertionError:\n",
    "    print('Assertion Failed!')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, enforce upwinding on the contracted partial derivative inside of the bracketed term using the `vphantom` command.\n",
    "\n",
    "```\n",
    "\\partial_t \\bar{A}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k ...\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:32.275692Z",
     "iopub.status.busy": "2023-04-18T16:58:32.275388Z",
     "iopub.status.idle": "2023-04-18T16:58:33.449437Z",
     "shell.execute_reply": "2023-04-18T16:58:33.448940Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "\\[\n",
       "\\begin{align}\n",
       "    % keydef basis [x, y, z]\n",
       "    % ignore \"\\\\%\", \"\\qquad\"\n",
       "\n",
       "    % vardef -kron 'deltaDD'\n",
       "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
       "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
       "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
       "    % assign -diff_type=dD -metric 'gammabarDD'\n",
       "\n",
       "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
       "    % vardef -diff_type=dD 'vetU'\n",
       "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
       "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
       "\n",
       "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
       "    % assign -metric='gammabar' 'aDD'\n",
       "\n",
       "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
       "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
       "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
       "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
       "\n",
       "    % assign -diff_type=dD 'cf'\n",
       "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
       "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
       "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
       "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "\n",
       "    % srepl \"K\" -> \"\\text{trK}\"\n",
       "    % assign -diff_type=dD 'trK'\n",
       "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
       "\n",
       "    % assign -diff_type=dD 'alpha'\n",
       "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
       "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
       "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
       "\n",
       "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
       "    % vardef -diff_type=dD 'lambdaU'\n",
       "\n",
       "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
       "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
       "    % srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
       "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
       "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\%\n",
       "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
       "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
       "\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'RbarDD'\n",
       "    X_{i j} &= -2 \\alpha \\bar{D}_i \\bar{D}_j \\phi + 4 \\alpha \\bar{D}_i \\phi \\bar{D}_j \\phi + 2 \\bar{D}_i \\alpha\n",
       "        \\bar{D}_j \\phi + 2 \\bar{D}_j \\alpha \\bar{D}_i \\phi - \\bar{D}_i \\bar{D}_j \\alpha + \\alpha \\bar{R}_{i j} \\\\\n",
       "    \\hat{X}_{i j} &= X_{i j} - \\frac{1}{3} \\bar{\\gamma}_{i j} \\bar{\\gamma}^{k l} X_{k l} \\\\\n",
       "    % srepl \"\\partial_t \\text{a}\" -> \"\\text{a_rhs}\"\n",
       "    \\partial_t \\bar{A}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{A}_{i j} + \\partial_i \\beta^k \\bar{A}_{k j} + \\partial_j \\beta^k\n",
       "        \\bar{A}_{i k} \\right] - \\frac{2}{3} \\bar{A}_{i j} \\bar{D}_k \\beta^k - 2 \\alpha \\bar{A}_{i k}\n",
       "        \\bar{A}^k{}_j + \\alpha \\bar{A}_{i j} K + e^{-4 \\phi} \\hat{X}_{i j} \\\\\n",
       "\\end{align}\n",
       "\\]"
      ],
      "text/plain": [
       "('vetU_cdhatD_dD',\n",
       " 'hDD_dD',\n",
       " 'gammabardet_dD',\n",
       " 'phi_cdbarD',\n",
       " 'phi_cdbarDD',\n",
       " 'alpha_dD',\n",
       " 'cf_rhs',\n",
       " 'hDD_dupD',\n",
       " 'alpha_cdbarU_dD',\n",
       " 'alpha_dDD',\n",
       " 'GammahatUDD',\n",
       " 'h_rhsDD',\n",
       " 'cf',\n",
       " 'gammahatDD',\n",
       " 'lambdaU_dupD',\n",
       " 'cf_dDD',\n",
       " 'epsilonUUU',\n",
       " 'trK_rhs',\n",
       " 'DeltaU',\n",
       " 'aDD',\n",
       " 'gammahatdet_cdbarU',\n",
       " 'cf_dD',\n",
       " 'deltaDD',\n",
       " 'alpha_cdbarU',\n",
       " 'alpha_cdbarD_dD',\n",
       " 'alpha_cdbarUD',\n",
       " 'vetU_cdhatD',\n",
       " 'alpha_cdbarDD',\n",
       " 'gammabarDD_dupD',\n",
       " 'DeltaUDD',\n",
       " 'vetU_cdhatDD',\n",
       " 'gammahatdet',\n",
       " 'aUD',\n",
       " 'a_rhsDD',\n",
       " 'gammahatdet_dD_cdbarU',\n",
       " 'gammahatUU',\n",
       " 'gammabarUU_dD',\n",
       " 'gammahatdet_dD_cdbarD',\n",
       " 'aDD_dupD',\n",
       " 'gammabarUU',\n",
       " 'trK_dD',\n",
       " 'phi',\n",
       " 'hDD',\n",
       " 'alpha',\n",
       " 'gammabarDD_dD',\n",
       " 'trK',\n",
       " 'vetU_dD_cdbarD',\n",
       " 'gammabarDD',\n",
       " 'aUU',\n",
       " 'lambdaU',\n",
       " 'gammabardet',\n",
       " 'alpha_cdbarD',\n",
       " 'vetU_dDD',\n",
       " 'vetU',\n",
       " 'gammahatdet_cdbarD',\n",
       " 'vetU_dD_cdbarU',\n",
       " 'Lambdabar_rhsU',\n",
       " 'cf_dupD',\n",
       " 'GammabarUDD',\n",
       " 'trK_dupD',\n",
       " 'vetU_cdbarD',\n",
       " 'gammahatdet_dD',\n",
       " 'vetU_dD',\n",
       " 'phi_cdbarD_dD',\n",
       " 'vetU_cdbarU',\n",
       " 'XDD',\n",
       " 'XhatDD',\n",
       " 'RbarDD')"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "    % ignore \"\\\\%\", \"\\qquad\"\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
    "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'cf'\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    % assign -diff_type=dD 'trK'\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'alpha'\n",
    "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
    "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
    "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
    "\n",
    "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
    "    % vardef -diff_type=dD 'lambdaU'\n",
    "\n",
    "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
    "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
    "    % srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
    "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
    "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\%\n",
    "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
    "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
    "\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'RbarDD'\n",
    "    X_{i j} &= -2 \\alpha \\bar{D}_i \\bar{D}_j \\phi + 4 \\alpha \\bar{D}_i \\phi \\bar{D}_j \\phi + 2 \\bar{D}_i \\alpha\n",
    "        \\bar{D}_j \\phi + 2 \\bar{D}_j \\alpha \\bar{D}_i \\phi - \\bar{D}_i \\bar{D}_j \\alpha + \\alpha \\bar{R}_{i j} \\\\\n",
    "    \\hat{X}_{i j} &= X_{i j} - \\frac{1}{3} \\bar{\\gamma}_{i j} \\bar{\\gamma}^{k l} X_{k l} \\\\\n",
    "    % srepl \"\\partial_t \\text{a}\" -> \"\\text{a_rhs}\"\n",
    "    \\partial_t \\bar{A}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{A}_{i j} + \\partial_i \\beta^k \\bar{A}_{k j} + \\partial_j \\beta^k\n",
    "        \\bar{A}_{i k} \\right] - \\frac{2}{3} \\bar{A}_{i j} \\bar{D}_k \\beta^k - 2 \\alpha \\bar{A}_{i k}\n",
    "        \\bar{A}^k{}_j + \\alpha \\bar{A}_{i j} K + e^{-4 \\phi} \\hat{X}_{i j} \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:33.452500Z",
     "iopub.status.busy": "2023-04-18T16:58:33.452389Z",
     "iopub.status.idle": "2023-04-18T16:58:42.667171Z",
     "shell.execute_reply": "2023-04-18T16:58:42.666664Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assertion Passed!\n"
     ]
    }
   ],
   "source": [
    "assert_equal(a_rhsDD, Brhs.a_rhsDD)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='step_6'></a>\n",
    "\n",
    "## Step 6: Gauge Evolution Equation(s) [ [^](#top) ]\n",
    "\n",
    "\\begin{align}\n",
    "    \\partial_t \\alpha &= \\left[\\beta^k \\partial_k \\alpha \\right] - 2 \\alpha K \\\\\n",
    "    \\partial_t \\beta^i &= \\left[\\beta^k \\bar{D}_k \\beta^i \\right] + B^i \\\\\n",
    "    \\partial_t B^i &= \\left[\\beta^k \\bar{D}_k B^i \\right] + \\frac{3}{4} \\left(\\partial_t \\bar{\\Lambda}^i - \\left[\\beta^k \\bar{D}_k \\bar{\\Lambda}^i \\right] \\right) - \\eta B^i\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:42.671002Z",
     "iopub.status.busy": "2023-04-18T16:58:42.670673Z",
     "iopub.status.idle": "2023-04-18T16:58:43.874148Z",
     "shell.execute_reply": "2023-04-18T16:58:43.873638Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "\\[\n",
       "\\begin{align}\n",
       "    % keydef basis [x, y, z]\n",
       "    % ignore \"\\\\%\", \"\\qquad\"\n",
       "\n",
       "    % vardef -kron 'deltaDD'\n",
       "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
       "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
       "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
       "    % assign -diff_type=dD -metric 'gammabarDD'\n",
       "\n",
       "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
       "    % vardef -diff_type=dD 'vetU'\n",
       "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
       "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
       "\n",
       "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
       "    % assign -metric='gammabar' 'aDD'\n",
       "\n",
       "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
       "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
       "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
       "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
       "\n",
       "    % assign -diff_type=dD 'cf'\n",
       "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
       "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
       "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
       "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "\n",
       "    % srepl \"K\" -> \"\\text{trK}\"\n",
       "    % assign -diff_type=dD 'trK'\n",
       "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
       "\n",
       "    % assign -diff_type=dD 'alpha'\n",
       "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
       "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
       "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
       "\n",
       "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
       "    % vardef -diff_type=dD 'lambdaU'\n",
       "\n",
       "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
       "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
       "    % srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
       "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
       "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\%\n",
       "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
       "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
       "\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'RbarDD'\n",
       "    X_{i j} &= -2 \\alpha \\bar{D}_i \\bar{D}_j \\phi + 4 \\alpha \\bar{D}_i \\phi \\bar{D}_j \\phi + 2 \\bar{D}_i \\alpha\n",
       "        \\bar{D}_j \\phi + 2 \\bar{D}_j \\alpha \\bar{D}_i \\phi - \\bar{D}_i \\bar{D}_j \\alpha + \\alpha \\bar{R}_{i j} \\\\\n",
       "    \\hat{X}_{i j} &= X_{i j} - \\frac{1}{3} \\bar{\\gamma}_{i j} \\bar{\\gamma}^{k l} X_{k l} \\\\\n",
       "    % srepl \"\\partial_t \\text{a}\" -> \"\\text{a_rhs}\"\n",
       "    \\partial_t \\bar{A}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{A}_{i j} + \\partial_i \\beta^k \\bar{A}_{k j} + \\partial_j \\beta^k\n",
       "        \\bar{A}_{i k} \\right] - \\frac{2}{3} \\bar{A}_{i j} \\bar{D}_k \\beta^k - 2 \\alpha \\bar{A}_{i k}\n",
       "        \\bar{A}^k{}_j + \\alpha \\bar{A}_{i j} K + e^{-4 \\phi} \\hat{X}_{i j} \\\\\n",
       "\n",
       "    % srepl \"\\partial_t \\alpha\" -> \"\\text{alpha_rhs}\"\n",
       "    \\partial_t \\alpha &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\alpha \\right] - 2 \\alpha K \\\\\n",
       "\n",
       "    % srepl \"B\" -> \"\\text{bet}\"\n",
       "    % vardef -diff_type=dD 'betU'\n",
       "    % srepl \"\\partial_t \\text{vet}\" -> \"\\text{vet_rhs}\"\n",
       "    \\partial_t \\beta^i &= \\left[\\beta^j \\vphantom{dupD} \\bar{D}_j \\beta^i \\right] + B^i \\\\\n",
       "\n",
       "    % vardef -const 'eta'\n",
       "    % srepl \"\\partial_t \\text{bet}\" -> \"\\text{bet_rhs}\"\n",
       "    \\partial_t B^i &= \\left[\\beta^j \\vphantom{dupD} \\bar{D}_j B^i \\right] + \\frac{3}{4} \\left(\\partial_t \\bar{\\Lambda}^i - \\left[\\beta^j \\vphantom{dupD} \\bar{D}_j \\bar{\\Lambda}^i \\right] \\right) - \\eta B^i \\\\\n",
       "\\end{align}\n",
       "\\]"
      ],
      "text/plain": [
       "('phi_cdbarDD',\n",
       " 'alpha_dD',\n",
       " 'lambdaU_dupD',\n",
       " 'vetU_dupD',\n",
       " 'cf_dD',\n",
       " 'alpha_cdbarDD',\n",
       " 'alpha_cdbarU',\n",
       " 'vetU_cdhatDD',\n",
       " 'gammahatdet_dD_cdbarU',\n",
       " 'betU',\n",
       " 'gammabarUU_dD',\n",
       " 'alpha_rhs',\n",
       " 'alpha',\n",
       " 'gammabarDD_dD',\n",
       " 'gammabardet',\n",
       " 'GammabarUDD',\n",
       " 'trK_dupD',\n",
       " 'RbarDD',\n",
       " 'phi_cdbarD',\n",
       " 'hDD_dupD',\n",
       " 'alpha_dDD',\n",
       " 'GammahatUDD',\n",
       " 'h_rhsDD',\n",
       " 'gammahatDD',\n",
       " 'cf_dDD',\n",
       " 'DeltaU',\n",
       " 'aDD',\n",
       " 'vetU_cdhatD',\n",
       " 'gammahatdet',\n",
       " 'gammahatdet_dD_cdbarD',\n",
       " 'betU_cdbarD',\n",
       " 'aDD_dupD',\n",
       " 'vetU_dD_cdbarD',\n",
       " 'alpha_cdbarD',\n",
       " 'vetU_dDD',\n",
       " 'vetU',\n",
       " 'gammahatdet_cdbarD',\n",
       " 'Lambdabar_rhsU',\n",
       " 'vetU_dD',\n",
       " 'phi_cdbarD_dD',\n",
       " 'XhatDD',\n",
       " 'eta',\n",
       " 'gammabardet_dD',\n",
       " 'cf_rhs',\n",
       " 'alpha_cdbarU_dD',\n",
       " 'cf',\n",
       " 'epsilonUUU',\n",
       " 'deltaDD',\n",
       " 'a_rhsDD',\n",
       " 'gammahatUU',\n",
       " 'phi',\n",
       " 'hDD',\n",
       " 'bet_rhsU',\n",
       " 'vetU_dD_cdbarU',\n",
       " 'XDD',\n",
       " 'vetU_cdbarU',\n",
       " 'vetU_cdhatD_dD',\n",
       " 'hDD_dD',\n",
       " 'alpha_dupD',\n",
       " 'trK_rhs',\n",
       " 'gammahatdet_cdbarU',\n",
       " 'alpha_cdbarD_dD',\n",
       " 'alpha_cdbarUD',\n",
       " 'gammabarDD_dupD',\n",
       " 'DeltaUDD',\n",
       " 'aUD',\n",
       " 'betU_dupD',\n",
       " 'gammabarUU',\n",
       " 'trK_dD',\n",
       " 'vet_rhsU',\n",
       " 'lambdaU_cdbarD',\n",
       " 'trK',\n",
       " 'gammabarDD',\n",
       " 'aUU',\n",
       " 'lambdaU',\n",
       " 'cf_dupD',\n",
       " 'vetU_cdbarD',\n",
       " 'gammahatdet_dD')"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "    % ignore \"\\\\%\", \"\\qquad\"\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    %% replace '\\bar{D}_k \\beta^k' with contraction identity\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % assign -metric='gammabar' 'aDD'\n",
    "\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "    \\partial_t \\bar{\\gamma}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\gamma}_{i j} + \\partial_i \\beta^k\n",
    "        \\bar{\\gamma}_{k j} + \\partial_j \\beta^k \\bar{\\gamma}_{i k} \\right] + \\frac{2}{3} \\bar{\\gamma}_{i j}\n",
    "        \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right) - 2 \\alpha \\bar{A}_{i j} \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'cf'\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{-2\\phi}\n",
    "    % srepl \"e^{-4 \\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    % assign -diff_type=dD 'trK'\n",
    "    \\partial_t \\phi &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\phi \\right] + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\n",
    "    % assign -diff_type=dD 'alpha'\n",
    "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
    "    \\partial_t K &= \\left[\\beta^k \\vphantom{dupD} \\partial_k K \\right] + \\frac{1}{3} \\alpha K^2 + \\alpha \\bar{A}_{i j}\n",
    "        \\bar{A}^{i j} - e^{-4 \\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi \\right) \\\\\n",
    "\n",
    "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
    "    % vardef -diff_type=dD 'lambdaU'\n",
    "\n",
    "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
    "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
    "    % srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
    "    \\partial_t \\bar{\\Lambda}^i &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{\\Lambda}^i - \\partial_k \\beta^i \\bar{\\Lambda}^k \\right] +\n",
    "        \\bar{\\gamma}^{j k} \\hat{D}_j \\hat{D}_k \\beta^i + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\%\n",
    "        &\\qquad - 2 \\bar{A}^{i j} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi \\right) + 2 \\alpha\n",
    "        \\bar{A}^{j k} \\Delta^i_{j k} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{i j} \\partial_j K \\\\\n",
    "\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'RbarDD'\n",
    "    X_{i j} &= -2 \\alpha \\bar{D}_i \\bar{D}_j \\phi + 4 \\alpha \\bar{D}_i \\phi \\bar{D}_j \\phi + 2 \\bar{D}_i \\alpha\n",
    "        \\bar{D}_j \\phi + 2 \\bar{D}_j \\alpha \\bar{D}_i \\phi - \\bar{D}_i \\bar{D}_j \\alpha + \\alpha \\bar{R}_{i j} \\\\\n",
    "    \\hat{X}_{i j} &= X_{i j} - \\frac{1}{3} \\bar{\\gamma}_{i j} \\bar{\\gamma}^{k l} X_{k l} \\\\\n",
    "    % srepl \"\\partial_t \\text{a}\" -> \"\\text{a_rhs}\"\n",
    "    \\partial_t \\bar{A}_{i j} &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\bar{A}_{i j} + \\partial_i \\beta^k \\bar{A}_{k j} + \\partial_j \\beta^k\n",
    "        \\bar{A}_{i k} \\right] - \\frac{2}{3} \\bar{A}_{i j} \\bar{D}_k \\beta^k - 2 \\alpha \\bar{A}_{i k}\n",
    "        \\bar{A}^k{}_j + \\alpha \\bar{A}_{i j} K + e^{-4 \\phi} \\hat{X}_{i j} \\\\\n",
    "\n",
    "    % srepl \"\\partial_t \\alpha\" -> \"\\text{alpha_rhs}\"\n",
    "    \\partial_t \\alpha &= \\left[\\beta^k \\vphantom{dupD} \\partial_k \\alpha \\right] - 2 \\alpha K \\\\\n",
    "\n",
    "    % srepl \"B\" -> \"\\text{bet}\"\n",
    "    % vardef -diff_type=dD 'betU'\n",
    "    % srepl \"\\partial_t \\text{vet}\" -> \"\\text{vet_rhs}\"\n",
    "    \\partial_t \\beta^i &= \\left[\\beta^j \\vphantom{dupD} \\bar{D}_j \\beta^i \\right] + B^i \\\\\n",
    "\n",
    "    % vardef -const 'eta'\n",
    "    % srepl \"\\partial_t \\text{bet}\" -> \"\\text{bet_rhs}\"\n",
    "    \\partial_t B^i &= \\left[\\beta^j \\vphantom{dupD} \\bar{D}_j B^i \\right] + \\frac{3}{4} \\left(\\partial_t \\bar{\\Lambda}^i - \\left[\\beta^j \\vphantom{dupD} \\bar{D}_j \\bar{\\Lambda}^i \\right] \\right) - \\eta B^i \\\\\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:43.877454Z",
     "iopub.status.busy": "2023-04-18T16:58:43.877337Z",
     "iopub.status.idle": "2023-04-18T16:58:43.884945Z",
     "shell.execute_reply": "2023-04-18T16:58:43.884507Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assertion Passed!\n"
     ]
    }
   ],
   "source": [
    "assert_equal(alpha_rhs, gaugerhs.alpha_rhs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:43.889651Z",
     "iopub.status.busy": "2023-04-18T16:58:43.889342Z",
     "iopub.status.idle": "2023-04-18T16:58:44.361311Z",
     "shell.execute_reply": "2023-04-18T16:58:44.360801Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assertion Passed!\n"
     ]
    }
   ],
   "source": [
    "assert_equal(vet_rhsU, gaugerhs.vet_rhsU)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:44.364569Z",
     "iopub.status.busy": "2023-04-18T16:58:44.364359Z",
     "iopub.status.idle": "2023-04-18T16:58:47.685765Z",
     "shell.execute_reply": "2023-04-18T16:58:47.685252Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assertion Passed!\n"
     ]
    }
   ],
   "source": [
    "assert_equal(bet_rhsU, gaugerhs.bet_rhsU)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='step_7'></a>\n",
    "\n",
    "## Step 7: Constraint Equation(s) [ [^](#top) ]\n",
    "\n",
    "\\begin{align}\n",
    "    \\mathcal{H} &= \\frac{2}{3} K^2 - \\bar{A}_{ij} \\bar{A}^{ij} + e^{-4\\phi} \\left(\\bar{R} - 8 \\bar{D}^i \\phi \\bar{D}_i \\phi - 8 \\bar{D}^2 \\phi \\right) \\\\\n",
    "    \\mathcal{M}^i &= e^{-4\\phi} \\left(\\hat{D}_j \\bar{A}^{ij} + 6 \\bar{A}^{ij}\\partial_j \\phi - \\frac{2}{3} \\bar{\\gamma}^{ij} \\partial_j K + \\bar{A}^{jk} \\Delta^i_{jk} + \\bar{A}^{ik} \\Delta^j_{jk} \\right)\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:47.689814Z",
     "iopub.status.busy": "2023-04-18T16:58:47.689483Z",
     "iopub.status.idle": "2023-04-18T16:58:49.258351Z",
     "shell.execute_reply": "2023-04-18T16:58:49.257859Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "\\[\n",
       "\\begin{align}\n",
       "    % keydef basis [x, y, z]\n",
       "    % ignore \"\\\\%\", \"\\qquad\"\n",
       "\n",
       "    % vardef -kron 'deltaDD'\n",
       "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
       "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
       "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
       "    % assign -diff_type=dD -metric 'gammabarDD'\n",
       "\n",
       "    % vardef -diff_type=dD 'vetU'\n",
       "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
       "    %% upwind pattern inside Lie derivative expansion\n",
       "    % srepl -persist \"\\text{vet}^<1> \\partial_<1>\" -> \"\\text{vet}^<1> \\vphantom{dupD} \\partial_<1>\"\n",
       "    %% substitute tensor identity (see appropriate BSSN notebook)\n",
       "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
       "\n",
       "    % vardef -diff_type=dD 'alpha'\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
       "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
       "    % parse \\bar{A}^i_j = \\bar{\\gamma}^{ik} \\bar{A}_{kj}\n",
       "    % assign -diff_type=dD 'aUD'\n",
       "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
       "\n",
       "    \\partial_t \\bar{\\gamma}_{ij} &= \\mathcal{L}_\\beta \\bar{\\gamma}_{ij}\n",
       "        + \\frac{2}{3} \\bar{\\gamma}_{ij} \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right)\n",
       "        - 2 \\alpha \\bar{A}_{ij} \\\\\n",
       "\n",
       "    % vardef -diff_type=dD 'cf', 'trK'\n",
       "    % srepl \"K\" -> \"\\text{trK}\"\n",
       "    %% replace 'phi' with conformal factor cf = W = e^{{-2\\phi}}\n",
       "    % srepl \"e^{-4\\phi}\" -> \"\\text{cf}^2\"\n",
       "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
       "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
       "\n",
       "    \\partial_t \\phi &= \\mathcal{L}_\\beta \\phi\n",
       "            + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
       "\n",
       "    % parse \\bar{A}^{ij} = \\bar{\\gamma}^{jk} \\bar{A}^i_k\n",
       "    % assign -diff_type=dD 'aUU'\n",
       "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
       "    \\partial_t K &= \\mathcal{L}_\\beta K\n",
       "        + \\frac{1}{3} \\alpha K^2\n",
       "        + \\alpha \\bar{A}_{ij} \\bar{A}^{ij}\n",
       "        - e^{-4\\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi\\right) \\\\\n",
       "\n",
       "    % vardef -diff_type=dD 'lambdaU'\n",
       "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
       "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
       "    % parse \\Delta_{ijk}  = \\bar{\\gamma}_{il} \\Delta^l_{jk}\n",
       "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
       "    % srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
       "    \\partial_t \\bar{\\Lambda}^i &= \\mathcal{L}_\\beta \\bar{\\Lambda}^i + \\bar{\\gamma}^{jk} \\hat{D}_j \\hat{D}_k \\beta^i\n",
       "            + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\%\n",
       "            &\\qquad- 2 \\bar{A}^{ij} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi\\right)\n",
       "            + 2 \\alpha \\bar{A}^{jk} \\Delta^i_{jk} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{ij} \\partial_j K \\\\\n",
       "\n",
       "    % vardef -diff_type=dD -symmetry=sym01 'RbarDD'\n",
       "    X_{ij} &= -2 \\alpha \\bar{D}_i \\bar{D}_j \\phi + 4 \\alpha \\bar{D}_i \\phi \\bar{D}_j \\phi\n",
       "        + 2 \\bar{D}_i \\alpha \\bar{D}_j \\phi + 2 \\bar{D}_j \\alpha \\bar{D}_i \\phi\n",
       "        - \\bar{D}_i \\bar{D}_j \\alpha + \\alpha \\bar{R}_{ij} \\\\\n",
       "    \\hat{X}_{ij} &= X_{ij} - \\frac{1}{3} \\bar{\\gamma}_{ij} \\bar{\\gamma}^{kl} X_{kl} \\\\\n",
       "    % srepl \"\\partial_t \\text{a}\" -> \"\\text{a_rhs}\"\n",
       "    \\partial_t \\bar{A}_{ij} &= \\mathcal{L}_\\beta \\bar{A}_{ij}\n",
       "            - \\frac{2}{3} \\bar{A}_{ij} \\bar{D}_k \\beta^k\n",
       "            - 2 \\alpha \\bar{A}_{ik} \\bar{A}^k_j\n",
       "            + \\alpha \\bar{A}_{ij} K\n",
       "            + e^{-4\\phi} \\hat{X}_{ij} \\\\\n",
       "\n",
       "    % srepl \"\\partial_t \\alpha\" -> \"\\text{alpha_rhs}\"\n",
       "    \\partial_t \\alpha &= \\mathcal{L}_\\beta \\alpha - 2 \\alpha K \\\\\n",
       "\n",
       "    % vardef -diff_type=dD 'betU'\n",
       "    % srepl \"B\" -> \"\\text{bet}\"\n",
       "    % srepl \"\\partial_t \\text{vet}\" -> \"\\text{vet_rhs}\"\n",
       "    \\partial_t \\beta^i &= \\left[\\beta^j \\vphantom{dupD} \\bar{D}_j \\beta^i\\right] + B^i \\\\\n",
       "\n",
       "    % vardef -const 'eta'\n",
       "    % srepl \"\\partial_t \\text{bet}\" -> \"\\text{bet_rhs}\"\n",
       "    \\partial_t B^i &= \\left[\\beta^j \\vphantom{dupD} \\bar{D}_j B^i\\right]\n",
       "        + \\frac{3}{4} \\left(\\partial_t \\bar{\\Lambda}^i - \\left[\\beta^j \\vphantom{dupD} \\bar{D}_j \\bar{\\Lambda}^i\\right]\\right)\n",
       "        - \\eta B^i \\\\\n",
       "\n",
       "    % parse \\bar{R} = \\bar{\\gamma}^{ij} \\bar{R}_{ij}\n",
       "    % srepl \"\\bar{D}^2\" -> \"\\bar{D}^i \\bar{D}_i\", \"\\mathcal{<1>}\" -> \"<1>\"\n",
       "    \\mathcal{H} &= \\frac{2}{3} K^2 - \\bar{A}_{ij} \\bar{A}^{ij} + e^{-4\\phi} \\left(\\bar{R} - 8 \\bar{D}^i \\phi\n",
       "        \\bar{D}_i \\phi - 8 \\bar{D}^2 \\phi \\right) \\\\\n",
       "\n",
       "    \\mathcal{M}^i &= e^{-4\\phi} \\left(\\hat{D}_j \\bar{A}^{ij} + 6 \\bar{A}^{ij}\\partial_j \\phi - \\frac{2}{3} \\bar{\\gamma}^{ij}\n",
       "        \\partial_j K + \\bar{A}^{jk} \\Delta^i_{jk} + \\bar{A}^{ik} \\Delta^j_{jk} \\right) \\\\\n",
       "\n",
       "    \\bar{R}_{ij} &= -\\frac{1}{2} \\bar{\\gamma}^{kl} \\hat{D}_k \\hat{D}_l \\bar{\\gamma}_{ij} + \\frac{1}{2} \\left(\\bar{\\gamma}_{ki}\n",
       "        \\hat{D}_j \\bar{\\Lambda}^k + \\bar{\\gamma}_{kj} \\hat{D}_i \\bar{\\Lambda}^k\\right) + \\frac{1}{2} \\Delta^k \\left(\\Delta_{ijk} + \\Delta_{jik}\\right) \\\\%\n",
       "        &\\qquad+ \\bar{\\gamma}^{kl} \\left(\\Delta^m_{ki} \\Delta_{jml} + \\Delta^m_{kj} \\Delta_{iml} + \\Delta^m_{ik} \\Delta_{mjl}\\right)\n",
       "\\end{align}\n",
       "\\]"
      ],
      "text/plain": [
       "('phi_cdbarDU',\n",
       " 'phi_cdbarDD',\n",
       " 'alpha_dD',\n",
       " 'lambdaU_dupD',\n",
       " 'vetU_dupD',\n",
       " 'cf_dD',\n",
       " 'alpha_cdbarDD',\n",
       " 'alpha_cdbarU',\n",
       " 'Rbar',\n",
       " 'vetU_cdhatDD',\n",
       " 'gammahatdet_dD_cdbarU',\n",
       " 'betU',\n",
       " 'gammabarUU_dD',\n",
       " 'alpha_rhs',\n",
       " 'alpha',\n",
       " 'gammabarDD_dD',\n",
       " 'gammabardet',\n",
       " 'hDD_dDD',\n",
       " 'GammabarUDD',\n",
       " 'RbarDD',\n",
       " 'aUU_cdhatD',\n",
       " 'phi_cdbarD',\n",
       " 'aDD_dD',\n",
       " 'lambdaU_ldvet',\n",
       " 'alpha_dDD',\n",
       " 'GammahatUDD',\n",
       " 'h_rhsDD',\n",
       " 'gammahatDD',\n",
       " 'cf_dDD',\n",
       " 'DeltaU',\n",
       " 'aDD',\n",
       " 'vetU_cdhatD',\n",
       " 'gammabarDD_cdhatD_dD',\n",
       " 'gammahatdet',\n",
       " 'alpha_ldvet',\n",
       " 'gammahatdet_dD_cdbarD',\n",
       " 'betU_cdbarD',\n",
       " 'lambdaU_dD',\n",
       " 'gammabarDD_cdhatDD',\n",
       " 'vetU_dD_cdbarD',\n",
       " 'lambdaU_cdhatD',\n",
       " 'alpha_cdbarD',\n",
       " 'vetU_dDD',\n",
       " 'vetU',\n",
       " 'gammahatdet_cdbarD',\n",
       " 'Lambdabar_rhsU',\n",
       " 'vetU_dD',\n",
       " 'phi_cdbarD_dD',\n",
       " 'XhatDD',\n",
       " 'eta',\n",
       " 'gammabardet_dD',\n",
       " 'cf_rhs',\n",
       " 'alpha_cdbarU_dD',\n",
       " 'cf',\n",
       " 'MU',\n",
       " 'aDD_ldvet',\n",
       " 'epsilonUUU',\n",
       " 'deltaDD',\n",
       " 'phi_cdbarU',\n",
       " 'gammabarDD_cdhatD',\n",
       " 'a_rhsDD',\n",
       " 'aUD_dD',\n",
       " 'gammahatUU',\n",
       " 'trK_ldvet',\n",
       " 'phi',\n",
       " 'hDD',\n",
       " 'phi_ldvet',\n",
       " 'bet_rhsU',\n",
       " 'vetU_dD_cdbarU',\n",
       " 'XDD',\n",
       " 'gammabarDD_dDD',\n",
       " 'vetU_cdbarU',\n",
       " 'vetU_cdhatD_dD',\n",
       " 'hDD_dD',\n",
       " 'DeltaDDD',\n",
       " 'trK_rhs',\n",
       " 'gammahatdet_cdbarU',\n",
       " 'alpha_cdbarD_dD',\n",
       " 'alpha_cdbarUD',\n",
       " 'aUU_dD',\n",
       " 'DeltaUDD',\n",
       " 'gammabarDD_ldvet',\n",
       " 'aUD',\n",
       " 'betU_dupD',\n",
       " 'gammabarUU',\n",
       " 'trK_dD',\n",
       " 'vet_rhsU',\n",
       " 'lambdaU_cdbarD',\n",
       " 'trK',\n",
       " 'gammabarDD',\n",
       " 'aUU',\n",
       " 'H',\n",
       " 'lambdaU',\n",
       " 'vetU_cdbarD',\n",
       " 'gammahatdet_dD')"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%parse_latex --reset --ignore-warning\n",
    "\n",
    "\\begin{align}\n",
    "    % keydef basis [x, y, z]\n",
    "    % ignore \"\\\\%\", \"\\qquad\"\n",
    "\n",
    "    % vardef -kron 'deltaDD'\n",
    "    % parse \\hat{\\gamma}_{ij} = \\delta_{ij}\n",
    "    % assign -diff_type=symbolic -metric 'gammahatDD'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'hDD'\n",
    "    % parse \\bar{\\gamma}_{ij} = h_{ij} + \\hat{\\gamma}_{ij}\n",
    "    % assign -diff_type=dD -metric 'gammabarDD'\n",
    "\n",
    "    % vardef -diff_type=dD 'vetU'\n",
    "    % srepl \"\\beta\" -> \"\\text{vet}\"\n",
    "    %% upwind pattern inside Lie derivative expansion\n",
    "    % srepl -persist \"\\text{vet}^<1> \\partial_<1>\" -> \"\\text{vet}^<1> \\vphantom{dupD} \\partial_<1>\"\n",
    "    %% substitute tensor identity (see appropriate BSSN notebook)\n",
    "    % srepl \"\\bar{D}_k \\text{vet}^k\" -> \"(\\partial_k \\text{vet}^k + \\frac{\\partial_k \\text{gammahatdet} \\text{vet}^k}{2 \\text{gammahatdet}})\"\n",
    "\n",
    "    % vardef -diff_type=dD 'alpha'\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'aDD'\n",
    "    % srepl \"\\bar{A}\" -> \"\\text{a}\"\n",
    "    % parse \\bar{A}^i_j = \\bar{\\gamma}^{ik} \\bar{A}_{kj}\n",
    "    % assign -diff_type=dD 'aUD'\n",
    "    % srepl \"\\partial_t \\bar{\\gamma}\" -> \"\\text{h_rhs}\"\n",
    "\n",
    "    \\partial_t \\bar{\\gamma}_{ij} &= \\mathcal{L}_\\beta \\bar{\\gamma}_{ij}\n",
    "        + \\frac{2}{3} \\bar{\\gamma}_{ij} \\left(\\alpha \\bar{A}^k{}_k - \\bar{D}_k \\beta^k\\right)\n",
    "        - 2 \\alpha \\bar{A}_{ij} \\\\\n",
    "\n",
    "    % vardef -diff_type=dD 'cf', 'trK'\n",
    "    % srepl \"K\" -> \"\\text{trK}\"\n",
    "    %% replace 'phi' with conformal factor cf = W = e^{{-2\\phi}}\n",
    "    % srepl \"e^{-4\\phi}\" -> \"\\text{cf}^2\"\n",
    "    % srepl \"\\partial_t \\phi = <1..> \\\\\" -> \"\\text{cf_rhs} = -2 \\text{cf} (<1..>) \\\\\"\n",
    "    % srepl -persist \"\\partial_{<1>} \\phi\" -> \"\\partial_{<1>} \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "    % srepl \"\\partial_<1> \\phi\" -> \"\\partial_<1> \\text{cf} \\frac{-1}{2 \\text{cf}}\"\n",
    "\n",
    "    \\partial_t \\phi &= \\mathcal{L}_\\beta \\phi\n",
    "            + \\frac{1}{6} \\left(\\bar{D}_k \\beta^k - \\alpha K \\right) \\\\\n",
    "\n",
    "    % parse \\bar{A}^{ij} = \\bar{\\gamma}^{jk} \\bar{A}^i_k\n",
    "    % assign -diff_type=dD 'aUU'\n",
    "    % srepl \"\\partial_t \\text{trK}\" -> \"\\text{trK_rhs}\"\n",
    "    \\partial_t K &= \\mathcal{L}_\\beta K\n",
    "        + \\frac{1}{3} \\alpha K^2\n",
    "        + \\alpha \\bar{A}_{ij} \\bar{A}^{ij}\n",
    "        - e^{-4\\phi} \\left(\\bar{D}_i \\bar{D}^i \\alpha + 2 \\bar{D}^i \\alpha \\bar{D}_i \\phi\\right) \\\\\n",
    "\n",
    "    % vardef -diff_type=dD 'lambdaU'\n",
    "    % srepl \"\\bar{\\Lambda}\" -> \"\\text{lambda}\"\n",
    "    % parse \\Delta^k_{ij} = \\bar{\\Gamma}^k_{ij} - \\hat{\\Gamma}^k_{ij}\n",
    "    % parse \\Delta_{ijk}  = \\bar{\\gamma}_{il} \\Delta^l_{jk}\n",
    "    % parse \\Delta^k = \\bar{\\gamma}^{ij} \\Delta^k_{ij}\n",
    "    % srepl \"\\partial_t \\text{lambda}\" -> \"\\text{Lambdabar_rhs}\"\n",
    "    \\partial_t \\bar{\\Lambda}^i &= \\mathcal{L}_\\beta \\bar{\\Lambda}^i + \\bar{\\gamma}^{jk} \\hat{D}_j \\hat{D}_k \\beta^i\n",
    "            + \\frac{2}{3} \\Delta^i \\bar{D}_k \\beta^k + \\frac{1}{3} \\bar{D}^i \\bar{D}_k \\beta^k \\\\%\n",
    "            &\\qquad- 2 \\bar{A}^{ij} \\left(\\partial_j \\alpha - 6 \\alpha \\partial_j \\phi\\right)\n",
    "            + 2 \\alpha \\bar{A}^{jk} \\Delta^i_{jk} - \\frac{4}{3} \\alpha \\bar{\\gamma}^{ij} \\partial_j K \\\\\n",
    "\n",
    "    % vardef -diff_type=dD -symmetry=sym01 'RbarDD'\n",
    "    X_{ij} &= -2 \\alpha \\bar{D}_i \\bar{D}_j \\phi + 4 \\alpha \\bar{D}_i \\phi \\bar{D}_j \\phi\n",
    "        + 2 \\bar{D}_i \\alpha \\bar{D}_j \\phi + 2 \\bar{D}_j \\alpha \\bar{D}_i \\phi\n",
    "        - \\bar{D}_i \\bar{D}_j \\alpha + \\alpha \\bar{R}_{ij} \\\\\n",
    "    \\hat{X}_{ij} &= X_{ij} - \\frac{1}{3} \\bar{\\gamma}_{ij} \\bar{\\gamma}^{kl} X_{kl} \\\\\n",
    "    % srepl \"\\partial_t \\text{a}\" -> \"\\text{a_rhs}\"\n",
    "    \\partial_t \\bar{A}_{ij} &= \\mathcal{L}_\\beta \\bar{A}_{ij}\n",
    "            - \\frac{2}{3} \\bar{A}_{ij} \\bar{D}_k \\beta^k\n",
    "            - 2 \\alpha \\bar{A}_{ik} \\bar{A}^k_j\n",
    "            + \\alpha \\bar{A}_{ij} K\n",
    "            + e^{-4\\phi} \\hat{X}_{ij} \\\\\n",
    "\n",
    "    % srepl \"\\partial_t \\alpha\" -> \"\\text{alpha_rhs}\"\n",
    "    \\partial_t \\alpha &= \\mathcal{L}_\\beta \\alpha - 2 \\alpha K \\\\\n",
    "\n",
    "    % vardef -diff_type=dD 'betU'\n",
    "    % srepl \"B\" -> \"\\text{bet}\"\n",
    "    % srepl \"\\partial_t \\text{vet}\" -> \"\\text{vet_rhs}\"\n",
    "    \\partial_t \\beta^i &= \\left[\\beta^j \\vphantom{dupD} \\bar{D}_j \\beta^i\\right] + B^i \\\\\n",
    "\n",
    "    % vardef -const 'eta'\n",
    "    % srepl \"\\partial_t \\text{bet}\" -> \"\\text{bet_rhs}\"\n",
    "    \\partial_t B^i &= \\left[\\beta^j \\vphantom{dupD} \\bar{D}_j B^i\\right]\n",
    "        + \\frac{3}{4} \\left(\\partial_t \\bar{\\Lambda}^i - \\left[\\beta^j \\vphantom{dupD} \\bar{D}_j \\bar{\\Lambda}^i\\right]\\right)\n",
    "        - \\eta B^i \\\\\n",
    "\n",
    "    % parse \\bar{R} = \\bar{\\gamma}^{ij} \\bar{R}_{ij}\n",
    "    % srepl \"\\bar{D}^2\" -> \"\\bar{D}^i \\bar{D}_i\", \"\\mathcal{<1>}\" -> \"<1>\"\n",
    "    \\mathcal{H} &= \\frac{2}{3} K^2 - \\bar{A}_{ij} \\bar{A}^{ij} + e^{-4\\phi} \\left(\\bar{R} - 8 \\bar{D}^i \\phi\n",
    "        \\bar{D}_i \\phi - 8 \\bar{D}^2 \\phi \\right) \\\\\n",
    "\n",
    "    \\mathcal{M}^i &= e^{-4\\phi} \\left(\\hat{D}_j \\bar{A}^{ij} + 6 \\bar{A}^{ij}\\partial_j \\phi - \\frac{2}{3} \\bar{\\gamma}^{ij}\n",
    "        \\partial_j K + \\bar{A}^{jk} \\Delta^i_{jk} + \\bar{A}^{ik} \\Delta^j_{jk} \\right) \\\\\n",
    "\n",
    "    \\bar{R}_{ij} &= -\\frac{1}{2} \\bar{\\gamma}^{kl} \\hat{D}_k \\hat{D}_l \\bar{\\gamma}_{ij} + \\frac{1}{2} \\left(\\bar{\\gamma}_{ki}\n",
    "        \\hat{D}_j \\bar{\\Lambda}^k + \\bar{\\gamma}_{kj} \\hat{D}_i \\bar{\\Lambda}^k\\right) + \\frac{1}{2} \\Delta^k \\left(\\Delta_{ijk} + \\Delta_{jik}\\right) \\\\%\n",
    "        &\\qquad+ \\bar{\\gamma}^{kl} \\left(\\Delta^m_{ki} \\Delta_{jml} + \\Delta^m_{kj} \\Delta_{iml} + \\Delta^m_{ik} \\Delta_{mjl}\\right)\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:49.262237Z",
     "iopub.status.busy": "2023-04-18T16:58:49.261888Z",
     "iopub.status.idle": "2023-04-18T16:58:50.605376Z",
     "shell.execute_reply": "2023-04-18T16:58:50.604867Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assertion Passed!\n"
     ]
    }
   ],
   "source": [
    "assert_equal(H, bssncon.H)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:50.608998Z",
     "iopub.status.busy": "2023-04-18T16:58:50.608676Z",
     "iopub.status.idle": "2023-04-18T16:58:55.139505Z",
     "shell.execute_reply": "2023-04-18T16:58:55.138993Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assertion Passed!\n"
     ]
    }
   ],
   "source": [
    "assert_equal(MU, bssncon.MU)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:58:55.142569Z",
     "iopub.status.busy": "2023-04-18T16:58:55.142457Z",
     "iopub.status.idle": "2023-04-18T16:59:03.610706Z",
     "shell.execute_reply": "2023-04-18T16:59:03.610116Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Assertion Passed!\n"
     ]
    }
   ],
   "source": [
    "assert_equal(RbarDD, Bq.RbarDD)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='step_8'></a>\n",
    "\n",
    "## Step 8: Output Notebook to PDF [ [^](#top) ]\n",
    "\n",
    "The following code cell converts this Jupyter notebook into a proper, clickable $\\LaTeX$-formatted PDF file. After the cell is successfully run, the generated PDF may be found in the root NRPy+ tutorial directory, with filename\n",
    "[Tutorial-LaTeX_Interface_Example-BSSN_Cartesian.pdf](Tutorial-LaTeX_Interface_Example-BSSN_Cartesian.pdf). (Note that clicking on this link may not work; you may need to open the PDF file through another means.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-18T16:59:03.613867Z",
     "iopub.status.busy": "2023-04-18T16:59:03.613250Z",
     "iopub.status.idle": "2023-04-18T16:59:11.248113Z",
     "shell.execute_reply": "2023-04-18T16:59:11.246849Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Created Tutorial-LaTeX_Interface_Example-BSSN_Cartesian.tex, and compiled\n",
      "    LaTeX file to PDF file Tutorial-LaTeX_Interface_Example-\n",
      "    BSSN_Cartesian.pdf\n"
     ]
    }
   ],
   "source": [
    "import cmdline_helper as cmd    # NRPy+: Multi-platform Python command-line interface\n",
    "cmd.output_Jupyter_notebook_to_LaTeXed_PDF(\"Tutorial-LaTeX_Interface_Example-BSSN_Cartesian\")"
   ]
  }
 ],
 "metadata": {
  "file_extension": ".py",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.1"
  },
  "mimetype": "text/x-python",
  "name": "python",
  "npconvert_exporter": "python",
  "pygments_lexer": "ipython3",
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  },
  "version": 3
 },
 "nbformat": 4,
 "nbformat_minor": 4
}