Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

site.c

Go to the documentation of this file.
00001 
00002 /*
00003  *   THIS FILE IS UNDER RCS - DO NOT MODIFY UNLESS YOU HAVE
00004  *   CHECKED IT OUT USING THE COMMAND CHECKOUT.
00005  *
00006  *    $Id: site_8c-source.html 2161 2006-05-19 16:55:03Z paulf $
00007  *
00008  *    Revision history:
00009  *     $Log$
00009  *     Revision 1.1  2006/05/19 16:55:02  paulf
00009  *     first inclusion
00009  *
00010  *     Revision 1.2  2000/08/15 00:50:41  dietz
00011  *     Fixed NT bug in site_read() where the 'E' longitude designator was being
00012  *     read as scientific notation instead of East-West.  Caused east longitudes
00013  *     to show up as negative longitudes.
00014  *
00015  *     Revision 1.1  2000/02/14 18:51:48  lucky
00016  *     Initial revision
00017  *
00018  *
00019  */
00020 
00021 /*
00022  * site.c : Station parameter routines.
00023  *
00024  *$ 95Aug31 LDD Added "site_file" command to site_com()
00025  *$ 95Sep01 LDD Added 2nd & 3rd args to site_index()
00026  *$ 95Oct19 LDD Explicitly declared return types for all functions.
00027  *              Added function prototypes to site.h
00028  */
00029 #include <sys/types.h>
00030 #include <string.h>
00031 #include <stdlib.h>
00032 #include <stdio.h>
00033 #include <kom.h>
00034 #include <site.h>
00035 
00036 /* Initialization constants
00037  **************************/
00038 static int initSite = 0;
00039 
00040 /* Changed from 1000 to 1800 by WMK 2/12/96 */
00041 static int maxSite  = 1800;     /* Change to alter size of mem allocation */
00042 
00043 
00044 /**************************************************************************
00045  * site_init()  Allocate the site table                                   *
00046  **************************************************************************/
00047 void site_init(void)
00048 {
00049         if(initSite)
00050                 return;
00051         initSite = 1;
00052         nSite = 0;
00053         Site = (SITE *)calloc(maxSite, sizeof(SITE));
00054         if(!Site) {
00055                 fprintf(stderr, "site_init:  Could not allocate site table; exiting!\n");
00056                 exit(0);
00057         }
00058         return;
00059 }
00060 
00061 
00062 /**************************************************************************
00063  * site_load(name)  Process a kom.c-style command file that contains only *
00064  *                  commands recognized by site_com                       *
00065  **************************************************************************/
00066 
00067 int site_load(char *name)
00068 {
00069         char *com;
00070 
00071         if(!k_open(name)) {
00072                 fprintf(stderr, "site_load:  Cannot open site file <%s>\n", name);
00073                 return 0;
00074         }
00075         while(k_rd()) {
00076                 com = k_str();
00077                 if ( !com )       continue;
00078                 if ( site_com() ) continue;
00079                 fprintf(stderr, "site_load:  <%s> Unknown command\n", com);
00080         }
00081         k_close();
00082 /*      fprintf(stderr, "Site file <%s> loaded, nSite = %d\n", name, nSite); */
00083         return 1;
00084 }
00085 
00086 
00087 /**************************************************************************
00088  *  site_read(name)  Read in a HYPOINVERSE format, universal station      *
00089  *                   code file                                            *
00090  **************************************************************************/
00091 
00092 /* Sample station line:
00093 R8075 MN  BHZ  41 10.1000N121 10.1000E   01.0     0.00  0.00  0.00  0.00 1  0.00
00094 0123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 
00095 */
00096 
00097 void site_read(char *name)
00098 {
00099         FILE  *stafile;
00100         char   line[256];
00101         int    dlat, dlon, elev;
00102         float  mlat, mlon;
00103         char   comp, ns, ew;
00104         int    n;
00105 
00106 /* initialize site table
00107    *********************/
00108         site_init();
00109 
00110 /* open station file
00111    *****************/
00112         if( (stafile = fopen( name, "r" )) == (FILE *) NULL ) {
00113                 fprintf(stderr,
00114                        "site_read: Cannot open site file <%s>; exiting!\n", name);
00115                 exit(0);
00116         }
00117 
00118 /* read in one line of the site file at a time
00119    *******************************************/
00120         while( fgets( line, sizeof(line), stafile ) != (char *) NULL )
00121         {
00122 
00123         /* see if internal site table has room left */
00124                 if( nSite >= maxSite ) {
00125                    fprintf( stderr,
00126                         "site_read: Site table full; cannot load entire file <%s>\n", name );
00127                    fprintf( stderr,
00128                         "site_read: Use <maxsite> command to increase table size; exiting!\n" );
00129                    exit(0);
00130                 }
00131 
00132         /* decode each line of the file */
00133 
00134                 strncpy( Site[nSite].name, &line[0],  5);
00135                 strncpy( Site[nSite].net,  &line[6],  2);
00136                 strncpy( Site[nSite].comp, &line[10], 3);
00137                 comp = line[9];
00138 
00139                 line[42] = '\0';
00140                 n = sscanf( &line[38], "%d", &elev );
00141                 if( n < 1 ) {
00142                    fprintf( stderr,
00143                           "site_read: Error reading elevation from line in station file\n%s\n",
00144                            line );
00145                    continue;
00146                 }
00147 
00148                 ew       = line[37];
00149                 line[37] = '\0';
00150                 n = sscanf( &line[26], "%d %f", &dlon, &mlon );
00151                 if( n < 2 ) {
00152                    fprintf( stderr,
00153                           "site_read: Error reading longitude from line in station file\n%s\n",
00154                            line );
00155                    continue;
00156                 }
00157 
00158                 ns       = line[25];
00159                 line[25] = '\0';
00160                 n = sscanf( &line[15], "%d %f", &dlat, &mlat );
00161                 if ( n < 2 ) {
00162                    fprintf( stderr,
00163                           "site_read: Error reading latitude from line in station file\n%s\n",
00164                            line );
00165                    continue;
00166                 }
00167 
00168         /*      printf( "%-5s %-2s %-3s %d %.4f%c%d %.4f%c%4d\n",
00169                          Site[nSite].name, Site[nSite].net, Site[nSite].comp,
00170                          dlat, mlat, ns,
00171                          dlon, mlon, ew, elev ); */ /*DEBUG*/
00172 
00173         /* use one-letter component if there is no 3-letter component given */
00174                 if ( !strcmp(Site[nSite].comp, "   ") ) sprintf( Site[nSite].comp, "%c  ", comp );
00175 
00176         /* convert to decimal degrees */
00177                 if ( dlat < 0 ) dlat = -dlat;
00178                 if ( dlon < 0 ) dlon = -dlon;
00179                 Site[nSite].lat = (double) dlat + (mlat/60.0);
00180                 Site[nSite].lon = (double) dlon + (mlon/60.0);
00181 
00182         /* make south-latitudes and west-longitudes negative */
00183                 if ( ns=='s' || ns=='S' )
00184                         Site[nSite].lat = -Site[nSite].lat;
00185                 if ( ew=='w' || ew=='W' || ew==' ' )
00186                         Site[nSite].lon = -Site[nSite].lon;
00187                 Site[nSite].elev = (double) elev/1000.;
00188 
00189         /*      printf("%-5s %-2s %-3s %.4f %.4f %.0f\n\n",
00190                        Site[nSite].name, Site[nSite].net, Site[nSite].comp,
00191                        Site[nSite].lat, Site[nSite].lon, Site[nSite].elev ); */ /*DEBUG*/
00192 
00193        /* update the total number of stations loaded */
00194                 if(nSite < maxSite) ++nSite;
00195 
00196         } /*end while*/
00197 
00198         fclose( stafile );
00199         return;
00200 }
00201 
00202 
00203   /**********************************************************************
00204    * site_com(): Process all recognized commands.                       *
00205    *             Return 1 on success, 0 if command was not recognized   *
00206    **********************************************************************/
00207 
00208 int site_com( void )
00209 {
00210         char *name;
00211 
00212         if(k_its("site")) {
00213                 site_init();
00214                 if(nSite >= maxSite)
00215                         return 1;
00216                 name = k_str();
00217                 if(!name) return 1;
00218                 strcpy(Site[nSite].name, name);
00219                 strcpy(Site[nSite].net, "");    /*added 950901:ldd*/
00220                 strcpy(Site[nSite].comp, "");   /*added 950901:ldd*/
00221                 Site[nSite].lat = k_val();
00222                 Site[nSite].lon = k_val();
00223                 Site[nSite].elev = 0.0;
00224                 Site[nSite].elev = k_val();
00225                 if(nSite < maxSite)
00226                         nSite++;
00227                 return 1;
00228         }
00229 
00230         if(k_its("maxsite")) {
00231                 if(initSite) {
00232                      fprintf( stderr, "site_com:  Error: site table already allocated.\n" );
00233                      fprintf( stderr,
00234                            "site_com:  Use <maxsite> before any <site> or <site_file> commands" );
00235                      fprintf( stderr, "; exiting!\n" );
00236                      exit( 0 );
00237                 }
00238                 maxSite = k_int();
00239                 return 1;
00240         }
00241 
00242         if(k_its("site_file")) {    /* added command to read in a HYPOINVERSE format */
00243                 name = k_str();     /* "universal code" station file.     950831:ldd */
00244                 if(!name) return 1;
00245                 site_read(name);
00246                 return 1;
00247         }
00248 
00249         return 0;
00250 }
00251 
00252 
00253 /***************************************************************************
00254  * site_index(site, net, comp) : Returns index of site, or -1 if not found *
00255  * 950901:ldd  added 2nd & 3rd arguments to handle "universal" station     *
00256  *             naming convention                                           *
00257  ***************************************************************************/
00258 
00259 int site_index(char *site, char *net, char *comp)
00260 {
00261         int i;
00262 
00263         site_init();
00264         for(i=0; i<nSite; i++) {
00265                 if( !strcmp(Site[i].name, site ) &&
00266                     !strcmp(Site[i].net,  net  ) &&
00267                     !strcmp(Site[i].comp, comp )    )  return i;
00268         }
00269         return -1;
00270 }
00271 

Generated on Tue May 6 09:16:10 2003 for Earthworm Libs by doxygen1.3-rc3