diff --git a/src/cdf_read.c b/src/cdf_read.c index 654f761f0cf72c2eba5785879b07fed284b0b024..549b240cb08746a0bada9d9743dc22a278dd8278 100644 --- a/src/cdf_read.c +++ b/src/cdf_read.c @@ -561,7 +561,7 @@ cdfReadDataSliceDP2SP(int fileID, int ncvarid, size_t length, size_t start[MAX_D } static void -cdfCheckDataDP_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t length, double *data) +cdfCheckDataFP64_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t length, double *data) { if (vlistInqVarDatatype(vlistID, varID) == CDI_DATATYPE_UINT8) { @@ -576,7 +576,7 @@ cdfCheckDataDP_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t len } static void -cdfCheckDataSP_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t length, float *data) +cdfCheckDataFP32_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t length, float *data) { if (vlistInqVarDatatype(vlistID, varID) == CDI_DATATYPE_UINT8) { @@ -591,7 +591,7 @@ cdfCheckDataSP_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t len } static void -cdfReadDataDP(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS], +cdfReadDataFP64(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS], double *data) { int vlistID = streamptr->vlistID; @@ -621,13 +621,13 @@ cdfReadDataDP(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DI { cdf_get_vara_double(fileID, ncvarid, start, count, data); - cdfCheckDataDP_UINT8(fileID, ncvarid, vlistID, varID, length, data); + cdfCheckDataFP64_UINT8(fileID, ncvarid, vlistID, varID, length, data); } } } static void -cdfReadDataSP(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS], +cdfReadDataFP32(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS], float *data) { int vlistID = streamptr->vlistID; @@ -663,7 +663,7 @@ cdfReadDataSP(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DI { cdf_get_vara_float(fileID, ncvarid, start, count, data); - cdfCheckDataSP_UINT8(fileID, ncvarid, vlistID, varID, length, data); + cdfCheckDataFP32_UINT8(fileID, ncvarid, vlistID, varID, length, data); } } } @@ -679,7 +679,7 @@ cdfReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals) cdfGetSlapDescription(streamptr, varID, &start, &count); size_t length = getSizeVar3D(vlistID, varID); - cdfReadDataDP(streamptr, varID, length, start, count, data); + cdfReadDataFP64(streamptr, varID, length, start, count, data); *numMissVals = cdfDoInputDataTransformationDP(vlistID, varID, length, data); } @@ -695,7 +695,7 @@ cdfReadVarSP(stream_t *streamptr, int varID, float *data, size_t *numMissVals) cdfGetSlapDescription(streamptr, varID, &start, &count); size_t length = getSizeVar3D(vlistID, varID); - cdfReadDataSP(streamptr, varID, length, start, count, data); + cdfReadDataFP32(streamptr, varID, length, start, count, data); *numMissVals = cdfDoInputDataTransformationSP(vlistID, varID, length, data); } @@ -721,7 +721,7 @@ cdf_read_var_slice_DP(stream_t *streamptr, int tsID, int varID, int levelID, dou int vlistID = streamptr->vlistID; int gridId = vlistInqVarGrid(vlistID, varID); size_t length = gridInqSize(gridId); - cdfReadDataDP(streamptr, varID, length, start, count, data); + cdfReadDataFP64(streamptr, varID, length, start, count, data); if (swapxy) transpose2dArrayDP(gridId, data); @@ -746,7 +746,7 @@ cdf_read_var_slice_SP(stream_t *streamptr, int tsID, int varID, int levelID, flo int vlistID = streamptr->vlistID; int gridId = vlistInqVarGrid(vlistID, varID); size_t length = gridInqSize(gridId); - cdfReadDataSP(streamptr, varID, length, start, count, data); + cdfReadDataFP32(streamptr, varID, length, start, count, data); if (swapxy) transpose2dArraySP(gridId, data); @@ -982,7 +982,7 @@ cdfReadVarSliceDPPart(stream_t *streamptr, int varID, int levelID, int varType, start[position] = start[position] + startpoint; count[position] = length; - cdfReadDataDP(streamptr, varID, length, start, count, data); + cdfReadDataFP64(streamptr, varID, length, start, count, data); if (swapxy) transpose2dArrayDP(gridId, data); @@ -1013,7 +1013,7 @@ cdfReadVarSliceSPPart(stream_t *streamptr, int varID, int levelID, int varType, start[position] = start[position] + startpoint; count[position] = length; - cdfReadDataSP(streamptr, varID, length, start, count, data); + cdfReadDataFP32(streamptr, varID, length, start, count, data); if (swapxy) transpose2dArraySP(gridId, data); diff --git a/src/exse.h b/src/exse.h index 09f4691048c2d5846705db3baecd47d75403d356..ef0ed820642c4638382c373f3e22b88d85effacb 100644 --- a/src/exse.h +++ b/src/exse.h @@ -1,10 +1,10 @@ #ifndef EXSE_H #define EXSE_H -enum -{ - EXSE_SINGLE_PRECISION = 4, - EXSE_DOUBLE_PRECISION = 8, +enum { + EXSE_PREC_FP16 = 2, + EXSE_PREC_FP32 = 4, + EXSE_PREC_FP64 = 8, }; #endif diff --git a/src/extra.h b/src/extra.h index 299a148dd8b8164c66e3b727b6601000332893b7..2d85f48c4cf1f337697b0173ba7d50116946280c 100644 --- a/src/extra.h +++ b/src/extra.h @@ -1,16 +1,19 @@ #ifndef _EXTRA_H #define _EXTRA_H -#define EXT_REAL 1 -#define EXT_COMP 2 +enum +{ + EXT_REAL = 1, + EXT_COMP = 2, +}; typedef struct { int checked; int byteswap; int header[4]; - int prec; /* single or double precison */ - int number; /* real or complex */ + int prec; // single or double precison + int number; // real or complex size_t datasize; size_t buffersize; void *buffer; @@ -29,12 +32,18 @@ int extRead(int fileID, void *ext); int extWrite(int fileID, void *ext); int extInqHeader(void *ext, int *header); -int extInqDataSP(void *ext, float *data); -int extInqDataDP(void *ext, double *data); +int extInqDataFP32(void *ext, float *data); +int extInqDataFP64(void *ext, double *data); int extDefHeader(void *ext, const int *header); -int extDefDataSP(void *ext, const float *data); -int extDefDataDP(void *ext, const double *data); +int extDefDataFP32(void *ext, const float *data); +int extDefDataFP64(void *ext, const double *data); + +#include "float16.h" +#ifdef HAVE_FLOAT16 +int extInqDataFP16(void *ext, _Float16 *data); +int extDefDataFP16(void *ext, const _Float16 *data); +#endif #endif /* _EXTRA_H */ /* diff --git a/src/extralib.c b/src/extralib.c index 5cee8bb92a68df6dd6bcab079232f90dbb3e0202..4f45eccb0474ca48588720feaad9f148bdcd4d17 100644 --- a/src/extralib.c +++ b/src/extralib.c @@ -10,6 +10,7 @@ #include "binary.h" #include "exse.h" #include "swap.h" +#include "float16.h" enum { @@ -65,8 +66,9 @@ extLibInit(void) extDefaultNumber = EXT_REAL; switch ((int) envString[1]) { - case '4': extDefaultPrec = EXSE_SINGLE_PRECISION; break; - case '8': extDefaultPrec = EXSE_DOUBLE_PRECISION; break; + case '2': extDefaultPrec = EXSE_PREC_FP16; break; + case '4': extDefaultPrec = EXSE_PREC_FP32; break; + case '8': extDefaultPrec = EXSE_PREC_FP64; break; default: Warning("Invalid digit in %s: %s", envName, envString); } break; @@ -76,8 +78,8 @@ extLibInit(void) extDefaultNumber = EXT_COMP; switch ((int) envString[1]) { - case '4': extDefaultPrec = EXSE_SINGLE_PRECISION; break; - case '8': extDefaultPrec = EXSE_DOUBLE_PRECISION; break; + case '4': extDefaultPrec = EXSE_PREC_FP32; break; + case '8': extDefaultPrec = EXSE_PREC_FP64; break; default: Warning("Invalid digit in %s: %s", envName, envString); } break; @@ -149,7 +151,7 @@ extCheckFiletype(int fileID, int *swap) if (blocklen == 16) { *swap = 0; - fact = blocklen/4; + fact = blocklen / 4; if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0; pbuf = buffer+3*fact; dimxy = (size_t) get_uint32(pbuf); pbuf = buffer+blocklen+4; data = (size_t) get_uint32(pbuf); @@ -157,7 +159,7 @@ extCheckFiletype(int fileID, int *swap) else if (blocklen == 32) { *swap = 0; - fact = blocklen/4; + fact = blocklen / 4; if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0; pbuf = buffer+3*fact; dimxy = (size_t) get_uint64(pbuf); pbuf = buffer+blocklen+4; data = (size_t) get_uint32(pbuf); @@ -165,7 +167,7 @@ extCheckFiletype(int fileID, int *swap) else if (sblocklen == 16) { *swap = 1; - fact = sblocklen/4; + fact = sblocklen / 4; if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0; pbuf = buffer+3*fact; dimxy = (size_t) get_swap_uint32(pbuf); pbuf = buffer+sblocklen+4; data = (size_t) get_swap_uint32(pbuf); @@ -173,7 +175,7 @@ extCheckFiletype(int fileID, int *swap) else if (sblocklen == 32) { *swap = 1; - fact = sblocklen/4; + fact = sblocklen / 4; if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0; pbuf = buffer+3*fact; dimxy = (size_t) get_swap_uint64(pbuf); pbuf = buffer+sblocklen+4; data = (size_t) get_swap_uint32(pbuf); @@ -185,7 +187,7 @@ extCheckFiletype(int fileID, int *swap) if (EXT_Debug) Message("swap = %d fact = %d", *swap, fact); if (EXT_Debug) Message("dimxy = %lu data = %lu", dimxy, data); - int found = data && (dimxy * fact == data || dimxy * fact * 2 == data); + int found = data && (dimxy * fact == data || dimxy * fact * 2 == data || dimxy * fact / 2 == data); return found; } @@ -227,38 +229,44 @@ extInqData(extrec_t *extp, int prec, void *data) switch (rprec) { - case EXSE_SINGLE_PRECISION: + case EXSE_PREC_FP32: { - if (sizeof(float) == 4) - { - if (byteswap) swap4byte(buffer, datasize); - - if (rprec == prec) - memcpy(data, buffer, datasize * sizeof(float)); - else - for (size_t i = 0; i < datasize; ++i) ((double *) data)[i] = (double) ((float *) buffer)[i]; - } - else - { - Error("not implemented for %d byte float", sizeof(float)); - } + if (byteswap) swap4byte(buffer, datasize); + + if (EXSE_PREC_FP32 == prec) + memcpy(data, buffer, datasize * prec); + else if (EXSE_PREC_FP64 == prec) + for (size_t i = 0; i < datasize; ++i) ((double *) data)[i] = (double) ((float *) buffer)[i]; +#ifdef HAVE_FLOAT16 + else if (EXSE_PREC_FP16 == prec) + for (size_t i = 0; i < datasize; ++i) ((_Float16 *) data)[i] = (_Float16) ((float *) buffer)[i]; +#endif break; } - case EXSE_DOUBLE_PRECISION: - if (sizeof(double) == 8) - { - if (byteswap) swap8byte(buffer, datasize); + case EXSE_PREC_FP64: + if (byteswap) swap8byte(buffer, datasize); + + if (EXSE_PREC_FP64 == prec) + memcpy(data, buffer, datasize * prec); + else if (EXSE_PREC_FP32 == prec) + for (size_t i = 0; i < datasize; ++i) ((float *) data)[i] = (float) ((double *) buffer)[i]; +#ifdef HAVE_FLOAT16 + else if (EXSE_PREC_FP16 == prec) + for (size_t i = 0; i < datasize; ++i) ((_Float16 *) data)[i] = (_Float16) ((double *) buffer)[i]; +#endif + + break; +#ifdef HAVE_FLOAT16 + case EXSE_PREC_FP16: + if (EXSE_PREC_FP16 == prec) + memcpy(data, buffer, datasize * prec); + else if (EXSE_PREC_FP64 == prec) + for (size_t i = 0; i < datasize; ++i) ((double *) data)[i] = (double) ((_Float16 *) buffer)[i]; + else if (EXSE_PREC_FP32 == prec) + for (size_t i = 0; i < datasize; ++i) ((float *) data)[i] = (float) ((_Float16 *) buffer)[i]; - if (rprec == prec) - memcpy(data, buffer, datasize * sizeof(double)); - else - for (size_t i = 0; i < datasize; ++i) ((float *) data)[i] = (float) ((double *) buffer)[i]; - } - else - { - Error("not implemented for %d byte float", sizeof(double)); - } break; +#endif default: { Error("unexpected data precision %d", rprec); @@ -270,16 +278,23 @@ extInqData(extrec_t *extp, int prec, void *data) } int -extInqDataSP(void *ext, float *data) +extInqDataFP32(void *ext, float *data) { - return extInqData((extrec_t *) ext, EXSE_SINGLE_PRECISION, (void *) data); + return extInqData((extrec_t *) ext, EXSE_PREC_FP32, (void *) data); } int -extInqDataDP(void *ext, double *data) +extInqDataFP64(void *ext, double *data) { - return extInqData((extrec_t *) ext, EXSE_DOUBLE_PRECISION, (void *) data); + return extInqData((extrec_t *) ext, EXSE_PREC_FP64, (void *) data); } +#ifdef HAVE_FLOAT16 +int +extInqDataFP16(void *ext, _Float16 *data) +{ + return extInqData((extrec_t *) ext, EXSE_PREC_FP16, (void *) data); +} +#endif static int extDefData(void *ext, int prec, const void *data) @@ -305,24 +320,43 @@ extDefData(void *ext, int prec, const void *data) switch (rprec) { - case EXSE_SINGLE_PRECISION: + case EXSE_PREC_FP32: { - if (rprec == prec) - memcpy(extp->buffer, data, datasize * sizeof(float)); - else + if (EXSE_PREC_FP32 == prec) + memcpy(extp->buffer, data, datasize * prec); + else if (EXSE_PREC_FP64 == prec) for (size_t i = 0; i < datasize; i++) ((float *) extp->buffer)[i] = (float) ((double *) data)[i]; - +#ifdef HAVE_FLOAT16 + else if (EXSE_PREC_FP16 == prec) + for (size_t i = 0; i < datasize; i++) ((float *) extp->buffer)[i] = (float) ((_Float16 *) data)[i]; +#endif break; } - case EXSE_DOUBLE_PRECISION: + case EXSE_PREC_FP64: { - if (rprec == prec) - memcpy(extp->buffer, data, datasize * sizeof(double)); - else + if (EXSE_PREC_FP64 == prec) + memcpy(extp->buffer, data, datasize * prec); + else if (EXSE_PREC_FP32 == prec) for (size_t i = 0; i < datasize; i++) ((double *) extp->buffer)[i] = (double) ((float *) data)[i]; +#ifdef HAVE_FLOAT16 + else if (EXSE_PREC_FP16 == prec) + for (size_t i = 0; i < datasize; i++) ((double *) extp->buffer)[i] = (double) ((_Float16 *) data)[i]; +#endif + break; + } +#ifdef HAVE_FLOAT16 + case EXSE_PREC_FP16: + { + if (EXSE_PREC_FP16 == prec) + memcpy(extp->buffer, data, datasize * prec); + else if (EXSE_PREC_FP32 == prec) + for (size_t i = 0; i < datasize; i++) ((_Float16 *) extp->buffer)[i] = (_Float16) ((float *) data)[i]; + else if (EXSE_PREC_FP64 == prec) + for (size_t i = 0; i < datasize; i++) ((_Float16 *) extp->buffer)[i] = (_Float16) ((double *) data)[i]; break; } +#endif default: { Error("unexpected data precision %d", rprec); @@ -334,16 +368,23 @@ extDefData(void *ext, int prec, const void *data) } int -extDefDataSP(void *ext, const float *data) +extDefDataFP32(void *ext, const float *data) { - return extDefData(ext, EXSE_SINGLE_PRECISION, (void *) data); + return extDefData(ext, EXSE_PREC_FP32, (void *) data); } int -extDefDataDP(void *ext, const double *data) +extDefDataFP64(void *ext, const double *data) +{ + return extDefData(ext, EXSE_PREC_FP64, (void *) data); +} +#ifdef HAVE_FLOAT16 +int +extDefDataFP16(void *ext, const _Float16 *data) { - return extDefData(ext, EXSE_DOUBLE_PRECISION, (void *) data); + return extDefData(ext, EXSE_PREC_FP16, (void *) data); } +#endif int extRead(int fileID, void *ext) @@ -367,19 +408,19 @@ extRead(int fileID, void *ext) if (EXT_Debug) Message("blocklen = %lu", blocklen); size_t hprec = blocklen / EXT_HEADER_LEN; - - extp->prec = (int) hprec; + // extp->prec = (int) hprec; union EXT_HEADER tempheader; switch (hprec) { - case EXSE_SINGLE_PRECISION: + case EXSE_PREC_FP32: + case EXSE_PREC_FP16: { binReadInt32(fileID, byteswap, EXT_HEADER_LEN, tempheader.i32); for (int i = 0; i < EXT_HEADER_LEN; i++) extp->header[i] = (int) tempheader.i32[i]; break; } - case EXSE_DOUBLE_PRECISION: + case EXSE_PREC_FP64: { binReadInt64(fileID, byteswap, EXT_HEADER_LEN, tempheader.i64); for (int i = 0; i < EXT_HEADER_LEN; i++) extp->header[i] = (int) tempheader.i64[i]; @@ -413,19 +454,20 @@ extRead(int fileID, void *ext) } size_t dprec = blocklen / extp->datasize; + extp->prec = (int) dprec; - if (dprec == hprec) + if (dprec == hprec || dprec == hprec / 2) { extp->number = EXT_REAL; } - else if (dprec == 2 * hprec) + else if (dprec == hprec * 2) { dprec /= 2; extp->datasize *= 2; extp->number = EXT_COMP; } - if (dprec != EXSE_SINGLE_PRECISION && dprec != EXSE_DOUBLE_PRECISION) + if (dprec != EXSE_PREC_FP32 && dprec != EXSE_PREC_FP64 && dprec != EXSE_PREC_FP16) { Warning("Unexpected data precision %d", dprec); return -1; @@ -455,19 +497,20 @@ extWrite(int fileID, void *ext) int *header = extp->header; // write header record - size_t blocklen = EXT_HEADER_LEN * (size_t) rprec; + size_t blocklen = EXT_HEADER_LEN * (size_t) ((rprec == EXSE_PREC_FP16) ? EXSE_PREC_FP32 : rprec); binWriteF77Block(fileID, byteswap, blocklen); switch (rprec) { - case EXSE_SINGLE_PRECISION: + case EXSE_PREC_FP16: + case EXSE_PREC_FP32: { for (int i = 0; i < EXT_HEADER_LEN; i++) tempheader.i32[i] = (int32_t) header[i]; binWriteInt32(fileID, byteswap, EXT_HEADER_LEN, tempheader.i32); break; } - case EXSE_DOUBLE_PRECISION: + case EXSE_PREC_FP64: { for (int i = 0; i < EXT_HEADER_LEN; i++) tempheader.i64[i] = (int64_t) header[i]; binWriteInt64(fileID, byteswap, EXT_HEADER_LEN, tempheader.i64); @@ -490,12 +533,19 @@ extWrite(int fileID, void *ext) switch (rprec) { - case EXSE_SINGLE_PRECISION: +#ifdef HAVE_FLOAT16 + case EXSE_PREC_FP16: + { + binWriteFlt16(fileID, byteswap, extp->datasize, (_Float16 *) extp->buffer); + break; + } +#endif + case EXSE_PREC_FP32: { binWriteFlt32(fileID, byteswap, extp->datasize, (float *) extp->buffer); break; } - case EXSE_DOUBLE_PRECISION: + case EXSE_PREC_FP64: { binWriteFlt64(fileID, byteswap, extp->datasize, (double *) extp->buffer); break; diff --git a/src/ieg.h b/src/ieg.h index 7876aadd0f740988250939d2d243c6e5bef1fbb2..df110c2d5edc2c34853efe6591cfe66a12aa38ca 100644 --- a/src/ieg.h +++ b/src/ieg.h @@ -84,12 +84,12 @@ int iegWrite(int fileID, void *ieg); void iegCopyMeta(void *dieg, void *sieg); int iegInqHeader(void *ieg, int *header); -int iegInqDataSP(void *ieg, float *data); -int iegInqDataDP(void *ieg, double *data); +int iegInqDataFP32(void *ieg, float *data); +int iegInqDataFP64(void *ieg, double *data); int iegDefHeader(void *ieg, const int *header); -int iegDefDataSP(void *ieg, const float *data); -int iegDefDataDP(void *ieg, const double *data); +int iegDefDataFP32(void *ieg, const float *data); +int iegDefDataFP64(void *ieg, const double *data); #endif /* _IEG_H */ /* diff --git a/src/ieglib.c b/src/ieglib.c index e7c6cdcd230bedeb294084270da45d78aa435743..58550504f2b2f7c090b8d0c75f4cc703ba52def8 100644 --- a/src/ieglib.c +++ b/src/ieglib.c @@ -47,8 +47,8 @@ iegLibInit(void) { switch ((int) envString[pos + 1]) { - case '4': iegDefaultDprec = EXSE_SINGLE_PRECISION; break; - case '8': iegDefaultDprec = EXSE_DOUBLE_PRECISION; break; + case '4': iegDefaultDprec = EXSE_PREC_FP32; break; + case '8': iegDefaultDprec = EXSE_PREC_FP64; break; default: Warning("Invalid digit in %s: %s", envName, envString); } break; @@ -208,7 +208,7 @@ iegInqData(void *ieg, int prec, void *data) switch (dprec) { - case EXSE_SINGLE_PRECISION: + case EXSE_PREC_FP32: { if (sizeof(float) == 4) { @@ -229,7 +229,7 @@ iegInqData(void *ieg, int prec, void *data) } break; } - case EXSE_DOUBLE_PRECISION: + case EXSE_PREC_FP64: { if (sizeof(double) == 8) { @@ -261,15 +261,15 @@ iegInqData(void *ieg, int prec, void *data) } int -iegInqDataSP(void *ieg, float *data) +iegInqDataFP32(void *ieg, float *data) { - return iegInqData(ieg, EXSE_SINGLE_PRECISION, (void *) data); + return iegInqData(ieg, EXSE_PREC_FP32, (void *) data); } int -iegInqDataDP(void *ieg, double *data) +iegInqDataFP64(void *ieg, double *data) { - return iegInqData(ieg, EXSE_DOUBLE_PRECISION, (void *) data); + return iegInqData(ieg, EXSE_PREC_FP64, (void *) data); } static int @@ -291,7 +291,7 @@ iegDefData(iegrec_t *iegp, int prec, const void *data) switch (dprec) { - case EXSE_SINGLE_PRECISION: + case EXSE_PREC_FP32: { if (dprec == prec) memcpy(iegp->buffer, data, datasize * sizeof(float)); @@ -303,7 +303,7 @@ iegDefData(iegrec_t *iegp, int prec, const void *data) } break; } - case EXSE_DOUBLE_PRECISION: + case EXSE_PREC_FP64: { if (dprec == prec) memcpy(iegp->buffer, data, datasize * sizeof(double)); @@ -326,15 +326,15 @@ iegDefData(iegrec_t *iegp, int prec, const void *data) } int -iegDefDataSP(void *ieg, const float *data) +iegDefDataFP32(void *ieg, const float *data) { - return iegDefData((iegrec_t *) ieg, EXSE_SINGLE_PRECISION, (void *) data); + return iegDefData((iegrec_t *) ieg, EXSE_PREC_FP32, (void *) data); } int -iegDefDataDP(void *ieg, const double *data) +iegDefDataFP64(void *ieg, const double *data) { - return iegDefData((iegrec_t *) ieg, EXSE_DOUBLE_PRECISION, (void *) data); + return iegDefData((iegrec_t *) ieg, EXSE_PREC_FP64, (void *) data); } int @@ -399,7 +399,7 @@ iegRead(int fileID, void *ieg) binReadInt32(fileID, byteswap, 3, buf.i32); for (int i = 0; i < 3; i++) iegp->igdb[18 + i] = (int) buf.i32[i]; - if (dprec == EXSE_SINGLE_PRECISION) + if (dprec == EXSE_PREC_FP32) { fileRead(fileID, buf.f, 400); if (byteswap) swap4byte(buf.f, 100); @@ -464,7 +464,7 @@ iegWrite(int fileID, void *ieg) int byteswap = iegp->byteswap; // write header record - size_t blocklen = (dprec == EXSE_SINGLE_PRECISION) ? 636 : 1040; + size_t blocklen = (dprec == EXSE_PREC_FP32) ? 636 : 1040; binWriteF77Block(fileID, byteswap, blocklen); @@ -476,7 +476,7 @@ iegWrite(int fileID, void *ieg) double refval = (double) iegp->refval; float refvalf = (float) iegp->refval; - if (dprec == EXSE_SINGLE_PRECISION) + if (dprec == EXSE_PREC_FP32) binWriteFlt32(fileID, byteswap, 1, &refvalf); else binWriteFlt64(fileID, byteswap, 1, &refval); @@ -484,7 +484,7 @@ iegWrite(int fileID, void *ieg) for (int i = 0; i < 3; i++) buf.i32[i] = (int32_t) iegp->igdb[18 + i]; binWriteInt32(fileID, byteswap, 3, buf.i32); - if (dprec == EXSE_SINGLE_PRECISION) + if (dprec == EXSE_PREC_FP32) { for (int i = 0; i < 100; i++) buf.fvct[i] = (float) iegp->vct[i]; binWriteFlt32(fileID, byteswap, 100, buf.fvct); @@ -503,12 +503,12 @@ iegWrite(int fileID, void *ieg) switch (dprec) { - case EXSE_SINGLE_PRECISION: + case EXSE_PREC_FP32: { binWriteFlt32(fileID, byteswap, iegp->datasize, (float *) iegp->buffer); break; } - case EXSE_DOUBLE_PRECISION: + case EXSE_PREC_FP64: { binWriteFlt64(fileID, byteswap, iegp->datasize, (double *) iegp->buffer); break; diff --git a/src/service.h b/src/service.h index 7eed0950c1fbe20fed5044f6b22e88e94997ef28..9c9a5d14b39cd85e57340cd2d8f94170258d253f 100644 --- a/src/service.h +++ b/src/service.h @@ -26,12 +26,12 @@ int srvRead(int fileID, void *srv); void srvWrite(int fileID, void *srv); int srvInqHeader(void *srv, int *header); -int srvInqDataSP(void *srv, float *data); -int srvInqDataDP(void *srv, double *data); +int srvInqDataFP32(void *srv, float *data); +int srvInqDataFP64(void *srv, double *data); int srvDefHeader(void *srv, const int *header); -int srvDefDataSP(void *srv, const float *data); -int srvDefDataDP(void *srv, const double *data); +int srvDefDataFP32(void *srv, const float *data); +int srvDefDataFP64(void *srv, const double *data); #endif /* _SERVICE_H */ /* diff --git a/src/servicelib.c b/src/servicelib.c index 2a15e17199b4ec7b596cf3c6a58686638b588933..dc673f9702e9db75c6d795fde7ec0fa3a25ea4f2 100644 --- a/src/servicelib.c +++ b/src/servicelib.c @@ -67,8 +67,8 @@ srvLibInit(void) { switch ((int) envString[pos + 1]) { - case '4': srvDefaultHprec = EXSE_SINGLE_PRECISION; break; - case '8': srvDefaultHprec = EXSE_DOUBLE_PRECISION; break; + case '4': srvDefaultHprec = EXSE_PREC_FP32; break; + case '8': srvDefaultHprec = EXSE_PREC_FP64; break; default: Warning("Invalid digit in %s: %s", envName, envString); } break; @@ -77,8 +77,8 @@ srvLibInit(void) { switch ((int) envString[pos + 1]) { - case '4': srvDefaultDprec = EXSE_SINGLE_PRECISION; break; - case '8': srvDefaultDprec = EXSE_DOUBLE_PRECISION; break; + case '4': srvDefaultDprec = EXSE_PREC_FP32; break; + case '8': srvDefaultDprec = EXSE_PREC_FP64; break; default: Warning("Invalid digit in %s: %s", envName, envString); } break; @@ -231,7 +231,7 @@ srvInqData(srvrec_t *srvp, int prec, void *data) switch (dprec) { - case EXSE_SINGLE_PRECISION: + case EXSE_PREC_FP32: { if (sizeof(float) == 4) { @@ -248,7 +248,7 @@ srvInqData(srvrec_t *srvp, int prec, void *data) } break; } - case EXSE_DOUBLE_PRECISION: + case EXSE_PREC_FP64: if (sizeof(double) == 8) { if (byteswap) swap8byte(buffer, datasize); @@ -274,15 +274,15 @@ srvInqData(srvrec_t *srvp, int prec, void *data) } int -srvInqDataSP(void *srv, float *data) +srvInqDataFP32(void *srv, float *data) { - return srvInqData((srvrec_t *) srv, EXSE_SINGLE_PRECISION, (void *) data); + return srvInqData((srvrec_t *) srv, EXSE_PREC_FP32, (void *) data); } int -srvInqDataDP(void *srv, double *data) +srvInqDataFP64(void *srv, double *data) { - return srvInqData((srvrec_t *) srv, EXSE_DOUBLE_PRECISION, (void *) data); + return srvInqData((srvrec_t *) srv, EXSE_PREC_FP64, (void *) data); } static int @@ -311,7 +311,7 @@ srvDefData(void *srv, int prec, const void *data) switch (dprec) { - case EXSE_SINGLE_PRECISION: + case EXSE_PREC_FP32: { if (dprec == prec) memcpy(srvp->buffer, data, datasize * sizeof(float)); @@ -320,7 +320,7 @@ srvDefData(void *srv, int prec, const void *data) break; } - case EXSE_DOUBLE_PRECISION: + case EXSE_PREC_FP64: { if (dprec == prec) memcpy(srvp->buffer, data, datasize * sizeof(double)); @@ -340,15 +340,15 @@ srvDefData(void *srv, int prec, const void *data) } int -srvDefDataSP(void *srv, const float *data) +srvDefDataFP32(void *srv, const float *data) { - return srvDefData(srv, EXSE_SINGLE_PRECISION, (void *) data); + return srvDefData(srv, EXSE_PREC_FP32, (void *) data); } int -srvDefDataDP(void *srv, const double *data) +srvDefDataFP64(void *srv, const double *data) { - return srvDefData(srv, EXSE_DOUBLE_PRECISION, (void *) data); + return srvDefData(srv, EXSE_PREC_FP64, (void *) data); } int @@ -379,13 +379,13 @@ srvRead(int fileID, void *srv) switch (hprec) { - case EXSE_SINGLE_PRECISION: + case EXSE_PREC_FP32: { binReadInt32(fileID, byteswap, SRV_HEADER_LEN, tempheader.i32); for (int i = 0; i < SRV_HEADER_LEN; i++) srvp->header[i] = (int) tempheader.i32[i]; break; } - case EXSE_DOUBLE_PRECISION: + case EXSE_PREC_FP64: { binReadInt64(fileID, byteswap, SRV_HEADER_LEN, tempheader.i64); for (int i = 0; i < SRV_HEADER_LEN; i++) srvp->header[i] = (int) tempheader.i64[i]; @@ -422,7 +422,7 @@ srvRead(int fileID, void *srv) srvp->dprec = (int) dprec; - if (dprec != EXSE_SINGLE_PRECISION && dprec != EXSE_DOUBLE_PRECISION) + if (dprec != EXSE_PREC_FP32 && dprec != EXSE_PREC_FP64) { Warning("Unexpected data precision %d", dprec); return -1; @@ -458,13 +458,13 @@ srvWrite(int fileID, void *srv) switch (hprec) { - case EXSE_SINGLE_PRECISION: + case EXSE_PREC_FP32: { for (int i = 0; i < SRV_HEADER_LEN; i++) tempheader.i32[i] = (int32_t) header[i]; binWriteInt32(fileID, byteswap, SRV_HEADER_LEN, tempheader.i32); break; } - case EXSE_DOUBLE_PRECISION: + case EXSE_PREC_FP64: { for (int i = 0; i < SRV_HEADER_LEN; i++) tempheader.i64[i] = (int64_t) header[i]; binWriteInt64(fileID, byteswap, SRV_HEADER_LEN, tempheader.i64); @@ -486,12 +486,12 @@ srvWrite(int fileID, void *srv) switch (dprec) { - case EXSE_SINGLE_PRECISION: + case EXSE_PREC_FP32: { binWriteFlt32(fileID, byteswap, srvp->datasize, (float *) srvp->buffer); break; } - case EXSE_DOUBLE_PRECISION: + case EXSE_PREC_FP64: { binWriteFlt64(fileID, byteswap, srvp->datasize, (double *) srvp->buffer); break; diff --git a/src/stream_ext.c b/src/stream_ext.c index f55f2c0d4c9eabdab147649df7ea234afe1548c0..7fbcd25ce7dffffb863bfb7db957695939c5a90c 100644 --- a/src/stream_ext.c +++ b/src/stream_ext.c @@ -21,9 +21,9 @@ static int extInqDatatype(int prec, int number) { if (number == 2) - return (prec == EXSE_DOUBLE_PRECISION) ? CDI_DATATYPE_CPX64 : CDI_DATATYPE_CPX32; + return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_CPX64 : CDI_DATATYPE_CPX32; else - return (prec == EXSE_DOUBLE_PRECISION) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32; + return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32; } static void @@ -35,7 +35,7 @@ extDefDatatype(int datatype, int *prec, int *number) *number = (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) ? 2 : 1; - *prec = (datatype == CDI_DATATYPE_FLT64 || datatype == CDI_DATATYPE_CPX64) ? EXSE_DOUBLE_PRECISION : EXSE_SINGLE_PRECISION; + *prec = (datatype == CDI_DATATYPE_FLT64 || datatype == CDI_DATATYPE_CPX64) ? EXSE_PREC_FP64 : EXSE_PREC_FP32; } /* not used @@ -94,7 +94,7 @@ ext_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals) int header[4]; extInqHeader(extp, header); - extInqDataSP(extp, data); + extInqDataFP32(extp, data); double missval = vlistInqVarMissval(vlistID, varID); size_t size = gridInqSize(vlistInqVarGrid(vlistID, varID)); @@ -126,7 +126,7 @@ ext_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals) int header[4]; extInqHeader(extp, header); - extInqDataDP(extp, data); + extInqDataFP64(extp, data); double missval = vlistInqVarMissval(vlistID, varID); size_t size = gridInqSize(vlistInqVarGrid(vlistID, varID)); @@ -179,7 +179,7 @@ static void ext_write_recordSP(stream_t *streamptr, const float *data) { void *extp = streamptr->record->objectp; - extDefDataSP(extp, data); + extDefDataFP32(extp, data); extWrite(streamptr->fileID, extp); } @@ -187,7 +187,7 @@ static void ext_write_recordDP(stream_t *streamptr, const double *data) { void *extp = streamptr->record->objectp; - extDefDataDP(extp, data); + extDefDataFP64(extp, data); extWrite(streamptr->fileID, extp); } @@ -571,7 +571,7 @@ extReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_ extRead(fileID, extp); int header[4]; extInqHeader(extp, header); - extInqDataDP(extp, data); + extInqDataFP64(extp, data); fileSetPos(fileID, currentfilepos, SEEK_SET); @@ -619,7 +619,7 @@ extWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data extDefDatatype(vlistInqVarDatatype(vlistID, varID), &extp->prec, &extp->number); extDefHeader(extp, header); - extDefDataDP(extp, data); + extDefDataFP64(extp, data); extWrite(fileID, extp); } diff --git a/src/stream_ieg.c b/src/stream_ieg.c index 33abc8c41626a23d8d011334195c8304b390d531..e83d0c1ace0837a1843d6c6502473e953e0bfb67 100644 --- a/src/stream_ieg.c +++ b/src/stream_ieg.c @@ -22,7 +22,7 @@ static int iegInqDatatype(int prec) { - return (prec == EXSE_DOUBLE_PRECISION) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32; + return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32; } static int @@ -32,7 +32,7 @@ iegDefDatatype(int datatype) if (datatype != CDI_DATATYPE_FLT32 && datatype != CDI_DATATYPE_FLT64) datatype = CDI_DATATYPE_FLT32; - return (datatype == CDI_DATATYPE_FLT64) ? EXSE_DOUBLE_PRECISION : EXSE_SINGLE_PRECISION; + return (datatype == CDI_DATATYPE_FLT64) ? EXSE_PREC_FP64 : EXSE_PREC_FP32; } static void @@ -52,7 +52,7 @@ ieg_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals) void *iegp = streamptr->record->objectp; if (iegRead(fileID, iegp) < 0) Error("Could not read IEG record!"); - iegInqDataSP(iegp, data); + iegInqDataFP32(iegp, data); double missval = vlistInqVarMissval(vlistID, varID); size_t size = gridInqSize(vlistInqVarGrid(vlistID, varID)); @@ -79,7 +79,7 @@ ieg_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals) void *iegp = streamptr->record->objectp; if (iegRead(fileID, iegp) < 0) Error("Could not read IEG record!"); - iegInqDataDP(iegp, data); + iegInqDataFP64(iegp, data); double missval = vlistInqVarMissval(vlistID, varID); size_t size = gridInqSize(vlistInqVarGrid(vlistID, varID)); @@ -487,7 +487,7 @@ ieg_write_recordSP(stream_t *streamptr, const float *data) iegp->refval = calc_refvalSP(gridsize, data); - iegDefDataSP(iegp, data); + iegDefDataFP32(iegp, data); iegWrite(fileID, iegp); } @@ -502,7 +502,7 @@ ieg_write_recordDP(stream_t *streamptr, const double *data) iegp->refval = calc_refvalDP(gridsize, data); - iegDefDataDP(iegp, data); + iegDefDataFP64(iegp, data); iegWrite(fileID, iegp); } @@ -1025,7 +1025,7 @@ iegReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_ off_t recpos = streamptr->tsteps[tsid].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); iegRead(fileID, iegp); - iegInqDataDP(iegp, data); + iegInqDataFP64(iegp, data); fileSetPos(fileID, currentfilepos, SEEK_SET); @@ -1076,7 +1076,7 @@ iegWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data size_t gridsize = gridInqSize(gridID); iegp->refval = calc_refvalDP(gridsize, data); - iegDefDataDP(iegp, data); + iegDefDataFP64(iegp, data); iegWrite(fileID, iegp); } diff --git a/src/stream_srv.c b/src/stream_srv.c index 888959daba9b7e02ad4962b29b2b8d530df81b60..67c3795ba8b81be538830ced34cce387f6aa3ad7 100644 --- a/src/stream_srv.c +++ b/src/stream_srv.c @@ -20,7 +20,7 @@ static int srvInqDatatype(int prec) { - return (prec == EXSE_DOUBLE_PRECISION) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32; + return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32; } static int @@ -31,7 +31,7 @@ srvDefDatatype(int datatype) if (datatype != CDI_DATATYPE_FLT32 && datatype != CDI_DATATYPE_FLT64) datatype = CDI_DATATYPE_FLT32; - return (datatype == CDI_DATATYPE_FLT64) ? EXSE_DOUBLE_PRECISION : EXSE_SINGLE_PRECISION; + return (datatype == CDI_DATATYPE_FLT64) ? EXSE_PREC_FP64 : EXSE_PREC_FP32; } /* not used @@ -90,7 +90,7 @@ srv_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals) int header[8]; srvInqHeader(srvp, header); - srvInqDataSP(srvp, data); + srvInqDataFP32(srvp, data); double missval = vlistInqVarMissval(vlistID, varID); size_t size = gridInqSize(vlistInqVarGrid(vlistID, varID)); @@ -119,7 +119,7 @@ srv_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals) int header[8]; srvInqHeader(srvp, header); - srvInqDataDP(srvp, data); + srvInqDataFP64(srvp, data); double missval = vlistInqVarMissval(vlistID, varID); size_t size = gridInqSize(vlistInqVarGrid(vlistID, varID)); @@ -185,7 +185,7 @@ static void srv_write_recordSP(stream_t *streamptr, const float *data) { void *srvp = streamptr->record->objectp; - srvDefDataSP(srvp, data); + srvDefDataFP32(srvp, data); srvWrite(streamptr->fileID, srvp); } @@ -193,7 +193,7 @@ static void srv_write_recordDP(stream_t *streamptr, const double *data) { void *srvp = streamptr->record->objectp; - srvDefDataDP(srvp, data); + srvDefDataFP64(srvp, data); srvWrite(streamptr->fileID, srvp); } @@ -579,7 +579,7 @@ srvReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_ int header[8]; srvInqHeader(srvp, header); - srvInqDataDP(srvp, data); + srvInqDataFP64(srvp, data); fileSetPos(fileID, currentfilepos, SEEK_SET); @@ -645,7 +645,7 @@ srvWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data srvp->dprec = srvDefDatatype(datatype); srvDefHeader(srvp, header); - srvDefDataDP(srvp, data); + srvDefDataFP64(srvp, data); srvWrite(fileID, srvp); }