GRIBFile::GRIBFile( const wxString file_name, bool CumRec, bool WaveRec ) { m_bOK = true; // Assume ok until proven otherwise if( !::wxFileExists( file_name ) ) { m_last_message = _( "Error: File does not exist!" ); m_bOK = false; return; } // Use the zyGrib support classes, as (slightly) modified locally.... m_pGribReader = new GribReader(); // Read and ingest the entire GRIB file....... m_pGribReader->openFile( file_name ); if( !m_pGribReader->isOk() ) { m_last_message = _( "Error: Can't read this File!" ); m_bOK = false; return; } m_FileName = file_name; if( CumRec ) m_pGribReader->copyFirstCumulativeRecord(); //add missing records if option selected if( WaveRec ) m_pGribReader->copyMissingWaveRecords (); // "" "" m_nGribRecords = m_pGribReader->getTotalNumberOfGribRecords(); // Walk the GribReader date list to populate our array of GribRecordSets std::set<time_t>::iterator iter; std::set<time_t> date_list = m_pGribReader->getListDates(); for( iter = date_list.begin(); iter != date_list.end(); iter++ ) { GribRecordSet *t = new GribRecordSet(); time_t reftime = *iter; t->m_Reference_Time = reftime; m_GribRecordSetArray.Add( t ); } // Convert from zyGrib organization by data type/level to our organization by time. GribRecord *pRec; // Get the map of GribRecord vectors std::map<std::string, std::vector<GribRecord *>*> *p_map = m_pGribReader->getGribMap(); // Iterate over the map to get vectors of related GribRecords std::map<std::string, std::vector<GribRecord *>*>::iterator it; for( it = p_map->begin(); it != p_map->end(); it++ ) { std::vector<GribRecord *> *ls = ( *it ).second; for( zuint i = 0; i < ls->size(); i++ ) { pRec = ls->at( i ); time_t thistime = pRec->getRecordCurrentDate(); // Search the GribRecordSet array for a GribRecordSet with matching time for( unsigned int j = 0; j < m_GribRecordSetArray.GetCount(); j++ ) { if( m_GribRecordSetArray.Item( j ).m_Reference_Time == thistime ) { int idx = -1; switch(pRec->getDataType()) { case GRB_WIND_VX: idx = Idx_WIND_VX; break; case GRB_WIND_VY: idx = Idx_WIND_VY; break; case GRB_WIND_GUST: idx = Idx_WIND_GUST; break; case GRB_PRESSURE: idx = Idx_PRESSURE; break; case GRB_HTSGW: idx = Idx_HTSIGW; break; case GRB_WVDIR: idx = Idx_WVDIR; break; case GRB_USCT: idx = Idx_WINDSCAT_VX; break; case GRB_VSCT: idx = Idx_WINDSCAT_VY; break; case GRB_UOGRD: idx = Idx_SEACURRENT_VX; break; case GRB_VOGRD: idx = Idx_SEACURRENT_VY; break; case GRB_PRECIP_TOT: idx = Idx_PRECIP_TOT; break; case GRB_CLOUD_TOT: idx = Idx_CLOUD_TOT; break; case GRB_TEMP: idx = Idx_AIR_TEMP_2M; break; case GRB_WTMP: idx = Idx_SEA_TEMP; break; } if(idx != -1) m_GribRecordSetArray.Item( j ).m_GribRecordPtrArray[idx]= pRec; break; } } } } }
//--------------------------------------------------------------------------------- void GribReader::readAllGribRecords() { //-------------------------------------------------------- // Lecture de l'ensemble des GribRecord du fichier // et stockage dans les listes appropriées. //-------------------------------------------------------- GribRecord *rec; int id = 0; time_t firstdate = -1; bool b_EOF; do { id ++; rec = new GribRecord(file, id); assert(rec); if (rec->isOk()) { b_EOF = rec->isEof(); if (rec->isDataKnown()) { ok = true; // au moins 1 record ok if (firstdate== -1) firstdate = rec->getRecordCurrentDate(); /* if (//----------------------------------------- (rec->getDataType()==GRB_PRESSURE && rec->getLevelType()==LV_MSL && rec->getLevelValue()==0) //----------------------------------------- || ( (rec->getDataType()==GRB_TMIN || rec->getDataType()==GRB_TMAX) && rec->getLevelType()==LV_ABOV_GND && rec->getLevelValue()==2) //----------------------------------------- || (rec->getDataType()==GRB_TEMP && rec->getLevelType()==LV_ABOV_GND && rec->getLevelValue()==2) || (rec->getDataType()==GRB_TEMP && rec->getLevelType()==LV_ISOBARIC && ( rec->getLevelValue()==850 || rec->getLevelValue()==700 || rec->getLevelValue()==500 || rec->getLevelValue()==300 ) ) //----------------------------------------- || ( (rec->getDataType()==GRB_WIND_VX || rec->getDataType()==GRB_WIND_VY) && rec->getLevelType()==LV_ABOV_GND && rec->getLevelValue()==10) || ( (rec->getDataType()==GRB_WIND_VX || rec->getDataType()==GRB_WIND_VY) && rec->getLevelType()==LV_ISOBARIC && ( rec->getLevelValue()==850 || rec->getLevelValue()==700 || rec->getLevelValue()==500 || rec->getLevelValue()==300 ) ) //----------------------------------------- || (rec->getDataType()==GRB_HUMID_SPEC && rec->getLevelType()==LV_ISOBARIC && ( rec->getLevelValue()==850 || rec->getLevelValue()==700 || rec->getLevelValue()==500 || rec->getLevelValue()==300 ) ) //----------------------------------------- || (rec->getDataType()==GRB_GEOPOT_HGT && rec->getLevelType()==LV_ISOTHERM0 && rec->getLevelValue()==0) || (rec->getDataType()==GRB_GEOPOT_HGT && rec->getLevelType()==LV_ISOBARIC && ( rec->getLevelValue()==850 || rec->getLevelValue()==700 || rec->getLevelValue()==500 || rec->getLevelValue()==300 ) ) //----------------------------------------- || (rec->getDataType()==GRB_PRECIP_TOT && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0) //----------------------------------------- || (rec->getDataType()==GRB_PRECIP_RATE && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0) //----------------------------------------- || (rec->getDataType()==GRB_SNOW_DEPTH && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0) //----------------------------------------- || (rec->getDataType()==GRB_SNOW_CATEG && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0) //----------------------------------------- || (rec->getDataType()==GRB_FRZRAIN_CATEG && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0) //----------------------------------------- || (rec->getDataType()==GRB_CLOUD_TOT && rec->getLevelType()==LV_ATMOS_ALL && rec->getLevelValue()==0) //----------------------------------------- || (rec->getDataType()==GRB_HUMID_REL && rec->getLevelType()==LV_ABOV_GND && rec->getLevelValue()==2) //----------------------------------------- || (rec->getDataType()==GRB_TPOT && rec->getLevelType()==LV_SIGMA && rec->getLevelValue()==9950) //----------------------------------------- || (rec->getDataType()==GRB_CAPE && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0) ) */ if (//----------------------------------------- (rec->getDataType()==GRB_PRESSURE && rec->getLevelType()==LV_MSL && rec->getLevelValue()==0) || ( (rec->getDataType()==GRB_WIND_VX || rec->getDataType()==GRB_WIND_VY) && rec->getLevelType()==LV_ABOV_GND && rec->getLevelValue()==10) ) { storeRecordInMap(rec); } else if( (rec->getDataType()==GRB_WIND_GUST && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0) ) storeRecordInMap(rec); else if( (rec->getDataType()==GRB_WIND_VX || rec->getDataType()==GRB_WIND_VY) && rec->getLevelType()==LV_GND_SURF) storeRecordInMap(rec); else if( rec->getDataType()==GRB_TEMP //Air temperature at 2m && rec->getLevelType()==LV_ABOV_GND && rec->getLevelValue()==2 ) storeRecordInMap(rec); else if(rec->getDataType()==GRB_PRECIP_TOT //total rainfall && rec->getLevelType()==LV_GND_SURF && rec->getLevelValue()==0 ) storeRecordInMap(rec); else if(rec->getDataType()==GRB_CLOUD_TOT //cloud cover && rec->getLevelType()==LV_ATMOS_ALL && rec->getLevelValue()==0 ) storeRecordInMap(rec); else if( rec->getDataType() == GRB_HTSGW ) // Significant Wave Height storeRecordInMap(rec); else if( rec->getDataType() == GRB_WVDIR ) // Wind Wave Direction storeRecordInMap(rec); else if( rec->getDataType() == GRB_USCT ) // Scatterometer U Wind Estimate storeRecordInMap(rec); else if( rec->getDataType() == GRB_VSCT ) // Scatterometer V Wind Estimate storeRecordInMap(rec); else if( rec->getDataType() == GRB_CRAIN ) // Catagorical Rain 1/0 storeRecordInMap(rec); //else if ((rec->getDataType()==GRB_TEMP) && (rec->getLevelType()==LV_GND_SURF) && (rec->getLevelValue()==0)) // storeRecordInMap(rec); // gfs SEATMP else if ((rec->getDataType()==GRB_WTMP) && (rec->getLevelType()==LV_GND_SURF) && (rec->getLevelValue()==0)) storeRecordInMap(rec); // rtofs Water Temp + translated gfs Water Temp else if( (rec->getDataType()==GRB_UOGRD || rec->getDataType()==GRB_VOGRD)) // rtofs model sea current current storeRecordInMap(rec); else { /* fprintf(stderr, "GribReader: unknown record type: dataType=%d levelType=%d levelValue=%d idCenter==%d && idModel==%d && idGrid==%d\n", rec->getDataType(), rec->getLevelType(), rec->getLevelValue(), rec->getIdCenter(), rec->getIdModel(), rec->getIdGrid() ); */ delete rec; } } } else { // ! rec-isOk delete rec; rec = NULL; } } while (rec != NULL && !b_EOF); }