comp.lang.idl-pvwave archive
Messages from Usenet group comp.lang.idl-pvwave, compiled by Paulo Penteado

Home » Public Forums » archive » Re: IDL Error GCPC data
Show: Today's Messages :: Show Polls :: Message Navigator
E-mail to friend 
Return to the default flat view Create a new topic Submit Reply
Re: IDL Error GCPC data [message #69248 is a reply to message #69245] Thu, 24 December 2009 20:21 Go to previous messageGo to previous message
David Fanning is currently offline  David Fanning
Messages: 11724
Registered: August 2001
Senior Member
sampton writes:

> OK ! you're the expert then ;)
> As of the file extention what I mean is that I have more than one
> binary data file ending by 'year': gpcp_v2.1_psg.1979, gpcp_v2.1_psg.
> 1980 and so on.
> I'll try those command and get back to you in case,
> Thanks again and greeting fo the Holidays season.

I am sitting around waiting for Santa to show up
tonight, so I thought I'd just make a couple of
changes to your code. This is not *exactly* how I
would have written it, but I tried to keep the
flavor of the original.

Here it is:

;**********************************************************
function create_v2_1_struct, $
NUM_LON=num_lon, $ ; Number of longitude values. Input. Default:
144
NUM_LAT=num_lat, $ ; Number of latitude values. Input. Default: 72
NUM_LAT=num_lat, $ ; Number of months. Input. Default: 12
;-----------------------------------------
; Set up the data structure for output.
;-----------------------------------------
if n_elements(num_lon) eq 0 then num_lon = 144
if n_elements(num_lat) eq 0 then num_lat = 72
if n_elements(num_mon) eq 0 then num_mon = 12

struc = { header: bytarr(num_lon*4), $
data: fltarr(num_lon,num_lat,num_mon) }

return, struc
end

function read_v2_1, file,
HELP=help, $ ; Print help message.
HEADER=header, $ ; File header. Output.
NUM_LON=num_lon, $ ; Number longitude values. Input. Default: 144
NUM_LAT=num_lat, $ ; Number latitude values. Input. Default: 72
NUM_LAT=num_lat, $ ; Number months. Input. Default: 12
;-----------------------------------------
; The main procedure; create the data structure, read both
; header and data, and swap bytes if needed. Returns the data
; structure, and the header, if requested.
;-----------------------------------------

; Need some help?
if keyword_set(help) then begin
print, 'struct = read_v2_1_file(filename, [HEADER=header], $
print, ' [NUM_LON=num_lon], [NUM_LAT=num_lat], [NUM_LAT=num_lat]
print, ''
print, 'Arguments:----'
print, 'filename: The name of the file to read.'
print, ''
print, 'Keywords:----'
print, 'HEADER: Output variable contains file header.
print, 'NUM_LON: Number of longitude values. Input. Default: 144
print, 'NUM_LAT: Number of latitude values. Input. Default: 72
print, 'NUM_LAT: Number of months. Input. Default: 12
endif

; Need a file?
if n_elements(file) eq 0 then begin
file = dialog_pickfile(title='Select file to read...')
if file eq "" then return, -1
endif

; Assign keyword default values.
if n_elements(num_lon) eq 0 then num_lon = 144
if n_elements(num_lat) eq 0 then num_lat = 72
if n_elements(num_mon) eq 0 then num_mon = 12

; Read the header.
header = bytarr( num_lon*4 )
openr, lun, file, /get_lun
readu, lun, header
free_lun, lun
header = str_sep( strtrim(string(header),2), ' ' )

; If the word "Silicon" is in the header, then the file
; order is big-endian.
bigEndian = (strpos( header, 'Silicon') ne -1) ? 1 : 0

; Read the structure from the file. Swap bytes, if necessary.
struct = create_v2_1_struct(NUM_LON=num_lon, $
NUM_LAT=num_lat, NUM_MON=num_mon)
IF bigEndian THEN BEGIN
openr, lun, file, /get_lun, /swap_if_little_endian
ENDIF ELSE BEGIN
openr, lun, file, /get_lun, /swap_if_big_endian
ENDELSE
readu, lun, struct
free_lun, lun

; Return structure.
return, struct

end
;**********************************************************


This will be called something like this:

IDL> struct = Read_V2_1_File('gpcp_v2.1_psg.1979')

If you want a help message, call it like this:

IDL> void = Read_V2_1_File(/HELP)

You can pass it the number of longitude values, number of latitude
values, and number of months as keywords. If you want the header
to come back separate from the structure, you can use the HEADER
keyword as an output variable.

IDL> file = 'gpcp_v2.1_psg.1979'
IDL> struct = Read_V2_1_File(file, HEADER=thisHeader)
IDL> Help, struct
IDL> Print, thisHeader

If you wanted to run this in a loop, you might try something
like this:

IDL> structs = PtrArr(10)
IDL> files = 'gpcp_v2.1_psg' + StrTrim(Indgen(10)+1979,2)
IDL> for j=0,9 do structs[j] = Ptr_New(Read_V2_1_File(files[j]))
IDL> Help, *structs[5], /Structure

Then you would have a pointer array to 10 structures, read
from the files ending in 1979 to 1988.

No error handling in this code, and the modules are not named
as I would name them if I were writing the code. But we will
leave that as an exercise for the reader. :-)

Cheers,

David

--
David Fanning, Ph.D.
Fanning Software Consulting, Inc.
Coyote's Guide to IDL Programming: http://www.dfanning.com/
Sepore ma de ni thui. ("Perhaps thou speakest truth.")
[Message index]
 
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Previous Topic: fitting contours with ellipse
Next Topic: Re: Reducing a set of curves to a mean curve

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ] [ PDF ]

Current Time: Sat Nov 29 19:13:32 PST 2025

Total time taken to generate the page: 1.35986 seconds