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