Lifting line model

Course Rotor and Wake Aerodynamics

Press right arrow to continue.

How to use the arrow buttons?

On the bottom right there are four directional arrows.

  • Press on the right arrow to proceed to the next slide.
  • Press on the left arrow to go back to the previous slide.
  • Press on the down arrow for further detail on a topic.
  • Press on the up arrow to return to the top of a topic.

At the lower right corner, you can find the slide number (horizontal number. vertical number).

Press ESC-key to see map of the presentation. Press ESC-key or press slide again to return to slide.

Press bottom arrow to test the vertical slide motion.

Use the up arrow to retun up

Use the side arrows to move horizontally.

Learning objectives

To be able to program a lifting line model for application to an horizontal axis wind turbine...

  • ... in steady, uniform, axial flow.
  • ... using a blade element approach.
  • ... with a frozen wake geometry.

This tutorial is supported by the study of the following references:

Source: Katz, Joseph, and Allen Plotkin. Low-speed aerodynamics. Vol. 13., Cambridge university press, 2001.

Source: Anderson, John D. Fundamentals of aerodynamics. , McGraw-Hill., 2001.

Nomenclature

  • $\alpha$ angle of attack at blade element $\left( \right)$.
  • $\beta$ blade twist angle at blade element $\left( \right)$.
  • $ \rho $ fluid density $\left( kg.m^{-3} \right)$.
  • $\Gamma$ circulation at blade element $\left( m^2 s^{-1} \right)$.
  • $\Phi$ perceived-wind inflow-angle at blade element $\left( \right)$.
  • $ \Omega $ rotor rotational velocity $\left(rad.s^{-1} \right)$.
  • $ \vec{\omega} $ infinitesimal vorticy element $\left(rad.s^{-1} \right)$.
  • $ a $ axial induction factor $\left( \right)$.
  • $ a' $ azimuthal induction factor $\left( \right)$.
  • $ c $ blade element chord $\left( m \right)$.
  • $ C_d $ drag coefficient $\left( \right)$.
  • $ C_l $ lift coefficient $\left( \right)$.
  • $ C_T $ thrust coefficient $\left( \right)$.
  • $ Drag $ drag force per unit span $\left( N/m \right)$.
  • $ Lift $ lift force per unit span $\left( N/m \right)$.
  • $ F_{azim} $ azimuthal/tangential force per unit span $\left( N/m \right)$.
  • $ F_{axial} $ axial force per unit span $\left( N/m \right)$.
  • $ l $ circulation length element $\left( l \right)$.
  • $ N_{blades} $ number of blades $\left( \right)$.
  • $ \vec{r} $ vector between vorticity element and target point $\left( m \right)$.
  • $ \vec{u_{\omega}} $ velocity induced by vorticity $\left( m/s \right).$
  • $ V $ volume of vorticity $\left( m^3 \right)$.
  • $ V_{axial} = U_{rotor}$ axial velocity perceived by blade element, axial velocity at rotor $\left( m/s \right).$
  • $ V_{p}$ velocity perceived by blade element $\left( m/s \right)$.
  • $ V_{tan} $ azimuthal/tangential velocity perceived by blade element $\left( m/s \right)$.
  • $ \vec{X_p} $ point where velocity is evaluated $\left( m \right)$.

Concept of the lifting line model

The lifting line model allows us to calculate the loads on a blade and the flow field at any point in space.

It uses a blade element approach, where the blade is segmented in section in the spanwise direction. At each section, the loads are determined by using the velocity perceived at the control point (usually the quarter-chord point), and 2D airfoil theory.

The velocity at the control point is calculated using potential flow theory, linearly adding the unperturbed wind field with the velocity field generated by the vorticity distribution.

The vorticity distribution is generated by the loads on the blade. The method of solution is iterative in our approach.

Flowchart of a lifting line model

Steps for setup and solution of the lifting line model.

Model setup

  • Choose potential-flow perturbation element: vortex filament.
  • Setup geometry of the horseshoe vortices, which are composed of vortex filaments .
  • Setup system of equations to determine the velocity at a blade element as a function of the circulation of the vortex filaments.

Solution iteration.

  • Determine the circulation at each blade element as a function of the velocity at the quarter-chord point.
  • The strength of each horseshoe vortex equals the bound circulations at the blade element.
  • Calculate the velocity at each blade element.

Calculate and output the results.

Choice of the vortex filament as perturbation element.

The force field over the surface of the blades generates vorticity, which is convected over the surface and with the flow. We call the vorticity located over the surface of the blade as "bound vorticity". We call the vortices convected in the flow as "wake vorticity".

The presence of vorticy implies that there is a component of the velocity field which has a rotational character, even in irrotational potential flow.

The flow field can be linearly decomposed in a component associated with the vortices, and an additional flow field associated with other elements (for example, the unperturbed flow field).

To calculate the velocity component associated with the vorticity, we employ a concept from electromagnetism, appyling the Biot-Savart law to calculate the velocity "induced" by the vortex.

Biot-Savart law - velocity induced by a volume of vorticity.

The velocity $\vec{u_\omega}$ at a point $x_p$ associated with the existing vorticity $\vec{\omega}$ can be calculated using the Bio-Savart law, expressed by the integral below.

\[ \vec{u_\omega}=\frac{1}{4 \pi} \int\limits_V \frac{\vec{\omega}\times \vec{r}}{\left| r^3 \right|} \rm{d}V \]

Press bottom arrow for Biot-Savart law applied to a vortex filament

Biot-Savart law - velocity induced by a vortex curve.

If the vorticity is concentrated in a curve from a point $a$ to a point $b$ with constant circulation $\Gamma$, the velocity $\vec{u_\omega}$ at a point $x_p$ can be calculated by the integral below.

\[ \vec{u_\omega}=\frac{\Gamma}{4 \pi} \int_a^b \frac{\vec{\rm{d}l}\times \vec{r}}{\left| r^3 \right|} \]

The curve can be discretized in straight segments. If the vortex segment is straight, the integral below becomes a simple geometric relation.

Press right arrow for Biot-Savart law applied to a vortex filament

Velocity induced by a straight vortex filament

Change values below to change the direction and magnitude of the vortex filament. Change the location of the point to evaluate the induced velocity $X_p$.

Circulation $\Gamma :$

$X_1 = $ $x_1:$ $y_1:$ $z_1:$

$X_2 = $ $x_2:$ $y_2:$ $z_2:$

$X_p = $ $x_p:$ $y_p:$ $z_p:$

Press bottom arrow for algorithm to calculate the velocity induced by a straight vortex filament.

Algorithm for velocity induced by vortex filament

Consider a vortex filament from point $X_1$ to point $X_2$, with strength $\Gamma$. The velocity at a point $X_p$ can be calculated by the algorithm below.

$R_1= \sqrt{ (X_P-X_1)^2 + (Y_P-Y_1)^2 + (Z_P-Z_1)^2} $

$R_2= \sqrt{ (X_P-X_2)^2 + (Y_P-Y_2)^2 + (Z_P-Z_2)^2} $

$ {R_{1-2}}_X=(Y_P-Y_1)(Z_P-Z_2)-(Z_P-Z_1)(Y_P-Y_2) $

$ {R_{1-2}}_Y=-(X_P-X_1)*(Z_P-Z_2)+(Z_P-Z_1)*(X_P-X_2) $

$ {R_{1-2}}_Z=(X_P-X_1)*(Y_P-Y_2)-(Y_P-Y_1)*(X_P-X_2) $

$ {R_{1-2}}_{sqr}={{R_{1-2}}_X}^2 + {{R_{1-2}}_Y}^2 + {{R_{1-2}}_Z}^2 $

$ R_{0-1} = (X_2-X_1)(X_P-X_1)+(Y_2-Y_1)(Y_P-Y_1)+(Z_2-Z_1)(Z_P-Z_1) $

$ R_{0-2} = (X_2-X_1)(X_P-X_2)+(Y_2-Y_1)(Y_P-Y_2)+(Z_2-Z_1)(Z_P-Z_2) $

$ K=\frac{\Gamma}{4 \pi {R_{1-2}}_{sqr}} \left( \frac{R_{0-1}}{R_1}- \frac{R_{0-2}}{R_2} \right) $

$ U=K*{R_{1-2}}_X $ ; $ V=K*{R_{1-2}}_Y $ ; $ W=K*{R_{1-2}}_Z $

Source: Katz, Joseph, and Allen Plotkin. Low-speed aerodynamics. Vol. 13. Cambridge university press, 2001.

Press bottom arrow for example of code implementation of this algorithm.

Code for calculation of velocity induced by a straight vortex filament

                      

                        // 3D velocity induced by a vortex filament
                        function velocity_3D_from_vortex_filament(GAMMA,XV1, XV2, XVP1,CORE){
                          // function to calculate the velocity induced by a straight 3D vortex filament
                          // with circulation GAMMA at a point VP1. The geometry of the vortex filament
                          // is defined by its edges: the filament starts at XV1 and ends at XV2.
                          // the input CORE defines a vortex core radius, inside which the velocity
                          // is defined as a solid body rotation.
                          // The function is adapted from the algorithm presented in:
                          //                Katz, Joseph, and Allen Plotkin. Low-speed aerodynamics.
                          //                Vol. 13. Cambridge university press, 2001.

                          // read coordinates that define the vortex filament
                          var X1 =XV1[0]; var Y1 =XV1[1]; var Z1 =XV1[2]; // start point of vortex filament
                          var X2 =XV2[0]; var Y2 =XV2[1]; var Z2 =XV2[2]; // end point of vortex filament
                          // read coordinates of target point where the velocity is calculated
                          var XP =XVP1[0]; var YP =XVP1[1]; var ZP =XVP1[2];
                          // calculate geometric relations for integral of the velocity induced by filament
                          var R1=Math.sqrt(Math.pow((XP-X1), 2) + Math.pow((YP-Y1), 2) + Math.pow((ZP-Z1), 2) );
                          var R2=Math.sqrt( Math.pow((XP-X2), 2) + Math.pow((YP-Y2), 2) + Math.pow((ZP-Z2), 2) );
                          var R1XR2_X=(YP-Y1)*(ZP-Z2)-(ZP-Z1)*(YP-Y2);
                          var R1XR2_Y=-(XP-X1)*(ZP-Z2)+(ZP-Z1)*(XP-X2);
                          var R1XR2_Z=(XP-X1)*(YP-Y2)-(YP-Y1)*(XP-X2);
                          var R1XR_SQR=Math.pow(R1XR2_X, 2)+ Math.pow(R1XR2_Y, 2)+ Math.pow(R1XR2_Z, 2);
                          var R0R1 = (X2-X1)*(XP-X1)+(Y2-Y1)*(YP-Y1)+(Z2-Z1)*(ZP-Z1);
                          var R0R2 = (X2-X1)*(XP-X2)+(Y2-Y1)*(YP-Y2)+(Z2-Z1)*(ZP-Z2);
                          // check if target point is in the vortex filament core,
                          // and modify to solid body rotation
                          if (R1XR_SQR < Math.pow(CORE,2)) {
                            R1XR_SQR=Math.pow(CORE,2);
                            // GAMMA = 0;
                          };
                          if (R1 < CORE) {
                            R1=CORE;
                            // GAMMA = 0;
                          };
                          if (R2 < CORE) {
                            R2=CORE;
                            // GAMMA = 0;
                          };
                          // determine scalar
                          var K=GAMMA/4/Math.PI/R1XR_SQR*(R0R1/R1 -R0R2/R2 );
                          // determine the three velocity components
                          var U=K*R1XR2_X;
                          var V=K*R1XR2_Y;
                          var W=K*R1XR2_Z;
                          // output results, vector with the three velocity components
                          var results = [U, V, W];
                          return(results) };
                        
                      

Setup geometry of the horseshoe vortices

The blade is segmented in spanwise direction. A horseshoe vortex is colocated at each blade segment. The bound vortex is located at the quarter-chord position. At the blade, vortex segments trail the chord up to 1/4 chord, and then convect with flow velocity.

Press bottom arrow for further information on "Discretization and grid generation".

Discretization of each horseshoe

Each horseshoe is discretized in straight vortex filaments. The blade elements are discretized by three filaments: one bound at the quarter-chord line, two trailing in chord direction. According to Helmholtz theorem, the circulation $\Gamma$ is constant for all filaments that compose the horseshoe. The direction of the filament defines the direction of the circulation.

Press bottom arrow for further information on "Discretization and grid generation".

Spanwise discretization

Two common strategies for spanwise discretization: uniform distribution and uniform cosine distribution.

Uniform distribution: segments are equally distant. Provides a solution with faster convergence.

Uniform cosine distribution: segments are define at the cosine of a uniform angle distribution. Provides a solution with higher resolution at the root and tip, where circulation gradients are higher.

Press bottom arrow for further information on "Discretization and grid generation".

Discretization and geometry of the fixed wake

When defining the geometry of the fixed wake, you need to define the convection and expansion of the wake. We will only consider an axial convection velocity $U_{wake} = U_\infty \left( 1-a_w \right)$. Assume in a first approach that $a_w$ is equal to the average induction at the rotor.

Consider that the wake is aligned in axial direction $x$. The location of the nodes of a filament released from a radial position $r$, at a given past time of $t$, is defined by:

$x_w = t \cdot U_{wake}$

$y_w = r \cdot \sin \Omega t$

$z_w = r \cdot \cos \Omega t$

Scroll the button below to vary the axial convection speed. $a_w$= .

Setting matrices for induced velocity by vortex system

Potential flow allows for a linear solution of the velocity field. Therefore, we can define a linear system to calculate the velocity induced by all horseshoe vortex rings at all control points.

Consider that we have a total of $N$ blade sections with $N$ controlpoints, releasing $N$ horseshoe vortex rings. We define $i_{cp}$ as the index of a control point at a blade element, and $j_{ring}$ as the index of the vortex ring.

We now define the velocity "induced" by a horseshoevortex ring $j_{ring}$ at point $i_{cp}$ as $\vec{u}_{i_{cp}-j_{ring}}$

The three velocity components of $\vec{u}_{i_{cp}-j_{ring}}$ in $x$, $y$ and $z$-direction are $u_{i_{cp}-j_{ring}}$, $v_{i_{cp}-j_{ring}}$ and $w_{i_{cp}-j_{ring}}$

Because the velocity induced by a vortex is linear with the strength of the vortex, $\vec{u}_{i_{cp}-j_{ring}} = \vec{u}_{i_{cp}-j_{ring}|_{\Gamma=1}}*\Gamma_{j_{ring}}$, where $\vec{u}_{i_{cp}-j_{ring}|_{\Gamma=1}}$ is the velocity induced by a horseshoe vortex of unit strength.

The total velocity by all horseshoe vortices at one controlpoint $\vec{u}_{i_{cp}}$ is given by \[ \vec{u}_{i_{cp}}=\sum_{j_{ring}=1}^N \vec{u}_{i_{cp}-j_{ring}} =\sum_{j_{ring}=1}^N \vec{u}_{i_{cp}-j_{ring}|_{\Gamma=1}}*\Gamma_{j_{ring}} \]

Press bottom arrow to see remaining formulation of velocity components.

Vector formulation of velocity components induced at one controlpoint by N horseshoe vortex rings

\[ {u}_{i_{cp}} = \left[ {\begin{array}{*{20}{c}} {u}_{i_{cp}-1|_{\Gamma=1}} & \cdots & {u}_{i_{cp}-N|_{\Gamma=1}} \end{array}} \right] \cdot \left[ {\begin{array}{*{20}{c}} \Gamma_1 \\ \vdots \\ \Gamma_N \end{array}} \right]\] \[ {v}_{i_{cp}} = \left[ {\begin{array}{*{20}{c}} {v}_{i_{cp}-1|_{\Gamma=1}} & \cdots & {v}_{i_{cp}-N|_{\Gamma=1}} \end{array}} \right] \cdot \left[ {\begin{array}{*{20}{c}} \Gamma_1 \\ \vdots \\ \Gamma_N \end{array}} \right]\] \[ {w}_{i_{cp}} = \left[ {\begin{array}{*{20}{c}} {w}_{i_{cp}-1|_{\Gamma=1}} & \cdots & {w}_{i_{cp}-N|_{\Gamma=1}} \end{array}} \right] \cdot \left[ {\begin{array}{*{20}{c}} \Gamma_1 \\ \vdots \\ \Gamma_N \end{array}} \right]\]

Press bottom arrow to see matrix formulation.

Matrix formulation of velocity components induced at $N$ controlpoint by $N$ horseshoe vortex rings

\[\left[ {\begin{array}{*{20}{c}} u_1\\ \vdots \\ u_N \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} {u}_{1-1|_{\Gamma=1}} & \ldots & {u}_{1-N|_{\Gamma=1}}\\ \vdots & \ddots & \vdots \\ {u}_{N-1|_{\Gamma=1}} & \ldots & {u}_{N-N|_{\Gamma=1}} \end{array}} \right] \cdot \left[ {\begin{array}{*{20}{c}} \Gamma_1 \\ \vdots \\ \Gamma_N \end{array}} \right]\] \[\left[ {\begin{array}{*{20}{c}} v_1\\ \vdots \\ v_N \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} {v}_{1-1|_{\Gamma=1}} & \ldots & {v}_{1-N|_{\Gamma=1}}\\ \vdots & \ddots & \vdots \\ {v}_{N-1|_{\Gamma=1}} & \ldots & {v}_{N-N|_{\Gamma=1}} \end{array}} \right] \cdot \left[ {\begin{array}{*{20}{c}} \Gamma_1 \\ \vdots \\ \Gamma_N \end{array}} \right]\] \[\left[ {\begin{array}{*{20}{c}} w_1\\ \vdots \\ w_N \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} {w}_{1-1|_{\Gamma=1}} & \ldots & {w}_{1-N|_{\Gamma=1}}\\ \vdots & \ddots & \vdots \\ {w}_{N-1|_{\Gamma=1}} & \ldots & {w}_{N-N|_{\Gamma=1}} \end{array}} \right] \cdot \left[ {\begin{array}{*{20}{c}} \Gamma_1 \\ \vdots \\ \Gamma_N \end{array}} \right]\]

Calculate velocities, circulations and forces at the blade element

Velocity perceived at blade element: axial, tangential and total.

  • $ V_{axial} = U_\infty + u $
  • $ V_{tan} = \Omega r + \left[ {\begin{array}{*{20}{c}} U_\infty + u & v & w \end{array}} \right] \cdot \vec{n}_{azim} $
  • $ V_{p} = \sqrt{V_{axial}^2 + V_{tan}^2 } $

Circulation and forces at blade element (two dimensional): lift, drag, axial and azimuthal.

  • $ \Gamma = \frac{1}{2} c V_{p} C_{l{\left(\alpha\right)}} $
  • $ Lift = \frac{1}{2} c \rho V_{p}^2 C_{l{\left(\alpha\right)}} $
  • $ Drag = \frac{1}{2} c \rho V_{p}^2 C_{d{\left(\alpha\right)}} $
  • $ F_{azim} = Lift \sin{\Phi}- Drag \cos{\Phi} $
  • $ F_{axial} = Lift \cos{\Phi} + Drag \sin{\Phi} $

Note that all forces are in 2D, and have dimensions $N/m$.

$C_l$ and $C_d$ can be retrieved from airfoil polar data, as a function of angle of attack $\alpha$.

Press bottom arrow to see an example of an airfoil polar.

Example of airfoil polar, with lift and drag coefficient as a function of angle of attack $C_{l{\left(\alpha\right)}}$ and $C_{d{\left(\alpha\right)}}$

Example of lifting line code implementation - solution of the matrix system

                                

    function solve_lifting_line_system_matrix_approach(rotor_wake_system,wind, Omega, rotorradius) {
      // this codes solves a lifting line model of a horizontal axis rotor
      // as inputs, it takes
      //      rotor_wake_system: data structure that contains the geometry of the horseshoe vortex rings,
      //                         and the control points at the blade
      //      wind: unperturbed wind velocity, also known as U_infinity
      //      Omega: rotational velocity of the rotor
      //      rotorradius: the radius of the rotor

      // get controlpoints data structure
      var controlpoints = rotor_wake_system.controlpoints;
      // get horseshoe vortex rings data structure
      var rings = rotor_wake_system.rings;
      //
      // initialize variables that we will use during the calculation
      var velocity_induced =[]; // velocity induced by a horse vortex ring at a control point
      var up = []; var vp = []; var wp = []; // components of the velocity induced by one horseshoe vortex ring
      var u = 0;  var v = 0;  var w = 0; // total velocity induced at one control point
      var radialposition; var azimdir; // radial position of the control point
      var alpha; // angle of attack
      var GammaNew=[]; // new estimate of bound circulation
      var Gamma=[]; // current solution of bound circulation
      for (var i = 0; i < controlpoints.length; i++) { GammaNew.push(0);}; // initialize as zeros
      var vel1; var vmag; var vaxial; var vazim; var temploads; // velocities and loads at controlpoint
      var MatrixU = new Array(); // matrix of induction, for velocity component in x-direction
      var MatrixV = new Array(); // matrix of induction, for velocity component in y-direction
      var MatrixW = new Array(); // matrix of induction, for velocity component in z-direction
      // output variables
      var a_temp = new Array(); // output vector for axial induction
      var aline_temp = new Array();  // output vector for azimuthal induction
      var r_R_temp = new Array();  // output vector for radial position
      var Fnorm_temp = new Array();  // output vector for axial force
      var Ftan_temp = new Array();  // output vector for tangential force
      var Gamma_temp = new Array();  // output vector for circulation

      // the variables below are to setup the maximum number of iterations and convergence criteria
      var Niterations =1200;
      var errorlimit = 0.01;
      var error = 1.0; var refererror;
      var ConvWeight =0.3;

      // initalize and calculate matrices for velocity induced by horseshoe vortex rings
      // two "for cicles", each line varying wind controlpoint "icp", each column varying with
      // horseshoe vortex ring "jring"
      for (var icp= 0; icp < controlpoints.length; icp++) {
        MatrixU[icp] = new Array(); // new line of matrix
        MatrixV[icp] = new Array(); // new line of matrix
        MatrixW[icp] = new Array(); // new line of matrix
        for (var jring = 0; jring < rings.length; jring++) {
          // set ring strenth to unity, to calculate velocity induced by horseshoe vortex ring "jring"
          // at controlpoint "icp"
          rings[jring] = update_Gamma_sinle_ring(rings[jring],1,1);
          velocity_induced = velocity_induced_single_ring(rings[jring], controlpoints[icp].coordinates);
          // add compnent of velocity per unit strength of circulation to induction matrix
          MatrixU[icp][jring] = velocity_induced[0];
          MatrixV[icp][jring] = velocity_induced[1];
          MatrixW[icp][jring] = velocity_induced[2];
        };
      };

      // calculate solution through an iterative process
      for (var  kiter = 0; kiter < Niterations; kiter++) {

        for (var ig = 0; ig < GammaNew.length; ig++) {
          Gamma[ig] = GammaNew[ig]; //update current bound circulation with new estimate
        }

        // calculate velocity, circulation and loads at the controlpoints
        for (var icp= 0; icp < controlpoints.length; icp++) {
          // determine radial position of the controlpoint;
          radialposition = Math.sqrt(math.dot(controlpoints[icp].coordinates, controlpoints[icp].coordinates));
          u=0; v=0; w=0; // initialize velocity
          // multiply icp line of Matrix with vector of circulation Gamma to calculate velocity at controlpoint
          for (var jring = 0; jring < rings.length; jring++) {
            u = u + MatrixU[icp][jring]*Gamma[jring]; // axial component of velocity
            v= v + MatrixV[icp][jring]*Gamma[jring]; // y-component of velocity
            w= w + MatrixW[icp][jring]*Gamma[jring]; // z-component of velocity
          };
          // calculate total perceived velocity
          vrot = math.cross([-Omega, 0 , 0]  , controlpoints[icp].coordinates ); // rotational velocity
          vel1 = [wind[0]+ u + vrot[0], wind[1]+ v + vrot[1] , wind[2]+ w + vrot[2]]; // total perceived velocity at section
          // calculate azimuthal and axial velocity
          azimdir = math.cross([-1/radialposition, 0 , 0]  , controlpoints[icp].coordinates ); // rotational direction
          vazim = math.dot(azimdir , vel1); // azimuthal direction
          vaxial =  math.dot([1, 0, 0] , vel1); // axial velocity
          // calculate loads using blade element theory
          temploads = loadBladeElement(vaxial, vazim, radialposition/rotorradius);
          // new point of new estimate of circulation for the blade section
          GammaNew[icp] = temploads[2];
          // update output vector
          a_temp[icp] =(-(u + vrot[0])/wind[0]);
          aline_temp[icp] =(vazim/(radialposition*Omega)-1);
          r_R_temp[icp] =(radialposition/rotorradius);
          Fnorm_temp[icp] =(temploads[0]);
          Ftan_temp[icp] =(temploads[1]);
          Gamma_temp[icp] =(temploads[2]);
        }; // end loop control points

        // check convergence of solution
        refererror =math.max(math.abs(GammaNew));
        refererror =Math.max(refererror,0.001); // define scale of bound circulation
        error =math.max(math.abs(math.subtract(GammaNew, Gamma))); // difference betweeen iterations
        error= error/refererror; // relative error
        if (error < errorlimit) {
          // if error smaller than limit, stop iteration cycle
          kiter=Niterations;
        }

        // set new estimate of bound circulation
        for (var ig = 0; ig < GammaNew.length; ig++) {
          GammaNew[ig] = (1-ConvWeight)*Gamma[ig] + ConvWeight*GammaNew[ig];
        }
      }; // end iteration loop

      // output results of converged solution
      return({a: a_temp , aline: aline_temp, r_R: r_R_temp, Fnorm: Fnorm_temp, Ftan: Ftan_temp , Gamma: Gamma_temp});
    };



                                
                              

Example of Lifiting Line solution of bound circulation and comparison with BEM solution.

Scroll the button below to change tip speed ratio. Tip speed ratio = 6.

Rotor performance:

BEM Lifting Line
$C_T$ 0 0
$C_P$ 0 0

Note: The circulation $\Gamma$ is non-dimensioned by $\frac{ U_\infty^2 \pi }{N_{Blades} \Omega}$

Press bottom arrow to see other examples.

Example of Lifting Line solution of $F_{axial}$ and $F_{azim}$, and comparison with BEM solution.

Scroll the button below to change tip speed ratio. Tip speed ratio = 6.

Rotor performance:

BEM Lifting Line
$C_T$ 0 0
$C_P$ 0 0

Note: $F_{axial}$ and $F_{azim}$ are non-dimensioned by $\frac{1}{2} \rho U_\infty^2 R$

Press bottom arrow to see other examples.

Example of Lifting Line solution of $a$ and $a'$, and comparison with BEM solution.

Scroll the button below to change tip speed ratio. Tip speed ratio = 6.

Rotor performance:

BEM Lifting Line
$C_T$ 0 0
$C_P$ 0 0

Effect of discretization of the vorticity system

While defining and placing the geometry of the vorticy system, the distribution of the vorticity system is defined by:

  • The number and distribution of blade sections.
  • The length and discretization of the wake.
  • The assumed velocity of convection of the wake.

Press bottom arrow to see examples of the effect of discretization.

Effect of the number of blade sections.

Scroll the button below to change number of spanwise elements. N = 16.

Rotor performance:

BEM Lifting Line
$C_T$ 0 0
$C_P$ 0 0

Note: The circulation $\Gamma$ is non-dimensioned by $\frac{ U_\infty^2 }{N_{Blades} \pi \Omega}$. Solution at tip speed ratio = 6.

Press bottom arrow to see other examples.

Effect of length of the wake.

Scroll the button below to vary the length of the wake $Lw$ in diameters D downstream. D = 10.

Rotor performance:

BEM Lifting Line
$C_T$ 0 0
$C_P$ 0 0

Suggestion: the example of the rectangular wing in straight flight

The model of a rotor is a difficult case to verify some of the key elements of your code. As a suggestion, you can first model a single wing in straight flight. In this section, we present the case of a rectangular straight wing, at a geometric angle of attack of $5^\circ$. The lift coefficient at each section is given by $C_l=2\pi \sin \alpha$. The effective angle of attack $\alpha$ is plotted below, over the span of the wing.

Scroll the button below to vary the wing's aspect ratio $A_R = \frac{Wingspan}{chord}$= .

Number of spanwise elements = .

Review of tutorial

Learning objectives

To be able to program a lifting line model for application to an horizontal axis wind turbine...

  • ... in steady, uniform, axial flow.
  • ... using a blade element approach.
  • ... with a frozen wake geometry.

Suggestions

Use the simulation tools to compare the two models and the terms of induction, loading, circulation, and tip speed ratio.

Use the lifting line model to calculate the 3D flow field, including the velocity at the wake.