{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "# Start-to-Finish Example: Evolving Maxwell's Equations with Toriodal Dipole Field Initial Data, in Flat Spacetime and Curvilinear Coordinates\n", "\n", "## Following the work of [Knapp, Walker & Baumgarte (2002)](https://arxiv.org/abs/gr-qc/0201051), we numerically implement the second version of Maxwell’s equations - System II (BSSN - like) in curvilinear coordinates.\n", "\n", "## Author: Terrence Pierre Jacques and Zachariah Etienne\n", "### Formatting improvements courtesy Brandon Clark\n", "\n", "**Notebook Status:** Validated \n", "\n", "**Validation Notes:** This module has been validated to exhibit convergence to the exact solution for the electric field $E^i$ and vector potential $A^i$ at the expected order, *after a short numerical evolution of the initial data* (see [plots at bottom](#convergence)).\n", "\n", "### NRPy+ Source Code for this module: \n", "* [Maxwell/InitialData.py](../edit/Maxwell/InitialData.py); [\\[**tutorial**\\]](Tutorial-VacuumMaxwell_InitialData.ipynb): Purely toriodal dipole field initial data; sets all electromagnetic variables in the Cartesian basis\n", "* [Maxwell/VacuumMaxwell_Flat_Evol_Curvilinear.py](../edit/Maxwell/VacuumMaxwell_Flat_Evol_Cartesian.py); [\\[**tutorial**\\]](Tutorial-Tutorial-VacuumMaxwell_Curvilinear_RHS-Rescaling.ipynb): Generates the right-hand sides for Maxwell's equations in curvilinear coordinates\n", "\n", "## Introduction:\n", "Here we use NRPy+ to generate the C source code necessary to set up initial data for a purely toriodal dipole field, as defined in [Knapp, Walker & Baumgarte (2002)](https://arxiv.org/abs/gr-qc/0201051). We then evolve the RHSs of Maxwell's equations using the [Method of Lines](https://reference.wolfram.com/language/tutorial/NDSolveMethodOfLines.html) time integration based on an [explicit Runge-Kutta fourth-order scheme](https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods) (RK4 is chosen below, but multiple options exist). \n", "\n", "The entire algorithm is outlined as follows, with links to the relevant NRPy+ tutorial notebooks listed at each step:\n", "\n", "1. Allocate memory for gridfunctions, including temporary storage for the Method of Lines time integration\n", " * [**NRPy+ tutorial on Method of Lines algorithm**](Tutorial-Method_of_Lines-C_Code_Generation.ipynb).\n", "1. Set gridfunction values to initial data \n", " * [**NRPy+ tutorial on purely toriodal dipole field initial data**](Tutorial-VacuumMaxwell_InitialData.ipynb)\n", "1. Next, integrate the initial data forward in time using the Method of Lines coupled to a Runge-Kutta explicit timestepping algorithm:\n", " 1. At the start of each iteration in time, output the divergence constraint violation \n", " * [**NRPy+ tutorial on Maxwell's equations constraints**](Tutorial-VacuumMaxwell_Curvilinear_RHSs.ipynb)\n", " 1. At each RK time substep, do the following:\n", " 1. Evaluate RHS expressions \n", " * [**NRPy+ tutorial on Maxwell's equations right-hand sides**](Tutorial-VacuumMaxwell_Curvilinear_RHSs.ipynb)\n", " 1. Apply Sommerfeld boundary conditions in curvilinear coordinates\n", " * [**NRPy+ tutorial on setting up Sommerfeld boundary conditions**](Tutorial-SommerfeldBoundaryCondition.ipynb) \n", "1. Repeat above steps at two numerical resolutions to confirm convergence to zero." ] }, { "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): Set core NRPy+ parameters for numerical grids and reference metric\n", " 1. [Step 1.a](#cfl) Output needed C code for finding the minimum proper distance between grid points, needed for [CFL](https://en.wikipedia.org/w/index.php?title=Courant%E2%80%93Friedrichs%E2%80%93Lewy_condition&oldid=806430673)-limited timestep\n", "1. [Step 2](#mw): Generate symbolic expressions and output C code for evolving Maxwell's equations\n", " 1. [Step 2.a](#mwid): Generate symbolic expressions for toroidal dipole field initial data\n", " 1. [Step 2.b](#mwevol): Generate symbolic expressions for evolution equations\n", " 1. [Step 2.c](#mwcon): Generate symbolic expressions for constraint equations\n", " 1. [Step 2.d](#mwcart): Generate symbolic expressions for converting $A^i$ and $E^i$ to the Cartesian basis\n", " 1. [Step 2.e](#mwccode): Output C codes for initial data and evolution equations\n", " 1. [Step 2.f](#mwccode_con): Output C code for constraint equations\n", " 1. [Step 2.g](#mwccode_cart): Output C code for converting $A^i$ and $E^i$ to Cartesian coordinates\n", " 1. [Step 2.h](#mwccode_xzloop): Output C code for printing 2D data\n", " 1. [Step 2.i](#cparams_rfm_and_domainsize): Output C codes needed for declaring and setting Cparameters; also set `free_parameters.h`\n", "1. [Step 3](#bc_functs): Set up Sommerfeld boundary condition functions\n", "1. [Step 4](#mainc): `Maxwell_Playground.c`: The Main C Code\n", "1. [Step 5](#compileexec): Compile generated C codes & perform simulation of the propagating toriodal electromagnetic field\n", "1. [Step 6](#visualize): Visualize the output!\n", " 1. [Step 6.a](#installdownload): Install `scipy` and download `ffmpeg` if they are not yet installed/downloaded\n", " 1. [Step 6.b](#genimages): Generate images for visualization animation\n", " 1. [Step 6.c](#genvideo): Generate visualization animation\n", "1. [Step 7](#convergence): Plot the numerical error, and confirm that it converges to zero with increasing numerical resolution (sampling)\n", "1. [Step 8](#div_e): Comparison of Divergence Constrain Violation\n", "1. [Step 9](#latex_pdf_output): Output this notebook to $\\LaTeX$-formatted PDF file" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 1: Set core NRPy+ parameters for numerical grids and reference metric \\[Back to [top](#toc)\\]\n", "$$\\label{initializenrpy}$$" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:43.914614Z", "iopub.status.busy": "2021-06-15T11:39:43.908648Z", "iopub.status.idle": "2021-06-15T11:39:44.810620Z", "shell.execute_reply": "2021-06-15T11:39:44.811064Z" } }, "outputs": [ { "data": { "text/plain": [ "'MaxwellEvolCurvi_Playground_Ccodes/SIMD/SIMD_intrinsics.h'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Step P1: Import needed NRPy+ core modules:\n", "from outputC import outputC,lhrh,outCfunction # NRPy+: Core C code output module\n", "import finite_difference as fin # NRPy+: Finite difference C code generation module\n", "import NRPy_param_funcs as par # NRPy+: Parameter interface\n", "import grid as gri # NRPy+: Functions having to do with numerical grids\n", "import indexedexp as ixp # NRPy+: Symbolic indexed expression (e.g., tensors, vectors, etc.) support\n", "import reference_metric as rfm # NRPy+: Reference metric support\n", "import cmdline_helper as cmd # NRPy+: Multi-platform Python command-line interface\n", "import shutil, os, sys # Standard Python modules for multiplatform OS-level functions, benchmarking\n", "\n", "# Step P2: Create C code output directory:\n", "Ccodesdir = os.path.join(\"MaxwellEvolCurvi_Playground_Ccodes/\")\n", "# First remove C code output directory if it exists\n", "# Courtesy https://stackoverflow.com/questions/303200/how-do-i-remove-delete-a-folder-that-is-not-empty\n", "shutil.rmtree(Ccodesdir, ignore_errors=True)\n", "# Then create a fresh directory\n", "cmd.mkdir(Ccodesdir)\n", "\n", "# Step P3: Create executable output directory:\n", "outdir = os.path.join(Ccodesdir,\"output/\")\n", "cmd.mkdir(outdir)\n", "\n", "# Step 1: Set the spatial dimension parameter\n", "# to three (BSSN is a 3+1 decomposition\n", "# of Einstein's equations), and then read\n", "# the parameter as DIM.\n", "par.set_parval_from_str(\"grid::DIM\",3)\n", "DIM = par.parval_from_str(\"grid::DIM\")\n", "\n", "# Step 2: Set some core parameters, including CoordSystem MoL BoundaryCondition timestepping algorithm,\n", "# FD order, floating point precision, and CFL factor:\n", "# Choices are: Spherical, SinhSpherical, SinhSphericalv2, Cylindrical, SinhCylindrical,\n", "# SymTP, SinhSymTP\n", "CoordSystem = \"SinhCylindrical\"\n", "\n", "# Step 2.a: Set boundary conditions\n", "# Current choices are QuadraticExtrapolation (quadratic polynomial extrapolation) or Sommerfeld\n", "BoundaryCondition = \"Sommerfeld\"\n", "\n", "# Step 2.b: Set defaults for Coordinate system parameters.\n", "# These are perhaps the most commonly adjusted parameters,\n", "# so we enable modifications at this high level.\n", "\n", "# domain_size sets the default value for:\n", "# * Spherical's params.RMAX\n", "# * SinhSpherical*'s params.AMAX\n", "# * Cartesians*'s -params.{x,y,z}min & .{x,y,z}max\n", "# * Cylindrical's -params.ZMIN & .{Z,RHO}MAX\n", "# * SinhCylindrical's params.AMPL{RHO,Z}\n", "# * *SymTP's params.AMAX\n", "domain_size = 10.0 # Needed for all coordinate systems.\n", "\n", "# sinh_width sets the default value for:\n", "# * SinhSpherical's params.SINHW\n", "# * SinhCylindrical's params.SINHW{RHO,Z}\n", "# * SinhSymTP's params.SINHWAA\n", "sinh_width = 0.4 # If Sinh* coordinates chosen\n", "\n", "# sinhv2_const_dr sets the default value for:\n", "# * SinhSphericalv2's params.const_dr\n", "# * SinhCylindricalv2's params.const_d{rho,z}\n", "sinhv2_const_dr = 0.05 # If Sinh*v2 coordinates chosen\n", "\n", "# SymTP_bScale sets the default value for:\n", "# * SinhSymTP's params.bScale\n", "SymTP_bScale = 0.5 # If SymTP chosen\n", "\n", "# Step 2.c: Set the order of spatial and temporal derivatives;\n", "# the core data type, and the CFL factor.\n", "# RK_method choices include: Euler, \"RK2 Heun\", \"RK2 MP\", \"RK2 Ralston\", RK3, \"RK3 Heun\", \"RK3 Ralston\",\n", "# SSPRK3, RK4, DP5, DP5alt, CK5, DP6, L6, DP8\n", "RK_method = \"RK4\"\n", "FD_order = 4 # Finite difference order: even numbers only, starting with 2. 12 is generally unstable\n", "REAL = \"double\" # Best to use double here.\n", "default_CFL_FACTOR= 0.5 # (GETS OVERWRITTEN WHEN EXECUTED.) In pure axisymmetry (symmetry_axes = 2 below) 1.0 works fine. Otherwise 0.5 or lower.\n", "\n", "# Step 3: Generate Runge-Kutta-based (RK-based) timestepping code.\n", "# 3.A: Evaluate RHSs (RHS_string)\n", "# 3.B: Apply boundary conditions (RHS_string)\n", "import MoLtimestepping.C_Code_Generation as MoL\n", "from MoLtimestepping.RK_Butcher_Table_Dictionary import Butcher_dict\n", "RK_order = Butcher_dict[RK_method][1]\n", "cmd.mkdir(os.path.join(Ccodesdir,\"MoLtimestepping/\"))\n", "\n", "RHS_string = \"rhs_eval(&rfmstruct, ¶ms, RK_INPUT_GFS, RK_OUTPUT_GFS);\"\n", "\n", "if BoundaryCondition == \"QuadraticExtrapolation\":\n", " # Extrapolation BCs are applied to the evolved gridfunctions themselves after the MoL update\n", " post_RHS_string = \"apply_bcs_curvilinear(¶ms, &bcstruct, NUM_EVOL_GFS, evol_gf_parity, RK_OUTPUT_GFS);\"\n", "elif BoundaryCondition == \"Sommerfeld\":\n", " # Sommerfeld BCs are applied to the gridfunction RHSs directly\n", " RHS_string += \"\\n apply_bcs_sommerfeld(¶ms, xx, &bcstruct, NUM_EVOL_GFS, evol_gf_parity, RK_INPUT_GFS, RK_OUTPUT_GFS);\"\n", " post_RHS_string = \"\"\n", "else:\n", " print(\"Invalid choice of boundary condition\")\n", " sys.exit(1)\n", "\n", "MoL.MoL_C_Code_Generation(RK_method, RHS_string = RHS_string, post_RHS_string = post_RHS_string,\n", " outdir = os.path.join(Ccodesdir,\"MoLtimestepping/\"))\n", "\n", "\n", "# Step 4: Set the coordinate system for the numerical grid\n", "par.set_parval_from_str(\"reference_metric::CoordSystem\",CoordSystem)\n", "rfm.reference_metric()\n", "\n", "# Step 5: Set the finite differencing order to 4.\n", "par.set_parval_from_str(\"finite_difference::FD_CENTDERIVS_ORDER\",FD_order)\n", "\n", "# Step 6: Copy SIMD/SIMD_intrinsics.h to $Ccodesdir/SIMD/SIMD_intrinsics.h\n", "cmd.mkdir(os.path.join(Ccodesdir,\"SIMD\"))\n", "shutil.copy(os.path.join(\"SIMD/\")+\"SIMD_intrinsics.h\",os.path.join(Ccodesdir,\"SIMD/\"))\n", "# par.set_parval_from_str(\"indexedexp::symmetry_axes\",\"2\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "## Step 1.a: Output needed C code for finding the minimum proper distance between grid points, needed for [CFL](https://en.wikipedia.org/w/index.php?title=Courant%E2%80%93Friedrichs%E2%80%93Lewy_condition&oldid=806430673)-limited timestep \\[Back to [top](#toc)\\]\n", "$$\\label{cfl}$$\n", "\n", "In order for our explicit-timestepping numerical solution to Maxwell's equations to be stable, it must satisfy the [CFL](https://en.wikipedia.org/w/index.php?title=Courant%E2%80%93Friedrichs%E2%80%93Lewy_condition&oldid=806430673) condition:\n", "$$\n", "\\Delta t \\le \\frac{\\min(ds_i)}{c},\n", "$$\n", "where $c$ is the wavespeed, and\n", "$$ds_i = h_i \\Delta x^i$$ \n", "is the proper distance between neighboring gridpoints in the $i$th direction (in 3D, there are 3 directions), $h_i$ is the $i$th reference metric scale factor, and $\\Delta x^i$ is the uniform grid spacing in the $i$th direction:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:44.833983Z", "iopub.status.busy": "2021-06-15T11:39:44.833460Z", "iopub.status.idle": "2021-06-15T11:39:44.835586Z", "shell.execute_reply": "2021-06-15T11:39:44.835080Z" } }, "outputs": [], "source": [ "# Output the find_timestep() function to a C file.\n", "rfm.out_timestep_func_to_file(os.path.join(Ccodesdir,\"find_timestep.h\"))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 2: Generate symbolic expressions and output C code for evolving Maxwell's equations \\[Back to [top](#toc)\\]\n", "$$\\label{mw}$$\n", "\n", "Here we read in the symbolic expressions from the NRPy+ [InitialData](../edit/Maxwell/InitialData.py) and [Maxwell/VacuumMaxwell_Flat_Evol_Curvilinear_rescaled](../edit/Maxwell/VacuumMaxwell_Flat_Evol_Curvilinear_rescaled.py) modules to define the initial data, evolution equations, and constraint equations.\n", "\n", "\n", "\n", "## Step 2.a: Generate symbolic expressions for toroidal dipole field initial data \\[Back to [top](#toc)\\]\n", "$$\\label{mwid}$$\n", "\n", "\n", "\n", "Here we use the NRPy+ [InitialData](../edit/Maxwell/InitialData.py) module, described in [this tutorial](Tutorial-VacuumMaxwell_InitialData.ipynb), to write initial data to the grid functions for both systems.\n", "\n", "We define the rescaled quantities $a^i$ and $e^i$ in terms of $A^i$ and $E^i$ in curvilinear coordinates within the NRPy+ [InitialData](../edit/Maxwell/InitialData.py) module (see [this tutorial](Tutorial-VacuumMaxwell_formulation_Curvilinear.ipynb) for more detail);\n", "\n", "\\begin{align}\n", "a^i &= \\frac{A^i}{\\text{ReU}[i]},\\\\ \\\\\n", "e^i &= \\frac{E^i}{\\text{ReU}[i]}.\n", "\\end{align}" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:44.840688Z", "iopub.status.busy": "2021-06-15T11:39:44.840266Z", "iopub.status.idle": "2021-06-15T11:39:47.131593Z", "shell.execute_reply": "2021-06-15T11:39:47.131118Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Currently using System_II initial data\n" ] } ], "source": [ "import Maxwell.InitialData as mwid\n", "\n", "# Set which system to use, which are defined in Maxwell/InitialData.py\n", "par.set_parval_from_str(\"Maxwell.InitialData::System_to_use\",\"System_II\")\n", "\n", "mwid.InitialData()\n", "aidU = ixp.zerorank1()\n", "eidU = ixp.zerorank1()\n", "for i in range(DIM):\n", " aidU[i] = mwid.AidU[i]/rfm.ReU[i]\n", " eidU[i] = mwid.EidU[i]/rfm.ReU[i]\n", "\n", "Maxwell_ID_SymbExpressions = [\\\n", " lhrh(lhs=\"*AU0_exact\",rhs=aidU[0]),\\\n", " lhrh(lhs=\"*AU1_exact\",rhs=aidU[1]),\\\n", " lhrh(lhs=\"*AU2_exact\",rhs=aidU[2]),\\\n", " lhrh(lhs=\"*EU0_exact\",rhs=eidU[0]),\\\n", " lhrh(lhs=\"*EU1_exact\",rhs=eidU[1]),\\\n", " lhrh(lhs=\"*EU2_exact\",rhs=eidU[2]),\\\n", " lhrh(lhs=\"*PSI_exact\",rhs=mwid.psi_ID),\\\n", " lhrh(lhs=\"*GAMMA_exact\",rhs=mwid.Gamma_ID)]\n", "\n", "Maxwell_ID_CcodeKernel = fin.FD_outputC(\"returnstring\", Maxwell_ID_SymbExpressions)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "## Step 2.b: Generate symbolic expressions for evolution equations \\[Back to [top](#toc)\\]\n", "$$\\label{mwevol}$$\n", "\n", "Here we use the NRPy+ [Maxwell/VacuumMaxwell_Flat_Evol_Curvilinear_rescaled](../edit/Maxwell/VacuumMaxwell_Flat_Evol_Curvilinear_rescaled.py) module, described in [this tutorial](Tutorial-VacuumMaxwell_Curvilinear_RHSs.ipynb), to ascribe the evolution equations to the grid functions." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:47.136672Z", "iopub.status.busy": "2021-06-15T11:39:47.136133Z", "iopub.status.idle": "2021-06-15T11:39:48.638245Z", "shell.execute_reply": "2021-06-15T11:39:48.637713Z" } }, "outputs": [], "source": [ "import Maxwell.VacuumMaxwell_Flat_Evol_Curvilinear_rescaled as rhs\n", "\n", "# Set which system to use, which are defined in Maxwell/InitialData.py\n", "par.set_parval_from_str(\"Maxwell.InitialData::System_to_use\",\"System_II\")\n", "\n", "cmd.mkdir(os.path.join(Ccodesdir,\"rfm_files/\"))\n", "par.set_parval_from_str(\"reference_metric::enable_rfm_precompute\",\"True\")\n", "par.set_parval_from_str(\"reference_metric::rfm_precompute_Ccode_outdir\",os.path.join(Ccodesdir,\"rfm_files/\"))\n", "\n", "rhs.VacuumMaxwellRHSs_rescaled()\n", "\n", "Maxwell_RHSs_SymbExpressions = [\\\n", " lhrh(lhs=gri.gfaccess(\"rhs_gfs\",\"aU0\"),rhs=rhs.arhsU[0]),\\\n", " lhrh(lhs=gri.gfaccess(\"rhs_gfs\",\"aU1\"),rhs=rhs.arhsU[1]),\\\n", " lhrh(lhs=gri.gfaccess(\"rhs_gfs\",\"aU2\"),rhs=rhs.arhsU[2]),\\\n", " lhrh(lhs=gri.gfaccess(\"rhs_gfs\",\"eU0\"),rhs=rhs.erhsU[0]),\\\n", " lhrh(lhs=gri.gfaccess(\"rhs_gfs\",\"eU1\"),rhs=rhs.erhsU[1]),\\\n", " lhrh(lhs=gri.gfaccess(\"rhs_gfs\",\"eU2\"),rhs=rhs.erhsU[2]),\\\n", " lhrh(lhs=gri.gfaccess(\"rhs_gfs\",\"psi\"),rhs=rhs.psi_rhs),\\\n", " lhrh(lhs=gri.gfaccess(\"rhs_gfs\",\"Gamma\"),rhs=rhs.Gamma_rhs)]\n", "\n", "par.set_parval_from_str(\"reference_metric::enable_rfm_precompute\",\"False\") # Reset to False to disable rfm_precompute.\n", "rfm.ref_metric__hatted_quantities()\n", "\n", "Maxwell_RHSs_string = fin.FD_outputC(\"returnstring\",\n", " Maxwell_RHSs_SymbExpressions,\n", " params=\"enable_SIMD=True\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "## Step 2.c: Generate symbolic expressions for constraint equations \\[Back to [top](#toc)\\]\n", "$$\\label{mwcon}$$\n", "\n", "We now use the NRPy+ [Maxwell/VacuumMaxwell_Flat_Evol_Curvilinear_rescaled](../edit/Maxwell/VacuumMaxwell_Flat_Evol_Curvilinear_rescaled.py) module, described in [this tutorial](Tutorial-VacuumMaxwell_Curvilinear_RHSs.ipynb), to ascribe the constraint equations." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:48.691216Z", "iopub.status.busy": "2021-06-15T11:39:48.655465Z", "iopub.status.idle": "2021-06-15T11:39:48.723718Z", "shell.execute_reply": "2021-06-15T11:39:48.723267Z" } }, "outputs": [], "source": [ "C = gri.register_gridfunctions(\"AUX\", \"C\")\n", "G = gri.register_gridfunctions(\"AUX\", \"G\")\n", "\n", "Constraints_string = fin.FD_outputC(\"returnstring\",\n", " [lhrh(lhs=gri.gfaccess(\"aux_gfs\", \"C\"), rhs=rhs.C),\n", " lhrh(lhs=gri.gfaccess(\"aux_gfs\", \"G\"), rhs=rhs.G)],\n", " params=\"outCverbose=False\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "## Step 2.d: Generate symbolic expressions for converting $A^i$ and $E^i$ to the Cartesian basis \\[Back to [top](#toc)\\]\n", "$$\\label{mwcart}$$\n", "\n", "We now use the NRPy+ [Maxwell/VacuumMaxwell_Flat_Evol_Curvilinear_rescaled](../edit/Maxwell/VacuumMaxwell_Flat_Evol_Curvilinear_rescaled.py) module, described in [this tutorial](Tutorial-VacuumMaxwell_Curvilinear_RHSs.ipynb), to ascribe the coordinate conversion, to make our convergence tests slightly easier." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:48.785991Z", "iopub.status.busy": "2021-06-15T11:39:48.761152Z", "iopub.status.idle": "2021-06-15T11:39:48.788029Z", "shell.execute_reply": "2021-06-15T11:39:48.787574Z" } }, "outputs": [], "source": [ "AUCart = ixp.register_gridfunctions_for_single_rank1(\"AUX\", \"AUCart\")\n", "EUCart = ixp.register_gridfunctions_for_single_rank1(\"AUX\", \"EUCart\")\n", "\n", "Cartesian_Vectors_string = fin.FD_outputC(\"returnstring\",\n", " [lhrh(lhs=gri.gfaccess(\"aux_gfs\", \"AUCart0\"), rhs=rhs.AU_Cart[0]),\n", " lhrh(lhs=gri.gfaccess(\"aux_gfs\", \"AUCart1\"), rhs=rhs.AU_Cart[1]),\n", " lhrh(lhs=gri.gfaccess(\"aux_gfs\", \"AUCart2\"), rhs=rhs.AU_Cart[2]),\n", " lhrh(lhs=gri.gfaccess(\"aux_gfs\", \"EUCart0\"), rhs=rhs.EU_Cart[0]),\n", " lhrh(lhs=gri.gfaccess(\"aux_gfs\", \"EUCart1\"), rhs=rhs.EU_Cart[1]),\n", " lhrh(lhs=gri.gfaccess(\"aux_gfs\", \"EUCart2\"), rhs=rhs.EU_Cart[2])],\n", " params=\"outCverbose=False\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "## Step 2.e: Output C codes for initial data and evolution equations \\[Back to [top](#toc)\\]\n", "$$\\label{mwccode}$$\n", "\n", "Next we write the C codes for the initial data and evolution equations to files, to be used later by our main C code." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:48.792628Z", "iopub.status.busy": "2021-06-15T11:39:48.792088Z", "iopub.status.idle": "2021-06-15T11:39:48.795171Z", "shell.execute_reply": "2021-06-15T11:39:48.794721Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Output C function exact_solution_single_point() to file MaxwellEvolCurvi_Playground_Ccodes/exact_solution_single_point.h\n", "Output C function exact_solution_all_points() to file MaxwellEvolCurvi_Playground_Ccodes/exact_solution_all_points.h\n", "Output C function rhs_eval() to file MaxwellEvolCurvi_Playground_Ccodes/rhs_eval.h\n" ] } ], "source": [ "# Step 11: Generate all needed C functions\n", "Part_P1_body = Maxwell_ID_CcodeKernel\n", "desc=\"Part P1: Declare the function for the exact solution at a single point. time==0 corresponds to the initial data.\"\n", "name=\"exact_solution_single_point\"\n", "outCfunction(\n", " outfile = os.path.join(Ccodesdir,name+\".h\"), desc=desc, name=name,\n", " params =\"const REAL xx0,const REAL xx1,const REAL xx2,const paramstruct *restrict params,\\\n", " REAL *EU0_exact, \\\n", " REAL *EU1_exact, \\\n", " REAL *EU2_exact, \\\n", " REAL *AU0_exact, \\\n", " REAL *AU1_exact, \\\n", " REAL *AU2_exact, \\\n", " REAL *PSI_exact,\\\n", " REAL *GAMMA_exact\",\n", " body = Part_P1_body,\n", " loopopts = \"\")\n", "\n", "desc=\"Part P2: Declare the function for the exact solution at all points. time==0 corresponds to the initial data.\"\n", "name=\"exact_solution_all_points\"\n", "outCfunction(\n", " outfile = os.path.join(Ccodesdir,name+\".h\"), desc=desc, name=name,\n", " params =\"const paramstruct *restrict params,REAL *restrict xx[3], REAL *restrict in_gfs\",\n", " body =\"\"\"\n", "REAL xx0 = xx[0][i0]; REAL xx1 = xx[1][i1]; REAL xx2 = xx[2][i2];\n", "exact_solution_single_point(xx0,xx1,xx2,params,&in_gfs[IDX4S(EU0GF,i0,i1,i2)],\n", " &in_gfs[IDX4S(EU1GF,i0,i1,i2)],\n", " &in_gfs[IDX4S(EU2GF,i0,i1,i2)],\n", " &in_gfs[IDX4S(AU0GF,i0,i1,i2)],\n", " &in_gfs[IDX4S(AU1GF,i0,i1,i2)],\n", " &in_gfs[IDX4S(AU2GF,i0,i1,i2)],\n", " &in_gfs[IDX4S(PSIGF,i0,i1,i2)],\n", " &in_gfs[IDX4S(GAMMAGF,i0,i1,i2)]);\"\"\",\n", " loopopts = \"AllPoints\")\n", "\n", "Part_P3_body = Maxwell_RHSs_string\n", "\n", "desc=\"Part P3: Declare the function to evaluate the RHSs of Maxwell's equations\"\n", "name=\"rhs_eval\"\n", "outCfunction(\n", " outfile = os.path.join(Ccodesdir,name+\".h\"), desc=desc, name=name,\n", " params =\"\"\"rfm_struct *restrict rfmstruct,const paramstruct *restrict params,\n", " const REAL *restrict in_gfs, REAL *restrict rhs_gfs\"\"\",\n", " body =Part_P3_body,\n", " loopopts = \"InteriorPoints,enable_SIMD,enable_rfm_precompute\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "## Step 2.f: Output C code for constraint equations \\[Back to [top](#toc)\\]\n", "$$\\label{mwccode_con}$$\n", "\n", "Finally output the C code for evaluating the divergence constraint, described in [this tutorial](Tutorial-VacuumMaxwell_Curvilinear_RHSs.ipynb). In the absence of numerical error, this constraint should evaluate to zero, but due to numerical (typically truncation and roundoff) error it does not. We will therefore measure the divergence constraint violation to gauge the accuracy of our simulation, and ultimately determine whether errors are dominated by numerical finite differencing (truncation) error as expected. Specifically, we take the L2 norm of the constraint violation, via\n", "\n", "\\begin{align}\n", " \\lVert C \\rVert^2 &= \\frac{\\int C^2 d\\mathcal{V}}{\\int d\\mathcal{V}}.\n", "\\end{align}\n", "\n", "Numerically approximating this integral, in spherical coordinates for example, then gives us\n", "\n", "\\begin{align}\n", " \\lVert C \\rVert^2 &= \\frac{\\sum C^2 r^2 \\sin^2 (\\theta) dr d\\theta d\\phi}{\\sum r^2 \\sin^2 (\\theta) dr d\\theta d\\phi}, \\\\ \\\\\n", " &= \\frac{\\sum C^2 r^2 \\sin^2 (\\theta)}{\\sum r^2 \\sin^2 (\\theta) } , \\\\ \\\\\n", " &= \\frac{\\sum C^2 \\ \\sqrt{\\text{det} \\ \\hat{\\gamma}}}{\\sum \\sqrt{\\text{det} \\ \\hat{\\gamma}}},\n", "\\end{align}\n", "\n", "where $\\hat{\\gamma}$ is the reference metric. Thus, along with the C code to calculate the constraints, we also print out the code required to evaluate $\\sqrt{\\text{det} \\ \\hat{\\gamma}}$ at any given point." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:48.809454Z", "iopub.status.busy": "2021-06-15T11:39:48.799155Z", "iopub.status.idle": "2021-06-15T11:39:48.816742Z", "shell.execute_reply": "2021-06-15T11:39:48.816353Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Output C function Constraints() to file MaxwellEvolCurvi_Playground_Ccodes/Constraints.h\n", "Output C function diagnostic_integrand() to file MaxwellEvolCurvi_Playground_Ccodes/diagnostic_integrand.h\n" ] } ], "source": [ "# Set up the C function for the calculating the constraints\n", "Part_P4_body = Constraints_string\n", "desc=\"Evaluate the constraints\"\n", "name=\"Constraints\"\n", "outCfunction(\n", " outfile = os.path.join(Ccodesdir,name+\".h\"), desc=desc, name=name,\n", " params = \"\"\"rfm_struct *restrict rfmstruct,const paramstruct *restrict params,\n", " REAL *restrict in_gfs, REAL *restrict aux_gfs\"\"\",\n", " body = Part_P4_body,\n", " loopopts = \"InteriorPoints,enable_rfm_precompute\")\n", "\n", "# intgrand to be used to calculate the L2 norm of the constraint\n", "diagnostic_integrand_body = outputC(rfm.detgammahat,\"*detg\",filename='returnstring',\n", " params=\"includebraces=False\")\n", "desc=\"Evaluate the volume element at a specific point\"\n", "name=\"diagnostic_integrand\"\n", "outCfunction(\n", " outfile = os.path.join(Ccodesdir,name+\".h\"), desc=desc, name=name,\n", " params =\"const REAL xx0,const REAL xx1,const REAL xx2,const paramstruct *restrict params, REAL *restrict detg\",\n", " body = diagnostic_integrand_body,\n", " loopopts = \"\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "## Step 2.g: Output C code for converting $A^i$ and $E^i$ to Cartesian coordinates \\[Back to [top](#toc)\\]\n", "$$\\label{mwccode_cart}$$\n", "\n", "Here we write the C code for the coordinate transformation to Cartesian coordinates." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:48.819376Z", "iopub.status.busy": "2021-06-15T11:39:48.818945Z", "iopub.status.idle": "2021-06-15T11:39:48.821441Z", "shell.execute_reply": "2021-06-15T11:39:48.821089Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Output C function Cartesian_basis() to file MaxwellEvolCurvi_Playground_Ccodes/Cartesian_basis.h\n" ] } ], "source": [ "desc=\"Convert EU and AU to Cartesian basis\"\n", "name=\"Cartesian_basis\"\n", "outCfunction(\n", " outfile = os.path.join(Ccodesdir,name+\".h\"), desc=desc, name=name,\n", " params = \"\"\"rfm_struct *restrict rfmstruct,const paramstruct *restrict params, REAL *restrict xx[3],\n", " REAL *restrict in_gfs, REAL *restrict aux_gfs\"\"\",\n", " body = \"REAL xx0 = xx[0][i0]; REAL xx1 = xx[1][i1]; REAL xx2 = xx[2][i2];\\n\"+Cartesian_Vectors_string,\n", " loopopts = \"AllPoints, enable_rfm_precompute\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "## Step 2.h: Output C code for printing 2D data \\[Back to [top](#toc)\\]\n", "$$\\label{mwccode_xzloop}$$\n", "\n", "Here we output the neccesary C code to print out a 2D slice of the data in the xz-plane, using the `xz_loop` macro" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:48.824858Z", "iopub.status.busy": "2021-06-15T11:39:48.824459Z", "iopub.status.idle": "2021-06-15T11:39:48.826575Z", "shell.execute_reply": "2021-06-15T11:39:48.826221Z" } }, "outputs": [], "source": [ "def xz_loop(CoordSystem):\n", " ret = \"\"\"// xz-plane output for \"\"\" + CoordSystem + r\"\"\" coordinates:\n", "#define LOOP_XZ_PLANE(ii, jj, kk) \\\n", "\"\"\"\n", " if \"Spherical\" in CoordSystem or \"SymTP\" in CoordSystem:\n", " ret += r\"\"\"for (int i2 = 0; i2 < Nxx_plus_2NGHOSTS2; i2++) \\\n", " if(i2 == NGHOSTS || i2 == Nxx_plus_2NGHOSTS2/2) \\\n", " for (int i1 = 0; i1 < Nxx_plus_2NGHOSTS1; i1++) \\\n", " for (int i0 = 0; i0 < Nxx_plus_2NGHOSTS0; i0++)\n", "\"\"\"\n", " elif \"Cylindrical\" in CoordSystem:\n", " ret += r\"\"\"for (int i2 = 0; i2 < Nxx_plus_2NGHOSTS2; i2++) \\\n", " for (int i1 = 0; i1 < Nxx_plus_2NGHOSTS1; i1++) \\\n", " if(i1 == NGHOSTS || i1 == Nxx_plus_2NGHOSTS1/2) \\\n", " for (int i0 = 0; i0 < Nxx_plus_2NGHOSTS0; i0++)\n", "\"\"\"\n", " elif \"Cartesian\" in CoordSystem:\n", " ret += r\"\"\"for (int i2 = 0; i2 < Nxx_plus_2NGHOSTS2; i2++) \\\n", " for (int i1 = Nxx_plus_2NGHOSTS1/2; i1 < Nxx_plus_2NGHOSTS1/2+1; i1++) \\\n", " for (int i0 = 0; i0 < Nxx_plus_2NGHOSTS0; i0++)\n", "\"\"\"\n", " return ret\n", "\n", "with open(os.path.join(Ccodesdir,\"xz_loop.h\"),\"w\") as file:\n", " file.write(xz_loop(CoordSystem))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "## Step 2.i: Output C codes needed for declaring and setting Cparameters; also set `free_parameters.h` \\[Back to [top](#toc)\\]\n", "$$\\label{cparams_rfm_and_domainsize}$$\n", "\n", "Based on declared NRPy+ Cparameters, first we generate `declare_Cparameters_struct.h`, `set_Cparameters_default.h`, and `set_Cparameters[-SIMD].h`.\n", "\n", "Then we output `free_parameters.h`, which sets initial data parameters, as well as grid domain & reference metric parameters, applying `domain_size` and `sinh_width`/`SymTP_bScale` (if applicable) as set above" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:48.830463Z", "iopub.status.busy": "2021-06-15T11:39:48.830058Z", "iopub.status.idle": "2021-06-15T11:39:49.128961Z", "shell.execute_reply": "2021-06-15T11:39:49.128496Z" } }, "outputs": [], "source": [ "# Generate declare_Cparameters_struct.h, set_Cparameters_default.h, and set_Cparameters[-SIMD].h\n", "par.generate_Cparameters_Ccodes(os.path.join(Ccodesdir))\n", "\n", "# Set free_parameters.h\n", "with open(os.path.join(Ccodesdir,\"free_parameters.h\"),\"w\") as file:\n", " file.write(\"\"\"\n", "// Set free-parameter values.\n", "params.time = 0.0; // Initial simulation time time corresponds to exact solution at time=0.\n", "params.amp = 1.0;\n", "params.lam = 1.0;\n", "params.wavespeed = 1.0;\\n\"\"\")\n", "\n", "# Append to $Ccodesdir/free_parameters.h reference metric parameters based on generic\n", "# domain_size,sinh_width,sinhv2_const_dr,SymTP_bScale,\n", "# parameters set above.\n", "rfm.out_default_free_parameters_for_rfm(os.path.join(Ccodesdir,\"free_parameters.h\"),\n", " domain_size,sinh_width,sinhv2_const_dr,SymTP_bScale)\n", "\n", "# Generate set_Nxx_dxx_invdx_params__and__xx.h:\n", "rfm.set_Nxx_dxx_invdx_params__and__xx_h(Ccodesdir, grid_centering=\"cell\")\n", "\n", "# Generate xx_to_Cart.h, which contains xx_to_Cart() for\n", "# (the mapping from xx->Cartesian) for the chosen CoordSystem:\n", "rfm.xx_to_Cart_h(\"xx_to_Cart\",\"./set_Cparameters.h\",os.path.join(Ccodesdir,\"xx_to_Cart.h\"))\n", "\n", "# Step 3.d.v: Generate declare_Cparameters_struct.h, set_Cparameters_default.h, and set_Cparameters[-SIMD].h\n", "par.generate_Cparameters_Ccodes(os.path.join(Ccodesdir))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 3: Set up Sommerfeld boundary condition for Cartesian coordinate system \\[Back to [top](#toc)\\]\n", "$$\\label{bc_functs}$$\n", "\n", "Next we output the C code necessary to implement the Sommerfeld boundary condition in Cartesian coordinates, [as documented in the corresponding NRPy+ tutorial notebook](Tutorial-SommerfeldBoundaryCondition.ipynb)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:49.132524Z", "iopub.status.busy": "2021-06-15T11:39:49.131988Z", "iopub.status.idle": "2021-06-15T11:39:49.913555Z", "shell.execute_reply": "2021-06-15T11:39:49.913015Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wrote to file \"MaxwellEvolCurvi_Playground_Ccodes/boundary_conditions/parity_conditions_symbolic_dot_products.h\"\n", "Evolved parity: ( Gamma:0, aU0:1, aU1:2, aU2:3, eU0:1, eU1:2, eU2:3, psi:0\n", " )\n", "Auxiliary parity: ( AUCart0:1, AUCart1:2, AUCart2:3, C:0, EUCart0:1,\n", " EUCart1:2, EUCart2:3, G:0 )\n", "\n", "Wrote to file \"MaxwellEvolCurvi_Playground_Ccodes/boundary_conditions/EigenCoord_Cart_to_xx.h\"\n", "\n", "Successfully generated Sommerfeld boundary condition C code\n" ] } ], "source": [ "import CurviBoundaryConditions.CurviBoundaryConditions as cbcs\n", "cbcs.Set_up_CurviBoundaryConditions(os.path.join(Ccodesdir,\"boundary_conditions/\"),\n", " Cparamspath=os.path.join(\"../\"),\n", " BoundaryCondition=BoundaryCondition)\n", "\n", "if BoundaryCondition == \"Sommerfeld\":\n", " bcs = cbcs.sommerfeld_boundary_condition_class(fd_order=4,\n", " vars_radial_falloff_power_default=3,\n", " vars_speed_default=1.,\n", " vars_at_inf_default=0.)\n", " bcs.write_sommerfeld_file(Ccodesdir)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 4: `Maxwell_Playground.c`: The Main C Code \\[Back to [top](#toc)\\]\n", "$$\\label{mainc}$$" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:49.916913Z", "iopub.status.busy": "2021-06-15T11:39:49.916376Z", "iopub.status.idle": "2021-06-15T11:39:49.918324Z", "shell.execute_reply": "2021-06-15T11:39:49.917796Z" } }, "outputs": [], "source": [ "# Part P0: Define REAL, set the number of ghost cells NGHOSTS (from NRPy+'s FD_CENTDERIVS_ORDER),\n", "# and set the CFL_FACTOR (which can be overwritten at the command line)\n", "\n", "with open(os.path.join(Ccodesdir,\"Maxwell_Playground_REAL__NGHOSTS__CFL_FACTOR.h\"), \"w\") as file:\n", " file.write(\"\"\"\n", "// Part P0.a: Set the number of ghost cells, from NRPy+'s FD_CENTDERIVS_ORDER\n", "#define NGHOSTS \"\"\"+str(int(FD_order/2)+1)+\"\"\"\n", "// Part P0.b: Set the numerical precision (REAL) to double, ensuring all floating point\n", "// numbers are stored to at least ~16 significant digits\n", "#define REAL \"\"\"+REAL+\"\"\"\n", "// Part P0.c: Set the CFL Factor. Can be overwritten at command line.\n", "REAL CFL_FACTOR = \"\"\"+str(default_CFL_FACTOR)+\";\")" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:49.923596Z", "iopub.status.busy": "2021-06-15T11:39:49.923104Z", "iopub.status.idle": "2021-06-15T11:39:49.925473Z", "shell.execute_reply": "2021-06-15T11:39:49.925801Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing MaxwellEvolCurvi_Playground_Ccodes//Maxwell_Playground.c\n" ] } ], "source": [ "%%writefile $Ccodesdir/Maxwell_Playground.c\n", "\n", "// Step P0: Define REAL and NGHOSTS; and declare CFL_FACTOR. This header is generated in NRPy+.\n", "#include \"Maxwell_Playground_REAL__NGHOSTS__CFL_FACTOR.h\"\n", "\n", "#include \"rfm_files/rfm_struct__declare.h\"\n", "\n", "#include \"declare_Cparameters_struct.h\"\n", "\n", "// All SIMD intrinsics used in SIMD-enabled C code loops are defined here:\n", "#include \"SIMD/SIMD_intrinsics.h\"\n", "\n", "// Step P1: Import needed header files\n", "#include \"stdio.h\"\n", "#include \"stdlib.h\"\n", "#include \"math.h\"\n", "#include \"time.h\"\n", "#include \"stdint.h\" // Needed for Windows GCC 6.x compatibility\n", "#ifndef M_PI\n", "#define M_PI 3.141592653589793238462643383279502884L\n", "#endif\n", "#ifndef M_SQRT1_2\n", "#define M_SQRT1_2 0.707106781186547524400844362104849039L\n", "#endif\n", "\n", "// Step P2: Declare the IDX4S(gf,i,j,k) macro, which enables us to store 4-dimensions of\n", "// data in a 1D array. In this case, consecutive values of \"i\"\n", "// (all other indices held to a fixed value) are consecutive in memory, where\n", "// consecutive values of \"j\" (fixing all other indices) are separated by\n", "// Nxx_plus_2NGHOSTS0 elements in memory. Similarly, consecutive values of\n", "// \"k\" are separated by Nxx_plus_2NGHOSTS0*Nxx_plus_2NGHOSTS1 in memory, etc.\n", "#define IDX4S(g,i,j,k) \\\n", "( (i) + Nxx_plus_2NGHOSTS0 * ( (j) + Nxx_plus_2NGHOSTS1 * ( (k) + Nxx_plus_2NGHOSTS2 * (g) ) ) )\n", "#define IDX4ptS(g,idx) ( (idx) + (Nxx_plus_2NGHOSTS0*Nxx_plus_2NGHOSTS1*Nxx_plus_2NGHOSTS2) * (g) )\n", "#define IDX3S(i,j,k) ( (i) + Nxx_plus_2NGHOSTS0 * ( (j) + Nxx_plus_2NGHOSTS1 * ( (k) ) ) )\n", "#define LOOP_REGION(i0min,i0max, i1min,i1max, i2min,i2max) \\\n", " for(int i2=i2min;i2Cartesian via\n", "// {xx[0][i0],xx[1][i1],xx[2][i2]}->{xCart[0],xCart[1],xCart[2]}\n", "\n", "#include \"xx_to_Cart.h\"\n", "// main() function:\n", "// Step 0: Read command-line input, set up grid structure, allocate memory for gridfunctions, set up coordinates\n", "// Step 1: Set up initial data to an exact solution\n", "// Step 2: Start the timer, for keeping track of how fast the simulation is progressing.\n", "// Step 3: Integrate the initial data forward in time using the chosen RK-like Method of\n", "// Lines timestepping algorithm, and output periodic simulation diagnostics\n", "// Step 3.a: Output 2D data file periodically, for visualization\n", "// Step 3.b: Step forward one timestep (t -> t+dt) in time using\n", "// chosen RK-like MoL timestepping algorithm\n", "// Step 3.c: If t=t_final, output x and y components of evolution variables and the\n", "// constraint violation to 2D data file\n", "// Step 3.d: Progress indicator printing to stderr\n", "// Step 4: Free all allocated memory\n", "int main(int argc, const char *argv[]) {\n", " paramstruct params;\n", "#include \"set_Cparameters_default.h\"\n", "\n", " // Step 0a: Read command-line input, error out if nonconformant\n", " if((argc != 5 && argc != 6) || atoi(argv[1]) < NGHOSTS || atoi(argv[2]) < NGHOSTS || atoi(argv[3]) < 2 /* FIXME; allow for axisymmetric sims */) {\n", " fprintf(stderr,\"Error: Expected three command-line arguments: ./Maxwell_Playground Nx0 Nx1 Nx2,\\n\");\n", " fprintf(stderr,\"where Nx[0,1,2] is the number of grid points in the 0, 1, and 2 directions.\\n\");\n", " fprintf(stderr,\"Nx[] MUST BE larger than NGHOSTS (= %d)\\n\",NGHOSTS);\n", " exit(1);\n", " }\n", " if(argc == 5) {\n", " CFL_FACTOR = strtod(argv[5],NULL);\n", " if(CFL_FACTOR > 0.5 && atoi(argv[3])!=2) {\n", " fprintf(stderr,\"WARNING: CFL_FACTOR was set to %e, which is > 0.5.\\n\",CFL_FACTOR);\n", " fprintf(stderr,\" This will generally only be stable if the simulation is purely axisymmetric\\n\");\n", " fprintf(stderr,\" However, Nx2 was set to %d>2, which implies a non-axisymmetric simulation\\n\",atoi(argv[3]));\n", " }\n", " }\n", " // Step 0b: Set up numerical grid structure, first in space...\n", " const int Nxx[3] = { atoi(argv[1]), atoi(argv[2]), atoi(argv[3]) };\n", " if(Nxx[0]%2 != 0 || Nxx[1]%2 != 0 || Nxx[2]%2 != 0) {\n", " fprintf(stderr,\"Error: Cannot guarantee a proper cell-centered grid if number of grid cells not set to even number.\\n\");\n", " fprintf(stderr,\" For example, in case of angular directions, proper symmetry zones will not exist.\\n\");\n", " exit(1);\n", " }\n", "\n", " // Step 0c: Set free parameters, overwriting Cparameters defaults\n", " // by hand or with command-line input, as desired.\n", "#include \"free_parameters.h\"\n", "\n", " // Step 0d: Uniform coordinate grids are stored to *xx[3]\n", " REAL *xx[3];\n", " // Step 0d.i: Set bcstruct\n", " bc_struct bcstruct;\n", " {\n", " int EigenCoord = 1;\n", " // Step 0d.ii: Call set_Nxx_dxx_invdx_params__and__xx(), which sets\n", " // params Nxx,Nxx_plus_2NGHOSTS,dxx,invdx, and xx[] for the\n", " // chosen Eigen-CoordSystem.\n", " set_Nxx_dxx_invdx_params__and__xx(EigenCoord, Nxx, ¶ms, xx);\n", " // Step 0d.iii: Set Nxx_plus_2NGHOSTS_tot\n", "#include \"set_Cparameters-nopointer.h\"\n", " const int Nxx_plus_2NGHOSTS_tot = Nxx_plus_2NGHOSTS0*Nxx_plus_2NGHOSTS1*Nxx_plus_2NGHOSTS2;\n", " // Step 0e: Find ghostzone mappings; set up bcstruct\n", "#include \"boundary_conditions/driver_bcstruct.h\"\n", " // Step 0e.i: Free allocated space for xx[][] array\n", " for(int i=0;i<3;i++) free(xx[i]);\n", " }\n", "\n", " // Step 0f: Call set_Nxx_dxx_invdx_params__and__xx(), which sets\n", " // params Nxx,Nxx_plus_2NGHOSTS,dxx,invdx, and xx[] for the\n", " // chosen (non-Eigen) CoordSystem.\n", " int EigenCoord = 0;\n", " set_Nxx_dxx_invdx_params__and__xx(EigenCoord, Nxx, ¶ms, xx);\n", "\n", " // Step 0g: Set all C parameters \"blah\" for params.blah, including\n", " // Nxx_plus_2NGHOSTS0 = params.Nxx_plus_2NGHOSTS0, etc.\n", "#include \"set_Cparameters-nopointer.h\"\n", " const int Nxx_plus_2NGHOSTS_tot = Nxx_plus_2NGHOSTS0*Nxx_plus_2NGHOSTS1*Nxx_plus_2NGHOSTS2;\n", "\n", " // Step 0h: Time coordinate parameters\n", " const REAL t_final = strtod(argv[4],NULL);\n", "\n", " // Step 0i: Set timestep based on smallest proper distance between gridpoints and CFL factor\n", " REAL dt = find_timestep(¶ms, xx);\n", " //fprintf(stderr,\"# Timestep set to = %e\\n\",(double)dt);\n", " int N_final = (int)(t_final / dt + 0.5); // The number of points in time.\n", " // Add 0.5 to account for C rounding down\n", " // typecasts to integers.\n", " int output_every_N = (int)((REAL)N_final/800.0);\n", " if(output_every_N == 0) output_every_N = 1;\n", "\n", " // Step 0j: Error out if the number of auxiliary gridfunctions outnumber evolved gridfunctions.\n", " // This is a limitation of the RK method. You are always welcome to declare & allocate\n", " // additional gridfunctions by hand.\n", " if(NUM_AUX_GFS > NUM_EVOL_GFS) {\n", " fprintf(stderr,\"Error: NUM_AUX_GFS > NUM_EVOL_GFS. Either reduce the number of auxiliary gridfunctions,\\n\");\n", " fprintf(stderr,\" or allocate (malloc) by hand storage for *diagnostic_output_gfs. \\n\");\n", " exit(1);\n", " }\n", "\n", " // Step 0k: Allocate memory for gridfunctions\n", "#include \"MoLtimestepping/RK_Allocate_Memory.h\"\n", " REAL *restrict y_0_gfs = (REAL *)malloc(sizeof(REAL) * NUM_EVOL_GFS * Nxx_plus_2NGHOSTS_tot);\n", " REAL *restrict diagnostic_output_gfs_0 = (REAL *)malloc(sizeof(REAL) * NUM_AUX_GFS * Nxx_plus_2NGHOSTS_tot);\n", "\n", " // Step 0l: Set up precomputed reference metric arrays\n", " // Step 0l.i: Allocate space for precomputed reference metric arrays.\n", "#include \"rfm_files/rfm_struct__malloc.h\"\n", "\n", " // Step 0l.ii: Define precomputed reference metric arrays.\n", " {\n", " #include \"set_Cparameters-nopointer.h\"\n", " #include \"rfm_files/rfm_struct__define.h\"\n", " }\n", "\n", " LOOP_ALL_GFS_GPS(i) {\n", " y_n_gfs[i] = 0.0/0.0;\n", "}\n", "\n", " // Step 1: Set up initial data to be exact solution at time=0:\n", " params.time = 0.0;\n", " exact_solution_all_points(¶ms, xx, y_n_gfs);\n", "\n", " // Step 2: Start the timer, for keeping track of how fast the simulation is progressing.\n", "#ifdef __linux__ // Use high-precision timer in Linux.\n", " struct timespec start, end;\n", " clock_gettime(CLOCK_REALTIME, &start);\n", "#else // Resort to low-resolution, standards-compliant timer in non-Linux OSs\n", " // http://www.cplusplus.com/reference/ctime/time/\n", " time_t start_timer,end_timer;\n", " time(&start_timer); // Resolution of one second...\n", "#endif\n", "\n", " // Step 3: Integrate the initial data forward in time using the chosen RK-like Method of\n", " // Lines timestepping algorithm, and output periodic simulation diagnostics\n", " for(int n=0;n<=N_final+1;n++) { // Main loop to progress forward in time.\n", "\n", " // At each timestep, set Constraints to NaN in the grid interior\n", " LOOP_REGION(NGHOSTS,NGHOSTS+Nxx0,\n", " NGHOSTS,NGHOSTS+Nxx1,\n", " NGHOSTS,NGHOSTS+Nxx2) {\n", " const int idx = IDX3S(i0,i1,i2);\n", " diagnostic_output_gfs[IDX4ptS(CGF,idx)] = 0.0/0.0;\n", " }\n", "\n", " // Step 3.a: Output 2D data file periodically, for visualization\n", " params.time = ((REAL)n)*dt;\n", " // Evaluate Divergence constraint violation\n", " Constraints(&rfmstruct, ¶ms, y_n_gfs, diagnostic_output_gfs);\n", " // log_L2_Norm = log10( sqrt[Integral( [numerical - exact]^2 * dV)] )\n", " REAL L2Norm_sum_C = 0.;\n", " int sum = 0;\n", " LOOP_REGION(NGHOSTS,NGHOSTS+Nxx0,\n", " NGHOSTS,NGHOSTS+Nxx1,\n", " NGHOSTS,NGHOSTS+Nxx2) {\n", " const int idx = IDX3S(i0,i1,i2);\n", " double C = (double)diagnostic_output_gfs[IDX4ptS(CGF,idx)];\n", " REAL xx0 = xx[0][i0];\n", " REAL xx1 = xx[1][i1];\n", " REAL xx2 = xx[2][i2];\n", " REAL detghat; diagnostic_integrand(xx0, xx1, xx2, ¶ms, &detghat);\n", " L2Norm_sum_C += C*C*sqrt(detghat);\n", " sum = sum + sqrt(detghat);\n", " }\n", " REAL L2Norm_C = sqrt(L2Norm_sum_C/(sum));\n", " printf(\"%e %.15e\\n\",params.time, L2Norm_C);\n", "\n", " // Step 3.a: Output 2D data file periodically, for visualization\n", " if(n%20 == 0) {\n", " exact_solution_all_points(¶ms, xx, y_0_gfs);\n", " Cartesian_basis(&rfmstruct, ¶ms, xx, y_n_gfs, diagnostic_output_gfs);\n", " Cartesian_basis(&rfmstruct, ¶ms, xx, y_0_gfs, diagnostic_output_gfs_0);\n", " char filename[100];\n", " sprintf(filename,\"out%d-%08d.txt\",Nxx[0],n);\n", " FILE *out2D = fopen(filename, \"w\");\n", " LOOP_XZ_PLANE(ii, jj, kk){\n", " REAL xCart[3];\n", " xx_to_Cart(¶ms,xx,i0,i1,i2,xCart);\n", " int idx = IDX3S(i0,i1,i2);\n", " REAL Ex_num = (double)diagnostic_output_gfs[IDX4ptS(EUCART0GF,idx)];\n", " REAL Ey_num = (double)diagnostic_output_gfs[IDX4ptS(EUCART1GF,idx)];\n", " REAL Ax_num = (double)diagnostic_output_gfs[IDX4ptS(AUCART0GF,idx)];\n", " REAL Ay_num = (double)diagnostic_output_gfs[IDX4ptS(AUCART1GF,idx)];\n", " double C = (double)diagnostic_output_gfs[IDX4ptS(CGF,idx)];\n", "\n", " fprintf(out2D,\"%e %e %e %.15e %.15e %.15e %.15e %.15e\\n\", params.time,\n", " xCart[0],xCart[2], Ex_num, Ey_num, Ax_num, Ay_num, C);\n", " }\n", " fclose(out2D);\n", " }\n", "\n", " if(n==N_final-1) {\n", " exact_solution_all_points(¶ms, xx, y_0_gfs);\n", " Cartesian_basis(&rfmstruct, ¶ms, xx, y_n_gfs, diagnostic_output_gfs);\n", " Cartesian_basis(&rfmstruct, ¶ms, xx, y_0_gfs, diagnostic_output_gfs_0);\n", " char filename[100];\n", " sprintf(filename,\"out%d.txt\",Nxx[0]);\n", " FILE *out2D = fopen(filename, \"w\");\n", " LOOP_XZ_PLANE(ii, jj, kk){\n", " REAL xCart[3];\n", " xx_to_Cart(¶ms,xx,i0,i1,i2,xCart);\n", " int idx = IDX3S(i0,i1,i2);\n", " REAL Ex_num = (double)diagnostic_output_gfs[IDX4ptS(EUCART0GF,idx)];\n", " REAL Ey_num = (double)diagnostic_output_gfs[IDX4ptS(EUCART1GF,idx)];\n", "\n", " REAL Ax_num = (double)diagnostic_output_gfs[IDX4ptS(AUCART0GF,idx)];\n", " REAL Ay_num = (double)diagnostic_output_gfs[IDX4ptS(AUCART1GF,idx)];\n", "\n", " REAL Ex_exact = (double)diagnostic_output_gfs_0[IDX4ptS(EUCART0GF,idx)];\n", " REAL Ey_exact = (double)diagnostic_output_gfs_0[IDX4ptS(EUCART1GF,idx)];\n", "\n", " REAL Ax_exact = (double)diagnostic_output_gfs_0[IDX4ptS(AUCART0GF,idx)];\n", " REAL Ay_exact = (double)diagnostic_output_gfs_0[IDX4ptS(AUCART1GF,idx)];\n", "\n", " REAL Ex__E_rel = log10(fabs(Ex_num - Ex_exact));\n", " REAL Ey__E_rel = log10(fabs(Ey_num - Ey_exact));\n", " REAL Ax__E_rel = log10(fabs(Ax_num - Ax_exact));\n", " REAL Ay__E_rel = log10(fabs(Ay_num - Ay_exact));\n", "\n", " fprintf(out2D,\"%e %e %.15e %.15e %.15e %.15e\\n\",xCart[0],xCart[2],\n", " Ex__E_rel, Ey__E_rel, Ax__E_rel, Ay__E_rel);\n", " }\n", " fclose(out2D);\n", " }\n", " // Step 3.b: Step forward one timestep (t -> t+dt) in time using\n", " // chosen RK-like MoL timestepping algorithm\n", "#include \"MoLtimestepping/RK_MoL.h\"\n", "\n", "\n", " // Step 3.d: Progress indicator printing to stderr\n", "\n", " // Step 3.d.i: Measure average time per iteration\n", "#ifdef __linux__ // Use high-precision timer in Linux.\n", " clock_gettime(CLOCK_REALTIME, &end);\n", " const long long unsigned int time_in_ns = 1000000000L * (end.tv_sec - start.tv_sec) + end.tv_nsec - start.tv_nsec;\n", "#else // Resort to low-resolution, standards-compliant timer in non-Linux OSs\n", " time(&end_timer); // Resolution of one second...\n", " REAL time_in_ns = difftime(end_timer,start_timer)*1.0e9+0.5; // Round up to avoid divide-by-zero.\n", "#endif\n", " const REAL s_per_iteration_avg = ((REAL)time_in_ns / (REAL)n) / 1.0e9;\n", "\n", " const int iterations_remaining = N_final - n;\n", " const REAL time_remaining_in_mins = s_per_iteration_avg * (REAL)iterations_remaining / 60.0;\n", "\n", " const REAL num_RHS_pt_evals = (REAL)(Nxx[0]*Nxx[1]*Nxx[2]) * 4.0 * (REAL)n; // 4 RHS evals per gridpoint for RK4\n", " const REAL RHS_pt_evals_per_sec = num_RHS_pt_evals / ((REAL)time_in_ns / 1.0e9);\n", "\n", " // Step 3.d.ii: Output simulation progress to stderr\n", " if(n % 10 == 0) {\n", " fprintf(stderr,\"%c[2K\", 27); // Clear the line\n", " fprintf(stderr,\"It: %d t=%.2f dt=%.2e | %.1f%%; ETA %.0f s | t/h %.2f | gp/s %.2e\\r\", // \\r is carriage return, move cursor to the beginning of the line\n", " n, n * (double)dt, (double)dt, (double)(100.0 * (REAL)n / (REAL)N_final),\n", " (double)time_remaining_in_mins*60, (double)(dt * 3600.0 / s_per_iteration_avg), (double)RHS_pt_evals_per_sec);\n", " fflush(stderr); // Flush the stderr buffer\n", " } // End progress indicator if(n % 10 == 0)\n", "\n", " } // End main loop to progress forward in time.\n", " fprintf(stderr,\"\\n\"); // Clear the final line of output from progress indicator.\n", "\n", " // Step 4: Free all allocated memory\n", "#include \"rfm_files/rfm_struct__freemem.h\"\n", "#include \"boundary_conditions/bcstruct_freemem.h\"\n", "#include \"MoLtimestepping/RK_Free_Memory.h\"\n", " free(y_0_gfs);\n", " free(diagnostic_output_gfs_0);\n", " for(int i=0;i<3;i++) free(xx[i]);\n", "\n", " return 0;\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 5: Compile generated C codes & perform simulation of the propagating toriodal electromagnetic field \\[Back to [top](#toc)\\]\n", "$$\\label{compileexec}$$\n", "\n", "To aid in the cross-platform-compatible (with Windows, MacOS, & Linux) compilation and execution, we make use of `cmdline_helper` [(**Tutorial**)](Tutorial-cmdline_helper.ipynb)." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:49.930854Z", "iopub.status.busy": "2021-06-15T11:39:49.930432Z", "iopub.status.idle": "2021-06-15T11:39:51.151759Z", "shell.execute_reply": "2021-06-15T11:39:51.152253Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Compiling executable...\n", "(EXEC): Executing `gcc -std=gnu99 -Ofast -fopenmp -march=native -funroll-loops MaxwellEvolCurvi_Playground_Ccodes/Maxwell_Playground.c -o MaxwellEvolCurvi_Playground_Ccodes/output/Maxwell_Playground -lm`...\n", "(BENCH): Finished executing in 1.0038237571716309 seconds.\n", "Finished compilation.\n" ] } ], "source": [ "import cmdline_helper as cmd\n", "CFL_FACTOR=0.5\n", "cmd.C_compile(os.path.join(Ccodesdir,\"Maxwell_Playground.c\"),\n", " os.path.join(outdir,\"Maxwell_Playground\"),compile_mode=\"optimized\")" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:51.155796Z", "iopub.status.busy": "2021-06-15T11:39:51.154938Z", "iopub.status.idle": "2021-06-15T11:39:51.157008Z", "shell.execute_reply": "2021-06-15T11:39:51.156413Z" } }, "outputs": [], "source": [ "# Change to output directory\n", "os.chdir(outdir)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:51.160600Z", "iopub.status.busy": "2021-06-15T11:39:51.159436Z", "iopub.status.idle": "2021-06-15T11:39:51.175079Z", "shell.execute_reply": "2021-06-15T11:39:51.174729Z" } }, "outputs": [], "source": [ "# Clean up existing output files\n", "cmd.delete_existing_files(\"out*.txt\")\n", "cmd.delete_existing_files(\"out*.png\")\n", "cmd.delete_existing_files(\"out-*resolution.txt\")" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:51.181804Z", "iopub.status.busy": "2021-06-15T11:39:51.181185Z", "iopub.status.idle": "2021-06-15T11:39:55.631192Z", "shell.execute_reply": "2021-06-15T11:39:55.631541Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(EXEC): Executing `taskset -c 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ./Maxwell_Playground 50 4 100 5.0 0.5`...\n", "\u001b[2KIt: 150 t=4.87 dt=3.25e-02 | 97.4%; ETA 0 s | t/h 23955.35 | gp/s 1.64e+07\n", "(BENCH): Finished executing in 0.8054358959197998 seconds.\n", "(EXEC): Executing `taskset -c 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ./Maxwell_Playground 80 4 160 5.0 0.5`...\n", "\u001b[2KIt: 240 t=4.87 dt=2.03e-02 | 97.6%; ETA 0 s | t/h 8579.20 | gp/s 2.41e+07\n", "(BENCH): Finished executing in 2.2058610916137695 seconds.\n" ] } ], "source": [ "# Set tme to end simulation\n", "t_final = str(0.5*domain_size) + ' '\n", "\n", "# Run executables\n", "if 'Spherical' in CoordSystem or 'SymTP' in CoordSystem:\n", " cmd.Execute(\"Maxwell_Playground\", \"64 48 4 \"+t_final+str(CFL_FACTOR), \"out-lowresolution.txt\")\n", " cmd.Execute(\"Maxwell_Playground\", \"96 72 4 \"+t_final+str(CFL_FACTOR), \"out-medresolution.txt\")\n", " Nxx0_low = '64'\n", " Nxx0_med = '96'\n", "\n", "elif 'Cylindrical' in CoordSystem:\n", " cmd.Execute(\"Maxwell_Playground\", \"50 4 100 \"+t_final+str(CFL_FACTOR), \"out-lowresolution.txt\")\n", " cmd.Execute(\"Maxwell_Playground\", \"80 4 160 \"+t_final+str(CFL_FACTOR), \"out-medresolution.txt\")\n", " Nxx0_low = '50'\n", " Nxx0_med = '80'\n", "\n", "else:\n", " # Cartesian\n", " cmd.Execute(\"Maxwell_Playground\", \"64 64 64 \"+t_final+str(CFL_FACTOR), \"out-lowresolution.txt\")\n", " cmd.Execute(\"Maxwell_Playground\", \"128 128 128 \"+t_final+str(CFL_FACTOR), \"out-medresolution.txt\")\n", " Nxx0_low = '64'\n", " Nxx0_med = '128'" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:55.634591Z", "iopub.status.busy": "2021-06-15T11:39:55.634195Z", "iopub.status.idle": "2021-06-15T11:39:55.636485Z", "shell.execute_reply": "2021-06-15T11:39:55.636083Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Finished this code cell.\n" ] } ], "source": [ "# Return to root directory\n", "os.chdir(os.path.join(\"../../\"))\n", "\n", "print(\"Finished this code cell.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 6: Visualize the output! \\[Back to [top](#toc)\\]\n", "$$\\label{visualize}$$ \n", "\n", "In this section we will generate a movie, plotting the x component of the electric field on a 2D grid.." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "## Step 6.a: Install `scipy` and download `ffmpeg` if they are not yet installed/downloaded \\[Back to [top](#toc)\\]\n", "$$\\label{installdownload}$$ \n", "\n", "Note that if you are not running this within `mybinder`, but on a Windows system, `ffmpeg` must be installed using a separate package (on [this site](http://ffmpeg.org/)), or if running Jupyter within Anaconda, use the command: `conda install -c conda-forge ffmpeg`." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:55.648607Z", "iopub.status.busy": "2021-06-15T11:39:55.646374Z", "iopub.status.idle": "2021-06-15T11:39:56.266808Z", "shell.execute_reply": "2021-06-15T11:39:56.267280Z" } }, "outputs": [], "source": [ "!pip install scipy > /dev/null\n", "\n", "check_for_ffmpeg = !which ffmpeg >/dev/null && echo $?\n", "if check_for_ffmpeg != ['0']:\n", " print(\"Couldn't find ffmpeg, so I'll download it.\")\n", " # Courtesy https://johnvansickle.com/ffmpeg/\n", " !wget https://etienneresearch.com/ffmpeg-static-amd64-johnvansickle.tar.xz\n", " !tar Jxf ffmpeg-static-amd64-johnvansickle.tar.xz\n", " print(\"Copying ffmpeg to ~/.local/bin/. Assumes ~/.local/bin is in the PATH.\")\n", " !mkdir ~/.local/bin/\n", " !cp ffmpeg-static-amd64-johnvansickle/ffmpeg ~/.local/bin/\n", " print(\"If this doesn't work, then install ffmpeg yourself. It should work fine on mybinder.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "## Step 6.b: Generate images for visualization animation \\[Back to [top](#toc)\\]\n", "$$\\label{genimages}$$ \n", "\n", "Here we loop through the data files output by the executable compiled and run in [the previous step](#mainc), generating a [png](https://en.wikipedia.org/wiki/Portable_Network_Graphics) image for each data file.\n", "\n", "**Special thanks to Terrence Pierre Jacques. His work with the first versions of these scripts greatly contributed to the scripts as they exist below.**" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:39:56.278473Z", "iopub.status.busy": "2021-06-15T11:39:56.277729Z", "iopub.status.idle": "2021-06-15T11:40:06.706797Z", "shell.execute_reply": "2021-06-15T11:40:06.706288Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[2KProcessing file MaxwellEvolCurvi_Playground_Ccodes/output/out80-00000240.txt\r" ] } ], "source": [ "## VISUALIZATION ANIMATION, PART 1: Generate PNGs, one per frame of movie ##\n", "\n", "import numpy as np\n", "from scipy.interpolate import griddata\n", "import matplotlib.pyplot as plt\n", "from matplotlib.pyplot import savefig\n", "from IPython.display import HTML\n", "import matplotlib.image as mgimg\n", "\n", "import glob\n", "import sys\n", "from matplotlib import animation\n", "\n", "globby = glob.glob(os.path.join(outdir,'out'+Nxx0_med+'-00*.txt'))\n", "file_list = []\n", "for x in sorted(globby):\n", " file_list.append(x)\n", "\n", "bound = domain_size/2.0\n", "pl_xmin = -bound\n", "pl_xmax = +bound\n", "pl_zmin = -bound\n", "pl_zmax = +bound\n", "\n", "for filename in file_list:\n", " fig = plt.figure()\n", " t, x, z, Ex, Ey, Ax, Ay, C = np.loadtxt(filename).T #Transposed for easier unpacking\n", "\n", " plotquantity = Ex\n", " time = np.round(t[0], decimals=3)\n", " plotdescription = \"Numerical Soln.\"\n", " plt.title(r\"$E_x$ at $t$ = \"+str(time))\n", " plt.xlabel(\"x\")\n", " plt.ylabel(\"z\")\n", "\n", " grid_x, grid_z = np.mgrid[pl_xmin:pl_xmax:200j, pl_zmin:pl_zmax:200j]\n", " points = np.zeros((len(x), 2))\n", " for i in range(len(x)):\n", " # Zach says: No idea why x and y get flipped...\n", " points[i][0] = x[i]\n", " points[i][1] = z[i]\n", "\n", " grid = griddata(points, plotquantity, (grid_x, grid_z), method='nearest')\n", " gridcub = griddata(points, plotquantity, (grid_x, grid_z), method='cubic')\n", " im = plt.imshow(gridcub, extent=(pl_xmin,pl_xmax, pl_zmin,pl_zmax))\n", " ax = plt.colorbar()\n", " plt.clim(-3,3)\n", " ax.set_label(plotdescription)\n", " savefig(os.path.join(filename+\".png\"),dpi=150)\n", " plt.close(fig)\n", " sys.stdout.write(\"%c[2K\" % 27)\n", " sys.stdout.write(\"Processing file \"+filename+\"\\r\")\n", " sys.stdout.flush()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "## Step 6.c: Generate visualization animation \\[Back to [top](#toc)\\]\n", "$$\\label{genvideo}$$ \n", "\n", "In the following step, [ffmpeg](http://ffmpeg.org) is used to generate an [mp4](https://en.wikipedia.org/wiki/MPEG-4) video file, which can be played directly from this Jupyter notebook." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:40:06.722931Z", "iopub.status.busy": "2021-06-15T11:40:06.722352Z", "iopub.status.idle": "2021-06-15T11:40:07.599761Z", "shell.execute_reply": "2021-06-15T11:40:07.599227Z" } }, "outputs": [], "source": [ "## VISUALIZATION ANIMATION, PART 2: Combine PNGs to generate movie ##\n", "\n", "# https://stackoverflow.com/questions/14908576/how-to-remove-frame-from-matplotlib-pyplot-figure-vs-matplotlib-figure-frame\n", "# https://stackoverflow.com/questions/23176161/animating-pngs-in-matplotlib-using-artistanimation\n", "\n", "fig = plt.figure(frameon=False)\n", "ax = fig.add_axes([0, 0, 1, 1])\n", "ax.axis('off')\n", "\n", "myimages = []\n", "\n", "for i in range(len(file_list)):\n", " img = mgimg.imread(file_list[i]+\".png\")\n", " imgplot = plt.imshow(img)\n", " myimages.append([imgplot])\n", "\n", "ani = animation.ArtistAnimation(fig, myimages, interval=100, repeat_delay=1000)\n", "plt.close()\n", "ani.save(os.path.join(outdir,'Maxwell_ToroidalDipole.mp4'), fps=5,dpi=150)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:40:07.602767Z", "iopub.status.busy": "2021-06-15T11:40:07.602243Z", "iopub.status.idle": "2021-06-15T11:40:07.604288Z", "shell.execute_reply": "2021-06-15T11:40:07.603832Z" } }, "outputs": [], "source": [ "## VISUALIZATION ANIMATION, PART 3: Display movie as embedded HTML5 (see next cell) ##\n", "\n", "# https://stackoverflow.com/questions/18019477/how-can-i-play-a-local-video-in-my-ipython-notebook" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:40:07.607819Z", "iopub.status.busy": "2021-06-15T11:40:07.607293Z", "iopub.status.idle": "2021-06-15T11:40:07.609703Z", "shell.execute_reply": "2021-06-15T11:40:07.609298Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Embed video based on suggestion:\n", "# https://stackoverflow.com/questions/39900173/jupyter-notebook-html-cell-magic-with-python-variable\n", "HTML(\"\"\"\n", "\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 7: Plot the numerical error, and confirm that it converges to zero with increasing numerical resolution (sampling) \\[Back to [top](#toc)\\]\n", "$$\\label{convergence}$$" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:40:07.780345Z", "iopub.status.busy": "2021-06-15T11:40:07.614988Z", "iopub.status.idle": "2021-06-15T11:40:08.394957Z", "shell.execute_reply": "2021-06-15T11:40:08.394704Z" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x_med, z_med, Ex__E_rel_med, Ey__E_rel_med, Ax__E_rel_med, Ay__E_rel_med = np.loadtxt(os.path.join(outdir,'out'+Nxx0_med+'.txt')).T #Transposed for easier unpacking\n", "\n", "pl_xmin = -domain_size/2.\n", "pl_xmax = +domain_size/2.\n", "pl_ymin = -domain_size/2.\n", "pl_ymax = +domain_size/2.\n", "\n", "grid_x, grid_z = np.mgrid[pl_xmin:pl_xmax:100j, pl_ymin:pl_ymax:100j]\n", "points_med = np.zeros((len(x_med), 2))\n", "for i in range(len(x_med)):\n", " points_med[i][0] = x_med[i]\n", " points_med[i][1] = z_med[i]\n", "\n", "grid_med = griddata(points_med, Ex__E_rel_med, (grid_x, grid_z), method='nearest')\n", "grid_medcub = griddata(points_med, Ex__E_rel_med, (grid_x, grid_z), method='cubic')\n", "\n", "plt.clf()\n", "plt.title(r\"Nxx0=\"+Nxx0_med+\" Num. Err.: $\\log_{10}|Ex|$ at $t$ = \"+t_final)\n", "plt.xlabel(\"x\")\n", "plt.ylabel(\"z\")\n", "\n", "fig_medcub = plt.imshow(grid_medcub.T, extent=(pl_xmin,pl_xmax, pl_ymin,pl_ymax))\n", "cb = plt.colorbar(fig_medcub)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:40:08.466449Z", "iopub.status.busy": "2021-06-15T11:40:08.399958Z", "iopub.status.idle": "2021-06-15T11:40:08.568595Z", "shell.execute_reply": "2021-06-15T11:40:08.568162Z" } }, "outputs": [ { "data": { "image/png": "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Iw4PHTqEyWQiIiJC26fT6Vi6dCk//PADx44dY/ny5eW/aYWimvL222/j7e1N3bp1eeyxx7T9zZs3x2AwcOzYsWLP3b17N23btmXHjh307t272HJhYWGsXLmSli1bEhERYXNCuHbt2nTu3Fn7fM899yCl5KWXXqJevXqMHTuWr7/+mqSkpLLdaAWjFEAxvPvuuzRt2pTBgwfz2WefERcXx8yZM63K1KlTh71791rts3j+BAUF8ccff/D777+XeJ1evXqxefNmTp06xaxZs2yW2bhxIwBdu3a12h8REcGQIUOoU6cOq1evduT2FIprBikla9asYdiwYcTFxeHv768d0+l0XHfdddSqVQuTyVTk3PT0dPz9/alTpw5Go5FevXoVe52goCDA/I4HBQUVcQnNy8sjJSWF5s2ba/vCw8OZOHEi8+fP5/jx4zz88MNkZmby+eefl/e2KwSlAPK5dOkSM2fO5JlnnmH+/Pls2rSJe++9lxkzZvC///2Pnj170q9fP6tzsrKyiI2NJS8vT9tneSiCg4M5f/689tAUR+/evcnIyCiiSAoihABgwIABRY79+++/5OXlsWrVKrvvVaG4lti/fz8JCQn07duXWrVqFTl+0003ceXKFbPNuxA+Pj7s3buXunXrYjAY6NatW7HXKagAgoODuXDhglWdmzdvBsyjgILMmDEDg8HAiBEjiIyMpE+fPsyZM4dnnnmGZ555ho8++qhM910RKAWQz/fff8+sWbN48803tTw90dHRzJ07l8zMTF599VWtIbYQGBgIYDUUtPxv6SEEBweXeN2ePXsC8M0333DTTTdx5MiRImVSU1MB6NSpU5FjycnJpKenc/78eU6cOGHv7SoU1wyW9/W1116zebxDhw6kp6eXGHS5bt06OnfujI+PT7FlfHx88PX11Tp22dnZXLlyRTtu6YQVVgAhISE8++yzWtzOgAEDSEpKYu7cubz++utMnjzZZRHGSgHkc+TIEby9vcnOzub6668HICYmRvuRC5tfwGwTBIiLi9P2FTQB2TMCCAgIoE2bNuzatYvff/+dnTt3Finzxx9/EBYWZjW0tVDwgV2zZo0dd6pQXFusWbMGX19fq5F4QTp27AjAs88+W+TY5MmTGTVqFH///XeJ5h8LwcHBpKSkWI0GLFg6YAXn6iw8//zzWiNv6TgePnxYUxq2On6VgUsV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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x_low,z_low, EU0__E_rel_low, EU1__E_rel_low, AU0__E_rel_low, AU1__E_rel_low = np.loadtxt(os.path.join(outdir,'out'+Nxx0_low+'.txt')).T #Transposed for easier unpacking\n", "\n", "points_low = np.zeros((len(x_low), 2))\n", "for i in range(len(x_low)):\n", " points_low[i][0] = x_low[i]\n", " points_low[i][1] = z_low[i]\n", "\n", "grid_low = griddata(points_low, EU0__E_rel_low, (grid_x, grid_z), method='nearest')\n", "\n", "griddiff__low_minus__med = np.zeros((100,100))\n", "griddiff__low_minus__med_1darray = np.zeros(100*100)\n", "gridx_1darray_yeq0 = np.zeros(100)\n", "grid_low_1darray_yeq0 = np.zeros(100)\n", "grid_med_1darray_yeq0 = np.zeros(100)\n", "count = 0\n", "for i in range(100):\n", " for j in range(100):\n", " griddiff__low_minus__med[i][j] = grid_low[i][j] - grid_med[i][j]\n", " griddiff__low_minus__med_1darray[count] = griddiff__low_minus__med[i][j]\n", " if j==49:\n", " gridx_1darray_yeq0[i] = grid_x[i][j]\n", " grid_low_1darray_yeq0[i] = grid_low[i][j] + np.log10((float(Nxx0_low)/float(Nxx0_med))**4)\n", " grid_med_1darray_yeq0[i] = grid_med[i][j]\n", " count = count + 1\n", "\n", "fig, ax = plt.subplots()\n", "plt.title(r\"4th-order Convergence of $E_x$ at t = \"+t_final)\n", "plt.xlabel(\"x\")\n", "plt.ylabel(\"log10(Absolute error)\")\n", "\n", "ax.plot(gridx_1darray_yeq0, grid_med_1darray_yeq0, 'k-', label='Nr = '+Nxx0_med)\n", "ax.plot(gridx_1darray_yeq0, grid_low_1darray_yeq0, 'k--', label='Nr = '+Nxx0_low+', mult. by ('+Nxx0_low+'/'+Nxx0_med+')^4')\n", "# ax.set_ylim([-8.5,0.5])\n", "\n", "legend = ax.legend(loc='lower right', shadow=True, fontsize='x-large')\n", "legend.get_frame().set_facecolor('C1')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 8: Comparison Divergence Constrain Violation \\[Back to [top](#toc)\\]\n", "$$\\label{div_e}$$\n", "\n", "Here we calculate the violation quantity\n", "\n", "$$\n", "\\mathcal{C} \\equiv \\nabla^i E_i,\n", "$$\n", "\n", "at each point on our grid (excluding the ghost zones) then calculate the normalized L2 norm over the entire volume via\n", "\n", "\\begin{align}\n", " \\lVert C \\rVert &= \\left( \\frac{\\int C^2 d\\mathcal{V}}{\\int d\\mathcal{V}} \\right)^{1/2}.\n", "\\end{align}" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:40:08.572777Z", "iopub.status.busy": "2021-06-15T11:40:08.571978Z", "iopub.status.idle": "2021-06-15T11:40:08.800770Z", "shell.execute_reply": "2021-06-15T11:40:08.801216Z" } }, "outputs": [ { "data": { "image/png": "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fiFsmTEnBkt0xlTgoYce4u677y6zvGvXrjz++ONcd911NG/e3Odjn3/+ebZt28ajjz5K165dmTNnTtiOSjOmNrNEZ4yXgwcP8uOPPzJ79mz+/ve/c+211/LEE0+UHGuLioqiUaNGlZ48GxcXx3vvvcerr77K6NGjsWsVGhMaluiM8fDuu+8ybtw4Dhw4AMA111zDK6+8QkxM9T4qjRs35pZbbglkiMaYKrK5Lo0BDhw4wPjx4xkxYgSdOnVi9uzZbN68mTfeeKPaSc4YEx7sE2xOSKrKiBEjWLt2Leeccw6ffPIJe/fu5fbbb+fBBx8kLi4u1CEaYwLEenSmRuzatatkd2A4mD9/Pu+99x7x8fHMmjWL9u3bs2TJEh555BFLcsbUMtajM37JyMigsLCQ1q1bVzg7+bp16ygqKqJly5bs3LmTZcuWMX36dL7++msA6tWrR3x8PNHR0URFRZXc6tevz8cff0xKSkrQ26KqTJ48meTkZL777jvq1Knj18ztxpjIZInO+PTqq68yd+5c9u3bx+rVq0tmwRcREhISiImJoXPnzgwaNIiUlBTy8/OZPn06X331VZl1paamluwO3LFjB3l5eRQVFZXcjh07xowZM5g6dSrPPPNM0NpUUFDAnj17WLp0Kd9++y3//ve/iY+PD9r2jDHhwSZ1DrBIm9RZVcnOzmbLli1ERUVx+umnc8899/CPf/yD5ORkWrZsSWpqKn369CExMZFt27aRm5tLfn4+ixYtwrOtycnJTJw4kVatWrFz505OOukkOnfuTNeuXYmKqngv+Y033sgrr7zC1q1badGiRcDb+f333/PrX/+65MTvNm3asGHDhpLrtBljQssmdTYBc+jQId59911WrlzJihUrWLlyJdnZ2SXlIoKqcvPNN/P4448THR1d4fr27t1LdnY2RUVFdOjQodrHt2677Taef/55nnzySR544IEqt2n16tU0b96cevXqkZubS0JCAi1atODgwYM888wz3HfffTRr1ownn3wSVaVv376W5Iw5QViPLsDCvUd39dVX89ZbbxEfH0/Xrl3p3r07nTt3pn379hQUFPDDDz9w2mmn8Zvf/KbGYxsxYgTz588nPT3d75OrVZVhw4bx8ccflylr06YN+/fvJycnh0GDBvHSSy/RrFmzQIdtjAmAYPboLNEFWDgnuvT0dFJTU7n55pt5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CQnatm1b7dKlizZq1EgBXbBggRYVFentt9+uCQkJinMdRgV0/Pjxqqqal5dXannx7e6771ZV1YMHD2rv3r31iiuu0MGDB+vAgQP1vPPO05kzZ6qq6vz581VEyjz+3XffVVXVTz/91Of6582bp6qqb7/9ts/y7777TlVVp02b5rP8559/VlXVqVOn+izftWuXqqred999Pstzc3NVVXXixIk+y4v97ne/K1NWv379kvKRI0eWKW/VqlVJ+eWXX16mvFOnTiXl559/fpnytLS0kvKePXuWKb/wwgtLyjt06FCmfMiQISXlLVq0KFN+7bXXlpR7vy8AvfHGG1VVtaioyOdzc/vtt6uq6oEDB3yWT5kyRVVVMzIyfJY/9thjqqq6bt06n+XPPfecqqouWbLEZ/mMGTMq+4j4BVimQfpeFnV/sZnASEtL02XLltXIti6++GIOHjzo8xe0qRl5eXl07NixpJewYMEC+vXrx9q1a2nfvj1169blwIEDPP3000yYMIEGDRqUPPbIkSNkZ2dz5MgR6tWrR8uWLVFVZs6cyb59+4iJiaFJkyaoKqeddhpdu3Zlx44djB49mt27dxMXF0d8fDx16tThlltuYdiwYRw6dIipU6fSunVrRAQAEWHgwIG0a9eOHTt28Pnnn5csL74NGDCAVq1asXXrVv773/+WKR84cCBNmzbl8OHD5OTklHkekpKSiImJ4dChQz7LmzVrRnR0NDk5OeTmlr2UZIsWLYiKiuLgwYMcOnSoVJmq0qpVK8CZJOHw4cNlHl9cvm/fvjI9pqioKFq2bAlAVlYWeXl5pcqjo6M56aSTAMjMzCyZHL1YbGwsLVq0AGD37t0UFBSUKq9Tp05Jb3vnzp1lemR169alWbNmACVT9HlKSEigadOmAGzbtg3v7+R69eqRlJSEqrJ1a5m57GnQoAFNmjShqKiIbdu2lSlv2LBhyR4C794sOMf4GzZsSH5+PhkZGWXKmzZtSoMGDTh69Cg7d+4sU968eXPq1atXZnlVichyVU077hX5WrclusCqyUSXlpZGixYt+OSTT2pke8ZJTmvWrCEtzfk8Pvzww0yaNIlnn32WwsJChg4dSnJycoijNCbyBDPR2TG6CJadnc1pp50W6jBqteXLlzNq1Cj69etHq1ateOaZZ8jJyeGXX34BnGNCffr04YYbbijpQRljwoslugi2b98+kpKSQh1GrVa3bl327t3Lc889R0FBAT169OCf//xnSfmdd97JKaecYknOmDBmiS5CFRQUcPDgQZo0aRLqUGqNb775hscff5ylS5dy8OBBVq5cyemnn05mZiZHjhzh2LFjJCYmlkpqAwcODGHExhh/WKKLUMW7zizRBca0adP44x//SPPmzUsNvChWt27dEEZnjDkelugiVPGsKLbrsury8/N57733+PLLLxk1ahRpaWk8+uijXHrppcyaNYvExMRQh2iMCSBLdBGq+KRV69H5r7CwkI8++oi7776b9evX06BBA4YPH05cXByLFy+mqKjIkpwxtZBNqRGhsrKyAEt0vnzzzTcsXboUVWX27Nkl5yV1796dX/3qV6gqH330Efv27ePSSy8FqNLMI8aYyGI9ugi1ePFioqOj6dSpU6hDCSurVq2iX79+FBQUEB8fz9GjR/nwww8ZOnQof/jDH2jevDlXXnklMTH21jfmRGGf9gg1b948+vTpU2qmDQNPPPEEjRs35u677yY9PZ1evXoxZMgQACZMmBDi6IwxoWCJLgJlZWXx/fffc//994c6lLDzzDPPcPvtt3PqqaeGOhRjTJiwY3QRaP78+ahqyYzoxnHs2DFiYmIsyRljSrFEF4HmzZtHo0aNSuZbNLBy5UqSk5P56KOPQh2KMSbMWKKLMKrKvHnzGDBggA2oAGbOnEn37t3p0aMHBw8etLk/jTFlWKKLMD/99BMZGRlcfPHFoQ4laAoKCkouZbJz507WrFnD+vXr2bhxI5s3b2bjxo0A/Pjjj1x//fWAMwhlw4YNdOzYMWRxG2PCk3UJIsyaNWsAOOuss0IcSXAcPXqUs846i8WLF1O3bl0eeughnnrqqVJ14uPjOXz4MPv376d79+589tlnNkOMMaZcluh8EJEU4B6goaqOcJedDPwL2Af8rKoPhyK2zMxMgJILQYZKdnY2MTExNGzYkL179/KnP/2JNWvWUKdOHXbs2EFWVhbjx4/n6aefZteuXXz22Wfs37+fnJwcCgoKyMzMZMKECXTp0oXDhw+za9cuYmNj+fe//82qVavYtGkTXbp0YezYsfTt25djx45RWFhIUVERcXFxFBUVcf7557N06VK7coAxpkI1kuhEJBpYBuxQ1cE+ym8BbgAEeF5V/3kc25oODAYyVbWLx/JLgSeAaOCFihKVqm4GxonILI/FXYFZqvq6iLxV3fiO1969ewFKrkgcaLm5uezfv5+CggKOHTtGhw4dAJgyZQpz5swhPT0dESEzM5ORI0cyc+ZMmjRpwqZNm+jYsSOFhYWcccYZNG/enNGjRwOwbt06xowZU7INEaFp06aMHDkSgNdee43x48eXlF933XV06eK8dD179qRnz57lxmtJzhhTmZrq0d0CrAPKnN0sIl1wktxZQD4wV0Rmq+pGjzrNgSOqmuOxrINnHQ8vA08Br3rUjQaeBi4CMoClIvKRqq4Vka7AQ17rGKuqmV7LFgGzRGQs8Jp/zQ68zMxMGjduTGxsbEDXm5ubyzXXXMPcuXMpLCwEICUlhQ0bNhAVFcVXX31FbGwsV1xxBYWFhZx++ul0794dgOjoaJYvX17uuvv06cPmzZtp2LAhDRo0QESIjo4uKb/gggt49tlniY6OJiEhgeHDhwe0bcaYE1vQE52IJAODgAeBP/uochqwWFUPu/W/Aq4EpnrUuQAYLyKXq2qeiNzg1rnMe2WqulBE2nktPgvY6PbUEJGZwDBgraquwukBVmYMMNld/yzgJa92DgGGFPeAgmXv3r1BmZNxzpw5zJ49mwkTJtCtWzdiY2Np0aJFyTyRX3zxRbXXXbduXdq3b19u+amnnmrnvhljgqYmenT/BO4A6pdTvhp4UESSgCPA5Ti7OUuo6jsi0h54S0TeAcbi9M781RrY7nE/A+hdXmU3lgeBniIySVUfAuYCU0TkWiDd+zGq+jHwcVpa2g1ViKvKMjMzadasWcDXO2zYMBYuXEifPn3stAVjTK0S1G80ESk+VrZcRC70VUdV14nI34F5wCFgBXDMR72pbk9sGpCqqrnBiltVs4HxXstWAyOCtU1/ZWZmBuVcsTp16tC3b9+Ar9cYY0It2OfRnQsMFZF0YCbQX0Re966kqi+qai9VPR/4BfjZu46I9AW6AO8Dk6sYxw6gjcf9ZHdZxAnGrsusrCzuuOMONmzYEND1GmNMOAhqj05VJwGTANwe3e2q+hvveiLSXFUz3SH8VwJne5X3BJ7DOZa2BXhDRB5Q1Xv9DGUp0NHd/bkDuBq4tlqNCqFjx46RnZ0dkF2X69evZ+HChWzYsIGVK1cyb948hg8fbidcG2NqnZAdjBGROcDvVHUn8K57XKwA+JOq7veqngBcpaqb3MeOAkaXs94ZwIVAUxHJwBlA8qKITAA+wzm9YLqqrgl8q4IrOzsbVQ1Ij+4vf/kLH3/8MXFxcSQnJ3PllVdy5plnBiBKY4wJL1I8qs4ERlpami5btqzyitWwevVqunbtysyZM0vOQauu7du3k5eXR2pqqp2LZowJORFZrqpBmane5rqMIMWzolS3R1dUVMQVV1zBJ598Qps2bejQoYMlOWNMrWeJLoIUz4pS3UT3xRdf8MEHH3Dw4MFAhmWMMWHNEl0EKe7RVXUwiqry4IMPMnToUJKSkmzmEWPMCcUSXQTZu3cvIlLlmfofffRR7r33Xi677DK+/fZb6tatG6QIjTEm/FiiiyCZmZkkJSWVmieyPE8//TQffvghADk5Odx+++288847nHLKKcEO0xhjworN9RRBMjMz/To+l5OTw1133cWVV17JsGHDuP/++23QiTHmhGWJLoL4MyvKokWLeP3118nNzS259I0lOWPMicwSXQTJzMwsuTROeQYPHkx2dja9evXi7LPPrrCuMcacCCzRRZDKenRFRUUMHz6cs846i+uuu856csYYgyW6iJGfn88vv/xS4akFUVFRvPDCCzUYlTHGhD9LdBEiKysLqPhk8WPHjhEVFWU9OWOOQ0FBARkZGRw9ejTUodRK8fHxJCcnExsbW2PbtEQXIfyZFWXu3LkMHz6cRYsW0atXr5oKzZhaJSMjg/r169OuXTv70Rhgqkp2djYZGRm0b9++xrZriS5M/PLLL/zlL38BIC4ujnvvvZdWrVqVlPszK0pmZiaFhYU0adIkuMEaU4sdPXrUklyQFE94UfzDvaZYogsTR48eZe7cuQDs2LGD5ORk7r777pJyf3p0e/bsqbSOMaZyluSCJxTPrc2MEiZatmxJRkYGGRkZdOvWjQULFpQq97dHl5iYSGJiYlBjNcYEl4hw2223ldx/9NFHmTJlSrXWtWXLFnr37k2HDh0YOXIk+fn5xx3fhRdeSKdOnejRowc9evQo+X7Ky8tj5MiRdOjQgd69e5Oenn7c2woES3RhqH///nzzzTelDoZnZmYSHR1N48aNy33cnj17aNGiRU2EaIwJojp16vDee++VDEI7HnfeeScTJ05k48aNNG7cmBdffDEAEcIbb7zBihUrWLFiRclepBdffJHGjRuzceNGJk6cyJ133hmQbR0vS3RhqH///hw9epRFixaVLNu7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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plotting the constraint violation\n", "nrpy_div_low = np.loadtxt(os.path.join(outdir,'out-lowresolution.txt')).T\n", "nrpy_div_med = np.loadtxt(os.path.join(outdir,'out-medresolution.txt')).T\n", "\n", "plt.plot(nrpy_div_low[0]/domain_size, (nrpy_div_low[1]), 'k-',label='Nxx0 = '+Nxx0_low)\n", "plt.plot(nrpy_div_med[0]/domain_size, (nrpy_div_med[1]), 'k--',label='Nxx0 = '+Nxx0_med)\n", "\n", "plt.yscale('log')\n", "plt.xlabel('Light Crossing Times')\n", "plt.ylabel('||C||')\n", "# plt.xlim(0,2.2)\n", "# plt.ylim(1e-4, 1e-5)\n", "plt.title('L2 Norm of the Divergence of E - '+par.parval_from_str(\"reference_metric::CoordSystem\")+' Coordinates')\n", "plt.legend(loc='center right')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 9: 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-Start_to_Finish-Solving_Maxwells_Equations_in_Vacuum-Curvilinear.pdf](Tutorial-Start_to_Finish-Solving_Maxwells_Equations_in_Vacuum-Curvilinear.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": 28, "metadata": { "execution": { "iopub.execute_input": "2021-06-15T11:40:08.804414Z", "iopub.status.busy": "2021-06-15T11:40:08.803866Z", "iopub.status.idle": "2021-06-15T11:40:12.097042Z", "shell.execute_reply": "2021-06-15T11:40:12.096412Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Created Tutorial-Start_to_Finish-Solving_Maxwells_Equations_in_Vacuum-\n", " Curvilinear.tex, and compiled LaTeX file to PDF file Tutorial-\n", " Start_to_Finish-Solving_Maxwells_Equations_in_Vacuum-Curvilinear.pdf\n" ] } ], "source": [ "import cmdline_helper as cmd # NRPy+: Multi-platform Python command-line interface\n", "cmd.output_Jupyter_notebook_to_LaTeXed_PDF(\"Tutorial-Start_to_Finish-Solving_Maxwells_Equations_in_Vacuum-Curvilinear\")" ] } ], "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.10.0" } }, "nbformat": 4, "nbformat_minor": 2 }