Actuator Disk Test Cases

WIPP Test Case

This test case was part of the Workshop for Integrated Propeller Prediction (WIPP) and results are documented in the paper entitled: "Comparison of Propeller-Wing Interaction Simulation using Different Levels of Fidelity", Z. Yang, A. Kirby and D. Mavriplis, AIAA paper 2022-1678, DOI: 10.2514/6.2022-1678, available at: https://scientific-sims.com/cfdlab/Dimitri_Mavriplis/HOME/assets/papers/6.2022-1678.pdf

The test case is described in detail in the paper. The figure below illustrates the general configuration. This figure was constructed using the NSU3D post_proc facility to generate the surface geometry of the wing/nacelle, and the actuator disk actdisk_loads.ncycles.dat file to render the actuator disk location and momentum source grid. The last figure illustrates the fact that the actuator disk momentum sources are overset in the CFD mesh and do not align with any specific mesh surfaces. Note that all disk source point locations are plotted on the disk, although a gap appears in the figure along the last source radial line in the list, which is intentional.

./figures/actdisk_fig2.png
./figures/actdisk_fig1.png
./figures/actdisk_fig3.png

The flow conditions are Mach=0.08, Re=567,801/ft. Here we focus on the Incidence = 0 deg case, although a full range of flow incidences was run in the paper to generate a drag polar.

Five test cases are shown to illustrate the application of the different actuator disk loading types and functions:

CASE 1: Assumed Load Distribution Case (loadtype=1,2)

This case uses a linear loading profile by specifying the parameter loadtype=2 in the actdisk_system namelist of the input.actdisk file. Listing the relevant parameters in the input file under each namelist we have:

./figures/loading_linear.png

Listing 1: input.actdisk input file for Case 1

1  ! WIPP Prescribed Linear Loading Test Case
2
3  ! Initialization namelist for sea level standard atmosphere
4  &actdisk_info
5    nsystem            = 1,
6    nrotor             = 1,
7    nblade             = 1,
8    nairfoil           = 0,
9    ref_length         = 1.0,       !L_physical / L_grid
10   ref_length_unit    = "in"       !Default is in. ft or in triggers lb below. Otherwise is SI.
11   show_system        = .false.,
12   show_rotor         = .true.,
13   force_output_unit  = "lb",     !These should be the defaults because ref_length_unit is inches
14   moment_output_unit = "lb*ft"   !But specify for completeness
15 /
16
17 &actdisk_system
18   system_name            = "WIPP System"
19   center_of_gravity(1:3) = -1.14663, 67.45, 0.0,
20   cg_unit                = "in",
21   init_collective        =  0.,    !Can modify to match Cq (default=0)
22   target_value(1)        =  40,
23   target_unit(1)         = "lb",
24   loadtype               =  2      !Loadtype for linear load profile (set=1 for constant profile)
25 /
26
27 &actdisk_rotor
28   rotor_name             = "WIPP Rotor"
29   rotation_rate          = 5905.0,              ! Counter-clockwise (Only used for thrust/mom coefficients)
30   rotation_unit          = "rpm",
31   hub_coord(1:3)         =-1.14663, 67.45, 0.0,
32   hub_unit               = "in",
33   shaft_axis(1:3)        =-1.0,     0.0,     0.0,
34   zero_azimuth_axis(1:3) = 0.0,     1.0,     0.0,
35   blade_count            = 1,                   ! Set= 1 for prescribed loading
36   nradial                = 400,
37   nnormal                = 720,
38 /
39
40 &actdisk_blade
41  station_unit      = "in",        !NOTE: Force is perpendicular to blade orientation (including collective)
42  chord_sta(1:2)    =  3.24,  8.1,
43  twist_sta(1:9)    = 3.0780, 3.9998, 4.6000, 5.2002, 5.7996, 6.3998, 7.0000, 7.4002, 8.0004,  !Optional: Defaults are = 0.0 producing Cq=0
44  twist(1:9)        = 33.298, 30.420, 29.481, 29.710, 28.087, 26.637, 21.219, 18.688, 17.499,  !Optional: Defaults are = 0.0 producing Cq=0
45  twist_unit        = "deg",
46 /

CASE 2: Prescribed loading (loadtype=4)

This case uses a prescribed load profile by specifying the parameter loadtype=4 in the actdisk_system namelist of the input.actdisk file. The load profile was obtained experimentally in the WIPP workshop and is reproduced in Figure 3 of the AIAA paper cited above. These loads were supplied as normal and tangential load values with respect to the actuator disk plane along the radial direction. These values were used to construct a load vector distribution along the radial direction. A blade twist was then constructed in order to match the load vector direction at each radial station with the blade chord normal direction, and the total loads were applied at each station in the direction normal to the blade chord. Many of the input parameters are similar between this case and the previous case and thus only the main differences are highlighted here.

Listing 2: input.actdisk input file for Case 2

1  ! WIPP Prescribed Loading Test Case
2
3  ! Initialization namelist for sea level standard atmosphere
4  &actdisk_info
5    nsystem            = 1,
6    nrotor             = 1,
7    nblade             = 1,
8    nairfoil           = 0,
9    ref_length         = 1.0,  ! L_physical / L_grid
10   ref_length_unit    = "in"
11   show_system        = .false.
12   show_rotor         = .true.,
13   force_output_unit  = "lb",         !These should be the defaults because ref_length_unit is inches
14   moment_output_unit = "lb*ft"       !But specify for completeness
15 /
16
17 &actdisk_system
18   system_name             = "WIPP SYSTEM",
19   center_of_gravity(1:3) = -1.14663, 67.45, 0.0,
20   cg_unit                = "in",
21   loadtype               = 4                    ! loading type for Prescribed Loads
22 /
23
24 &actdisk_rotor
25   rotor_name              = "WIPP ROTOR",
26   rotation_rate          = 5905.0,              ! Counter-clockwise  (Only used for thrust/mom coefficients)
27   rotation_unit          = "rpm",
28   hub_coord(1:3)         = -1.14663, 67.45, 0.0,
29   hub_unit               = "in",
30   shaft_axis(1:3)        = -1.0,     0.0,     0.0,
31   zero_azimuth_axis(1:3) =  0.0,     1.0,     0.0,
32   blade_count            =  1,                   !Set=1 for prescribed load
33   nradial                =  400,
34   nnormal                =  720,
35   station_unit           = "in"
36   loading_unit           = "psf"
37   loading_sta            = 3.0780, 3.9998, 4.6000, 5.2002, 5.7996, 6.3998, 7.0000, 7.4002, 8.0004,
38   loading                = 9.408, 15.085, 18.791, 20.289, 20.427, 20.486, 19.634, 19.058, 19.066,
39 /
40
41 &actdisk_blade
42   station_unit      = "in",        !NOTE: Force is perpendicular to blade orientation (including collective)
43   chord_sta(1:2)    =  3.24,  8.1,
44   twist_sta(1:9)    = 3.0780, 3.9998, 4.6000, 5.2002, 5.7996, 6.3998, 7.0000, 7.4002, 8.0004,
45   twist(1:9)        = 33.298, 30.420, 29.481, 29.710, 28.087, 26.637, 21.219, 18.688, 17.499,
46   twist_unit        = "deg",
47 /

CASE 3: Blade-element theory loading (loadtype=3)

Setting loadtype=3 in the actdisk_system namelist specifies the blade element method, where the local loading is deterimed from the local flow conditions and a set of airfoil lookup tables. Note that this method produces actuator disk loading that is dependent on the local flow conditions, whereas the other methods produce constant loading distributions that are independent of changes in the flow field. This setting requires prescribing the blade properties under the actdisk_blade namelist, along with specifying the airfoil table files under the actdisk_airfoil namelist.

Listing 3: input.actdisk input file for Case 3

1  !WIPP BLADE-ELEMENT CASE
2  ! Initialization namelist for sea level standard atmosphere
3  &actdisk_info
4    nsystem            = 1,
5    nrotor             = 1,
6    nblade             = 1,
7    nairfoil           = 7,
8    ref_length         = 1.0,  ! L_physical / L_grid
9    ref_length_unit    = "in"
10   show_rotor         = .true.,
11   force_output_unit  = "lb",
12   moment_output_unit = "lb*ft"
13 /
14
15 &actdisk_system
16   system_name            = "WIPP SYSTEM",
17   center_of_gravity(1:3) =-1.14663, 67.45, 0.0,
18   cg_unit                = "in",
19   init_collective        = 28.432,
20   loadtype               = 3                    ! loading type for blade-element
21 /
22
23 &actdisk_rotor
24   rotor_name             = "WIPP ROTOR",
25   rotation_rate          = 5905.0,              ! Counter-clockwise
26   rotation_unit          = "rpm",
27   hub_coord(1:3)         =-1.14663, 67.45, 0.0,
28   hub_unit               = "in",
29   shaft_axis(1:3)       =-1.0,     0.0,     0.0,
30   zero_azimuth_axis(1:3)= 0.0,     1.0,     0.0,
31   blade_count(1)         = 4,                   ! Four blade rotor
32   nradial                = 400,
33   nnormal                = 720,
35 /
36
37 &actdisk_blade
38   station_unit      = "in",
39   chord_sta(1:8)    =  2.550,   3.000,   4.000,   5.000,   6.000,   7.000,   8.000, 8.1,
40   chord(1:8)        =  1.340,   1.495,   1.683,   1.809,   1.890,   1.859,   1.665, 1.665,
41   chord_unit        = "in",
42   twist_sta(1:8)    = 2.550,   3.000,   4.000,   5.000,   6.000,   7.000,   8.000, 8.1,
43   twist(1:8)        = 21.144,  18.142,  11.557,   5.354,   0.436,  -3.553,  -7.306,-7.306,
44   twist_unit        = "deg",
45   airfoil_sta(1:7)  = 2.550,   3.000,   4.000,   5.000,   6.000,   7.000,   8.000,
46   airfoil(1:7)      = 1, 2,  3, 4, 5, 6, 7,
47 /
48
49 &actdisk_airfoil
50   airfoil_file(1) = "../airfoil_tables/s1/s1.c81"
51   airfoil_file(2) = "../airfoil_tables/s2/s2.c81"
52   airfoil_file(3) = "../airfoil_tables/s3/s3.c81"
53   airfoil_file(4) = "../airfoil_tables/s4/s4.c81"
54   airfoil_file(5) = "../airfoil_tables/s5/s5.c81"
55   airfoil_file(6) = "../airfoil_tables/s6/s6.c81"
56   airfoil_file(7) = "../airfoil_tables/s7/s7.c81"
57 /

CASE 4: Blade-element (loadtype=3) with trim control

This case adds trim control to the setup described in Case 3. This is a blade-element loading case, with loadtype = 3 in the actdisk_system namelist as in the previous case. The only changes to the input file required to activate trim control appear in the actdis_system namelist. In this case there is only one control parameter and one trim objective.

target_id(1) = "FX" is added in the actdisk_system region of the input file to specify the system force in the X-coordinate direction as the trim objective.

target_value(1) = -18.17 lbs is used to specify the desired thrust of the ssystem in this case, which consists of a single rotor. Note that in this case, the rotor axis is aligned with the X-axis, thus the thrust value can be specified directly. However, the rotor axis points in the negative axis direction and therefore the thrust produced must be specified as a negative value, in order to obtain a final thrust in the rotor axis system that is positive.

control_id(1) = "collective" is added in the actdisk_system region of the input file to specify the blade collective pitch as the input control parameter.

init_collective = 28.432 is used as previously, since this gives a good initial guess to the final collective value required to match the specified load.

Note that the parameters target_id(1) and control_id(1) can be omitted in this case, since their defaults correspond to the same values as used herein. In this case, the trim option is enabled by the specification of the target_value(1) parameter.

Only the actdisk_system namelist portion of the input.actdisk file is modified from Case 3 to enable trim control as shown below:

Listing 4: actdisk_system portion of input.actdisk input file for Case 4

15 &actdisk_system
16   system_name            = "WIPP SYSTEM",
17   center_of_gravity(1:3) =-1.14663, 67.45, 0.0,
18   cg_unit                = "in",
19   control_id(1)          = "collective",
20   init_collective        = 28.432,
21   target_id(1)           = "FX",
22   target_value(1)        = -18.17,
23   target_unit(1)         = "lb",
24   loadtype               = 3                    ! loading type for blade-element
25 /

CASE 5: Multiple Rotor Example

The example below illustrates a dual rotor test case. In this case, a second counter-rotating rotor is added behind the original rotor.

In the actdisk_info namelist, nrotor=2. Both rotors belong to the single actdisk_system as evidenced by the rotor_list parameter under the actdisk_system namelist. Under the actdisk_info namelist, the show_system keyword is set to .true. in order to produce output for the combined counter-rotating rotors.

There are now two actdisk_rotor namelists, with different hub coordinates and rotation directions. Furthermore, since the aft rotor is smaller than for foreward rotor, a different blade type is used for each rotor. Thus there are 2 blade types that are defined under the actdisk_blade namelist. Both rotors have blade_count(1) = 4, which means they both consist of a 4-bladed rotor with only one blade type used for all four blades. For the forward rotor, the parameter blade_list(1) = 1 assigns the first blade to this rotor, while the aft rotor uses the second (shorter) blade type with the setting blade_list(1) = 2.

The figure below illustrates the resulting actuator disks from this dual rotor setup.

Listing 5: input.actdisk input file for Case 5

1  !WIPP COUNTER-ROTATING ROTOR BLADE-ELEMENT CASE
2  ! Initialization namelist for sea level standard atmosphere
3  &actdisk_info
4    nsystem            = 1,
5    nrotor             = 2,
6    nblade             = 2,
7    nairfoil           = 7,
8    ref_length         = 1.0,  ! L_physical / L_grid
9    ref_length_unit    = "in"
10   show_system        = .true.,
11   show_rotor         = .true.,
12   force_output_unit  = "lb",
13   moment_output_unit = "lb*ft"
14 /
15
16 &actdisk_system
17   system_name            = "WIPP SYSTEM",
18   center_of_gravity(1:3) =-1.14663, 67.45, 0.0,
19   cg_unit                = "in",
20   init_collective        = 28.432,
21 ! rotor_list(1:2)        = 1,2,
22   loadtype               = 3                    ! loading type for blade-element
23 /
24
25 &actdisk_rotor
26   rotor_name             = "FRONT_ROTOR",
27   rotation_rate          = 5905.0,              ! Counter-clockwise
28   rotation_unit          = "rpm",
29   hub_coord(1:3)         =-1.14663, 67.45, 0.0,
30   hub_unit               = "in",
31   shaft_axis(1:3)       =-1.0,     0.0,     0.0,
32   zero_azimuth_axis(1:3)= 0.0,     1.0,     0.0,
33   blade_count(1)         = 4,                   ! Four blade rotor
34   blade_list(1)          = 1,                   ! Use first blade type
35   nradial                = 40,
36   nnormal                = 72,
37 /
38
39 &actdisk_rotor
40   rotor_name             = "REAR_ROTOR",
41   rotation_rate          = -5905.0,              !clockwise
42   rotation_unit          = "rpm",
43   hub_coord(1:3)         = 0.0, 67.45, 0.0,
44   hub_unit               = "in",
45   shaft_axis(1:3)        =-1.0,     0.0,     0.0,
46   zero_azimuth_axis(1:3) = 0.0,     1.0,     0.0,
47   blade_count(1)         = 4,                   ! Four blade rotor
48   blade_list(1)          = 2,                   ! Use second (smaller) blade type
49   nradial                = 40,
50   nnormal                = 72,
51 /
52
53 &actdisk_blade
54   station_unit      = "in",
55   chord_sta(1:8)    =  2.550,   3.000,   4.000,   5.000,   6.000,   7.000,   8.000, 8.1,
56   chord(1:8)        =  1.340,   1.495,   1.683,   1.809,   1.890,   1.859,   1.665, 1.665,
57   chord_unit        = "in",
58   twist_sta(1:8)    = 2.550,   3.000,   4.000,   5.000,   6.000,   7.000,   8.000, 8.1,
59   twist(1:8)        = 21.144,  18.142,  11.557,   5.354,   0.436,  -3.553,  -7.306,-7.306,
60   twist_unit        = "deg",
61   airfoil_sta(1:7)  = 2.550,   3.000,   4.000,   5.000,   6.000,   7.000,   8.000,
62   airfoil(1:7)      = 1, 2,  3, 4, 5, 6, 7,
63 /
64
65 &actdisk_blade
66   station_unit      = "in",
67   chord_sta(1:5)    =  2.550,   3.000,   4.000,   5.000,   6.000,
68   chord(1:5)        =  1.340,   1.495,   1.683,   1.809,   1.890,
69   chord_unit        = "in",
70   twist_sta(1:5)    = 2.550,   3.000,   4.000,   5.000,   6.000,
71   twist(1:5)        = 21.144,  18.142,  11.557,   5.354,   0.436,
72   twist_unit        = "deg",
73   airfoil_sta(1:5)  = 2.550,   3.000,   4.000,   5.000,   6.000,
74   airfoil(1:5)      = 1, 2,  3, 4, 5,
75 /
76
77 &actdisk_airfoil
78   airfoil_file(1) = "../airfoil_tables/s1/s1.c81"
79   airfoil_file(2) = "../airfoil_tables/s2/s2.c81"
80   airfoil_file(3) = "../airfoil_tables/s3/s3.c81"
81   airfoil_file(4) = "../airfoil_tables/s4/s4.c81"
82   airfoil_file(5) = "../airfoil_tables/s5/s5.c81"
83   airfoil_file(6) = "../airfoil_tables/s6/s6.c81"
84   airfoil_file(7) = "../airfoil_tables/s7/s7.c81"
85 /
86
./figures/actdisk_fig4.png

Other Example Cases: NASA Ducted Fan

A NASA ducted fan test case is shown in the figures below. This case was run with the blade-element loading method based on a published blade and nacelle geometry and used as a test case to validate the predicutve ability of this approach for ducted fans.

./figures/nasa_ductedfan_surf_sy0.png
./figures/nasa_ductedfan_cf1_3.png