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

Revision 7969, 33.2 KB checked in by stefan, 4 months ago (diff)

made the program test for existence of SeparatePRTdir directory and exit if not present

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