CamCASP/CodeExamples/DirectAccess
Jump to navigation
Jump to search
program directaccess
!Write a direct access file and read it.
!Written with the hope of tracing a bug in gfortran - if it is a bug!
implicit none
integer, parameter :: dp = kind(1d0)
!integer, parameter :: reclen = 32760 !record length
integer :: reclen
integer, parameter :: maxlen = 2728 !max len of arrays x() n() in a rec
integer, parameter :: lenval = maxlen + 1366
character(30) :: filename='tmp_directaccess.tmp'
integer :: fileunit
integer :: stat, numrows, i, j
real(dp), dimension(100000) :: values
character(80) :: accesstype, fileform
logical :: iexist
integer :: recordlen, next_rec, num_entries
fileunit = 7
print *,'Number of rows '
read *,numrows
reclen=numrows*dp + 4 + 4
print *,'reclen = ',reclen
open(fileunit,file=filename,status='unknown',access='direct',&
recl=reclen,form='unformatted',action='readwrite',iostat=stat)
print *,trim(filename),' open with stat = ',stat
do i = 1, numrows
do j = 1, numrows
values(j) = real(i+j,kind=dp)
enddo
write(fileunit,rec=i)i+1, maxlen, values(1:numrows)
enddo
close(fileunit)
! Overwrite:
numrows = numrows + 1000
reclen=numrows*dp + 4 + 4
print *,'reclen = ',reclen
open(fileunit,file=filename,status='unknown',access='direct',&
recl=reclen,form='unformatted',action='readwrite',iostat=stat)
print *,trim(filename),' open with stat = ',stat
do i = 1, numrows
do j = 1, numrows
values(j) = real(i+2*j,kind=dp)
enddo
write(fileunit,rec=i)i+1, maxlen, values(1:numrows)
enddo
close(fileunit)
open(fileunit,file=filename,status='unknown',access='direct',&
recl=reclen,form='unformatted',action='read',iostat=stat)
inquire(file=filename,exist=iexist,access=accesstype,form=fileform,&
recl=recordlen)
print *,'Inquire: exists= ',iexist
print *,' : access= ',trim(accesstype)
print *,' : form = ',trim(fileform)
print *,' : reclen= ',recordlen
do i = 1, min(10,numrows)
read(fileunit,rec=i,iostat=stat)next_rec,num_entries,values(1:numrows)
print '(1x,a,4(i6,1x))','rec and stat ',i,stat,next_rec,num_entries
print '(a,10(f5.1,1x))',' vals: ',values(1:10)
enddo
do i = max(1,numrows-10),max(10,numrows)
read(fileunit,rec=i,iostat=stat)next_rec,num_entries,values(1:numrows)
print '(1x,a,4(i6,1x))','rec and stat ',i,stat,next_rec,num_entries
print '(a,10(f10.1,1x))',' vals: ',values(1:10)
enddo
close(fileunit)
end program directaccess
--alston 12:10, 14 May 2010 (BST)