⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sudumptrace.c

📁 su 的源代码库
💻 C
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved.                       *//* SUDUMPTRACE: $Revision: 1.1 $ ; $Date: 2005/01/28 18:01:23 $	*/#include "su.h"#include "segy.h"#include "header.h"#include <signal.h>/*********************** self documentation **********************/char *sdoc[] = {"                                                                   "," SUDUMPTRACE - print selected header values and data.              ","               Print first num traces.                             ","               Use SUWIND to skip traces.                          ","                                                                   "," sudumptrace < stdin [> ascii_file]                                ","                                                                   "," Optional parameters:                                              ","     num=4                    number of traces to dump             ","     key=key1,key2,...        key(s) to print above trace values   ","     hpf=0                    header print format is float         ","                              =1 print format is exponential       ","                                                                   "," Examples:                                                         ","   sudumptrace < inseis.su            PRINTS: 4 traces, no headers ","   sudumptrace < inseis.su key=tracf,offset                        ","   sudumptrace < inseis.su num=7 key=tracf,offset > info.txt       ","   sudumptrace < inseis.su num=7 key=tracf,offset hpf=1 > info.txt ","                                                                   "," Related programs: suascii, sugethw                                ","                                                                   ",NULL};/* Credits: *   MTU: David Forel, Jan 2005 * * Trace header field accessed: nt, dt, delrt *//**************** end self doc ***********************************//* subroutine prototypes */void dump(float *data, float dt, float *hedr, cwp_String *key,          float delrt, int nkeys, int ntr, int nt, int hpf) ;static void closefiles(void) ;/* Globals (so can trap signal) defining temporary disk files */char tracefile[BUFSIZ] ;   /* filename for the file of traces */char headerfile[BUFSIZ] ;  /* filename for the file of headers */FILE *tracefp ;            /* fp for trace storage file */FILE *headerfp ;           /* fp for header storage file */segy tr ;intmain(int argc, char **argv){   char *tmpdir ;                 /* directory path for tmp files */   cwp_Bool istmpdir=cwp_false ;  /* true for user given path */   float *hedr ;                  /* the headers */   float *data ;                  /* the data */   int nt ;                       /* number of trace samples */   float dt ;                     /* sample interval, sec */   float delrt ;                  /* delay recording time, sec */   cwp_String key[SU_NKEYS] ;     /* array of keywords */   cwp_String type ;              /* key string type */   int nkeys ;                    /* number of keywords */   int ikey,ntr = 0 ;	          /* counters */   int num ;                      /* number of traces to dump */   int numtr = 4 ;                /* number of traces to dump */   int hpf ;                      /* header print format */   /* Initialize */   initargs(argc, argv) ;   requestdoc(1) ;   /* Look for user-supplied tmpdir */   if (!getparstring("tmpdir",&tmpdir) &&       !(tmpdir = getenv("CWP_TMPDIR"))) tmpdir="";   if (!STREQ(tmpdir, "") && access(tmpdir, WRITE_OK))       err("you can't write in %s (or it doesn't exist)", tmpdir);   /* Get values from first trace */   if (!gettr(&tr)) err("can't get first trace");   nt = (int) tr.ns ;                  /* Get nt */   dt = ((double) tr.dt)/1000000.0 ;   /* microsecs to secs */   if (!dt) getparfloat("dt", &dt) ;   if (!dt) MUSTGETPARFLOAT("dt", &dt) ;   delrt = ((double) tr.delrt)/1000.0 ; /* millisecs to secs */   /* Get parameters */   if (getparint ("num", &num)) numtr = num ;   if ((nkeys=countparval("key"))!=0) getparstringarray("key",key) ;   hedr = ealloc1float(nkeys*numtr) ;  /* make space for headers */   if (!getparint ("hpf", &hpf)) hpf = 0 ;   /* Store traces, headers in tempfiles */   if (STREQ(tmpdir,""))   {      tracefp = etmpfile();      headerfp = etmpfile();      do      {         ++ntr;         efwrite(&tr, HDRBYTES, 1, headerfp);         efwrite(tr.data, FSIZE, nt, tracefp);         /* Get header values */         for (ikey=0; ikey<nkeys; ++ikey)         {            Value val;            float fval;            gethdval(&tr, key[ikey], &val) ;            type = hdtype(key[ikey]) ;            fval = vtof(type,val) ;            hedr[(ntr-1)*nkeys+ikey] = fval ;         }      }      while (ntr<numtr  &&  gettr(&tr)) ;   }   else  /* user-supplied tmpdir */   {      char directory[BUFSIZ];      strcpy(directory, tmpdir);      strcpy(tracefile, temporary_filename(directory));      strcpy(headerfile, temporary_filename(directory));      /* Handle user interrupts */      signal(SIGINT, (void (*) (int)) closefiles);      signal(SIGQUIT, (void (*) (int)) closefiles);      signal(SIGHUP,  (void (*) (int)) closefiles);      signal(SIGTERM, (void (*) (int)) closefiles);      tracefp = efopen(tracefile, "w+");      headerfp = efopen(headerfile, "w+");      istmpdir=cwp_true;            do      {         ++ntr;         efwrite(&tr, HDRBYTES, 1, headerfp);         efwrite(tr.data, FSIZE, nt, tracefp);         /* Get header values */         for (ikey=0; ikey<nkeys; ++ikey)         {            Value val;            float fval;            gethdval(&tr, key[ikey], &val) ;            type = hdtype(key[ikey]) ;            fval = vtof(type,val) ;            hedr[(ntr-1)*nkeys+ikey] = fval ;         }      }      while (ntr<numtr  &&  gettr(&tr)) ;   }   /* Rewind after read, allocate space */   erewind(tracefp);   erewind(headerfp);   data = ealloc1float(nt*ntr);   /* Load traces into data and close tmpfile */   efread(data, FSIZE, nt*ntr, tracefp);   efclose(tracefp);   if (istmpdir) eremove(tracefile);   rewind(headerfp);   rewind(tracefp);   /* Do trace work */   dump(data, dt, hedr, key, delrt, nkeys, ntr, nt, hpf) ;   /* close */   efclose(headerfp);   if (istmpdir) eremove(headerfile);   free1(hedr) ;   free1(data) ;   return(CWP_Exit()) ;}void dump(float *data, float dt, float *hedr, cwp_String *key,          float delrt, int nkeys, int ntr, int ntime, int hpf)/*  Dump headers and traces in column format; one trace per column.  INPUT:    data   array of trace data values    dt     trace sample interval    delrt  delay recording time, sec    hedr   array of trace headers    key    array of key names    nkeys  number of keys (headers) to print above trace values    ntr    number of traces to dump    ntime  number of time samples on trace    hpf    header print format flag: 0=float, 1=exponential  OUTPUT:  none*/{   int i,j,k, m ;         /* counters */   printf("\nnum traces = %d    num samples = %d \n\n",ntr,ntime) ;   for (k=0; k<nkeys; ++k)                     /* Print headers */   {      printf("%17s  ", key[k]) ;      for (m=0; m<ntr; ++m)      {         if (hpf==0)         {            printf("%11.4f\t", hedr[m*nkeys + k]) ;         }         else         {            printf("%11.4e\t", hedr[m*nkeys + k]) ;         }      }      putchar('\n') ;   }   putchar('\n') ;   printf("\nCounter    Time     Values\n") ;  /* Column titles */   for (i=1; i<=ntime; ++i)                    /* Print trace values */   {      printf(" %6d ", i) ;      printf(" %8.3f   ", dt*(i)+delrt) ;      for (j=1; j<=ntr; ++j)      {         printf("%11.4e\t", data[(j-1)*ntime+(i-1)]) ;      }      putchar('\n') ;   }   putchar('\n') ;}/* for graceful interrupt termination */static void closefiles(void){   efclose(headerfp);   efclose(tracefp);   eremove(headerfile);   eremove(tracefile);   exit(EXIT_FAILURE);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -