{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"\n",
"# Tutorial-IllinoisGRMHD: standalone_conserv_to_prims_main_function.h\n",
"\n",
"## Authors: Leo Werneck & Zach Etienne\n",
"\n",
"**This module is currently under development**\n",
"\n",
"## In this tutorial module we generate a standalone test for our conservative-to-primitive algorithm\n",
"\n",
"### Required and recommended citations:\n",
"\n",
"* **(Required)** Etienne, Z. B., Paschalidis, V., Haas R., Mösta P., and Shapiro, S. L. IllinoisGRMHD: an open-source, user-friendly GRMHD code for dynamical spacetimes. Class. Quantum Grav. 32 (2015) 175009. ([arxiv:1501.07276](http://arxiv.org/abs/1501.07276)).\n",
"* **(Required)** Noble, S. C., Gammie, C. F., McKinney, J. C., Del Zanna, L. Primitive Variable Solvers for Conservative General Relativistic Magnetohydrodynamics. Astrophysical Journal, 641, 626 (2006) ([astro-ph/0512420](https://arxiv.org/abs/astro-ph/0512420)).\n",
"* **(Recommended)** Del Zanna, L., Bucciantini N., Londrillo, P. An efficient shock-capturing central-type scheme for multidimensional relativistic flows - II. Magnetohydrodynamics. A&A 400 (2) 397-413 (2003). DOI: 10.1051/0004-6361:20021641 ([astro-ph/0210618](https://arxiv.org/abs/astro-ph/0210618))."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"# Table of Contents\n",
"$$\\label{toc}$$\n",
"\n",
"This module is organized as follows\n",
"\n",
"0. [Step 0](#src_dir): **Source directory creation**\n",
"1. [Step 1](#introduction): **Introduction**\n",
"1. [Step 2](#standalone_conserv_to_prims_main_function__h): **`standalone_conserv_to_prims_main_function.h`**\n",
"1. [Step n-1](#code_validation): **Code validation**\n",
"1. [Step n](#latex_pdf_output): **Output this notebook to $\\LaTeX$-formatted PDF file**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"# Step 0: Source directory creation \\[Back to [top](#toc)\\]\n",
"$$\\label{src_dir}$$\n",
"\n",
"We will now use the [cmdline_helper.py NRPy+ module](Tutorial-Tutorial-cmdline_helper.ipynb) to create the source directory within the `IllinoisGRMHD` NRPy+ directory, if it does not exist yet."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# Step 0: Creation of the IllinoisGRMHD source directory\n",
"# Step 0a: Add NRPy's directory to the path\n",
"# https://stackoverflow.com/questions/16780014/import-file-from-parent-directory\n",
"import os,sys\n",
"nrpy_dir_path = os.path.join(\"..\",\"..\")\n",
"if nrpy_dir_path not in sys.path:\n",
" sys.path.append(nrpy_dir_path)\n",
"\n",
"# Step 0b: Load up cmdline_helper and create the directory\n",
"import cmdline_helper as cmd\n",
"IGM_src_dir_path = os.path.join(\"..\",\"src\")\n",
"cmd.mkdir(IGM_src_dir_path)\n",
"\n",
"# Step 0c: Create the output file path\n",
"outfile_path__standalone_conserv_to_prims_main_function__h = os.path.join(IGM_src_dir_path,\"standalone_conserv_to_prims_main_function.h\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"# Step 1: Introduction \\[Back to [top](#toc)\\]\n",
"$$\\label{introduction}$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"# Step 2: `standalone_conserv_to_prims_main_function.h` \\[Back to [top](#toc)\\]\n",
"$$\\label{standalone_conserv_to_prims_main_function__h}$$"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Writing ../src/standalone_conserv_to_prims_main_function.h\n"
]
}
],
"source": [
"%%writefile $outfile_path__standalone_conserv_to_prims_main_function__h\n",
"\n",
"\n",
"#define CCTK_REAL double\n",
"#define CCTK_EQUALS(a,b) (strcmp((a),(b))==0)\n",
"#define CCTK_Equals(a,b) (strcmp((a),(b))==0)\n",
"#define cGH int\n",
"\n",
"int conserv_to_prims_debug = 0;\n",
"char verbose[100];\n",
"\n",
"CCTK_REAL GAMMA_SPEED_LIMIT,rho_b_atm,tau_atm, rho_b_max, Psi6threshold;\n",
"\n",
"CCTK_REAL Gamma_th, K_ppoly_tab0;\n",
"CCTK_REAL rho_ppoly_tab_in[10],Gamma_ppoly_tab_in[11];\n",
"\n",
"int neos;\n",
"int update_Tmunu;\n",
"\n",
"#define CCTK_THORNSTRING \"\"\n",
"#define CCTK_WARN_ALERT \"\"\n",
"#define Symmetry \"none\"\n",
"#define CCTK_GFINDEX3D(IGNORE,i,j,k) ((i) + cctk_lsh[0] * ((j) + cctk_lsh[1] * (k)))\n",
"#define GetRefinementLevel(cctkGH) 0\n",
"\n",
"#include \n",
"#include \n",
"#include \"IllinoisGRMHD_headers.h\"\n",
"#include \"harm_primitives_headers.h\"\n",
"#include \"harm_u2p_util.c\"\n",
"#include \"inlined_functions.C\"\n",
"#include \"apply_tau_floor__enforce_limits_on_primitives_and_recompute_conservs.C\"\n",
"#include \"convert_ADM_to_BSSN__enforce_detgtij_eq_1__and_compute_gtupij.C\"\n",
"\n",
"int CCTK_VInfo(const char *thorn, const char *format, ...) {\n",
" va_list ap;\n",
" fprintf (stdout, \"INFO (NOTHORN): \");\n",
" va_start (ap, format);\n",
" vfprintf (stdout, format, ap);\n",
" va_end (ap);\n",
" fprintf (stdout, \"\\n\");\n",
" return 0;\n",
"}\n",
"\n",
"int *cctkGH;\n",
"\n",
"int main(int argc, const char *argv[]) {\n",
"\n",
" if(argc != 2) {\n",
" fprintf(stderr,\"Error: Correct usage: ./driver_conserv_to_prims [filename]\\n\");\n",
" exit(1);\n",
" }\n",
"\n",
" sprintf(verbose,\"essential+iteration output\");\n",
" // We use proper C++ here, for file I/O later.\n",
" using namespace std;\n",
"\n",
" ifstream myfile;\n",
" char filename[100];\n",
" sprintf(filename,\"%s\",argv[1]);\n",
" myfile.open (filename, ios::in | ios::binary);\n",
" if(myfile.fail()) {\n",
" fprintf(stderr,\"Error: file %s cannot be opened.\\n\",filename);\n",
" exit(1);\n",
" }\n",
" //myfile.open (\"data.bin\", ios::out | ios::binary);\n",
" int cctk_lsh[3];\n",
" myfile.read((char*)cctk_lsh, 3*sizeof(int));\n",
"\n",
" myfile.read((char*)&GAMMA_SPEED_LIMIT, 1*sizeof(CCTK_REAL));\n",
"\n",
" myfile.read((char*)&rho_b_max, 1*sizeof(CCTK_REAL));\n",
" myfile.read((char*)&rho_b_atm, 1*sizeof(CCTK_REAL));\n",
" myfile.read((char*)&tau_atm, 1*sizeof(CCTK_REAL));\n",
"\n",
" myfile.read((char*)&Psi6threshold, 1*sizeof(CCTK_REAL));\n",
"\n",
" myfile.read((char*)&update_Tmunu, 1*sizeof(int));\n",
"\n",
" myfile.read((char*)&neos, 1*sizeof(int));\n",
"\n",
" if(neos > 11 || neos < 1) {\n",
" fprintf(stderr,\"ERROR: neos = %d too large or too small\\n\",neos);\n",
" exit(1);\n",
" }\n",
"\n",
" myfile.read((char*)&Gamma_th, 1*sizeof(CCTK_REAL));\n",
" myfile.read((char*)&K_ppoly_tab0, 1*sizeof(CCTK_REAL));\n",
" myfile.read((char*)Gamma_ppoly_tab_in, neos*sizeof(CCTK_REAL));\n",
" myfile.read((char*)rho_ppoly_tab_in, (neos-1)*sizeof(CCTK_REAL));\n",
"\n",
" int fullsize=cctk_lsh[0]*cctk_lsh[1]*cctk_lsh[2];\n",
"\n",
" CCTK_REAL *x = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *y = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *z = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" myfile.read((char*)x, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)y, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)z, (fullsize)*sizeof(CCTK_REAL));\n",
"\n",
" // Should probably output these:\n",
" CCTK_REAL *failure_checker = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *eTtt = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *eTtx = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *eTty = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *eTtz = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *eTxx = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *eTxy = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *eTxz = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *eTyy = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *eTyz = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *eTzz = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *alp = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gxx = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gxy = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gxz = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gyy = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gyz = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gzz = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *psi_bssn = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" myfile.read((char *)failure_checker, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)eTtt, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)eTtx, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)eTty, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)eTtz, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)eTxx, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)eTxy, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)eTxz, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)eTyy, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)eTyz, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)eTzz, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)alp, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)gxx, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)gxy, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)gxz, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)gyy, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)gyz, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)gzz, fullsize*sizeof(CCTK_REAL));\n",
" myfile.read((char *)psi_bssn, fullsize*sizeof(CCTK_REAL));\n",
"\n",
"\n",
"\n",
" CCTK_REAL *phi_bssn = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gtxx = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gtxy = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gtxz = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gtyy = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gtyz = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gtzz = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" myfile.read((char*)phi_bssn, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)gtxx, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)gtxy, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)gtxz, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)gtyy, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)gtyz, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)gtzz, (fullsize)*sizeof(CCTK_REAL));\n",
"\n",
" CCTK_REAL *gtupxx = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gtupxy = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gtupxz = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gtupyy = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gtupyz = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *gtupzz = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" myfile.read((char*)gtupxx, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)gtupxy, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)gtupxz, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)gtupyy, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)gtupyz, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)gtupzz, (fullsize)*sizeof(CCTK_REAL));\n",
"\n",
" CCTK_REAL *betax = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *betay = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *betaz = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" myfile.read((char*)betax, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)betay, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)betaz, (fullsize)*sizeof(CCTK_REAL));\n",
"\n",
" CCTK_REAL *lapm1 = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" myfile.read((char*)lapm1, (fullsize)*sizeof(CCTK_REAL));\n",
"\n",
" CCTK_REAL *tau = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *mhd_st_x = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *mhd_st_y = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *mhd_st_z = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" myfile.read((char*)tau, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)mhd_st_x, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)mhd_st_y, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)mhd_st_z, (fullsize)*sizeof(CCTK_REAL));\n",
"\n",
" CCTK_REAL *rho_star = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" myfile.read((char*)rho_star, (fullsize)*sizeof(CCTK_REAL));\n",
"\n",
" CCTK_REAL *Bx = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *By = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *Bz = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" myfile.read((char*)Bx, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)By, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)Bz, (fullsize)*sizeof(CCTK_REAL));\n",
"\n",
" // v^i = u^i / u^0 <-- NOT VALENCIA VELOCITY\n",
" CCTK_REAL *vx = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *vy = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *vz = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" myfile.read((char*)vx, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)vy, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)vz, (fullsize)*sizeof(CCTK_REAL));\n",
"\n",
" CCTK_REAL *P = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *rho_b = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" myfile.read((char*)P, (fullsize)*sizeof(CCTK_REAL));\n",
" myfile.read((char*)rho_b,(fullsize)*sizeof(CCTK_REAL));\n",
"\n",
" //int checker=1063;\n",
" int checker;\n",
" myfile.read((char*)&checker,sizeof(int));\n",
" if(checker != 1063) {\n",
" fprintf(stderr,\"MAGIC NUMBER FAILED. DATA FILE READIN ERROR.\\n\");\n",
" exit(1);\n",
" }\n",
"\n",
" myfile.close();\n",
"\n",
" // HERE WE USE _flux variables as temp storage for original values of conservative variables.. This is used for debugging purposes only.\n",
" CCTK_REAL *rho_star_flux = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *st_x_flux = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *st_y_flux = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *st_z_flux = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n",
" CCTK_REAL *tau_flux = (CCTK_REAL *)malloc(sizeof(CCTK_REAL)*fullsize);\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"# Step n-1: Code validation \\[Back to [top](#toc)\\]\n",
"$$\\label{code_validation}$$\n",
"\n",
"First we download the original `IllinoisGRMHD` source code and then compare it to the source code generated by this tutorial notebook."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# # Verify if the code generated by this tutorial module\n",
"# # matches the original IllinoisGRMHD source code\n",
"\n",
"# # First download the original IllinoisGRMHD source code\n",
"# import urllib\n",
"# from os import path\n",
"\n",
"# original_IGM_file_url = \"https://bitbucket.org/zach_etienne/wvuthorns/raw/5611b2f0b17135538c9d9d17c7da062abe0401b6/IllinoisGRMHD/src/A_i_rhs_no_gauge_terms.C\"\n",
"# original_IGM_file_name = \"A_i_rhs_no_gauge_terms-original.C\"\n",
"# original_IGM_file_path = os.path.join(IGM_src_dir_path,original_IGM_file_name)\n",
"\n",
"# # Then download the original IllinoisGRMHD source code\n",
"# # We try it here in a couple of ways in an attempt to keep\n",
"# # the code more portable\n",
"# try:\n",
"# original_IGM_file_code = urllib.request.urlopen(original_IGM_file_url).read().decode(\"utf-8\")\n",
"# # Write down the file the original IllinoisGRMHD source code\n",
"# with open(original_IGM_file_path,\"w\") as file:\n",
"# file.write(original_IGM_file_code)\n",
"# except:\n",
"# try:\n",
"# original_IGM_file_code = urllib.urlopen(original_IGM_file_url).read().decode(\"utf-8\")\n",
"# # Write down the file the original IllinoisGRMHD source code\n",
"# with open(original_IGM_file_path,\"w\") as file:\n",
"# file.write(original_IGM_file_code)\n",
"# except:\n",
"# # If all else fails, hope wget does the job\n",
"# !wget -O $original_IGM_file_path $original_IGM_file_url\n",
"\n",
"# # Perform validation\n",
"# Validation__A_i_rhs_no_gauge_terms__C = !diff $original_IGM_file_path $outfile_path__A_i_rhs_no_gauge_terms__C\n",
"\n",
"# if Validation__A_i_rhs_no_gauge_terms__C == []:\n",
"# # If the validation passes, we do not need to store the original IGM source code file\n",
"# !rm $original_IGM_file_path\n",
"# print(\"Validation test for A_i_rhs_no_gauge_terms.C: PASSED!\")\n",
"# else:\n",
"# # If the validation fails, we keep the original IGM source code file\n",
"# print(\"Validation test for A_i_rhs_no_gauge_terms.C: FAILED!\")\n",
"# # We also print out the difference between the code generated\n",
"# # in this tutorial module and the original IGM source code\n",
"# print(\"Diff:\")\n",
"# for diff_line in Validation__A_i_rhs_no_gauge_terms__C:\n",
"# print(diff_line)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"# Step n: 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-IllinoisGRMHD__standalone_conserv_to_prims_main_function.pdf](Tutorial-IllinoisGRMHD__standalone_conserv_to_prims_main_function.pdf) (Note that clicking on this link may not work; you may need to open the PDF file through another means)."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"latex_nrpy_style_path = os.path.join(nrpy_dir_path,\"latex_nrpy_style.tplx\")\n",
"#!jupyter nbconvert --to latex --template $latex_nrpy_style_path --log-level='WARN' Tutorial-IllinoisGRMHD__standalone_conserv_to_prims_main_function.ipynb\n",
"#!pdflatex -interaction=batchmode Tutorial-IllinoisGRMHD__standalone_conserv_to_prims_main_function.tex\n",
"#!pdflatex -interaction=batchmode Tutorial-IllinoisGRMHD__standalone_conserv_to_prims_main_function.tex\n",
"#!pdflatex -interaction=batchmode Tutorial-IllinoisGRMHD__standalone_conserv_to_prims_main_function.tex\n",
"!rm -f Tut*.out Tut*.aux Tut*.log"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.8.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}