{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "# [Brill-Lindquist](https://journals.aps.org/pr/abstract/10.1103/PhysRev.131.471) Initial data\n", "## Author: Zach Etienne\n", "### Formatting improvements courtesy Brandon Clark\n", "\n", "## This notebook presents Brill-Lindquist initial data for merging black holes in Cartesian coordinates, using Python/NRPy+ modules. It establishes the conformal factor, $\\psi$, defines ADM variables in Cartesian coordinates, and verifies the setup against NRPy+'s BrillLindquist module. \n", "\n", "**Notebook Status:** Validated \n", "\n", "**Validation Notes:** This module has been validated to exhibit convergence to zero of the Hamiltonian constraint violation at the expected order to the exact solution (see plot at bottom of [the exact initial data validation start-to-finish tutorial notebook](Tutorial-Start_to_Finish-BSSNCurvilinear-Exact_Initial_Data.ipynb); momentum constraint is zero), and all quantities have been validated against the [original SENR code](https://bitbucket.org/zach_etienne/nrpy).\n", "\n", "### NRPy+ Source Code for this module: [BrillLindquist.py](../edit/BSSN/BrillLindquist.py)\n", "\n", "## Introduction:\n", "This module sets up initial data for a merging black hole system in Cartesian coordinates." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Table of Contents\n", "$$\\label{toc}$$ \n", "\n", "This notebook is organized as follows\n", "\n", "1. [Step 1](#initializenrpy): Initialize core Python/NRPy+ modules\n", "1. [Step 2](#initialdata): Setting up Brill-Lindquist initial data\n", "1. [Step 3](#code_validation): Code Validation against BSSN/BrillLindquist NRPy+ module\n", "1. [Step 4](#latex_pdf_output): Output this notebook to $\\LaTeX$-formatted PDF file" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 1: Initialize core Python/NRPy+ modules \\[Back to [top](#toc)\\]\n", "$$\\label{initializenrpy}$$\n", "\n", "Let's start by importing all the needed modules from Python/NRPy+:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2021-03-07T17:05:12.331340Z", "iopub.status.busy": "2021-03-07T17:05:12.330479Z", "iopub.status.idle": "2021-03-07T17:05:12.647089Z", "shell.execute_reply": "2021-03-07T17:05:12.647596Z" } }, "outputs": [], "source": [ "# Step 1: Initialize core Python/NRPy+ modules\n", "import sympy as sp # SymPy: The Python computer algebra package upon which NRPy+ depends\n", "import NRPy_param_funcs as par # NRPy+: Parameter interface\n", "import indexedexp as ixp # NRPy+: Symbolic indexed expression (e.g., tensors, vectors, etc.) support" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 2: Setting up Brill-Lindquist initial data \\[Back to [top](#toc)\\]\n", "$$\\label{initialdata}$$ \n", "\n", "Here we set up Brill-Lindquist initial data ([Brill & Lindquist, Phys. Rev. 131, 471, 1963](https://journals.aps.org/pr/abstract/10.1103/PhysRev.131.471); see also Eq. 1 of [Brandt & Brügmann, arXiv:gr-qc/9711015v1](https://arxiv.org/pdf/gr-qc/9711015v1.pdf)):\n", "\n", "The conformal factor $\\psi$ for Brill-Lindquist initial data is given by\n", "$$\\psi = e^{\\phi} = 1 + \\sum_{i=1}^N \\frac{m_{(i)}}{2 \\left|\\vec{r}_{(i)} - \\vec{r}\\right|};\\quad K_{ij}=0,$$\n", "\n", "where $\\psi$ is written in terms of the 3-metric $\\gamma_{ij}$ as\n", "\n", "$$\n", "\\gamma_{ij} = \\psi^4 \\delta_{ij}.\n", "$$\n", "\n", "The extrinsic curvature is zero:\n", "$$\n", "K_{ij} = 0\n", "$$\n", "\n", "These data consist of $N$ nonspinning black holes initially at rest. This module restricts to the case of two such black holes, positioned anywhere. Here, we implement $N=2$.\n", "\n", "**Inputs for $\\psi$**:\n", "* The position and (bare) mass of black hole 1: $\\left(x_{(1)},y_{(1)},z_{(1)}\\right)$ and $m_{(1)}$, respectively\n", "* The position and (bare) mass of black hole 2: $\\left(x_{(2)},y_{(2)},z_{(2)}\\right)$ and $m_{(2)}$, respectively\n", "\n", "**Additional variables needed for spacetime evolution**:\n", "* Desired coordinate system\n", "* Desired initial lapse $\\alpha$ and shift $\\beta^i$. We will choose our gauge conditions as $\\alpha=\\psi^{-2}$ and $\\beta^i=B^i=0$." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2021-03-07T17:05:12.659508Z", "iopub.status.busy": "2021-03-07T17:05:12.658571Z", "iopub.status.idle": "2021-03-07T17:05:12.727941Z", "shell.execute_reply": "2021-03-07T17:05:12.727267Z" } }, "outputs": [], "source": [ "# Step 2: Setting up Brill-Lindquist initial data\n", "\n", "thismodule = \"Brill-Lindquist\"\n", "BH1_posn_x,BH1_posn_y,BH1_posn_z = par.Cparameters(\"REAL\", thismodule,\n", " [\"BH1_posn_x\",\"BH1_posn_y\",\"BH1_posn_z\"],\n", " [ 0.0, 0.0, +0.5])\n", "BH1_mass = par.Cparameters(\"REAL\", thismodule, [\"BH1_mass\"],1.0)\n", "BH2_posn_x,BH2_posn_y,BH2_posn_z = par.Cparameters(\"REAL\", thismodule,\n", " [\"BH2_posn_x\",\"BH2_posn_y\",\"BH2_posn_z\"],\n", " [ 0.0, 0.0, -0.5])\n", "BH2_mass = par.Cparameters(\"REAL\", thismodule, [\"BH2_mass\"],1.0)\n", "\n", "# Step 2.a: Set spatial dimension (must be 3 for BSSN)\n", "DIM = 3\n", "par.set_parval_from_str(\"grid::DIM\",DIM)\n", "\n", "Cartxyz = ixp.declarerank1(\"Cartxyz\")\n", "\n", "# Step 2.b: Set psi, the conformal factor:\n", "psi = sp.sympify(1)\n", "psi += BH1_mass / ( 2 * sp.sqrt((Cartxyz[0]-BH1_posn_x)**2 + (Cartxyz[1]-BH1_posn_y)**2 + (Cartxyz[2]-BH1_posn_z)**2) )\n", "psi += BH2_mass / ( 2 * sp.sqrt((Cartxyz[0]-BH2_posn_x)**2 + (Cartxyz[1]-BH2_posn_y)**2 + (Cartxyz[2]-BH2_posn_z)**2) )\n", "\n", "# Step 2.c: Set all needed ADM variables in Cartesian coordinates\n", "gammaDD = ixp.zerorank2()\n", "KDD = ixp.zerorank2() # K_{ij} = 0 for these initial data\n", "for i in range(DIM):\n", " gammaDD[i][i] = psi**4\n", "\n", "alpha = 1/psi**2\n", "betaU = ixp.zerorank1() # We generally choose \\beta^i = 0 for these initial data\n", "BU = ixp.zerorank1() # We generally choose B^i = 0 for these initial data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 3: Code Validation against BSSN/BrillLindquist NRPy+ module \\[Back to [top](#toc)\\]\n", "$$\\label{code_validation}$$\n", "\n", "Here, as a code validation check, we verify agreement in the SymPy expressions for Brill-Lindquist initial data between\n", "\n", "1. this tutorial and \n", "2. the NRPy+ [BSSN/BrillLindquist.py](../edit/BSSN/BrillLindquist.py) module." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2021-03-07T17:05:12.768371Z", "iopub.status.busy": "2021-03-07T17:05:12.767381Z", "iopub.status.idle": "2021-03-07T17:05:25.097270Z", "shell.execute_reply": "2021-03-07T17:05:25.097749Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Consistency check between Brill-Lindquist tutorial and NRPy+ BSSN.BrillLindquist module.\n", "ALL TESTS PASS\n" ] } ], "source": [ "# Step 3: Code Validation against BSSN.BrillLindquist NRPy+ module\n", "\n", "import BSSN.BrillLindquist as bl\n", "bl.BrillLindquist()\n", "\n", "def compare(q1, q2, q1name, q2name):\n", " if sp.simplify(q1 - q2) != 0:\n", " print(\"Error: \"+q1name+\" - \"+q2name+\" = \"+str(sp.simplify(q1 - q2)))\n", " sys.exit(1) \n", "\n", "print(\"Consistency check between Brill-Lindquist tutorial and NRPy+ BSSN.BrillLindquist module.\")\n", "compare(alpha, bl.alpha, \"alpha\", \"bl.alpha\")\n", "for i in range(DIM):\n", " compare(betaU[i], bl.betaU[i], \"betaU\"+str(i), \"bl.betaU\"+str(i))\n", " compare(BU[i], bl.BU[i], \"BU\"+str(i), \"bl.BU\"+str(i))\n", " for j in range(DIM):\n", " compare(gammaDD[i][j], bl.gammaDD[i][j], \"gammaDD\"+str(i)+str(j), \"bl.gammaDD\"+str(i)+str(j))\n", " compare(KDD[i][j], bl.KDD[i][j], \"KDD\"+str(i)+str(j), \"bl.KDD\"+str(i)+str(j))\n", "print(\"ALL TESTS PASS\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 4: Output this notebook to $\\LaTeX$-formatted PDF file \\[Back to [top](#toc)\\]\n", "$$\\label{latex_pdf_output}$$\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-ADM_Initial_Data-Brill-Lindquist](Tutorial-ADM_Initial_Data-Brill-Lindquist.pdf) (Note that clicking on this link may not work; you may need to open the PDF file through another means.)\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2021-03-07T17:05:25.102274Z", "iopub.status.busy": "2021-03-07T17:05:25.101538Z", "iopub.status.idle": "2021-03-07T17:05:28.441702Z", "shell.execute_reply": "2021-03-07T17:05:28.442352Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Created Tutorial-ADM_Initial_Data-Brill-Lindquist.tex, and compiled LaTeX\n", " file to PDF file Tutorial-ADM_Initial_Data-Brill-Lindquist.pdf\n" ] } ], "source": [ "import cmdline_helper as cmd # NRPy+: Multi-platform Python command-line interface\n", "cmd.output_Jupyter_notebook_to_LaTeXed_PDF(\"Tutorial-ADM_Initial_Data-Brill-Lindquist\")" ] } ], "metadata": { "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" } }, "nbformat": 4, "nbformat_minor": 4 }