#if defined (HAVE_CONFIG_H) # include "config.h" #endif #include #include #include #include "dmemory.h" #include "cdi.h" #include "cdi_cksum.h" #include "cdi_int.h" #include "cdi_uuid.h" #include "resource_handle.h" #include "resource_unpack.h" #include "varscan.h" #include "namespace.h" #include "serialize.h" #include "zaxis.h" #define LevelUp 1 #define LevelDown 2 static const struct { unsigned char positive; // 1: up; 2: down const char *name; const char *longname; const char *stdname; const char *units; } ZaxistypeEntry[] = { { /* 0 */ 0, "sfc", "surface", "", ""}, { /* 1 */ 0, "lev", "generic", "", "level"}, { /* 2 */ 2, "lev", "hybrid", "", "level"}, { /* 3 */ 2, "lev", "hybrid_half", "", "level"}, { /* 4 */ 2, "lev", "pressure", "air_pressure", "Pa"}, { /* 5 */ 1, "height", "height", "height", "m"}, { /* 6 */ 2, "depth", "depth_below_sea", "depth", "m"}, { /* 7 */ 2, "depth", "depth_below_land", "", "cm"}, { /* 8 */ 0, "lev", "isentropic", "", "K"}, { /* 9 */ 0, "lev", "trajectory", "", ""}, { /* 10 */ 1, "alt", "altitude", "", "m"}, { /* 11 */ 0, "lev", "sigma", "", "level"}, { /* 12 */ 0, "lev", "meansea", "", "level"}, { /* 13 */ 0, "toa", "top_of_atmosphere", "", ""}, { /* 14 */ 0, "seabottom", "sea_bottom", "", ""}, { /* 15 */ 0, "atmosphere", "atmosphere", "", ""}, { /* 16 */ 0, "cloudbase", "cloud_base", "", ""}, { /* 17 */ 0, "cloudtop", "cloud_top", "", ""}, { /* 18 */ 0, "isotherm0", "isotherm_zero", "", ""}, { /* 19 */ 0, "snow", "snow", "", ""}, { /* 20 */ 0, "lakebottom", "lake_bottom", "", ""}, { /* 21 */ 0, "sedimentbottom", "sediment_bottom", "", ""}, { /* 22 */ 0, "sedimentbottomta", "sediment_bottom_ta", "", ""}, { /* 23 */ 0, "sedimentbottomtw", "sediment_bottom_tw", "", ""}, { /* 24 */ 0, "mixlayer", "mix_layer", "", ""}, { /* 25 */ 0, "height", "generalized_height", "height", ""}, }; enum { CDI_NumZaxistype = sizeof(ZaxistypeEntry) / sizeof(ZaxistypeEntry[0]), }; typedef struct { unsigned char positive; char dimname[CDI_MAX_NAME]; char vdimname[CDI_MAX_NAME]; char name[CDI_MAX_NAME]; char longname[CDI_MAX_NAME]; char stdname[CDI_MAX_NAME]; char units[CDI_MAX_NAME]; char psname[CDI_MAX_NAME]; double *vals; double *lbounds; double *ubounds; double *weights; int self; int prec; int scalar; int type; int ltype; /* GRIB level type */ int ltype2; int size; int direction; int vctsize; double *vct; int number; /* Reference number to a generalized Z-axis */ int nhlev; unsigned char uuid[CDI_UUID_SIZE]; } zaxis_t; static int zaxisCompareP (zaxis_t *z1, zaxis_t *z2); static void zaxisDestroyP ( void * zaxisptr ); static void zaxisPrintP ( void * zaxisptr, FILE * fp ); static int zaxisGetPackSize ( void * zaxisptr, void *context); static void zaxisPack ( void * zaxisptr, void * buffer, int size, int *pos, void *context); static int zaxisTxCode ( void ); static const resOps zaxisOps = { (int (*)(void *, void *))zaxisCompareP, zaxisDestroyP, zaxisPrintP, zaxisGetPackSize, zaxisPack, zaxisTxCode }; const resOps *getZaxisOps(void) { return &zaxisOps; } static int ZAXIS_Debug = 0; /* If set to 1, debugging */ void zaxisGetTypeDescription(int zaxisType, int* outPositive, const char** outName, const char** outLongName, const char** outStdName, const char** outUnit) { if(zaxisType < 0 || zaxisType >= CDI_NumZaxistype) { if(outPositive) *outPositive = 0; if(outName) *outName = NULL; if(outLongName) *outLongName = NULL; if(outStdName) *outStdName = NULL; if(outUnit) *outUnit = NULL; } else { if(outPositive) *outPositive = ZaxistypeEntry[zaxisType].positive; if(outName) *outName = ZaxistypeEntry[zaxisType].name; if(outLongName) *outLongName = ZaxistypeEntry[zaxisType].longname; if(outStdName) *outStdName = ZaxistypeEntry[zaxisType].stdname; if(outUnit) *outUnit = ZaxistypeEntry[zaxisType].units; } } static void zaxisDefaultValue(zaxis_t *zaxisptr) { zaxisptr->self = CDI_UNDEFID; zaxisptr->name[0] = 0; zaxisptr->longname[0] = 0; zaxisptr->stdname[0] = 0; zaxisptr->units[0] = 0; zaxisptr->psname[0] = 0; zaxisptr->vals = NULL; zaxisptr->ubounds = NULL; zaxisptr->lbounds = NULL; zaxisptr->weights = NULL; zaxisptr->type = CDI_UNDEFID; zaxisptr->ltype = 0; zaxisptr->ltype2 = -1; zaxisptr->positive = 0; zaxisptr->scalar = 0; zaxisptr->direction = 0; zaxisptr->prec = 0; zaxisptr->size = 0; zaxisptr->vctsize = 0; zaxisptr->vct = NULL; zaxisptr->number = 0; zaxisptr->nhlev = 0; memset(zaxisptr->uuid, 0, CDI_UUID_SIZE); } static zaxis_t *zaxisNewEntry(int id) { zaxis_t *zaxisptr = (zaxis_t *) Malloc(sizeof(zaxis_t)); zaxisDefaultValue ( zaxisptr ); if (id == CDI_UNDEFID) zaxisptr->self = reshPut(zaxisptr, &zaxisOps); else { zaxisptr->self = id; reshReplace(id, zaxisptr, &zaxisOps); } return (zaxisptr); } static inline zaxis_t * zaxisID2Ptr(int id) { return (zaxis_t *)reshGetVal(id, &zaxisOps); } static void zaxisInit(void) { static int zaxisInitialized = 0; char *env; if ( zaxisInitialized ) return; zaxisInitialized = 1; env = getenv("ZAXIS_DEBUG"); if ( env ) ZAXIS_Debug = atoi(env); } static void zaxis_copy(zaxis_t *zaxisptr2, zaxis_t *zaxisptr1) { int zaxisID2 = zaxisptr2->self; memcpy(zaxisptr2, zaxisptr1, sizeof(zaxis_t)); zaxisptr2->self = zaxisID2; } unsigned cdiZaxisCount(void) { return reshCountType(&zaxisOps); } static int zaxisCreate_(int zaxistype, int size, int id) { zaxis_t *zaxisptr = zaxisNewEntry(id); xassert(size >= 0); zaxisptr->type = zaxistype; zaxisptr->size = size; if ( zaxistype >= CDI_NumZaxistype || zaxistype < 0 ) Error("Internal problem! zaxistype > CDI_MaxZaxistype"); int zaxisID = zaxisptr->self; zaxisDefName(zaxisID, ZaxistypeEntry[zaxistype].name); zaxisDefLongname(zaxisID, ZaxistypeEntry[zaxistype].longname); zaxisDefUnits(zaxisID, ZaxistypeEntry[zaxistype].units); if ( *ZaxistypeEntry[zaxistype].stdname ) strcpy(zaxisptr->stdname, ZaxistypeEntry[zaxistype].stdname); zaxisptr->positive = ZaxistypeEntry[zaxistype].positive; double *vals = zaxisptr->vals = (double *) Malloc((size_t)size * sizeof(double)); for ( int ilev = 0; ilev < size; ilev++ ) vals[ilev] = 0.0; return zaxisID; } /* @Function zaxisCreate @Title Create a vertical Z-axis @Prototype int zaxisCreate(int zaxistype, int size) @Parameter @Item zaxistype The type of the Z-axis, one of the set of predefined CDI Z-axis types. The valid CDI Z-axis types are @func{ZAXIS_GENERIC}, @func{ZAXIS_SURFACE}, @func{ZAXIS_HYBRID}, @func{ZAXIS_SIGMA}, @func{ZAXIS_PRESSURE}, @func{ZAXIS_HEIGHT}, @func{ZAXIS_ISENTROPIC}, @func{ZAXIS_ALTITUDE}, @func{ZAXIS_MEANSEA}, @func{ZAXIS_TOA}, @func{ZAXIS_SEA_BOTTOM}, @func{ZAXIS_ATMOSPHERE}, @func{ZAXIS_CLOUD_BASE}, @func{ZAXIS_CLOUD_TOP}, @func{ZAXIS_ISOTHERM_ZERO}, @func{ZAXIS_SNOW}, @func{ZAXIS_LAKE_BOTTOM}, @func{ZAXIS_SEDIMENT_BOTTOM}, @func{ZAXIS_SEDIMENT_BOTTOM_TA}, @func{ZAXIS_SEDIMENT_BOTTOM_TW}, @func{ZAXIS_MIX_LAYER}, @func{ZAXIS_DEPTH_BELOW_SEA} and @func{ZAXIS_DEPTH_BELOW_LAND}. @Item size Number of levels. @Description The function @func{zaxisCreate} creates a vertical Z-axis. @Result @func{zaxisCreate} returns an identifier to the Z-axis. @Example Here is an example using @func{zaxisCreate} to create a pressure level Z-axis: @Source #include "cdi.h" ... #define nlev 5 ... double levs[nlev] = {101300, 92500, 85000, 50000, 20000}; int zaxisID; ... zaxisID = zaxisCreate(ZAXIS_PRESSURE, nlev); zaxisDefLevels(zaxisID, levs); ... @EndSource @EndFunction */ int zaxisCreate(int zaxistype, int size) { if ( CDI_Debug ) Message("zaxistype: %d size: %d ", zaxistype, size); zaxisInit (); return zaxisCreate_(zaxistype, size, CDI_UNDEFID); } static void zaxisDestroyKernel( zaxis_t * zaxisptr ) { xassert ( zaxisptr ); int id = zaxisptr->self; if ( zaxisptr->vals ) Free( zaxisptr->vals ); if ( zaxisptr->lbounds ) Free( zaxisptr->lbounds ); if ( zaxisptr->ubounds ) Free( zaxisptr->ubounds ); if ( zaxisptr->weights ) Free( zaxisptr->weights ); if ( zaxisptr->vct ) Free( zaxisptr->vct ); Free( zaxisptr ); reshRemove ( id, &zaxisOps ); } /* @Function zaxisDestroy @Title Destroy a vertical Z-axis @Prototype void zaxisDestroy(int zaxisID) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @EndFunction */ void zaxisDestroy(int zaxisID) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); zaxisDestroyKernel ( zaxisptr ); } static void zaxisDestroyP ( void * zaxisptr ) { zaxisDestroyKernel (( zaxis_t * ) zaxisptr ); } const char *zaxisNamePtr(int zaxistype) { const char *name = (zaxistype >= 0 && zaxistype < CDI_NumZaxistype) ? ZaxistypeEntry[zaxistype].longname : ZaxistypeEntry[ZAXIS_GENERIC].longname; return (name); } void zaxisName(int zaxistype, char *zaxisname) { strcpy(zaxisname, zaxisNamePtr(zaxistype)); } static inline void zaxisSetString(char *zaxisstrname, const char *name, size_t len) { if ( len > CDI_MAX_NAME ) len = CDI_MAX_NAME; strncpy(zaxisstrname, name, len); zaxisstrname[len - 1] = 0; } static inline void zaxisGetString(char *name, const char *zaxisstrname, size_t len) { if ( len > CDI_MAX_NAME ) len = CDI_MAX_NAME; strncpy(name, zaxisstrname, len); name[len - 1] = 0; } static char *zaxis_key_to_string(zaxis_t *zaxisptr, int key) { char *zaxisstring = NULL; switch (key) { case CDI_ZAXIS_DIMNAME: zaxisstring = zaxisptr->dimname; break; case CDI_ZAXIS_VDIMNAME: zaxisstring = zaxisptr->vdimname; break; } return zaxisstring; } /* @Function cdiZaxisDefString @Title Define a CDI Z-axis string value from a key @Prototype int cdiZaxisDefString(int zaxisID, int key, int size, const char *mesg) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item key The key to be searched @Item size The allocated length of the string on input @Item mesg The address of a string where the data will be read @Description The function @func{cdiZaxisDefString} defines a CDI Z-axis string value from a key. @Result @func{cdiZaxisDefString} returns 0 if OK and integer value on error. @EndFunction */ int cdiZaxisDefString(int zaxisID, int key, int size, const char *mesg) { if ( size == 0 || mesg == NULL || *mesg == 0 ) return -1; zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); char *zaxisstring = zaxis_key_to_string(zaxisptr, key); if ( zaxisstring == NULL) { Warning("CDI zaxis string key %d not supported!", key); return -1; } zaxisSetString(zaxisstring, mesg, size); reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); return 0; } /* @Function cdiZaxisInqString @Title Get a CDI Z-axis string value from a key @Prototype int cdiZaxisInqString(int zaxisID, int key, int size, char *mesg) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item key The key to be searched. @Item size The allocated length of the string on input. @Item mesg The address of a string where the data will be retrieved. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{cdiZaxisInqString} return a CDI Z-axis string value from a key. @Result @func{cdiZaxisInqString} returns 0 if OK and integer value on error. @EndFunction */ int cdiZaxisInqString(int zaxisID, int key, int size, char *mesg) { if ( size == 0 || mesg == NULL ) return -1; zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); const char *zaxisstring = zaxis_key_to_string(zaxisptr, key); if ( zaxisstring == NULL) { Warning("CDI zaxis string key %d not supported!", key); return -1; } zaxisGetString(mesg, zaxisstring, size); return 0; } /* @Function zaxisDefName @Title Define the name of a Z-axis @Prototype void zaxisDefName(int zaxisID, const char *name) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item name Name of the Z-axis. @Description The function @func{zaxisDefName} defines the name of a Z-axis. @EndFunction */ void zaxisDefName(int zaxisID, const char *name) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if ( name ) { strncpy(zaxisptr->name, name, CDI_MAX_NAME - 1); zaxisptr->name[CDI_MAX_NAME - 1] = '\0'; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } } /* @Function zaxisDefLongname @Title Define the longname of a Z-axis @Prototype void zaxisDefLongname(int zaxisID, const char *longname) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item longname Longname of the Z-axis. @Description The function @func{zaxisDefLongname} defines the longname of a Z-axis. @EndFunction */ void zaxisDefLongname(int zaxisID, const char *longname) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if ( longname ) { strncpy(zaxisptr->longname, longname, CDI_MAX_NAME - 1); zaxisptr->longname[CDI_MAX_NAME - 1] = '\0'; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } } /* @Function zaxisDefUnits @Title Define the units of a Z-axis @Prototype void zaxisDefUnits(int zaxisID, const char *units) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item units Units of the Z-axis. @Description The function @func{zaxisDefUnits} defines the units of a Z-axis. @EndFunction */ void zaxisDefUnits(int zaxisID, const char *units) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if ( units ) { strncpy(zaxisptr->units, units, CDI_MAX_NAME - 1); zaxisptr->units[CDI_MAX_NAME - 1] = '\0'; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } } void zaxisDefPsName(int zaxisID, const char *psname) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if ( psname ) { strncpy(zaxisptr->psname, psname, CDI_MAX_NAME - 1); zaxisptr->name[CDI_MAX_NAME - 1] = '\0'; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } } /* @Function zaxisInqName @Title Get the name of a Z-axis @Prototype void zaxisInqName(int zaxisID, char *name) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item name Name of the Z-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{zaxisInqName} returns the name of a Z-axis. @Result @func{zaxisInqName} returns the name of the Z-axis to the parameter name. @EndFunction */ void zaxisInqName(int zaxisID, char *name) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); strcpy(name, zaxisptr->name); } /* @Function zaxisInqLongname @Title Get the longname of a Z-axis @Prototype void zaxisInqLongname(int zaxisID, char *longname) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item longname Longname of the Z-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{zaxisInqLongname} returns the longname of a Z-axis. @Result @func{zaxisInqLongname} returns the longname of the Z-axis to the parameter longname. @EndFunction */ void zaxisInqLongname(int zaxisID, char *longname) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); strcpy(longname, zaxisptr->longname); } /* @Function zaxisInqUnits @Title Get the units of a Z-axis @Prototype void zaxisInqUnits(int zaxisID, char *units) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item units Units of the Z-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{zaxisInqUnits} returns the units of a Z-axis. @Result @func{zaxisInqUnits} returns the units of the Z-axis to the parameter units. @EndFunction */ void zaxisInqUnits(int zaxisID, char *units) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); strcpy(units, zaxisptr->units); } void zaxisInqStdname(int zaxisID, char *stdname) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); strcpy(stdname, zaxisptr->stdname); } void zaxisInqPsName(int zaxisID, char *psname) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); strcpy(psname, zaxisptr->psname); } void zaxisDefPrec(int zaxisID, int prec) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if (zaxisptr->prec != prec) { zaxisptr->prec = prec; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } } int zaxisInqPrec(int zaxisID) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); return (zaxisptr->prec); } void zaxisDefPositive(int zaxisID, int positive) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if (zaxisptr->positive != positive) { zaxisptr->positive = (unsigned char)positive; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } } int zaxisInqPositive(int zaxisID) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); return zaxisptr->positive; } void zaxisDefScalar(int zaxisID) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); zaxisptr->scalar = 1; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } int zaxisInqScalar(int zaxisID) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); return zaxisptr->scalar; } void zaxisDefLtype(int zaxisID, int ltype) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if (zaxisptr->ltype != ltype) { zaxisptr->ltype = ltype; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } } int zaxisInqLtype(int zaxisID) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); return zaxisptr->ltype; } void zaxisDefLtype2(int zaxisID, int ltype2) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if (zaxisptr->ltype2 != ltype2) { zaxisptr->ltype2 = ltype2; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } } int zaxisInqLtype2(int zaxisID) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); return zaxisptr->ltype2; } /* @Function zaxisDefLevels @Title Define the levels of a Z-axis @Prototype void zaxisDefLevels(int zaxisID, const double *levels) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item levels All levels of the Z-axis. @Description The function @func{zaxisDefLevels} defines the levels of a Z-axis. @EndFunction */ void zaxisDefLevels(int zaxisID, const double *levels) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); int size = zaxisptr->size; double *vals = zaxisptr->vals; for (int ilev = 0; ilev < size; ilev++ ) vals[ilev] = levels[ilev]; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } /* @Function zaxisDefLevel @Title Define one level of a Z-axis @Prototype void zaxisDefLevel(int zaxisID, int levelID, double level) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item levelID Level identifier. @Item level Level. @Description The function @func{zaxisDefLevel} defines one level of a Z-axis. @EndFunction */ void zaxisDefLevel(int zaxisID, int levelID, double level) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if ( levelID >= 0 && levelID < zaxisptr->size ) zaxisptr->vals[levelID] = level; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } void zaxisDefNlevRef(int zaxisID, const int nhlev) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if (zaxisptr->nhlev != nhlev) { zaxisptr->nhlev = nhlev; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } } int zaxisInqNlevRef(int zaxisID) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); return zaxisptr->nhlev; } /* @Function zaxisDefNumber @Title Define the reference number for a generalized Z-axis @Prototype void zaxisDefNumber(int zaxisID, const int number) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item number Reference number for a generalized Z-axis. @Description The function @func{zaxisDefNumber} defines the reference number for a generalized Z-axis. @EndFunction */ void zaxisDefNumber(int zaxisID, const int number) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if (zaxisptr->number != number) { zaxisptr->number = number; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } } /* @Function zaxisInqNumber @Title Get the reference number to a generalized Z-axis @Prototype int zaxisInqNumber(int zaxisID) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Description The function @func{zaxisInqNumber} returns the reference number to a generalized Z-axis. @Result @func{zaxisInqNumber} returns the reference number to a generalized Z-axis. @EndFunction */ int zaxisInqNumber(int zaxisID) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); return zaxisptr->number; } /* @Function zaxisDefUUID @Title Define the UUID for a genralized Z-axis @Prototype void zaxisDefUUID(int zaxisID, const char *uuid) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item uuid UUID for a generalized Z-axis. @Description The function @func{zaxisDefUUID} defines the UUID for a generalized Z-axis. @EndFunction */ void zaxisDefUUID(int zaxisID, const unsigned char uuid[CDI_UUID_SIZE]) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); memcpy(zaxisptr->uuid, uuid, CDI_UUID_SIZE); reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } /* @Function zaxisInqUUID @Title Get the uuid to a generalized Z-axis @Prototype void zaxisInqUUID(int zaxisID, char *uuid) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item uuid A user supplied buffer of at least 16 bytes. @Description The function @func{zaxisInqUUID} returns the UUID to a generalized Z-axis. @Result @func{zaxisInqUUID} returns the UUID to a generalized Z-axis to the parameter uuid. @EndFunction */ void zaxisInqUUID(int zaxisID, unsigned char uuid[CDI_UUID_SIZE]) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); memcpy(uuid, zaxisptr->uuid, CDI_UUID_SIZE); } /* @Function zaxisInqLevel @Title Get one level of a Z-axis @Prototype double zaxisInqLevel(int zaxisID, int levelID) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item levelID Level index (range: 0 to nlevel-1). @Description The function @func{zaxisInqLevel} returns one level of a Z-axis. @Result @func{zaxisInqLevel} returns the level of a Z-axis. @EndFunction */ double zaxisInqLevel(int zaxisID, int levelID) { double level = 0; zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if ( levelID >= 0 && levelID < zaxisptr->size ) level = zaxisptr->vals[levelID]; return level; } double zaxisInqLbound(int zaxisID, int index) { double level = 0; zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if ( zaxisptr->lbounds && ( index >= 0 && index < zaxisptr->size ) ) level = zaxisptr->lbounds[index]; return level; } double zaxisInqUbound(int zaxisID, int index) { double level = 0; zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if ( zaxisptr->ubounds && ( index >= 0 && index < zaxisptr->size ) ) level = zaxisptr->ubounds[index]; return level; } const double *zaxisInqLevelsPtr(int zaxisID) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); return zaxisptr->vals; } /* @Function zaxisInqLevels @Title Get all levels of a Z-axis @Prototype void zaxisInqLevels(int zaxisID, double *levels) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item levels Pointer to the location into which the levels are read. The caller must allocate space for the returned values. @Description The function @func{zaxisInqLevels} returns all levels of a Z-axis. @Result @func{zaxisInqLevels} saves all levels to the parameter @func{levels}. @EndFunction */ void zaxisInqLevels(int zaxisID, double *levels) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); int size = zaxisptr->size; for (int i = 0; i < size; i++ ) levels[i] = zaxisptr->vals[i]; } int zaxisInqLbounds(int zaxisID, double *lbounds) { int size = 0; zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if ( zaxisptr->lbounds ) { size = zaxisptr->size; if ( lbounds ) for (int i = 0; i < size; i++ ) lbounds[i] = zaxisptr->lbounds[i]; } return (size); } int zaxisInqUbounds(int zaxisID, double *ubounds) { int size = 0; zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if ( zaxisptr->ubounds ) { size = zaxisptr->size; if ( ubounds ) for (int i = 0; i < size; i++ ) ubounds[i] = zaxisptr->ubounds[i]; } return (size); } int zaxisInqWeights(int zaxisID, double *weights) { int size = 0; zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if ( zaxisptr->weights ) { size = zaxisptr->size; if ( weights ) for ( int i = 0; i < size; i++ ) weights[i] = zaxisptr->weights[i]; } return (size); } int zaxisInqLevelID(int zaxisID, double level) { int levelID = CDI_UNDEFID; zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); int size = zaxisptr->size; for ( int i = 0; i < size; i++ ) if ( fabs(level-zaxisptr->vals[i]) < DBL_EPSILON ) { levelID = i; break; } return levelID; } /* @Function zaxisInqType @Title Get the type of a Z-axis @Prototype int zaxisInqType(int zaxisID) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Description The function @func{zaxisInqType} returns the type of a Z-axis. @Result @func{zaxisInqType} returns the type of the Z-axis, one of the set of predefined CDI Z-axis types. The valid CDI Z-axis types are @func{ZAXIS_GENERIC}, @func{ZAXIS_SURFACE}, @func{ZAXIS_HYBRID}, @func{ZAXIS_SIGMA}, @func{ZAXIS_PRESSURE}, @func{ZAXIS_HEIGHT}, @func{ZAXIS_ISENTROPIC}, @func{ZAXIS_ALTITUDE}, @func{ZAXIS_MEANSEA}, @func{ZAXIS_TOA}, @func{ZAXIS_SEA_BOTTOM}, @func{ZAXIS_ATMOSPHERE}, @func{ZAXIS_CLOUD_BASE}, @func{ZAXIS_CLOUD_TOP}, @func{ZAXIS_ISOTHERM_ZERO}, @func{ZAXIS_SNOW}, @func{ZAXIS_LAKE_BOTTOM}, @func{ZAXIS_SEDIMENT_BOTTOM}, @func{ZAXIS_SEDIMENT_BOTTOM_TA}, @func{ZAXIS_SEDIMENT_BOTTOM_TW}, @func{ZAXIS_MIX_LAYER}, @func{ZAXIS_DEPTH_BELOW_SEA} and @func{ZAXIS_DEPTH_BELOW_LAND}. @EndFunction */ int zaxisInqType(int zaxisID) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); return (zaxisptr->type); } /* @Function zaxisInqSize @Title Get the size of a Z-axis @Prototype int zaxisInqSize(int zaxisID) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Description The function @func{zaxisInqSize} returns the size of a Z-axis. @Result @func{zaxisInqSize} returns the number of levels of a Z-axis. @EndFunction */ int zaxisInqSize(int zaxisID) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); return (zaxisptr->size); } void cdiCheckZaxis(int zaxisID) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if ( zaxisInqType(zaxisID) == ZAXIS_GENERIC ) { int size = zaxisptr->size; if ( size > 1 ) { /* check direction */ if ( ! zaxisptr->direction ) { int ups = 0, downs = 0; for ( int i = 1; i < size; i++ ) { ups += (zaxisptr->vals[i] > zaxisptr->vals[i-1]); downs += (zaxisptr->vals[i] < zaxisptr->vals[i-1]); } if ( ups == size-1 ) { zaxisptr->direction = LevelUp; } else if ( downs == size-1 ) { zaxisptr->direction = LevelDown; } else /* !zaxisptr->direction */ { Warning("Direction undefined for zaxisID %d", zaxisID); } } } } } void zaxisDefVct(int zaxisID, int size, const double *vct) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); if ( zaxisptr->vct == 0 || zaxisptr->vctsize != size ) { zaxisptr->vctsize = size; zaxisptr->vct = (double *) Realloc(zaxisptr->vct, (size_t)size*sizeof(double)); } memcpy(zaxisptr->vct, vct, (size_t)size*sizeof(double)); reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } void zaxisInqVct(int zaxisID, double *vct) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); memcpy(vct, zaxisptr->vct, (size_t)zaxisptr->vctsize * sizeof (double)); } int zaxisInqVctSize(int zaxisID) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); return (zaxisptr->vctsize); } const double *zaxisInqVctPtr(int zaxisID) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); return (zaxisptr->vct); } void zaxisDefLbounds(int zaxisID, const double *lbounds) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); size_t size = (size_t)zaxisptr->size; if ( CDI_Debug ) if ( zaxisptr->lbounds != NULL ) Warning("Lower bounds already defined for zaxisID = %d", zaxisID); if ( zaxisptr->lbounds == NULL ) zaxisptr->lbounds = (double *) Malloc(size*sizeof(double)); memcpy(zaxisptr->lbounds, lbounds, size*sizeof(double)); reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } void zaxisDefUbounds(int zaxisID, const double *ubounds) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); size_t size = (size_t)zaxisptr->size; if ( CDI_Debug ) if ( zaxisptr->ubounds != NULL ) Warning("Upper bounds already defined for zaxisID = %d", zaxisID); if ( zaxisptr->ubounds == NULL ) zaxisptr->ubounds = (double *) Malloc(size*sizeof(double)); memcpy(zaxisptr->ubounds, ubounds, size*sizeof(double)); reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } void zaxisDefWeights(int zaxisID, const double *weights) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); size_t size = (size_t)zaxisptr->size; if ( CDI_Debug ) if ( zaxisptr->weights != NULL ) Warning("Weights already defined for zaxisID = %d", zaxisID); if ( zaxisptr->weights == NULL ) zaxisptr->weights = (double *) Malloc(size*sizeof(double)); memcpy(zaxisptr->weights, weights, size*sizeof(double)); reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } void zaxisChangeType(int zaxisID, int zaxistype) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); zaxisptr->type = zaxistype; } void zaxisResize(int zaxisID, int size) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); xassert(size >= 0); zaxisptr->size = size; if ( zaxisptr->vals ) zaxisptr->vals = (double *) Realloc(zaxisptr->vals, (size_t)size * sizeof(double)); } int zaxisDuplicate(int zaxisID) { int zaxisIDnew; zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); int zaxistype = zaxisInqType(zaxisID); int zaxissize = zaxisInqSize(zaxisID); zaxisIDnew = zaxisCreate(zaxistype, zaxissize); zaxis_t *zaxisptrnew = zaxisID2Ptr(zaxisIDnew); zaxis_copy(zaxisptrnew, zaxisptr); strcpy(zaxisptrnew->name, zaxisptr->name); strcpy(zaxisptrnew->longname, zaxisptr->longname); strcpy(zaxisptrnew->units, zaxisptr->units); if ( zaxisptr->vals != NULL ) { size_t size = (size_t)zaxissize; zaxisptrnew->vals = (double *) Malloc(size * sizeof (double)); memcpy(zaxisptrnew->vals, zaxisptr->vals, size * sizeof (double)); } if ( zaxisptr->lbounds ) { size_t size = (size_t)zaxissize; zaxisptrnew->lbounds = (double *) Malloc(size * sizeof (double)); memcpy(zaxisptrnew->lbounds, zaxisptr->lbounds, size * sizeof(double)); } if ( zaxisptr->ubounds ) { size_t size = (size_t)zaxissize; zaxisptrnew->ubounds = (double *) Malloc(size * sizeof (double)); memcpy(zaxisptrnew->ubounds, zaxisptr->ubounds, size * sizeof (double)); } if ( zaxisptr->vct != NULL ) { size_t size = (size_t)zaxisptr->vctsize; if ( size ) { zaxisptrnew->vctsize = (int)size; zaxisptrnew->vct = (double *) Malloc(size * sizeof (double)); memcpy(zaxisptrnew->vct, zaxisptr->vct, size * sizeof (double)); } } return (zaxisIDnew); } static void zaxisPrintKernel ( zaxis_t * zaxisptr, int index, FILE * fp ) { unsigned char uuid[CDI_UUID_SIZE]; int levelID; int nbyte; xassert ( zaxisptr ); int zaxisID = zaxisptr->self; int type = zaxisptr->type; int nlevels = zaxisptr->size; int nbyte0 = 0; fprintf(fp, "#\n"); fprintf(fp, "# zaxisID %d\n", index); fprintf(fp, "#\n"); fprintf(fp, "zaxistype = %s\n", zaxisNamePtr(type)); fprintf(fp, "size = %d\n", nlevels); if ( zaxisptr->name[0] ) fprintf(fp, "name = %s\n", zaxisptr->name); if ( zaxisptr->longname[0] ) fprintf(fp, "longname = %s\n", zaxisptr->longname); if ( zaxisptr->units[0] ) fprintf(fp, "units = %s\n", zaxisptr->units); nbyte0 = fprintf(fp, "levels = "); nbyte = nbyte0; for ( levelID = 0; levelID < nlevels; levelID++ ) { if ( nbyte > 80 ) { fprintf(fp, "\n"); fprintf(fp, "%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += fprintf(fp, "%.9g ", zaxisptr->vals[levelID]); } fprintf(fp, "\n"); if ( zaxisptr->lbounds && zaxisptr->ubounds ) { nbyte0 = fprintf(fp, "lbounds = "); nbyte = nbyte0; for ( levelID = 0; levelID < nlevels; levelID++ ) { if ( nbyte > 80 ) { fprintf(fp, "\n"); fprintf(fp, "%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += fprintf(fp, "%.9g ", zaxisptr->lbounds[levelID]); } fprintf(fp, "\n"); nbyte0 = fprintf(fp, "ubounds = "); nbyte = nbyte0; for ( levelID = 0; levelID < nlevels; levelID++ ) { if ( nbyte > 80 ) { fprintf(fp, "\n"); fprintf(fp, "%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += fprintf(fp, "%.9g ", zaxisptr->ubounds[levelID]); } fprintf(fp, "\n"); } if ( type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF ) { int vctsize = zaxisptr->vctsize; const double *vct = zaxisptr->vct; fprintf(fp, "vctsize = %d\n", vctsize); if ( vctsize ) { nbyte0 = fprintf(fp, "vct = "); nbyte = nbyte0; for ( int i = 0; i < vctsize; i++ ) { if ( nbyte > 70 || i == vctsize/2 ) { fprintf(fp, "\n%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += fprintf(fp, "%.9g ", vct[i]); } fprintf(fp, "\n"); /* nbyte0 = fprintf(fp, "vct_b = "); nbyte = nbyte0; for ( i = 0; i < vctsize/2; i++ ) { if ( nbyte > 70 ) { fprintf(fp, "\n%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += fprintf(fp, "%.9g ", vct[vctsize/2+i]); } fprintf(fp, "\n"); */ } } if ( type == ZAXIS_REFERENCE ) { zaxisInqUUID(zaxisID, uuid); if ( *uuid ) { const unsigned char *d = uuid; fprintf(fp, "uuid = %02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n", d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], d[11], d[12], d[13], d[14], d[15]); } } } void zaxisPrint ( int zaxisID, int index ) { zaxis_t *zaxisptr = zaxisID2Ptr(zaxisID); zaxisPrintKernel ( zaxisptr, index, stdout ); } static void zaxisPrintP ( void * voidptr, FILE * fp ) { zaxis_t *zaxisptr = ( zaxis_t * ) voidptr; xassert ( zaxisptr ); zaxisPrintKernel(zaxisptr, zaxisptr->self, fp); } static int zaxisCompareP(zaxis_t *z1, zaxis_t *z2) { enum { differ = 1, }; int diff = 0; xassert(z1 && z2); diff |= (z1->type != z2->type) | (z1->ltype != z2->ltype) | (z1->direction != z2->direction) | (z1->prec != z2->prec) | (z1->size != z2->size) | (z1->vctsize != z2->vctsize) | (z1->positive != z2->positive); if (diff) return differ; int size = z1->size; int anyPresent = 0; int present = (z1->vals != NULL); diff |= (present ^ (z2->vals != NULL)); anyPresent |= present; if (!diff && present) { const double *p = z1->vals, *q = z2->vals; for (int i = 0; i < size; i++) diff |= IS_NOT_EQUAL(p[i], q[i]); } present = (z1->lbounds != NULL); diff |= (present ^ (z2->lbounds != NULL)); anyPresent |= present; if (!diff && present) { const double *p = z1->lbounds, *q = z2->lbounds; for (int i = 0; i < size; i++) diff |= IS_NOT_EQUAL(p[i], q[i]); } present = (z1->ubounds != NULL); diff |= (present ^ (z2->ubounds != NULL)); anyPresent |= present; if (!diff && present) { const double *p = z1->ubounds, *q = z2->ubounds; for (int i = 0; i < size; ++i) diff |= IS_NOT_EQUAL(p[i], q[i]); } present = (z1->weights != NULL); diff |= (present ^ (z2->weights != NULL)); anyPresent |= present; if (!diff && present) { const double *p = z1->weights, *q = z2->weights; for (int i = 0; i < size; ++i) diff |= IS_NOT_EQUAL(p[i], q[i]); } present = (z1->vct != NULL); diff |= (present ^ (z2->vct != NULL)); if (!diff && present) { int vctsize = z1->vctsize; xassert(vctsize); const double *p = z1->vct, *q = z2->vct; for (int i = 0; i < vctsize; ++i) diff |= IS_NOT_EQUAL(p[i], q[i]); } if (anyPresent) xassert(size); diff |= strcmp(z1->name, z2->name) | strcmp(z1->longname, z2->longname) | strcmp(z1->stdname, z2->stdname) | strcmp(z1->units, z2->units) | memcmp(z1->uuid, z2->uuid, CDI_UUID_SIZE); return diff != 0; } static int zaxisTxCode ( void ) { return ZAXIS; } enum { zaxisNint = 8, vals = 1 << 0, lbounds = 1 << 1, ubounds = 1 << 2, weights = 1 << 3, vct = 1 << 4, zaxisHasUUIDFlag = 1 << 5, }; #define ZAXIS_STR_SERIALIZE { zaxisP->name, zaxisP->longname, \ zaxisP->stdname, zaxisP->units } static int zaxisGetMemberMask ( zaxis_t * zaxisP ) { int memberMask = 0; if ( zaxisP->vals ) memberMask |= vals; if ( zaxisP->lbounds ) memberMask |= lbounds; if ( zaxisP->ubounds ) memberMask |= ubounds; if ( zaxisP->weights ) memberMask |= weights; if ( zaxisP->vct ) memberMask |= vct; if (!cdiUUIDIsNull(zaxisP->uuid)) memberMask |= zaxisHasUUIDFlag; return memberMask; } static int zaxisGetPackSize(void * voidP, void *context) { zaxis_t * zaxisP = ( zaxis_t * ) voidP; int packBufferSize = serializeGetSize(zaxisNint, DATATYPE_INT, context) + serializeGetSize(1, DATATYPE_UINT32, context); if (zaxisP->vals || zaxisP->lbounds || zaxisP->ubounds || zaxisP->weights) xassert(zaxisP->size); if ( zaxisP->vals ) packBufferSize += serializeGetSize(zaxisP->size, DATATYPE_FLT64, context) + serializeGetSize(1, DATATYPE_UINT32, context); if ( zaxisP->lbounds ) packBufferSize += serializeGetSize(zaxisP->size, DATATYPE_FLT64, context) + serializeGetSize(1, DATATYPE_UINT32, context); if ( zaxisP->ubounds ) packBufferSize += serializeGetSize(zaxisP->size, DATATYPE_FLT64, context) + serializeGetSize(1, DATATYPE_UINT32, context); if ( zaxisP->weights ) packBufferSize += serializeGetSize(zaxisP->size, DATATYPE_FLT64, context) + serializeGetSize(1, DATATYPE_UINT32, context); if ( zaxisP->vct ) { xassert ( zaxisP->vctsize ); packBufferSize += serializeGetSize(zaxisP->vctsize, DATATYPE_FLT64, context) + serializeGetSize(1, DATATYPE_UINT32, context); } { const char *strTab[] = ZAXIS_STR_SERIALIZE; size_t numStr = sizeof (strTab) / sizeof (strTab[0]); packBufferSize += serializeStrTabGetPackSize(strTab, (int)numStr, context); } packBufferSize += serializeGetSize(1, DATATYPE_UCHAR, context); if (!cdiUUIDIsNull(zaxisP->uuid)) packBufferSize += serializeGetSize(CDI_UUID_SIZE, DATATYPE_UCHAR, context); return packBufferSize; } void zaxisUnpack(char * unpackBuffer, int unpackBufferSize, int * unpackBufferPos, int originNamespace, void *context, int force_id) { int intBuffer[zaxisNint], memberMask; uint32_t d; serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, intBuffer, zaxisNint, DATATYPE_INT, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, DATATYPE_UINT32, context); xassert(cdiCheckSum(DATATYPE_INT, zaxisNint, intBuffer) == d); zaxisInit(); zaxis_t *zaxisP = zaxisNewEntry(force_id ? namespaceAdaptKey(intBuffer[0], originNamespace) : CDI_UNDEFID); zaxisP->prec = intBuffer[1]; zaxisP->type = intBuffer[2]; zaxisP->ltype = intBuffer[3]; zaxisP->size = intBuffer[4]; zaxisP->direction = intBuffer[5]; zaxisP->vctsize = intBuffer[6]; memberMask = intBuffer[7]; if (memberMask & vals) { int size = zaxisP->size; xassert(size >= 0); zaxisP->vals = (double *) Malloc((size_t)size * sizeof (double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->vals, size, DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, DATATYPE_UINT32, context); xassert(cdiCheckSum(DATATYPE_FLT, size, zaxisP->vals) == d); } if (memberMask & lbounds) { int size = zaxisP->size; xassert(size >= 0); zaxisP->lbounds = (double *) Malloc((size_t)size * sizeof (double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->lbounds, size, DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, DATATYPE_UINT32, context); xassert(cdiCheckSum(DATATYPE_FLT, size, zaxisP->lbounds) == d); } if (memberMask & ubounds) { int size = zaxisP->size; xassert(size >= 0); zaxisP->ubounds = (double *) Malloc((size_t)size * sizeof (double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->ubounds, size, DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, DATATYPE_UINT32, context); xassert(cdiCheckSum(DATATYPE_FLT, size, zaxisP->ubounds) == d); } if (memberMask & weights) { int size = zaxisP->size; xassert(size >= 0); zaxisP->weights = (double *) Malloc((size_t)size * sizeof (double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->weights, size, DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, DATATYPE_UINT32, context); xassert(cdiCheckSum(DATATYPE_FLT, size, zaxisP->weights) == d); } if ( memberMask & vct ) { int size = zaxisP->vctsize; xassert(size >= 0); zaxisP->vct = (double *) Malloc((size_t)size * sizeof (double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->vct, size, DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, DATATYPE_UINT32, context); xassert(cdiCheckSum(DATATYPE_FLT64, size, zaxisP->vct) == d); } { char *strTab[] = ZAXIS_STR_SERIALIZE; int numStr = sizeof (strTab) / sizeof (strTab[0]); serializeStrTabUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, strTab, numStr, context); } serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &zaxisP->positive, 1, DATATYPE_UCHAR, context); if (memberMask & zaxisHasUUIDFlag) serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->uuid, CDI_UUID_SIZE, DATATYPE_UCHAR, context); reshSetStatus(zaxisP->self, &zaxisOps, reshGetStatus(zaxisP->self, &zaxisOps) & ~RESH_SYNC_BIT); } static void zaxisPack(void * voidP, void * packBuffer, int packBufferSize, int * packBufferPos, void *context) { zaxis_t * zaxisP = ( zaxis_t * ) voidP; int intBuffer[zaxisNint]; int memberMask; uint32_t d; intBuffer[0] = zaxisP->self; intBuffer[1] = zaxisP->prec; intBuffer[2] = zaxisP->type; intBuffer[3] = zaxisP->ltype; intBuffer[4] = zaxisP->size; intBuffer[5] = zaxisP->direction; intBuffer[6] = zaxisP->vctsize; intBuffer[7] = memberMask = zaxisGetMemberMask ( zaxisP ); serializePack(intBuffer, zaxisNint, DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(DATATYPE_INT, zaxisNint, intBuffer); serializePack(&d, 1, DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); if ( memberMask & vals ) { xassert(zaxisP->size); serializePack(zaxisP->vals, zaxisP->size, DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(DATATYPE_FLT, zaxisP->size, zaxisP->vals ); serializePack(&d, 1, DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & lbounds) { xassert(zaxisP->size); serializePack(zaxisP->lbounds, zaxisP->size, DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(DATATYPE_FLT, zaxisP->size, zaxisP->lbounds); serializePack(&d, 1, DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & ubounds) { xassert(zaxisP->size); serializePack(zaxisP->ubounds, zaxisP->size, DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(DATATYPE_FLT, zaxisP->size, zaxisP->ubounds); serializePack(&d, 1, DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & weights) { xassert(zaxisP->size); serializePack(zaxisP->weights, zaxisP->size, DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(DATATYPE_FLT, zaxisP->size, zaxisP->weights); serializePack(&d, 1, DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & vct) { xassert(zaxisP->vctsize); serializePack(zaxisP->vct, zaxisP->vctsize, DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(DATATYPE_FLT64, zaxisP->vctsize, zaxisP->vct); serializePack(&d, 1, DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } { const char *strTab[] = ZAXIS_STR_SERIALIZE; int numStr = sizeof (strTab) / sizeof (strTab[0]); serializeStrTabPack(strTab, numStr, packBuffer, packBufferSize, packBufferPos, context); } serializePack(&zaxisP->positive, 1, DATATYPE_UCHAR, packBuffer, packBufferSize, packBufferPos, context); if (memberMask & zaxisHasUUIDFlag) serializePack(zaxisP->uuid, CDI_UUID_SIZE, DATATYPE_UCHAR, packBuffer, packBufferSize, packBufferPos, context); } void cdiZaxisGetIndexList(unsigned nzaxis, int *zaxisResHs) { reshGetResHListOfType(nzaxis, zaxisResHs, &zaxisOps); } #undef ZAXIS_STR_SERIALIZE /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */