Change Log#
CHANGELOG#
v0.12.2 - 16 October 2025#
Reinstate the ability to have extra columns in the weather profile to avoid upstream conflicts, but enforce that they are placed after the columns used by the model.
v0.12.1 - 14 October 2025#
Enable Python 3.13 and 3.14, with the caveat that 3.14 builds will fail until PyArrow 22.0 is released.
v0.12 - 30 September 2025#
Allow for missing data columns for either "windspeed" or "waveheight" where a column of zeros will be populated, and a warning will be raised to alert users in case the missing column is an error.
Force weather column ordering to always be "index", "datetime", "hour", "windspeed", "waveheight".
v0.11.3 - 31 July 2025#
Install
polars-lts-cpuby default when installing on MacOSAdd MacOS test runners
v0.11.2 - 9 July 2025#
Fixes a bug primarily impacting tow-to-port scenarios where individual maintenance and failure models are not being reset upon either replacement or following a tow-to-port repair under certain conditions. This allows for these additional processes to be perpetuated throughout the lifecycle of the simulation while succumbing to the same inital flaw, compounding the number of erroneously additional events. The issue is resolved by the following:
Multiple subassemblies can now be passed to a
CableorSystemobject during an interruption, allowing for simpler logic handling.TTP repairs no longer reset the subassemblies at the time of towing to port, and instead reset the subassemblies after the turbine has been towed to site. Resetting in the final stage ensures that any newly created processes, and especially fixed date maintenance schedules can not create extra processes between tow, repair, and site return operations.
Fixes a bug in the
Metrics.process_times()calculation inflating the count of total events when cables are shut down. This is due to immediate logging of the upstream system and cables shutting down with shared logging data.Applies the same fix to the
Metrics.request_summary()calculation, ensuring duplicated logging messages are not caught up in the end result.
v0.11.1 - 3 July 2025#
Fixes a bug causing 25+ hour mooring connection operations to never complete due to shift delays in an uninterrupted operation.
Updates the rated production and capacity docstrings to ensure users understand they are an hourly capacity.
v0.11 - 26 June 2025#
Deprecations#
Drops support for Python 3.10.
The layout file must have a "type" specified for every system in the layout.
Features#
Electrolyzers are now an included system model. They act similarly to a substation, but should be downstream from the substations in the layout model. Unlike turbines an electrolyzer will only connect to the substation as a downstream system. Below are some of the highlights and assumptions.
The subassembly definition file requires 4 top-level inputs:
stack_capacity_kw: The capacity of each stackcapex_kw: The cost of the whole system, per kw.n_stacks: The number of stacks comprising the electrolyzer.power_curve: Includes variablesp1,p2,p3,p4,p5,FE(Faradaic efficiency),n_cells(per stack), andturndown_ratio.
The production curve is based on the H2Integrate PEM electrolysis module.
Electrolyzer downtime does not impact farm activities as it is assumed energy will still flow through the export system to some other entity such as the grid.
All stacks are currently modeled as a single entity.
Metrics.dispatch_summary()is now available to provide the number of mobilizations and average charter period across the whole project, or broken down by year and month, as requested.Metrics.h2_production()is now available to provide to calculate the hydrogen production in kg/hr or tonnes/hr.Universalized maintenance starting dates are now able to be set through the primary configuration file as
maintenance_start. This will enable the universalized staggering of the first instance of a maintenance task to align with a different season than that of the start of the weather profile. This is particularly helpful for Northern Hemisphere projects where winter months can cause significant weather delays.Simulation.run()has a new parameter calleddelete_logs(defaults to False) that allows the user to automatically delete the logging files that are created after theMetricsobject is initialized. To usedelete_logs=True, users must also setsave_metrics_inputs=False.Metrics.request_summary()is now available to provide the total number of repair and maintenance requests, number of canceled requests, number of incomplete requests, and the number of completed requests.
Updates#
Metricsimprovements and updatescomponent_costs()has been refactored, and now includes two additional breakdowns:by_task: toggles the inclusion of the individual repair and maintenance tasks.include_travel: toggles the inclusion of intrasite and port-to-site travel.
time_based_availability()Additional option for
by="electrolyzer".by="turbine"no longer includes the "windfarm" column for results
production_based_availability()Additional option for
by="electrolyzer".by="turbine"no longer includes the "windfarm" column for results
capacity_factor()Additional option for
by="electrolyzer".by="turbine"no longer includes the "windfarm" column for results
process_timesnow uses aMultiIndexwith asubassemblyandtaskcolumn.
Improved cable, subassembly, and servicing equipment error handling to show which of the cables, substations, turbines, or vessels produced the intialization error for easier input debugging.
Basic tests are now included for limited set of the
Metricsclass with a focus cost summaries.Tests are now roughly split between unit tests and regression tests, where regression tests focus on event timing checks and results checking. Users can now run
pytest --unitorpytest --regressionif a subset of the tests are needing to be run withpyteststill running the entire test suite.Post-results log files have been converted from a CSV to Parquet file format for faster I/O and a smaller memory footprint.
Servicing equipment code checking is replaced with a
StrEnumthroughout for more robust and streamlined data validation.Fixes a bug in
Metrics.process_times()where canceled requests are counted towards the event timing and count.Metrics.process_timeshas a new flaginclude_incompletesto either summarize all maintenance activity (False) or only the completed maintenance activity (True).Small bug in
Subassembly.interrupt_processes()is fixed by using atry/exceptclause for all interruptions. This allows for theServiceEquipment.tow_to_site()to run without failure after replacing a subassembly. The cause of the failure stems from the inability to interrupt a previously terminated process (caused by triggering a tow-to-port repair).COREWIND turbine failures have been split so that subassemblies only contain a single component grouping to be more compatible with industry modeling assumptions. This ultimately reduces the resulting number of failures, and therefore costs.
Simulation configuration dictionaries can now contain the wind farm layout as a Pandas
DataFrame, in addition to the existing file name string.Adds
examples/electrolyzer_example.ipynbto demonstrate how to run a standalone electrolyzer simulation without creating any intermediary files.Mooring disconnections and reconnections do not consider the tugboat's shift set shift timing considering this process can take multiple days.
All parameters starting from the first boolean parameter now must be passed as a keyword argument with the name included (as
x=Falseorx=True, other="value"), for all methods, except for those inMetricsto maintain user workflow compatibility.
v0.10.4 (12 May 2025)#
Fix a bug where tow-to-port strategies can result in vessels being dispatched and accruing wasted costs when a repair is handed off to a report. An additional check is added where if there are no requests, but the servicing equipment has not yet been mobilized, the servicing equipment dispatch is canceled.
Update an end of simulation timing check to ensure compatibility with PolaRS and Python datetime stamps that causes the simulation to fail when an action cannot be completed before the end of the simulation.
v0.10.3 (24 April 2025)#
Fix a bug in
Metrics.component_costswhere the materials costs are excluded when results are broken down by action.Add
WombatEnvironment.simulation_yearsto easily retrieve the number of years simulated.
v0.10.2 [7 April 2025]#
Patch release to ensure user environments are compatible with the required minimum
attrs version (24.1.0 for the new usage of attrs.Converter).
v0.10.1 [4 April 2025]#
Patch release addressing improper setup logic for the new date-based maintenance following subassembly replacements.
v0.10 [26 March 2025]#
Features#
Date-based maintenance and improved timing#
The frequency of maintenance events is now significantly more customizable by enabling
custom starting dates and more resolved frequency inputs. There is no change required
for existing configurations as the default value will frequency number of days until
the next event.
frequencyis an integer input (0 for unmodeled)frequency_basisindicates the time basis forfrequency, which is modeled in two forms:timing based: amount of operational time that should pass before an event occurs, which does not count downtime (repairs, upstream failure, or system offline) in the time until the next event.
"days": number of days between events (default)
"months": number of months between events
"years": number of years between events
date based: uses a set schedule for when events should occur, regardless of downtime and will use
start_dateas the first occurrence of the event."date-days": number of days between events
"date-months": number of months between events
"date-years": number of years between events
start_date: The first occurrence of the maintenance event, which defaults to the simulation start date + the expected interval. If the input is prior to the simulation start date, then it is treated as a staggered timing, so, for instance, a biannual event starting the year prior to the simulation ends up being staggered with the first occurrence in the first year of the simulation, not the second. Similarly, this allows for maintenance activities to start well into the simulation period allowing for costs on OEM-warrantied maintenance activities to be unmodeled.
A few examples of more complex scenarios assuming a 1/1/2000 simulation starting date:
Semiannual event to occur starting in the 3rd month of the simulation:
frequency: 6 frequency_basis: months start_date: "9/1/1999"
Summer-based annual event with the first occurrence in the 3rd year of the simulation:
frequency: 1 frequency_basis: years start_date: "6/1/2003"
Annual, June maintenance activity:
frequency: 1 frequency_basis: "date-years" start_date: "6/1/2000"
Biannual, June maintenance activity that should start in the first year, and every other year after that:
frequency: 1 frequency_basis: "date-years" start_date: "6/1/2000"
Repeat vessel configuration simplification#
Multiple instances of a servicing equipment can be created with a list of the name and number of them in the following forms. This creates copies where the equipment's name is suffixed with a 1-indexed indication of which number it is, such as "Crew Transfer Vessel -1" through "Crew Transfer Vessel - 4" for the below example.
...
servicing_equipment:
- - ctv.yaml
- 4
- [hlv.yaml, 2]
- dsv.yaml
...
Single(ish) file configuration#
WOMBAT configurations now allow for the embedding of servicing equipment, turbine, substation, cable, and port data within the main configuration. Now, the only files required outside the primary configuration YAML are the weather profile and layout. To utilize this update, data can be included in the following form:
servicing_equipment:
- [7, ctv]
... # Other configuration details
vessels:
ctv:
... # Contents of library/corewind/vessels/ctv.yaml
turbines:
corewind_15MW:
... # Contents of library/corewind/turbines/corewind_15MW.yaml
substations:
corewind_substation:
... # Contents of library/corewind/substations/corewind_substation.yaml
cables:
corewind_array:
... # Contents of library/corewind/cables/corewind_array.yaml
corewind_export:
... # Contents of library/corewind/cables/corewind_export.yaml
Updates#
Update the
Failuredefinition to use lists of failure configurations, not dictionaries. Users can use the following function to update their cable, turbine, substation, and consolidated configurations:wombat/core/library.py::convert_failure_dataDocumentation is available at https://wisdem.github.io/WOMBAT/API/utilities.html#importing-and-converting-from-old-versions.Updates the minimum Python version to 3.10.
The wind farm operation level calculation was moved to
wombat/utilities/utilities.pyso it can be reused whenMetricsloads the operational data.Adds a CI check for code linting (pre-commit) and for the documentation building.
Basic tests added for the Simulation API
Fixes the
FutureWarningsfrom Pandas about changing offset strings.Updates the COREWIND severity levels to those originally listed in the publication now that severity levels can be used multiple times within a single subassembly.
Updates the GH Pages uploading workflow steps.
0.9.7 (12 February 2025)#
Fixes a new bug where YAML is now sensitive to the implicit closing of files by using a context manager to open a YAML file and return the contents.
Removes PyPI secret usage now that trusted publishing fails with redundant permissions.
0.9.6 (11 December 2024)#
Fixes a discrepancy where the wind farm vs turbine availability losses do not match. A slight difference in total availability will be noticeable as a result.
0.9.5 (6 August 2024)#
Fixes a bug that causes delayed mobilizations. The underlying cause was the lack of resetting the index column of
WombatEnvironment.weatherafter filtering out rows that exist prior to the starting year of the simulation.The Polars minimum version was bumped to avoid a deprecation error with the previous index column generation method.
0.9.4 (1 July 2024)#
Adds support for Python 3.11 and 3.12.
Adds the following capability and servicing equipment codes:
MCN for medium cranes, which should enable greater options for land-based wind.
VSG for vessel support groups, or any representation of multiple vessels used for a single operation.
Updates Polars API usage to account for a series of deprecation and future warnings.
Changes the metrics demonstration to use the COREWIND Morro Bay in situ example, and adds the availability plotting to the demonstration example.
RepairRequest.prior_operating_levelhas been added to allow 100% reduction factor failures to correctly and consistently restore the operating level of a subassembly following a repair.Replaces the
valid_reductionattrs validator withvalidate_0_1_inclusiveto reuse the logic in multiple places without duplicating checking methods.Adds a
replacementflag for interruption methods, so that a failure or replacement comment can be added as a cause forsimpy.process.interrupt. This update allows the failure and maintenance processes to check if an interruption should cause the process to exit completely. Additionally, the forced exit ensures that processes can't persist after a replacement event when a process is recreated, which was happening in isolated cases.Fixes a bug in
RepairManager.purge_subassemble_requests()where the pending tows are cleared regardless of whether or not the focal subassembly is the cause of the tow, leading to a simulation failure.Fixes a bug in
utilities/utilities.py:create_variable_from_string()to operate in a way that is expected. The original method was removing all numerics, but only leading punctuation and numerics should be replaced, with any punctuation being replaced with an underscore.Adds additional inline comments for clarification on internal methods.
Update README.md to be inline with current conda and Python standards.
Fully adopts
functools.cachenow that older Python versions wherefunctools.lru_cachewas the available caching method.Fixes a Pandas
FutureWarningby removing a now unnecessary piece of code inwombat/core/post_processor.py:equipment_costs
v0.9.3 (15 February 2024)#
Reinstate the original time-based availability methodology, which is based on all turbines, not the wind farm total.
Replace the
blackformatter withruff.Adopt
pyupgradeto ensure modern Python language usage.Add the NumPy 2.0 integration tool to Ruff.
v0.9.2 (13 November 2023)#
General#
Adds the PowerPoint file used in the NAWEA/WindTech 2023 Workshop.
Updates all coming soon links and typos.
Bug Fixes#
Fixes an edge-case introduced in v0.9.1 where traveling during a crew transfer process is able to occur after the end of the simulation period.
The documentation has been completely converted to a Jupyter Book paradigm due to a build issue found in the GitHub Actions.
v0.9.1 (27 October 2023)#
Removes the pre-public release analysis data and results, located at
library/original-outdated, from the repository, but can be found in all releases prior to v0.9. This is being done to manage the package size and ensure it can be published to PyPI.
v0.9 (27 October 2023)#
Bug Fixes#
Repairs that had a weather delay extended repairs past the end of the shift now properly extend the repair into future shifts instead of completing early. This has a small negative impact on availability because that means some repairs can take longer than they had originally.
Traveling to a system for a repair where the timing extends beyond the end of the shift, but into the next shift, is now registered as a shift delay just like travel weather delays that extend beyond the end of the current shift but before the start of the next shift. This has a small positive impact on availability because a turbine or cable may not start being repaired until weather is more consistently clear, rather than starting it and extending it for many shifts.
Windfarm.cable()now correctly identifies 2 and 3 length cable naming conventions to differentiate which version of the cable id is being retrieved.An edge case where events occurred just after the end of a simulation has been resolved by checking the datetime stamp of that event and not adding any action log to the simulation that is after the
WombatEnvironment.end_datetime.A bug in how the total wind farm operating level was calculated is updated to account for substation downtime, rather than using a sum of all turbine values.
Metrics.time_based_availabilityandMetrics.production_based_availabilityhave been updated to use to take advantage of the above fix. Similarly, the time-based availability skews higher now, as is expected when taking into account all availability greater than 0, and the energy-based availability drops moderately as a result of accounting for the substation downtime.
General Updates#
Metrics.equipment_labor_cost_breakdownsnow has aby_equipmentboolean flag, so that the labor and equipment costs can be broken down by category and equipment. Additionally,total_hourshas been added to the results, resulting in fewer computed metrics across the same set of breakdowns."request canceled" and "complete" are now updated in the logging to directly state if it's a "repair" or "maintenance" task that was completed or canceled to ensure consistency across the logging messages. As a result,
Metrics.task_completion_rate()can now correctly differentiate between the completed tasks effectively.The use of unique naming for the servicing equipment is now enforced to ensure that there is no overlap and potential confusion in the model.
New, experimental plotting functionality has been added via
wombat.utilities.plot.plot_farm_layoutplots the graph layout of the farm. Note that this will not work if realistic lat/lon pairs have not been provided in the layout CSV.plot_farm_availabilityplots a line chart of the monthly overall windfarm availability. Additional toggles allow for the plotting of individual turbines in the background and/or a 95% confidence interval band around the farm's availabilityplot_detailed_availabilityplots a heatmap of the hourly turbine and farm operational levels to help in debugging simulations where availability may be running suspiciously low (i.e., a turbine might have shut down or a cable failure didn't get repaired within a reasonable time frame).
Simulation.service_equipmentis now a dictionary to provide clear access to the servicing equipment details.Simulation.from_config()requires both a library input and a file name input for the configuration after deprecating thelibraryfield from the configuration requirements due to it being cumbersomeMetrics.opex()provides the opex output by category ifby_categoryis set to beTrue
Methodology Updates#
Subassemblies and cables are now able to resample their next times to failure for all maintenance and failure activities, so that replacement events reset the timing for failures across the board.
Systems are no longer interrupted once the servicing equipment addressing a repair or maintenance task is dispatched, and instead are interrupted just before the crew is transferred to begin repair, maintenance, or unmooring. This has a small net positive increase in the availability for short travel distances, but can vary if the travel time is more than a few hours (i.e., large distance to port, slow travel due to weather, & etc.)
When a tow to port repair is in the queue, no other repairs or maintenance activities will occur for that turbine until it's brought into port for repairs.
Deprecations#
The original library structure has been fully deprecated, please see the Reference/How To example for more details on converting data that has not yet been updated.
All PySAM functionality has been deprecated as it's no longer relevant to this work.
The
Simulation.configno longer requires thelibraryfield to reduce conflicts with sharing data between users.
v0.8.1 (28 August 2023)#
Fixes a bug where servicing equipment waiting for the next operational period at the end of a simulation get stuck in an infinite loop because the timeout is set for just prior to the end of the simulation, and not just after the end of the simulation's maximum run time.
v0.8.0 (16 August 2023)#
Bug Fixes#
Most of the
# type: ignorecomments have been removed, or the past errors have been resolvedFailure and maintenance logic in the
CableandSubassemblymodels have been wrapped inif/elseblocks to ensure previously unreachable code still can't be reached under limited conditionsFixes a bug in where the mobilization duration is logged. Previously, the mobilization duration was logged upon completion, but now is logged while during the actual mobilizing, with costs still being logged upon completion.
Fixes an uncommon error where repairs are made twice causing the simulation to fail. This was caused by a control mismatch in the unscheduled repair process, and was fixed by better tracking and controlling when a repair moves from "pending" (submitted), to "processing" (handed off to the servicing equipment for repair or to the port for a tow-to-port repair cycle), to "completed" (the repair is registered as complete). Additionally, the servicing equipment no longer relies on receiving the first repair from the repair manager on dispatch, and follows the same
get_next_request()logic that will occur following the initial dispatch and repair.Fixes an error where a repair has
replacement=Trueandoperation_reduction< 1 both resets theoperating_levelback to 1 and readjusts for theoperation_reduction, which can causeoperating_level> 100%ServiceEquipment.crew_transfer()uses a while loop in place of anifwith recursion strategy to handle unsafe transfer conditions to continuously wait until the next shift's available window.
Features#
Adds a
non_stop_shiftattribute toServiceEquipmentData,UnscheduledServiceEquipmentData,ScheduledServiceEquipmentData, andPortConfigthat is set in the post-initialization hook or throughDateLimitsMixin._set_environment_shift()to ensure it is updated appropriately. Additionally, all checks for a 24 hour shift now check for thenon_stop_shiftattribute.Metrics.emissions()has been added to the list of available metrics to calculate the emissions from idling at port or sea, tranisiting, and maneuvering. Co-authored by and inspired by analysis work from @hemezz.Simulationnow accepts arandom_seedorrandom_generatorvariable to seed the random number generators for Weibull failure timeouts and wait timing between event completions. Setting therandom_seedto the same value from one simulation to the next will net the same results between different simulations, whereas therandom_generatorcan be used to use the same generator for a batch of simulations.
General#
All
assertstatements are now only called when type checking is performedReplaces all
.get(lamda x: x == request)with a 10x faster.get(lambda x: x is request)to more efficiently filter out the desired event to be removed from the repair manager and port repair management.WombatEnvironment.weatheris now a Polars DataFrame to improve efficiency and indexing bottlenecks introduced in Pandas 2.0.All subassembly cable files are read in once, and stored in a dictionary to provide a modest speed up for the simulation initialization.
v0.7.1 (4 May 2023)#
Features
Metrics.process_times()now includes the time_to_start, representing the time between when a request is submitted, and when the repairs officially start.Expand the acceptable date formats for the weather profiles to allow for year-first.
v0.7.0 (3 May 2023)#
Replace Flake8 and Pylint in the pre-commit workflow with ruff, and fix/ignore the resulting errors as appropriate
Features:
Weather data now has the ability to contain more than just the required "windspeed" and "waveheight" columns. This will allow for easier expansion of the weather model in the future, and increase compatibility with other NREL techno economic modeling frameworks.
Bug fixes:
Maintenance and failure simulation process interruptions were occuring prior to starting the process timing, and causing simulation failures.
Duplicated parameters were being processed in
WombatEnvironment.log_actionstemming from improper handling of varying parameters in some of the more complex control flow logic in in situ repairs.Another edge case of negative delays during crew transfers where there is insufficient time remaining in the shift after account for weather, so the method was called recursively, but not exiting the original loop.
Portmanagement of in situ and tow-to-port capable tugboats wasn't properly accounting for tugboats of varying capabilities, and assuming all tugboats could do both. The vessel management and repair processing were out of sync causing duplicated turbine servicing/towing.RepairManagerhas consolidated the dispatching of servicing equipment to be the following categories instead of the previously complex logic:If a request is a tow-to-port category, have the port initiate the process
If the dispatching thresholds are met, then have the port initiate a repair for port-based servicing equipment, otherwise the repair manager will dispatch the appropriate servicing equipment.
ServiceEquipment.weather_delay()no longer silently processes a second weather delay.Intra-site travel is now correctly logging the distance and duration of traveling between systems at the site by moving the location setting logic out of
crew_transfermethod and being entirely maintained within, or next to, thetravelmethod ofServiceEquipment.RepairManagernow properly waits to dispatch servicing equipment until they are no longer under service from another servicing equipment unit.Servicing equipment are no longer simultaneously dispatched from both the
PortandRepairManagercausing simulations to potentially error out when theSystem.servicingorCable.servicingstatuses are overridden by the second-in-line servicing equipment. This was resolved by the port waiting for the turbine, a tugboat, and a spot at port to become available, then immediately halting the turbine, and starting the tow-in logic.Missing
ServiceEquipment.dispatchedstatus updates have been amended, so no matter the operation, a piece of servicing equipment should be set todispatched = Trueuntil the crew is back and repair is completed.To avoid multiple dispatches to a single turbine, cable, or substation, or multiple dispatches of a single vessel/onsite equipment, a random timeout between 0 and 30 seconds (in simulation time) is processed, then a status double-checking occurs.
Metrics.process_times()now includes the "N" column to indicate the number of processes that fall into each category.
v0.6.2 (3 February 2023)#
Warnings from Pandas
.groupby()calls have been silenced by shifting the column filtering to before the groupby method call.Fixed the towing to port logging message, and subsequent
Metrics.number_of_tows()search criteria to correctly calculate the number of tows in each direction.Fixes a bug in the crew transfer logic where the travel time back to port is longer than the weather delay itself, and a negative time delay is incorrectly attempted to be processed.
v0.6.1 (31 January 2023)#
A hot fix for the code comparison data not being found when installing from PyPI, which was caused by missing
__init__.pyfiles in the reconfigured library structure.
v0.6.0 (10 January 2023)#
In v0.6, due to a series of bug fixes, logic improvements, and feature additions (all described below), users can expect mild to significant shifts in their results. These shifts, while startling, move WOMBAT towards more accurate results now that servicing equipment can't be dispatched multiple times in a row, statuses can't be reset without failure. Additionally, in our validation cases this has led to an average speedup of 71%, or 3.5x faster run times.
New and Updated Features#
Environmental and logistics considerations via prohibited operations periods and speed reduction periods.
All periods can be set for each servicing equipment, or across the board when set at the environment level
For ports, the same logic applies where the environment can set the port variables and the port can set its associated tugboats' variables
When a setting is defined in multiple locations, the more conservative restriction is applied
Variables
non_operational_start,non_operational_endcreate the annualized period where operations are prohibited, resulting in the creation of the arraynon_operational_datesand setnon_operational_dates_set.Variables
reduced_speed_start,reduced_speed_endcreate the annualized period where the maximum speed,reduced_speed, for all operations is imposed, resulting in the creation of the arrayreduced_speed_datesand setreduced_speed_dates_set.
Export Cables
Models the export cabling system as a single cable between the substation and the interconnection point or as a connection between multiple substations. For multiple connected substations, the model assumes they are independent systems.
Adds support for "type" in the wind farm layout CSV file, which should be filled with either "substation" or "turbine". This column supports multi-substation farms so that accurate plots and connections can be made. For instance, multiple connected substations, can now be accurately rendered and modeled in the farm.
Adds support for "upstream_cable_name" in the wind farm layout CSV file, to provide an individualized name to a cable in place of using the name field in the cable settings file for all similar cables.
New library structure that mirrors ORBIT (see below diagram)! In v0.7, the original library structure will be officially deprecated in favor of the below, and during the v0.6 lifecycle a warning will be raised to instruct users where to place and structure folders going forward.
<library> ├── project ├── config <- Project-level configuration files ├── port <- Port configuration files ├── plant <- Wind farm layout files ├── cables <- Export and Array cable configuration files ├── substructures <- Substructure configuration files ├── turbines <- Turbine configuration and power curve files ├── vessels <- Land-based and offshore servicing equipment configuration files ├── weather <- Weather profiles ├── results <- The analysis log files and any saved output dataAdds
create_library_structuretowombat.core.libraryso that users can create the appropriate folder structure for a new project without having to manually create each and every folder.
Maintenance.operation_reductionhas been enabled to better resemble the effect of unaddressed maintenance.Failurenow has a boolean flag forreplacementto indicate if a replacement is required, which allows for operational shutdowns without necessitating a full replacement of the subassembly. Additionally, this flag enables a replacement event for non-shutdown failures.
General Improvements#
Bump Python versioning requirements to 3.8+
Add PyArrow dependency for fasting save/load processes for CSV reading and writing
Convert boolean operational statuses for
System,Subassembly,Cable, andServiceEquipmentto SimPy events for more efficient processing and accurate delays for restartingFix numerous bugs in the repair logic introduced by the use of boolean checks and status switches, which also improve simulation performance. These issues were primarily caused by erroneously resetting the status, but with the new event setting and
.succeed()logic to clear an operation, the previously incorrect resetting is much harder to do.Continue to improve the performance of low-level simulation operations to realize further improvements in memory usage and simulation performance
Logging is now based on directly writing to CSV in place of the
logging-based infrastructureAll underlying infrastructure withing the simulation have also been updated to accommodate the different file types, which allows for more direct interaction at the end of the simulation and enables PyArrow CSV read/write
This enables:
deprecation warnings to be passed directly to the terminal/notebook without interfering with the file handling
reasonable speedups to simulation times by not having additional overhead from the logging and buffering
Metrics.process_times()has been converted to efficient pandas code for fast computation.The Metrics example usage documentation page has been rewritten and reformatted to provide more helpful information to users
Metricsmethods now accurately account for the effect of substation operating reductions on upstream turbines so that each substation's subgraph multiplies the turbine operating capacity by the substation operating capacity.Fixes a bug in the
RepairManager.get_next_highest_severity_request()where requests aren't processed in first in, first out order with a severity level priority.Remove duplicated logic in the
SubassemblyandCablemaintenance and failure modeling ensuring that repetitive logic is identical between scenarios.
0.5.1 (22 July 2022)#
Updates to use the most recent pandas API/recommendations, which fixes numerous warnings in the
MetricsclassFixes inconsistency in returning floats vs
DataFrames in theMetricsclassUpdates the examples to work with the returned
DataFramevalues, and adds warnings about the change in usageUpdates the documentation configuration to be compatible with the latest sphinx book theme API usage
Adds a potential fix to an occasional issue where the logging files can't be deleted using
WombatEnvironment.cleanup_log_files()because the file is still considered to be in use
0.5.0 (30 June 2022)#
Adds capabilities: "TOW" and "AHV" for tugboat/towing equipment and anchor-handling vessels
Adds a tow-to-port strategy that is activated for repairs with the "TOW" capability in the servicing
Adds a
Portclass to handle the tow-to-port class and tugboat-based service requestsAllows for any name to define the subassemblies of a turbine or substation to enable users to use the naming conventions they are most familiar with or most meaningful for their own work
Minor bug fixes in the
Metricsclass to improve stability, improve code reuse, and documentation\Adds nearly all documentation updates from PR #39 as a result of an internal code review, but makes the changes in the source files that generate the example notebooks, so is not a direct merge
Adds an annual fee to
PortConfig.annual_feethat gets applied monthly, though is not included in any metrics yet.Adds
UnscheduledServiceEquipmentData.tow_speedto differentiate between towing speeds and traveling speeds required between port and site, and implements the towing speed application appropriatelyAdds a
locationflag to the events logging infrastructure and implements its usage across the simulation architectureCreates the metric
Metrics.number_of_towsto track the number of tows and provides breakdowns as neededCreates the metric
Metrics.vessel_crew_hours_at_seato track the number of vessel or crew hours at seaCreates the metric
Metrics.port_feesto calculate any port fees associated with a projectCreates the metric
Metrics.opexto calculate a project's operational expendituresCreates the metric
Metrics.NPVto calculate a project's net present valueModifies
Metrics.project_fixed_coststo have more time resolutions to align with the OpEx calculation optionsFixes some results formatting inconsistencies in the
Metricsclass
0.4.1 (2022-March-8)#
Adds code diagrams to demonstrate how the various components connect
Updates the documentation to be better in line with the current state of the software
Fixes a bug that allowed the x_metrics_inputs.yaml file to persist after the cleanup method is called.
Updates the provided library content structure to account for future updates
0.4.0 (2022-February-4)#
Testing now included!
pathlib.Pathis used in place ofosthroughout for easier to read file maneuvering.attrs.defineandattrs.fieldhave been adopted in place ofattr.sandattr.ib, respectively.Typing style is updated for future python type annotations as, e.g.,
Union[List[str], str]->list[str] | str.Unused imports have been further cleaned up.
Better caching of commonly computed values for faster simulations
Simulation metrics are now able to be saved for later reloading and use.
Minor documentation updates, mostly in the examples section for changed API usage.
Validation cases have been re-run for the most up-to-date version.
wombat.windfarm.system.Systemno longer requires every subassembly model to be defined for increased flexibility and ease of definition of turbine simulationswombat.utilities.hours_until_future_hour()correctly moves to the expected hour in the future, regardless of the number of days that are added.The IEA Task 26 validation cabling vessel was renamed from "cabling.yaml" to "cabling_scheduled.yaml" for consistent naming conventions.
Improved error messages throughout.
wombat.core.simulation_api.Simulationno longer acceptsnameas an input, and reads it directly from the configuration.wombat.core.simulation_api.Simulation.runnow has acreate_metricsflag that defaults toTrueto indicate if the metrics suite should be created, so thatFalsecan be used if numerous analyses will be run and post-processed after the fact.wombat.core.simulation_api.Simulation.save_metrics_inputsadded to allow for saving the elements required to recreate aMetricsobject at a later point in time.wombat.core.environment.WombatEnvironment.workday_startandwombat.core.environment.WombatEnvironment.workday_endare better validated for edge cases.wombat.core.environment.WombatEnvironment._weather_setupvalidates the start and end points against the provided weather profile and against each other to ensure they are valid boundaries.wombat.core.environment.WombatEnvironment.cleanup_log_fileswill only try to delete files that actually exist to avoid unexpected simulation failures at the last step.wombat.core.environment.WombatEnvironment.date_ixacceptsdatetime.datetimeanddatetime.dateinputs to avoid unnecesary errors or manipulations in a simulation.wombat.core.environment.WombatEnvironment.log_actionnow only accepts numeric inputs forsystem_olandpart_ol.wombat.core.environment.WombatEnvironment.weather_forecastnow rounds the starting time down to include the current hour, which fixes a bug in some edge cases where a crew transfer at the end of the shift gets stuck and has to wait until the next shift despite ample time to transfer.wombat.core.environment.WombatEnvironment.is_workshiftcorrectly accounts for around the clock shifts.wombat.core.data_classes.annual_date_rangenow usesnumpy.hstackto construct 1-D multiple year date ranges to ensure there is no nesting of data.wombat.core.repair_management.RepairManager.submit_requestwill only attempt to deploy servicing equipment for strategies that have been initialized to reduce unnecessarily running code.wombat.core.repair_management.RepairManager.get_request_by_turbinewas renamed towombat.core.repair_management.RepairManager.get_request_by_systemto explicitly include substations. to remove repeated calculations and checks.wombat.core.repair_management.RepairManager.get_request_by_severityrequest checking was optimized to remove repeated calculations and checks.wombat.core.repair_management.RepairManager.purge_subassembly_requestsno longer prematurely exits the loop to purge unnecessary requests from the logs in case of a replacement being required. Additionally, anexcludeparameter has been added for niche use cases where all but a couple of requests will need to be removed.wombat.core.service_equipment.ServiceEquipmenthas more attributes for tracking its location throughout a simulation.wombat.core.service_equipment.ServiceEquipment.find_uninterrupted_weather_windownow rounds float inputs up to the nearest whole number to ensure the proper length window is retrieved.wombat.core.service_equipment.ServiceEquipment.find_interrupted_weather_windowusesmath.ceilin place ofnp.ceil().astype(int)for strictly python data types in computation.wombat.core.service_equipment.ServiceEquipment.travelconsistently resets the location attributes when moving between site and port to fix bugs in the end location.wombat.core.service_equipment.ServiceEquipment.crew_transfernow indicates when the crew is actually being transferred, and updates the equipment's location post-transfer. Additionally, the travel time in delays is now accounted for, so the actually elapsed time is accounted for in processing weather delays. A bug in processing weather delays is fixed and uses the correctSimPytimeout call so that the simulation does not get stuck due to improper calling.wombat.core.service_equipment.ServiceEquipment.process_repairadds a safety window to account for the crew having enough time to safely transfer back to the equipment. This logic is likely not entirely fixed, but is sufficiently fixed for the time being.wombat.core.service_equipment.ServiceEquipment.process_repair:fixes a bug in the hours to process calculation by reconfiguring the control flow for both simplicity and accuracy.
Additionally, the equipment will travel back to port if the work shift is over, so the equipment does not skip steps the repair logic.
Weather delays will also not be processed if the actual repair is finished, and will be moved to the crew transfer step.
The hours required vs hours available is reset for equipment that have around the clock shifts, so the timing is not arbitrarily capped, which also reduces the number of steps in the simulation.
The work shift indicator check now accounts for the equipment's specific work shift settings, and not the environment's to ensure the proper operating parameters are used.
The control flow for if there isn't enough time to perform the repair is updated to accurately account for when and where the equipment needs to travel
Cables are no longer retrieved through system and causing an error when processing their repairs.
wombat.core.service_equipment.ServiceEquipment._calculate_intra_site_timenow accounts for a speed of 0 km/hr so that function will not error out when there is a travel distance, but no speed.wombat.core.service_equipment.ServiceEquipment.run_schedulednow sets theonsitevariable for equipment that are always on site for more consistent handling of the onsite attribute.wombat.core.service_equipment.ServiceEquipment.wait_until_next_operational_periodnow resets the equipment's location attributes so its location can't incorrectly persist from the last step.wombat.core.service_equipment.ServiceEquipment.register_repair_with_subassemblycorrectly retrieves the cable information for upstream cables to be reset.wombat.core.post_processor.Metrics.service_equipment_utilizationhas a new methodolgy that uses the actual number of days in operation instead of a backwards computation that consistently and accurately accounts for the days where the servicing equipment is in operation. Additionally, the filtering is updated to match the filter for total days, which also improves accuracy of results.wombat.core.post_processor.Metrics.from_simulation_outputsclassmethod was added to easily load simulation data for after-the-fact analyses.wombat.windfarm.Windfarmoperations logging message generation routines were optimized.wombat.windfarm.Windfarm.systemwas created in place ofwombat.windfarm.Windfarm.node_systemas a convenience method for grabbing theSystemobject from the windfarm graph layout.wombat.windfarm.Windfarm.cablewas created to replicate thesystemmethod for cable objects.wombat.windfarm.Windfarm,wombat.windfarm.system.cable.Cable, andwombat.windfarm.system.system.Systemall have an operating level property that is the current operating level and one that does not account for if a system is being serviced, and therefore registered as non-operational. This fixes a bug in the dispatching of unscheduled service equipment when a repair request is submitted while a repair is occurring that drops the operating level below the strategy threshold. In the dispatching check we now are able to consider the operating level before a system was shut down for repairs and avoid improper dispatching.wombat.windfarm.system.cable.Cablenow takesend_nodein place ofupstream_nodesto simplify the initialization process and be more explicit about the starting and ending points on the cable.wombat.windfarm.system.cable.Cable.interrupt_subassembly_processesis nowinterrupt_processesand only interrupts the cable's own maintenance and failure simulation processes.wombat.windfarm.system.cable.Cable.interrupt_all_subassembly_processeswrapsinterrupt_processesto ensure similar functionality between system and subassembly methods for use in the simulations.wombat.windfarm.system.cable.Cablelogging now properly records itself as the target of repairs and maintenance tasks instead of its starting node.wombat.windfarm.system.cable.Cable.upstream_nodeshas been updated to be in the correct order the nodes sit on the stringwombat.windfarm.system.subassembly.Subassembly.interrupt_subassembly_processesis nowinterrupt_processesand only interrupts the cable's own maintenance and failure simulation processes.wombat.windfarm.system.system.System.interrupt_all_subassembly_processeswas added so that subassemblies are no longer directly interacting with each other, and the interruptions are caused by the system's themselves.wombat.windfarm.system.system.System.log_actionno returns theSubassembly.idinstead of the__repr__for the object to create a legible log.
0.3.5 (2021-December-9)#
Downtime-based and requests-based unscheduled maintenance models have been added to servicing equipment.
Windfarm.current_availabilityis able to account for multiple substations and is now an accurate calculation of the operating level across the windfarm.Simulation.from_inputs()is replaced bySimulation.from_config()to be more straightforward for users.ServiceCrewhas been added for expansion to multiple crews.Servicing equipment now have separate
travelandcrew_transfer,weather_delay, andrepairfunctions to more realistically simulate the separate processes involved.The windfarm now has a distance matrix to calculate the distance between any two systems onsite, for instance, substation to cable, cable to turbine, etc.
Bug fix in the task completion rate metric.
WombatEnvironment.log_action()enforces the use of keyword arguments with only 3 required inputs.WombatEnvironment.weather_forecast()outputs now include the datetime index.If no PySAM settings are provided, the
financial_modelwill be set toNonewith aNotImplementedErrorbeing raised for any attempted usage of the PySAM powered functionality.Fix bugs in
MaintenanceandFailureinitialization.Fix bugs in operating level accounting from recent updates.
Update the Unicode typing in all docstrings.
Update the documentation to account for all the recent changes, including adding a new demonstration notebook for the 3 new strategies.
0.3.1 (2021-March-2)#
Updated the
simulation/folder to be a single-levelcore/directory.Updates the order of the keyword arguments for
WombatEnvironment.log_action(), and makes all arguments keyword-only arguments.