[Thread Prev][Thread Next][Index]

Re: [ferret_users] reading FORTRAN sequential access data - simplequestion



Thanks everyone.

I was able to read this file successfully and make a plot
using format = stream and /skip = 1.

I should say that I was constrained to write the file in the way I did (sequential binary) because it is required to be in that format by another piece of code. I just wanted to take a "quick" look to see if the values in the file were OK before I handed it off to the next guy.

Bob


On Fri, 7 Jul 2006, Jaison Kurian wrote:

Hi Ryo,

On Thu, 6 Jul 2006, Ryo Furue wrote:
Hi Jaison,

| 1. Sequential access files with all the data written in a single
|       stretch (as Bob wanted) should be readed in Ferret as
|       "Format=STREAM" with /SKIP=1. (Don't be annoyed, it will
|        work !!!). SKIP=1 will remove the first record information
|        then the data is exactly same as that of "Direct Access".
|        You have to specify TYPE=R4 or R8 according to your Fortran
|        program.

I may be missing something, but what's the unit of "skip"?
Is it a 4-byte word?   Otherwise, I don't understand why
your Case_2 works.  But, if the unit of "skip" is a 4-byte
word, what would you do if you want to skip the first three
bytes of your binary file, for example?
     It is "words" i think. I don't know precisely, the
SKIP may be working according to the data type specified. So
in case of R4 it will remove the record information at the beginning
with 1 word length with respect to R4 type. In R8 case it should
remove 1 word corresponding to R8 type. Hence it seems that
you cannot remove first 3 bytes from a variable of type R4.

| 2. Sequential access files with data written inside the loop (as
|        in the example i suggested earlier) should be readed in
|        Ferret as "Format=UNFORMATTED". Ferret will support only
|        REAL*4 and not REAL*8 types.

I've never used "Format=UNFORMATTED", but it's very interesting.
If you write a sequential file as you do in Case_3, each
element (a real*4 number) of the array is surrounded by
a header and trailer in the file.  So, Ferret assumes this,
when given format=unformatted . . .  This is an odd thing
to do, because your file will be three times the size of the
real*4 array itself.

  in the first case with REAL*4, the filesize (in bytes) is
  (128*64*19 + 1 word at beginning + 1 word at end)*4 = 622600

  in second case, with REAL*4, there will be as many headers
  and trailers as the variable values with similar length of word.
  So we should multiply the grid points with 3, then the filesize is
  (128*64*19 * 3) * 4 = 1867776

  Let us check whether the filesizes match this estimates
  (seq_1array.bin corresponds to the 1st case and
  seq_looped.bin to 2nd case)

[jaison@mercury binary_data]$ ls -la *.bin
-rw-r--r--    1 jaison   users   622600 Jul  7 15:46 seq_1array.bin
-rw-r--r--    1 jaison   users  1867776 Jul  7 15:46 seq_looped.bin
[jaison@mercury binary_data]$

  Exactly matching. So we should stick to the first method to
  save some disk space (if you are so fond of SEQUENTIAL access
  files) !!!!

Regards,
Ryo

========= Quoting from Jaison's message =====================

Common to all cases
-------------------
      open(unit=10,access='sequential',form='unformatted',
     #              file='seq.bin')


case 1
------
  Fortran

      real*4 hrmean(nx,ny,nz)
      ..................
      write(10) hrmean

  Ferret

      file/skip=1/format=stream/type=R4/var=hrmean/\
                      grid=mygrid  seq.bin

case 2
------
  Fortran

      real*8 hrmean(nx,ny,nz)
      ..................
      write(10) hrmean

  Ferret

      file/skip=1/format=stream/type=R8/var=hrmean/\
                    grid=mygrid  seq.bin

case 3
------

  Fortran

      real*4 hrmean(nx,ny,nz)
      ...............
      DO k =1,nz
          Do j = 1,ny
              Do i = 1,nx
                    write(10) hrmean(i,j,k)
              ENDDO
          ENDDO
      ENDDO

  Ferret

      file/format=unformatted/type=R4/var=hrmean/\
                   grid=mygrid  seq.bin

case 4
------

  Fortran

      real*8 hrmean(nx,ny,nz)
      ...............
      DO k =1,nz
          Do j = 1,ny
              Do i = 1,nx
                    write(10) hrmean(i,j,k)
              ENDDO
          ENDDO
      ENDDO

  Ferret

      Ferret is not able to handle this dataset.


--
-------------------------------------------------------------
Robert A. Tomas
National Center for Atmospheric Research
Climate and Global Dynamics Division - Paleoclimatology
1850 Table Mesa Drive
Boulder, CO 80305-3000
e-mail: tomas@ucar.edu  tel: 303-497-1342  fax:  303-497-1348

[Thread Prev][Thread Next][Index]

Dept of Commerce / NOAA / OAR / PMEL / TMAP

Contact Us | Privacy Policy | Disclaimer | Accessibility Statement