Output and Analysis
FluidSim automatically saves several types of output during simulations.
Overview
Output and Analysis
Output Types
FluidSim automatically saves several types of output during simulations.
Physical Fields
File format: HDF5 (.h5)
Location: simulation_dir/state_phys_t*.h5
Contents: Velocity, vorticity, and other physical space fields at specific times
Access:
sim.output.phys_fields.plot()
sim.output.phys_fields.plot("vorticity")
sim.output.phys_fields.plot("vx")
sim.output.phys_fields.plot("div") # check divergence
# Save manually
sim.output.phys_fields.save()
# Get data
vorticity = sim.state.state_phys.get_var("rot")
Spatial Means
File format: Text file (.txt)
Location: simulation_dir/spatial_means.txt
Contents: Volume-averaged quantities vs time (energy, enstrophy, etc.)
Access:
sim.output.spatial_means.plot()
# Load from file
from fluidsim import load_sim_for_plot
sim = load_sim_for_plot("simulation_dir")
sim.output.spatial_means.load()
spatial_means_data = sim.output.spatial_means
Spectra
File format: HDF5 (.h5)
Location: simulation_dir/spectra_*.h5
Contents: Energy and enstrophy spectra vs wavenumber
Access:
sim.output.spectra.plot1d() # 1D spectrum
sim.output.spectra.plot2d() # 2D spectrum
# Load spectra data
spectra = sim.output.spectra.load2d_mean()
Spectral Energy Budget
File format: HDF5 (.h5)
Location: simulation_dir/spect_energy_budg_*.h5
Contents: Energy transfer between scales
Access:
sim.output.spect_energy_budg.plot()
Post-Processing
Loading Simulations for Analysis
Fast Loading (Read-Only)
from fluidsim import load_sim_for_plot
sim = load_sim_for_plot("simulation_dir")
# Access all output types
sim.output.phys_fields.plot()
sim.output.spatial_means.plot()
sim.output.spectra.plot1d()
Use this for quick visualization and analysis. Does not initialize full simulation state.
Full State Loading
from fluidsim import load_state_phys_file
sim = load_state_phys_file("simulation_dir/state_phys_t10.000.h5")
# Can continue simulation
sim.time_stepping.start()
Visualization Tools
Built-in Plotting
FluidSim provides basic plotting through matplotlib:
# Physical fields
sim.output.phys_fields.plot("vorticity")
sim.output.phys_fields.animate("vorticity")
# Time series
sim.output.spatial_means.plot()
# Spectra
sim.output.spectra.plot1d()
Advanced Visualization
For publication-quality or 3D visualization:
ParaView: Open .h5 files directly
paraview simulation_dir/state_phys_t*.h5
VisIt: Similar to ParaView for large datasets
Custom Python:
# Load field manually
with h5py.File("state_phys_t10.000.h5", "r") as f:
vx = f["state_phys"]["vx"][:]
vy = f["state_phys"]["vy"][:]
# Custom plotting
plt.contourf(vx)
plt.show()
Analysis Examples
Energy Evolution
from fluidsim import load_sim_for_plot
sim = load_sim_for_plot("simulation_dir")
df = sim.output.spatial_means.load()
plt.figure()
plt.plot(df["t"], df["E"], label="Kinetic Energy")
plt.xlabel("Time")
plt.ylabel("Energy")
plt.legend()
plt.show()
Spectral Analysis
sim = load_sim_for_plot("simulation_dir")
# Plot energy spectrum
sim.output.spectra.plot1d(tmin=5.0, tmax=10.0) # average over time range
# Get spectral data
k, E_k = sim.output.spectra.load1d_mean(tmin=5.0, tmax=10.0)
# Check for power law
log_k = np.log(k)
log_E = np.log(E_k)
# fit power law in inertial range
Parametric Study Analysis
When running multiple simulations with different parameters:
from fluidsim import load_sim_for_plot
# Collect results from multiple simulations
results = []
for sim_dir in os.listdir("simulations"):
if not os.path.isdir(f"simulations/{sim_dir}"):
continue
sim = load_sim_for_plot(f"simulations/{sim_dir}")
# Extract key metrics
df = sim.output.spatial_means.load()
final_energy = df["E"].iloc[-1]
# Get parameters
nu = sim.params.nu_2
results.append({
"nu": nu,
"final_energy": final_energy,
"sim_dir": sim_dir
})
# Analyze results
results_df = pd.DataFrame(results)
results_df.plot(x="nu", y="final_energy", logx=True)
Field Manipulation
sim = load_sim_for_plot("simulation_dir")
# Load specific time
sim.output.phys_fields.set_of_phys_files.update_times()
times = sim.output.phys_fields.set_of_phys_files.times
# Load field at specific time
field_file = sim.output.phys_fields.get_field_to_plot(time=5.0)
vorticity = field_file.get_var("rot")
# Compute derived quantities
vorticity_rms = np.sqrt(np.mean(vorticity**2))
vorticity_max = np.max(np.abs(vorticity))
Output Directory Structure
simulation_dir/
├── params_simul.xml # Simulation parameters
├── stdout.txt # Standard output log
├── state_phys_t*.h5 # Physical fields at different times
├── spatial_means.txt # Time series of spatial averages
├── spectra_*.h5 # Spectral data
├── spect_energy_budg_*.h5 # Energy budget data
└── info_solver.txt # Solver information
Performance Monitoring
# During simulation, check progress
sim.output.print_stdout.complete_timestep()
# After simulation, review performance
sim.output.print_stdout.plot_deltat() # plot time step evolution
sim.output.print_stdout.plot_clock_times() # plot computation time
Data Export
Convert fluidsim output to other formats:
# Export to numpy array
with h5py.File("state_phys_t10.000.h5", "r") as f:
vx = f["state_phys"]["vx"][:]
np.save("vx.npy", vx)
# Export to CSV
df = sim.output.spatial_means.load()
df.to_csv("spatial_means.csv", index=False)