爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 59825|回复: 58

[分享资料] 【已解决】参考清风大侠的《fortran+grads站点作图详解》,生成站点映射文件(*map)时

  [复制链接]
发表于 2013-4-21 16:46:43 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 shirly 于 2013-8-30 09:24 编辑

参考清风大哥的《fortran+grads站点作图详解》,我做的只有地面数据的多时次站点作图,把主要的步骤和脚本写出来。
(1)用fortran生成符合grads要求的站点文件,我这样写的:
open(12,file='sta2grdx.grd',status='replace',form='binary')
do t=1,720
tim=0.0
nlev=1
flag=1
do in=1,n
write(12) stid(in),lat(in),lon(in),tim,nlev,flag,dswr(in,t)
end do
nlev=0
write(12) stid,lat,lon,tim,nlev,flag
end do
close(12)
!n为总站点数

(2)上面生成的sta2grdx.grd数据文件对应的ctl为sta2grdx.ctl,具体如下:

DSET D:/lw/dat/inter/sta2grdx.grd
Dtype station
stnmap D:/lw/dat/inter/sta2grdx.map
undef -9999.0
title station data sample
tdef 720 linear 00Z01jan1950 1mo
vars 1
dswf 0 99 dswf data
endvars



(3)用上面的ctl文件生成地图信息,我在grads中输入的命令如下:

!stnmap -i d:/lw/dat/inter/sta2grdx.ctl

运行结果如下:
ga->!stnmap -i d:/lw/dat/inter/sta2grdx.ctl
  Name of binary data set: D:/lw/dat/inter/sta2grdx.grd
  Number of surface variables:1
  Number of level dependent variables:0

Starting scan of station data binary file.
Binary data file open: D:/lw/dat/inter/sta2grdx.grd

Processing time step 1
  Invalid station hdr found in station binary file
  Possible cause: Invalid level count in hdr
                        Descriptor file mismatch
                        File not station data
                        Invalid relative time
        levs=538976288  flag=540291120     time=1.51778e-19
ga->
我用红色标注这部分应该是出错信息,可是感觉fotran生成grads的站点数据的写法没有错啊~
请教大侠~不甚感激~!


密码修改失败请联系微信:mofangbao
发表于 2014-4-2 13:33:36 | 显示全部楼层
mofangbao 发表于 2013-4-21 18:19
你的lat lon是数组,
write(12) stid,lat,lon,tim,nlev,flag
每个时次结束后的那句话就不能这么写,你这 ...

我也出现这样的问题哇,看了很多帖子,还是没搞清楚是哪里出了问题,这是我的fortran
Program sta2grd
parameter (ns=2109)
!这里是程序的变量声明
character*8 stid(ns)
real lat(ns),lon(ns),var(ns),rain(ns),tim
integer nlev,flag
!变量声明结束
!程序开始
!读取变量
open(1,file='F:\date\MicapsRain\R6\13081308.txt',form='formatted',status='old')
do i=1,ns
        read(1,*)stid(i),lat(i),lon(i),var(i),rain(i)
end do
close(1)
!读取结束
!写入数据
open(2,file='F:\date\MicapsRain\R6\13081308.dat',status='replace',form='binary')
tim=0.0
nlev=1
flag=1
do i=1,ns
write(2)stid(i),lat(i),lon(i),var(i),tim,nlev,flag,rain(i)
end do
nlev=0
flag=0
write(2)stid(ns),lat(ns),lon(ns),tim,nlev,flag
close(2)
!写入结束
!程序结束
end

ctl:
dset F:\date\MicapsRain\R6\13081308.dat
dtype station
STNMAP F:\date\MicapsRain\R6\13081308.map
undef -999.0
title 13081308 Rain Data Sample
tdef 1 linear 08Z13Aug2013 6hr
vars 1
rain 0 99 Rain Data
endvars


运行了之后是这样的:
ga-> ! stnmap -i F:/date/MicapsRain/R6/13081308.ctl
  Name of binary data set: F:\date\MicapsRain\R6\13081308.da
  Number of times in the data set: 1
  Number of surface variables: 1
  Number of level dependent variables: 0

Starting scan of station data binary file.
Binary data file open: F:\date\MicapsRain\R6\13081308.dat

Processing time step 1
  Invalid station hdr found in station binary file
  Possible causes:  Invalid level count in hdr
                    Descriptor file mismatch
                    File not station data
                    Invalid relative time
    levs = 0  flag = 1  time = 101

求帮忙解答一下,谢谢
密码修改失败请联系微信:mofangbao
回复 支持 2 反对 0

使用道具 举报

发表于 2013-4-21 18:29:59 | 显示全部楼层

为什么感觉看f90程序设计里面关于文件的打开关闭那么多复杂。。。我感觉脑袋大了,可否只是从例子学习,因为看实例的时候 感觉没有那么多东西
密码修改失败请联系微信:mofangbao
回复 支持 0 反对 1

使用道具 举报

0
早起挑战累计收入
发表于 2013-4-21 18:19:06 | 显示全部楼层

回帖奖励 +1 金钱

你的lat lon是数组,
write(12) stid,lat,lon,tim,nlev,flag
每个时次结束后的那句话就不能这么写,你这样写入的不是一个数,而是数组里面的所有值
改成
stid(in-1),lat(in-1),lon(in-1)
如果你的变量定义什么都没问题的话,就应该对了

点评

请先学习如何提问: 5.0
为什么有个“请先学习如何提问”呢~!好吧~  发表于 2013-4-21 22:35
请先学习如何提问: 5
清风大哥给力~!  发表于 2013-4-21 22:34
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

发表于 2014-7-13 20:09:39 | 显示全部楼层
mofangbao 发表于 2013-4-21 19:09
那本书里面本身就有很多实例,看不懂是因为你没自己敲代码,把书上的代码一句句的敲进去,在这个过程中你 ...

fortran关于文件打开关闭中的关键字很多。我在编写程序时,即使使再简单的文件,我也严格按照书上的要求来做,一说明自己对这些关键字的理解程度,二是它可以帮助你养成良好的变成习惯,三是可以帮助你检查到一些因为粗心大意造成的错误。
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

0
早起挑战累计收入
发表于 2013-4-21 19:09:31 | 显示全部楼层
SKSY 发表于 2013-4-21 18:29
为什么感觉看f90程序设计里面关于文件的打开关闭那么多复杂。。。我感觉脑袋大了,可否只是从例子学习,因 ...

那本书里面本身就有很多实例,看不懂是因为你没自己敲代码,把书上的代码一句句的敲进去,在这个过程中你就会有很多收获,自己敲过一遍之后再去看看刚才看不懂的文字
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2013-4-21 19:32:03 | 显示全部楼层
mofangbao 发表于 2013-4-21 18:19
你的lat lon是数组,
write(12) stid,lat,lon,tim,nlev,flag
每个时次结束后的那句话就不能这么写,你这样 ...

先谢谢清风大哥了~变量定义都是按大哥帖子上的定义的~
循环里面的write(12) stid,lat,lon,tim,nlev,flag,写的是对应的第in个站点的信息是吗?
大哥的建议是"stid(in-1),lat(in-1),lon(in-1)“,如果按上面的理解的话,我觉得是in,为什么括号里是in-1呢?

密码修改失败请联系微信:mofangbao
0
早起挑战累计收入
发表于 2013-4-21 20:18:18 | 显示全部楼层
shirly 发表于 2013-4-21 19:32
先谢谢清风大哥了~变量定义都是按大哥帖子上的定义的~
循环里面的write(12) stid,lat,lon,tim,nlev,flag ...

我是说你最内的一个循环每次结束之后的那个write要改,in=1,n里面的是不用改的
因为内层的do循环结束之后,in的值是n+1,所以要-1,要不然访问数组就溢出了
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2013-4-21 21:40:37 | 显示全部楼层
mofangbao 发表于 2013-4-21 20:18
我是说你最内的一个循环每次结束之后的那个write要改,in=1,n里面的是不用改的
因为内层的do循环结束之后 ...

先谢谢你的回复,十分感谢~
我按清风大哥的改了,可以出来了,我在想那我也可以直接在把nlev=0后面那一行这样写:
write(12) stid(n),lat(n),lon(n),tim,nlev,flag
因为in-1等于n~
这样应该也对吧
密码修改失败请联系微信:mofangbao
0
早起挑战累计收入
发表于 2013-4-22 09:15:38 | 显示全部楼层
shirly 发表于 2013-4-21 21:40
先谢谢你的回复,十分感谢~
我按清风大哥的改了,可以出来了,我在想那我也可以直接在把nlev=0 ...

在你这种情况下是对的
密码修改失败请联系微信:mofangbao
发表于 2014-7-13 18:02:25 | 显示全部楼层
我也一直写不出来
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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