[409] | 1 | /********************************************************************* |
---|
| 2 | * Copyright 2008, University Corporation for Atmospheric Research |
---|
| 3 | * See netcdf/COPYRIGHT file for copying and redistribution conditions. |
---|
| 4 | * $Id: nctime.h,v 1.6 2010/03/18 19:24:26 russ Exp $ |
---|
| 5 | *********************************************************************/ |
---|
| 6 | |
---|
| 7 | struct bounds_node{ |
---|
| 8 | int ncid; /* group (or file) in which variable with associated |
---|
| 9 | * bounds variable resides */ |
---|
| 10 | int varid; /* has "bounds" attribute naming its bounds variable */ |
---|
| 11 | char *bounds_name; /* the named variable, which stores bounds for varid */ |
---|
| 12 | struct bounds_node *next; /* next node on list or NULL ifn last list node */ |
---|
| 13 | }; |
---|
| 14 | |
---|
| 15 | typedef struct bounds_node bounds_node_t; |
---|
| 16 | |
---|
| 17 | /* |
---|
| 18 | * This code was extracted with permission from the CDMS time |
---|
| 19 | * conversion and arithmetic routines developed by Bob Drach, Lawrence |
---|
| 20 | * Livermore National Laboratory as part of the cdtime library. |
---|
| 21 | * Changes and additions were made to support the "-t" option of the |
---|
| 22 | * netCDF ncdump utility. |
---|
| 23 | * |
---|
| 24 | * For the complete time conversion and climate calendar facilities of |
---|
| 25 | * the CDMS library, get the original sources from LLNL. |
---|
| 26 | */ |
---|
| 27 | |
---|
| 28 | #define CD_MAX_RELUNITS 64 /* Max characters in relative units */ |
---|
| 29 | #define CD_MAX_CHARTIME 48 /* Max characters in character time */ |
---|
| 30 | #define CD_NULL_DAY 1 /* Null day value */ |
---|
| 31 | #define CD_NULL_HOUR 0.0 /* Null hour value */ |
---|
| 32 | #define CD_NULL_ID 0 /* Reserved ID */ |
---|
| 33 | #define CD_NULL_MONTH 1 /* Null month value */ |
---|
| 34 | #define CD_NULL_YEAR 0 /* Null year value, component time */ |
---|
| 35 | |
---|
| 36 | typedef enum CdTimeUnit { |
---|
| 37 | CdBadTimeUnit = 0, |
---|
| 38 | CdMinute = 1, |
---|
| 39 | CdHour = 2, |
---|
| 40 | CdDay = 3, |
---|
| 41 | CdWeek = 4, /* Always = 7 days */ |
---|
| 42 | CdMonth = 5, |
---|
| 43 | CdSeason = 6, /* Always = 3 months */ |
---|
| 44 | CdYear = 7, |
---|
| 45 | CdSecond = 8 |
---|
| 46 | } CdTimeUnit; |
---|
| 47 | |
---|
| 48 | typedef enum cdUnit { |
---|
| 49 | cdBadUnit = CdBadTimeUnit, |
---|
| 50 | cdMinute = CdMinute, |
---|
| 51 | cdHour = CdHour, |
---|
| 52 | cdDay = CdDay, |
---|
| 53 | cdWeek = CdWeek, /* Always = 7 days */ |
---|
| 54 | cdMonth = CdMonth, |
---|
| 55 | cdSeason = CdSeason, /* Always = 3 months */ |
---|
| 56 | cdYear = CdYear, |
---|
| 57 | cdSecond = CdSecond, |
---|
| 58 | cdFraction /* Fractional part of absolute time */ |
---|
| 59 | } cdUnitTime; |
---|
| 60 | |
---|
| 61 | #define CdChronCal 0x1 |
---|
| 62 | #define CdClimCal 0x0 |
---|
| 63 | #define CdBaseRel 0x00 |
---|
| 64 | #define CdBase1970 0x10 |
---|
| 65 | #define CdHasLeap 0x100 |
---|
| 66 | #define CdNoLeap 0x000 |
---|
| 67 | #define Cd366 0x2000 |
---|
| 68 | #define Cd365 0x1000 |
---|
| 69 | #define Cd360 0x0000 |
---|
| 70 | #define CdJulianType 0x10000 |
---|
| 71 | |
---|
| 72 | typedef enum CdTimeType { |
---|
| 73 | CdChron = ( CdChronCal | CdBase1970 | CdHasLeap | Cd365), /* 4369 */ |
---|
| 74 | CdJulianCal = ( CdChronCal | CdBase1970 | CdHasLeap | Cd365 | CdJulianType), |
---|
| 75 | CdChronNoLeap = ( CdChronCal | CdBase1970 | CdNoLeap | Cd365), /* 4113 */ |
---|
| 76 | CdChron360 = ( CdChronCal | CdBase1970 | CdNoLeap | Cd360), /* 17 */ |
---|
| 77 | CdRel = ( CdChronCal | CdBaseRel | CdHasLeap | Cd365), /* 4353 */ |
---|
| 78 | CdRelNoLeap = ( CdChronCal | CdBaseRel | CdNoLeap | Cd365), /* 4097 */ |
---|
| 79 | CdClim = ( CdClimCal | CdBaseRel | CdNoLeap | Cd365), /* 4096 */ |
---|
| 80 | CdClimLeap = ( CdClimCal | CdBaseRel | CdHasLeap | Cd365), |
---|
| 81 | CdClim360 = ( CdClimCal | CdBaseRel | CdNoLeap | Cd365), |
---|
| 82 | CdChron366 = ( CdChronCal | CdBase1970 | CdNoLeap | Cd366) |
---|
| 83 | } CdTimeType; |
---|
| 84 | |
---|
| 85 | typedef struct { |
---|
| 86 | long year; /* e.g., 1979 */ |
---|
| 87 | short month; /* e.g., CdDec */ |
---|
| 88 | short day; /* e.g., 30 */ |
---|
| 89 | double hour; /* hour and fractional hour */ |
---|
| 90 | long baseYear; /* base year for relative, 1970 for CdChron */ |
---|
| 91 | CdTimeType timeType; /* e.g., CdChron */ |
---|
| 92 | } CdTime; |
---|
| 93 | |
---|
| 94 | #define cdStandardCal 0x11 |
---|
| 95 | #define cdClimCal 0x0 |
---|
| 96 | #define cdHasLeap 0x100 |
---|
| 97 | #define cdHasNoLeap 0x000 |
---|
| 98 | #define cd366Days 0x2000 |
---|
| 99 | #define cd365Days 0x1000 |
---|
| 100 | #define cd360Days 0x0000 |
---|
| 101 | #define cdJulianCal 0x10000 |
---|
| 102 | #define cdMixedCal 0x20000 |
---|
| 103 | |
---|
| 104 | typedef enum cdCalenType { |
---|
| 105 | cdStandard = ( cdStandardCal | cdHasLeap | cd365Days), |
---|
| 106 | cdJulian = ( cdStandardCal | cdHasLeap | cd365Days | cdJulianCal), |
---|
| 107 | cdNoLeap = ( cdStandardCal | cdHasNoLeap | cd365Days), |
---|
| 108 | cd360 = ( cdStandardCal | cdHasNoLeap | cd360Days), |
---|
| 109 | cd366 = ( cdStandardCal | cdHasNoLeap | cd366Days), |
---|
| 110 | cdClim = ( cdClimCal | cdHasNoLeap | cd365Days), |
---|
| 111 | cdClimLeap = ( cdClimCal | cdHasLeap | cd365Days), |
---|
| 112 | cdClim360 = ( cdClimCal | cdHasNoLeap | cd360Days), |
---|
| 113 | cdMixed = ( cdStandardCal | cdHasLeap | cd365Days | cdMixedCal) |
---|
| 114 | } cdCalenType; |
---|
| 115 | |
---|
| 116 | /* Component time */ |
---|
| 117 | typedef struct { |
---|
| 118 | long year; /* Year */ |
---|
| 119 | short month; /* Numerical month (1..12) */ |
---|
| 120 | short day; /* Day of month (1..31) */ |
---|
| 121 | double hour; /* Hour and fractional hours */ |
---|
| 122 | } cdCompTime; |
---|
| 123 | |
---|
| 124 | typedef struct { |
---|
| 125 | long count; /* units count */ |
---|
| 126 | CdTimeUnit units; /* time interval units */ |
---|
| 127 | } CdDeltaTime; |
---|
| 128 | |
---|
| 129 | typedef struct timeinfo_t { |
---|
| 130 | cdCalenType calendar; |
---|
| 131 | cdUnitTime unit; |
---|
| 132 | char *units; |
---|
| 133 | cdCompTime origin; |
---|
| 134 | } timeinfo_t; |
---|
| 135 | |
---|
| 136 | |
---|
| 137 | |
---|
| 138 | #if defined(DLL_NETCDF) /* Defined when library is a DLL */ |
---|
| 139 | # if defined(DLL_EXPORT) /* define when building the library. */ |
---|
| 140 | # define MSC_NCTIME_EXTRA __declspec(dllexport) |
---|
| 141 | # else |
---|
| 142 | # define MSC_NCTIME_EXTRA __declspec(dllimport) |
---|
| 143 | # endif |
---|
| 144 | |
---|
| 145 | MSC_NCTIME_EXTRA extern void cdRel2Iso(cdCalenType timetype, char* relunits, int separator, double reltime, char* chartime); |
---|
| 146 | MSC_NCTIME_EXTRA extern void cdChar2Comp(cdCalenType timetype, char* chartime, cdCompTime* comptime); |
---|
| 147 | MSC_NCTIME_EXTRA extern void Cdh2e(CdTime *htime, double *etime); |
---|
| 148 | MSC_NCTIME_EXTRA extern void Cde2h(double etime, CdTimeType timeType, long baseYear, CdTime *htime); |
---|
| 149 | MSC_NCTIME_EXTRA extern int cdParseRelunits(cdCalenType timetype, char* relunits, cdUnitTime* unit, cdCompTime* base_comptime); |
---|
| 150 | #else |
---|
| 151 | extern void cdRel2Iso(cdCalenType timetype, char* relunits, int separator, double reltime, char* chartime); |
---|
| 152 | extern void cdChar2Comp(cdCalenType timetype, char* chartime, cdCompTime* comptime); |
---|
| 153 | extern void Cdh2e(CdTime *htime, double *etime); |
---|
| 154 | extern void Cde2h(double etime, CdTimeType timeType, long baseYear, CdTime *htime); |
---|
| 155 | extern int cdParseRelunits(cdCalenType timetype, char* relunits, cdUnitTime* unit, cdCompTime* base_comptime); |
---|
| 156 | #endif /* DLL Considerations. */ |
---|
| 157 | |
---|
| 158 | |
---|
| 159 | |
---|