diff --git a/ard/api/interface.py b/ard/api/interface.py index 22b7d60c..957c069d 100644 --- a/ard/api/interface.py +++ b/ard/api/interface.py @@ -113,7 +113,7 @@ def set_up_ard_model(input_dict: Union[str, dict], root_data_path: str = None): def set_up_system_recursive( input_dict: dict, system_name: str = "top_level", - work_dir: str = "ard_prob_out", + work_dir: str = "case_files", parent_group=None, modeling_options: dict = None, analysis_options: dict = None, @@ -132,7 +132,9 @@ def set_up_system_recursive( """ # Initialize the top-level problem if no parent group is provided if parent_group is None: - prob = om.Problem(work_dir=work_dir) + prob = om.Problem( + work_dir=work_dir, + ) parent_group = prob.model # parent_group.name = "ard_model" else: diff --git a/ard/collection/optiwindnet_wrap.py b/ard/collection/optiwindnet_wrap.py index f2cbb4e6..fad464a1 100644 --- a/ard/collection/optiwindnet_wrap.py +++ b/ard/collection/optiwindnet_wrap.py @@ -1,3 +1,5 @@ +from warnings import warn + import networkx as nx import numpy as np @@ -10,6 +12,7 @@ def _own_L_from_inputs(inputs: dict, discrete_inputs: dict) -> nx.Graph: + # get the metadata and data for the OWN warm-starter from the inputs T = len(inputs["x_turbines"]) R = len(inputs["x_substations"]) name_case = "farm" @@ -22,6 +25,54 @@ def _own_L_from_inputs(inputs: dict, discrete_inputs: dict) -> nx.Graph: VertexC[:T, 1] = inputs["y_turbines"] VertexC[-R:, 0] = inputs["x_substations"] VertexC[-R:, 1] = inputs["y_substations"] + + # add perturbation to duplicate turbine/substation positions + VertexCTR = np.vstack([VertexC[:T, :], VertexC[-R:, :]]) + perturbation_eps = 1.0e-6 # base magnitude of perturbation in m + perturbation_normal = np.array([-1.0, 1.0]) # set a fixed axis to perturb on + perturbation_normal = perturbation_normal / np.sqrt( + np.sum(perturbation_normal**2) + ) # normalize the perturbation + # go through the turbine/substation vertices and count how many times a + # given vertex has appeared before + repeat_accumulate = np.array( + [ + int(np.sum(np.all(VertexCTR[:ivv, :] == vv, axis=1))) + for ivv, vv in enumerate(VertexCTR) + ] + ) + if np.any(repeat_accumulate > 0): # only if there are any repeats + warn_string = ( + f"\nDetected {np.sum(repeat_accumulate > 0)} coincident " + f"turbines and/or substations in optiwindnet setup." + ) # start a warning string for the UserWarning + # TODO: make Ard warnings? + + # create perturbation adjustements s.t. vertices w/ multiplicity > 2 + # are adjusted to be fully unique! + adjustments = perturbation_eps * np.outer( + repeat_accumulate, perturbation_normal + ) + # for each adjustments add to the warning string + for idx, dxy in enumerate(adjustments[:T, :]): + if np.sum(dxy != 0) == 0: + continue + warn_string += f"\n\tadjusting turbine #{idx} from {VertexCTR[idx, :]} to {VertexCTR[idx, :] + dxy}" + for idx, dxy in enumerate((adjustments[-R:, :])[::-1, :]): + if np.sum(dxy != 0) == 0: + continue + warn_string += f"\n\tadjusting substation #{idx} from {VertexCTR[-(idx+1), :]} to {VertexCTR[-(idx+1), :] + dxy}" + # output the final warning + warn(warn_string) + + # store the adjustments + VertexCTR += adjustments + + # apply the adjustments + VertexC[:T, :] = VertexCTR[:T, :] + VertexC[-R:, :] = VertexCTR[-R:, :] + + # put together the inputs for optiwindnet site = dict( T=T, R=R, @@ -29,6 +80,8 @@ def _own_L_from_inputs(inputs: dict, discrete_inputs: dict) -> nx.Graph: handle=name_case, VertexC=VertexC, ) + + # handle the boundary if it exists if B > 0: VertexC[T:-R, 0] = discrete_inputs["x_border"] VertexC[T:-R, 1] = discrete_inputs["y_border"] diff --git a/ard/eco/eagle_density.py b/ard/eco/eagle_density.py new file mode 100644 index 00000000..3cd45e9f --- /dev/null +++ b/ard/eco/eagle_density.py @@ -0,0 +1,84 @@ +import numpy as np + +import openmdao.api as om + + +class EagleDensityFunction(om.ExplicitComponent): + """ + _summary_ + + _extended_summary_ + + Options + ------- + modeling_options : dict + a modeling options dictionary (inherited from + `templates.LanduseTemplate`) + + 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`) + """ + + def initialize(self): + """Initialization of OM component.""" + self.options.declare("modeling_options") + + def setup(self): + """Setup of OM component.""" + + # load modeling options and turbine count + modeling_options = self.modeling_options = self.options["modeling_options"] + self.windIO = self.modeling_options["windIO_plant"] + self.N_turbines = modeling_options["layout"]["N_turbines"] + + # self.eagle_density_function = lambda x, y: ??? + + # 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", + ) + + # add outputs that are universal + self.add_output( + "eagle_normalized_density", + np.zeros((self.N_turbines,)), + units="unitless", + desc="normalized eagle presence density", + ) + + + def compute(self, inputs, outputs): + """ + Computation for the OM component. + """ + + x_turbines = inputs["x_turbines"] # m + y_turbines = inputs["y_turbines"] # m + + raise NotImplementedError( + "@Eliot, you need to implement this!!!" + ) + + outputs["eagle_normalized_density"] = y # on [0, 1] diff --git a/ard/farm_aero/floris.py b/ard/farm_aero/floris.py index 97d12742..9ccc08e3 100644 --- a/ard/farm_aero/floris.py +++ b/ard/farm_aero/floris.py @@ -6,6 +6,7 @@ import floris import floris.turbine_library.turbine_utilities +import ard.utils.logging as ard_logging import ard.farm_aero.templates as templates @@ -190,6 +191,7 @@ def initialize(self): """Initialization-time FLORIS management.""" self.options.declare("case_title") + @ard_logging.component_log_capture def setup(self): """Setup-time FLORIS management.""" @@ -340,21 +342,27 @@ def initialize(self): super().initialize() # run super class script first! FLORISFarmComponent.initialize(self) # FLORIS superclass + @ard_logging.component_log_capture def setup(self): super().setup() # run super class script first! FLORISFarmComponent.setup(self) # setup a FLORIS run + @ard_logging.component_log_capture def setup_partials(self): FLORISFarmComponent.setup_partials(self) + @ard_logging.component_log_capture def compute(self, inputs, outputs): # generate the list of conditions for evaluation - self.time_series = floris.TimeSeries( - wind_directions=np.degrees(np.array(self.wind_query.wind_directions)), - wind_speeds=np.array(self.wind_query.wind_speeds), - turbulence_intensities=np.array(self.wind_query.turbulence_intensities), - ) + if type(self.wind_query) == floris.TimeSeries: + self.time_series = self.wind_query + else: + self.time_series = floris.TimeSeries( + wind_directions=np.degrees(np.array(self.wind_query.wind_directions)), + wind_speeds=np.array(self.wind_query.wind_speeds), + turbulence_intensities=np.array(self.wind_query.turbulence_intensities), + ) # set up and run the floris model self.fmodel.set( @@ -442,13 +450,16 @@ def initialize(self): super().initialize() # run super class script first! FLORISFarmComponent.initialize(self) # add on FLORIS superclass + @ard_logging.component_log_capture def setup(self): super().setup() # run super class script first! FLORISFarmComponent.setup(self) # setup a FLORIS run + @ard_logging.component_log_capture def setup_partials(self): super().setup_partials() + @ard_logging.component_log_capture def compute(self, inputs, outputs): # set up and run the floris model @@ -477,5 +488,6 @@ def compute(self, inputs, outputs): outputs["power_turbines"] = FLORISFarmComponent.get_power_turbines(self) outputs["thrust_turbines"] = FLORISFarmComponent.get_thrust_turbines(self) + @ard_logging.component_log_capture def setup_partials(self): FLORISFarmComponent.setup_partials(self) diff --git a/ard/farm_aero/templates.py b/ard/farm_aero/templates.py index 4deeaa26..40cfdd04 100644 --- a/ard/farm_aero/templates.py +++ b/ard/farm_aero/templates.py @@ -10,6 +10,7 @@ def create_windresource_from_windIO( windIOdict: dict, resource_type: str = None, # ["probability", "timeseries", "weibull_sector"] + heterogeneous_map: floris.HeterogeneousMap | None = None, ): """ takes a windIO plant specification and creates an appropriate wind resource @@ -120,6 +121,7 @@ def create_windresource_from_windIO( wind_speeds=wind_speeds, freq_table=probabilities, ti_table=turbulence_intensities, + heterogeneous_map=heterogeneous_map, ) # stash some metadata for the wind resource wind_resource_representation.reference_height = ( @@ -163,6 +165,7 @@ def create_windresource_from_windIO( wind_directions=wind_directions, wind_speeds=wind_speeds, turbulence_intensities=turbulence_intensities, + heterogeneous_map=heterogeneous_map, ) # stash some metadata for the wind resource wind_resource_representation.reference_height = ( @@ -300,9 +303,25 @@ def setup(self): super().setup() # unpack wind query object + heterogeneous_map_spec = self.modeling_options.get("heterogeneous_map") + if heterogeneous_map_spec: + print("ACTIVATING HETEROGENEOUS MAP SPEC") self.wind_query = create_windresource_from_windIO( self.windIO, "timeseries", + heterogeneous_map=( + floris.HeterogeneousMap( + x=heterogeneous_map_spec["x"], + y=heterogeneous_map_spec["y"], + z=heterogeneous_map_spec.get("z"), + speed_multipliers=heterogeneous_map_spec["speed_multipliers"], + wind_directions=heterogeneous_map_spec["wind_directions"], + wind_speeds=heterogeneous_map_spec["wind_speeds"], + interp_method=heterogeneous_map_spec.get("interp_method"), + ) + if heterogeneous_map_spec + else None + ), ) self.directions_wind = self.wind_query.wind_directions.tolist() self.speeds_wind = self.wind_query.wind_speeds.tolist() @@ -428,9 +447,25 @@ def setup(self): super().setup() data_path = str(self.options["data_path"]) + heterogeneous_map_spec = self.modeling_options.get("heterogeneous_map") + if heterogeneous_map_spec: + print("ACTIVATING HETEROGENEOUS MAP SPEC") self.wind_query = create_windresource_from_windIO( self.windIO, "probability", + heterogeneous_map=( + floris.HeterogeneousMap( + x=heterogeneous_map_spec["x"], + y=heterogeneous_map_spec["y"], + z=heterogeneous_map_spec.get("z"), + speed_multipliers=heterogeneous_map_spec["speed_multipliers"], + wind_directions=heterogeneous_map_spec["wind_directions"], + wind_speeds=heterogeneous_map_spec["wind_speeds"], + interp_method=heterogeneous_map_spec.get("interp_method"), + ) + if heterogeneous_map_spec + else None + ), ) if data_path is None: diff --git a/ard/layout/exclusions.py b/ard/layout/exclusions.py new file mode 100644 index 00000000..508d5818 --- /dev/null +++ b/ard/layout/exclusions.py @@ -0,0 +1,128 @@ +import numpy as np +import jax.numpy as jnp +import jax + +jax.config.update("jax_enable_x64", True) +import ard.utils.geometry +import openmdao.api as om + + +class FarmExclusionDistancePolygon(om.ExplicitComponent): + """ + A class to return distances between turbines and a polygonal exclusion, or + sets of polygonal exclusion regions. + + Options + ------- + modeling_options : dict + a modeling options dictionary + + Inputs + ------ + x_turbines : np.ndarray + a 1D numpy array indicating the x-dimension locations of the turbines, + with length `N_turbines` (mirrored w.r.t. `FarmAeroTemplate`) + y_turbines : np.ndarray + a 1D numpy array indicating the y-dimension locations of the turbines, + with length `N_turbines` (mirrored w.r.t. `FarmAeroTemplate`) + """ + + def initialize(self): + """Initialization of the OpenMDAO component.""" + self.options.declare("modeling_options") + + def setup(self): + """Setup of the OpenMDAO component.""" + + # load modeling options + self.modeling_options = self.options["modeling_options"] + self.windIO = self.modeling_options["windIO_plant"] + self.N_turbines = int(self.modeling_options["layout"]["N_turbines"]) + + # load boundary vertices from windIO file + if "exclusions" not in self.windIO["site"]: + raise KeyError( + "You have requested an exclusion but no exclusions were found in the windIO file." + ) + if "circle" in self.windIO["site"]["exclusions"]: + raise NotImplementedError( + "The circular exclusions from windIO have not been implemented here, yet." + ) + if "polygons" not in self.windIO["site"]["exclusions"]: + raise KeyError( + "Currently only polygon exclusions from windIO have been implemented and none were found." + ) + self.exclusion_vertices = [ + np.array( + [ + polygon["x"], + polygon["y"], + ] + ).T + for polygon in self.windIO["site"]["exclusions"]["polygons"] + ] + self.exclusion_regions = self.modeling_options.get("exclusions", {}).get( + "turbine_region_assignments", # get the region assignments from modeling_options, if there + np.zeros(self.N_turbines, dtype=int), # default to zero for all turbines + ) + + # prep the jacobian + self.distance_multi_point_to_multi_polygon_ray_casting_jac = jax.jacfwd( + ard.utils.geometry.distance_multi_point_to_multi_polygon_ray_casting, [0, 1] + ) + + # set up inputs and outputs for mooring system + self.add_input( + "x_turbines", jnp.zeros((self.N_turbines,)), units="m" + ) # x location of the mooring platform in m w.r.t. reference coordinates + self.add_input( + "y_turbines", jnp.zeros((self.N_turbines,)), units="m" + ) # y location of the mooring platform in m w.r.t. reference coordinates + + self.add_output( + "exclusion_distances", + jnp.zeros(self.N_turbines), + units="m", + ) + + def setup_partials(self): + """Derivative setup for the OpenMDAO component.""" + # the default (but not preferred!) derivatives are FDM + self.declare_partials( + "*", + "*", + method="exact", + rows=np.arange(self.N_turbines), + cols=np.arange(self.N_turbines), + ) + + def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): + """Computation for the OpenMDAO component.""" + + # unpack the working variables + x_turbines = inputs["x_turbines"] + y_turbines = inputs["y_turbines"] + + exclusion_distances = ( + ard.utils.geometry.distance_multi_point_to_multi_polygon_ray_casting( + x_turbines, + y_turbines, + boundary_vertices=self.exclusion_vertices, + regions=self.exclusion_regions, + ) + ) + + outputs["exclusion_distances"] = -exclusion_distances + + def compute_partials(self, inputs, partials, discrete_inputs=None): + + # unpack the working variables + x_turbines = inputs["x_turbines"] + y_turbines = inputs["y_turbines"] + + jacobian = self.distance_multi_point_to_multi_polygon_ray_casting_jac( + x_turbines, y_turbines, self.exclusion_vertices, self.exclusion_regions + ) + + partials["exclusion_distances", "x_turbines"] = -jacobian[0].diagonal() + partials["exclusion_distances", "y_turbines"] = -jacobian[1].diagonal() diff --git a/ard/layout/gridfarm.py b/ard/layout/gridfarm.py index e76ac2a2..5b188705 100644 --- a/ard/layout/gridfarm.py +++ b/ard/layout/gridfarm.py @@ -85,12 +85,16 @@ def initialize(self): def setup(self): """Setup of OM component.""" super().setup() + x0 = self.modeling_options["layout"].get("x0", 0.0) + y0 = self.modeling_options["layout"].get("y0", 0.0) spacing_primary = self.modeling_options["layout"]["spacing_primary"] spacing_secondary = self.modeling_options["layout"]["spacing_secondary"] angle_orientation = self.modeling_options["layout"]["angle_orientation"] angle_skew = self.modeling_options["layout"]["angle_skew"] # add four-parameter grid farm layout DVs + self.add_input("x0", x0, units="m") + self.add_input("y0", y0, units="m") self.add_input("spacing_primary", spacing_primary, units="unitless") self.add_input("spacing_secondary", spacing_secondary, units="unitless") self.add_input("angle_orientation", angle_orientation, units="deg") @@ -158,8 +162,8 @@ def compute(self, inputs, outputs): ).squeeze() xyp = Amtx @ (Bmtx @ np.vstack([xi_positions, yi_positions])) - outputs["x_turbines"] = xyp[0, :].tolist() - outputs["y_turbines"] = xyp[1, :].tolist() + outputs["x_turbines"] = (xyp[0, :] + inputs["x0"]).tolist() + outputs["y_turbines"] = (xyp[1, :] + inputs["y0"]).tolist() outputs["spacing_effective_primary"] = inputs["spacing_primary"] outputs["spacing_effective_secondary"] = np.sqrt( diff --git a/ard/utils/logging.py b/ard/utils/logging.py new file mode 100644 index 00000000..dd657e26 --- /dev/null +++ b/ard/utils/logging.py @@ -0,0 +1,96 @@ +from contextlib import redirect_stdout, redirect_stderr +from functools import wraps +from pathlib import Path +import shutil + +import openmdao.core.component + + +def name_create_log(component, iter: int = None): + """ + for a given component, clean and create component- and rank-unique logfiles + + Take a component and create logs, parallel to the reports file, mirroring + the OpenMDAO model structure with stdout and stderr files for each rank, + and finally return the file paths for the component to redirect stdout and + stderr to. + + Parameters + ---------- + component : openmdao.core.component.Component + An OpenMDAO component that we want to capture stdout/stderr for + + Returns + ------- + pathlib.Path + a path to in the log system to dump stdout to + pathlib.Path + a path to in the log system to dump err to + """ + + # make sure we are dealing with an OM component + assert isinstance(component, openmdao.core.component.Component) + + logs_dir = ["logs"] + if iter is not None: + logs_dir += f"iter_{iter:04d}" + subdir_logger = component.pathname.split( + "." + ) # mirror the comp path for a log directory + dir_reports = Path( + component._problem_meta["reports_dir"] + ) # find the reports directory + path_logfile_template = Path( + dir_reports.parent, + "logs", + *subdir_logger, + f"%s_rank{component._comm.rank:03d}.txt", + ) # put the logs directory parallel to it + path_logfile_stdout = Path(path_logfile_template.as_posix() % "stdout") + path_logfile_stderr = Path(path_logfile_template.as_posix() % "stderr") + + # make a clean log location for this component + try: + path_logfile_stdout.parent.mkdir(parents=True, exist_ok=False) + except FileExistsError: + shutil.rmtree(path_logfile_stdout.parent, ignore_errors=True) + path_logfile_stdout.parent.mkdir(parents=True, exist_ok=True) + + # return stdout and stderr files + return path_logfile_stdout, path_logfile_stderr + + +def component_log_capture(compute_func, iter: int = None): + """ + decorator that redirects stdout and stderr to disciplinary rankwise logfiles + + This decorator will redirects stdout and stderr to discipline-wise and + rank-wise logfiles, which are determined by the `name_create_log` function. + The decorator uses context managers to redirect output streams to these + files, ensuring that all print statements and errors within the function are + logged appropriately. + + func : Callable + The function to be decorated. It should be a method of a class, as + `self` is expected as the first argument. + + Callable + The wrapped function with stdout and stderr redirected to log files + during its execution. + """ + + @wraps(compute_func) + def wrapper(self, *args, **kwargs): + # get log file paths + path_stdout_log, path_stderr_log = name_create_log(self) + + # use context manager to redirect stdout & stderr + with ( + open(path_stdout_log, "a") as stdout_file, + open(path_stderr_log, "a") as stderr_file, + redirect_stdout(stdout_file), + redirect_stderr(stderr_file), + ): + return compute_func(self, *args, **kwargs) + + return wrapper diff --git a/ard/viz/layout.py b/ard/viz/layout.py index 2afc07a1..f26530df 100644 --- a/ard/viz/layout.py +++ b/ard/viz/layout.py @@ -104,6 +104,30 @@ def plot_layout( # linecolor="k", ) + # loop over the exclusion types + for excl_type_key, excl_type_value in ( + windIO_dict["site"].get("exclusions", {}).items() + ): + # handle un-implemented exclusion types + if excl_type_key not in ["polygons"]: + raise NotImplementedError( + f"`{excl_type_key}` exclusions found but not yet handled in Ard plotting capabilities." + ) + + if excl_type_key == "polygons": + for polygon_exclusion in excl_type_value: + ax.fill( + polygon_exclusion["x"], + polygon_exclusion["y"], + linestyle="--", + alpha=0.25, + fill=True, + c="r", + # linecolor="k", + ) + else: + raise ValueError("this line should be inaccessible.") + # plot turbines ax.plot(x_turbines, y_turbines, "ok") diff --git a/ard/viz/utils.py b/ard/viz/utils.py new file mode 100644 index 00000000..5f0d7e4a --- /dev/null +++ b/ard/viz/utils.py @@ -0,0 +1,10 @@ +import numpy as np + + +def get_plot_range(values, pct_buffer=5.0): + min_value = np.min(values) + max_value = np.max(values) + dvalues = max_value - min_value + min_value = min_value - pct_buffer / 100.0 * dvalues + max_value = max_value + pct_buffer / 100.0 * dvalues + return min_value, max_value diff --git a/examples/01_onshore/optimization_demo.ipynb b/examples/01_onshore/optimization_demo.ipynb index 04b723e6..a4c632a1 100644 --- a/examples/01_onshore/optimization_demo.ipynb +++ b/examples/01_onshore/optimization_demo.ipynb @@ -17,16 +17,7 @@ "execution_count": 1, "id": "d75b4457", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: :488\n", - "numpy.ndarray size changed, may indicate binary incompatibility. Expected 16 from C header, got 96 from PyObject" - ] - } - ], + "outputs": [], "source": [ "from pathlib import Path # optional, for nice path specifications\n", "\n", @@ -60,17 +51,10 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "29850609", "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[34mfloris.floris_model.FlorisModel\u001b[0m \u001b[1;30mWARNING\u001b[0m \u001b[33mturbine_type has been changed without specifying a new reference_wind_height. reference_wind_height remains 90.00 m. Consider calling `FlorisModel.assign_hub_height_to_ref_height` to update the reference wind height to the turbine hub height.\u001b[0m\n" - ] - }, { "name": "stdout", "output_type": "stream", @@ -138,17 +122,6 @@ "id": "b74f9d45", "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/openmdao/recorders/sqlite_recorder.py:231: UserWarning:The existing case recorder file, ard_prob_out/problem_out/cases.sql, is being overwritten.\n", - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, { "name": "stdout", "output_type": "stream", @@ -157,10 +130,10 @@ "\n", "RESULTS:\n", "\n", - "{'AEP_val': 405.9510682648514,\n", + "{'AEP_val': 406.5372933434125,\n", " 'BOS_val': 41.68227106807093,\n", " 'CapEx_val': 110.5,\n", - " 'LCOE_val': 37.328810082644566,\n", + " 'LCOE_val': 37.274982094458494,\n", " 'OpEx_val': 3.7400000000000007,\n", " 'area_tight': 13.2496,\n", " 'coll_length': 21.89865877023397,\n", @@ -228,25 +201,9 @@ " 'angle_skew': array([0.]),\n", " 'spacing_primary': array([7.]),\n", " 'spacing_secondary': array([7.])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03732881])}\n", + "{'financese.lcoe': array([0.03727498])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|1\n", "---------------------------------------------------------------\n", @@ -255,25 +212,9 @@ " 'angle_skew': array([0.]),\n", " 'spacing_primary': array([7.]),\n", " 'spacing_secondary': array([7.])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03732881])}\n", + "{'financese.lcoe': array([0.03727498])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|2\n", "---------------------------------------------------------------\n", @@ -282,25 +223,9 @@ " 'angle_skew': array([0.]),\n", " 'spacing_primary': array([9.]),\n", " 'spacing_secondary': array([7.])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03630168])}\n", + "{'financese.lcoe': array([0.03624933])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|3\n", "---------------------------------------------------------------\n", @@ -309,25 +234,9 @@ " 'angle_skew': array([0.]),\n", " 'spacing_primary': array([9.]),\n", " 'spacing_secondary': array([9.])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "\n", "Objectives\n", - "{'financese.lcoe': array([0.0362278])}\n", + "{'financese.lcoe': array([0.03617556])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|4\n", "---------------------------------------------------------------\n", @@ -336,25 +245,9 @@ " 'angle_skew': array([0.]),\n", " 'spacing_primary': array([9.]),\n", " 'spacing_secondary': array([9.])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03589558])}\n", + "{'financese.lcoe': array([0.03584399])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|5\n", "---------------------------------------------------------------\n", @@ -363,1332 +256,594 @@ " 'angle_skew': array([2.]),\n", " 'spacing_primary': array([9.]),\n", " 'spacing_secondary': array([9.])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03576731])}\n", + "{'financese.lcoe': array([0.03571624])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|6\n", "---------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([2.86507341]),\n", - " 'angle_skew': array([0.06342541]),\n", - " 'spacing_primary': array([9.88412296]),\n", - " 'spacing_secondary': array([7.42966507])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([2.86472678]),\n", + " 'angle_skew': array([0.06259902]),\n", + " 'spacing_primary': array([9.88434523]),\n", + " 'spacing_secondary': array([7.42956615])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03536135])}\n", + "{'financese.lcoe': array([0.03531047])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|7\n", "---------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([6.22440279]),\n", - " 'angle_skew': array([1.28942792]),\n", - " 'spacing_primary': array([11.09600928]),\n", - " 'spacing_secondary': array([6.10937891])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:498\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([6.2249954]),\n", + " 'angle_skew': array([1.28482356]),\n", + " 'spacing_primary': array([11.09632306]),\n", + " 'spacing_secondary': array([6.10825176])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03370838])}\n", + "{'financese.lcoe': array([0.03366194])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|8\n", "---------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([12.81065072]),\n", - " 'angle_skew': array([5.41443477]),\n", - " 'spacing_primary': array([10.77869556]),\n", - " 'spacing_secondary': array([4.23722274])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([12.81867001]),\n", + " 'angle_skew': array([5.39849156]),\n", + " 'spacing_primary': array([10.77914451]),\n", + " 'spacing_secondary': array([4.23726581])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03370143])}\n", + "{'financese.lcoe': array([0.03365148])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|9\n", "---------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([4.28310721]),\n", - " 'angle_skew': array([4.24611554]),\n", - " 'spacing_primary': array([11.15159215]),\n", - " 'spacing_secondary': array([4.24222055])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([15.16579535]),\n", + " 'angle_skew': array([2.65570238]),\n", + " 'spacing_primary': array([10.54973372]),\n", + " 'spacing_secondary': array([5.94474374])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03451831])}\n", + "{'financese.lcoe': array([0.03402733])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|10\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([6.00666884]),\n", - " 'angle_skew': array([1.33986207]),\n", - " 'spacing_primary': array([12.01188114]),\n", - " 'spacing_secondary': array([6.44288611])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([12.8345144]),\n", + " 'angle_skew': array([5.67717329]),\n", + " 'spacing_primary': array([11.57777225]),\n", + " 'spacing_secondary': array([4.77044418])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03373368])}\n", + "{'financese.lcoe': array([0.03354686])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|11\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.20718925]),\n", - " 'angle_skew': array([1.26618807]),\n", - " 'spacing_primary': array([11.04995437]),\n", - " 'spacing_secondary': array([5.85267537])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:498\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([14.06069203]),\n", + " 'angle_skew': array([5.12173355]),\n", + " 'spacing_primary': array([10.41709128]),\n", + " 'spacing_secondary': array([4.22986599])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03352562])}\n", + "{'financese.lcoe': array([0.03363844])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|12\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.30827026]),\n", - " 'angle_skew': array([-0.28110214]),\n", - " 'spacing_primary': array([11.21647279]),\n", - " 'spacing_secondary': array([4.60049836])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([14.13995264]),\n", + " 'angle_skew': array([4.71319936]),\n", + " 'spacing_primary': array([11.01527995]),\n", + " 'spacing_secondary': array([3.54503909])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03470472])}\n", + "{'financese.lcoe': array([0.03458857])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|13\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.29155102]),\n", - " 'angle_skew': array([0.64372952]),\n", - " 'spacing_primary': array([10.8322654]),\n", - " 'spacing_secondary': array([6.59969609])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([14.05906201]),\n", + " 'angle_skew': array([6.28573007]),\n", + " 'spacing_primary': array([9.42149182]),\n", + " 'spacing_secondary': array([5.51590298])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03362597])}\n", + "{'financese.lcoe': array([0.03410492])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|14\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.59086432]),\n", - " 'angle_skew': array([2.93175261]),\n", - " 'spacing_primary': array([10.37471801]),\n", - " 'spacing_secondary': array([6.64181672])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([14.06734214]),\n", + " 'angle_skew': array([5.12348552]),\n", + " 'spacing_primary': array([10.45650427]),\n", + " 'spacing_secondary': array([4.22920401])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03351144])}\n", + "{'financese.lcoe': array([0.03363728])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|15\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([9.75180855]),\n", - " 'angle_skew': array([3.5743247]),\n", - " 'spacing_primary': array([10.40303204]),\n", - " 'spacing_secondary': array([5.14565233])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([14.25674804]),\n", + " 'angle_skew': array([5.05925836]),\n", + " 'spacing_primary': array([10.45623439]),\n", + " 'spacing_secondary': array([4.22965665])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03362007])}\n", + "{'financese.lcoe': array([0.03365051])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|16\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.74175405]),\n", - " 'angle_skew': array([3.20209382]),\n", - " 'spacing_primary': array([9.87740784]),\n", - " 'spacing_secondary': array([7.45226753])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([14.09076211]),\n", + " 'angle_skew': array([5.19210329]),\n", + " 'spacing_primary': array([10.44835385]),\n", + " 'spacing_secondary': array([4.16081777])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03398983])}\n", + "{'financese.lcoe': array([0.03366734])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|17\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.69666884]),\n", - " 'angle_skew': array([2.95678515]),\n", - " 'spacing_primary': array([10.5780121]),\n", - " 'spacing_secondary': array([6.73851361])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.9731555]),\n", + " 'angle_skew': array([4.9478475]),\n", + " 'spacing_primary': array([10.47318285]),\n", + " 'spacing_secondary': array([4.23061394])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03350047])}\n", + "{'financese.lcoe': array([0.03361022])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|18\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.17818917]),\n", - " 'angle_skew': array([3.05428928]),\n", - " 'spacing_primary': array([10.45137129]),\n", - " 'spacing_secondary': array([6.39931257])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.90496297]),\n", + " 'angle_skew': array([4.88172646]),\n", + " 'spacing_primary': array([10.42062958]),\n", + " 'spacing_secondary': array([4.39858995])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.033564])}\n", + "{'financese.lcoe': array([0.03363528])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|19\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.54548368]),\n", - " 'angle_skew': array([2.85439181]),\n", - " 'spacing_primary': array([10.38776205]),\n", - " 'spacing_secondary': array([6.68407495])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.90080602]),\n", + " 'angle_skew': array([4.8790065]),\n", + " 'spacing_primary': array([10.47832507]),\n", + " 'spacing_secondary': array([4.23077813])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03351661])}\n", + "{'financese.lcoe': array([0.0335983])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|20\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.68235437]),\n", - " 'angle_skew': array([2.82528036]),\n", - " 'spacing_primary': array([10.38236737]),\n", - " 'spacing_secondary': array([6.49956794])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.7163965]),\n", + " 'angle_skew': array([4.80229897]),\n", + " 'spacing_primary': array([10.4887581]),\n", + " 'spacing_secondary': array([4.23126246])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03352674])}\n", + "{'financese.lcoe': array([0.03358231])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|21\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.6540565]),\n", - " 'angle_skew': array([2.91346029]),\n", - " 'spacing_primary': array([10.3196462]),\n", - " 'spacing_secondary': array([6.69319021])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.71595893]),\n", + " 'angle_skew': array([4.8020453]),\n", + " 'spacing_primary': array([10.47930893]),\n", + " 'spacing_secondary': array([4.22802869])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03351022])}\n", + "{'financese.lcoe': array([0.03358327])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|22\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.67575792]),\n", - " 'angle_skew': array([3.08481535]),\n", - " 'spacing_primary': array([10.2720701]),\n", - " 'spacing_secondary': array([6.78208906])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.72023935]),\n", + " 'angle_skew': array([4.79306721]),\n", + " 'spacing_primary': array([10.48880396]),\n", + " 'spacing_secondary': array([4.23133267])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03351441])}\n", + "{'financese.lcoe': array([0.03358165])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|23\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.84425874]),\n", - " 'angle_skew': array([3.07310244]),\n", - " 'spacing_primary': array([10.28009779]),\n", - " 'spacing_secondary': array([6.67529094])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.7203938]),\n", + " 'angle_skew': array([4.79307559]),\n", + " 'spacing_primary': array([10.49203488]),\n", + " 'spacing_secondary': array([4.22187026])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03349585])}\n", + "{'financese.lcoe': array([0.03358269])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|24\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([9.18352292]),\n", - " 'angle_skew': array([3.04313706]),\n", - " 'spacing_primary': array([10.29713614]),\n", - " 'spacing_secondary': array([6.46621779])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.71380913]),\n", + " 'angle_skew': array([4.78035069]),\n", + " 'spacing_primary': array([10.48610853]),\n", + " 'spacing_secondary': array([4.245105])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03351251])}\n", + "{'financese.lcoe': array([0.03357842])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|25\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.84094657]),\n", - " 'angle_skew': array([3.23775271]),\n", - " 'spacing_primary': array([10.23836947]),\n", - " 'spacing_secondary': array([6.78082797])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.69777685]),\n", + " 'angle_skew': array([4.75473775]),\n", + " 'spacing_primary': array([10.48011045]),\n", + " 'spacing_secondary': array([4.27061904])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03350363])}\n", + "{'financese.lcoe': array([0.03357623])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|26\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.92780689]),\n", - " 'angle_skew': array([3.06227062]),\n", - " 'spacing_primary': array([10.28551011]),\n", - " 'spacing_secondary': array([6.62168977])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.73063005]),\n", + " 'angle_skew': array([4.7487034]),\n", + " 'spacing_primary': array([10.47275106]),\n", + " 'spacing_secondary': array([4.29135773])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03349405])}\n", + "{'financese.lcoe': array([0.03357785])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|27\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.96908323]),\n", - " 'angle_skew': array([2.99969751]),\n", - " 'spacing_primary': array([10.26251137]),\n", - " 'spacing_secondary': array([6.68375367])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.68202514]),\n", + " 'angle_skew': array([4.74561956]),\n", + " 'spacing_primary': array([10.47859155]),\n", + " 'spacing_secondary': array([4.27876983])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.0334977])}\n", + "{'financese.lcoe': array([0.03357592])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|28\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.92431437]),\n", - " 'angle_skew': array([3.06109607]),\n", - " 'spacing_primary': array([10.26197456]),\n", - " 'spacing_secondary': array([6.61410686])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.68461032]),\n", + " 'angle_skew': array([4.72946958]),\n", + " 'spacing_primary': array([10.4831355]),\n", + " 'spacing_secondary': array([4.26819404])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03349462])}\n", + "{'financese.lcoe': array([0.03357384])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|29\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.91563967]),\n", - " 'angle_skew': array([3.05174114]),\n", - " 'spacing_primary': array([10.29746973]),\n", - " 'spacing_secondary': array([6.57588523])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.68237896]),\n", + " 'angle_skew': array([4.71506942]),\n", + " 'spacing_primary': array([10.48846385]),\n", + " 'spacing_secondary': array([4.25557401])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.0334975])}\n", + "{'financese.lcoe': array([0.0335716])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|30\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.93680565]),\n", - " 'angle_skew': array([3.06521408]),\n", - " 'spacing_primary': array([10.28505436]),\n", - " 'spacing_secondary': array([6.61850376])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.67778694]),\n", + " 'angle_skew': array([4.68473807]),\n", + " 'spacing_primary': array([10.49855396]),\n", + " 'spacing_secondary': array([4.23197078])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03349397])}\n", + "{'financese.lcoe': array([0.03357104])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|31\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.93541161]),\n", - " 'angle_skew': array([3.08299015]),\n", - " 'spacing_primary': array([10.28137613]),\n", - " 'spacing_secondary': array([6.62678257])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.66787709]),\n", + " 'angle_skew': array([4.67538831]),\n", + " 'spacing_primary': array([10.46094591]),\n", + " 'spacing_secondary': array([4.23207544])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03349297])}\n", + "{'financese.lcoe': array([0.03357297])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|32\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.9414375]),\n", - " 'angle_skew': array([3.09048798]),\n", - " 'spacing_primary': array([10.27644142]),\n", - " 'spacing_secondary': array([6.64360874])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.67618262]),\n", + " 'angle_skew': array([4.67931398]),\n", + " 'spacing_primary': array([10.5003476]),\n", + " 'spacing_secondary': array([4.2400199])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03349228])}\n", + "{'financese.lcoe': array([0.03356904])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|33\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.94171468]),\n", - " 'angle_skew': array([3.10878737]),\n", - " 'spacing_primary': array([10.27276221]),\n", - " 'spacing_secondary': array([6.65078641])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.66831202]),\n", + " 'angle_skew': array([4.68726302]),\n", + " 'spacing_primary': array([10.50042123]),\n", + " 'spacing_secondary': array([4.23136768])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03349156])}\n", + "{'financese.lcoe': array([0.03357112])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|34\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.97150949]),\n", - " 'angle_skew': array([3.13361962]),\n", - " 'spacing_primary': array([10.26586472]),\n", - " 'spacing_secondary': array([6.65771845])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.67790999]),\n", + " 'angle_skew': array([4.68550449]),\n", + " 'spacing_primary': array([10.49833264]),\n", + " 'spacing_secondary': array([4.2325611])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03349054])}\n", + "{'financese.lcoe': array([0.03357096])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|35\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.97471229]),\n", - " 'angle_skew': array([3.16240794]),\n", - " 'spacing_primary': array([10.25667862]),\n", - " 'spacing_secondary': array([6.68372979])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.67785364]),\n", + " 'angle_skew': array([4.68505868]),\n", + " 'spacing_primary': array([10.49771257]),\n", + " 'spacing_secondary': array([4.23440869])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.0334902])}\n", + "{'financese.lcoe': array([0.03357061])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|36\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.97294762]),\n", - " 'angle_skew': array([3.19266705]),\n", - " 'spacing_primary': array([10.25888031]),\n", - " 'spacing_secondary': array([6.65772162])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.67793918]),\n", + " 'angle_skew': array([4.68426311]),\n", + " 'spacing_primary': array([10.49655202]),\n", + " 'spacing_secondary': array([4.23815206])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03348846])}\n", + "{'financese.lcoe': array([0.03356994])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|37\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.98282721]),\n", - " 'angle_skew': array([3.22341897]),\n", - " 'spacing_primary': array([10.25938009]),\n", - " 'spacing_secondary': array([6.63413215])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.6786557]),\n", + " 'angle_skew': array([4.68354482]),\n", + " 'spacing_primary': array([10.4941268]),\n", + " 'spacing_secondary': array([4.24570779])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03348738])}\n", + "{'financese.lcoe': array([0.03356983])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|38\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.98743922]),\n", - " 'angle_skew': array([3.26280778]),\n", - " 'spacing_primary': array([10.2542312]),\n", - " 'spacing_secondary': array([6.63499243])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.67771374]),\n", + " 'angle_skew': array([4.68100995]),\n", + " 'spacing_primary': array([10.49135862]),\n", + " 'spacing_secondary': array([4.24469571])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03348601])}\n", + "{'financese.lcoe': array([0.03356977])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|39\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([9.00395892]),\n", - " 'angle_skew': array([3.34033783]),\n", - " 'spacing_primary': array([10.24352712]),\n", - " 'spacing_secondary': array([6.63626258])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.67869541]),\n", + " 'angle_skew': array([4.67945733]),\n", + " 'spacing_primary': array([10.49213494]),\n", + " 'spacing_secondary': array([4.24484747])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03348343])}\n", + "{'financese.lcoe': array([0.03356946])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|40\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.93612225]),\n", - " 'angle_skew': array([3.48355345]),\n", - " 'spacing_primary': array([10.23731751]),\n", - " 'spacing_secondary': array([6.61507499])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.67969515]),\n", + " 'angle_skew': array([4.67611596]),\n", + " 'spacing_primary': array([10.49401504]),\n", + " 'spacing_secondary': array([4.24539613])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03347882])}\n", + "{'financese.lcoe': array([0.03356848])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|41\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.95916329]),\n", - " 'angle_skew': array([3.80019775]),\n", - " 'spacing_primary': array([10.20307325]),\n", - " 'spacing_secondary': array([6.5942704])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.68607364]),\n", + " 'angle_skew': array([4.67140637]),\n", + " 'spacing_primary': array([10.49503139]),\n", + " 'spacing_secondary': array([4.24507744])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03346946])}\n", + "{'financese.lcoe': array([0.03356819])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|42\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.99875165]),\n", - " 'angle_skew': array([4.10069548]),\n", - " 'spacing_primary': array([10.27891273]),\n", - " 'spacing_secondary': array([6.03571669])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.68279844]),\n", + " 'angle_skew': array([4.66437621]),\n", + " 'spacing_primary': array([10.49312488]),\n", + " 'spacing_secondary': array([4.24461354])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.0336019])}\n", + "{'financese.lcoe': array([0.03356762])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|43\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.89437289]),\n", - " 'angle_skew': array([3.82860692]),\n", - " 'spacing_primary': array([9.99398572]),\n", - " 'spacing_secondary': array([6.82595451])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.68151852]),\n", + " 'angle_skew': array([4.65942861]),\n", + " 'spacing_primary': array([10.49423132]),\n", + " 'spacing_secondary': array([4.25066819])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03354543])}\n", + "{'financese.lcoe': array([0.03356681])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|44\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.95835196]),\n", - " 'angle_skew': array([3.8101481]),\n", - " 'spacing_primary': array([10.26271389]),\n", - " 'spacing_secondary': array([6.64664718])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.68063247]),\n", + " 'angle_skew': array([4.65313933]),\n", + " 'spacing_primary': array([10.49318479]),\n", + " 'spacing_secondary': array([4.25541842])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03346738])}\n", + "{'financese.lcoe': array([0.03356564])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|45\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.98227427]),\n", - " 'angle_skew': array([3.81532101]),\n", - " 'spacing_primary': array([10.2341381]),\n", - " 'spacing_secondary': array([6.43976427])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.68340248]),\n", + " 'angle_skew': array([4.64975998]),\n", + " 'spacing_primary': array([10.48035301]),\n", + " 'spacing_secondary': array([4.26391856])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03348852])}\n", + "{'financese.lcoe': array([0.03356829])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|46\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.9197167]),\n", - " 'angle_skew': array([3.80310252]),\n", - " 'spacing_primary': array([10.20639718]),\n", - " 'spacing_secondary': array([6.58932262])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.67644609]),\n", + " 'angle_skew': array([4.6465506]),\n", + " 'spacing_primary': array([10.49424633]),\n", + " 'spacing_secondary': array([4.25402704])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03346921])}\n", + "{'financese.lcoe': array([0.03356515])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|47\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.90574977]),\n", - " 'angle_skew': array([3.82174101]),\n", - " 'spacing_primary': array([10.16655647]),\n", - " 'spacing_secondary': array([6.65466976])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.68003839]),\n", + " 'angle_skew': array([4.63941709]),\n", + " 'spacing_primary': array([10.4945764]),\n", + " 'spacing_secondary': array([4.25434244])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03347065])}\n", + "{'financese.lcoe': array([0.03356464])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|48\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.92178396]),\n", - " 'angle_skew': array([3.82244471]),\n", - " 'spacing_primary': array([10.20721649]),\n", - " 'spacing_secondary': array([6.58474715])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.67914659]),\n", + " 'angle_skew': array([4.63196963]),\n", + " 'spacing_primary': array([10.49426086]),\n", + " 'spacing_secondary': array([4.25710659])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03346877])}\n", + "{'financese.lcoe': array([0.03356389])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|49\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.91405197]),\n", - " 'angle_skew': array([3.85212766]),\n", - " 'spacing_primary': array([10.20908038]),\n", - " 'spacing_secondary': array([6.5591412])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.67651851]),\n", + " 'angle_skew': array([4.61920423]),\n", + " 'spacing_primary': array([10.49234585]),\n", + " 'spacing_secondary': array([4.26618791])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03346911])}\n", + "{'financese.lcoe': array([0.0335648])}\n", "\n", "Driver debug print for iter coord: rank0:ScipyOptimize_COBYLA|50\n", "----------------------------------------------------------------\n", "Design Vars\n", - "{'angle_orientation': array([8.92096623]),\n", - " 'angle_skew': array([3.82299027]),\n", - " 'spacing_primary': array([10.19726613]),\n", - " 'spacing_secondary': array([6.58490219])}\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "RuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:328\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_deflection/gauss.py:163\n", - "invalid value encountered in divideRuntimeWarning: /Users/cfrontin/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/floris/core/wake_velocity/gauss.py:80\n", - "invalid value encountered in divide" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "{'angle_orientation': array([13.67643722]),\n", + " 'angle_skew': array([4.62963738]),\n", + " 'spacing_primary': array([10.48993342]),\n", + " 'spacing_secondary': array([4.25140631])}\n", + "\n", "Objectives\n", - "{'financese.lcoe': array([0.03346879])}\n", + "{'financese.lcoe': array([0.03356462])}\n", "\n", "Return from COBYLA because the objective function has been evaluated MAXFUN times.\n", - "Number of function values = 50 Least value of F = 0.03346878666309313 Constraint violation = 0.0\n", + "Number of function values = 50 Least value of F = 0.033563887643952524 Constraint violation = 0.0\n", "The corresponding X is:\n", - "[10.19726613 6.58490219 8.92096623 3.82299027]\n", + "[10.49426086 4.25710659 13.67914659 4.63196963]\n", "The constraint value is:\n", - "[-7.19726613e+00 -3.58490219e+00 -1.88920966e+02 -4.88229903e+01\n", - " -9.80273387e+00 -1.34150978e+01 -1.71079034e+02 -4.11770097e+01\n", - " -2.46831711e-01 -2.24161401e+00 -2.65275439e+00 -1.90045167e+00\n", - " -4.53271484e-03 -1.14008252e+00 -3.30539637e+00 -4.32637720e+00\n", - " -3.00226636e+00 -3.83049316e-01 -7.61565918e-01 -3.38078296e+00\n", - " -5.99999604e+00 -3.38078296e+00 -7.61565918e-01 -3.83049316e-01\n", - " -3.00226636e+00 -4.32637720e+00 -3.30539637e+00 -1.14008252e+00\n", - " -4.53271484e-03 -1.90045167e+00 -2.65275439e+00 -2.24161401e+00\n", - " -2.46831711e-01 -7.73644597e-01 -2.09928919e+00 -3.42493379e+00\n", - " -4.75057839e+00 -3.05946391e-01 -9.78275808e-01 -2.17968140e+00\n", - " -3.46011786e+00 -4.76276842e+00 -1.16389278e+00 -1.54521208e+00\n", - " -2.50855162e+00 -3.67296403e+00 -4.91136280e+00 -2.02183917e+00\n", - " -2.26349232e+00 -3.01787579e+00 -4.03882742e+00 -5.18577369e+00\n", - " -2.87978557e+00 -3.04353049e+00 -3.64242417e+00 -4.52473279e+00\n", - " -5.56910323e+00 -7.73644597e-01 -2.09928919e+00 -3.42493379e+00\n", - " -1.07436625e+00 -3.05946391e-01 -9.78275808e-01 -2.17968140e+00\n", - " -3.46011786e+00 -1.68517339e+00 -1.16389278e+00 -1.54521208e+00\n", - " -2.50855162e+00 -3.67296403e+00 -2.42070355e+00 -2.02183917e+00\n", - " -2.26349232e+00 -3.01787579e+00 -4.03882742e+00 -3.20846965e+00\n", - " -2.87978557e+00 -3.04353049e+00 -3.64242417e+00 -4.52473279e+00\n", - " -7.73644597e-01 -2.09928919e+00 -2.28855092e+00 -1.07436625e+00\n", - " -3.05946391e-01 -9.78275808e-01 -2.17968140e+00 -2.70073249e+00\n", - " -1.68517339e+00 -1.16389278e+00 -1.54521208e+00 -2.50855162e+00\n", - " -3.26427460e+00 -2.42070355e+00 -2.02183917e+00 -2.26349232e+00\n", - " -3.01787579e+00 -3.92234677e+00 -3.20846965e+00 -2.87978557e+00\n", - " -3.04353049e+00 -3.64242417e+00 -7.73644597e-01 -3.57196157e+00\n", - " -2.28855092e+00 -1.07436625e+00 -3.05946391e-01 -9.78275808e-01\n", - " -3.88311666e+00 -2.70073249e+00 -1.68517339e+00 -1.16389278e+00\n", - " -1.54521208e+00 -4.32709874e+00 -3.26427460e+00 -2.42070355e+00\n", - " -2.02183917e+00 -2.26349232e+00 -4.87138393e+00 -3.92234677e+00\n", - " -3.20846965e+00 -2.87978557e+00 -3.04353049e+00 -4.87571184e+00\n", - " -3.57196157e+00 -2.28855092e+00 -1.07436625e+00 -3.05946391e-01\n", - " -5.12910184e+00 -3.88311666e+00 -2.70073249e+00 -1.68517339e+00\n", - " -1.16389278e+00 -5.49464571e+00 -4.32709874e+00 -3.26427460e+00\n", - " -2.42070355e+00 -2.02183917e+00 -5.95346498e+00 -4.87138393e+00\n", - " -3.92234677e+00 -3.20846965e+00 -2.87978557e+00 -7.73644597e-01\n", - " -2.09928919e+00 -3.42493379e+00 -4.75057839e+00 -3.05946391e-01\n", - " -9.78275808e-01 -2.17968140e+00 -3.46011786e+00 -4.76276842e+00\n", - " -1.16389278e+00 -1.54521208e+00 -2.50855162e+00 -3.67296403e+00\n", - " -4.91136280e+00 -2.02183917e+00 -2.26349232e+00 -3.01787579e+00\n", - " -4.03882742e+00 -5.18577369e+00 -7.73644597e-01 -2.09928919e+00\n", - " -3.42493379e+00 -1.07436625e+00 -3.05946391e-01 -9.78275808e-01\n", - " -2.17968140e+00 -3.46011786e+00 -1.68517339e+00 -1.16389278e+00\n", - " -1.54521208e+00 -2.50855162e+00 -3.67296403e+00 -2.42070355e+00\n", - " -2.02183917e+00 -2.26349232e+00 -3.01787579e+00 -4.03882742e+00\n", - " -7.73644597e-01 -2.09928919e+00 -2.28855092e+00 -1.07436625e+00\n", - " -3.05946391e-01 -9.78275808e-01 -2.17968140e+00 -2.70073249e+00\n", - " -1.68517339e+00 -1.16389278e+00 -1.54521208e+00 -2.50855162e+00\n", - " -3.26427460e+00 -2.42070355e+00 -2.02183917e+00 -2.26349232e+00\n", - " -3.01787579e+00 -7.73644597e-01 -3.57196157e+00 -2.28855092e+00\n", - " -1.07436625e+00 -3.05946391e-01 -9.78275808e-01 -3.88311666e+00\n", - " -2.70073249e+00 -1.68517339e+00 -1.16389278e+00 -1.54521208e+00\n", - " -4.32709874e+00 -3.26427460e+00 -2.42070355e+00 -2.02183917e+00\n", - " -2.26349232e+00 -4.87571184e+00 -3.57196157e+00 -2.28855092e+00\n", - " -1.07436625e+00 -3.05946391e-01 -5.12910184e+00 -3.88311666e+00\n", - " -2.70073249e+00 -1.68517339e+00 -1.16389278e+00 -5.49464571e+00\n", - " -4.32709874e+00 -3.26427460e+00 -2.42070355e+00 -2.02183917e+00\n", - " -7.73644597e-01 -2.09928919e+00 -3.42493379e+00 -4.75057839e+00\n", - " -3.05946391e-01 -9.78275808e-01 -2.17968140e+00 -3.46011786e+00\n", - " -4.76276842e+00 -1.16389278e+00 -1.54521208e+00 -2.50855162e+00\n", - " -3.67296403e+00 -4.91136280e+00 -7.73644597e-01 -2.09928919e+00\n", - " -3.42493379e+00 -1.07436625e+00 -3.05946391e-01 -9.78275808e-01\n", - " -2.17968140e+00 -3.46011786e+00 -1.68517339e+00 -1.16389278e+00\n", - " -1.54521208e+00 -2.50855162e+00 -3.67296403e+00 -7.73644597e-01\n", - " -2.09928919e+00 -2.28855092e+00 -1.07436625e+00 -3.05946391e-01\n", - " -9.78275808e-01 -2.17968140e+00 -2.70073249e+00 -1.68517339e+00\n", - " -1.16389278e+00 -1.54521208e+00 -2.50855162e+00 -7.73644597e-01\n", - " -3.57196157e+00 -2.28855092e+00 -1.07436625e+00 -3.05946391e-01\n", - " -9.78275808e-01 -3.88311666e+00 -2.70073249e+00 -1.68517339e+00\n", - " -1.16389278e+00 -1.54521208e+00 -4.87571184e+00 -3.57196157e+00\n", - " -2.28855092e+00 -1.07436625e+00 -3.05946391e-01 -5.12910184e+00\n", - " -3.88311666e+00 -2.70073249e+00 -1.68517339e+00 -1.16389278e+00\n", - " -7.73644597e-01 -2.09928919e+00 -3.42493379e+00 -4.75057839e+00\n", - " -3.05946391e-01 -9.78275808e-01 -2.17968140e+00 -3.46011786e+00\n", - " -4.76276842e+00 -7.73644597e-01 -2.09928919e+00 -3.42493379e+00\n", - " -1.07436625e+00 -3.05946391e-01 -9.78275808e-01 -2.17968140e+00\n", - " -3.46011786e+00 -7.73644597e-01 -2.09928919e+00 -2.28855092e+00\n", - " -1.07436625e+00 -3.05946391e-01 -9.78275808e-01 -2.17968140e+00\n", - " -7.73644597e-01 -3.57196157e+00 -2.28855092e+00 -1.07436625e+00\n", - " -3.05946391e-01 -9.78275808e-01 -4.87571184e+00 -3.57196157e+00\n", - " -2.28855092e+00 -1.07436625e+00 -3.05946391e-01 -7.73644597e-01\n", - " -2.09928919e+00 -3.42493379e+00 -4.75057839e+00 -7.73644597e-01\n", - " -2.09928919e+00 -3.42493379e+00 -7.73644597e-01 -2.09928919e+00\n", - " -7.73644597e-01]\n", + "[-7.49426086e+00 -1.25710659e+00 -1.93679147e+02 -4.96319696e+01\n", + " -9.50573914e+00 -1.57428934e+01 -1.66320853e+02 -4.03680304e+01\n", + " -7.04668506e-01 -3.03554985e+00 -3.89150977e+00 -2.65111523e+00\n", + " -9.76562500e-07 -1.04665625e+00 -3.53431468e+00 -4.94575488e+00\n", + " -3.00000049e+00 -3.48886230e-01 -6.97770996e-01 -3.34888550e+00\n", + " -5.99999604e+00 -3.34888550e+00 -6.97770996e-01 -3.48886230e-01\n", + " -3.00000049e+00 -4.94575488e+00 -3.53431468e+00 -1.04665625e+00\n", + " -9.76562500e-07 -2.65111523e+00 -3.89150977e+00 -3.03554985e+00\n", + " -7.04668506e-01 -8.12253911e-01 -2.17650782e+00 -3.54076173e+00\n", + " -4.90501565e+00 -3.23727596e-03 -8.78781496e-01 -2.18813876e+00\n", + " -3.53357984e+00 -4.88839909e+00 -5.58474552e-01 -1.13609345e+00\n", + " -2.30956299e+00 -3.60128827e+00 -4.92827752e+00 -1.11371183e+00\n", + " -1.51409782e+00 -2.52782174e+00 -3.74034449e+00 -5.02343881e+00\n", + " -1.66894910e+00 -1.95886394e+00 -2.82418691e+00 -3.94413343e+00\n", + " -5.17112598e+00 -8.12253911e-01 -2.17650782e+00 -3.54076173e+00\n", + " -9.61875373e-01 -3.23727596e-03 -8.78781496e-01 -2.18813876e+00\n", + " -3.53357984e+00 -1.27530004e+00 -5.58474552e-01 -1.13609345e+00\n", + " -2.30956299e+00 -3.60128827e+00 -1.68469601e+00 -1.11371183e+00\n", + " -1.51409782e+00 -2.52782174e+00 -3.74034449e+00 -2.14673481e+00\n", + " -1.66894910e+00 -1.95886394e+00 -2.82418691e+00 -3.94413343e+00\n", + " -8.12253911e-01 -2.17650782e+00 -2.27602516e+00 -9.61875373e-01\n", + " -3.23727596e-03 -8.78781496e-01 -2.18813876e+00 -2.47575075e+00\n", + " -1.27530004e+00 -5.58474552e-01 -1.13609345e+00 -2.30956299e+00\n", + " -2.75759207e+00 -1.68469601e+00 -1.11371183e+00 -1.51409782e+00\n", + " -2.52782174e+00 -3.10260007e+00 -2.14673481e+00 -1.66894910e+00\n", + " -1.95886394e+00 -2.82418691e+00 -8.12253911e-01 -3.62244745e+00\n", + " -2.27602516e+00 -9.61875373e-01 -3.23727596e-03 -8.78781496e-01\n", + " -3.77441898e+00 -2.47575075e+00 -1.27530004e+00 -5.58474552e-01\n", + " -1.13609345e+00 -3.98962612e+00 -2.75759207e+00 -1.68469601e+00\n", + " -1.11371183e+00 -1.51409782e+00 -4.25959134e+00 -3.10260007e+00\n", + " -2.14673481e+00 -1.66894910e+00 -1.95886394e+00 -4.97761790e+00\n", + " -3.62244745e+00 -2.27602516e+00 -9.61875373e-01 -3.23727596e-03\n", + " -5.10405033e+00 -3.77441898e+00 -2.47575075e+00 -1.27530004e+00\n", + " -5.58474552e-01 -5.28081350e+00 -3.98962612e+00 -2.75759207e+00\n", + " -1.68469601e+00 -1.11371183e+00 -5.50350149e+00 -4.25959134e+00\n", + " -3.10260007e+00 -2.14673481e+00 -1.66894910e+00 -8.12253911e-01\n", + " -2.17650782e+00 -3.54076173e+00 -4.90501565e+00 -3.23727596e-03\n", + " -8.78781496e-01 -2.18813876e+00 -3.53357984e+00 -4.88839909e+00\n", + " -5.58474552e-01 -1.13609345e+00 -2.30956299e+00 -3.60128827e+00\n", + " -4.92827752e+00 -1.11371183e+00 -1.51409782e+00 -2.52782174e+00\n", + " -3.74034449e+00 -5.02343881e+00 -8.12253911e-01 -2.17650782e+00\n", + " -3.54076173e+00 -9.61875373e-01 -3.23727596e-03 -8.78781496e-01\n", + " -2.18813876e+00 -3.53357984e+00 -1.27530004e+00 -5.58474552e-01\n", + " -1.13609345e+00 -2.30956299e+00 -3.60128827e+00 -1.68469601e+00\n", + " -1.11371183e+00 -1.51409782e+00 -2.52782174e+00 -3.74034449e+00\n", + " -8.12253911e-01 -2.17650782e+00 -2.27602516e+00 -9.61875373e-01\n", + " -3.23727596e-03 -8.78781496e-01 -2.18813876e+00 -2.47575075e+00\n", + " -1.27530004e+00 -5.58474552e-01 -1.13609345e+00 -2.30956299e+00\n", + " -2.75759207e+00 -1.68469601e+00 -1.11371183e+00 -1.51409782e+00\n", + " -2.52782174e+00 -8.12253911e-01 -3.62244745e+00 -2.27602516e+00\n", + " -9.61875373e-01 -3.23727596e-03 -8.78781496e-01 -3.77441898e+00\n", + " -2.47575075e+00 -1.27530004e+00 -5.58474552e-01 -1.13609345e+00\n", + " -3.98962612e+00 -2.75759207e+00 -1.68469601e+00 -1.11371183e+00\n", + " -1.51409782e+00 -4.97761790e+00 -3.62244745e+00 -2.27602516e+00\n", + " -9.61875373e-01 -3.23727596e-03 -5.10405033e+00 -3.77441898e+00\n", + " -2.47575075e+00 -1.27530004e+00 -5.58474552e-01 -5.28081350e+00\n", + " -3.98962612e+00 -2.75759207e+00 -1.68469601e+00 -1.11371183e+00\n", + " -8.12253911e-01 -2.17650782e+00 -3.54076173e+00 -4.90501565e+00\n", + " -3.23727596e-03 -8.78781496e-01 -2.18813876e+00 -3.53357984e+00\n", + " -4.88839909e+00 -5.58474552e-01 -1.13609345e+00 -2.30956299e+00\n", + " -3.60128827e+00 -4.92827752e+00 -8.12253911e-01 -2.17650782e+00\n", + " -3.54076173e+00 -9.61875373e-01 -3.23727596e-03 -8.78781496e-01\n", + " -2.18813876e+00 -3.53357984e+00 -1.27530004e+00 -5.58474552e-01\n", + " -1.13609345e+00 -2.30956299e+00 -3.60128827e+00 -8.12253911e-01\n", + " -2.17650782e+00 -2.27602516e+00 -9.61875373e-01 -3.23727596e-03\n", + " -8.78781496e-01 -2.18813876e+00 -2.47575075e+00 -1.27530004e+00\n", + " -5.58474552e-01 -1.13609345e+00 -2.30956299e+00 -8.12253911e-01\n", + " -3.62244745e+00 -2.27602516e+00 -9.61875373e-01 -3.23727596e-03\n", + " -8.78781496e-01 -3.77441898e+00 -2.47575075e+00 -1.27530004e+00\n", + " -5.58474552e-01 -1.13609345e+00 -4.97761790e+00 -3.62244745e+00\n", + " -2.27602516e+00 -9.61875373e-01 -3.23727596e-03 -5.10405033e+00\n", + " -3.77441898e+00 -2.47575075e+00 -1.27530004e+00 -5.58474552e-01\n", + " -8.12253911e-01 -2.17650782e+00 -3.54076173e+00 -4.90501565e+00\n", + " -3.23727596e-03 -8.78781496e-01 -2.18813876e+00 -3.53357984e+00\n", + " -4.88839909e+00 -8.12253911e-01 -2.17650782e+00 -3.54076173e+00\n", + " -9.61875373e-01 -3.23727596e-03 -8.78781496e-01 -2.18813876e+00\n", + " -3.53357984e+00 -8.12253911e-01 -2.17650782e+00 -2.27602516e+00\n", + " -9.61875373e-01 -3.23727596e-03 -8.78781496e-01 -2.18813876e+00\n", + " -8.12253911e-01 -3.62244745e+00 -2.27602516e+00 -9.61875373e-01\n", + " -3.23727596e-03 -8.78781496e-01 -4.97761790e+00 -3.62244745e+00\n", + " -2.27602516e+00 -9.61875373e-01 -3.23727596e-03 -8.12253911e-01\n", + " -2.17650782e+00 -3.54076173e+00 -4.90501565e+00 -8.12253911e-01\n", + " -2.17650782e+00 -3.54076173e+00 -8.12253911e-01 -2.17650782e+00\n", + " -8.12253911e-01]\n", "\n", "Optimization FAILED.\n", "Return from COBYLA because the objective function has been evaluated MAXFUN times.\n", @@ -1697,14 +852,14 @@ "\n", "RESULTS (opt):\n", "\n", - "{'AEP_val': 453.31177490509094,\n", - " 'BOS_val': 41.923934482221036,\n", + "{'AEP_val': 449.67167461051525,\n", + " 'BOS_val': 40.87410354289458,\n", " 'CapEx_val': 110.5,\n", - " 'LCOE_val': 33.46878666309313,\n", + " 'LCOE_val': 33.56461751519039,\n", " 'OpEx_val': 3.7400000000000007,\n", - " 'area_tight': 18.15681922585348,\n", - " 'coll_length': 23.423806992035267,\n", - " 'turbine_spacing': 0.8579463914778505}\n", + " 'area_tight': 12.059020447125771,\n", + " 'coll_length': 18.064954745483238,\n", + " 'turbine_spacing': 0.5544919826485551}\n", "\n", "\n", "\n" @@ -1716,7 +871,6 @@ "if optimize:\n", " # run the optimization\n", " prob.run_driver()\n", - " prob.cleanup()\n", "\n", " # collapse the test result data\n", " test_data = {\n", @@ -1751,7 +905,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] diff --git a/examples/x07_exclusion/case_gen.ipynb b/examples/x07_exclusion/case_gen.ipynb new file mode 100644 index 00000000..3aefe73b --- /dev/null +++ b/examples/x07_exclusion/case_gen.ipynb @@ -0,0 +1,761 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "4617a6f4", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path # optional, for nice path specifications\n", + "\n", + "import pprint as pp # optional, for nice printing\n", + "import numpy as np # numerics library\n", + "import matplotlib.pyplot as plt # plotting capabilities\n", + "import pandas as pd\n", + "\n", + "import ard # technically we only really need this\n", + "from ard.utils.io import load_yaml # we grab a yaml loader here\n", + "from ard.api import set_up_ard_model # the secret sauce\n", + "from ard.viz.layout import plot_layout # a plotting tool!\n", + "\n", + "import openmdao.api as om # for N2 diagrams from the OpenMDAO backend\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "30567b24", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Adding top_level\n", + "Adding gridfarm\n", + "Adding boundary\n", + "Adding exclusions\n", + "Adding spacing_constraint\n" + ] + } + ], + "source": [ + "# load input\n", + "path_inputs = Path.cwd().absolute() / \"inputs\"\n", + "input_dict = load_yaml(path_inputs / \"ard_frankenstein.yaml\")\n", + "\n", + "# create and setup system\n", + "prob = set_up_ard_model(input_dict=input_dict, root_data_path=path_inputs)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2f906546", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Problem: problem\n", + "Driver: DOEDriver\n", + " success : True\n", + " iterations : 50000\n", + " runtime : 5.7779E+01 s\n", + " model_evals : 50000\n", + " model_time : 2.1103E+01 s\n", + " deriv_evals : 0\n", + " deriv_time : 0.0000E+00 s\n", + " exit_status : SUCCESS" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prob.run_driver()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "de4c7484", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
case_idangle_orientationspacing_primaryangle_skewspacing_secondarymax_boundary_distanceboundary_satisfyingmax_exclusion_distanceexclusion_satisfyingturbine_spacing_satisfyingx_turbinesy_turbines
0rank0:DOEDriver_LatinHypercube|043.1174207.362764-29.7999766.251130628.199667False-29.306325TrueTrue[-535.1264437847808, 119.08784828972239, 773.3...[436.5933692140518, 1135.2760989250046, 1833.9...
1rank0:DOEDriver_LatinHypercube|163.49873413.79977841.08056712.3178182213.367716False-232.506532TrueTrue[-40.337800630846004, 1565.1309430943984, 3170...[2175.0193952812915, 2975.5208737514145, 3776....
2rank0:DOEDriver_LatinHypercube|2153.92322114.229969-44.9728524.2368721085.654123False-11.039665TrueTrue[470.0583414137956, 1283.2266821104065, 2096.3...[3317.5208095966454, 1655.9335593629257, -5.65...
3rank0:DOEDriver_LatinHypercube|3119.0633377.879951-22.6360184.688219339.533492False-118.337343TrueTrue[208.90107421518348, 1104.3063617722169, 1999....[2073.371868789938, 1575.7458759912429, 1078.1...
4rank0:DOEDriver_LatinHypercube|4172.48310210.4737151.6008907.814066728.462950False-177.667193TrueTrue[1863.079161172218, 2041.1995059544563, 2219.3...[2374.185913574902, 1024.304005544126, -325.57...
.......................................
49995rank0:DOEDriver_LatinHypercube|49995127.8650853.8279957.4916566.451292128.273109False130.060015FalseFalse[1239.367170679271, 1632.2327025869909, 2025.0...[1819.4121745429509, 1513.959007204571, 1208.5...
49996rank0:DOEDriver_LatinHypercube|49996102.4637143.6144251.45133312.500468469.784583False122.857292FalseFalse[962.5098669716621, 1421.3114959891698, 1880.1...[2598.847210119348, 2497.4381355499627, 2396.0...
49997rank0:DOEDriver_LatinHypercube|49997177.9473145.33434114.7553559.235750697.437087False150.384131FalseTrue[2216.751525033408, 2241.5903553373555, 2266.4...[1339.564793221956, 646.545390882799, -46.4740...
49998rank0:DOEDriver_LatinHypercube|4999870.8926806.37882614.21070211.884311785.000504False-232.506532TrueTrue[110.78720674561703, 894.3489213793423, 1677.9...[2236.0292577233186, 2507.473941144228, 2778.9...
49999rank0:DOEDriver_LatinHypercube|49999147.82354110.840745-4.46086511.3049041191.983639False-232.506532TrueTrue[1462.7587405128606, 2213.2495733581154, 2963....[2992.074738864023, 1799.2288935474107, 606.38...
\n", + "

50000 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " case_id angle_orientation \\\n", + "0 rank0:DOEDriver_LatinHypercube|0 43.117420 \n", + "1 rank0:DOEDriver_LatinHypercube|1 63.498734 \n", + "2 rank0:DOEDriver_LatinHypercube|2 153.923221 \n", + "3 rank0:DOEDriver_LatinHypercube|3 119.063337 \n", + "4 rank0:DOEDriver_LatinHypercube|4 172.483102 \n", + "... ... ... \n", + "49995 rank0:DOEDriver_LatinHypercube|49995 127.865085 \n", + "49996 rank0:DOEDriver_LatinHypercube|49996 102.463714 \n", + "49997 rank0:DOEDriver_LatinHypercube|49997 177.947314 \n", + "49998 rank0:DOEDriver_LatinHypercube|49998 70.892680 \n", + "49999 rank0:DOEDriver_LatinHypercube|49999 147.823541 \n", + "\n", + " spacing_primary angle_skew spacing_secondary max_boundary_distance \\\n", + "0 7.362764 -29.799976 6.251130 628.199667 \n", + "1 13.799778 41.080567 12.317818 2213.367716 \n", + "2 14.229969 -44.972852 4.236872 1085.654123 \n", + "3 7.879951 -22.636018 4.688219 339.533492 \n", + "4 10.473715 1.600890 7.814066 728.462950 \n", + "... ... ... ... ... \n", + "49995 3.827995 7.491656 6.451292 128.273109 \n", + "49996 3.614425 1.451333 12.500468 469.784583 \n", + "49997 5.334341 14.755355 9.235750 697.437087 \n", + "49998 6.378826 14.210702 11.884311 785.000504 \n", + "49999 10.840745 -4.460865 11.304904 1191.983639 \n", + "\n", + " boundary_satisfying max_exclusion_distance exclusion_satisfying \\\n", + "0 False -29.306325 True \n", + "1 False -232.506532 True \n", + "2 False -11.039665 True \n", + "3 False -118.337343 True \n", + "4 False -177.667193 True \n", + "... ... ... ... \n", + "49995 False 130.060015 False \n", + "49996 False 122.857292 False \n", + "49997 False 150.384131 False \n", + "49998 False -232.506532 True \n", + "49999 False -232.506532 True \n", + "\n", + " turbine_spacing_satisfying \\\n", + "0 True \n", + "1 True \n", + "2 True \n", + "3 True \n", + "4 True \n", + "... ... \n", + "49995 False \n", + "49996 False \n", + "49997 True \n", + "49998 True \n", + "49999 True \n", + "\n", + " x_turbines \\\n", + "0 [-535.1264437847808, 119.08784828972239, 773.3... \n", + "1 [-40.337800630846004, 1565.1309430943984, 3170... \n", + "2 [470.0583414137956, 1283.2266821104065, 2096.3... \n", + "3 [208.90107421518348, 1104.3063617722169, 1999.... \n", + "4 [1863.079161172218, 2041.1995059544563, 2219.3... \n", + "... ... \n", + "49995 [1239.367170679271, 1632.2327025869909, 2025.0... \n", + "49996 [962.5098669716621, 1421.3114959891698, 1880.1... \n", + "49997 [2216.751525033408, 2241.5903553373555, 2266.4... \n", + "49998 [110.78720674561703, 894.3489213793423, 1677.9... \n", + "49999 [1462.7587405128606, 2213.2495733581154, 2963.... \n", + "\n", + " y_turbines \n", + "0 [436.5933692140518, 1135.2760989250046, 1833.9... \n", + "1 [2175.0193952812915, 2975.5208737514145, 3776.... \n", + "2 [3317.5208095966454, 1655.9335593629257, -5.65... \n", + "3 [2073.371868789938, 1575.7458759912429, 1078.1... \n", + "4 [2374.185913574902, 1024.304005544126, -325.57... \n", + "... ... \n", + "49995 [1819.4121745429509, 1513.959007204571, 1208.5... \n", + "49996 [2598.847210119348, 2497.4381355499627, 2396.0... \n", + "49997 [1339.564793221956, 646.545390882799, -46.4740... \n", + "49998 [2236.0292577233186, 2507.473941144228, 2778.9... \n", + "49999 [2992.074738864023, 1799.2288935474107, 606.38... \n", + "\n", + "[50000 rows x 12 columns]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Access the recorder data\n", + "case_reader = om.CaseReader(prob.get_outputs_dir() / \"cases.sql\")\n", + "\n", + "# Get all driver cases\n", + "driver_cases = case_reader.list_cases(\"driver\", out_stream=None)\n", + "\n", + "# Extract data from all cases\n", + "results = []\n", + "for index_case, case_id in enumerate(driver_cases):\n", + "\n", + " case = case_reader.get_case(case_id)\n", + "\n", + " result = {\n", + " \"case_id\": case_id,\n", + " \"angle_orientation\": float(case.get_val(\"angle_orientation\")[0]),\n", + " \"spacing_primary\": float(case.get_val(\"spacing_primary\")[0]),\n", + " \"angle_skew\": float(case.get_val(\"angle_skew\")[0]),\n", + " \"spacing_secondary\": float(case.get_val(\"spacing_secondary\")[0]),\n", + " \"max_boundary_distance\": float(np.max(case.get_val(\"boundary_distances\"))),\n", + " \"boundary_satisfying\": np.all(np.max(case.get_val(\"boundary_distances\")) <= 0.0),\n", + " \"max_exclusion_distance\": float(np.max(case.get_val(\"exclusion_distances\"))),\n", + " \"exclusion_satisfying\": np.all(np.max(case.get_val(\"exclusion_distances\")) <= 0.0),\n", + " \"turbine_spacing_satisfying\": np.all(case.get_val(\"spacing_constraint.turbine_spacing\", units=\"km\") >= 0.552),\n", + " \"x_turbines\": case.get_val(\"x_turbines\"),\n", + " \"y_turbines\": case.get_val(\"y_turbines\"),\n", + " }\n", + " results.append(result)\n", + "\n", + "\n", + "\n", + "results = pd.DataFrame(results)\n", + "results" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "b8a07f8f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
case_idangle_orientationspacing_primaryangle_skewspacing_secondarymax_boundary_distanceboundary_satisfyingmax_exclusion_distanceexclusion_satisfyingturbine_spacing_satisfyingx_turbinesy_turbines
98rank0:DOEDriver_LatinHypercube|984.3223426.33117417.9025564.165854-25.262635True176.099645FalseTrue[441.51967987703097, 503.55116224157007, 565.5...[314.1141575334741, 1134.8259136079837, 1955.5...
102rank0:DOEDriver_LatinHypercube|102103.5199705.0080058.5206146.657907-0.916619True96.351983FalseTrue[725.8131015447784, 1358.8123878103113, 1991.8...[1882.9916881909248, 1730.7886434496586, 1578....
643rank0:DOEDriver_LatinHypercube|64317.4609494.99025612.8858284.162992-194.401586True145.334875FalseTrue[356.6278586693903, 551.2840041949662, 745.940...[581.2103615891912, 1200.0511573938718, 1818.8...
905rank0:DOEDriver_LatinHypercube|90599.7535984.7472965.0238136.729700-134.898735True97.025110FalseTrue[646.1653027692987, 1254.3932226800246, 1862.6...[1873.2995714739131, 1768.7475745644056, 1664....
1211rank0:DOEDriver_LatinHypercube|121194.4979604.246709-1.7808684.424870-88.911211True60.245027FalseTrue[507.2965264437157, 1057.668412925124, 1608.04...[1537.720726755957, 1494.425238518314, 1451.12...
.......................................
49580rank0:DOEDriver_LatinHypercube|495805.9990557.446525-12.5548724.214911-14.436132True72.146455FalseTrue[371.5230880114243, 472.695799938102, 573.8685...[-107.27690369887091, 855.4699589051128, 1818....
49601rank0:DOEDriver_LatinHypercube|4960128.1620436.080311-31.4899683.901676-14.640468True106.502169FalseTrue[63.51263663021041, 436.57429941032126, 809.63...[188.16663844106597, 885.0318289604253, 1581.8...
49714rank0:DOEDriver_LatinHypercube|49714104.9080124.7802468.8964104.750243-40.951536True125.182784FalseTrue[682.1525448032633, 1282.6672432652922, 1883.1...[1651.312904270587, 1491.4383758073525, 1331.5...
49828rank0:DOEDriver_LatinHypercube|4982897.4327394.7679364.6017165.759782-100.128158True52.984766FalseTrue[572.3868605058601, 1187.0102990466494, 1801.6...[1734.4277066401223, 1654.2449074880121, 1574....
49857rank0:DOEDriver_LatinHypercube|4985773.3227295.49166932.2836353.595511-145.756898True147.941201FalseTrue[495.2403309799397, 1179.1273365021418, 1863.0...[1247.1819308457302, 1452.0621917860651, 1656....
\n", + "

343 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " case_id angle_orientation \\\n", + "98 rank0:DOEDriver_LatinHypercube|98 4.322342 \n", + "102 rank0:DOEDriver_LatinHypercube|102 103.519970 \n", + "643 rank0:DOEDriver_LatinHypercube|643 17.460949 \n", + "905 rank0:DOEDriver_LatinHypercube|905 99.753598 \n", + "1211 rank0:DOEDriver_LatinHypercube|1211 94.497960 \n", + "... ... ... \n", + "49580 rank0:DOEDriver_LatinHypercube|49580 5.999055 \n", + "49601 rank0:DOEDriver_LatinHypercube|49601 28.162043 \n", + "49714 rank0:DOEDriver_LatinHypercube|49714 104.908012 \n", + "49828 rank0:DOEDriver_LatinHypercube|49828 97.432739 \n", + "49857 rank0:DOEDriver_LatinHypercube|49857 73.322729 \n", + "\n", + " spacing_primary angle_skew spacing_secondary max_boundary_distance \\\n", + "98 6.331174 17.902556 4.165854 -25.262635 \n", + "102 5.008005 8.520614 6.657907 -0.916619 \n", + "643 4.990256 12.885828 4.162992 -194.401586 \n", + "905 4.747296 5.023813 6.729700 -134.898735 \n", + "1211 4.246709 -1.780868 4.424870 -88.911211 \n", + "... ... ... ... ... \n", + "49580 7.446525 -12.554872 4.214911 -14.436132 \n", + "49601 6.080311 -31.489968 3.901676 -14.640468 \n", + "49714 4.780246 8.896410 4.750243 -40.951536 \n", + "49828 4.767936 4.601716 5.759782 -100.128158 \n", + "49857 5.491669 32.283635 3.595511 -145.756898 \n", + "\n", + " boundary_satisfying max_exclusion_distance exclusion_satisfying \\\n", + "98 True 176.099645 False \n", + "102 True 96.351983 False \n", + "643 True 145.334875 False \n", + "905 True 97.025110 False \n", + "1211 True 60.245027 False \n", + "... ... ... ... \n", + "49580 True 72.146455 False \n", + "49601 True 106.502169 False \n", + "49714 True 125.182784 False \n", + "49828 True 52.984766 False \n", + "49857 True 147.941201 False \n", + "\n", + " turbine_spacing_satisfying \\\n", + "98 True \n", + "102 True \n", + "643 True \n", + "905 True \n", + "1211 True \n", + "... ... \n", + "49580 True \n", + "49601 True \n", + "49714 True \n", + "49828 True \n", + "49857 True \n", + "\n", + " x_turbines \\\n", + "98 [441.51967987703097, 503.55116224157007, 565.5... \n", + "102 [725.8131015447784, 1358.8123878103113, 1991.8... \n", + "643 [356.6278586693903, 551.2840041949662, 745.940... \n", + "905 [646.1653027692987, 1254.3932226800246, 1862.6... \n", + "1211 [507.2965264437157, 1057.668412925124, 1608.04... \n", + "... ... \n", + "49580 [371.5230880114243, 472.695799938102, 573.8685... \n", + "49601 [63.51263663021041, 436.57429941032126, 809.63... \n", + "49714 [682.1525448032633, 1282.6672432652922, 1883.1... \n", + "49828 [572.3868605058601, 1187.0102990466494, 1801.6... \n", + "49857 [495.2403309799397, 1179.1273365021418, 1863.0... \n", + "\n", + " y_turbines \n", + "98 [314.1141575334741, 1134.8259136079837, 1955.5... \n", + "102 [1882.9916881909248, 1730.7886434496586, 1578.... \n", + "643 [581.2103615891912, 1200.0511573938718, 1818.8... \n", + "905 [1873.2995714739131, 1768.7475745644056, 1664.... \n", + "1211 [1537.720726755957, 1494.425238518314, 1451.12... \n", + "... ... \n", + "49580 [-107.27690369887091, 855.4699589051128, 1818.... \n", + "49601 [188.16663844106597, 885.0318289604253, 1581.8... \n", + "49714 [1651.312904270587, 1491.4383758073525, 1331.5... \n", + "49828 [1734.4277066401223, 1654.2449074880121, 1574.... \n", + "49857 [1247.1819308457302, 1452.0621917860651, 1656.... \n", + "\n", + "[343 rows x 12 columns]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results[results.boundary_satisfying & results.turbine_spacing_satisfying]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "49d6fe3a", + "metadata": {}, + "outputs": [], + "source": [ + "results.to_csv(\"structured_layout_samples.csv\", index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d4a97e38", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ard-dev-env", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/x07_exclusion/inputs/ard_frankenstein.yaml b/examples/x07_exclusion/inputs/ard_frankenstein.yaml new file mode 100644 index 00000000..fdad384c --- /dev/null +++ b/examples/x07_exclusion/inputs/ard_frankenstein.yaml @@ -0,0 +1,191 @@ +modeling_options: &modeling_options + windIO_plant: !include windio.yaml + heterogeneous_map: + x: [-100.0, -100.0, 1500.0, 1500.0, 1030.39] + y: [-100.0, 1500.0, 1500.0, -100.0, 919.56] + speed_multipliers: [ + [1.0, 1.0, 1.0, 1.0, 1.125], + [1.0, 1.0, 1.0, 1.0, 1.125], + [1.0, 1.0, 1.0, 1.0, 1.125], + ] + wind_directions: [0.0, 157.5, 270.0] + wind_speeds: [6.0, 7.5, 12.0] + interp_method: linear + layout: + type: gridfarm + N_turbines: 7 + N_substations: 1 + x0: 1030.3866383200511 # m + y0: 919.5612218388537 # m + angle_orientation: 0.0 + spacing_primary: 7.0 + angle_skew: 0.0 + spacing_secondary: 7.0 + aero: + return_turbine_output: True + floris: + peak_shaving_fraction: 0.2 + peak_shaving_TI_threshold: 0.0 + collection: + max_turbines_per_string: 8 + solver_name: highs + solver_options: + time_limit: 60 + mip_gap: 0.02 + model_options: + topology: radial # radial, branched + feeder_route: segmented + feeder_limit: unlimited + offshore: false + floating: false + costs: + rated_power: 3400000.0 # W + num_blades: 3 + rated_thrust_N: 645645.83964671 + gust_velocity_m_per_s: 52.5 + blade_surface_area: 69.7974979 + tower_mass: 620.4407337521 + nacelle_mass: 101.98582836439 + hub_mass: 8.38407517646 + blade_mass: 14.56341339641 + foundation_height: 0.0 + commissioning_cost_kW: 44.0 + decommissioning_cost_kW: 58.0 + trench_len_to_substation_km: 50.0 + distance_to_interconnect_mi: 4.97096954 + interconnect_voltage_kV: 130.0 + tcc_per_kW: 1300.00 # (USD/kW) + opex_per_kW: 44.00 # (USD/kWh) + +system: + type: group + systems: + gridfarm: + type: component + module: ard.layout.gridfarm + object: GridFarmLayout + promotes: ["*"] + kwargs: + modeling_options: *modeling_options + # aepFLORIS: + # type: component + # module: ard.farm_aero.floris + # object: FLORISAEP + # promotes: ["x_turbines", "y_turbines", "AEP_farm"] + # kwargs: + # modeling_options: *modeling_options + # data_path: + # case_title: "default" + boundary: + type: component + module: ard.layout.boundary + object: FarmBoundaryDistancePolygon + promotes: ["*"] + kwargs: + modeling_options: *modeling_options + exclusions: + type: component + module: ard.layout.exclusions + object: FarmExclusionDistancePolygon + promotes: ["*"] + kwargs: + modeling_options: *modeling_options + # collection: + # type: component + # module: ard.collection.optiwindnet_wrap + # object: OptiwindnetCollection + # promotes: ["*"] + # kwargs: + # modeling_options: *modeling_options + spacing_constraint: + type: component + module: ard.layout.spacing + object: TurbineSpacing + promotes: ["*"] + kwargs: + modeling_options: *modeling_options + # tcc: + # type: component + # module: ard.cost.wisdem_wrap + # object: TurbineCapitalCosts + # promotes: [ + # "turbine_number", + # "machine_rating", + # "tcc_per_kW", + # "offset_tcc_per_kW", + # ] + # landbosse: + # type: component + # module: ard.cost.wisdem_wrap + # object: LandBOSSEWithSpacingApproximations + # promotes: [ + # "total_length_cables", + # ] + # kwargs: + # modeling_options: *modeling_options + # opex: + # type: component + # module: ard.cost.wisdem_wrap + # object: OperatingExpenses + # promotes: [ + # "turbine_number", + # "machine_rating", + # "opex_per_kW" + # ] + # financese: + # type: component + # module: ard.cost.wisdem_wrap + # object: FinanceSEGroup + # promotes: [ + # "turbine_number", + # "machine_rating", + # "tcc_per_kW", + # "offset_tcc_per_kW", + # "opex_per_kW", + # ] + # kwargs: + # modeling_options: *modeling_options + # connections: + # - ["AEP_farm", "financese.plant_aep_in"] + # - ["landbosse.total_capex_kW", "financese.bos_per_kW"] + +analysis_options: + driver: + # design-of-experiments + name: DOEDriver + generator: + name: LatinHypercubeGenerator + args: + samples: 50000 + design_variables: + angle_orientation: + lower: 0.0 + upper: 180.0 + angle_skew: + lower: -45.0 + upper: 45.0 + spacing_primary: + lower: 2.0 + upper: 15.0 + spacing_secondary: + lower: 2.0 + upper: 15.0 + constraints: + boundary_distances: + units: km + upper: 0.0 + scaler: 2.0 + exclusion_distances: + units: km + upper: 0.0 + scaler: 2.0 + spacing_constraint.turbine_spacing: + units: km + lower: 0.552 + objectives: + x_turbines: + scaler: 1.0 + y_turbines: + scaler: 1.0 + recorder: + filepath: cases.sql diff --git a/examples/x07_exclusion/inputs/ard_system.yaml b/examples/x07_exclusion/inputs/ard_system.yaml new file mode 100644 index 00000000..cd6307d1 --- /dev/null +++ b/examples/x07_exclusion/inputs/ard_system.yaml @@ -0,0 +1,187 @@ +modeling_options: &modeling_options + windIO_plant: !include windio.yaml + heterogeneous_map: + x: [-100.0, -100.0, 1500.0, 1500.0, 1030.39] + y: [-100.0, 1500.0, 1500.0, -100.0, 919.56] + speed_multipliers: [ + [1.0, 1.0, 1.0, 1.0, 1.125], + [1.0, 1.0, 1.0, 1.0, 1.125], + [1.0, 1.0, 1.0, 1.0, 1.125], + ] + wind_directions: [0.0, 157.5, 270.0] + wind_speeds: [6.0, 7.5, 12.0] + interp_method: linear + layout: + type: gridfarm + N_turbines: 7 + N_substations: 1 + aero: + return_turbine_output: True + floris: + peak_shaving_fraction: 0.2 + peak_shaving_TI_threshold: 0.0 + collection: + max_turbines_per_string: 8 + solver_name: highs + solver_options: + time_limit: 60 + mip_gap: 0.02 + model_options: + topology: radial # radial, branched + feeder_route: segmented + feeder_limit: unlimited + offshore: false + floating: false + costs: + rated_power: 3400000.0 # W + num_blades: 3 + rated_thrust_N: 645645.83964671 + gust_velocity_m_per_s: 52.5 + blade_surface_area: 69.7974979 + tower_mass: 620.4407337521 + nacelle_mass: 101.98582836439 + hub_mass: 8.38407517646 + blade_mass: 14.56341339641 + foundation_height: 0.0 + commissioning_cost_kW: 44.0 + decommissioning_cost_kW: 58.0 + trench_len_to_substation_km: 50.0 + distance_to_interconnect_mi: 4.97096954 + interconnect_voltage_kV: 130.0 + tcc_per_kW: 1300.00 # (USD/kW) + opex_per_kW: 44.00 # (USD/kWh) + +system: + type: group + systems: + aepFLORIS: + type: component + module: ard.farm_aero.floris + object: FLORISAEP + promotes: ["x_turbines", "y_turbines", "AEP_farm"] + kwargs: + modeling_options: *modeling_options + data_path: + case_title: "default" + boundary: + type: component + module: ard.layout.boundary + object: FarmBoundaryDistancePolygon + promotes: ["*"] + kwargs: + modeling_options: *modeling_options + exclusions: + type: component + module: ard.layout.exclusions + object: FarmExclusionDistancePolygon + promotes: ["*"] + kwargs: + modeling_options: *modeling_options + collection: + type: component + module: ard.collection.optiwindnet_wrap + object: OptiwindnetCollection + promotes: ["*"] + kwargs: + modeling_options: *modeling_options + spacing_constraint: + type: component + module: ard.layout.spacing + object: TurbineSpacing + promotes: ["*"] + kwargs: + modeling_options: *modeling_options + eagles: + type: component + module: ard.eco.eagle_density + object: EagleDensityFunction + promotes: ["*"] + kwargs: + modeling_options: *modeling_options + tcc: + type: component + module: ard.cost.wisdem_wrap + object: TurbineCapitalCosts + promotes: [ + "turbine_number", + "machine_rating", + "tcc_per_kW", + "offset_tcc_per_kW", + ] + landbosse: + type: component + module: ard.cost.wisdem_wrap + object: LandBOSSEWithSpacingApproximations + promotes: [ + "total_length_cables", + ] + kwargs: + modeling_options: *modeling_options + opex: + type: component + module: ard.cost.wisdem_wrap + object: OperatingExpenses + promotes: [ + "turbine_number", + "machine_rating", + "opex_per_kW" + ] + financese: + type: component + module: ard.cost.wisdem_wrap + object: FinanceSEGroup + promotes: [ + "turbine_number", + "machine_rating", + "tcc_per_kW", + "offset_tcc_per_kW", + "opex_per_kW", + ] + kwargs: + modeling_options: *modeling_options + connections: + - ["AEP_farm", "financese.plant_aep_in"] + - ["landbosse.total_capex_kW", "financese.bos_per_kW"] + +analysis_options: + driver: + name: ScipyOptimizeDriver + options: + optimizer: COBYLA + opt_settings: + rhobeg: 2.0 + maxiter: 250 + debug_print: + - desvars + - objs + design_variables: + x_turbines: + units: km + lower: -0.100 + upper: 2.100 + scaler: 0.5 + y_turbines: + units: km + lower: -0.500 + upper: 2.300 + scaler: 0.5 + constraints: + boundary_distances: + units: km + upper: 0.0 + scaler: 2.0 + # exclusion_distances: + # units: km + # upper: 0.0 + # scaler: 2.0 + spacing_constraint.turbine_spacing: + units: km + lower: 0.552 + eagle_normalized_density: + units: unitless + upper: 0.8 + objectives: + financese.lcoe: + scaler: 1.0 + recorder: + filepath: cases.sql diff --git a/examples/x07_exclusion/inputs/windio.yaml b/examples/x07_exclusion/inputs/windio.yaml new file mode 100644 index 00000000..66f5ed54 --- /dev/null +++ b/examples/x07_exclusion/inputs/windio.yaml @@ -0,0 +1,533 @@ +name: SSRS Co-Design Case Demo +site: + name: Patterson Pass + boundaries: + polygons: + - x: [606.1611139248125, -7.565841734409332, 1436.1546635665, 2086.7966175233014] + y: [2240.4306740884513, -17.519102511407254, -416.39044961224135, 1871.7237653906122] + exclusions: + polygons: + - x: [1470.8220552763923, 1468.529999999795, 1458.5400000000373, 1448.5500000002794, + 1447.4301446560378, 1438.5600000000559, 1428.5699999998324, 1418.5800000000745, + 1417.736959309169, 1408.5900000003166, 1398.6000000000931, 1397.9319108796744, + 1388.6099999998696, 1384.9273327240683, 1378.6200000001118, 1373.223367936265, + 1368.630000000354, 1362.6275088513448, 1358.6400000001304, 1352.9829142993594, + 1348.6499999999069, 1343.7286673377082, 1338.660000000149, 1334.6405146333693, + 1328.6700000003912, 1325.6788804298187, 1318.6800000001676, 1317.091098623197, + 1309.181725510436, 1308.6899999999441, 1301.6467667617408, 1298.7000000001863, + 1294.737445352655, 1288.7100000004284, 1288.3754936919897, 1282.8968174907045, + 1278.720000000205, 1278.0971372566262, 1273.7618157018578, 1270.5684949107392, + 1268.7299999999814, 1267.952327549212, 1265.5840553574321, 1263.5435022543215, + 1262.0342388460485, 1260.6851610146618, 1259.7022423143696, 1259.0911626750508, + 1258.7399999997579, 1258.5133346403973, 1257.605840293904, 1256.9318887985833, + 1256.2614044804257, 1255.5546642195318, 1254.9161096589269, 1254.2558168228925, + 1253.4435342097295, 1252.9368652517949, 1252.2704636944245, 1251.8724759583772, + 1251.6565764653935, 1251.6363521412632, 1251.7226059274365, 1252.0902573960848, + 1252.5164319347525, 1253.369037892079, 1254.4363449107284, 1255.3936177445112, + 1256.3905075837788, 1257.9152282095968, 1258.7399999997579, 1259.1733711253298, + 1260.150163295662, 1261.4753328758065, 1262.6931276063403, 1263.3656076779978, + 1263.8048531005504, 1263.992456414337, 1263.320775603215, 1261.947790882952, + 1259.8595992863156, 1258.7399999997579, 1257.3383155229985, 1254.670729346122, + 1251.0654839250897, 1248.75, 1247.2231989458148, 1242.425969484821, 1238.7600000002421, + 1236.7062292638263, 1229.9541945917802, 1228.7700000000186, 1221.2565051666231, + 1218.7799999997949, 1210.8492702067433, 1208.7900000000373, 1198.8000000002794, + 1197.703750108395, 1188.8100000000559, 1182.9440606369997, 1178.8199999998324, + 1168.8300000000745, 1166.8792463420662, 1158.8400000003166, 1151.2257118740497, + 1148.8500000000931, 1138.8599999998696, 1135.4112117997793, 1128.8700000001118, + 1120.4149501938534, 1118.880000000354, 1108.8900000001304, 1105.9022117193188, + 1098.8999999999069, 1091.8938864168333, 1088.910000000149, 1078.9200000003912, + 1077.3017163076477, 1068.9300000001676, 1063.2043590842927, 1058.9399999999441, + 1049.251087098697, 1048.9500000001863, 1038.9600000004284, 1033.148325891937, + 1028.970000000205, 1018.9799999999814, 1013.437053005548, 1008.9899999997579, + 999.0, 989.0100000002421, 986.0290746721453, 979.0200000000186, 969.0299999997951, + 959.0400000000373, 951.7003435259157, 949.0500000002794, 939.0600000000559, + 929.0699999998324, 921.2924101312128, 919.0800000000745, 909.0900000003166, + 899.6907547328567, 899.1000000000931, 889.1099999998696, 885.06773611775, + 879.1200000001118, 874.1429774358072, 869.1300000003539, 865.476209869523, + 859.1400000001304, 858.5032503875071, 853.0106662351483, 849.1499999999069, + 848.404404332605, 844.6783450809799, 841.6192802226198, 839.160000000149, + 839.0256352829439, 836.9228907458883, 835.232695157986, 833.9750005665999, + 832.9749509881062, 832.2030243290234, 831.6936240417823, 831.3125815764627, + 831.0350393877468, 830.7741059496961, 830.4250202600837, 829.773711145815, + 829.1700000003912, 829.1283159581922, 828.2967991510019, 826.9726792093005, + 825.0519791114124, 822.805043295196, 819.6951524472047, 819.1800000001676, + 816.1678933090338, 811.9960966683668, 809.1899999999441, 807.1297368144656, + 801.7731797459385, 799.2000000001863, 796.0470524215046, 789.9112599373392, + 789.2100000004284, 783.7694388525185, 779.2200000002049, 777.2896909891949, + 770.8985577646026, 769.2299999999814, 764.7530406060689, 759.2399999997579, + 758.4201833869396, 752.244158639693, 749.25, 745.8900195620533, 739.5478100396631, + 739.2600000002421, 733.6125200380957, 729.2700000000186, 727.5526665644942, + 721.821650807645, 719.279999999795, 716.3107473441022, 710.9903300219788, + 709.2900000000373, 705.8207603961527, 700.7763199095155, 699.3000000002793, + 696.2223681709089, 692.0835919330699, 689.3100000000559, 688.4287755626084, + 685.2763813217963, 682.5812653320543, 680.4245541700943, 679.3199999998324, + 679.09587302962, 678.4819978249377, 678.9283408707186, 679.3199999998324, + 680.4898421845553, 683.3080919722335, 687.3469836612296, 689.3100000000559, + 692.772534293824, 699.3000000002794, 699.7181330657595, 708.4600202426773, + 709.2900000000373, 718.7044299321811, 719.2799999997951, 729.2700000000187, + 730.7635113270464, 739.2600000002421, 744.9253981341514, 749.25, 759.2399999997579, + 760.4269579029482, 769.2299999999814, 777.0427259649246, 779.2200000002049, + 789.2100000004284, 792.7388438432855, 799.2000000001863, 806.5513399675644, + 809.1899999999441, 817.9335283622468, 819.1800000001676, 826.969993671703, + 829.1700000003912, 833.2444745670515, 837.3778734218307, 839.1600000001491, + 840.5444251412558, 842.7515930597439, 844.0163965085875, 844.5801302388807, + 845.2549731133378, 845.64177391164, 845.5545373537661, 845.4967489344408, + 845.630496372278, 846.2177063067397, 847.1647250657554, 848.3627549866687, + 849.1499999999069, 850.5877967722051, 853.2268934226346, 856.5731524054968, + 859.1400000001305, 860.2175208154373, 864.3547187244128, 868.6461076650132, + 869.1300000003539, 873.1609722624818, 877.6159966656701, 879.1200000001118, + 883.0770864988024, 888.6710065495179, 889.1099999998696, 895.4120562387247, + 899.1000000000931, 902.3212617205677, 909.0900000003166, 909.9716116190805, + 918.1367657829379, 919.0800000000745, 926.332802046649, 929.0699999998324, + 934.5901790921537, 939.0600000000559, 943.1666924467655, 949.0500000002794, + 952.0287565532564, 959.0400000000373, 961.0837692831159, 969.0299999997951, + 970.7146132801016, 979.0200000000186, 980.4657860115399, 989.0100000002421, + 990.437502288512, 999.0, 1000.4586149792207, 1008.9899999997579, 1010.1974405039017, + 1018.9799999999814, 1019.51818687297, 1028.970000000205, 1029.072684476565, + 1038.9600000004284, 1039.1028786297377, 1048.9500000001863, 1049.5466894409492, + 1058.9399999999441, 1063.870384336532, 1068.9300000001676, 1078.9200000003912, + 1083.6170944119363, 1088.910000000149, 1098.8999999999069, 1108.8900000001304, + 1111.9958128995454, 1118.880000000354, 1128.8700000001118, 1138.8599999998696, + 1148.8500000000931, 1152.9464841522636, 1158.8400000003166, 1168.8300000000745, + 1170.8880592663427, 1178.8199999998324, 1179.4442988754136, 1187.4499005156606, + 1188.8100000000559, 1196.1491780408319, 1198.8000000002794, 1208.7899911167249, + 1208.7900000000373, 1218.779999999795, 1228.7700000000186, 1232.559755746465, + 1238.7600000002421, 1248.7499999999998, 1257.8029239044201, 1258.7399999997579, + 1268.7299999999814, 1278.720000000205, 1282.8000452220836, 1288.7100000004284, + 1298.232613903916, 1298.7000000001863, 1308.6899999999443, 1310.2254317672953, + 1318.6800000001676, 1321.1106552600088, 1328.6700000003912, 1331.7229871951474, + 1338.660000000149, 1341.667357871244, 1348.6499999999069, 1351.0888355902534, + 1358.6400000001302, 1359.8478649229785, 1367.7762624331097, 1368.630000000354, + 1375.5357057858516, 1378.6200000001118, 1383.0685269757878, 1388.6099999998696, + 1390.347765236937, 1397.321079924681, 1398.6000000000931, 1403.7444472534144, + 1408.5900000003169, 1409.5288219850459, 1414.7313159653531, 1418.5800000000747, + 1419.1845348262457, 1423.4705749108953, 1426.9304399289301, 1428.5699999998324, + 1429.6994520865092, 1432.3319009146683, 1434.8793870785466, 1436.845950514542, + 1438.5600000000559, 1438.96436058281, 1440.1767400666965, 1441.4366771956495, + 1442.856614365617, 1444.3263327423938, 1446.4950669300808, 1447.912017119626, + 1448.5500000002794, 1449.3994188785912, 1450.462665567149, 1452.3557676413816, + 1454.0744366889123, 1456.384981221936, 1458.1642464187523, 1458.5400000000373, + 1460.0023475873109, 1255.657428653226, 1248.75, 1244.1528934915173, 1238.7600000002421, + 1231.5640150577563, 1228.7700000000186, 1218.779999999795, 1218.515114203237, + 1208.7900000000373, 1205.5266364975723, 1198.8000000002794, 1191.914663923395, + 1188.8100000000559, 1178.8199999998324, 1178.1292816584405, 1168.8300000000745, + 1165.1544220646879, 1158.8400000003166, 1152.8145023585294, 1148.8500000000931, + 1140.799219008033, 1138.8599999998696, 1129.240473162255, 1128.8700000001118, + 1118.880000000354, 1118.2973753844537, 1108.8900000001304, 1107.5143495405869, + 1098.8999999999069, 1096.8510861418633, 1088.910000000149, 1085.7665516938468, + 1078.9200000003912, 1073.624935944363, 1068.9300000001676, 1060.7874290645557, + 1058.9399999999441, 1048.9500000001863, 1047.7927970028409, 1038.9600000004284, + 1034.4350681261756, 1028.970000000205, 1021.7083620569473, 1018.9799999999814, + 1009.3750816779944, 1008.9899999997579, 999.0, 997.3208271216307, 989.0100000002421, + 985.318328372785, 979.0200000000186, 973.6573872673488, 969.0299999997951, + 962.2249710201195, 959.0400000000373, 950.6662324517386, 949.0500000002794, + 939.0600000000558, 938.7362754654825, 929.0699999998324, 926.5732305306525, + 919.0800000000745, 914.0578532746011, 909.0900000003166, 901.2332296729096, + 899.1000000000931, 889.1099999998696, 887.6360701277315, 879.1200000001118, + 873.7759127673, 869.1300000003539, 859.7780178472347, 859.1400000001304, 849.149999999907, + 845.7515293266647, 839.160000000149, 831.5703572251696, 829.1700000003912, + 819.1800000001676, 816.9247988029055, 809.1899999999441, 801.6650071005831, + 799.2000000001863, 789.2100000004284, 786.4293112165907, 779.2200000002049, + 771.4649932716079, 769.2299999999814, 759.2399999997579, 756.5574816004641, + 749.25, 742.4028770129067, 739.2600000002421, 729.2700000000186, 729.1045231589768, + 719.279999999795, 716.580541236454, 709.2900000000373, 704.9494405314964, + 699.3000000002794, 694.068063955214, 689.3100000000559, 684.1054952284096, + 679.3199999998324, 674.9000407541383, 669.3300000000745, 666.4405763014393, + 659.3400000003166, 658.5206337577757, 650.6290345079024, 649.3500000000931, + 642.9968510157821, 639.3599999998696, 635.6800020869703, 629.3700000001118, + 628.4200250765793, 621.084346987598, 619.3800000003539, 613.4869726038164, + 609.3900000001304, 605.767393473623, 599.3999999999069, 597.4277946470603, + 589.410000000149, 587.9118030257465, 579.4200000003912, 576.9392913293694, + 569.4300000001676, 562.2084341344686, 559.4399999999441, 549.4500000001863, + 539.4600000004284, 538.4666259318494, 529.4700000002049, 519.4799999999814, + 509.48999999975786, 499.5, 492.875766182191, 489.51000000024214, 479.5200000000186, + 469.5299999997951, 459.54000000003725, 449.5500000002794, 439.5600000000559, + 429.5699999998324, 420.4708573595945, 419.5800000000745, 409.59000000031665, + 399.60000000009313, 292.18495994398455, 293.08105829033684, 296.6416125166231, + 299.70000000018626, 300.79757938075795, 305.08260656470367, 309.6899999999441, + 310.54985892386827, 316.6473484839463, 319.6800000001677, 324.1111110183115, + 329.67000000039116, 332.864681337067, 339.660000000149, 343.13833629638077, + 349.64999999990687, 354.6051967528877, 359.6400000001303, 367.4698764166836, + 369.6300000003539, 379.62000000011176, 381.65722704535443, 389.6099999998696, + 395.5342614704191, 399.60000000009313, 409.59000000031665, 410.2879024225586, + 419.5800000000745, 424.33386507130626, 429.5699999998323, 438.18093876322683, + 439.5600000000559, 449.5500000002794, 450.7165047365906, 459.54000000003725, + 461.7799132063274, 469.5299999997951, 472.1212114228442, 479.5200000000186, + 481.49744654654273, 489.51000000024214, 490.3623176184711, 498.5349235379181, + 499.5, 506.4478217170989, 509.48999999975786, 513.7674895296875, 519.4799999999814, + 520.4332183603842, 526.4628072795387, 529.4700000002049, 532.1836316516302, + 537.6346450851414, 539.4600000004284, 542.625131648113, 547.1194437903717, + 549.4500000001863, 551.1447988214424, 554.5853882151838, 557.7868241595933, + 559.4399999999441, 560.7233524951465, 563.0284155704435, 565.0723264269275, + 566.7501142488119, 568.3922919272442, 569.4300000001676, 569.7449601723996, + 570.8899566148073, 572.1647741093998, 573.075305823336, 574.0136415814633, + 574.9884214716775, 576.0200794493816, 576.8711017301523, 577.8082946722554, + 578.94056231068, 579.4200000003912, 580.3276911921239, 581.9169073770747, + 583.5699375973253, 585.4403611537143, 587.7089311702215, 589.410000000149, + 590.2481632616831, 593.0640302495001, 595.9113916828982, 599.0774724745522, + 599.3999999999069, 602.1773782912474, 605.5809993468124, 609.0480517434289, + 609.3900000001304, 612.5421950787289, 616.2424130510666, 619.3800000003539, + 620.0085163734537, 624.1540318717622, 628.8072443971777, 629.3700000001118, + 633.2876639643971, 637.6319530960723, 639.3599999998696, 642.0823606193229, + 646.5419794068672, 649.3500000000931, 651.0362018023466, 655.6028868227368, + 659.3400000003166, 660.3543500070075, 664.9156358383134, 669.3300000000745, + 669.5790972330535, 674.0949571319595, 678.8285446423971, 679.3199999998322, + 683.5500575557936, 688.3508972519749, 689.3100000000559, 693.3783278423639, + 698.5327471393197, 699.3000000002794, 703.7119306455164, 708.6290881240027, + 709.2900000000373, 713.9304734585725, 719.2799999997951, 719.3516364823038, + 724.8919771253759, 729.2700000000186, 730.6382828342759, 737.0367368712336, + 739.2600000002421, 743.9563315418643, 749.25, 751.1785750828602, 758.3102336956205, + 759.2399999997579, 765.3745366558297, 769.2299999999814, 772.1240615306905, + 779.2200000002049, 779.5183646342878, 786.6316781703368, 789.2100000004283, + 794.178030421444, 799.2000000001863, 801.8346931760017, 807.9785056991292, + 809.1899999999441, 809.442931191604, 809.1899999999441, 807.5556089534841, + 799.2000000001863, 793.0338446084988, 789.2100000004284, 779.2200000002049, + 775.575734964938, 769.2299999999814, 759.2399999997577, 755.4325343327761, + 749.25, 739.2600000002421, 738.6771776426567, 729.2700000000186, 725.8847681195926, + 719.2799999997951, 714.2418339945616, 709.2900000000373, 703.8695911991813, + 699.3000000002794, 696.4066788762628, 690.5787569987302, 689.3100000000559, + 685.9842199019679, 682.953965437152, 680.9972137677589, 679.861905185991, + 679.3199999998324, 678.7085135220432, 678.1590211157538, 677.8397839199631, + 678.7584203924046, 679.3199999998324, 680.0887245525989, 681.4251205195363, + 683.5562047057502, 687.7866338975952, 689.3100000000559, 693.4619964594355, + 699.3000000002794, 699.9797402285429, 707.2135456460142, 709.2900000000373, + 716.2343607622195, 719.2799999997951, 725.9345729620262, 729.2700000000185, + 737.0647650038078, 739.2600000002421, 748.3818466379832, 749.2500000000001, + 759.2399999997579, 761.9805278148847, 769.2299999999815, 779.2200000002049, + 782.3857538514219, 789.2100000004284, 799.2000000001863, 809.1899999999441, + 819.1800000001676, 829.1700000003912, 839.160000000149, 849.1499999999069, + 852.1747723158915, 859.1400000001304, 867.3324880106219, 869.1300000003539, + 879.1200000001118, 889.1099999998696, 899.1000000000931, 909.0900000003166, + 919.0800000000745, 920.1462470249139, 929.0699999998324, 936.9555086187785, + 939.0600000000559, 949.0500000002794, 950.2792883984554, 959.0400000000373, + 959.8097508530004, 965.8630189288347, 968.582684083953, 968.8886069814738, + 967.1957972795154, 963.6530448353491, 959.0400000000373, 958.976021774334, + 954.4563885530457, 949.7007954584682, 949.0500000002794, 944.2227587243779, + 939.6798069353483, 939.0600000000559, 935.5201693738, 931.4107857824904, 929.0699999998324, + 927.452006748961, 923.2153025035481, 919.0800000000745, 918.744106988074, + 914.8930551737094, 911.0707858672108, 909.0900000003166, 907.5466459275208, + 902.9481807690565, 899.1000000000931, 898.6857630906895, 894.4968984221733, + 890.0429139955945, 889.1099999998696, 884.5233323262022, 879.5111551241121, + 879.1200000001118, 872.5938009293242, 871.3252089258248, 879.1200000001118, + 881.8059200559348, 889.1099999998696, 899.1000000000931, 909.0900000003166, + 919.0800000000745, 921.8519723063005, 929.0699999998324, 933.72826539122, + 939.0600000000559, 949.0500000002795, 959.0400000000374, 969.0299999997951, + 979.0200000000186, 989.0100000002421, 991.2277572481103, 999.0, 1008.9899999997579, + 1015.6705108305292, 1018.9799999999815, 1028.970000000205, 1034.7622652088987, + 1038.9600000004284, 1048.9500000001863, 1049.2397827722882, 1058.9399999999441, + 1060.852847718221, 1068.9300000001676, 1069.3745219279142, 1075.6912016140245, + 1078.9200000003912, 1080.9555275543519, 1085.4482130368697, 1088.910000000149, + 1089.3100836580786, 1092.5743536174089, 1095.3366854729084, 1097.480914501498, + 1098.8999999999069, 1099.155797751815, 1100.5217162204237, 1101.3927502670585, + 1102.139707232305, 1102.1772773176226, 1101.8023201022227, 1101.1468478754455, + 1099.8711107650884, 1098.8999999999069, 1098.1951318667698, 1096.161177157444, + 1094.4837676556483, 1093.9084760988515, 1094.1720888343866, 1097.719829776974, + 1098.8999999999069, 1103.6895320033098, 1108.8900000001304, 1113.58263455365, + 1118.880000000354, 1127.9570038469549, 1128.870000000112, 1138.8599999998696, + 1144.7790842553345, 1148.8500000000931, 1158.8400000003166, 1164.2304586475768, + 1168.8300000000745, 1178.8199999998324, 1185.0974307537415, 1188.8100000000559, + 1198.8000000002794, 1207.6077285019257, 1208.7900000000373, 1218.779999999795, + 1228.7700000000186, 1232.4051346155118, 1238.7600000002421, 1248.75, 1258.7399999997579, + 1259.2195758477662, 1268.7299999999814, 1278.720000000205, 1286.1346981006532, + 1288.7100000004284, 1298.7000000001863, 1308.6899999999441, 1311.7090409193368, + 1318.6800000001679, 1328.6700000003912, 1337.1209034251824, 1338.660000000149, + 1348.6499999999069, 1358.6400000001304, 1362.9492128038466, 1368.630000000354, + 1378.6200000001118, 1386.9008564548208, 1388.6099999998696, 1398.6000000000931, + 1407.4345509163388, 1408.5900000003166, 1418.5800000000745, 1423.1250760804267, + 1428.5699999998324, 1435.939653861761, 1438.5600000000559, 1448.136713306041, + 1448.5500000002794] + y: [-267.43794472345354, -266.67095219941933, -263.3519943958371, -260.1176327159642, + -259.7399999999998, -257.04247013920923, -253.89648423447304, -250.1249304465961, + -249.75, -245.74292867929594, -240.2543524109821, -239.76000000000022, -232.90069122216008, + -229.76999999999862, -224.60258852048196, -219.78000000000065, -215.65167972504614, + -209.78999999999905, -205.93411992378464, -199.8000000000011, -195.36602343299103, + -189.8099999999995, -184.36484575096176, -179.8199999999997, -173.32962257369005, + -169.82999999999993, -161.75631638915178, -159.83999999999833, -149.85000000000036, + -149.2436480904744, -139.85999999999876, -135.80363455050184, -129.8700000000008, + -120.42923245071083, -119.8799999999992, -109.88999999999942, -101.28216187020647, + -99.89999999999964, -89.90999999999985, -79.92000000000007, -72.87575233209817, + -69.92999999999847, -59.94000000000051, -49.94999999999891, -39.960000000000946, + -29.969999999999345, -19.979999999999563, -9.989999999999782, -3.767989826088935, + 0.0, 9.989999999999782, 19.980000000001382, 29.969999999999345, 39.960000000000946, + 49.95000000000073, 59.94000000000051, 69.93000000000029, 79.92000000000007, + 89.90999999999985, 99.89999999999964, 109.89000000000124, 119.87999999999921, + 129.8700000000008, 139.86000000000058, 149.85000000000036, 159.84000000000012, + 169.82999999999993, 179.82000000000153, 189.8099999999995, 199.8000000000011, + 206.45236060221492, 209.79000000000087, 219.78000000000063, 229.77000000000044, + 239.7600000000002, 249.75, 259.7399999999998, 269.7300000000014, 279.71999999999935, + 289.71000000000095, 299.7000000000007, 304.1057926103244, 309.6900000000005, + 319.6800000000003, 329.6700000000001, 335.68694573744204, 339.65999999999985, + 349.64999999999964, 356.21562712122704, 359.64000000000124, 369.6299999999992, + 371.0963306223184, 379.6200000000008, 382.2175836826243, 389.6100000000006, + 391.3003695961686, 398.8392641975053, 399.60000000000036, 405.7751392773962, + 409.59000000000015, 412.09939892075494, 418.3574095291986, 419.5799999999999, + 424.91071107529535, 429.5700000000016, 431.0113014947437, 437.3768414455919, + 439.5599999999995, 443.8078426269982, 449.5500000000011, 450.6490480295367, + 457.4554509118964, 459.5400000000009, 464.61489710723146, 469.53000000000065, + 471.61886147558454, 478.38781724665904, 479.52000000000044, 485.5177591713746, + 489.5100000000002, 492.5595903172301, 499.50000000000006, 499.7021793565388, + 506.14779447202415, 509.4899999999998, 511.86200552070324, 516.9809871220835, + 519.4800000000014, 521.3532805789362, 525.0379575740583, 528.5111099735375, + 529.4699999999993, 531.6210068353778, 534.5273343825203, 537.3389447545337, + 539.460000000001, 540.2297739928533, 543.2288117286705, 546.5760645206362, + 549.4500000000007, 550.2667644159777, 554.6038204073161, 559.4400000000005, + 559.7558712060081, 566.246345488038, 569.4300000000003, 574.4710690119894, + 579.4200000000001, 584.8075760665496, 589.4099999999999, 598.3613489414292, + 599.3999999999996, 609.3900000000012, 617.6410696855016, 619.3799999999992, + 629.3700000000008, 639.3600000000006, 648.8224390281875, 649.3500000000004, + 659.3400000000001, 669.3299999999999, 679.3200000000015, 689.3099999999995, + 699.3000000000011, 709.2900000000009, 719.2800000000007, 729.2700000000006, + 739.2600000000002, 749.25, 759.2399999999998, 768.5594341532345, 769.2300000000014, + 779.2199999999993, 789.210000000001, 799.2000000000007, 809.1900000000005, + 819.1800000000003, 820.6283287271044, 829.1700000000001, 839.1599999999999, + 844.9640204477527, 849.1499999999996, 859.1400000000012, 863.588153362166, + 869.1299999999992, 879.1200000000008, 880.2281715726061, 889.1100000000006, + 896.019917584853, 899.1000000000004, 909.0900000000001, 911.7040251797449, + 919.0799999999999, 927.7218976399485, 929.0700000000015, 939.0599999999995, + 943.6632372604785, 949.0500000000011, 959.040000000001, 959.5017490108323, + 969.0300000000007, 976.1268280093843, 979.0200000000004, 989.0100000000002, + 993.5282880901764, 999.0, 1008.9899999999997, 1012.2437375664239, 1018.9800000000014, + 1028.9699999999993, 1032.1395229363402, 1038.960000000001, 1048.9500000000007, + 1056.4968702934952, 1058.9400000000005, 1068.9300000000003, 1078.92, 1088.9099999999999, + 1097.2271652406007, 1098.8999999999996, 1108.8900000000012, 1118.8799999999992, + 1121.4141856498068, 1128.8700000000008, 1138.8600000000006, 1148.8500000000004, + 1152.54566992084, 1158.8400000000001, 1168.2667930272244, 1168.83, 1178.8200000000015, + 1179.664252623713, 1188.8099999999995, 1189.309914792175, 1197.627935595493, + 1198.800000000001, 1204.9010724599186, 1208.7900000000009, 1211.6045994886163, + 1218.0395536037336, 1218.7800000000007, 1224.1466013944032, 1228.7700000000004, + 1230.1898073810887, 1236.5631036507352, 1238.7600000000002, 1243.2871335807947, + 1248.75, 1250.9755238770051, 1258.7399999999998, 1260.0631881380452, 1268.7300000000014, + 1272.237143474863, 1278.7199999999993, 1288.710000000001, 1294.3346870837477, + 1298.7000000000007, 1308.6900000000005, 1318.6800000000003, 1328.67, 1338.6599999999999, + 1348.6499999999996, 1358.6400000000012, 1368.6299999999992, 1378.6200000000008, + 1388.6100000000006, 1398.6000000000004, 1408.5900000000001, 1412.4087164211855, + 1418.58, 1428.5700000000015, 1438.5599999999995, 1445.7989223053985, 1448.550000000001, + 1458.5400000000009, 1468.5300000000007, 1469.7366401395354, 1478.5200000000004, + 1488.5100000000002, 1491.5665438015092, 1498.5000000000002, 1508.4899999999998, + 1509.231521510775, 1518.4800000000014, 1524.1090106970858, 1528.4699999999993, + 1537.280089253008, 1538.4600000000007, 1548.4500000000007, 1549.5965544563483, + 1558.4400000000005, 1561.7796657129388, 1568.4300000000003, 1573.6800249080425, + 1578.42, 1585.1555514668316, 1588.4099999999996, 1596.1989402204795, 1598.3999999999996, + 1606.6705636151144, 1608.3900000000012, 1616.8899312103722, 1618.3799999999992, + 1626.915992669452, 1628.370000000001, 1636.9315244093043, 1638.3600000000004, + 1647.0959692552217, 1648.3500000000004, 1657.7587621499017, 1658.3400000000001, + 1668.2194684543229, 1668.33, 1678.1739566141182, 1678.3200000000015, 1687.7935853332322, + 1688.3099999999995, 1695.1685689594312, 1698.300000000001, 1701.1819316371884, + 1706.2032278614479, 1708.2900000000009, 1710.5738644188268, 1714.5494853856019, + 1717.5487912803235, 1718.2800000000007, 1719.8983300205584, 1721.5265601141716, + 1721.021381403866, 1719.5453865843983, 1718.2800000000007, 1715.9945770960821, + 1710.1401985647242, 1708.2900000000009, 1699.0423579815517, 1698.300000000001, + 1688.3099999999997, 1686.6463357829896, 1678.3200000000015, 1675.6611164106084, + 1668.33, 1668.3299935334796, 1663.1693845346313, 1659.0291079396768, 1658.3400000000001, + 1657.3776619921173, 1657.3312145818543, 1658.3400000000001, 1658.444584537792, + 1661.3442263085253, 1666.0137240740478, 1668.3300000000002, 1671.8142308938234, + 1678.3200000000015, 1678.6323833311562, 1686.9722001476014, 1688.3099999999995, + 1695.9288737081895, 1698.3000000000009, 1705.3615653792456, 1708.2900000000009, + 1715.1701023256555, 1718.2800000000007, 1725.6576858680878, 1728.2700000000004, + 1736.831730896719, 1738.26, 1748.25, 1749.3386890626925, 1758.2399999999998, + 1762.3339793307468, 1768.2300000000014, 1775.8496177132752, 1778.2199999999993, + 1788.210000000001, 1790.2234480896998, 1798.2000000000007, 1806.5546728586569, + 1808.1900000000005, 1818.1800000000003, 1826.838110299943, 1828.1700000000003, + 1838.1599999999999, 1848.1499999999996, 1854.1799074180915, 1858.140000000001, + 1868.1299999999992, 1878.1200000000008, 1888.1100000000006, 1896.2428275175969, + 1898.1000000000004, 1908.0900000000001, 1918.08, 1928.0700000000015, 1938.0599999999995, + 1948.050000000001, 1958.0400000000009, 1962.2941449438524, 1968.0300000000007, + 1978.0200000000004, 1988.01, 1998.0, 2007.9899999999998, 2017.9800000000014, + 2019.7997899274471, 2026.5076524126907, 2077.92, 2071.9507780100685, 2067.9300000000003, + 2063.488790458532, 2057.9400000000005, 2055.7311929885577, 2048.16605272452, + 2047.9500000000007, 2040.4226409897421, 2037.960000000001, 2032.9801955397452, + 2027.9699999999993, 2025.6732543588973, 2018.4983119065075, 2017.9800000000014, + 2010.8929271101292, 2007.9899999999998, 2002.8600275384072, 1998.0, 1994.7305177463822, + 1988.0100000000002, 1986.3698922518363, 1978.0200000000004, 1977.70843929148, + 1968.5714909525527, 1968.0300000000007, 1959.3635591533389, 1958.040000000001, + 1950.0055988691734, 1948.050000000001, 1940.8997869298983, 1938.0599999999995, + 1932.5008251454155, 1928.0700000000015, 1924.403671858687, 1918.08, 1916.7132137201586, + 1908.9839782534427, 1908.0900000000001, 1901.535628868237, 1898.1000000000004, + 1893.8891389280664, 1888.1100000000006, 1885.928774643207, 1878.1200000000008, + 1877.8093378597048, 1869.531467380153, 1868.129999999999, 1861.220119200935, + 1858.1400000000012, 1852.6987649784312, 1848.1499999999996, 1844.1616579753745, + 1838.1599999999999, 1835.4110048533287, 1828.17, 1826.7976377666412, 1818.4501098182438, + 1818.1800000000003, 1810.208504644739, 1808.1900000000003, 1802.1788090468126, + 1798.2000000000007, 1794.169913003847, 1788.210000000001, 1786.5988207211317, + 1779.284785229906, 1778.2199999999996, 1772.0254810883366, 1768.2300000000014, + 1764.9107196923214, 1758.2399999999998, 1757.789667779941, 1750.676932776111, + 1748.25, 1743.5855017221788, 1738.2600000000002, 1736.5906750880265, 1729.7900742419808, + 1728.2700000000004, 1723.2001920142511, 1718.2800000000007, 1716.704710129087, + 1710.1330731610726, 1708.2900000000009, 1703.5794163492951, 1698.300000000001, + 1696.8405672188132, 1690.1930381362824, 1688.3099999999995, 1683.2316495443242, + 1678.3200000000015, 1676.0586098030656, 1668.4622401597126, 1668.33, 1660.5924906346131, + 1658.3400000000001, 1652.1350901584096, 1648.3500000000006, 1643.2703078720658, + 1638.3600000000006, 1633.773609013976, 1628.3700000000008, 1623.2926524413776, + 1618.3799999999992, 1611.8619183228195, 1608.3900000000012, 1599.4032186813408, + 1598.3999999999996, 1588.4099999999999, 1586.7323609267255, 1578.42, 1573.4328523408042, + 1568.4300000000003, 1559.6828291248019, 1558.4400000000003, 1548.4500000000007, + 1546.0784222894285, 1538.460000000001, 1532.9278754797376, 1528.4699999999996, + 1520.603051699981, 1518.4800000000014, 1509.8999084203185, 1508.4899999999998, + 1500.4259357086619, 1498.5, 1492.831515137949, 1488.5100000000002, 1486.9631302285864, + 1482.4960682192534, 1478.8341748939972, 1478.5200000000004, 1475.9194725138439, + 1473.5591008728825, 1471.5456842708586, 1469.7647546911794, 1468.5300000000007, + 1467.9521087150522, 1466.7899668064986, 1465.5719005741569, 1464.4611850973808, + 1463.2701841980902, 1461.9745795393765, 1460.2891874228728, 1458.5400000000009, + 1458.3695316803532, 1456.3396940795596, 1453.7216307603467, 1071.4049599436164, + 1068.9300000000003, 1058.9400000000005, 1051.749751106112, 1048.9500000000007, + 1038.960000000001, 1030.5321229019305, 1028.9699999999993, 1018.9800000000014, + 1014.7567285732343, 1008.9899999999998, 1002.6547061031051, 999.0, 992.2642026827584, + 989.0100000000002, 983.2791561242854, 979.0200000000004, 974.9701846837597, + 969.0300000000007, 967.5847785771742, 960.5344892498974, 959.0400000000009, + 953.2366508668686, 949.0500000000011, 946.3432847788661, 939.5758467702935, + 939.0599999999995, 932.4764041297136, 929.0700000000015, 925.3685864132376, + 919.0799999999999, 918.0542267595223, 910.1140154248167, 909.0900000000001, + 901.2003015608566, 899.1000000000004, 891.7264285957424, 889.1100000000006, + 881.3614005745129, 879.1200000000008, 870.1072423812228, 869.1299999999992, + 859.1400000000012, 857.9576632506827, 849.1499999999996, 845.1498127227615, + 839.1599999999999, 830.6752173504668, 829.1700000000001, 819.1800000000003, + 814.1325763996049, 809.1900000000005, 799.2000000000007, 795.6101842170175, + 789.210000000001, 779.2199999999995, 773.5384067715268, 769.2300000000014, + 759.2399999999998, 749.25, 743.753700247591, 739.2600000000002, 729.2700000000004, + 719.2800000000007, 709.290000000001, 699.3000000000011, 691.7477138960236, + 689.3099999999995, 679.3200000000015, 669.3299999999999, 659.3400000000001, + 649.3500000000004, 639.3600000000006, 629.3700000000008, 619.3799999999992, + 609.3900000000012, 599.3999999999996, 596.0415247237103, 589.4099999999999, + 579.4200000000001, 569.4300000000003, 559.4400000000005, 549.4500000000007, + 542.8534952872316, 539.460000000001, 529.4699999999993, 519.4800000000014, + 509.4899999999998, 508.4934627991995, 499.5, 489.51000000000016, 479.52000000000044, + 478.56060557609374, 469.53000000000065, 459.5400000000009, 451.1917036401119, + 449.5500000000011, 439.5599999999995, 429.5700000000015, 428.31270025379786, + 419.5799999999999, 409.5900000000001, 405.7312111567007, 399.60000000000036, + 389.6100000000006, 383.36690056299784, 379.6200000000008, 369.6299999999992, + 361.7432285020666, 359.64000000000124, 349.64999999999964, 340.1843005831017, + 339.65999999999985, 329.6700000000001, 319.68000000000023, 318.6041510917666, + 309.6900000000005, 299.7000000000007, 297.7110515467184, 289.71000000000095, + 279.71999999999935, 278.1762531856333, 269.7300000000014, 259.7399999999998, + 258.3900743726905, 249.75, 239.8786173750889, 239.76000000000022, 229.77000000000046, + 221.97176846736306, 219.78000000000065, 209.79000000000087, 206.34461392762495, + 199.8000000000011, 192.16893788299447, 189.8099999999995, 179.82000000000153, + 178.38382833019216, 169.82999999999993, 163.49996329079127, 159.84000000000015, + 150.19401042723499, 149.85000000000036, 139.86000000000058, 136.24661099497897, + 129.8700000000008, 122.66207319661714, 119.8799999999992, 109.89000000000124, + 101.07124649863407, 99.89999999999964, 98.37127050861942, 89.90999999999985, + 84.66283129913418, 79.92000000000007, 77.85333978368982, 72.5350044915935, + 69.93000000000029, 66.92355479353938, 62.06535699566111, 59.94000000000051, + 56.60442663936466, 50.38418616510138, 49.95000000000073, 42.43604244790729, + 39.960000000000946, 34.49882973893387, 29.969999999999345, 25.713894398164644, + 19.980000000001382, 14.01247907131485, 9.989999999999782, 0.0, -2.4144021801316162, + -9.989999999999782, -19.979999999999563, -29.969999999999345, -39.960000000000946, + -44.57094843114739, -49.94999999999891, -59.94000000000051, -69.92999999999847, + -79.92000000000007, -84.16567811608793, -89.90999999999985, -99.89999999999964, + -109.88999999999942, -119.8799999999992, -122.73282864693184, -129.8700000000008, + -138.79230434227432, -139.85999999999876, -149.85000000000036, -152.35871098209495, + -159.83999999999833, -162.98462761780573, -169.82999999999993, -172.71732099316512, + -179.8199999999997, -181.76749900972698, -189.8099999999995, -190.48600061433356, + -198.05978238830508, -199.8000000000011, -203.91665472154463, -208.62127018912673, + -209.78999999999905, -212.11826241074218, -214.60690879457758, -216.22495938663695, + -217.85798091542623, -218.52047122384045, -218.8779322730634, -219.67404026940505, + -219.78000000000065, -220.0354567164596, -219.78000000000065, -219.7211865695039, + -219.60535086765435, -218.74467990321727, -217.42187899575922, -214.378864277237, + -210.3441939046255, -209.78999999999905, -204.66581873458577, -199.8000000000011, + -198.30373398817048, -190.72187784363766, -189.8099999999995, -180.65843157255367, + -179.8199999999997, -169.82999999999993, -159.83999999999833, -149.85000000000036, + -139.85999999999876, -129.8700000000008, -120.02282300458846, -119.8799999999992, + -109.88999999999942, -99.89999999999964, -98.77633627006722, -89.90999999999985, + -79.92000000000007, -78.44651978232653, -69.92999999999847, -59.94000000000051, + -53.820442960637045, -49.94999999999891, -39.960000000000946, -30.72889395216483, + -29.969999999999345, -19.979999999999563, -9.989999999999782, -4.071714732020104, + 0.0, 9.989999999999782, 19.045995449734907, 19.980000000001382, 29.969999999999345, + 39.960000000000946, 42.038115774080154, 49.95000000000073, 59.940000000000516, + 60.93457929466615, 69.93000000000029, 79.92000000000007, 87.5322634292241, + 89.90999999999985, 93.1332844427881, 96.8051996050702, 98.86673700491774, + 99.74913101775421, 99.89999999999964, 100.19089706086352, 99.89999999999964, + 99.57520198172608, 98.57848369359841, 97.12706797107586, 95.49256653810617, + 93.48897231907223, 90.71540741038949, 89.90999999999985, 87.06285480644642, + 83.00650387197621, 79.92000000000007, 78.34254173897091, 73.36409621758173, + 69.93000000000029, 67.35387590186451, 60.185792325881174, 59.94000000000051, + 51.84924390053204, 49.95000000000073, 40.58053397240497, 39.960000000000946, + 29.969999999999345, 24.044771754585668, 19.980000000001382, 9.989999999999782, + 1.0782548523235889, 0.0, -9.989999999999782, -19.979999999999563, -29.969999999999345, + -38.509342175698514, -39.960000000000946, -49.94999999999891, -59.94000000000051, + -69.92999999999847, -79.92000000000007, -89.90999999999985, -99.89999999999964, + -109.88999999999942, -116.29319136730636, -119.8799999999992, -129.8700000000008, + -139.85999999999876, -149.85000000000036, -159.83999999999833, -169.82999999999993, + -171.62762807641636, -179.8199999999997, -184.964699506491, -189.8099999999995, + -193.53832259434756, -199.8000000000011, -200.30729448182547, -206.31094700906576, + -209.78999999999908, -211.88223764868542, -216.91907650870766, -219.78000000000065, + -221.96988184432124, -226.81595808009888, -229.76999999999862, -231.3730920717553, + -235.71949283125485, -239.76000000000022, -240.28461347112108, -244.22309414837636, + -248.36328267877983, -249.75, -252.10892449101416, -255.8497394217043, -259.56413670179165, + -259.7399999999998, -263.15738523711946, -266.8954379991952, -269.72999999999956, + -270.697212503634, -274.42737890394955, -278.42788183094996, -279.71999999999935, + -282.4775381099004, -286.22564889874116, -289.71000000000095, -290.29316656069955, + -293.84034141931494, -297.91035528831827, -299.6999999999989, -301.8315864915359, + -305.8663330788358, -309.6900000000005, -310.4528699520252, -315.02622515869905, + -319.6799999999985, -320.2919243191631, -326.2559115735262, -329.6700000000001, + -333.5340477588673, -339.65999999999985, -341.67222648625875, -349.64999999999964, + -349.9959503233879] + energy_resource: + name: Predominant wind only + wind_resource: !include ../../data/windIO-plant_wind-resource_wrg-example.yaml # DEBUG!!!!! + # wind_resource: !include 'wrg.yaml' +wind_farm: + name: Patterson Pass + turbine: !include ../../data/windIO-plant_turbine_IEA-3.4MW-130m-RWT.yaml # DEBUG!!!!! + # turbine: !include 'NREL-2.8-127.yaml' # this is a windIO turbine-turbine not a plant-turbine + layouts: + coordinates: + x: [ + 1530.39, 1342.13, 919.13, 579.91, 579.91, 919.13, 1342.13, + # 606.1611139248125, + # -7.565841734409332, + # 1436.1546635665, + # 2086.7966175233014, + # 299.2976360952, + # 714.294410916, + # 1761.4756405449 + ] + y: [ + 919.56, 1310.48, 1407.02, 1136.50, 702.62, 432.10, 528.64, + # 2240.4306740884513, + # -17.519102511407254, + # -416.39044961224135, + # 1871.7237653906122, + # 1111.4557857885, + # -216.9547760618, + # 727.6666578892 + ] + electrical_substations: + - electrical_substation: + coordinates: + x: [100.0] + y: [100.0] + +# name: Ard Example 01 onshore wind plant +# site: +# name: Ard Example 01 offshore wind site +# boundaries: +# polygons: +# - x: [ 1500.0, 3000.0, 3000.0, 1500.0, -1500.0, -3000.0, -3000.0, -1500.0] +# y: [ 3000.0, 1500.0, -1500.0, -3000.0, -3000.0, -1500.0, 1500.0, 3000.0] +# energy_resource: +# name: Ard Example 01 offshore energy resource +# wind_resource: !include ../../data/windIO-plant_wind-resource_wrg-example.yaml +# wind_farm: +# name: Ard Example 01 offshore wind farm +# layouts: +# coordinates: +# x: [ +# -2500.0, -1250.0, 0.0, 1250.0, 2500.0, +# -2500.0, -1250.0, 0.0, 1250.0, 2500.0, +# -2500.0, -1250.0, 0.0, 1250.0, 2500.0, +# -2500.0, -1250.0, 0.0, 1250.0, 2500.0, +# -2500.0, -1250.0, 0.0, 1250.0, 2500.0 +# ] +# y: [ +# -2500.0, -2500.0, -2500.0, -2500.0, -2500.0, +# -1250.0, -1250.0, -1250.0, -1250.0, -1250.0, +# 0.0, 0.0, 0.0, 0.0, 0.0, +# 1250.0, 1250.0, 1250.0, 1250.0, 1250.0, +# 2500.0, 2500.0, 2500.0, 2500.0, 2500.0 +# ] +# turbine: !include ../../data/windIO-plant_turbine_IEA-3.4MW-130m-RWT.yaml +# electrical_substations: +# - electrical_substation: +# coordinates: +# x: [100.0] +# y: [100.0] \ No newline at end of file diff --git a/examples/x07_exclusion/inputs/wrg.yaml b/examples/x07_exclusion/inputs/wrg.yaml new file mode 100644 index 00000000..4f22c63c --- /dev/null +++ b/examples/x07_exclusion/inputs/wrg.yaml @@ -0,0 +1,62 @@ +reference_height: 80.0 +wind_direction: [ + 0.0, 22.5, 45.0, 67.5, + 90.0, 112.5, 135.0, 157.5, + 180.0, 202.5, 225.0, 247.5, + 270.0, 292.5, 315.0, 337.5 +] +wind_speed: [ + 3.5, 4.5, 5.5, 6.5, 7.5, + 8.5, 9.5, 10.5, 11.5, 12.5, + 13.5, 14.5, 15.5, 16.5, 17.5, + 18.5, 19.5, 20.5, 21.5, 22.5, + 23.5, 24.5 +] +probability: + data: + - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 0.0 + - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 22.5 + - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 45.0 + - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 67.5 + - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 90.0 + - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 112.5 + - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 135.0 + - [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 157.5 + - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 180.0 + - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 202.5 + - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 225.0 + - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 247.5 + - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 270.0 + - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 292.5 + - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 315.0 + - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 337.5 + # | | | | | | | | | | | | | | | | | | | | | | + # 3.5 | 5.5 | 7.5 | 9.5 |11.5 |13.5 |15.5 |17.5 |19.5 |21.5 |23.5 | + # | 4.5 | 6.5 | 8.5 |10.5 |12.5 |14.5 |16.5 |18.5 |20.5 |22.5 |24.5 + dims: + - wind_direction + - wind_speed +turbulence_intensity: + data: + - [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # 0.0 + - [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # 22.5 + - [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # 45.0 + - [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # 67.5 + - [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # 90.0 + - [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # 112.5 + - [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # 135.0 + - [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # 157.5 + - [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # 180.0 + - [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # 202.5 + - [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # 225.0 + - [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # 247.5 + - [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # 270.0 + - [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # 292.5 + - [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # 315.0 + - [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # 337.5 + # | | | | | | | | | | | | | | | | | | | | | | + # 3.5 | 5.5 | 7.5 | 9.5 | 11.5 | 13.5 | 15.5 | 17.5 | 19.5 | 21.5 | 23.5 | + # | 4.5 | 6.5 | 8.5 | 10.5 | 12.5 | 14.5 | 16.5 | 18.5 | 20.5 | 22.5 | 24.5 + dims: + - wind_direction + - wind_speed diff --git a/examples/x07_exclusion/optimization_demo.ipynb b/examples/x07_exclusion/optimization_demo.ipynb new file mode 100644 index 00000000..17b59695 --- /dev/null +++ b/examples/x07_exclusion/optimization_demo.ipynb @@ -0,0 +1,268 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0a8540f7", + "metadata": {}, + "source": [ + "# x07: Onshore LCOE w/ exclusions\n", + "\n", + "In this example, we will demonstrate `Ard`'s ability to run a LCOE analysis and optimization with exclusions.\n", + "\n", + "We can start by loading what we need to run the problem." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d75b4457", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path # optional, for nice path specifications\n", + "\n", + "import pprint as pp # optional, for nice printing\n", + "import numpy as np # numerics library\n", + "import matplotlib.pyplot as plt # plotting capabilities\n", + "\n", + "import ard # technically we only really need this\n", + "from ard.utils.io import load_yaml # we grab a yaml loader here\n", + "from ard.api import set_up_ard_model # the secret sauce\n", + "from ard.viz.layout import plot_layout # a plotting tool!\n", + "\n", + "import openmdao.api as om # for N2 diagrams from the OpenMDAO backend\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29850609", + "metadata": {}, + "outputs": [], + "source": [ + "# load input\n", + "path_inputs = Path.cwd().absolute() / \"inputs\"\n", + "input_dict = load_yaml(path_inputs / \"ard_system.yaml\")\n", + "\n", + "# create and setup system\n", + "prob = set_up_ard_model(input_dict=input_dict, root_data_path=path_inputs)\n", + "\n", + "prob.model.set_input_defaults(\n", + " \"x_turbines\",\n", + " input_dict[\"modeling_options\"][\"windIO_plant\"][\"wind_farm\"][\"layouts\"][\n", + " \"coordinates\"\n", + " ][\"x\"],\n", + " units=\"m\",\n", + ")\n", + "prob.model.set_input_defaults(\n", + " \"y_turbines\",\n", + " input_dict[\"modeling_options\"][\"windIO_plant\"][\"wind_farm\"][\"layouts\"][\n", + " \"coordinates\"\n", + " ][\"y\"],\n", + " units=\"m\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aa48878e", + "metadata": {}, + "outputs": [], + "source": [ + "if False:\n", + " # visualize model\n", + " om.n2(prob)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "b74f9d45", + "metadata": {}, + "outputs": [ + { + "ename": "NotImplementedError", + "evalue": "'eagles' : Error calling compute(), @Eliot, you need to implement this!!!", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mNotImplementedError\u001b[39m Traceback (most recent call last)", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/openmdao/core/system.py:2992\u001b[39m, in \u001b[36mSystem._call_user_function\u001b[39m\u001b[34m(self, fname, protect_inputs, protect_outputs, protect_residuals)\u001b[39m\n\u001b[32m 2991\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m2992\u001b[39m \u001b[38;5;28;01myield\u001b[39;00m\n\u001b[32m 2993\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/openmdao/core/explicitcomponent.py:302\u001b[39m, in \u001b[36mExplicitComponent._compute_wrapper\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 301\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m302\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mcompute\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_inputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_outputs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/codes/Ard/ard/eco/eagle_density.py:80\u001b[39m, in \u001b[36mEagleDensityFunction.compute\u001b[39m\u001b[34m(self, inputs, outputs)\u001b[39m\n\u001b[32m 78\u001b[39m y_turbines = inputs[\u001b[33m\"\u001b[39m\u001b[33my_turbines\u001b[39m\u001b[33m\"\u001b[39m] \u001b[38;5;66;03m# m\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m80\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m(\n\u001b[32m 81\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m@Eliot, you need to implement this!!!\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 82\u001b[39m )\n\u001b[32m 84\u001b[39m outputs[\u001b[33m\"\u001b[39m\u001b[33meagle_normalized_density\u001b[39m\u001b[33m\"\u001b[39m] = y\n", + "\u001b[31mNotImplementedError\u001b[39m: @Eliot, you need to implement this!!!", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[31mNotImplementedError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[6]\u001b[39m\u001b[32m, line 2\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;66;03m# run the model\u001b[39;00m\n\u001b[32m----> \u001b[39m\u001b[32m2\u001b[39m \u001b[43mprob\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrun_model\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 4\u001b[39m \u001b[38;5;66;03m# collapse the test result data\u001b[39;00m\n\u001b[32m 5\u001b[39m test_data = {\n\u001b[32m 6\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mAEP_val\u001b[39m\u001b[33m\"\u001b[39m: \u001b[38;5;28mfloat\u001b[39m(prob.get_val(\u001b[33m\"\u001b[39m\u001b[33mAEP_farm\u001b[39m\u001b[33m\"\u001b[39m, units=\u001b[33m\"\u001b[39m\u001b[33mGW*h\u001b[39m\u001b[33m\"\u001b[39m)[\u001b[32m0\u001b[39m]),\n\u001b[32m 7\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mCapEx_val\u001b[39m\u001b[33m\"\u001b[39m: \u001b[38;5;28mfloat\u001b[39m(prob.get_val(\u001b[33m\"\u001b[39m\u001b[33mtcc.tcc\u001b[39m\u001b[33m\"\u001b[39m, units=\u001b[33m\"\u001b[39m\u001b[33mMUSD\u001b[39m\u001b[33m\"\u001b[39m)[\u001b[32m0\u001b[39m]),\n\u001b[32m (...)\u001b[39m\u001b[32m 14\u001b[39m ),\n\u001b[32m 15\u001b[39m }\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/openmdao/core/problem.py:669\u001b[39m, in \u001b[36mProblem.run_model\u001b[39m\u001b[34m(self, case_prefix, reset_iter_counts)\u001b[39m\n\u001b[32m 666\u001b[39m record_model_options(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;28mself\u001b[39m._run_counter)\n\u001b[32m 668\u001b[39m \u001b[38;5;28mself\u001b[39m.model._clear_iprint()\n\u001b[32m--> \u001b[39m\u001b[32m669\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrun_solve_nonlinear\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 670\u001b[39m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[32m 671\u001b[39m \u001b[38;5;28mself\u001b[39m._recording_iter.prefix = old_prefix\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/openmdao/core/system.py:5151\u001b[39m, in \u001b[36mSystem.run_solve_nonlinear\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 5145\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 5146\u001b[39m \u001b[33;03mCompute outputs.\u001b[39;00m\n\u001b[32m 5147\u001b[39m \n\u001b[32m 5148\u001b[39m \u001b[33;03mThis calls _solve_nonlinear, but with the model assumed to be in an unscaled state.\u001b[39;00m\n\u001b[32m 5149\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 5150\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m._scaled_context_all():\n\u001b[32m-> \u001b[39m\u001b[32m5151\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_solve_nonlinear\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/openmdao/core/group.py:3846\u001b[39m, in \u001b[36mGroup._solve_nonlinear\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 3844\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m Recording(name + \u001b[33m'\u001b[39m\u001b[33m._solve_nonlinear\u001b[39m\u001b[33m'\u001b[39m, \u001b[38;5;28mself\u001b[39m.iter_count, \u001b[38;5;28mself\u001b[39m):\n\u001b[32m 3845\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m._relevance.active(\u001b[38;5;28mself\u001b[39m._nonlinear_solver.use_relevance()):\n\u001b[32m-> \u001b[39m\u001b[32m3846\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_nonlinear_solver\u001b[49m\u001b[43m.\u001b[49m\u001b[43m_solve_with_cache_check\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/openmdao/solvers/nonlinear/nonlinear_runonce.py:26\u001b[39m, in \u001b[36mNonlinearRunOnce._solve_with_cache_check\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 25\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_solve_with_cache_check\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[32m---> \u001b[39m\u001b[32m26\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43msolve\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/openmdao/solvers/nonlinear/nonlinear_runonce.py:45\u001b[39m, in \u001b[36mNonlinearRunOnce.solve\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 41\u001b[39m subsys._solve_nonlinear()\n\u001b[32m 43\u001b[39m \u001b[38;5;66;03m# If this is not a parallel group, transfer for each subsystem just prior to running it.\u001b[39;00m\n\u001b[32m 44\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m---> \u001b[39m\u001b[32m45\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_gs_iter\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 47\u001b[39m rec.abs = \u001b[32m0.0\u001b[39m\n\u001b[32m 48\u001b[39m rec.rel = \u001b[32m0.0\u001b[39m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/openmdao/solvers/solver.py:937\u001b[39m, in \u001b[36mNonlinearSolver._gs_iter\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 935\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m subsys._is_local:\n\u001b[32m 936\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m937\u001b[39m \u001b[43msubsys\u001b[49m\u001b[43m.\u001b[49m\u001b[43m_solve_nonlinear\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 938\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m AnalysisError \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[32m 939\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[33m'\u001b[39m\u001b[33mreraise_child_analysiserror\u001b[39m\u001b[33m'\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m.options \u001b[38;5;129;01mor\u001b[39;00m \\\n\u001b[32m 940\u001b[39m \u001b[38;5;28mself\u001b[39m.options[\u001b[33m'\u001b[39m\u001b[33mreraise_child_analysiserror\u001b[39m\u001b[33m'\u001b[39m]:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/openmdao/core/explicitcomponent.py:328\u001b[39m, in \u001b[36mExplicitComponent._solve_nonlinear\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 326\u001b[39m \u001b[38;5;28mself\u001b[39m._residuals.set_val(\u001b[32m0.0\u001b[39m)\n\u001b[32m 327\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m._unscaled_context(outputs=[\u001b[38;5;28mself\u001b[39m._outputs]):\n\u001b[32m--> \u001b[39m\u001b[32m328\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_compute_wrapper\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/openmdao/core/explicitcomponent.py:282\u001b[39m, in \u001b[36mExplicitComponent._compute_wrapper\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 278\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_compute_wrapper\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[32m 279\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 280\u001b[39m \u001b[33;03m Call compute based on the value of the \"run_root_only\" option.\u001b[39;00m\n\u001b[32m 281\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m282\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m._call_user_function(\u001b[33m'\u001b[39m\u001b[33mcompute\u001b[39m\u001b[33m'\u001b[39m):\n\u001b[32m 283\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._run_root_only():\n\u001b[32m 284\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.comm.rank == \u001b[32m0\u001b[39m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/ard-dev-env/lib/python3.12/contextlib.py:158\u001b[39m, in \u001b[36m_GeneratorContextManager.__exit__\u001b[39m\u001b[34m(self, typ, value, traceback)\u001b[39m\n\u001b[32m 156\u001b[39m value = typ()\n\u001b[32m 157\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m158\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mgen\u001b[49m\u001b[43m.\u001b[49m\u001b[43mthrow\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 159\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[32m 160\u001b[39m \u001b[38;5;66;03m# Suppress StopIteration *unless* it's the same exception that\u001b[39;00m\n\u001b[32m 161\u001b[39m \u001b[38;5;66;03m# was passed to throw(). This prevents a StopIteration\u001b[39;00m\n\u001b[32m 162\u001b[39m \u001b[38;5;66;03m# raised inside the \"with\" statement from being suppressed.\u001b[39;00m\n\u001b[32m 163\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m exc \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m value\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/openmdao/core/system.py:2998\u001b[39m, in \u001b[36mSystem._call_user_function\u001b[39m\u001b[34m(self, fname, protect_inputs, protect_outputs, protect_residuals)\u001b[39m\n\u001b[32m 2996\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m\n\u001b[32m 2997\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m2998\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m err_type(\n\u001b[32m 2999\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m.msginfo\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m: Error calling \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfname\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m(), \u001b[39m\u001b[38;5;132;01m{\u001b[39;00merr\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m).with_traceback(trace)\n\u001b[32m 3000\u001b[39m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[32m 3001\u001b[39m \u001b[38;5;28mself\u001b[39m._inputs.read_only = \u001b[38;5;28;01mFalse\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/openmdao/core/system.py:2992\u001b[39m, in \u001b[36mSystem._call_user_function\u001b[39m\u001b[34m(self, fname, protect_inputs, protect_outputs, protect_residuals)\u001b[39m\n\u001b[32m 2989\u001b[39m \u001b[38;5;28mself\u001b[39m._residuals.read_only = protect_residuals\n\u001b[32m 2991\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m2992\u001b[39m \u001b[38;5;28;01myield\u001b[39;00m\n\u001b[32m 2993\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[32m 2994\u001b[39m err_type, err, trace = sys.exc_info()\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/envs/ard-dev-env/lib/python3.12/site-packages/openmdao/core/explicitcomponent.py:302\u001b[39m, in \u001b[36mExplicitComponent._compute_wrapper\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 299\u001b[39m \u001b[38;5;28mself\u001b[39m.compute(\u001b[38;5;28mself\u001b[39m._inputs, \u001b[38;5;28mself\u001b[39m._outputs,\n\u001b[32m 300\u001b[39m \u001b[38;5;28mself\u001b[39m._discrete_inputs, \u001b[38;5;28mself\u001b[39m._discrete_outputs)\n\u001b[32m 301\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m302\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mcompute\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_inputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_outputs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/codes/Ard/ard/eco/eagle_density.py:80\u001b[39m, in \u001b[36mEagleDensityFunction.compute\u001b[39m\u001b[34m(self, inputs, outputs)\u001b[39m\n\u001b[32m 77\u001b[39m x_turbines = inputs[\u001b[33m\"\u001b[39m\u001b[33mx_turbines\u001b[39m\u001b[33m\"\u001b[39m] \u001b[38;5;66;03m# m\u001b[39;00m\n\u001b[32m 78\u001b[39m y_turbines = inputs[\u001b[33m\"\u001b[39m\u001b[33my_turbines\u001b[39m\u001b[33m\"\u001b[39m] \u001b[38;5;66;03m# m\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m80\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m(\n\u001b[32m 81\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m@Eliot, you need to implement this!!!\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 82\u001b[39m )\n\u001b[32m 84\u001b[39m outputs[\u001b[33m\"\u001b[39m\u001b[33meagle_normalized_density\u001b[39m\u001b[33m\"\u001b[39m] = y\n", + "\u001b[31mNotImplementedError\u001b[39m: 'eagles' : Error calling compute(), @Eliot, you need to implement this!!!" + ] + } + ], + "source": [ + "# run the model\n", + "prob.run_model()\n", + "\n", + "# collapse the test result data\n", + "test_data = {\n", + " \"AEP_val\": float(prob.get_val(\"AEP_farm\", units=\"GW*h\")[0]),\n", + " \"CapEx_val\": float(prob.get_val(\"tcc.tcc\", units=\"MUSD\")[0]),\n", + " \"BOS_val\": float(prob.get_val(\"landbosse.total_capex\", units=\"MUSD\")[0]),\n", + " \"OpEx_val\": float(prob.get_val(\"opex.opex\", units=\"MUSD/yr\")[0]),\n", + " \"LCOE_val\": float(prob.get_val(\"financese.lcoe\", units=\"USD/MW/h\")[0]),\n", + " \"coll_length\": float(prob.get_val(\"collection.total_length_cables\", units=\"km\")[0]),\n", + " \"turbine_spacing\": float(\n", + " np.min(prob.get_val(\"spacing_constraint.turbine_spacing\", units=\"km\"))\n", + " ),\n", + "}\n", + "\n", + "print(\"\\n\\nRESULTS:\\n\")\n", + "pp.pprint(test_data)\n", + "print(\"\\n\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "b3085438", + "metadata": {}, + "source": [ + "Now, we can optimize the same problem!\n", + "The optimization details are set under the `analysis_options` header in `inputs/ard_system.yaml`.\n", + "Here, we use a four-dimensional rectilinear layout parameterization ($\\theta$) as design variables, constrain the farm such that the turbines are in the boundaries and satisfactorily spaced, and then we optimize for LCOE.\n", + "$$\n", + "\\begin{aligned}\n", + "\\textrm{minimize}_\\theta \\quad & \\mathrm{LCOE}(\\theta, \\ldots) \\\\\n", + "\\textrm{subject to} \\quad & f_{\\mathrm{spacing}}(\\theta, \\ldots) < 0 \\\\\n", + " & f_{\\mathrm{boundary}}(\\theta, \\ldots) < 0\n", + "\\end{aligned}\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0009663", + "metadata": {}, + "outputs": [], + "source": [ + "optimize = True # set to False to skip optimization\n", + "if optimize:\n", + " # run the optimization\n", + " prob.run_driver()\n", + " prob.cleanup()\n", + "\n", + " # collapse the test result data\n", + " test_data = {\n", + " \"AEP_val\": float(prob.get_val(\"AEP_farm\", units=\"GW*h\")[0]),\n", + " \"CapEx_val\": float(prob.get_val(\"tcc.tcc\", units=\"MUSD\")[0]),\n", + " \"BOS_val\": float(prob.get_val(\"landbosse.total_capex\", units=\"MUSD\")[0]),\n", + " \"OpEx_val\": float(prob.get_val(\"opex.opex\", units=\"MUSD/yr\")[0]),\n", + " \"LCOE_val\": float(prob.get_val(\"financese.lcoe\", units=\"USD/MW/h\")[0]),\n", + " \"coll_length\": float(\n", + " prob.get_val(\"collection.total_length_cables\", units=\"km\")[0]\n", + " ),\n", + " \"turbine_spacing\": float(\n", + " np.min(prob.get_val(\"spacing_constraint.turbine_spacing\", units=\"km\"))\n", + " ),\n", + " }\n", + "\n", + " # clean up the recorder\n", + " prob.cleanup()\n", + "\n", + " # print the results\n", + " print(\"\\n\\nRESULTS (opt):\\n\")\n", + " pp.pprint(test_data)\n", + " print(\"\\n\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f93a46df", + "metadata": {}, + "outputs": [], + "source": [ + "ax = plot_layout(\n", + " prob,\n", + " input_dict=input_dict,\n", + " show_image=False,\n", + " include_cable_routing=True,\n", + ")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "d5fb8cca", + "metadata": {}, + "source": [ + "The result: a farm that fits in a stop-sign domain and minimzes the LCOE." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "05647c0f", + "metadata": {}, + "outputs": [], + "source": [ + "print(prob.get_val(\"exclusions.exclusion_distances\", units=\"km\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e356a5a0", + "metadata": {}, + "outputs": [], + "source": [ + "print(prob.model.aepFLORIS.fmodel.wind_data.heterogeneous_map)\n", + "pp.pprint(prob.model.aepFLORIS.fmodel.core.flow_field.heterogeneous_inflow_config)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c3d2b478", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ard-dev-env", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pyproject.toml b/pyproject.toml index 8ceeacfc..d6d95ef2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ classifiers = [ ] dependencies = [ "numpy<2.3", - "floris>=4.3", + "floris>=4.5", "wisdem>=3.21", "NLopt", "marmot-agents",