NOTE: This is a modification of the original repository by J. Viquerat. The modifications are:
- Increased domain to x: (-10, 25), y: (-10, 10)
- Cross domain refinement
- 3D mesh to be used in OpenFOAM
This repository contains tools to generate random shapes using Bezier curves (images and meshes), controlling the number of points and the local curvature and sharpness. It is also possible to generate shapes by joining specified points using an in-house csv format, and to generate full sets of random shapes with variable parameters.
gmsh
is required for the meshing of the shapes. Simplest way is to download an executable from http://gmsh.info/ on your computer, and to add its position to yourPATH
pygmsh
meshio
The work contained in this repository was developed for use in the following papers:
- "A supervised neural network for drag prediction of arbitrary 2D shapes in low Reynolds number flows" pre-print, paper and source code
- "U-net architectures for fast prediction of incompressible laminar flows" pre-print
- "Direct shape optimization through deep reinforcement learning" pre-print, paper and source code
If you make use of this repo for your research, please consider citing them. This work was elaborated on the basis of this StackOverflow answer: https://stackoverflow.com/a/50751932/3237302, although there are now significant differences in behavior and features.
This work is provided with no guarantee whatsoever. If you find something wrong, please raise an issue. However, there is no guarantee I will have time to look into it. PRs are welcome, but the same warning applies.
n_pts n_splg_pts
x1 y1 r1 e1
x2 y2 r2 e2
...
xn yn rn en
n_ctrl_pts
is the actual number of points you control on the shape. Each such point is joined with the next one using a cubic Bezier curven_splg_pts
is the number of sampling points per unit of distance between two control pointsxi yi
are the coordinates of the control pointsri
is the local radius around control pointi
. It measures how far the local control points are from the point you providedei
is a local measure of sharpness
Give a look at the examples below for a better understanding of the effects of radius and sharpness parameters. Maximum smoothness is usually obtained for r = 0.5
and e = 1.0
on all points.
The best approximation of a cylinder using 4 points:
4 30
1.0 1.0 0.5587 1.0
-1.0 1.0 0.5587 1.0
-1.0 -1.0 0.5587 1.0
1.0 -1.0 0.5587 1.0
Increasing radius on top left, while decreasing it on bottom right:
4 30
1.0 1.0 0.5587 1.0
-1.0 1.0 1.0 1.0
-1.0 -1.0 0.5587 1.0
1.0 -1.0 0.0 1.0
Making a sharp edge on bottom right:
4 30
1.0 1.0 0.5587 1.0
-1.0 1.0 0.5587 1.0
-1.0 -1.0 0.5587 1.0
1.0 -1.0 0.5587 0.0
Generated using python3 generate_shape_random.py
:
10 10
-0.22344386973718572 -0.11579347020968898 0.5 1.0
-1.086703349116176 0.056471511909076864 0.5 1.0
0.33918645130375696 -0.6285322803621614 0.5 1.0
0.09673486000147186 0.020665843303720587 0.5 1.0
0.7184144807034846 0.07933772977561572 0.5 1.0
0.658776975915066 -0.5602669680651731 0.5 1.0
-0.5629917814532847 0.37355108023884465 0.5 1.0
-0.5526944074292542 0.6349363861837116 0.5 1.0
0.44487187686581814 -0.19528679943835178 0.5 1.0
0.16784876294630274 0.3349169666644063 0.5 1.0
Generated using python3 generate_shape_from_file.py myfile.csv
:
4 30
-1.0 0.0 0.5 1.0
0.0 0.1 0.5 1.0
1.0 0.0 0.5 1.0
-0.5 0.4 0.5 1.0
Generate a dataset of random shapes using python3 generate_dataset.py
(parameters of the dataset can be modified inside the python file). It will generate images and meshes in separated folders.