ASCII or Text Data and GrADS

 

Input ASCII data

GrADS does not directly handle data in ASCII format -- there is no such thing as 'dtype ascii'. ASCII data must be converted to into one of the binary data formats that are handled by GrADS. There are many ways to do this with a variety of programming/scripting languages and tools. Below is a very simple example of how you could do it using a GrADS script.

Suppose you have an ascii file that contains a column of 100 numbers:

18864
20844
24124
27388 
36884
39836
...

Here is a how you would convert that to a binary file using GrADS. You must have a file open for this to work, any file will do.

'open dummy.ctl'
file = 'my_ascii_file.txt'
datafile = 'my_binary_file.dat'
'set gxout fwrite'
'set fwrite -ap 'datafile
'!/bin/rm -f 'datafile
while (1)
  res = read(file)
  line1 = sublin(res,1)
  line2 = sublin(res,2)
  rc1 = subwrd(line1,1)
  if (rc1); break; endif
  val = subwrd(line2,1)
  'd 'val
endwhile
rc = close(file) 'disable fwrite'
The descriptor file would look like this, assuming you wanted to map your data into the X dimension:

dset ^my_binary_file.dat
title Sample of ASCII data converted to binary undef -9.99e8
xdef 100 linear 1 1
ydef 1 linear 1 1
zdef 1 linear 1 1
tdef 1 linear 01jan0001 1dy
vars 1
a 0 99 ascii variable
endvars

Output Gridded Data in ASCII Format

1. GrADS can create ascii output for any display with the 'set gxout print' option. The formatting of the output is controlled with the 'set prnopts' command. The output is printed to the command window, but it is also stored in the internal variable 'result' inside a script, where it can be easily output to a file. Below is a simple script example to write formatted ascii output to a file. Note that the choice of writing 72 numbers per line is based on the X dimension of the grid being displayed.

'open /data/grib/model/model.ctl'
'set x 1 72'
outfile = 'my_ascii_file.txt'
'set gxout print'
'set prnopts %7.3f 72 1'
'd ts'
rc = write(outfile,result)

The beginning of the file my_ascii_file.txt looks like this:

Printing Grid -- 3312 Values -- Undef = -9.99e+08
258.493 258.493 258.493 258.493 258.493 258.493 258.493 258.493 258.493 258.493 258.493 <etc.>   

2. In the above example, note that the first line of the output file will contain some diagnostic information about the number of values written and the undef value. If you want to omit that line and write out just the ascii data, then use this slightly more complicated version of the script which skips over the first line of diagnostic info. Two other changes in this example are in the formatting (the output will be comma delimited for importing into a spreadsheet) and the displayed variable, which is now an expression instead of a variable name. It is not necessary to 'define' the expression before displaying it.

'open /data/grib/model/model.ctl'
'set x 1 72'
outfile='my_ascii_file.txt'
'!/bin/rm -f 'outfile
'set gxout print'
'set prnopts %g, 72 0'
'd ts-273.15'
i=1
while (1)
  line = sublin(result,i)
  if (line = ''); break; endif
  if (i>1)
    rc = write(outfile,line,append)
  endif
  i=i+1
endwhile

Now the beginning of the output file my_ascii_file.txt looks like this:

-14.6567,-14.6567,-14.6567,-14.6567,-14.6567,-14.6567,-14.6567,-14.6567,-14.6567,<etc.>

3. If you want to write out the grid information along with data from more than one variable, then you must save the result from the display of each variable/expression (including longitude and latitude), parse each data point individually, construct the line of ascii output, and then write it out. Here is an example the writes out longitude, latitude, surface temperature, surface pressure, and precipitation:

'open /data/grib/model/model.ctl'
'set x 1 72'
outfile='my_ascii_file.txt'
'!/bin/rm -f 'outfile
'set gxout print'
fmt='%8.3f'
numcols=72
'set prnopts 'fmt' 'numcols' 1'
'd lon'
lon_data = result
'd lat'
lat_data = result
'd ts'
v1_data = result
'd ps'
v2_data = result
'd p'
v3_data = result
i=1
while (1)
  lons  = sublin(lon_data,i)
  lats  = sublin(lat_data,i)
  line1 = sublin(v1_data,i)
  line2 = sublin(v2_data,i)
  line3 = sublin(v3_data,i)
  if (lons='' | lats='' | line1='' | line2='' | line3=''); break; endif
  if (i>1)
    j=1
    while (j<=numcols)
      str = subwrd(lons,j); lon = math_format(fmt,str)
      str = subwrd(lats,j); lat = math_format(fmt,str)
      str = subwrd(line1,j); v1 = math_format(fmt,str)
      str = subwrd(line2,j); v2 = math_format(fmt,str)
      str = subwrd(line3,j); v3 = math_format(fmt,str)
      record = lon' 'lat' 'v1' 'v2' 'v3
      rc = write(outfile,record,append)
      j=j+1
    endwhile
  endif
  i=i+1
endwhile

Now the head of the output file my_ascii_file.txt looks like this:

   0.000  -90.000  258.493  669.911    0.000
   5.000  -90.000  258.493  669.911    0.000
  10.000  -90.000  258.493  669.911    0.000
  15.000  -90.000  258.493  669.911    0.000
  20.000  -90.000  258.493  669.911    0.000
  25.000  -90.000  258.493  669.911    0.000
  30.000  -90.000  258.493  669.911    0.000
  35.000  -90.000  258.493  669.911    0.000
  40.000  -90.000  258.493  669.911    0.000