def test_TopFarmProblem_with_cirleboundary_constraint(): optimal = np.array([(0, 0)]) desvar = dict(zip('xy', optimal.T)) b = CircleBoundaryConstraint([2, 2], 2) tf = TopFarmProblem(desvar, DummyCost(optimal, 'xy'), constraints=[b]) _, state, _ = tf.optimize() npt.assert_array_less((state['x'] - 2)**2 + (state['y'] - 2)**2, 9)
def test_smart_start_aep_map_PyWakeAEP(): site = IEA37Site(16) n_wt = 4 x, y = site.initial_position[:n_wt].T wd_lst = np.arange(0, 360, 45) ws_lst = [10] turbines = hornsrev1.HornsrevV80() site = UniformSite([1], .75) site.default_ws = ws_lst site.default_wd = wd_lst aep = PyWakeAEP(wake_model=NOJ(site, turbines)) aep_1wt = aep.calculate_AEP([0], [0]).sum() tf = TopFarmProblem(design_vars={ 'x': x, 'y': y }, cost_comp=aep.get_TopFarm_cost_component(n_wt), driver=EasyScipyOptimizeDriver(), constraints=[ SpacingConstraint(160), CircleBoundaryConstraint((0, 0), 500) ]) x = np.arange(-500, 500, 10) y = np.arange(-500, 500, 10) XX, YY = np.meshgrid(x, y) tf.smart_start(XX, YY, aep.get_aep4smart_start(wd=wd_lst, ws=ws_lst), radius=40, seed=1) tf.evaluate() if 0: wt_x, wt_y = tf['x'], tf['y'] for i, _ in enumerate(wt_x, 1): print(aep.calculate_AEP(wt_x[:i], wt_y[:i]).sum((1, 2))) X_j, Y_j, aep_map = aep.aep_map(x, y, 0, wt_x, wt_y, ws=ws_lst, wd=wd_lst) print(tf.evaluate()) import matplotlib.pyplot as plt c = plt.contourf(X_j, Y_j, aep_map, 100) plt.colorbar(c) plt.plot(wt_x, wt_y, '2r') for c in tf.model.constraint_components: c.plot() plt.axis('equal') plt.show() npt.assert_almost_equal(aep_1wt * n_wt, tf['AEP'], 5)
def main(): if __name__ == '__main__': try: import matplotlib.pyplot as plt plt.gcf() plot_comp = XYPlotComp() plot = True except RuntimeError: plot_comp = NoPlot() plot = False n_wt = 16 site = IEA37Site(n_wt) windTurbines = IEA37_WindTurbines() wake_model = IEA37SimpleBastankhahGaussian(site, windTurbines) Drotor_vector = [windTurbines.diameter()] * n_wt power_rated_vector = [float(windTurbines.power(20) / 1000)] * n_wt hub_height_vector = [windTurbines.hub_height()] * n_wt AEPCalc = AEPCalculator(wake_model) def aep_func(x, y, **kwargs): return AEPCalc.calculate_AEP(x_i=x, y_i=y).sum(-1).sum(-1) * 10**6 def irr_func(aep, **kwargs): my_irr = economic_evaluation(Drotor_vector, power_rated_vector, hub_height_vector, aep).calculate_irr() print(my_irr) return my_irr aep_comp = CostModelComponent(input_keys=['x', 'y'], n_wt=n_wt, cost_function=aep_func, output_key="aep", output_unit="GWh", objective=False, output_val=np.zeros(n_wt)) irr_comp = CostModelComponent(input_keys=['aep'], n_wt=n_wt, cost_function=irr_func, output_key="irr", output_unit="%", objective=True, income_model=True) group = TopFarmGroup([aep_comp, irr_comp]) problem = TopFarmProblem( design_vars=dict(zip('xy', site.initial_position.T)), cost_comp=group, driver=EasyRandomSearchDriver( randomize_func=RandomizeTurbinePosition_Circle(), max_iter=50), constraints=[ SpacingConstraint(200), CircleBoundaryConstraint([0, 0], 1300.1) ], plot_comp=plot_comp) cost, state, recorder = problem.optimize()
def test_TopFarmProblem_with_cirleboundary_constraint_and_limits(): optimal = np.array([(0, 0)]) desvar = {'x': ([0], 1, 4), 'y': [0]} b = CircleBoundaryConstraint([2, 2], 2) tf = TopFarmProblem(desvar, DummyCost(optimal, 'xy'), constraints=[b]) _, state, _ = tf.optimize() npt.assert_array_less((state['x'] - 2)**2 + (state['y'] - 2)**2, 9) npt.assert_array_less(.9999999, state['x'])
def test_TopFarmProblem_with_cirleboundary_gradients(): optimal = np.array([(0, 0)]) desvar = dict(zip('xy', optimal.T + 1.5)) plot_comp = NoPlot() b = CircleBoundaryConstraint([1, 2], 3) tf = TopFarmProblem(desvar, DummyCost(optimal, 'xy'), constraints=[b], plot_comp=plot_comp, driver=SimpleGADriver()) tf.check_gradients(True)
def test_TopFarmProblem_with_cirleboundary_plot(): if os.name == 'posix' and "DISPLAY" not in os.environ: pytest.xfail("No display") optimal = np.array([(0, 0)]) desvar = dict(zip('xy', optimal.T)) plot_comp = PlotComp() b = CircleBoundaryConstraint([1, 2], 3) tf = TopFarmProblem(desvar, DummyCost(optimal, 'xy'), constraints=[b], plot_comp=plot_comp) tf.evaluate()
def test_smart_start_aep_map(seed, radius, resolution, tol): site = IEA37Site(16) n_wt = 4 x, y = site.initial_position[:n_wt].T wd_lst = np.arange(0, 360, 45) ws_lst = [10] turbines = hornsrev1.HornsrevV80() site = UniformSite([1], .75) site.default_ws = ws_lst site.default_wd = wd_lst wfm = NOJ(site, turbines) aep_comp = PyWakeAEPCostModelComponent(wfm, n_wt=n_wt) aep_1wt = wfm([0], [0]).aep().sum() tf = TopFarmProblem(design_vars={ 'x': x, 'y': y }, cost_comp=aep_comp, driver=EasyScipyOptimizeDriver(), constraints=[ SpacingConstraint(160), CircleBoundaryConstraint((0, 0), radius) ]) x = np.arange(-radius, radius, resolution) y = np.arange(-radius, radius, resolution) XX, YY = np.meshgrid(x, y) tf.smart_start(XX, YY, aep_comp.get_aep4smart_start(wd=wd_lst, ws=ws_lst), radius=40, plot=0, seed=seed) tf.evaluate() if 0: wt_x, wt_y = tf['x'], tf['y'] for i, _ in enumerate(wt_x, 1): print(wfm(wt_x[:i], wt_y[:i]).aep().sum(['wd', 'ws'])) aep_comp.windFarmModel(wt_x, wt_y, ws=ws_lst, wd=wd_lst).flow_map().aep_xy().plot() print(tf.evaluate()) import matplotlib.pyplot as plt plt.plot(wt_x, wt_y, '2r') for c in tf.model.constraint_components: c.plot() plt.axis('equal') plt.show() npt.assert_almost_equal(aep_1wt * n_wt, tf['AEP'], tol)
def test_TopFarmProblem_with_cirleboundary_penalty(): optimal = np.array([(0, 0)]) desvar = dict(zip('xy', optimal.T)) b = CircleBoundaryConstraint([1, 2], 3) driver = SimpleGADriver() tf = TopFarmProblem(desvar, DummyCost(optimal, 'xy'), constraints=[b], driver=driver) tf.evaluate() tf.plot_comp.show() np.testing.assert_array_almost_equal( ((b.constraintComponent.xy_boundary - [1, 2])**2).sum(1), 3**2) npt.assert_array_less(tf.evaluate({'x': [3.9], 'y': [2]})[0], 1e10) npt.assert_array_less(1e10, tf.evaluate({'x': [4.1], 'y': [2]})[0])
def main(): if __name__ == '__main__': n_wt = 16 site = IEA37Site(n_wt) windTurbines = IEA37_WindTurbines() windFarmModel = IEA37SimpleBastankhahGaussian(site, windTurbines) tf = TopFarmProblem( design_vars=dict(zip('xy', site.initial_position.T)), cost_comp=PyWakeAEPCostModelComponent(windFarmModel, n_wt), driver=EasyRandomSearchDriver( randomize_func=RandomizeTurbinePosition_Circle(), max_iter=5), constraints=[CircleBoundaryConstraint([0, 0], 1300.1)], plot_comp=XYPlotComp()) tf.optimize() tf.plot_comp.show()
def main(): if __name__ == '__main__': site = IEA37Site(16) windTurbines = IEA37_WindTurbines() wake_model = IEA37SimpleBastankhahGaussian(windTurbines) aep_calc = PyWakeAEP(site, windTurbines, wake_model) tf = TopFarmProblem( design_vars=dict(zip('xy', site.initial_position.T)), cost_comp=aep_calc.get_TopFarm_cost_component(16), driver=EasyRandomSearchDriver( randomize_func=RandomizeTurbinePosition_Circle(), max_iter=5), constraints=[CircleBoundaryConstraint([0, 0], 1300.1)], plot_comp=XYPlotComp()) # tf.evaluate() tf.optimize() tf.plot_comp.show()
def get_iea37_constraints(n_wt=9): """Constraints for IEA Task 37 wind farms Parameters ---------- n_wt : int, optional Number of wind turbines in farm (must be valid IEA 37 farm) Returns ------- constr : list of topfarm constraints Spacing constraint and boundary constraint for IEA 37 model """ diam = read_iea37_windturbine(iea37_path + 'iea37-335mw.yaml')[2] spac_constr = SpacingConstraint(2 * diam) bound_rad = npa([900, 1300, 2000, 3000])[n_wt == npa([9, 16, 36, 64])][0] bound_constr = CircleBoundaryConstraint((0, 0), bound_rad) return [spac_constr, bound_constr]
def test_AEPMaxLoadCostModelComponent_constraint(): tf = TopFarmProblem( design_vars={ 'x': ([1]), 'y': (.1, 0, 2.5) }, # design_vars={'x': ([2.9], [1], [3])}, cost_comp=AEPMaxLoadCostModelComponent(input_keys='xy', n_wt=1, aep_load_function=lambda x, y: (np.hypot(x, y), x), max_loads=3), constraints=[CircleBoundaryConstraint((0, 0), 7)], ) tf.evaluate() cost, state, recorder = tf.optimize() npt.assert_allclose(state['x'], 3) # constrained by max_loads npt.assert_allclose(state['y'], 2.5) # constrained by design var lim
def main(): if __name__ == '__main__': try: import matplotlib.pyplot as plt plt.gcf() plot_comp = XYPlotComp() plot = True except RuntimeError: plot_comp = NoPlot() plot = False n_wt = 16 site = IEA37Site(n_wt) windTurbines = IEA37_WindTurbines() windFarmModel = IEA37SimpleBastankhahGaussian(site, windTurbines) Drotor_vector = [windTurbines.diameter()] * n_wt power_rated_vector = [float(windTurbines.power(20)) * 1e-6] * n_wt hub_height_vector = [windTurbines.hub_height()] * n_wt distance_from_shore = 10 # [km] energy_price = 0.1 # [Euro/kWh] What we get per kWh project_duration = 20 # [years] rated_rpm_array = [12] * n_wt # [rpm] water_depth_array = [15] * n_wt # [m] eco_eval = economic_evaluation(distance_from_shore, energy_price, project_duration) def irr_func(aep, **kwargs): eco_eval.calculate_irr( rated_rpm_array, Drotor_vector, power_rated_vector, hub_height_vector, water_depth_array, aep) print(eco_eval.IRR) return eco_eval.IRR aep_comp = CostModelComponent( input_keys=['x', 'y'], n_wt=n_wt, cost_function=lambda x, y, **_: windFarmModel(x=x, y=y).aep().sum(['wd', 'ws']) * 10**6, output_key="aep", output_unit="kWh", objective=False, output_val=np.zeros(n_wt)) irr_comp = CostModelComponent( input_keys=['aep'], n_wt=n_wt, cost_function=irr_func, output_key="irr", output_unit="%", objective=True, income_model=True) group = TopFarmGroup([aep_comp, irr_comp]) problem = TopFarmProblem( design_vars=dict(zip('xy', site.initial_position.T)), cost_comp=group, driver=EasyRandomSearchDriver(randomize_func=RandomizeTurbinePosition_Circle(), max_iter=5), constraints=[SpacingConstraint(200), CircleBoundaryConstraint([0, 0], 1300.1)], plot_comp=plot_comp) cost, state, recorder = problem.optimize()