Date: January, 2025.
Conducting CFD simulations of both wings and rotors using overset curvilinear grid-based approaches requires meticulous care to generate multiple overset grids that accurately represent the rotor's geometry. This becomes even more challenging when only limited rotor geometric information is available during vehicle conceptual design. As a result, there is often a significant lag when transitioning from low-fidelity analysis programs to high-fidelity CFD simulation, which often hampers the impact of high-fidelity solutions in the early stages of a vehicle's design cycle. Additionally, the expertise required to create these grids further limits the number of analysis groups capable of feasibly obtaining much needed high-fidelity solutions. The primary objective of BladeGen is to develop a simplified, user-friendly program that can automatically and robustly generate high-fidelity capable overset rotor or wing grids using simplified geometric definitions. This program can generate surface and volume grids for both wings and rotor blades.
The program begins by parsing a user-defined input file to obtain spanwise geometric definitions. These definitions are specified either from the root to the tip of the blade or from the port to the starboard tip of the wing. Using these spanwise geometric definitions, along with a user-defined number of airfoil coordinate files, the program generates the rotor's planform surface mesh. Additionally, a series of three cap grids are created to form a closed surface that accurately represents the desired geometry of the wing or blade.
Input to BladeGen is provide through a user-defined namelist file. Namelist files must have the following components; AIRFOIL, SPAN, CAP_LE, CAP_CL, CAP_TE, and VOLUME. Most input parameters have defaults defined in this documentation and no user input is required. In the examples/bladegen directory, three example input files are provided. The example file blade.0.inp provides an example using the bare minimum required user defined inputs. The example file blade.1.inp provides an example exposing most inputs to the user.
The VOLUME component of the input file allows users to reference HYPGEN internally to BladeGen, enabling the extrusion of surface grids into volume grids. However, the robustness of this volume extrusion is not guaranteed. To simplify the user experience, the options for this component are greatly streamlined compared to those in the full HYPGEN program. Therefore, if users encounter difficulties extruding volume grids within BladeGen, it is advisable to generate only surface grids using BladeGen. Users can then utilize the HYPGEN program to individually extrude each volume grid.
This program was originally presented at the 2024 AIAA Overset Symposium in Dayton Ohio. Ref: Peters, N.J., and Pereyra, C., "RotorGen: A Simplified Structured Grid Generation Program for High-Fidelity Rotor CFD Simulation," Presented at the AIAA 2024 Overset Grid Symposium, Daytona, Ohio, 2024.
Sample input file 1 (minimum working example)
-----------------------------------------------
$AIRFOIL
airfoil_file_list = 'airfoils_example0/naca0012.dat', !airfoil coordinate file
$END
$SPAN
out_file= 'wing.x', !output file name
radius= 1., !either radius of the rotor or half span of the wing
!define the chord
number_chord_stations = 2, !number of chordwise definitions
rprop_chord = -1.0,1.0, !radial location for defining chord length
chord_list = 0.25,0.25, !chord length at respective radial locations
$END
$CAP_LE
$END
$CAP_CL
$END
$CAP_TE
$END
$VOLUME
$END
-----------------------------------------------
Sample input file 2 (most inputs exposed)
-----------------------------------------------
$AIRFOIL
!spacing information
chordwise_nodes= 128, !number of upper (and lower) surface nodes
te_nodes= 21, !number of trailing edge nodes
te_spacing= 0.0001, !spacing at trailing edge (normalized by chord lenth)
le_spacing= 0.0001, !spacing at leading edge (normalized by chord lenth)
!airfoil distribution information
number_airfoil_files = 3, !number of airfoil coordinate files used to generate
airfoil_file_list = 'airfoils_example1/sc1013r8.dat','airfoils_example1/sc1095r8.dat','airfoils_example1/sc1095.dat' !list of airfoil coordinate files
number_airfoil_stations = 8, !number of radial definitions used to define this blade
rprop_airfoil = 0.189,0.285,0.4,0.75,0.8,0.84,0.95,1.0, !radial location for airfoil weighting definition (normalized by radius or half span)
weights(1,1:8) = 1.,0.545023697,0.,0.,0.,0.,0.,0., !weightings used to define first airfoil
weights(2,1:8) = 0.,0.454976303,1.,1.,1.,0.,0.,0., !weightings used to define second airfoil
weights(3,1:8) = 0.,0.,0.,0.,0.,1.,1.,1., !weightings used to define third airfoil
$END
$SPAN
out_file= 's76.x', !output file name
radius= 4.67, !either radius of the rotor or half span of the wing
!spanwise spacings
max_stretch_ratio= 1.1, !maximum stretching ratio for spanwise spacing
root_spacing= 0.0001, !spacing at root
tip_spacing= 0.0001, !spacing at tip
max_spacing = 0.1
!debug=1 !uncomment to skip making cap grids
!define additional spanwise spacing
refinement_spacing= 0.01, !spacing at additional spanwise locations
number_refinement_stations = 1, !number of additional spanwise spacing locations
rprop_refinement = 0.95, !location for further refinement
!define the chord
number_chord_stations = 8, !number of spanwise definitions
rprop_chord = 0.189,0.285,0.4,0.75,0.8,0.84,0.95,1.0, !radial location for defining chord length
chord_list = 0.2608,0.2608,0.2608,0.2608,0.2608,0.258333333,0.258333333,0.155, !chord length at respective radial locations
!define the twist
number_twist_stations = 8, !number of spanwise definitions
rprop_twist = 0.189,0.285,0.4,0.75,0.8,0.84,0.95,1.0, !radial location for defining twist
twist_list = 4.01,4.5,3.5,0,-0.5,-0.9,-2,-2.5, !twist at respective radial locations
!define the sweep
number_sweep_stations = 9, !number of spanwise definitions
rprop_sweep = 0.189,0.285,0.4,0.75,0.8,0.84,0.95,0.9500001,1.0, !radial location for defining sweep
sweep_list = 0.,0.,0.,0.,0.,0.,0.,30.,30., !sweep at respective radial locations
!define the droop
number_droop_stations = 2, !number of spanwise definitions
rprop_droop = 0.189,1.0, !radial location for defining droop
droop_list = 0.,0., !droop at respective radial locations
$END
$CAP_LE
le_node_cutback = 30 !for leading edge sub grid, number of nodes to march back
face_nodes = 20 !number of leading edge face nodes during surgrd along tip/root face
SMU_F = 2. !smoothing factor during surgrd along tip/root face
ITSVOL_F = 150 !number of volume iterations during surgrd along tip/root face
NSMOO_F = 10 !number of smoothing iterations during surgrd along tip/root face
$END
$CAP_CL
face_nodes = 50 !how many nodes on face of cap
$END
$CAP_TE
span_nodes = 20 !number of nodes to use when marching during surgrd along span
NSMOO = 0 !number of smoothing iterations during surgrd along span
ITSVOL = 450 !number of volume iterations during surgrd along span
SMU = 1.5 !smoothing constant during surgrd along span
$END
$VOLUME
SWITCH = 0, !make volume grids? 0 = no, 1 = yes
LMAX = 100, !total number of normal nodes
NZREG= 1, !number of L-regions
KLAYER = 5, !total number of constant growth layers
ZREG = 0.18, !etrusion distance
DZ0 = 0.00001, !initial wall spacing
DZ1 = 0.0, !final spacing
$END
-----------------------------------------------
-----------------------------------------------
INPUTS - AIRFOIL
-----------------------------------------------
chordwise_nodes = number of nodes along the upper and lower surfaces of each airfoil cross section
/DEFAULTS/ N_NODES = 128
te_nodes = number of nodes along trailing edge of each airfoil cross section
/DEFAULTS/ N_TE_NODES = 21
te_spacing = node spacing at trailing edge of each airfoil cross section
(NOTE: spacing is normalized by local chord length)
/DEFAULTS/ DX0 = 0.0001
le_spacing = node spacing at leading edge of each airfoil cross section
(NOTE: spacing is normalized by local chord length)
/DEFAULTS/ DX1 = 0.0001
number_airfoil_files = number of airfoil coordinate files to be read in by bladegen
/DEFAULTS/ N_AF = 1
airfoil_file_list = a list of filenames pointing to each airfoil coordinate file to be read in by bladegen
/DEFAULTS/ FILENAME = 'airfoil.tab'
number_airfoil_stations = number of spanwise stations to define distribution of airfoil cross sections
(NOTE: normalized by radius)
/DEFAULTS/ N_AF_STATIONS defaults to n_c
rprop_airfoil = spanwise stations to define distribution of airfoil cross sections
(NOTE: normalized by radius)
/DEFAULTS/ rprop_a defaults to rprop_c
weights = a weighting matrix used to define the spanwise distribution of airfoil cross sections.
rows of this matrix correspond to distinct airfoil profiles while columns correspond
to distinct spanwise stations. sum of each column should always add to be equal to 1.
/DEFAULTS/ weights(1,1) = 1, weights(1,2) = 1
-----------------------------------------------
-----------------------------------------------
INPUTS - SPAN
-----------------------------------------------
out_file = filename of output grid
/DEFAULTS/ out_file = 'grid.x'
radius = if a rotor's blade is defined, variable defines radius.
if a wing is being defined, variable defines half span.
/DEFAULTS/ radius = 1.
debug = if debug = 1, only blade planform grid is made.
/DEFAULTS/ debug = 0
pitch_x_axis = axis blade twist is applied about, normalized by chord length
/DEFAULTS/ pitch_x_axis = 0.25
span_interp = type of interpolation for chord, twist, sweep, and droop. 0 - linear interpolation, 1 - cubic spline.
/DEFAULTS/ span_interp = 0
max_stretch_ratio = maximum stretching ratio in the spanwise direction
/DEFAULTS/ RMAX = 1.05
root_spacing = if a rotor's blade is defined, variable defines spanwise spacing at root.
if a wing is being defined, variable defines spanwise spacing at port tip.
(NOTE: normalized by local chord length)
/DEFAULTS/ DX0 = 0.01
tip_spacing = if a rotor's blade is defined, variable defines spanwise spacing at tip.
if a wing is being defined, variable defines spanwise spacing at starboard tip.
(NOTE: normalized by local chord length)
/DEFAULTS/ DX1 = 0.01
max_spacing = maximum spanwise spacing
(NOTE: normalized by chord length)
number_refinement_stations = number of additional spanwise locations for increased refinement
/DEFAULTS/ N_D = 0
rprop_refinement = spanwise stations to increase refinement
(NOTE: normalized by radius)
/DEFAULTS/ rprop_d = 0.
refinement_spacing = spanwise spacing about the desired spanwise location
(NOTE: normalized by local chord length)
/DEFAULTS/ DXD = 0.01
number_chord_stations = number of spanwise stations to define distribution chord length distribution
/DEFAULTS/ N_C = 2
rprop_chord = spanwise stations to define chord
(NOTE: normalized by radius)
/DEFAULTS/ rprop_c(1:2) = (/-1.0,1.0/)
chord_list = chord length at each desired spanwise location
/DEFAULTS/ chord(1:2) = (/0.25,0.25/)
number_twist_stations = number of spanwise stations to define distribution twist distribution
/DEFAULTS/ defaults to N_C
rprop_twist = spanwise stations to define twist
(NOTE: normalized by radius)
/DEFAULTS/ defaults to rprop_c
twist_list = twist at each desired spanwise location
(NOTE: in degrees, negative is pitch down and positive is pitch up)
/DEFAULTS/ twist = 0
number_sweep_stations = number of spanwise stations to define distribution sweep distribution
/DEFAULTS/ defaults to N_C
rprop_sweep = spanwise stations to define sweep
(NOTE: normalized by radius)
/DEFAULTS/ defaults to rprop_c
sweep_list = sweep at each desired spanwise location
(NOTE: in degrees)
/DEFAULTS/ twist = 0
number_droop_stations = number of spanwise stations to define distribution sweep distribution
/DEFAULTS/ defaults to N_C
rprop_droop = spanwise stations to define sweep
(NOTE: normalized by radius)
/DEFAULTS/ defaults to rprop_c
droop_list = droop at each desired spanwise location
(NOTE: in degrees)
/DEFAULTS/ droop = 0
-----------------------------------------------
-----------------------------------------------
INPUTS - CAP_LE (leading edge sub grid)
-----------------------------------------------
le_node_cutback = for leading edge sub grid, number of nodes to march back
from the leading edge before cutting
/DEFAULTS/ MNOD = 30
face_nodes = number of leading edge face nodes during surgrd along tip/root face
/DEFAULTS/ MNOD_F = 20
SMU_F = smoothing factor during surgrd along tip/root face
/DEFAULTS/ SMU_F = 2.
ITSVOL_F = number of volume iterations during surgrd along tip/root face
/DEFAULTS/ ITSVOL_F = 150
NSMOO_F = number of smoothing iterations during surgrd along tip/root face
/DEFAULTS/ NSMOO_F = 5
-----------------------------------------------
-----------------------------------------------
INPUTS - CAP_CL (center line sub grid)
-----------------------------------------------
face_nodes = how many nodes on face of cap
/DEFAULTS/ MNOD_F = 30
-----------------------------------------------
-----------------------------------------------
INPUTS - CAP_TE (trailing edge sub grid)
-----------------------------------------------
span_nodes = number of nodes during surgrd along span
/DEFAULTS/ MNOD = 20
SMU = smoothing constant during surgrd along span
/DEFAULTS/ SMU_F = 1.5
ITSVOL = number of volume iterations during surgrd along span
/DEFAULTS/ ITSVOL_F = 450
NSMOO = number of smoothing iterations during surgrd along span
/DEFAULTS/ NSMOO_F = 0
-----------------------------------------------