Skip to content

Commit

Permalink
Port over from benchmark2
Browse files Browse the repository at this point in the history
  • Loading branch information
paulf81 committed Feb 6, 2025
1 parent fd0e599 commit 0c96135
Show file tree
Hide file tree
Showing 4 changed files with 284 additions and 0 deletions.
51 changes: 51 additions & 0 deletions .github/workflows/benchmark.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: Floris Benchmark
# on:

on:
schedule:
- cron: '0 3 * * *' # Runs daily at 3am UTC
push:
branches:
- main
pull_request:
branches:
- main
workflow_dispatch: # Allows manual triggering of the workflow


permissions:
# deployments permission to deploy GitHub pages website
deployments: write
# contents permission to update benchmark contents in gh-pages branch
contents: write

jobs:
benchmark:
name: Run FLORIS benchmarks
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.13"]
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install project
run: |
python -m pip install --upgrade pip
pip install -e ".[develop]"
- name: Run benchmark
run: |
cd benchmarks
pytest bench.py --benchmark-json output.json
- name: Store benchmark result
uses: benchmark-action/github-action-benchmark@v1
with:
name: Python Benchmark with pytest-benchmark
tool: 'pytest'
output-file-path: benchmarks/output.json
# Use personal access token instead of GITHUB_TOKEN due to https://github.community/t/github-action-not-triggering-gh-pages-upon-push/16096
github-token: ${{ secrets.GITHUB_TOKEN }}
auto-push: true
142 changes: 142 additions & 0 deletions benchmarks/bench.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
from pathlib import Path

import numpy as np
import pytest

from floris import (
FlorisModel,
TimeSeries,
)
from floris.core.turbine.operation_models import POWER_SETPOINT_DEFAULT
from floris.heterogeneous_map import HeterogeneousMap


TEST_DATA = Path(__file__).resolve().parent / "data"
YAML_INPUT = TEST_DATA / "input_full.yaml"

N = 100


def test_benchmark_set(benchmark):
fmodel = FlorisModel(configuration=YAML_INPUT)
wind_directions = np.linspace(0, 360, N)
wind_speeds = np.ones(N) * 8
turbulence_intensities = np.ones(N) * 0.06

benchmark(
fmodel.set,
wind_directions=wind_directions,
wind_speeds=wind_speeds,
turbulence_intensities=turbulence_intensities,
)


def test_benchmark_run(benchmark):
fmodel = FlorisModel(configuration=YAML_INPUT)
wind_directions = np.linspace(0, 360, N)
wind_speeds = np.ones(N) * 8
turbulence_intensities = np.ones(N) * 0.06

fmodel.set(
wind_directions=wind_directions,
wind_speeds=wind_speeds,
turbulence_intensities=turbulence_intensities,
)

benchmark(fmodel.run)


def test_benchmark_100_turbine_run(benchmark):
fmodel = FlorisModel(configuration=YAML_INPUT)
wind_directions = np.linspace(0, 360, N)
wind_speeds = np.ones(N) * 8
turbulence_intensities = np.ones(N) * 0.06

fmodel.set(
wind_directions=wind_directions,
wind_speeds=wind_speeds,
turbulence_intensities=turbulence_intensities,
layout_x=np.linspace(0, 1000, 100),
layout_y=np.linspace(0, 1000, 100),
)

benchmark(fmodel.run)


def test_benchmark_het_set(benchmark):
# Define a 2D het map and confirm the results are as expected
# when applied to FLORIS

# The side of the flow which is accelerated reverses for east versus west
het_map = HeterogeneousMap(
x=np.array([0.0, 0.0, 500.0, 500.0]),
y=np.array([0.0, 500.0, 0.0, 500.0]),
speed_multipliers=np.array(
[
[1.0, 2.0, 1.0, 2.0], # Top accelerated
[2.0, 1.0, 2.0, 1.0], # Bottom accelerated
]
),
wind_directions=np.array([270.0, 90.0]),
wind_speeds=np.array([8.0, 8.0]),
)

# Get the FLORIS model
fmodel = FlorisModel(configuration=YAML_INPUT)

time_series = TimeSeries(
wind_directions=np.linspace(0, 360, N),
wind_speeds=8.0,
turbulence_intensities=0.06,
heterogeneous_map=het_map,
)

# Set the model to a turbines perpinducluar to
# east/west flow with 0 turbine closer to bottom and
# turbine 1 closer to top
benchmark(
fmodel.set,
wind_data=time_series,
layout_x=[250.0, 250.0],
layout_y=[100.0, 400.0],
)


def test_benchmark_het_run(benchmark):
# Define a 2D het map and confirm the results are as expected
# when applied to FLORIS

# The side of the flow which is accelerated reverses for east versus west
het_map = HeterogeneousMap(
x=np.array([0.0, 0.0, 500.0, 500.0]),
y=np.array([0.0, 500.0, 0.0, 500.0]),
speed_multipliers=np.array(
[
[1.0, 2.0, 1.0, 2.0], # Top accelerated
[2.0, 1.0, 2.0, 1.0], # Bottom accelerated
]
),
wind_directions=np.array([270.0, 90.0]),
wind_speeds=np.array([8.0, 8.0]),
)

# Get the FLORIS model
fmodel = FlorisModel(configuration=YAML_INPUT)

time_series = TimeSeries(
wind_directions=np.linspace(0, 360, N),
wind_speeds=8.0,
turbulence_intensities=0.06,
heterogeneous_map=het_map,
)

# Set the model to a turbines perpinducluar to
# east/west flow with 0 turbine closer to bottom and
# turbine 1 closer to top
fmodel.set(
wind_data=time_series,
layout_x=[250.0, 250.0],
layout_y=[100.0, 400.0],
)

benchmark(fmodel.run)
90 changes: 90 additions & 0 deletions benchmarks/data/input_full.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@

name: test_input
description: Single turbine for testing
floris_version: v4

logging:
console:
enable: false
level: WARNING
file:
enable: false
level: WARNING

solver:
type: turbine_grid
turbine_grid_points: 3

farm:
layout_x:
- 0.0
layout_y:
- 0.0
turbine_type:
- nrel_5MW

flow_field:
air_density: 1.225
reference_wind_height: 90.0
turbulence_intensities:
- 0.06
wind_directions:
- 270.0
wind_shear: 0.12
wind_speeds:
- 8.0
wind_veer: 0.0

wake:
model_strings:
combination_model: sosfs
deflection_model: gauss
turbulence_model: crespo_hernandez
velocity_model: gauss

enable_secondary_steering: true
enable_yaw_added_recovery: true
enable_active_wake_mixing: true
enable_transverse_velocities: true

wake_deflection_parameters:
gauss:
ad: 0.0
alpha: 0.58
bd: 0.0
beta: 0.077
dm: 1.0
ka: 0.38
kb: 0.004
jimenez:
ad: 0.0
bd: 0.0
kd: 0.05

wake_velocity_parameters:
cc:
a_s: 0.179367259
b_s: 0.0118889215
c_s1: 0.0563691592
c_s2: 0.13290157
a_f: 3.11
b_f: -0.68
c_f: 2.41
alpha_mod: 1.0
gauss:
alpha: 0.58
beta: 0.077
ka: 0.38
kb: 0.004
jensen:
we: 0.05
turboparkgauss:
A: 0.04
include_mirror_wake: True

wake_turbulence_parameters:
crespo_hernandez:
initial: 0.01
constant: 0.9
ai: 0.83
downstream: -0.25
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ docs = [
]
develop = [
"pytest",
"pytest-benchmark~=5.1",
"pre-commit",
"ruff",
"isort"
Expand Down

0 comments on commit 0c96135

Please sign in to comment.