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

  1. /*--------------------------------------------------------------------
  2.  *    The GMT-system:    @(#)grdpaste.c    2.13  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.  * grdpaste.c reads two grdfiles and writes a new file with
  9.  * the first two pasted together along their common edge.
  10.  *
  11.  * Author:    Walter Smith
  12.  * Date:    5 august, 1988
  13.  * Updated to v2.0 20-May-1991-1995 Paul Wessel
  14.  *
  15.  */
  16.  
  17. #include "gmt.h"
  18.  
  19. float    *c;
  20.  
  21. main (argc, argv)
  22. int argc;
  23. char **argv;
  24. {
  25.     BOOLEAN    error = FALSE;
  26.     int    i, way, one_or_zero, pad[4];
  27.     char *grd_a, *grd_b, *grd_c;
  28.     struct GRD_HEADER ha, hb, hc;
  29.     
  30.     argc = gmt_begin (argc, argv);
  31.  
  32.     grd_a = grd_b = grd_c = CNULL;
  33.     
  34.     /* Check and interpret the command line arguments */
  35.     
  36.     for (i = 1; i < argc; i++) {
  37.         if (argv[i][0] == '-') {
  38.             switch(argv[i][1]) {
  39.                 /* Common parameters */
  40.             
  41.                 case 'V':
  42.                 case '\0':
  43.                     error += get_common_args (argv[i], 0, 0, 0, 0);
  44.                     break;
  45.                     
  46.                 /* Supplemental parameters */
  47.             
  48.                  case 'A':
  49.                      grd_a = &argv[i][2];
  50.                     break;
  51.                  case 'B':
  52.                      grd_b = &argv[i][2];
  53.                     break;
  54.                  case 'G':
  55.                      grd_c = &argv[i][2];
  56.                     break;
  57.                 default:        /* Options not recognized */
  58.                     error = TRUE;
  59.                     gmt_default_error (argv[i][1]);
  60.                     break;
  61.             }
  62.         }
  63.         else {
  64.             error = TRUE;
  65.             fprintf (stderr, "%s: GMT SYNTAX ERROR:  Options must start with a hyphen\n", gmt_program);
  66.         }
  67.     }
  68.     
  69.     if (gmt_quick || argc == 1) {
  70.         fprintf (stderr,"grdpaste %s - Join two grdfiles along common edge\n\n", GMT_VERSION);
  71.         fprintf (stderr, "usage: grdpaste -A<file_a> -B<file_b> -G<outfile> [-V]\n\n");
  72.         
  73.         if (gmt_quick) exit (-1);
  74.         
  75.         fprintf (stderr, "     where file_a and file_b are to be combined into outfile.\n");
  76.         fprintf (stderr, "     file_a and file_b must have same dx,dy and one edge in common.\n");
  77.         fprintf (stderr, "     If in doubt, run grdinfo first and check your files.\n");
  78.         fprintf (stderr, "     Use grdcut and/or grdsample to adjust files as necessary.\n");
  79.         fprintf (stderr, "\n\tOPTIONS:\n");
  80.         explain_option ('V');
  81.         exit (-1);
  82.     }
  83.  
  84.     if (!grd_a) {
  85.         fprintf (stderr, "%s: GMT SYNTAX ERROR -A:  Must specify input file\n", gmt_program);
  86.         error++;
  87.     }
  88.     if (!grd_b) {
  89.         fprintf (stderr, "%s: GMT SYNTAX ERROR -B:  Must specify input file\n", gmt_program);
  90.         error++;
  91.     }
  92.     if (!grd_c) {
  93.         fprintf (stderr, "%s: GMT SYNTAX ERROR -G:  Must specify output file\n", gmt_program);
  94.         error++;
  95.     }
  96.     if (error) exit (-1);
  97.  
  98.     /* Check that the options selected make sense */
  99.     
  100.  
  101.     /* Try to find a common side to join on  */
  102.  
  103.     grd_init (&hc, argc, argv, FALSE);
  104.     if (read_grd_info (grd_a, &ha)) {
  105.         fprintf (stderr, "grdpaste: Error opening file %s\n", grd_a);
  106.         exit (-1);
  107.     }
  108.     if (read_grd_info (grd_b, &hb)) {
  109.         fprintf (stderr, "grdpaste: Error opening file %s\n", grd_b);
  110.         exit (-1);
  111.     }
  112.  
  113.     if (ha.node_offset != hb.node_offset) error = TRUE;
  114.     if ((ha.z_scale_factor != hb.z_scale_factor) || (ha.z_add_offset != hb.z_add_offset)) {
  115.         fprintf (stderr, "grdpaste: Scale/offset not compatible!\n");
  116.         exit (-1);
  117.     }
  118.         
  119.     one_or_zero = 1 - ha.node_offset;
  120.         
  121.     if ( (ha.x_min == hb.x_min) && (ha.x_max == hb.x_max) ) {
  122.  
  123.         if (ha.y_max == hb.y_min) {
  124.             way = 1;
  125.             hc.nx = ha.nx;
  126.             hc.ny = ha.ny + hb.ny - one_or_zero;
  127.             hc.x_min = ha.x_min;
  128.             hc.x_max = ha.x_max;
  129.             hc.y_min = ha.y_min;
  130.             hc.y_max = hb.y_max;
  131.         }
  132.         else if (ha.y_min == hb.y_max) {
  133.             way = 2;
  134.             hc.nx = ha.nx;
  135.             hc.ny = ha.ny + hb.ny - one_or_zero;
  136.             hc.x_min = ha.x_min;
  137.             hc.x_max = ha.x_max;
  138.             hc.y_min = hb.y_min;
  139.             hc.y_max = ha.y_max;
  140.         }
  141.         else {
  142.             fprintf (stderr, "grdpaste:  Grids do not share a common edge!\n");
  143.             exit (-1);
  144.         }
  145.     }
  146.     else if ( (ha.y_min == hb.y_min) && (ha.y_max == hb.y_max) ) {
  147.  
  148.         if (ha.x_min == hb.x_max) {
  149.             way = 3;
  150.             hc.nx = ha.nx + hb.nx - one_or_zero;
  151.             hc.ny = ha.ny;
  152.             hc.x_min = hb.x_min;
  153.             hc.x_max = ha.x_max;
  154.             hc.y_min = ha.y_min;
  155.             hc.y_max = ha.y_max;
  156.         }
  157.         else if (ha.x_max == hb.x_min) {
  158.             way = 4;
  159.             hc.nx = ha.nx + hb.nx - one_or_zero;
  160.             hc.ny = ha.ny;
  161.             hc.x_min = ha.x_min;
  162.             hc.x_max = hb.x_max;
  163.             hc.y_min = ha.y_min;
  164.             hc.y_max = ha.y_max;
  165.         }
  166.         else {
  167.             fprintf (stderr, "grdpaste:  Grids do not share a common edge!\n");
  168.             exit (-1);
  169.         }
  170.     }
  171.     else {
  172.         fprintf (stderr, "grdpaste:  Grids do not share a common edge!\n");
  173.         exit (-1);
  174.     }
  175.  
  176.     if ( (ha.x_inc == hb.x_inc) && (ha.y_inc == hb.y_inc) ) {
  177.         hc.x_inc = ha.x_inc;
  178.         hc.y_inc = ha.y_inc;
  179.     }
  180.     else {
  181.         fprintf (stderr, "grdpaste:  Grid intervals do not match!\n");
  182.         exit (-1);
  183.     }
  184.  
  185.     /* Now we can do it  */
  186.  
  187.  
  188.     if (gmtdefs.verbose) {
  189.         fprintf (stderr, "File spec:\tW E S N dx dy nx ny:\n");
  190.         fprintf (stderr, "File_a:\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%d\t%d\n",
  191.             ha.x_min, ha.x_max, ha.y_min, ha.y_max, ha.x_inc, ha.y_inc, ha.nx, ha.ny);
  192.         fprintf (stderr, "File_b:\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%d\t%d\n",
  193.             hb.x_min, hb.x_max, hb.y_min, hb.y_max, hb.x_inc, hb.y_inc, hb.nx, hb.ny);
  194.         fprintf (stderr, "File_c:\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%.8lg\t%d\t%d\n",
  195.             hc.x_min, hc.x_max, hc.y_min, hc.y_max, hc.x_inc, hc.y_inc, hc.nx, hc.ny);
  196.     }
  197.     
  198.     c = (float *) memory (CNULL, (int)(hc.nx*hc.ny), sizeof (float), "grdpaste");
  199.     hc.node_offset = ha.node_offset;
  200.     hc.z_scale_factor = ha.z_scale_factor;
  201.     hc.z_add_offset = ha.z_add_offset;
  202.     pad[0] = pad[1] = pad[2] = pad[3] = 0;
  203.     
  204.     switch (way) {
  205.         case 1:
  206.             pad[3] = hb.ny - one_or_zero;
  207.             if (read_grd (grd_a, &ha, c, ha.x_min, ha.x_max, ha.y_min, ha.y_max, pad, FALSE)) {
  208.                 fprintf (stderr, "grdpaste: Error reading file %s\n", grd_a);
  209.                 exit (-1);
  210.             }
  211.             pad[3] = 0;    pad[2] = ha.ny - one_or_zero;
  212.             if (read_grd (grd_b, &hb, c, hb.x_min, hb.x_max, hb.y_min, hb.y_max, pad, FALSE)) {
  213.                 fprintf (stderr, "grdpaste: Error reading file %s\n", grd_b);
  214.                 exit (-1);
  215.             }
  216.             break;
  217.         case 2:
  218.             pad[2] = hb.ny - one_or_zero;
  219.             if (read_grd (grd_a, &ha, c, ha.x_min, ha.x_max, ha.y_min, ha.y_max, pad, FALSE)) {
  220.                 fprintf (stderr, "grdpaste: Error reading file %s\n", grd_a);
  221.                 exit (-1);
  222.             }
  223.             pad[2] = 0;    pad[3] = ha.ny - one_or_zero;
  224.             if (read_grd (grd_b, &hb, c, hb.x_min, hb.x_max, hb.y_min, hb.y_max, pad, FALSE)) {
  225.                 fprintf (stderr, "grdpaste: Error reading file %s\n", grd_b);
  226.                 exit (-1);
  227.             }
  228.             break;
  229.         case 3:
  230.             pad[0] = hb.nx - one_or_zero;
  231.             if (read_grd (grd_a, &ha, c, ha.x_min, ha.x_max, ha.y_min, ha.y_max, pad, FALSE)) {
  232.                 fprintf (stderr, "grdpaste: Error reading file %s\n", grd_a);
  233.                 exit (-1);
  234.             }
  235.             pad[0] = 0;    pad[1] = ha.nx - one_or_zero;
  236.             if (read_grd (grd_b, &hb, c, hb.x_min, hb.x_max, hb.y_min, hb.y_max, pad, FALSE)) {
  237.                 fprintf (stderr, "grdpaste: Error reading file %s\n", grd_b);
  238.                 exit (-1);
  239.             }
  240.             break;
  241.         case 4:
  242.             pad[1] = hb.nx - one_or_zero;
  243.             if (read_grd (grd_a, &ha, c, ha.x_min, ha.x_max, ha.y_min, ha.y_max, pad, FALSE)) {
  244.                 fprintf (stderr, "grdpaste: Error reading file %s\n", grd_a);
  245.                 exit (-1);
  246.             }
  247.             pad[1] = 0;    pad[0] = ha.nx - one_or_zero;
  248.             if (read_grd (grd_b, &hb, c, hb.x_min, hb.x_max, hb.y_min, hb.y_max, pad, FALSE)) {
  249.                 fprintf (stderr, "grdpaste: Error reading file %s\n", grd_b);
  250.                 exit (-1);
  251.             }
  252.             break;
  253.     }
  254.                         
  255.     if (write_grd (grd_c, &hc, c, 0.0, 0.0, 0.0, 0.0, pad, FALSE)) {
  256.         fprintf (stderr, "grdpaste: Error writing file %s\n", grd_c);
  257.         exit (-1);
  258.     }
  259.     
  260.     free ( (char *) c);
  261.     
  262.     gmt_end (argc, argv);
  263. }
  264.