0

I need to open a binary file for which the developer of the data provides a program written in Fortran. I am new to the Fortran language, but I think it is worth trying out to use the ready program rather than writing a new one myself on R.

The file I want to open is this, this is the data manual, and the lines of code to open the data can be found here. The data contain a 576-byte header line at the start which can be opened using this.

What I did: Saved the binary file in a new folder, in which I have also saved the code of the software that opens it. After setting the terminal into the latter folder (cd /home/urs/../), from the GNU-Linux terminal I run:

# compile the program using gfortran gfortran read_v2.2_month.f -o read_v2.2_month # make file executable chmod +x read_v2.2_month # run the program ./read_v2.2_month 

However, I get the following error:

 Error: read error 5016 on file gpcp_v2.2_psg.1987 

EDIT: The code in Fortran to open the data excluding the first row of header is the following:

 OPEN ( UNIT=10, FILE='gpcp_v2.2_psg.1987', ACCESS='DIRECT', + FORM='UNFORMATTED', STATUS='OLD', RECL=144, + IOSTAT=iret ) IF ( iret .NE. 0 ) THEN WRITE (*, *) 'Error: open error', iret, + ' on file gpcp_v2.2_psg.1987' STOP END IF C C Compute the number of records to skip, namely 1 for the header C and 72 for each intervening month. C nskip = 1 + ( month - 1 ) * 72 C C Read the 72 rows of data and close the file. C DO 10 j = 1, 72 READ ( UNIT=10, REC=j+nskip, IOSTAT=iret ) + ( data (i, j), i = 1, 144 ) IF ( iret .NE. 0 ) THEN WRITE (*, *) 'Error: read error', iret, + ' on file gpcp_v2.2_psg.1987' STOP END IF 10 END DO CLOSE ( UNIT=10 ) C C Now array "data" is ready to be manipulated, printed, etc. C For example, dump the single month as unformatted direct: C OPEN ( UNIT=10, FILE='junk', ACCESS='DIRECT', + FORM='UNFORMATTED', RECL=144, IOSTAT=iret ) IF ( iret .NE. 0 ) THEN WRITE (*, *) 'Error: open error', iret, + ' on file junk' STOP END IF DO 20 j = 1, 72 WRITE ( UNIT=10, REC=j, IOSTAT=iret ) + ( data (i, j), i = 1, 144 ) IF ( iret .NE. 0 ) THEN WRITE (*, *) 'Error: write error', iret, + ' on file junk' STOP END IF 20 END DO CLOSE ( UNIT=10 ) STOP END 
3
  • 2
    I believe we need to see the code. Commented Mar 1, 2017 at 16:14
  • I am not following your links. Post a minimal, reproducing code here. Commented Mar 1, 2017 at 16:15
  • BTW error 5016 is 5016 LIBERROR_SHORT_RECORD Commented Mar 1, 2017 at 21:15

1 Answer 1

1

There are some things that could go wrong in this code. For exaple, the RECL is in gfortran counted in bytes, but the code assumes 4-byte words (as Intel does). The RECL values should not be indicated explicitly.

Try to increase RECL to 4*144. If it helps, then this question is a duplicate of Reading writing fortran direct access unformatted files with different compilers

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.