# LCOE optimization and BOS cost

**URL:** <https://forums.nlr.gov/t/lcoe-optimization-and-bos-cost/7712>\
**Category:** Computer-Aided Engineering Software Tools\
**Created:** [October 16, 2024, 9:27am UTC](https://forums.nlr.gov/t/lcoe-optimization-and-bos-cost/7712 "2024-10-16T09:27:22Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![Vincenzo.Auriemma](https://avatars.discourse-cdn.com/v4/letter/v/57b2e6/32.png) [@Vincenzo.Auriemma](https://forums.nlr.gov/u/Vincenzo.Auriemma)\
**Post date:** [October 16, 2024, 9:27am UTC](https://forums.nlr.gov/t/lcoe-optimization-and-bos-cost/7712/1 "2024-10-16T09:27:22Z")

</div>

Dear all,  
starting from the [RAFT studies example](https://github.com/WISDEM/WEIS/blob/main/examples/15_RAFT_Studies/weis_driver_raft_opt.py), I was setting up an LCOE optimization problem, using RAFT for the simulation of a single FOWT response. The used analysis and modeling options are reported below.  
Analysis options:

> general:  
> folder\_output: outputs/15\_RAFT\_Rect  
> fname\_output: refturb\_output
> 
> design\_variables:  
> floating:  
> joints:  
> flag: True  
> z\_coordinate:  
> - names: [main\_keel, col1\_keel, col2\_keel, col3\_keel]  
> lower\_bound: -40.0  
> upper\_bound: -15.0  
> r\_coordinate:  
> - names: [col1\_keel, col1\_freeboard, col2\_keel, col2\_freeboard, col3\_keel, col3\_freeboard]  
> lower\_bound: 40. #35.8125  
> upper\_bound: 70. #64.6875  
> members:  
> flag: True  
> groups:  
> - names: [column1,column2,column3]  
> diameter:  
> lower\_bound: 9.5 #9.375  
> upper\_bound: 20.0 #15.625  
> constant: True  
> # thickness:  
> # lower\_bound: 0.05  
> # upper\_bound: 0.25  
> # constant: True  
> # - names: [Y\_pontoon\_lower1, Y\_pontoon\_lower2, Y\_pontoon\_lower3]  
> # diameter:  
> # lower\_bound: 7.5  
> # upper\_bound: 12.5
> 
> constraints:  
> control:  
> rotor\_overspeed:  
> flag: False  
> min: 0.0  
> max: 0.25  
> Max\_PtfmPitch:  
> flag: True  
> max: 5.5  
> Std\_PtfmPitch:  
> flag: True  
> max: 2.  
> Max\_Offset:  
> flag: True  
> max: 30.  
> floating:  
> stress:  
> flag: True  
> global\_buckling:  
> flag: True  
> shell\_buckling:  
> flag: True
> 
> merit\_figure\_user:  
> name: financese.lcoe
> 
> driver:  
> optimization:  
> flag: True # Flag to enable optimization  
> solver: COBYLA # Optimization solver. Other options are ‘SLSQP’ - ‘CONMIN’  
> tol: 1.e-2 # Optimality tolerance  
> max\_iter: 100 # Maximum number of iterations (SLSQP)
> 
> recorder:  
> flag: True # Flag to activate OpenMDAO recorder  
> file\_name: log\_opt.sql # Name of OpenMDAO recorder  
> includes: [‘_raft_’,‘_floating_’,‘_platform_’]

Modeling options:

> General:  
> verbosity: False # When set to True, the code prints to screen many infos  
> openfast\_configuration:  
> use\_exe: True  
> allow\_fails: True  
> fail\_value: 9999
> 
> WISDEM:  
> RotorSE:  
> flag: True  
> spar\_cap\_ss: Spar\_Cap\_SS  
> spar\_cap\_ps: Spar\_Cap\_PS  
> te\_ss: TE\_reinforcement\_SS  
> te\_ps: TE\_reinforcement\_PS  
> TowerSE:  
> flag: True  
> DriveSE:  
> flag: True  
> FloatingSE:  
> flag: True  
> # gamma\_f: 1.35 # Safety factor for fatigue loads  
> # gamma\_m: 1.3 # Safety factor for material properties  
> # gamma\_n: 1.0 # Safety factor for …  
> # gamma\_b: 1.1 # Safety factor for …  
> # gamma\_fatigue: 1.755 # Safety factor for fatigue loads  
> # buckling\_length: 30 # Buckling parameter  
> # soil\_springs: True  
> # gravity\_foundation: False  
> # frame3dd:  
> # shear: True  
> # geom: True  
> # tol: 1e-9  
> BOS:  
> flag: True
> 
> Level3: # Options for WEIS fidelity level 3 = nonlinear time domain  
> flag: False  
> simulation:  
> DT: 0.01  
> CompElast: 1  
> CompInflow: 1  
> CompAero: 2  
> CompServo: 1  
> CompHydro: 1  
> CompSub: 0  
> CompMooring: 3  
> CompIce: 0  
> OutFileFmt: 3  
> linearization:  
> Linearize: False  
> ElastoDyn:  
> FlapDOF1: True  
> FlapDOF2: True  
> EdgeDOF: True  
> TeetDOF: False  
> DrTrDOF: False  
> GenDOF: True  
> YawDOF: False  
> TwFADOF1 : True  
> TwFADOF2 : True  
> TwSSDOF1 : True  
> TwSSDOF2 : True  
> PtfmSgDOF: True  
> PtfmSwDOF: True  
> PtfmHvDOF: True  
> PtfmRDOF : True  
> PtfmPDOF : True  
> PtfmYDOF : True  
> HydroDyn:  
> WvLowCOff: 0.15708  
> WvHiCOff: 3.2  
> WaveSeed1: 123456789  
> AddBQuad1: [9.23e5, 0.0, 0.0, 0.0, -8.92e6, 0.0]  
> AddBQuad2: [0.0, 9.23e5, 0.0, 8.92e6, 0.0, 0.0]  
> AddBQuad3: [0.0, 0.0, 2.3e6, 0.0, 0.0, 0.0]  
> AddBQuad4: [0.0, 8.92e6, 0.0, 1.68e10, 0.0, 0.0]  
> AddBQuad5: [-8.92e6, 0.0, 0.0, 0.0, 1.68e10, 0.0]  
> AddBQuad6: [0.0, 0.0, 0.0, 0.0, 0.0, 4.8e10]  
> PotMod: 1  
> # WaveMod: 0
> 
> Level1:  
> flag: True  
> potential\_model\_override: 0  
> trim\_ballast: 0  
> heave\_tol: 1  
> save\_designs: True
> 
> ROSCO:  
> flag: True  
> SD\_Mode: 0  
> PS\_Mode: 1  
> ps\_percent: 0.85  
> F\_LPFType: 2  
> F\_NotchType: 2  
> Fl\_Mode: 2  
> tuning\_yaml: …/…/examples/01\_aeroelasticse/OpenFAST\_models/IEA-15-240-RWT/IEA-15-240-RWT-UMaineSemi/IEA15MW-UMaineSemi.yaml  
> zeta\_pc: [1]  
> omega\_pc: [0.2]  
> U\_pc: [12]  
> zeta\_vs: 0.85 # Torque controller desired damping ratio [-]  
> omega\_vs: 0.12  
> twr\_freq: 3.2  
> ptfm\_freq: 0.2  
> Kp\_float: -10
> 
> DLC\_driver:  
> metocean\_conditions:  
> wind\_speed: [4., 6., 8., 10., 12., 14., 16., 18., 20., 22., 24.]  
> wave\_height\_NSS: [0.83, 0.88, 0.94, 1.03, 1.16, 1.34, 1.57, 1.86, 2.22, 2.62, 3.07]  
> wave\_period\_NSS: [6.9, 6.96, 7.02, 7.12, 7.25, 7.43, 7.66, 7.94, 8.27, 8.63, 9.01]  
> wave\_height\_SSS: [6.3, 8, 8, 8.1, 8.5, 8.5, 9.8, 9.8, 9.8, 9.8, 9.9]  
> wave\_period\_SSS: [11.5, 12.7, 12.7, 12.8, 13.1, 13.1, 14.1, 14.1, 14.1, 14.1, 14.1]  
> wave\_height1: 6.98  
> wave\_period1: 11.7  
> wave\_height50: 10.68  
> wave\_period50: 14.2  
> DLCs:  
> - DLC: “1.1”  
> n\_seeds: 1  
> - DLC: “1.3”  
> n\_seeds: 6  
> # - DLC: “1.4”  
> # - DLC: “1.5”  
> # - DLC: “1.6”  
> # n\_seeds: 1  
> - DLC: “6.1”  
> n\_seeds: 1  
> # - DLC: “6.3”  
> # n\_seeds: 6

The optimization ends successfully, but I have found a very large final value of the BOS cost per kW from the output file (~14500 $/kW). This results in a very large LCOE value (around 300 $/MWh) as well and in a low sensitivity of the LCOE on the platform sizing, which is the final objective of the optimization. I was wondering where to look for possible error in the settings and if there is a way to set different values of the cost parameters (maybe in the Orbit module).  
Thanks in advance.

Best regards,

---

<div class="post-metadata">

**Author:** ![Garrett.Barter](https://avatars.discourse-cdn.com/v4/letter/g/958977/32.png) [@Garrett.Barter](https://forums.nlr.gov/u/Garrett.Barter)\
**Post date:** [October 16, 2024, 8:52pm UTC](https://forums.nlr.gov/t/lcoe-optimization-and-bos-cost/7712/2 "2024-10-16T20:52:35Z")

</div>

I would encourage you to dive into the output files to understand a bit more where the design wound up, if it looks like the constraints are satisfied, and what might be driving the high costs. It is difficult for me to make these assessments myself at a quick glance (I have not run your files).

I will say that your convergence tolerance looks high, so it is likely that the optimizer isn’t really converged to an answer worth scrutinizing further. I would recommend values more like `tol: 1e-6` and `max_iter: 300` for the COBYLA solver. Furthermore, if you have installed the `nlopt` package with WEIS (you likely have), then the `solver: LN_COBYLA` setting might be a bit more robust and effective.

---

<div class="post-metadata">

**Author:** ![Vincenzo.Auriemma](https://avatars.discourse-cdn.com/v4/letter/v/57b2e6/32.png) [@Vincenzo.Auriemma](https://forums.nlr.gov/u/Vincenzo.Auriemma)\
**Post date:** [November 4, 2024, 1:38pm UTC](https://forums.nlr.gov/t/lcoe-optimization-and-bos-cost/7712/3 "2024-11-04T13:38:04Z")

</div>

Dear @Garrett.Barter ,  
thanks for your advices, I’ve followed them. I’m trying to study a single turbine optimization case. I’ve seen that some input values related to the BOS settings, which seem to be very high for a single turbine. In particular, the site\_auction\_price and site\_assessment\_cost are very large. The default value are respectively 100e6 $ and 50e6 $. I’ve tried to reduce the site\_auction\_price as a preliminary approximation, but it seems that the code only reads the default value reported in the documentation (default value = 100e6 $). The same thing occurs with site\_assessment\_cost (default value = 50e6 $). I’ve tried to change the input values in BOS section.

 ![BOS_yaml](https://europe1.discourse-cdn.com/nrel/original/2X/a/a0b2b16eb198994c40304ea34db8a9f951a5c74a.png)

I’ve set a true BOS flag in modelling option. Other parameters are sensitive to variations (such as distance to site, distance to landfall and distance interconnection) of the values defined into the yaml file. Could you suggest me where to look for a possible error?

Best regards,

---

<div class="post-metadata">

**Author:** ![Garrett.Barter](https://avatars.discourse-cdn.com/v4/letter/g/958977/32.png) [@Garrett.Barter](https://forums.nlr.gov/u/Garrett.Barter)\
**Post date:** [November 5, 2024, 4:21pm UTC](https://forums.nlr.gov/t/lcoe-optimization-and-bos-cost/7712/4 "2024-11-05T16:21:57Z")

</div>

Hi Vincenzo,

Good catch on your part. This is a bug in the WISDEM-ORBIT interface. I will try to push an update to WISDEM soon.

---

<div class="post-metadata">

**Author:** ![Garrett.Barter](https://avatars.discourse-cdn.com/v4/letter/g/958977/32.png) [@Garrett.Barter](https://forums.nlr.gov/u/Garrett.Barter)\
**Post date:** [November 6, 2024, 11:37pm UTC](https://forums.nlr.gov/t/lcoe-optimization-and-bos-cost/7712/5 "2024-11-06T23:37:47Z")

</div>

This will be fixed in this [PR](https://github.com/WISDEM/WISDEM/pull/579), after which we will do a minor release of WISDEM to fix the ORBIT interface.

---

<div class="post-metadata">

**Author:** ![Vincenzo.Auriemma](https://avatars.discourse-cdn.com/v4/letter/v/57b2e6/32.png) [@Vincenzo.Auriemma](https://forums.nlr.gov/u/Vincenzo.Auriemma)\
**Post date:** [November 25, 2024, 12:40pm UTC](https://forums.nlr.gov/t/lcoe-optimization-and-bos-cost/7712/6 "2024-11-25T12:40:33Z")

</div>

Dear @Garrett.Barter ,

Thanks for the update, I’m currently using the last versions of WISDEM and WEIS. I am trying to run an optimization on LCOE using WISEDM/WEIS. Currently, I would like to define an analysis at single turbine level (not for a whole farm). I would like to account for BOS costs, using Orbit, but I cannot find a way to control some cost parameters used in the design and install phases when Orbit is run through the WISDEM interface.  
Could you, please, give me some advice on how to manage Orbit parameters within the Wisdem framework? I have seen that there is a set of library files with a list of default input parameters. Are the Orbit settings within Wisdem customizable?

For example, we noticed a very high cost for the offshore substation design and installation, which results in very high levels of the LCOE for a single turbine (for increasing farm size the LCOE ).

Thanks in advance,  
best regards

---

<div class="post-metadata">

**Author:** ![Garrett.Barter](https://avatars.discourse-cdn.com/v4/letter/g/958977/32.png) [@Garrett.Barter](https://forums.nlr.gov/u/Garrett.Barter)\
**Post date:** [November 26, 2024, 5:24am UTC](https://forums.nlr.gov/t/lcoe-optimization-and-bos-cost/7712/7 "2024-11-26T05:24:48Z")

</div>

@Vincenzo.Auriemma - Thanks for checking in on this. We have definitely debated about how many ORBIT inputs to elevate to WISDEM inputs as it could be overwhelming to some users and helpful to others.

First, ORBIT did do a significant release recently and we have incorporated this into the latest WISDEM v3.17+ versions. In this update came some changes to the yaml-inputs which are captured in the examples. Here is an example of the latest options for a [monopile](https://github.com/WISDEM/WISDEM/blob/master/examples/02_reference_turbines/IEA-15-240-RWT.yaml#L1014). You may also want to adjust the number of turbines that are assumed in the plant [here](https://github.com/WISDEM/WISDEM/blob/master/examples/02_reference_turbines/IEA-15-240-RWT.yaml#L1038).

From your question, it sounds like you may have other inputs that you would like you adjust. You can follow the logic of the WISDEM-ORBIT interface in [this file](https://github.com/WISDEM/WISDEM/blob/master/wisdem/orbit/api/wisdem.py). If you want to change some vessel parameters or settings, that is where you will need to look.

Let us know if you have suggestions on better ways to empower users here.

---

<div class="post-metadata">

**Author:** ![Vincenzo.Auriemma](https://avatars.discourse-cdn.com/v4/letter/v/57b2e6/32.png) [@Vincenzo.Auriemma](https://forums.nlr.gov/u/Vincenzo.Auriemma)\
**Post date:** [January 7, 2025, 9:55am UTC](https://forums.nlr.gov/t/lcoe-optimization-and-bos-cost/7712/8 "2025-01-07T09:55:52Z")

</div>

Dear all,  
I have explored the results about the CAPEX cost from WISDEM/ORBIT. I have noticed a very high value of Offshore substation cost for a single unit installation, obtaining the following capex breakdown:

 ![Breakdown_costs](https://europe1.discourse-cdn.com/nrel/original/2X/8/8cd51162c5b619b2c71b9955d8b6ac819fe6a494.png)

It seems that contribution from the offshore substation is eccessively high and I cannot find a way to control this value. Each optimization run of LCOE of the single unit is influenced by this large contribution, having no effective results on LCOE reduction. Every suggestion is appreciated. Thanks in advance.

Best regards,

---

<div class="post-metadata">

**Author:** ![Vincenzo.Auriemma](https://avatars.discourse-cdn.com/v4/letter/v/57b2e6/32.png) [@Vincenzo.Auriemma](https://forums.nlr.gov/u/Vincenzo.Auriemma)\
**Post date:** [January 10, 2025, 4:05pm UTC](https://forums.nlr.gov/t/lcoe-optimization-and-bos-cost/7712/9 "2025-01-10T16:05:27Z")

</div>

Dear all,

checking the LCOE estimation based on PlantfinanceSE calculation, using the output from Orbit, I have found that _orbit.total\_capex\_kW_ contains both the bos and turbine capital costs, but in the PlantfinanceSE module the turbine capital cost (_tcc.turbine\_cost\_kW_) seems to be added again when estimating LCOE. So, if I am not neglecting something, it seems that the cost of the turbine is counted twice. Do you agree with this interpretation? If so, is there a way to avoid such duplication?  
Thanks in advance.

Best, regards

---

<div class="post-metadata">

**Author:** ![Garrett.Barter](https://avatars.discourse-cdn.com/v4/letter/g/958977/32.png) [@Garrett.Barter](https://forums.nlr.gov/u/Garrett.Barter)\
**Post date:** [February 20, 2025, 4:07am UTC](https://forums.nlr.gov/t/lcoe-optimization-and-bos-cost/7712/10 "2025-02-20T04:07:29Z")

</div>

Very sorry for the delayed reply here. The notification can buried.

I think you are absolutely correct that the turbine capex is being double counted. I can confirm your observation both in the ORBIT [docs](https://wisdem.github.io/ORBIT/source/tutorial/available_outputs.html) and [source code](https://github.com/WISDEM/ORBIT/blob/dev/ORBIT/manager.py#L1809). I will make an edit to the WISDEM interface API to remove the turbine costs.
