173 lines
3.8 KiB
Markdown
173 lines
3.8 KiB
Markdown
# Simulation Workflow
|
|
|
|
## Standard Workflow
|
|
|
|
Follow these steps to run a fluidsim simulation:
|
|
|
|
### 1. Import Solver
|
|
|
|
```python
|
|
from fluidsim.solvers.ns2d.solver import Simul
|
|
|
|
# Or use dynamic import
|
|
import fluidsim
|
|
Simul = fluidsim.import_simul_class_from_key("ns2d")
|
|
```
|
|
|
|
### 2. Create Default Parameters
|
|
|
|
```python
|
|
params = Simul.create_default_params()
|
|
```
|
|
|
|
This returns a hierarchical `Parameters` object containing all simulation settings.
|
|
|
|
### 3. Configure Parameters
|
|
|
|
Modify parameters as needed. The Parameters object prevents typos by raising `AttributeError` for non-existent parameters:
|
|
|
|
```python
|
|
# Domain and resolution
|
|
params.oper.nx = 256 # grid points in x
|
|
params.oper.ny = 256 # grid points in y
|
|
params.oper.Lx = 2 * pi # domain size x
|
|
params.oper.Ly = 2 * pi # domain size y
|
|
|
|
# Physical parameters
|
|
params.nu_2 = 1e-3 # viscosity (negative Laplacian)
|
|
|
|
# Time stepping
|
|
params.time_stepping.t_end = 10.0 # end time
|
|
params.time_stepping.deltat0 = 0.01 # initial time step
|
|
params.time_stepping.USE_CFL = True # adaptive time step
|
|
|
|
# Initial conditions
|
|
params.init_fields.type = "noise" # or "dipole", "vortex", etc.
|
|
|
|
# Output settings
|
|
params.output.periods_save.phys_fields = 1.0 # save every 1.0 time units
|
|
params.output.periods_save.spectra = 0.5
|
|
params.output.periods_save.spatial_means = 0.1
|
|
```
|
|
|
|
### 4. Instantiate Simulation
|
|
|
|
```python
|
|
sim = Simul(params)
|
|
```
|
|
|
|
This initializes:
|
|
- Operators (FFT, differential operators)
|
|
- State variables (velocity, vorticity, etc.)
|
|
- Output handlers
|
|
- Time stepping scheme
|
|
|
|
### 5. Run Simulation
|
|
|
|
```python
|
|
sim.time_stepping.start()
|
|
```
|
|
|
|
The simulation runs until `t_end` or specified number of iterations.
|
|
|
|
### 6. Analyze Results During/After Simulation
|
|
|
|
```python
|
|
# Plot physical fields
|
|
sim.output.phys_fields.plot()
|
|
sim.output.phys_fields.plot("vorticity")
|
|
sim.output.phys_fields.plot("div")
|
|
|
|
# Plot spatial means
|
|
sim.output.spatial_means.plot()
|
|
|
|
# Plot spectra
|
|
sim.output.spectra.plot1d()
|
|
sim.output.spectra.plot2d()
|
|
```
|
|
|
|
## Loading Previous Simulations
|
|
|
|
### Quick Loading (For Plotting Only)
|
|
|
|
```python
|
|
from fluidsim import load_sim_for_plot
|
|
|
|
sim = load_sim_for_plot("path/to/simulation")
|
|
sim.output.phys_fields.plot()
|
|
sim.output.spatial_means.plot()
|
|
```
|
|
|
|
Fast loading without full state initialization. Use for post-processing.
|
|
|
|
### Full State Loading (For Restarting)
|
|
|
|
```python
|
|
from fluidsim import load_state_phys_file
|
|
|
|
sim = load_state_phys_file("path/to/state_file.h5")
|
|
sim.time_stepping.start() # continue simulation
|
|
```
|
|
|
|
Loads complete state for continuing simulations.
|
|
|
|
## Restarting Simulations
|
|
|
|
To restart from a saved state:
|
|
|
|
```python
|
|
params = Simul.create_default_params()
|
|
params.init_fields.type = "from_file"
|
|
params.init_fields.from_file.path = "path/to/state_file.h5"
|
|
|
|
# Optionally modify parameters for the continuation
|
|
params.time_stepping.t_end = 20.0 # extend simulation
|
|
|
|
sim = Simul(params)
|
|
sim.time_stepping.start()
|
|
```
|
|
|
|
## Running on Clusters
|
|
|
|
FluidSim integrates with cluster submission systems:
|
|
|
|
```python
|
|
from fluiddyn.clusters.legi import Calcul8 as Cluster
|
|
|
|
# Configure cluster job
|
|
cluster = Cluster()
|
|
cluster.submit_script(
|
|
"my_simulation.py",
|
|
name_run="my_job",
|
|
nb_nodes=4,
|
|
nb_cores_per_node=24,
|
|
walltime="24:00:00"
|
|
)
|
|
```
|
|
|
|
Script should contain standard workflow steps (import, configure, run).
|
|
|
|
## Complete Example
|
|
|
|
```python
|
|
from fluidsim.solvers.ns2d.solver import Simul
|
|
from math import pi
|
|
|
|
# Create and configure parameters
|
|
params = Simul.create_default_params()
|
|
params.oper.nx = params.oper.ny = 256
|
|
params.oper.Lx = params.oper.Ly = 2 * pi
|
|
params.nu_2 = 1e-3
|
|
params.time_stepping.t_end = 10.0
|
|
params.init_fields.type = "dipole"
|
|
params.output.periods_save.phys_fields = 1.0
|
|
|
|
# Run simulation
|
|
sim = Simul(params)
|
|
sim.time_stepping.start()
|
|
|
|
# Analyze results
|
|
sim.output.phys_fields.plot("vorticity")
|
|
sim.output.spatial_means.plot()
|
|
```
|