Demonstration of the Available Metrics#
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: Running a simulation to gather the results
Common Parameters: Explanation of frequently used parameter settings
Availability: Time-based and energy-based availability
Capacity Factor: Gross and net capacity factor
Task Completion Rate: Task completion metrics
Equipment Costs: Cost breakdowns by servicing equipment
Service Equipment Utilization Rate: Utilization of servicing equipment
Vessel-Crew Hours at Sea: Number of crew or vessel hours spent at sea
Number of Tows: Number of tows breakdowns
Dispatch Summary: Mobilization and charter period breakdown
Labor Costs: Breakdown of labor costs
Equipment and Labor Costs: Combined servicing equipment and labor cost breakdown
Emissions: Emissions of servicing equipment based on activity
Component Costs: Materials costs
Fixed Cost Impacts: Total fixed costs
OpEx: Project OpEx
Process Times: Timing of various stages of repair and maintenance
Request Summary: Total number of submitted, canceled, and completed repair and maintenance tasks
Power Production: Energy production, in GWh, MWh, or kWh
H2 Production: Produced Hydrogen, in kg/hr or t/hr
Net Present Value: Project NPV calculator
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:
energy: actual power produced divided by potential power produced
time: The ratio of all non-zero hours to all hours in the simulation, or the proportion of the simulation where turbines are operating
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.91 | 0.90 | 0.88 | 0.90 | 0.89 | 0.90 | 0.91 | 0.91 | 0.91 | 0.90 | 0.92 | 0.91 | 0.91 | 0.92 | 0.90 | 0.90 | 0.92 | 0.92 | 0.93 | 0.91 | 0.92 | 0.91 | 0.90 | 0.92 | 0.91 | 0.91 | 0.92 | 0.90 | 0.90 | 0.91 | 0.91 | 0.90 | 0.91 | 0.90 | 0.91 | 0.90 | 0.91 | 0.91 | 0.91 | 0.90 | 0.91 | 0.91 | 0.89 | 0.91 | 0.92 | 0.90 | 0.89 | 0.90 | 0.91 | 0.91 | 0.90 | 0.92 | 0.91 | 0.91 | 0.89 | 0.91 | 0.91 | 0.91 | 0.91 | 0.91 | 0.92 | 0.90 | 0.89 | 0.92 | 0.91 | 0.91 | 0.91 | 0.90 | 0.90 | 0.92 | 0.90 | 0.91 | 0.91 | 0.90 | 0.90 | 0.90 | 0.91 | 0.91 | 0.91 | 0.91 |
# Demonstrate the annualized outputs
style(metrics.time_based_availability(frequency="annual", by="windfarm"))
windfarm | |
---|---|
year | |
2002 | 0.95 |
2003 | 0.90 |
2004 | 0.90 |
2005 | 0.91 |
2006 | 0.91 |
2007 | 0.90 |
2008 | 0.90 |
2009 | 0.92 |
2010 | 0.86 |
2011 | 0.90 |
2012 | 0.91 |
2013 | 0.93 |
2014 | 0.91 |
2015 | 0.93 |
2016 | 0.90 |
2017 | 0.91 |
2018 | 0.92 |
2019 | 0.90 |
2020 | 0.91 |
2021 | 0.89 |
# Demonstrate the month aggregations
style(metrics.time_based_availability(frequency="monthly", by="windfarm"))
windfarm | |
---|---|
month | |
1 | 0.88 |
2 | 0.85 |
3 | 0.88 |
4 | 0.85 |
5 | 0.88 |
6 | 0.91 |
7 | 0.93 |
8 | 0.95 |
9 | 0.96 |
10 | 0.94 |
11 | 0.94 |
12 | 0.92 |
# Demonstrate the granular monthly reporting
style(metrics.time_based_availability(frequency="month-year", by="windfarm"))
windfarm | ||
---|---|---|
year | month | |
2002 | 1 | 0.95 |
2 | 0.95 | |
3 | 0.90 | |
4 | 0.97 | |
5 | 0.96 | |
6 | 0.93 | |
7 | 0.97 | |
8 | 0.97 | |
9 | 0.98 | |
10 | 0.96 | |
11 | 0.93 | |
12 | 0.91 | |
2003 | 1 | 0.58 |
2 | 0.90 | |
3 | 0.90 | |
4 | 0.90 | |
5 | 0.90 | |
6 | 0.90 | |
7 | 0.91 | |
8 | 0.96 | |
9 | 0.98 | |
10 | 0.96 | |
11 | 0.94 | |
12 | 0.92 | |
2004 | 1 | 0.70 |
2 | 0.90 | |
3 | 0.89 | |
4 | 0.90 | |
5 | 0.89 | |
6 | 0.90 | |
7 | 0.93 | |
8 | 0.97 | |
9 | 0.95 | |
10 | 0.96 | |
11 | 0.95 | |
12 | 0.83 | |
2005 | 1 | 0.82 |
2 | 0.75 | |
3 | 0.90 | |
4 | 0.90 | |
5 | 0.90 | |
6 | 0.89 | |
7 | 0.96 | |
8 | 0.97 | |
9 | 0.97 | |
10 | 0.94 | |
11 | 0.94 | |
12 | 0.94 | |
2006 | 1 | 0.89 |
2 | 0.73 | |
3 | 0.90 | |
4 | 0.90 | |
5 | 0.90 | |
6 | 0.90 | |
7 | 0.90 | |
8 | 0.94 | |
9 | 0.97 | |
10 | 0.98 | |
11 | 0.96 | |
12 | 0.93 | |
2007 | 1 | 0.91 |
2 | 0.67 | |
3 | 0.88 | |
4 | 0.91 | |
5 | 0.90 | |
6 | 0.90 | |
7 | 0.90 | |
8 | 0.91 | |
9 | 0.97 | |
10 | 0.94 | |
11 | 0.96 | |
12 | 0.92 | |
2008 | 1 | 0.92 |
2 | 0.69 | |
3 | 0.88 | |
4 | 0.93 | |
5 | 0.90 | |
6 | 0.89 | |
7 | 0.88 | |
8 | 0.89 | |
9 | 0.95 | |
10 | 0.94 | |
11 | 0.95 | |
12 | 0.94 | |
2009 | 1 | 0.96 |
2 | 0.90 | |
3 | 0.85 | |
4 | 0.92 | |
5 | 0.93 | |
6 | 0.93 | |
7 | 0.90 | |
8 | 0.93 | |
9 | 0.94 | |
10 | 0.95 | |
11 | 0.94 | |
12 | 0.94 | |
2010 | 1 | 0.92 |
2 | 0.77 | |
3 | 0.57 | |
4 | 0.66 | |
5 | 0.93 | |
6 | 0.91 | |
7 | 0.91 | |
8 | 0.93 | |
9 | 0.94 | |
10 | 0.91 | |
11 | 0.92 | |
12 | 0.93 | |
2011 | 1 | 0.92 |
2 | 0.74 | |
3 | 0.92 | |
4 | 0.76 | |
5 | 0.94 | |
6 | 0.94 | |
7 | 0.93 | |
8 | 0.91 | |
9 | 0.91 | |
10 | 0.92 | |
11 | 0.91 | |
12 | 0.93 | |
2012 | 1 | 0.93 |
2 | 0.90 | |
3 | 0.90 | |
4 | 0.79 | |
5 | 0.93 | |
6 | 0.92 | |
7 | 0.97 | |
8 | 0.94 | |
9 | 0.92 | |
10 | 0.92 | |
11 | 0.92 | |
12 | 0.88 | |
2013 | 1 | 0.89 |
2 | 0.89 | |
3 | 0.87 | |
4 | 0.91 | |
5 | 0.96 | |
6 | 0.94 | |
7 | 0.97 | |
8 | 0.97 | |
9 | 0.94 | |
10 | 0.91 | |
11 | 0.94 | |
12 | 0.96 | |
2014 | 1 | 0.92 |
2 | 0.92 | |
3 | 0.91 | |
4 | 0.73 | |
5 | 0.95 | |
6 | 0.89 | |
7 | 0.97 | |
8 | 0.96 | |
9 | 0.97 | |
10 | 0.92 | |
11 | 0.90 | |
12 | 0.90 | |
2015 | 1 | 0.90 |
2 | 0.90 | |
3 | 0.94 | |
4 | 0.89 | |
5 | 0.87 | |
6 | 0.97 | |
7 | 0.96 | |
8 | 0.97 | |
9 | 0.96 | |
10 | 0.96 | |
11 | 0.89 | |
12 | 0.89 | |
2016 | 1 | 0.90 |
2 | 0.90 | |
3 | 0.90 | |
4 | 0.77 | |
5 | 0.84 | |
6 | 0.90 | |
7 | 0.89 | |
8 | 0.98 | |
9 | 0.95 | |
10 | 0.94 | |
11 | 0.90 | |
12 | 0.90 | |
2017 | 1 | 0.89 |
2 | 0.90 | |
3 | 0.90 | |
4 | 0.79 | |
5 | 0.86 | |
6 | 0.90 | |
7 | 0.89 | |
8 | 0.97 | |
9 | 0.96 | |
10 | 0.95 | |
11 | 0.96 | |
12 | 0.94 | |
2018 | 1 | 0.91 |
2 | 0.89 | |
3 | 0.90 | |
4 | 0.86 | |
5 | 0.86 | |
6 | 0.90 | |
7 | 0.94 | |
8 | 0.97 | |
9 | 0.97 | |
10 | 0.94 | |
11 | 0.94 | |
12 | 0.91 | |
2019 | 1 | 0.91 |
2 | 0.90 | |
3 | 0.89 | |
4 | 0.84 | |
5 | 0.67 | |
6 | 0.89 | |
7 | 0.94 | |
8 | 0.97 | |
9 | 0.96 | |
10 | 0.95 | |
11 | 0.95 | |
12 | 0.92 | |
2020 | 1 | 0.90 |
2 | 0.90 | |
3 | 0.91 | |
4 | 0.87 | |
5 | 0.77 | |
6 | 0.90 | |
7 | 0.94 | |
8 | 0.96 | |
9 | 0.96 | |
10 | 0.97 | |
11 | 0.96 | |
12 | 0.92 | |
2021 | 1 | 0.90 |
2 | 0.91 | |
3 | 0.90 | |
4 | 0.89 | |
5 | 0.64 | |
6 | 0.84 | |
7 | 0.90 | |
8 | 0.92 | |
9 | 0.97 | |
10 | 0.94 | |
11 | 0.94 | |
12 | 0.96 |
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)

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.41%
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.30%
Unscheduled Task Completion Rate: 95.61%
Overall Task Completion Rate: 95.87%
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 costFalse
: 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,375,359,367.74 |
# 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 | 128,272,674.82 | 187,191,980.82 | 25,563,194.69 | 25,563,214.73 | 25,563,205.38 | 25,563,202.19 | 25,563,205.64 | 25,563,200.90 | 25,563,198.81 | 120,929,228.93 | 1,760,023,060.82 |
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.87 | 0.93 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 0.95 | 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 costFalse
: Computes for each unit of servicing equipment
vessel_crew_assumption
: A dictionary of vessel names (ServiceEquipment.settings.name
, but also found atMetrics.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 | 693,884.26 |
# Annual project totals, broken out by vessel
style(metrics.vessel_crew_hours_at_sea(frequency="annual", by_equipment=True))
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
Cell In[16], line 2
1 # Annual project totals, broken out by vessel
----> 2 style(metrics.vessel_crew_hours_at_sea(frequency="annual", by_equipment=True))
File /opt/hostedtoolcache/Python/3.11.13/x64/lib/python3.11/site-packages/wombat/core/post_processor.py:1030, in Metrics.vessel_crew_hours_at_sea(self, frequency, by_equipment, vessel_crew_assumption)
1024 return pd.DataFrame(at_sea.sum()[["duration"]]).T.rename(
1025 columns={"duration": "Total Crew Hours at Sea"}
1026 )
1027 additional_cols = frequency.group_cols
1028 total_hours = (
1029 total_hours.drop(columns=frequency.drop_cols)
-> 1030 .groupby(group_cols)[["N"]]
1031 .sum()
1032 )
1034 columns = additional_cols + columns
1035 group_cols.extend(additional_cols)
File /opt/hostedtoolcache/Python/3.11.13/x64/lib/python3.11/site-packages/pandas/core/frame.py:9190, in DataFrame.groupby(self, by, axis, level, as_index, sort, group_keys, observed, dropna)
9187 if level is None and by is None:
9188 raise TypeError("You have to supply one of 'by' and 'level'")
-> 9190 return DataFrameGroupBy(
9191 obj=self,
9192 keys=by,
9193 axis=axis,
9194 level=level,
9195 as_index=as_index,
9196 sort=sort,
9197 group_keys=group_keys,
9198 observed=observed,
9199 dropna=dropna,
9200 )
File /opt/hostedtoolcache/Python/3.11.13/x64/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1329, in GroupBy.__init__(self, obj, keys, axis, level, grouper, exclusions, selection, as_index, sort, group_keys, observed, dropna)
1326 self.dropna = dropna
1328 if grouper is None:
-> 1329 grouper, exclusions, obj = get_grouper(
1330 obj,
1331 keys,
1332 axis=axis,
1333 level=level,
1334 sort=sort,
1335 observed=False if observed is lib.no_default else observed,
1336 dropna=self.dropna,
1337 )
1339 if observed is lib.no_default:
1340 if any(ping._passed_categorical for ping in grouper.groupings):
File /opt/hostedtoolcache/Python/3.11.13/x64/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1043, in get_grouper(obj, key, axis, level, sort, observed, validate, dropna)
1041 in_axis, level, gpr = False, gpr, None
1042 else:
-> 1043 raise KeyError(gpr)
1044 elif isinstance(gpr, Grouper) and gpr.key is not None:
1045 # Add key to exclusions
1046 exclusions.add(gpr.key)
KeyError: 'agent'
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 | 57 | 26.07 |
Cable Laying Vessel | 49 | 47.94 |
Crew Transfer Vessel 1 | 1 | 7,303.00 |
Crew Transfer Vessel 2 | 1 | 7,303.67 |
Crew Transfer Vessel 3 | 1 | 7,303.00 |
Crew Transfer Vessel 4 | 1 | 7,303.00 |
Crew Transfer Vessel 5 | 1 | 7,303.00 |
Crew Transfer Vessel 6 | 1 | 7,303.00 |
Crew Transfer Vessel 7 | 1 | 7,303.00 |
Diving Support Vessel | 162 | 6.95 |
Heavy Lift Vessel | 132 | 44.72 |
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: $42,482.56/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,979,075.04 | 50,979,075.04 |
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 categoryFalse
: 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 | 24,063,170.40 | 73,560.00 |
Repair | 630,096,493.80 | 169,838.47 |
Crew Transfer | 8,557,043.70 | 11,317.50 |
Site Travel | 92,561,878.11 | 124,324.18 |
Mobilization | 120,910,000.00 | 134,064.00 |
Weather Delay | 1,445,365,249.03 | 613,411.21 |
No Requests | 76,934,676.16 | 387,632.83 |
Not in Shift | 27,849,931.58 | 108,305.34 |
# 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 | 2,253,170.40 | 2,253,170.40 | 21,810,000.00 | 24,063,170.40 | 73,560.00 |
Repair | 0 | 8,137,603.15 | 8,137,603.15 | 621,958,890.65 | 630,096,493.80 | 169,838.47 |
Crew Transfer | 0 | 355,121.83 | 355,121.83 | 8,201,921.87 | 8,557,043.70 | 11,317.50 |
Site Travel | 0 | 3,925,833.50 | 3,925,833.50 | 88,636,044.61 | 92,561,878.11 | 124,324.18 |
Mobilization | 0 | 0.00 | 0.00 | 120,910,000.00 | 120,910,000.00 | 134,064.00 |
Weather Delay | 0 | 22,416,100.81 | 22,416,100.81 | 1,422,949,148.22 | 1,445,365,249.03 | 613,411.21 |
No Requests | 0 | 10,775,300.57 | 10,775,300.57 | 66,159,375.60 | 76,934,676.16 | 387,632.83 |
Not in Shift | 0 | 3,115,944.79 | 3,115,944.79 | 24,733,986.79 | 27,849,931.58 | 108,305.34 |
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
, andidle 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 | 5,119.44 | 0.00 | 1,279.86 |
idle at site | 33,257.92 | 0.00 | 33,257.92 | |
maneuvering | 2,075.45 | 0.00 | 6,226.34 | |
transit | 25,597.19 | inf | 102,388.77 | |
Cable Laying Vessel | idle at port | 3,240.95 | 0.00 | 648.19 |
idle at site | 48,426.70 | 0.00 | 9,685.34 | |
maneuvering | 1,313.90 | 0.00 | 9,197.29 | |
transit | 16,204.74 | inf | 64,818.97 | |
Crew Transfer Vessel 1 | idle at port | 3,046.91 | 0.00 | 761.73 |
idle at site | 32,211.60 | 0.00 | 16,105.80 | |
maneuvering | 1,235.23 | 0.00 | 3,705.70 | |
transit | 15,234.56 | inf | 60,938.23 | |
Crew Transfer Vessel 2 | idle at port | 3,071.72 | 0.00 | 767.93 |
idle at site | 32,164.74 | 0.00 | 16,082.37 | |
maneuvering | 1,245.29 | 0.00 | 3,735.88 | |
transit | 15,358.61 | inf | 61,434.43 | |
Crew Transfer Vessel 3 | idle at port | 3,122.58 | 0.00 | 780.65 |
idle at site | 32,853.14 | 0.00 | 16,426.57 | |
maneuvering | 1,265.91 | 0.00 | 3,797.74 | |
transit | 15,612.92 | inf | 62,451.69 | |
Crew Transfer Vessel 4 | idle at port | 3,048.00 | 0.00 | 762.00 |
idle at site | 31,334.40 | 0.00 | 15,667.20 | |
maneuvering | 1,235.68 | 0.00 | 3,707.03 | |
transit | 15,240.01 | inf | 60,960.03 | |
Crew Transfer Vessel 5 | idle at port | 3,089.85 | 0.00 | 772.46 |
idle at site | 32,588.95 | 0.00 | 16,294.48 | |
maneuvering | 1,252.64 | 0.00 | 3,757.93 | |
transit | 15,449.25 | inf | 61,797.00 | |
Crew Transfer Vessel 6 | idle at port | 3,082.42 | 0.00 | 770.60 |
idle at site | 32,529.21 | 0.00 | 16,264.60 | |
maneuvering | 1,249.63 | 0.00 | 3,748.89 | |
transit | 15,412.08 | inf | 61,648.33 | |
Crew Transfer Vessel 7 | idle at port | 3,091.13 | 0.00 | 772.78 |
idle at site | 32,267.80 | 0.00 | 16,133.90 | |
maneuvering | 1,253.16 | 0.00 | 3,759.48 | |
transit | 15,455.66 | inf | 61,822.64 | |
Diving Support Vessel | idle at port | 11,818.85 | 0.00 | 2,363.77 |
idle at site | 5,502.97 | 0.00 | 1,100.59 | |
maneuvering | 4,791.43 | 0.00 | 33,539.99 | |
transit | 59,094.27 | 123,716.57 | 236,377.07 | |
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 | 6,679.58 | 0.00 | 3,339.79 |
idle at site | 118,853.40 | 0.00 | 118,853.40 | |
maneuvering | 2,707.94 | 0.00 | 18,955.55 | |
transit | 33,397.88 | inf | 400,774.56 |
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 subassemblyFalse
: (default) Aggregated to the sum of all subassemblies
by_action
True
: Computed by each of "repair", "maintenance", and "delay", and is included in the MultiIndexFalse
: (default) Aggregated as the sum of all actions
by_task
True
: Computed by each repair and maintenance task for each subassemblyFalse
: (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 | 61,584,851.68 |
array cable | 183,462,260.22 |
ballast pump | 68,553.03 |
drive_train | 124,320,508.11 |
electrical system | 25,022,562.23 |
export cable | 6,576,737.37 |
generator | 279,197,684.41 |
hydraulic pitch system | 33,469,421.43 |
mooring lines | 62,961,169.36 |
power converter | 1,224,850,923.40 |
rotor_blades | 76,941,993.99 |
supporting_structure | 80,911,386.89 |
transformer | 1,254,246.88 |
yaw_system | 21,129,171.58 |
# 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 | 669,999.39 | 20,175,180.01 | 20,845,179.40 |
repair | 10,054,000 | 986,289.50 | 29,699,382.78 | 40,739,672.28 | |
array cable | delay | 0 | 3,171,721.84 | 108,531,407.10 | 111,703,128.94 |
repair | 6,920,000 | 1,841,055.76 | 62,998,075.52 | 71,759,131.28 | |
ballast pump | delay | 0 | 6,314.04 | 33,608.83 | 39,922.87 |
repair | 12,000 | 2,630.16 | 14,000.00 | 28,630.16 | |
drive_train | delay | 0 | 763,408.29 | 86,911,322.29 | 87,674,730.58 |
repair | 3,772,000 | 211,485.87 | 32,662,291.67 | 36,645,777.54 | |
electrical system | delay | 0 | 652,446.68 | 14,258,692.25 | 14,911,138.93 |
repair | 878,000 | 171,964.98 | 9,061,458.33 | 10,111,423.31 | |
export cable | delay | 0 | 166,759.50 | 5,706,251.67 | 5,873,011.17 |
maintenance | 9,000 | 19,726.20 | 675,000.00 | 703,726.20 | |
generator | delay | 0 | 4,694,643.98 | 191,892,610.92 | 196,587,254.90 |
maintenance | 2,148,000 | 941,597.28 | 5,012,000.00 | 8,101,597.28 | |
repair | 5,121,960 | 549,457.88 | 68,837,414.35 | 74,508,832.23 | |
hydraulic pitch system | delay | 0 | 3,524,766.71 | 22,391,459.83 | 25,916,226.55 |
repair | 1,123,000 | 876,528.22 | 5,553,666.67 | 7,553,194.88 | |
mooring lines | delay | 0 | 1,294,765.72 | 17,254,318.40 | 18,549,084.12 |
repair | 8,264,000 | 1,377,536.84 | 34,770,548.40 | 44,412,085.24 | |
power converter | delay | 0 | 4,560,275.63 | 863,847,408.34 | 868,407,683.96 |
repair | 9,048,000 | 1,602,906.80 | 345,792,332.64 | 356,443,239.43 | |
rotor_blades | delay | 0 | 1,472,229.21 | 42,697,058.51 | 44,169,287.72 |
repair | 5,597,856 | 432,796.64 | 26,742,053.63 | 32,772,706.27 | |
supporting_structure | delay | 0 | 4,077,285.25 | 58,421,241.24 | 62,498,526.49 |
maintenance | 1,156,000 | 1,266,860.40 | 15,990,000.00 | 18,412,860.40 | |
transformer | delay | 0 | 148,400.19 | 789,914.93 | 938,315.12 |
maintenance | 19,000 | 24,986.52 | 133,000.00 | 176,986.52 | |
repair | 114,000 | 3,945.24 | 21,000.00 | 138,945.24 | |
yaw_system | delay | 0 | 327,892.01 | 14,766,607.63 | 15,094,499.64 |
repair | 147,000 | 81,005.28 | 5,806,666.67 | 6,034,671.94 |
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 OpExFalse
shows only the total OpEx
Example Usage:
style(metrics.opex("annual"))
OpEx | |
---|---|
year | |
2002 | 110,260,676.98 |
2003 | 117,395,980.30 |
2004 | 129,951,305.86 |
2005 | 113,965,336.87 |
2006 | 123,682,482.01 |
2007 | 118,271,499.48 |
2008 | 136,126,599.55 |
2009 | 125,355,903.30 |
2010 | 136,195,274.71 |
2011 | 134,360,755.92 |
2012 | 123,002,003.28 |
2013 | 120,796,258.15 |
2014 | 121,776,353.93 |
2015 | 119,520,714.63 |
2016 | 111,894,138.91 |
2017 | 135,458,997.79 |
2018 | 116,566,101.27 |
2019 | 138,207,024.76 |
2020 | 116,081,433.67 |
2021 | 131,853,417.42 |
style(metrics.opex("annual", by_category=True))
operations | port_fees | equipment_cost | total_labor_cost | materials_cost | OpEx | |
---|---|---|---|---|---|---|
year | ||||||
2002 | 0.00 | 0.00 | 106,092,966.13 | 2,359,110.85 | 1,808,600 | 110,260,676.98 |
2003 | 0.00 | 0.00 | 111,737,809.87 | 2,409,370.43 | 3,248,800 | 117,395,980.30 |
2004 | 0.00 | 0.00 | 124,660,800.73 | 2,513,105.13 | 2,777,400 | 129,951,305.86 |
2005 | 0.00 | 0.00 | 109,180,922.38 | 2,304,714.49 | 2,479,700 | 113,965,336.87 |
2006 | 0.00 | 0.00 | 118,001,320.93 | 2,546,909.07 | 3,134,252 | 123,682,482.01 |
2007 | 0.00 | 0.00 | 113,660,827.31 | 2,345,232.16 | 2,265,440 | 118,271,499.48 |
2008 | 0.00 | 0.00 | 129,774,780.57 | 2,722,918.98 | 3,628,900 | 136,126,599.55 |
2009 | 0.00 | 0.00 | 119,302,091.40 | 2,574,371.91 | 3,479,440 | 125,355,903.30 |
2010 | 0.00 | 0.00 | 130,417,910.32 | 2,786,392.40 | 2,990,972 | 136,195,274.71 |
2011 | 0.00 | 0.00 | 129,317,635.26 | 2,716,620.66 | 2,326,500 | 134,360,755.92 |
2012 | 0.00 | 0.00 | 118,214,058.86 | 2,484,604.42 | 2,303,340 | 123,002,003.28 |
2013 | 0.00 | 0.00 | 115,318,188.82 | 2,576,493.33 | 2,901,576 | 120,796,258.15 |
2014 | 0.00 | 0.00 | 115,981,027.55 | 2,566,154.38 | 3,229,172 | 121,776,353.93 |
2015 | 0.00 | 0.00 | 114,323,549.14 | 2,574,521.50 | 2,622,644 | 119,520,714.63 |
2016 | 0.00 | 0.00 | 107,542,303.23 | 2,464,895.68 | 1,886,940 | 111,894,138.91 |
2017 | 0.00 | 0.00 | 129,623,099.07 | 2,730,478.72 | 3,105,420 | 135,458,997.79 |
2018 | 0.00 | 0.00 | 112,072,122.62 | 2,426,078.65 | 2,067,900 | 116,566,101.27 |
2019 | 0.00 | 0.00 | 132,777,132.51 | 2,756,412.25 | 2,673,480 | 138,207,024.76 |
2020 | 0.00 | 0.00 | 110,875,669.84 | 2,286,963.82 | 2,918,800 | 116,081,433.67 |
2021 | 0.00 | 0.00 | 126,485,151.20 | 2,833,726.22 | 2,534,540 | 131,853,417.42 |
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,914.53 | 11,182.72 | 11,181.31 | 9,249.83 | 19 |
major anchor repair | 15,758.76 | 7,190.71 | 7,189.30 | 8,873.27 | 21 | |
array cable | array cable major repair | 40,378.53 | 24,651.69 | 0.00 | 17,218.47 | 45 |
array cable replacement | 43,352.09 | 31,372.39 | 0.00 | 12,934.49 | 28 | |
ballast pump | minor ballast pump repair | 1,723.65 | 385.51 | 379.80 | 1,457.23 | 12 |
drive_train | main shaft major repair | 497,812.13 | 1,799.79 | 1,794.28 | 496,459.88 | 29 |
main shaft minor repair | 51,610.66 | 22,811.48 | 22,556.74 | 34,660.74 | 328 | |
main shaft replacement | 32,166.84 | 8,215.31 | 8,212.72 | 24,568.73 | 14 | |
electrical system | power electrical system major repair | 456,054.33 | 593.64 | 590.00 | 455,467.58 | 27 |
power electrical system major replacement | 14,092.13 | 1,055.25 | 1,053.17 | 13,126.63 | 6 | |
power electrical system minor repair | 74,675.26 | 32,112.76 | 31,595.48 | 52,487.50 | 513 | |
export cable | export cable subsea inspection | 10,080.54 | 2,554.08 | 0.00 | 8,349.74 | 18 |
generator | annual turbine inspection | 1,345,333.74 | 157,716.94 | 156,193.84 | 1,199,167.02 | 1,432 |
direct drive generator major repair | 686,462.58 | 3,646.33 | 3,639.28 | 682,866.49 | 33 | |
direct drive generator major replacement | 42,648.89 | 16,593.87 | 16,589.79 | 26,805.15 | 17 | |
direct drive generator minor repair | 139,814.07 | 68,580.22 | 67,785.06 | 87,536.58 | 829 | |
hydraulic pitch system | major pitch system repair | 74,440.38 | 59,206.70 | 59,000.60 | 20,371.23 | 265 |
major pitch system replacement | 390.21 | 383.50 | 383.05 | 7.41 | 1 | |
minor pitch system repair | 226,367.68 | 128,041.11 | 126,992.92 | 118,901.34 | 1,211 | |
mooring lines | buoyancy module replacement | 12,203.69 | 9,400.30 | 9,364.76 | 3,269.11 | 51 |
marine growth removal | 55,190.74 | 39,567.95 | 39,423.00 | 19,366.62 | 196 | |
mooring line major repair | 20,323.01 | 7,434.66 | 7,432.59 | 13,316.51 | 24 | |
mooring line replacement | 17,774.67 | 9,387.43 | 9,385.35 | 8,535.29 | 18 | |
power converter | power converter major repair | 6,677,757.69 | 21,462.38 | 21,388.63 | 6,659,746.13 | 379 |
power converter minor repair | 138,860.89 | 69,208.21 | 68,498.14 | 83,843.95 | 788 | |
power converter replacement | 286,726.98 | 81,468.65 | 81,399.02 | 209,331.84 | 127 | |
rotor_blades | blades major repair | 309,315.00 | 803.09 | 799.61 | 308,518.25 | 21 |
blades major replacement | 5,694.17 | 4,256.65 | 4,256.65 | 1,646.17 | 2 | |
blades minor repair | 133,876.55 | 71,680.75 | 71,082.92 | 72,083.62 | 687 | |
supporting_structure | structural annual inspection | 1,615,852.88 | 161,216.01 | 160,033.98 | 1,459,421.92 | 1,440 |
structural subsea inspection | 1,548,408.23 | 22,931.95 | 22,386.82 | 1,532,501.98 | 719 | |
transformer | oss annual inspection | 11,577.45 | 6,595.66 | 6,547.26 | 6,054.47 | 38 |
oss major repair | 369.23 | 285.19 | 274.49 | 94.99 | 1 | |
oss minor repair | 1,012.00 | 671.66 | 667.68 | 454.26 | 7 | |
yaw_system | yaw system major repair | 153,621.61 | 471.56 | 469.91 | 153,195.61 | 9 |
yaw system major replacement | 12,340.48 | 1,097.64 | 1,096.32 | 11,244.66 | 2 | |
yaw system minor repair | 34,690.92 | 14,471.45 | 14,305.23 | 24,422.50 | 220 |
style(metrics.process_times(include_incompletes=False))
time_to_completion | process_time | downtime | time_to_start | N | ||
---|---|---|---|---|---|---|
subassembly | task | |||||
anchor | anchor replacement | 19,914.53 | 11,182.72 | 11,181.31 | 9,249.83 | 17 |
major anchor repair | 15,758.76 | 7,190.71 | 7,189.30 | 8,873.27 | 18 | |
array cable | array cable major repair | 40,378.53 | 24,651.69 | 0.00 | 17,218.47 | 40 |
array cable replacement | 43,352.09 | 31,372.39 | 0.00 | 12,934.49 | 26 | |
ballast pump | minor ballast pump repair | 1,723.65 | 385.51 | 379.80 | 1,457.23 | 12 |
drive_train | main shaft major repair | 497,812.13 | 1,799.79 | 1,794.28 | 496,459.88 | 14 |
main shaft minor repair | 51,610.66 | 22,811.48 | 22,556.74 | 34,660.74 | 328 | |
main shaft replacement | 32,166.84 | 8,215.31 | 8,212.72 | 24,568.73 | 14 | |
electrical system | power electrical system major repair | 456,054.33 | 593.64 | 590.00 | 455,467.58 | 13 |
power electrical system major replacement | 14,092.13 | 1,055.25 | 1,053.17 | 13,126.63 | 6 | |
power electrical system minor repair | 74,675.26 | 32,112.76 | 31,595.48 | 52,487.50 | 513 | |
export cable | export cable subsea inspection | 10,080.54 | 2,554.08 | 0.00 | 8,349.74 | 18 |
generator | annual turbine inspection | 1,345,333.74 | 157,716.94 | 156,193.84 | 1,199,167.02 | 1,432 |
direct drive generator major repair | 686,462.58 | 3,646.33 | 3,639.28 | 682,866.49 | 19 | |
direct drive generator major replacement | 42,648.89 | 16,593.87 | 16,589.79 | 26,805.15 | 17 | |
direct drive generator minor repair | 139,814.07 | 68,580.22 | 67,785.06 | 87,536.58 | 829 | |
hydraulic pitch system | major pitch system repair | 74,440.38 | 59,206.70 | 59,000.60 | 20,371.23 | 265 |
major pitch system replacement | 390.21 | 383.50 | 383.05 | 7.41 | 1 | |
minor pitch system repair | 226,367.68 | 128,041.11 | 126,992.92 | 118,901.34 | 1,211 | |
mooring lines | buoyancy module replacement | 12,203.69 | 9,400.30 | 9,364.76 | 3,269.11 | 51 |
marine growth removal | 55,190.74 | 39,567.95 | 39,423.00 | 19,366.62 | 196 | |
mooring line major repair | 20,323.01 | 7,434.66 | 7,432.59 | 13,316.51 | 22 | |
mooring line replacement | 17,774.67 | 9,387.43 | 9,385.35 | 8,535.29 | 18 | |
power converter | power converter major repair | 6,677,757.69 | 21,462.38 | 21,388.63 | 6,659,746.13 | 190 |
power converter minor repair | 138,860.89 | 69,208.21 | 68,498.14 | 83,843.95 | 788 | |
power converter replacement | 286,340.55 | 81,172.15 | 81,134.82 | 209,209.36 | 126 | |
rotor_blades | blades major repair | 309,315.00 | 803.09 | 799.61 | 308,518.25 | 8 |
blades major replacement | 5,694.17 | 4,256.65 | 4,256.65 | 1,646.17 | 2 | |
blades minor repair | 133,835.69 | 71,632.75 | 71,043.73 | 72,081.70 | 686 | |
supporting_structure | structural annual inspection | 1,615,852.88 | 161,216.01 | 160,033.98 | 1,459,421.92 | 1,440 |
structural subsea inspection | 1,548,408.23 | 22,931.95 | 22,386.82 | 1,532,501.98 | 584 | |
transformer | oss annual inspection | 11,577.45 | 6,595.66 | 6,547.26 | 6,054.47 | 38 |
oss major repair | 369.23 | 285.19 | 274.49 | 94.99 | 1 | |
oss minor repair | 1,012.00 | 671.66 | 667.68 | 454.26 | 7 | |
yaw_system | yaw system major repair | 153,621.61 | 471.56 | 469.91 | 153,195.61 | 4 |
yaw system major replacement | 12,340.48 | 1,097.64 | 1,096.32 | 11,244.66 | 2 | |
yaw system minor repair | 34,690.92 | 14,471.45 | 14,305.23 | 24,422.50 | 220 |
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 | 19 | 0 | 2 | 17 |
major anchor repair | 21 | 0 | 3 | 18 | |
array cable | array cable major repair | 45 | 0 | 5 | 40 |
array cable replacement | 28 | 0 | 2 | 26 | |
ballast pump | minor ballast pump repair | 12 | 0 | 0 | 12 |
drive_train | main shaft major repair | 29 | 0 | 15 | 14 |
main shaft minor repair | 328 | 0 | 0 | 328 | |
main shaft replacement | 14 | 0 | 0 | 14 | |
electrical system | power electrical system major repair | 27 | 0 | 14 | 13 |
power electrical system major replacement | 6 | 0 | 0 | 6 | |
power electrical system minor repair | 513 | 0 | 0 | 513 | |
export cable | export cable subsea inspection | 18 | 0 | 0 | 18 |
generator | annual turbine inspection | 1,435 | 3 | 0 | 1,432 |
direct drive generator major repair | 35 | 2 | 14 | 19 | |
direct drive generator major replacement | 17 | 0 | 0 | 17 | |
direct drive generator minor repair | 829 | 0 | 0 | 829 | |
hydraulic pitch system | major pitch system repair | 265 | 0 | 0 | 265 |
major pitch system replacement | 1 | 0 | 0 | 1 | |
minor pitch system repair | 1,211 | 0 | 0 | 1,211 | |
mooring lines | buoyancy module replacement | 51 | 0 | 0 | 51 |
marine growth removal | 196 | 0 | 0 | 196 | |
mooring line major repair | 24 | 0 | 2 | 22 | |
mooring line replacement | 18 | 0 | 0 | 18 | |
power converter | power converter major repair | 498 | 119 | 189 | 190 |
power converter minor repair | 789 | 1 | 0 | 788 | |
power converter replacement | 128 | 1 | 1 | 126 | |
rotor_blades | blades major repair | 21 | 0 | 13 | 8 |
blades major replacement | 2 | 0 | 0 | 2 | |
blades minor repair | 687 | 0 | 1 | 686 | |
supporting_structure | structural annual inspection | 1,440 | 0 | 0 | 1,440 |
structural subsea inspection | 719 | 0 | 135 | 584 | |
transformer | oss annual inspection | 38 | 0 | 0 | 38 |
oss major repair | 1 | 0 | 0 | 1 | |
oss minor repair | 7 | 0 | 0 | 7 | |
yaw_system | yaw system major repair | 9 | 0 | 5 | 4 |
yaw system major replacement | 2 | 0 | 0 | 2 | |
yaw system minor repair | 220 | 0 | 0 | 220 |
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,053,048,099.00 |
# Project totals, in MWh, at the wind farm level
style(metrics.power_production(frequency="project", units="mwh"))
windfarm | |
---|---|
Project Energy Production (MWh) | 106,053,048.10 |
# Project totals, in GWh, at the wind farm level
style(metrics.power_production(frequency="project"))
windfarm | |
---|---|
Project Energy Production (GWh) | 106,053.05 |
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.11.13/x64/lib/python3.11/site-packages/wombat/core/post_processor.py:2322, in Metrics.h2_production(self, frequency, by, units)
2286 """Calculates the hydrogen production for the simulation at a project, annual,
2287 or monthly level that can be broken out by electrolyzer.
2288
(...) 2319 If :py:attr:`units` is not one of "kg" or "tn".
2320 """
2321 if self.electrolyzer_rated_production.size == 0:
-> 2322 raise ValueError("No electrolyzers available to analyze.")
2323 frequency = _check_frequency(frequency, which="all")
2325 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 | 110,260,676.98 |
2003 | 117,395,980.30 |
2004 | 129,951,305.86 |
2005 | 113,965,336.87 |
2006 | 123,682,482.01 |
2007 | 118,271,499.48 |
2008 | 136,126,599.55 |
2009 | 125,355,903.30 |
2010 | 136,195,274.71 |
2011 | 134,360,755.92 |
2012 | 123,002,003.28 |
2013 | 120,796,258.15 |
2014 | 121,776,353.93 |
2015 | 119,520,714.63 |
2016 | 111,894,138.91 |
2017 | 135,458,997.79 |
2018 | 116,566,101.27 |
2019 | 138,207,024.76 |
2020 | 116,081,433.67 |
2021 | 131,853,417.42 |