netcdf-c/ncdump/nctime.h
2010-06-03 13:24:43 +00:00

132 lines
4.9 KiB
C

/*********************************************************************
* Copyright 2008, University Corporation for Atmospheric Research
* See netcdf/COPYRIGHT file for copying and redistribution conditions.
* $Id: nctime.h,v 1.6 2010/03/18 19:24:26 russ Exp $
*********************************************************************/
/*
* This code was extracted with permission from the CDMS time
* conversion and arithmetic routines developed by Bob Drach, Lawrence
* Livermore National Laboratory as part of the cdtime library.
* Changes and additions were made to support the "-t" option of the
* netCDF ncdump utility.
*
* For the complete time conversion and climate calendar facilities of
* the CDMS library, get the original sources from LLNL.
*/
#define CD_MAX_RELUNITS 64 /* Max characters in relative units */
#define CD_MAX_CHARTIME 48 /* Max characters in character time */
#define CD_NULL_DAY 1 /* Null day value */
#define CD_NULL_HOUR 0.0 /* Null hour value */
#define CD_NULL_ID 0 /* Reserved ID */
#define CD_NULL_MONTH 1 /* Null month value */
#define CD_NULL_YEAR 0 /* Null year value, component time */
typedef enum CdTimeUnit {
CdBadTimeUnit = 0,
CdMinute = 1,
CdHour = 2,
CdDay = 3,
CdWeek = 4, /* Always = 7 days */
CdMonth = 5,
CdSeason = 6, /* Always = 3 months */
CdYear = 7,
CdSecond = 8
} CdTimeUnit;
typedef enum cdUnit {
cdBadUnit = CdBadTimeUnit,
cdMinute = CdMinute,
cdHour = CdHour,
cdDay = CdDay,
cdWeek = CdWeek, /* Always = 7 days */
cdMonth = CdMonth,
cdSeason = CdSeason, /* Always = 3 months */
cdYear = CdYear,
cdSecond = CdSecond,
cdFraction /* Fractional part of absolute time */
} cdUnitTime;
#define CdChronCal 0x1
#define CdClimCal 0x0
#define CdBaseRel 0x00
#define CdBase1970 0x10
#define CdHasLeap 0x100
#define CdNoLeap 0x000
#define Cd366 0x2000
#define Cd365 0x1000
#define Cd360 0x0000
#define CdJulianType 0x10000
typedef enum CdTimeType {
CdChron = ( CdChronCal | CdBase1970 | CdHasLeap | Cd365), /* 4369 */
CdJulianCal = ( CdChronCal | CdBase1970 | CdHasLeap | Cd365 | CdJulianType),
CdChronNoLeap = ( CdChronCal | CdBase1970 | CdNoLeap | Cd365), /* 4113 */
CdChron360 = ( CdChronCal | CdBase1970 | CdNoLeap | Cd360), /* 17 */
CdRel = ( CdChronCal | CdBaseRel | CdHasLeap | Cd365), /* 4353 */
CdRelNoLeap = ( CdChronCal | CdBaseRel | CdNoLeap | Cd365), /* 4097 */
CdClim = ( CdClimCal | CdBaseRel | CdNoLeap | Cd365), /* 4096 */
CdClimLeap = ( CdClimCal | CdBaseRel | CdHasLeap | Cd365),
CdClim360 = ( CdClimCal | CdBaseRel | CdNoLeap | Cd365),
CdChron366 = ( CdChronCal | CdBase1970 | CdNoLeap | Cd366)
} CdTimeType;
typedef struct {
long year; /* e.g., 1979 */
short month; /* e.g., CdDec */
short day; /* e.g., 30 */
double hour; /* hour and fractional hour */
long baseYear; /* base year for relative, 1970 for CdChron */
CdTimeType timeType; /* e.g., CdChron */
} CdTime;
#define cdStandardCal 0x11
#define cdClimCal 0x0
#define cdHasLeap 0x100
#define cdHasNoLeap 0x000
#define cd366Days 0x2000
#define cd365Days 0x1000
#define cd360Days 0x0000
#define cdJulianCal 0x10000
#define cdMixedCal 0x20000
typedef enum cdCalenType {
cdStandard = ( cdStandardCal | cdHasLeap | cd365Days),
cdJulian = ( cdStandardCal | cdHasLeap | cd365Days | cdJulianCal),
cdNoLeap = ( cdStandardCal | cdHasNoLeap | cd365Days),
cd360 = ( cdStandardCal | cdHasNoLeap | cd360Days),
cd366 = ( cdStandardCal | cdHasNoLeap | cd366Days),
cdClim = ( cdClimCal | cdHasNoLeap | cd365Days),
cdClimLeap = ( cdClimCal | cdHasLeap | cd365Days),
cdClim360 = ( cdClimCal | cdHasNoLeap | cd360Days),
cdMixed = ( cdStandardCal | cdHasLeap | cd365Days | cdMixedCal)
} cdCalenType;
/* Component time */
typedef struct {
long year; /* Year */
short month; /* Numerical month (1..12) */
short day; /* Day of month (1..31) */
double hour; /* Hour and fractional hours */
} cdCompTime;
typedef struct {
long count; /* units count */
CdTimeUnit units; /* time interval units */
} CdDeltaTime;
typedef struct timeinfo_t {
cdCalenType calendar;
cdUnitTime unit;
char *units;
cdCompTime origin;
} timeinfo_t;
extern void cdChar2Comp(cdCalenType timetype, char* chartime, cdCompTime* comptime);
extern void cdComp2Rel(cdCalenType timetype, cdCompTime comptime, char* relunits, double* reltime);
extern void cdRel2Comp(cdCalenType timetype, char* relunits, double reltime, cdCompTime* comptime);
extern void cdRel2Iso(cdCalenType timetype, char* relunits, double reltime, char* chartime);
extern int cdParseRelunits(cdCalenType timetype, char* relunits, cdUnitTime* unit, cdCompTime* base_comptime);
void cdRel2CompMixed(double reltime, cdUnitTime unit, cdCompTime basetime, cdCompTime *comptime);