# -*- coding: iso-8859-15 -*- # stupid python2 fix ''' Created on 23.09.2012 @author: Jakob @note: ''' import numpy as np def logfit_ensemble(e, cfg): ''' fits the log law to one measured velocity profile. kwargs: e ... the ensemble with the velocity profile cfg: component ... specify the velocity component, that is being processed (0=u, 1=v, 2=w, 3=magnitude) logheight ... percentage (0 ... 1.0) that is used for fitting ''' # this is just optional for debugging from scipy.stats.stats import pearsonr # prepare data in lists depth = e.depth z_max = depth * cfg['logheight'] z = [] v = [] # NOTE: z is starting from bottom to top. if not e.void: for c in e.cells: if depth + c.z_position <= z_max: z.append(depth + c.z_position) v.append(c.velocity.magn2d() if cfg['component'] == 3 else c.velocity[cfg['component']] ) if len(z) > 1: # (np.log() is actually ln!) logz= np.log(z) # actual linear regression. basic formula: y = a*x + b a, b = np.linalg.lstsq(np.vstack([v, np.ones(len(v))]).T, logz)[0] # correlation r,p = pearsonr(logz, v) # shear stress v_shear = 0.4 / a tau_shear = v_shear **2 * 1000 # assumption: density of water: 1000 kg/m^3 # roughness height ks = 30 * np.exp(b) # write back results e.ks = ks e.tau_shear = tau_shear e.v_shear = v_shear e.logfit_debug = (a, b, r, p, len(z)) return e def logfit_profile(p, cfg): from copy import deepcopy p = deepcopy(p) for i in range(len(p.ensembles)): p.ensembles[i] = logfit_ensemble(p.ensembles[i], cfg) return p if __name__ == '__main__': pass # import pickle # from quickviz import * # # pre_profile = pickle.load(open('../testfiles/profile_stage0.pickle','rb')) ## cfg_outlier = dict(radius_h=15, radius_v=0, limit=0.05) # # cfg_logfit = dict(component=3, logheight=0.25) ## logfit_ensemble(pre_profile.ensembles[88], cfg_logfit) ## ## plot_logfit_ensemble(pre_profile.ensembles[88], cfg_logfit) # # p2 = logfit_profile(pre_profile, cfg_logfit) # plot_logfit_profile(p2, cfg_logfit) # #plot_logfit_ensemble(p2.ensembles[494], cfg_logfit) ## plot_logfit_ensembles(p2, cfg_logfit) # ## p3 = logfit_outliers(p2, cfg_outlier)