2012-08-08 84 views
0

寫入二進制文件(的GrADS)我運行一個模型,編寫模型輸出到一個二進制文件(的GrADS * GRA文件),這樣,例如:閱讀和FORTRAN

integer,parameter :: nvar =3 ,& !number of variables to be written to file 
        nx=10,ny=10,& !number of girdboxes in lat & long 
        nt = 5 
integer :: it, & ! loop counter 
      irec ! Record number 
real :: var1(nx,ny), var2(nx,ny),var3(nx,ny) 

OPEN(30,file='Outfile.gra',action='write',form='unformatted',access='direct',& 
    recl=4*nVar*nx*ny,status='replace') 
!loop over timesteps 
it = 1, nt 
    irec = irec + 1 
    WRITE(1,rec=irec) Var1(:,:),Var2(:,:),Var3(:,:) 
enddo 

該文件可以在的GrADS讀取和* CTL文件看起來像這樣

dset /mypath/Outfile.gra 
title MyTitle 
options little_endian 
xdef 10 linear 1 1 
ydef 10 linear 1 1 
zdef 1 linear 1.0 1.0 
tdef 5 linear 00:00Z01jan2012 1hr 
vars 3 
var1 
var2 
var3 
endvars 

我想這樣做,從一個單獨的程序,是在1時步到一個文本文件中寫入所有的X & Y 1個變量。我嘗試了很多方法,但都沒有成功。我的最新嘗試是這個:

integer,parameter :: & 
     t = 3,  & !Timestep I want to write to file 
     field = 2, & !Variable I want to write to file  
     nvar =3 ,  & !number of variables to be written to file 
     nx=10,ny=10, & !number of girdboxes in lat & long 
     nt = 5   !number of timesteps 
inteǵer :: it,ix,iy,& ! loop counters 
      irec  ! Record number 
real :: val(nx,ny)  ! Data to be written to file 

open(1,file='NewFile.txt',status='replace') 
open(2,file='Outfile.gra',action='read',form='unformatted',access='direct',& 
    recl=4*nVar*nx*ny,status='old') 

irec = 0 

do it = 1,nt 
    irec=irec + nvar*nx*ny 
    if(it == t) then 
    irec = irec + (field-1)*nx*ny 
    do ix = 1,nx 
    do iy = 1,ny 
     irec=irec+1 
    read(2,rec=irec) val(ix,iy) 
enddo 
enddo 
write(1,*) val(:,:) 

這個特殊的例子給了我下面的錯誤

Fortran runtime error: Non-existing record number

,但我想,沒有給我任何錯誤,其他的變化,但根本沒寫我是什麼試圖寫入文件。有人能告訴我我做錯了什麼,以及如何解決這個問題?謝謝。

+1

你指定的記錄長度爲'4 * NVAR * NX * ny'在'OPEN'語句中,然後您將以'nvar * nx * ny'步長遞增記錄編號。你只需要用'1'步增加它。 – 2012-08-08 11:02:25

回答

0

High Performance Markhristo-iliev確定了記錄編號的問題。爲了能夠做我想做的,就是寫一個變量在一個單一的時間步長正確的代碼是

irec = 0 
do it = 1, t 
irec = irec + 1 
read(2,rec=irec) val(:,:,:) 
enddo 
write(1,*) val(:,:,field) 

其中val(nx,ny,nVar)

4

好的,讓我再試一次。當你寫outfile.gra你似乎寫nt記錄它在該塊

!loop over timesteps 
it = 1, nt 
    irec = irec + 1 
    WRITE(1,rec=irec) Var1(:,:),Var2(:,:),Var3(:,:) 
enddo 

我想這irec被初始化爲0在代碼的某個地方。 nt設置爲5所以,如果我的猜測是正確的,您的代碼將寫入5條記錄到outfile.gra

後來,你在此塊讀取相同的文件

irec = 0 

do it = 1,nt 
    irec=irec + nvar*nx*ny 
    if(it == t) then 
    irec = irec + (field-1)*nx*ny 
    do ix = 1,nx 
    do iy = 1,ny 
     irec=irec+1 
    read(2,rec=irec) val(ix,iy) 
enddo 
enddo 

目前還不清楚其中if聲明從你的問題,但關我猜測它的環比nxny後關閉,像這樣:

irec = 0 

do it = 1,nt 
    irec=irec + nvar*nx*ny 
    if(it == t) then 
    irec = irec + (field-1)*nx*ny 
    do ix = 1,nx 
     do iy = 1,ny 
     irec=irec+1 
     read(2,rec=irec) val(ix,iy) 
     enddo 
    enddo 
    end if 

再次,如果我的猜測是正確的,那麼irec的值爲401時首先執行read聲明。

看來你已經寫了5條記錄到outfile.gra並試圖從中讀取第401條記錄。運行時報告您正在嘗試讀取不存在的記錄是完全合理的。

+0

我剛剛通過相同的結論!我猜我在rec(which = nt)和recl(4 * nVar * nx * ny)之間感到困惑。所以現在我有'do it = 1,t' 'irec = irec + 1' 'read(2,rec = irec)val(:,:,:)' 'enddo' 'write(1,* )val(:,:,field)'但它還沒有完成,我有太多的值。將工作併發布答案時,我得到它 – SnowFrog 2012-08-08 11:12:12

+0

ps:我現在宣佈'val(nx,ny,nVar)'。 – SnowFrog 2012-08-08 11:18:52