GrADS ave,modify函数
参考自https://bbs.06climate.com/forum.php?mod=viewthread&tid=39555
ave()
ave(expr, dim1, dim2 <,tinc> <,-b>)
在给定的维范围内计算expr的均值。如果平均的维度是时间,需要制定一个备选的时间增量tincr
expr -任何有效的GrADS表达式
dim1 -平均的起始点
dim2 -平均的终止点
tinc -用于时间平均的增量
-b -使用在边界上
使用提示
averaging 的限制和间隔是根据默认文件的网格坐标来确定的。如果dim1和dim2是在世界坐标系中给定,坐标将基于默认文件的尺度转换到最近的整数格点坐标中。
终止点是给定了正常的权重,除非-b边界标志给定。边界标志说明平均值应当被使用在边界上通过dim1和dim2给定,而不是最近的网格点。平均值是根据格点距离去表示非线性格点距离。
为了计算平均值而且不要考虑纬度权重,则使用mean函数
在下面的例子中,xy变化,Z-T是固定的
考虑到下面的平均,默认的文件是1
ave(z.2,t=1,t=10)
对文件2的变量进行平均,但使用文件1的尺度。文件1有6h的时间间隔,但文件2有12h的时间间隔。平均值将会试图访问文件2对于那些实际上不存在的时次上,这样会有error发生。为了避免这个,需要设置默认的文件为文件2:set dfile 2
ave(z,t=1,t=120,4)
平均值仅仅会返回文件中00Z的值,因为时间间隔为4,也就是在这个文件中,是表示24h
如果你试图进行纬圈平均
ave(z,lon=0,lon=360)
世界坐标轴将会转换成格点坐标,其中X从1变化到181,在经度0(和360)上的格点值将会被计算两次,为了避免这个情况,使用-b标志:ave(z,lon=0,lon=360,-b)
ave(z,x=1,x=180)
可以对ave操作进行嵌套
ave(ave(z,x=1,x=180),y=1,y=46)
在这种情况下,将会进行区域平均。注意,对于区域平均,使用aave函数更好。
当进行嵌套平均时,嵌套的顺序将会对性能产生显著的影响。记住,在GrADS文件中数据的顺序:X变化是最快的,然后依次是Y,Z,T。当使用嵌套平均时,将变化最快的维度放在最内层的平均。
set lon -90
set lat -90 90
set lev 1000 100
d ave(ave(t,x=1,x=180),t=1,t=20)
这个平均将会比下面的更有效率,
ave(ave(t,t=1,t=20),x=1,x=180)
尽管最终的结果可能是一样的
使用define命令可以让一些操作更加高效。如果你想计算标准偏差,例如:
sqrt(ave(pow(ave(z,t=1,t=20)-z,2),t=1,t=20)
可以变得很正确,但是内层的平均值将会被重复计算20次。提前定义平均值将会显著的更快
define zave=ave(z,t=1,t=20)
d sqrt(ave(pow(zave-z,2),t=1,t=20))
modify
modify varname type
这个命令定义了一个气候类型的变量,它是年-独立的。varname是一个定义的网格。type有两种选项:
seasonal -用于创建逐月的或者多月的气候态
diurnal -用于创建一个小于1天时间段的气候态
例子
假设有一个50年时间序列的逐月的海平面温度(一个具有600个时次,名为sst的变量),你想要创建一个气候态,然后想要看看逐月的异常值。
首先,设置时间范围1到12,用来覆盖一个完整的年;
然后,定义变量'sstclim',这个变量将第一个时间步中包含1月的平均,第2个时间步中包含2月的平均,等等。
使用'modify'将sstclim转换成季节的变量。这意味着和'sstclim'(在原始的sst数据集的第一年)相关的日历年将会变成一个回环的年。
然后你可以定义异常值,通过将原始数据减去气候态数据。命令如下:
'set t 1 12'
'define sstclim = ave(sst,t+0,t=600,12)'
'modify sstclim seasonal'
'set t 1 last'
'define anom = sst -sstclim‘