00001 #ifndef _WINC_GRIBFILE
00002 #define _WINC_GRIBFILE
00003
00004 #include <WXP/Date.h>
00005 #include <WXP/DomainVal.h>
00006 #include <WXP/File.h>
00007 #include <WXP/Filename.h>
00008 #include <WXP/GribPDB.h>
00009 #include <WXP/GribParam.h>
00010 #include <WXP/Grid.h>
00011 #include <WXP/GridSpec.h>
00012 #include <WXP/Grids.h>
00013 #include <WXP/ModelName.h>
00014 #include <WXP/VarName.h>
00015
00016 namespace WXP {
00017 class GribFile {
00018 File file;
00019 int access;
00020 bool opened;
00021 File hfile;
00022 Date date;
00023 GribPDB pdb;
00024 DomainVal dv;
00025 GribParam gparam[200];
00026 VarName vname;
00027 int nparam;
00028 bool use_hfile;
00029
00030
00031 int version;
00032 int type;
00033 int discipline;
00034 int sect_flag;
00035
00036 int ploc;
00037 int gloc;
00038 int dloc;
00039 char wmo_hdr[30];
00040 int size;
00041 int num;
00042 int gnum;
00043 bool peeked;
00044
00045 static const int NUM_VALID = 20;
00046
00047
00048 static const int DATA_SIZE = 25000;
00049 int data_size;
00050 int data_off;
00051 unsigned char data[DATA_SIZE];
00052
00053
00054 int sect;
00055 int slen;
00056 bool cont;
00057 bool pcont;
00058
00059
00060 int data_pnts;
00061 int drs_temp;
00062
00063
00064 float lat;
00065 int xdir;
00066 int ydir;
00067 int xalt;
00068 int pole;
00069
00070
00071 int thin;
00072 int *thin_val;
00073
00074
00075 float ref;
00076 float sfac;
00077 float dscale;
00078 int max_val;
00079 int data_type;
00080
00081
00082 unsigned char *bmb;
00083 int bmoff;
00084 int bmlen;
00085
00086
00087 int bpval;
00088
00089 int bpoff;
00090 int data_bits;
00091 int data_bytes;
00092 long bit_mask;
00093 int temp_data;
00094
00095
00096 int split_method;
00097 int miss_type;
00098 float miss1, miss2;
00099 int num_bits;
00100 int num_group;
00101 int num_bits_gref;
00102 int ref_gwidth;
00103 int num_bits_gwidth;
00104 int ref_glen;
00105 int inc_glen;
00106 int last_glen;
00107 int num_bits_glen;
00108 int order;
00109 int spat_bytes;
00110
00111
00112 float *map;
00113 int num_map;
00114
00115
00116 int valid_data[NUM_VALID];
00117 int bad;
00118 int bad_limit;
00119 int bad_max;
00120 int bad_test;
00121 int prev_val;
00122
00123
00124 int lev_type;
00125 int grid_type;
00126 ModelName mname;
00127
00128 public:
00129 GribFile();
00130 GribFile( const char *filename );
00131 GribFile( Filename &filename );
00132 ~GribFile();
00133 int init();
00134 bool isOpen();
00135 int useHdrFile( bool val );
00136 int setMaxBad( int val );
00137 int open( const char *filename, int raccess );
00138 int open( const char *filename );
00139 int open( Filename &filename );
00140 int close();
00141 int rewind();
00142 inline int getVersion(){ return version; };
00143 inline const char* getWmoHdr(){ return wmo_hdr; };
00144 int getHeader( Grid &grid );
00145 int read( Grid &grid );
00146 int read( const char *spec, Grid &grid );
00147 int read( GridSpec &spec, Grid &grid );
00148 int read( Grids &grids );
00149 int makeInfo( GribPDB &pdb, Grid &grid );
00150 int makeDatim( Grid &grid );
00151 int peek( Grid &grid );
00152 int next( );
00153 int readHeader();
00154 int searchGRIB();
00155 int readData( int bytes );
00156 int readBits();
00157 unsigned char getByte( int loc );
00158 int seekData( int val );
00159 int tellData();
00160
00161 GribParam getVer1Param( int ver, int src, int table, int param );
00162 int readPDB( GribPDB &pdb );
00163 int setPDB( GribPDB &pdb, Grid &grid );
00164 int readGDB( DomainVal &dv );
00165 int readBMB();
00166 bool checkBMB();
00167 int readBDB( Grid &grid );
00168
00169 int readSection();
00170 int skipSection();
00171 GribParam getVer2Param( int src, int disc, int cat, int param );
00172 int readIDS( GribPDB &pdb );
00173 int readGDS( DomainVal &dv );
00174 int readPDS( GribPDB &pdb );
00175 int readDRS();
00176 int readBMS();
00177 int readDS( Grid &grid );
00178
00179 int write( Grid &grid );
00180
00181 static int checkType( const char *filename );
00182 static float ibmFloatConv( const unsigned char *pc );
00183 static float ieeeFloatConv( const unsigned char *pc );
00184 static float scaleConv( const unsigned char *pc );
00185 static int scaleConv( float scale );
00186 static int setDomain( int type, DomainVal &dv );
00187
00188 static const int LIMIT = 300000;
00189
00190 enum Type {
00191 NONE,
00192 WXP,
00193 WMO,
00194 WXP_OLD,
00195 RAW,
00196 RAW_NS };
00197 };
00198 }
00199 #endif