Platform structural constraint

Dear all,
I’m exploring an LCOE optimization case study including the maximum stress in the platform as constraint. In this case, I’m performing an optimization with RAFT, considering the 3.19.1 WISDEM version. I’ve noticed the definition of some ghost nodes where the section properties are assigned to small values. In such nodes the stress utilization sometimes assumes very high values.
Is this results expected? Does it affect the optimization process?

I’ve used the following modeling options:

# Generic modeling options file to run standard WISDEM case
General:
    verbosity: False  # When set to True, the code prints to screen many infos

WISDEM:
    RotorSE:
        flag: True
        n_pc: 20
        n_span: 101
        n_pitch_perf_surfaces: 10
        n_tsr_perf_surfaces: 10
        spar_cap_ss: Spar_Cap_SS
        spar_cap_ps: Spar_Cap_PS
        te_ss: TE_reinforcement_SS
        te_ps: TE_reinforcement_PS
        peak_thrust_shaving: False
        thrust_shaving_coeff: 0.8
        n_sector: 8
        hubloss: true
        tiploss: true
        wakerotation: true
        usecd: true
    DriveSE:
        flag: True
    TowerSE:             # Options of TowerSE module
        flag: True
    BOS:
        flag: True
    # FixedBottomSE:
    #     flag: true
    FloatingSE:
        flag: True

Level1:
    flag: True
    potential_model_override: 0
    potential_bem_members: [main_column,column1,column2,column3,Y_pontoon_lower1,Y_pontoon_lower2,Y_pontoon_lower3]
    # min_freq_BEM: 0.15
    min_freq: 0.01
    max_freq: 0.5
    save_designs: True
    plot_designs: True



DLC_driver:
    metocean_conditions: 
        # wind_speed: [3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25] 
        # wave_height_NSS: [1.589253312, 1.589253312, 1.796850486, 2.066758485, 2.39622745, 2.785549752, 3.237992345, 3.757419053, 4.346083996, 5.004368641, 5.731637064, 6.526989576]
        # wave_period_NSS: [9.788170598, 9.788170598, 9.992163283, 10.24618949, 10.54260929, 10.87776655, 11.25141272, 11.66433667, 12.11660442, 12.60751661, 13.13629721, 13.70255467]  
        # wave_height_fatigue: [1.589253312, 1.589253312, 1.796850486, 2.066758485, 2.39622745, 2.785549752, 3.237992345, 3.757419053, 4.346083996, 5.004368641, 5.731637064, 6.526989576]
        # wave_period_fatigue: [9.788170598, 9.788170598, 9.992163283, 10.24618949, 10.54260929, 10.87776655, 11.25141272, 11.66433667, 12.11660442, 12.60751661, 13.13629721, 13.70255467]  
        # wave_height_SSS: [1.589253312, 1.589253312, 1.796850486, 2.066758485, 2.39622745, 2.785549752, 3.237992345, 3.757419053, 4.346083996, 5.004368641, 5.731637064, 6.526989576]
        # wave_period_SSS: [9.788170598, 9.788170598, 9.992163283, 10.24618949, 10.54260929, 10.87776655, 11.25141272, 11.66433667, 12.11660442, 12.60751661, 13.13629721, 13.70255467]  
        # wave_height_1: 6.98
        # wave_period_1: 11.7
        # wave_height_50: 10.68
        # wave_period_50: 14.2  
        # ERA5 Sicily site
        wind_speed: [3., 5., 7., 9., 11., 13., 15., 17., 19., 21., 23., 25.]
        wave_height_NSS : [0.5291, 0.6575, 0.8539, 1.1164, 1.4446, 1.8389, 2.2999, 2.8285, 3.4253, 4.0909, 4.8256, 5.6296]
        wave_period_NSS : [4.8789, 5.1630, 5.5450, 5.9892, 6.4748, 6.9906, 7.5306, 8.0907, 8.6678, 9.2590, 9.8617, 10.4735]
        wave_height_fatigue: [0.5291, 0.6575, 0.8539, 1.1164, 1.4446, 1.8389, 2.2999, 2.8285, 3.4253, 4.0909, 4.8256, 5.6296]
        wave_period_fatigue: [4.8789, 5.1630, 5.5450, 5.9892, 6.4748, 6.9906, 7.5306, 8.0907, 8.6678, 9.2590, 9.8617, 10.4735]
        wave_height_SSS : [3.8518, 4.0043, 4.2972, 4.6667, 5.0741, 5.5055, 5.9615, 6.4454, 6.9611, 7.5069, 8.0758, 8.6488]
        wave_period_SSS : [9.0521, 9.1847, 9.4330, 9.7352, 10.0556, 10.3819, 10.7138, 11.0528, 11.4009, 11.7558, 12.1125, 12.4596]
        wave_height_1: 7.092929379
        wave_period_1: 12.28700857
        wave_height_50: 9.651482298
        wave_period_50: 14.33277729
  
    DLCs:
        - DLC: "1.1"
          wind_speed: [3, 5, 7, 9, 10, 11, 13, 15, 17, 19, 22, 25] 
        #   wind_speed: [2, 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 11., 11., 11., 11., 11., 11., 11., 11., 11., 11., 11., 11., 11., 11., 13., 13., 13., 13., 13., 13., 13., 13., 13., 13., 13., 13., 15., 15., 15., 15., 15., 15., 15., 15., 15., 15., 17., 17., 17., 17., 17., 17., 17., 17., 17., 17., 19., 19., 19., 19., 19., 19., 21., 21., 21., 21., 23., 30]
        #   wave_height : [1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 3.0000, 3.0000, 3.0000, 3.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 3.0000, 3.0000, 3.0000, 3.0000, 3.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 3.0000, 3.0000, 3.0000, 3.0000, 3.0000, 3.0000, 1.0000, 1.0000, 1.0000, 1.0000, 3.0000, 3.0000, 3.0000, 3.0000, 3.0000, 3.0000, 1.0000, 1.0000, 3.0000, 3.0000, 3.0000, 3.0000, 3.0000, 3.0000, 5.0000, 5.0000, 3.0000, 3.0000, 3.0000, 3.0000, 5.0000, 5.0000, 3.0000, 3.0000, 5.0000, 5.0000, 5.0000, 5.00000]
        #   wave_period : [4.0000, 4.0000, 4.0000, 4.0000, 4.0000, 4.0000, 4.0000, 6.0000, 6.0000, 6.0000, 6.0000, 6.0000, 6.0000, 8.0000, 8.0000, 8.0000, 8.0000, 8.0000, 8.0000, 10.0000, 10.0000, 10.0000, 10.0000, 4.0000, 4.0000, 4.0000, 4.0000, 6.0000, 6.0000, 6.0000, 6.0000, 6.0000, 6.0000, 8.0000, 8.0000, 8.0000, 8.0000, 8.0000, 8.0000, 10.0000, 10.0000, 4.0000, 4.0000, 4.0000, 6.0000, 6.0000, 6.0000, 6.0000, 6.0000, 8.0000, 8.0000, 8.0000, 8.0000, 10.0000, 10.0000, 8.0000, 8.0000, 10.0000, 10.0000, 4.0000, 4.0000, 6.0000, 6.0000, 8.0000, 8.0000, 8.0000, 10.0000, 10.0000, 6.0000, 8.0000, 8.0000, 10.0000, 10.0000, 4.0000, 4.0000, 6.0000, 6.0000, 8.0000, 8.0000, 6.0000, 6.0000, 8.0000, 8.0000, 10.0000, 10.0000, 4.0000, 4.0000, 6.0000, 6.0000, 6.0000, 6.0000, 8.0000, 8.0000, 10.0000, 10.0000, 6.0000, 6.0000, 6.0000, 6.0000, 8.0000, 8.0000, 10.0000, 10.0000, 10.0000, 10.0000, 6.0000, 6.0000, 8.0000, 8.0000, 10.0000, 10.0000, 8.0000, 8.0000, 10.0000, 10.0000, 10.0000, 10.0000]
        #   yaw_misalign : [0, -150.0000, -90.0000, -30.0000, 30.0000, 90.0000, 150.0000, -150.0000, -90.0000, -30.0000, 30.0000, 90.0000, 150.0000, -150.0000, -90.0000, -30.0000, 30.0000, 90.0000, 150.0000, -90.0000, -30.0000, 30.0000, 90.0000, -90.0000, -30.0000, 30.0000, 90.0000, -150.0000, -90.0000, -30.0000, 30.0000, 90.0000, 150.0000, -150.0000, -90.0000, -30.0000, 30.0000, 90.0000, 150.0000, -30.0000, 30.0000, -30.0000, 30.0000, 90.0000, -90.0000, -30.0000, 30.0000, 90.0000, 150.0000, -90.0000, -30.0000, 30.0000, 90.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -90.0000, -30.0000, 30.0000, -30.0000, 30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, -30.0000, 30.0000, 30.0000, 0]
        #   probabilities : [0.20438453717032, 0.0014, 0.0031, 0.0255, 0.0388, 0.0067, 0.0017, 0.0037, 0.0068, 0.0200, 0.0247, 0.0076, 0.0039, 0.0022, 0.0034, 0.0069, 0.0074, 0.0029, 0.0014, 0.0008, 0.0014, 0.0019, 0.0007, 0.0008, 0.0280, 0.0407, 0.0029, 0.0019, 0.0040, 0.0240, 0.0316, 0.0041, 0.0019, 0.0014, 0.0033, 0.0086, 0.0096, 0.0017, 0.0009, 0.0017, 0.0023, 0.0236, 0.0318, 0.0009, 0.0015, 0.0232, 0.0332, 0.0016, 0.0007, 0.0021, 0.0088, 0.0085, 0.0009, 0.0010, 0.0016, 0.0015, 0.0017, 0.0012, 0.0010, 0.0154, 0.0198, 0.0235, 0.0308, 0.0011, 0.0065, 0.0045, 0.0006, 0.0008, 0.0006, 0.0053, 0.0062, 0.0021, 0.0018, 0.0060, 0.0072, 0.0176, 0.0207, 0.0022, 0.0010, 0.0026, 0.0035, 0.0108, 0.0102, 0.0021, 0.0019, 0.0009, 0.0012, 0.0072, 0.0094, 0.0047, 0.0054, 0.0110, 0.0100, 0.0020, 0.0015, 0.0012, 0.0019, 0.0033, 0.0040, 0.0076, 0.0066, 0.0018, 0.0013, 0.0007, 0.0008, 0.0010, 0.0011, 0.0039, 0.0033, 0.0014, 0.0014, 0.0010, 0.0010, 0.0012, 0.0015, 0.0007, 0.0034883780]
          n_seeds: 1
          analysis_time: 100.
          transient_time: 0.
          turbulent_wind:
              HubHt: 190.0
              GridHeight: 320.0
              GridWidth: 350.0
              Clockwise: True
              RefHt: 190.0
              PLExp: 0.11
              IECturbc: -1
              IEC_WindType: 'NTM'

ROSCO:
    tuning_yaml: MED15-308_ROSCO.yaml

and the following analysis options:

general:
    folder_output: MED15/output_v20.4.0
    fname_output: MED15-308_v20.4.0

design_variables:
  floating:
    joints:
      flag: True
      z_coordinate:
          - names: [main_keel, col1_keel, col2_keel, col3_keel]
            lower_bound: -40
            upper_bound: -20
      r_coordinate:
          - names: [col1_keel, col1_freeboard, col2_keel, col2_freeboard, col3_keel, col3_freeboard]
            lower_bound: 55
            upper_bound: 85   
    members:
         flag: True
         groups:
           - names: [column1, column2, column3]
             diameter:
                 lower_bound: 10.0
                 upper_bound: 16.0
                 constant: True
             thickness:
                 lower_bound: 0.025
                 upper_bound: 0.15
                 constant: True
           - names: [Y_pontoon_lower1, Y_pontoon_lower2, Y_pontoon_lower3]
             thickness:
                 lower_bound: 0.025
                 upper_bound: 0.15
                 constant: True
           - names: [Y_pontoon_upper1, Y_pontoon_upper2, Y_pontoon_upper3]
             thickness:
                 lower_bound: 0.015
                 upper_bound: 0.15
                 constant: True
# merit_figure: platform_mass  # Merit figure of the optimization problem. The options are 'AEP' - 'LCOE' - 'Cp' - 'blade_mass' - 'blade_tip_deflection'
merit_figure: LCOE
# merit_figure_user: 
  # name: financese.lcoe

constraints:
  control:
    Max_PtfmPitch:
      flag: True
      max: 10
    Std_PtfmPitch:
      flag: True
      max: 4
  floating:
    # operational_heel:
    #   upper_bound: 0.17453
    # operational_heel:
    #   upper_bound: 0.087266      
    stress:
      flag: True
    global_buckling:
      flag: True
    shell_buckling:
      flag: True

driver:
  optimization:
    flag: True
    tol: 1.e-6            # Optimality tolerance
    max_iter: 1         # Maximum number of iterations (SLSQP)
    solver: LN_COBYLA     # Optimization solver. Other options are 'SLSQP' - 'CONMIN'
    
recorder:        
    flag: true                          # Flag to activate OpenMDAO recorder
    file_name: log_opt.sql              # Name of OpenMDAO recorder
    includes: ['*floating*','*finance*','*myopex*','*raft*','*wlf*','*fcr*']

Thanks in advance.

Best regards,

Hi Vincenzo,

Ghost nodes are not physical nodes in the system; they are to account for overlapping members (e.g., a lower pontoon and an outer column).

I should also note that RAFT does not send the loads (or global performance) back to WISDEM to compute stress utilization. WISDEM only uses the weight of the structure, mooring stiffness, and buoyancy to compute stress in the substructure. For this reason, I would probably not use it in the design process/optimization, unless you have added these connections to WEIS.

Best, Dan

Dear Daniel,
thanks for the quick answer and for your advice.
Can you suggest me which are the variables I need to connect and where are they located in the code (WISDEM or WEIS)?
I think to modify the “raft_wrapper.py” file. Is it correct?
(I have already tried to connect some RAFT variables to WEIS for other purposes, but I’ve met some difficulties)

Thanks in advance.

Best regards,

Hi Vincenzo,

I’m not sure the variables are accessible from RAFT quite yet, and making the connections will be a large undertaking.

Here is where similar connections are made for the tower: WEIS/weis/glue_code/glue_code.py at 8fc9b503b926c76d580cacf7ef078e014cfd7ba5 · WISDEM/WEIS · GitHub

That is where I would start to tracing the relevant signals from OpenFAST outputs back to WISDEM.

I hope this helps. Good luck!

Best, Dan

Dear Daniel,
thanks for your suggestions. Now, I’m considering OPENFAST too. Is the stress constraint working with OPENFAST?
Thanks in advance for your answer.

Best regards,

Hi Vincenzo,

No, the situation is the same with OpenFAST.

Best, Dan

Dear Daniel,

thanks for your suggestions.
I am trying to look at the code in depth, searching for the right place to insert the hydrodynamic actions in the calculation of the platform stress constraint.
I have seen that in the floatingse module are already present some connections related to memberloads.
Is this a good starting point?
Moreover, I have seen some raft functions already provide the calculation of hydrodynamic loads for each member, at least based on the Morison approach.
Are these loads already accounted for in the stress calculations.

Thanks in advance for your answer.
Best regards,

Hi Vincenzo,

No, I believe these loads are not accounted for in the FloatingSE stress calculations.

I’m not 100% sure, but I think that internal loads in the member will be needed, which will require SubDyn, or the new multi-body functionality of RAFT, which is not yet supported in WEIS.

Best, Dan

Hi Daniel,
thanks for your suggestions. I’ve looked into the FloatingSE and CommonSE modules to be more familiar with the framework, I noticed come classes related to the Aero and Hydro Loads in the wind_wave_drag.py file. It seems the wave loads are approximated as trapezoidal distributed load, based on Morison’s theory. (I put a small scheme in attachment)

Moreover, I’ve noticed some “TODO comments” related to the Rectangular cylinder. May you confirm me that’s the point in the code to implement some improvements or may you suggest me some other reference?

Thanks in advance for your answer
Best regards,