Dataset
The AirfRANS dataset makes available numerical resolutions of the incompressible Reynolds-Averaged Navier-Stokes (RANS) equations over the NACA 4 and 5 digits series of airfoils and in a subsonic flight regime setup.
Its features are:
1000 simulations
Reynolds number between 2 and 6 million
Angle of attacks between -5° and 15°
Airfoil drawn in the NACA 4 and 5 digit series
Four machine learning tasks representing different challenges.
The four tasks are defined as followed:
Full data regime: 800 simulations are used for the training and 200 are kept for testing. Both the trainset and the testset are drawn from the same distribution. This defines an interpolation task.
Scarce data regime: Same testset as the Full data regime task but with only 200 simulations in the trainset. This also defines an interpolation task but in a low data regime scenario.
Reynolds extrapolation regime: Simulations with Reynolds number between 3 and 5 million are kept for the trainset, the others are kept for the testset. This defines an extrapolation task for the reynolds number parameter.
Angle of attack extrapolation regime: Simulations with angle of attack between -2.5° and 12.5° are kept for the trainset, the others are kept for the testset. This defines an extrapolation task for the angle of attack parameter.
Downloading the dataset
You can download the dataset by using the function airfrans.dataset.download
import airfrans as af
af.dataset.download(root = PATH_TO_SAVING_DIRECTORY, file_name = 'Dataset', unzip = True, OpenFOAM = False)
for the pre-processed dataset where simulations have been cropped, minimum features have been kept and .vtu
/ .vtp
files have been generated. For the raw OpenFOAM dataset, simply set True
to the OpenFOAM
argument. You can also directly download it here for the pre-processed version and there for the raw OpenFOAM.
Finally, you can access to a ready-to-use version via PyTorch Geometric datasets.
Loading the dataset
After dowloading the pre-processed dataset, you can load the list of simulations in NumPy arrays with the function airfrans.dataset.load
dataset_list, dataset_name = af.dataset.load(root = PATH_TO_DATASET, task = 'full', train = True)
We recommend to handle this data with a Geometric Deep Learning library such as PyTorch Geometric or Deep Graph Library.
Note
The dataset loaded when using airfrans.dataset.load
contains point clouds defined as the nodes of the simulation mesh. Do not hesitate to build a custom dataset if you want to use volume/surface sampling of simulations instead of the nodes of the mesh via the airfrans.Simulation
. The only constraint is that the test scores of models for the four target fields have to be computed at the position of the nodes of the simulation meshes.
Raw versus pre-processed dataset
The raw dataset contains the simulations of the AirfRANS dataset as they were outputed by OpenFOAM. The pre-processed version differs from the raw version as it only includes a processed version of the .vtu
/ .vtp
files of the simulations.
For the internal field given in the file ending by internal.vtu
, we followed:
Clipping: Clip to a box of size
[(-2, 4), (-1.5, 1.5), (0, 1)]
where each tuple represents an axis in the order x, y, and z. We did it with the PyVista clip filter and we setcrinkle = True
in the parameters to leave the cells untouched.Slicing: Take a slice at \(z = 0.5\) to go from a 3D mesh to a 2D mesh. We did it with the PyVista slice filter and we set
generate_triangles = False
.Distance function: Compute the distance function with the PyVista compute_implicit_distance filter.
Keeping only the required fields: Only keep the pressure, the velocity, the turbulent viscosity, and the distance function in the data.
For the aerofoil patch (internal boundary) given in the file ending by aerofoil.vtp
, we followed:
Normals: Compute the normals with the PyVista compute_normals filter. We set
flip_normals = False
leading to inward-pointing normals.Slicing: Take a slice at \(z = 0.5\) to go from a 2D mesh to a 1D mesh. We did it with the PyVista slice filter and we set
generate_triangles = False
.Keeping only the required fields: Only keep the pressure, the velocity, the turbulent velocity, and the normals in the data.
For the freestream patch (external boundary) given in the file ending by freestream.vtp
, we followed:
Slicing: Take a slice at \(z = 0.5\) to go from a 2D mesh to a 1D mesh. We did it with the PyVista slice filter and we set
generate_triangles = False
.Keeping only the required fields: Only keep the pressure, the velocity, and the turbulent velocity in the data.