South Pole MET Office

One Minute Sample Weather Data

Data includes.. Wind Speed and direction, temperature, and pressure Warning, data quality can be a bit low. Missing samples, and incorrect dates in files. Be careful. Data from the MET office is available here

There is some python code available to read in one minute sample weather data here.

Hourly Surface Data:

Roughly the same information taken on an hourly basis. Wind speed measurements are instantaneous, not averaged. Data from the MET office is available here

LCD

Daily average wind speed and direction, available from present to 1957. Data from the MET office is available here.


Characterizing Wind Speeds

Average Wind Speeds

Monthly average wind speeds have been calculated from the present back to 1957 and are supplied in a spreadsheet here and on a webpage here.

Cumulative Distribution Function

Definition: for every real number x, the CDF of a real-valued random variable X is given by F_X(x) = P(X<=x).

Plotting a CDF over winters for 2005-2009 results in the below:

The code used to process the data for this plot is available here. An example of how to read this plot is that in 2008 50% of wind speed measurements where at 9.5 knots or lower.

Weibull Distribution

Modern estimation of the parameters of the Weibull wind speed distrubtion for wind energy analysis Journal of Wind Engineering and Instrustral Aerodynamics 85(2000) P. 75-84

From the above:
The weibull distribution is a two-parameter function commonly used to fit wind speed frequency distribution. This family of curves has been shown to give a good fit to measured wind speed data. The weibull distrubtion provides a convienti representation of the wind speed data for wind energy calculation purposes.

The above paper describes a maximum likelihood method for fitting a weibull distrubtion to time series data. Code that implements that method is available here. As output this code produces an excel spreadsheet.


Tower Height Correction:

Remember all met office measurements are taken at 10 meters off the surface. The power in wind goes by the cube of the wind wind so any potential gain in wind speed must be corrected for. You can do this with the log wind profile. If you assume neutral stability the second term drops out.


References
http://en.wikipedia.org/wiki/Log_wind_profile
http://amsglossary.allenpress.com/glossary/search?id=aerodynamic-roughness-length1
This formulation requires a minimum parameter of z0 for wind speed corrections at a given height ( assuming neutral stability ). A 1978 paper found that the roughness length at the south pole depended on the orientation of the wind to the sastrugi. The reference is:

Aerodynamic Roughness as a Function Of Wind Direction Over Asymmetric Surface Elements Boundary Layer Meteorology 14(1978) p 323-330
http://www.idl.ku.edu/ara/AARPS/Documents/Structural/Jackson&Carroll.pdf
Note that if reproducing this results is desired that this is a logarithmic function and changes of the largest amplitude are at the lower tower heights. A piece of code that implements this correction as described in Jackson & Carroll is below.

def towerHeightCorrection(windDirection, windSpeedMS, measureHeight, newHeight):
    """Aerodynamic roughness as a function of wind direction over asymmetric 
      surface elements
    Boundary-layer meterology
    B.S. Jackson, J.J. Carroll
    1978

    Gives a measurement of roughness length at the south pole given the wind 
    direction.
    """

    if(windDirection>=10 and windDirection<=15):
        """ kutzbach - 1961 reports a range of .01009-.01024 cm for dry
        ice and snow..  this z0 is the average of these two values"""
        z0 = 0.010165
    elif(windDirection>15 and windDirection<24):
        """ linear interpolation between the above and below
        a = .0877594
        b = -1.30623
        """
        z0 = .0877594 * windDirection -1.30623
    elif(windDirection>=24 and windDirection<=45):
        z0 = 0.8
    elif(windDirection>45 and windDirection<60):
        """linear interpolation between the above and below
        a = 0.28
        b = -11.8
        z0 = a*winddirection + b
        """
        z0 = .28 * windDirection -11.8
    elif(windDirection>=60 and windDirection<=100):
        z0 = 5.0
    else:
        """ a catch all number for the surface roughness..
        kutzbach - 1961 reports a range of .01009-.01024 cm for dry
        ice and snow..  this z0 is the average of these two values"""
        z0 = 0.01065

    # z0 is in centimeters.
    # when it should be in meters
    z0 = z0/100.0

    # solve for the friction velocity
    ustar = windSpeedMS * 0.4 / ( math.log(measureHeight/z0))
    newSpeed = (ustar / 0.4) * math.log(newHeight/z0) 
        
    return newSpeed

Power Production Curve

Wind Turbine Manufacturers supply a power production curve given estimated power at a given wind speed. These are an estimate but it is assumed that all power production curves are taken to be at standard temperature and pressure. Most manufacturers do not supply continuous functions for their power production curve so a curve is fit through the available points. Check out the curve fitting service at http://zunzun.com

Bergy XL1
For example for the XL1 bergey supplies this spreadsheet. Note that points where pulled off of this spread with the site altitude set to 0 meters, and the turbulence and perf safety margin factors set to 0%. Those data points where then fed to zunzun.com and the following code was produced to estimate the power production for a bergey xl1 at sealevel:

def wattsAtMSL(ms):
    """This fit was generated by the zunzun web curve fitting service.
    The data points where taken from:
    http://www.bergey.com/Technical/XL.1.R.xls

    RMSE: 3.308 watts

    Note that this curve is assumed to be referenced to MSL at standard 
    temperature and pressure.

    Input -> ms ( wind speed in meters per second )
    Output -> watts
    """


    temp = 0.0

    # coefficients
    b2 = 2.3955532551271861E+02
    c1 = 1.2196335810708682E+01
    d1 = -8.9293418721651321E-03
    b1 = -5.2424199203938713E+01
    c2 = 5.2295018639630237E+00
    d2 = -4.3859824059358302E-03
    Offset = -1.0808456959005857E+01

    K = math.log( math.exp(b2*c1*d1) + math.exp(b2*d1*ms) )
    yII = b1*ms + K/d1
    L = math.log( math.exp(b2*c1*d1) + math.exp(b2*c2*d1) )
    temp = yII - math.log( math.exp(d2*(b1*c2 + L/d1)) + math.exp(d2*yII) ) / d2
    temp = temp + Offset

    if(temp<0):
        return 0.0
    else:
        return temp
Hummer 1KW
The procedure carried out for the hummer 1kw turbine:
import math

# sum of squared absolute error

def hummerPowerCurve(windSpeedMs):
      """A fit to the power production curve for the hummer 1kw wind turbine.
      The input is wind speed in meters per second.  The output is in watts.  
      RMSE: 10.588 watts.

      The data points came from page 5 of the owners manual for the 1kw
      off grid model.  See this link for the source:

      http://www.hummerwind.com/hummer_1kW/pdf%20files/Owner%27s%20Manual-1kW-Off%20Grid.pdf

      Note that according to the above the cut in velocity is 
      3 meters per second
      """

      if(windSpeedMs<3.0):
         return 0.0

      temp = 0.0

      # coefficients
      b2 = 4.4361747110905526E+02
      c1 = 1.2631387337007551E+01
      d1 = -6.6319417331139191E-03
      b1 = -8.9678512101155349E+01
      c2 = 6.3640202880816208E+00
      d2 = -1.0864086608742285E-03
      Offset = -1.8303698352372783E+02

      K = math.log( math.exp(b2*c1*d1) + math.exp(b2*d1*windSpeedMs) )
      yII = b1*windSpeedMs + K/d1
      L = math.log( math.exp(b2*c1*d1) + math.exp(b2*c2*d1) )
      temp = yII - math.log( math.exp(d2*(b1*c2 + L/d1)) + math.exp(d2*yII) ) / d2
      temp = temp + Offset

      if(temp<0):
         return 0.

      return temp

if __name__=="__main__":

      testSpeeds = [ 3,4,5,6,7,8,9,10,12,14,20]
      for speed in testSpeeds:
         print "Wind Speed %f, power %f" % ( speed, hummerPowerCurve(speed))
Raum 1.5 kw
def raum1pt5kw(speedMs):
        """RMSE: 5.45846633054"""

        if(speedMs<3.3):
                # less than the cut in speed                                                    
                return 0.0

        if(speedMs>11.0):
                # according to the raum website                                                 
                # once the speed goes above 11.0 m/s                                            
                # the turbine produces 1.5kw.                                                   
                # it's not right as I doubt furling works that well                             
                return 1500.

        temp = 0.0

        # coefficients                                                                          
        a = -1.1414856936828159E+04
        b = 1.0351781633610568E+04
        c = -2.6507617761552042E+03
        d = 3.2141229263527589E+02
        f = -2.0349731926969248E+01
        g = 6.5459907034597942E-01
        h = -8.4502271983222244E-03

        # see http:#en.wikipedia.org/wiki/Legendre_polynomials                                  
        temp += a + b * speedMs
        temp += c * ((1.0 / 2.0) * (3.0*math.pow(speedMs, 2.0) - 1.0))
        temp += d * ((1.0 / 2.0) * (5.0*math.pow(speedMs, 3.0) - 3.0*speedMs))
        temp += f * ((1.0 / 8.0) * (35.0*math.pow(speedMs, 4.0) - 30.0*math.pow(speedMs, 2.0) +\
 3))
        temp += g * ((1.0 / 8.0) * (63.0*math.pow(speedMs, 5.0) - 70.0*math.pow(speedMs, 3.0) +\
 15.0*speedMs))
        temp += h * ((1.0 / 16.0) * (231.0*math.pow(speedMs, 6.0) - 315.0*math.pow(speedMs, 4.0\
) + 105.0*math.pow(speedMs, 2.0) - 5))

        if(temp<0):
                return 0.

	return temp


if __name__=="__main__":
        speeds = [ 1,2,3,4,5,6,7,8,9,10,11]
        for speed in speeds:
                print "Power @ %f is %f" % ( speed, raum1pt5kw(speed))

ARE-110
Note this is the turbine used by RPSC.
def wattsAtMSL(ms):
        """This fit was generated by the zunzun web curve fitting service.
	The data points for the fit where generated by printing the power
	curve for the ARE110HV turbine, pulling points off with a ruler, and
	then rescaling to get meters per second versus watts.

	Note that this curve is assumed to be referenced to MSL at standard 
	temperature and pressure.

        Note: RMSE on this fit is 22.28 watts with the larger errors being at 
        rare high wind speeds.  There was a note on the origional power curves
        that states that it's not very accurate at high wind speeds because of
        a low number of data points.

	Input -> ms ( wind speed in meters per second )
	Output -> watts
	"""

	temp = 0.0

	# coefficients
	a = -8.2853849879502650E+03
	b = 1.1504235793548245E+04
	c = -6.5675537345062539E+03
	d = 2.0385510336759194E+03
	e = -3.7775847048016539E+02
	f = 4.3012357388520556E+01
	g = -2.9307167248134247E+00
	h = 1.0906254907539370E-01
	i = -1.6990789359772052E-03

	temp = i
	temp = temp * ms + h
	temp = temp * ms + g
	temp = temp * ms + f
	temp = temp * ms + e
	temp = temp * ms + d
	temp = temp * ms + c
	temp = temp * ms + b
	temp = temp * ms + a


        if(temp<0):
            return 0.0
	return temp



Air Density Correction

The south pole being at altitude has a lower air density so power curves must be corrected for the change in air density. The correction with a reference follows

Wind turbines: funadmentals, technologies, applicaitons, economics Page 509, section 14.4.2 - Air Density

p = absolute pressure -> kPa
R = specific gas constant for dry air ( 287.05 J/(kg*K))
T = absolute temp ( degrees K )
Nist standard temperature and pressure:
20 degrees C, 101.325 kPa
Rho = 101325./(287.05 * (20+273.15)) = 1.2041183

wattsAtAltitude = wattsAtSeaLevel * ( densityAtAltitude / densityAtSealevel )


Batteries

Charging Efficiencies


Sealed Lead Acid Batteries must be evaluated for charging efficiency. More importantly incremental charging efficiency. According to a study at Sandia Labs entited A Study of Lead-acid Battery Efficiency Near Top-of-Charge and the Impact on PV System Design note that although many manufacturers quote a constant charging efficiency it is NOT a constant, especially at high states of charge. According to their results incremental charging above an 80% state of charge gives charging efficiencies of under 60%.

Battery Temperature

Unavco performed some low temperature testing on DEKA agm and gel batteries. Their results are referenced here.

Passcal prefers the SunXtender line of batteries. They provide some information here. The sunextender corporation provides rather extensive documentation on expected performance at various temperatures. A technical manual is here

Another potential is a saft sunica plus battery. Their nicad pocket cell battery ( claims no memory effect ) with a low temperature electrolyte will operate at temperatures down to -40C. This family of batteries has been used extensively in northern norway above the artic circle. See a technical manual for it here. The top level battery page is available here.

Sizing Battery Storage

Worst case load is 365 watts. The source of this document is a spreadsheet available on the ARA website here. Note this does not include battery heating, charing efficiency etc. Generate a CDF of outage duration

Forecasting

Reguardless of the size of generator and/or battery bank there will be outages at some point. A potential idea is to forecast the wind speed into the future. If you have a forecast of a wind speed and you know the battery state of charge one can know when to start conserving power.

Some very rough results where generated with a markov chain. More in-depth methods exist such as box-jenkins or a hidden markov model. Reguardless here is an example of the simple forecasters performance:

The code that produced the data for this plot is located here.

Improvement ideas

Keeping a good state of charge

Putting it all together

Evaluating a new turbine

Say you have a new turbine that you want to evaluate. Let's try the windtronics WT-6500 turbine. If you plot it's power production curve on the same plot as say the bergey xl1's power production curve like this:

You'll see that the WT-6500 turbine produces more power than the bergey from 0 knots to 6.5 knots. If you then combine that with a CDF for the wind speeds at pole like this:

If you subtract the cdf value at 6.5 knots with that at 0 knots you'll see that roughly 60% of the time the WT-6500 will outperform the bergey xl1.