爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4379|回复: 7

[脚本编辑] 【求助】用grads从nc数据中提取部分资料并处理成grd文件遇到的问题

[复制链接]
发表于 2017-3-30 18:16:31 | 显示全部楼层 |阅读模式

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

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

x
我下载的nc文件是从1982年12月开始的海温月平均逐月资料,一共是423个月,我想提取其中1982年1月到2016年12月的资料,这里总共35年,所以我写了个gs文件来处理,以下是我的gs文件
'reinit'
'sdfopen g:\shuju\sst.mnmean.nc'
'set fwrite g:\shuju\sstmon.grd'
'set gxout fwrite'
'set lon 0 359'
'set lat -89.5 89.5'
i=2
while(i<=421)
'set t 'i
'd sst'
i=i+1
endwhile
'disable fwrite'
;
然后我得出的grd文件我相应的写了ctl文件和gs文件去提取其中某月份的图像,然后同一个月得出的图像和原nc文件的图像是一样的,所以我认为我这边提取数据应该是没有问题的了,但是在接下来用fortran程序去读取grd文件的时候,我设置的数组是sst(360,180,12,35){这里我也试过sst(361,180,15,35),程序没有报错,但是运行之后总会提醒我数组越界,折腾了几天没有找到原因,所以想请大家帮帮忙看看。

这是我下载的nc文件的信息

这是我下载的nc文件的信息
密码修改失败请联系微信:mofangbao
发表于 2017-3-30 18:57:26 | 显示全部楼层
set lon 0 360吧
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2017-3-30 19:37:52 | 显示全部楼层

谢谢回答,不过这个我问了老师,是老师让我改成0 359的,因为老师说0和360是同一个点所以应该是359,并且我之前用0 360的时候出来的图两份数据也不一样
密码修改失败请联系微信:mofangbao
发表于 2017-3-30 20:22:31 | 显示全部楼层
感觉没错呀,你把你fortran程序和报错发来看看
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2017-3-30 20:28:23 | 显示全部楼层
oucdaqi 发表于 2017-3-30 20:22
感觉没错呀,你把你fortran程序和报错发来看看

program ex01
parameter(mon=1,year=1)
real sst(361,180,12,35),ssta(361,180),ave(361,180,12)
integer i,j,im,iy
open(2,file='g:\shuju\sstmon.grd',form='binary')!读取海温数据
open(3,file='g:\shuju\ssta.grd',form='binary')!海温距平数据输出

do iy=1,35
do im=1,12
do j=1,180
do i=1,361
read(2)sst(i,j,im,iy)
enddo
enddo
enddo
enddo

!将数据存放进数组
do im=1,12
do i=1,361
do j=1,180
do iy=1,35
ave(i,j,im)=ave(i,j,im)+sst(i,j,im,iy)
enddo
enddo
enddo
ave(i,j,im)=ave(i,j,im)/35
enddo


!求距平
do i=1,361
do j=1,180
ssta(i,j)=sst(i,j,mon,year)-ave(i,j,mon)
enddo
enddo

!写入温度距平数据
write(3)((ssta(i,j),i=1,361),j=1,180)

close(2)
close(3)

end
这是fortran程序

这是运行之后的提示框

这是运行之后的提示框
密码修改失败请联系微信:mofangbao
发表于 2017-3-30 20:46:19 | 显示全部楼层
首先这一句ave(i,j,im)=ave(i,j,im)/35应该放在该块第一个enddo下面。
如果你只是想去掉季节平均,建议你直接用grads做这件事,既然你grd的ctl已经编好了,写段gs即可
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2017-3-30 20:51:35 | 显示全部楼层
oucdaqi 发表于 2017-3-30 20:46
首先这一句ave(i,j,im)=ave(i,j,im)/35应该放在该块第一个enddo下面。
如果你只是想去掉季节平均,建议你 ...

谢谢回答我去尝试一下
这个程序只是想尝试一下看处理的数据有没有问题,我最后是要做距平合成分析,grads学的不是很好不太会用grads的函数
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2017-3-30 20:54:24 | 显示全部楼层
oucdaqi 发表于 2017-3-30 20:46
首先这一句ave(i,j,im)=ave(i,j,im)/35应该放在该块第一个enddo下面。
如果你只是想去掉季节平均,建议你 ...

十分感谢!确实这样就得出结果了!折腾几天了原来是这样,我一直以为是我转换数据的时候出了问题
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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