//------------------------------------------------------- double GribReader::computeDewPoint(double lon, double lat, time_t now) { double diewpoint = GRIB_NOTDEF; GribRecord *recTempDiew = getGribRecord(GRB_DEWPOINT,LV_ABOV_GND,2,now); if (recTempDiew != NULL) { // GRIB file contains diew point data diewpoint = recTempDiew->getInterpolatedValue(lon, lat); } else { // Compute diew point with Magnus-Tetens formula GribRecord *recTemp = getGribRecord(GRB_TEMP,LV_ABOV_GND,2,now); GribRecord *recHumid = getGribRecord(GRB_HUMID_REL,LV_ABOV_GND,2,now); if (recTemp && recHumid) { double temp = recTemp->getInterpolatedValue(lon, lat); double humid = recHumid->getInterpolatedValue(lon, lat); if (temp != GRIB_NOTDEF && humid != GRIB_NOTDEF) { double a = 17.27; double b = 237.7; double t = temp-273.15; double rh = humid; //if ( t>0 && t<60 && rh>0.01) { double alpha = a*t/(b+t)+log(rh/100.0); diewpoint = b*alpha/(a-alpha); diewpoint += 273.15; } } } } return diewpoint; }
//================================================================================== // Flèches de direction du current //================================================================================== void GribPlot::draw_CURRENT_Arrows ( Altitude altitude, QColor arrowsColor, QPainter &pnt, const Projection *proj ) { if (gribReader == NULL) { return; } currentAltitude = altitude; currentArrowColor = arrowsColor; GribRecord *recx = gribReader->getRecord (DataCode(GRB_CUR_VX,altitude),currentDate); GribRecord *recy = gribReader->getRecord (DataCode(GRB_CUR_VY,altitude),currentDate); if (recx == NULL || recy == NULL) return; int i, j; double x, y, vx, vy; int W = proj->getW(); int H = proj->getH(); int space; space = drawCurrentArrowsOnGrid ? currentArrowSpaceOnGrid : currentArrowSpace; if (drawCurrentArrowsOnGrid) { // Flèches uniquement sur les points de la grille int oldi=-1000, oldj=-1000; for (int gi=0; gi<recx->getNi(); gi++) { x = recx->getX(gi); y = recx->getY(0); proj->map2screen(x,y, &i,&j); if (true || abs(i-oldi)>=space) { oldi = i; for (int gj=0; gj<recx->getNj(); gj++) { x = recx->getX(gi); y = recx->getY(gj); proj->map2screen(x,y, &i,&j); //---------------------------------------------------------------------- if (! recx->isXInMap(x)) x += 360.0; // tour du monde ? if (recx->isPointInMap(x,y)) { if (true || abs(j-oldj)>=space) { oldj = j; vx = recx->getInterpolatedValue(x, y, mustInterpolateValues); vy = recy->getInterpolatedValue(x, y, mustInterpolateValues); if (vx != GRIB_NOTDEF && vy != GRIB_NOTDEF) { drawCurrentArrow(pnt, i,j, vx,vy); } } } } } } } else { // Flèches uniformément réparties sur l'écran for (i=0; i<W; i+=space) { for (j=0; j<H; j+=space) { proj->screen2map(i,j, &x,&y); //---------------------------------------------------------------------- if (! recx->isXInMap(x)) x += 360.0; // tour du monde ? if (recx->isPointInMap(x,y)) { vx = recx->getInterpolatedValue(x, y, mustInterpolateValues); vy = recy->getInterpolatedValue(x, y, mustInterpolateValues); if (vx != GRIB_NOTDEF && vy != GRIB_NOTDEF) { drawCurrentArrow(pnt, i,j, vx,vy); } } //---------------------------------------------------------------------- } } } }