def save(path='/home/cryosphere/BOUT/examples/Q3/data_short'): print 'in post_bout.save' boutpath = path print path print sys.path meta = metadata(path=path) print 'ok got meta' output = OrderedDict() data = OrderedDict() con = sql.connect('test.db') all_modes = [] print meta['evolved']['v'] #evolved fields for the given run for i,active in enumerate(meta['evolved']['v']): #loop over the fields print path, active data[active] = boutdata.collect(active,path=path) modes,ave = basic_info(data[active],meta)
import os path=sys.argv[1] key=sys.argv[2] cache='/scratch/01523/meyerson/'+key if os.path.exists(cache): os.rmdir(cache) os.makedirs(cache) print path meta = metadata(path=path) from boutdata import collect from boututils import savemovie gamma = collect("Gammax",yind=[5,5],path=path) ni = collect("Ni",yind=[5,5],path=path) rho = collect("rho",yind=[5,5],path=path) #one movie per cpu print ni.shape, gamma.shape savemovie(gamma[:,:,0,:],ni[:,:,0,:],moviename='movie_'+key+'.avi', meta=meta,cache=cache+"/",overcontour=True) savemovie(rho[:,:,0,:],ni[:,:,0,:],moviename='movie_phi_ni'+key+'.avi', meta=meta,cache=cache+"/",overcontour=True)
def save(path='/home/cryosphere/BOUT/examples/Q3/data_short', savemovie=False,IConly=0,transform=False,fast = False, debug = False): #lets collect the data print 'path :', path print 'in post_bout/post_bout.save' boutpath = path print path #print sys.path meta = metadata(path=path) #ICmodes = print 'ok got meta' #return meta output = OrderedDict() data = OrderedDict() data_r = OrderedDict() all_modes = [] print meta['evolved']['v'] for i,active in enumerate(meta['evolved']['v']): #loop over the fields print path, active data[active] = collect(active,path=path) if savemovie: movie(data,meta) if transform: #if you take the time to rotate the data go ahead and save it cpydata = data[active] data_r[active] = rotate(cpydata,meta) # keep it simple for now if debug: return data[active],data_r[active] minIC = np.array([np.max(data[x][0,:,:,:]) for x in meta['evolved']['v']]) minIC = min(minIC[np.array(meta['IC']).nonzero()]) ICmodes =[] if(meta['ys_opt']['v']==2 and meta['zs_opt']['v']==2): #if BOUT.inp IC indicates a single mode ICmodes.append([meta['ys_mode']['v'],meta['zs_mode']['v']]) elif (meta['ys_opt']['v']==3 and meta['zs_opt']['v']==2): [ICmodes.append([p+1,meta['zs_mode']['v']]) for p in range(5)] elif(meta['ys_opt']['v']==2 and meta['zs_opt']['v']==3): [ICmodes.append([meta['ys_mode']['v'],p+1]) for p in range(8)] elif(meta['ys_opt']['v']==3 and meta['zs_opt']['v']==3): [ICmodes.append([p+1,q+1]) for p in range(7) for q in range(8)] elif(meta['ys_opt']['v']==0 and meta['zs_opt']['v']==3): [ICmodes.append([0,p+1]) for p in range(4)] #some attemps to automate peak finding for i,active in enumerate(meta['evolved']['v']): modes_db,ave = basic_info(data[active],meta) #basic_info does not correct for incomplete runs #print modes[0]['gamma'] output[active] = {'ave':ave} #for x in output[active]['modes']: #keep track of relevant harmonics print 'debug:', len(modes_db),type(modes_db),len(modes_db) for x in modes_db: print x['mn'],all_modes if x['mn'] not in all_modes: #don't append if the mode is weak . . ##minIC = np.array(meta['IC']) #minIC = min(minIC[minIC.nonzero()]) print 'minIC: ',minIC, x['amp'][-10:,:].max() #if x['amp'][-10:,:].max()>=(minIC/1.0): all_modes.append(x['mn']) if IConly or len(all_modes)==0: all_modes = ICmodes else: z = [] [z.append(x) for x in all_modes] [z.append(x) for x in ICmodes] all_modes = z print 'len(all_modes):',len(all_modes) #rebuild with all the relevant modes output = OrderedDict() output['meta'] = meta output['ave'] = {} allmodes_db =[] for i,active in enumerate(meta['evolved']['v']): print 'once again', active print all_modes print meta['ys_opt']['v'], meta['zs_opt']['v'] modes_db,ave = basic_info(data[active],meta, user_peak = all_modes) if transform: print all_modes modes_db_r,ave_r = basic_info(data_r[active],meta, user_peak = all_modes) #for now data_r must maintain same shape as data # if debug: # return modes_db_r,modes_db #print modes_db_r.__class__,len(modes_db_r) # if transform: # for j,x in enumerate(modes_db_r): # x['amp_r'] = modes_db_r[j]['amp'] # x['phase_r'] = modes_db_r[j]['phase'] # x['k_r']= modes_db_r[j]['k'] # x['freq_r']= modes_db_r[j]['freq'] # x['gamma_r'] =modes_db_r[j]['gamma'] # allmodes_db.append(modes_db_r) for j,x in enumerate(modes_db): print 'j: ',j x['field'] = active x['dz']=meta['dz'] x['IC']=meta['IC'] x['L']=meta['L'] x['Rxy']= meta['Rxy']['v'] x['nfields'] = len(meta['evolved']['v']) x['meta'] = meta x['nx']= meta['nx'] x['ny'] = meta['ny'] x['nz'] = meta['MZ']['v']-1 x['dt'] = meta['dt']['v'] x['Rxynorm'] = 100*x['Rxy']/meta['rho_s']['v'] x['rho_s'] = meta['rho_s']['v'] #for now if there was rotation just loop a few keys x['transform'] = transform if transform: try: x['amp_r'] = modes_db_r[j]['amp'] x['phase_r'] = modes_db_r[j]['phase'] x['k_r']= modes_db_r[j]['k'] x['freq_r']= modes_db_r[j]['freq'] x['gamma_r'] =modes_db_r[j]['gamma'] except: print "FAIL TO ADD TRANSFORMED VALUES" ntt = x['nt'] #actual number of steps nt = meta['NOUT']['v'] #requested number of steps print j,' out of ',len(modes_db) print nt,ntt #for incomplete runs if nt > ntt: #if the run did not finish then rescale to keep data dims the same xx = np.array(range(0,ntt)) #dep var to interp FROM xxnew = np.linspace(0,ntt-1,nt+1) #new dep var grid, nt points up to ntt-1 print ntt/nt,x['dt']*float(ntt/nt),nt,ntt x['dt'] = x['dt']*float(ntt/nt) #smaller dt if we are interp tp more points . . print x['dt'] x['nt'] = nt amp = x['amp'] #2d array ntt x nx phase = x['phase'] ampnew=[] #will be a nx x nt 2d array phasenew =[] for mode_r in np.transpose(amp): f = interp1d(xx,mode_r) ampnew.append(f(xxnew)) for mode_r in np.transpose(phase): f = interp1d(xx,mode_r) phasenew.append(f(xxnew)) x['amp'] = np.transpose(ampnew) x['phase'] = np.transpose(phasenew) print x['phase'].shape output['ave'][active] = {'ave':ave} allmodes_db.append(modes_db) allmodes_db = sum(allmodes_db,[]) filename_db = path+'/post_bout.db' pickle_db = open(filename_db,'wb') pickle.dump(allmodes_db,pickle_db) pickle_db.close() # let pickle the results # filename = path+'/post_bout.jsn' # json_out = open(filename,'wb') # pickle.dump(output,json_out) # json_out.close() print filename_db
def read(path='.',filename='post_bout.pkl',trysave=True, gamma_updt=False): print 'in post_bout.read()' filepath = path+'/'+filename filepath_db = path+'/post_bout.db' datafile = path+'/BOUT.dmp.0.nc' print 'is file present: ', os.path.isfile(filepath_db) if trysave and not(os.path.isfile (filepath_db)) and os.path.isfile(datafile): save(path=path) if os.path.isfile(filepath_db): #pkl_file = open(filepath, 'rb') pkl_file_db = open(filepath_db, 'rb') #output = pickle.load(pkl_file) output_db = pickle.load(pkl_file_db) meta = metadata(path=path) #update the meta data incase read_inp was altered . . . for i,x in enumerate(output_db): x['dz']=meta['dz'] x['IC']=meta['IC'] x['L']=meta['L'] x['Rxy']= meta['Rxy']['v'] x['nfields'] = len(meta['evolved']['v']) x['meta'] = meta x['nx'] = meta['nx'] x['ny'] = meta['ny'] x['nz'] = meta['MZ']['v']-1 x['path'] = path #print x['mn'] x['MN'] = list([1,2]) x['MN'][0] = x['mn'][0] x['MN'][1] = x['mn'][1]/x['dz'] x['modeid'] = [x['dz'],x['modeid'],x['mn'][1]] # print x['mn'] #x['MN'] = x['mn'] #x['MN'][1] = x['MN'][1]/x['dz'] x['Rxynorm'] = 100*x['Rxy']/meta['rho_s']['v'] if 'dt' not in x: x['dt'] = meta['dt']['v'] #this one gets modified no read . if gamma_updt: #experimental, recalculates gamma from amp, but for a while amp was #wrong for incomplete runs s0 . . . dont' run for now lnamp = np.log(x['amp']) #nt x nx t = x['dt']*np.array(range(int(x['nt']))) r = np.polyfit(t[x['nt']/2:],lnamp[x['nt']/2:,2:-2],1,full=True) gamma_est = r[0][0] #nx f0 = np.exp(r[0][1]) #nx res = r[1] pad =[0,0] gamma_est = np.concatenate([pad,gamma_est,pad]) f0 = np.concatenate([pad,f0,pad]) res = np.concatenate([pad,res,pad]) #sig = res/np.sqrt((x['nt']-2)) sig = np.sqrt(res/(x['nt']-2)) #sig0 = sig*np.sqrt(1/(x['nt'])+ ) # who cares sig1 = sig*np.sqrt(1.0/(x['nt'] * t.var())) res = 1 - res/(x['nt']*lnamp.var(0)) #nx res[0:2] = 0 res[-2:] = 0 x['gamma'] = [gamma_est,f0,sig1,res] pkl_file_db.close() return output_db else: return 0