Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • b383306/libcdi
  • mpim-sw/libcdi
  • m214007/libcdi
3 results
Show changes
Commits on Source (12)
......@@ -2,6 +2,14 @@
* Version 2.5.1 released
2025-02-28 Uwe Schulzweida
* taxis: added support for CDI_KEY_DATATYPE
2025-02-12 Uwe Schulzweida
* GRIB_API: Handle LLAM as LCC
2025-02-06 Uwe Schulzweida
* Added obsolete functions vlistNgrids() and vlistNzaxis() for ParaView vtkCDIReader
......
......@@ -300,8 +300,8 @@ printGridInfoKernel(int gridID, int index, bool lproj)
size_t xsize = (size_t) gridInqXsize(gridID);
size_t ysize = (size_t) gridInqYsize(gridID);
// int prec = gridInqDatatype(gridID);
// int dig = (prec == CDI_DATATYPE_FLT64) ? 15 : 7;
// int datatype;
// cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype);
int dig = 7;
if (!lproj)
......@@ -537,8 +537,9 @@ printZaxisInfo(int vlistID)
int ltype = 0;
cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, &ltype);
int levelsize = zaxisInqSize(zaxisID);
// int prec = zaxisInqDatatype(zaxisID);
// int dig = (prec == CDI_DATATYPE_FLT64) ? 15 : 7;
// int datatype;
// cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype);
// int dig = (datatype == CDI_DATATYPE_FLT64) ? 15 : 7;
zaxisName(zaxistype, zaxisname);
int length = CDI_MAX_NAME;
......
......@@ -60,7 +60,7 @@ defineGrid()
cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, "myXunits");
cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, "myYunits");
gridDefDatatype(gridID, DOUBLE_PRECISION);
cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, DOUBLE_PRECISION);
gridDefTrunc(gridID, 1);
cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, 6);
......
......@@ -190,6 +190,9 @@ list( APPEND cdi_unknown
resource_unpack.h
)
# Support exporting all symbolds on Windows
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
add_library(cdilib
${cdi_src_files} ${cdi_unknown}
# INSTALL_HEADERS_LIST cdi.h
......
......@@ -12,6 +12,7 @@
#include "cdi.h"
#include "cdi_int.h"
#include "taxis.h"
#include "zaxis.h"
#include "grid.h"
#include "vlist.h"
......@@ -43,6 +44,12 @@ zaxis_get_keysp(zaxis_t *zaxisptr, int varID)
return (varID == CDI_GLOBAL) ? &zaxisptr->keys : NULL;
}
static cdi_keys_t *
taxis_get_keysp(taxis_t *taxisptr, int varID)
{
return (varID == CDI_GLOBAL) ? &taxisptr->keys : NULL;
}
static cdi_key_t *
new_key(cdi_keys_t *keysp, int key)
{
......@@ -100,6 +107,7 @@ cdi_get_keysp(int objID, int varID)
if (reshID == GRID) return grid_get_keysp(grid_to_pointer(objID), varID);
if (reshID == DIST_GRID) return grid_get_keysp(grid_to_pointer(objID), varID);
if (reshID == ZAXIS) return zaxis_get_keysp(zaxis_to_pointer(objID), varID);
if (reshID == TAXIS) return taxis_get_keysp(taxis_to_pointer(objID), varID);
if (reshID == VLIST) return vlist_get_keysp(vlist_to_pointer(objID), varID);
return NULL;
......
......@@ -24,7 +24,9 @@ int cdiUUIDIsNull(const unsigned char uuid[])
return isNull;
}
#ifndef _WIN32
void cdiCreateUUID(unsigned char uuid[CDI_UUID_SIZE]);
#endif
int cdiUUID2Str(const unsigned char uuid[], char uuidstr[]);
int cdiStr2UUID(const char *uuidstr, unsigned char uuid[]);
......
......@@ -10,19 +10,25 @@
#include "config.h"
#endif
#include <unistd.h>
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/types.h>
// On Windows, define ssize_t manually
#ifdef _WIN32
#define ssize_t __int64
#include <io.h>
#else
#include <unistd.h>
#endif
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h> // gettimeofday()
......@@ -392,7 +398,7 @@ fileFlush(int fileID)
{
FILE *fp = fileptr->fp;
retval = fflush(fp);
if (retval == 0) retval = fsync(fileno(fp));
if (retval == 0) retval = fflush(fp);
if (retval != 0) retval = errno;
}
......
......@@ -14,6 +14,9 @@
#include <stdlib.h>
#include <stdbool.h>
#include <float.h>
// Required on windows to be able to use M_PI
#define _USE_MATH_DEFINES
#include <math.h>
#ifndef M_SQRT2
......
......@@ -49,6 +49,7 @@
#define GRIB2_GTYPE_LATLON_ROTSTR 3 // Stretched and Rotated Latitude/longitude
#define GRIB2_GTYPE_STERE 20 // Polar stereographic projection
#define GRIB2_GTYPE_LCC 30 // Lambert conformal
#define GRIB2_GTYPE_LLAM 33 // Lambert LAM
#define GRIB2_GTYPE_GAUSSIAN 40 // Gaussian latitude/longitude
#define GRIB2_GTYPE_GAUSSIAN_ROT 41 // Rotated Gaussian latitude/longitude
#define GRIB2_GTYPE_GAUSSIAN_STR 42 // Stretched Gaussian latitude/longitude
......
......@@ -591,6 +591,7 @@ gribapiGetGridType(grib_handle *gh)
case GRIB2_GTYPE_GAUSSIAN: return has_ni(gh) ? GRID_GAUSSIAN : GRID_GAUSSIAN_REDUCED;
case GRIB2_GTYPE_LATLON_ROT: return GRID_PROJECTION;
case GRIB2_GTYPE_LCC: return CDI_PROJ_LCC;
case GRIB2_GTYPE_LLAM: return CDI_PROJ_LCC; // Handle LLAM as LCC
case GRIB2_GTYPE_STERE: return CDI_PROJ_STERE;
case GRIB2_GTYPE_SPECTRAL: return GRID_SPECTRAL;
case GRIB2_GTYPE_GME: return GRID_GME;
......
......@@ -18,9 +18,20 @@
#include <errno.h>
#include <fcntl.h>
#include <pthread.h>
#include <string.h>
// On Windows, define ssize_t and pread manually
#ifdef _WIN32
#define ssize_t __int64
#define pread read
#include <io.h>
#else
#include <unistd.h>
#endif
#if HAVE_PTHREAD
#include <pthread.h>
#endif
static void cdiInputFile_destruct(CdiInputFile *me);
......@@ -64,7 +75,9 @@ success:
static CdiInputFile **openFileList = NULL;
static size_t openFileCount = 0, openFileListSize = 0;
#if HAVE_PTHREAD
static pthread_mutex_t openFileListLock = PTHREAD_MUTEX_INITIALIZER;
#endif
// This either returns a new object, or retains and returns a preexisting open file.
CdiInputFile *
......@@ -72,8 +85,10 @@ cdiInputFile_make(const char *path)
{
CdiInputFile *result = NULL;
xassert(path);
#if HAVE_PTHREAD
int error = pthread_mutex_lock(&openFileListLock);
xassert(!error);
#endif
{
// Check the list of open files for the given path.
for (size_t i = openFileCount; i-- && !result;)
......@@ -108,8 +123,10 @@ cdiInputFile_make(const char *path)
}
}
}
#if HAVE_PTHREAD
error = pthread_mutex_unlock(&openFileListLock);
xassert(!error);
#endif
return result;
}
......@@ -142,8 +159,10 @@ cdiInputFile_getPath(const CdiInputFile *me)
void
cdiInputFile_destruct(CdiInputFile *me)
{
#if HAVE_PTHREAD
int error = pthread_mutex_lock(&openFileListLock);
xassert(!error);
#endif
{
// Find the position of me in the list of open files.
ssize_t position = (ssize_t) openFileCount;
......@@ -152,8 +171,10 @@ cdiInputFile_destruct(CdiInputFile *me)
// Remove me from the list
openFileList[position] = openFileList[--openFileCount];
}
#if HAVE_PTHREAD
error = pthread_mutex_unlock(&openFileListLock);
xassert(!error);
#endif
cdiInputFile_condestruct(me, NULL);
}
......
......@@ -19,7 +19,13 @@
#include <assert.h>
#include <limits.h>
#include <stdlib.h>
// On Windows, define ssize_t manually
#ifdef _WIN32
#define ssize_t __int64
#else
#include <unistd.h>
#endif
struct CdiFallbackIterator
{
......
......@@ -246,8 +246,8 @@ readFuncCall(struct winHeaderEntry *header, size_t streamIdx)
int position = header->offset;
int changedTaxisID = taxisUnpack((char *) rxWin[streamIdx].clientBuf[0].mem, (int) rxWin[streamIdx].clientBuf[0].size,
&position, originNamespace, &pioInterComm, 0);
taxis_t *oldTaxisPtr = taxisPtr(oldTaxisID);
taxis_t *changedTaxisPtr = taxisPtr(changedTaxisID);
taxis_t *oldTaxisPtr = taxis_to_pointer(oldTaxisID);
taxis_t *changedTaxisPtr = taxis_to_pointer(changedTaxisID);
ptaxisCopy(oldTaxisPtr, changedTaxisPtr);
taxisDestroy(changedTaxisID);
streamDefTimestep(streamID, funcArgs->streamNewTimestep.tsID);
......
......@@ -430,7 +430,7 @@ cdiInqContents(stream_t *streamptr)
if (taxisID != CDI_UNDEFID)
{
taxis_t *taxisptr1 = &streamptr->tsteps[0].taxis;
taxis_t *taxisptr2 = taxisPtr(taxisID);
taxis_t *taxisptr2 = taxis_to_pointer(taxisID);
ptaxisCopy(taxisptr2, taxisptr1);
}
}
......@@ -1462,7 +1462,7 @@ cdiStreamDefTimestep_(stream_t *streamptr, int tsID)
}
int taxisID = vlistInqTaxis(vlistID);
if (taxisID != CDI_UNDEFID) ptaxisCopy(&streamptr->tsteps[tsID].taxis, taxisPtr(taxisID));
if (taxisID != CDI_UNDEFID) ptaxisCopy(&streamptr->tsteps[tsID].taxis, taxis_to_pointer(taxisID));
streamptr->curTsID = tsID;
streamptr->ntsteps = tsID + 1;
......@@ -1564,7 +1564,7 @@ streamInqTimestep(int streamID, int tsID)
streamptr->tsteps[tsID].curRecID = CDI_UNDEFID;
int taxisID = vlistInqTaxis(vlistID);
if (taxisID == -1) Error("Timestep undefined for fileID = %d", streamID);
ptaxisCopy(taxisPtr(taxisID), &streamptr->tsteps[tsID].taxis);
ptaxisCopy(taxis_to_pointer(taxisID), &streamptr->tsteps[tsID].taxis);
return nrecs;
}
......@@ -1633,7 +1633,7 @@ streamInqTimestep(int streamID, int tsID)
int taxisID = vlistInqTaxis(vlistID);
if (taxisID == -1) Error("Timestep undefined for fileID = %d", streamID);
ptaxisCopy(taxisPtr(taxisID), &streamptr->tsteps[tsID].taxis);
ptaxisCopy(taxis_to_pointer(taxisID), &streamptr->tsteps[tsID].taxis);
return nrecs;
}
......@@ -1832,7 +1832,7 @@ cdiStreamSetupVlist_(stream_t *streamptr, int vlistID)
if (taxisInqType(taxisID) == TAXIS_RELATIVE)
if (cdiBaseFiletype(streamptr->filetype) == CDI_FILETYPE_NETCDF)
{
const taxis_t *taxisptr = taxisPtr(taxisID);
const taxis_t *taxisptr = taxis_to_pointer(taxisID);
if (cdiDateTime_isNull(taxisptr->rDateTime))
{
int vdate = taxisInqVdate(taxisID);
......@@ -1841,7 +1841,7 @@ cdiStreamSetupVlist_(stream_t *streamptr, int vlistID)
}
}
#endif
ptaxisCopy(&streamptr->tsteps[0].taxis, taxisPtr(taxisID));
ptaxisCopy(&streamptr->tsteps[0].taxis, taxis_to_pointer(taxisID));
}
switch (cdiBaseFiletype(streamptr->filetype))
......
......@@ -6,7 +6,6 @@
#include <ctype.h>
#include <limits.h>
#include <unistd.h>
#include "dmemory.h"
#include "cdi_int.h"
......@@ -19,6 +18,13 @@
#include "cdf_lazy_grid.h"
#include "cdf_filter.h"
// On Windows, define strcasecmp manually
#ifdef _WIN32
#define strcasecmp _stricmp
#else
#include <unistd.h>
#endif
enum VarStatus
{
UndefVar = -1,
......
......@@ -153,7 +153,7 @@ cdfDefTime(stream_t *streamptr)
if (streamptr->ncmode == 0) streamptr->ncmode = 1;
if (streamptr->ncmode == 2) cdf_redef(fileID);
taxis_t *taxis = taxisPtr(vlistInqTaxis(streamptr->vlistID));
taxis_t *taxis = taxis_to_pointer(vlistInqTaxis(streamptr->vlistID));
const char *taxisName = (taxis->name && taxis->name[0]) ? taxis->name : defaultTimeAxisName;
......@@ -170,7 +170,8 @@ cdfDefTime(stream_t *streamptr)
cdf_def_dim(fileID, taxisName, timeDimLen, &timeDimId);
streamptr->basetime.ncdimid = timeDimId;
int datatype = taxis->datatype;
int datatype = CDI_UNDEFID;
cdiInqKeyInt(taxis->self, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype);
nc_type xtype = (datatype == CDI_DATATYPE_INT32) ? NC_INT : ((datatype == CDI_DATATYPE_FLT32) ? NC_FLOAT : NC_DOUBLE);
int timeVarId;
......@@ -245,7 +246,7 @@ cdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount)
int time_varid = streamptr->basetime.ncvarid;
if (time_varid != CDI_UNDEFID && tsID == 0)
{
taxis_t *taxis = taxisPtr(vlistInqTaxis(streamptr->vlistID));
taxis_t *taxis = taxis_to_pointer(vlistInqTaxis(streamptr->vlistID));
int fileID = streamptr->fileID;
const char *unitstr = cdfGetTimeUnits(taxis);
size_t len = strlen(unitstr);
......
......@@ -102,7 +102,6 @@ void
ptaxisInit(taxis_t *taxisptr)
{
taxisptr->self = CDI_UNDEFID;
taxisptr->datatype = CDI_DATATYPE_FLT64;
taxisptr->type = DefaultTimeType;
taxisptr->calendar = CDI_Default_Calendar;
taxisptr->unit = DefaultTimeUnit;
......@@ -120,6 +119,9 @@ ptaxisInit(taxis_t *taxisptr)
taxisptr->name = NULL;
taxisptr->longname = NULL;
taxisptr->units = NULL;
cdiInitKeys(&taxisptr->keys);
cdiDefVarKeyInt(&taxisptr->keys, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT64);
}
static taxis_t *
......@@ -235,7 +237,7 @@ taxisDefType(int taxisID, int taxistype)
if (taxisptr->type != taxistype)
{
taxisptr->type = taxistype;
taxisptr->datatype = CDI_DATATYPE_FLT64;
cdiDefVarKeyInt(&taxisptr->keys, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT64);
delete_refcount_string(taxisptr->units);
taxisptr->units = NULL;
reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
......@@ -840,7 +842,7 @@ taxisInqNumavg(int taxisID)
}
taxis_t *
taxisPtr(int taxisID)
taxis_to_pointer(int taxisID)
{
taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
return taxisptr;
......@@ -849,7 +851,7 @@ taxisPtr(int taxisID)
void
ptaxisDefDatatype(taxis_t *taxisptr, int datatype)
{
taxisptr->datatype = datatype;
cdiDefVarKeyInt(&taxisptr->keys, CDI_KEY_DATATYPE, datatype);
}
void
......@@ -1349,7 +1351,6 @@ ptaxisCopy(taxis_t *dest, taxis_t *source)
reshLock();
// memcpy(dest, source, sizeof(taxis_t));
dest->datatype = source->datatype;
dest->type = source->type;
dest->calendar = source->calendar;
dest->unit = source->unit;
......@@ -1374,6 +1375,9 @@ ptaxisCopy(taxis_t *dest, taxis_t *source)
dest->units = dup_refcount_string(source->units);
if (dest->self != CDI_UNDEFID) reshSetStatus(dest->self, &taxisOps, RESH_DESYNC_IN_USE);
cdiInitKeys(&dest->keys);
cdiCopyVarKeys(&source->keys, &dest->keys);
reshUnlock();
}
......@@ -1480,6 +1484,7 @@ taxisGetPackSize(void *p, void *context)
+ (taxisptr->longname ? serializeGetSize((int) strlen(taxisptr->longname), CDI_DATATYPE_TXT, context) : 0)
+ (taxisptr->units ? serializeGetSize((int) strlen(taxisptr->units), CDI_DATATYPE_TXT, context) : 0)
+ serializeGetSize(1, CDI_DATATYPE_UINT32, context);
packBufferSize += serializeKeysGetPackSize(&taxisptr->keys, context);
return packBufferSize;
}
......@@ -1546,6 +1551,8 @@ taxisUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int
taxisP->units = units;
}
serializeKeysUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &taxisP->keys, context);
reshSetStatus(taxisP->self, &taxisOps, reshGetStatus(taxisP->self, &taxisOps) & ~RESH_SYNC_BIT);
#undef adaptKey
......@@ -1596,6 +1603,8 @@ taxisPack(void *voidP, void *packBuffer, int packBufferSize, int *packBufferPos,
if (taxisP->longname)
serializePack(taxisP->longname, lnameLen, CDI_DATATYPE_TXT, packBuffer, packBufferSize, packBufferPos, context);
if (taxisP->units) serializePack(taxisP->units, unitsLen, CDI_DATATYPE_TXT, packBuffer, packBufferSize, packBufferPos, context);
serializeKeysPack(&taxisP->keys, packBuffer, packBufferSize, packBufferPos, context);
}
/*
......
......@@ -4,6 +4,8 @@
#include <stdbool.h>
#include "cdi.h"
#include "cdi_key.h"
#ifndef RESOURCE_HANDLE_H
#include "resource_handle.h"
#endif
......@@ -11,8 +13,7 @@
typedef struct
{
int self;
int datatype; // datatype
int type; // time type
int type; // time type
int calendar;
int unit; // time units
int numavg;
......@@ -29,6 +30,7 @@ typedef struct
char *units;
bool climatology;
bool hasBounds;
cdi_keys_t keys;
} taxis_t;
// taxisInqSdatetime: Get the start date/time
......@@ -36,7 +38,7 @@ CdiDateTime taxisInqSdatetime(int taxisID);
void ptaxisInit(taxis_t *taxis);
void ptaxisCopy(taxis_t *dest, taxis_t *source);
taxis_t *taxisPtr(int taxisID);
taxis_t *taxis_to_pointer(int taxisID);
void cdi_set_forecast_period(double timevalue, taxis_t *taxis);
CdiDateTime cdi_decode_timeval(double timevalue, const taxis_t *taxis);
double cdi_encode_timeval(CdiDateTime datetime, taxis_t *taxis);
......
......@@ -100,6 +100,7 @@ cdiUnescapeSpaces(const char *string, const char **outStringEnd)
return result;
}
#ifndef _WIN32
#if defined(HAVE_DECL_UUID_GENERATE) && defined(HAVE_UUID_UUID_H)
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
......@@ -252,6 +253,7 @@ cdiCreateUUID(unsigned char *uuid)
#endif
}
#endif
#endif
/*
* Local Variables:
......
......@@ -63,7 +63,7 @@ defineGrid(void)
cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, "myXunits");
cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, "myYunits");
gridDefDatatype(gridID, DOUBLE_PRECISION);
cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, DOUBLE_PRECISION);
gridDefTrunc(gridID, 1);
gridDefParamGME(gridID, 2, 3, 4, 5);
......@@ -164,7 +164,7 @@ defineVlist(int gridID, int zaxisID, int taxisID)
cdiDefAttTxt(vlistID, varID2, "txt demo", 6, "banana");
vlistDefTaxis(vlistID, taxisID);
int vlistID2 = vlistDuplicate(vlistID);
return (struct idPair){ vlistID, vlistID2 };
return (struct idPair) { vlistID, vlistID2 };
}
static int
......