Part 1. Running the simulations

It is common for a study to have to run few similar simulations with different values of some parameters. With Fluidsim, we usually do that with a Python script with arguments.

import shutil
import subprocess
from pathlib import Path

from IPython.display import Markdown as md
%matplotlib inline
import matplotlib.pyplot as plt

plt.rc("figure", dpi=80)
import ipynbname

nb_path = ipynbname.path()
path_this_dir = nb_path.parent
script_run_simul = path_this_dir / "run_simul.py"
assert script_run_simul.exists()
script_submit_simul = path_this_dir / "submit_simul.py"
assert script_submit_simul.exists()

One simulation script using argparse for the input parameters

It is convenient to write one script with input parameters. The simplest solution is to use the standard library module argparse.

We can also in this script handle the restart of simulations. However, here we keep it simple and do not care about restarting.

So here is our script “run_simul.py”, which is a slightly simplified version of a script used for a real study.

with open(script_run_simul) as file:
    code = file.read()

md("```Python\n" + code + "```")
from math import pi
import argparse

from fluiddyn.util import mpi

from fluidsim.solvers.ns3d.strat.solver import Simul
from fluidsim.base.forcing.milestone import PeriodicUniform

from fluidsim.extend_simul.spatial_means_regions_milestone import (
    SpatialMeansRegions,
)
from fluidsim.extend_simul import extend_simul_class

Simul = extend_simul_class(Simul, SpatialMeansRegions)

parser = argparse.ArgumentParser()
parser.add_argument("-N", type=float, default=0.5, help="Brunt–Väisälä frequency")

parser.add_argument(
    "-D", "--diameter", type=float, default=0.25, help="Diameter of the cylinders"
)

parser.add_argument(
    "-s",
    "--speed",
    type=float,
    default=0.1,
    help="Maximum speed of the cylinders",
)

parser.add_argument(
    "-nc", "--number_cylinders", type=int, default=3, help="Number of cylinders"
)

parser.add_argument(
    "-nypc",
    "--ny_per_cylinder",
    type=int,
    default=60,
    help="Number of numerical points for one cylinder",
)

parser.add_argument(
    "-np",
    "--n_periods",
    type=float,
    default=5,
    help="Number of periods",
)

parser.add_argument(
    "-oi",
    "--only_init",
    action="store_true",
    help="Only run initialization phase",
)

parser.add_argument(
    "-wbl",
    "--width_boundary_layers",
    type=float,
    default=0.02,
    help="width boundary layers",
)


def main(args):

    params = Simul.create_default_params()

    diameter = args.diameter  # m
    speed = args.speed  # m/s
    params.N = args.N  # rad/s

    mesh = 3 * diameter
    number_cylinders = args.number_cylinders

    ly = params.oper.Ly = mesh * number_cylinders
    lx = params.oper.Lx = 1.5 * 3
    ny = params.oper.ny = args.ny_per_cylinder * number_cylinders

    nx_float = ny * lx / ly
    nx = params.oper.nx = round(nx_float)
    assert nx == nx_float

    dx = lx / nx
    mpi.printby0(f"{dx = }")

    lz = params.oper.Lz = mesh
    params.oper.nz = round(lz / dx)

    params.oper.coef_dealiasing = 0.8
    params.oper.NO_SHEAR_MODES = True
    params.no_vz_kz0 = True

    params.forcing.enable = True
    params.forcing.type = "milestone"
    params.forcing.milestone.nx_max = min(
        nx, round(16 * number_cylinders * nx / ny)
    )
    mpi.printby0(f"{params.forcing.milestone.nx_max = }")

    objects = params.forcing.milestone.objects

    objects.number = number_cylinders
    objects.diameter = diameter
    objects.width_boundary_layers = args.width_boundary_layers
    assert objects.width_boundary_layers < diameter / 4

    movement = params.forcing.milestone.movement

    movement.type = "periodic_uniform"
    movement.periodic_uniform.length = lx - 2 * diameter
    movement.periodic_uniform.length_acc = 0.25
    movement.periodic_uniform.speed = speed

    params.init_fields.type = "noise"
    params.init_fields.noise.velo_max = 5e-3

    movement = PeriodicUniform(
        speed,
        movement.periodic_uniform.length,
        movement.periodic_uniform.length_acc,
        lx,
    )

    params.time_stepping.t_end = movement.period * args.n_periods
    params.time_stepping.deltat_max = 0.04 * diameter / speed
    mpi.printby0(f"{params.time_stepping.deltat_max = }")

    params.nu_2 = 1e-6

    epsilon_eval = 0.02 * speed ** 3 / mesh
    eta_elav = (params.nu_2 ** 3 / epsilon_eval) ** (1 / 4)

    kmax = params.oper.coef_dealiasing * pi / dx
    eta_kmax = 2 * pi / kmax
    nu_2_needed = (epsilon_eval * eta_kmax ** 4) ** (1 / 3)

    mpi.printby0("eta_elav * kmax:", eta_elav * kmax)

    freq_nu4 = 0.5 * (nu_2_needed - params.nu_2) * kmax ** 2

    mpi.printby0("freq_nu4", freq_nu4)
    mpi.printby0("freq_nu4 / freq_nu2", freq_nu4 / (params.nu_2 * kmax ** 2))

    params.nu_4 = freq_nu4 / kmax ** 4

    params.output.sub_directory = "tutorial_parametric_study"
    if nx > 500:
        params.output.periods_print.print_stdout = movement.period / 50.0
    else:
        params.output.periods_print.print_stdout = movement.period / 20.0

    periods_save = params.output.periods_save
    periods_save.phys_fields = movement.period / 10.0
    periods_save.spatial_means = movement.period / 1000.0
    periods_save.spatial_means_regions = movement.period / 1000.0
    periods_save.spect_energy_budg = movement.period / 50.0
    periods_save.spectra = movement.period / 100.0
    periods_save.spatiotemporal_spectra = 2 * pi / params.N / 4

    params.output.spatial_means_regions.xmin = [0, 0.1, 0.4, 0.7]
    params.output.spatial_means_regions.xmax = [1, 0.3, 0.6, 0.9]

    spatiotemporal_spectra = params.output.spatiotemporal_spectra
    spatiotemporal_spectra.file_max_size = 20.0
    spatiotemporal_spectra.probes_region = (10 * lx / ly, 10, 10)

    params.output.spectra.kzkh_periodicity = 2

    sim = Simul(params)

    if not args.only_init:
        sim.time_stepping.start()

    return params, sim


if __name__ == "__main__":
    args = parser.parse_args()
    mpi.printby0(args)

    params, sim = main(args)

One script to submit jobs on a cluster

Usually for parametric studies, we need to launch several simulations with different parameters. There are great tools to automate such scientific workflows (for example execo) but here, we keep it simple and just show a small script to launch simulations.

Since modifying manually launching scripts in Bash is very error prone, we automate the process with the fluiddyn.clusters package.

with open(script_submit_simul) as file:
    code = file.read()

md("```Python\n" + code + "```")
from fluiddyn.clusters.legi import Calcul8 as Cluster

cluster = Cluster()

cluster.commands_setting_env = [
    "source /etc/profile",
    ". $HOME/miniconda3/etc/profile.d/conda.sh",
    "conda activate env_fluidsim",
    "export FLUIDSIM_PATH=/fsnet/project/watu/2020/20MILESTONE",
]

diameters = [0.25, 0.5]
velocities = [0.05, 0.1, 0.2]

for diameter in diameters:
    for speed in velocities:
        cluster.submit_script(
            f"run_simul.py -D {diameter} -s {speed}",
            name_run="milestone",
            nb_cores_per_node=10,
            nb_mpi_processes=10,
            omp_num_threads=1,
            ask=False,
        )
import fluidsim as fls

path_dir_data = Path(fls.FLUIDSIM_PATH) / "tutorial_parametric_study"
shutil.rmtree(path_dir_data, ignore_errors=True)

For this tutorial, we don’t submit the simulations on a cluster but just run 3 simulations sequentially by calling directly mpirun.

longer_simulations = True
if longer_simulations:
    ny_per_cylinder = 48
    speeds = [0.01, 0.02, 0.04, 0.06, 0.08]
else:
    ny_per_cylinder = 24
    speeds = [0.08]
logs = []
for isim, speed in enumerate(speeds):
    print("-" * 79 + f"\nSimulation {isim}")
    process = subprocess.run(
        (
            f"mpirun -np 2 python {script_run_simul} "
            f"-N 0.2 --diameter 0.5 --speed {speed} "
            f"--ny_per_cylinder {ny_per_cylinder} "
            "--number_cylinders 3 --width_boundary_layers 0.1 --n_periods 2"
        ).split(),
        stdout=subprocess.PIPE,
        stderr=subprocess.DEVNULL,  # hiding irrelevant warnings
        text=True,
    )
    lines = process.stdout.split("\n")
    print("\n".join(lines[:50]) + "\n[...]\n" + "\n".join(lines[-10:]))
-------------------------------------------------------------------------------
Simulation 0
Namespace(N=0.2, diameter=0.5, speed=0.01, number_cylinders=3, ny_per_cylinder=48, n_periods=2.0, only_init=False, width_boundary_layers=0.1)
dx = 0.03125
params.forcing.milestone.nx_max = 48
params.time_stepping.deltat_max = 2.0
eta_elav * kmax: 0.23667650850121094
freq_nu4 0.25288935238750754
freq_nu4 / freq_nu2 39.09766924201435

--------
nb_proc: 2
N0 = 48 ; N1 = 144 ; N2 = 144
Initialization (FFT3DMPIWithFFTWMPI3D) done in 0.951517 s
*************************************
Program fluidsim
sim:                <class 'fluidsim_core.extend_simul.extend_simul_class.<locals>.NewSimul'>
sim.output:         <class 'fluidsim.solvers.ns3d.strat.output.Output'>
sim.oper:           <class 'fluidsim.operators.operators3d.OperatorsPseudoSpectral3D'>
sim.state:          <class 'fluidsim.solvers.ns3d.strat.state.StateNS3DStrat'>
sim.time_stepping:  <class 'fluidsim.solvers.ns3d.time_stepping.TimeSteppingPseudoSpectralNS3D'>
sim.init_fields:    <class 'fluidsim.solvers.ns3d.init_fields.InitFieldsNS3D'>
sim.forcing:        <class 'fluidsim.solvers.ns3d.forcing.ForcingNS3D'>

solver ns3d.strat, RK4 and parallel (2 proc.)
type fft: fluidfft.fft3d.mpi_with_fftwmpi3d
nx =    144 ; ny =    144 ; nz =     48
Lx = 4.5 ; Ly = 4.5 ; Lz = 1.5
path_run =
/home/pierre/Sim_data/tutorial_parametric_study/ns3d.strat_144x144x48_V4.5x4.5x1.5_N0.2_Lf3.5_U0.01_D0.5_2021-10-05_15-35-47
init_fields.type: noise

Initialization outputs:
sim.output.phys_fields:       <class 'fluidsim.base.output.phys_fields3d.PhysFieldsBase3D'>
sim.output.spatial_means:     <class 'fluidsim.solvers.ns3d.strat.output.spatial_means.SpatialMeansNS3DStrat'>
sim.output.spatial_means_regions:<class 'fluidsim.extend_simul.spatial_means_regions_milestone.SpatialMeansRegions'>
sim.output.spatiotemporal_spectra:<class 'fluidsim.solvers.ns3d.output.spatiotemporal_spectra.SpatioTemporalSpectraNS3D'>
sim.output.spectra:           <class 'fluidsim.solvers.ns3d.strat.output.spectra.SpectraNS3DStrat'>
sim.output.spect_energy_budg: <class 'fluidsim.solvers.ns3d.strat.output.spect_energy_budget.SpectralEnergyBudgetNS3DStrat'>
sim.output.temporal_spectra:  <class 'fluidsim.base.output.temporal_spectra.TemporalSpectra3D'>

Memory usage at the end of init. (equiv. seq.): 637.14453125 Mo
Size of state_spect (equiv. seq.): 32.292864 Mo
*************************************
Beginning of the computation
save state_phys in file state_phys_t000000.000.nc
    compute until t =       1600
it =      0 ; t =            0 ; deltat  =          2
              energy = 2.627e-06 ; Delta energy = +0.000e+00

MEMORY_USAGE:                  639.140625 Mo
it =     20 ; t =           40 ; deltat  =          2
[...]
MEMORY_USAGE:                  746.9921875 Mo
Computation completed in  2183.46 s
path_run =
/home/pierre/Sim_data/tutorial_parametric_study/ns3d.strat_144x144x48_V4.5x4.5x1.5_N0.2_Lf3.5_U0.01_D0.5_2021-10-05_15-35-47
it =   2117 ; t =      1600.67 ; deltat  =    0.70343
              energy = 2.778e-05 ; Delta energy = -4.844e-06
              estimated remaining duration = -1 day, 23:59:59
MEMORY_USAGE:                  747.05859375 Mo
save state_phys in file state_phys_t001600.674.nc

-------------------------------------------------------------------------------
Simulation 1
Namespace(N=0.2, diameter=0.5, speed=0.02, number_cylinders=3, ny_per_cylinder=48, n_periods=2.0, only_init=False, width_boundary_layers=0.1)
dx = 0.03125
params.forcing.milestone.nx_max = 48
params.time_stepping.deltat_max = 1.0
eta_elav * kmax: 0.14072869393182103
freq_nu4 0.509012776745164
freq_nu4 / freq_nu2 78.6953384840287

--------
nb_proc: 2
N0 = 48 ; N1 = 144 ; N2 = 144
Initialization (FFT3DMPIWithFFTWMPI3D) done in 0.687727 s
*************************************
Program fluidsim
sim:                <class 'fluidsim_core.extend_simul.extend_simul_class.<locals>.NewSimul'>
sim.output:         <class 'fluidsim.solvers.ns3d.strat.output.Output'>
sim.oper:           <class 'fluidsim.operators.operators3d.OperatorsPseudoSpectral3D'>
sim.state:          <class 'fluidsim.solvers.ns3d.strat.state.StateNS3DStrat'>
sim.time_stepping:  <class 'fluidsim.solvers.ns3d.time_stepping.TimeSteppingPseudoSpectralNS3D'>
sim.init_fields:    <class 'fluidsim.solvers.ns3d.init_fields.InitFieldsNS3D'>
sim.forcing:        <class 'fluidsim.solvers.ns3d.forcing.ForcingNS3D'>

solver ns3d.strat, RK4 and parallel (2 proc.)
type fft: fluidfft.fft3d.mpi_with_fftwmpi3d
nx =    144 ; ny =    144 ; nz =     48
Lx = 4.5 ; Ly = 4.5 ; Lz = 1.5
path_run =
/home/pierre/Sim_data/tutorial_parametric_study/ns3d.strat_144x144x48_V4.5x4.5x1.5_N0.2_Lf3.5_U0.02_D0.5_2021-10-05_16-12-36
init_fields.type: noise

Initialization outputs:
sim.output.phys_fields:       <class 'fluidsim.base.output.phys_fields3d.PhysFieldsBase3D'>
sim.output.spatial_means:     <class 'fluidsim.solvers.ns3d.strat.output.spatial_means.SpatialMeansNS3DStrat'>
sim.output.spatial_means_regions:<class 'fluidsim.extend_simul.spatial_means_regions_milestone.SpatialMeansRegions'>
sim.output.spatiotemporal_spectra:<class 'fluidsim.solvers.ns3d.output.spatiotemporal_spectra.SpatioTemporalSpectraNS3D'>
sim.output.spectra:           <class 'fluidsim.solvers.ns3d.strat.output.spectra.SpectraNS3DStrat'>
sim.output.spect_energy_budg: <class 'fluidsim.solvers.ns3d.strat.output.spect_energy_budget.SpectralEnergyBudgetNS3DStrat'>
sim.output.temporal_spectra:  <class 'fluidsim.base.output.temporal_spectra.TemporalSpectra3D'>

Memory usage at the end of init. (equiv. seq.): 600.65234375 Mo
Size of state_spect (equiv. seq.): 32.292864 Mo
*************************************
Beginning of the computation
save state_phys in file state_phys_t00000.000.nc
    compute until t =        800
it =      0 ; t =            0 ; deltat  =          1
              energy = 2.627e-06 ; Delta energy = +0.000e+00

MEMORY_USAGE:                  600.8671875 Mo
it =     20 ; t =           20 ; deltat  =          1
[...]
MEMORY_USAGE:                  623.93359375 Mo
Computation completed in  2188.39 s
path_run =
/home/pierre/Sim_data/tutorial_parametric_study/ns3d.strat_144x144x48_V4.5x4.5x1.5_N0.2_Lf3.5_U0.02_D0.5_2021-10-05_16-12-36
it =   2252 ; t =      800.132 ; deltat  =    0.31235
              energy = 1.120e-04 ; Delta energy = -1.984e-05
              estimated remaining duration = 0:00:00
MEMORY_USAGE:                  623.93359375 Mo
save state_phys in file state_phys_t00800.132.nc

-------------------------------------------------------------------------------
Simulation 2
Namespace(N=0.2, diameter=0.5, speed=0.04, number_cylinders=3, ny_per_cylinder=48, n_periods=2.0, only_init=False, width_boundary_layers=0.1)
dx = 0.03125
params.forcing.milestone.nx_max = 48
params.time_stepping.deltat_max = 0.5
eta_elav * kmax: 0.08367778205438091
freq_nu4 1.0212596254604769
freq_nu4 / freq_nu2 157.8906769680574

--------
nb_proc: 2
N0 = 48 ; N1 = 144 ; N2 = 144
Initialization (FFT3DMPIWithFFTWMPI3D) done in 0.697291 s
*************************************
Program fluidsim
sim:                <class 'fluidsim_core.extend_simul.extend_simul_class.<locals>.NewSimul'>
sim.output:         <class 'fluidsim.solvers.ns3d.strat.output.Output'>
sim.oper:           <class 'fluidsim.operators.operators3d.OperatorsPseudoSpectral3D'>
sim.state:          <class 'fluidsim.solvers.ns3d.strat.state.StateNS3DStrat'>
sim.time_stepping:  <class 'fluidsim.solvers.ns3d.time_stepping.TimeSteppingPseudoSpectralNS3D'>
sim.init_fields:    <class 'fluidsim.solvers.ns3d.init_fields.InitFieldsNS3D'>
sim.forcing:        <class 'fluidsim.solvers.ns3d.forcing.ForcingNS3D'>

solver ns3d.strat, RK4 and parallel (2 proc.)
type fft: fluidfft.fft3d.mpi_with_fftwmpi3d
nx =    144 ; ny =    144 ; nz =     48
Lx = 4.5 ; Ly = 4.5 ; Lz = 1.5
path_run =
/home/pierre/Sim_data/tutorial_parametric_study/ns3d.strat_144x144x48_V4.5x4.5x1.5_N0.2_Lf3.5_U0.04_D0.5_2021-10-05_16-49-31
init_fields.type: noise

Initialization outputs:
sim.output.phys_fields:       <class 'fluidsim.base.output.phys_fields3d.PhysFieldsBase3D'>
sim.output.spatial_means:     <class 'fluidsim.solvers.ns3d.strat.output.spatial_means.SpatialMeansNS3DStrat'>
sim.output.spatial_means_regions:<class 'fluidsim.extend_simul.spatial_means_regions_milestone.SpatialMeansRegions'>
sim.output.spatiotemporal_spectra:<class 'fluidsim.solvers.ns3d.output.spatiotemporal_spectra.SpatioTemporalSpectraNS3D'>
sim.output.spectra:           <class 'fluidsim.solvers.ns3d.strat.output.spectra.SpectraNS3DStrat'>
sim.output.spect_energy_budg: <class 'fluidsim.solvers.ns3d.strat.output.spect_energy_budget.SpectralEnergyBudgetNS3DStrat'>
sim.output.temporal_spectra:  <class 'fluidsim.base.output.temporal_spectra.TemporalSpectra3D'>

Memory usage at the end of init. (equiv. seq.): 633.28515625 Mo
Size of state_spect (equiv. seq.): 32.292864 Mo
*************************************
Beginning of the computation
save state_phys in file state_phys_t00000.000.nc
    compute until t =        400
it =      0 ; t =            0 ; deltat  =        0.5
              energy = 2.627e-06 ; Delta energy = +0.000e+00

MEMORY_USAGE:                  637.1015625 Mo
it =     20 ; t =           10 ; deltat  =        0.5
[...]
MEMORY_USAGE:                  660.9765625 Mo
Computation completed in  2148.95 s
path_run =
/home/pierre/Sim_data/tutorial_parametric_study/ns3d.strat_144x144x48_V4.5x4.5x1.5_N0.2_Lf3.5_U0.04_D0.5_2021-10-05_16-49-31
it =   2342 ; t =      400.025 ; deltat  =    0.15199
              energy = 4.473e-04 ; Delta energy = -8.048e-05
              estimated remaining duration = 0:00:00
MEMORY_USAGE:                  661.1640625 Mo
save state_phys in file state_phys_t00400.025.nc

-------------------------------------------------------------------------------
Simulation 3
Namespace(N=0.2, diameter=0.5, speed=0.06, number_cylinders=3, ny_per_cylinder=48, n_periods=2.0, only_init=False, width_boundary_layers=0.1)
dx = 0.03125
params.forcing.milestone.nx_max = 48
params.time_stepping.deltat_max = 0.33333333333333337
eta_elav * kmax: 0.06173645898680493
freq_nu4 1.5335064741757896
freq_nu4 / freq_nu2 237.08601545208603

--------
nb_proc: 2
N0 = 48 ; N1 = 144 ; N2 = 144
Initialization (FFT3DMPIWithFFTWMPI3D) done in 0.696624 s
*************************************
Program fluidsim
sim:                <class 'fluidsim_core.extend_simul.extend_simul_class.<locals>.NewSimul'>
sim.output:         <class 'fluidsim.solvers.ns3d.strat.output.Output'>
sim.oper:           <class 'fluidsim.operators.operators3d.OperatorsPseudoSpectral3D'>
sim.state:          <class 'fluidsim.solvers.ns3d.strat.state.StateNS3DStrat'>
sim.time_stepping:  <class 'fluidsim.solvers.ns3d.time_stepping.TimeSteppingPseudoSpectralNS3D'>
sim.init_fields:    <class 'fluidsim.solvers.ns3d.init_fields.InitFieldsNS3D'>
sim.forcing:        <class 'fluidsim.solvers.ns3d.forcing.ForcingNS3D'>

solver ns3d.strat, RK4 and parallel (2 proc.)
type fft: fluidfft.fft3d.mpi_with_fftwmpi3d
nx =    144 ; ny =    144 ; nz =     48
Lx = 4.5 ; Ly = 4.5 ; Lz = 1.5
path_run =
/home/pierre/Sim_data/tutorial_parametric_study/ns3d.strat_144x144x48_V4.5x4.5x1.5_N0.2_Lf3.5_U0.06_D0.5_2021-10-05_17-25-48
init_fields.type: noise

Initialization outputs:
sim.output.phys_fields:       <class 'fluidsim.base.output.phys_fields3d.PhysFieldsBase3D'>
sim.output.spatial_means:     <class 'fluidsim.solvers.ns3d.strat.output.spatial_means.SpatialMeansNS3DStrat'>
sim.output.spatial_means_regions:<class 'fluidsim.extend_simul.spatial_means_regions_milestone.SpatialMeansRegions'>
sim.output.spatiotemporal_spectra:<class 'fluidsim.solvers.ns3d.output.spatiotemporal_spectra.SpatioTemporalSpectraNS3D'>
sim.output.spectra:           <class 'fluidsim.solvers.ns3d.strat.output.spectra.SpectraNS3DStrat'>
sim.output.spect_energy_budg: <class 'fluidsim.solvers.ns3d.strat.output.spect_energy_budget.SpectralEnergyBudgetNS3DStrat'>
sim.output.temporal_spectra:  <class 'fluidsim.base.output.temporal_spectra.TemporalSpectra3D'>

Memory usage at the end of init. (equiv. seq.): 619.40234375 Mo
Size of state_spect (equiv. seq.): 32.292864 Mo
*************************************
Beginning of the computation
save state_phys in file state_phys_t00000.000.nc
    compute until t =    266.667
it =      0 ; t =            0 ; deltat  =    0.33333
              energy = 2.627e-06 ; Delta energy = +0.000e+00

MEMORY_USAGE:                  619.55859375 Mo
it =     21 ; t =            7 ; deltat  =    0.33333
[...]
MEMORY_USAGE:                  658.9296875 Mo
Computation completed in  2107.82 s
path_run =
/home/pierre/Sim_data/tutorial_parametric_study/ns3d.strat_144x144x48_V4.5x4.5x1.5_N0.2_Lf3.5_U0.06_D0.5_2021-10-05_17-25-48
it =   2353 ; t =      266.703 ; deltat  =    0.10818
              energy = 1.034e-03 ; Delta energy = -1.524e-04
              estimated remaining duration = 0:00:00
MEMORY_USAGE:                  658.9296875 Mo
save state_phys in file state_phys_t00266.703.nc

-------------------------------------------------------------------------------
Simulation 4
Namespace(N=0.2, diameter=0.5, speed=0.08, number_cylinders=3, ny_per_cylinder=48, n_periods=2.0, only_init=False, width_boundary_layers=0.1)
dx = 0.03125
params.forcing.milestone.nx_max = 48
params.time_stepping.deltat_max = 0.25
eta_elav * kmax: 0.04975510689335839
freq_nu4 2.0457533228911022
freq_nu4 / freq_nu2 316.28135393611467

--------
nb_proc: 2
N0 = 48 ; N1 = 144 ; N2 = 144
Initialization (FFT3DMPIWithFFTWMPI3D) done in 0.669142 s
*************************************
Program fluidsim
sim:                <class 'fluidsim_core.extend_simul.extend_simul_class.<locals>.NewSimul'>
sim.output:         <class 'fluidsim.solvers.ns3d.strat.output.Output'>
sim.oper:           <class 'fluidsim.operators.operators3d.OperatorsPseudoSpectral3D'>
sim.state:          <class 'fluidsim.solvers.ns3d.strat.state.StateNS3DStrat'>
sim.time_stepping:  <class 'fluidsim.solvers.ns3d.time_stepping.TimeSteppingPseudoSpectralNS3D'>
sim.init_fields:    <class 'fluidsim.solvers.ns3d.init_fields.InitFieldsNS3D'>
sim.forcing:        <class 'fluidsim.solvers.ns3d.forcing.ForcingNS3D'>

solver ns3d.strat, RK4 and parallel (2 proc.)
type fft: fluidfft.fft3d.mpi_with_fftwmpi3d
nx =    144 ; ny =    144 ; nz =     48
Lx = 4.5 ; Ly = 4.5 ; Lz = 1.5
path_run =
/home/pierre/Sim_data/tutorial_parametric_study/ns3d.strat_144x144x48_V4.5x4.5x1.5_N0.2_Lf3.5_U0.08_D0.5_2021-10-05_18-01-23
init_fields.type: noise

Initialization outputs:
sim.output.phys_fields:       <class 'fluidsim.base.output.phys_fields3d.PhysFieldsBase3D'>
sim.output.spatial_means:     <class 'fluidsim.solvers.ns3d.strat.output.spatial_means.SpatialMeansNS3DStrat'>
sim.output.spatial_means_regions:<class 'fluidsim.extend_simul.spatial_means_regions_milestone.SpatialMeansRegions'>
sim.output.spatiotemporal_spectra:<class 'fluidsim.solvers.ns3d.output.spatiotemporal_spectra.SpatioTemporalSpectraNS3D'>
sim.output.spectra:           <class 'fluidsim.solvers.ns3d.strat.output.spectra.SpectraNS3DStrat'>
sim.output.spect_energy_budg: <class 'fluidsim.solvers.ns3d.strat.output.spect_energy_budget.SpectralEnergyBudgetNS3DStrat'>
sim.output.temporal_spectra:  <class 'fluidsim.base.output.temporal_spectra.TemporalSpectra3D'>

Memory usage at the end of init. (equiv. seq.): 647.98046875 Mo
Size of state_spect (equiv. seq.): 32.292864 Mo
*************************************
Beginning of the computation
save state_phys in file state_phys_t00000.000.nc
    compute until t =        200
it =      0 ; t =            0 ; deltat  =       0.25
              energy = 2.627e-06 ; Delta energy = +0.000e+00

MEMORY_USAGE:                  644.4765625 Mo
it =     20 ; t =            5 ; deltat  =       0.25
[...]
MEMORY_USAGE:                  663.828125 Mo
Computation completed in  2163.67 s
path_run =
/home/pierre/Sim_data/tutorial_parametric_study/ns3d.strat_144x144x48_V4.5x4.5x1.5_N0.2_Lf3.5_U0.08_D0.5_2021-10-05_18-01-23
it =   2431 ; t =      200.024 ; deltat  =   0.074523
              energy = 1.912e-03 ; Delta energy = -2.816e-04
              estimated remaining duration = 0:00:00
MEMORY_USAGE:                  663.83984375 Mo
save state_phys in file state_phys_t00200.024.nc

The data created during the simulations should be in path_dir_data. Let’s have a look:

path_runs = sorted(path_dir_data.glob("*"), key=lambda p: p.name)
[p.name for p in path_runs]
['ns3d.strat_144x144x48_V4.5x4.5x1.5_N0.2_Lf3.5_U0.01_D0.5_2021-10-05_15-35-47',
 'ns3d.strat_144x144x48_V4.5x4.5x1.5_N0.2_Lf3.5_U0.02_D0.5_2021-10-05_16-12-36',
 'ns3d.strat_144x144x48_V4.5x4.5x1.5_N0.2_Lf3.5_U0.04_D0.5_2021-10-05_16-49-31',
 'ns3d.strat_144x144x48_V4.5x4.5x1.5_N0.2_Lf3.5_U0.06_D0.5_2021-10-05_17-25-48',
 'ns3d.strat_144x144x48_V4.5x4.5x1.5_N0.2_Lf3.5_U0.08_D0.5_2021-10-05_18-01-23']

We see that the directory names are understandable by humans and tell us about the parameters of the simulations.