Project

General

Profile

RE: Chaining more than 64 operators ยป extract.py

Leo van Kampenhout, 2015-09-07 17:59

 
#!/bin/env python
#
# Collection of python functions to extract variables from CESM history files.
#
# TODO list:
# add support for daily files
#

import sys
import subprocess
import os
import glob

def driver(base,case,midfix,vars,ys,ye,outdir):
infiles = []
for year in range(int(ys), int(ye)+1): # ye+1 is not included in range
print('year = '+format(year,'04d'))
infiles_year = (glob.glob(base+'/'+case+midfix+format(year,'04d')+'*.nc'))
if (len(infiles_year) != 12):
print(infiles_year)
sys.exit('ERROR: not enough monthly files found for year = '+str(year))
infiles.extend(infiles_year)

infiles = sorted(infiles) # sort by month

for var in vars:
monfile=outdir+"/"+var+"_"+case+'_moncat.nc'
if not os.path.isfile(monfile):
concatenate_var_cdo(var,infiles,monfile)

mean1=outdir+"/"+var+"_"+case+'_ymonmean.nc'
mean2=outdir+"/"+var+"_"+case+'_timmean.nc'
mean3=outdir+"/"+var+"_"+case+'_yearmean.nc'

if not os.path.isfile(mean1):
arg = ['cdo','ymonmean',monfile,mean1]
subprocess.check_call(arg,stderr=subprocess.STDOUT)
print("INFO: created "+mean1)

if not os.path.isfile(mean2):
arg = ['cdo','timmean',monfile,mean2]
subprocess.check_call(arg,stderr=subprocess.STDOUT)
print("INFO: created "+mean2)

if not os.path.isfile(mean3):
arg = ['cdo','yearmean',monfile,mean3]
subprocess.check_call(arg,stderr=subprocess.STDOUT)
print("INFO: created "+mean3)

def concatenate_var_cdo(var, infiles, outfile):
print(var)

arg = ['cdo','-L','-cat']
for file in infiles:
arg.append('-selvar,'+var)
arg.append(file)
arg.append(outfile)

subprocess.check_call(arg,stderr=subprocess.STDOUT)
#subprocess.call(arg,stderr=subprocess.STDOUT)
print("INFO: created "+outfile)


if __name__ == "__main__":

# general
case = os.path.expandvars('$CASE')
outdir = os.path.expandvars('$OUTDIR')
ys = os.path.expandvars('$YS')
ye = os.path.expandvars('$YE')

# CLM
clm_base = os.path.expandvars('$CLM_BASE')
clm_vars = os.path.expandvars('$CLM_VARS').split()
driver(clm_base,case,'.clm2.h0.',clm_vars,ys,ye,outdir)

# CAM
cam_base = os.path.expandvars('$CAM_BASE')
cam_vars = os.path.expandvars('$CAM_VARS').split()
#driver(cam_base,case,'.cam.h0.',cam_vars,ys,ye,outdir)



    (1-1/1)