Source code for ard.layout.fullfarm
import numpy as np
import openmdao.api as om
from shapely import length
import shapely.geometry as sg
import ard.layout.templates as templates
[docs]
class FullFarmLanduse(templates.LanduseTemplate):
"""
Landuse class for full Cartesian grid farm layout.
This is a class to compute the landuse area of a fully specified Cartesian
grid farm layout.
Options
-------
modeling_options : dict
a modeling options dictionary (inherited from
`templates.LayoutTemplate`)
N_turbines : int
the number of turbines that should be in the farm layout (inherited from
`templates.LayoutTemplate`)
Inputs
------
x_turbines : np.ndarray
a 1-D numpy array that represents that x (i.e. Easting) coordinate of
the location of each of the turbines in the farm in meters
y_turbines : np.ndarray
a 1-D numpy array that represents that y (i.e. Northing) coordinate of
the location of each of the turbines in the farm in meters
Outputs
-------
area_tight : float
the area in square kilometers that the farm occupies based on the
circumscribing geometry with a specified (default zero) layback buffer
(inherited from `templates.LayoutTemplate`)
"""
[docs]
def setup(self):
"""Setup of OM component."""
super().setup()
# add the full layout inputs
self.add_input(
"x_turbines",
np.zeros((self.N_turbines,)),
units="m",
desc="turbine location in x-direction",
)
self.add_input(
"y_turbines",
np.zeros((self.N_turbines,)),
units="m",
desc="turbine location in y-direction",
)
[docs]
def setup_partials(self):
"""Derivative setup for OM component."""
# default complex step for the layout-landuse tools, since they're often algebraic
self.declare_partials("*", "*", method="fd")
[docs]
def compute(self, inputs, outputs):
"""Computation for the OM component."""
# extract the points from the inputs
points = list(
zip(
list(inputs["x_turbines"]),
list(inputs["y_turbines"]),
)
)
# create a multi-point object
mp = sg.MultiPoint(points)
# create a laybacked geometry
D_rotor = self.modeling_options["turbine"]["geometry"]["diameter_rotor"]
lengthscale_layback = float(inputs["distance_layback_diameters"][0] * D_rotor)
# area tight is equal to the convex hull area for the points in sq. km.
outputs["area_tight"] = (
mp.convex_hull.buffer(lengthscale_layback).area / 1000**2
)