home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Science / Science.zip / gmt_os2.zip / src / gmt_grdio.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-07-05  |  4.9 KB  |  166 lines

  1. /*--------------------------------------------------------------------
  2.  *    The GMT-system:    @(#)gmt_grdio.c    2.8  05 Jul 1995
  3.  *
  4.  *    Copyright (c) 1991-1995 by P. Wessel and W. H. F. Smith
  5.  *    See README file for copying and redistribution conditions.
  6.  *--------------------------------------------------------------------*/
  7. /*
  8.  *
  9.  *    G M T _ G R D I O . C   R O U T I N E S
  10.  *
  11.  * Generic routines that take care of all gridfile input/output.
  12.  *
  13.  * Author:    Paul Wessel
  14.  * Date:    9-SEP-1992
  15.  * Modified:    27-JUN-1995
  16.  * Version:    3.0
  17.  *
  18.  * Functions include:
  19.  *
  20.  *    grd_get_i_format :    Get format id for input grdfile
  21.  *    grd_get_o_format :    Get format id for output grdfile
  22.  *    grdio_init :        Set pointers to all i/o routines
  23.  *
  24.  *    read_grd_info :        Read header from file
  25.  *    read_grd :        Read header and data set from file
  26.  *    write_grd_info :    Update header in existing file
  27.  *    write_grd :        Write header and data set to new file
  28.  *
  29.  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  30.  
  31. #include "gmt.h"
  32.  
  33. /* GENERIC I/O FUNCTIONS FOR GRIDDED DATA FILES */
  34.  
  35. int read_grd_info (file, header)
  36. char *file;
  37. struct GRD_HEADER *header; {
  38.     int status;
  39.     char fname[BUFSIZ];
  40.     double scale = 1.0, offset = 0.0;
  41.     
  42.     grd_i_format = grd_get_i_format (file, fname, &scale, &offset);
  43.     status = (*gmtio_readinfo[grd_i_format]) (fname, header);
  44.     header->z_min = header->z_min * scale + offset;
  45.     header->z_max = header->z_max * scale + offset;
  46.     return (status);
  47. }
  48.  
  49. int write_grd_info (file, header)
  50. char *file;
  51. struct GRD_HEADER *header; {
  52.     int status;
  53.     char fname[BUFSIZ];
  54.     double scale = 1.0, offset = 0.0;
  55.     
  56.     grd_o_format = grd_get_o_format (file, fname, &scale, &offset);
  57.     header->z_min = header->z_min * scale + offset;
  58.     header->z_max = header->z_max * scale + offset;
  59.     status = (*gmtio_writeinfo[grd_o_format]) (fname, header);
  60.     return (status);
  61. }
  62.  
  63. int read_grd (file, header, grid, w, e, s, n, pad, complex)
  64. char *file;
  65. struct GRD_HEADER *header;
  66. float *grid;
  67. double w, e, s, n;    /* Sub-region to extract  [Use entire file if 0,0,0,0] */
  68. int pad[];        /* padding (# of empty rows/columns) on w, e, s, n of grid, respectively */
  69. BOOLEAN complex;    /* TRUE if array is to hold real and imaginary parts */
  70. {
  71.     int status;
  72.     char fname[BUFSIZ];
  73.     double scale = 1.0, offset = 0.0;
  74.     
  75.     grd_i_format = grd_get_i_format (file, fname, &scale, &offset);
  76.     status = (*gmtio_readgrd[grd_i_format]) (fname, header, grid, w, e, s, n, pad, complex);
  77.     grd_do_scaling (grid, (header->nx * header->ny), scale, offset);
  78.     return (status);
  79. }
  80.  
  81. int write_grd (file, header, grid, w, e, s, n, pad, complex)
  82. char *file;
  83. struct GRD_HEADER *header;
  84. float *grid;
  85. double w, e, s, n;    /* Sub-region to write out */
  86. int pad[];        /* padding on w, e, s, n of grid, respectively */
  87. BOOLEAN complex;    /* TRUE if array is to hold real and imaginary parts */
  88. {
  89.     int status;
  90.     char fname[BUFSIZ];
  91.     double scale = 1.0, offset = 0.0;
  92.  
  93.     grd_o_format = grd_get_o_format (file, fname, &scale, &offset);
  94.     grd_do_scaling (grid, (header->nx * header->ny), scale, offset);
  95.     status = (*gmtio_writegrd[grd_o_format]) (fname, header, grid, w, e, s, n, pad, complex);
  96.     return (status);
  97. }
  98.  
  99. /* Routines to see if a particular grd file format is specified as part of filename. */
  100.  
  101. int grd_get_i_format (file, fname, scale, offset)
  102. char *file, *fname;
  103. double *scale, *offset; {
  104.     int i = 0, j, n, id = 0;
  105.  
  106.     strcpy (fname, file);
  107.     
  108.     while (file[i] && file[i] != '=') i++;
  109.     
  110.     if (file[i]) {    /* Check format id */
  111.         i++;
  112.         n = sscanf (&file[i], "%d/%lf/%lf/%lf", &id, scale, offset, &grd_in_nan_value);
  113.         if (n == 1) *scale = 1.0, *offset = 0.0;
  114.         if (id < 0 || id >= N_GRD_FORMATS) {
  115.             fprintf (stderr, "GMT Warning: grdfile format option (%d) unknown, reset to 0\n", id);
  116.             id = 0;
  117.         }
  118.         j = (i == 1) ? i : i - 1;
  119.         fname[j] = 0;
  120.     }
  121.     return (id);
  122. }
  123.  
  124. int grd_get_o_format (file, fname, scale, offset)
  125. char *file, *fname;
  126. double *scale, *offset; {
  127.     int i = 0, j, n, id = 0;
  128.  
  129.     strcpy (fname, file);
  130.     
  131.     while (file[i] && file[i] != '=') i++;
  132.     
  133.     if (file[i]) {    /* Check format id */
  134.         i++;
  135.         n = sscanf (&file[i], "%d/%lf/%lf/%lf", &id, scale, offset, &grd_out_nan_value);
  136.         if (n == 1) *scale = 1.0, *offset = 0.0;
  137.         if (id < 0 || id >= N_GRD_FORMATS) {
  138.             fprintf (stderr, "GMT Warning: grdfile format option (%d) unknown, reset to 0\n", id);
  139.             id = 0;
  140.         }
  141.                 j = (i == 1) ? i : i - 1;
  142.                 fname[j] = 0;
  143.     }
  144.     return (id);
  145. }
  146.  
  147. /* Routine that scales and offsets the data if specified */
  148.  
  149. int grd_do_scaling (grid, nm, scale, offset)
  150. float grid[];
  151. int nm;
  152. double scale, offset; {
  153.     int i;
  154.     
  155.     if (scale == 1.0 && offset == 0.0) return;
  156.     
  157.     if (scale == 1.0)
  158.         for (i = 0; i < nm; i++) grid[i] += offset;
  159.     else if (offset == 0.0)
  160.         for (i = 0; i < nm; i++) grid[i] *= scale;
  161.     else
  162.         for (i = 0; i < nm; i++) grid[i] = grid[i] * scale + offset;
  163.  
  164.     return;
  165. }
  166.