Understanding Complex Time-Resolved Flows Using Modal Decomposition
Andre Weiner, Institute of Fluid Mechanics
Overview
Discrete Fourier Transform
01
definition, convergence, averaging
Test case and data
turbulent flow past a 3D cylinder
02
03
Taper-based Spectral POD
definitions, tips & tricks, interpretation
04
Analysis of 3D data
foamToNumpy, Sparse Spatial Sampling
Test Case & Data
O. Lehmkuhl et al. (2013)
Low-frequency unsteadiness in the vortex formation region of a circular cylinder
OpenFOAM case setup


dataset overview (sample plane)
- ~2200 convective time units (CTU)
- 10 samples per CTU
- ~22000 samples in total
- ~23 GB (binary, single precision)
- in-plane velocity vector, pressure
Discrete Fourier Transform (DFT)

input signal, sample j
sin/cos test signals, sample j, frequency k
window/taper weight
for all samples
complex weight for
*even no. of samples
longer signals improve frequency resolution
faster sampling improves aliasing
usually an issue in CFD

see P. D. Welch (1967)




aptaptive taper selection for each bin
- compute amplitudes for an increasing number of tapers
- compare the change in amplitude against used-defined tolerance
A. J. Barbour & R. L. Parker (2014), 10.1016/j.cageo.2013.09.015


Taper-based Spectral POD

state vector
masked cells
cell volume/area (repeated)
data matrix
POD basis
B. C. Y Yeung & O. T. Schmidt (2024), 10.1007/s00162-024-00695-0
The analysis is exact!
vectors
increasing taper penalty
eigenvalue problem
spectral energy
SPOD modes


Analysis of 3D data
foamToNumpy
dataDir data;
fields
{
names (p U);
dataType float64;
}
exportData
{
cellCentre true;
cellVolumes true;
writeTimes true;
dataType float64;
}
storageOrder F; // F or C
time
{
startTime 0.0;
endTime 0.5;
every 1;
}data/
├── p/
│ ├── p_proc_0.npy
│ └── p_proc_1.npy
└── U/
├── U_proc_0.npy
└── U_proc_1.npyfoamToNumpyDict
processor0/
├── 0.1/
│ ├── p
│ └── U
└── 0.2/
├── p
└── U
processor1/
├── 0.1/
│ ├── p
│ └── U
└── 0.2/
├── p
└── U
...output
input
numpyToFoam
dataDir data;
fields (p U);
time
{
startTime 0;
endTime 1;
deltaT 0.1;
}data/
├── p/
│ ├── p_proc_0.npy
│ └── p_proc_1.npy
└── U/
├── U_proc_0.npy
└── U_proc_1.npynumpyToFoamDict
processor0/
├── 0.1/
│ ├── p
│ └── U
└── 0.2/
├── p
└── U
processor1/
├── 0.1/
│ ├── p
│ └── U
└── 0.2/
├── p
└── U
...input
output



Sparse Spatial Sampling
original mesh/data
(un)refinement metric
new octree mesh
S. Spinner, A. Weiner (2026)


training GitHub repository
flowTorch library
Thank you!
link to the slides
OFW2026 Training
By Andre Weiner
OFW2026 Training
Slides for the OFW 2026 training
- 40