Ejemplo n.º 1
0
 def test_power_curve_7(self):
     """TODO: Explain this test"""
     self.parameters2["power_curve_values"] = np.array(
         self.parameters2["power_curve_values"])
     self.parameters2["power_curve_wind_speeds"] = np.array(
         self.parameters2["power_curve_wind_speeds"])
     assert_allclose(power_curve(**self.parameters2),
                     self.power_output_exp2)
     assert isinstance(power_curve(**self.parameters2), np.ndarray)
Ejemplo n.º 2
0
 def test_power_curve_3(self):
     """
     Test wind_speed as np.array and power_curve as
     pd.Series and np.array
     """
     power_output_exp = np.array(self.power_output_exp1)
     self.parameters2["wind_speed"] = np.array(
         self.parameters2["wind_speed"])
     assert_allclose(power_curve(**self.parameters2), power_output_exp)
     assert isinstance(power_curve(**self.parameters2), np.ndarray)
Ejemplo n.º 3
0
 def test_power_curve_5(self):
     """
     Tests with density correction:
     Test wind_speed as np.array with density and power_curve as pd.Series
     and np.array
     """
     power_output_exp = np.array(self.power_output_exp2)
     self.parameters2["density_correction"] = True
     assert_allclose(power_curve(**self.parameters2), power_output_exp)
     assert isinstance(power_curve(**self.parameters2), np.ndarray)
Ejemplo n.º 4
0
 def test_wrong_spelling_density_correction(self):
     parameters = {
         "wind_speed": pd.Series(data=[2.0, 5.5, 7.0]),
         "density": pd.Series(data=[1.3, 1.3, 1.3]),
         "power_curve_wind_speeds": pd.Series([4.0, 5.0, 6.0]),
         "power_curve_values": pd.Series([300, 400, 500]),
     }
     msg = "is an invalid type. `density_correction` must be Boolean"
     with pytest.raises(TypeError, match=msg):
         parameters["density_correction"] = None
         power_curve(**parameters)
Ejemplo n.º 5
0
def check_theoretical_power(df, year, start=None, end=None):
    r"""
    This function was used to compare the theoretical power of ArgeNetz wind
    farms with the simulated power when the measured wind speed (of ArgeNetz
    data) is used.

    As no wind speed is added to the data of 2015 this function can only be
    used for the year 2015.

    """
    wind_farm_names = ['wf_1', 'wf_3', 'wf_4', 'wf_5']
    wind_turbine_amount = [(0, 16), (4, 13), (0, 22), (0, 14)]
    # Turbine data
    enerconE70 = {
        'turbine_name': 'ENERCON E 70 2300',
        'hub_height': 64,  # in m
        'rotor_diameter': 71  # in m
    }
    enerconE66 = {
        'turbine_name': 'ENERCON E 66 1800',
        'hub_height': 65,  # in m
        'rotor_diameter': 70  # in m
        }
    # Initialize WindTurbine objects
    e70 = wt.WindTurbine(**enerconE70)
    e66 = wt.WindTurbine(**enerconE66)
    for name, turbine_amount in zip(wind_farm_names, wind_turbine_amount):
        indices = tools.get_indices_for_series(1, 'Europe/Berlin', year)
        power_output_theo = df[name + '_theoretical_power'] / 1000
        power_output_theo = pd.Series(data=power_output_theo.values,
                                      index=indices)
        power_output_by_wind_speed = (
            turbine_amount[0] * power_output.power_curve(
                df[name + '_wind_speed'], e66.power_curve['wind_speed'],
                e66.power_curve['power']) +
            turbine_amount[1] * power_output.power_curve(
                df[name + '_wind_speed'], e70.power_curve['wind_speed'],
                e70.power_curve['power'])) / (1*10**6)
        power_output_by_wind_speed = pd.Series(
            data=power_output_by_wind_speed.values, index=indices)
        val_obj = analysis_tools.ValidationObject(
            'validate_arge_4919', power_output_theo,
            power_output_by_wind_speed,
            weather_data_name='calculated by wind speed',
            validation_name='P_W theoretical')
        val_obj.output_method = 'power_output'
        visualization_tools.plot_feedin_comparison(
            val_obj, filename='../Plots/Test_Arge/{0}_{1}_feedin'.format(
                year, name),
            title='{0}'.format(name), start=start, end=end)
        visualization_tools.plot_correlation(
            val_obj, filename='../Plots/Test_Arge/{0}_{1}_corr'.format(
                year, name),
            title='{0}'.format(name))
Ejemplo n.º 6
0
    def test_power_curve_density_correction(self):
        """TODO: Explain and split this test."""
        parameters = {
            "wind_speed": pd.Series(data=[2.0, 5.5, 7.0]),
            "density": pd.Series(data=[1.3, 1.3, 1.3]),
            "power_curve_wind_speeds": pd.Series([4.0, 5.0, 6.0]),
            "power_curve_values": pd.Series([300, 400, 500]),
        }

        # Test wind_speed as pd.Series with density and power_curve as
        # pd.Series and np.array
        power_output_exp = pd.Series(data=[0.0, 461.00290572, 0.0],
                                     name="feedin_power_plant")
        assert_series_equal(power_curve_density_correction(**parameters),
                            power_output_exp)
        parameters["density"] = np.array(parameters["density"])
        assert_series_equal(power_curve_density_correction(**parameters),
                            power_output_exp)
        parameters["power_curve_values"] = np.array(
            parameters["power_curve_values"])
        parameters["power_curve_wind_speeds"] = np.array(
            parameters["power_curve_wind_speeds"])
        assert_series_equal(power_curve_density_correction(**parameters),
                            power_output_exp)

        # Test wind_speed as np.array with density and power_curve as np.array
        # and pd.Series
        parameters["wind_speed"] = np.array(parameters["wind_speed"])
        power_output_exp = np.array([0.0, 461.00290572, 0.0])
        assert_allclose(power_curve_density_correction(**parameters),
                        power_output_exp)
        assert isinstance(power_curve(**parameters), np.ndarray)
        parameters["density"] = pd.Series(data=parameters["density"])
        assert_allclose(power_curve_density_correction(**parameters),
                        power_output_exp)
        assert isinstance(power_curve(**parameters), np.ndarray)
        parameters["power_curve_wind_speeds"] = pd.Series(
            data=parameters["power_curve_wind_speeds"])
        parameters["power_curve_values"] = pd.Series(
            data=parameters["power_curve_values"])
        assert_allclose(power_curve_density_correction(**parameters),
                        power_output_exp)
        assert isinstance(power_curve(**parameters), np.ndarray)

        # Raise TypeError due to density is None
        with pytest.raises(TypeError):
            parameters["density"] = None
            power_curve_density_correction(**parameters)
    def test_power_curve_density_correction(self):
        parameters = {'wind_speed': pd.Series(data=[2.0, 5.5, 7.0]),
                      'density': pd.Series(data=[1.3, 1.3, 1.3]),
                      'power_curve_wind_speeds':
                          pd.Series([4.0, 5.0, 6.0]),
                      'power_curve_values':
                          pd.Series([300, 400, 500])
                      }

        # Test wind_speed as pd.Series with density and power_curve as
        # pd.Series and np.array
        power_output_exp = pd.Series(data=[0.0, 461.00290572, 0.0],
                                     name='feedin_power_plant')
        assert_series_equal(power_curve_density_correction(**parameters),
                            power_output_exp)
        parameters['density'] = np.array(parameters['density'])
        assert_series_equal(power_curve_density_correction(**parameters),
                            power_output_exp)
        parameters['power_curve_values'] = np.array(
            parameters['power_curve_values'])
        parameters['power_curve_wind_speeds'] = np.array(
            parameters['power_curve_wind_speeds'])
        assert_series_equal(power_curve_density_correction(**parameters),
                            power_output_exp)

        # Test wind_speed as np.array with density and power_curve as np.array
        # and pd.Series
        parameters['wind_speed'] = np.array(parameters['wind_speed'])
        power_output_exp = np.array([0.0, 461.00290572, 0.0])
        assert_allclose(power_curve_density_correction(**parameters),
                        power_output_exp)
        assert isinstance(power_curve(**parameters), np.ndarray)
        parameters['density'] = pd.Series(data=parameters['density'])
        assert_allclose(power_curve_density_correction(**parameters),
                        power_output_exp)
        assert isinstance(power_curve(**parameters), np.ndarray)
        parameters['power_curve_wind_speeds'] = pd.Series(
            data=parameters['power_curve_wind_speeds'])
        parameters['power_curve_values'] = pd.Series(
            data=parameters['power_curve_values'])
        assert_allclose(power_curve_density_correction(**parameters),
                        power_output_exp)
        assert isinstance(power_curve(**parameters), np.ndarray)

        # Raise TypeError due to density is None
        with pytest.raises(TypeError):
            parameters['density'] = None
            power_curve_density_correction(**parameters)
Ejemplo n.º 8
0
    def test_power_curve_1(self):
        # Tests without density correction:
        # Test wind_speed as pd.Series and power_curve as pd.Series and
        # np.array

        assert_series_equal(power_curve(**self.parameters2),
                            self.power_output_exp1)
Ejemplo n.º 9
0
 def test_power_curve_2(self):
     """TODO: Explain this test"""
     self.parameters2["power_curve_values"] = np.array(
         self.parameters2["power_curve_values"])
     self.parameters2["power_curve_wind_speeds"] = np.array(
         self.parameters2["power_curve_wind_speeds"])
     assert_series_equal(power_curve(**self.parameters2),
                         self.power_output_exp1)
Ejemplo n.º 10
0
 def test_power_curve_10(self):
     """TODO: Explain this test"""
     self.parameters2["power_curve_wind_speeds"] = pd.Series(
         data=self.parameters2["power_curve_wind_speeds"])
     self.parameters2["power_curve_values"] = pd.Series(
         data=self.parameters2["power_curve_values"])
     assert_series_equal(power_curve(**self.parameters2),
                         self.power_output_exp2)
Ejemplo n.º 11
0
 def test_power_curve_8(self):
     """
     Test wind_speed as pd.Series with density and power_curve as np. array
      and pd.Series
     """
     self.parameters2["wind_speed"] = pd.Series(
         data=self.parameters2["wind_speed"])
     assert_series_equal(power_curve(**self.parameters2),
                         self.power_output_exp2)
Ejemplo n.º 12
0
    def calculate_power_output(self, wind_speed_hub, density_hub):
        r"""
        Calculates the power output of the wind power plant.

        The method specified by the parameter `power_output_model` is used.

        Parameters
        ----------
        wind_speed_hub : :pandas:`pandas.Series<series>` or numpy.array
            Wind speed at hub height in m/s.
        density_hub : :pandas:`pandas.Series<series>` or numpy.array
            Density of air at hub height in kg/m³.

        Returns
        -------
        :pandas:`pandas.Series<series>`
            Electrical power output of the wind turbine in W.

        """
        if self.power_output_model == "power_curve":
            if self.power_plant.power_curve is None:
                raise TypeError("Power curve values of {} are missing.".format(
                    self.power_plant))
            logging.debug("Calculating power output using power curve.")
            return power_output.power_curve(
                wind_speed_hub,
                self.power_plant.power_curve["wind_speed"],
                self.power_plant.power_curve["value"],
                density_hub,
                self.density_correction,
            )
        elif self.power_output_model == "power_coefficient_curve":
            if self.power_plant.power_coefficient_curve is None:
                raise TypeError("Power coefficient curve values of {} are "
                                "missing.".format(self.power_plant))
            logging.debug("Calculating power output using power coefficient "
                          "curve.")
            return power_output.power_coefficient_curve(
                wind_speed_hub,
                self.power_plant.power_coefficient_curve["wind_speed"],
                self.power_plant.power_coefficient_curve["value"],
                self.power_plant.rotor_diameter,
                density_hub,
            )
        else:
            raise ValueError(
                "'{0}' is an invalid value. ".format(self.power_output_model) +
                "`power_output_model` must be " +
                "'power_curve' or 'power_coefficient_curve'.")
Ejemplo n.º 13
0
def power_output_simple(wind_turbine_fleet, weather_df, data_height):
    # TODO: add weather_data_name to these functions and use modelchain for
    #       open_FRED data as there are different heights and this is easier
    #       with the multiindex dataframe
    r"""
    Calculate power output of several wind turbines by a simple method.

    Simplest way to calculate the power output of a wind farm or other
    gathering of wind turbines. For the power_output of the single turbines
    a power_curve without density correction is used. The wind speed at hub
    height is calculated by the logarithmic wind profile. The power output of
    the wind farm is calculated by aggregation of the power output of the
    single turbines.

    Parameters
    ----------
    wind_turbine_fleet : List of Dictionaries
        Wind turbines of wind farm. Dictionaries must have 'wind_turbine'
        (contains wind turbine object) and 'number_of_turbines' (number of
        turbine type in wind farm) as keys.
    weather_df : pandas.DataFrame
        DataFrame with time series for wind speed `wind_speed` in m/s and
        roughness length `roughness_length` in m.
    data_height : Dictionary
        Contains the heights of the weather measurements or weather
        model in meters with the keys of the data parameter.

    Returns
    -------
    pd.Series
        Simulated power output of wind farm.

    """
    for turbine_type in wind_turbine_fleet:
        wind_speed_hub = wind_speed.logarithmic_profile(
            weather_df.wind_speed,
            data_height['wind_speed'],
            turbine_type['wind_turbine'].hub_height,
            weather_df.roughness_length,
            obstacle_height=0.0)
        turbine_type['wind_turbine'].power_output = (power_output.power_curve(
            wind_speed_hub,
            turbine_type['wind_turbine'].power_curve['wind_speed'],
            turbine_type['wind_turbine'].power_curve['power']))
    return power_output_simple_aggregation(wind_turbine_fleet)
Ejemplo n.º 14
0
    def calculate_power_output(self, wind_speed_hub, density_hub):
        r"""
        Calculates the power output of the wind power plant.

        The method specified by the parameter `power_output_model` is used.

        Parameters
        ----------
        wind_speed_hub : pandas.Series or numpy.array
            Wind speed at hub height in m/s.
        density_hub : pandas.Series or numpy.array
            Density of air at hub height in kg/m³.

        Returns
        -------
        pandas.Series
            Electrical power output of the wind turbine in W.

        """
        if self.power_output_model == 'power_curve':
            if self.power_plant.power_curve is None:
                raise TypeError("Power curve values of " +
                                self.power_plant.name + " are missing.")
            logging.debug('Calculating power output using power curve.')
            return (power_output.power_curve(
                wind_speed_hub, self.power_plant.power_curve['wind_speed'],
                self.power_plant.power_curve['value'], density_hub,
                self.density_correction))
        elif self.power_output_model == 'power_coefficient_curve':
            if self.power_plant.power_coefficient_curve is None:
                raise TypeError("Power coefficient curve values of " +
                                self.power_plant.name + " are missing.")
            logging.debug('Calculating power output using power coefficient '
                          'curve.')
            return (power_output.power_coefficient_curve(
                wind_speed_hub,
                self.power_plant.power_coefficient_curve['wind_speed'],
                self.power_plant.power_coefficient_curve['value'],
                self.power_plant.rotor_diameter, density_hub))
        else:
            raise ValueError(
                "'{0}' is an invalid value. ".format(self.power_output_model) +
                "`power_output_model` must be " +
                "'power_curve' or 'power_coefficient_curve'.")
Ejemplo n.º 15
0
    def test_power_curve(self):
        parameters = {'wind_speed': pd.Series(data=[2.0, 5.5, 7.0]),
                      'density': pd.Series(data=[1.3, 1.3, 1.3]),
                      'density_correction': False,
                      'power_curve_wind_speeds':
                          pd.Series([4.0, 5.0, 6.0]),
                      'power_curve_values':
                          pd.Series([300, 400, 500])
                      }

        # Tests without density correction:
        # Test wind_speed as pd.Series and power_curve as pd.Series and
        # np.array
        power_output_exp = pd.Series(data=[0.0, 450.0, 0.0],
                                     name='feedin_power_plant')
        assert_series_equal(power_curve(**parameters), power_output_exp)
        parameters['power_curve_values'] = np.array(
            parameters['power_curve_values'])
        parameters['power_curve_wind_speeds'] = np.array(
            parameters['power_curve_wind_speeds'])
        assert_series_equal(power_curve(**parameters),
                            power_output_exp)

        # Test wind_speed as np.array and power_curve as pd.Series and np.array
        power_output_exp = np.array([0.0, 450.0, 0.0])
        parameters['wind_speed'] = np.array(parameters['wind_speed'])
        assert_allclose(power_curve(**parameters), power_output_exp)
        assert isinstance(power_curve(**parameters), np.ndarray)
        parameters['power_curve_wind_speeds'] = pd.Series(
            data=parameters['power_curve_wind_speeds'])
        parameters['power_curve_values'] = pd.Series(
            data=parameters['power_curve_values'])
        assert_allclose(power_curve(**parameters), power_output_exp)
        assert isinstance(power_curve(**parameters), np.ndarray)

        # Tests with density correction:
        # Test wind_speed as np.array with density and power_curve as pd.Series
        # and np.array
        power_output_exp = np.array([0.0, 461.00290572, 0.0])
        parameters['density_correction'] = True
        assert_allclose(power_curve(**parameters), power_output_exp)
        assert isinstance(power_curve(**parameters), np.ndarray)
        parameters['density'] = np.array(parameters['density'])
        assert_allclose(power_curve(**parameters), power_output_exp)
        assert isinstance(power_curve(**parameters), np.ndarray)
        parameters['power_curve_values'] = np.array(
            parameters['power_curve_values'])
        parameters['power_curve_wind_speeds'] = np.array(
            parameters['power_curve_wind_speeds'])
        assert_allclose(power_curve(**parameters), power_output_exp)
        assert isinstance(power_curve(**parameters), np.ndarray)

        # Test wind_speed as pd.Series with density and power_curve as
        # np. array and pd.Series
        power_output_exp = pd.Series(data=[0.0, 461.00290572, 0.0],
                                     name='feedin_power_plant')
        parameters['wind_speed'] = pd.Series(data=parameters['wind_speed'])
        assert_series_equal(power_curve(**parameters), power_output_exp)
        parameters['density'] = pd.Series(data=parameters['density'])
        assert_series_equal(power_curve(**parameters),
                            power_output_exp)
        parameters['power_curve_wind_speeds'] = pd.Series(
            data=parameters['power_curve_wind_speeds'])
        parameters['power_curve_values'] = pd.Series(
            data=parameters['power_curve_values'])
        assert_series_equal(power_curve(**parameters),
                            power_output_exp)

        # Raise TypeErrors due to wrong type of `density_correction`
        with pytest.raises(TypeError):
            parameters['density'] = 'wrong_type'
            power_curve(**parameters)
Ejemplo n.º 16
0
 def test_power_curve_6(self):
     """TODO: Explain this test"""
     self.parameters2["density"] = np.array(self.parameters2["density"])
     assert_allclose(power_curve(**self.parameters2),
                     self.power_output_exp2)
     assert isinstance(power_curve(**self.parameters2), np.ndarray)
Ejemplo n.º 17
0
 def test_power_curve_9(self):
     """TODO: Explain this test"""
     self.parameters2["density"] = pd.Series(
         data=self.parameters2["density"])
     assert_series_equal(power_curve(**self.parameters2),
                         self.power_output_exp2)