Skip to main content

I/O

Configure where simulation results are written and which post‑processing outputs to generate during the run.

Directory layout

All outputs live under output_directory with the structure:

<output_directory>/<output_type>/<output_name>/<files>

Example: sim/slice/sym_plane/sym_plane_000000000.pvts.


Top‑level keys

IO
{
output_directory = sim
Outputs { ... }
}
  • output_directory (string, required): Root folder where all output subdirectories are created (e.g., sim).

  • Outputs (section, required): A collection of named output blocks. Each block defines one output stream (slice, surface, volume, profile, probes, force). Names must be unique.


Time control (for every output)

Each output accepts a time control set. These govern when an output updates and when it writes to disk.

start_interval   = 0
start_specifier = "timestep"
update_interval = 25
update_specifier = "timestep"
output_interval = 1000
output_specifier = "timestep"
stop_interval = 1000000000 // optional
stop_specifier = "timestep" // optional
time_average = false

Specifiers (case‑sensitive):

  • "timestep" – absolute step count nt.
  • "time" – absolute time t in solver units.
  • "tchar" – absolute characteristic time t / time_scale.
  • "relative_timestep", "relative_time", "relative_tchar" – same as above, but measured since the simulation started.

Semantics:

  • start_*: first moment this output is allowed to run (default start is at the beginning).
  • update_*: how often internal data are refreshed (can be more frequent than writing).
  • output_*: how often a file is written.
  • stop_* (optional): last moment the output is considered.
  • time_average: if true, the writer accumulates time averages between writes (when supported by the output type).

Tip: For most runs, set update_* modestly (e.g., every 25 timesteps) and choose a larger output_* cadence to keep I/O light.


Common fields (per output block)

Every output block has the following common keys:

specifier    = "<slice|surface|volume|profile|probes|force>"
domain = "main" // optional, defaults to "main"
global_frame = false // required; global-frame outputs are not yet supported
file_type = "pvtk" // when applicable; default varies by type
  • domain – which domain/subdomain to sample. Defaults to "main".
  • global_framemust be false (global-frame outputs are under construction).
  • file_type – supported when the output writes files:
    • pvtk, cgns, szplt (availability varies by output type; see below).

Output types

1) slice

Extracts a Cartesian slice of the flow field.

sym_plane
{
specifier = "slice"
position = 0.001 // plane location along 'direction' (solver units)
direction = 2 // 0 = X, 1 = Y, 2 = Z
collapse = false // if true: spatially average along 'direction'
domain = "main"
global_frame = false
file_type = "pvtk" // pvtk | cgns | szplt
// time control ...
}

Notes:

  • position must lie within the domain extents.
  • collapse = true performs a spatial average along direction. Requires a uniform grid along that direction; otherwise the run will abort.
  • Files appear under: sim/slice/<name>/.

2) volume

Writes the full 3D volume for the selected domain.

vol_out
{
specifier = "volume"
domain = "main"
global_frame = false
file_type = "pvtk" // pvtk | cgns | szplt
// time control ...
}

Notes:

  • No subset selection: the entire domain volume is dumped each time.
  • Use sparingly: volume outputs are large and expensive.

3) surface

Exports solution data sampled on an immersed surface from the selected domain.

surf_out
{
specifier = "surface"
geometry = "fuselage" // required
domain = "main"
global_frame = false
file_type = "pvtk" // pvtk | szplt (CGNS not supported for surface)
// time control ...
}

Notes:

  • geometry must be visible in the target domain.
  • file_type = cgns is not supported for surface outputs.

4) profile (spatial sampling)

Generates a spatial profile over a set of points (one file per write).

press_out
{
specifier = "profile"
domain = "main"

Points
{
specifier = "surface_slice" // line | surface_normal | surface_slice | file | equation
geometry = "fuselage" // required for surface_* modes
components = ["any"] // for surface_slice: component/group names
point = [0.0, 0.0, 0.001] // reference point
normal = [0, 0, 1] // plane normal for surface_slice
}

Exports
{
pressure = "P"
cp = "(P - Qinf::pinf)/(0.5*Qinf::rhoinf*umag*umag)"
velocity = "U"
temperature = "T"
}

header_style = "default" // none | default (CSV) | tecplot
global_frame = false // writer frame (must be false)
time_average = false
// time control ...
}

Point set specifiers (inside Points):

  • line: straight line from x0 to x1 with num_points samples.
  • surface_normal: from a point to the nearest surface point along the surface normal; num_points samples. Requires geometry.
  • surface_slice: intersect a plane with a surface (point, normal), subset by components (e.g., ["any"] or specific groups).
  • file: read a list of points from filename (three columns).
  • equation: parametric curve with equations = ["x(s)","y(s)","z(s)"], parameter name parameter, bounds initial, final, and num_points.

For Points, coordinates default to global frame (internally transformed).

Exports: right-hand sides accept dictionary values and the symbols P, U, V, W, T, x, y, z, t, tau, qw, nt, tchar, dist (plus vector forms where applicable).


5) probes (time histories at points)

Identical configuration to profile, but records time series at discrete points instead of a spatial profile per write.

probe_bank
{
specifier = "probes"
domain = "main"

Points
{
specifier = "file"
filename = "probe_points.xyz"
}

Exports
{
p = "P"
u = "U"
}

header_style = "default" // none | default | tecplot
// time control ...
}

6) force

Outputs integrated forces and moments on selected surface patches. Optional rotation can be applied to the reported vectors.

aero_forces
{
specifier = "force"
domain = "main"
global_frame = false

// Optional: select patches explicitly; otherwise all visible patches are used
Patches
{
fuselage = ["nose", "any"] // geometry_name = [component/group names]
}

// Normalization (scalars; expressions resolved via dictionary)
force_normalization = "0.5*rhoinf*umag*umag*chord*domwid"
moment_normalization = "1.0"

// Center of moments (default: [1,1,1])
moment_center = ["0.0","0.0","0.0"]

// Rotational transform (optional quaternion; see transforms docs)
Transforms { ... }

header_style = "default" // none | default | tecplot
// time control ...
}

Notes:

  • Reports forces and moments (inviscid, viscous, total).
  • If Patches is not given, all visible geometry patches are included.
  • moment_center defines the reference point for moment integration.
  • Files appear in: sim/force/<name>/.

Best practices

  • Keep volume outputs infrequent: they are the largest files.
  • Surface and slice outputs are cheaper, useful for frequent monitoring.
  • Profile/probes: good for lightweight monitoring and comparisons.
  • Restart writing (see Restart section) can be decoupled from visualization outputs; balance both according to storage and restart needs.