BladeGen (Blade Generator) Version 1.0a

Authors: Nicholas J. Peters

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.

Input Files

Two input files are required:
  1. Airfoil coordinate files (in Selig format)
  2. Input parameters file - described below.

Output Files

  1. Output message file
  2. Output grid file containing all grids required to define the desired wing/blade

Execution

bladegen [input parameters filename] > [output messages filename]

Sample Input Parameters File and Explanation of Parameters


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
-----------------------------------------------

Limitations and Notes

  1. Airfoil coordinate files must be in Selig format. Points must wrap from trailing edge along the upper surface to the leading edge, then along the lower surface to the trailing edge. For most cases, leading edge should start at x-position of 0 and trailing edge should be located at a x-position of 1. Examples are provided in the examples/bladegen directory. A cubic spline is then used to interpolate between the provided coordinate points.
  2. Airfoil coordinate files must have a finite trailing edge.
  3. If airfoil coordinate files are prescaled (i.e. see profiles used in example/bladegen/blade.3.inp) user inputs refinement_spacing,max_spacing,le_spacing,te_spacing,root_spacing, and tip_spacing are not normalized by local chord length. Additionally, user should specify pitch_x_axis = 0. and chord_list should be a list with value 1.
  4. Blades and wings are assumed to have a flat face at tips.
  5. Defaults for generating cap grids are tested for airfoils with thickness between 9 and 12 percent chord length. For very thin airfoils (thickness below 5 percent) it is recommend users decrease root spacing, tip spacing, leading edge spacing, and trailing edge spacing. This increased refinement improves robustness when calling surgrd for marching along the cap faces.
  6. For chord, twist, droop, sweep, and airfoil distributions 500 is the maximum number of spanwise definitions.

Last modified: Tue March 19 14:19:00 2025