{ "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", "## This tutorial module generates a standalone test for the 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 (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 }