Software Attributes#

The sections here tabulate the software attribute database. Each attribute (column) is described in the Attribute Schema. Some columns contain lists of strings which means that they cannot be fully sorted. Instead, they can be filtered by searching for a string in the search box

Hide code cell content

from pathlib import Path
import yaml
from itables import init_notebook_mode
import pandas as pd

init_notebook_mode(all_interactive=True)

software_attr_dir = Path("..", "..", "software_attributes")
model_list_inputs = yaml.safe_load( open(software_attr_dir / "database_list.yaml", "r") )
models = model_list_inputs["active"]

model_attributes_map = {
    model: yaml.safe_load( open(Path("..", "..", "software_attributes", "database", f"{model}.yaml"), "r") )
    for model in models
}

df = pd.DataFrame.from_dict(model_attributes_map, orient="index")
# print(list(df.columns))
# print(df)

General#

Hide code cell source

# Get all columns that begin with "does_"
does_columns = [col for col in df.columns if col.startswith("does_")]

# Make a list of all the "does_" columns that are True for each row dropping the "does_" prefix
# Add this to the dataframe
for i, row in df.iterrows():
    does_list = [col.replace("does_", "") for col in does_columns if row[col]]
    # print(f"{i}: {does_list}")
    df.at[i, "does"] = does_list

general_df = df[[
    "does",
    "programming_language",
    "license_type",
    "data_collection_methods",
    "last_release_date"
]]
general_df
ⓘ does programming_language license_type data_collection_methods last_release_date
amr-wind[simulation]c++bsd-3-clause[modeling]TODO
dw_tap[data_analysis, design_optimization]pythongpl-3.0[field, modeling]2023-09-05
dwind[data_analysis]pythongpl-3.0[modeling]2023-09-05
erf[simulation]c++NaN[modeling]2023-06-30
fastfarm[controls, simulation, loads]fortranapache-2.0[modeling]2023-05-16
flasc[data_analysis]pythonapache-2.0[modeling, field]NaN
floris[controls, design_optimization, simulation]pythonapache-2.0[modeling]2023-07-27
hercules[simulation, loads]pythonapache-2.0[modeling]NaN
hopp[controls, costs, design, design_optimization, simulation]pythonbsd-3-clause[modeling]2021-04-30
kynema[simulation, loads]c++mit[modeling]TODO
(17 more rows not shown)

Turbine Modeling#

Hide code cell source

turbine_df = df[[
    "scope",
    "system_location",
    "time_domain",
    "turbine_model",
    "does_loads",
    "does_design_optimization",
    "does_costs",
]]
turbine_df = turbine_df[ pd.DataFrame( turbine_df["scope"].tolist() ).isin( ["turbine", "any"] ).any(axis=1).values ]
turbine_df
ⓘ scope system_location time_domain turbine_model does_loads does_design_optimization does_costs
amr-wind[turbine, farm, atmosphere][any]dynamic[actuator, geometry_resolved]FalseFalseFalse
dw_tap[turbine, farm][land]dynamic[N/A]FalseTrueFalse
dwind[turbine, farm, system][land]dynamic[multibody_bem]FalseFalseFalse
fastfarm[farm, turbine, atmosphere][any]dynamic[multibody_bem, vortex_method]TrueFalseFalse
flasc[turbine, farm, system][any]steady[lookup_table, SCADA]FalseFalseFalse
floris[turbine, farm, system, atmosphere][any]steady[lookup_table]FalseTrueFalse
hercules[turbine, farm, atmosphere][any]dynamic[actuator]TrueFalseFalse
kynema[turbine][any]dynamic[multibody_bem]TrueFalseFalse
landbosse[turbine, system][any]steady[lookup_table, regression]FalseTrueTrue
nalu-wind[turbine, farm][any]dynamic[actuator, geometry_resolved]TrueFalseFalse
(13 more rows not shown)

Farm Modeling#

Hide code cell source

farm_df = df[[
    "scope",
    "system_location",
    "time_domain",
    "turbine_model",
    "wake_model",
    "does_loads",
    "does_design_optimization",
    "does_costs",
]]
farm_df = farm_df[ pd.DataFrame( farm_df["scope"].tolist() ).isin( ["farm", "any"] ).any(axis=1).values ]
farm_df.dropna()
ⓘ scope system_location time_domain turbine_model wake_model does_loads does_design_optimization does_costs
amr-wind[turbine, farm, atmosphere][any]dynamic[actuator, geometry_resolved][navier_stokes]FalseFalseFalse
dw_tap[turbine, farm][land]dynamic[N/A][N/A]FalseTrueFalse
dwind[turbine, farm, system][land]dynamic[multibody_bem][N/A]FalseFalseFalse
fastfarm[farm, turbine, atmosphere][any]dynamic[multibody_bem, vortex_method][dynamic_meandering, vortex_method]TrueFalseFalse
flasc[turbine, farm, system][any]steady[lookup_table, SCADA][analytical]FalseFalseFalse
floris[turbine, farm, system, atmosphere][any]steady[lookup_table][analytical]FalseTrueFalse
hercules[turbine, farm, atmosphere][any]dynamic[actuator][navier_stokes]TrueFalseFalse
hopp[farm, system][any]dynamic[regression, lookup_table, multibody_bem][analytical]FalseTrueTrue
moorpy[farm, system][floating_offshore][frequency][N/A][N/A]TrueFalseFalse
nalu-wind[turbine, farm][any]dynamic[actuator, geometry_resolved][navier_stokes]TrueFalseFalse
(6 more rows not shown)

Cost Modeling#

Hide code cell source

cost_df = df[[
    "scope",
    "system_location",
    "does_design_optimization",
    "does_costs",
    "tags",
]]
cost_df = cost_df[ cost_df["does_costs"] == True]
cost_df.dropna()
ⓘ scope system_location does_design_optimization does_costs tags
hopp[farm, system][any]TrueTrue[hybrid optimization performance platform, hybrid energy system design, renewable energy policy analysis, system sizing, system cost]
landbosse[turbine, system][any]TrueTrue[balance of station, balance of plant, onshore, land-based, logistics, assembly, installation, lcoe]
orbit[turbine, system][any]TrueTrue[balance of station, balance of plant, fixed bottom, floating, logistics, assembly, installation, lcoe]
weis[turbine][any]TrueTrue[mid-fidelity engineering models, multidisciplinary design optimization, controls co-design]
wisdem[turbine, system][any]TrueTrue[low-fidelity conceptual models, multidisciplinary design optimization]
wombat[turbine, farm, system][any]FalseTrue[operations and maintenance, discrete event simulation]

Full Suite Modeling Comparison#

Hide code cell source

modeling_df = df[[
    "scope",
    "system_location",
    "time_domain",
    "turbine_model",
    "wake_model",
    "does_controls",
    "does_costs",
    "does_data_analysis",
    "does_design",
    "does_design_optimization",
    "does_simulation",
    "does_loads",
    "tags",
]]
modeling_df
ⓘ scope system_location time_domain turbine_model wake_model does_controls does_costs does_data_analysis does_design does_design_optimization does_simulation does_loads tags
amr-wind[turbine, farm, atmosphere][any]dynamic[actuator, geometry_resolved][navier_stokes]FalseFalseFalseFalseFalseTrueFalse[adaptive mesh refinement, massively parallel, block-structured adaptive-mesh, incompressible flow, actuator disk, actuator line, large eddy simulation, les]
dw_tap[turbine, farm][land]dynamic[N/A][N/A]FalseFalseTrueFalseTrueFalseFalse[distributed wind, obstacle modeling, atmospheric modeling, resource estimation, turbing siting]
dwind[turbine, farm, system][land]dynamic[multibody_bem][N/A]FalseFalseTrueFalseFalseFalseFalse[distributed wind, distributed futures, technical potential, annualized energy productivity]
erf[atmosphere][any]dynamic[momentum_sink, actuator][navier_stokes]FalseFalseFalseFalseFalseTrueFalse[adaptive mesh refinement, massively parallel, block-structured adaptive-mesh, moist compressible flow, precipitation, microphysics scheme, planetary boundary layer scheme, real meteorological data initial/boundary conditions]
fastfarm[farm, turbine, atmosphere][any]dynamic[multibody_bem, vortex_method][dynamic_meandering, vortex_method]TrueFalseFalseFalseFalseTrueTrue[dynamic wake meandering, polar wake, curled wake, wake-added turbulence]
flasc[turbine, farm, system][any]steady[lookup_table, SCADA][analytical]FalseFalseTrueFalseFalseFalseFalse[steady state analytical engineering models, scada data analysis, filtering, estimation, wind farm visualization, fault detection]
floris[turbine, farm, system, atmosphere][any]steady[lookup_table][analytical]TrueFalseFalseFalseTrueTrueFalse[steady state, analytical wake model, gaussian wake, engineering model]
hercules[turbine, farm, atmosphere][any]dynamic[actuator][navier_stokes]FalseFalseFalseFalseFalseTrueTrue[amr-wind, large eddy simulation, wind farm flow control]
hopp[farm, system][any]dynamic[regression, lookup_table, multibody_bem][analytical]TrueTrueFalseTrueTrueTrueFalse[hybrid optimization performance platform, hybrid energy system design, renewable energy policy analysis, system sizing, system cost]
kynema[turbine][any]dynamic[multibody_bem][N/A]FalseFalseFalseFalseFalseTrueTrue[geometrically exact beam theory, nonlinear finite elements, GPU, CUDA]
(17 more rows not shown)

Distribution#

Hide code cell source

distribution_df = df[[
    "supported_platforms",
    "package_manager",
    "package_manager_url",
    "installation_complexity",
]]
distribution_df
ⓘ supported_platforms package_manager package_manager_url installation_complexity
amr-wind[any][spack_manager]NaN6.0
dw_tap[any]NaNNaN5.0
dwind[any]NaNNaN8.0
erf[any]NaNNaNNaN
fastfarm[any][homebrew, conda-forge][https://formulae.brew.sh/formula/openfast, https://anaconda.org/conda-forge/openfast]3.0
flasc[any][pypi][https://PyPI.org/project/flasc]1.0
floris[any][pypi, conda-forge][https://PyPI.org/project/FLORIS/, https://anaconda.org/conda-forge/floris]1.0
hercules[macos]NaNNaNNaN
hopp[any][pypi][https://PyPI.org/project/HOPP/]2.0
kynema[any]NaNNaN4.0
(17 more rows not shown)

Documentation#

Hide code cell source

documentation_df = df[[
    "documentation_url",
    "has_user_docs",
    "has_developer_docs",
    "has_api_docs",
    "has_cli_docs",
    "has_installation_docs",
    "has_getting_started_docs",
    "has_examples_tutorials",
    "has_design_intent_statement",
    "readability",
    "project_coverage",
]]
documentation_df
ⓘ documentation_url has_user_docs has_developer_docs has_api_docs has_cli_docs has_installation_docs has_getting_started_docs has_examples_tutorials has_design_intent_statement readability project_coverage
amr-windhttps://exawind.github.io/amr-wind/TrueTrueTrueNaNTrueNaNNaNNaNNaNNaN
dw_taphttps://dw-tap.nlr.govTrueTrueTrueFalseTrueFalseFalseFalse4.05.0
dwindNaNFalseFalseFalseFalseTrueFalseFalseFalse2.02.0
erfhttps://erf.readthedocs.ioTrueTrueTrueNaNTrueTrueNaNTrueNaN9.0
fastfarmhttps://openfast.readthedocs.ioTrueTrueTrueTrueTrueFalseFalseTrue5.05.0
flaschttps://flasc.readthedocs.io/en/latest/TrueFalseFalseFalseTrueTrueTrueFalse6.06.0
florishttps://natlabrockies.github.io/floris/intro.htmlTrueTrueTrueFalseTrueTrueTrueTrue7.08.0
herculesNaNFalseFalseFalseFalseFalseFalseFalseFalseNaNNaN
hopphttps://hopp.readthedocs.io/en/latest/TrueFalseFalseFalseTrueFalseFalseFalse5.05.0
kynemahttps://kynema.github.io/kynema/FalseTrueFalseFalseTrueFalseFalseTrue6.01.0
(17 more rows not shown)

Testing#

Hide code cell source

testing_df = df[[
    "testing_framework",
    "continuous_testing",
    "test_coverage",
    "test_documentation",
    "performance_tests",
]]
testing_df
ⓘ testing_framework continuous_testing test_coverage test_documentation performance_tests
amr-windFalseTrueNaNTrueNaN
dw_tapFalseFalse0.0FalseFalse
dwindFalseFalse0.0FalseFalse
erfTrueTrueNaNNaNNaN
fastfarmTrueTrue20.0FalseFalse
flascTrueTrue50.0FalseFalse
florisTrueTrue20.0FalseFalse
herculesFalseFalseNaNFalseFalse
hoppTrueTrue50.0FalseFalse
kynemaTrueTrue40.0FalseFalse
(17 more rows not shown)

Interfaces#

Hide code cell source

interfaces_df = df[[
    "first_class_ui",
    "has_cli",
    "language_interfaces",
    "feature_accessibility",
]]
interfaces_df
ⓘ first_class_ui has_cli language_interfaces feature_accessibility
amr-wind[input_files]FalseNaNNaN
dw_tap[library_interface]False[python]20.0
dwind[library_interface]False[python]NaN
erf[input_files]NaNNaNNaN
fastfarm[input_files]TrueNaN100.0
flasc[input_files]FalseNaN100.0
floris[input_files]FalseNaN100.0
hercules[web]FalseNaNNaN
hopp[input_files]FalseNaN40.0
kynemaNaNNaNNaNNaN
(17 more rows not shown)

Input / Output#

Hide code cell source

io_df = df[[
    "filetypes",
    "file_structure_stability",
]]
io_df
ⓘ filetypes file_structure_stability
amr-windNaNNaN
dw_tap[json, csv, custom]in_development
dwind[custom]in_development
erf[custom]stable
fastfarm[custom]semantic_versioning
flasc[yaml]semantic_versioning
floris[yaml]semantic_versioning
herculesNaNNaN
hopp[yaml]in_development
kynemaNaNNaN
(17 more rows not shown)