floris_design #7

Merged
maxim merged 4 commits from floris_design into main 2024-11-24 14:13:10 +04:00
3 changed files with 69 additions and 11 deletions
Showing only changes of commit dee27b731b - Show all commits

View File

@ -3,6 +3,7 @@ import os.path
import sys import sys
import uuid import uuid
from pathlib import Path from pathlib import Path
from typing import Set
from floris import FlorisModel from floris import FlorisModel
from floris.flow_visualization import visualize_cut_plane from floris.flow_visualization import visualize_cut_plane
@ -11,7 +12,6 @@ import floris.layout_visualization as layoutviz
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
_wind_direction_to_val: dict[str, float] = { _wind_direction_to_val: dict[str, float] = {
"N": 0.0, "N": 0.0,
"E": 90.0, "E": 90.0,
@ -54,33 +54,90 @@ class FlorisULSTU(FlorisModel):
super().set(**kwargs) super().set(**kwargs)
def visualisation(self): def visualization(
self,
interest_plots: Set[str]
):
dct_functions = {
"horizontal_plane": self._horizontal_plane_visualization,
"vertical_plane": self._vertical_plane_visualization,
}
res = {}
for param in interest_plots:
if param not in dct_functions:
res[param] = "Not found"
continue
res[param] = dct_functions[param]()
return res
def _horizontal_plane_visualization(self):
return self._plane_visualization(self.calculate_horizontal_plane, {"height": 90.0})
def _vertical_plane_visualization(self):
return self._plane_visualization(self.calculate_y_plane,
{"crossstream_dist": 0.0,
"x_resolution": 200,
"z_resolution": 100})
def _plane_visualization(self, plane_func, func_params: dict[str, float] = {}):
wind_dirs = self.core.flow_field.wind_directions wind_dirs = self.core.flow_field.wind_directions
wind_speeds = self.core.flow_field.wind_speeds wind_speeds = self.core.flow_field.wind_speeds
experiment_counts = len(wind_dirs) experiment_counts = len(wind_dirs)
near_square = math.ceil(math.sqrt(experiment_counts)) near_square = math.ceil(math.sqrt(experiment_counts))
fig, axarr = plt.subplots(near_square, near_square, figsize=(15,8)) fig, ax_arr = plt.subplots(near_square, near_square, figsize=(15, 8))
axarr = axarr.flatten() ax_arr = ax_arr.flatten()
for experiment_count in range(experiment_counts): for experiment_count in range(experiment_counts):
self.reset_operation() self.reset_operation()
self.set(wind_speeds=[wind_speeds[experiment_count]], wind_directions=[wind_dirs[experiment_count]], self.set(wind_speeds=[wind_speeds[experiment_count]], wind_directions=[wind_dirs[experiment_count]],
turbulence_intensities=[0.05]) turbulence_intensities=[0.05])
ax = axarr[experiment_count] ax = ax_arr[experiment_count]
horizontal_plane = self.calculate_horizontal_plane(height=90.0) plane = plane_func(**func_params)
visualize_cut_plane( visualize_cut_plane(
horizontal_plane, plane,
ax=ax, ax=ax,
title=f"Wind flow day {experiment_count + 1}", title=f"Wind flow day {experiment_count + 1}",
) )
# plot_turbine_labels(self, axarr[0, 0])
filename = str(uuid.uuid4()) + ".png" filename = str(uuid.uuid4()) + ".png"
plt.savefig(Path(__file__).parent.parent.parent / f"public/floris/{filename}") plt.savefig(Path(__file__).parent.parent.parent / f"public/floris/{filename}")
plt.close() plt.close()
self.set(wind_speeds=wind_speeds, wind_directions=wind_dirs, turbulence_intensities=[0.05] * len(wind_dirs))
return filename return filename
def _cross_visualization(self, plane_func, func_params: dict[str, float] = {}):
wind_dirs = self.core.flow_field.wind_directions
wind_speeds = self.core.flow_field.wind_speeds
experiment_counts = len(wind_dirs)
near_square = math.ceil(math.sqrt(experiment_counts))
fig, ax_arr = plt.subplots(near_square, near_square, figsize=(15, 8))
ax_arr = ax_arr.flatten()
for experiment_count in range(experiment_counts):
self.reset_operation()
self.set(wind_speeds=[wind_speeds[experiment_count]], wind_directions=[wind_dirs[experiment_count]],
turbulence_intensities=[0.05])
ax = ax_arr[experiment_count]
plane = plane_func(**func_params)
visualize_cut_plane(
plane,
ax=ax,
title=f"Wind flow day {experiment_count + 1}",
)
filename = str(uuid.uuid4()) + ".png"
plt.savefig(Path(__file__).parent.parent.parent / f"public/floris/{filename}")
plt.close()
self.set(wind_speeds=wind_speeds, wind_directions=wind_dirs, turbulence_intensities=[0.05] * len(wind_dirs))
return filename

View File

@ -13,10 +13,11 @@ class SFlorisInputParams(BaseModel):
layout_x: list[float] = Field(Query([])) layout_x: list[float] = Field(Query([]))
layout_y: list[float] = Field(Query([])) layout_y: list[float] = Field(Query([]))
yaw_angle: list[float] = Field(Query([])) yaw_angle: list[float] = Field(Query([]))
plots: set[str] = Field(Query(["horizontal_plane"]))
date_start: date date_start: date
date_end: date date_end: date
class SFlorisOutputData(BaseModel): class SFlorisOutputData(BaseModel):
file_name: str file_name: object
data: object data: object

View File

@ -62,10 +62,10 @@ async def get_windmill_data(
fmodel.run() fmodel.run()
res = fmodel.get_turbine_powers().tolist() res = fmodel.get_turbine_powers().tolist()
file_name = fmodel.visualisation() file_names = fmodel.visualization(data.plots)
return SFlorisOutputData( return SFlorisOutputData(
file_name=file_name, file_name=file_names,
data=res data=res
) )