#!/usr/bin/env python
# coding: utf-8

# <script async src="https://www.googletagmanager.com/gtag/js?id=UA-59152712-8"></script>
# <script>
#   window.dataLayer = window.dataLayer || [];
#   function gtag(){dataLayer.push(arguments);}
#   gtag('js', new Date());
# 
#   gtag('config', 'UA-59152712-8');
# </script>
# 
# # LaTeX Interface Example: BSSN (Cartesian)
# 
# ## Author: Ken Sible
# 
# ## This notebook demonstrates parsing BSSN (Cartesian) and validating against NRPy+.
# [comment]: <> (**Notebook Status:** <font color='red'><b> Not Validated </b></font>)

# ### Covariant Formulation of BSSN
# 
# \begin{align}
#     \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} \\
#     \partial_t \phi &= \left[\beta^k \partial_k \phi \right] + \frac{1}{6} \left(\bar{D}_k \beta^k - \alpha K \right) \\
#     \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) \\
#     \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 \\
#     &\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 \\
#     \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 \\
#     &\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}} \\
#     \partial_t \alpha &= \left[\beta^k \partial_k \alpha \right] - 2 \alpha K \\
#     \partial_t \beta^i &= \left[\beta^k \bar{D}_k \beta^i \right] + B^i \\
#     \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 \\
#     \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) \\
#     \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) \\
#     \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)
# \end{align}

# <a id='top'></a>
# 
# # Table of Contents
# $$\label{toc}$$
# 
# - [Step 1](#step_1): Evolution Equation for $\partial_t \bar{\gamma}_{ij}$
# - [Step 2](#step_2): Evolution Equation for $\partial_t \phi$
# - [Step 3](#step_3): Evolution Equation for $\partial_t K$
# - [Step 4](#step_4): Evolution Equation for $\partial_t \bar{\Lambda}^i$
# - [Step 5](#step_5): Evolution Equation for $\partial_t \bar{A}_{ij}$
# - [Step 6](#step_6): Gauge Evolution Equation(s)
# - [Step 7](#step_7): Constraint Equation(s)
# - [Step 8](#step_8): Output Notebook to PDF

# In[1]:


get_ipython().system('pip install nrpylatex==1.0.8 > /dev/null')
get_ipython().system('pip freeze | grep nrpylatex')
get_ipython().run_line_magic('load_ext', 'nrpylatex.extension')


# In[2]:


from UnitTesting.assert_equal import assert_equal

import NRPy_param_funcs as par, reference_metric as rfm
import BSSN.BSSN_quantities as Bq
import BSSN.BSSN_RHSs as Brhs
import BSSN.BSSN_gauge_RHSs as gaugerhs
import BSSN.BSSN_constraints as bssncon

par.set_parval_from_str('reference_metric::CoordSystem', 'Cartesian')
par.set_parval_from_str('BSSN.BSSN_quantities::LeaveRicciSymbolic', 'True')
rfm.reference_metric()
Brhs.BSSN_RHSs()
gaugerhs.BSSN_gauge_RHSs()
bssncon.BSSN_constraints()
par.set_parval_from_str('BSSN.BSSN_quantities::LeaveRicciSymbolic', 'False')
Bq.RicciBar__gammabarDD_dHatD__DGammaUDD__DGammaU()


# We formatted the notebook in the following pedagogical scheme, shown below, to encourage a *learned* approach to parsing tensorial LaTeX.
# ```
# (1) attempt to parse equation
# (2) if ParseError or TensorError
#         debug error and goto (1)
# (3) change equation and goto (1)
# ```
# [YouTube Tutorial](https://www.youtube.com/watch?v=A9IWYpQe6Fo) (Notebook Walkthrough)

# <a id='step_1'></a>
# 
# ## Step 1: Evolution Equation for $\partial_t \bar{\gamma}_{ij}$ [ [^](#top) ]

# \begin{equation}
#     \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}
# \end{equation}

# In[3]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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}\n')


# First, attempt to parse the equation without any modification, and notice the `ParseError` for indexing an `undefined tensor 'gammabarDD'`.
# 
# `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} $.
# 
# `vardef`: define a variable, including a derivative option and a (anti)symmetry option.<br>
# `assign`: assign a `vardef` option to an already existing variable in the namespace.<br>
# `parse`:&nbsp;&nbsp; parse an equation without rendering that equation in a `.tex` document or a Jupyter Notebook.
# 
# `-metric` can assign the symmetry `sym01` and automatically generate the metric inverse and determinant.
# 
# 1. Define the Kronecker delta `deltaDD` using the `vardef` macro.
# 1. Parse the equation $\hat{\gamma}_{ij} = \delta_{ij}$ using the `parse` macro.
# 1. Assign the `-metric` option to `gammahatDD` using the `assign` macro.
# 
# ```
# % vardef -kron 'deltaDD'
# % parse \hat{\gamma}_{ij} = \delta_{ij}
# % assign -diff_type=symbolic -metric 'gammahatDD'
# ```
# 
# **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.
# 
# 1. Define the deviation `hDD` using the `vardef` macro.
# 1. Parse the equation $\bar{\gamma}_{ij} = h_{ij} + \hat{\gamma}_{ij}$ using the `parse` macro.
# 1. Assign the `-metric` option to `gammabarDD` using the `assign` macro.
# 
# ```
# % vardef -diff_type=dD -symmetry=sym01 'hDD'
# % parse \bar{\gamma}_{ij} = h_{ij} + \hat{\gamma}_{ij}
# % assign -diff_type=dD -metric 'gammabarDD'
# ```

# In[4]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', "\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}\n")


# 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.
# 
# **Remark:** If you require a variable name longer than one Latin or Greek letter, you should surround that variable name in the `\text` command.
# 
# `srepl`: string replacement given the assumption that string `A` and string `B` are equal whenever they are equivalent syntactically
# 
# Therefore, for example, `S_{a b} T^{b c}` and `S_{ab}T^{bc}` are considered equal according to the `srepl` macro.
# 
# ```
# % srepl "\beta" -> "\text{vet}"
# % vardef -diff_type=dD 'vetU'
# ```
# 
# **Remark**: You can check "syntactic equivalence" for the `srepl` macro using the code snippet provided below.
# 
# ```
# lexer = Lexer()
# lexer.initialize(A)
# syntax_A = [(lexer.lexeme, token) for token in lexer.tokenize()]
# lexer.initialize(B)
# syntax_B = [(lexer.lexeme, token) for token in lexer.tokenize()]
# assert syntax_A == syntax_B
# ```
# 
# `-persist` will apply the replacement rule `"..." -> "..."` to every subsequent input (internal or external) of the `parse` function.
# 
# **Remark:** The `srepl` macro will *not* replace any text inside of a future `srepl` or `ignore` macro.

# In[5]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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}\n')


# 1. Replace every instance of `AbarDD` with `aDD` using the `srepl` macro.
# 1. Define the variable `aDD` (with symmetry `sym01`) using the `vardef` macro.
# 1. Generate the variable `aUD` by assigning the metric `gammabar` to `aDD`.
# 
# \begin{equation}
#     \bar{A}^i{}_j = \bar{\gamma}^{ik} \bar{A}_{kj}
# \end{equation}
# 
# ```
# % srepl "\bar{A}" -> "\text{a}"
# % vardef -diff_type=dD -symmetry=sym01 'aDD'
# % assign -metric='gammabar' 'aDD'
# ```
# 
# **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.

# In[6]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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}\n')


# Next, replace the partial derivative $\partial_t \bar{\gamma}$ on the LHS with the variable name `h_rhs` using the `srepl` macro.
# 
# ```
# % srepl "\partial_t \bar{\gamma}" -> "\text{h_rhs}"
# ```
# 
# **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.

# In[7]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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')


# `keydef`: define a keyword, i.e. define a `basis` or coordinate system, or define an `index` range (for looping or summation).
# 
# ```
# % keydef basis [x, y, z]
# ```

# In[8]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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')


# In[9]:


try:
    assert_equal(h_rhsDD, Brhs.h_rhsDD)
except AssertionError:
    print('Assertion Failed!')


# 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.
# 
# ```
# \partial_t \bar{\gamma}_{i j} &= \left[\beta^k \vphantom{dupD} \partial_k ...
# ```
# 
# **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.
# 
# ```
# % srepl -persist "\text{vet}^<1> \partial_<1>" -> "\text{vet}^<1> \vphantom{dupD} \partial_<1>"
# ```
# 
# To simplify the calculation of $\bar{D}_k \beta^k$, substitute a useful tensor identity for that contraction and apply the `-persist` option.
# $$ \bar{D}_k \beta^k = \partial_k \beta^k + \beta^k \frac{\partial_k \hat{\gamma}}{2 \hat{\gamma}} $$
# ```
# %% replace '\bar{D}_k \beta^k' with contraction identity
# % srepl "\bar{D}_k \text{vet}^k" -> "(\partial_k \text{vet}^k + \frac{\partial_k \text{gammahatdet} \text{vet}^k}{2 \text{gammahatdet}})"
# ```

# In[10]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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')


# In[11]:


assert_equal(h_rhsDD, Brhs.h_rhsDD)


# <a id='step_2'></a>
# 
# ## Step 2: Evolution Equation for $\partial_t \phi$ [ [^](#top) ]
# 
# \begin{equation}
#     \partial_t \phi = \left[\beta^k \partial_k \phi \right] + \frac{1}{6} \left(\bar{D}_k \beta^k - \alpha K \right)
# \end{equation}

# In[12]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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}\n')


# First, replace every instance of `phi` with the conformal factor `cf = W = e^{-2\phi}`, including every derivative (partial or covariant) of `phi`.
# 
# \begin{equation}
#     \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
# \end{equation}
# 
# ```
# %% replace 'phi' with conformal factor cf = W = e^{-2\phi}
# % srepl "e^{-4\phi}" -> "\text{cf}^2"
# % srepl "\partial_t \phi = <1..> \\" -> "\text{cf_rhs} = -2 \text{cf} (<1..>) \\"
# % srepl -persist "\partial_{<1>} \phi" -> "\partial_{<1>} \text{cf} \frac{-1}{2 \text{cf}}"
# % srepl "\partial_<1> \phi" -> "\partial_<1> \text{cf} \frac{-1}{2 \text{cf}}"
# ```
# 
# **Remark**: We assigned the `-persist` option to the third `srepl` macro to replace the partial derivative inside of each covariant derivative of `phi`.

# In[13]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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')


# In[14]:


try:
    assert_equal(cf_rhs, Brhs.cf_rhs)
except AssertionError:
    print('Assertion Failed!')


# Next, enforce upwinding on the contracted partial derivative inside of the bracketed term using the `vphantom` command.
# 
# ```
# \partial_t \phi &= \left[\beta^k \vphantom{dupD} \partial_k ...
# ```
# 
# Finally, replace every instance of `K` with `trK` using the `srepl` macro.
# 
# ```
# % srepl "K" -> "\text{trK}"
# ```

# In[15]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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')


# In[16]:


assert_equal(cf_rhs, Brhs.cf_rhs)


# <a id='step_3'></a>
# 
# ## Step 3: Evolution Equation for $\partial_t K$ [ [^](#top) ]
# 
# \begin{equation}
#     \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)
# \end{equation}

# In[17]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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}\n')


# First, replace the partial derivative $\partial_t K$ on the LHS with the variable name `trK_rhs` using the `srepl` macro.
# 
# ```
# % srepl "\partial_t \text{trK}" -> "\text{trK_rhs}"
# ```

# In[18]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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')


# In[19]:


try:
    assert_equal(trK_rhs, Brhs.trK_rhs)
except AssertionError:
    print('Assertion Failed!')


# Next, enforce upwinding on the contracted partial derivative inside of the bracketed term using the `vphantom` command.
# 
# ```
# \partial_t K &= \left[\beta^k \vphantom{dupD} \partial_k K ...
# ```
# 
# Finally, assign the property `-diff_type=dD` to `cf`, `trK`, and `alpha` using the `assign` macro.

# In[20]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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')


# In[21]:


assert_equal(trK_rhs, Brhs.trK_rhs)


# <a id='step_4'></a>
# 
# ## Step 4: Evolution Equation for $\partial_t \bar{\Lambda}^i$ [ [^](#top) ]
# 
# \begin{align}
#     \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 \\
#     &\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
# \end{align}

# In[22]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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}\n')


# First, replace every instance of `LambdabarU` with `lambdaU` using the `srepl` macro, and then define the variable `lambdaU` using the `vardef` macro.
# 
# ```
# % srepl "\bar{\Lambda}" -> "\text{lambda}"
# % vardef -diff_type=dD 'lambdaU'
# ```

# In[23]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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}\n')


# 1. Parse $ \Delta^k_{ij} = \bar{\Gamma}^k_{ij} - \hat{\Gamma}^k_{ij} $ using the `parse` macro to define `DeltaUDD`.
# 1. Parse $ \Delta^k = \bar{\gamma}^{ij} \Delta^k_{ij} $ (contraction of `DeltaUDD`) using the `parse` macro to define `DeltaU`.
# 
# ```
# % parse \Delta^k_{ij} = \bar{\Gamma}^k_{ij} - \hat{\Gamma}^k_{ij}
# % parse \Delta^k = \bar{\gamma}^{ij} \Delta^k_{ij}
# ```

# In[24]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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}\n')


# Next, replace the partial derivative $\partial_t \bar{\Lambda}$ on the LHS with the variable name `Lambdabar_rhs` using the `srepl` macro.
# 
# ```
# % srepl "\partial_t \text{lambda}" -> "\text{Lambdabar_rhs}"
# ```

# In[25]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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}\n')


# Next, internally remove the formatting command `\qquad` using the `ignore` macro.
# 
# `ignore`: remove a LaTeX command or substring; equivalent to `srepl "..." -> ""` (empty replacement).
# 
# ```
# % ignore "\qquad"
# ```

# In[26]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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')


# 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.
# 
# ```
# % ignore "\\%"
# ```
# 
# **Remark**: You cannot split an equation across a line break, and hence we removed that line break internally using the `ignore` macro.

# In[27]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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')


# In[28]:


try:
    assert_equal(Lambdabar_rhsU, Brhs.Lambdabar_rhsU)
except AssertionError:
    print('Assertion Failed!')


# Finally, enforce upwinding on the contracted partial derivative inside of the bracketed term using the `vphantom` command.
# 
# ```
# \partial_t \bar{\Lambda}^i &= \left[\beta^k \vphantom{dupD} \partial_k ...
# ```

# In[29]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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')


# In[30]:


assert_equal(Lambdabar_rhsU, Brhs.Lambdabar_rhsU)


# <a id='step_5'></a>
# 
# ## Step 5: Evolution Equation for $\partial_t \bar{A}_{ij}$ [ [^](#top) ]
# 
# \begin{align}
#     \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 \\
#     &\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}}
# \end{align}
# 
# **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.
# 
# \begin{gather}
#     \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) \\
#     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} \\
#     \hat{X}_{i j} = X_{i j} - \frac{1}{3} \bar{\gamma}_{i j} \bar{\gamma}^{k l} X_{k l} \\
#     \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}
# \end{gather}

# In[31]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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}\n')


# First, define the variable `RbarDD` (with symmetry `sym01`) using the `vardef` macro.
# 
# ```
# % vardef -diff_type=dD -symmetry=sym01 'RbarDD'
# ```

# In[32]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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}\n')


# Next, replace the partial derivative $\partial_t \bar{A}_{i j}$ on the LHS with the variable name `a_rhs` using the `srepl` macro.
# 
# ```
# % srepl "\partial_t \bar{A}_{i j}" -> "\text{a_rhs}"
# ```

# In[33]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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')


# In[34]:


try:
    assert_equal(a_rhsDD, Brhs.a_rhsDD)
except AssertionError:
    print('Assertion Failed!')


# Finally, enforce upwinding on the contracted partial derivative inside of the bracketed term using the `vphantom` command.
# 
# ```
# \partial_t \bar{A}_{i j} &= \left[\beta^k \vphantom{dupD} \partial_k ...
# ```

# In[35]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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')


# In[36]:


assert_equal(a_rhsDD, Brhs.a_rhsDD)


# <a id='step_6'></a>
# 
# ## Step 6: Gauge Evolution Equation(s) [ [^](#top) ]
# 
# \begin{align}
#     \partial_t \alpha &= \left[\beta^k \partial_k \alpha \right] - 2 \alpha K \\
#     \partial_t \beta^i &= \left[\beta^k \bar{D}_k \beta^i \right] + B^i \\
#     \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
# \end{align}

# In[37]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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')


# In[38]:


assert_equal(alpha_rhs, gaugerhs.alpha_rhs)


# In[39]:


assert_equal(vet_rhsU, gaugerhs.vet_rhsU)


# In[40]:


assert_equal(bet_rhsU, gaugerhs.bet_rhsU)


# <a id='step_7'></a>
# 
# ## Step 7: Constraint Equation(s) [ [^](#top) ]
# 
# \begin{align}
#     \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) \\
#     \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)
# \end{align}

# In[41]:


get_ipython().run_cell_magic('parse_latex', '--reset --ignore-warning', '\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')


# In[42]:


assert_equal(H, bssncon.H)


# In[43]:


assert_equal(MU, bssncon.MU)


# In[44]:


assert_equal(RbarDD, Bq.RbarDD)


# <a id='step_8'></a>
# 
# ## Step 8: Output Notebook to PDF [ [^](#top) ]
# 
# 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
# [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.)

# In[45]:


import cmdline_helper as cmd    # NRPy+: Multi-platform Python command-line interface
cmd.output_Jupyter_notebook_to_LaTeXed_PDF("Tutorial-LaTeX_Interface_Example-BSSN_Cartesian")