From a8ff4b2e55505d38f139b73d49e641888ffafbfa Mon Sep 17 00:00:00 2001 From: Neil Vaytet Date: Sat, 2 Oct 2021 21:36:14 +0200 Subject: [PATCH 1/3] update notebooks for new test data --- docs/basics.ipynb | 16 +++--- docs/data_structures.ipynb | 2 +- docs/loading_data.ipynb | 37 ++++++------- docs/plotting.ipynb | 108 ++++++++++++++++++++++--------------- src/osyris/io/sink.py | 9 +++- 5 files changed, 102 insertions(+), 70 deletions(-) diff --git a/docs/basics.ipynb b/docs/basics.ipynb index fa96c409..48d1bd73 100644 --- a/docs/basics.ipynb +++ b/docs/basics.ipynb @@ -17,7 +17,9 @@ "source": [ "## Reading a RAMSES output\n", "\n", - "Import the `osyris` module and load the output of your choice (this will be output number `71` in this example)." + "Import the `osyris` module and load the output of your choice.\n", + "We are loading output number `8` from a simulation of a collapsing system of gas,\n", + "that is forming young stars in its core." ] }, { @@ -53,7 +55,7 @@ "metadata": {}, "outputs": [], "source": [ - "data = osyris.Dataset(71, scale=\"au\", path=\"osyrisdata\")" + "data = osyris.Dataset(8, scale=\"au\", path=\"osyrisdata/starformation\")" ] }, { @@ -127,9 +129,9 @@ "\n", "## Creating a 2D histogram\n", "\n", - "We now wish to plot a 2d histogram of the logarithm of density versus logarithm of gas temperature,\n", + "We now wish to plot a 2d histogram of the logarithm of density versus logarithm of magnetic field magnitude,\n", "for all the cells inside the computational domain.\n", - "We also use a logarithmic colormap which represents the cell counts in the $(\\rho,T)$ plane" + "We also use a logarithmic colormap which represents the cell counts in the $(\\rho,B)$ plane" ] }, { @@ -138,7 +140,7 @@ "metadata": {}, "outputs": [], "source": [ - "osyris.histogram(data[\"hydro\"][\"density\"], data[\"hydro\"][\"temperature\"],\n", + "osyris.histogram(data[\"hydro\"][\"density\"], data[\"hydro\"][\"B_field\"],\n", " norm=\"log\", loglog=True)" ] }, @@ -148,7 +150,7 @@ "source": [ "## Simple cut plane\n", "\n", - "The goal here is to create a 2D gas density slice, 100 au wide, through the plane normal to `z`,\n", + "The goal here is to create a 2D gas density slice, 2000 au wide, through the plane normal to `z`,\n", "that passes through the center of the young star forming system.\n", "\n", "We first need to define where the center of the system is.\n", @@ -180,7 +182,7 @@ "outputs": [], "source": [ "osyris.plane({\"data\": data[\"hydro\"][\"density\"], \"norm\": \"log\"},\n", - " dx=100 * osyris.units('au'),\n", + " dx=2000 * osyris.units('au'),\n", " origin=center,\n", " direction=\"z\")" ] diff --git a/docs/data_structures.ipynb b/docs/data_structures.ipynb index 5cb6785c..f361a066 100644 --- a/docs/data_structures.ipynb +++ b/docs/data_structures.ipynb @@ -40,7 +40,7 @@ "metadata": {}, "outputs": [], "source": [ - "data = osyris.Dataset(71, scale=\"au\", path=\"osyrisdata\").load()" + "data = osyris.Dataset(8, scale=\"au\", path=\"osyrisdata/starformation\").load()" ] }, { diff --git a/docs/loading_data.ipynb b/docs/loading_data.ipynb index d7639df3..326db919 100644 --- a/docs/loading_data.ipynb +++ b/docs/loading_data.ipynb @@ -32,7 +32,8 @@ "metadata": {}, "outputs": [], "source": [ - "data = osyris.Dataset(71, scale=\"au\", path=\"osyrisdata\").load()" + "path = \"osyrisdata/starformation\"\n", + "data = osyris.Dataset(8, scale=\"au\", path=path).load()" ] }, { @@ -62,7 +63,7 @@ "\n", "It is possible to load only a subset of the cells, by using custom functions to perform the selection.\n", "\n", - "As an example, to load all the cells with $\\rho > 10^{-13}~{\\rm g~cm}^{-3}$, we use a selection criterion" + "As an example, to load all the cells with $\\rho > 10^{-15}~{\\rm g~cm}^{-3}$, we use a selection criterion" ] }, { @@ -71,8 +72,8 @@ "metadata": {}, "outputs": [], "source": [ - "data = osyris.Dataset(71, scale=\"au\", path=\"osyrisdata\").load(\n", - " select={\"hydro\": {\"density\": lambda d : d > 1.0e-13 * osyris.units('g/cm**3')}})" + "data = osyris.Dataset(8, scale=\"au\", path=path).load(\n", + " select={\"hydro\": {\"density\": lambda d : d > 1.0e-15 * osyris.units('g/cm**3')}})" ] }, { @@ -105,9 +106,9 @@ "metadata": {}, "outputs": [], "source": [ - "data = osyris.Dataset(71, scale=\"au\", path=\"osyrisdata\").load(\n", - " select={\"hydro\": {\"density\": lambda d : d > 1.0e-13 * osyris.units('g/cm**3')},\n", - " \"amr\": {\"xyz_x\": lambda x : x > 5500. * osyris.units('au')}})" + "data = osyris.Dataset(8, scale=\"au\", path=path).load(\n", + " select={\"hydro\": {\"density\": lambda d : d > 1.0e-16 * osyris.units('g/cm**3')},\n", + " \"amr\": {\"xyz_x\": lambda x : x > 1500. * osyris.units('au')}})" ] }, { @@ -117,7 +118,7 @@ "outputs": [], "source": [ "osyris.plane({\"data\": data[\"hydro\"][\"density\"], \"norm\": \"log\"},\n", - " dx=200 * osyris.units('au'),\n", + " dx=1000 * osyris.units('au'),\n", " origin=data[\"amr\"][\"xyz\"][np.argmax(data[\"hydro\"][\"density\"]).values],\n", " direction='z')" ] @@ -137,7 +138,7 @@ "metadata": {}, "outputs": [], "source": [ - "data = osyris.Dataset(71, scale=\"au\", path=\"osyrisdata\").load(\n", + "data = osyris.Dataset(8, scale=\"au\", path=path).load(\n", " select={\"hydro\": {\"density\": False}})\n", "\"density\" in data[\"hydro\"]" ] @@ -158,7 +159,7 @@ "metadata": {}, "outputs": [], "source": [ - "data = osyris.Dataset(71, scale=\"au\", path=\"osyrisdata\").load(\n", + "data = osyris.Dataset(8, scale=\"au\", path=path).load(\n", " select={\"hydro\": False})\n", "data" ] @@ -184,8 +185,8 @@ "metadata": {}, "outputs": [], "source": [ - "data = osyris.Dataset(71, scale=\"au\", path=\"osyrisdata\").load(\n", - " select={\"amr\": {\"level\": lambda l : l < 10}})\n", + "data = osyris.Dataset(8, scale=\"au\", path=path).load(\n", + " select={\"amr\": {\"level\": lambda l : l < 7}})\n", "data[\"amr\"][\"level\"]" ] }, @@ -193,7 +194,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "will only read levels 1 to 9, while" + "will only read levels 1 to 6, while" ] }, { @@ -202,8 +203,8 @@ "metadata": {}, "outputs": [], "source": [ - "data = osyris.Dataset(71, scale=\"au\", path=\"osyrisdata\").load(\n", - " select={\"amr\": {\"level\": lambda l : np.logical_and(l > 9, l < 13)}})\n", + "data = osyris.Dataset(8, scale=\"au\", path=path).load(\n", + " select={\"amr\": {\"level\": lambda l : np.logical_and(l > 5, l < 9)}})\n", "data[\"amr\"][\"level\"]" ] }, @@ -211,7 +212,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "will read levels 1 to 12, but will then discard all cells with `level` < 10.\n", + "will read levels 1 to 8, but will then discard all cells with `level` < 6.\n", "\n", "### Loading only selected CPU outputs\n", "\n", @@ -224,7 +225,7 @@ "metadata": {}, "outputs": [], "source": [ - "data = osyris.Dataset(71, scale=\"au\", path=\"osyrisdata\").load(\n", + "data = osyris.Dataset(8, scale=\"au\", path=path).load(\n", " cpu_list=[1, 2, 10, 4, 5])" ] }, @@ -235,7 +236,7 @@ "outputs": [], "source": [ "osyris.plane({\"data\": data[\"hydro\"][\"density\"], \"norm\": \"log\"},\n", - " dx=400 * osyris.units(\"au\"),\n", + " dx=2000 * osyris.units(\"au\"),\n", " origin=data[\"amr\"][\"xyz\"][np.argmax(data[\"hydro\"][\"density\"]).values],\n", " direction='z')" ] diff --git a/docs/plotting.ipynb b/docs/plotting.ipynb index 584618ff..1fa13a01 100644 --- a/docs/plotting.ipynb +++ b/docs/plotting.ipynb @@ -19,7 +19,8 @@ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", - "data = osyris.Dataset(71, scale=\"au\", path=\"osyrisdata\").load()\n", + "path = \"osyrisdata/starformation\"\n", + "data = osyris.Dataset(8, scale=\"au\", path=path).load()\n", "ind = np.argmax(data[\"hydro\"][\"density\"])\n", "center = data[\"amr\"][\"xyz\"][ind.values]" ] @@ -28,7 +29,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 1. A 2D histogram of density vs magnetic field\n", + "## 1. A 2D histogram of density vs magnetic field\n", "\n", "By default, the `histogram` function will show a binned count of cells" ] @@ -66,9 +67,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 2. Simple cut plane\n", + "## 2. Simple cut plane\n", "\n", - "Create a 2D gas density slice 100 au wide through the plane normal to `z`,\n", + "Create a 2D gas density slice 2000 au wide through the plane normal to `z`,\n", "with velocity vectors overlayed as arrows, once agains using `layers`:" ] }, @@ -82,7 +83,7 @@ "source": [ "osyris.plane({\"data\": data[\"hydro\"][\"density\"], \"norm\": \"log\"}, # layer 1\n", " {\"data\": data[\"hydro\"][\"velocity\"], \"mode\": \"vec\"}, # layer 2\n", - " dx=100 * osyris.units(\"au\"),\n", + " dx=2000 * osyris.units(\"au\"),\n", " origin=center,\n", " direction=\"z\")" ] @@ -91,9 +92,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 3. Cut plane at an arbitrary angle\n", + "## 3. Cut plane at an arbitrary angle\n", "\n", - "The `plane` function will also accept a vector to define the normal direction to the plane" + "The `plane` function will also accept a vector to define the normal direction to the plane.\n", + "In this example, we also change the colormap." ] }, { @@ -106,18 +108,19 @@ "source": [ "osyris.plane({\"data\": data[\"hydro\"][\"density\"], \"norm\": \"log\"},\n", " {\"data\": data[\"hydro\"][\"velocity\"], \"mode\": \"vec\"},\n", - " dx=100 * osyris.units(\"au\"),\n", + " dx=500 * osyris.units(\"au\"),\n", " origin=center,\n", - " direction=[-1, 1, 1])" + " direction=[-1, 1, 3],\n", + " cmap=\"magma\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### 4. Automatic “top/side” slice orientation according to angular momentum\n", + "## 4. Automatic “top/side” slice orientation according to angular momentum\n", "\n", - "Create a 2D slice of the logarithm of density 50 au wide using automatic orientation based on the angular momentum in the data.\n", + "Create a 2D slice of the logarithm of density 500 au wide using automatic orientation based on the angular momentum in the data.\n", "This is useful for looking at disks.\n", "Use the `\"top\"` direction for the slice to view the disk from above" ] @@ -130,7 +133,7 @@ "source": [ "osyris.plane({\"data\": data[\"hydro\"][\"density\"], \"norm\": \"log\"},\n", " {\"data\": data[\"hydro\"][\"velocity\"], \"mode\": \"vec\"},\n", - " dx=50 * osyris.units(\"au\"),\n", + " dx=500 * osyris.units(\"au\"),\n", " origin=center,\n", " direction=\"top\")" ] @@ -150,7 +153,7 @@ "source": [ "osyris.plane({\"data\": data[\"hydro\"][\"density\"], \"norm\": \"log\"},\n", " {\"data\": data[\"hydro\"][\"velocity\"], \"mode\": \"vec\"},\n", - " dx=50 * osyris.units(\"au\"),\n", + " dx=500 * osyris.units(\"au\"),\n", " origin=center,\n", " direction=\"side\")" ] @@ -159,12 +162,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 5. Embedding plots in existing matplotlib axes\n", + "## 5. Embedding plots in existing matplotlib axes\n", "\n", "In this example, we create two subplot axes with `matplotlib`.\n", "\n", "Next, we plot in the left panel the log of density as a coloured slice with velocity vectors.\n", - "The minimum and maximum of $\\log(\\rho)$ is forced to `-14` and `-9`.\n", + "The minimum and maximum of $\\log(\\rho)$ are forced to `-17` and `-11`.\n", "We give the `plane` call the axes to use via the `ax` argument.\n", "Next, we overlay some custom chosen density contours with different line styles and colours.\n", "\n", @@ -181,21 +184,21 @@ "outputs": [], "source": [ "# Create figure\n", - "fig = plt.figure(figsize=(8, 3))\n", + "fig = plt.figure(figsize=(10, 3.5))\n", "ax1 = fig.add_subplot(121)\n", "ax2 = fig.add_subplot(122)\n", "plt.subplots_adjust(wspace=0.5)\n", "\n", "# Define region to plot\n", - "dx = 15.0 * osyris.units(\"au\")\n", + "dx = 2000.0 * osyris.units(\"au\")\n", "\n", "# Left plot: coloured density slice with overlayed contours\n", "osyris.plane({\"data\": data[\"hydro\"][\"density\"], \"norm\": \"log\",\n", - " \"vmin\": 1.0e-14,\n", - " \"vmax\": 1.0e-9},\n", + " \"vmin\": 1.0e-17,\n", + " \"vmax\": 1.0e-11},\n", " {\"data\": data[\"hydro\"][\"velocity\"], \"mode\": \"vec\"},\n", " {\"data\": data[\"hydro\"][\"density\"], \"mode\": \"contour\",\n", - " \"levels\": [1.0e-12,1.0e-11,1.0e-9],\n", + " \"levels\": [1.0e-17,1.0e-16,1.0e-12],\n", " \"colors\": ('yellow','k',\"lime\"),\n", " \"linewidths\": [2,5,2],\n", " \"linestyles\": [\"solid\",\"dashed\",\"solid\"],\n", @@ -206,8 +209,8 @@ " direction=\"z\", ax=ax1)\n", "\n", "osyris.plane({\"data\": data[\"hydro\"][\"temperature\"], \"norm\": \"log\", \"mode\": \"contourf\",\n", - " \"levels\": np.logspace(1.4, 3, 21), \"cmap\": \"hot\"},\n", - " {\"data\": data[\"amr\"][\"level\"], \"mode\": \"contour\", \"colors\": \"w\", \"levels\": [14, 15, 16]},\n", + " \"levels\": np.logspace(0.9, 2, 21), \"cmap\": \"hot\"},\n", + " {\"data\": data[\"amr\"][\"level\"], \"mode\": \"contour\", \"colors\": \"w\", \"levels\": [6, 7, 8]},\n", " dx=dx,\n", " origin=center,\n", " direction=\"z\", ax=ax2)" @@ -217,14 +220,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 6. Plot only a subset of cells belonging to a disk\n", + "## 6. Plot only a subset of cells belonging to a disk\n", "\n", "In this example, we select cells according to their density and plot only those.\n", - "This is done by creating a new field and using the `numpy` `where` function.\n", - "To combine more than one selection criteria, use the `logical_and` `numpy` function.\n", + "This is done by creating a new field and using the `numpy` `masked_where` function.\n", + "To combine more than one selection criteria, we use the `logical_or` `numpy` function.\n", "\n", "This is useful for plotting disks around protostars, for example.\n", - "Here we select the cells with a density in the range $-12.5 < \\log(\\rho) < -11.0$." + "Here we select the cells with a density in the range\n", + "$5 \\times 10^{-14}~\\text{g cm}^{-3} < \\rho < 5 \\times 10^{-12}~\\text{g cm}^{-3}$." ] }, { @@ -235,11 +239,11 @@ "source": [ "data[\"hydro\"][\"disk_density\"] = osyris.Array(\n", " np.ma.masked_where(np.logical_or(\n", - " data[\"hydro\"][\"density\"].values < 3.0e-13,\n", - " data[\"hydro\"][\"density\"].values > 1.0e-11),\n", + " data[\"hydro\"][\"density\"].values < 5.0e-14,\n", + " data[\"hydro\"][\"density\"].values > 5.0e-12),\n", " data[\"hydro\"][\"density\"].values),\n", " unit=data[\"hydro\"][\"density\"].unit)\n", - "osyris.plane(data[\"hydro\"][\"disk_density\"], dx=50 * osyris.units(\"au\"),\n", + "osyris.plane(data[\"hydro\"][\"disk_density\"], dx=500 * osyris.units(\"au\"),\n", " norm=\"log\", origin=center, mode=\"image\")" ] }, @@ -263,7 +267,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 7. Difference between two snapshots\n", + "## 7. Difference between two snapshots\n", "\n", "Here, we want to make a map of the difference in density between two snapshots.\n", "Because we do not necessarily have the same number of cells at the same place,\n", @@ -282,8 +286,8 @@ "metadata": {}, "outputs": [], "source": [ - "# Read data from a later snapshot\n", - "data2 = osyris.Dataset(201, scale=\"au\", path=\"osyrisdata\").load()" + "# Read data from an earlier snapshot\n", + "data_old = osyris.Dataset(5, scale=\"au\", path=path).load()" ] }, { @@ -292,12 +296,12 @@ "metadata": {}, "outputs": [], "source": [ - "dx = 100 * osyris.units(\"au\")\n", + "dx = 2000 * osyris.units(\"au\")\n", "# Extract density slices by copying data into structures\n", "plane1 = osyris.plane({\"data\": data[\"hydro\"][\"density\"], \"norm\": \"log\"},\n", " dx=dx, origin=center, direction=\"z\", plot=False)\n", "\n", - "plane2 = osyris.plane({\"data\": data2[\"hydro\"][\"density\"], \"norm\": \"log\"},\n", + "plane2 = osyris.plane({\"data\": data_old[\"hydro\"][\"density\"], \"norm\": \"log\"},\n", " dx=dx, origin=center, direction=\"z\", plot=False)\n", "\n", "# Get x,y coordinates\n", @@ -322,11 +326,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 8. Slice above the origin\n", + "## 8. Slice above the origin\n", "\n", - "We want to plot a slice of density but through a point which is 5 AU above the centre of the domain,\n", - "defined as the cell with the highest density.\n", - "This is done by setting the `origin` coordinate to `[0, 0, 5]`" + "We want to plot a slice of density but through a point which is 20 AU above the centre of the domain,\n", + "defined as the cell with the highest density." ] }, { @@ -336,10 +339,10 @@ "outputs": [], "source": [ "origin = center.copy()\n", - "origin.values[-1] += 5\n", + "origin.values[-1] += 20\n", "osyris.plane({\"data\": data[\"hydro\"][\"density\"], \"norm\": \"log\"},\n", " {\"data\": data[\"hydro\"][\"velocity\"], \"mode\": \"vec\"},\n", - " dx=dx,\n", + " dx=500 * osyris.units(\"au\"),\n", " origin=origin,\n", " direction=\"z\")" ] @@ -360,12 +363,31 @@ "metadata": {}, "outputs": [], "source": [ - "step = 1000\n", + "step = 100\n", "osyris.scatter(data[\"hydro\"][\"density\"][::step],\n", - " data[\"hydro\"][\"temperature\"][::step],\n", - " c=data[\"hydro\"][\"velocity\"][::step],\n", + " data[\"hydro\"][\"velocity\"][::step],\n", + " c=data[\"hydro\"][\"thermal_pressure\"][::step],\n", " norm=\"log\", loglog=True)" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 10. 2D data\n", + "\n", + "2D data can be loaded and viewed just like 3D data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data2d = osyris.Dataset(2, scale=\"cm\", path=\"osyrisdata/sedov\").load()\n", + "osyris.plane(data2d[\"hydro\"][\"density\"], norm=\"log\", cmap=\"jet\")" + ] } ], "metadata": { diff --git a/src/osyris/io/sink.py b/src/osyris/io/sink.py index ced91670..9497faf9 100644 --- a/src/osyris/io/sink.py +++ b/src/osyris/io/sink.py @@ -15,6 +15,9 @@ def __init__(self): self.initialized = False def initialize(self, meta, select): + sink = Datagroup() + if select is False: + return sink sink_file = utils.generate_fname(meta["nout"], meta["path"], ftype="sink", @@ -23,7 +26,11 @@ def initialize(self, meta, select): if not os.path.exists(sink_file): return - sink_data = np.loadtxt(sink_file, delimiter=',', skiprows=2) + try: + sink_data = np.loadtxt(sink_file, delimiter=',', skiprows=2) + except StopIteration: + # This is an empty sink file + return sink with open(sink_file, 'r') as f: key_list = f.readline() From f1b8133b59228273d9b4427557aad4fec1b3c11e Mon Sep 17 00:00:00 2001 From: Neil Vaytet Date: Sat, 2 Oct 2021 22:54:34 +0200 Subject: [PATCH 2/3] add sink particle example in plotting --- docs/plotting.ipynb | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/docs/plotting.ipynb b/docs/plotting.ipynb index 1fa13a01..a5e4a61e 100644 --- a/docs/plotting.ipynb +++ b/docs/plotting.ipynb @@ -6,7 +6,10 @@ "source": [ "# Plotting\n", "\n", - "A good way to illustrate the plotting possibilities is through a long list of demos." + "A good way to illustrate the plotting possibilities is through a long list of demos.\n", + "\n", + "Note that `osyris`'s plotting functions are wrapping `matplotlib`'s plotting functions,\n", + "and forwards most `matplotlib` arguments to the underlying function." ] }, { @@ -374,7 +377,30 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 10. 2D data\n", + "## 10. Sink particles\n", + "\n", + "Some star formation simulations contain sink particles,\n", + "and these can be represented as a scatter layer on a plane plot. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "osyris.plane({\"data\": data[\"hydro\"][\"density\"], \"norm\": \"log\"}, # layer 1\n", + " {\"data\": data[\"sink\"][\"xyz\"], \"mode\": \"scatter\", \"c\": \"white\"}, # layer 2\n", + " dx=2000 * osyris.units(\"au\"),\n", + " origin=center,\n", + " direction=\"z\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 11. 2D data\n", "\n", "2D data can be loaded and viewed just like 3D data." ] From 17b91554144ea786aa1c7919b1bd0f15376b7da8 Mon Sep 17 00:00:00 2001 From: Neil Vaytet Date: Sat, 2 Oct 2021 22:55:08 +0200 Subject: [PATCH 3/3] bump version --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 421e7e10..48da3fa3 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = osyris -version = 2.2.0 +version = 2.2.1 author = Neil Vaytet author_email = neil.vaytet@esss.se description = A package to visualize AMR data from the RAMSES code