Demonstration of the Available Metrics#

Binder

For a complete list of metrics and their documentation, please see the API Metrics documentation.

This demonstration will rely on the results produced in the "How To" notebook and serves as an extension of the API documentation to show what the results will look like depending on what inputs are provided.

A Jupyter notebook of this tutorial can be run from examples/metrics_demonstration.ipynb locally, or through binder.

from pprint import pprint
from functools import partial

import pandas as pd
from pandas.io.formats.style import Styler

from wombat.core import Simulation, Metrics
from wombat.utilities import plot

# Clean up the aesthetics for the pandas outputs
pd.set_option("display.max_rows", 30)
pd.set_option("display.max_columns", 10)
style = partial(
  Styler,
  table_attributes='style="font-size: 14px; grid-column-count: 6"',
  precision=2,
  thousands=",",
)

Table of Contents#

Below is a list of top-level sections to demonstrate how to use WOMBAT's Metrics class methods and an explanation of each individual metric.

If you don't see a metric or result computation that is core to your work, please submit an issue with details on what the metric is, and how it should be computed.

Setup#

The simulations from the How To notebook are going to be rerun as it is not recommended to create a Metrics class from scratch due to the large number of inputs that are required, and the initialization is provided in the simulation API's run method.

To simplify this process, a feature has been added to save the simulation outputs required to generate the Metrics inputs and a method to reload those outputs as inputs.

sim = Simulation("COREWIND", "morro_bay_in_situ.yaml")

# Both of these parameters are True by default for convenience
sim.run(create_metrics=True, save_metrics_inputs=True)

# Load the metrics data
fpath = sim.env.metrics_input_fname.parent
fname = sim.env.metrics_input_fname.name
metrics = Metrics.from_simulation_outputs(fpath, fname)

# Delete the log files now that they're loaded in
sim.env.cleanup_log_files()

# Alternatively, in this case because the simulation was run, we can use the
# following for convenience convenience only
metrics = sim.metrics

Common Parameter Explanations#

Before diving into each and every metric, and how they can be customized, it is worth noting some of the most common parameters used throughout, and their meanings to reduce redundancy. The varying output forms are demonstrated in the availability section below.

frequency#

project

Computed across the whole simulation, with the resulting DataFrame having an empty index.

annual

Summary of each year in the simulation, with the resulting DataFrame having "year" as the index.

monthly

Summary of each month of the year, aggregated across years, with the resulting DataFrame having "month" as the index.

month-year

computed on a month-by-year basis, producing the results for every month of the simulation, with the resulting DataFrame having "year" and "month" as the index.

by#

windfarm

Aggregated across all turbines, with the resulting DataFrame having only "windfarm" as a column.

turbine

Computed for each turbine, with the resulting DataFrame having a column for each turbine.

electrolyzer

Computed for each electrolyzer, with the resulting DataFrame having a column for each electrolyzer. This option is only available for the availability and capacity factor metrics.

Availability#

There are two methods to produce availability, which have their own function calls:

Here, we will go through the various input definitions to get time-based availability data as both methods use the same inputs, and provide outputs in the same format.

Inputs:

  • frequency, as explained above options: "project", "annual", "monthly", and "month-year"

  • by, as explained above options: "windfarm", "turbine", or "electrolyzer"

Below is a demonstration of the variations on frequency and by for time_based_availability.

style(metrics.time_based_availability(frequency="project", by="windfarm"))
  windfarm
time_availability 0.91
style(metrics.production_based_availability(frequency="project", by="windfarm"))
  windfarm
energy_availability 0.91

Note that in the two above examples, that the values are equal. This is due to the fact that the example simulation does not have any operating reduction applied to failures, unless it's a catastrophic failure, so there is no expected difference.

# Demonstrate the by turbine granularity
style(metrics.time_based_availability(frequency="project", by="turbine"))
  WTG_0000 WTG_0001 WTG_0002 WTG_0003 WTG_0004 WTG_0005 WTG_0006 WTG_0007 WTG_0008 WTG_0009 WTG_0100 WTG_0101 WTG_0102 WTG_0103 WTG_0104 WTG_0105 WTG_0106 WTG_0107 WTG_0108 WTG_0109 WTG_0200 WTG_0201 WTG_0202 WTG_0203 WTG_0204 WTG_0205 WTG_0206 WTG_0207 WTG_0208 WTG_0209 WTG_0300 WTG_0301 WTG_0302 WTG_0303 WTG_0304 WTG_0305 WTG_0306 WTG_0307 WTG_0308 WTG_0309 WTG_0400 WTG_0401 WTG_0402 WTG_0403 WTG_0404 WTG_0405 WTG_0406 WTG_0407 WTG_0408 WTG_0409 WTG_0500 WTG_0501 WTG_0502 WTG_0503 WTG_0504 WTG_0505 WTG_0506 WTG_0507 WTG_0508 WTG_0509 WTG_0600 WTG_0601 WTG_0602 WTG_0603 WTG_0604 WTG_0605 WTG_0606 WTG_0607 WTG_0608 WTG_0609 WTG_0700 WTG_0701 WTG_0702 WTG_0703 WTG_0704 WTG_0705 WTG_0706 WTG_0707 WTG_0708 WTG_0709
time_availability 0.92 0.91 0.90 0.90 0.91 0.91 0.92 0.91 0.91 0.91 0.90 0.91 0.91 0.91 0.91 0.90 0.90 0.91 0.91 0.90 0.92 0.90 0.92 0.92 0.91 0.91 0.91 0.91 0.90 0.92 0.91 0.91 0.91 0.91 0.90 0.92 0.90 0.90 0.91 0.92 0.89 0.91 0.91 0.91 0.89 0.92 0.91 0.89 0.91 0.91 0.91 0.92 0.91 0.91 0.91 0.91 0.91 0.92 0.90 0.91 0.91 0.91 0.90 0.90 0.90 0.89 0.91 0.91 0.88 0.91 0.91 0.91 0.90 0.93 0.91 0.89 0.91 0.91 0.89 0.91
# Demonstrate the annualized outputs
style(metrics.time_based_availability(frequency="annual", by="windfarm"))
  windfarm
year  
2002 0.96
2003 0.92
2004 0.92
2005 0.91
2006 0.86
2007 0.89
2008 0.91
2009 0.93
2010 0.90
2011 0.88
2012 0.88
2013 0.93
2014 0.91
2015 0.93
2016 0.90
2017 0.89
2018 0.91
2019 0.92
2020 0.92
2021 0.89
# Demonstrate the month aggregations
style(metrics.time_based_availability(frequency="monthly", by="windfarm"))
  windfarm
month  
1 0.89
2 0.85
3 0.88
4 0.86
5 0.88
6 0.91
7 0.93
8 0.95
9 0.95
10 0.94
11 0.93
12 0.92
# Demonstrate the granular monthly reporting
style(metrics.time_based_availability(frequency="month-year", by="windfarm"))
    windfarm
year month  
2002 1 0.93
2 0.94
3 0.98
4 0.97
5 0.96
6 0.95
7 0.97
8 0.97
9 0.98
10 0.98
11 0.94
12 0.92
2003 1 0.85
2 0.91
3 0.90
4 0.90
5 0.90
6 0.91
7 0.91
8 0.97
9 0.98
10 0.96
11 0.97
12 0.92
2004 1 0.86
2 0.90
3 0.90
4 0.90
5 0.90
6 0.90
7 0.95
8 0.97
9 0.97
10 0.97
11 0.97
12 0.91
2005 1 0.77
2 0.92
3 0.90
4 0.90
5 0.91
6 0.89
7 0.94
8 0.97
9 0.96
10 0.87
11 0.94
12 0.93
2006 1 0.73
2 0.29
3 0.89
4 0.89
5 0.90
6 0.88
7 0.90
8 0.93
9 0.98
10 0.96
11 0.95
12 0.92
2007 1 0.91
2 0.57
3 0.89
4 0.90
5 0.90
6 0.90
7 0.91
8 0.92
9 0.96
10 0.97
11 0.95
12 0.93
2008 1 0.92
2 0.78
3 0.88
4 0.94
5 0.90
6 0.90
7 0.89
8 0.90
9 0.95
10 0.96
11 0.96
12 0.93
2009 1 0.95
2 0.89
3 0.90
4 0.93
5 0.92
6 0.93
7 0.91
8 0.94
9 0.95
10 0.95
11 0.92
12 0.94
2010 1 0.92
2 0.90
3 0.79
4 0.87
5 0.92
6 0.91
7 0.90
8 0.93
9 0.94
10 0.90
11 0.90
12 0.95
2011 1 0.93
2 0.87
3 0.56
4 0.75
5 0.94
6 0.95
7 0.93
8 0.92
9 0.91
10 0.92
11 0.93
12 0.93
2012 1 0.93
2 0.91
3 0.73
4 0.71
5 0.93
6 0.92
7 0.96
8 0.86
9 0.90
10 0.91
11 0.92
12 0.89
2013 1 0.90
2 0.90
3 0.89
4 0.87
5 0.96
6 0.95
7 0.97
8 0.97
9 0.93
10 0.91
11 0.94
12 0.94
2014 1 0.94
2 0.94
3 0.94
4 0.66
5 0.94
6 0.92
7 0.98
8 0.97
9 0.95
10 0.91
11 0.89
12 0.88
2015 1 0.90
2 0.92
3 0.96
4 0.88
5 0.87
6 0.96
7 0.97
8 0.98
9 0.94
10 0.94
11 0.89
12 0.90
2016 1 0.89
2 0.90
3 0.90
4 0.77
5 0.85
6 0.91
7 0.90
8 0.97
9 0.96
10 0.92
11 0.89
12 0.90
2017 1 0.90
2 0.90
3 0.90
4 0.73
5 0.72
6 0.90
7 0.90
8 0.98
9 0.97
10 0.93
11 0.96
12 0.94
2018 1 0.92
2 0.90
3 0.90
4 0.89
5 0.81
6 0.91
7 0.94
8 0.96
9 0.97
10 0.95
11 0.95
12 0.89
2019 1 0.90
2 0.89
3 0.90
4 0.90
5 0.87
6 0.87
7 0.92
8 0.97
9 0.96
10 0.96
11 0.95
12 0.92
2020 1 0.89
2 0.89
3 0.90
4 0.90
5 0.86
6 0.92
7 0.94
8 0.97
9 0.97
10 0.97
11 0.93
12 0.94
2021 1 0.89
2 0.90
3 0.91
4 0.90
5 0.66
6 0.84
7 0.90
8 0.93
9 0.96
10 0.93
11 0.94
12 0.94

Plotting Availability#

As of v0.9, the ability to plot the wind farm and turbine availability has been enabled as an experimental feature. Please see the plotting API documentation for more details.

# Demonstrate the granular monthly reporting
plot.plot_farm_availability(sim=sim, which="energy", farm_95_CI=True)
../_images/a7dd87586e74a65942ffc638c46d87e206279762bc37eb0e2a7eb6b4df1f0a26.png

Capacity Factor#

The capacity factor is the ratio of actual (net) or potential (gross) energy production divided by the project's capacity. For further documentation, see the API docs here: wombat.core.post_processor.Metrics.capacity_factor().

Inputs:

  • which

    • "net": net capacity factor, actual production divided by the plant capacity

    • "gross": gross capacity factor, potential production divided by the plant capacity

  • frequency, as explained above, options: "project", "annual", "monthly", and "month-year"

  • by, as explained above, options: "windfarm", "turbine", and "electrolyzer"

Example Usage:

net_cf = metrics.capacity_factor(which="net", frequency="project", by="windfarm").squeeze()
gross_cf = metrics.capacity_factor(which="gross", frequency="project", by="windfarm").squeeze()
print(f"  Net capacity factor: {net_cf:.2%}")
print(f"Gross capacity factor: {gross_cf:.2%}")
  Net capacity factor: 50.40%
Gross capacity factor: 55.59%

Task Completion Rate#

The task completion rate is the ratio of tasks completed aggregated to the desired frequency. It is possible to have a >100% completion rate if all maintenance and failure requests submitted in a time period were completed in addition to those that went unfinished in prior time periods. For further documentation, see the API docs here: wombat.core.post_processor.Metrics.task_completion_rate().

Inputs:

  • which

    • "scheduled": scheduled maintenance only (classified as maintenance tasks in inputs)

    • "unscheduled": unscheduled maintenance only (classified as failure events in inputs)

    • "both": Combined completion rate for all tasks

  • frequency, as explained above, options: "project", "annual", "monthly", and "month-year"

Example Usage:

scheduled = metrics.task_completion_rate(which="scheduled", frequency="project").values[0][0]
unscheduled = metrics.task_completion_rate(which="unscheduled", frequency="project").values[0][0]
combined = metrics.task_completion_rate(which="both", frequency="project").values[0][0]
print(f"  Scheduled Task Completion Rate: {scheduled:.2%}")
print(f"Unscheduled Task Completion Rate: {unscheduled:.2%}")
print(f"    Overall Task Completion Rate: {combined:.2%}")
  Scheduled Task Completion Rate: 96.14%
Unscheduled Task Completion Rate: 96.05%
    Overall Task Completion Rate: 96.08%

Equipment Costs#

Sum of the costs associated with a simulation's servicing equipment, which excludes materials, downtime, etc. For further documentation, see the API docs here: wombat.core.post_processor.Metrics.equipment_costs().

Inputs:

  • frequency, as explained above, options: "project", "annual", "monthly", and "month-year"

  • by_equipment

    • True: Aggregates all equipment into a single cost

    • False: Computes for each unit of servicing equipment

Example Usage:

# Project total at the whole wind farm level
style(metrics.equipment_costs(frequency="project", by_equipment=False))
  equipment_cost
0 2,309,166,181.00
# Project totals at servicing equipment level
style(metrics.equipment_costs(frequency="project", by_equipment=True))
  Anchor Handling Tug Cable Laying Vessel Crew Transfer Vessel 1 Crew Transfer Vessel 2 Crew Transfer Vessel 3 Crew Transfer Vessel 4 Crew Transfer Vessel 5 Crew Transfer Vessel 6 Crew Transfer Vessel 7 Diving Support Vessel Heavy Lift Vessel
0 114,495,120.16 171,567,472.53 25,563,197.39 25,563,216.17 25,563,206.40 25,563,195.77 25,563,177.12 25,563,201.47 25,563,187.19 124,292,284.78 1,719,868,922.01

Service Equipment Utilization Rate#

Ratio of days when the servicing equipment is in use (not delayed for a whole day due to either weather or lack of repairs to be completed) to the number of days it's present in the simulation. For further documentation, see the API docs here: wombat.core.post_processor.Metrics.service_equipment_utilization().

Inputs:

  • frequency, as explained above, options: "project" and "annual"

Example Usage:

# Project totals
style(metrics.service_equipment_utilization(frequency="project"))
  Anchor Handling Tug Cable Laying Vessel Crew Transfer Vessel 1 Crew Transfer Vessel 2 Crew Transfer Vessel 3 Crew Transfer Vessel 4 Crew Transfer Vessel 5 Crew Transfer Vessel 6 Crew Transfer Vessel 7 Diving Support Vessel Heavy Lift Vessel
0 0.91 0.95 1.00 1.00 1.00 1.00 1.00 1.00 1.00 0.97 1.00

Vessel-Crew Hours at Sea#

The number of vessel hours or crew hours at sea for offshore wind power plant simulations. For further documentation, see the API docs here: wombat.core.post_processor.Metrics.vessel_crew_hours_at_sea().

Inputs:

  • frequency, as explained above, options: "project", "annual", "monthly", and "month-year"

  • by_equipment

    • True: Aggregates all equipment into a single cost

    • False: Computes for each unit of servicing equipment

  • vessel_crew_assumption: A dictionary of vessel names (ServiceEquipment.settings.name, but also found at Metrics.service_equipment_names) and the number of crew onboard at any given time. The application of this assumption transforms the results from vessel hours at sea to crew hours at sea.

Example Usage:

# Project total, not broken out by vessel
style(metrics.vessel_crew_hours_at_sea(frequency="project", by_equipment=False))
  Total Crew Hours at Sea
0 680,408.94
# Annual project totals, broken out by vessel
style(metrics.vessel_crew_hours_at_sea(frequency="annual", by_equipment=True))
  Total Crew Hours at Sea Crew Transfer Vessel 1 Crew Transfer Vessel 2 Crew Transfer Vessel 3 Crew Transfer Vessel 4 Crew Transfer Vessel 5 Crew Transfer Vessel 6 Crew Transfer Vessel 7 Heavy Lift Vessel Cable Laying Vessel Anchor Handling Tug Diving Support Vessel
year                        
2002 19,281.82 1,399.53 1,627.64 1,588.96 1,604.45 1,394.79 1,419.98 1,610.64 6,922.97 984.36 728.50 0.00
2003 28,310.29 2,600.55 2,606.09 2,827.26 2,841.93 2,612.21 2,368.58 2,618.52 7,141.45 1,846.83 846.87 0.00
2004 38,094.60 2,454.47 2,249.38 2,410.29 2,384.06 2,234.56 2,335.13 2,349.23 8,053.25 4,199.15 2,127.11 7,297.97
2005 29,972.73 2,537.87 2,404.87 2,387.72 2,464.88 2,396.64 2,210.17 2,299.53 8,003.04 1,095.40 3,345.39 827.23
2006 38,195.09 2,526.62 2,595.52 2,466.72 2,430.16 2,367.46 2,478.32 2,369.25 7,132.50 1,944.51 5,768.32 6,115.71
2007 28,687.78 2,693.46 2,667.99 2,515.06 2,519.28 2,469.57 2,506.68 2,482.75 7,468.15 1,845.26 220.96 1,298.63
2008 39,087.19 2,450.90 2,649.95 2,569.43 2,723.94 2,287.99 2,418.91 2,326.30 7,459.65 4,325.96 4,240.76 5,633.40
2009 29,910.77 2,540.82 2,363.26 2,390.91 2,519.24 2,347.92 2,421.95 2,538.91 7,665.59 2,854.62 931.68 1,335.87
2010 39,866.68 2,723.74 2,670.15 2,796.20 2,691.57 2,811.12 2,728.06 2,845.15 7,574.34 6,316.00 2,241.66 4,468.71
2011 37,756.82 2,396.93 2,532.42 2,445.45 2,221.77 2,503.34 2,602.59 2,395.79 8,046.67 5,526.66 3,556.40 3,528.81
2012 37,702.37 2,560.32 2,703.30 2,716.89 2,691.07 2,745.56 2,633.65 2,790.33 7,496.98 4,625.31 3,256.04 3,482.91
2013 31,673.56 2,450.15 2,403.47 2,355.04 2,150.19 2,176.85 2,502.76 2,164.28 7,623.81 2,589.35 1,038.99 4,218.66
2014 31,760.82 1,996.07 2,437.62 2,248.43 2,099.80 2,076.68 2,310.68 2,082.79 8,263.44 2,456.91 2,860.01 2,928.40
2015 34,545.90 2,039.45 2,183.28 2,150.49 1,933.25 2,547.08 2,370.32 2,159.42 7,905.53 2,762.19 3,791.14 4,703.75
2016 33,333.26 2,743.63 2,591.97 2,652.78 2,717.38 2,613.06 2,675.19 2,590.17 7,461.68 3,015.30 2,470.00 1,802.11
2017 34,643.53 2,709.51 2,585.05 2,805.96 2,476.21 2,522.24 2,652.10 2,497.55 8,043.45 2,022.49 720.25 5,608.72
2018 33,026.61 2,277.05 2,395.12 2,420.72 2,390.23 2,556.46 2,516.51 2,397.12 7,440.46 2,640.53 5,013.33 979.07
2019 40,641.81 2,537.49 2,447.63 2,494.11 2,589.22 2,367.95 2,504.85 2,728.19 8,084.19 4,349.76 3,722.70 6,815.71
2020 34,711.17 2,378.99 2,379.21 2,491.30 2,336.05 2,416.19 2,531.58 2,429.67 8,123.30 3,873.99 5,225.83 525.06
2021 39,206.15 2,557.94 2,851.64 2,523.87 2,757.61 2,656.37 2,722.12 2,750.80 7,633.68 2,495.71 3,341.39 6,915.00

Number of Tows#

The number of tows performed during the simulation. If tow-to-port was not used in the simulation, a DataFrame with a single value of 0 will be returned. For further documentation, see the API docs here: wombat.core.post_processor.Metrics.number_of_tows().

Inputs:

  • frequency, as explained above, options: "project", "annual", "monthly", and "month-year"

  • by_tug

    • True: Computed for each tugboat (towing vessel)

    • False: Aggregates all the tugboats

  • by_direction

    • True: Computed for each direction a tow was performed (to port or to site)

    • False: Aggregates to the total number of tows

Example Usage:

# Project Total
# NOTE: This example has no towing, so it will return 0
style(metrics.number_of_tows(frequency="project"))
  total_tows
0 0

Dispatch Summary#

The number of mobilizations and the average length of their charter during the simulation for each piece of servicing equipment. For further documentation, see the API docs here: wombat.core.post_processor.Metrics.dispatch_summary().

Inputs:

  • frequency, as explained above, options: "project", "annual", "monthly", and "month-year"

Example Usage:

# Project Total
style(metrics.dispatch_summary(frequency="project"))
  N Mobilizations Average Charter Days
agent    
Anchor Handling Tug 52 25.33
Cable Laying Vessel 48 44.40
Crew Transfer Vessel 1 1 7,303.67
Crew Transfer Vessel 2 1 7,303.67
Crew Transfer Vessel 3 1 7,303.67
Crew Transfer Vessel 4 1 7,303.67
Crew Transfer Vessel 5 1 7,303.67
Crew Transfer Vessel 6 1 7,303.67
Crew Transfer Vessel 7 1 7,303.67
Diving Support Vessel 157 7.50
Heavy Lift Vessel 149 38.66

Labor Costs#

Sum of all labor costs associated with servicing equipment, excluding the labor defined in the fixed costs, which can be broken out by type. For further documentation, see the API docs here: wombat.core.post_processor.Metrics.labor_costs().

Inputs:

  • frequency, as explained above, options: "project", "annual", "monthly", and "month-year"

  • by_type

    • True: Computed for each labor type (salary and hourly)

    • False: Aggregates all the labor costs

Example Usage:

# Project total at the whole wind farm level
total = metrics.labor_costs(frequency="project", by_type=False)
print(f"Project total: ${total.values[0][0] / metrics.project_capacity:,.2f}/MW")
Project total: $41,759.55/MW
# Project totals for each type of labor
style(metrics.labor_costs(frequency="project", by_type=True))
  hourly_labor_cost salary_labor_cost total_labor_cost
0 0.00 50,111,459.82 50,111,459.82

Equipment and Labor Costs#

Sum of all labor and servicing equipment costs, excluding the labor defined in the fixed costs, which can be broken out by each category. For further documentation, see the API docs here: wombat.core.post_processor.Metrics.equipment_labor_cost_breakdown().

Inputs:

  • frequency, as explained above, options: "project", "annual", "monthly", and "month-year"

  • by_category

    • True: Computed for each unit servicing equipment and labor category

    • False: Aggregated to the sum of all costs

reason definitions:

  • Maintenance: routine maintenance, or events defined as a wombat.core.data_classes.Maintenance

  • Repair: unscheduled maintenance, ranging from inspections to replacements, or events defined as a wombat.core.data_classes.Failure

  • Mobilization: Cost of mobilizing servicing equipment

  • Crew Transfer: Costs incurred while crew are transferring between a turbine or substation and the servicing equipment

  • Site Travel: Costs incurred while transiting to/from the site and while at the site

  • Weather Delay: Any delays caused by unsafe weather conditions

  • No Requests: Equipment and labor is active, but there are no repairs or maintenance tasks to be completed

  • Not in Shift: Any time outside the operating hours of the wind farm (or the servicing equipment's specific operating hours)

Example Usage:

# Project totals
style(metrics.equipment_labor_cost_breakdowns(frequency="project", by_category=False))
  total_cost total_hours
reason    
Maintenance 23,992,803.93 73,470.00
Repair 588,379,024.99 163,123.00
Crew Transfer 9,569,791.01 11,371.25
Site Travel 97,479,660.59 124,859.25
Mobilization 122,660,000.00 134,304.00
Weather Delay 1,411,578,353.70 608,972.39
No Requests 76,020,911.83 387,144.95
Not in Shift 29,597,094.78 108,058.03
# Project totals by each category
style(metrics.equipment_labor_cost_breakdowns(frequency="project", by_category=True))
  hourly_labor_cost salary_labor_cost total_labor_cost equipment_cost total_cost total_hours
reason            
Maintenance 0.00 2,249,553.93 2,249,553.93 21,743,250.00 23,992,803.93 73,470.00
Repair 0.00 7,689,264.25 7,689,264.25 580,689,760.74 588,379,024.99 163,123.00
Crew Transfer 0.00 357,400.39 357,400.39 9,212,390.62 9,569,791.01 11,371.25
Site Travel 0.00 3,965,654.49 3,965,654.49 93,514,006.10 97,479,660.59 124,859.25
Mobilization 0.00 0.00 0.00 122,660,000.00 122,660,000.00 134,304.00
Weather Delay 0.00 22,058,183.63 22,058,183.63 1,389,520,170.07 1,411,578,353.70 608,972.39
No Requests 0.00 10,662,254.86 10,662,254.86 65,358,656.97 76,020,911.83 387,144.95
Not in Shift 0.00 3,129,148.28 3,129,148.28 26,467,946.50 29,597,094.78 108,058.03

Emissions#

Emissions (tons or other provided units) of all servicing equipment activity, except overnight waiting periods between shifts. For further documentation, see the API docs here: wombat.core.post_processor.Metrics.emissions().

Inputs:

  • emissions_factors: Dictionary of servicing equipment names and the emissions per hour of the following activities: transit, maneuvering, idle at site, and idle at port, where port is stand-in for wherever the servicing equipment might be based when not at site.

  • maneuvering_factor: The proportion of transit time that can generally be associated with positioning servicing, by default 10%.

  • port_engine_on_factor: The proportion of the idling at port time when the engine is running and producing emissions, by default 25%.

# Create the emissions factors, in tons per hour
emissions_factors = {
    "Crew Transfer Vessel 1": {
        "transit": 4,
        "maneuvering": 3,
        "idle at site": 0.5,
        "idle at port": 0.25,
    },
    "Field Support Vessel": {
        "transit": 6,
        "maneuvering": 4,
        "idle at site": 1,
        "idle at port": 0.5,
    },
    "Heavy Lift Vessel": {
        "transit": 12,
        "maneuvering": 7,
        "idle at site": 1,
        "idle at port": 0.5,
    },
    "Diving Support Vessel": {
        "transit": 4,
        "maneuvering": 7,
        "idle at site": 0.2,
        "idle at port": 0.2,
    },
    "Cable Laying Vessel": {
        "transit": 4,
        "maneuvering": 7,
        "idle at site": 0.2,
        "idle at port": 0.2,
    },
    "Anchor Handling Tug": {
        "transit": 4,
        "maneuvering": 3,
        "idle at site": 1,
        "idle at port": 0.25,
    },
}

# Add in CTVs 2 through 7
for i in range(2, 8):
    emissions_factors[f"Crew Transfer Vessel {i}"] = emissions_factors[f"Crew Transfer Vessel 1"]

style(metrics.emissions(emissions_factors=emissions_factors, maneuvering_factor=0.075, port_engine_on_factor=0.20))
    duration distance_km emissions
agent category      
Anchor Handling Tug idle at port 4,657.68 0.00 1,164.42
idle at site 30,270.73 0.00 30,270.73
maneuvering 1,888.25 0.00 5,664.74
transit 23,288.38 inf 93,153.52
Cable Laying Vessel idle at port 3,227.48 0.00 645.50
idle at site 44,324.44 0.00 8,864.89
maneuvering 1,308.44 0.00 9,159.07
transit 16,137.40 inf 64,549.61
Crew Transfer Vessel 1 idle at port 3,067.78 0.00 766.95
idle at site 31,962.87 0.00 15,981.43
maneuvering 1,243.70 0.00 3,731.09
transit 15,338.92 inf 61,355.70
Crew Transfer Vessel 2 idle at port 3,109.66 0.00 777.41
idle at site 32,506.60 0.00 16,253.30
maneuvering 1,260.67 0.00 3,782.02
transit 15,548.29 inf 62,193.15
Crew Transfer Vessel 3 idle at port 3,117.00 0.00 779.25
idle at site 32,378.95 0.00 16,189.48
maneuvering 1,263.65 0.00 3,790.94
transit 15,584.99 inf 62,339.96
Crew Transfer Vessel 4 idle at port 3,062.77 0.00 765.69
idle at site 31,956.75 0.00 15,978.38
maneuvering 1,241.66 0.00 3,724.99
transit 15,313.86 inf 61,255.42
Crew Transfer Vessel 5 idle at port 3,015.62 0.00 753.91
idle at site 31,773.39 0.00 15,886.70
maneuvering 1,222.55 0.00 3,667.65
transit 15,078.11 inf 60,312.44
Crew Transfer Vessel 6 idle at port 3,092.89 0.00 773.22
idle at site 32,161.79 0.00 16,080.89
maneuvering 1,253.88 0.00 3,761.63
transit 15,464.46 inf 61,857.85
Crew Transfer Vessel 7 idle at port 3,067.61 0.00 766.90
idle at site 31,814.70 0.00 15,907.35
maneuvering 1,243.63 0.00 3,730.88
transit 15,338.06 inf 61,352.24
Diving Support Vessel idle at port 11,639.38 0.00 2,327.88
idle at site 5,570.15 0.00 1,114.03
maneuvering 4,718.67 0.00 33,030.66
transit 58,196.88 134,729.06 232,787.53
Field Support Vessel idle at port 0.00 0.00 0.00
idle at site 0.00 0.00 0.00
maneuvering 0.00 0.00 0.00
transit 0.00 0.00 0.00
Heavy Lift Vessel idle at port 7,494.31 0.00 3,747.15
idle at site 113,034.37 0.00 113,034.37
maneuvering 3,038.23 0.00 21,267.62
transit 37,471.53 inf 449,658.34

Component Costs#

All the costs associated with maintenance and failure events during the simulation, including delays incurred during the repair process, but excluding costs not directly tied to a repair. For further documentation, see the API docs here: wombat.core.post_processor.Metrics.component_costs().

Inputs:

  • frequency, as explained above, options: "project", "annual", "monthly", and "month-year"

  • by_category

    • True: Computed across each subassembly

    • False: (default) Aggregated to the sum of all subassemblies

  • by_action

    • True: Computed by each of "repair", "maintenance", and "delay", and is included in the MultiIndex

    • False: (default) Aggregated as the sum of all actions

  • by_task

    • True: Computed by each repair and maintenance task for each subassembly

    • False: (default) Aggregated as the sum of all tasks

  • include_travel

    • True: Include intrasite and port-to-site travel costs in the repair summary.

    • False: (default) Exclude travel from the cost summary

action definitions:

  • maintenance: routine maintenance

  • repair: unscheduled maintenance, ranging from inspections to replacements

  • delay: Any delays caused by unsafe weather conditions or not being able to finish a process within a single shift

  • travel: Any travel to and from the site between shifts or traveling to the system for initial repair, including crew transfer time.

Example Usage:

# Project totals by component
style(metrics.component_costs(frequency="project", by_category=False, by_action=False))
  total_cost
subassembly  
anchor 64,349,926.12
array cable 167,555,863.38
ballast pump 96,316.98
drive_train 119,547,617.70
electrical system 45,285,602.21
export cable 6,922,516.13
generator 238,298,588.07
hydraulic pitch system 31,835,775.91
mooring lines 48,195,752.12
power converter 1,190,031,964.77
rotor_blades 94,331,333.08
supporting_structure 86,328,435.79
transformer 1,125,532.40
yaw_system 9,898,371.09
# Project totals by each category and action type
style(metrics.component_costs(frequency="project", by_category=True, by_action=True))
    materials_cost total_labor_cost equipment_cost total_cost
subassembly action        
anchor delay 0 489,922.75 14,752,669.63 15,242,592.38
repair 11,603,000 1,205,452.84 36,298,880.90 49,107,333.74
array cable delay 0 2,871,294.94 98,251,264.11 101,122,559.06
repair 5,950,000 1,717,375.50 58,765,928.82 66,433,304.32
ballast pump delay 0 8,441.06 44,930.68 53,371.74
repair 18,000 3,945.24 21,000.00 42,945.24
drive_train delay 0 742,338.59 83,221,480.52 83,963,819.10
repair 3,101,000 222,584.24 32,260,214.35 35,583,798.59
electrical system delay 0 834,926.46 33,718,998.35 34,553,924.80
repair 721,000 177,030.76 9,833,646.64 10,731,677.40
export cable delay 0 176,577.61 6,042,212.32 6,218,789.93
maintenance 9,000 19,726.20 675,000.00 703,726.20
generator delay 0 4,676,431.41 155,121,115.23 159,797,546.63
maintenance 2,143,500 939,624.66 5,001,500.00 8,084,624.66
repair 5,155,640 535,662.65 64,725,114.12 70,416,416.77
hydraulic pitch system delay 0 3,275,835.21 20,124,588.34 23,400,423.56
repair 1,137,100 873,370.89 6,424,881.46 8,435,352.36
mooring lines delay 0 1,274,686.98 18,186,376.49 19,461,063.47
repair 5,517,500 922,221.69 22,294,966.96 28,734,688.65
power converter delay 0 4,447,686.87 849,522,541.69 853,970,228.56
repair 8,608,000 1,530,765.67 325,922,970.54 336,061,736.21
rotor_blades delay 0 1,672,186.33 66,899,613.26 68,571,799.60
repair 5,458,248 413,420.21 19,887,865.28 25,759,533.49
supporting_structure delay 0 4,230,338.28 63,744,630.96 67,974,969.24
maintenance 1,154,500 1,265,216.55 15,933,750.00 18,353,466.55
transformer delay 0 144,212.51 767,624.44 911,836.95
maintenance 19,000 24,986.52 133,000.00 176,986.52
repair 18,000 2,958.93 15,750.00 36,708.93
yaw_system delay 0 327,361.60 5,096,492.20 5,423,853.80
repair 151,500 84,475.62 4,238,541.67 4,474,517.29

Fixed Cost Impacts#

Computes the total costs of the fixed costs categories. For further documentation, see the definition docs, here: wombat.core.data_classes.FixedCosts, or the API docs here: wombat.core.post_processor.Metrics.fixed_costs().

Inputs:

  • frequency, as explained above, options: "project", "annual", "monthly", and "month-year"

  • resolution (also, demonstrated below)

    • "high": Computed across the most granular cost levels

    • "medium": Computed for each general cost category

    • "low": Aggregated to a single sum of costs

pprint(metrics.fixed_costs.hierarchy)
{'operations': {'annual_leases_fees': ['submerge_land_lease_costs',
                                       'transmission_charges_rights'],
                'environmental_health_safety_monitoring': [],
                'insurance': ['brokers_fee',
                              'operations_all_risk',
                              'business_interruption',
                              'third_party_liability',
                              'storm_coverage'],
                'labor': [],
                'onshore_electrical_maintenance': [],
                'operating_facilities': [],
                'operations_management_administration': ['project_management_administration',
                                                         'marine_management',
                                                         'weather_forecasting',
                                                         'condition_monitoring']}}

Example Usage:

# Project totals at the highest level
# NOTE: there were no fixed costs defined in this example, so all values will be 0, so
#       this will just be demonstrating the output format
style(metrics.project_fixed_costs(frequency="project", resolution="low"))
  operations
0 0.00
# Project totals at the medium level
style(metrics.project_fixed_costs(frequency="project", resolution="medium"))
  operations_management_administration insurance annual_leases_fees operating_facilities environmental_health_safety_monitoring onshore_electrical_maintenance labor
0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
# Project totals at the lowest level
style(metrics.project_fixed_costs(frequency="project", resolution="high"))
  project_management_administration marine_management weather_forecasting condition_monitoring brokers_fee operations_all_risk business_interruption third_party_liability storm_coverage submerge_land_lease_costs transmission_charges_rights operating_facilities environmental_health_safety_monitoring onshore_electrical_maintenance labor
0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

OpEx#

Computes the total cost of all operating expenditures for the duration of the simulation, including fixed costs. For further documentation, see the API docs here: wombat.core.post_processor.Metrics.opex().

Inputs:

  • frequency, as explained above, options: "project", "annual", "monthly", and "month-year"

  • by_category

    • True shows the port fees, fixed costs, labor costs, equipment costs, and materials costs in addition the total OpEx

    • False shows only the total OpEx

Example Usage:

style(metrics.opex("annual"))
  OpEx
year  
2002 89,554,749.03
2003 102,396,717.09
2004 129,033,896.48
2005 112,183,228.73
2006 131,261,905.34
2007 104,366,681.91
2008 133,930,717.22
2009 107,895,772.89
2010 132,391,484.23
2011 138,223,158.09
2012 130,325,332.80
2013 114,628,766.36
2014 111,338,139.90
2015 117,560,835.58
2016 127,287,614.05
2017 115,378,301.64
2018 127,693,676.43
2019 137,665,536.11
2020 128,653,595.11
2021 118,272,519.84
style(metrics.opex("annual", by_category=True))
  operations port_fees equipment_cost total_labor_cost materials_cost OpEx
year            
2002 0.00 0.00 86,445,808.88 2,034,008.14 1,074,932 89,554,749.03
2003 0.00 0.00 98,396,372.14 2,169,212.95 1,831,132 102,396,717.09
2004 0.00 0.00 124,486,212.49 2,628,351.99 1,919,332 129,033,896.48
2005 0.00 0.00 107,860,512.86 2,289,375.88 2,033,340 112,183,228.73
2006 0.00 0.00 125,220,176.69 2,756,448.65 3,285,280 131,261,905.34
2007 0.00 0.00 100,897,636.72 2,189,645.19 1,279,400 104,366,681.91
2008 0.00 0.00 128,221,120.64 2,729,164.58 2,980,432 133,930,717.22
2009 0.00 0.00 103,244,763.16 2,292,305.73 2,358,704 107,895,772.89
2010 0.00 0.00 127,107,332.79 2,845,651.44 2,438,500 132,391,484.23
2011 0.00 0.00 133,005,196.20 2,816,161.89 2,401,800 138,223,158.09
2012 0.00 0.00 123,917,235.77 2,708,957.03 3,699,140 130,325,332.80
2013 0.00 0.00 110,247,585.07 2,374,529.30 2,006,652 114,628,766.36
2014 0.00 0.00 107,584,238.40 2,384,521.50 1,369,380 111,338,139.90
2015 0.00 0.00 111,624,300.11 2,487,191.47 3,449,344 117,560,835.58
2016 0.00 0.00 122,174,631.61 2,579,270.44 2,533,712 127,287,614.05
2017 0.00 0.00 111,584,301.27 2,374,196.37 1,419,804 115,378,301.64
2018 0.00 0.00 120,917,691.37 2,609,985.07 4,166,000 127,693,676.43
2019 0.00 0.00 131,771,686.96 2,727,117.15 3,166,732 137,665,536.11
2020 0.00 0.00 122,107,931.21 2,584,191.90 3,961,472 128,653,595.11
2021 0.00 0.00 112,351,446.66 2,531,173.18 3,389,900 118,272,519.84

Process Times#

Computes the total number of hours spent from repair request submission to completion, performing repairs, and the number of request for each subassembly and repair category. For further documentation, see the API docs here: wombat.core.post_processor.Metrics.process_times().

Inputs:

  • include_incompletes

    • True: include requests that have been submitted, but not completed.

    • False: only include requests that have been completed.

Example Usage:

style(metrics.process_times())
    time_to_completion process_time downtime time_to_start N
subassembly task          
anchor anchor replacement 19,760.82 10,028.85 10,026.98 10,032.24 21
major anchor repair 20,199.24 8,637.71 8,635.15 11,670.50 25
array cable array cable major repair 38,835.94 24,584.85 0.00 15,534.24 41
array cable replacement 36,284.43 26,714.74 0.00 10,644.16 22
ballast pump minor ballast pump repair 1,894.91 533.35 524.86 1,598.49 18
drive_train main shaft major repair 430,111.97 5,226.98 5,183.34 425,115.02 49
main shaft minor repair 54,352.28 23,091.70 22,717.03 37,692.15 375
main shaft replacement 10,465.11 4,393.22 4,390.59 6,124.82 10
electrical system power electrical system major repair 300,990.69 3,250.34 3,243.61 298,330.08 31
power electrical system major replacement 839.54 145.44 145.00 695.04 2
power electrical system minor repair 82,577.17 36,918.56 36,424.60 55,373.01 521
export cable export cable subsea inspection 10,545.50 2,693.75 0.00 8,750.00 20
generator annual turbine inspection 1,459,080.01 162,964.27 161,327.86 1,308,016.80 1,429
direct drive generator major repair 330,796.08 3,695.34 3,687.41 327,676.80 38
direct drive generator major replacement 28,489.30 13,156.75 13,151.16 15,854.01 17
direct drive generator minor repair 143,445.59 68,718.87 67,957.51 89,194.09 834
hydraulic pitch system major pitch system repair 64,334.94 50,498.01 50,261.90 17,590.73 275
major pitch system replacement 1,994.22 379.07 378.50 1,616.22 2
minor pitch system repair 231,529.08 126,003.58 125,005.10 125,522.45 1,180
mooring lines buoyancy module replacement 9,118.83 7,566.49 7,538.56 1,798.84 37
marine growth removal 52,470.89 36,544.53 36,394.12 19,821.26 165
mooring line major repair 15,071.46 7,450.05 7,448.69 7,942.00 17
mooring line replacement 9,588.22 5,428.17 5,426.71 4,280.73 11
power converter power converter major repair 4,349,144.90 30,183.78 30,068.24 4,323,676.75 467
power converter minor repair 137,051.08 66,871.58 66,066.80 85,049.77 797
power converter replacement 169,622.36 69,981.84 69,954.11 104,548.81 105
rotor_blades blades major repair 178,912.34 4,172.31 4,167.66 175,603.26 19
blades major replacement 3,225.02 2,530.16 2,529.45 695.82 1
blades minor repair 140,800.45 76,623.45 75,951.84 77,409.21 700
supporting_structure structural annual inspection 1,704,517.40 161,023.95 159,771.77 1,547,735.97 1,440
structural subsea inspection 1,622,517.35 25,057.21 24,462.49 1,606,461.78 720
transformer oss annual inspection 13,167.23 6,927.12 6,869.46 7,238.40 38
oss minor repair 1,416.36 426.11 411.49 1,113.31 9
yaw_system yaw system major repair 121,076.92 612.27 608.77 120,491.03 12
yaw system minor repair 40,359.33 16,424.09 16,214.03 28,210.11 255
style(metrics.process_times(include_incompletes=False))
    time_to_completion process_time downtime time_to_start N
subassembly task          
anchor anchor replacement 19,760.82 10,028.85 10,026.98 10,032.24 19
major anchor repair 20,199.24 8,637.71 8,635.15 11,670.50 25
array cable array cable major repair 38,305.79 24,358.70 0.00 15,197.98 37
array cable replacement 36,284.43 26,714.74 0.00 10,644.16 22
ballast pump minor ballast pump repair 1,894.91 533.35 524.86 1,598.49 18
drive_train main shaft major repair 408,648.02 5,161.26 5,149.62 403,684.54 29
main shaft minor repair 54,352.28 23,091.70 22,717.03 37,692.15 375
main shaft replacement 10,465.11 4,393.22 4,390.59 6,124.82 10
electrical system power electrical system major repair 300,990.69 3,250.34 3,243.61 298,330.08 20
power electrical system major replacement 839.54 145.44 145.00 695.04 2
power electrical system minor repair 82,577.17 36,918.56 36,424.60 55,373.01 521
export cable export cable subsea inspection 10,545.50 2,693.75 0.00 8,750.00 18
generator annual turbine inspection 1,459,080.01 162,964.27 161,327.86 1,308,016.80 1,429
direct drive generator major repair 330,796.08 3,695.34 3,687.41 327,676.80 21
direct drive generator major replacement 28,489.30 13,156.75 13,151.16 15,854.01 17
direct drive generator minor repair 143,445.59 68,718.87 67,957.51 89,194.09 834
hydraulic pitch system major pitch system repair 64,143.68 50,306.01 50,078.71 17,582.41 274
major pitch system replacement 1,994.22 379.07 378.50 1,616.22 2
minor pitch system repair 231,277.46 125,763.59 124,791.54 125,515.44 1,177
mooring lines buoyancy module replacement 8,948.81 7,398.49 7,379.37 1,690.76 36
marine growth removal 52,470.89 36,544.53 36,394.12 19,821.26 165
mooring line major repair 15,071.46 7,450.05 7,448.69 7,942.00 16
mooring line replacement 9,588.22 5,428.17 5,426.71 4,280.73 10
power converter power converter major repair 4,349,144.90 30,183.78 30,068.24 4,323,676.75 299
power converter minor repair 136,929.19 66,772.40 65,994.62 84,999.56 795
power converter replacement 169,622.36 69,981.84 69,954.11 104,548.81 104
rotor_blades blades major repair 178,912.34 4,172.31 4,167.66 175,603.26 14
blades major replacement 3,225.02 2,530.16 2,529.45 695.82 1
blades minor repair 140,800.45 76,623.45 75,951.84 77,409.21 700
supporting_structure structural annual inspection 1,704,517.40 161,023.95 159,771.77 1,547,735.97 1,440
structural subsea inspection 1,622,517.35 25,057.21 24,462.49 1,606,461.78 581
transformer oss annual inspection 13,167.23 6,927.12 6,869.46 7,238.40 38
oss minor repair 1,416.36 426.11 411.49 1,113.31 9
yaw_system yaw system major repair 121,076.92 612.27 608.77 120,491.03 8
yaw system minor repair 40,359.33 16,424.09 16,214.03 28,210.11 255

Request Summary#

Computes the total number of submitted, canceled, incomplete, and completed repair and maintenance request by subassembly and task description. For further documentation, see the API docs here: wombat.core.post_processor.Metrics.request_summary().

Example Usage:

style(metrics.request_summary())
    total_requests canceled_requests incomplete_requests completed_requests
subassembly task        
anchor anchor replacement 21 0 2 19
major anchor repair 25 0 0 25
array cable array cable major repair 41 0 4 37
array cable replacement 22 0 0 22
ballast pump minor ballast pump repair 18 0 0 18
drive_train main shaft major repair 49 0 20 29
main shaft minor repair 375 0 0 375
main shaft replacement 10 0 0 10
electrical system power electrical system major repair 31 0 11 20
power electrical system major replacement 2 0 0 2
power electrical system minor repair 521 0 0 521
export cable export cable subsea inspection 20 0 2 18
generator annual turbine inspection 1,432 3 0 1,429
direct drive generator major repair 38 0 17 21
direct drive generator major replacement 17 0 0 17
direct drive generator minor repair 834 0 0 834
hydraulic pitch system major pitch system repair 275 0 1 274
major pitch system replacement 2 0 0 2
minor pitch system repair 1,180 0 3 1,177
mooring lines buoyancy module replacement 37 0 1 36
marine growth removal 165 0 0 165
mooring line major repair 17 0 1 16
mooring line replacement 11 0 1 10
power converter power converter major repair 514 47 168 299
power converter minor repair 799 2 2 795
power converter replacement 106 1 1 104
rotor_blades blades major repair 19 0 5 14
blades major replacement 1 0 0 1
blades minor repair 700 0 0 700
supporting_structure structural annual inspection 1,440 0 0 1,440
structural subsea inspection 720 0 139 581
transformer oss annual inspection 38 0 0 38
oss minor repair 9 0 0 9
yaw_system yaw system major repair 12 0 4 8
yaw system minor repair 255 0 0 255

Power Production#

Computes the total power production for the wind farm. For further documentation, see the API docs here: wombat.core.post_processor.Metrics.power_production().

Inputs:

  • frequency, as explained above, options: "project", "annual", "monthly", and "month-year"

  • by, as explained above options: "windfarm" and "turbine"

  • units

    • "kwh": kilowatt-hours (kWh)

    • "mwh": megawatt-hours (MWh)

    • "gwh": gigawatt-hours (GWh)

Example Usage:

# Project totals, in kWh, at the wind farm level
style(metrics.power_production(frequency="project", by="windfarm", units="kwh"))
  windfarm
Project Energy Production (kWh) 106,023,074,616.00
# Project totals, in MWh, at the wind farm level
style(metrics.power_production(frequency="project", units="mwh"))
  windfarm
Project Energy Production (MWh) 106,023,074.62
# Project totals, in GWh, at the wind farm level
style(metrics.power_production(frequency="project"))
  windfarm
Project Energy Production (GWh) 106,023.07

Hydrogen Production#

Computes the total hydrogen production for the electrolyzer(s). For further documentation, see the API docs here: wombat.core.post_processor.Metrics.h2_production().

Inputs:

  • frequency, as explained above, options: "project", "annual", "monthly", and "month-year"

  • by: Similar to the common definition, but with electrolyzer specific inputs.

    • "total": total H2 produced for all electrolyzers

    • "electrolyzer": H2 production for all and each electrolyzer

  • units

    • "kgph": kilograms per hour (kgph)

    • "tph": metric tonnes hours (tph)

Example Usage:

Please note, this will raise an error since this analysis does not feature a modeled electrolyzer.

# Project totals, in kWh, at the wind farm level
style(metrics.h2_production(frequency="project", by="total", units="kgph"))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[38], line 2
      1 # Project totals, in kWh, at the wind farm level
----> 2 style(metrics.h2_production(frequency="project", by="total", units="kgph"))

File /opt/hostedtoolcache/Python/3.13.12/x64/lib/python3.13/site-packages/wombat/core/post_processor.py:2331, in Metrics.h2_production(self, frequency, by, units)
   2295 """Calculates the hydrogen production for the simulation at a project, annual,
   2296 or monthly level that can be broken out by electrolyzer.
   2297 
   (...)   2328     If :py:attr:`units` is not one of "kg" or "tn".
   2329 """
   2330 if self.electrolyzer_rated_production.size == 0:
-> 2331     raise ValueError("No electrolyzers available to analyze.")
   2332 frequency = _check_frequency(frequency, which="all")
   2334 by = by.lower().strip()

ValueError: No electrolyzers available to analyze.

Net Present Value#

Calculates the net present value (NPV) for the project, as \(NPV = (Power * OfftakePrice - OpEx) / (1 + DiscountRate)\).

For further documentation, see the API docs here: wombat.core.post_processor.Metrics.npv().

Inputs:

  • frequency, as explained above, options: "project", "annual", "monthly", and "month-year"

  • discount_rate: The rate of return that could be earned on alternative investments, by default 0.025.

  • offtake_price: Price of energy, per MWh, by default 80.

style(metrics.opex("annual"))
  OpEx
year  
2002 89,554,749.03
2003 102,396,717.09
2004 129,033,896.48
2005 112,183,228.73
2006 131,261,905.34
2007 104,366,681.91
2008 133,930,717.22
2009 107,895,772.89
2010 132,391,484.23
2011 138,223,158.09
2012 130,325,332.80
2013 114,628,766.36
2014 111,338,139.90
2015 117,560,835.58
2016 127,287,614.05
2017 115,378,301.64
2018 127,693,676.43
2019 137,665,536.11
2020 128,653,595.11
2021 118,272,519.84