Skip to content

Commit

Permalink
Use FLORIS tools for layout visualizations (#181)
Browse files Browse the repository at this point in the history
  • Loading branch information
misi9170 committed Apr 9, 2024
1 parent f797621 commit 5e57547
Show file tree
Hide file tree
Showing 17 changed files with 172 additions and 642 deletions.
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
import floris.layout_visualization as layoutviz
import matplotlib.pyplot as plt
import numpy as np

from flasc.utilities.utilities_examples import load_floris_artificial as load_floris
from flasc.visualization import (
plot_floris_layout,
plot_layout_only,
plot_layout_with_waking_directions,
shade_region,
)

# Example demonstrates some methods for visualizing the layout of the farm
# represented within the FLORIS interface
Expand All @@ -21,42 +16,59 @@
# Defines alternative names for each turbine with 1-index
turbine_names = ["Turbine-%d" % (t + 1) for t in range(len(fm.layout_x))]

# Plot using default 0-indexed labels (includes power/thrust curve)
plot_floris_layout(fm, plot_terrain=False)
# Plot the basic farm layout
ax = layoutviz.plot_turbine_points(fm, plotting_dict={"color": "g"})
layoutviz.plot_turbine_labels(fm, ax=ax, turbine_names=turbine_names)
ax.grid()
ax.set_xlabel("x coordinate [m]")
ax.set_ylabel("y coordinate [m]")

# Plot using default given 1-indexed labels (includes power/thrust curve)
plot_floris_layout(fm, plot_terrain=False, turbine_names=turbine_names)

# Plot only the layout with default options
plot_layout_only(fm)

# Plot only the layout with custom options
plot_layout_only(fm, {"turbine_names": turbine_names, "color": "g"})

# Plot layout with wake directions and inter-turbine distances labeled
plot_layout_with_waking_directions(fm)

# Plot layout with wake directions and inter-turbine distances labeled
# (using custom options)
plot_layout_with_waking_directions(
# Plot using the default names and show the wake directions
turbines_to_plot = range(2, len(fm.layout_x))
ax = layoutviz.plot_turbine_points(fm, turbine_indices=turbines_to_plot)
layoutviz.plot_turbine_labels(
fm, ax=ax, turbine_indices=turbines_to_plot, turbine_names=turbine_names
)
layoutviz.plot_waking_directions(
fm,
limit_num=3, # limit to 3 lines per turbine
layout_plotting_dict={
"turbine_names": turbine_names,
"turbine_indices": range(2, len(fm.layout_x)),
},
ax=ax,
limit_num=3,
wake_plotting_dict={"color": "r"},
turbine_indices=turbines_to_plot,
)
ax.grid()
ax.set_xlabel("x coordinate [m]")
ax.set_ylabel("y coordinate [m]")

# Demonstrate shading of an arbitrary region
points_for_demo = np.array([[600, 0], [1400, 0], [1200, 1000]])
ax = plot_layout_only(fm)
shade_region(
ax = layoutviz.plot_turbine_points(fm)
layoutviz.plot_turbine_labels(fm, ax=ax, turbine_names=turbine_names)
layoutviz.shade_region(
points_for_demo,
show_points=True,
plotting_dict_region={"color": "blue", "label": "Example region"},
plotting_dict_points={"color": "blue", "marker": "+", "s": 50},
ax=ax,
)
ax.grid()
ax.set_xlabel("x coordinate [m]")
ax.set_ylabel("y coordinate [m]")

# Turbine data
fig, ax = plt.subplots(2, 1)
ax[0].plot(
fm.core.farm.turbine_map[0].power_thrust_table["wind_speed"],
fm.core.farm.turbine_map[0].power_thrust_table["power"],
)
ax[1].plot(
fm.core.farm.turbine_map[0].power_thrust_table["wind_speed"],
fm.core.farm.turbine_map[0].power_thrust_table["thrust_coefficient"],
)
ax[1].set_xlabel("Wind Speed [m/s]")
ax[1].set_ylabel("Thrust coefficient [-]")
ax[0].set_ylabel("Power [kW]")
ax[0].grid()
ax[1].grid()

plt.show()
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# Copyright 2022 NREL & Shell
import floris.layout_visualization as layoutviz
import matplotlib.pyplot as plt
from floris.flow_visualization import visualize_cut_plane

from flasc.utilities.utilities_examples import load_floris_artificial as load_floris
from flasc.visualization import plot_floris_layout

if __name__ == "__main__":
# User settings
Expand All @@ -26,7 +26,11 @@
wind_speeds=[wind_speed],
turbulence_intensities=[turbulence_intensity],
)
plot_floris_layout(fm, plot_terrain=False)
ax = layoutviz.plot_turbine_points(fm)
ax.grid()
ax.set_xlabel("x coordinate [m]")
ax.set_ylabel("y coordinate [m]")
ax.set_title("Turbine layout")

# Generate baseline flowfield
print("Calculating flowfield...")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import floris.layout_visualization as layoutviz
import matplotlib.pyplot as plt
import numpy as np

from flasc import visualization as fsaviz
from flasc.utilities import floris_tools as fsatools
from flasc.utilities.utilities_examples import load_floris_artificial as load_floris

Expand All @@ -19,7 +19,11 @@
fm, _ = load_floris()

# Plot the layout of the farm for reference
fsaviz.plot_layout_only(fm)
ax = layoutviz.plot_turbine_points(fm)
layoutviz.plot_turbine_labels(fm, ax=ax)
ax.grid()
ax.set_xlabel("x coordinate [m]")
ax.set_ylabel("y coordinate [m]")

# Get the dependencies of turbine 2
check_directions = np.arange(0, 360.0, 2.0)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import floris.layout_visualization as layoutviz
import numpy as np
from _local_helper_functions import evaluate_optimal_yaw_angles, optimize_yaw_angles
from matplotlib import pyplot as plt

from flasc.utilities.lookup_table_tools import get_yaw_angles_interpolant
from flasc.utilities.utilities_examples import load_floris_artificial as load_floris
from flasc.visualization import plot_floris_layout, plot_layout_with_waking_directions
from flasc.yaw_optimizer_visualization import (
plot_offsets_wd,
plot_offsets_wswd_heatmap,
Expand All @@ -14,8 +14,9 @@
if __name__ == "__main__":
# Load FLORIS model and plot layout (and additional information)
fm, _ = load_floris()
plot_floris_layout(fm)
plot_layout_with_waking_directions(fm, limit_dist_D=5, limit_num=3)
ax = layoutviz.plot_turbine_points(fm)
layoutviz.plot_turbine_labels(fm, ax=ax)
layoutviz.plot_waking_directions(fm, ax=ax, limit_dist_D=5, limit_num=3)

# Compare optimizing over all wind speeds vs. optimizing over a single wind speed
AEP_baseline_array = []
Expand Down

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import os

import floris.layout_visualization as layoutviz
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
Expand All @@ -10,7 +11,6 @@
from flasc.analysis.energy_ratio_input import EnergyRatioInput
from flasc.data_processing import dataframe_manipulations as dfm
from flasc.utilities.utilities_examples import load_floris_artificial as load_floris
from flasc.visualization import plot_floris_layout


def load_data():
Expand Down Expand Up @@ -169,7 +169,11 @@ def plot_energy_ratios(turbine_array, results_energy_ratio, ax=None, label=None)
ax = plot_energy_ratios(turbine_array, results_energy_ratio)

# Also plot wake situation according to FLORIS
plot_floris_layout(fm, plot_terrain=False)
ax = layoutviz.plot_turbine_points(fm)
layoutviz.plot_turbine_labels(fm, ax=ax)
ax.grid()
ax.set_xlabel("x coordinate [m]")
ax.set_ylabel("y coordinate [m]")

fig, ax = plt.subplots()
fm.set(wind_directions=[wd], wind_speeds=[10.0])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
from flasc.analysis.energy_ratio_heterogeneity_mapper import heterogeneity_mapper
from flasc.data_processing import dataframe_manipulations as dfm
from flasc.utilities import floris_tools as ftools

# from flasc.visualization import plot_floris_layout
from flasc.utilities.utilities_examples import load_floris_artificial as load_floris


Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import floris.layout_visualization as layoutviz
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
Expand All @@ -6,7 +7,7 @@
from flasc.analysis import energy_ratio as er
from flasc.analysis.energy_ratio_input import EnergyRatioInput
from flasc.utilities.utilities_examples import load_floris_artificial as load_floris
from flasc.visualization import plot_binned_mean_and_ci, plot_layout_with_waking_directions
from flasc.visualization import plot_binned_mean_and_ci

if __name__ == "__main__":
# Construct a simple 3-turbine wind farm with a
Expand All @@ -19,7 +20,12 @@
fm.set(layout_x=[0, 0, 5 * 126], layout_y=[5 * 126, 0, 0])

# Show the wind farm
plot_layout_with_waking_directions(fm)
ax = layoutviz.plot_turbine_points(fm)
layoutviz.plot_turbine_labels(fm, ax=ax)
layoutviz.plot_waking_directions(fm, ax=ax)
ax.grid()
ax.set_xlabel("x coordinate [m]")
ax.set_ylabel("y coordinate [m]")

# Create a time history of points where the wind speed and wind
# direction step different combinations
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import floris.layout_visualization as layoutviz
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

from flasc.analysis import total_uplift as tup
from flasc.analysis.energy_ratio_input import EnergyRatioInput
from flasc.utilities.utilities_examples import load_floris_artificial as load_floris
from flasc.visualization import plot_binned_mean_and_ci, plot_layout_with_waking_directions
from flasc.visualization import plot_binned_mean_and_ci

if __name__ == "__main__":
# Generate the data as in example 05_wake_steering_example.py
Expand All @@ -20,7 +21,12 @@
fm.set(layout_x=[0, 0, 5 * 126], layout_y=[5 * 126, 0, 0])

# Show the wind farm
plot_layout_with_waking_directions(fm)
ax = layoutviz.plot_turbine_points(fm)
layoutviz.plot_turbine_labels(fm, ax=ax)
layoutviz.plot_waking_directions(fm, ax=ax)
ax.grid()
ax.set_xlabel("x coordinate [m]")
ax.set_ylabel("y coordinate [m]")

# Create a time history of points where the wind speed and wind
# direction step different combinations
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,7 @@
import numpy as np
import pandas as pd

from flasc.model_estimation.floris_sensitivity_analysis import (
floris_sobol_analysis,
)
from flasc.model_estimation.floris_sensitivity_analysis import floris_sobol_analysis


def _save_pickle(dict_in, fn):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@
from floris.utilities import wrap_360

from flasc.analysis import energy_ratio_suite
from flasc.data_processing import (
dataframe_manipulations as dfm,
)
from flasc.data_processing import dataframe_manipulations as dfm
from flasc.utilities import floris_tools as fsatools
from flasc.utilities.utilities_examples import load_floris_artificial as load_floris

Expand Down
72 changes: 42 additions & 30 deletions examples_smarteole/00_inspect_floris_model.ipynb

Large diffs are not rendered by default.

15 changes: 9 additions & 6 deletions flasc/utilities/utilities_examples.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@
from pathlib import Path
from time import perf_counter as timerpc

import floris.layout_visualization as layoutviz
import matplotlib.pyplot as plt
import numpy as np
from floris import FlorisModel, UncertainFlorisModel

from flasc.visualization import plot_floris_layout


def load_floris_smarteole(wake_model="gch", wd_std=0.0):
"""Load a FlorisModel object for the wind farm at hand.
Expand Down Expand Up @@ -114,14 +113,18 @@ def load_floris_artificial(wake_model="gch", wd_std=0.0, cosine_exponent=None):
if __name__ == "__main__":
# Load and time the artificial FLORIS model
t0 = timerpc()
fi, turbine_weights = load_floris_artificial()
fm, turbine_weights = load_floris_artificial()
print("Time spent to load the FLORIS model (artificial): {:.2f} s.".format(timerpc() - t0))
plot_floris_layout(fi, plot_terrain=False)
ax = layoutviz.plot_turbine_points(fm)
layoutviz.plot_turbine_labels(fm, ax=ax)
ax.grid()

# Load and time the Smarteole FLORIS model
t0 = timerpc()
fi, turbine_weights = load_floris_smarteole()
fm, turbine_weights = load_floris_smarteole()
print("Time spent to load the FLORIS model (smarteole): {:.2f} s.".format(timerpc() - t0))
plot_floris_layout(fi, plot_terrain=False)
ax = layoutviz.plot_turbine_points(fm)
layoutviz.plot_turbine_labels(fm, ax=ax)
ax.grid()

plt.show()
Loading

0 comments on commit 5e57547

Please sign in to comment.