33import netCDF4 as nc
44import numpy as np
55from scipy .interpolate import CubicSpline
6+ from scipy .interpolate import interp1d
67from scipy .optimize import curve_fit
78from scipy .stats import gamma
89
@@ -53,18 +54,31 @@ def write_lut_spectralpoints(self,file_out):
5354 """generate piecewise-linear fit coefficients and write to a given path
5455 write look-up-table parameterization
5556 """
56- nband = len (self .wavenum )
57+ try :
58+ nband = len (self .wavenum )
59+ except :
60+ nband = np .shape (self .band_limit )[0 ]
5761 nr = len (self .r )
5862 with nc .Dataset (file_out , mode = 'w' , format = 'NETCDF4_CLASSIC' ) as ncfile :
5963 # create Dimension
6064 ncfile .createDimension ('Band' , nband )
6165 ncfile .createDimension ('Re' , nr )
6266 ncfile .createDimension ('Constant' , 1 )
6367 # create Variable
64- freq = ncfile .createVariable ('freq' , np .float32 , ('Band' ))
65- freq .units = 'micrometer'
66- wavenum = ncfile .createVariable ('wavenum' , np .float32 , ('Band' ))
67- wavenum .units = 'cm-1'
68+ try :
69+ wavenum = ncfile .createVariable ('wavenum' , np .float32 , ('Band' ))
70+ wavenum .units = 'cm-1'
71+ freq = ncfile .createVariable ('freq' , np .float32 , ('Band' ))
72+ freq .units = 'micrometer'
73+ wavenum [:] = self .wavenum
74+ freq [:] = cm_to_um / wavenum [:]
75+ except :
76+ Band_limits_lwr = ncfile .createVariable ('Band_limits_lwr' , np .float32 , ('Band' ,))
77+ Band_limits_lwr .units = 'cm-1'
78+ Band_limits_upr = ncfile .createVariable ('Band_limits_upr' , np .float32 , ('Band' ,))
79+ Band_limits_upr .units = 'cm-1'
80+ Band_limits_lwr [:] = self .band_limit [:,0 ]
81+ Band_limits_upr [:] = self .band_limit [:,1 ]
6882 re = ncfile .createVariable ('re' , np .float32 , ('Re' ))
6983 re .units = 'micrometer'
7084 v = ncfile .createVariable ('v' , np .float32 , ('Re' ))
@@ -79,8 +93,6 @@ def write_lut_spectralpoints(self,file_out):
7993 asy .units = 'unitless'
8094 rau = ncfile .createVariable ('rau' , np .float32 , ('Constant' ))
8195 rau .units = 'g/m**3'
82- wavenum [:] = self .wavenum
83- freq [:] = cm_to_um / wavenum [:]
8496 re [:] = self .r
8597 v [:] = self .v
8698 s [:] = self .s
@@ -144,9 +156,9 @@ def interp_cloud_optics(self, wavenum_out):
144156 ssa_out = np .zeros ((nsize , nwav ))
145157 asy_out = np .zeros ((nsize , nwav ))
146158 for i in range (nsize ):
147- ext_out [i ,:] = CubicSpline (self .wavenum , self .ext [i ,:])(wavenum_out )
148- ssa_out [i ,:] = CubicSpline (self .wavenum , self .ssa [i ,:])(wavenum_out )
149- asy_out [i ,:] = CubicSpline (self .wavenum , self .asy [i ,:])(wavenum_out )
159+ ext_out [i ,:] = interp1d (self .wavenum , self .ext [i ,:], fill_value = "extrapolate" )(wavenum_out )
160+ ssa_out [i ,:] = interp1d (self .wavenum , self .ext [ i ,:] * self . ssa [i ,:], fill_value = "extrapolate" )(wavenum_out )/ ext_out [ i ,:]
161+ asy_out [i ,:] = interp1d (self .wavenum , self .ext [ i ,:] * self . ssa [ i ,:] * self . asy [i ,:], fill_value = "extrapolate" )(wavenum_out )/ ext_out [ i ,:] / ssa_out [ i ,:]
150162 sca_out = ssa_out * ext_out
151163 result = optics_var (self .r , self .s , self .v ,
152164 ext_out , sca_out , ssa_out , asy_out ,self .rau ,
@@ -299,7 +311,6 @@ def create_lut_coeff(self,re_range,v_range,file_out):
299311 lut_asy_a [k ,i ] = f [1 ] # a + b*r
300312 lut_asy_b [k ,i ] = f [0 ]
301313
302-
303314 def create_pade_coeff (self ,re_range ,re_ref ,v_range ,file_out ):
304315 """generate Padé approximantsize coefficients and write to a given path
305316 write look-up-table parameterization
@@ -350,42 +361,64 @@ def create_pade_coeff(self,re_range,re_ref,v_range,file_out):
350361 Particle_Volume_limits_lwr [:] = v_range [0 ,:]
351362 Particle_Volume_limits_upr [:] = v_range [1 ,:]
352363
353- def pade (x , p1 , p2 , p3 , q1 , q2 , q3 ):
354- return (p3 + p2 * x + p1 * x ** 2 )/ (q3 + q2 * x + q1 * x ** 2 )
364+ re_range [0 ,0 ] = re_range [0 ,0 ]
355365
366+ def pade (x , p1 , p2 , p3 , q1 , q2 , q3 ):
367+ return ((p3 ) + (p2 )* x + (p1 )* x ** 2 )/ ((q3 ) + (q2 )* x + (q1 )* x ** 2 )
368+ def pade_abs (x , p1 , p2 , p3 , q1 , q2 , q3 ):
369+ return ((p3 ) + (p2 )* x + (p1 )* x ** 2 )/ (abs (q3 )+ abs (q2 )* x + abs (q1 )* x ** 2 )
370+ def pade_2p2q_abs (x , p2 , p3 , q2 ,q3 ):
371+ return (p3 + p2 * x )/ (abs (q3 ) + abs (q2 )* x )
372+ def pade_2p2q (x , p2 , p3 , q2 ,q3 ):
373+ return (p3 + p2 * x )/ (q3 + q2 * x )
374+ def piecewise (x ,y ):
375+ f1 = (y [- 1 ]- y [0 ])/ (x [- 1 ]- x [0 ])
376+ f2 = y [0 ] - f1 * x [0 ]
377+ return [f1 ,f2 ]
356378 for k in range (nr ):
357379 for i in range (nband ):
358380 id = np .where ((self .r >= re_range [0 ,k ]) & (self .r < re_range [1 ,k ]))
359381 r_sample = self .r [id ]
360382 try :
361- tmp , cov = curve_fit (pade , r_sample - re_ref [k ], np .squeeze (self .ext [id ,i ]))
362- pade_ext_p [:,k ,i ] = tmp [:3 ]
363- pade_ext_q [:,k ,i ] = tmp [3 :]
383+ tmp , cov = curve_fit (pade_abs , r_sample - re_ref [k ], np .squeeze (self .ext [id ,i ]))
384+ pade_ext_p [:,k ,i ] = ( tmp [:3 ])
385+ pade_ext_q [:,k ,i ] = abs ( tmp [3 :])
364386 except :
365- # too much degree-of-freedom. using linear fit instead
366- f = np .polyfit (r_sample , np .squeeze (self .ext [id ,i ]), 1 )
367- pade_ext_p [:,k ,i ] = [0 , f [0 ], f [1 ]] # a + b*r
368- pade_ext_q [:,k ,i ] = [0 , 0 , 1 ]
387+ try :
388+ tmp , cov = curve_fit (pade , r_sample - re_ref [k ], np .squeeze (self .ext [id ,i ]))
389+ pade_ext_p [:,k ,i ] = (tmp [:3 ])
390+ pade_ext_q [:,k ,i ] = (tmp [3 :])
391+ except :
392+ tmp , cov = curve_fit (pade_2p2q_abs , r_sample - re_ref [k ], np .squeeze (self .ext [id ,i ]))
393+ pade_ext_p [:,k ,i ] = [0 , (tmp [0 ]), (tmp [1 ])]
394+ pade_ext_q [:,k ,i ] = [0 , abs (tmp [2 ]), abs (tmp [3 ])]
395+ # too much degree-of-freedom. using linear fit instead
396+ #f = piecewise(r_sample, np.squeeze(self.ext[id,i]))
397+ #pade_ext_p[:,k,i] = [0, f[0], f[1]] # a + b*r
398+ #pade_ext_q[:,k,i] = [0, 0, 1]
369399
370400 try :
371- tmp , cov = curve_fit (pade , r_sample - re_ref [k ], np .squeeze (self .ssa [id ,i ]))
372- pade_ssa_p [:,k ,i ] = tmp [: 3 ]
373- pade_ssa_q [:,k ,i ] = tmp [3 :]
401+ tmp , cov = curve_fit (pade_abs , r_sample - re_ref [k ], 1 - np .squeeze (self .ssa [id ,i ]))
402+ pade_ssa_p [:,k ,i ] = abs ( tmp [3 :]) - ( tmp [: 3 ])
403+ pade_ssa_q [:,k ,i ] = abs ( tmp [3 :])
374404 except :
375405 # too much degree-of-freedom. using linear fit instead
376- f = np . polyfit (r_sample , np .squeeze (self .ssa [id ,i ]), 1 )
406+ f = piecewise (r_sample , np .squeeze (self .ssa [id ,i ]))
377407 pade_ssa_p [:,k ,i ] = [0 , f [0 ], f [1 ]] # a + b*r
378408 pade_ssa_q [:,k ,i ] = [0 , 0 , 1 ]
379409
380410 try :
381- tmp , cov = curve_fit (pade , r_sample - re_ref [k ], np .squeeze (self .asy [id ,i ]))
382- pade_asy_p [:,k ,i ] = tmp [: 3 ]
383- pade_asy_q [:,k ,i ] = tmp [3 :]
411+ tmp , cov = curve_fit (pade_abs , r_sample - re_ref [k ], 1 - np .squeeze (self .asy [id ,i ]))
412+ pade_asy_p [:,k ,i ] = abs ( tmp [3 :]) - ( tmp [: 3 ])
413+ pade_asy_q [:,k ,i ] = abs ( tmp [3 :])
384414 except :
385415 # too much degree-of-freedom. using linear fit instead
386- f = np .polyfit (r_sample ,np .squeeze (self .asy [id ,i ]),1 )
387- pade_asy_p [:,k ,i ] = [0 , f [0 ], f [1 ]] # a + b*r
388- pade_asy_q [:,k ,i ] = [0 , 0 , 1 ]
416+ tmp , cov = curve_fit (pade_2p2q_abs , r_sample - re_ref [k ], 1 - np .squeeze (self .asy [id ,i ]))
417+ pade_asy_p [:,k ,i ] = [0 , abs (tmp [2 ])- tmp [0 ], abs (tmp [3 ])- tmp [1 ]]
418+ pade_asy_q [:,k ,i ] = [0 , abs (tmp [2 ]), abs (tmp [3 ])]
419+ #f = np.polyfit(r_sample,np.squeeze(self.asy[id,i]),1)
420+ #pade_asy_p[:,k,i] = [0, f[0], f[1]] # a + b*r
421+ #pade_asy_q[:,k,i] = [0, 0, 1]
389422
390423def lognormpdf (x ,mu ,sigma ):
391424 y = 1.0 / x / sigma / math .sqrt (2 * math .pi ) * np .exp (- 1.0 / 2.0 * (np .log (x / mu )/ sigma )** 2 )
0 commit comments