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

Revision 2581, 31.4 KB checked in by paulf, 14 years ago (diff)

patched WINNT for older compiler

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