[gradsusr] Fortran to Read in GrADS Binary File

James T. Potemra jimp at hawaii.edu
Tue Jul 5 13:53:55 EDT 2016


Hi Lydia,

The problem might be how you are creating the original file with your 
GrADS script.  Note the file should be exactly 4 times the (x,y,z,t) 
ranges times the number of variables.  It sounds like you have one less 
in either x- or y-direction.  In your script you have:

> 'set gxout fwrite'
>
> 'set fwrite -ap /Volumes/WebData/NLDAS2/DailyNLDAS/daily.bin'
>
>
> 'set t 1'
>
So the file daily.bin should be 4 times 464*224 times 4 variables times 
number of time-steps.  If not, you may want to add

'set x 1 496'
'set y 1 224'
after 'set t 1' and before you define your new variables.

Similarly, your output file should be exactly 163840 (32*32*10*4*4).

Jim

On 7/5/16 7:41 AM, Lydia Rill wrote:
> Thanks Chuck! I double checked the record length and it is indeed 4.
>
> Thank you Jim! Sorry my code was a little messy, I have tried many 
> different methods.
> Good point about the lower left hand corner, that was one of the 
> issues here.
>
> When I use 32 x steps, 32 y steps, and 10 time steps I use a record 
> length of 4096 for the output file and I get a file size of 160K, 
> which roughly matches 32*32*10*4*4 = 16385
>
> I am now getting realistic numbers for my output! However, when I 
> display the data in GrADS for one time I get only parts of the 4x4 
> degree box, by latitude, for each variable, instead of getting the 
> data for each variable for the whole box. For example in the middle of 
> the box I get tmax for 43.5-44N, tmin for 43-43.5N, prcp around 43N, 
> and srad around 42.5N. Any ideas on why this is happening?
>
> Here is the updated code:
>
> integer irec,i,j,t,days
>
> character(len=100) infile,outfile
>
> real tmin(464,224),tmax(464,224),prcp(464,224),srad(464,224)
>
> infile='/Volumes/WebData/NLDAS2/DailyNLDAS/daily.bin'
>
> outfile='/Volumes/WebData/NLDAS2/Fortran/testdaily.bin'
>
> open(17,file=infile,form="unformatted",access="direct",recl=32*32*4,status="old")
>
> open(18,file=outfile,form="unformatted",access="direct",recl=32*32*4,status="unknown")
>
>
> days=10
>
> irec=1
>
> do t=1,days
>
> read(17,REC=irec) ((tmax(i,j),i=129,160),j=129,160)
>
> read(17,REC=irec+1) ((tmin(i,j),i=129,160),j=129,160)
>
> read(17,REC=irec+2) ((prcp(i,j),i=129,160),j=129,160)
>
> read(17,REC=irec+3) ((srad(i,j),i=129,160),j=129,160)
>
> write(18,REC=irec) ((tmax(i,j),i=129,160),j=129,160)
>
> write(18,REC=irec+1) ((tmin(i,j),i=129,160),j=129,160)
>
> write(18,REC=irec+2) ((prcp(i,j),i=129,160),j=129,160)
>
> write(18,REC=irec+3) ((srad(i,j),i=129,160),j=129,160)
>
>    irec=irec+4
>
> enddo
>
>
> Here is the updated control file:
>
> dset ^testdaily.bin
>
> undef 9.999E+20
>
> title Daily NLDAS2 Data for 04Z through 03Z
>
> xdef 32 linear -108.93750.125
>
> ydef 32 linear 41.0625 0.125
>
> tdef 10 linear 00Z02Jan1979 1dy
>
> zdef 1 linear 1 1
>
> vars 4
>
> TMAX 0 12,105,2 ** maximum temperature at 2m above surface [C]
>
> TMIN 0 11,105,2 ** minimum temperature at 2m above surface [C]
>
> PRCP 0 61,1,0 ** total precipitation backward accumulated [kg/m^2 or mm]
>
> SRAD 0 204,1,0 ** total surface downward shortwave radiation flux [mJ/m^2]
>
> ENDVARS
>
>
> Thank you both so much for your help,
>
> Lydia
>
> On Tue, Jul 5, 2016 at 12:44 PM, James T. Potemra <jimp at hawaii.edu 
> <mailto:jimp at hawaii.edu>> wrote:
>
>     Hi Lydia,
>
>     You have a couple problems.  First, you are reading in tmax, tmin,
>     prcp then srad, but then you write out tmin, tmin prcp and srad
>     (tmin twice).  Second, your program is reading and writing to the
>     same variables, and then only the first 8x8 (lower left "corner"
>     of the data sets).  Perhaps these are all missing ?
>
>     Finally, the record length is defined to be 464 by 224, then you
>     only define (via read) and write the first 8 by 8, which should
>     work ok, but recognize that the rest of the 464x224 array has not
>     been defined.  So, if you want to use your control file with "xdef
>     8" and "ydef 8" you'll need to change your "open" statement for
>     the output file to be 8*8*4 and not 464*224*4.  Alternately you
>     could change the xdef/ydef lines.
>
>     Note as a quick check, your output file should be 8*8*10*4*4
>     (x*y*t*4) bytes large for that control file.
>
>     Jim
>
>     On 7/5/16 3:57 AM, Lydia Rill wrote:
>>     Hi all,
>>
>>     I am a new grads user and I have never worked with binary files
>>     before. I have a large binary file I created in grads (code shown
>>     below). I want to split up the binary file by latitude and
>>     longitude degree into smaller binary files. While this is
>>     possible in GrADS, it is too slow for my needs, so I am trying to
>>     do it in Fortran 90.
>>
>>     However, I am having problems reading the GrADS binary file in
>>     Fortran. It gives me the missing value for each of my variables
>>     at every time step and every location.
>>
>>     The binary file contains NLDAS 2 forcing data, with 464 x steps,
>>     224 y steps, and 13688 daily time steps for 4 variables (only 1 Z
>>     level). It is a large file at 22GB, and I can successfully
>>     display the variables in GrADS from this binary file. This binary
>>     file was created from data in Grib files.
>>
>>     I have tried many various ways of reading in the binary data,
>>     using x and y loops, or time loops, or looping through the 4
>>     variables, but nothing has been successful.
>>
>>     I am working on a Mac (El Capitan).
>>
>>     Here is the GrADS script I used to create the binary file:
>>
>>     functionmain(args)
>>
>>     counthr=subwrd(args,1)
>>
>>     'reinit'
>>
>>     'open /Volumes/WebData/NLDAS2/ProcessingFiles/24hours.ctl'
>>
>>     'set undef 9.999e20'
>>
>>     'set gxout fwrite'
>>
>>     'set fwrite -ap /Volumes/WebData/NLDAS2/DailyNLDAS/daily.bin'
>>
>>
>>     'set t 1'
>>
>>     t1=1+4
>>
>>     t1p=1+5
>>
>>     while(t1<=counthr+5-23)
>>
>>     t2=t1+23
>>
>>     t2p=t1p+23
>>
>>     'd (max(TMP2m,t='t1',t='t2')-273.15)'
>>
>>     'd (min(TMP2m,t='t1',t='t2')-273.15)'
>>
>>     'd sum(APCPsfc,t='t1p',t='t2p')'
>>
>>     'd (ave(DSWRFsfc,t='t1',t='t2')*24*3600/1000000)'
>>
>>     t1=t1+24
>>
>>     t1p=t1p+24
>>
>>     endwhile
>>
>>     'quit'
>>
>>
>>     Here is the Fortran script to read the binary file
>>
>>     ProgramReadbin
>>
>>     implicitnone
>>
>>     integer irec,i,j,t,days
>>
>>     real tmin(464,224),tmax(464,224),prcp(464,224),srad(464,224)
>>
>>     OPEN(17,file='/Volumes/WebData/NLDAS2/DailyNLDAS/daily.bin',&
>>
>>     &STATUS='Old',FORM='UNFORMATTED',ACCESS='DIRECT',RECL=464*224*4)
>>
>>
>>     OPEN(18,file='/Volumes/WebData/NLDAS2/DailyNLDAS/testdaily.bin',&
>>
>>     &STATUS='UNKNOWN',FORM='UNFORMATTED',ACCESS='DIRECT',RECL=464*224*4)
>>
>>     days=10
>>
>>     irec=1
>>
>>     do t=1,days
>>
>>     read(17,REC=irec) ((tmax(i,j),i=1,8),j=1,8)
>>
>>     read(17,REC=irec+1) ((tmin(i,j),i=1,8),j=1,8)
>>
>>     read(17,REC=irec+2) ((prcp(i,j),i=1,8),j=1,8)
>>
>>     read(17,REC=irec+3) ((srad(i,j),i=1,8),j=1,8)
>>
>>     write(18,REC=irec) ((tmin(i,j),i=1,8),j=1,8)
>>
>>     write(18,REC=irec+1) ((tmin(i,j),i=1,8),j=1,8)
>>
>>     write(18,REC=irec+2) ((prcp(i,j),i=1,8),j=1,8)
>>
>>     write(18,REC=irec+3) ((srad(i,j),i=1,8),j=1,8)
>>
>>       irec=irec+4
>>
>>     enddo
>>
>>     end program
>>
>>
>>     The corresponding control file is:
>>
>>     set ^testdaily.bin
>>
>>     undef 9.999E+20
>>
>>     title Daily NLDAS2 Data for00Z through 23Z
>>
>>     xdef 8linear -124.93750.125
>>
>>     ydef 8linear 25.06250.125
>>
>>     tdef 10linear 00Z02Jan1979 1dy
>>
>>     zdef 1linear 11
>>
>>     vars 4
>>
>>     TMAX 012,105,2**maximum temperature at 2m above surface [C]
>>
>>     TMIN 011,105,2**minimum temperature at 2m above surface [C]
>>
>>     PRCP 061,1,0**total precipitation backward accumulated [kg/m^2ormm]
>>
>>     SRAD 0204,1,0**total surface downward shortwave radiation flux
>>     [mJ/m^2]
>>
>>     ENDVARS
>>
>>
>>
>>     Thanks,
>>
>>     Lydia
>>
>>     -- 
>>     Lydia D. Rill
>>     M.S., Michigan State University 2016
>>     B.S., Valparaiso University 2014
>>     (224) 406-5130
>>     Lydia.D.Rill at gmail.com <mailto:Lydia.D.Rill at gmail.com>
>>
>>
>>     _______________________________________________
>>     gradsusr mailing list
>>     gradsusr at gradsusr.org <mailto:gradsusr at gradsusr.org>
>>     http://gradsusr.org/mailman/listinfo/gradsusr
>
>
>     _______________________________________________
>     gradsusr mailing list
>     gradsusr at gradsusr.org <mailto:gradsusr at gradsusr.org>
>     http://gradsusr.org/mailman/listinfo/gradsusr
>
>
>
>
> -- 
> Lydia D. Rill
> M.S., Michigan State University 2016
> B.S., Valparaiso University 2014
> (224) 406-5130
> Lydia.D.Rill at gmail.com <mailto:Lydia.D.Rill at gmail.com>
>
>
> _______________________________________________
> gradsusr mailing list
> gradsusr at gradsusr.org
> http://gradsusr.org/mailman/listinfo/gradsusr

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://gradsusr.org/pipermail/gradsusr/attachments/20160705/1bb2607b/attachment-0001.html 


More information about the gradsusr mailing list