@@ -115,45 +115,9 @@ def ineichen(time, location, linke_turbidity=None,
115
115
116
116
117
117
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 )
157
121
else :
158
122
TL = linke_turbidity
159
123
@@ -221,6 +185,87 @@ def ineichen(time, location, linke_turbidity=None,
221
185
return df_out
222
186
223
187
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
+
224
269
def haurwitz (apparent_zenith ):
225
270
'''
226
271
Determine clear sky GHI from Haurwitz model.
0 commit comments