爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14534|回复: 22

[分享资料] 【已解决】grads循环中,每隔24个数相加之后求平均出错。

[复制链接]
发表于 2013-9-1 13:22:01 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 shirly 于 2013-9-2 08:57 编辑

我的数据是浅层地温,共六层,每小时测一次,共2011年一年的。想从中每隔24小时提取出地温相加,再求平均,最终求出一天之中每小时地温的平均状态。但出错了,希望能得到前辈的指点~不胜感激~!

数据的说明文件格式:
dset d:/shirly/dat/minqing/dat/A52681-2011.dat
title The ground routine data
undef  99999.0
xdef 1 linear 103.08 1
ydef 1 linear 38.62 1
zdef 6 linear 1 6
tdef 8760 linear 20:00Z31dec2010 1hr
vars 1
DB 6 99 The shallow ground temperature 0mm 5mm 10mm 15mm 20mm 40mm
endvars


提取数据的gs文件:
'reinit'
'open d:\shirly\dat\minqing\dat\A52681-2011.ctl'


i=0
while(i<=24)
s=0
n=1
'set gxout fwrite'
'set fwrite d:\shirly\dat\minqing\dat\A52681-2011.24h.dat'
'set x 1'
'set y 1'
while(n<=8760)
a=24*(n-1)+i
'set t 'a''
'set z 1 6'
s=s+DB
*DB表示浅层地温
'define b=s/365.0'
'd b'
n=n+1
endwhile
i=i+1
endwhile
'disable fwrite'
'reinit'


运行及出错信息:
->Run d:\shirly\dat\minqing\dat\A52681-2011.24fwrite.gs
No hardcopy metafile open
All files closed;all defined objects released;
All Grads attributes have been reinitialized
Non-numeric args to numeric operation
  Error occured on line 17
  In file d:\shirly\dat\minqing\dat\A52681-2011.24fwrite.gs

注:17行的命令是:s=s+DB

密码修改失败请联系微信:mofangbao
发表于 2013-9-1 14:32:33 | 显示全部楼层
楼主帖子里面的代码不知一处错误。以下是我个人的意见,如有不对的地方还请指教:
看你的代码,开头的说明应该是每隔24小时吧,
代码中n<=365吧,另外s是一个实数,而你的db是一个含有6层高度的数组,你如果这样定义s会有问题吧。
我认为楼主要实现的过程可以简单的写:
set t 1 24
set z 1 6
define var=ave(db,t+0,t=8760,24)
如果要显示变量的在某一层的温度,只需要:
set z **
d tloop(var)

密码修改失败请联系微信:mofangbao
 楼主| 发表于 2013-9-1 14:42:18 | 显示全部楼层

首先非常感谢你抽出宝贵的时间回复~!
n确实该是24
然后前辈说的define var=ave(db,t+0,t=8760,24)意思是求得这一天的地表温度平均值,我举个例子说明我的意思:比如,我想将每天2点的数据加起来,再除以365求得2点的平均值。
密码修改失败请联系微信:mofangbao
发表于 2013-9-1 14:46:42 | 显示全部楼层
这个ave表示从1到24,每隔24相加然后求平均,8760除以24不就是365嘛。当然你也可以sum(db,t+0,t=8760,24)/365.0  结果应该是一样的
密码修改失败请联系微信:mofangbao
发表于 2013-9-1 14:47:52 | 显示全部楼层
因为我设定的是set t 1 24 ,ave()中时间是t+0,t=8760,24
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2013-9-1 14:51:25 | 显示全部楼层
冬日情愫+ 发表于 2013-9-1 14:46
这个ave表示从1到24,每隔24相加然后求平均,8760除以24不就是365嘛。当然你也可以sum(db,t+0,t=8760,24)/3 ...

括号里的“t+0”和“t=8760”这种结合的用法以前没见过,所以理解不太透彻,我先试试把,感谢前辈了~!
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2013-9-1 15:08:16 | 显示全部楼层
冬日情愫+ 发表于 2013-9-1 14:47
因为我设定的是set t 1 24 ,ave()中时间是t+0,t=8760,24

按前辈的建议做了,能画出图了,物理上也能解释得通,嘿嘿,十分十分感谢前辈~!^^!{:eb511:}
密码修改失败请联系微信:mofangbao
发表于 2013-9-1 19:35:21 | 显示全部楼层
shirly 发表于 2013-9-1 14:51
括号里的“t+0”和“t=8760”这种结合的用法以前没见过,所以理解不太透彻,我先试试把,感谢前辈了~!{: ...

这个我记得grads教材里面有介绍吧。
密码修改失败请联系微信:mofangbao
发表于 2013-9-2 08:47:18 | 显示全部楼层
亲,为什么不直接在FORTRAN里面直接算出来需要的东西啊,这样多方便啊。
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2013-9-2 08:52:47 | 显示全部楼层
冬日情愫+ 发表于 2013-9-1 19:35
这个我记得grads教材里面有介绍吧。

我们当时上课用的“Grads使用手册”(LASG编的),我查的关于ave的函数只有下面的类型:ave(var,t=1,t=20)即时间从t=1时次到20时次对变量var求时间平均
ave(var,t=1,t=60,12)即从时间t=1到t=60以间隔12求变量var的时间平均
ave(mag(u,v),t-1,t+1)即对三个时次求变量mag(u,v)的时间平均,该三时次为当前维数环境的相对值。
sum确实有一个每隔一定的步长求和的,但是和前辈给的有点不同:sum(var,dim1,dim2,tincr),dim1、dim2分别为开始和结束的维数,tinc对时间求和时所对应的样本部长。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表