1 /**********************************************************************
2 zyGrib: meteorological GRIB file viewer
3 Copyright (C) 2008 - Jacques Zaninetti - http://www.zygrib.org
4 
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 ***********************************************************************/
18 
19 /*************************
20 Reader for a GRIB file
21 
22 *************************/
23 
24 #ifndef GRIBREADER_H
25 #define GRIBREADER_H
26 
27 #include "wx/wxprec.h"
28 
29 #ifndef  WX_PRECOMP
30 #include "wx/wx.h"
31 #endif //precompiled headers
32 
33 
34 #include <iostream>
35 #include <cmath>
36 #include <vector>
37 #include <set>
38 #include <map>
39 
40 
41 #include "GribRecord.h"
42 #include "zuFile.h"
43 
44 //===============================================================
45 class GribReader
46 {
47     public:
48         GribReader();
49         GribReader(const wxString fname);
50         ~GribReader();
51 
52         void  openFile(const wxString fname);
isOk()53         bool  isOk()                 {return ok;}
getFileSize()54         long  getFileSize()          {return fileSize;}
getFileName()55         wxString getFileName()    {return fileName;}
56 
57         int          getNumberOfGribRecords(int dataType,int levelType,int levelValue);
58         int          getTotalNumberOfGribRecords();
59 
60         GribRecord * getGribRecord(int dataType,int levelType,int levelValue, time_t date);
61 
62         GribRecord * getFirstGribRecord();
63         GribRecord * getFirstGribRecord(int dataType,int levelType,int levelValue);
64 
65       std::vector<GribRecord *> * getListOfGribRecords(int dataType,int levelType,int levelValue);
66 
67 //      double		 getHoursBeetweenGribRecords()  {return hoursBetweenRecords;}
getListDates()68       std::set<time_t>  getListDates()   {return setAllDates;}
getNumberOfDates()69       int        getNumberOfDates()      {return setAllDates.size();}
getRefDate()70       time_t     getRefDate()            {return setAllDates.size()>0 ?
71                                                        *setAllDates.begin() : 0;}
72 
73         // Valeur pour un point et une date quelconques
74       double  getTimeInterpolatedValue   (int dataType,int levelType,int levelValue, double px, double py, time_t date);
75 
76         // Crée un GribRecord interpolé
77         GribRecord * getTimeInterpolatedGribRecord (int dataType,int levelType,int levelValue, time_t date);
78 
79       double computeDewPoint(double lon, double lat, time_t date);
80 
81       int	   getDewpointDataStatus(int levelType,int levelValue);
82 
83       enum GribFileDataStatus {DATA_IN_FILE, NO_DATA_IN_FILE, COMPUTED_DATA};
84 
85       void  copyFirstCumulativeRecord   ();
86       //void  removeFirstCumulativeRecord ();
87       void  copyMissingWaveRecords ();
88       void  copyFirstCumulativeRecord   (int dataType,int levelType,int levelValue);
89       //void  removeFirstCumulativeRecord (int dataType,int levelType,int levelValue);
90       void  copyMissingWaveRecords (int dataType,int levelType,int levelValue);
91 
92       void  computeAccumulationRecords (int dataType, int levelType, int levelValue);
93 
getGribMap()94       std::map < std::string, std::vector<GribRecord *>* > * getGribMap(){ return  &mapGribRecords; }              //dsr
95 
96     private:
97         bool      ok;
98         wxString  fileName;
99         ZUFILE    *file;
100         long      fileSize;
101 //        double    hoursBetweenRecords;
102         int       dewpointDataStatus;
103 
104         std::map < std::string, std::vector<GribRecord *>* >  mapGribRecords;
105 
106         void storeRecordInMap(GribRecord *rec);
107 
108         void   readGribFileContent();
109         void   readAllGribRecords();
110         void   createListDates();
111         double computeHoursBeetweenGribRecords();
112         std::set<time_t> setAllDates;
113 
114         void clean_vector(std::vector<GribRecord *> &ls);
115         void clean_all_vectors();
116         std::vector<GribRecord *> * getFirstNonEmptyList();
117 
118       // Interpolation between 2 GribRecord
119         double      get2GribsInterpolatedValueByDate (
120                                     double px, double py, time_t date,
121                                     GribRecord *before, GribRecord *after);
122 
123       // Détermine les GribRecord qui encadrent une date
124         void findGribsAroundDate (int dataType,int levelType,int levelValue, time_t date,
125                   GribRecord **before, GribRecord **after);
126 };
127 
128 
129 #endif
130