- 积分
- 46372
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2011-9-8
- 最后登录
- 1970-1-1
成长值: 19710
|
发表于 2016-3-21 18:40:29
|
显示全部楼层
测试了下,你生成二进制文件的效率太低了,在你的基础上,重新改了下,还有你原来的程序读取温度的数据是有问题的,因为你的温度数据存在-9997的值,猜测可能是缺测值,所以你这样读“read(12,'(a6,1x,i10,10x,f4.1)') id,date,temp”不是一个robust的做法,给你做了相应的修改~具体看
- program test
- Implicit none
- integer,parameter :: nstid = 512, nrecord = 226800
- Character*8 :: stid(nstid), id(nrecord)
- Real :: lon(nstid),lat(nstid),time,slp,temp(nrecord)
- integer :: nlev,nflag,i,j,it
- integer :: date(nrecord),dd,hh
-
- open(11, file='station.txt', form='formatted', status='old')
- do i=1, nstid
- read(11,*)stid(i),lon(i),lat(i)
- !write(*,*) stid(i),lon(i),lat(i)
- end do
- open(12,file='201511_auto_hr.txt',form='formatted',status='old')
- do j=1, nrecord
- !read(12,'(a6,1x,i10,10x,f4.1)') id(j),date(j),temp(j)
- read(12,*) id(j),date(j),slp,temp(j)
- if(abs(temp(j)+9997).lt.1.e-6) temp(j) = 99.99
- end do
-
- open(21,file='201511.dat',status='unknown',FORM='UNFORMATTED',ACCESS='STREAM')
- do it=1,720
- write(*,*) "time: ",it
-
- dd=int(it/24)
- hh=it-dd*24
- if(hh .eq. 0)then
- dd=int(it/24)-1
- hh=24
- end if
-
- time=0.
- nlev=1
- nflag=1
- do i=1, nstid
- do j=1, nrecord
- if(id(j) .eq. stid(i) .and. date(j) .eq. (2015110100+dd*100+hh)) then
- write(21) id(j),lat(i),lon(i),time,nlev,nflag,temp(j)
- exit
- end if
- end do
- end do
- nlev=0
- write(21) stid(nstid),lat(nstid),lon(nstid),time,nlev,nflag
- end do
- close(21)
-
- stop
- end
插值成网格数据是因为你的背景的网格分辨率太高(也就是格距太小),然后插值半径默认又太小,所以才会出现这样的结果~
可以把插值半径改大,比如'd oacres(g,temp.2,50,40,30,20,10,5,1)',当然我这是夸大了,或者你把背景的网格分辨率变粗一点,
比如把0.01改成0.1,即
xdef 220 linear 119.8 0.1
ydef 440 linear 21.9 0.1
当然最后还是自己慢慢调,自己觉得满意即可~Good luck!
@传说中的谁 @mofangbao 这活可好
|
|