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)
예제 #2
0
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)
예제 #3
0
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()
예제 #7
0
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])
예제 #9
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()
예제 #10
0
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()
예제 #11
0
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()