- 积分
- 4493
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2011-8-19
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 黎大页子 于 2012-5-5 21:50 编辑
有的NetCDF文件不符合COARES约定,不能用sdfopen直接打开,需要自己配写ctl文件。详见兰溪的帖子【免费派送】“SDF file has no discernable X coordinate” 问题详解http://bbs.06climate.com/forum.php?mod=viewthread&tid=6008&fromuid=1368
但是网上下载数据的多半是一年一个nc文件,如果是日资料,需要判断闰年,这种情况我不会用一个ctl描述全部文件。一个一个写又太麻烦。所以可以用Fortran批量生产。
1.先在excel里面写好要生产的ctl路径+文件名,斜杠一定要用“\”,用"/"Fortran读的时候会出错,然后Ctrl+下拉.....
2.复制放进namelist.txt,然后用fortran读namelist,读了路径+文件名放进数组name()里面。
3.加入闰年判断子程序
4.依次把ctl文件内容write进去,运行就可以看见可爱的ctl们一个一个自己蹦出来啦,真是神清气爽。
程序很简单,唯一让我百度了一下的地方是不换行的问题,有一个现成的advance=“no”,很好用。advance是write()里面的控制语句,默认为yes,也就是换行,改成no可以接着往下写,但是一定要指明写的内容的格式。
这个问题不难,经验总结比较弱,自己mark下来,也给同为小白的同志们共勉。
PS:后来发现,其实GrADS考虑了闰年的情况,所以无论是日资料,还是月资料,都可以一个ctl搞定,详见
http://bbs.06climate.com/forum.php?mod=viewthread&tid=6663
但是因为我的数据处理是每年分开做的,所以ctl分开比较方便,不然每次还要掐着指头算第X年在几千天当中究竟是哪一段.....大家根据自己数据处理的需要选择合适的方法吧。
- !This program is to write ctl for monthly mean documents:''sh/lh_oaflux_xxxx.nc''
- Program writectl
- implicit none
- integer::i,j,y,var,days
- character(len=100)::name(54)
- open(10,file='e:/thesis/lh/ctl_name.txt')!读取批处理文件名
- rewind(10)
- do i=1,26,1
- y=1985+i-1
- call year(y,days)
- read(10,*)name(i) !把文件名放入数组
- !----写文件--------------------------------------------
- write(*,*)name(i)
- open(37,file=name(i),form='formatted',iostat=var)
- write(37,'(a)',advance="no")'dset e:/thesis/lh/lh_oaflux_'
- write(37,'(i4)',advance="no")y
- write(37,'(a)',advance="no")'.nc'
- write(37,*)'title monthly mean surface latent heat flux'
- write(37,*)'undef 32766'
- write(37,*)'xdef lon 360 linear 0.5 1.0'
- write(37,*)'ydef lat 180 linear -89.5 1.0'
- write(37,'(a)',advance="no")'tdef time '
- write(37,'(i3)',advance="no")days
- write(37,'(a)',advance="no")' linear 00Z01JAN'
- write(37,'(i4)',advance="no")y
- write(37,*)'1dy'
- write(37,*)'vars 2'
- write(37,*)'lhtfl=>lhtfl 0 99 daily mean surface latent heat'
- write(37,*)'err=>err 0 99 daily mean estimated error of latent heat'
- write(37,*)'endvars'
- !---------------------------------------------------------
- close(37)
- end do
- close(10)
- stop
- end
- !闰年判断-------------------------------
- subroutine year(m,dys)
- implicit none
- integer::m,dys
- dys=365
- if(mod(m,100)==0)then
- if(mod(m,400)==0)then
- dys=dys+1
- end if
- else
- if(mod(m,4)==0)then
- dys=dys+1
- end if
- end if
- return
- stop
- end subroutine
- end
|
评分
-
查看全部评分
|