From a92089475a99a6e7832747bab9fea8b7e8fef574 Mon Sep 17 00:00:00 2001 From: Wouter Peters <wouter.peters@wur.nl> Date: Thu, 26 Apr 2012 10:01:16 +0000 Subject: [PATCH] time averaging now included for flux files --- da/analysis/expand_fluxes.py | 223 ++++++++++------------------------- 1 file changed, 62 insertions(+), 161 deletions(-) diff --git a/da/analysis/expand_fluxes.py b/da/analysis/expand_fluxes.py index 4eb200cc..418abb16 100755 --- a/da/analysis/expand_fluxes.py +++ b/da/analysis/expand_fluxes.py @@ -666,64 +666,7 @@ def SaveWeeklyAvgExtTCData(DaCycle): return saveas -def SaveEcoDataExt(rundat): - """ Function SaveEcoDataExt saves surface flux data to NetCDF files for extended ecoregions - - *** Inputs *** - rundat : a RunInfo object - - *** Outputs *** - NetCDF file containing n-hourly global surface fluxes per TransCom region - - *** Example *** - ./expand_savestate project=enkf_release sd=20000101 ed=20010101 """ - from ecotools import xte - from da.analysis.tools_transcom import LookUpName - import pycdf as CDF - - infile=os.path.join(rundat.outputdir,'data_eco_weekly','ecofluxes.nc') - if not os.path.exists(infile): - print "Needed input file (%s) does not exist yet, please create weekly ecoflux files first, returning..."%infile - return None - - # Create NetCDF output file - # - saveas=os.path.join(rundat.outputdir,'data_eco_weekly','eco_extfluxes.nc') - ncf=CT_CDF(saveas,'create') - dimdate=ncf.AddDateDim() - dimidateformat=ncf.AddDateDimFormat() - dimregs = ncf.AddRegionDim(type='tc_ext') - - - ncf_in=CDF.CDF(infile) - vardict=ncf_in.variables() - for vname, vprop in vardict.iteritems(): - dims=() - data=array(ncf_in.var(vname)[:]) - atts=ncf_in.var(vname).attributes() - if vname not in ['date','idate']: - if 'cov' in vname: - data=xte(data[:,0:rundat.n_land,0:rundat.n_land],cov=True) - dims=dimdate+dimregs+dimregs - else: - data=xte(data[:,0:rundat.n_land]) - dims=dimdate+dimregs - elif vname=='date': dims=dimdate - elif vname=='idate': dims=dimdate+dimidateformat - else: - print 'Dataset with unknown dimensions encountered in file: %s'%vname - - savedict=ncf.StandardVar(varname=vname) - savedict['units']=atts['units'] - savedict['values']=data.tolist() - savedict['dims']=dims - ncf.AddData(savedict,nsets=data.shape[0]) - - ncf.close() - - return saveas - -def SaveTimeAvgData(rundat,infile,avg='monthly'): +def SaveTimeAvgData(DaCycle,infile,avg='monthly'): """ Function saves time mean surface flux data to NetCDF files *** Inputs *** @@ -738,14 +681,18 @@ def SaveTimeAvgData(rundat,infile,avg='monthly'): import da.analysis.tools_time as timetools import da.tools.io4 as io + if 'weekly' in infile: intime = 'weekly' + if 'monthly' in infile: intime = 'monthly' + if 'yearly' in infile: intime = 'yearly' + dirname,filename = os.path.split(infile) - dirname = CreateDirs(os.path.join(rundat.outputdir,dirname.replace('weekly',avg) ) ) + outdir = CreateDirs(os.path.join(DaCycle['dir.analysis'],dirname.replace(intime,avg))) dectime0 = date2num(datetime(2000,1,1)) # Create NetCDF output file # - saveas = os.path.join(dirname,filename) + saveas = os.path.join(outdir,filename) ncf = io.CT_CDF(saveas,'create') dimdate = ncf.AddDateDim() # @@ -763,68 +710,49 @@ def SaveTimeAvgData(rundat,infile,avg='monthly'): date = file.GetVariable('date') globatts = file.ncattrs() - time = [datetime(2000,1,1)+timedelta(days=d) for d in date] + for att in globatts: + attval = file.getncattr(att) + if not att in ncf.ncattrs(): + ncf.setncattr(att,attval) -# -# Add global attributes, sorted -# - keys = globatts - keys.sort() - for k in keys: - setattr(ncf,k,k) + time = [datetime(2000,1,1)+timedelta(days=d) for d in date] # loop over datasets in infile, skip idate and date as we will make new time axis for the averaged data - for sds in datasets: - if sds in ['idate','date'] : continue - print '[' + for sds in ['date']+datasets: # get original data - data = array(file.GetVariable(sds)) + data = file.GetVariable(sds) varatts = file.variables[sds].ncattrs() vardims = file.variables[sds].dimensions # # Depending on dims of input dataset, create dims for output dataset. Note that we add the new dimdate now. # - dims=() for d in vardims: - if 'latitude' in d: - dimgrid = ncf.AddLatLonDim() - dims += (dimgrid[0],) - if 'longitude' in d: - dimgrid = ncf.AddLatLonDim() - dims += (dimgrid[1],) - for type in ['eco','eco_ext','tc','tc_ext','olson']: - if 'regions_%s' % type == d: - dimregs = ncf.AddRegionDim(type) - dims += dimregs -# -# If the variable name from the infile is not defined in the standard, simply copy attributes from the old to the new sds -# Do not copy over the grid information -# - - if ncf.StandardVar(sds)['name'] == 'unknown': - - savedict = ncf.StandardVar(sds) - savedict['name'] = sds - savedict['values'] = data.tolist() - savedict['dims'] = dims - savedict['units'] = file.variables[sds].units - savedict['long_name'] = file.variables[sds].long_name - savedict['comment'] = file.variables[sds].comment - savedict['standard_name'] = file.variables[sds].standard_name - savedict['count'] =0 - ncf.AddData(savedict) - sys.stdout.write('.') - sys.stdout.flush() - + if 'date' in d: + continue + if d in ncf.dimensions.keys(): + pass + else: + dim = ncf.createDimension(d,size=len(file.dimensions[d])) + + savedict = ncf.StandardVar(sds) + savedict['name'] = sds + savedict['dims'] = vardims + savedict['units'] = file.variables[sds].units + savedict['long_name'] = file.variables[sds].long_name + savedict['comment'] = file.variables[sds].comment + savedict['standard_name'] = file.variables[sds].standard_name + savedict['count'] = 0 + + if not 'date' in vardims: + savedict['values'] = data + ncf.AddData(savedict) else: - if sds in ['latitude','longitude']: continue - if avg == 'monthly': time_avg, data_avg = timetools.monthly_avg(time,data) elif avg == 'seasonal': @@ -841,34 +769,27 @@ def SaveTimeAvgData(rundat,infile,avg='monthly'): count=-1 for dd,data in zip(time_avg,data_avg): count=count+1 - - if not ncf.has_date(date2num(dd)-dectime0): - - savedict=ncf.StandardVar('date') - savedict['values']=date2num(dd)-dectime0 - savedict['dims']=dimdate - savedict['count']=count - ncf.AddData(savedict) - - savedict=ncf.StandardVar(sds) - savedict['values']=data.tolist() - savedict['units']=file.variables[sds].units - if 'cov' in sds: - savedict['dims']=dimdate+dims+dims + if sds == 'date': + savedict['values'] = date2num(dd)-dectime0 else: - savedict['dims']=dimdate+dims + savedict['values']=data savedict['count']=count - ncf.AddData(savedict) + ncf.AddData(savedict,silent=True) sys.stdout.write('.') - sys.stdout.flush() - print ']' + sys.stdout.write('\n') + sys.stdout.flush() # end NetCDF file access file.close() ncf.close() + msg = "------------------- Finished time averaging---------------------------------" ; logging.info(msg) + + + return saveas + if __name__ == "__main__": import logging @@ -892,43 +813,23 @@ if __name__ == "__main__": StateVector = CtGriddedStateVector(DaCycle) dummy = StateVector.Initialize() + while DaCycle['time.start'] < DaCycle['time.finish']: + + savedas_1x1=SaveWeeklyAvg1x1Data(DaCycle, StateVector) + savedas_state=SaveWeeklyAvgStateData(DaCycle, StateVector) + savedas_tc=SaveWeeklyAvgTCData(DaCycle, StateVector) + savedas_tcext=SaveWeeklyAvgExtTCData(DaCycle) + + DaCycle.AdvanceCycleTimes() + + StateVector = None # free memory + + for avg in ['monthly','yearly','longterm']: + + savedas_1x1 = SaveTimeAvgData(DaCycle,savedas_1x1,avg) + savedas_state = SaveTimeAvgData(DaCycle,savedas_state,avg) + savedas_tc = SaveTimeAvgData(DaCycle,savedas_tc,avg) + savedas_tcext = SaveTimeAvgData(DaCycle,savedas_tcext,avg) - no, yes, all = range(3) - - proceed = no - - # first, parse results from the inverse part of the run - if proceed != all: - proceed = proceed_dialog('Create average 1x1 flux data files? [y|yes, n|no, a|all|yes-to-all ]') - if proceed != no: - while DaCycle['time.start'] < DaCycle['time.finish']: - - savedas=SaveWeeklyAvg1x1Data(DaCycle, StateVector) - savedas=SaveWeeklyAvgStateData(DaCycle, StateVector) - savedas=SaveWeeklyAvgTCData(DaCycle, StateVector) - savedas=SaveWeeklyAvgExtTCData(DaCycle) - - DaCycle.AdvanceCycleTimes() - - sys.exit(2) - - a=SaveTimeAvgData(rundat,savedas,avg='monthly') - a=SaveTimeAvgData(rundat,savedas,avg='yearly') - a=SaveTimeAvgData(rundat,savedas,avg='longterm') - - if proceed != all: - proceed = proceed_dialog('Create average tc flux data files? [y|yes, n|no, a|all|yes-to-all] ') - if proceed != no: - a=SaveTimeAvgData(rundat,savedas,avg='monthly') - a=SaveTimeAvgData(rundat,savedas,avg='seasonal') - a=SaveTimeAvgData(rundat,savedas,avg='yearly') - a=SaveTimeAvgData(rundat,savedas,avg='longterm') - if proceed != all: - proceed = proceed_dialog('Create average extended tc flux data files? [y|yes, n|no, a|all|yes-to-all] ') - if proceed != no: - savedas=SaveTCDataExt(rundat) - a=SaveTimeAvgData(rundat,savedas,avg='monthly') - a=SaveTimeAvgData(rundat,savedas,avg='seasonal') - a=SaveTimeAvgData(rundat,savedas,avg='yearly') - a=SaveTimeAvgData(rundat,savedas,avg='longterm') sys.exit(0) + -- GitLab