Exemple #1
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);
}
bool GribRecord::GetInterpolatedParameters
(const GribRecord &rec1, const GribRecord &rec2,
 double &La1, double &Lo1, double &La2, double &Lo2, double &Di, double &Dj,
 int &im1, int &jm1, int &im2, int &jm2,
 int &Ni, int &Nj, int &rec1offi, int &rec1offj, int &rec2offi, int &rec2offj )
{
    if(!rec1.isOk() || !rec2.isOk())
        return false;

    /* make sure Dj both have same sign */
    if(rec1.getDj() * rec2.getDj() <= 0)
        return false;

    Di = wxMax(rec1.getDi(), rec2.getDi());
    Dj = rec1.getDj() > 0 ?
        wxMax(rec1.getDj(), rec2.getDj()):
        wxMin(rec1.getDj(), rec2.getDj());

    /* get overlapping region */
    if(Dj > 0)
        La1 = wxMax(rec1.La1, rec2.La1), La2 = wxMin(rec1.La2, rec2.La2);
    else
        La1 = wxMin(rec1.La1, rec2.La1), La2 = wxMax(rec1.La2, rec2.La2);

    Lo1 = wxMax(rec1.Lo1, rec2.Lo1), Lo2 = wxMin(rec1.Lo2, rec2.Lo2);

    // align gribs on integer boundaries
    int i, j;
    // shut up compiler warning 'may be used uninitialized'
    // rec2.Dj / rec1.Dj > 0
    // XXX Is it true  for rec2.Di / rec1.Di ?
    double rec1offdi = 0, rec2offdi = 0;
    double rec1offdj = 0., rec2offdj = 0.;

    double iiters = rec2.Di / rec1.Di;
    if(iiters < 1) {
        iiters = 1/iiters;
        im1 = 1, im2 = iiters;
    } else
        im1 = iiters, im2 = 1;

    for(i=0; i<iiters; i++) {
        rec1offdi = (Lo1 - rec1.Lo1)/rec1.Di;
        rec2offdi = (Lo1 - rec2.Lo1)/rec2.Di;
        if(rec1offdi == floor(rec1offdi) && rec2offdi == floor(rec2offdi))
            break;

        Lo1 += wxMin(rec1.Di, rec2.Di);
    }
    if(i == iiters) // failed to align, would need spacial interpolation to work
        return false;

    double jiters = rec2.Dj / rec1.Dj;
    if(jiters < 1) {
        jiters = 1/jiters;
        jm1 = 1, jm2 = iiters;
    } else
        jm1 = jiters, jm2 = 1;

    for(j=0; j<jiters; j++) {
        rec1offdj = (La1 - rec1.La1)/rec1.Dj;
        rec2offdj = (La1 - rec2.La1)/rec2.Dj;
        if(rec1offdj == floor(rec1offdj) && rec2offdj == floor(rec2offdj))
            break;

        La1 += Dj < 0 ?
            wxMax(rec1.getDj(), rec2.getDj()):
            wxMin(rec1.getDj(), rec2.getDj());
    }
    if(j == jiters) // failed to align
        return false;

    /* no overlap */
    if(La1*Dj > La2*Dj || Lo1 > Lo2)
        return false;

    /* compute integer sizes for data array */
    Ni = (Lo2-Lo1)/Di + 1, Nj = (La2-La1)/Dj + 1;

    /* back-compute final La2 and Lo2 to fit this integer boundary */
    Lo2 = Lo1 + (Ni-1)*Di, La2 = La1 + (Nj-1)*Dj;

    rec1offi = rec1offdi, rec2offi = rec2offdi;
    rec1offj = rec1offdj, rec2offj = rec2offdj;

    if (!rec1.data || !rec2.data)
        return false;

    return true;
}