//--------------------------------------------------------------------------------- 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; }