@@ -115,45 +115,9 @@ def ineichen(time, location, linke_turbidity=None,
115115
116116
117117 if linke_turbidity is None :
118- # The .mat file 'LinkeTurbidities.mat' contains a single 2160 x 4320 x 12
119- # matrix of type uint8 called 'LinkeTurbidity'. The rows represent global
120- # latitudes from 90 to -90 degrees; the columns represent global longitudes
121- # from -180 to 180; and the depth (third dimension) represents months of
122- # the year from January (1) to December (12). To determine the Linke
123- # turbidity for a position on the Earth's surface for a given month do the
124- # following: LT = LinkeTurbidity(LatitudeIndex, LongitudeIndex, month).
125- # Note that the numbers within the matrix are 20 * Linke Turbidity,
126- # so divide the number from the file by 20 to get the
127- # turbidity.
128-
129- try :
130- import scipy .io
131- except ImportError :
132- raise ImportError ('The Linke turbidity lookup table requires scipy. ' +
133- 'You can still use clearsky.ineichen if you ' +
134- 'supply your own turbidities.' )
135-
136- # consider putting this code at module level
137- this_path = os .path .dirname (os .path .abspath (__file__ ))
138- logger .debug ('this_path=%s' , this_path )
139-
140- mat = scipy .io .loadmat (os .path .join (this_path , 'data' , 'LinkeTurbidities.mat' ))
141- linke_turbidity = mat ['LinkeTurbidity' ]
142- LatitudeIndex = np .round_ (_linearly_scale (location .latitude ,90 ,- 90 ,1 ,2160 ))
143- LongitudeIndex = np .round_ (_linearly_scale (location .longitude ,- 180 ,180 ,1 ,4320 ))
144- g = linke_turbidity [LatitudeIndex ][LongitudeIndex ]
145- if interp_turbidity :
146- logger .info ('interpolating turbidity to the day' )
147- g2 = np .concatenate ([[g [- 1 ]], g , [g [0 ]]]) # wrap ends around
148- days = np .linspace (- 15 , 380 , num = 14 ) # map day of year onto month (approximate)
149- LT = pd .Series (np .interp (time .dayofyear , days , g2 ), index = time )
150- else :
151- logger .info ('using monthly turbidity' )
152- ApplyMonth = lambda x :g [x [0 ]- 1 ]
153- LT = pd .DataFrame (time .month , index = time )
154- LT = LT .apply (ApplyMonth , axis = 1 )
155- TL = LT / 20.
156- logger .info ('using TL=\n %s' , TL )
118+ TL = lookup_linke_turbidity (time , location .latitude ,
119+ location .longitude ,
120+ interp_turbidity = interp_turbidity )
157121 else :
158122 TL = linke_turbidity
159123
@@ -221,6 +185,87 @@ def ineichen(time, location, linke_turbidity=None,
221185 return df_out
222186
223187
188+ def lookup_linke_turbidity (time , latitude , longitude , filepath = None ,
189+ interp_turbidity = True ):
190+ """
191+ Look up the Linke Turibidity from the ``LinkeTurbidities.mat``
192+ data file supplied with pvlib.
193+
194+ Parameters
195+ ----------
196+ time : pandas.DatetimeIndex
197+
198+ latitude : float
199+
200+ longitude : float
201+
202+ filepath : string
203+ The path to the ``.mat`` file.
204+
205+ interp_turbidity : bool
206+ If ``True``, interpolates the monthly Linke turbidity values
207+ found in ``LinkeTurbidities.mat`` to daily values.
208+
209+ Returns
210+ -------
211+ turbidity : Series
212+ """
213+
214+ # The .mat file 'LinkeTurbidities.mat' contains a single 2160 x 4320 x 12
215+ # matrix of type uint8 called 'LinkeTurbidity'. The rows represent global
216+ # latitudes from 90 to -90 degrees; the columns represent global longitudes
217+ # from -180 to 180; and the depth (third dimension) represents months of
218+ # the year from January (1) to December (12). To determine the Linke
219+ # turbidity for a position on the Earth's surface for a given month do the
220+ # following: LT = LinkeTurbidity(LatitudeIndex, LongitudeIndex, month).
221+ # Note that the numbers within the matrix are 20 * Linke Turbidity,
222+ # so divide the number from the file by 20 to get the
223+ # turbidity.
224+
225+ try :
226+ import scipy .io
227+ except ImportError :
228+ raise ImportError ('The Linke turbidity lookup table requires scipy. ' +
229+ 'You can still use clearsky.ineichen if you ' +
230+ 'supply your own turbidities.' )
231+
232+ if filepath is None :
233+ pvlib_path = os .path .dirname (os .path .abspath (__file__ ))
234+ filepath = os .path .join (pvlib_path , 'data' , 'LinkeTurbidities.mat' )
235+
236+ mat = scipy .io .loadmat (filepath )
237+ linke_turbidity_table = mat ['LinkeTurbidity' ]
238+
239+ latitude_index = np .around (_linearly_scale (latitude , 90 , - 90 , 1 , 2160 ))
240+ longitude_index = np .around (_linearly_scale (longitude , - 180 , 180 , 1 , 4320 ))
241+
242+ g = linke_turbidity_table [latitude_index ][longitude_index ]
243+
244+ if interp_turbidity :
245+ logger .info ('interpolating turbidity to the day' )
246+ # Cata covers 1 year.
247+ # Assume that data corresponds to the value at
248+ # the middle of each month.
249+ # This means that we need to add previous Dec and next Jan
250+ # to the array so that the interpolation will work for
251+ # Jan 1 - Jan 15 and Dec 16 - Dec 31.
252+ # Then we map the month value to the day of year value.
253+ # This is approximate and could be made more accurate.
254+ g2 = np .concatenate ([[g [- 1 ]], g , [g [0 ]]])
255+ days = np .linspace (- 15 , 380 , num = 14 )
256+ linke_turbidity = pd .Series (np .interp (time .dayofyear , days , g2 ),
257+ index = time )
258+ else :
259+ logger .info ('using monthly turbidity' )
260+ apply_month = lambda x : g [x [0 ]- 1 ]
261+ linke_turbidity = pd .DataFrame (time .month , index = time )
262+ linke_turbidity = linke_turbidity .apply (apply_month , axis = 1 )
263+
264+ linke_turbidity /= 20.
265+
266+ return linke_turbidity
267+
268+
224269def haurwitz (apparent_zenith ):
225270 '''
226271 Determine clear sky GHI from Haurwitz model.
0 commit comments