Skip to content

v1.0.0 Release#31

Open
shousner wants to merge 141 commits intomainfrom
dev
Open

v1.0.0 Release#31
shousner wants to merge 141 commits intomainfrom
dev

Conversation

@shousner
Copy link
Copy Markdown
Contributor

@shousner shousner commented Apr 1, 2026

Purpose

This PR merges the dev branch into main, creating the first stable release of FAD-Toolset (v1.0.0). These notes highlight the major features and capabilities of the toolset, and detail the changes being merged into main.

What is FAD-Toolset?

FAD-Toolset is a Python library and collection of tools for modeling and designing arrays of floating offshore structures. Users can:

  • Model floating arrays with detailed platforms, mooring systems, dynamic and static cables, anchors, topsides, and substations
  • Analyze array behavior considering site-specific conditions like seabed bathymetry, layered soil properties, and geographic boundaries
  • Design and optimize floating array systems through integrated design tools for mooring lines, cables, and array layouts
  • Integrate with open-source tools: RAFT (frequency-domain analysis), MoorPy (mooring/cable analysis), and FLORIS (wake modeling)

Key Capabilities

Core Modeling

  • Object-oriented component classes built on a Node/Edge graph structure
  • Hierarchical project structure combining design information with site-specific data
  • Support for complex mooring configurations including bridles, shared anchors, and shared mooring lines
  • Fairlead objects attached to platforms for precise mooring connection management
  • Topsides representing any structure or system attached to a platform (turbines, substations, etc.)
  • Full YAML-based ontology input/output compatible with the IEA Wind Task 49 Ontology
  • Geographic functions to model site-specific data

Analysis & Design

  • Anchor capacity calculations for multiple types: drilled & grouted, driven, helical, plate, suction, and torpedo
  • Mooring and cable design optimization (LineDesign, CableDesign)
  • Floating array layout optimization with wake-loss-aware AEP calculations (layout.py)
  • Watch circle analysis for platform motion envelopes
  • Mooring lifetime adjustments: marine growth, creep, and corrosion
  • Cost estimation for array components (anchors, moorings, cables)

Visualization

  • 2D and 3D plotting of array layouts including platforms, moorings, cables, anchors, bathymetry, soil types, boundaries, exclusion zones, and platform motion envelopes

Changes from Main (FAModel v0.1.0 → FAD-Toolset v1.0.0)

  • Complete project rebranding from FAModel to FAD-Toolset
  • Modern Python packaging with pyproject.toml
  • Enhanced examples with better organization and new design files
  • Improved documentation throughout
  • Better visualization features (soil type plotting, bathymetry contour lines, plot legends, cable size coloring)
  • Bug fixes across project, mooring, cable, platform, helpers, and layout modules

mattEhall and others added 30 commits July 23, 2025 14:10
commit 0c3ef44
Author: Matt Hall <5151457+mattEhall@users.noreply.github.com>
Date:   Wed Jul 23 11:41:24 2025 -0600

    Removing HAMS BEM files and what causes them:

    - removing examples 03 BEM folder created by RAFT runs.
    - changing RAFT YAML PotMods from True to False to avoid issue in future.

commit 7828a9f
Author: Moreno <fmoreno@nrel.gov>
Date:   Fri Jul 18 09:50:56 2025 -0600

    Depreciated function trapz needs to be reused due to uncompatibility with CI tests

commit 33edd4b
Author: Moreno <fmoreno@nrel.gov>
Date:   Fri Jul 18 09:40:11 2025 -0600

    support_soils linked connected

commit 0941863
Author: Moreno <fmoreno@nrel.gov>
Date:   Fri Jul 18 09:36:12 2025 -0600

    Depreciated function trapz needs to be reused due to uncompatibility with CI tests

commit b4dea97
Author: Moreno <fmoreno@nrel.gov>
Date:   Thu Jul 17 16:16:45 2025 -0600

    Change order of the CI tests: pytest + example_driver.py

commit 30b2ca5
Author: Moreno <fmoreno@nrel.gov>
Date:   Thu Jul 17 15:37:25 2025 -0600

    Changes on the yaml file to include new soil structure

commit 4e0866e
Author: Moreno <fmoreno@nrel.gov>
Date:   Thu Jul 17 11:42:37 2025 -0600

    Removed anchor tension limit exception

commit 7de4650
Author: Moreno <fmoreno@nrel.gov>
Date:   Wed Jul 16 11:26:31 2025 -0600

    Update FAModel_anchors: new anchor scripts, updated RAFT BEM inputs, suction pile improvements

commit 0d75993
Author: Moreno <fmoreno@nrel.gov>
Date:   Tue Jul 8 13:05:36 2025 -0600

    Remove outdated 04_Anchors examples after migrating to 05_Anchors

commit b8dbd3f
Merge: 4383c4c 831d651
Author: Moreno <fmoreno@nrel.gov>
Date:   Tue Jul 8 13:04:43 2025 -0600

    Merge upstream changes; keep local anchor.py, store upstream version as backup

commit 4383c4c
Author: Moreno <fmoreno@nrel.gov>
Date:   Tue Jul 8 12:16:53 2025 -0600

    WIP: Local development progress before merging upstream FAModel

commit 834999b
Author: Moreno <fmoreno@nrel.gov>
Date:   Mon Jun 23 11:15:04 2025 -0600

    Merge upstream/main into FAModel_anchors with local enhancements, including update to capacity_suction.py

commit f149d96
Merge: 6030d1c 12ce2a3
Author: Moreno <fmoreno@nrel.gov>
Date:   Mon Jun 23 11:09:12 2025 -0600

    Merge remote-tracking branch 'upstream/main' into sync/upstream-2025-06-23

commit 6030d1c
Author: Moreno <fmoreno@nrel.gov>
Date:   Mon Jun 23 10:59:03 2025 -0600

    WIP: custom changes before upstream sync

commit 883b024
Author: Moreno <fmoreno@nrel.gov>
Date:   Wed Jun 18 16:30:20 2025 -0600

    Major refactor of anchor module: removed legacy map files, added new anchor types and updated capacities

commit 66e4bc0
Author: Moreno <fmoreno@nrel.gov>
Date:   Fri Jun 13 16:00:51 2025 -0600

    feat: update anchor capacity scripts and add suction example notebook
To start, I created a new "display" variable that can toggle on/off print statements--in anchor.py and capacity function files--to make the output file clear to read
- NOTE: This was only done for suction piles and dandg piles. The display parameter will have to be called from the other anchor type capacity function scripts, which I did not prioritize right now
Second, I ran into problems with anchor.dd['type'] values not being exact strings of 'suction', 'dandg', etc.
- I corrected the type values in my Project on my front-end, but also added a check in Anchor.__init__ to make sure the type values are exactly what they should be
- In makeMoorPyAnchor, it references MoorPy.getPointProps['AnchorProps'], which contain cost information for certain types of anchors. If the anchor type does not exist in getPointProps (e.g., 'dandg'), then it defaults to a suction pile
getSizeAnchor
- Implemented functionality to support safety factors on different components (includes Hm, Vm, and UC right now)
- Updated a lot of if statements to check for the anchType just in case the string is something different but includes the main anchor type name
- Added a constraint function for the design variable bounds, since COBYLA does not recognize bounds
- Moved the code that updated the anchor design dictionary and recalculated the capacity to the first constraint function, since with COBYLA, the constraints are evaluated first, and this led to UC's that didn't correspond
- Added a check to the dandg (and driven/helical) sections to ensure the L/D constraints were being met
- - However, the UC constraints weren't being met; this may require a reevaluation of the methods that we're using for design, since we're not using COBYLA for these anymore
Updated getSizeAnchor2 to work with what I had too

capacity_suction bounds upgrade for design iterations that have a L/D greater than 6
examples/example_anchors.py
- should this file remain?

famodel/anchors/anchor.py
- does this work
- is there unused code to clear out after the merge?

famodel/geography.py
- does this work after the merge?
- may need to update input file directories

tests/test_anchors.py
- merge conflicts left that need resolution
- The original LineDesign committed (yesterday) was not the most recent version of LineDesign
- - Updated to the most recent version (which involved getting rid of an old try/except statement)
- - Adjusted all instances in LineDesign where the Mooring.dd is referenced to use subcomponents instead of sections and connectors (other strategies could have been used to reference what we needed, but I went for the change in indexing strategy)
- Added a new test script for LineDesign changes (only runs 3 very quick DEA-Chain optimizations)
- Needed to fix a parenthesis bug in mooring.py in addCorrosion to reference the subcomponent
- Had to debug and figure out that the specific LineDesign results we have for the tests are based on a specific SciPy version
- - So we needed to install that specific version (which only happened to work with a separate pip install call, rather than appending to the existing conda install in "Exras")
- Also, needed to uninstall the existing moorpy installation to allow for the current dev branch installation
- Updated the np.float parameters in fadsolvers to a current format that numpy v2 can use, just in case
- needed to properly install the current moorpy dev branch
-small fixes to check if MBL is in dictionary before loading so that you can still load mooring types without an MBL
-plot2d add setting for whether to show legend
-get legend handles from ax instead of plt.gca()
- should the node in famodel_base be three-dimensional?
- the way the load function seems to create the fairlead dictionary seems erroneous. I suggested an alternative as a comment. This is how it is done in conceptDesign2.
- the addFairlead updates the fairlead position and reflects the absolute location of fairlead positions 'fl.r' which can be helpful later. Especially when connecting to moorings.
- Update to the  function to make it work with the new base work with the shared lines.
- removing anchors as bodies in the moorpy system before unloading.
- Reorganizing the plotOptimization function to separate design variables from constraints and cost function. It also gives units to different variables and constraints. It is also color-referenced.
- Adding units dictionary for constraints.
- Adding two additional constraints related to the inclination angle of the line.
…ture requires the updates in drawLine2d in subsystem.py in MoorPy to be integrated.

- The user can provide a set value of maximum depth to show the most transparent part of the line. By default, this is set to the water depth. But sometimes, we might be interested in limiting the depth to the first 200m for instance or to show the depth of which it can be affected by marine growth (e.g., -170m). This is added as a variable in kwargs called max_line_depth.
- array reorientation now orients the platforms by using the setPosition function which also rotates the fairleads with the platforms.
- array reset function also uses setPosition to reset the position of the platform along with fairleads attached.
…ater column:

- adding an  option to only plot the line color based on depth for shared lines.
- having option to switch between stacked 'tall' and a grid type. Default is tall.
- having ylabels instead of titles.
- other improvements to make sure there is no overlays between the subplots.
- Added an optional input to update_moorings or not, which, when platform.setPosition is run, will not also rotate the positions of moorings and anchors
- Also updated layout_helpers adjustSS4Pretension function to better work with Project Moorings rather than project.ms. subsystems
A new feature to enable plot2d to show the line depth in 2D.
Reorganizing the plotOptimization function to
This pull request enhances the LineDesign class by adding unit tracking for design variables and constraints, introducing new angle constraints, and improving the plotting of optimization results. The changes improve clarity, traceability, and usability for both developers and users working with mooring line design optimization.

Units tracking and assignment

Added allVarsUnits to track units for each design variable, and X0Units to associate units with the active design variables. This ensures that units are consistently available throughout the optimization process. [1] [2]
Implemented a dictionary (conUnitsDict) to assign units to each constraint, and updated the constraints dictionary to include these units. An exception is raised if a constraint name is not recognized.
New constraints

Added two new constraint functions: con_min_angle and con_max_angle, enforcing minimum and maximum inclination angles for line sections. These are now available for use in optimization. [1] [2]
Plotting improvements

Refactored and enhanced the plotOptimization method to support both "tall" and "grid" layouts, display units for design variables and constraints, and allow returning the figure and axes for further customization.
erickaloz and others added 27 commits February 18, 2026 09:58
-update plot3d to input maxcableSize (useful when plotting multiple arrays and want consistent cable legends)
-edit to FFarmcCompatibleMDOutput so that factor list is defaulted. works with updated MoorPy lengthAwareSegmentation
- Corrected a couple !include directories for examples.
- Removed old fadesign dependencies in layout.py.
- Put some input files I could find into famodel/design/layoutdemo
  to make the main script in layout.py run. Could use some work to
  make it a good example.
- Put a temporary edited copy of some code at the bottom of helpers.py
  as a start for yaml-based mooring config input for layout.py. WIP.
- Added a few notes about dependencies/installation in the main readme.
-fixed grid_positions so that dummy points are added when there are less turbines than self.nt
-updates to layout demo files for matching wind rose, soil, and bathymetry for the gulf of maine
-added legend labels for static/dynamic cables and moorings in plot3d
-relies on a moorpy subsystem drawLine recent update
-- fixed unload bug that made a new platform type for each platform.
-- removed some unnecessary code & simplified mooring.addMooring & updated comments
-- Fixed symmetric mooring load in. Now, symmetric mooring lines have a flag added in the design dict and mooring.mirror() is called to mirror the symmetric part
-- cleaned up yaml input for shared moorings example
-- fix issue in mooring.fairleads identified by Jun Tanemoto
-- reorganized examples folder to be cleaner and clearer
	- all examples except for example_driver.py are now in folders
	- added cost analysis example
	- updated some folder numbers
	- added common_inputs folder to store inputs used across different examples
	- updated yaml references to inputs in example yamls
- updated mooring platform and project readmes to be clearer (with some help from AI Claude)
- small project class cable naming update and a few assorted tiny adjustments.
- mooring.mirror() call in initialization of mooring class bug identified by Jun Tanemoto is now fixed
- removed unused docs folder
- deleted unused example inputs
Added the BSD 3-Clause License to the project.
- Added a new pyproject.toml file for better python practices
- - has a list of dependencies similar to the famodel-env.yaml (soon to be renamed)
- - these get installed when you run 'pip install -e .' from the root directory of FAD-Toolset
- famodel-env.yaml reworked to use the right dependency packages too
- - specifies which packages are installed from conda and which ones are from pip
- Deleted the old setup.py file (deprecated)
- Rewrote the installation steps in the README for this new setup structure
- Organized the CI_FAModel.yml file
- Mostly ensuring that the absolute file path gets created and can be used for any user in the example scripts
- also replacing matplotlib.cm as its becoming deprecated in later matplotlib versions
- Updates to come later to work in other python (and dependency) versions
-- small layout.py fix to work with previous mooringAdjust update that allows multiple line sections to be adjusted for depth
-- small project fix to allow read-in and write-out of exclusion zones to & from ontology files
	- also removed fake exclusion zones from examples & test ontologies to prevent confusion
-- added layout example to examples/06_Design folder
	- includes adjusting mooring and 3D cable design for bathymetry and adjusting cable routing
- rewritting all instances of MoorSolve imports, since it had been re-written into the fadsolvers file -> which is where all the dsolve2 and dopt2 functions sit
- - Note that MoorPy has its own versions of these functions, which should do the same thing, but are written somewhere else, so we may want to combine at some point
- and renaming Leah's layout example files to help with the file numbers
- 3 LineDesign example files: a simple case, one that changes the design modes, and one that changes the initial conditions for COBYLA
- See NOTES on 03 file: LineDesign is largely untested since summer 2025.
- starting to rename things FAD or FAD-Toolset instead of FAModel
- - conda environment yaml
- - pyproject.toml project name is 'fad-toolset', which will be reflected in pip installability
- CI_FAModel to CI_FAD
- a couple of minor changes to the README to help communicate these changes
- Preserves git history through the 'git mv famodel fad' command
(and seeing if the GitHub CI passes)

- includes main source code, example files, and test files
- I have no other way of determining whether GitHub Actions CI passes other than pushing to the remote repository
- now can work with the functions in fadsolvers rather than the old msolve functions
@mattEhall
Copy link
Copy Markdown
Contributor

@lsirkis, the updated examples look quite comprehensive! Given that, would it make sense to delete the layoutdemo folder I had made (and the main script portion at the bottom of layout.py)?

@lsirkis
Copy link
Copy Markdown
Collaborator

lsirkis commented Apr 3, 2026 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants