Plant Cost and Financial Analysis Tutorials

This tutorial covers how to use FUSED-Wind’s financial analysis capabilities with a simple set of cost models for a wind turbine and plant.

First, the necessary modules are imported; in this case we import the example models that draw upon the FUSED-Wind financial analysis framework.

from fusedwind.examples.fused_cost_example import BaseTurbineCostModel_Example, ExtendedTurbineCostModel_Example, FullTurbineCostModel_Example, \
                                 BaseBOSCostModel_Example, ExtendedBOSCostModel_Example, FullBOSCostModel_Example, \
                                 BaseOPEXModel_Example, ExtendedOPEXModel_Example, \
                                 BaseFinancialModel_Example, BaseFinancialAnalysis_Example, ExtendedFinancialAnalysis_Example

We will perform a set up of each of the base, extended and full models for analysis of turbine and balance of station costs as well as operational expenditures and overall financial analysis.

Turbine Cost Models

We begin with the turbine cost models and the most basic of them which simple allows you to have a turbine assembly consisting of whatever sub-models necessary and a simple cost aggregator model for the turbine. We set up the model, run it and print out the turbine cost results.

# Base Turbine Capital Cost Model uses a simple aggregator
baseTCC = BaseTurbineCostModel_Example()

baseTCC.run()

print "Turbine capital cost is: ${0:.0f} USD".format(baseTCC.turbine_cost)

The results should be:

>>> Turbine capital cost is: $9000000 USD

Next, we used an extended version of the turbine cost model where separate cost modules are explicitly used for the rotor, nacelle and tower. The simple models in this example have no inputs and just output respective costs. Therefor it is necessary to explicitly run them to update their cost outputs. We set up the model, run it for a first configuration, then run the sub-models, run the model again and print out the turbine and sub-assembly cost results to screen.

# Extended Turbine Capital Cost Model uses a simple aggregator along with separate models for rotor, nacelle and tower costs and all sub-components
extendedTCC = ExtendedTurbineCostModel_Example()

extendedTCC.run()
extendedTCC.rotorCC.bcc.run(True)
extendedTCC.nacelleCC.bcc.run(True)
extendedTCC.towerCC.bcc.run(True)

extendedTCC.run()

print
print "Turbine capital cost is: ${0:.0f} USD".format(extendedTCC.turbine_cost)
print "Rotor capital cost is: ${0:.0f} USD".format(extendedTCC.rotorCC.cost)
print "Nacelle capital cost is: ${0:.0f} USD".format(extendedTCC.nacelleCC.cost)
print "Tower capital cost is: ${0:.0f} USD".format(extendedTCC.towerCC.cost)

The results should be:

>>> Turbine capital cost is: $9000000 USD
>>> Rotor capital cost is: $3000000 USD
>>> Nacelle capital cost is: $3000000 USD
>>> Tower capital cost is: $3000000 USD

Finally, the full version of the turbine cost model includes individual cost models for each major wind turbine component. The same process is used as for the extended model.

# Full Turbine Capital Cost Model uses a simple aggregator along with separate models for rotor, nacelle and tower costs and all sub-components
fullTCC = FullTurbineCostModel_Example()

fullTCC.run()
fullTCC.rotorCC.bladeCC.run(True)
fullTCC.rotorCC.hubCC.run(True)
fullTCC.rotorCC.pitchSysCC.run(True)
fullTCC.rotorCC.spinnerCC.run(True)
fullTCC.nacelleCC.lssCC.run(True)
fullTCC.nacelleCC.bearingsCC.run(True)
fullTCC.nacelleCC.gearboxCC.run(True)
fullTCC.nacelleCC.hssCC.run(True)
fullTCC.nacelleCC.generatorCC.run(True)
fullTCC.nacelleCC.bedplateCC.run(True)
fullTCC.nacelleCC.yawSysCC.run(True)
fullTCC.towerCC.towerCC.run(True)

fullTCC.run()

print
print "Turbine capital cost is: ${0:.0f} USD".format(fullTCC.turbine_cost)
print
print "Rotor capital cost is: ${0:.0f} USD".format(fullTCC.rotorCC.cost)
print "Blade capital cost is: ${0:.0f} USD".format(fullTCC.rotorCC.bladeCC.cost)
print "Hub capital cost is: ${0:.0f} USD".format(fullTCC.rotorCC.hubCC.cost)
print "Pitch System capital cost is: ${0:.0f} USD".format(fullTCC.rotorCC.pitchSysCC.cost)
print "Spinner capital cost is: ${0:.0f} USD".format(fullTCC.rotorCC.spinnerCC.cost)
print
print "Nacelle capital cost is: ${0:.0f} USD".format(fullTCC.nacelleCC.cost)
print "Low speed shaft capital cost is: ${0:.0f} USD".format(fullTCC.nacelleCC.lssCC.cost)     
print "Bearings shaft capital cost is: ${0:.0f} USD".format(fullTCC.nacelleCC.bearingsCC.cost)
print "Gearbox shaft capital cost is: ${0:.0f} USD".format(fullTCC.nacelleCC.gearboxCC.cost)
print "Generator capital cost is: ${0:.0f} USD".format(fullTCC.nacelleCC.generatorCC.cost)     
print "High speed shaft capital cost is: ${0:.0f} USD".format(fullTCC.nacelleCC.hssCC.cost)
print "Bedplate shaft capital cost is: ${0:.0f} USD".format(fullTCC.nacelleCC.bedplateCC.cost)
print "Yaw System shaft capital cost is: ${0:.0f} USD".format(fullTCC.nacelleCC.yawSysCC.cost)
print
print "Tower capital cost is: ${0:.0f} USD".format(fullTCC.towerCC.cost)

The results should be:

>>> Turbine capital cost is: $9000000 USD
>>> Rotor capital cost is: $1000000 USD
>>> Blade capital cost is: $350000 USD
>>> Hub capital cost is: $300000 USD
>>> Pitch System capital cost is: $300000 USD
>>> Spinner capital cost is: $400000 USD
>>> Nacelle capital cost is: $4000000 USD
>>> Low speed shaft capital cost is: $500000 USD
>>> Bearings shaft capital cost is: $500000 USD
>>> Gearbox shaft capital cost is: $1000000 USD
>>> Generator capital cost is: $500000 USD
>>> High speed shaft capital cost is: $500000 USD
>>> Bedplate shaft capital cost is: $500000 USD
>>> Yaw System shaft capital cost is: $500000 USD
>>> Tower capital cost is: $4000000 USD

Balance of Station Cost Models

The basic balance of station model includes an assembly consisting of whatever sub-models are necessary and a simple cost aggregator. We set up the model, run it and print out the balance of station cost results.

# Base Balance of Station Cost Model uses a simple aggregator
baseBOS = BaseBOSCostModel_Example()

baseBOS.run()

print
print "Balance of station cost is: ${0:.0f} USD".format(baseBOS.bos_costs)

The results should be:

>>> Balance of station cost is: $1800000000 USD

The extended balance of station model is similar but requires a more specific breakdown of balance of station costs.

# Extended Balance of Station Cost Model uses a simple aggregator
extendedBOS = ExtendedBOSCostModel_Example()

extendedBOS.run()

print
print "Balance of station cost is: ${0:.0f} USD".format(extendedBOS.bos_costs)
print "Balance of station development cost is: ${0:.0f} USD".format(extendedBOS.bos_breakdown.development_costs)
print "Balance of station preparation and staging cost is: ${0:.0f} USD".format(extendedBOS.bos_breakdown.preparation_and_staging_costs)
print "Balance of station transportation cost is: ${0:.0f} USD".format(extendedBOS.bos_breakdown.transportation_costs)
print "Balance of station foundation and substructure cost is: ${0:.0f} USD".format(extendedBOS.bos_breakdown.foundation_and_substructure_costs)
print "Balance of station electrical cost is: ${0:.0f} USD".format(extendedBOS.bos_breakdown.electrical_costs)
print "Balance of station assemlby and installation cost is: ${0:.0f} USD".format(extendedBOS.bos_breakdown.assembly_and_installation_costs)
print "Balance of station soft cost is: ${0:.0f} USD".format(extendedBOS.bos_breakdown.soft_costs)
print "Balance of station other cost is: ${0:.0f} USD".format(extendedBOS.bos_breakdown.other_costs)

The results should be:

>>> Balance of station cost is: $1800000000 USD
>>> Balance of station development cost is: $90000000 USD
>>> Balance of station preparation and staging cost is: $180000000 USD
>>> Balance of station transportation cost is: $360000000 USD
>>> Balance of station foundation and substructure cost is: $360000000 USD
>>> Balance of station electrical cost is: $270000000 USD
>>> Balance of station assemlby and installation cost is: $270000000 USD
>>> Balance of station soft cost is: $180000000 USD
>>> Balance of station other cost is: $90000000 USD

The full version of the balance of station model requires even higher resolution on balance of station cost estimates.

# Full Balance of Station Cost Model uses a simple aggregator
fullBOS = FullBOSCostModel_Example()

fullBOS.run()

print
print "Balance of station cost is: ${0:.0f} USD".format(fullBOS.bos_costs)
print "Balance of station cost is: ${0:.0f} USD".format(fullBOS.bos_breakdown.management_costs)
print "Balance of station cost is: ${0:.0f} USD".format(fullBOS.bos_breakdown.development_costs)
print "Balance of station cost is: ${0:.0f} USD".format(fullBOS.bos_breakdown.preparation_and_staging_costs)
print "Balance of station cost is: ${0:.0f} USD".format(fullBOS.bos_breakdown.transportation_costs)
print "Balance of station cost is: ${0:.0f} USD".format(fullBOS.bos_breakdown.foundation_and_substructure_costs)
print "Balance of station cost is: ${0:.0f} USD".format(fullBOS.bos_breakdown.collection_and_substation_costs)
print "Balance of station cost is: ${0:.0f} USD".format(fullBOS.bos_breakdown.transmission_and_interconnection_costs)
print "Balance of station cost is: ${0:.0f} USD".format(fullBOS.bos_breakdown.assembly_and_installation_costs)
print "Balance of station cost is: ${0:.0f} USD".format(fullBOS.bos_breakdown.contingencies_and_insurance_costs)
print "Balance of station cost is: ${0:.0f} USD".format(fullBOS.bos_breakdown.decommissioning_costs)
print "Balance of station cost is: ${0:.0f} USD".format(fullBOS.bos_breakdown.construction_financing_costs)
print "Balance of station cost is: ${0:.0f} USD".format(fullBOS.bos_breakdown.other_costs)
print "Balance of station cost is: ${0:.0f} USD".format(fullBOS.bos_breakdown.developer_profits)

The results should be:

>>> Balance of station cost is: $1800000000 USD
>>> Balance of station cost is: $45000000 USD
>>> Balance of station cost is: $45000000 USD
>>> Balance of station cost is: $180000000 USD
>>> Balance of station cost is: $180000000 USD
>>> Balance of station cost is: $270000000 USD
>>> Balance of station cost is: $270000000 USD
>>> Balance of station cost is: $180000000 USD
>>> Balance of station cost is: $270000000 USD
>>> Balance of station cost is: $90000000 USD
>>> Balance of station cost is: $90000000 USD
>>> Balance of station cost is: $90000000 USD
>>> Balance of station cost is: $45000000 USD
>>> Balance of station cost is: $45000000 USD

Operational Expenditures Models

The basic operational expenditures model includes an assembly consisting of whatever sub-models are necessary and a simple cost aggregator. We set up the model, run it and print out the operational expenditures results.

# Base Operational Expenditures Model uses a simple aggregator
baseOPEX = BaseOPEXModel_Example()

baseOPEX.run()

print
print "Operational expenditures is: ${0:.0f} USD".format(baseOPEX.avg_annual_opex)

The results should be:

>>> Operational expenditures is: $50000000 USD

The extended operational expenditures model is similar but requires a more specific breakdown of operational expenditures.

# Extended Operational Expenditures Model uses a simple aggregator
extendedOPEX = ExtendedOPEXModel_Example()

extendedOPEX.run()

print
print "Operational expenditures is: ${0:.0f} USD".format(extendedOPEX.avg_annual_opex)
print "Preventative operational expenditures is: ${0:.0f} USD".format(extendedOPEX.opex_breakdown.preventative_opex)
print "Corrective operational expenditures is: ${0:.0f} USD".format(extendedOPEX.opex_breakdown.corrective_opex)
print "Lease operational expenditures is: ${0:.0f} USD".format(extendedOPEX.opex_breakdown.lease_opex)
print "Other operational expenditures is: ${0:.0f} USD".format(extendedOPEX.opex_breakdown.other_opex)

The results should be:

>>> Operational expenditures is: $50000000 USD
>>> Preventative operational expenditures is: $12500000 USD
>>> Corrective operational expenditures is: $25000000 USD
>>> Lease operational expenditures is: $12500000 USD
>>> Other operational expenditures is: $0 USD

Finance Models

The basic finance model includes an assembly consisting of whatever sub-models are necessary and a simple cost aggregator. We set up the model, run it and print out the finance results.

# Base Financial Model uses a simple aggregator
baseCOE = BaseFinancialModel_Example()

baseCOE.turbine_cost = 9000000.0 #Float(iotype='in', desc = 'A Wind Turbine Capital _cost')
baseCOE.turbine_number = 100 #Int(iotype = 'in', desc = 'number of turbines at plant')
baseCOE.bos_costs = 1800000000.0 #Float(iotype='in', desc='A Wind Plant Balance of Station _cost Model')
baseCOE.avg_annual_opex = 50000000.0 #Float(iotype='in', desc='A Wind Plant Operations Expenditures Model')
baseCOE.net_aep = 1752000000.0 #Float(iotype='in', desc='A Wind Plant Annual Energy Production Model', units='kW*h')
baseCOE.run()

print
print "Financial analysis COE result is: ${0:.4f}/kWh".format(baseCOE.coe)

The results should be:

>>> Financial analysis COE result is: $0.1655/kWh

The basic financial analysis model includes sub-assembly for turbine costs, balance of station costs, operational expenditures and energy production. Models for energy production must be based on the FUSED-Wind energy production model. The financial model has a global input, turbine number, which must be set. It can then be run and the results printed out.

# Base Financial Analysis model integrates base models of underlying cost sub-assemblies
baseFinance = BaseFinancialAnalysis_Example()
baseFinance.turbine_number = 100

baseFinance.run()

print    
print "Financial analysis COE result is: ${0:.4f}/kWh".format(baseFinance.coe)

The results should be:

>>> Financial analysis COE result is: $0.1655/kWh

The extended financial analysis model includes sub-assembly for turbine costs, balance of station costs, operational expenditures and energy production with extended models for balance of station and operational expenditures. Models for energy production must be based on the FUSED-Wind energy production model. The financial model has a global input, turbine number, which must be set. It can then be run and the results printed out.

# Extended financial model integrates base models for turbine, aep and finance with the extended bos and opex models
extendedFinance = ExtendedFinancialAnalysis_Example()
extendedFinance.turbine_number = 100

extendedFinance.run()

print    
print "Financial analysis COE result is: ${0:.4f}/kWh".format(extendedFinance.coe)

The results should be:

>>> Financial analysis COE result is: $0.1655/kWh