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

📄 data.c

📁 seismic software,very useful
💻 C
📖 第 1 页 / 共 2 页
字号:
            AxisInit2(DATA_VALUE, 1, label, DATA_VALUE_SIZE + 1, data->low,                      (data->high - data->low) / DATA_VALUE_SIZE, 1.0);    }    if( buf2 ){        free(buf2);        buf2 = 0;        if( memwatch ){            printf("free %s\n", "buf2");        }    };    if( data->low == 0.0 && data->high == 0. ){        err("first panel appears to be all zeros; set clip");    }    if( data->high > data->low ){        bias = -data->low;        scale = DATA_VALUE_SIZE / (data->high - data->low);    } else {        bias = 0.;        scale = 0.5 * DATA_VALUE_SIZE / data->high;    }    dp = data->buffer;    for( fp = buf1, fe = buf1 + n1 * n2; fp < fe; fp++, dp++ ){        datum = (*fp + bias) * scale;        datum = datum > 0 ? datum : 0;        datum = datum < DATA_VALUE_SIZE ? datum : DATA_VALUE_SIZE - 1;        datum += DATA_VALUE_BASE;        *dp = datum;    }    if( buf1 ){        free(buf1);        buf1 = 0;        if( memwatch ){            printf("free %s\n", "buf1");        }    };    /* convert rest of traces */    for( i3 = 1; i3 < n3; i3++ ){        for( i2 = 0; i2 < n2; i2++ ){            if( read(infd, trace, (n1 + head) * sizeof(trace[0])) < 0 ){                break;            }            for( fp = trace + head, fe = fp + n1, gp = tgain; fp < fe;                 fp++, dp++, gp++ ){                datum = (*fp * *gp + bias) * scale;                datum = datum > 0 ? datum : 0;                datum = datum < DATA_VALUE_SIZE ? datum : DATA_VALUE_SIZE - 1;                datum += DATA_VALUE_BASE;                *dp = datum;            }        }    }    DataComputeHistogram(data);    if( trace ){        free(trace);        trace = 0;        if( memwatch ){            printf("free %s\n", "trace");        }    };    if( tgain ){        free(tgain);        tgain = 0;        if( memwatch ){            printf("free %s\n", "tgain");        }    };}/*      percentile subroutine *      based on Canales, SEP-10 *      p - percentile <0.,99.999999999999> *      x - data *      n - vector length *  this routine changes data order, so sort a copy */float    DataCent(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);}/* return long data name */char    *DataLabel(Data data){    static Message message;    if( !data ){        return (0);    }    sprintf(message, "%s: %dx%dx%dx%dx%d=%d samples ", data->title,            AxisSize(data->axis[DATA_AXIS1]),            AxisSize(data->axis[DATA_AXIS2]),            AxisSize(data->axis[DATA_AXIS3]),            AxisSize(data->axis[DATA_AXIS4]),            AxisSize(data->axis[DATA_AXIS5]), data->size);    return (message);}/* return short data name */char    *DataTitle(Data data){    if( !data ){        return (0);    }    return (data->title);}/* return data file */char    *DataFile(Data data){    if( !data ){        return (0);    }    return (data->file);}/* return short name of dataset from filename */char    *DataShortName(Data data){    static string name;    char    *c, *strrchr(const char *, int), *strchr(const char *, int);    /* truncate leading pathname */    if( (c = strrchr(data->file, '/')) != NULL ){        strcpy(name, c + 1);    } else {        strcpy(name, data->file);    }    /* truncate trailing tail */    if( (c = strchr(name, '.')) != NULL ){        *c = '\0';    }    return (name);}/* return data buffer */Buffer   DataBuffer(Data data){    if( !data ){        return (0);    }    return (data->buffer);}/* return axis reference */Axis     DataAxis(Data data, int iaxis){    if( !data || iaxis > DATA_NAXIS ){        return (0);    }    return (data->axis[iaxis]);}/* return data size */int DataSize(Data data){    return (data->size);}/* return longest dimension */int DataMaxDim(Data data){    int      max, iaxis;    if( !data ){        return (0);    }    for( iaxis = 0, max = 1; iaxis < DATA_NAXIS - 1; iaxis++ ){        max =            AxisSize(data->axis[iaxis + 1]) >            max ? AxisSize(data->axis[iaxis + 1]) : max;    }    return (max);}/* return data amplitude */float    DataValue(Data data, int value){    return (data->low +            ((data->high - data->low) * ((value & 0x7F) - data->value_base)) /            DATA_VALUE_SIZE);}/* return data value size */int DataValueSize(Data data){    if( !data ){        return (0);    } else {        return (data->value_size);    }}/* return base data value */int DataValueBase(Data data){    if( !data ){        return (0);    } else {        return (data->value_base);    }}/* return data high clip */float    DataHigh(void){    extern Data data;    if( !data ){        return (0.0);    }    return (data->high);}/* return data low clip */float    DataLow(void){    extern Data data;    if( !data ){        return (0.0);    }    return (data->low);}/* return integer percentage of histogram */int DataHistogram(int i){    extern Data data;    if( !data || i < 0 || i > 255 ){        return (0);    }    return ((int) (100 * data->histogram[i]));}void DataComputeHistogram(Data data){    register Buffer bp, be;    int      i;    float    max;    /*----------------------------*/    /* clear the histogram buffer */    /*----------------------------*/    for( i = 0; i < 256; i++ ){        data->histogram[i] = 0;    }    /*------------------------------*/    /* calculate total for each bin */    /*------------------------------*/    for( bp = data->buffer, be = bp + data->size; bp < be; bp++ ){        data->histogram[*bp] += 1.0;    }    /*------------------------------*/    /* rescale totals to percentage */    /*------------------------------*/    max = 0;    for( i = 0; i < ColorSize(); i++ ){        max = data->histogram[i] > max ? data->histogram[i] : max;    }    for( i = 0; i < ColorSize(); i++ ){        data->histogram[i] /= max;    }}/* print data information */void DataInfo(Data data){    Message  message;    sprintf(message,            "Data: %s: in=%s %dx%dx%dx%dx%d=%d esize=%d segy=%d hbytes=%d script=%s",            data->title, data->file, AxisSize(data->axis[DATA_AXIS1]),            AxisSize(data->axis[DATA_AXIS2]), AxisSize(data->axis[DATA_AXIS3]),            AxisSize(data->axis[DATA_AXIS4]), AxisSize(data->axis[DATA_AXIS5]),            data->size, data->esize, data->segy, data->hbytes, data->script);    UIMessage(message);}/* data value parameters */void DataValueInfo(Data data){    Message  message;    sprintf(message,            "Value: min=%g low=%g high=%g max=%g tpow=%g gpow=%g base=%d size=%d",            data->min, data->low, data->high, data->max, data->tpow, data->gpow,            data->value_base, data->value_size);    UIMessage(message);}/* save data parameters */void DataSavePar(Data data){    int      iaxis;    Message  message;    if( !data ){        return;    }    sprintf(message,            "Data: %s: in=%s %dx%dx%dx%dx%d=%d esize=%d segy=%d hbytes=%d script=%s",            data->title, data->file, AxisSize(data->axis[DATA_AXIS1]),            AxisSize(data->axis[DATA_AXIS2]), AxisSize(data->axis[DATA_AXIS3]),            AxisSize(data->axis[DATA_AXIS4]), AxisSize(data->axis[DATA_AXIS5]),            data->size, data->esize, data->segy, data->hbytes, data->script);    UISaveMessage(message);    sprintf(message,            "Value: min=%g low=%g high=%g max=%g tpow=%g gpow=%g base=%d size=%d",            data->min, data->low, data->high, data->max, data->tpow, data->gpow,            data->value_base, data->value_size);    UISaveMessage(message);    for( iaxis = DATA_AXIS1; iaxis <= DATA_AXIS5; iaxis++ ){        AxisSavePar(data->axis[iaxis]);    }}/* dump data bytes */void DataDumpBytes(Data data, char *file, int fd){    register byte bp, be;    DrawWatch(1);    for( bp = data->buffer, be = bp + data->size; bp < be; ){        *bp++ <<= 1;    }    write(fd, data->buffer, data->size);    for( bp = data->buffer, be = bp + data->size; bp < be; ){        *bp++ >>= 1;    }    DataDumpHeader(data, file, fd, 1);    DrawWatch(0);}/* dump data vgrid header */void DataDumpHeader(Data data, char *file, int datafd, int esize){    Message  message;    char     parfile[80];    extern FILE *savefd;    if( data->gh.dtype == 0. ){ /* build a header */        data->gh.scale = 1.;        data->gh.n1 = AxisSize(data->axis[DATA_AXIS1]) * data->gh.scale;        data->gh.n2 = AxisSize(data->axis[DATA_AXIS2]) * data->gh.scale;        data->gh.n3 = AxisSize(data->axis[DATA_AXIS3]) * data->gh.scale;        data->gh.n4 = AxisSize(data->axis[DATA_AXIS4]) * data->gh.scale;        data->gh.n5 = AxisSize(data->axis[DATA_AXIS5]) * data->gh.scale;        data->gh.d1 = AxisDelta(data->axis[DATA_AXIS1]) * data->gh.scale;        data->gh.d2 = AxisDelta(data->axis[DATA_AXIS2]) * data->gh.scale;        data->gh.d3 = AxisDelta(data->axis[DATA_AXIS3]) * data->gh.scale;        data->gh.d4 = AxisDelta(data->axis[DATA_AXIS4]) * data->gh.scale;        data->gh.d5 = AxisDelta(data->axis[DATA_AXIS5]) * data->gh.scale;        data->gh.o1 = AxisFirst(data->axis[DATA_AXIS1]) * data->gh.scale;        data->gh.o2 = AxisFirst(data->axis[DATA_AXIS2]) * data->gh.scale;        data->gh.o3 = AxisFirst(data->axis[DATA_AXIS3]) * data->gh.scale;        data->gh.o4 = AxisFirst(data->axis[DATA_AXIS4]) * data->gh.scale;        data->gh.o5 = AxisFirst(data->axis[DATA_AXIS5]) * data->gh.scale;        data->gh.dcdp2 = 1.;        data->gh.dline3 = 1.;        data->gh.ocdp2 = 1.;        data->gh.oline3 = 1.;        data->gh.gmin = data->low * data->gh.scale;        data->gh.gmax = data->high * data->gh.scale;    }    data->gh.dtype = esize * data->gh.scale;    write(datafd, &data->gh, sizeof(data->gh));    close(datafd);    sprintf(parfile, "%s.H", file);    if( (savefd = fopen(parfile, "w")) == NULL ){       UIMessage("cant create vgrid parfile");    }    DataSavePar(data);    sprintf(message, "Byte data dump into %s", parfile);    UIMessage(message);    fclose(savefd);}/* dump data floats */void DataDumpFloats(Data data, char *file, int fd){    int      nn, n3, i;    Buffer   dbuf;    float   *fbuf, min, max;    DrawWatch(1);    nn = AxisSize(data->axis[DATA_AXIS1]) * AxisSize(data->axis[DATA_AXIS2]);    n3 = data->size / nn;    {        extern int _alloc;        fbuf = (float *) malloc((size_t) (nn) * sizeof(fbuf[0]));        _alloc += (nn) * sizeof(fbuf[0]);        if( fbuf == 0 ){            err("cant allocate %d bytes for  fbuf; %d already allocated",                (nn) * sizeof(fbuf[0]), _alloc);        }        if( memwatch ){            (void) printf("malloc %s=%d\n", " fbuf", (nn) * sizeof(fbuf[0]));        }    };    /* convert and dump a plane at a time */    min = data->high;    max = data->low;    for( i = 0, dbuf = data->buffer; i < n3; i++, dbuf += nn ){        Data2Float(dbuf, fbuf, nn, &min, &max);        write(fd, fbuf, nn * sizeof(fbuf[0]));    }    data->gh.gmin = min * data->gh.scale;    data->gh.gmax = max * data->gh.scale;    DataDumpHeader(data, file, fd, 4);    if( fbuf ){        free(fbuf);        fbuf = 0;        if( memwatch ){            printf("free %s\n", "fbuf");        }    };    DrawWatch(0);}void Data2Float(Buffer dbuf, float *fbuf, int n, float *min, float *max){    register Buffer bp, be;    register float *fp, *mp, Min, Max;    extern Data data;    Min = *min;    Max = *max;    /* convert */    for( mp = AxisValues(data->axis[DATA_VALUE]) - DATA_VALUE_BASE, bp =         dbuf, fp = fbuf, be = dbuf + n; bp < be; bp++, fp++ ){        *fp = mp[*bp];        Max = Max > *fp ? Max : *fp;        Min = Min < *fp ? Min : *fp;    }    *min = Min;    *max = Max;}int      irint(float x){    int      i;    i = x;    return ((x - i) < (1 - (x - i)) ? i : i + 1);}

⌨️ 快捷键说明

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