Good afternoon @Pietro.Bortolotti
I deleted my previous post as it seems like something more suited to uploading as a WISDEM Github issue.
For the past few weeks I have been playing around with WISDEM and getting a better grasp on how to set up these optimization problems, and in the process I have been able to downscale the IEA-130-RWT
turbine rotor into a 100 meter rotor with mixed success. I have been reading concepts from the following sources:
Example 3a and 3b: Blade optimization
Example 16: Rotor Inverse Design Example
WISDEM Github issue #587
And I read some sections of “On the scaling of wind turbine rotors”
From this, I did an an aero-structural optimization using LCOE to see if I could get a good enough downscaled turbine, to then attempt to do an purely aerodynamic optimization in a second separate WISDEM optimization with AEP or Cp as merit figures, and maybe tuning TSR. The process I followed is shown below:
Initially as mentioned in Github Issue 587, I started by changing assembly level values to match the size and power rating of my target turbine:
name: IEA-3.4-130-RWT #to be changed into Vestas model
description: version from December 16th 2019
assembly:
turbine_class: II #originally was set to III
turbulence_class: B #originally was set to A
drivetrain: Geared
rotor_orientation: Upwind
number_of_blades: 3
hub_height: 80. #changed from 110m. Site specific Vestas V100 has this hub height
rotor_diameter: 100. #changed from 130m
rated_power: 1.8e+6 #changed from 3.37 MW
From that, I set up my analysis file to have design variables for aero_shape and structural components, with the main constraints being strains on blade elements, tip deflection, chord size to match something similar to my target turbine, and the blade mass based on what I was able to find about my turbine online and also tried matching it with this source. Notably I tried keeping the settings similar to online examples for constraints which might’ve contributed to the issues I ran into. I kept the optimizer pretty standard, running for max 100 iterations:
general:
folder_output: outputs_aerostruct
fname_output: Vestas-V100-1800_aerostruct
design_variables:
#deleted rotor diameter design variable as I set the value I want in geometry input file
blade:
aero_shape:
twist:
flag: True # Flag to optimize the twist
inverse: False
inverse_target: max_efficiency # Flag to determine twist from the user-defined desired margin to stall (defined in constraints)
#Here I set twist flag to false, and instead set inverse to true, and set inverse target to max efficiency
n_opt: 8 # changed from 4 to 10 sections along blade span
max_decrease: 0.1 # Maximum decrease for the twist in [rad] at the n_opt locations
max_increase: 0.1 # Maximum increase for the twist in [rad] at the n_opt locations
index_start: 2 # Lock the first two DVs from blade root
index_end: 8 # All DVs close to blade tip are active
chord:
flag: True # Flag to optimize the chord
n_opt: 8 # Number of control points along blade span
max_decrease: 0.3 # Minimum multiplicative gain on existing chord at the n_opt locations
max_increase: 3. # Maximum multiplicative gain on existing chord at the n_opt locations
index_start: 2 # Lock the first two DVs from blade root
index_end: 8 #change blade tip chord
structure:
- layer_name: Spar_cap_ss
n_opt: 8 # Number of control points along blade span
max_decrease: 0.2 # Maximum nondimensional decrease at the n_opt locations
max_increase: 5.0 # Maximum nondimensional increase at the n_opt locations
index_start: 1 # Lock the first DV from blade root
index_end: 8 # The last DV at blade tip
- layer_name: Spar_cap_ps
n_opt: 8 # Number of control points along blade span
max_decrease: 0.2 # Maximum nondimensional decrease at the n_opt locations
max_increase: 5.0 # Maximum nondimensional increase at the n_opt locations
index_start: 1 # Lock the first DV from blade root
index_end: 8 # The last DV at blade tip
- layer_name: Shell_skin
n_opt: 8
max_decrease: 0.2
max_increase: 5.0
index_start: 2
index_end: 8
- layer_name: LE_reinforcement
n_opt: 8
max_decrease: 0.2
max_increase: 5.0
index_start: 1
index_end: 8
- layer_name: TE_reinforcement_SS
n_opt: 8
max_decrease: 0.2
max_increase: 5.0
index_start: 1
index_end: 8
- layer_name: TE_reinforcement_PS
n_opt: 8
max_decrease: 0.2
max_increase: 5.0
index_start: 1
index_end: 8
merit_figure: LCOE
constraints:
blade:
strains_spar_cap_ss:
flag: True # Flag to impose constraints on maximum strains (absolute value) in the spar cap on the blade suction side
max: 3500.e-6 # Value of maximum strains [-]
index_start: 1 # Do not enforce constraint at the first station from blade root of the n_opt from spar_cap_ss
index_end: 7 # Do not enforce constraint at the last station at blade tip of the n_opt from spar_cap_ss
strains_spar_cap_ps:
flag: True # Flag to impose constraints on maximum strains (absolute value) in the spar cap on the blade pressure side
max: 3500.e-6 # Value of maximum strains [-]
index_start: 1 # Do not enforce constraint at the first station from blade root of the n_opt from spar_cap_ps
index_end: 7 # Do not enforce constraint at the last station at blade tip of the n_opt from spar_cap_ps
strains_te_ss:
flag: True # Flag to impose constraints on maximum strains (absolute value) in the spar cap on the blade suction side
max: 3500.e-6 # Value of maximum strains [-]
index_start: 1 # Do not enforce constraint at the first station from blade root of the n_opt from spar_cap_ss
index_end: 7 # Do not enforce constraint at the last station at blade tip of the n_opt from spar_cap_ss
strains_te_ps:
flag: True # Flag to impose constraints on maximum strains (absolute value) in the spar cap on the blade pressure side
max: 3500.e-6 # Value of maximum strains [-]
index_start: 1 # Do not enforce constraint at the first station from blade root of the n_opt from spar_cap_ps
index_end: 7 # Do not enforce constraint at the last station at blade tip of the n_opt from spar_cap_ps
tip_deflection:
flag: True
margin: 2 #higher tip deflection margin chosen as blade deflection was too high
# stall:
# flag: True # Constraint on minimum stall margin
# margin: 0.08722 # Increased stall margin from 0.087 to 0.15
moment_coefficient:
flag: True # Constraint on max aerodynamic moment coefficient
max: 0.16
chord:
flag: True
max: 4.2 #max chord length in Vestas V100 is 3.9 metres
min: 0.5
chord_slope:
flag: True
# rated_velocity:
# flag: True
# target: 12 #m/sec
# acceptable_error: 0.1
# rated_thrust:
# flag: True
# target: 520000 #value for other 2MW turbines
# acceptable_error: 10000.0
mass:
flag: True
target: 7500 #expected weight per blade
acceptable_error: 1000.
nacelle:
mass:
flag: True
target: 82000 #AI generated approximate nacelle mass
acceptable_error: 2000 # Adjust based on design flexibility
rotor:
mass:
flag: True
target: 22500 # 3 Ă— 7500 blade mass (or calculated rotor mass)
acceptable_error: 1000
rna: #rotor nacelle assembly.
mass:
flag: True
target: 116500 #kg from estimated weight of rotor, nacelle, and hub assembly.
acceptable_error: 3000
driver:
optimization:
flag: True # Flag to enable optimization
tol: 1.e-5 # Optimality tolerance
# max_major_iter: 10 # Maximum number of major design iterations (SNOPT)
# max_minor_iter: 100 # Maximum number of minor design iterations (SNOPT)
max_iter: 100 # Maximum number of iterations (SLSQP)
solver: SLSQP # Optimization solver. Other options are 'SLSQP' - 'CONMIN'
step_size: 1.e-3 # Step size for finite differencing
form: forward # Finite differencing mode, either forward or central
recorder:
flag: True # Flag to activate OpenMDAO recorder
file_name: log_opt.sql # Name of OpenMDAO recorder
After running the simulation I was able to generate the following results:
Overall, I think the results were promising for an initial run, but taking a closer look specifically at the thicknesses of the structural elements in the resulting geometry file I noticed that closer to the tip I start getting negative values, and for some reason my first value of the thicknesses starts at 0 which is odd as I thought I specified the program not to edit the thicknesses there in design variables. I believe the negative values might be occurring either because I set up my design variables and constraints incorrectly, or because the resolution of the finite differencing or number of blade elements is not set up correctly, resulting in weird geometry at the root and tip.
Once again thanks for the help, hopefully I can nail down some of the issues that made the rotor optimization not work as intended and that I am on the right track!
Kind regards,
Emilio.