Surface Output#

Surface Output in Flow360 lets you visualize flow field variables on the surfaces of your geometry or volume mesh. This is essential for analyzing boundary layer effects, surface pressure distributions, heat transfer, and other surface-related phenomena.


Available Options#

Option

Description

Applicable

Output fields

Flow variables to include in the output

always

Output format

Format for saving output data

always

Write single file

Option to write all surfaces to a single file

always

Save interval

When to save outputs

always

Frequency

How often to save outputs

when Save interval is Custom

Frequency offset

The time step at which to start the output

when Save interval is Custom

Assigned boundaries

Boundary surfaces to include in the output

always


Global Time Stepping in Child Cases#

When working with child cases (cases forked from a parent simulation), it’s important to understand that the Frequency and Frequency offset parameters refer to the global time step, which is transferred from the parent case.

Example: If the parent case finished at time_step=174, the child case will start from time_step=175. If Frequency=100 is set in the child case, the output will be saved at global time steps 200 (25 time steps into the child simulation), 300 (125 time steps into the child simulation), etc. Frequency offset also refers to the global time step, meaning that if in the previously mentioned child case, Frequency offset=50 was set (with Frequency=100), the output would be saved at global time steps 250 (75 time steps into the child simulation), 350 (175 time steps into the child simulation), etc.


Detailed Descriptions#

Output fields#

The flow variables that will be included in the surface output files.

  • Default: None (user must select at least one field)

  • Example: Cp, Cf, Mach

Note: Select only the fields you need to keep file sizes manageable.

Output format#

The file format in which surface data will be saved.

  • Default: paraview

  • Options:

    • paraview

    • tecplot

    • both

Notes:

  • Choose the format that best suits your post-processing workflow.

  • Select paraview for .vtu format, tecplot for .szplt format, or both to save in both formats.

Write single file#

When enabled, all surface outputs are written to a single file instead of separate files for each surface.

  • Default: false

  • Options:

    • true

    • false

Note: Currently only supported for Tecplot format.

Save interval#

Choose the points in the simulation where the results are saved.

  • Default: Save at end

  • Options:

    • Save at end

    • Custom (only available when Time stepping is Unsteady)

Notes:

  • Choose Save at end to save only the final results of the simulation.

  • Choose Custom to save the results in given intervals.

Frequency#

Controls how often surface output files are saved during the simulation.

  • Default: -1 (only at the end of simulation)

  • Example: 100 — saves output every 100 physical time steps.

    • Standalone case: If you start a simulation from time_step=0 with frequency=100, outputs are saved at time steps 100, 200, 300, etc.

    • Parent-child case: If the parent finished at time_step=174, the child starts from time_step=175. With frequency=100 in the child, outputs are saved at global time steps 200 (25 steps into child), 300 (125 steps into child), 400 (225 steps into child), etc.

Notes:

  • For steady simulations, use -1 to only output at end of run

  • Important for child cases - this parameter refers to the global time step (see Global Time Stepping).

  • This setting is only applicable for unsteady cases.

Frequency offset#

Specifies the time step at which to begin recording surface outputs.

  • Default: 0 (start at beginning of simulation)

  • Example: 1000 — with frequency=100, outputs are saved at time steps 1000, 1100, 1200, etc.

    • Standalone case: If you start a simulation from time_step=0 with frequency=100 and frequency_offset=1000, outputs are saved at time steps 1000, 1100, 1200, etc.

    • Parent-child case: If the parent finished at time_step=174, the child starts from time_step=175. With frequency=100 and frequency_offset=200 in the child, outputs are saved at global time steps 200 (25 steps into child), 300 (125 steps into child), 400 (225 steps into child), etc.

Notes:

  • Useful when restarting simulations or skipping initial transients.

  • Important for child cases - this parameter refers to the global time step (see Global Time Stepping).

  • This setting is only applicable for unsteady cases.

Assigned boundaries#

The boundary surfaces from your mesh that will be included in this output.

  • Default: None (user must select at least one surface)

  • Example: wing, fuselage, nacelles

Note: Select all appropriate surfaces needed for your analysis.


Available Output Fields#

Variables from Available Output Fields and the following specific variables

Surface-Specific Variables#

  • CfVec - Skin friction coefficient vector (non-dimensional)

  • Cf - Magnitude of skin friction coefficient (non-dimensional)

  • heatFlux - Non-dimensional heat flux (non-dimensional)

  • nodeNormals - Wall normals (non-dimensional)

  • nodeForcesPerUnitArea - Forces per unit area (non-dimensional)

  • yPlus - Non-dimensional wall distance (non-dimensional)

  • wallFunctionMetric - Wall function metrics (non-dimensional)

  • heatTransferCoefficientStaticTemperature - Surface heat transfer coefficient (static temperature as reference) (non-dimensional)

  • heatTransferCoefficientTotalTemperature - Surface heat transfer coefficient (total temperature as reference) (non-dimensional)

  • wall_shear_stress_magnitude - Wall shear stress magnitude (non-dimensional)

  • wall_shear_stress_magnitude_pa - Wall shear stress magnitude (in Pa) [Recommended method, available since version 25.2]


💡 Tips

Key Surface Output Fields for Analysis#

Pressure Coefficient (Cp)

The pressure coefficient is one of the most important surface fields for analyzing aerodynamic performance:

  • It shows the distribution of pressure on the surface relative to freestream conditions

  • Negative values indicate suction (lower than freestream pressure)

  • Positive values indicate pressure (higher than freestream pressure)

  • For aircraft analysis, compare upper and lower surface Cp to understand lift generation

  • Rapid changes in Cp can indicate shock waves or separation points

To calculate the dimensional pressure from Cp:

p (N/m²) = Cp × (1/2)ρ∞ × U_ref² + p∞

Skin Friction Coefficient (Cf, CfVec)

The skin friction coefficient is critical for analyzing boundary layer behavior:

  • CfVec provides both magnitude and direction of skin friction

  • Cf gives only the magnitude

  • Useful for identifying:

    • Regions of high skin friction (and thus drag)

    • Boundary layer separation points

    • Flow reversal areas

Visualization techniques:

  • Color surface by the streamwise component of CfVec (e.g., CfVecX for flow primarily in the x-direction)

  • Use a 3-level color scale centered at zero to easily identify attached flow (positive values) and separated flow (negative values)

  • Create surface streamlines based on the CfVec field instead of velocity to visualize surface flow patterns

For dimensional wall shear stress, use the wall_shear_stress_magnitude_pa field which provides values directly in Pascals (N/m²), eliminating the need for manual conversion. This feature is available since Flow360 version 25.2.

Node Forces Per Unit Area

The nodeForcesPerUnitArea field represents the force (pressure + friction) applied at each surface node divided by the surface area attributed to that node. This field is particularly useful for:

  • Calculating sectional loading values

  • Analyzing pressure and shear force distribution

  • Identifying areas of high loading

When integrated over the entire surface, this field equals the total forces acting on the surface.

Visualization Tips#

  • For pressure analysis: Use Cp with a consistent color scale across different configurations for valid comparisons

  • For boundary layer analysis: Use CfVec components and yPlus together

  • For separation detection: Create surface streamlines using CfVec or look for negative streamwise component values

  • For heat transfer analysis: Use heatFlux and heat transfer coefficient fields


❓ Frequently Asked Questions

  • How do I visualize only specific surfaces in my output?

    Use the entities parameter (alias: surfaces) to specify exactly which surfaces you want to include. You can use both specific surface names or pattern matching:

    # Specific surfaces
    fl.SurfaceOutput(
        entities=[volume_mesh["wing_left"], volume_mesh["wing_right"]]
    )
    
    # Pattern matching for all wing surfaces
    fl.SurfaceOutput(
        entities=[volume_mesh["wing*"]]
    )
    

    In the GUI, select the specific surfaces from the boundary list.

  • What’s the difference between non-dimensional and dimensional output fields?

    • Non-dimensional fields (e.g., Cp, Mach, velocity) are normalized using reference values and are useful for comparing different simulations.

    • Dimensional fields (e.g., pressure_pa, velocity_m_per_s) provide results in physical units, making it easier to compare with experimental data or understand absolute magnitudes.

    For convenience, we recommend using dimensional fields when absolute values are important. For example, pressure_pa provides pressure directly in Pascals rather than requiring manual conversion from Cp.

  • How do I reduce the size of my output files?

    Large output files can be unwieldy. To reduce their size:

    1. Limit output frequency: Use larger values for frequency to save outputs less often

    2. Select only necessary fields: Choose only the specific fields needed for your analysis

    3. Limit surface selection: Include only surfaces relevant to your analysis

    4. Use time-averaged outputs: For unsteady simulations, consider using time-averaged outputs instead of saving every timestep

  • How can I detect flow separation on surfaces?

    Flow separation can be detected using:

    1. Skin friction vector (CfVec): Separation occurs where the streamwise component becomes negative

    2. Surface streamlines: Use ParaView to create streamlines from the CfVec field to visualize separation patterns

    3. Pressure coefficient (Cp): Look for plateau regions or sudden changes in the pressure distribution

    For detailed separation analysis, create a color map of the streamwise component of CfVec with a 3-level scale (blue for negative/separation, white for zero, red for positive/attached flow).

  • Can I output surface data at specific physical times instead of iterations?

    The frequency parameter refers to iteration counts, not physical time. For time-accurate simulations:

    1. Calculate the number of iterations corresponding to your desired physical time interval

    2. Set the frequency parameter accordingly

    3. For a more direct approach, you can use a monitor point to trigger a custom output at specific physical times using a script that interacts with the Flow360 API


🐍 Python API Example

Basic Surface Output#

The following example shows how to set up surface output to visualize pressure and skin friction on aircraft wings:

# Define a surface output for all wing surfaces
wing_output = fl.SurfaceOutput(
    name="Wing Surface Analysis",                      # Descriptive name
    entities=[volume_mesh["wing*"]],                   # All surfaces matching "wing*" pattern 
    output_format="paraview",                          # Output in ParaView (.vtu) format
    output_fields=["Cp", "Cf", "Mach", "pressure_pa"], # Include both non-dim and dimensional fields
    frequency=100,                                     # Save every 100 steps
    frequency_offset=0                                 # Start from beginning
)

# Define a body surface output with less frequent saving
body_output = fl.SurfaceOutput(
    name="Body Surface Analysis",
    entities=[volume_mesh["fuselage"], volume_mesh["nacelles"]],  
    output_format="both",                              # Save in both ParaView and Tecplot formats
    output_fields=["Cp", "yPlus", "wallDistance"],     # Fields for boundary layer analysis
    frequency=500,                                     # Save less frequently
    write_single_file=True                             # Write all surfaces to a single file (Tecplot only)
)

# Include in simulation parameters
simulation_params = fl.SimulationParams(
    # ... other parameters ...
    outputs=[wing_output, body_output]
)

# Submit through project interface
project.submit_simulation(simulation_params)

Time-Averaged Surface Output#

For unsteady simulations where time-averaged results are important:

# Define time-averaged surface output
avg_surface_output = fl.TimeAverageSurfaceOutput(
    name="Time-Averaged Wing Analysis",
    entities=[volume_mesh["wing*"]],  
    output_format="paraview",
    output_fields=["Cp", "CfVec", "nodeForcesPerUnitArea"],
    start_step=1000,                  # Start averaging from step 1000
    frequency=500,                    # Output averaged results every 500 steps
    frequency_offset=1500             # Start saving outputs at step 1500
)

# Include in simulation parameters 
simulation_params = fl.SimulationParams(
    # ... other parameters ...
    outputs=[avg_surface_output]
)

Custom Surface Output with User-Defined Field#

Creating a custom output field and using it in surface output:

# Define a custom output field
custom_field = fl.UserDefinedField(
    name="PressureForce",
    expression="double prel = primitiveVars[4] - pressureFreestream; "
               + "PressureForce[0] = prel * nodeNormals[0]; "
               + "PressureForce[1] = prel * nodeNormals[1]; "
               + "PressureForce[2] = prel * nodeNormals[2];"
)

# Surface output with custom field
custom_output = fl.SurfaceOutput(
    name="Custom Surface Analysis",
    entities=[volume_mesh["wing*"]],
    output_format="paraview",
    output_fields=["Cp", "PressureForce"]  # Include the custom field
)

# Include in simulation parameters
simulation_params = fl.SimulationParams(
    # ... other parameters ...
    user_defined_fields=[custom_field],
    outputs=[custom_output]
)