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

📄 vmerge.c

📁 seismic software,very useful
💻 C
📖 第 1 页 / 共 2 页
字号:
    }    gh.n4 = gh.scale;    gh.n5 = gh.scale;    gh.d4 = sbin * gh.scale;    gh.d5 = vbin * gh.scale;    gh.o4 = shigh * gh.scale;;    gh.o5 = vclip[0] * gh.scale;    gh.dcdp2 = dv * gh.scale;    gh.dline3 = ddv * gh.scale;    gh.oline3 = 0.;    gh.ocdp2 = 0.;    gh.gtype=5 * gh.scale;    write(1, &gh, sizeof(gh));    return( 0 );}/*--------------------------------------------------------------------*\  Read a pair of data vectors from the two input files.\*--------------------------------------------------------------------*/static int readvec(FILE *fp, char *type, float *x, int n){    int      nread;    if( !strcmp(type, "segy") ){        fseeko(fp, (long long)240, SEEK_CUR);        if( fread(x, 4, n,fp) != n ){            return (0);        }else{            return (n);        }    }else if( !strcmp(type, "vgrid") ){        if( (nread = fread(x,4,n,fp)) == n ){            return (n);        }else{            return (nread - 25);        }    }else if( !strcmp(type, "float") || !strcmp(type, "floats") ){        return (fread(x,4,n,fp));    }else if( !strcmp(type, "byte") || !strcmp(type, "bytes") ){        return (fread(x,1,n,fp));    }    return (0);}/*--------------------------------------------------------------------*\   Determine the total size of the input dataset.\*--------------------------------------------------------------------*/static void findsize(FILE *fp, char *type, long *size, int *ns){    segy     t1;    *ns = N;    if( !strcmp(type, "segy") ){        fseeko(fp, (long long)3600, SEEK_SET);        fread(&t1,1,240,fp);        fseeko(fp, (long long)0, SEEK_END);        *ns = ftello(fp) / (t1.ns * 4 + 240);        *size = t1.ns * *ns;        *ns = t1.ns;    }else if( !strcmp(type, "vgrid") ){        fseeko(fp, (long long)0, SEEK_END);        *size = (ftello(fp) - 100) / 4;    }else if( !strcmp(type, "float") || !strcmp(type, "floats") ){        fseeko(fp, (long long)0, SEEK_END);        *size = ftello(fp) / 4;    }else if( !strcmp(type, "byte") || !strcmp(type, "bytes") ){        fseeko(fp, (long long)0, SEEK_END);        *size = ftello(fp);    }}/*--------------------------------------------------------------------*\\*--------------------------------------------------------------------*/static void findclip(FILE *fp, char *type, long size, float *low, float *high,                  float perc, float nan){#define NSORT 10000000    int      nsort;    int      dsort;    int      i;    int      n;    float   *buf;    unsigned char cbuf[N];    segy     tr;    if( !strcmp(type, "byte") || !strcmp(type, "bytes") ){        return;    }    nsort = size < NSORT ? size : NSORT;    nsort = nsort > (int) (.05 * size) ? nsort : (int) (.05 * size);    dsort = ceil((float) size / (float) nsort);    buf   = (float *) malloc((nsort + N) * 4);    if( !strcmp(type, "segy") ){        fseeko(fp, (long long)3600, SEEK_SET);        fread(&tr,1,240,fp);        nsort = 0;        while( fread(tr.data,1,tr.ns * 4 + 240,fp) > 0 ){            for( i = 0; i < tr.ns; i += dsort ){                if( tr.data[i] != nan ){                    buf[nsort++] = tr.data[i];                }            }        }    }else if( !strcmp(type, "vgrid") ){        fseeko(fp, (long long)0, SEEK_SET);        nsort = 0;        while( (n = fread(tr.data,1,N * 4,fp) / 4) > 0 ){            for( i = 0; i < n; i += dsort, nsort++ ){                buf[nsort] = tr.data[i];            }        }        nsort -= 25;    }else if( !strcmp(type, "float") || !strcmp(type, "floats") ){        fseeko(fp, (long long)0, SEEK_SET);        nsort = 0;        while( (n = fread(tr.data,1, N * 4,fp) / 4) > 0 ){            for( i = 0; i < n; i += dsort, nsort++ ){                buf[nsort] = tr.data[i];            }        }    }else if( !strcmp(type, "float") || !strcmp(type, "floats") ){        fseeko(fp, (long long)0, SEEK_SET);        nsort = 0;        while( (n = fread(cbuf,1,N,fp)) > 0 ){            for( i = 0; i < n; i += dsort, nsort++ ){                buf[nsort] = cbuf[i];            }        }    }    perc = perc < 100. ? perc : 100.;    *low = cent(buf, nsort, 100. - perc);    *high = cent(buf, nsort, perc);    free(buf);}/*--------------------------------------------------------------------*\  percentile subroutine based on Canales, SEP-10  this routine changes data order, so sort a copy  p - percentile <0.,99.999999999999>  x - data  n - vector length \*--------------------------------------------------------------------*/static float cent(float *x, int n, float p ){    int      q;    register float *i, *j, ak;    float   *low, *hi, buf, *k;    p = p < 99.999 ? p : 99.999;    p = p > 0.0 ? p : 0.0;    q = (p * n) / 100.;    if( q == n)        q--;    for( low = x, hi = x + n - 1, k = x + q; low < hi; ){        ak = *k;        i = low;        j = hi;        do{            while( *i < ak)                i++;            while( *j > ak)                j--;            if( i <= j ){                buf = *i;                *i++ = *j;                *j-- = buf;            }        }while( i <= j);        if( j < k)            low = i;        if( k < i)            hi = j;    }    return (*k);}/*--------------------------------------------------------------------*\\*--------------------------------------------------------------------*/static int findbin(float *bin, int nbin, float low, float high){    float    interval;    int      nbin1;    interval = (high - low) / nbin;    interval = pow(10., rint(log10(interval)));    /* fprintf (stderr,"interval=%g\n",interval); */    if( (nbin1 = findbin2(bin, nbin, low, high, 0.2 * interval)) > 0 ){        return (nbin1);    }    if( (nbin1 = findbin2(bin, nbin, low, high, 0.25 * interval)) > 0 ){        return (nbin1);    }    if( (nbin1 = findbin2(bin, nbin, low, high, 0.3 * interval)) > 0 ){        return (nbin1);    }    if( (nbin1 = findbin2(bin, nbin, low, high, 0.4 * interval)) > 0 ){        return (nbin1);    }    if( (nbin1 = findbin2(bin, nbin, low, high, 0.5 * interval)) > 0 ){        return (nbin1);    }    if( (nbin1 = findbin2(bin, nbin, low, high, 0.6 * interval)) > 0 ){        return (nbin1);    }    if( (nbin1 = findbin2(bin, nbin, low, high, 0.75 * interval)) > 0 ){        return (nbin1);    }    if( (nbin1 = findbin2(bin, nbin, low, high, 1.0 * interval)) > 0 ){        return (nbin1);    }    if( (nbin1 = findbin2(bin, nbin, low, high, 2.0 * interval)) > 0 ){        return (nbin1);    }    if( (nbin1 = findbin2(bin, nbin, low, high, 5.0 * interval)) > 0 ){        return (nbin1);    }    return (0);}/*--------------------------------------------------------------------*\\*--------------------------------------------------------------------*/static int findbin2(float *bin, int nbin, float low, float high, float interval){    int      ilow, ihigh, i;    ilow = ceil(low / interval);    ihigh = floor(high / interval);#if 1    fprintf (stderr ,"interval=%g ilow=%d ihigh=%d nbin=%d\n"                ,interval,ilow,ihigh,ihigh-ilow+2); #endif    if( ihigh - ilow + 2 > nbin)        return (0);    for( i = 0; ilow <= ihigh; i++, ilow++ ){        bin[i] = ilow * interval;    }    return (i);}/*--------------------------------------------------------------------*\\*--------------------------------------------------------------------*/static int findbin3(float *bin, int nbin, float low, float high, float range){    int      i;    float    ratio, length, interval;    ratio    = pow(range, 1. / (nbin - 3));    interval = 1.0;    length   = 0.0;    for( i = 0; i < nbin - 2; i++ ){        interval *= ratio;        length   += interval;    }    interval = (high - low) / length;    fprintf( stderr             ,"range=%g ratio=%g length=%g low=%g high=%g interval=%g-%g "             ,range ,ratio ,length ,low ,high ,interval ,interval * range);    bin[0] = low;    for (i = 1; i < nbin - 1; i++ ){        interval *= ratio;        bin[i] = bin[i - 1] + interval;    }    fprintf(stderr, "bin1=%g bin$=%g\n", bin[0], bin[nbin - 2]);    return (nbin - 1);}

⌨️ 快捷键说明

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