# How RSIG Regrids Data

RSIG can regrid all surface data points onto the CMAQ grid (layer 1). (RSIG does not regrid data (e.g., CALIPSO LIDAR) onto the CMAQ vertical grid layers due to unresolved difficulties with the vertical grid scheme used by CMAQ.)

This is done by first projecting the data points (longitude, latitude) into the Lambert-space as defined by the various CMAQ projection parameters:

Parameter | Description |
---|---|

P_ALP = 33 | Lower latitude of tangency of plane intersecting the globe |

P_BET = 45 | Upper latitude of tangency of plane intersecting the globe |

P_GAM = -97 | Center longitude of tangent plane / longitude that projects to 0 |

YCENT = 40 | Latitude that projects to 0 |

Mean Earth Radius = 6,370,997 (m) | User-supplied value to aid the projection calculations. This is the value employed by the user when they ran the CMAQ (and MET) models. |

Then the projected points that project onto a CMAQ grid cell, as defined by more CMAQ file parameters:

Parameter | Description |
---|---|

NCOLS = 268 | Number of columns of grid cells |

NROWS = 259 | Number of rows of grid cells |

XORIG = -420,000 (m) | Horizontal distance from projection origin (-97,40) |

YORIG = -1,716,000 (m) | Vertical distance from projection origin (-97,40) |

X/YCELL = 12,000 (m) | Spacing between grid cell centers |

These parameters are aggregated into a single value for that cell in one of three methods:

Method | Description |
---|---|

Nearest | The value that lies nearest to the grid cell center is used. |

Mean | The mean of all values within the cell is used. |

Weighted | The inverse-distance-weighted (1/r2) mean is used. |

All data values are aggregated per GMT hour. No temporal-distance weighting is done as most data in RSIG is already GMT hourly and satellite data that has 5-minute timestamps quickly moves outside the grid cell by the next 5-minute mark.

Results can be saved in various formats such as ASCII, MCMC, XDR, and NetCDF-COARDS. These formats never include 'missing/invalid' data values, which are filtered out during the regridding process. The exception is NetCDF-IOAPI format, such files must contain complete/structured grids and tend to be much larger (100x) than the other formats.

Choosing NetCDF-IOAPI format results in a time-varying single layer CMAQ grid file for each regridded data source. This is compatible with existing programs that can read CMAQ files (e.g., PAVE). Note, that most grid cells will contain the value -9.999E+36 (BADVAL3) to indicate 'missing' since the other data is relatively spatially and temporally sparse compared to the CMAQ grid.

RSIG does not implement methods to 'fill-in-the-empty-cells' since the spatial-temporal variation of the data across the meso-scale domain is too unpredictable. (For example we cannot easily estimate the ozone concentration in St. Louis given values in Dallas and Chicago.) If users want to generate such data, they can do so starting from either the regridded data output from RSIG or the unregridded subsetted data.

**3D Data Regridding**

CALIPSO LIDAR provides 3D data that exists as a column of points from the surface up to 40km high. These points are regridded into the CMAQ layers by using the CMAQ vertical grid description parameters NLAYS, VGTOP, VGLVLS (sigma pressures), etc. to compute the CMAQ levels in meters above mean sea level and aggregate multiple points within a single CMAQ grid cell (using the same scheme: nearest, mean, distance-weighted mean).

By describing the CMAQ grid parameters - and including these in the WCS request to rsigserver, e.g.,

REGRID=weighted&LAMBERT=33,45,-97,40&ELLIPSOID=6370997,6370997& GRID=268,259,-420000,-1716000,12000,12000& LEVELS=22,2,10000,1.0,0.995,0.988,0.979,0.97,0.96,0.938,0.914,0.889,0.862, 0.834,0.804,0.774,0.743,0.694,0.644,0.592,0.502,0.408,0.311,0.21,0.106,0.0, 9.81,287.04,50,290,100000

The regridding computation occurs at the remote source of the data (e.g., NASA) and only the regridded (usually reduced) data is streamed back. This is efficient and convenient since it does not require any actual CMAQ data. Since the formulas that relate sigma-pressures to meters (see routine below) require the surface elevation, the elevation used is that measured by the CALIPSO satellite which can differ slightly from the averaged (e.g., 12km) terrain height of the CMAQ grid cell.

Here is the C routine that computes the elevation in meters above mean sea level from the CMAQ sigma-pressure levels.

/****************************************************************************** PURPOSE: elevationsAtSigmaPressures - Compute elevations in meters above mean sea-level at sigma-pressures. INPUTS: Real g Gravitational force, e.g., 9.81 m/s^2. Real R Gas constant e.g., 287.04 J/kg/K = m^3/s/K. Real A Atmospheric lapse rate, e.g., 50.0 K/kg. Real T0s Reference surface temperature, e.g., 290.0 K. Real P00 Reference surface pressure, e.g., 100000 P. Real surfaceElevation Elevation of surface in meters AMSL. Integer levels Number of levels of sigmaPressures. Real topPressure Pressure in Pascals at the top of the model. const Real sigmaPressures[ levels ] Sigma-pressures at levels. OUTPUTS: Real elevations[ levels ] Elevation in meters above MSL at sigmas. NOTES: Based on formula used in MM5. ******************************************************************************/ static void elevationsAtSigmaPressures( Real g, Real R, Real A, Real T0s, Real P00, Real surfaceElevation, Integer levels, Real topPressure, const Real sigmaPressures[], Real elevations[] ) { PRE014( ! isNan( g ), ! isNan( R ), ! isNan( A ), ! isNan( T0s ), ! isNan( P00 ), ! isNan( surfaceElevation ), surfaceElevation > -1000.0, levels > 0, ! isNan( topPressure ), GT_ZERO6( topPressure, g, R, A, T0s, P00 ), isNanFree( sigmaPressures, levels ), minimumItem( sigmaPressures, levels ) >= 0.0, maximumItem( sigmaPressures, levels ) <= 1.0, elevations ); /* Derived constants: */ const Real H0s = R * T0s / g; const Real one_over_H0s = 1.0 / H0s; const Real A_over_T0s = A / T0s; const Real A_over_two_T0s = A / ( T0s + T0s ); const Real Pt = topPressure; const Real Zs = surfaceElevation; const Real two_Zs = Zs + Zs; const Real sqrt_factor = sqrt( 1.0 - A_over_T0s * one_over_H0s * two_Zs ); const Real q_factor = ( Pt / P00 ) * exp( two_Zs * one_over_H0s / sqrt_factor ); Integer level = 0; /* Compute elevations at sigma-pressures: */ for ( level = 0; level < levels; ++level ) { const Real sigma_p0 = sigmaPressures[ level ]; const Real q0_star = sigma_p0 + ( 1.0 - sigma_p0 ) * q_factor; const Real ln_q0_star = log( q0_star ); const Real z_level = Zs - H0s * ln_q0_star * ( A_over_two_T0s * ln_q0_star + sqrt_factor ); elevations[ level ] = z_level; } POST03( isNanFree( elevations, levels ), minimumItem( elevations, levels ) >= -1000.0, maximumItem( elevations, levels ) <= 1e6 ); } Here are some computed level elevations compared to the values in the MET files: level West-formula West ZF ocean East-formula East ZF ocean -------------------------------------------------------------------- 0 -0.0 0.0 -0.0 0.0 1 36.3 36.3 38.3 38.3 2 72.7 72.7 76.7 76.7 3 145.9 146.0 153.9 154.0 4 294.0 294.2 310.1 310.9 5 444.4 444.7 468.8 469.0 6 674.5 674.8 711.5 711.9 7 1070.4 1070.9 1129.5 1130.1 8 1568.0 1568.8 1655.1 1656.0 9 2093.0 2094.1 2210.0 2211.1 10 2939.6 2941.1 3105.6 3107.2 11 3980.5 3982.5 4208.4 4210.5 12 5807.2 5810.2 6148.1 6151.2 13 9057.5 9062.2 9616.2 9621.2 14 14649.4 14656.8 15660.0 15668.0