/*-------------------------------------------------------------------- * $Id: psmeca.c,v 1.4.4.1 2002/02/27 17:41:10 pwessel Exp $ * * Copyright (c) 1996-2001 by G. Patau * See README file for copying and redistribution conditions. *--------------------------------------------------------------------*/ /* psmeca will read pairs (or ) from inputfile and plot symbols on a map. Focal mechanisms are specified (double couple or moment tensor). PostScript code is written to stdout. Author: Genevieve Patau Date: 7 July 1998 Version: 3.3 Roots: based on psxy.c Last change 18 February 2000 */ #include "gmt.h" /* to have gmt environment */ #include "meca.h" #include "utilmeca.h" /* symbols for plotting axis */ #define CROSS 1 #define CIRCLE 2 #define SQUARE 3 #define TRIANGLE 4 #define DIAMOND 5 #define STAR 6 #define HEXAGON 7 #define ITRIANGLE 8 int *plot_pen; main (int argc, char **argv) { int i, symbol = 0, n, ix = 0, iy = 1, n_files = 0, fno; int n_args; int n_rec = 0; BOOLEAN outline = FALSE, p_outline = FALSE, t_outline = FALSE; BOOLEAN error = FALSE, nofile = TRUE; BOOLEAN done, get_rgb = FALSE, no_size_needed; BOOLEAN read_cmt = FALSE, read_aki = FALSE, read_planes = FALSE; BOOLEAN read_tensor = FALSE, plot_dc = FALSE, plot_zerotrace = FALSE; BOOLEAN read_axis = FALSE; BOOLEAN read_change_position = FALSE, write_change_position = FALSE; BOOLEAN transparence = FALSE, one_size = FALSE, no_label = FALSE; BOOLEAN plot_axis = FALSE, tr_zerotrace = FALSE; BOOLEAN skip_if_outside = TRUE; BOOLEAN def_lpen = FALSE, def_cpen = FALSE, def_tr_pen = FALSE; BOOLEAN def_ppen = FALSE, def_tpen = FALSE, def_tz_pen = FALSE; BOOLEAN def_pfill = FALSE, def_tfill = FALSE; BOOLEAN draw_box = FALSE; BOOLEAN transparence_old, not_defined = FALSE; double xy[2], xynew[2], west = 0.0, east = 0.0, south = 0.0, north = 0.0; double plot_x, plot_y, scale = 0.0; double plot_xnew, plot_ynew; double t11 = 1.0, t12 = 0.0, t21 = 0.0, t22 = 1.0; double delaz; char string[BUFSIZ], event_title[BUFSIZ], txt_a[32]; char line[BUFSIZ], symbol_type, col[15][40], *cpt; FILE *fp = NULL; struct GMT_PEN pen, lpen, cpen, tr_pen, tz_pen; struct GMT_PEN ppen, tpen; struct GMT_FILL fill, efill, nofill; struct GMT_FILL pfill, tfill, bfill; struct nodal_plane NP1, NP2; st_me meca; struct MOMENT moment; struct M_TENSOR mt; struct AXIS T, N, P; int n_plane = 0, n_plane_old; int default_fontsize = 9, default_justify = 2; int fontsize = default_fontsize, justify = default_justify, form = 0; int new = 1; double default_offset = gmtdefs.measure_unit == 0 ? 0.1 : 0.04; double default_pointsize = 0.005; double pointsize = default_pointsize, offset = default_offset, angle = 0.; double fault, depth, depmin = 0., depmax = 900.; double size, a_size; double P_x, P_y, T_x, T_y; char P_sym_type, T_sym_type; int P_sym, T_sym; argc = GMT_begin (argc, argv); GMT_init_pen (&pen, GMT_PENWIDTH); GMT_init_pen (&lpen, GMT_PENWIDTH); GMT_init_pen (&cpen, GMT_PENWIDTH); GMT_init_pen (&tr_pen, GMT_PENWIDTH); GMT_init_pen (&tz_pen, GMT_PENWIDTH); GMT_init_pen (&ppen, GMT_PENWIDTH); GMT_init_pen (&tpen, GMT_PENWIDTH); GMT_init_fill (&fill, 0, 0, 0); GMT_init_fill (&efill, 255, 255, 255); GMT_init_fill (&nofill, -1, -1, -1); GMT_init_fill (&bfill, 255, 255, 255); GMT_init_fill (&pfill, 255, 255, 255); GMT_init_fill (&tfill, 255, 255, 255); /* Check and interpret the command line arguments */ for (i = 1; !error && i < argc; i++) { if (argv[i][0] == '-') { switch(argv[i][1]) { /* Common parameters */ case 'B': case 'H': case 'J': case 'K': case 'O': case 'P': case 'R': case 'U': case 'V': case 'X': case 'x': case 'Y': case 'y': case 'c': case ':': case '\0': error += GMT_get_common_args (argv[i], &west, &east, &south, &north); break; /* Supplemental parameters */ case 'C': /* Change position [set line attributes] */ read_change_position = TRUE; if (strlen(argv[i]) > 2) { if(strchr(argv[i], 'P')) { strcpy(txt_a, strchr(argv[i]+1, 'P')+1); pointsize = GMT_convert_units (txt_a, GMT_INCH); } if (argv[i][2] != 'P') { def_cpen = TRUE; strcpy(txt_a, &argv[i][2]); n=0; while (txt_a[n] != 'P') n++; txt_a[n]=0; if (GMT_getpen (txt_a, &cpen)) { GMT_pen_syntax ('C'); error++; } } } break; case 'D': /* Plot events between depmin and depmax deep */ sscanf(&argv[i][2], "%lf/%lf", &depmin, &depmax); break; case 'E': /* Set color for extensive parts */ if (!argv[i][2] || (argv[i][2] && GMT_getfill (&argv[i][2], &efill))) { GMT_fill_syntax ('G'); error++; } break; case 'G': /* Set color for compressive parts */ if (!argv[i][2] || (argv[i][2] && GMT_getfill (&argv[i][2], &fill))) { GMT_fill_syntax ('G'); error++; } break; case 'L': /* Draw outline [set outline attributes] */ outline = TRUE; if (argv[i][2]) { def_lpen = TRUE; if (GMT_getpen (&argv[i][2], &lpen)) { GMT_pen_syntax ('L'); error++; } } break; case 'M': /* Same size for any magnitude */ one_size = TRUE; break; case 'N': /* Do not skip points outside border */ skip_if_outside = FALSE; break; case 'r': /* draw box around text */ draw_box = TRUE; if(strlen(argv[i]) > 2 ) { GMT_getfill (&argv[i][2], &bfill); } break; case 'S': /* Get symbol [and size] */ symbol_type = argv[i][2]; strcpy(txt_a, &argv[i][3]); n=0; while (txt_a[n] && txt_a[n] != '/') n++; txt_a[n]=0; scale = GMT_convert_units (txt_a, GMT_INCH); if(strstr(argv[i], "/\0") != NULL) { sscanf(strstr(argv[i], "/\0"), "/%d/%lf", &fontsize, &offset); if (fontsize == 0) fontsize = default_fontsize; if (fontsize < 0) no_label = TRUE; if (offset == 0.) offset = default_offset; if (argv[i][strlen(argv[i]) - 1] == 'u') justify = 10; } switch (symbol_type) { case 'c': read_cmt = TRUE; break; case 'a': read_aki = TRUE; break; case 'p': read_planes = TRUE; break; case 'x': read_axis = TRUE; break; case 'y': read_axis = TRUE; plot_dc = TRUE; break; case 't': read_axis = TRUE; plot_zerotrace = TRUE; break; case 'm': read_tensor = TRUE; break; case 'd': read_tensor = TRUE; plot_dc = TRUE; break; case 'z': read_tensor = TRUE; plot_zerotrace = TRUE; break; default: error = TRUE; break; } break; case 'T': transparence = TRUE; sscanf (&argv[i][2], "%d",&n_plane); if(strlen(argv[i]) > 4) { /* Set transparent attributes */ def_tr_pen = TRUE; if (GMT_getpen (&argv[i][4], &tr_pen)) { GMT_pen_syntax ('T'); error++; } } break; case 'z': /* overlay zerotrace moment tensor */ tr_zerotrace = TRUE; if(strlen(argv[i]) > 2) { /* Set transparent attributes */ def_tz_pen = TRUE; if (GMT_getpen (&argv[i][2], &tz_pen)) { GMT_pen_syntax ('z'); error++; } } break; case 'W': /* Set line attributes */ if (argv[i][2] && GMT_getpen (&argv[i][2], &pen)) { GMT_pen_syntax ('W'); error++; } break; case 'Z': /* Vary symbol color with z */ cpt = &argv[i][2]; get_rgb = TRUE; break; case 'a': /* plot axis */ plot_axis = TRUE; if(strlen(argv[i]) == 2) { strcpy(txt_a,"0.08i"); P_sym_type = 'c'; T_sym_type = 'c'; } else { a_size = GMT_convert_units (txt_a, GMT_INCH); strcpy(txt_a, &argv[i][3]); n=0; while (txt_a[n] && txt_a[n] != '/') n++; txt_a[n]=0; a_size = GMT_convert_units (txt_a, GMT_INCH); if(strstr(argv[i], "/\0") != NULL) { strcpy(txt_a,strstr(argv[i], "/\0")); switch (strlen(txt_a)) { case 1: P_sym_type = 'c'; T_sym_type = 'c'; break; case 2: P_sym_type = txt_a[1]; T_sym_type = txt_a[1]; break; case 3: P_sym_type = txt_a[1]; T_sym_type = txt_a[2]; break; } } } switch (P_sym_type) { case 'a': P_sym = STAR; break; case 'c': P_sym = CIRCLE; break; case 'd': P_sym = DIAMOND; break; case 'h': P_sym = HEXAGON; break; case 'i': P_sym = ITRIANGLE; break; case 's': P_sym = SQUARE; break; case 't': P_sym = TRIANGLE; break; case 'x': P_sym = CROSS; break; } switch (T_sym_type) { case 'a': T_sym = STAR; break; case 'c': T_sym = CIRCLE; break; case 'd': T_sym = DIAMOND; break; case 'h': T_sym = HEXAGON; break; case 'i': T_sym = ITRIANGLE; break; case 's': T_sym = SQUARE; break; case 't': T_sym = TRIANGLE; break; case 'x': T_sym = CROSS; break; } break; case 'e': /* Set color for T axis symbol */ if (strlen(argv[i]) > 2) { def_tfill = TRUE; if (GMT_getfill (&argv[i][2], &tfill)) { GMT_fill_syntax ('e'); error++; } } break; case 'g': /* Set color for P axis symbol */ if (strlen(argv[i]) > 2) { def_pfill = TRUE; if (GMT_getfill (&argv[i][2], &pfill)) { GMT_fill_syntax ('g'); error++; } } break; case 'p': /* Draw outline of P axis symbol [set outline attributes] */ p_outline = TRUE; if(strlen(argv[i]) > 2) { def_ppen = TRUE; if (GMT_getpen (&argv[i][2], &ppen)) { GMT_pen_syntax ('p'); error++; } } break; case 't': /* Draw outline of T axis symbol [set outline attributes] */ t_outline = TRUE; if(strlen(argv[i]) > 2){ def_tpen = TRUE; if (GMT_getpen (&argv[i][2], &tpen)) { GMT_pen_syntax ('t'); error++; } } break; case 'o': /* use psvelomeca format (without depth in 3rd column) */ new = 0; break; /* Illegal options */ default: /* Options not recognized */ error = TRUE; break; } } else n_files++; } /* Check that the options selected are mutually consistant */ no_size_needed = (read_cmt || read_planes || read_aki || read_tensor || read_axis); error += GMT_check_rgb (pen.rgb) + GMT_check_rgb (cpen.rgb) + GMT_check_rgb (lpen.rgb) + GMT_check_rgb (ppen.rgb) + GMT_check_rgb (tpen.rgb) + GMT_check_rgb (fill.rgb) + GMT_check_rgb (efill.rgb) + GMT_check_rgb (pfill.rgb) + GMT_check_rgb (tfill.rgb) + GMT_check_rgb (bfill.rgb) + GMT_check_rgb (gmtdefs.basemap_frame_rgb); /* Only one allowed */ if (no_size_needed > 1) error++; if (!no_size_needed && (symbol > 1 && scale <= 0.0)) error++; if(get_rgb && !new) error++; if (argc == 1 || GMT_quick || error) { /* Display usage */ fprintf (stderr,"psmeca %s - Plot seismological symbols on maps\n\n", GMT_VERSION); fprintf (stderr,"usage: psmeca -J -R \n"); fprintf (stderr, " -S[/fontsize[/justify/offset/angle/form]]\n"); fprintf (stderr, " [-B] [-C[P]] \n"); fprintf (stderr, " [-Ddepmin/depmax] [-E] [-G]\n"); fprintf (stderr, " [-H] [-K] [-L] [-M] [-N] [-O] [-P] [-r]\n"); fprintf (stderr, " [-Tnplane[/]] [-U[/dx/dy/][