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

  1. /*--------------------------------------------------------------------
  2.  *    The GMT-system:    @(#)grdclip.c    2.16  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.    grdclip read a grdfile and sets all values < the user-supplied
  9.    lower limit to the value <below>, and all values > the user-
  10.    supplied upper limit to the value <above>.  above/below can
  11.    be any number of gmt_NaN.
  12.  
  13.    WHF Smith, 22 Aug 88
  14.    Modified for v2.0 4/26/91 P.Wessel
  15.  
  16.  */
  17.  
  18.  
  19. #include "gmt.h"
  20.  
  21. float *data;
  22.  
  23. main (argc, argv)
  24. int argc;
  25. char **argv; {
  26.  
  27.     int    error, set_above, set_below, i, nxy, n_above, n_below, n, dummy[4];
  28.     float    above, below, low, high;
  29.     char *infile, *outfile;
  30.     struct GRD_HEADER header;
  31.  
  32.     argc = gmt_begin (argc, argv);
  33.  
  34.     error = set_above = set_below = FALSE;
  35.     n_above = n_below = 0;
  36.     low = high = 0.0;
  37.     dummy[3] = dummy[2] = dummy[1] = dummy[0] = 0;
  38.  
  39.     for (i = 1; i < argc; i++) {
  40.         if (argv[i][0] == '-') {
  41.             switch (argv[i][1]) {
  42.                 /* Common parameters */
  43.             
  44.                 case 'V':
  45.                 case '\0':
  46.                     error += get_common_args (argv[i], 0, 0, 0, 0);
  47.                     break;
  48.                 
  49.                 /* Supplemental parameters */
  50.             
  51.                 case 'A':
  52.                     set_above = TRUE;
  53.                     n = sscanf (&argv[i][2], "%f/%f", &high, &above);
  54.                     if (n == 0) {
  55.                         fprintf (stderr, "%s: GMT SYNTAX ERROR -A option.  Correct syntax:\n", gmt_program);
  56.                         fprintf (stderr, "\t-A<high>/<above>, <above> may be set to NaN\n");
  57.                         error = TRUE;
  58.                     }
  59.                     else if (n == 1) above = gmt_NaN;
  60.                     break;
  61.                 case 'B':
  62.                     set_below = TRUE;
  63.                     n = sscanf (&argv[i][2], "%f/%f", &low, &below);
  64.                     if (n == 0) {
  65.                         fprintf (stderr, "%s: GMT SYNTAX ERROR -B option.  Correct syntax:\n", gmt_program);
  66.                         fprintf (stderr, "\t-B<low>/<below>, <below> may be set to NaN\n");
  67.                         error = TRUE;
  68.                     }
  69.                     else if (n == 1) below = gmt_NaN;
  70.                     break;
  71.                 case 'G':
  72.                     outfile = &argv[i][2];
  73.                     break;
  74.  
  75.                 default:
  76.                     error = TRUE;
  77.                     gmt_default_error (argv[i][1]);
  78.                     break;
  79.             }
  80.         }
  81.         else
  82.             infile = argv[i];
  83.     }
  84.     
  85.     if (gmt_quick || argc == 1) {
  86.         fprintf (stderr, "grdclip %s - Clipping of range in grdfiles\n\n", GMT_VERSION);
  87.         fprintf (stderr, "usage: grdclip <input_grdfile> -G<output_grdfile>\n");
  88.         fprintf (stderr, "\t[-A<high/above>] [-B<low/below>] [-V]\n");
  89.         
  90.         if (gmt_quick) exit (-1);
  91.         
  92.         fprintf (stderr, "\tYou must choose at least one of A or B.\n");
  93.         fprintf (stderr, "\t-G name of output grid.\n");
  94.         fprintf (stderr, "\n\tOPTIONS:\n");
  95.         fprintf (stderr, "\t-A will set all data > high to the <above> value.\n");
  96.         fprintf (stderr, "\t-B will set all data < low to the <below> value.\n");
  97.         fprintf (stderr, "\t   above/below can be any number including gmt_NaN\n");
  98.         explain_option ('V');
  99.         exit (-1);
  100.     }
  101.  
  102.     if (!outfile) {
  103.         fprintf (stderr, "%s: GMT SYNTAX ERROR -G option:.  Must specify output file\n", gmt_program);
  104.         error++;
  105.     }
  106.     if (!infile) {
  107.         fprintf (stderr, "%s: GMT SYNTAX ERROR:.  Must specify input file\n", gmt_program);
  108.         error++;
  109.     }
  110.     
  111.     if (error) exit (-1);
  112.         
  113.     if (read_grd_info (infile, &header)) {
  114.         fprintf (stderr, "grdclip: Error opening file %s\n", infile);
  115.         exit (-1);
  116.     }
  117.     
  118.     grd_init (&header, argc, argv, TRUE);
  119.     
  120.     nxy = header.nx * header.ny;
  121.     data = (float *) memory (CNULL, nxy, sizeof (float), "grdclip");
  122.     
  123.     if (read_grd (infile, &header, data, 0.0, 0.0, 0.0, 0.0, dummy, FALSE)) {
  124.         fprintf (stderr, "grdclip: Error reading file %s\n", infile);
  125.         exit (-1);
  126.     }
  127.     
  128.     for (i = 0; i < nxy; i++) {
  129.         if (set_above && (!bad_float ((double)data[i])) && data[i] > high) {
  130.             data[i] = above;
  131.             n_above++;
  132.         }
  133.         else if (set_below && (!bad_float ((double)data[i])) && data[i] < low) {
  134.             data[i] = below;
  135.             n_below++;
  136.         }
  137.     }
  138.     
  139.     if (write_grd (outfile, &header, data, 0.0, 0.0, 0.0, 0.0, dummy, FALSE)) {
  140.         fprintf (stderr, "grdclip: Error writing file %s\n", infile);
  141.         exit (-1);
  142.     }
  143.     
  144.     free ((char *) data);
  145.  
  146.     if (gmtdefs.verbose) {
  147.         if (set_below) fprintf (stderr, "%d values < %g set to %g\n", n_below, low, below);
  148.         if (set_above) fprintf (stderr, "%d values > %g set to %g\n", n_above, high, above);
  149.     }
  150.     
  151.     gmt_end (argc, argv);
  152. }
  153.