Ejemplo n.º 1
0
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;
                }
            }
        }
    }
}
Ejemplo n.º 2
0
//---------------------------------------------------------------------------------
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);
}