Ejemplo n.º 1
0
def larsen_1angle(layout_x, layout_y, wind_speed, angle, rotor_radius,
                  hub_height, TI):

    U0 = wind_speed

    r0 = rotor_radius
    nt = len(layout_y)  # Number of turbines
    D = 2.0 * r0
    A = pi * r0**2.0
    H = hub_height  # Hub height
    ia = TI  # Ambient turbulence intensity according to vanluvanee. 8% on average

    def deff(u1):
        return D * sqrt(
            (1.0 + sqrt(1.0 - Ct(u1))) / (2.0 * sqrt(1.0 - Ct(u1))))

    rnb = max(1.08 * D, 1.08 * D + 21.7 * D * (ia - 0.05))
    r95 = 0.5 * (rnb + min(H, rnb))

    def x0(u2):
        return 9.5 * D / ((2.0 * r95 / deff(u2))**3.0 - 1.0)

    def c1(u3):
        return (deff(u3) / 2.0)**(5.0 / 2.0) * (105.0 / 2.0 / pi)**(
            -1.0 / 2.0) * (Ct(u3) * A * x0(u3))**(-5.0 / 6.0
                                                  )  # Prandtl mixing length

    angle3 = angle + 180.0
    deficit_matrix = [[0.0 for _ in range(nt)] for _ in range(nt)]
    distance = [[0.0 for _ in range(2)] for _ in range(nt)]
    U = [U0 for _ in range(nt)]
    total_deficit = [0.0 for _ in range(nt)]

    for tur in range(nt):
        distance[tur] = [
            distance_to_front(layout_x[tur], layout_y[tur], angle), tur
        ]
    distance.sort()

    for turbine in range(nt):
        for num in range(turbine):
            total_deficit[distance[turbine][1]] += deficit_matrix[
                distance[turbine][1]][distance[num][1]]**2.0
        total_deficit[distance[turbine][1]] = sqrt(
            total_deficit[distance[turbine][1]])
        U[distance[turbine][1]] = U0 * (1.0 -
                                        total_deficit[distance[turbine][1]])
        flag = [False for _ in range(nt)]
        proportion = [0.0 for _ in range(nt)]
        perpendicular_distance = [0.0 for _ in range(nt)]
        parallel_distance = [0.0 for _ in range(nt)]
        for i in range(turbine + 1, nt):
            proportion[distance[i][1]], flag[distance[i][1]], perpendicular_distance[distance[i][1]], \
            parallel_distance[distance[i][1]] = wake_larsen.determine_if_in_wake_larsen(
                layout_x[distance[turbine][1]],
                layout_y[distance[turbine][1]],
                layout_x[distance[i][1]],
                layout_y[distance[i][1]], A,
                c1(U[distance[turbine][1]]),
                Ct(U[distance[turbine][1]]), angle3,
                r0, x0(U[distance[turbine][1]]))
            if parallel_distance[distance[i][1]] > 0.0:
                if proportion[distance[i][1]] != 0.0:
                    deficit_matrix[distance[i][1]][
                        distance[turbine][1]] = proportion[
                            distance[i][1]] * wake_larsen.wake_deficit(
                                U[distance[turbine][1]],
                                Ct(U[distance[turbine][1]]), A,
                                parallel_distance[distance[i][1]] +
                                x0(U[distance[turbine][1]]),
                                perpendicular_distance[distance[i][1]],
                                c1(U[distance[turbine][1]]))
                else:
                    deficit_matrix[distance[i][1]][distance[turbine][1]] = 0.0
            else:
                deficit_matrix[distance[i][1]][distance[turbine][1]] = 0.0

    return U
Ejemplo n.º 2
0
    def solve_nonlinear(self, params, unknowns, resids):

        U0 = params['mean_ambient_wind_speed']
        layout_y = params['layout_y']
        layout_x = params['layout_x']
        angle = params['wind_direction']
        nt = num_turb
        r0 = params['rotor_radius']  # Turbine rotor radius
        D = 2.0 * r0
        A = pi * r0**2.0
        ia = params[
            'TI']  # Ambient turbulence intensity according to vanluvanee. 8% on average
        H = params['hub_height']

        def deff(U0):
            return D * sqrt(
                (1.0 + sqrt(1.0 - Ct(U0))) / (2.0 * sqrt(1.0 - Ct(U0))))

        rnb = max(1.08 * D, 1.08 * D + 21.7 * D * (ia - 0.05))
        r95 = 0.5 * (rnb + min(H, rnb))

        def x0(U0):
            return 9.5 * D / ((2.0 * r95 / deff(U0))**3.0 - 1.0)

        def c1(U0):
            return (deff(U0) / 2.0)**(5.0 / 2.0) * (105.0 / 2.0 / pi)**(
                -1.0 / 2.0) * (Ct(U0) * A * x0(U0))**(
                    -5.0 / 6.0)  # Prandtl mixing length

        angle3 = angle + 180.0
        deficit_matrix = [[0.0 for _ in range(nt)] for _ in range(nt)]
        distance = [[0.0 for _ in range(2)] for _ in range(nt)]
        U = [U0 for _ in range(nt)]
        total_deficit = [0.0 for _ in range(nt)]

        for tur in range(nt):
            distance[tur] = [
                distance_to_front(layout_x[tur], layout_y[tur], angle), tur
            ]
        distance.sort()

        for turbine in range(nt):
            for num in range(turbine):
                total_deficit[distance[turbine][1]] += deficit_matrix[
                    distance[turbine][1]][distance[num][1]]**2.0

            total_deficit[distance[turbine][1]] = sqrt(
                total_deficit[distance[turbine][1]])
            U[distance[turbine]
              [1]] = U0 * (1.0 - total_deficit[distance[turbine][1]])

            flag = [False for _ in range(nt)]
            proportion = [0.0 for _ in range(nt)]
            perpendicular_distance = [0.0 for _ in range(nt)]
            parallel_distance = [0.0 for _ in range(nt)]

            for i in range(turbine + 1, nt):
                proportion[distance[i][1]], flag[distance[i][1]], perpendicular_distance[distance[i][1]], \
                parallel_distance[distance[i][1]] = wake_larsen.determine_if_in_wake_larsen(
                    layout_x[distance[turbine][1]],
                    layout_y[distance[turbine][1]],
                    layout_x[distance[i][1]],
                    layout_y[distance[i][1]], A,
                    c1(U[distance[turbine][1]]),
                    Ct(U[distance[turbine][1]]), angle3,
                    r0, x0(U[distance[turbine][1]]))

                if parallel_distance[distance[i][1]] > 0.0:
                    if proportion[distance[i][1]] != 0.0:
                        deficit_matrix[distance[i][1]][
                            distance[turbine][1]] = proportion[
                                distance[i][1]] * wake_larsen.wake_deficit(
                                    U[distance[turbine][1]],
                                    Ct(U[distance[turbine][1]]), A,
                                    parallel_distance[distance[i][1]] +
                                    x0(U[distance[turbine][1]]),
                                    perpendicular_distance[distance[i][1]],
                                    c1(U[distance[turbine][1]]))
                    else:
                        deficit_matrix[distance[i][1]][distance[turbine]
                                                       [1]] = 0.0
                else:
                    deficit_matrix[distance[i][1]][distance[turbine][1]] = 0.0

        unknowns['U'] = array(U)
Ejemplo n.º 3
0
def larsen_1angle(layout_x, layout_y, wind_speed, angle, rotor_radius, hub_height, TI):

    U0 = wind_speed
    
    r0 = rotor_radius
    nt = len(layout_y)  # Number of turbines
    D = 2.0 * r0
    A = pi * r0 ** 2.0
    H = hub_height  # Hub height
    ia = TI  # Ambient turbulence intensity according to vanluvanee. 8% on average

    def deff(u1):
        return D * sqrt((1.0 + sqrt(1.0 - Ct(u1))) / (2.0 * sqrt(1.0 - Ct(u1))))

    rnb = max(1.08 * D, 1.08 * D + 21.7 * D * (ia - 0.05))
    r95 = 0.5 * (rnb + min(H, rnb))

    def x0(u2):
        return 9.5 * D / ((2.0 * r95 / deff(u2)) ** 3.0 - 1.0)

    def c1(u3):
        return (deff(u3) / 2.0) ** (5.0 / 2.0) * (105.0 / 2.0 / pi) ** (- 1.0 / 2.0) * (Ct(u3) * A * x0(u3)) ** (
            - 5.0 / 6.0)  # Prandtl mixing length

    angle3 = angle + 180.0
    deficit_matrix = [[0.0 for _ in range(nt)] for _ in range(nt)]
    distance = [[0.0 for _ in range(2)] for _ in range(nt)]
    U = [U0 for _ in range(nt)]
    total_deficit = [0.0 for _ in range(nt)]

    for tur in range(nt):
        distance[tur] = [distance_to_front(layout_x[tur], layout_y[tur], angle), tur]
    distance.sort()

    for turbine in range(nt):
        for num in range(turbine):
            total_deficit[distance[turbine][1]] += deficit_matrix[distance[turbine][1]][distance[num][1]] ** 2.0
        total_deficit[distance[turbine][1]] = sqrt(total_deficit[distance[turbine][1]])
        U[distance[turbine][1]] = U0 * (1.0 - total_deficit[distance[turbine][1]])
        flag = [False for _ in range(nt)]
        proportion = [0.0 for _ in range(nt)]
        perpendicular_distance = [0.0 for _ in range(nt)]
        parallel_distance = [0.0 for _ in range(nt)]
        for i in range(turbine + 1, nt):
            proportion[distance[i][1]], flag[distance[i][1]], perpendicular_distance[distance[i][1]], \
            parallel_distance[distance[i][1]] = wake_larsen.determine_if_in_wake_larsen(
                layout_x[distance[turbine][1]],
                layout_y[distance[turbine][1]],
                layout_x[distance[i][1]],
                layout_y[distance[i][1]], A,
                c1(U[distance[turbine][1]]),
                Ct(U[distance[turbine][1]]), angle3,
                r0, x0(U[distance[turbine][1]]))
            if parallel_distance[
                distance[i][1]] > 0.0:
                if proportion[distance[i][1]] != 0.0:
                    deficit_matrix[distance[i][1]][distance[turbine][1]] = proportion[
                                                                               distance[i][
                                                                                   1]] * wake_larsen.wake_deficit(
                        U[distance[turbine][1]], Ct(U[distance[turbine][1]]), A,
                        parallel_distance[distance[i][1]] + x0(U[distance[turbine][1]]),
                        perpendicular_distance[distance[i][1]], c1(U[distance[turbine][1]]))
                else:
                    deficit_matrix[distance[i][1]][distance[turbine][1]] = 0.0
            else:
                deficit_matrix[distance[i][1]][distance[turbine][1]] = 0.0

    return U
Ejemplo n.º 4
0
    def larsen_windrose(self):

        self.efficiency = 0.0
        self.profit = []
        self.U = []
        self.powers = []
        self.summation = 0.0
        direction = open('direction_power_larsen.dat', 'w', 1)

        windrose_angle = self.wind_direction
        windrose_speed = self.wind_speed
        windrose_frequency = self.wind_frequency

        layout_y = self.layout_y
        layout_x = self.layout_x

        nt = self.nt  # Number of turbines
        r0 = self.radius  # Turbine rotor radius
        D = 2.0 * r0
        A = pi * r0**2.0
        H = self.hub_height  # Hub height
        ia = 0.08  # Ambient turbulence intensity according to vanluvanee. 8% on average

        def deff(U0):
            return D * sqrt(
                (1.0 + sqrt(1.0 - Ct(U0))) / (2.0 * sqrt(1.0 - Ct(U0))))

        rnb = max(1.08 * D, 1.08 * D + 21.7 * D * (ia - 0.05))
        r95 = 0.5 * (rnb + min(H, rnb))

        def x0(U0):
            return 9.5 * D / ((2.0 * r95 / deff(U0))**3.0 - 1.0)

        def c1(U0):
            return (deff(U0) / 2.0)**(5.0 / 2.0) * (105.0 / 2.0 / pi)**(
                -1.0 / 2.0) * (Ct(U0) * A * x0(U0))**(
                    -5.0 / 6.0)  # Prandtl mixing length

        for wind in range(0, len(windrose_angle)):
            U0 = windrose_speed[wind]  # Free stream wind speed
            angle = windrose_angle[wind]
            angle3 = angle + 180.0
            deficit_matrix = [[0.0 for _ in range(nt)] for _ in range(nt)]
            distance = [[0.0 for _ in range(2)] for _ in range(nt)]

            U = [U0 for _ in range(nt)]
            total_deficit = [0.0 for _ in range(nt)]

            for tur in range(nt):
                distance[tur] = [
                    distance_to_front(layout_x[tur], layout_y[tur], angle), tur
                ]
            distance.sort()

            for turbine in range(nt):
                for num in range(turbine):
                    total_deficit[distance[turbine][1]] += deficit_matrix[
                        distance[turbine][1]][distance[num][1]]**2.0
                total_deficit[distance[turbine][1]] = sqrt(
                    total_deficit[distance[turbine][1]])
                U[distance[turbine]
                  [1]] = U0 * (1.0 - total_deficit[distance[turbine][1]])
                flag = [False for _ in range(nt)]
                proportion = [0.0 for _ in range(nt)]
                perpendicular_distance = [0.0 for _ in range(nt)]
                parallel_distance = [0.0 for _ in range(nt)]
                for i in range(turbine + 1, nt):
                    proportion[distance[i][1]], flag[distance[i][1]], perpendicular_distance[distance[i][1]], \
                    parallel_distance[distance[i][1]] = wake_larsen.determine_if_in_wake_larsen(
                        layout_x[distance[turbine][1]],
                        layout_y[distance[turbine][1]],
                        layout_x[distance[i][1]],
                        layout_y[distance[i][1]], A,
                        c1(U[distance[turbine][1]]),
                        Ct(U[distance[turbine][1]]), angle3,
                        r0, x0(U[distance[turbine][1]]))
                    if parallel_distance[
                            distance[i]
                        [1]] > 0.0:  ## Add if proportion is 0, skip operation and deficit_matrix == 0.
                        deficit_matrix[distance[i][1]][
                            distance[turbine][1]] = proportion[
                                distance[i][1]] * wake_larsen.wake_deficit(
                                    U[distance[turbine][1]],
                                    Ct(U[distance[turbine][1]]), A,
                                    parallel_distance[distance[i][1]] +
                                    x0(U[distance[turbine][1]]),
                                    perpendicular_distance[distance[i][1]],
                                    c1(U[distance[turbine][1]]))
                    else:
                        deficit_matrix[distance[i][1]][distance[turbine]
                                                       [1]] = 0.0

            # Farm efficiency
            profit = 0.0
            efficiency_proportion = [
                0.0 for x in range(0, len(windrose_frequency))
            ]
            for l in range(nt):
                profit += power(U[l])
            efficiency = profit * 100.0 / (float(nt) *
                                           power(U[distance[0][1]]))
            efficiency_proportion[
                wind] = efficiency * windrose_frequency[wind] / 100.0

            direction.write('{0:f} {1:f}\n'.format(angle, profit))
            self.summation += efficiency_proportion[wind]

        direction.close()
Ejemplo n.º 5
0
    def larsen_angle(self, wind_speed, angle):

        self.efficiency = 0.0
        self.profit = []
        self.U = []
        self.powers = []
        self.summation = 0.0

        U0 = wind_speed
        layout_y = self.layout_y
        layout_x = self.layout_x

        nt = len(layout_y)  # Number of turbines
        r0 = self.radius  # Turbine rotor radius
        D = 2.0 * r0
        A = pi * r0**2.0
        H = 100.0  # Hub height
        ia = 0.08  # Ambient turbulence intensity according to vanluvanee. 8% on average

        def deff(U0):
            return D * sqrt(
                (1.0 + sqrt(1.0 - Ct(U0))) / (2.0 * sqrt(1.0 - Ct(U0))))

        rnb = max(1.08 * D, 1.08 * D + 21.7 * D * (ia - 0.05))
        r95 = 0.5 * (rnb + min(H, rnb))

        def x0(U0):
            return 9.5 * D / ((2.0 * r95 / deff(U0))**3.0 - 1.0)

        def c1(U0):
            return (deff(U0) / 2.0)**(5.0 / 2.0) * (105.0 / 2.0 / pi)**(
                -1.0 / 2.0) * (Ct(U0) * A * x0(U0))**(
                    -5.0 / 6.0)  # Prandtl mixing length

        angle3 = angle + 180.0
        deficit_matrix = [[0.0 for _ in range(nt)] for _ in range(nt)]
        distance = [[0.0 for _ in range(2)] for _ in range(nt)]
        self.U = [U0 for _ in range(nt)]
        total_deficit = [0.0 for _ in range(nt)]

        for tur in range(nt):
            distance[tur] = [
                distance_to_front(layout_x[tur], layout_y[tur], angle), tur
            ]
        distance.sort()

        for turbine in range(nt):
            for num in range(turbine):
                total_deficit[distance[turbine][1]] += deficit_matrix[
                    distance[turbine][1]][distance[num][1]]**2.0
            total_deficit[distance[turbine][1]] = sqrt(
                total_deficit[distance[turbine][1]])
            self.U[distance[turbine]
                   [1]] = U0 * (1.0 - total_deficit[distance[turbine][1]])
            flag = [False for _ in range(nt)]
            proportion = [0.0 for _ in range(nt)]
            perpendicular_distance = [0.0 for _ in range(nt)]
            parallel_distance = [0.0 for _ in range(nt)]
            for i in range(turbine + 1, nt):
                proportion[distance[i][1]], flag[distance[i][1]], perpendicular_distance[distance[i][1]], \
                parallel_distance[distance[i][1]] = wake_larsen.determine_if_in_wake_larsen(
                    layout_x[distance[turbine][1]],
                    layout_y[distance[turbine][1]],
                    layout_x[distance[i][1]],
                    layout_y[distance[i][1]], A,
                    c1(self.U[distance[turbine][1]]),
                    Ct(self.U[distance[turbine][1]]), angle3,
                    r0, x0(self.U[distance[turbine][1]]))
                if parallel_distance[
                        distance[i]
                    [1]] > 0.0:  ## Add if proportion is 0, skip operation and deficit_matrix == 0.
                    if proportion[distance[i][1]] != 0.0:
                        deficit_matrix[distance[i][1]][
                            distance[turbine][1]] = proportion[
                                distance[i][1]] * wake_larsen.wake_deficit(
                                    self.U[distance[turbine][1]],
                                    Ct(self.U[distance[turbine][1]]), A,
                                    parallel_distance[distance[i][1]] +
                                    x0(self.U[distance[turbine][1]]),
                                    perpendicular_distance[distance[i][1]],
                                    c1(self.U[distance[turbine][1]]))
                    else:
                        deficit_matrix[distance[i][1]][distance[turbine]
                                                       [1]] = 0.0
                else:
                    deficit_matrix[distance[i][1]][distance[turbine][1]] = 0.0

        # Farm efficiency
        self.profit = 0.0

        for l in range(nt):
            self.profit += power(self.U[l])
        self.efficiency = self.profit * 100.0 / (
            float(nt) * power(self.U[distance[0][1]]))  # same as using U0
        self.powers = [power(self.U[i]) for i in range(nt)]

        with open('speed_larsen.dat', 'w') as out:
            for i in range(len(self.U)):
                out.write('{0:f}\t{1:f}\n'.format(
                    self.U[i],
                    power(self.U[i]) / power(self.U[distance[0][1]])))
    def solve_nonlinear(self, params, unknowns, resids):

        U0 = params['mean_ambient_wind_speed']
        layout_y = params['layout_y']
        layout_x = params['layout_x']
        angle = params['wind_direction']
        nt = num_turb
        r0 = params['rotor_radius']  # Turbine rotor radius
        D = 2.0 * r0
        A = pi * r0 ** 2.0
        ia = params['TI']  # Ambient turbulence intensity according to vanluvanee. 8% on average
        H = params['hub_height']

        def deff(U0):
            return D * sqrt((1.0 + sqrt(1.0 - Ct(U0))) / (2.0 * sqrt(1.0 - Ct(U0))))

        rnb = max(1.08 * D, 1.08 * D + 21.7 * D * (ia - 0.05))
        r95 = 0.5 * (rnb + min(H, rnb))

        def x0(U0):
            return 9.5 * D / ((2.0 * r95 / deff(U0)) ** 3.0 - 1.0)

        def c1(U0):
            return (deff(U0) / 2.0) ** (5.0 / 2.0) * (105.0 / 2.0 / pi) ** (- 1.0 / 2.0) * (Ct(U0) * A * x0(U0)) ** (
                - 5.0 / 6.0)  # Prandtl mixing length

        angle3 = angle + 180.0
        deficit_matrix = [[0.0 for _ in range(nt)] for _ in range(nt)]
        distance = [[0.0 for _ in range(2)] for _ in range(nt)]
        U = [U0 for _ in range(nt)]
        total_deficit = [0.0 for _ in range(nt)]

        for tur in range(nt):
            distance[tur] = [distance_to_front(layout_x[tur], layout_y[tur], angle), tur]
        distance.sort()

        for turbine in range(nt):
            for num in range(turbine):
                total_deficit[distance[turbine][1]] += deficit_matrix[distance[turbine][1]][distance[num][1]] ** 2.0

            total_deficit[distance[turbine][1]] = sqrt(total_deficit[distance[turbine][1]])
            U[distance[turbine][1]] = U0 * (1.0 - total_deficit[distance[turbine][1]])

            flag = [False for _ in range(nt)]
            proportion = [0.0 for _ in range(nt)]
            perpendicular_distance = [0.0 for _ in range(nt)]
            parallel_distance = [0.0 for _ in range(nt)]

            for i in range(turbine + 1, nt):
                proportion[distance[i][1]], flag[distance[i][1]], perpendicular_distance[distance[i][1]], \
                parallel_distance[distance[i][1]] = wake_larsen.determine_if_in_wake_larsen(
                    layout_x[distance[turbine][1]],
                    layout_y[distance[turbine][1]],
                    layout_x[distance[i][1]],
                    layout_y[distance[i][1]], A,
                    c1(U[distance[turbine][1]]),
                    Ct(U[distance[turbine][1]]), angle3,
                    r0, x0(U[distance[turbine][1]]))

                if parallel_distance[
                    distance[i][1]] > 0.0:
                    if proportion[distance[i][1]] != 0.0:
                        deficit_matrix[distance[i][1]][distance[turbine][1]] = proportion[
                                                                                   distance[i][
                                                                                       1]] * wake_larsen.wake_deficit(
                            U[distance[turbine][1]], Ct(U[distance[turbine][1]]), A,
                            parallel_distance[distance[i][1]] + x0(U[distance[turbine][1]]),
                            perpendicular_distance[distance[i][1]], c1(U[distance[turbine][1]]))
                    else:
                        deficit_matrix[distance[i][1]][distance[turbine][1]] = 0.0
                else:
                    deficit_matrix[distance[i][1]][distance[turbine][1]] = 0.0

        unknowns['U'] = array(U)