home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Science / Science.zip / gmt_os2.zip / src / grdedit.c < prev    next >
C/C++ Source or Header  |  1995-03-13  |  5KB  |  179 lines

  1. /*--------------------------------------------------------------------
  2.  *    The GMT-system:    @(#)grdedit.c    2.14  3/13/95
  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.  * grdedit reads an existing grdfile and takes command line
  9.  * arguments to redefine some of the grdheader parameters:
  10.  *
  11.  *    x_min/x_max OR x_inc (the other is recomputed)
  12.  *    y_min/y_max OR y_inc (the other is recomputed)
  13.  *    z_scale_factor/z_add_offset
  14.  *    x_units/y_units/z_units
  15.  *    title/command/remark
  16.  *
  17.  * Author:    Paul Wessel
  18.  * Date:    9-JAN-1991-1995
  19.  * Version:    2.0
  20.  */
  21.  
  22. #include "gmt.h"
  23.  
  24. float *a;
  25.  
  26. main (argc, argv)
  27. int argc;
  28. char **argv; {
  29.     int i, entry, one_or_zero, dummy[4];
  30.     int error = FALSE, got_input = FALSE, got_region = FALSE, shift = FALSE;
  31.     
  32.     double w, e, s, n, shift_amount = 0.0;
  33.     
  34.     char *grdfile, input[512], *ptr;
  35.     
  36.     struct GRD_HEADER grd;
  37.     
  38.     input[0] = 0;
  39.     grdfile = CNULL;
  40.     w = e = s = n = 0.0;
  41.     dummy[3] = dummy[2] = dummy[1] = dummy[0] = 0;
  42.     
  43.     argc = gmt_begin (argc, argv);
  44.  
  45.     for (i = 1; i < argc; i++) {
  46.         if (argv[i][0] == '-') {
  47.             switch (argv[i][1]) {
  48.                 /* Common parameters */
  49.             
  50.                 case 'R':
  51.                 case '\0':
  52.                     error += get_common_args (argv[i], &w, &e, &s, &n);
  53.                     if (argv[i][1] == 'R') got_region = TRUE;
  54.                     break;
  55.  
  56.                 /* Supplemental parameters */
  57.             
  58.                 case 'D':
  59.                     strcpy (input, &argv[i][2]);
  60.                     got_input = TRUE;
  61.                     break;
  62.                 case 'S':
  63.                     shift = TRUE;
  64.                     break;
  65.                 default:
  66.                     error = TRUE;
  67.                     gmt_default_error (argv[i][1]);
  68.                     break;
  69.             }
  70.         }
  71.         else
  72.             grdfile = argv[i];
  73.     }
  74.         
  75.     if (argc == 1 || gmt_quick) {
  76.         fprintf (stderr, "grdedit %s - Modifying the header in a netCDF grdfile\n\n", GMT_VERSION);
  77.         fprintf (stderr, "usage: grdedit grdfile [-R<west>/<east>/<south>/<north>\n");
  78.         fprintf (stderr, "    [-S] [-Dxunit/yunit/zunit/scale/offset/title/remark]\n");
  79.         
  80.         if (gmt_quick) exit (-1);
  81.         
  82.         fprintf (stderr, "    grdfile is file to be modified\n");
  83.         fprintf (stderr, "\n\tOPTIONS:\n");
  84.         fprintf (stderr, "    -D to enter information.  Specify '=' to get default value\n");
  85.         explain_option ('R');
  86.         fprintf (stderr, "    -S For global grids of 360 degree longitude range.\n");
  87.         fprintf (stderr, "       Will rotate entire grid to coincide with new borders in -R\n");
  88.         exit (-1);
  89.     }
  90.     
  91.     if (shift && !got_region) {
  92.         fprintf (stderr, "%s: GMT SYNTAX ERROR -S option:  Must also specify -R\n", gmt_program);
  93.         error++;
  94.     }
  95.     if (shift && fabs (w - e) != 360.0) {
  96.         fprintf (stderr, "%s: GMT SYNTAX ERROR -S option:  -R longitudes must span exactly 360 degrees\n", gmt_program);
  97.         error++;
  98.     }
  99.     if (!grdfile) {
  100.         fprintf (stderr, "%s: GMT SYNTAX ERROR:  Must specify input file\n", gmt_program);
  101.         error++;
  102.     }
  103.     if (error) exit (-1);
  104.             
  105.     if (!strcmp (grdfile,  "=")) {
  106.         fprintf (stderr, "grdedit: Piping of grdfile not supported!\n");
  107.         exit (-1);
  108.     }
  109.  
  110.     if (read_grd_info (grdfile, &grd)) {
  111.         fprintf (stderr, "grdedit: Error opening file %s\n", grdfile);
  112.         exit (-1);
  113.     }
  114.     
  115.     if (shift && fabs (grd.x_max - grd.x_min) != 360.0) {
  116.         fprintf (stderr, "grdedit: Shift only allowed for global grids\n");
  117.         exit (-1);
  118.     }
  119.     
  120.     /* Decode grd information given, if any */
  121.     
  122.     if (got_input) {
  123.         ptr = strtok (input, "/");
  124.         entry = 0;
  125.         while (ptr) {
  126.             switch (entry) {
  127.                 case 0:
  128.                     if (ptr[0] != '=') strcpy (grd.x_units, ptr);
  129.                     break;
  130.                 case 1:
  131.                     if (ptr[0] != '=') strcpy (grd.y_units, ptr);
  132.                     break;
  133.                 case 2:
  134.                     if (ptr[0] != '=') strcpy (grd.z_units, ptr);
  135.                     break;
  136.                 case 3:
  137.                     if (ptr[0] != '=') grd.z_scale_factor = atof (ptr);
  138.                     break;
  139.                 case 4:
  140.                     if (ptr[0] != '=') grd.z_add_offset = atof (ptr);
  141.                     break;
  142.                 case 5:
  143.                     if (ptr[0] != '=') strcpy (grd.title, ptr);
  144.                     break;
  145.                 case 6:
  146.                     if (ptr[0] != '=') strcpy (grd.remark, ptr);
  147.                     break;
  148.                 default:
  149.                     break;
  150.             }
  151.             ptr = strtok (CNULL, "/");
  152.             entry++;
  153.         }
  154.     }
  155.     
  156.     if (got_region && !shift) {
  157.         one_or_zero = (grd.node_offset) ? 0 : 1;
  158.         grd.x_min = w;    grd.x_max = e;
  159.         grd.x_inc = (grd.x_max - grd.x_min) / (grd.nx - one_or_zero);
  160.         grd.y_min = s;    grd.y_max = n;
  161.         grd.y_inc = (grd.y_max - grd.y_min) / (grd.ny - one_or_zero);
  162.     }
  163.     
  164.     if (shift) {
  165.         shift_amount = w - grd.x_min;
  166.         a = (float *) memory (CNULL, (int)(grd.nx * grd.ny), sizeof (float), "grdedit");
  167.         read_grd (grdfile, &grd, a, 0.0, 0.0, 0.0, 0.0, dummy, FALSE);
  168.         grd_shift (&grd, a, shift_amount);
  169.         write_grd (grdfile, &grd, a, 0.0, 0.0, 0.0, 0.0, dummy, FALSE);
  170.         free ((char *)a);
  171.     }
  172.     else if (write_grd_info (grdfile, &grd)) {
  173.         fprintf (stderr, "grdedit: Error updating file %s\n", grdfile);
  174.         exit (-1);
  175.     }
  176.     
  177.     gmt_end (argc, argv);
  178. }
  179.