Skip to content

Commit

Permalink
Merge pull request #28 from WISDEM/f/iea3.4
Browse files Browse the repository at this point in the history
Added IEA 3.4MW ref turbine as an example; updated to latest WISDEM/develop
  • Loading branch information
johnjasa authored Nov 18, 2020
2 parents acb69e0 + d13b0c4 commit 3e56f1b
Show file tree
Hide file tree
Showing 126 changed files with 17,712 additions and 653 deletions.
2 changes: 1 addition & 1 deletion WISDEM/.travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ install:
# Create environment and install dependences dependencies
- conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION
- conda activate test-environment
- conda install -q --yes compilers matplotlib pytest pytest-cov coveralls pip openmdao jsonschema ruamel_yaml pyyaml make xlrd openpyxl cython pandas numpydoc six setuptools git numpy scipy geopy
- conda install -q --yes compilers matplotlib pytest pytest-cov coveralls pip openmdao=3.4.0 jsonschema ruamel_yaml pyyaml make xlrd openpyxl cython pandas numpydoc six setuptools git numpy scipy geopy
- pip install simpy marmot-agents

# Install WISDEM
Expand Down
8 changes: 4 additions & 4 deletions WISDEM/examples/blade/analysis_options_aerostruct.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,20 @@ optimization_variables:
structure:
spar_cap_ss:
flag: True # Flag to optimize the spar cap thickness on the suction side
name: Spar_cap_ss # Name in the yaml of the spar cap laminate on the suction side
name: Spar_cap_ss # Name in the yaml of the spar cap laminate on the suction side
n_opt: 8 # Number of control points along blade span
min_gain: 0.7 # Nondimensional lower bound at the n_opt locations
max_gain: 1.3 # Nondimensional upper bound at the n_opt locations
spar_cap_ps:
flag: True # Flag to optimize the spar cap thickness on the pressure side
name: Spar_cap_ps # Name in the yaml of the spar cap laminate on the pressure side
name: Spar_cap_ps # Name in the yaml of the spar cap laminate on the pressure side
equal_to_suction: True # Flag to impose the spar cap thickness on pressure and suction sides equal
n_opt: 8 # Number of control points along blade span
min_gain: 0.7 # Nondimensional lower bound at the n_opt locations
max_gain: 1.3 # Nondimensional upper bound at the n_opt locations
te_ss:
flag: False # Flag to optimize the trailing edge reinforcement thickness on the suction side
name: TE_reinforcement # Name in the yaml of the trailing edge reinforcement laminate on the suction side
name: TE_reinforcement # Name in the yaml of the trailing edge reinforcement laminate on the suction side
n_opt: 8 # Number of control points along blade span
min_gain: 0.2 # Nondimensional lower bound at the n_opt locations
max_gain: 2.0 # Nondimensional upper bound at the n_opt locations
Expand Down Expand Up @@ -126,7 +126,7 @@ driver:
tol: 1.e-5 # Optimality tolerance
#max_major_iter: 10 # Maximum number of major design iterations
#max_minor_iter: 100 # Maximum number of minor design iterations
max_iter: 10 # Maximum number of minor design iterations
max_iter: 5 # Maximum number of minor design iterations
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
Expand Down
2 changes: 0 additions & 2 deletions WISDEM/examples/floating/semi_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,8 +188,6 @@
prob['operational_heel'] = 10.0 # Max heel (pitching) angle [deg]

# Design constraints
prob['max_taper'] = 0.2 # For manufacturability of rolling steel
prob['min_d_to_t'] = 80.0 # For weld-ability
prob['connection_ratio_max'] = 0.25 # For welding pontoons to columns

# API 2U flag
Expand Down
2 changes: 0 additions & 2 deletions WISDEM/examples/floating/spar_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,8 +176,6 @@
prob['operational_heel'] = 10.0 # Max heel (pitching) angle [deg]

# Design constraints
prob['max_taper'] = 0.2 # For manufacturability of rolling steel
prob['min_d_to_t'] = 80.0 # For weld-ability
prob['connection_ratio_max'] = 0.25 # For welding pontoons to columns

# API 2U flag
Expand Down
6 changes: 2 additions & 4 deletions WISDEM/examples/floating/spar_opt.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,8 @@
#prob.model.add_constraint('wave_height_fairlead_ratio', upper=1.0)

# Ensure that the radius doesn't change dramatically over a section
prob.model.add_constraint('main.constr_taper', lower=0.0)
prob.model.add_constraint('main.constr_d_to_t', upper=0.0)
prob.model.add_constraint('main.constr_taper', lower=0.2)
prob.model.add_constraint('main.constr_d_to_t', lower=80.0)

# Ensure max mooring line tension is less than X% of MBL: 60% for intact mooring, 80% for damanged
#prob.model.add_constraint('axial_unity', lower=0.0, upper=1.0)
Expand Down Expand Up @@ -207,8 +207,6 @@
prob['operational_heel'] = 10.0 # Max heel (pitching) angle [deg]

# Design constraints
prob['max_taper'] = 0.2 # For manufacturability of rolling steel
prob['min_d_to_t'] = 80.0 # For weld-ability
prob['connection_ratio_max'] = 0.25 # For welding pontoons to columns

# API 2U flag
Expand Down
2 changes: 0 additions & 2 deletions WISDEM/examples/floating/tlp_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,8 +182,6 @@
prob['operational_heel'] = 10.0 # Max heel (pitching) angle [deg]

# Design constraints
prob['max_taper'] = 0.2 # For manufacturability of rolling steel
prob['min_d_to_t'] = 80.0 # For weld-ability
prob['connection_ratio_max'] = 0.25 # For welding pontoons to columns

# API 2U flag
Expand Down
88 changes: 88 additions & 0 deletions WISDEM/examples/monopile/analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
general:
folder_output: outputs
fname_output: refturb_output
optimization_variables:

tower:
outer_diameter:
flag: True
lower_bound: 3.87
upper_bound: 8.0
layer_thickness:
flag: True
lower_bound: 4e-3
upper_bound: 2e-1
monopile:
outer_diameter:
flag: True
lower_bound: 3.87
upper_bound: 8.0
layer_thickness:
flag: True
lower_bound: 4e-3
upper_bound: 2e-1

merit_figure: structural_mass # Merit figure of the optimization problem. The options are 'AEP' - 'LCOE' - 'Cp' - 'blade_mass' - 'blade_tip_deflection'

constraints:
tower:
height_constraint:
flag: False
lower_bound: 1.e-2
upper_bound: 1.e-2
stress:
flag: True
global_buckling:
flag: True
shell_buckling:
flag: True
d_to_t:
flag: True
lower_bound: 120.0
upper_bound: 2000.0
taper:
flag: True
lower_bound: 0.2
slope:
flag: True
frequency_1:
flag: True
lower_bound: 0.13
upper_bound: 0.40
monopile:
height_constraint:
flag: False
lower_bound: 1.e-2
upper_bound: 1.e-2
stress:
flag: True
global_buckling:
flag: True
shell_buckling:
flag: True
d_to_t:
flag: True
lower_bound: 120.0
upper_bound: 2000.0
taper:
flag: True
lower_bound: 0.2
slope:
flag: True
frequency_1:
flag: True
lower_bound: 0.13
upper_bound: 0.40

driver:
tol: 1.e-3 # 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-6 # Step size for finite differencing
form: forward # Finite differencing mode, either forward or central

recorder:
flag: False # Flag to activate OpenMDAO recorder
file_name: log_opt.sql # Name of OpenMDAO recorder
52 changes: 52 additions & 0 deletions WISDEM/examples/monopile/modeling_options.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
general:
verbosity: False # When set to True, the code prints to screen many infos

Analysis_Flags:
# Control which WISDEM modules are executed.
# (GOAL) If inputs are missing for a module, a warning will be written to the screen and the module disabled.
RotorSE: False
DriveSE: False
TowerSE: True
BOS: False

yaml:
validate: False # When set to True, the code runs a yam validation package. This checks whether the yams has the right formatting.

tower: # Options of TowerSE module
nLC: 2 # Number of design load cases in TowerSE
wind: PowerWind # Wind used in TowerSE
gamma_f: 1.35 # Safety factor for fatigue loads in TowerSE
gamma_m: 1.3 # Safety factor for material properties in TowerSE
gamma_n: 1.0 # Safety factor for ...
gamma_b: 1.1 # Safety factor for ...
gamma_fatigue: 1.755 # Safety factor for fatigue loads in TowerSE
buckling_length: 30 # Buckling parameter in TowerSE
frame3dd:
shear: True
geom: True
tol: 1e-9
monopile: # Options of TowerSE module
nLC: 2 # Number of design load cases in TowerSE
wind: PowerWind # Wind used in TowerSE
gamma_f: 1.35 # Safety factor for fatigue loads in TowerSE
gamma_m: 1.3 # Safety factor for material properties in TowerSE
gamma_n: 1.0 # Safety factor for ...
gamma_b: 1.1 # Safety factor for ...
gamma_fatigue: 1.755 # Safety factor for fatigue loads in TowerSE
buckling_length: 30 # Buckling parameter in TowerSE
frame3dd:
shear: True
geom: True
tol: 1e-9

loading:
mass: 285598.8
center_of_mass: [-1.13197635, 0.0, 0.50875268]
moment_of_inertia: [1.14930678e08, 2.20354030e07, 1.87597425e07, 0.0, 5.03710467e05, 0.0]
loads:
- force: [1284744.19620519, 0.0, -2914124.84400512]
moment: [3963732.76208099, -2275104.79420872, -346781.68192839]
velocity: 11.73732
- force: [930198.60063279, 0.0, -2883106.12368949]
moment: [-1683669.22411597, -2522475.34625363, 147301.97023764]
velocity: 70.0
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,8 @@
prob.model.add_constraint('post2.stress', upper=1.0)
prob.model.add_constraint('post2.global_buckling', upper=1.0)
prob.model.add_constraint('post2.shell_buckling', upper=1.0)
prob.model.add_constraint('constr_d_to_t', upper=0.0)
prob.model.add_constraint('constr_taper', lower=0.0)
prob.model.add_constraint('constr_d_to_t', lower=120.0, upper=500.0)
prob.model.add_constraint('constr_taper', lower=0.2)
prob.model.add_constraint('slope', upper=1.0)
prob.model.add_constraint('tower1.f1', lower=0.13, upper=0.40)
prob.model.add_constraint('tower2.f1', lower=0.13, upper=0.40)
Expand Down Expand Up @@ -195,11 +195,6 @@
prob['pre2.rna_M'] = np.array([Mxx2, Myy2, Mzz2])
# ---------------

# --- constraints ---
prob['min_d_to_t'] = 120.0
prob['max_taper'] = 0.2
# ---------------

# run the analysis or optimization
prob.model.approx_totals()
if opt_flag:
Expand Down
42 changes: 42 additions & 0 deletions WISDEM/examples/monopile/monopile_driver.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import os
from wisdem.glue_code.runWISDEM import run_wisdem


## File management
mydir = os.path.dirname(os.path.realpath(__file__)) # get path to this file
fname_wt_input = mydir + os.sep + 'nrel5mw_monopile.yaml'
fname_modeling_options = mydir + os.sep + 'modeling_options.yaml'
fname_analysis_options = mydir + os.sep + 'analysis_options.yaml'

wt_opt, analysis_options, opt_options = run_wisdem(fname_wt_input, fname_modeling_options, fname_analysis_options)

# print results from the analysis or optimization
z = 0.5 * (wt_opt['towerse.z_full'][:-1] + wt_opt['towerse.z_full'][1:])
print('zs =', wt_opt['towerse.z_full'])
print('ds =', wt_opt['towerse.d_full'])
print('ts =', wt_opt['towerse.t_full'])
print('mass (kg) =', wt_opt['towerse.tower_mass'])
print('cg (m) =', wt_opt['towerse.tower_center_of_mass'])
print('d:t constraint =', wt_opt['towerse.constr_d_to_t'])
print('taper ratio constraint =', wt_opt['towerse.constr_taper'])
print('\nwind: ', wt_opt['towerse.wind1.Uref'])
print('freq (Hz) =', wt_opt['towerse.post1.structural_frequencies'])
print('Fore-aft mode shapes =', wt_opt['towerse.post1.fore_aft_modes'])
print('Side-side mode shapes =', wt_opt['towerse.post1.side_side_modes'])
print('top_deflection1 (m) =', wt_opt['towerse.post1.top_deflection'])
print('Tower base forces1 (N) =', wt_opt['towerse.tower1.base_F'])
print('Tower base moments1 (Nm) =', wt_opt['towerse.tower1.base_M'])
print('stress1 =', wt_opt['towerse.post1.stress'])
print('GL buckling =', wt_opt['towerse.post1.global_buckling'])
print('Shell buckling =', wt_opt['towerse.post1.shell_buckling'])
print('\nwind: ', wt_opt['towerse.wind2.Uref'])
print('freq (Hz) =', wt_opt['towerse.post2.structural_frequencies'])
print('Fore-aft mode shapes =', wt_opt['towerse.post2.fore_aft_modes'])
print('Side-side mode shapes =', wt_opt['towerse.post2.side_side_modes'])
print('top_deflection2 (m) =', wt_opt['towerse.post2.top_deflection'])
print('Tower base forces2 (N) =', wt_opt['towerse.tower2.base_F'])
print('Tower base moments2 (Nm) =', wt_opt['towerse.tower2.base_M'])
print('stress2 =', wt_opt['towerse.post2.stress'])
print('GL buckling =', wt_opt['towerse.post2.global_buckling'])
print('Shell buckling =', wt_opt['towerse.post2.shell_buckling'])

Loading

0 comments on commit 3e56f1b

Please sign in to comment.