|
#!/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)
|
|
|
|
|
|
|