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.