KOLMOGOROV-SCALE FIBER TRAJECTORIES IN TURBULENT CHANNEL FLOW=============================================================
Per-fiber Lagrangian trajectories (position, velocity, acceleration,orientation, angular velocity) of rigid Kolmogorov-scale fibers in a turbulentchannel flow, at three friction Reynolds numbers. Each fiber is stored both raw(measured) and filtered (translation and rotation filtered separately). Thefiles contain trajectories only; example loaders that rebuild the y+ profilesare included.
Dataset version 1.0.
CONTENTS-------- Re_tau=180 : near_wall, intermediate, center Re_tau=360 : near_wall, intermediate, center Re_tau=720 : near_wall, center (no intermediate region)
Per region: //fiber_trajectories_Re###.h5 Per case: fiber_trajectories_Re###_datadictionary.json (field/units description) LoadHDF5_Re_tau###.py , LoadHDF5_Re_tau_###.m (example loaders)
Each region is an independent volumetric acquisition, with its own frictionvelocity and viscous scales; always use the wall scales stored in the file youare reading.
FILE LAYOUT (HDF5)------------------Ragged/columnar: within each group all fibers' samples are concatenated. Everygroup also carries two bookkeeping datasets to slice a single fiber: index int64 (nFiber x 3) = [fiber_id, start0, count], start0 is 0-based fiber_id int64, the fiber id of each sampleThere is also a root dataset /fiber_id listing all fiber ids. Missing values areNaN. Time is redundant with the frame index: time = (frame-1)*dt.
/raw frame, time, pos[mm], e1, e2, e3, curvature_kk0, length_mm (measured, unfiltered) /filtered_translation frame, time, pos[mm], vel[mm/s], acc[mm/s^2], tau_f_sec[s] (Mordant filter) /filtered_rotation frame, time, e1_filt, e2_filt, e3_filt, omega_body[rad/s], wall_distance[mm], tau_f_sec[s] (SO(3) SG filter) /wall_scales u_tau[m/s], viscous_length[m], viscous_time[s], Re_tau, Temperature[degC]
The wall distance is column 2 of pos (see CONVENTIONS), so it is not storedseparately in /raw or /filtered_translation. /filtered_rotation has no position,so it keeps wall_distance: the measured wall distance at that frame.
COMPLETENESS------------/raw holds every sample of every selected fiber. The two filtered groupsare subsets: filtering consumes samples at both ends of a trajectory, so a fiberwhose valid runs were shorter than the filter support has count = 0 in thatgroup's index and appears in /raw only. Root attributes n_fibers,n_fibers_with_translation, n_fibers_with_rotation, n_fibers_raw_only and then_samples_* counts summarise this per region.
CONVENTIONS----------- Axes: x = streamwise, y = wall-normal, z = spanwise. The frame is right-handed. +x points along the mean flow, so the streamwise position increases with time. y is the distance from the nearest wall in mm, always >= 0 and increasing away from the wall; it is therefore column 2 of pos, in both /raw (measured value) and /filtered_translation (filtered value). The x and z origins are arbitrary. pos/vel/acc columns = [streamwise, wall_normal, spanwise]. omega_body = [spin(e1), tumble(e2), tumble(e3)], in the fiber body frame, and therefore independent of the lab-frame axis convention above. Orientation: e1, e2, e3 are the body axes expressed in the lab frame and are the COLUMNS of the rotation matrix, det(R) = +1. In /raw they are the measured axes; in /filtered_rotation they are the filtered ones, stored as e1_filt, e2_filt, e3_filt. Rebuild the matrix as R(:,:,k) = [e1_filt(k,:)' e2_filt(k,:)' e3_filt(k,:)'] (MATLAB) R = np.column_stack([e1[k], e2[k], e3[k]]) (Python) and the lab-frame angular velocity, if needed, as omega_lab = R*omega_body.
ARRAY ORDER-----------The files are written from MATLAB. MATLAB reverses dimension order on disk, soh5py reports the transposed shape: an (N,3) array such as pos, vel, acc,omega_body or a body axis is read back with shape (3,N), and the (nFiber,3)index as (3,nFiber). The included Python loader handles this.
HOW TO RUN----------Python (needs numpy, h5py, matplotlib). The loaders were written and tested withPython 3.12.0 and the package versions pinned in requirements.txt(h5py 3.16.0, numpy 2.5.1, matplotlib 3.11.0). To reproduce that environment: python -m pip install -r requirements.txt set DATA_DIR at the top of the script, then run interactively so the loaded variables stay available: python -i LoadHDF5_Re_tau_180.py (or LoadHDF5_Re_tau_360.py / LoadHDF5_Re_tau_720.py) (plain "python LoadHDF5_Re_tau_180.py" runs to the end but then exits and the variables are not saved in memory -- use -i.) MATLAB: set DATA_DIR at the top of LoadHDF5_Re_tau_###.m and press Run. The MATLAB loaders and the processing scripts were written and tested with MATLAB R2024b. Both leave in memory: DATA (case, Re_tau, regions), PROFILES (y+ statisticscomputed from the trajectories), and one variable per region (near_wall,intermediate, center) holding per-fiber arrays, one column per fiber, NaN-paddedto the longest fiber: .raw_data pos, e1, e2, e3 (nSamp x nFib x 3); curvature, length_mm, frame, time, wall_mm (nSamp x nFib) .translation_filtered pos, vel, acc (nSamp x nFib x 3); tau_f, frame, time, wall_mm (nSamp x nFib) .rotation_filtered e1, e2, e3, omega_body (nSamp x nFib x 3); tau_f, frame, time, wall_mm (nSamp x nFib) wall_mm is provided by the loaders for convenience and is column 2 of pos in thetwo groups that have a position. Each group also carries fiber_ids (nFib), thefiber id of each column, so a fiber can be followed across groups. The y+ profiles in PROFILES are computed by the loaders from the trajectories,as an example of use; they are not stored in the files. Edit compute_profiles()to change the binning or add quantities.
LICENSE-------The dataset is released under the Creative Commons Attribution 4.0 Internationallicense (CC-BY-4.0). https://creativecommons.org/licenses/by/4.0/ The accompanying codes (the MATLAB processing scripts and the MATLAB and Pythonloading scripts) are released under the MIT License, provided in LICENSE-CODE.txt.https://opensource.org/licenses/MIT
HOW TO CITE-----------Please cite both the paper accompanying this dataset and the related paper below.
1) Accompanying paper (dataset descriptor): @article{ColibanFiberDataset, title = {Experimental dataset of Kolmogorov-scale fiber kinematics in turbulent channel flow}, author = {Coliban, Eliza and Zaza, Domenico and Soldati, Alfredo}, journal = {Scientific Data}, year = {2026}, note = {submitted} }
2) Related paper: @article{kcmw-5dph, title = {Angular Velocity of Kolmogorov-Scale Fibers as Proxy for Turbulent Dissipation}, author = {Zaza, Domenico and Giurgiu, Vlad and Iovieno, Michele and Soldati, Alfredo}, journal = {Phys. Rev. Lett.}, volume = {136}, issue = {5}, pages = {054001}, year = {2026}, month = {Feb}, publisher = {American Physical Society}, doi = {10.1103/kcmw-5dph}, url = {https://link.aps.org/doi/10.1103/kcmw-5dph} }