Repository: snek5000/snek5000 (language: python)

Issue:
API similar to `fluidsim.load_sim_for_plot` and `sim.output.phys_fields.get_var`?
I think it would be useful to recreate a Simul object from a directory. It would be a nice way to read the parameters and the results from Python.

It would be really nice to be able to load a particular field with the `sim` object (returned as a Numpy array). And even to read a particular cross-section.


Discussion / hints:
Oops, I missed the issue notification somehow! I agree that plotting results has to be fixed soon... for my own sake too. A very barebones simulation loader exists here:

https://github.com/exabl/snek5000/blob/35bc433e917f83bc6aeb290cb6fd2f9161e724e2/src/snek5000/__init__.py#L72-L110

To plot the results, I need to make use of pymech here.

Fix patch:
diff --git a/docs/conf.py b/docs/conf.py
index 780babb6..9120a5b5 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -184,12 +184,7 @@ def root(module):
 # List of patterns, relative to source directory, that match files and
 # directories to ignore when looking for source files.
 # This pattern also affects html_static_path and html_extra_path.
-exclude_patterns = [
-    "_build",
-    "Thumbs.db",
-    ".DS_Store",
-    "examples/snek5000-canonical/README.md"
-]
+exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "examples/snek5000-*/README.md"]
 
 # -- Options for HTML output -------------------------------------------------
 
diff --git a/docs/examples/snek5000-tgv/LICENSE b/docs/examples/snek5000-tgv/LICENSE
new file mode 100644
index 00000000..1babe8cd
--- /dev/null
+++ b/docs/examples/snek5000-tgv/LICENSE
@@ -0,0 +1,58 @@
+Copyright (c) 2008-2020, UCHICAGO ARGONNE, LLC. 
+
+The UChicago Argonne, LLC as Operator of Argonne National
+Laboratory holds copyright in the Software. The copyright holder
+reserves all rights except those expressly granted to licensees,
+and U.S. Government license rights.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the disclaimer below.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the disclaimer (as noted below)
+in the documentation and/or other materials provided with the
+distribution.
+
+3. Neither the name of ANL nor the names of its contributors
+may be used to endorse or promote products derived from this software
+without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 
+UCHICAGO ARGONNE, LLC, THE U.S. DEPARTMENT OF 
+ENERGY OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Additional BSD Notice
+---------------------
+1. This notice is required to be provided under our contract with
+the U.S. Department of Energy (DOE). This work was produced at
+Argonne National Laboratory under Contract 
+No. DE-AC02-06CH11357 with the DOE.
+
+2. Neither the United States Government nor UCHICAGO ARGONNE, 
+LLC nor any of their employees, makes any warranty, 
+express or implied, or assumes any liability or responsibility for the
+accuracy, completeness, or usefulness of any information, apparatus,
+product, or process disclosed, or represents that its use would not
+infringe privately-owned rights.
+
+3. Also, reference herein to any specific commercial products, process, 
+or services by trade name, trademark, manufacturer or otherwise does 
+not necessarily constitute or imply its endorsement, recommendation, 
+or favoring by the United States Government or UCHICAGO ARGONNE LLC. 
+The views and opinions of authors expressed 
+herein do not necessarily state or reflect those of the United States 
+Government or UCHICAGO ARGONNE, LLC, and shall 
+not be used for advertising or product endorsement purposes.
diff --git a/docs/examples/snek5000-tgv/README.md b/docs/examples/snek5000-tgv/README.md
new file mode 100644
index 00000000..20cfc196
--- /dev/null
+++ b/docs/examples/snek5000-tgv/README.md
@@ -0,0 +1,6 @@
+Orphan:
+
+# Verification: DNS of the Taylor-Green vortex at Re=1600
+
+This example would reuse the `tgv.usr` file and the reference data given in
+[NekExamples repo](https://github.com/Nek5000/NekExamples/tree/master/tgv).
diff --git a/docs/examples/snek5000-tgv/setup.cfg b/docs/examples/snek5000-tgv/setup.cfg
new file mode 100644
index 00000000..1e989352
--- /dev/null
+++ b/docs/examples/snek5000-tgv/setup.cfg
@@ -0,0 +1,25 @@
+[metadata]
+name = snek5000_tgv
+version = 0.0.1
+description = Taylor-Green vortex
+long_description = file: README.md
+long_description_content_type = text/markdown
+license = ...
+license_file = LICENSE
+
+[options]
+package_dir=
+    =src
+packages=find:
+install_requires =
+    snek5000
+
+[options.entry_points]
+snek5000.solvers =
+    tgv = snek5000_tgv.solver
+
+[options.packages.find]
+where=src
+
+[options.package_data]
+snek5000_tgv = templates/*.j2, *.usr.f, Snakefile, etc/*.yml
diff --git a/docs/examples/snek5000-tgv/setup.py b/docs/examples/snek5000-tgv/setup.py
new file mode 100644
index 00000000..60684932
--- /dev/null
+++ b/docs/examples/snek5000-tgv/setup.py
@@ -0,0 +1,3 @@
+from setuptools import setup
+
+setup()
diff --git a/docs/examples/snek5000-tgv/src/snek5000_tgv/Snakefile b/docs/examples/snek5000-tgv/src/snek5000_tgv/Snakefile
new file mode 100644
index 00000000..bbc4970f
--- /dev/null
+++ b/docs/examples/snek5000-tgv/src/snek5000_tgv/Snakefile
@@ -0,0 +1,65 @@
+import snek5000
+from snek5000_tgv.output import OutputTGV as Output
+
+
+# Case name
+CASE = "tgv"
+CONFIG = Output.get_configfile()
+
+snek5000.ensure_env()
+
+
+configfile: CONFIG
+
+
+# Necessary to pass configuration to other Snakemake modules
+Output.update_snakemake_config(config, CASE)
+
+
+# default rule
+rule all:
+    input:
+        "nek5000",
+
+
+# shorthand for mesh
+rule mesh:
+    input:
+        f"{CASE}.re2",
+        f"{CASE}.ma2",
+
+
+# compiler and run rules
+# ======================
+module compiler:
+    snakefile:
+        snek5000.get_asset("compiler.smk")
+    config:
+        config
+
+
+use rule * from compiler
+
+
+# I/O rules
+# =========
+module io:
+    snakefile:
+        snek5000.get_asset("io.smk")
+    config:
+        config
+
+
+use rule * from io
+
+
+# internal rules
+# ==============
+module internal:
+    snakefile:
+        snek5000.get_asset("internal.smk")
+    config:
+        config
+
+
+use rule * from internal as internal_*
diff --git a/docs/examples/snek5000-tgv/src/snek5000_tgv/__init__.py b/docs/examples/snek5000-tgv/src/snek5000_tgv/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/examples/snek5000-tgv/src/snek5000_tgv/output.py b/docs/examples/snek5000-tgv/src/snek5000_tgv/output.py
new file mode 100644
index 00000000..3ca8579a
--- /dev/null
+++ b/docs/examples/snek5000-tgv/src/snek5000_tgv/output.py
@@ -0,0 +1,23 @@
+from snek5000_tgv.templates import box, makefile_usr, size
+
+from snek5000 import mpi
+from snek5000.output.base import Output as OutputBase
+
+
+class OutputTGV(OutputBase):
+    @property
+    def makefile_usr_sources(self):
+        """
+        Sources for inclusion to makefile_usr.inc
+        Dict[directory]  -> list of source files
+        """
+        return {}
+
+    def post_init(self):
+        super().post_init()
+
+        # Write additional source files to compile the simulation
+        if mpi.rank == 0 and self._has_to_save and self.sim.params.NEW_DIR_RESULTS:
+            self.write_box(box)
+            self.write_size(size)
+            self.write_makefile_usr(makefile_usr)
diff --git a/docs/examples/snek5000-tgv/src/snek5000_tgv/solver.py b/docs/examples/snek5000-tgv/src/snek5000_tgv/solver.py
new file mode 100644
index 00000000..219e4774
--- /dev/null
+++ b/docs/examples/snek5000-tgv/src/snek5000_tgv/solver.py
@@ -0,0 +1,66 @@
+from math import pi
+
+from snek5000.info import InfoSolverMake
+from snek5000.params import _complete_params_from_par_file
+from snek5000.solvers.base import SimulNek
+
+
+class InfoSolverTGV(InfoSolverMake):
+    """Contain the information on a :class:`snek5000_tgv.solver.Simul`
+    instance.
+
+    """
+
+    def _init_root(self):
+        super()._init_root()
+        self.module_name = "snek5000_tgv.solver"
+        self.class_name = "Simul"
+        self.short_name = "tgv"
+
+        self.classes.Output.module_name = "snek5000_tgv.output"
+        self.classes.Output.class_name = "OutputTGV"
+
+
+class SimulTGV(SimulNek):
+    """A solver which compiles and runs using a Snakefile."""
+
+    InfoSolver = InfoSolverTGV
+
+    @classmethod
+    def create_default_params(cls):
+        """Set default values of parameters as given in reference
+        implementation.
+
+        """
+        params = super().create_default_params()
+        # Re-define default values for parameters here, if necessary
+
+        # Mesh: from ms0.box and SIZE files
+        params.oper.Lx = params.oper.Ly = params.oper.Lz = pi
+        params.oper.nx = params.oper.ny = params.oper.nz = 8
+        params.oper.elem.order = params.oper.elem.order_out = 8
+        params.oper.elem.staggered = False
+
+        # Snek5000 also has a human-friendly interface for userParams## parameter in the par file
+        # Here we map the mesh length to userParam01, which is used in subroutine usrdat
+        params.oper._record_nek_user_params({"Lx": 1})
+
+        # Read defaults for `params.nek` from `tgv.par.cfg` (original code)
+        info_solver = cls.info_solver  # cls.InfoSolver()
+        output_cls = info_solver.import_classes()["Output"]
+        root = output_cls.get_root()
+        _complete_params_from_par_file(
+            params, root / f"{info_solver.short_name}.par.cfg"
+        )
+
+        # Boundary conditions
+        # Symmetric on top and bottom; periodic on all 6 faces
+        params.oper.boundary = ["P"] * 6
+
+        # NOTE: These are only default parameters for a minimal simulation -
+        # which can be verify different for another case. Modifications to
+        # ``params`` by the user in a separate script are also encouraged.
+        return params
+
+
+Simul = SimulTGV
diff --git a/docs/examples/snek5000-tgv/src/snek5000_tgv/templates/__init__.py b/docs/examples/snek5000-tgv/src/snek5000_tgv/templates/__init__.py
new file mode 100644
index 00000000..6373dd8d
--- /dev/null
+++ b/docs/examples/snek5000-tgv/src/snek5000_tgv/templates/__init__.py
@@ -0,0 +1,11 @@
+import jinja2
+
+env = jinja2.Environment(
+    loader=jinja2.PackageLoader("snek5000", "assets"),
+    #  loader=jinja2.PackageLoader("snek5000_canonical", "templates"),
+    undefined=jinja2.StrictUndefined,
+)
+
+box = env.get_template("box.j2")
+size = env.get_template("SIZE.j2")
+makefile_usr = env.get_template("makefile_usr.inc.j2")
diff --git a/docs/examples/snek5000-tgv/src/snek5000_tgv/tgv.par.cfg b/docs/examples/snek5000-tgv/src/snek5000_tgv/tgv.par.cfg
new file mode 100644
index 00000000..c7015fc3
--- /dev/null
+++ b/docs/examples/snek5000-tgv/src/snek5000_tgv/tgv.par.cfg
@@ -0,0 +1,25 @@
+#
+# nek parameter file
+#
+[GENERAL] 
+stopAt = endTime
+endTime = 20.0
+dt = 1e-02
+timeStepper = bdf2
+extrapolation = OIFS
+targetCFL = 1.9
+
+writeControl = runTime
+writeInterval = 0
+
+[PROBLEMTYPE]
+equation = incompNS
+
+[PRESSURE]
+residualTol = 1e-05
+residualProj = yes
+
+[VELOCITY]
+residualTol = 1e-06
+density = 1
+viscosity = -1600
diff --git a/docs/examples/snek5000-tgv/src/snek5000_tgv/tgv.usr.f b/docs/examples/snek5000-tgv/src/snek5000_tgv/tgv.usr.f
new file mode 100644
index 00000000..5e1f218b
--- /dev/null
+++ b/docs/examples/snek5000-tgv/src/snek5000_tgv/tgv.usr.f
@@ -0,0 +1,142 @@
+C-----------------------------------------------------------------------
+C  nek5000 user-file template
+C
+C  user specified routines:
+C     - userbc : boundary conditions
+C     - useric : initial conditions
+C     - uservp : variable properties
+C     - userf  : local acceleration term for fluid
+C     - userq  : local source term for scalars
+C     - userchk: general purpose routine for checking errors etc.
+C
+C-----------------------------------------------------------------------
+      subroutine uservp(ix,iy,iz,eg) ! set variable properties
+      include 'SIZE'
+      include 'TOTAL'
+      include 'NEKUSE'
+
+      return
+      end
+c-----------------------------------------------------------------------
+      subroutine userf(ix,iy,iz,eg) ! set acceleration term
+c
+c     Note: this is an acceleration term, NOT a force!
+c     Thus, ffx will subsequently be multiplied by rho(x,t).
+c
+      include 'SIZE'
+      include 'TOTAL'
+      include 'NEKUSE'
+
+      ffx=0.
+      ffy=0.
+      ffz=0.
+
+      return
+      end
+c-----------------------------------------------------------------------
+      subroutine userq(ix,iy,iz,eg) ! set source term
+      include 'SIZE'
+      include 'TOTAL'
+      include 'NEKUSE'
+
+      qvol   = 0.0
+      source = 0.0
+
+      return
+      end
+c-----------------------------------------------------------------------
+      subroutine userbc(ix,iy,iz,f,eg) ! set up boundary conditions
+
+c     NOTE: This routine may or may not be called by every processor
+
+      include 'SIZE'
+      include 'TOTAL'
+      include 'NEKUSE'
+
+      return
+      end
+c-----------------------------------------------------------------------
+      subroutine useric(ix,iy,iz,eg) ! set up initial conditions
+      include 'SIZE'
+      include 'TOTAL'
+      include 'NEKUSE'
+
+      integer e,eg
+
+      ux   = sin(x)*cos(y)*cos(z)
+      uy   = -cos(x)*sin(y)*cos(z)
+      uz   = 0.0
+
+      return
+      end
+c-----------------------------------------------------------------------
+      subroutine userchk()
+      include 'SIZE'
+      include 'TOTAL'
+
+      common /SCRNS/ w1 (lx1*ly1*lz1*lelv),
+     &               w2 (lx1*ly1*lz1*lelv),
+     &               omg(lx1*ly1*lz1*lelv,ldim)
+
+      character*80 fnames(3)
+
+      n = nx1*ny1*nz1*nelv
+
+c      if (.false.) then
+c         call blank(fnames,size(fnames)*80)
+c         fnames(1) ='rs6tgv0.f00001'
+c         fnames(2) ='rs6tgv0.f00002'
+c         fnames(3) ='rs6tgv0.f00003'
+c         call full_restart(fnames,3) ! replace istep=0,1,..
+c      endif
+c
+c      iostep_full = iostep
+c      call full_restart_save(iostep_full)
+
+      if (mod(istep,50).ne.0) return
+
+      sum_e1 = 0.
+      sum_e2 = 0.
+      call curl(omg,vx,vy,vz,.false.,w1,w2)
+      do i = 1,n
+         vv = vx(i,1,1,1)**2 + vy(i,1,1,1)**2 + vz(i,1,1,1)**2
+         oo = omg(i,1)**2 + omg(i,2)**2 + omg(i,3)**2 
+         sum_e1 = sum_e1 + vv*bm1(i,1,1,1) 
+         sum_e2 = sum_e2 + oo*bm1(i,1,1,1) 
+      enddo
+      e1 = 0.5 * glsum(sum_e1,1) / volvm1
+      e2 = 0.5 * glsum(sum_e2,1) / volvm1
+      if (nid.eq.0) write(6,2) time, e1, e2
+  2                 format(1p3e13.4,' monitor')
+
+      return
+      end
+c-----------------------------------------------------------------------
+      subroutine usrdat()   ! This routine to modify element vertices
+      include 'SIZE'
+      include 'TOTAL'
+
+      return
+      end
+c-----------------------------------------------------------------------
+      subroutine usrdat2()  ! This routine to modify mesh coordinates
+      include 'SIZE'
+      include 'TOTAL'
+
+      ! NOTE: the only change we make here from the original code
+      a = -uparam(1)
+      b = uparam(1)
+      call rescale_x(xm1,a,b)
+      call rescale_x(ym1,a,b)
+      call rescale_x(zm1,a,b)
+
+      return
+      end
+c-----------------------------------------------------------------------
+      subroutine usrdat3()
+      include 'SIZE'
+      include 'TOTAL'
+
+      return
+      end
+c-----------------------------------------------------------------------
diff --git a/docs/ipynb/executed/tuto_load_print_stdout.ipynb b/docs/ipynb/executed/tuto_load_print_stdout.ipynb
new file mode 100644
index 00000000..f80beda9
--- /dev/null
+++ b/docs/ipynb/executed/tuto_load_print_stdout.ipynb
@@ -0,0 +1,519 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "aff8cb0d-fc43-424a-b19d-46912ecd0018",
+   "metadata": {
+    "tags": []
+   },
+   "source": [
+    "# Loading simulations and visualizing data from standard output\n",
+    "\n",
+    "## Verification of Taylor-Green vortex case\n",
+    "\n",
+    "See [`snek5000-tgv`](https://github.com/exabl/snek5000/tree/main/docs/examples/snek5000-tgv) for the implementation. The simulation was executed as follows:\n",
+    "\n",
+    "```py\n",
+    "from snek5000_tgv.solver import Simul\n",
+    "\n",
+    "\n",
+    "params = Simul.create_default_params()\n",
+    "sim = Simul(params)\n",
+    "sim.make.exec()\n",
+    "```\n",
+    "\n",
+    "Here we load and process the output."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "0a67cc61-8309-4926-b13f-4499ef6d9994",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">[11/12/21 15:10:14] </span><span style=\"color: #000080; text-decoration-color: #000080\">INFO    </span> Trying to open the path relative to $FLUIDSIM_PATH  <a href=\"file:///home/avmo/src/snek5000/snek5000/src/snek5000/util/files.py\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">files.py</span></a><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">:126</span>\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[2;36m[11/12/21 15:10:14]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO    \u001b[0m Trying to open the path relative to $FLUIDSIM_PATH  \u001b]8;id=677247;file:///home/avmo/src/snek5000/snek5000/src/snek5000/util/files.py\u001b\\\u001b[2mfiles.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:126\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">                    </span><span style=\"color: #800000; text-decoration-color: #800000\">WARNING </span> Missing a configuration file describing compilers    <a href=\"file:///home/avmo/src/snek5000/snek5000/src/snek5000/output/base.py\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">base.py</span></a><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">:209</span>\n",
+       "                             and flags. Create one at either of the following                \n",
+       "                             paths to avoid future warnings:                                 \n",
+       "                             <span style=\"color: #800080; text-decoration-color: #800080\">/home/avmo/.config/snek5000/</span><span style=\"color: #ff00ff; text-decoration-color: #ff00ff\">archmage.yml</span>                        \n",
+       "                             <span style=\"color: #800080; text-decoration-color: #800080\">/home/avmo/src/snek5000/snek5000/docs/examples/snek5</span>            \n",
+       "                             <span style=\"color: #800080; text-decoration-color: #800080\">000-tgv/src/snek5000_tgv/etc/</span><span style=\"color: #ff00ff; text-decoration-color: #ff00ff\">archmage.yml</span>                       \n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[2;36m                   \u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m Missing a configuration file describing compilers    \u001b]8;id=122146;file:///home/avmo/src/snek5000/snek5000/src/snek5000/output/base.py\u001b\\\u001b[2mbase.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:209\u001b[0m\n",
+       "                             and flags. Create one at either of the following                \n",
+       "                             paths to avoid future warnings:                                 \n",
+       "                             \u001b[35m/home/avmo/.config/snek5000/\u001b[0m\u001b[95marchmage.yml\u001b[0m                        \n",
+       "                             \u001b[35m/home/avmo/src/snek5000/snek5000/docs/examples/snek5\u001b[0m            \n",
+       "                             \u001b[35m000-tgv/src/snek5000_tgv/etc/\u001b[0m\u001b[95marchmage.yml\u001b[0m                       \n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">                    </span><span style=\"color: #000080; text-decoration-color: #000080\">INFO    </span> Using default configuration for now:                 <a href=\"file:///home/avmo/src/snek5000/snek5000/src/snek5000/output/base.py\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">base.py</span></a><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">:218</span>\n",
+       "                             <span style=\"color: #800080; text-decoration-color: #800080\">/home/avmo/src/snek5000/snek5000/src/snek5000/assets</span>            \n",
+       "                             <span style=\"color: #800080; text-decoration-color: #800080\">/</span><span style=\"color: #ff00ff; text-decoration-color: #ff00ff\">default_configfile.yml</span>                                         \n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[2;36m                   \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO    \u001b[0m Using default configuration for now:                 \u001b]8;id=585356;file:///home/avmo/src/snek5000/snek5000/src/snek5000/output/base.py\u001b\\\u001b[2mbase.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:218\u001b[0m\n",
+       "                             \u001b[35m/home/avmo/src/snek5000/snek5000/src/snek5000/assets\u001b[0m            \n",
+       "                             \u001b[35m/\u001b[0m\u001b[95mdefault_configfile.yml\u001b[0m                                         \n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">                    </span><span style=\"color: #000080; text-decoration-color: #000080\">INFO    </span> ******************************************           <a href=\"file:///home/avmo/src/snek5000/snek5000/src/snek5000/output/base.py\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">base.py</span></a><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">:634</span>\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[2;36m                   \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO    \u001b[0m ******************************************           \u001b]8;id=976021;file:///home/avmo/src/snek5000/snek5000/src/snek5000/output/base.py\u001b\\\u001b[2mbase.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:634\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">                    </span><span style=\"color: #000080; text-decoration-color: #000080\">INFO    </span> solver: <span style=\"font-weight: bold\">&lt;</span><span style=\"color: #ff00ff; text-decoration-color: #ff00ff; font-weight: bold\">class</span><span style=\"color: #000000; text-decoration-color: #000000\"> </span><span style=\"color: #008000; text-decoration-color: #008000\">'snek5000_tgv.output.OutputTGV'</span><span style=\"font-weight: bold\">&gt;</span>      <a href=\"file:///home/avmo/src/snek5000/snek5000/src/snek5000/output/base.py\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">base.py</span></a><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">:635</span>\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[2;36m                   \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO    \u001b[0m solver: \u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'snek5000_tgv.output.OutputTGV'\u001b[0m\u001b[1m>\u001b[0m      \u001b]8;id=358971;file:///home/avmo/src/snek5000/snek5000/src/snek5000/output/base.py\u001b\\\u001b[2mbase.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:635\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">                    </span><span style=\"color: #000080; text-decoration-color: #000080\">INFO    </span> path_run: <span style=\"color: #800080; text-decoration-color: #800080\">/home/avmo/.local/scratch/data/</span><span style=\"color: #ff00ff; text-decoration-color: #ff00ff\">tgv_run_8x8</span> <a href=\"file:///home/avmo/src/snek5000/snek5000/src/snek5000/output/base.py\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">base.py</span></a><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">:636</span>\n",
+       "                             <span style=\"color: #ff00ff; text-decoration-color: #ff00ff\">x8_V1pix1pix1pi_2021-11-12_10-27-42</span>                             \n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[2;36m                   \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO    \u001b[0m path_run: \u001b[35m/home/avmo/.local/scratch/data/\u001b[0m\u001b[95mtgv_run_8x8\u001b[0m \u001b]8;id=472679;file:///home/avmo/src/snek5000/snek5000/src/snek5000/output/base.py\u001b\\\u001b[2mbase.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:636\u001b[0m\n",
+       "                             \u001b[95mx8_V1pix1pix1pi_2021-11-12_10-27-42\u001b[0m                             \n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">                    </span><span style=\"color: #000080; text-decoration-color: #000080\">INFO    </span> ******************************************           <a href=\"file:///home/avmo/src/snek5000/snek5000/src/snek5000/output/base.py\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">base.py</span></a><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">:637</span>\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[2;36m                   \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO    \u001b[0m ******************************************           \u001b]8;id=725635;file:///home/avmo/src/snek5000/snek5000/src/snek5000/output/base.py\u001b\\\u001b[2mbase.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:637\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "sim:                <class 'snek5000_tgv.solver.SimulTGV'>\n",
+      "sim.output:         <class 'snek5000_tgv.output.OutputTGV'>\n"
+     ]
+    }
+   ],
+   "source": [
+    "from snek5000 import load\n",
+    "\n",
+    "sim = load(\"tgv_run_8x8x8_V1pix1pix1pi_2021-11-12_10-27-42\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "11a7ada8-7c6a-499a-9452-f9041f454de8",
+   "metadata": {},
+   "source": [
+    "## Visualize raw data via ``sim.output.print_stdout``\n",
+    "\n",
+    "In subroutine `userchk` of `tgv.usr.f`, the time stamp, kinetic energy and enstrophy are output into standard output, with a keyword `monitor` at the end of the line. We can use regular expressions to extract these lines. If you are new to regular expressions, this website can help you <https://regex101.com/>."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "1b197b75-9a68-4ff2-9561-5efd04db626a",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">[11/12/21 15:10:22] </span><span style=\"color: #000080; text-decoration-color: #000080\">INFO    </span> Searching for a log file<span style=\"color: #808000; text-decoration-color: #808000\">...</span>                   <a href=\"file:///home/avmo/src/snek5000/snek5000/src/snek5000/output/print_stdout.py\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">print_stdout.py</span></a><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">:29</span>\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[2;36m[11/12/21 15:10:22]\u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO    \u001b[0m Searching for a log file\u001b[33m...\u001b[0m                   \u001b]8;id=787945;file:///home/avmo/src/snek5000/snek5000/src/snek5000/output/print_stdout.py\u001b\\\u001b[2mprint_stdout.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:29\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "['   0.0000E+00   1.2500E-01   3.7500E-01 ',\n",
+       " '   5.0000E-01   1.2476E-01   3.8418E-01 ',\n",
+       " '   1.0000E+00   1.2451E-01   4.1504E-01 ',\n",
+       " '   1.5000E+00   1.2423E-01   4.7292E-01 ',\n",
+       " '   2.0000E+00   1.2391E-01   5.6602E-01 ',\n",
+       " '   2.5000E+00   1.2352E-01   7.0473E-01 ',\n",
+       " '   3.0000E+00   1.2302E-01   9.0194E-01 ',\n",
+       " '   3.5000E+00   1.2236E-01   1.1860E+00 ',\n",
+       " '   4.0000E+00   1.2143E-01   1.6307E+00 ',\n",
+       " '   4.5000E+00   1.2001E-01   2.3444E+00 ',\n",
+       " '   5.0000E+00   1.1776E-01   3.2496E+00 ',\n",
+       " '   5.5000E+00   1.1530E-01   3.9581E+00 ',\n",
+       " '   6.0000E+00   1.1258E-01   4.6560E+00 ',\n",
+       " '   6.5000E+00   1.0921E-01   5.6664E+00 ',\n",
+       " '   7.0000E+00   1.0498E-01   6.6638E+00 ',\n",
+       " '   7.5000E+00   1.0013E-01   7.5919E+00 ',\n",
+       " '   8.0000E+00   9.4446E-02   8.3471E+00 ',\n",
+       " '   8.5000E+00   8.8442E-02   8.6116E+00 ',\n",
+       " '   9.0000E+00   8.2157E-02   8.8213E+00 ',\n",
+       " '   9.5000E+00   7.6227E-02   8.2313E+00 ',\n",
+       " '   1.0000E+01   7.0723E-02   7.8817E+00 ',\n",
+       " '   1.0500E+01   6.5350E-02   7.7685E+00 ',\n",
+       " '   1.1000E+01   6.0131E-02   7.5665E+00 ',\n",
+       " '   1.1500E+01   5.5136E-02   7.3362E+00 ',\n",
+       " '   1.2000E+01   5.0323E-02   6.7903E+00 ',\n",
+       " '   1.2500E+01   4.6143E-02   5.8107E+00 ',\n",
+       " '   1.3000E+01   4.2490E-02   5.2746E+00 ',\n",
+       " '   1.3500E+01   3.9236E-02   4.6116E+00 ',\n",
+       " '   1.4000E+01   3.6426E-02   3.9739E+00 ',\n",
+       " '   1.4500E+01   3.3953E-02   3.5195E+00 ',\n",
+       " '   1.5000E+01   3.1749E-02   3.1533E+00 ',\n",
+       " '   1.5500E+01   2.9786E-02   2.8365E+00 ',\n",
+       " '   1.6000E+01   2.7996E-02   2.5802E+00 ',\n",
+       " '   1.6500E+01   2.6363E-02   2.3575E+00 ',\n",
+       " '   1.7000E+01   2.4870E-02   2.1772E+00 ',\n",
+       " '   1.7500E+01   2.3510E-02   1.9945E+00 ',\n",
+       " '   1.8000E+01   2.2273E-02   1.8077E+00 ',\n",
+       " '   1.8500E+01   2.1148E-02   1.6439E+00 ',\n",
+       " '   1.9000E+01   2.0115E-02   1.5100E+00 ',\n",
+       " '   1.9500E+01   1.9158E-02   1.4139E+00 ',\n",
+       " '   2.0000E+01   1.8257E-02   1.3348E+00 ']"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "import re\n",
+    "\n",
+    "monitor = re.findall('(.*)monitor$', sim.output.print_stdout.text, re.MULTILINE)\n",
+    "monitor"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "6e062312-fb5f-401c-a3c5-da2edfd97203",
+   "metadata": {},
+   "source": [
+    "It is also possible to achieve the same using Python's string manipulation and list comprehension:\n",
+    "\n",
+    "```py\n",
+    "monitor = [\n",
+    "    line[:-len(\"monitor\")]  # Or in Python >= 3.9, line.removesuffix(\"monitor\")\n",
+    "    for line in sim.output.print_stdout.text.splitlines()\n",
+    "    if line.endswith(\"monitor\")\n",
+    "]\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "d1461f34-7d89-4e49-b61b-53e6c43d846f",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>time</th>\n",
+       "      <th>energy</th>\n",
+       "      <th>enstrophy</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>0.12500</td>\n",
+       "      <td>0.37500</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>0.5</td>\n",
+       "      <td>0.12476</td>\n",
+       "      <td>0.38418</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>1.0</td>\n",
+       "      <td>0.12451</td>\n",
+       "      <td>0.41504</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>1.5</td>\n",
+       "      <td>0.12423</td>\n",
+       "      <td>0.47292</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>2.0</td>\n",
+       "      <td>0.12391</td>\n",
+       "      <td>0.56602</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "   time   energy  enstrophy\n",
+       "0   0.0  0.12500    0.37500\n",
+       "1   0.5  0.12476    0.38418\n",
+       "2   1.0  0.12451    0.41504\n",
+       "3   1.5  0.12423    0.47292\n",
+       "4   2.0  0.12391    0.56602"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "import pandas as pd\n",
+    "\n",
+    "df = pd.DataFrame(\n",
+    "    ((float(value) for value in line.split()) for line in monitor),\n",
+    "    columns=(\"time\", \"energy\", \"enstrophy\")\n",
+    ")\n",
+    "df.head()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3737f0b1-cd2c-4bed-8791-9fc09d207bf8",
+   "metadata": {},
+   "source": [
+    "### Reference data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "94f7fc4a-1fb2-4908-b69b-c4ce7f669515",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>time</th>\n",
+       "      <th>ref:energy</th>\n",
+       "      <th>ref:dE/dt</th>\n",
+       "      <th>ref:enstrophy</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.125000</td>\n",
+       "      <td>0.000469</td>\n",
+       "      <td>0.375000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>0.01</td>\n",
+       "      <td>0.124995</td>\n",
+       "      <td>0.000469</td>\n",
+       "      <td>0.374990</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>0.02</td>\n",
+       "      <td>0.124991</td>\n",
+       "      <td>0.000469</td>\n",
+       "      <td>0.374987</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>0.03</td>\n",
+       "      <td>0.124986</td>\n",
+       "      <td>0.000469</td>\n",
+       "      <td>0.374993</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>0.04</td>\n",
+       "      <td>0.124981</td>\n",
+       "      <td>0.000469</td>\n",
+       "      <td>0.375006</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "   time  ref:energy  ref:dE/dt  ref:enstrophy\n",
+       "0  0.00    0.125000   0.000469       0.375000\n",
+       "1  0.01    0.124995   0.000469       0.374990\n",
+       "2  0.02    0.124991   0.000469       0.374987\n",
+       "3  0.03    0.124986   0.000469       0.374993\n",
+       "4  0.04    0.124981   0.000469       0.375006"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ref = pd.read_csv(\n",
+    "    \"../../../lib/Nek5000/examples/tgv/ref/data\",\n",
+    "    sep=\" \",\n",
+    "    names=(\"time\", \"ref:energy\", \"ref:dE/dt\", \"ref:enstrophy\"),\n",
+    "    comment=\"#\"\n",
+    ")\n",
+    "ref.head()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "c9409231-71e7-4c53-9181-2637c3505fdc",
+   "metadata": {},
+   "source": [
+    "### Result"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "id": "e1074023-076c-4a00-a46a-f7ead0271daf",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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+WeEhIQgLi4OISEhMDQ01OXpEELuEGrQHiLUajXee+89eHh4wNjYGKGhofjll18AAEePHgWPx8Nff/2FqKgoiMVijB49Grm5udzn09PTER8fDzMzM0gkEkRGRuLcuXM4evQoHnnkEUilUvB4PPB4PLz99tsAAHd3d6xZswaLFi2CRCLB448/DgDYuXMngoKCIBKJ4O7ujo8++kijrN2fW7hwIUxMTODk5ITExMQe51RXV4fZs2dDLBbDx8cHv//+O4CuuW28vb3xn//8RyN/WloaeDwe8vPz++26kqHLwcEBc+bMwXvvvYfnnnsO0dHRMDQ0RGVlJXbt2oVXX30VGzZswPnz5xEbGws3Nzeo1Wqkp6fj008/xSuvvILvv/8eRUVFuj4VQsgAG9Z9dhhjUKp1s2SEId9QqxE+a9euxXfffYf169fDx8cHx48fx5NPPon9+/eDMYb4+HjExsbi/fffh42NDZ588kmoVCqcOnUKABAcHIzw8HC88cYbEAgESEtLg6+vLwICArB582a89dZbXHBkamoKU1NTuLu7o7GxEW+99RbXt6apqQkxMTF4++23sWDBApw+fRpPP/00Nm3ahCVLlgDoCnYaGhrw+uuvY86cOdi/fz9eeOEF7N27F3fddReArj47zs7O+OCDDxAdHY1PPvkEX331FUpKSmBlZYV//etf2L59Oy5dusRdg+effx5paWncX/B3EvXZGRra29tx/vx5nD59GgUFBVy6mZkZ4uLi4Ovri/z8fK42CADCwsLw1FNP6ajEhJBu1EFZC9oEOwqVAv86/y+dlPP1yNchFPStSUgul8PKygqHDh3CqFGjuPSlS5eira0Njz/+OOLj43Ho0CFMnjwZALBnzx7MmDED7e3tMDIygkQiwSeffILFixf32P/1+uy4u7sjPDwcu3bt4tIeeugh1NbW4sCBA1zaK6+8gt27d3OBibu7OwICArB3714uzwMPPACZTIY9e/YA6Ap23nzzTaxZswYA0NraClNTU+zduxfTpk1DRUUFXF1dcfr0acTExECpVMLR0RH/+c9/ej2HgUbBztBTU1OD06dP4/Tp0xodl729vTF69GiYmZkhJSUFMTExCAkJAQBUV1dj+/btGDVqFMLDw+lnTcgdRB2Uh7n8/Hy0tbVxtSLdFAoFwsPDufdXd8jsXtagpqYGrq6uWLlyJZYu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\n",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "ax = df.plot(\"time\", [\"enstrophy\", \"energy\"], logy=True, colormap=\"Accent\")\n",
+    "ref.plot(\n",
+    "    \"time\",\n",
+    "    [\"ref:enstrophy\", \"ref:energy\"],\n",
+    "    ax=ax,\n",
+    "    style=\"--\",\n",
+    "    logy=True,\n",
+    "    colormap=\"Accent\"\n",
+    ")\n",
+    "_ = ax.set(\n",
+    "    title=f\"Taylor-Green vortex: evolution of K.E. and enstrophy. Re={-sim.params.nek.velocity.viscosity}\"\n",
+    ")"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "py-snek",
+   "language": "python",
+   "name": "py-snek"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.8.9"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/tutorials.rst b/docs/tutorials.rst
index 5460b9a8..13129a8c 100644
--- a/docs/tutorials.rst
+++ b/docs/tutorials.rst
@@ -8,6 +8,7 @@ Tutorials
 
 .. toctree::
     :caption: Demo of the Periodic Hill case
-    
+
     ipynb/tuto_simul_setup
-    ipynb/executed/tuto_simul_exec
\ No newline at end of file
+    ipynb/executed/tuto_simul_exec
+    ipynb/executed/tuto_load_print_stdout
diff --git a/src/snek5000/__init__.py b/src/snek5000/__init__.py
index 5731ab0b..64a3d96d 100644
--- a/src/snek5000/__init__.py
+++ b/src/snek5000/__init__.py
@@ -33,7 +33,6 @@
     import importlib_resources as resources
 import os
 import weakref
-from pathlib import Path
 
 from fluiddyn.util import mpi  # noqa: F401
 
@@ -72,7 +71,7 @@ def get_asset(asset_name):
     return asset
 
 
-def load_simul(path_dir=".", session_id=None):
+def load_simul(path_dir=".", session_id=None, reader=True):
     """Loads a simulation
 
     .. todo::
@@ -91,6 +90,14 @@ def load_simul(path_dir=".", session_id=None):
         `session_id` and `path_session` values last recorded in the
         `params_simul.xml` file
 
+    reader: bool or str
+        By default (`reader=True`) invokes
+        :meth:`sim.output.phys_fields.init_reader()
+        <snek5000.output.phys_fields.PhysFields.init_reader>`. If a string is
+        provided, it is passed onto
+        :meth:`sim.output.phys_fields.change_reader(reader)
+        <snek5000.output.phys_fields.PhysFields.change_reader>`.
+
 
     .. hint::
 
@@ -99,7 +106,9 @@ def load_simul(path_dir=".", session_id=None):
         <snek5000.output.base.Output.get_field_file>` method
 
     """
-    path_dir = Path(path_dir)
+    from snek5000.util.files import _path_try_from_fluidsim_path
+
+    path_dir = _path_try_from_fluidsim_path(path_dir)
 
     # Load simulation class
     from snek5000.solvers import import_cls_simul, get_solver_short_name
@@ -129,6 +138,17 @@ def load_simul(path_dir=".", session_id=None):
         params.output.path_session = _make_path_session(path_dir, session_id)
 
     sim = Simul(params)
+
+    if reader:
+        if reader is True:
+            sim.output.phys_fields.init_reader()
+        elif isinstance(reader, str):
+            sim.output.phys_fields.change_reader(reader)
+        else:
+            raise ValueError(
+                f"Reader should be either True or False or one of {params.output.phys_fields.available_readers = }"
+            )
+
     return sim
 
 
diff --git a/src/snek5000/output/base.py b/src/snek5000/output/base.py
index c033d1c2..be91f9ce 100644
--- a/src/snek5000/output/base.py
+++ b/src/snek5000/output/base.py
@@ -66,7 +66,10 @@ class Output(OutputCore):
     def excludes(self):
         """Prefixes and suffixes of files which should be excluded from being
         copied."""
-        return {"prefix": "__", "suffix": (".vimrc", ".tar.gz", ".o", ".py", ".usr.f")}
+        return {
+            "prefix": "__",
+            "suffix": (".vimrc", ".tar.gz", ".o", ".py", ".usr.f", ".par.cfg"),
+        }
 
     @property
     def makefile_usr_sources(self):
diff --git a/src/snek5000/util/files.py b/src/snek5000/util/files.py
index 051c72c9..93dd0adb 100644
--- a/src/snek5000/util/files.py
+++ b/src/snek5000/util/files.py
@@ -2,6 +2,8 @@
 from pathlib import Path
 from shutil import copy2
 
+from fluiddyn.io import FLUIDSIM_PATH
+
 from .. import logger
 from ..params import load_params
 
@@ -111,3 +113,17 @@ def create_session(case, re2, ma2, par):
 
     # Copy par files to run without recompiling
     copy2(par, session_dir / par)
+
+
+def _path_try_from_fluidsim_path(path_dir):
+    """Converts to a :class:`pathlib.Path` object and if it does not exists,
+    attempts a path relative to environment variable ``FLUIDSIM_PATH``.
+
+    """
+    path = Path(path_dir)
+
+    if not path.exists():
+        logger.info("Trying to open the path relative to $FLUIDSIM_PATH")
+        path = Path(FLUIDSIM_PATH) / path_dir
+
+    return path
diff --git a/src/snek5000/util/restart.py b/src/snek5000/util/restart.py
index 382a571f..fe07afdd 100644
--- a/src/snek5000/util/restart.py
+++ b/src/snek5000/util/restart.py
@@ -7,13 +7,11 @@
 from pathlib import Path
 from warnings import warn
 
-from fluiddyn.io import FLUIDSIM_PATH
-
 from ..log import logger
 from ..output import _make_path_session, _parse_path_run_session_id
 from ..params import load_params
 from ..solvers import get_solver_short_name, import_cls_simul
-from .files import next_path
+from .files import _path_try_from_fluidsim_path, next_path
 
 
 class SnekRestartError(Exception):
@@ -186,11 +184,7 @@ def load_for_restart(
       framework) with appropriate ``chkp_fnumber`` to restart from.
 
     """
-    path = Path(path_dir)
-
-    if not path.exists():
-        logger.info("Trying to open the path relative to $FLUIDSIM_PATH")
-        path = Path(FLUIDSIM_PATH) / path_dir
+    path = _path_try_from_fluidsim_path(path_dir)
 
     # In case the user specifies the path to a session sub-directory
     if session_id is None:


Test patch:
diff --git a/tests/test_restart.py b/tests/test_restart.py
index c00d1a51..0e41d4cc 100644
--- a/tests/test_restart.py
+++ b/tests/test_restart.py
@@ -2,6 +2,7 @@
 import pytest
 import xarray as xr
 
+import snek5000
 from snek5000.output import _make_path_session
 from snek5000.params import load_params
 from snek5000.util.restart import SnekRestartError, get_status, load_for_restart
@@ -89,13 +90,32 @@ def test_restart(sim_executed):
 
 def test_phys_fields_uninit(sim):
     """Should error if trying to load / get_var without executing init_reader."""
-    with pytest.raises(RuntimeError):
+    with pytest.raises(
+        RuntimeError, match="The reader and the method has not initialized yet."
+    ):
         sim.output.phys_fields.load()
 
-    with pytest.raises(RuntimeError):
+    with pytest.raises(
+        RuntimeError, match="The reader and the method has not initialized yet."
+    ):
         sim.output.phys_fields.get_var()
 
 
+@pytest.mark.parametrize("reader", (True, "pymech_stats"))
+def test_load_with_phys_fields(sim, reader):
+    sim2 = snek5000.load(sim.path_run, reader=reader)
+    with pytest.raises(FileNotFoundError):
+        sim2.output.phys_fields.load()
+
+    with pytest.raises(FileNotFoundError):
+        sim2.output.phys_fields.get_var("ux")
+
+
+def test_load_wrong_phys_fields_reader(sim):
+    with pytest.raises(ValueError, match="params.output.phys_fields.available_readers"):
+        snek5000.load(sim.path_run, reader=1.0)
+
+
 pymech_issue = (
     "Pymech does not support non-box meshes, and snek5000-phill has "
     "such a geometry: https://github.com/eX-Mech/pymech/issues/31"