source: trunk/src/seismic_processing/hyp2000_mgr/hyp2000_mgr.c @ 3170

Revision 3170, 31.7 KB checked in by paulf, 13 years ago (diff)

changes for Linux and g77 compiling

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1
2/*
3 *   THIS FILE IS UNDER RCS - DO NOT MODIFY UNLESS YOU HAVE
4 *   CHECKED IT OUT USING THE COMMAND CHECKOUT.
5 *
6 *    $Id$
7 *
8 *    Revision history:
9 *     $Log$
10 *     Revision 1.7  2007/12/14 21:47:58  paulf
11 *     changes for Linux and g77 compiling
12 *
13 *     Revision 1.6  2007/01/19 16:08:37  paulf
14 *     patched WINNT for older compiler
15 *
16 *     Revision 1.5  2006/10/16 17:13:51  paulf
17 *     intel 9.1 fixes
18 *
19 *     Revision 1.4  2006/06/06 21:19:33  paulf
20 *     upgraded for intel9
21 *
22 *     Revision 1.1.1.1  2005/07/14 20:10:34  paulf
23 *     Local ISTI CVS copy of EW v6.3
24 *
25 *     Revision 1.3  2002/06/05 15:30:48  patton
26 *     Made logit changes.
27 *
28 *     Revision 1.2  2001/04/18 21:08:57  dietz
29 *     Added the following commands to the hypoinverse startup phase
30 *     of hyp2000_mgr.  These commands set the input/output formats
31 *     to those used by Earthworm modules.  Added commands:
32 *       200, COP, CAR
33 *
34 *     Revision 1.1  2000/02/14 18:40:56  lucky
35 *     Initial revision
36 *
37 *
38 */
39
40
41   /*******************************************************************
42    *                          hyp2000_mgr.c                          *
43    *                                                                 *
44    *     C program for managing hyp2000.                             *
45    *     Hypo_mgr calls the FORTRAN subroutine "hypo_ew".            *
46    *******************************************************************/
47
48#include <stdio.h>
49#include <string.h>
50#include <stdlib.h>
51#include <time.h>
52#include <earthworm.h>
53#include <kom.h>
54#include <transport.h>
55
56const int BufLen = MAX_BYTES_PER_EQ;      /* Message buffer length */
57#define SUMCARDLEN 200
58const int SumCardLen = SUMCARDLEN;
59
60/* Function prototypes
61 *********************/
62void GetConfig( char * );
63void LookUp( void );
64void hyp2000sum_hypo71sum2k( char * );
65void ReportError( int );
66void LogHypoError( int );
67void PrintSumLine( char * );
68int  callHypo( char * );
69void Hypo( char *, int * );
70
71/* Read from (or derived from info in) configuration file
72 ********************************************************/
73char          RingName[20];  /* Name of transport ring to write to   */
74SHM_INFO      Region;        /* working info for transport ring      */
75unsigned char MyModId;       /* label outgoing messages with this id */
76char          SourceCode;    /* label to tack on summary cards       */
77int           LogSwitch;     /* Set level of output to log file:     */
78                             /*   0 = don't write a log file at all  */
79                             /*   1 = write only errors to log file  */
80                             /*   2 = write errors & summary lines   */
81
82/* Things to look up in the earthworm.h tables with getutil.c functions
83 **********************************************************************/
84static long          RingKey;       /* key to pick transport ring            */
85static unsigned char InstId;        /* local installation id                 */
86static unsigned char TypeError;
87static unsigned char TypeKill;
88static unsigned char TypeHyp2000Arc;
89static unsigned char TypeH71Sum2K;
90
91/* These strings contain file names
92   ********************************/
93static char arcIn[20];          /* Archive file sent to hypo_ew            */
94static char arcOut[20];         /* Archive file output by hypo_ew          */
95static char sumName[20];        /* Summary file output by hypo_ew          */
96
97/* Error to send to statmgr.  Errors 100-149 are reserved for hyp2000_mgr.
98  (must not overlap with error numbers of other links in the sausage.)
99 ************************************************************************/
100#define ERR_TOOBIG        101   /* Got a msg from pipe too big for target  */
101#define ERR_TMPFILE       102   /* Error writing hypoinverse input file    */
102#define ERR_ARCFILE       103   /* Error reading hypoinverse archive file  */
103#define ERR_ARC2RING      104   /* Trouble putting arcmsg in memory ring   */
104#define ERR_SUM2RING      105   /* Trouble putting summsg in memory ring   */
105#define ERR_MSG2RING      106   /* Trouble passing a msg from pipe to ring */
106#define ERR_PIPEPUT       107   /* Trouble writing to pipe                 */
107
108
109int main( int argc, char *argv[] )
110{
111   static char msg[MAX_BYTES_PER_EQ];  /* Message buffer (for .arc messages) */
112   MSG_LOGO    logo;                /* Type, module, instid of retrieved msg */
113   FILE       *fptmp;           /* Pointer to temporary file (hypoinv input) */
114   FILE       *fparc;           /* Pointer to archive file (hypoinv output)  */
115   char        sumCard[200];    /* Summary card produced by hypoinverse      */
116   int         rc;
117   size_t      nread;           /* Number of bytes read from file            */
118   int         length;
119   char       *configFile;
120   char       *commandFile;
121   int         type;
122   int         iresr;
123   char        hypo_msg[80];
124
125/* Check command line arguments
126   ****************************/
127   if ( argc != 3 )
128   {
129      fprintf( stderr, "Usage: hyp2000_mgr <config file> <command file>\n" );
130      return -1;
131   }
132   configFile  = argv[1];
133   commandFile = argv[2];
134
135/* Initialize name of log-file & open it
136 ***************************************/
137   logit_init( argv[1], 0, 512, 1 );
138
139/* Read in the configuration file
140   ******************************/
141   GetConfig( configFile );
142   logit( "" , "hyp2000_mgr: Read command file <%s>\n", configFile );
143
144/* Make up the names of the temporary arc files
145   ********************************************/
146   sprintf( arcIn,  "hypoMgrArcIn%u",  MyModId );
147   sprintf( arcOut, "hypoMgrArcOut%u", MyModId );
148   strcpy( sumName, "none" );
149
150/* Look up important info from earthworm.h tables
151 ************************************************/
152   LookUp();
153
154/* Reinitialize logit to desired logging level
155 *********************************************/
156   logit_init( argv[1], 0, 512, LogSwitch );
157
158/* Attach to the transport ring (Must already exist)
159   *************************************************/
160   tport_attach( &Region, RingKey );
161
162/* Read in station & model info via command file
163   *********************************************/
164   sprintf( hypo_msg, "@%s", commandFile );
165   if( callHypo( hypo_msg ) != 0 ) return -1;       /* load startup file */
166   logit( "t", "hyp2000_mgr: Initialized hypoinverse with file <%s>\n",
167           commandFile );
168
169/* Hard-wire input phase file name & format
170   ****************************************/
171   if( callHypo( "200 T 1900 0" ) != 0 ) return -1; /* force Y2K formats  */
172   if( callHypo( "COP 5" )        != 0 ) return -1; /* input arc w/shadow */
173   sprintf( hypo_msg, "PHS '%s'", arcIn );
174   if( callHypo( hypo_msg )       != 0 ) return -1; /* input phase file   */
175
176/* Hard-wire output file names & formats
177   *************************************/
178   if( callHypo( "CAR 3" )        != 0 ) return -1; /* output arc w/shadow*/
179   sprintf( hypo_msg, "ARC '%s'", arcOut );
180   if( callHypo( hypo_msg )       != 0 ) return -1; /* archive output file*/
181   sprintf( hypo_msg, "SUM '%s'", sumName );
182   if( callHypo( hypo_msg )       != 0 ) return -1; /* summary output file*/
183
184/* Get a message from the pipe
185   ***************************/
186   while ( 1 )
187   {
188      rc = pipe_get( msg, BufLen, &type );
189      if ( rc < 0 )
190      {
191         if ( rc == -1 )
192         {
193            ReportError( ERR_TOOBIG );
194            logit( "et", "hyp2000_mgr: Message in pipe too big for buffer. Exiting.\n" );
195         }
196         else if ( rc == -2 )
197            logit( "et", "hyp2000_mgr: <null> on pipe_get. Exiting.\n" );
198         else if ( rc == -3 )
199            logit( "et", "hyp2000_mgr: EOF on pipe_get. Exiting.\n" );
200         break;
201      }
202
203/* Stop program if this is a "kill" message
204   ****************************************/
205      if ( type == (int) TypeKill )
206      {
207         logit( "t", "hyp2000_mgr: Termination requested. Exiting.\n" );
208         break;
209      }
210
211/* This is an archive file event
212   *****************************/
213      if ( type == (int) TypeHyp2000Arc )
214      {
215
216/* Create temporary archive file.  This file will be
217   overwritten the next time an event is processed.
218   *************************************************/
219         fptmp = fopen( arcIn, "w" );
220         if ( fptmp == (FILE *) NULL )
221         {
222            ReportError( ERR_TMPFILE );
223            logit( "et", "hyp2000_mgr: Error creating file: %s\n", arcIn );
224            continue;
225         }
226         length = strlen( msg );
227         if ( fwrite( msg, (size_t)1, (size_t)length, fptmp ) == 0 )
228         {
229            ReportError( ERR_TMPFILE );
230            logit( "et", "hyp2000_mgr: Error writing to file: %s\n", arcIn );
231            fclose( fptmp );
232            continue;
233         }
234         fclose( fptmp );
235
236/* Locate the event
237   ****************/
238         if( callHypo( "LOC" ) != 0 ) {
239            logit( "e", "hyp2000_mgr: Nonfatal error(s) locating event.\n" );
240         }
241         remove( arcIn );
242
243/* Get the archive file from disk
244   ******************************/
245         fparc = fopen( arcOut, "r" );
246         if ( fparc == (FILE *) NULL )
247         {
248            ReportError( ERR_ARCFILE );
249            logit( "et", "hyp2000_mgr: Error opening arcfile <%s>\n", arcOut );
250            continue;
251         }
252         nread = fread( msg, sizeof(char), (size_t)BufLen, fparc );
253         fclose( fparc );
254         if ( nread == 0 )
255         {
256            ReportError( ERR_ARCFILE );
257            logit( "et", "hyp2000_mgr: Error reading arcfile <%s>\n", arcOut );
258            continue;
259         }
260         remove( arcOut );
261
262/* Send the archive file to the transport ring
263   *******************************************/
264         logo.instid = InstId;
265         logo.mod    = MyModId;
266         logo.type   = TypeHyp2000Arc;
267         if ( tport_putmsg( &Region, &logo, (long) nread, msg ) != PUT_OK )
268         {
269            ReportError( ERR_ARC2RING );
270            logit( "et",
271                   "hyp2000_mgr: Error sending archive msg to transport ring.\n" );
272         }
273
274/* Get the summary line from archive message (first line)
275   ******************************************************/
276         sscanf( msg, "%[^\n]", sumCard );
277         /*logit("e", "1st line of arcmsg:\n%s\n\n", sumCard );*/ /*DEBUG*/
278
279/* Convert the hypoinverse summary to hypo71
280   summary and add the source code to it
281   *****************************************/
282         hyp2000sum_hypo71sum2k( sumCard );
283         sumCard[81] = SourceCode;
284
285/* Print a status line to stderr
286   *****************************/
287         PrintSumLine( sumCard );
288
289/* Send the summary file to the transport ring
290   *******************************************/
291         logo.instid = InstId;
292         logo.mod    = MyModId;
293         logo.type   = TypeH71Sum2K;
294         if ( tport_putmsg( &Region, &logo, strlen(sumCard), sumCard ) != PUT_OK )
295         {
296            ReportError( ERR_SUM2RING );
297            logit( "et",
298               "hyp2000_mgr: Error sending summary line to transport ring.\n" );
299         }
300      }
301
302/* The message is not of TYPE_KILL or TYPE_HYP2000ARC.
303   Send it to the HYPO_RING.
304   ***************************************************/
305      else
306      {
307         logo.instid = InstId;
308         logo.mod    = MyModId;
309         logo.type   = type;
310         if ( tport_putmsg( &Region, &logo, strlen(msg), msg ) != PUT_OK )
311         {
312            ReportError( ERR_MSG2RING );
313            logit( "et",
314                   "hyp2000_mgr: Error passing msg (type %d) to transport ring.\n",
315                    (int) type );
316         }
317      }
318   }
319
320/* Detach from the transport ring and exit
321   ***************************************/
322   tport_detach( &Region );
323
324   return 0;
325}
326
327
328  /*******************************************************************
329   *                           GetConfig()                           *
330   *                                                                 *
331   *  Processes command file using kom.c functions.                  *
332   *  Exits if any errors are encountered.                           *
333   *******************************************************************/
334#define ncommand 4        /* # of required commands you expect to process   */
335void GetConfig(char *configfile)
336{
337   char   init[ncommand]; /* init flags, one byte for each required command */
338   int    nmiss;          /* number of required commands that were missed   */
339   char  *com;
340   char  *str;
341   int    nfiles;
342   int    success;
343   int    i;
344
345/* Set to zero one init flag for each required command
346 *****************************************************/
347   for( i=0; i<ncommand; i++ )  init[i] = 0;
348
349/* Open the main configuration file
350 **********************************/
351   nfiles = k_open( configfile );
352   if ( nfiles == 0 ) {
353        logit( "e",
354                "hyp2000_mgr: Error opening command file <%s>. Exiting.\n",
355                 configfile );
356        exit( -1 );
357   }
358
359/* Process all command files
360 ***************************/
361   while(nfiles > 0)   /* While there are command files open */
362   {
363        while(k_rd())        /* Read next line from active file  */
364        {
365            com = k_str();         /* Get the first token from line */
366
367        /* Ignore blank lines & comments
368         *******************************/
369            if( !com )           continue;
370            if( com[0] == '#' )  continue;
371
372        /* Open a nested configuration file
373         **********************************/
374            if( com[0] == '@' ) {
375               success = nfiles+1;
376               nfiles  = k_open(&com[1]);
377               if ( nfiles != success ) {
378                  logit( "e",
379                          "hyp2000_mgr: Error opening command file <%s>. Exiting.\n",
380                           &com[1] );
381                  exit( -1 );
382               }
383               continue;
384            }
385
386        /* Process anything else as a command
387         ************************************/
388   /*0*/    if ( k_its( "RingName" ) ) {
389                str = k_str();
390                if(str) strcpy(RingName, str);
391                init[0] = 1;
392            }
393   /*1*/    else if( k_its( "LogFile" ) ) {
394                LogSwitch = k_int();
395                init[1] = 1;
396            }
397   /*2*/    else if( k_its( "MyModuleId" ) ) {
398                if ( ( str=k_str() ) ) {
399                   if ( GetModId( str, &MyModId ) != 0 ) {
400                      logit( "e",
401                             "hyp2000_mgr: Invalid module name <%s>. Exiting.\n",
402                              str );
403                      exit( -1 );
404                   }
405                }
406                init[2] = 1;
407            }
408   /*3*/    else if( k_its( "SourceCode" ) ) {
409                if ( str=k_str() ) {
410                   SourceCode = str[0];
411                }
412                init[3] = 1;
413            }
414            else {
415                logit( "e", "hyp2000_mgr: <%s> unknown command in <%s>.\n",
416                         com, configfile );
417                continue;
418            }
419
420        /* See if there were any errors processing the command
421         *****************************************************/
422            if( k_err() )
423            {
424               logit( "e", "hyp2000_mgr: Bad <%s> command in <%s>; \n",
425                        com, configfile );
426               exit( -1 );
427            }
428        }
429        nfiles = k_close();
430   }
431
432/* After all files are closed, check init flags for missed commands
433 ******************************************************************/
434   nmiss = 0;
435   for ( i = 0; i < ncommand; i++ )
436      if( !init[i] ) nmiss++;
437
438   if ( nmiss )
439   {
440       logit( "e", "hyp2000_mgr: ERROR, no " );
441       if ( !init[0] )  logit( "e", "<RingName> "   );
442       if ( !init[1] )  logit( "e", "<LogFile> "    );
443       if ( !init[2] )  logit( "e", "<MyModuleId> " );
444       if ( !init[3] )  logit( "e", "<SourceCode> " );
445       logit( "e", "command(s) in <%s>. Exiting.\n", configfile );
446       exit( -1 );
447   }
448
449   return;
450}
451
452
453/************************************************************************
454 *                               LookUp()                               *
455 *            Look up important info from earthworm.h tables            *
456 ************************************************************************/
457
458void LookUp( void )
459{
460/* Look up keys to shared memory regions of interest
461   *************************************************/
462   if( (RingKey = GetKey(RingName)) == -1 )
463   {
464      fprintf( stderr,
465              "hyp2000_mgr: Invalid ring name <%s>. Exiting.\n", RingName );
466      exit( -1 );
467   }
468
469/* Look up installations of interest
470   *********************************/
471   if ( GetLocalInst( &InstId ) != 0 )
472   {
473      fprintf( stderr,
474              "hyp2000_mgr: error getting local installation id. Exiting.\n" );
475      exit( -1 );
476   }
477
478/* Look up message types of interest
479   *********************************/
480   if ( GetType( "TYPE_ERROR", &TypeError ) != 0 )
481   {
482      fprintf( stderr,
483              "hyp2000_mgr: Invalid message type <TYPE_ERROR>. Exiting.\n" );
484      exit( -1 );
485   }
486
487   if ( GetType( "TYPE_HYP2000ARC", &TypeHyp2000Arc ) != 0 )
488   {
489      fprintf( stderr,
490              "hyp2000_mgr: Invalid message type <TYPE_HYP2000ARC>. Exiting.\n" );
491      exit( -1 );
492   }
493
494   if ( GetType( "TYPE_H71SUM2K", &TypeH71Sum2K ) != 0 )
495   {
496      fprintf( stderr,
497              "hyp2000_mgr: Invalid message type <TYPE_H71SUM2K>. Exiting.\n" );
498      exit( -1 );
499   }
500
501   if ( GetType( "TYPE_KILL", &TypeKill ) != 0 )
502   {
503      fprintf( stderr,
504              "hyp2000_mgr: Invalid message type <TYPE_KILL>. Exiting.\n" );
505      exit( -1 );
506   }
507
508   return;
509}
510
511
512         /****************************************************
513          *                   PrintSumLine()                 *
514          *  Print a summary line to stderr (always) and     *
515          *  to the log file if LogSwitch = 2                *
516          ****************************************************/
517
518void PrintSumLine( char *sumCard )
519{
520
521/* Send the summary line to the screen
522   ***********************************/
523   fprintf( stderr, "%s", sumCard );
524
525/* Write summary line to log file
526   ******************************/
527   if ( LogSwitch == 2 )
528      logit( "", "%s", sumCard );
529   return;
530}
531
532
533    /*******************************************************************
534     *                  hyp2000sum_hypo71sum2k()                       *
535     *                                                                 *
536     *  Converts from hypoinverse to hypo71 summary format.            *
537     *  Original hinv_hypo71 function written by Andy Michael.         *
538     *  Modified by Lynn Dietz to make it work with Y2K-compliant      *
539     *  hyp2000(hypoinverse) and hypo71 summary formats. 11/1998       *
540     *******************************************************************/
541
542void hyp2000sum_hypo71sum2k( char *sumcard )
543{
544   char hinvsum[200];
545   char h71sum[200];
546   float rms,erh,erz,dmin,depth;
547   int no,gap;
548   int qs,qd,qa;
549   int i;
550
551/*-------------------------------------------------------------------------------------------
552Sample Hyp2000 (Hypoinverse) summary card, fixed format, 165 chars, including newline:
553 199204290116449937 3790122 2919  505  0 31109  8   810577  4625911  31276SFP  13    0  31  45 58
554   0 570  0 39PEN WW D 67X   0  0L  0  0     10133D276 570Z  0   01 \n
5550123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456
556789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
557
558Sample TYPE_H71SUM2K summary card, fixed-format, 96 characters, including newline:
559 19920429 0116 44.99 37 37.90 122 29.19   5.05 D 2.76 31 109  8.  0.08  0.3  0.4 BW      10133 1\n
5600123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456
561---------------------------------------------------------------------------------------------*/
562
563/* Make a working copy of the original hypoinverse summary card.
564   Don't use spot 0 in the arrays; it is easier to read &
565   matches column numbers in documentation.
566   *************************************************************/
567   hinvsum[0] = ' ';
568   strcpy( hinvsum+1, sumcard );
569   for( i = 0; i < 200; ++i )  h71sum[i] = ' ';
570
571/* Transfer event origin time
572   **************************/
573   strncpy( h71sum+1, hinvsum+1, 8 );                /* date (yyyymmdd) */
574   for(i=1;i<=8;++i)    if(h71sum[i]==' ')  h71sum[i]='0';
575   h71sum[9] = ' ';
576
577   strncpy( h71sum+10, hinvsum+9, 4 );               /* hour minute */
578   for(i=11;i<=13;++i)  if(h71sum[i]==' ')  h71sum[i]='0';
579   h71sum[14] = ' ';
580
581   strncpy( h71sum+15, hinvsum+13, 2 );              /* whole seconds */
582   h71sum[17] = '.';
583   strncpy( h71sum+18, hinvsum+15, 2 );              /* fractional seconds */
584   if(h71sum[18]==' ') h71sum[18]='0';
585   h71sum[20] = ' ';
586
587/* Transfer event location
588   ***********************/
589   strncpy( h71sum+21 , hinvsum+17, 5 );            /* lat degs and whole mins */
590   h71sum[26] = '.';
591   strncpy( h71sum+27 , hinvsum+22, 2  );           /* lat fractional mins */
592   if(h71sum[27]==' ') h71sum[27]= '0';
593   h71sum[29] = ' ';
594
595   strncpy( h71sum+30, hinvsum+24, 6 );              /* lon degs and whole mins */
596   h71sum[36] = '.';
597   strncpy( h71sum+37, hinvsum+30, 2 );              /* lon fractional mins */
598   if(h71sum[37]==' ') h71sum[37]= '0';
599   h71sum[39] = ' ';
600
601   strncpy( h71sum+40, hinvsum+32, 3 );              /* whole depth */
602   h71sum[43] = '.';
603   strncpy( h71sum+44, hinvsum+35, 2 );              /* fractional depth */
604   for(i=42;i<=45;++i) if(h71sum[i]==' ') h71sum[i]='0';
605   h71sum[46]=' ';
606
607/* Transfer magnitude.  Get the "Preferred magnitude" if it exists;
608   otherwise, use the "Primary coda duration magnitude" field
609   ***************************************************************/
610   if( strlen(sumcard) >= (size_t) 151 ) {
611      h71sum[47] = hinvsum[147];    /* Preferred magnitude label */
612      h71sum[48] = ' ';
613      h71sum[49] = hinvsum[148];    /* Preferred magnitude       */
614      h71sum[50] = '.';
615      h71sum[51] = hinvsum[149];
616      h71sum[52] = hinvsum[150];
617      for(i=49;i<=51;++i) if(h71sum[i]==' ') h71sum[i]='0';
618   } else {
619      h71sum[47] = hinvsum[118];    /* primary coda magnitude label */
620      h71sum[48] = ' ';
621      h71sum[49] = hinvsum[71];     /* primary coda magnitude       */
622      h71sum[50] = '.';
623      h71sum[51] = hinvsum[72];
624      h71sum[52] = hinvsum[73];
625      for(i=49;i<=51;++i) if(h71sum[i]==' ') h71sum[i]='0';
626   }
627
628/* Transfer other location statistics
629   **********************************/
630   strncpy( h71sum+53, hinvsum+40, 3 );    /* number of stations */
631   h71sum[56] = ' ';
632
633   strncpy( h71sum+57, hinvsum+43, 3 );    /* azimuthal gap */
634
635   strncpy( h71sum+60, hinvsum+46, 3 );    /* distance to closest station */
636   h71sum[63] = '.';
637   h71sum[64] = ' ';
638
639   strncpy( h71sum+65, hinvsum+49, 2 );    /* whole rms */
640   h71sum[67] = '.';
641   strncpy( h71sum+68, hinvsum+51, 2 );    /* frac rms */
642   for(i=66;i<=68;++i) if(h71sum[i]==' ') h71sum[i]='0';
643   h71sum[70] = ' ';
644
645   strncpy( h71sum+71, hinvsum+86, 2 );    /* whole horiz err */
646   h71sum[73] = '.';
647   h71sum[74] = hinvsum[88];               /*frac horiz err   */
648   for(i=72;i<=74;++i) if(h71sum[i]==' ') h71sum[i]='0';
649   h71sum[75]=' ';
650
651   strncpy( h71sum+76, hinvsum+90, 2 );    /* whole vert err */
652   h71sum[78] = '.';
653   h71sum[79] = hinvsum[92];               /*frac vert err   */
654   for(i=77;i<=79;++i) if(h71sum[i]==' ') h71sum[i]='0';
655   h71sum[80] = hinvsum[81];               /* auxiliary remark 1 */
656
657   h71sum[82] = hinvsum[115];              /* most common data source used in location */
658   h71sum[83] = ' ';
659
660/* Transfer event id
661   *****************/
662   strncpy( h71sum+84, hinvsum+137, 10 );  /* event id */
663   h71sum[94] = ' ';
664   h71sum[95] = hinvsum[163];              /* version number */
665   h71sum[96] = '\n';
666   h71sum[97] = '\0';
667
668/* Extract rms, erh, erz, no, gap, dmin, depth to decide on location quality
669   *************************************************************************/
670   sscanf( h71sum+41, "%5f", &depth );
671   sscanf( h71sum+53, "%3d", &no    );
672   sscanf( h71sum+57, "%3d", &gap   );
673   sscanf( h71sum+60, "%5f", &dmin  );
674   sscanf( h71sum+65, "%5f", &rms   );
675   sscanf( h71sum+71, "%4f", &erh   );
676   sscanf( h71sum+76, "%4f", &erz   );
677
678/* Compute qs, qd, and average quality
679   ***********************************/
680   if     (rms <0.15 && erh<=1.0 && erz <= 2.0) qs=4;  /* qs is A */
681   else if(rms <0.30 && erh<=2.5 && erz <= 5.0) qs=3;  /* qs is B */
682   else if(rms <0.50 && erh<=5.0)               qs=2;  /* qs is C */
683   else                                         qs=1;  /* qs is D */
684
685   if     (no >= 6 && gap <=  90 && (dmin<=depth    || dmin<= 5)) qd=4; /* qd is A */
686   else if(no >= 6 && gap <= 135 && (dmin<=2.*depth || dmin<=10)) qd=3; /* qd is B */
687   else if(no >= 6 && gap <= 180 &&  dmin<=50)                    qd=2; /* qd is C */
688   else                                                           qd=1; /* qd is D */
689
690   qa = (qs+qd)/2; /* use integer truncation to round down */
691   if(qa>=4) h71sum[81] = 'A';
692   if(qa==3) h71sum[81] = 'B';
693   if(qa==2) h71sum[81] = 'C';
694   if(qa<=1) h71sum[81] = 'D';
695
696/* Copy converted summary card back to caller's address
697   ****************************************************/
698   strcpy( sumcard, h71sum+1 );
699   return;
700}
701
702
703  /******************************************************************
704   *                          ReportError()                         *
705   *         Send error message to the transport ring buffer.       *
706   *     This version doesn't allow an error string to be sent.     *
707   ******************************************************************/
708
709void ReportError( int errNum )
710{
711   MSG_LOGO       logo;
712   unsigned short length;
713   time_t         tstamp;
714   char           errMsg[100];
715
716   time( &tstamp );
717   sprintf( errMsg, "%d %d\n\0", tstamp, errNum );
718
719   logo.instid = InstId;
720   logo.mod    = MyModId;
721   logo.type   = TypeError;
722   length      = strlen( errMsg );
723
724   if ( tport_putmsg( &Region, &logo, length, errMsg ) != PUT_OK )
725      logit( "et", "hyp2000_mgr: Error sending error msg to transport region <%s>\n",
726               RingName);
727   return;
728}
729
730
731            /************************************************************
732             *                      LogHypoError()                      *
733             *                                                          *
734             *  Convert a hypo return code to a text string and log it. *
735             ************************************************************/
736
737void LogHypoError( int err )
738{
739   if ( err == -13 )
740      logit( "", "hyp2000_mgr: Skip phase card with wrong time.\n" );
741   if ( err == -14 )
742      logit( "", "hyp2000_mgr: Bad format phase card, skip it.\n" );
743   if ( err == -15 )
744      logit( "", "hyp2000_mgr: Skip phase card with unknown station.\n" );
745   if ( err == -16 )
746      logit( "", "hyp2000_mgr: Too many unknown stations on ASCII phase cards.\n" );
747   if ( err == -17 )
748      logit( "", "hyp2000_mgr: Too many phase cards in event.\n" );
749   if ( err == -18 )
750      logit( "", "hyp2000_mgr: Bad ASCII terminator line.\n" );
751   if ( err == -21 )
752      logit( "", "hyp2000_mgr: Pick from unknown station.\n" );
753   if ( err == -22 )
754      logit( "", "hyp2000_mgr: Picks from too many stations.\n" );
755   if ( err == -23 )
756      logit( "", "hyp2000_mgr: Coda from unknown station.\n" );
757   if ( err == -24 )
758      logit( "", "hyp2000_mgr: Amp from unknown station.\n" );
759   if ( err == -25 )
760      logit( "", "hyp2000_mgr: Wood-Anderson amp from unknown station.\n" );
761   if ( err == -34 )
762      logit( "", "hyp2000_mgr: Too many stations in station file.\n" );
763   if ( err == -35 )
764      logit( "", "hyp2000_mgr: Attempted to read attenuations before reading station file.\n" );
765   if ( err == -36 )
766      logit( "", "hyp2000_mgr: Station attenuation file does not exist.\n" );
767   if ( err == -37 )
768      logit( "", "hyp2000_mgr: Attempted to read FMAG corrections before reading station file.\n" );
769   if ( err == -38 )
770      logit( "", "hyp2000_mgr: Station FMAG correction file does not exist.\n" );
771   if ( err == -39 )
772      logit( "", "hypoinv: Attempted to read XMAG corrections before reading station file.\n" );
773   if ( err == -40 )
774      logit( "", "hyp2000_mgr: Station XMAX correction file does not exist.\n" );
775   if ( err == -41 )
776      logit( "", "hyp2000_mgr: Maximum number of unknown stations exceeded.\n" );
777   if ( err == -42 )
778      logit( "", "hyp2000_mgr: Attempted to read delays before reading station file.\n" );
779   if ( err == -51 )
780      logit( "", "hyp2000_mgr: Not enough weighted readings for a solution.\n" );
781   if ( err == -52 )
782      logit( "", "hyp2000_mgr: Event has fewer than 3 picks.\n" );
783   if ( err == -53 )
784      logit( "", "hyp2000_mgr: Stop locating eq because it has been pushed far outside network.\n" );
785   if ( err == -61 )
786      logit( "", "hyp2000_mgr: No phase file.\n" );
787   if ( err == -62 )
788      logit( "", "hyp2000_mgr: No CUSP id file.\n" );
789   if ( err == -63 )
790      logit( "", "hyp2000_mgr: Error in command arguments (detected by hycmd).\n" );
791   if ( err == -64 )
792      logit( "", "hyp2000_mgr: Maximum depth of command files exceeded.\n" );
793   if ( err == -65 )
794      logit( "", "hyp2000_mgr: Unknown command.\n" );
795   if ( err == -66 )
796      logit( "", "hyp2000_mgr: Command file does not exist.\n" );
797   if ( err == -67 )
798      logit( "", "hyp2000_mgr: Node model number too high.\n" );
799   if ( err == -68 )
800      logit( "", "hyp2000_mgr: Crust file does not exist.\n" );
801   if ( err == -69 )
802      logit( "", "hyp2000_mgr: Crust model number is out of range.\n" );
803   if ( err == -70 )
804      logit( "", "hyp2000_mgr: Station file does not exist.\n" );
805   if ( err == -71 )
806      logit( "", "hyp2000_mgr: Delay file does not exist.\n" );
807   if ( err == -72 )
808      logit( "", "hyp2000_mgr: Crust binary snapshot file not found.\n" );
809   if ( err == -73 )
810      logit( "", "hyp2000_mgr: Station binary snapshot file not found.\n" );
811   if ( err == -74 )
812      logit( "", "hyp2000_mgr: Inconsistent use of station component letters.\n" );
813   if ( err == -75 )
814      logit( "", "hyp2000_mgr: Error reading delay file.\n" );
815   return;
816}
817
818
819        /*******************************************************
820         *                   callHypo()                        *
821         *                                                     *
822         *  Calls the function Hypo and logs any errors        *
823         *******************************************************/
824int callHypo( char *cmd )
825{
826   int hypret;
827   Hypo( cmd, &hypret );
828   if ( hypret != 1 )
829   {
830      logit( "e", "\nhyp2000_mgr: Error occurred while executing <%s>. Return i s %d\n",
831             cmd , hypret);
832      LogHypoError( hypret );
833      return( -1 );
834   }   
835   return( 0 );
836}
837
838
839        /*******************************************************
840         *                       Hypo()                        *
841         *                                                     *
842         *  System dependent function to call the hypo_ew      *
843         *  FORTRAN subroutine.                                *
844         *******************************************************/
845
846typedef struct {
847   char a[80];
848} STRING;
849
850void Hypo( char *inMsg, int *iresr )
851{
852   STRING outMsg;
853   int len;
854
855/* The Windows NT version
856   **********************/
857#if defined(_WINNT_INTEL9)
858   extern void __stdcall hypo_ew( STRING, int * );
859   strcpy( outMsg.a, inMsg );
860   *iresr=0;
861   hypo_ew( outMsg, iresr );
862/*    fprintf(stderr, "DEBUG: after fortran call iresr=%d\n", *iresr); */
863#elif defined(_WINNT)
864   extern void __stdcall hypo_ew( STRING *, int * );
865   strcpy( outMsg.a, inMsg );
866   HYPO_EW( &outMsg, iresr );
867#endif
868
869/* The Solaris version
870   *******************/
871#ifdef _SOLARIS
872   extern hypo_ew_( STRING *, int * );
873   strcpy( outMsg.a, inMsg );
874   hypo_ew_( &outMsg, iresr );
875#endif
876
877#if defined(_MACOSX) || defined(_LINUX)
878   /* extern hypo_ew_( char *, int * , int);  */
879   strcpy( outMsg.a, inMsg );
880   len=strlen(outMsg.a);
881   hypo_ew__( (char *) outMsg.a, iresr, len); 
882#endif
883
884/* Print a newline to avoid overwriting the
885   last line written by hypoinverse, if any
886   ****************************************/
887   putchar( '\n' );
888   return;
889}
890
Note: See TracBrowser for help on using the repository browser.