GrADS ave,modify函数

发布时间 2023-10-31 21:06:48作者: chinagod

参考自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‘