爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8114|回复: 14

[求助] fnl资料提取的dat数据用fortran无法处理

[复制链接]
发表于 2013-5-15 13:01:17 | 显示全部楼层 |阅读模式

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

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

x
这是我的fnl资料数据提取的gs文件:
'reinit'
*td=01
*while(td<=10)
*h=00
*while(h<=18)

'open f:\fnl\fnl_20110608_00_00_c.ctl'
'open f:\fnl\fnl_20110608_06_00_c.ctl'
'open f:\fnl\fnl_20110608_12_00_c.ctl'
'open f:\fnl\fnl_20110608_18_00_c.ctl'
'open f:\fnl\fnl_20110609_00_00_c.ctl'
'open f:\fnl\fnl_20110609_06_00_c.ctl'
'open f:\fnl\fnl_20110609_12_00_c.ctl'
'open f:\fnl\fnl_20110609_18_00_c.ctl'
'open f:\fnl\fnl_20110610_00_00_c.ctl'
'open f:\fnl\fnl_20110610_06_00_c.ctl'
'open f:\fnl\fnl_20110610_12_00_c.ctl'
'open f:\fnl\fnl_20110610_18_00_c.ctl'
'open f:\fnl\fnl_20110611_00_00_c.ctl'
'open f:\fnl\fnl_20110611_06_00_c.ctl'
'open f:\fnl\fnl_20110611_12_00_c.ctl'
'open f:\fnl\fnl_20110611_18_00_c.ctl'



'set fwrite f:\u.dat'
'set gxout fwrite'
i=1
while(i<=16)
'set dfile 'i''




z1=1
  while(z1<=21)
'set z 'z1''
'set lon 0 180'
'set lat 0 90'
*'define t=TMPprs'
*'d t'
'd TMPprs'
z1=z1+1
endwhile



i=i+1
endwhile
'disable fwrite'
*'reinit'
*  h=h+6
*endwhile
*td=td+1
*endwhile
;

*pull dummy
生成了u.dat(纬向风速)这个文件
同理还生成了v.dat(经向风速)和t.dat(温度分布)
然后用以下这个Fortran程序处理这些数据,想要得到温度平流结果出错:forrtl:severe(257):formatted i/o to unit open for unformatted transfers ,unit 1,file:\t.dat
程序如下:
program main
implicit none
integer nx,ny,nz,nt
parameter (nx=181,ny=91,nz=26,nt=16)
integer i,j,k,t,irec
real Temp(nx,ny,nz,nt)
real ATemp(nx,ny,nz,nt)
real U(nx,ny,nz,nt)
real V(nx,ny,nz,nt)  
real lat(ny)
real dx,dy
open(1,file="f:\t.dat",form='unformatted')  
do t=1,nt
do k=1,nz   
do j=1,ny
read(1,*)(temp(i,j,k,t),i=1,nx)   
enddo
end do
end do
close(1)

print *,temp(5,6,5,3) ,temp(5,6,7,3) ,temp(5,6,8,3),temp(5,6,9,3)
!      /*  读入水平风速数据U  */
open(2,file="f:\u.dat",form='unformatted')  
do  t=1,nt
do k=1,nz   
do j=1,ny
  read(2,*)(U(i,j,k,t),i=1,nx)   
enddo
enddo
enddo
close(2)
!      /*  读入水平风速数据V  */
open(3,file="v.dat",form='unformatted')
do  t=1,nt
do k=1,nz   
do j=1,ny
  read(3,*)(V(i,j,k,t),i=1,nx)   
enddo
enddo
enddo
close(3)
do j=1,ny
  lat(j)=float(j-1)*1.0   
enddo
do t=1,nt
do k=1,nz
  do j=2,ny-1
  dx=6371000*cos(lat(j)*3.14/180)*3.14/180
  dy=6371000*3.14/180
  do i=2,nx-1
  ATemp(i,j,k,t)=U(i,j,k,t)*(Temp(i-1,j,k,t)-Temp(i+1,j,k,t))/(2*dx)+V(i,j,k,t)*(Temp(i,j-1,k,t)-Temp(i,j+1,k,t))/(2*dy)  
  enddo
  enddo
do i=1,nx-1
   j=1
   dx=6371000*cos(lat(j)*3.14/180)*3.14/180
  dy=6371000*3.14/180
   atemp(i,j,k,t)=-u(i,j,k,t)*(temp(i+1,j,k,t)-temp(i,j,k,t))/dx-v(i,j,k,t)*(temp(i,j+1,k,t)-temp(i,j,k,t))/dy
enddo
do j=1,ny-1
    i=111
dx=6371000*cos(lat(j)*3.14/180)*3.14/180
  dy=6371000*3.14/180
atemp(i,j,k,t)=-u(i,j,k,t)*(temp(i,j,k,t)-temp(i-1,j,k,t))/dx-v(i,j,k,t)*(temp(i,j+1,k,t)-temp(i,j,k,t))/dy
enddo
do i=2,nx
   j=61
   dx=6371000*cos(lat(j)*3.14/180)*3.14/180
  dy=6371000*3.14/180
  atemp(i,j,k,t)=-u(i,j,k,t)*(temp(i,j,k,t)-temp(i-1,j,k,t))/dx-v(i,j,k,t)*(temp(i,j,k,t)-temp(i,j-1,k,t))/dy
enddo
do j=2,ny
   i=1
   dx=6371000*cos(lat(j)*3.14/180)*3.14/180
  dy=6371000*3.14/180
   atemp(i,j,k,t)=-u(i,j,k,t)*(temp(i+1,j,k,t)-temp(i,j,k,t))/dx-v(i,j,k,t)*(temp(i,j,k,t)-temp(i,j-1,k,t))/dy
enddo
enddo
enddo
open(4,file="f:\atemplow.grd",form='binary')
do t=1,nt
do j=1,ny
do i=1,nx
  write(4) (ATemp(i,j,1,t)+ATemp(i,j,6,t)+ATemp(i,j,8,t))*100000/3
enddo   
enddo
enddo
close(4)
open(5,file="f:\atemphigh.grd",form='binary')
do t=1,nt
do j=1,ny
do i=1,nx
  write(5) (ATemp(i,j,13,t)+ATemp(i,j,15,t)+ATemp(i,j,17,t))*100000/3
enddo   
enddo
enddo
close(5)
end
到底哪里错了呢?求指教。
密码修改失败请联系微信:mofangbao
发表于 2013-5-15 13:51:42 | 显示全部楼层
首先你提取的资料是21层,所以parameter (nx=181,ny=91,nz=26,nt=16)红色部分是错的。还有你提取出来的资料是二进制,为什么要用unformatted呢。应改成
open(1,file="f:\t.dat",form='binary')  
密码修改失败请联系微信:mofangbao
发表于 2013-5-15 13:54:23 | 显示全部楼层
本帖最后由 夏朗的芒果 于 2013-5-15 13:55 编辑

问题有可能出现在读数据的时候,grads生成的数据文件是二进制的,你在用FORTRAN读数据时不应该是open(1,file="f:\t.dat",form='unformatted') ,而是open(21,file="f:\t.dat",form='binary')

另外FORTRAN默认输出设置是从1-7,所以如果要将数据写入文件,不要将文件设置成1,2,3.最好将设置号从21,22,23之类的开始,不然会输出错误。   
密码修改失败请联系微信:mofangbao
发表于 2013-9-8 22:43:51 | 显示全部楼层
!!!!!!!!!
密码修改失败请联系微信:mofangbao
发表于 2013-9-12 16:34:34 | 显示全部楼层
好好学习下!!
密码修改失败请联系微信:mofangbao
发表于 2015-6-30 12:38:15 | 显示全部楼层
如何在fortran程序中实现呢?
密码修改失败请联系微信:mofangbao
发表于 2018-3-30 17:37:16 | 显示全部楼层
楼主,这个程序成功版有吗?贴出来大家学习一下呗
密码修改失败请联系微信:mofangbao
发表于 2023-4-9 16:05:20 | 显示全部楼层
river 发表于 2013-5-15 13:51
首先你提取的资料是21层,所以parameter (nx=181,ny=91,nz=26,nt=16)红色部分是错的。还有你提取出来的资 ...

请问按照要求设置了却一直报错Fortran runtime error: End of file,是为什么
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2023-4-9 22:19:03 | 显示全部楼层
虹hhh 发表于 2023-4-9 16:05
请问按照要求设置了却一直报错Fortran runtime error: End of file,是为什么

意思就是资料读到头了,没有你的设置里那么多。估计是资料提取的有问题?提取完的资料你有画图和原始数据对比了吗?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2023-4-10 00:03:05 | 显示全部楼层
river 发表于 2023-4-9 22:19
意思就是资料读到头了,没有你的设置里那么多。估计是资料提取的有问题?提取完的资料你有画图和原始数据 ...

找到问题了 ,用grads将nc转dat,时间这一维为1时(set t 1)正常,但是set t 2以后就提示Low Level I/O Error:  Read error on data file,老师这是为何
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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