登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 做个霸气的木头 于 2012-9-11 15:09 编辑
论坛里常常有人对nc这种内置ctl的文件数据处理 提出问题,这里总结下常见的一些问题及对策。 nc数据是一类内置ctl的文件,也就说没有独立的ctl文件,那么打开命令也不是常见的open,而是sdfopen命令,那么要处理这类数据就得知道变量名、变量层次分布等信息,用q ctlinfo命令就可以查看全部的ctl了。 为什么提查看ctl 呢,很多人在处理这类数据的时候会想当然的认定一个变量名,缺省值、甚至精度都会不注意,那么无论怎么提取,出来的图都不会对的。 下面总结下容易出的问题: 1、从nc文件提取出二进制数据(fwrite)设定 需要注意经纬度,层次,时间是否是你需要的部分,尤其是用循环提取数据的朋友,尤其要注意。有的时候设定经纬度(set lat 0 359.8)出了问题,可是尝试定义x y格点(set x 1 180)的方法试试,实在不行,可以用循环来输出不同的经纬度的数值。 2、注意提取数据的grads命令 'set gxout fwrite' 'set fwrite c:\ss00.grd' . . . . 'disablefwrite' 最后一行的这个命令,如果忘了加就容易数据不正常,还有的朋友,一个gs文件提取了两个数据文件,两组这类命令中间那个disable fwrite丢掉了,数据就彻底乱套了。 3、提取的数据,写ctl,需要注意与nc的ctl对应,包括缺测值,精度,这个问题只要照着nc的ctl写,层次格点什么的写成你数据对应的就好了。 4、数据提取了,ctl写好了,画画图看是不是与nc的一致,设定的时间、层次,图是不是不一样,因为用循环出数据的朋友容易犯 写了好几个时间点,数据是一样的错误。 5、还有的朋友需要进一步提取这个grd或者dat文件,这就涉及到二进制数据的读取与操作问题了。 二进制数据是无格式的数据,读取与写入都不需要格式说明,里面的数据无法直接看到,其内部无非是0和1,而且数据之间没有间隔,读取写入只要read(文件号) write(文件号)就好 读取种要注意,grads写入的数据循环从内到外依次为x 、y、z、变量、t,如果你需要确定某个数据的位置,那么,x是从西到东,y是从南到北,z是从地面到高空,t是从前到后的顺序。
另外此类文件读取目前论坛里主要有两种方法,一种是直接声明form=’binary’的,这种形式简单,如果数据是常规的顺序读取,选择binary读取方法简单的多,也不容易出错。如下面这段: program ex01 real ss(360,180) integeri,j open(100,file='s01.dat',form='binary') open(200,file='data0.txt') doj=1,180 read(100) (ss(i,j),i=1,360) write(200,*)(ss(i,j),i=1,360) write(*,*) j," ",ss(1,j) enddo end 另一种是无格式直接读取的方式,无格式直接读取主要是用于大量的数据需要处理,你只需要其中部分,可以用记录的跳跃选取你要的数据,如下面这段: program readsst integer,parameter:: ix=360,iy=180,iz=7 real sst(ix,iy,iz) open(9,file='f:\sam\areacc\hadleycenter\sst_update.dat',form='unformatted',access='direct',recl=ix*iy*4) read(9,rec=1) ((sst(i,j),i=1,ix),j=1,iy) write(*,*) sst end 最后总结下检查错误的思路: 1、数据没提取出来,先检查gs是否没有写disable fwrite,或者文件名.grd写错了; 2、数据出来后,ctl写好,画图与nc对比,如果发现,出来的图上只有个别区域有大条粗线,整幅图都是黑的,说明你的ctl里缺测值或者精度不够对应,q ctlinfo 查询下; 3、图对应上了,改变设定时间或层次,没有变化,说明,你提取数据的gs错了,层次或者时间都是输出的同一个点; 4、前三步都没有问题,恭喜你,数据提取成功了。Fortran编程的时候如果报错说endof file during read,很可能是你文件名错了,或者你的你读取数据的顺序不是按照grads的数据顺序读的,检查你的各个循环的次数,及循环的嵌套顺序是否正确。 5、如果你是顺序的读取数据的话,建议你选择binary的方式读取,犯错几率要小; 6、如果以上,还是报错,剩下的原因就可能是你马虎导致微小的错误了,你要认真的从头到尾检查程序,不行就让别人给你检查,因为有些问题太细微了,自己已经习惯了。 |