爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 2954|回复: 8

[求助] FORTRAN读MICAPS数据报错 求大神

[复制链接]

新浪微博达人勋

发表于 2016-1-10 17:04:14 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 海soso 于 2016-1-10 17:08 编辑

小白一枚 借鉴了平流层的萝卜大大读MICAPS数据的帖子http://bbs.06climate.com/forum.p ... 13422&extra=&page=1我想把年份和月份也输出 就报错了 求大神们帮看一下
程序:
parameter(nt=1460)
         integer::n,num
       real,allocatable::lon(:),lat(:),vi(:)
                                                !动态数组分别用来储存站点的经纬度和能见度值
       real:: temp(14)
       character*8,allocatable::sta(:),yr(:,:),mon(:,:)  
                                                 !动态数组,储存站号,站号必须是8个字符,5个的话会stnmap出不出                     
       character*12 filename(nt)        !用于储存1460个时次的文件名

       open(11,file='d:/wu/data1/1994/1994.txt')
        do i=1,nt
         read(11,*) filename(i)
         print*,filename(i)
        enddo
       close(11)               
       open(12,file='d:/wu/vis1994.grd',form='unformatted')
         open(13,file='d:/wu/vis1994.txt')         !储存1460个时次的能见度场
        do k=1,nt
         print*,'文件数',k
           open(11,file='d:/wu/data1/1994/'//filename(k))
         read(11,*)
         read(11,*) n,n,n,n,n        !将该时次的站点数赋值于n
         allocate(lat(n))
         allocate(lon(n))
         allocate(vi(n))
         allocate(sta(n))
         allocate(yr(nt,n))
         allocate(mon(nt,n))
         !print*,n

         close(11)
         open(11,file='d:/wu/data1/1994/'//filename(k)) !获知n后,重新读取。
         read(11,*)
         read(11,*)
          do i=1,n            
                                    !只读能见度,风速暂略     此循环为该时次的站点循环
           read(11,*) sta(i),lon(i),lat(i),(temp(j),j=1,14),vi(i)
           yr(k,i)=filename(k)(1:2)
           mon(k,i)=filename(k)(3:4)

           !print*,vi(i)

            write(12)   sta(i),lat(i),lon(i),yr(k,i),mon(k,i),vi(i)
              write(13,*) sta(i),lat(i),lon(i),yr(k,i),mon(k,i),vi(i)  

          enddo

           close(12)
         close(13)
        !一个时次的能见度场输入完毕
        deallocate(lat)
        deallocate(lon)
        deallocate(vi)
        deallocate(sta)
        close(11)
        enddo
        end

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-1-10 17:08:08 | 显示全部楼层
附上FORTRAN报错提示 应该是动态数据的问题。。。不知道怎么改==
QQ图片20160110165522.jpg
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-1-10 18:43:27 | 显示全部楼层
你的数组分配后没有释放。   
   allocate(lat(n))
   allocate(lon(n))
   allocate(vi(n))
   allocate(sta(n))
   allocate(yr(nt,n))
   allocate(mon(nt,n))
与下面不对应,下面应再加两个语句
  deallocate(yr)
   deallocate(mon)
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-1-10 20:40:32 | 显示全部楼层
四叶草 发表于 2016-1-10 18:43
你的数组分配后没有释放。   
   allocate(lat(n))
   allocate(lon(n))

谢谢啦 我加上这二句后 发现不报错了 但是只生成了包含一个时次的文件就结束了。。。应该运行1460个时次的呀。。。这是怎么回事呢 是加的位置不对吗
附上加了以后的程序:
  parameter(nt=1460)
         integer::n,num
       real,allocatable::lon(:),lat(:),vi(:)
                                                !动态数组分别用来储存站点的经纬度和能见度值
       real:: temp(14)
       character*8,allocatable::sta(:),yr(:,:),mon(:,:)  
                                                 !动态数组,储存站号,站号必须是8个字符,5个的话会stnmap出不出                     
       character*12 filename(nt)        !用于储存1460个时次的文件名
      
       open(11,file='d:/wu/data1/1994/1994.txt')
        do i=1,nt
         read(11,*) filename(i)
         !print*,filename(i)
        enddo
       close(11)               
       open(12,file='d:/wu/vis1994ym.grd',form='unformatted')
         open(13,file='d:/wu/vis1994ym.txt')         !储存1460个时次的能见度场
        do k=1,nt
         print*,'文件数',k
           open(11,file='d:/wu/data1/1994/'//filename(k))
         read(11,*)
         read(11,*) n,n,n,n,n        !将该时次的站点数赋值于n
         allocate(lat(n))
         allocate(lon(n))
         allocate(vi(n))
         allocate(sta(n))
         allocate(yr(nt,n))
         allocate(mon(nt,n))
         !print*,n
         
         close(11)
         open(11,file='d:/wu/data1/1994/'//filename(k)) !获知n后,重新读取。
         read(11,*)
         read(11,*)
          do i=1,n            
                                    !只读能见度,风速暂略     此循环为该时次的站点循环
           read(11,*) sta(i),lon(i),lat(i),(temp(j),j=1,14),vi(i)
           yr(k,i)=filename(k)(1:2)
           mon(k,i)=filename(k)(3:4)
          if(vi(i)==9999) then !若为缺测站点,直接pass
           continue
            else        !不是缺测站点
             num=1
             endif
      
           !print*,vi(i)
               
           if(num==1) then   
            tim=0.0;nlev=1;nflag=1
            !write(12)   sta(i),lat(i),lon(i),tim,nlev,nflag,vi(i)
              !write(13,*) sta(i),lat(i),lon(i),tim,nlev,nflag,vi(i)
            write(12)   sta(i),lat(i),lon(i),yr(k,i),mon(k,i),vi(i)
              write(13,*) sta(i),lat(i),lon(i),yr(k,i),mon(k,i),vi(i)  
           endif
          enddo
       nlev=0
       write(12) sta(n),lat(n),lon(n),tim,nlev,nflag
           close(12)
         close(13)        !一个时次的能见度场输入完毕
        deallocate(lat)
        deallocate(lon)
        deallocate(vi)
        deallocate(sta)
        deallocate(yr)
        deallocate(mon)
        close(11)
        enddo
        
        end
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-1-10 22:09:06 | 显示全部楼层
四叶草 发表于 2016-1-10 18:43
你的数组分配后没有释放。   
   allocate(lat(n))
   allocate(lon(n))

恩 问题已经都解决了!谢谢~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-1-10 22:41:22 | 显示全部楼层
最后怎么解决的呢
密码修改失败请联系微信:mofangbao
ciompdgx 该用户已被删除
发表于 2016-1-11 15:01:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-1-11 15:22:40 | 显示全部楼层
飘过~~大神快快出现
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-1-11 21:08:25 | 显示全部楼层
本帖最后由 海soso 于 2016-1-12 18:22 编辑

删掉close(12)和close(13)就好了 外层的循环就可以了
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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